diff --git a/cdc/processor/tablepb/table.pb.go b/cdc/processor/tablepb/table.pb.go index c4b86e83406..d27572c206b 100644 --- a/cdc/processor/tablepb/table.pb.go +++ b/cdc/processor/tablepb/table.pb.go @@ -179,7 +179,7 @@ type Stats struct { // Number of captured regions. RegionCount uint64 `protobuf:"varint,1,opt,name=region_count,json=regionCount,proto3" json:"region_count,omitempty"` // The current timestamp from the table's point of view. - CurrentTs Ts `protobuf:"varint,2,opt,name=current_ts,json=currentTs,proto3,casttype=Ts" json:"current_ts,omitempty"` + CurrentTs Ts `protobuf:"varint,2,opt,name=current_ts,json=currentTs,proto3,casttype=Ts" json:"current_ts,omitempty"` // Deprecated: Do not use. // Checkponits at each stage. StageCheckpoints map[string]Checkpoint `protobuf:"bytes,3,rep,name=stage_checkpoints,json=stageCheckpoints,proto3" json:"stage_checkpoints" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // The barrier timestamp of the table. @@ -226,6 +226,7 @@ func (m *Stats) GetRegionCount() uint64 { return 0 } +// Deprecated: Do not use. func (m *Stats) GetCurrentTs() Ts { if m != nil { return m.CurrentTs @@ -337,52 +338,52 @@ func init() { func init() { proto.RegisterFile("processor/tablepb/table.proto", fileDescriptor_ae83c9c6cf5ef75c) } var fileDescriptor_ae83c9c6cf5ef75c = []byte{ - // 706 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0xbf, 0x6f, 0xd3, 0x4e, - 0x1c, 0xb5, 0x9d, 0x5f, 0xcd, 0x27, 0xf9, 0x56, 0xee, 0x7d, 0xdb, 0x52, 0x22, 0x91, 0x98, 0xa8, - 0x40, 0xd5, 0x22, 0x07, 0xca, 0x82, 0xba, 0x35, 0x2d, 0xa0, 0xaa, 0x42, 0x42, 0x4e, 0x60, 0x60, - 0x89, 0x1c, 0xfb, 0x70, 0xad, 0x86, 0xb3, 0xe5, 0xbb, 0xb4, 0xca, 0xc6, 0x88, 0xb2, 0xd0, 0x09, - 0xb1, 0x44, 0xea, 0x9f, 0xd3, 0xb1, 0x23, 0x03, 0x8a, 0x20, 0x15, 0x33, 0x7b, 0x27, 0x74, 0x77, - 0x6e, 0xdc, 0x04, 0x86, 0xd0, 0x25, 0x39, 0xdf, 0x7b, 0x9f, 0xa7, 0xf7, 0xde, 0x9d, 0x0e, 0xee, - 0x84, 0x51, 0xe0, 0x60, 0x4a, 0x83, 0xa8, 0xc6, 0xec, 0x76, 0x07, 0x87, 0x6d, 0xf9, 0x6f, 0x86, - 0x51, 0xc0, 0x02, 0xb4, 0x1a, 0xfa, 0xc4, 0x73, 0xec, 0xd0, 0x64, 0xfe, 0xbb, 0x4e, 0x70, 0x6c, - 0x3a, 0xae, 0x63, 0x8e, 0x27, 0xcc, 0x78, 0xa2, 0xb4, 0xe8, 0x05, 0x5e, 0x20, 0x06, 0x6a, 0x7c, - 0x25, 0x67, 0xab, 0x9f, 0x54, 0x48, 0x37, 0x42, 0x9b, 0xa0, 0xc7, 0x30, 0x27, 0x98, 0x2d, 0xdf, - 0x5d, 0x51, 0x0d, 0x75, 0x2d, 0x55, 0x5f, 0x1e, 0x0d, 0x2b, 0xb9, 0x26, 0xdf, 0xdb, 0xdb, 0xbd, - 0x4c, 0x96, 0x56, 0x4e, 0xf0, 0xf6, 0x5c, 0xb4, 0x0a, 0x79, 0xca, 0xec, 0x88, 0xb5, 0x0e, 0x71, - 0x6f, 0x45, 0x33, 0xd4, 0xb5, 0x62, 0x3d, 0x77, 0x39, 0xac, 0xa4, 0xf6, 0x71, 0xcf, 0x9a, 0x13, - 0xc8, 0x3e, 0xee, 0x21, 0x03, 0x72, 0x98, 0xb8, 0x82, 0x93, 0x9a, 0xe4, 0x64, 0x31, 0x71, 0xf7, - 0x71, 0x6f, 0xab, 0xf8, 0xf1, 0xb4, 0xa2, 0x7c, 0x39, 0xad, 0x28, 0x1f, 0xbe, 0x19, 0x4a, 0xf5, - 0x44, 0x05, 0xd8, 0x39, 0xc0, 0xce, 0x61, 0x18, 0xf8, 0x84, 0xa1, 0x0d, 0xf8, 0xcf, 0x19, 0x7f, - 0xb5, 0x18, 0x15, 0xe6, 0xd2, 0xf5, 0xec, 0xe5, 0xb0, 0xa2, 0x35, 0xa9, 0x55, 0x4c, 0xc0, 0x26, - 0x45, 0x0f, 0xa0, 0x10, 0x61, 0x1a, 0x74, 0x8e, 0xb0, 0xcb, 0xa9, 0xda, 0x04, 0x15, 0xae, 0xa0, - 0x26, 0x45, 0x0f, 0x61, 0xbe, 0x63, 0x53, 0xd6, 0xa2, 0x3d, 0xe2, 0x48, 0x6e, 0x6a, 0x52, 0x96, - 0xa3, 0x0d, 0x01, 0x36, 0x69, 0xf5, 0xa7, 0x06, 0x99, 0x06, 0xb3, 0x19, 0x45, 0x77, 0xa1, 0x18, - 0x61, 0xcf, 0x0f, 0x48, 0xcb, 0x09, 0xba, 0x84, 0x49, 0x33, 0x56, 0x41, 0xee, 0xed, 0xf0, 0x2d, - 0x74, 0x0f, 0xc0, 0xe9, 0x46, 0x11, 0x96, 0x6e, 0x27, 0x2d, 0xe4, 0x63, 0xa4, 0x49, 0x11, 0x83, - 0x05, 0xca, 0x6c, 0x0f, 0xb7, 0x92, 0x00, 0xdc, 0x44, 0x6a, 0xad, 0xb0, 0xb9, 0x6d, 0xce, 0x72, - 0xa0, 0xa6, 0x70, 0xc4, 0x7f, 0x3d, 0x9c, 0xf4, 0x45, 0x9f, 0x11, 0x16, 0xf5, 0xea, 0xe9, 0xb3, - 0x61, 0x45, 0xb1, 0x74, 0x3a, 0x05, 0x72, 0x73, 0x6d, 0x3b, 0x8a, 0x7c, 0x1c, 0x71, 0x73, 0xe9, - 0x49, 0x73, 0x31, 0xd2, 0xa4, 0xa5, 0x2e, 0x2c, 0xfd, 0x55, 0x17, 0xe9, 0x90, 0xe2, 0x07, 0xc9, - 0x63, 0xe7, 0x2d, 0xbe, 0x44, 0xcf, 0x21, 0x73, 0x64, 0x77, 0xba, 0x58, 0x24, 0x2d, 0x6c, 0x3e, - 0x9a, 0xcd, 0x7b, 0x22, 0x6c, 0xc9, 0xf1, 0x2d, 0xed, 0xa9, 0x5a, 0xfd, 0xa5, 0x41, 0x41, 0xdc, - 0x32, 0x1e, 0xad, 0x4b, 0x6f, 0x72, 0x27, 0x77, 0x21, 0x4d, 0x43, 0x9b, 0xac, 0x64, 0x84, 0x9b, - 0xf5, 0x19, 0x9b, 0x0c, 0x6d, 0x12, 0x57, 0x26, 0xa6, 0x79, 0x28, 0xca, 0x6c, 0x26, 0x43, 0xcd, - 0xcf, 0x1a, 0x6a, 0x6c, 0x1d, 0x5b, 0x72, 0x1c, 0xbd, 0x01, 0x48, 0x8e, 0x57, 0x5c, 0xb1, 0x1b, - 0x34, 0x14, 0x3b, 0xbb, 0xa6, 0x84, 0x5e, 0x48, 0x7f, 0xf2, 0x04, 0x0b, 0x9b, 0x1b, 0xff, 0x70, - 0x61, 0x62, 0x35, 0x39, 0xbf, 0xfe, 0x59, 0x03, 0x48, 0x6c, 0xa3, 0x2a, 0xe4, 0x5e, 0x93, 0x43, - 0x12, 0x1c, 0x13, 0x5d, 0x29, 0x2d, 0xf5, 0x07, 0xc6, 0x42, 0x02, 0xc6, 0x00, 0x32, 0x20, 0xbb, - 0xdd, 0xa6, 0x98, 0x30, 0x5d, 0x2d, 0x2d, 0xf6, 0x07, 0x86, 0x9e, 0x50, 0xe4, 0x3e, 0xba, 0x0f, - 0xf9, 0x57, 0x11, 0x0e, 0xed, 0xc8, 0x27, 0x9e, 0xae, 0x95, 0x6e, 0xf5, 0x07, 0xc6, 0xff, 0x09, - 0x69, 0x0c, 0xa1, 0x55, 0x98, 0x93, 0x1f, 0xd8, 0xd5, 0x53, 0xa5, 0xe5, 0xfe, 0xc0, 0x40, 0xd3, - 0x34, 0xec, 0xa2, 0x75, 0x28, 0x58, 0x38, 0xec, 0xf8, 0x8e, 0xcd, 0xb8, 0x5e, 0xba, 0x74, 0xbb, - 0x3f, 0x30, 0x96, 0xae, 0x75, 0x9d, 0x80, 0x5c, 0xb1, 0xc1, 0x82, 0x90, 0xb7, 0xa1, 0x67, 0xa6, - 0x15, 0xaf, 0x10, 0x9e, 0x52, 0xac, 0xb1, 0xab, 0x67, 0xa7, 0x53, 0xc6, 0x40, 0xfd, 0xe5, 0xf9, - 0x8f, 0xb2, 0x72, 0x36, 0x2a, 0xab, 0xe7, 0xa3, 0xb2, 0xfa, 0x7d, 0x54, 0x56, 0x4f, 0x2e, 0xca, - 0xca, 0xf9, 0x45, 0x59, 0xf9, 0x7a, 0x51, 0x56, 0xde, 0xd6, 0x3c, 0x9f, 0x1d, 0x74, 0xdb, 0xa6, - 0x13, 0xbc, 0xaf, 0xc5, 0xd5, 0xd7, 0x64, 0xf5, 0x35, 0xc7, 0x75, 0x6a, 0x7f, 0x3c, 0xd7, 0xed, - 0xac, 0x78, 0x6d, 0x9f, 0xfc, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xa3, 0xeb, 0x06, 0x9b, 0xca, 0x05, - 0x00, 0x00, + // 716 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0xbf, 0x6f, 0xdb, 0x38, + 0x18, 0x95, 0xe4, 0xdf, 0x9f, 0x7d, 0x81, 0xc2, 0x4b, 0x72, 0x3e, 0x03, 0x67, 0xeb, 0x8c, 0xdc, + 0x25, 0x48, 0x0e, 0xf2, 0x5d, 0x6e, 0x29, 0xb2, 0xc5, 0x49, 0x5b, 0x04, 0x41, 0x81, 0x42, 0x76, + 0x3b, 0x74, 0x31, 0x64, 0x89, 0x55, 0x84, 0xb8, 0x94, 0x20, 0xd2, 0x09, 0xbc, 0x75, 0x2c, 0xbc, + 0x34, 0x53, 0xd1, 0xc5, 0x40, 0xfe, 0x9c, 0x8c, 0x19, 0x3b, 0x14, 0x46, 0xeb, 0x0c, 0x1d, 0xbb, + 0x67, 0x2a, 0x48, 0x2a, 0x56, 0xec, 0x76, 0x70, 0xb3, 0xd8, 0x14, 0xdf, 0xfb, 0x1e, 0xde, 0x7b, + 0x24, 0x08, 0x7f, 0x84, 0x51, 0xe0, 0x60, 0x4a, 0x83, 0xa8, 0xc1, 0xec, 0x6e, 0x0f, 0x87, 0x5d, + 0xf9, 0x6f, 0x86, 0x51, 0xc0, 0x02, 0xb4, 0x1e, 0xfa, 0xc4, 0x73, 0xec, 0xd0, 0x64, 0xfe, 0xcb, + 0x5e, 0x70, 0x66, 0x3a, 0xae, 0x63, 0x4e, 0x27, 0xcc, 0x78, 0xa2, 0xb2, 0xe2, 0x05, 0x5e, 0x20, + 0x06, 0x1a, 0x7c, 0x25, 0x67, 0xeb, 0x6f, 0x55, 0x48, 0xb7, 0x42, 0x9b, 0xa0, 0xff, 0x20, 0x2f, + 0x98, 0x1d, 0xdf, 0x2d, 0xab, 0x86, 0xba, 0x99, 0x6a, 0xae, 0x4d, 0xc6, 0xb5, 0x5c, 0x9b, 0xef, + 0x1d, 0x1e, 0xdc, 0x24, 0x4b, 0x2b, 0x27, 0x78, 0x87, 0x2e, 0x5a, 0x87, 0x02, 0x65, 0x76, 0xc4, + 0x3a, 0x27, 0x78, 0x50, 0xd6, 0x0c, 0x75, 0xb3, 0xd4, 0xcc, 0xdd, 0x8c, 0x6b, 0xa9, 0x23, 0x3c, + 0xb0, 0xf2, 0x02, 0x39, 0xc2, 0x03, 0x64, 0x40, 0x0e, 0x13, 0x57, 0x70, 0x52, 0xb3, 0x9c, 0x2c, + 0x26, 0xee, 0x11, 0x1e, 0xec, 0x96, 0xde, 0x5c, 0xd4, 0x94, 0xf7, 0x17, 0x35, 0xe5, 0xf5, 0x47, + 0x43, 0xa9, 0x9f, 0xab, 0x00, 0xfb, 0xc7, 0xd8, 0x39, 0x09, 0x03, 0x9f, 0x30, 0xb4, 0x0d, 0xbf, + 0x38, 0xd3, 0xaf, 0x0e, 0xa3, 0xc2, 0x5c, 0xba, 0x99, 0xbd, 0x19, 0xd7, 0xb4, 0x36, 0xb5, 0x4a, + 0x09, 0xd8, 0xa6, 0x68, 0x03, 0x8a, 0x11, 0xa6, 0x41, 0xef, 0x14, 0xbb, 0x9c, 0xaa, 0xcd, 0x50, + 0xe1, 0x16, 0x6a, 0x53, 0xf4, 0x0f, 0x2c, 0xf5, 0x6c, 0xca, 0x3a, 0x74, 0x40, 0x1c, 0xc9, 0x4d, + 0xcd, 0xca, 0x72, 0xb4, 0x25, 0xc0, 0x36, 0xad, 0x7f, 0xd1, 0x20, 0xd3, 0x62, 0x36, 0xa3, 0xe8, + 0x4f, 0x28, 0x45, 0xd8, 0xf3, 0x03, 0xd2, 0x71, 0x82, 0x3e, 0x61, 0xd2, 0x8c, 0x55, 0x94, 0x7b, + 0xfb, 0x7c, 0x0b, 0x6d, 0x00, 0x38, 0xfd, 0x28, 0xc2, 0xd2, 0xad, 0xb4, 0x90, 0x97, 0xb2, 0x65, + 0xd5, 0x2a, 0xc4, 0x58, 0x9b, 0x22, 0x06, 0xcb, 0x94, 0xd9, 0x1e, 0xee, 0x24, 0x11, 0xb8, 0x8d, + 0xd4, 0x66, 0x71, 0x67, 0xcf, 0x5c, 0xe4, 0x48, 0x4d, 0xe1, 0x89, 0xff, 0x7a, 0x38, 0x69, 0x8c, + 0x3e, 0x24, 0x2c, 0x1a, 0x34, 0xd3, 0x97, 0xe3, 0x9a, 0x62, 0xe9, 0x74, 0x0e, 0x44, 0x7f, 0x01, + 0x74, 0xed, 0x28, 0xf2, 0x71, 0xc4, 0xed, 0xa5, 0x67, 0x52, 0x17, 0x62, 0xa4, 0x4d, 0x2b, 0x7d, + 0x58, 0xfd, 0xa1, 0x2e, 0xd2, 0x21, 0xc5, 0x8f, 0x92, 0x07, 0x2f, 0x58, 0x7c, 0x89, 0x1e, 0x41, + 0xe6, 0xd4, 0xee, 0xf5, 0xb1, 0xc8, 0x5a, 0xdc, 0xf9, 0x77, 0x31, 0xef, 0x89, 0xb0, 0x25, 0xc7, + 0x77, 0xb5, 0x07, 0x6a, 0xfd, 0xab, 0x06, 0x45, 0x71, 0xcf, 0x78, 0xb4, 0x3e, 0xbd, 0xcf, 0xad, + 0x3c, 0x80, 0x34, 0x0d, 0x6d, 0x52, 0xce, 0x08, 0x37, 0x5b, 0x0b, 0x36, 0x19, 0xda, 0x24, 0xae, + 0x4c, 0x4c, 0xf3, 0x50, 0x94, 0xd9, 0x4c, 0x86, 0x5a, 0x5a, 0x34, 0xd4, 0xd4, 0x3a, 0xb6, 0xe4, + 0x38, 0x7a, 0x0e, 0x90, 0x1c, 0xaf, 0xb8, 0x64, 0xf7, 0x68, 0x28, 0x76, 0x76, 0x47, 0x09, 0x3d, + 0x96, 0xfe, 0xe4, 0x09, 0x16, 0x77, 0xb6, 0x7f, 0xe2, 0xc2, 0xc4, 0x6a, 0x72, 0x7e, 0xeb, 0x9d, + 0x06, 0x90, 0xd8, 0x46, 0x75, 0xc8, 0x3d, 0x23, 0x27, 0x24, 0x38, 0x23, 0xba, 0x52, 0x59, 0x1d, + 0x8e, 0x8c, 0xe5, 0x04, 0x8c, 0x01, 0x64, 0x40, 0x76, 0xaf, 0x4b, 0x31, 0x61, 0xba, 0x5a, 0x59, + 0x19, 0x8e, 0x0c, 0x3d, 0xa1, 0xc8, 0x7d, 0xf4, 0x37, 0x14, 0x9e, 0x46, 0x38, 0xb4, 0x23, 0x9f, + 0x78, 0xba, 0x56, 0xf9, 0x6d, 0x38, 0x32, 0x7e, 0x4d, 0x48, 0x53, 0x08, 0xad, 0x43, 0x5e, 0x7e, + 0x60, 0x57, 0x4f, 0x55, 0xd6, 0x86, 0x23, 0x03, 0xcd, 0xd3, 0xb0, 0x8b, 0xb6, 0xa0, 0x68, 0xe1, + 0xb0, 0xe7, 0x3b, 0x36, 0xe3, 0x7a, 0xe9, 0xca, 0xef, 0xc3, 0x91, 0xb1, 0x7a, 0xa7, 0xeb, 0x04, + 0xe4, 0x8a, 0x2d, 0x16, 0x84, 0xbc, 0x0d, 0x3d, 0x33, 0xaf, 0x78, 0x8b, 0xf0, 0x94, 0x62, 0x8d, + 0x5d, 0x3d, 0x3b, 0x9f, 0x32, 0x06, 0x9a, 0x4f, 0xae, 0x3e, 0x57, 0x95, 0xcb, 0x49, 0x55, 0xbd, + 0x9a, 0x54, 0xd5, 0x4f, 0x93, 0xaa, 0x7a, 0x7e, 0x5d, 0x55, 0xae, 0xae, 0xab, 0xca, 0x87, 0xeb, + 0xaa, 0xf2, 0xa2, 0xe1, 0xf9, 0xec, 0xb8, 0xdf, 0x35, 0x9d, 0xe0, 0x55, 0x23, 0xae, 0xbe, 0x21, + 0xab, 0x6f, 0x38, 0xae, 0xd3, 0xf8, 0xee, 0xc1, 0xee, 0x66, 0xc5, 0x7b, 0xfb, 0xff, 0xb7, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x53, 0x4d, 0xc5, 0xfa, 0xcc, 0x05, 0x00, 0x00, } func (m *Span) Marshal() (dAtA []byte, err error) { diff --git a/dm/_utils/terror_gen/errors_release.txt b/dm/_utils/terror_gen/errors_release.txt index f6ad305846a..6e1af7f9907 100644 --- a/dm/_utils/terror_gen/errors_release.txt +++ b/dm/_utils/terror_gen/errors_release.txt @@ -152,7 +152,7 @@ ErrConfigLoaderCfgConflict,[code=20016:class=config:scope=internal:level=medium] ErrConfigSyncerCfgConflict,[code=20017:class=config:scope=internal:level=medium], "Message: syncer-config-name and syncer should only specify one, Workaround: Please check the `syncer-config-name` and `syncer` config in task configuration file." ErrConfigReadCfgFromFile,[code=20018:class=config:scope=internal:level=medium], "Message: read config file %v" ErrConfigNeedUniqueTaskName,[code=20019:class=config:scope=internal:level=medium], "Message: must specify a unique task name, Workaround: Please check the `name` config in task configuration file." -ErrConfigInvalidTaskMode,[code=20020:class=config:scope=internal:level=medium], "Message: please specify right task-mode, support `full`, `incremental`, `all`, Workaround: Please check the `task-mode` config in task configuration file." +ErrConfigInvalidTaskMode,[code=20020:class=config:scope=internal:level=medium], "Message: please specify right task-mode, support `full`, `incremental`, `all`, `dump`, `load`, Workaround: Please check the `task-mode` config in task configuration file." ErrConfigNeedTargetDB,[code=20021:class=config:scope=internal:level=medium], "Message: must specify target-database, Workaround: Please check the `target-database` config in task configuration file." ErrConfigMetadataNotSet,[code=20022:class=config:scope=internal:level=medium], "Message: mysql-instance(%s) must set meta for task-mode %s, Workaround: Please check the `meta` config in task configuration file." ErrConfigRouteRuleNotFound,[code=20023:class=config:scope=internal:level=medium], "Message: mysql-instance(%d)'s route-rules %s not exist in routes, Workaround: Please check the `route-rules` config in task configuration file." diff --git a/dm/config/helper.go b/dm/config/helper.go index 49badba0169..36fed03edeb 100644 --- a/dm/config/helper.go +++ b/dm/config/helper.go @@ -26,7 +26,7 @@ func HasDump(taskMode string) bool { // HasLoad returns true if taskMode contains load unit. func HasLoad(taskMode string) bool { switch taskMode { - case ModeAll, ModeFull, ModeLoadSync: + case ModeAll, ModeFull, ModeLoad, ModeLoadSync: return true default: return false diff --git a/dm/config/helper_test.go b/dm/config/helper_test.go index c7cc677c5c7..a644e8c1a7d 100644 --- a/dm/config/helper_test.go +++ b/dm/config/helper_test.go @@ -36,6 +36,10 @@ func TestTaskModeHasFunction(t *testing.T) { require.False(t, HasLoad(ModeDump)) require.False(t, HasSync(ModeDump)) + require.False(t, HasDump(ModeLoad)) + require.True(t, HasLoad(ModeLoad)) + require.False(t, HasSync(ModeLoad)) + require.False(t, HasDump(ModeLoadSync)) require.True(t, HasLoad(ModeLoadSync)) require.True(t, HasSync(ModeLoadSync)) diff --git a/dm/config/subtask.go b/dm/config/subtask.go index 5c28bf88b7e..95f20886247 100644 --- a/dm/config/subtask.go +++ b/dm/config/subtask.go @@ -28,6 +28,7 @@ import ( "time" "github.com/BurntSushi/toml" + "github.com/google/uuid" extstorage "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/pkg/util/dbutil" "github.com/pingcap/tidb/pkg/util/filter" @@ -52,6 +53,7 @@ const ( ModeFull = "full" ModeIncrement = "incremental" ModeDump = "dump" + ModeLoad = "load" ModeLoadSync = "load&sync" DefaultShadowTableRules = "^_(.+)_(?:new|gho)$" @@ -178,17 +180,19 @@ type SubTaskConfig struct { ExtStorage extstorage.ExternalStorage `toml:"-" json:"-"` MetricsFactory promutil.Factory `toml:"-" json:"-"` FrameworkLogger *zap.Logger `toml:"-" json:"-"` - // members below are injected by dataflow engine, UUID should be unique in - // one go runtime. + // members below are injected by dataflow engine + // UUID should be unique in one go runtime. // IOTotalBytes is used build TCPConnWithIOCounter and UUID is used to as a // key to let MySQL driver to find the right TCPConnWithIOCounter. - UUID string `toml:"-" json:"-"` - IOTotalBytes *atomic.Uint64 `toml:"-" json:"-"` + // It will meter TCP io usage to downstream of the subtask + UUID string `toml:"uuid" json:"-"` + IOTotalBytes *atomic.Uint64 `toml:"io-total-bytes" json:"io-total-bytes"` - // meter network usage from upstream + // DumpUUID as same as UUID + // DumpIOTotalBytes meter TCP io usage from upstream of the subtask, other same as IOTotalBytes // e.g., pulling binlog - DumpUUID string `toml:"-" json:"-"` - DumpIOTotalBytes *atomic.Uint64 `toml:"-" json:"-"` + DumpUUID string `toml:"dump-uuid" json:"-"` + DumpIOTotalBytes *atomic.Uint64 `toml:"dump-io-total-bytes" json:"dump-io-total-bytes"` } // SampleSubtaskConfig is the content of subtask.toml in current folder. @@ -212,6 +216,14 @@ func (c *SubTaskConfig) SetFlagSet(flagSet *flag.FlagSet) { c.flagSet = flagSet } +// InitIOCounters init io counter and uuid for syncer. +func (c *SubTaskConfig) InitIOCounters() { + c.IOTotalBytes = atomic.NewUint64(0) + c.DumpIOTotalBytes = atomic.NewUint64(0) + c.UUID = uuid.NewString() + c.DumpUUID = uuid.NewString() +} + // String returns the config's json string. func (c *SubTaskConfig) String() string { cfg, err := json.Marshal(c) @@ -222,6 +234,10 @@ func (c *SubTaskConfig) String() string { } // Toml returns TOML format representation of config. +// Note: The atomic.Uint64 fields (IOTotalBytes and DumpIOTotalBytes) are not +// encoded in the TOML output because they do not implement the necessary +// marshaling interfaces. As a result, these fields will not be included in +// the TOML representation. func (c *SubTaskConfig) Toml() (string, error) { var b bytes.Buffer enc := toml.NewEncoder(&b) @@ -242,6 +258,9 @@ func (c *SubTaskConfig) DecodeFile(fpath string, verifyDecryptPassword bool) err } // Decode loads config from file data. +// Note: The atomic.Uint64 fields (IOTotalBytes and DumpIOTotalBytes) will not +// be populated from the TOML data since they cannot be decoded by toml.Decode(). +// As a result, these fields will remain uninitialized (zero value) after decoding. func (c *SubTaskConfig) Decode(data string, verifyDecryptPassword bool) error { if _, err := toml.Decode(data, c); err != nil { return terror.ErrConfigTomlTransform.Delegate(err, "decode subtask config from data") @@ -330,6 +349,7 @@ func (c *SubTaskConfig) Adjust(verifyDecryptPassword bool) error { } // adjust dir, no need to do for load&sync mode because it needs its own s3 repository + // still use dir for standalone load mode (different from the behavior of load&sync mode) if HasLoad(c.Mode) && c.Mode != ModeLoadSync { // check isS3 := storage.IsS3Path(c.LoaderConfig.Dir) @@ -495,6 +515,12 @@ func (c *SubTaskConfig) Clone() (*SubTaskConfig, error) { if err != nil { return nil, terror.ErrConfigTomlTransform.Delegate(err, "decode subtask config from data") } - + // Manually copy atomic values for atomic.Uint64 doesn't implement TOML marshaling interfaces + if c.IOTotalBytes != nil { + clone.IOTotalBytes = atomic.NewUint64(c.IOTotalBytes.Load()) + } + if c.DumpIOTotalBytes != nil { + clone.DumpIOTotalBytes = atomic.NewUint64(c.DumpIOTotalBytes.Load()) + } return clone, nil } diff --git a/dm/config/subtask_test.go b/dm/config/subtask_test.go index ab0956e403a..c750446ff30 100644 --- a/dm/config/subtask_test.go +++ b/dm/config/subtask_test.go @@ -16,7 +16,9 @@ package config import ( "context" "crypto/rand" + "encoding/json" "reflect" + "sync" "testing" "github.com/DATA-DOG/go-sqlmock" @@ -27,6 +29,7 @@ import ( "github.com/pingcap/tiflow/dm/pkg/terror" "github.com/pingcap/tiflow/dm/pkg/utils" "github.com/stretchr/testify/require" + "go.uber.org/atomic" ) func TestSubTask(t *testing.T) { @@ -345,3 +348,74 @@ func TestFetchTZSetting(t *testing.T) { require.NoError(t, err) require.Equal(t, "+01:00", tz) } + +func TestSubTaskConfigMarshalAtomic(t *testing.T) { + var ( + uuid = "test-uuid" + dumpUUID = "test-dump-uuid" + ) + cfg := &SubTaskConfig{ + Name: "test", + SourceID: "source-1", + UUID: uuid, + DumpUUID: dumpUUID, + IOTotalBytes: atomic.NewUint64(100), + DumpIOTotalBytes: atomic.NewUint64(200), + } + require.Equal(t, cfg.IOTotalBytes.Load(), uint64(100)) + require.Equal(t, cfg.DumpIOTotalBytes.Load(), uint64(200)) + + var wg sync.WaitGroup + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + + data, err := json.Marshal(cfg) + require.NoError(t, err) + jsonMap := make(map[string]interface{}) + err = json.Unmarshal(data, &jsonMap) + require.NoError(t, err) + + // Check atomic values exist and are numbers + ioBytes, ok := jsonMap["io-total-bytes"].(float64) + require.True(t, ok, "io-total-bytes should be a number") + require.GreaterOrEqual(t, ioBytes, float64(100)) + + dumpBytes, ok := jsonMap["dump-io-total-bytes"].(float64) + require.True(t, ok, "dump-io-total-bytes should be a number") + require.GreaterOrEqual(t, dumpBytes, float64(200)) + + // UUID fields should not be present in JSON + _, hasUUID := jsonMap["uuid"] + _, hasDumpUUID := jsonMap["dump-uuid"] + require.False(t, hasUUID, "UUID should not be in JSON") + require.False(t, hasDumpUUID, "DumpUUID should not be in JSON") + }() + + wg.Add(1) + go func() { + defer wg.Done() + + newCfg, err := cfg.Clone() + require.NoError(t, err) + + // Check atomic values exist and are numbers + require.GreaterOrEqual(t, newCfg.IOTotalBytes.Load(), uint64(100)) + require.GreaterOrEqual(t, newCfg.DumpIOTotalBytes.Load(), uint64(200)) + require.Equal(t, newCfg.UUID, uuid) + require.Equal(t, newCfg.DumpUUID, dumpUUID) + }() + + wg.Add(1) + go func() { + defer wg.Done() + cfg.IOTotalBytes.Add(1) + cfg.DumpIOTotalBytes.Add(1) + }() + } + wg.Wait() + + require.Equal(t, cfg.IOTotalBytes.Load(), uint64(110)) + require.Equal(t, cfg.DumpIOTotalBytes.Load(), uint64(210)) +} diff --git a/dm/config/task.go b/dm/config/task.go index 8cedfbd5e65..9f5a77324f0 100644 --- a/dm/config/task.go +++ b/dm/config/task.go @@ -669,7 +669,7 @@ func (c *TaskConfig) adjust() error { return terror.ErrConfigNeedUniqueTaskName.Generate() } switch c.TaskMode { - case ModeFull, ModeIncrement, ModeAll, ModeDump, ModeLoadSync: + case ModeFull, ModeIncrement, ModeAll, ModeDump, ModeLoad, ModeLoadSync: default: return terror.ErrConfigInvalidTaskMode.Generate() } @@ -774,9 +774,9 @@ func (c *TaskConfig) adjust() error { instanceIDs[inst.SourceID] = i switch c.TaskMode { - case ModeFull, ModeAll, ModeDump: + case ModeFull, ModeAll, ModeDump, ModeLoad: if inst.Meta != nil { - log.L().Warn("metadata will not be used. for Full mode, incremental sync will never occur; for All mode, the meta dumped by MyDumper will be used", zap.Int("mysql instance", i), zap.String("task mode", c.TaskMode)) + log.L().Warn("metadata will not be used. for Full/Dump/Load mode, incremental sync will never occur; for All mode, the meta dumped by MyDumper will be used", zap.Int("mysql instance", i), zap.String("task mode", c.TaskMode)) } case ModeIncrement: if inst.Meta == nil { diff --git a/dm/config/task_converters.go b/dm/config/task_converters.go index 2c34e3838bd..98a9373e066 100644 --- a/dm/config/task_converters.go +++ b/dm/config/task_converters.go @@ -101,6 +101,8 @@ func TaskConfigToSubTaskConfigs(c *TaskConfig, sources map[string]dbconfig.DBCon cfg.CleanDumpFile = c.CleanDumpFile + cfg.InitIOCounters() + if err := cfg.Adjust(true); err != nil { return nil, terror.Annotatef(err, "source %s", inst.SourceID) } @@ -308,6 +310,8 @@ func OpenAPITaskToSubTaskConfigs(task *openapi.Task, toDBCfg *dbconfig.DBConfig, if task.IgnoreCheckingItems != nil && len(*task.IgnoreCheckingItems) != 0 { subTaskCfg.IgnoreCheckingItems = *task.IgnoreCheckingItems } + // set syncer IO total bytes counter + subTaskCfg.InitIOCounters() // adjust sub task config if err := subTaskCfg.Adjust(true); err != nil { return nil, terror.Annotatef(err, "source name %s", sourceCfg.SourceName) diff --git a/dm/config/task_converters_test.go b/dm/config/task_converters_test.go index 24eb74a09c0..fc368db2384 100644 --- a/dm/config/task_converters_test.go +++ b/dm/config/task_converters_test.go @@ -16,6 +16,7 @@ import ( "fmt" "testing" + "github.com/google/uuid" "github.com/pingcap/check" "github.com/pingcap/tidb/pkg/util/filter" "github.com/pingcap/tiflow/dm/config/dbconfig" @@ -117,6 +118,13 @@ func testNoShardTaskToSubTaskConfigs(c *check.C) { c.Assert(subTaskConfig.BAList, check.DeepEquals, bAListFromOpenAPITask) // check ignore check items c.Assert(subTaskConfig.IgnoreCheckingItems, check.IsNil) + // check io total bytes counter and uuid + c.Assert(subTaskConfig.IOTotalBytes, check.NotNil) + c.Assert(subTaskConfig.DumpIOTotalBytes, check.NotNil) + c.Assert(subTaskConfig.IOTotalBytes.Load(), check.Equals, uint64(0)) + c.Assert(subTaskConfig.DumpIOTotalBytes.Load(), check.Equals, uint64(0)) + c.Assert(subTaskConfig.UUID, check.HasLen, len(uuid.NewString())) + c.Assert(subTaskConfig.DumpUUID, check.HasLen, len(uuid.NewString())) } func testShardAndFilterTaskToSubTaskConfigs(c *check.C) { diff --git a/dm/config/task_test.go b/dm/config/task_test.go index bb90c5b83e0..fd41681df56 100644 --- a/dm/config/task_test.go +++ b/dm/config/task_test.go @@ -32,6 +32,7 @@ import ( "github.com/pingcap/tiflow/dm/pkg/utils" bf "github.com/pingcap/tiflow/pkg/binlog-filter" "github.com/stretchr/testify/require" + "go.uber.org/atomic" ) var correctTaskConfig = `--- @@ -688,6 +689,8 @@ func TestGenAndFromSubTaskConfigs(t *testing.T) { ValidatorCfg: validatorCfg, CleanDumpFile: true, EnableANSIQuotes: true, + IOTotalBytes: atomic.NewUint64(0), + DumpIOTotalBytes: atomic.NewUint64(0), } ) diff --git a/dm/errors.toml b/dm/errors.toml index 7f4c65fcf2b..d78d858038e 100644 --- a/dm/errors.toml +++ b/dm/errors.toml @@ -929,7 +929,7 @@ workaround = "Please check the `name` config in task configuration file." tags = ["internal", "medium"] [error.DM-config-20020] -message = "please specify right task-mode, support `full`, `incremental`, `all`" +message = "please specify right task-mode, support `full`, `incremental`, `all`, `dump`, `load`" description = "" workaround = "Please check the `task-mode` config in task configuration file." tags = ["internal", "medium"] diff --git a/dm/master/openapi_controller.go b/dm/master/openapi_controller.go index 9255af64030..bb74026a8e2 100644 --- a/dm/master/openapi_controller.go +++ b/dm/master/openapi_controller.go @@ -563,6 +563,7 @@ func (s *Server) getTaskStatus(ctx context.Context, taskName string) ([]openapi. // add load status if loadS := subTaskStatus.GetLoad(); loadS != nil { openapiSubTaskStatus.LoadStatus = &openapi.LoadStatus{ + Bps: loadS.Bps, FinishedBytes: loadS.FinishedBytes, MetaBinlog: loadS.MetaBinlog, MetaBinlogGtid: loadS.MetaBinlogGTID, @@ -584,6 +585,8 @@ func (s *Server) getTaskStatus(ctx context.Context, taskName string) ([]openapi. SyncerBinlogGtid: syncerS.SyncerBinlogGtid, TotalEvents: syncerS.TotalEvents, TotalTps: syncerS.TotalTps, + IoTotalBytes: syncerS.IoTotalBytes, + DumpIoTotalBytes: syncerS.DumpIOTotalBytes, } if unResolvedGroups := syncerS.GetUnresolvedGroups(); len(unResolvedGroups) > 0 { openapiSubTaskStatus.SyncStatus.UnresolvedGroups = make([]openapi.ShardingGroup, len(unResolvedGroups)) @@ -601,10 +604,12 @@ func (s *Server) getTaskStatus(ctx context.Context, taskName string) ([]openapi. // add dump status if dumpS := subTaskStatus.GetDump(); dumpS != nil { openapiSubTaskStatus.DumpStatus = &openapi.DumpStatus{ + Bps: dumpS.Bps, CompletedTables: dumpS.CompletedTables, EstimateTotalRows: dumpS.EstimateTotalRows, FinishedBytes: dumpS.FinishedBytes, FinishedRows: dumpS.FinishedRows, + Progress: dumpS.Progress, TotalTables: dumpS.TotalTables, } } diff --git a/dm/master/openapi_view_test.go b/dm/master/openapi_view_test.go index aa144edc169..aab897e28cc 100644 --- a/dm/master/openapi_view_test.go +++ b/dm/master/openapi_view_test.go @@ -1056,6 +1056,9 @@ func (s *OpenAPIViewSuite) TestTaskAPI() { s.Equal(float64(0), resultTaskStatus.Data[0].DumpStatus.CompletedTables) s.Equal(int64(1), resultTaskStatus.Data[0].DumpStatus.TotalTables) s.Equal(float64(10), resultTaskStatus.Data[0].DumpStatus.EstimateTotalRows) + s.Equal(int64(0), resultTaskStatus.Data[0].DumpStatus.Bps) + s.Equal(float64(0), resultTaskStatus.Data[0].DumpStatus.FinishedBytes) + s.Equal(float64(5), resultTaskStatus.Data[0].DumpStatus.FinishedRows) // get task status with source name taskStatusURL = fmt.Sprintf("%s/%s/status?source_name_list=%s", taskURL, task.Name, source1Name) diff --git a/dm/openapi/gen.server.go b/dm/openapi/gen.server.go index 6f465412eb0..8e3c3258821 100644 --- a/dm/openapi/gen.server.go +++ b/dm/openapi/gen.server.go @@ -1259,103 +1259,104 @@ var swaggerSpec = []string{ "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", - "atk2NEUX2HJc8cPt59v/CwAA//+dbnwDZLwAAA==", + "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", + "AAD//3gHYjaUvQAA", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/dm/openapi/gen.types.go b/dm/openapi/gen.types.go index 6ffb8d0e38d..647c25bf2ef 100644 --- a/dm/openapi/gen.types.go +++ b/dm/openapi/gen.types.go @@ -33,6 +33,8 @@ const ( TaskTaskModeFull TaskTaskMode = "full" TaskTaskModeIncremental TaskTaskMode = "incremental" + + TaskTaskModeLoad TaskTaskMode = "load" ) // Defines values for TaskFullMigrateConfAnalyze. @@ -80,6 +82,8 @@ const ( const ( TaskStageFinished TaskStage = "Finished" + TaskStagePaused TaskStage = "Paused" + TaskStageRunning TaskStage = "Running" TaskStageStopped TaskStage = "Stopped" @@ -165,10 +169,12 @@ type DisableRelayRequest struct { // status of dump unit type DumpStatus struct { + Bps int64 `json:"bps"` CompletedTables float64 `json:"completed_tables"` EstimateTotalRows float64 `json:"estimate_total_rows"` FinishedBytes float64 `json:"finished_bytes"` FinishedRows float64 `json:"finished_rows"` + Progress string `json:"progress"` TotalTables int64 `json:"total_tables"` } @@ -260,6 +266,7 @@ type GrafanaTopology struct { // status of load unit type LoadStatus struct { + Bps int64 `json:"bps"` FinishedBytes int64 `json:"finished_bytes"` MetaBinlog string `json:"meta_binlog"` MetaBinlogGtid string `json:"meta_binlog_gtid"` @@ -501,6 +508,8 @@ type SyncStatus struct { // sharding DDL which current is blocking BlockingDdls []string `json:"blocking_ddls"` + DumpIoTotalBytes uint64 `json:"dump_io_total_bytes"` + IoTotalBytes uint64 `json:"io_total_bytes"` MasterBinlog string `json:"master_binlog"` MasterBinlogGtid string `json:"master_binlog_gtid"` RecentTps int64 `json:"recent_tps"` diff --git a/dm/openapi/spec/dm.yaml b/dm/openapi/spec/dm.yaml index c07b6139d25..2fea9d8da86 100644 --- a/dm/openapi/spec/dm.yaml +++ b/dm/openapi/spec/dm.yaml @@ -1456,12 +1456,16 @@ components: type: string meta_binlog_gtid: type: string + bps: + type: integer + format: int64 required: - "finished_bytes" - "total_bytes" - "progress" - "meta_binlog" - "meta_binlog_gtid" + - "bps" SyncStatus: type: object description: "status of sync unit" @@ -1500,6 +1504,12 @@ components: seconds_behind_master: type: integer format: int64 + io_total_bytes: + type: integer + format: uint64 + dump_io_total_bytes: + type: integer + format: uint64 required: - "total_events" - "total_tps" @@ -1513,6 +1523,8 @@ components: - "synced" - "binlog_type" - "seconds_behind_master" + - "io_total_bytes" + - "dump_io_total_bytes" DumpStatus: type: object description: "status of dump unit" @@ -1532,12 +1544,19 @@ components: estimate_total_rows: type: number format: double + bps: + type: integer + format: int64 + progress: + type: string required: - "total_tables" - "completed_tables" - "finished_bytes" - "finished_rows" - "estimate_total_rows" + - "bps" + - "progress" SubTaskStatus: type: object properties: @@ -1809,6 +1828,7 @@ components: - Stopped - Running - Finished + - Paused Task: description: "task" type: object @@ -1826,6 +1846,7 @@ components: - "incremental" - "all" - "dump" + - "load" shard_mode: type: string description: the way to coordinate DDL diff --git a/dm/pb/dmworker.pb.go b/dm/pb/dmworker.pb.go index 098648f4268..38d77a300a7 100644 --- a/dm/pb/dmworker.pb.go +++ b/dm/pb/dmworker.pb.go @@ -961,6 +961,10 @@ type SyncStatus struct { TotalRows int64 `protobuf:"varint,15,opt,name=totalRows,proto3" json:"totalRows,omitempty"` TotalRps int64 `protobuf:"varint,16,opt,name=totalRps,proto3" json:"totalRps,omitempty"` RecentRps int64 `protobuf:"varint,17,opt,name=recentRps,proto3" json:"recentRps,omitempty"` + // meter TCP io to downstream of the subtask + IoTotalBytes uint64 `protobuf:"varint,18,opt,name=ioTotalBytes,proto3" json:"ioTotalBytes,omitempty"` + // meter TCP io from upstream of the subtask + DumpIOTotalBytes uint64 `protobuf:"varint,19,opt,name=dumpIOTotalBytes,proto3" json:"dumpIOTotalBytes,omitempty"` } func (m *SyncStatus) Reset() { *m = SyncStatus{} } @@ -1115,6 +1119,20 @@ func (m *SyncStatus) GetRecentRps() int64 { return 0 } +func (m *SyncStatus) GetIoTotalBytes() uint64 { + if m != nil { + return m.IoTotalBytes + } + return 0 +} + +func (m *SyncStatus) GetDumpIOTotalBytes() uint64 { + if m != nil { + return m.DumpIOTotalBytes + } + return 0 +} + // SourceStatus represents status for source runing on dm-worker type SourceStatus struct { Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` @@ -3637,192 +3655,193 @@ func init() { func init() { proto.RegisterFile("dmworker.proto", fileDescriptor_51a1b9e17fd67b10) } var fileDescriptor_51a1b9e17fd67b10 = []byte{ - // 2947 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x3a, 0xcd, 0x6f, 0xe5, 0x56, - 0xf5, 0xcf, 0xf6, 0xfb, 0x3c, 0xef, 0x25, 0x71, 0xee, 0x64, 0xe6, 0xf7, 0x9a, 0xce, 0xbc, 0xa6, - 0x9e, 0xaa, 0xbf, 0x34, 0x2a, 0x51, 0x1b, 0x8a, 0x8a, 0x2a, 0x41, 0xdb, 0x49, 0xa6, 0x99, 0x29, - 0x99, 0x66, 0xc6, 0x49, 0x87, 0x15, 0x12, 0x8e, 0xdf, 0xcd, 0x8b, 0x89, 0x9f, 0xed, 0xb1, 0xfd, - 0x12, 0x65, 0x81, 0xd8, 0xb1, 0x85, 0x0d, 0x48, 0x20, 0x36, 0x20, 0xb1, 0x65, 0xc1, 0x1f, 0xc0, - 0x12, 0xba, 0xac, 0x58, 0xb1, 0x42, 0xa8, 0xf3, 0x37, 0xb0, 0x61, 0x81, 0xd0, 0x39, 0xf7, 0x5e, - 0xfb, 0xfa, 0x7d, 0x64, 0x3a, 0x48, 0xec, 0x7c, 0x3e, 0xee, 0xb9, 0xc7, 0xe7, 0xfb, 0xf8, 0x3d, - 0x58, 0x1e, 0x8e, 0x2f, 0xe3, 0xf4, 0x9c, 0xa7, 0xdb, 0x49, 0x1a, 0xe7, 0x31, 0x33, 0x93, 0x13, - 0x67, 0x13, 0xd8, 0x93, 0x09, 0x4f, 0xaf, 0x8e, 0x72, 0x2f, 0x9f, 0x64, 0x2e, 0x7f, 0x36, 0xe1, - 0x59, 0xce, 0x18, 0xd4, 0x23, 0x6f, 0xcc, 0xfb, 0xc6, 0x86, 0xb1, 0xd9, 0x71, 0xe9, 0xd9, 0x49, - 0x60, 0x6d, 0x37, 0x1e, 0x8f, 0xe3, 0xe8, 0xfb, 0x24, 0xc3, 0xe5, 0x59, 0x12, 0x47, 0x19, 0x67, - 0xb7, 0xa0, 0x99, 0xf2, 0x6c, 0x12, 0xe6, 0xc4, 0xdd, 0x76, 0x25, 0xc4, 0x6c, 0xb0, 0xc6, 0xd9, - 0xa8, 0x6f, 0x92, 0x08, 0x7c, 0x44, 0xce, 0x2c, 0x9e, 0xa4, 0x3e, 0xef, 0x5b, 0x84, 0x94, 0x10, - 0xe2, 0x85, 0x5e, 0xfd, 0xba, 0xc0, 0x0b, 0xc8, 0xf9, 0x83, 0x01, 0x37, 0x2a, 0xca, 0xbd, 0xf4, - 0x8d, 0xef, 0x41, 0x4f, 0xdc, 0x21, 0x24, 0xd0, 0xbd, 0xdd, 0x1d, 0x7b, 0x3b, 0x39, 0xd9, 0x3e, - 0xd2, 0xf0, 0x6e, 0x85, 0x8b, 0xbd, 0x0f, 0x4b, 0xd9, 0xe4, 0xe4, 0xd8, 0xcb, 0xce, 0xe5, 0xb1, - 0xfa, 0x86, 0xb5, 0xd9, 0xdd, 0x59, 0xa5, 0x63, 0x3a, 0xc1, 0xad, 0xf2, 0x39, 0xbf, 0x37, 0xa0, - 0xbb, 0x7b, 0xc6, 0x7d, 0x09, 0xa3, 0xa2, 0x89, 0x97, 0x65, 0x7c, 0xa8, 0x14, 0x15, 0x10, 0x5b, - 0x83, 0x46, 0x1e, 0xe7, 0x5e, 0x48, 0xaa, 0x36, 0x5c, 0x01, 0xb0, 0x01, 0x40, 0x36, 0xf1, 0x7d, - 0x9e, 0x65, 0xa7, 0x93, 0x90, 0x54, 0x6d, 0xb8, 0x1a, 0x06, 0xa5, 0x9d, 0x7a, 0x41, 0xc8, 0x87, - 0x64, 0xa6, 0x86, 0x2b, 0x21, 0xd6, 0x87, 0xd6, 0xa5, 0x97, 0x46, 0x41, 0x34, 0xea, 0x37, 0x88, - 0xa0, 0x40, 0x3c, 0x31, 0xe4, 0xb9, 0x17, 0x84, 0xfd, 0xe6, 0x86, 0xb1, 0xd9, 0x73, 0x25, 0xe4, - 0xfc, 0xdb, 0x00, 0xd8, 0x9b, 0x8c, 0x13, 0xa9, 0xe6, 0x06, 0x74, 0x49, 0x83, 0x63, 0xef, 0x24, - 0xe4, 0x19, 0xe9, 0x6a, 0xb9, 0x3a, 0x8a, 0x6d, 0xc2, 0x8a, 0x1f, 0x8f, 0x93, 0x90, 0xe7, 0x7c, - 0x28, 0xb9, 0x50, 0x75, 0xc3, 0x9d, 0x46, 0xb3, 0x37, 0x60, 0xe9, 0x34, 0x88, 0x82, 0xec, 0x8c, - 0x0f, 0xef, 0x5d, 0xe5, 0x5c, 0x98, 0xdc, 0x70, 0xab, 0x48, 0xe6, 0x40, 0x4f, 0x21, 0xdc, 0xf8, - 0x32, 0xa3, 0x17, 0x32, 0xdc, 0x0a, 0x8e, 0xbd, 0x0d, 0xab, 0x3c, 0xcb, 0x83, 0xb1, 0x97, 0xf3, - 0x63, 0x54, 0x85, 0x18, 0x1b, 0xc4, 0x38, 0x4b, 0x40, 0xdf, 0x9f, 0x24, 0x19, 0xbd, 0xa7, 0xe5, - 0xe2, 0x23, 0x5b, 0x87, 0x76, 0x92, 0xc6, 0xa3, 0x94, 0x67, 0x59, 0xbf, 0x45, 0x21, 0x51, 0xc0, - 0xce, 0x17, 0x06, 0xc0, 0x41, 0xec, 0x0d, 0xa5, 0x01, 0x66, 0x94, 0x16, 0x26, 0x98, 0x52, 0x7a, - 0x00, 0x40, 0x36, 0x11, 0x2c, 0x26, 0xb1, 0x68, 0x98, 0xca, 0x85, 0x56, 0xf5, 0x42, 0x3c, 0x3b, - 0xe6, 0xb9, 0x77, 0x2f, 0x88, 0xc2, 0x78, 0x24, 0xc3, 0x5c, 0xc3, 0xb0, 0x37, 0x61, 0xb9, 0x84, - 0xf6, 0x8f, 0x1f, 0xee, 0xd1, 0x9b, 0x76, 0xdc, 0x29, 0xec, 0xec, 0x6b, 0x3a, 0xbf, 0x30, 0x60, - 0xe9, 0xe8, 0xcc, 0x4b, 0x87, 0x41, 0x34, 0xda, 0x4f, 0xe3, 0x49, 0x82, 0x5e, 0xcf, 0xbd, 0x74, - 0xc4, 0x73, 0x99, 0xbe, 0x12, 0xc2, 0xa4, 0xde, 0xdb, 0x3b, 0x40, 0xcd, 0x2d, 0x4c, 0x6a, 0x7c, - 0x16, 0x6f, 0x9e, 0x66, 0xf9, 0x41, 0xec, 0x7b, 0x79, 0x10, 0x47, 0x52, 0xf1, 0x2a, 0x92, 0x12, - 0xf7, 0x2a, 0xf2, 0x29, 0xf2, 0x2c, 0x4a, 0x5c, 0x82, 0xf0, 0x8d, 0x27, 0x91, 0xa4, 0x34, 0x88, - 0x52, 0xc0, 0xce, 0x3f, 0xeb, 0x00, 0x47, 0x57, 0x91, 0x3f, 0x15, 0x63, 0xf7, 0x2f, 0x78, 0x94, - 0x57, 0x63, 0x4c, 0xa0, 0x50, 0x98, 0x08, 0xb9, 0x44, 0x19, 0xb7, 0x80, 0xd9, 0x6d, 0xe8, 0xa4, - 0xdc, 0xe7, 0x51, 0x8e, 0x44, 0x8b, 0x88, 0x25, 0x02, 0xa3, 0x69, 0xec, 0x65, 0x39, 0x4f, 0x2b, - 0xe6, 0xad, 0xe0, 0xd8, 0x16, 0xd8, 0x3a, 0xbc, 0x9f, 0x07, 0x43, 0x69, 0xe2, 0x19, 0x3c, 0xca, - 0xa3, 0x97, 0x50, 0xf2, 0x9a, 0x42, 0x9e, 0x8e, 0x43, 0x79, 0x3a, 0x4c, 0xf2, 0x44, 0x94, 0xcd, - 0xe0, 0x51, 0xde, 0x49, 0x18, 0xfb, 0xe7, 0x41, 0x34, 0x22, 0x07, 0xb4, 0xc9, 0x54, 0x15, 0x1c, - 0xfb, 0x0e, 0xd8, 0x93, 0x28, 0xe5, 0x59, 0x1c, 0x5e, 0xf0, 0x21, 0xf9, 0x31, 0xeb, 0x77, 0xb4, - 0xb2, 0xa3, 0x7b, 0xd8, 0x9d, 0x61, 0xd5, 0x3c, 0x04, 0xa2, 0xd2, 0x48, 0x0f, 0x0d, 0x00, 0x4e, - 0x48, 0x91, 0xe3, 0xab, 0x84, 0xf7, 0xbb, 0x22, 0xee, 0x4a, 0x0c, 0x7b, 0x07, 0x6e, 0x64, 0xdc, - 0x8f, 0xa3, 0x61, 0x76, 0x8f, 0x9f, 0x05, 0xd1, 0xf0, 0x11, 0xd9, 0xa2, 0xdf, 0x23, 0x13, 0xcf, - 0x23, 0x61, 0xc4, 0x90, 0xe2, 0x7b, 0x7b, 0x07, 0x87, 0x97, 0x11, 0x4f, 0xfb, 0x4b, 0x22, 0x62, - 0x2a, 0x48, 0x74, 0xb7, 0x1f, 0x47, 0xa7, 0x61, 0xe0, 0xe7, 0x8f, 0xb2, 0x51, 0x7f, 0x99, 0x78, - 0x74, 0x14, 0xba, 0x34, 0x2f, 0xd2, 0x7a, 0x45, 0xb8, 0xb4, 0x40, 0x14, 0xc1, 0xe0, 0x26, 0x59, - 0xdf, 0xd6, 0x82, 0xc1, 0xd5, 0x83, 0x01, 0x89, 0xab, 0x7a, 0x30, 0xb8, 0x49, 0xe6, 0xfc, 0xc6, - 0x80, 0x9e, 0x5e, 0xdb, 0xb5, 0xae, 0x63, 0x2c, 0xe8, 0x3a, 0xa6, 0xde, 0x75, 0xd8, 0x5b, 0x45, - 0x77, 0x11, 0xdd, 0x82, 0xec, 0xff, 0x38, 0x8d, 0xb1, 0x0c, 0xbb, 0x44, 0x28, 0x1a, 0xce, 0xbb, - 0xd0, 0x4d, 0x79, 0xe8, 0x5d, 0x15, 0x6d, 0x02, 0xf9, 0x57, 0x90, 0xdf, 0x2d, 0xd1, 0xae, 0xce, - 0xe3, 0xfc, 0xc5, 0x84, 0xae, 0x46, 0x9c, 0x89, 0x5d, 0xe3, 0x6b, 0xc6, 0xae, 0xb9, 0x20, 0x76, - 0x37, 0x94, 0x4a, 0x93, 0x93, 0xbd, 0x20, 0x95, 0xe9, 0xac, 0xa3, 0x0a, 0x8e, 0x4a, 0xb2, 0xe8, - 0x28, 0xac, 0xf6, 0x1a, 0xa8, 0xa5, 0xca, 0x34, 0x9a, 0x6d, 0x03, 0x23, 0xd4, 0xae, 0x97, 0xfb, - 0x67, 0x9f, 0x27, 0x32, 0x7a, 0x9a, 0x14, 0x82, 0x73, 0x28, 0xec, 0x35, 0x68, 0x64, 0xb9, 0x37, - 0xe2, 0x94, 0x2a, 0xcb, 0x3b, 0x1d, 0x0a, 0x6d, 0x44, 0xb8, 0x02, 0xaf, 0x19, 0xbf, 0xfd, 0x02, - 0xe3, 0x3b, 0x7f, 0xb4, 0x60, 0xa9, 0xd2, 0x8d, 0xe7, 0x4d, 0x2d, 0xe5, 0x8d, 0xe6, 0x82, 0x1b, - 0x37, 0xa0, 0x3e, 0x89, 0x02, 0xe1, 0xec, 0xe5, 0x9d, 0x1e, 0xd2, 0x3f, 0x8f, 0x82, 0x1c, 0xb3, - 0xc3, 0x25, 0x8a, 0xa6, 0x53, 0xfd, 0x45, 0x01, 0xf1, 0x0e, 0xdc, 0x28, 0x53, 0x73, 0x6f, 0xef, - 0xe0, 0x20, 0xf6, 0xcf, 0x8b, 0x5a, 0x3e, 0x8f, 0xc4, 0x98, 0x98, 0x59, 0xa8, 0xc4, 0x3c, 0xa8, - 0x89, 0xa9, 0xe5, 0xff, 0xa1, 0xe1, 0xe3, 0x14, 0x41, 0x56, 0x92, 0x01, 0xa5, 0x8d, 0x15, 0x0f, - 0x6a, 0xae, 0xa0, 0xb3, 0x37, 0xa0, 0x3e, 0x9c, 0x8c, 0x13, 0x69, 0xab, 0x65, 0xe4, 0x2b, 0xdb, - 0xfa, 0x83, 0x9a, 0x4b, 0x54, 0xe4, 0x0a, 0x63, 0x6f, 0xd8, 0xef, 0x94, 0x5c, 0x65, 0xef, 0x43, - 0x2e, 0xa4, 0x22, 0x17, 0xd6, 0x0c, 0xaa, 0x1f, 0x92, 0xab, 0x2c, 0xdf, 0xc8, 0x85, 0x54, 0xf6, - 0x1e, 0xc0, 0x85, 0x17, 0x06, 0x43, 0xd1, 0x2c, 0xba, 0xc4, 0xbb, 0x86, 0xbc, 0x4f, 0x0b, 0xac, - 0x8c, 0x7a, 0x8d, 0xef, 0x5e, 0x1b, 0x9a, 0x99, 0x08, 0xff, 0xef, 0xc2, 0x6a, 0xc5, 0x67, 0x07, - 0x41, 0x46, 0x06, 0x16, 0xe4, 0xbe, 0xb1, 0x68, 0xd0, 0x52, 0xe7, 0x07, 0x00, 0x64, 0x89, 0xfb, - 0x69, 0x1a, 0xa7, 0x6a, 0xe0, 0x33, 0x8a, 0x81, 0xcf, 0xb9, 0x03, 0x1d, 0xb4, 0xc0, 0x35, 0x64, - 0x7c, 0xf5, 0x45, 0xe4, 0x04, 0x7a, 0xf4, 0xce, 0x4f, 0x0e, 0x16, 0x70, 0xb0, 0x1d, 0x58, 0x13, - 0x53, 0x97, 0x48, 0x82, 0xc7, 0x71, 0x16, 0x90, 0x25, 0x44, 0x3a, 0xce, 0xa5, 0x61, 0x2d, 0xe3, - 0x28, 0xee, 0xe8, 0xc9, 0x81, 0x9a, 0x0b, 0x14, 0xec, 0x7c, 0x0b, 0x3a, 0x78, 0xa3, 0xb8, 0x6e, - 0x13, 0x9a, 0x44, 0x50, 0x76, 0xb0, 0x0b, 0x27, 0x48, 0x85, 0x5c, 0x49, 0x77, 0x7e, 0x66, 0x40, - 0x57, 0x14, 0x39, 0x71, 0xf2, 0x65, 0x6b, 0xdc, 0x46, 0xe5, 0xb8, 0xaa, 0x12, 0xba, 0xc4, 0x6d, - 0x00, 0x2a, 0x53, 0x82, 0xa1, 0x5e, 0x06, 0x45, 0x89, 0x75, 0x35, 0x0e, 0x74, 0x4c, 0x09, 0xcd, - 0x31, 0xed, 0xaf, 0x4c, 0xe8, 0x49, 0x97, 0x0a, 0x96, 0xff, 0x51, 0xb2, 0xca, 0x7c, 0xaa, 0xeb, - 0xf9, 0xf4, 0xa6, 0xca, 0xa7, 0x46, 0xf9, 0x1a, 0x65, 0x14, 0x95, 0xe9, 0x74, 0x57, 0xa6, 0x53, - 0x93, 0xd8, 0x96, 0x54, 0x3a, 0x29, 0x2e, 0x91, 0x4d, 0x77, 0x65, 0x36, 0xb5, 0x4a, 0xa6, 0x22, - 0xa4, 0x8a, 0x64, 0xba, 0x2b, 0x93, 0xa9, 0x5d, 0x32, 0x15, 0x6e, 0x56, 0xb9, 0x74, 0xaf, 0x05, - 0x0d, 0x72, 0xa7, 0xf3, 0x01, 0xd8, 0xba, 0x69, 0x28, 0x27, 0xde, 0x94, 0xc4, 0x4a, 0x28, 0x68, - 0x4c, 0xae, 0x3c, 0xfb, 0x0c, 0x96, 0x2a, 0xa5, 0x08, 0x3b, 0x7e, 0x90, 0xed, 0x7a, 0x91, 0xcf, - 0xc3, 0x62, 0xef, 0xd0, 0x30, 0x5a, 0x90, 0x99, 0xa5, 0x64, 0x29, 0xa2, 0x12, 0x64, 0xda, 0xf6, - 0x60, 0x55, 0xb6, 0x87, 0xbf, 0x1a, 0xd0, 0xd3, 0x0f, 0xe0, 0x02, 0x72, 0x3f, 0x4d, 0x77, 0xe3, - 0xa1, 0xf0, 0x66, 0xc3, 0x55, 0x20, 0x86, 0x3e, 0x3e, 0x86, 0x5e, 0x96, 0xc9, 0x08, 0x2c, 0x60, - 0x49, 0x3b, 0xf2, 0xe3, 0x44, 0xed, 0x83, 0x05, 0x2c, 0x69, 0x07, 0xfc, 0x82, 0x87, 0xb2, 0x41, - 0x15, 0x30, 0xde, 0xf6, 0x88, 0x67, 0x19, 0x86, 0x89, 0xa8, 0xab, 0x0a, 0xc4, 0x53, 0xae, 0x77, - 0xb9, 0xeb, 0x4d, 0x32, 0x2e, 0x67, 0xb6, 0x02, 0x46, 0xb3, 0xe0, 0xde, 0xea, 0xa5, 0xf1, 0x24, - 0x52, 0x93, 0x9a, 0x86, 0x71, 0x2e, 0x61, 0xf5, 0xf1, 0x24, 0x1d, 0x71, 0x0a, 0x62, 0xb5, 0x06, - 0xaf, 0x43, 0x3b, 0x88, 0x3c, 0x3f, 0x0f, 0x2e, 0xb8, 0xb4, 0x64, 0x01, 0x63, 0xfc, 0xe6, 0xc1, - 0x98, 0xcb, 0x51, 0x95, 0x9e, 0x91, 0xff, 0x34, 0x08, 0x39, 0xc5, 0xb5, 0x7c, 0x25, 0x05, 0x53, - 0x8a, 0x8a, 0x9e, 0x2c, 0x97, 0x5c, 0x01, 0x39, 0xbf, 0x36, 0x61, 0xfd, 0x30, 0xe1, 0xa9, 0x97, - 0x73, 0xb1, 0x58, 0x1f, 0xf9, 0x67, 0x7c, 0xec, 0x29, 0x15, 0x6e, 0x83, 0x19, 0x27, 0x74, 0xb9, - 0x8c, 0x77, 0x41, 0x3e, 0x4c, 0x5c, 0x33, 0x4e, 0x48, 0x09, 0x2f, 0x3b, 0x97, 0xb6, 0xa5, 0xe7, - 0x85, 0x5b, 0xf6, 0x3a, 0xb4, 0x87, 0x5e, 0xee, 0x9d, 0x78, 0x19, 0x57, 0x36, 0x55, 0x30, 0x2d, - 0xa4, 0xb8, 0xbf, 0x49, 0x8b, 0x0a, 0x80, 0x24, 0xd1, 0x6d, 0xd2, 0x9a, 0x12, 0x42, 0xee, 0xd3, - 0x70, 0x92, 0x9d, 0x91, 0x19, 0xdb, 0xae, 0x00, 0x50, 0x97, 0x22, 0xe6, 0xdb, 0xb2, 0x5d, 0x0c, - 0x00, 0x4e, 0xd3, 0x78, 0x2c, 0x0a, 0x0b, 0x35, 0xa0, 0xb6, 0xab, 0x61, 0x14, 0xfd, 0x58, 0xac, - 0x2b, 0x50, 0xd2, 0x05, 0xc6, 0xc9, 0x61, 0xe9, 0xe9, 0xbb, 0x32, 0xec, 0x1f, 0xf1, 0xdc, 0x63, - 0xeb, 0x9a, 0x39, 0x00, 0xcd, 0x81, 0x14, 0x69, 0x8c, 0x17, 0x56, 0x0f, 0x55, 0x72, 0x2c, 0xad, - 0xe4, 0x28, 0x0b, 0xd6, 0x29, 0xc4, 0xe9, 0xd9, 0x79, 0x0f, 0xd6, 0xa4, 0x47, 0x9e, 0xbe, 0x8b, - 0xb7, 0x2e, 0xf4, 0x85, 0x20, 0x8b, 0xeb, 0x9d, 0x3f, 0x1b, 0x70, 0x73, 0xea, 0xd8, 0x4b, 0x7f, - 0xaf, 0x78, 0x1f, 0xea, 0xb8, 0xf0, 0xf5, 0x2d, 0x4a, 0xcd, 0xbb, 0x78, 0xc7, 0x5c, 0x91, 0xdb, - 0x08, 0xdc, 0x8f, 0xf2, 0xf4, 0xca, 0xa5, 0x03, 0xeb, 0x9f, 0x42, 0xa7, 0x40, 0xa1, 0xdc, 0x73, - 0x7e, 0xa5, 0xaa, 0xef, 0x39, 0xbf, 0xc2, 0x89, 0xe2, 0xc2, 0x0b, 0x27, 0xc2, 0x34, 0xb2, 0xc1, - 0x56, 0x0c, 0xeb, 0x0a, 0xfa, 0x07, 0xe6, 0xb7, 0x0d, 0xe7, 0xc7, 0xd0, 0x7f, 0xe0, 0x45, 0xc3, - 0x50, 0xc6, 0xa3, 0x28, 0x0a, 0xd2, 0x04, 0xaf, 0x6a, 0x26, 0xe8, 0xa2, 0x14, 0xa2, 0x5e, 0x13, - 0x8d, 0xb7, 0xa1, 0x73, 0xa2, 0xda, 0xa1, 0x34, 0x7c, 0x89, 0xa0, 0x98, 0x79, 0x16, 0x66, 0x72, - 0xad, 0xa4, 0x67, 0xe7, 0x26, 0xdc, 0xd8, 0xe7, 0xb9, 0xb8, 0x7b, 0xf7, 0x74, 0x24, 0x6f, 0x76, - 0x36, 0x61, 0xad, 0x8a, 0x96, 0xc6, 0xb5, 0xc1, 0xf2, 0x4f, 0x8b, 0x56, 0xe3, 0x9f, 0x8e, 0x9c, - 0x23, 0xb8, 0x23, 0xa6, 0xa5, 0xc9, 0x09, 0xaa, 0x80, 0xa5, 0xef, 0xf3, 0x64, 0xe8, 0xe5, 0x5c, - 0xbd, 0xc4, 0x0e, 0xac, 0x65, 0x82, 0xb6, 0x7b, 0x3a, 0x3a, 0x8e, 0xc7, 0xe1, 0x51, 0x9e, 0x06, - 0x91, 0x92, 0x31, 0x97, 0xe6, 0x1c, 0xc0, 0x60, 0x91, 0x50, 0xa9, 0x48, 0x1f, 0x5a, 0xf2, 0x63, - 0x8d, 0x74, 0xb3, 0x02, 0x67, 0xfd, 0xec, 0x8c, 0x60, 0x7d, 0x9f, 0xe7, 0x33, 0x33, 0x53, 0x59, - 0x76, 0xf0, 0x8e, 0xcf, 0xca, 0xf6, 0x58, 0xc0, 0xec, 0x1b, 0xd0, 0x3b, 0x0d, 0xc2, 0x9c, 0xa7, - 0x72, 0xe7, 0x98, 0x89, 0xf5, 0x0a, 0xd9, 0xf9, 0xbb, 0x05, 0xf6, 0xf4, 0x35, 0x85, 0x9f, 0x8c, - 0xb9, 0x55, 0xc3, 0xac, 0x54, 0x0d, 0x06, 0xf5, 0x31, 0x16, 0x76, 0x99, 0x33, 0xf8, 0x5c, 0x26, - 0x5a, 0x7d, 0x41, 0xa2, 0x6d, 0xc2, 0x8a, 0x9c, 0xfe, 0x62, 0xb5, 0xd7, 0xc8, 0x05, 0x62, 0x0a, - 0x8d, 0x03, 0xf3, 0x14, 0x8a, 0xd6, 0x0d, 0x51, 0x6f, 0xe6, 0x91, 0xb4, 0x69, 0xbc, 0xf5, 0x35, - 0xa6, 0xf1, 0x44, 0x10, 0xc4, 0x27, 0x25, 0x69, 0xb2, 0xb6, 0x10, 0x3e, 0x87, 0xc4, 0xde, 0x86, - 0xd5, 0x84, 0x47, 0xb8, 0x68, 0x6b, 0xfc, 0x1d, 0xe2, 0x9f, 0x25, 0xe0, 0x6b, 0x52, 0xab, 0xd4, - 0x78, 0x41, 0xbc, 0xe6, 0x14, 0x1a, 0x37, 0x38, 0x7f, 0x92, 0xc7, 0x17, 0x6a, 0x55, 0xc3, 0x64, - 0x10, 0xcb, 0xf8, 0x0c, 0x1e, 0x75, 0xa8, 0xe0, 0xc8, 0x20, 0x3d, 0xa1, 0xc3, 0x0c, 0xc1, 0xf9, - 0x9d, 0x01, 0x37, 0x4b, 0x07, 0xd3, 0x47, 0xb8, 0x17, 0xec, 0xbd, 0xeb, 0xd0, 0xce, 0x52, 0x9f, - 0x38, 0x55, 0x4f, 0x56, 0x30, 0xf5, 0x88, 0x2c, 0x17, 0x34, 0xd9, 0xc0, 0x14, 0xfc, 0x62, 0xaf, - 0xf7, 0xa1, 0x35, 0xae, 0x36, 0x66, 0x09, 0x3a, 0x7f, 0x32, 0xe0, 0xd5, 0xb9, 0xf1, 0xfe, 0x5f, - 0x7c, 0xd0, 0x85, 0x22, 0x28, 0x32, 0x59, 0x26, 0xaf, 0xdf, 0x3f, 0x70, 0x92, 0xf9, 0x10, 0x96, - 0xf2, 0xd2, 0x32, 0x5c, 0x7d, 0xd0, 0x7d, 0xa5, 0x7a, 0x50, 0x33, 0x9e, 0x5b, 0xe5, 0x77, 0xce, - 0xe1, 0x95, 0x8a, 0xfe, 0x95, 0x9a, 0xb8, 0x43, 0xf3, 0x3d, 0xf2, 0x72, 0x59, 0x19, 0x6f, 0x69, - 0x82, 0xc5, 0x3c, 0x4d, 0x54, 0xb7, 0xe0, 0xab, 0xa4, 0xb8, 0x59, 0x4d, 0x71, 0xe7, 0xb7, 0x26, - 0xac, 0x4c, 0x5d, 0xc5, 0x96, 0xc1, 0x0c, 0x86, 0xd2, 0x91, 0x66, 0x30, 0x5c, 0x98, 0xae, 0xba, - 0x73, 0xad, 0x29, 0xe7, 0x62, 0x81, 0x4a, 0xfd, 0x3d, 0x2f, 0xf7, 0x64, 0xff, 0x57, 0x60, 0xc5, - 0xed, 0x8d, 0x29, 0xb7, 0xf7, 0xa1, 0x35, 0xcc, 0x72, 0x3a, 0x25, 0xb2, 0x52, 0x81, 0x58, 0xda, - 0x29, 0xce, 0xe9, 0xd3, 0x92, 0x98, 0xa8, 0x4a, 0x04, 0xdb, 0x2e, 0x96, 0xba, 0xf6, 0xb5, 0x36, - 0x91, 0x5c, 0xc5, 0x3c, 0xd5, 0x91, 0x45, 0x09, 0xe7, 0x29, 0x2d, 0xa2, 0xa0, 0x1a, 0x51, 0xcf, - 0xa6, 0x0a, 0xa8, 0x74, 0xc8, 0x4b, 0xc7, 0xd3, 0x5b, 0x6a, 0xcc, 0x16, 0xa1, 0x74, 0xa3, 0x1a, - 0x11, 0x95, 0x49, 0xfb, 0x97, 0x06, 0xdc, 0x51, 0xcd, 0x78, 0x7e, 0x20, 0xdc, 0xd5, 0x9a, 0xe3, - 0xac, 0x24, 0xd9, 0x24, 0x69, 0x3e, 0xff, 0x38, 0x0c, 0xc5, 0x62, 0x65, 0xaa, 0xf9, 0x5c, 0x61, - 0x2a, 0x91, 0x61, 0x4d, 0x15, 0xff, 0x35, 0xd2, 0xf6, 0xa1, 0xf8, 0x01, 0xa0, 0xee, 0x0a, 0xc0, - 0xf9, 0x14, 0x06, 0x8b, 0xf4, 0x7a, 0x59, 0x7b, 0x38, 0x57, 0x70, 0x47, 0xb4, 0xb5, 0x52, 0x94, - 0xfa, 0xb9, 0xe7, 0xc5, 0xbd, 0xa9, 0xd2, 0xeb, 0xcd, 0xe9, 0x5e, 0x5f, 0x7c, 0x8a, 0xa4, 0xcf, - 0xdb, 0x96, 0xfe, 0x29, 0x12, 0x31, 0x5b, 0xe7, 0xd0, 0x14, 0xc3, 0x1c, 0x5b, 0x82, 0xce, 0xc3, - 0x88, 0xd2, 0xf7, 0x30, 0xb1, 0x6b, 0xac, 0x0d, 0xf5, 0xa3, 0x3c, 0x4e, 0x6c, 0x83, 0x75, 0xa0, - 0xf1, 0x18, 0xa7, 0x79, 0xdb, 0x64, 0x00, 0x4d, 0xac, 0xf6, 0x63, 0x6e, 0x5b, 0x88, 0x3e, 0xca, - 0xbd, 0x34, 0xb7, 0xeb, 0x88, 0x16, 0xfa, 0xdb, 0x0d, 0xb6, 0x0c, 0xf0, 0xf1, 0x24, 0x8f, 0x25, - 0x5b, 0x13, 0x69, 0x7b, 0x3c, 0xe4, 0x39, 0xb7, 0x5b, 0x5b, 0x3f, 0xa1, 0x23, 0x23, 0x1c, 0x1f, - 0x7a, 0xf2, 0x2e, 0x82, 0xed, 0x1a, 0x6b, 0x81, 0xf5, 0x19, 0xbf, 0xb4, 0x0d, 0xd6, 0x85, 0x96, - 0x3b, 0x89, 0xa2, 0x20, 0x1a, 0x89, 0xfb, 0xe8, 0xea, 0xa1, 0x6d, 0x21, 0x01, 0x15, 0x4a, 0xf8, - 0xd0, 0xae, 0xb3, 0x1e, 0xb4, 0x3f, 0x91, 0x3f, 0x13, 0xd8, 0x0d, 0x24, 0x21, 0x1b, 0x9e, 0x69, - 0x22, 0x89, 0x2e, 0x47, 0xa8, 0x85, 0x10, 0x9d, 0x42, 0xa8, 0xbd, 0x75, 0x08, 0x6d, 0xb5, 0xb9, - 0xb2, 0x15, 0xe8, 0x4a, 0x1d, 0x10, 0x65, 0xd7, 0xf0, 0x85, 0x68, 0xd8, 0xb0, 0x0d, 0x7c, 0x79, - 0xdc, 0x41, 0x6d, 0x13, 0x9f, 0x70, 0xd1, 0xb4, 0x2d, 0x32, 0xc8, 0x55, 0xe4, 0xdb, 0x75, 0x64, - 0xa4, 0x85, 0xc5, 0x1e, 0x6e, 0x3d, 0x82, 0x16, 0x3d, 0x1e, 0xe2, 0x1c, 0xb6, 0x2c, 0xe5, 0x49, - 0x8c, 0x5d, 0x43, 0x9b, 0xe2, 0xed, 0x82, 0xdb, 0x40, 0xdb, 0xd0, 0xeb, 0x08, 0xd8, 0x44, 0x15, - 0x84, 0x9d, 0x04, 0xc2, 0xda, 0xfa, 0xa9, 0x01, 0x6d, 0xb5, 0x6a, 0xb0, 0x1b, 0xb0, 0xa2, 0x8c, - 0x24, 0x51, 0x42, 0xe2, 0x3e, 0xcf, 0x05, 0xc2, 0x36, 0xe8, 0x82, 0x02, 0x34, 0xd1, 0xae, 0x2e, - 0x1f, 0xc7, 0x17, 0x5c, 0x62, 0x2c, 0xbc, 0x12, 0x37, 0x5b, 0x09, 0xd7, 0xf1, 0x00, 0xc2, 0x54, - 0x65, 0xec, 0x06, 0xbb, 0x05, 0x0c, 0xc1, 0x47, 0xc1, 0x08, 0x23, 0x59, 0xcc, 0xff, 0x99, 0xdd, - 0xdc, 0xfa, 0x08, 0xda, 0x6a, 0xcc, 0xd6, 0xf4, 0x50, 0xa8, 0x42, 0x0f, 0x81, 0xb0, 0x8d, 0xf2, - 0x62, 0x89, 0x31, 0xb7, 0x9e, 0xd2, 0x7a, 0x8a, 0x53, 0xaa, 0x66, 0x19, 0x89, 0x91, 0xe1, 0x75, - 0x1e, 0x24, 0xd2, 0xe1, 0x3c, 0x09, 0x3d, 0xbf, 0x08, 0xb0, 0x0b, 0x9e, 0xe6, 0xb6, 0x85, 0xcf, - 0x0f, 0xa3, 0x1f, 0x71, 0x1f, 0x23, 0x0c, 0xdd, 0x10, 0x64, 0xb9, 0xdd, 0xd8, 0x3a, 0x80, 0xee, - 0x53, 0xd5, 0x63, 0x0e, 0x13, 0x7c, 0x01, 0xa5, 0x5c, 0x89, 0xb5, 0x6b, 0x78, 0x27, 0x45, 0x67, - 0x81, 0xb5, 0x0d, 0xb6, 0x0a, 0x4b, 0xe8, 0x8d, 0x12, 0x65, 0x6e, 0x3d, 0x01, 0x36, 0x5b, 0x1d, - 0xd1, 0x68, 0xa5, 0xc2, 0x76, 0x0d, 0x35, 0xf9, 0x8c, 0x5f, 0xe2, 0x33, 0xf9, 0xf0, 0xe1, 0x28, - 0x8a, 0x53, 0x4e, 0x34, 0xe5, 0x43, 0xfa, 0xbe, 0x88, 0x08, 0x6b, 0xeb, 0xe9, 0x54, 0x1f, 0x39, - 0x4c, 0xb4, 0x70, 0x27, 0xd8, 0xae, 0x51, 0xf0, 0x91, 0x14, 0x81, 0x90, 0x06, 0x24, 0x31, 0x02, - 0x63, 0xe2, 0x45, 0xbb, 0x21, 0xf7, 0x52, 0x01, 0x5b, 0x3b, 0xff, 0x6a, 0x42, 0x53, 0x54, 0x05, - 0xf6, 0x11, 0x74, 0xb5, 0x5f, 0x68, 0x19, 0x15, 0xf9, 0xd9, 0xdf, 0x93, 0xd7, 0xff, 0x6f, 0x06, - 0x2f, 0x2a, 0x93, 0x53, 0x63, 0x1f, 0x02, 0x94, 0x8b, 0x37, 0xbb, 0x49, 0xd3, 0xdc, 0xf4, 0x22, - 0xbe, 0xde, 0xa7, 0x4f, 0x36, 0x73, 0x7e, 0x7d, 0x76, 0x6a, 0xec, 0x7b, 0xb0, 0x24, 0xcb, 0x9f, - 0x08, 0x2d, 0x36, 0xd0, 0xd6, 0xa6, 0x39, 0x2b, 0xf5, 0xb5, 0xc2, 0x3e, 0x29, 0x84, 0x89, 0xf0, - 0x61, 0xfd, 0x39, 0x3b, 0x98, 0x10, 0xf3, 0xca, 0xc2, 0xed, 0xcc, 0xa9, 0xb1, 0x7d, 0xe8, 0x8a, - 0x1d, 0x4a, 0x14, 0xf5, 0xdb, 0xc8, 0xbb, 0x68, 0xa9, 0xba, 0x56, 0xa1, 0x5d, 0xe8, 0xe9, 0x6b, - 0x0f, 0x23, 0x4b, 0xce, 0xd9, 0x8f, 0x84, 0x90, 0x79, 0x1b, 0x92, 0x53, 0x63, 0x1e, 0xdc, 0x9a, - 0xbf, 0xbc, 0xb0, 0xd7, 0xcb, 0x6f, 0xcb, 0x0b, 0xb6, 0xa5, 0x75, 0xe7, 0x3a, 0x96, 0xe2, 0x8a, - 0x1f, 0x40, 0xbf, 0xb8, 0xbc, 0x08, 0x6b, 0x19, 0x15, 0x03, 0xa9, 0xda, 0x82, 0x7d, 0x67, 0xfd, - 0xb5, 0x85, 0xf4, 0x42, 0xfc, 0x31, 0xac, 0x96, 0x0c, 0xb1, 0x30, 0x1f, 0xbb, 0x33, 0x73, 0xae, - 0x62, 0xd6, 0xc1, 0x22, 0x72, 0x21, 0xf5, 0x87, 0xe5, 0xc6, 0x5e, 0x95, 0xfc, 0xba, 0xee, 0xdb, - 0xf9, 0xd2, 0x9d, 0xeb, 0x58, 0x8a, 0x1b, 0x1e, 0xc3, 0x4a, 0xa5, 0x9f, 0x2a, 0xd9, 0xd7, 0x36, - 0xd9, 0xeb, 0x02, 0xe2, 0x5e, 0xff, 0x8b, 0xaf, 0x06, 0xc6, 0x97, 0x5f, 0x0d, 0x8c, 0x7f, 0x7c, - 0x35, 0x30, 0x7e, 0xfe, 0x7c, 0x50, 0xfb, 0xf2, 0xf9, 0xa0, 0xf6, 0xb7, 0xe7, 0x83, 0xda, 0x49, - 0x93, 0xfe, 0xd5, 0xf1, 0xcd, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x31, 0xe0, 0x21, 0xb2, 0xe7, - 0x21, 0x00, 0x00, + // 2972 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x3a, 0x4d, 0x6f, 0xdc, 0xd6, + 0xb5, 0x43, 0x72, 0x3e, 0xcf, 0x8c, 0x24, 0xea, 0x4a, 0xf6, 0x9b, 0x28, 0xf6, 0x44, 0xa1, 0x83, + 0x3c, 0x45, 0xc8, 0x13, 0x12, 0xbd, 0x3c, 0xe4, 0x21, 0x40, 0x9b, 0xc4, 0x92, 0x23, 0x3b, 0x95, + 0x23, 0x9b, 0x52, 0xdc, 0x55, 0x81, 0x52, 0x9c, 0xab, 0x11, 0x2b, 0x0e, 0x49, 0x93, 0x1c, 0x09, + 0x5a, 0x14, 0xdd, 0x75, 0xdb, 0x6e, 0x5a, 0xa0, 0x45, 0x37, 0x2d, 0xd0, 0x6d, 0x17, 0xfd, 0x01, + 0xdd, 0xb5, 0xcd, 0x32, 0xe8, 0xaa, 0xab, 0xa2, 0x48, 0xfe, 0x45, 0x17, 0x45, 0x71, 0xce, 0xbd, + 0x97, 0xbc, 0x9c, 0x0f, 0x39, 0x2e, 0xd0, 0x1d, 0xcf, 0xc7, 0x3d, 0xf7, 0xf0, 0x7c, 0x1f, 0xce, + 0xc0, 0xf2, 0x70, 0x7c, 0x15, 0xa7, 0x17, 0x3c, 0xdd, 0x49, 0xd2, 0x38, 0x8f, 0x99, 0x99, 0x9c, + 0x3a, 0x5b, 0xc0, 0x9e, 0x4e, 0x78, 0x7a, 0x7d, 0x9c, 0x7b, 0xf9, 0x24, 0x73, 0xf9, 0xf3, 0x09, + 0xcf, 0x72, 0xc6, 0xa0, 0x1e, 0x79, 0x63, 0xde, 0x37, 0x36, 0x8d, 0xad, 0x8e, 0x4b, 0xcf, 0x4e, + 0x02, 0xeb, 0x7b, 0xf1, 0x78, 0x1c, 0x47, 0xdf, 0x25, 0x19, 0x2e, 0xcf, 0x92, 0x38, 0xca, 0x38, + 0xbb, 0x0d, 0xcd, 0x94, 0x67, 0x93, 0x30, 0x27, 0xee, 0xb6, 0x2b, 0x21, 0x66, 0x83, 0x35, 0xce, + 0x46, 0x7d, 0x93, 0x44, 0xe0, 0x23, 0x72, 0x66, 0xf1, 0x24, 0xf5, 0x79, 0xdf, 0x22, 0xa4, 0x84, + 0x10, 0x2f, 0xf4, 0xea, 0xd7, 0x05, 0x5e, 0x40, 0xce, 0xef, 0x0c, 0x58, 0xab, 0x28, 0xf7, 0xd2, + 0x37, 0xbe, 0x07, 0x3d, 0x71, 0x87, 0x90, 0x40, 0xf7, 0x76, 0x77, 0xed, 0x9d, 0xe4, 0x74, 0xe7, + 0x58, 0xc3, 0xbb, 0x15, 0x2e, 0xf6, 0x3e, 0x2c, 0x65, 0x93, 0xd3, 0x13, 0x2f, 0xbb, 0x90, 0xc7, + 0xea, 0x9b, 0xd6, 0x56, 0x77, 0x77, 0x95, 0x8e, 0xe9, 0x04, 0xb7, 0xca, 0xe7, 0xfc, 0xd6, 0x80, + 0xee, 0xde, 0x39, 0xf7, 0x25, 0x8c, 0x8a, 0x26, 0x5e, 0x96, 0xf1, 0xa1, 0x52, 0x54, 0x40, 0x6c, + 0x1d, 0x1a, 0x79, 0x9c, 0x7b, 0x21, 0xa9, 0xda, 0x70, 0x05, 0xc0, 0x06, 0x00, 0xd9, 0xc4, 0xf7, + 0x79, 0x96, 0x9d, 0x4d, 0x42, 0x52, 0xb5, 0xe1, 0x6a, 0x18, 0x94, 0x76, 0xe6, 0x05, 0x21, 0x1f, + 0x92, 0x99, 0x1a, 0xae, 0x84, 0x58, 0x1f, 0x5a, 0x57, 0x5e, 0x1a, 0x05, 0xd1, 0xa8, 0xdf, 0x20, + 0x82, 0x02, 0xf1, 0xc4, 0x90, 0xe7, 0x5e, 0x10, 0xf6, 0x9b, 0x9b, 0xc6, 0x56, 0xcf, 0x95, 0x90, + 0xf3, 0x4f, 0x03, 0x60, 0x7f, 0x32, 0x4e, 0xa4, 0x9a, 0x9b, 0xd0, 0x25, 0x0d, 0x4e, 0xbc, 0xd3, + 0x90, 0x67, 0xa4, 0xab, 0xe5, 0xea, 0x28, 0xb6, 0x05, 0x2b, 0x7e, 0x3c, 0x4e, 0x42, 0x9e, 0xf3, + 0xa1, 0xe4, 0x42, 0xd5, 0x0d, 0x77, 0x1a, 0xcd, 0xde, 0x80, 0xa5, 0xb3, 0x20, 0x0a, 0xb2, 0x73, + 0x3e, 0xbc, 0x7f, 0x9d, 0x73, 0x61, 0x72, 0xc3, 0xad, 0x22, 0x99, 0x03, 0x3d, 0x85, 0x70, 0xe3, + 0xab, 0x8c, 0x5e, 0xc8, 0x70, 0x2b, 0x38, 0xf6, 0x36, 0xac, 0xf2, 0x2c, 0x0f, 0xc6, 0x5e, 0xce, + 0x4f, 0x50, 0x15, 0x62, 0x6c, 0x10, 0xe3, 0x2c, 0x01, 0x7d, 0x7f, 0x9a, 0x64, 0xf4, 0x9e, 0x96, + 0x8b, 0x8f, 0x6c, 0x03, 0xda, 0x49, 0x1a, 0x8f, 0x52, 0x9e, 0x65, 0xfd, 0x16, 0x85, 0x44, 0x01, + 0x3b, 0x5f, 0x18, 0x00, 0x87, 0xb1, 0x37, 0x94, 0x06, 0x98, 0x51, 0x5a, 0x98, 0x60, 0x4a, 0xe9, + 0x01, 0x00, 0xd9, 0x44, 0xb0, 0x98, 0xc4, 0xa2, 0x61, 0x2a, 0x17, 0x5a, 0xd5, 0x0b, 0xf1, 0xec, + 0x98, 0xe7, 0xde, 0xfd, 0x20, 0x0a, 0xe3, 0x91, 0x0c, 0x73, 0x0d, 0xc3, 0xde, 0x84, 0xe5, 0x12, + 0x3a, 0x38, 0x79, 0xb4, 0x4f, 0x6f, 0xda, 0x71, 0xa7, 0xb0, 0xb3, 0xaf, 0xe9, 0xfc, 0xcc, 0x80, + 0xa5, 0xe3, 0x73, 0x2f, 0x1d, 0x06, 0xd1, 0xe8, 0x20, 0x8d, 0x27, 0x09, 0x7a, 0x3d, 0xf7, 0xd2, + 0x11, 0xcf, 0x65, 0xfa, 0x4a, 0x08, 0x93, 0x7a, 0x7f, 0xff, 0x10, 0x35, 0xb7, 0x30, 0xa9, 0xf1, + 0x59, 0xbc, 0x79, 0x9a, 0xe5, 0x87, 0xb1, 0xef, 0xe5, 0x41, 0x1c, 0x49, 0xc5, 0xab, 0x48, 0x4a, + 0xdc, 0xeb, 0xc8, 0xa7, 0xc8, 0xb3, 0x28, 0x71, 0x09, 0xc2, 0x37, 0x9e, 0x44, 0x92, 0xd2, 0x20, + 0x4a, 0x01, 0x3b, 0x7f, 0x6c, 0x00, 0x1c, 0x5f, 0x47, 0xfe, 0x54, 0x8c, 0x3d, 0xb8, 0xe4, 0x51, + 0x5e, 0x8d, 0x31, 0x81, 0x42, 0x61, 0x22, 0xe4, 0x12, 0x65, 0xdc, 0x02, 0x66, 0x77, 0xa0, 0x93, + 0x72, 0x9f, 0x47, 0x39, 0x12, 0x2d, 0x22, 0x96, 0x08, 0x8c, 0xa6, 0xb1, 0x97, 0xe5, 0x3c, 0xad, + 0x98, 0xb7, 0x82, 0x63, 0xdb, 0x60, 0xeb, 0xf0, 0x41, 0x1e, 0x0c, 0xa5, 0x89, 0x67, 0xf0, 0x28, + 0x8f, 0x5e, 0x42, 0xc9, 0x6b, 0x0a, 0x79, 0x3a, 0x0e, 0xe5, 0xe9, 0x30, 0xc9, 0x13, 0x51, 0x36, + 0x83, 0x47, 0x79, 0xa7, 0x61, 0xec, 0x5f, 0x04, 0xd1, 0x88, 0x1c, 0xd0, 0x26, 0x53, 0x55, 0x70, + 0xec, 0x5b, 0x60, 0x4f, 0xa2, 0x94, 0x67, 0x71, 0x78, 0xc9, 0x87, 0xe4, 0xc7, 0xac, 0xdf, 0xd1, + 0xca, 0x8e, 0xee, 0x61, 0x77, 0x86, 0x55, 0xf3, 0x10, 0x88, 0x4a, 0x23, 0x3d, 0x34, 0x00, 0x38, + 0x25, 0x45, 0x4e, 0xae, 0x13, 0xde, 0xef, 0x8a, 0xb8, 0x2b, 0x31, 0xec, 0x1d, 0x58, 0xcb, 0xb8, + 0x1f, 0x47, 0xc3, 0xec, 0x3e, 0x3f, 0x0f, 0xa2, 0xe1, 0x63, 0xb2, 0x45, 0xbf, 0x47, 0x26, 0x9e, + 0x47, 0xc2, 0x88, 0x21, 0xc5, 0xf7, 0xf7, 0x0f, 0x8f, 0xae, 0x22, 0x9e, 0xf6, 0x97, 0x44, 0xc4, + 0x54, 0x90, 0xe8, 0x6e, 0x3f, 0x8e, 0xce, 0xc2, 0xc0, 0xcf, 0x1f, 0x67, 0xa3, 0xfe, 0x32, 0xf1, + 0xe8, 0x28, 0x74, 0x69, 0x5e, 0xa4, 0xf5, 0x8a, 0x70, 0x69, 0x81, 0x28, 0x82, 0xc1, 0x4d, 0xb2, + 0xbe, 0xad, 0x05, 0x83, 0xab, 0x07, 0x03, 0x12, 0x57, 0xf5, 0x60, 0x70, 0x45, 0x30, 0x04, 0xf1, + 0x49, 0x99, 0xa7, 0x6c, 0xd3, 0xd8, 0xaa, 0xbb, 0x15, 0x1c, 0x3a, 0x6f, 0x38, 0x19, 0x27, 0x8f, + 0x8e, 0x34, 0xbe, 0x35, 0xe2, 0x9b, 0xc1, 0x3b, 0xbf, 0x32, 0xa0, 0xa7, 0xf7, 0x0a, 0xad, 0x8b, + 0x19, 0x0b, 0xba, 0x98, 0xa9, 0x77, 0x31, 0xf6, 0x56, 0xd1, 0xad, 0x44, 0xf7, 0x21, 0x7f, 0x3e, + 0x49, 0x63, 0x2c, 0xeb, 0x2e, 0x11, 0x8a, 0x06, 0xf6, 0x2e, 0x74, 0x53, 0x1e, 0x7a, 0xd7, 0x45, + 0xdb, 0x41, 0xfe, 0x15, 0xe4, 0x77, 0x4b, 0xb4, 0xab, 0xf3, 0x38, 0x7f, 0x36, 0xa1, 0xab, 0x11, + 0x67, 0x72, 0xc1, 0xf8, 0x86, 0xb9, 0x60, 0x2e, 0xc8, 0x85, 0x4d, 0xa5, 0xd2, 0xe4, 0x74, 0x3f, + 0x48, 0x65, 0x79, 0xd0, 0x51, 0x05, 0x47, 0x25, 0xf9, 0x74, 0x14, 0x76, 0x0f, 0x0d, 0xd4, 0x52, + 0x6f, 0x1a, 0xcd, 0x76, 0x80, 0x11, 0x6a, 0xcf, 0xcb, 0xfd, 0xf3, 0xcf, 0x13, 0x19, 0x8d, 0x4d, + 0x0a, 0xe9, 0x39, 0x14, 0xf6, 0x1a, 0x34, 0xb2, 0xdc, 0x1b, 0x71, 0x4a, 0xbd, 0xe5, 0xdd, 0x0e, + 0xa5, 0x0a, 0x22, 0x5c, 0x81, 0xd7, 0x8c, 0xdf, 0x7e, 0x81, 0xf1, 0x9d, 0xdf, 0x5b, 0xb0, 0x54, + 0xe9, 0xee, 0xf3, 0xa6, 0xa0, 0xf2, 0x46, 0x73, 0xc1, 0x8d, 0x9b, 0x50, 0x9f, 0x44, 0x81, 0x70, + 0xf6, 0xf2, 0x6e, 0x0f, 0xe9, 0x9f, 0x47, 0x41, 0x8e, 0xd9, 0xe6, 0x12, 0x45, 0xd3, 0xa9, 0xfe, + 0xa2, 0x80, 0x78, 0x07, 0xd6, 0xca, 0x54, 0xdf, 0xdf, 0x3f, 0x3c, 0x8c, 0xfd, 0x8b, 0xa2, 0x37, + 0xcc, 0x23, 0x31, 0x26, 0x66, 0x20, 0x2a, 0x59, 0x0f, 0x6b, 0x62, 0x0a, 0xfa, 0x6f, 0x68, 0xf8, + 0x38, 0x95, 0x90, 0x95, 0x64, 0x40, 0x69, 0x63, 0xca, 0xc3, 0x9a, 0x2b, 0xe8, 0xec, 0x0d, 0xa8, + 0x63, 0xfc, 0x4b, 0x5b, 0x2d, 0x23, 0x5f, 0x39, 0x26, 0x3c, 0xac, 0xb9, 0x44, 0x45, 0xae, 0x30, + 0xf6, 0x86, 0xfd, 0x4e, 0xc9, 0x55, 0xf6, 0x52, 0xe4, 0x42, 0x2a, 0x72, 0x61, 0x0d, 0xa2, 0x7a, + 0x24, 0xb9, 0xca, 0x76, 0x80, 0x5c, 0x48, 0x65, 0xef, 0x01, 0x5c, 0x7a, 0x61, 0x30, 0x14, 0xcd, + 0xa7, 0x4b, 0xbc, 0xeb, 0xc8, 0xfb, 0xac, 0xc0, 0xca, 0xa8, 0xd7, 0xf8, 0xee, 0xb7, 0xa1, 0x99, + 0x89, 0xf0, 0xff, 0x36, 0xac, 0x56, 0x7c, 0x76, 0x18, 0x64, 0x64, 0x60, 0x41, 0xee, 0x1b, 0x8b, + 0x06, 0x37, 0x75, 0x7e, 0x00, 0x40, 0x96, 0x78, 0x90, 0xa6, 0x71, 0xaa, 0x06, 0x48, 0xa3, 0x18, + 0x20, 0x9d, 0xbb, 0xd0, 0x41, 0x0b, 0xdc, 0x40, 0xc6, 0x57, 0x5f, 0x44, 0x4e, 0xa0, 0x47, 0xef, + 0xfc, 0xf4, 0x70, 0x01, 0x07, 0xdb, 0x85, 0x75, 0x31, 0xc5, 0x89, 0x24, 0x78, 0x12, 0x67, 0x01, + 0x59, 0x42, 0xa4, 0xe3, 0x5c, 0x1a, 0xd6, 0x46, 0x8e, 0xe2, 0x8e, 0x9f, 0x1e, 0xaa, 0x39, 0x43, + 0xc1, 0xce, 0xff, 0x41, 0x07, 0x6f, 0x14, 0xd7, 0x6d, 0x41, 0x93, 0x08, 0xca, 0x0e, 0x76, 0xe1, + 0x04, 0xa9, 0x90, 0x2b, 0xe9, 0xce, 0x4f, 0x0c, 0xe8, 0x8a, 0x22, 0x27, 0x4e, 0xbe, 0x6c, 0x8d, + 0xdb, 0xac, 0x1c, 0x57, 0x55, 0x42, 0x97, 0xb8, 0x03, 0x40, 0x65, 0x4a, 0x30, 0xd4, 0xcb, 0xa0, + 0x28, 0xb1, 0xae, 0xc6, 0x81, 0x8e, 0x29, 0xa1, 0x39, 0xa6, 0xfd, 0x85, 0x09, 0x3d, 0xe9, 0x52, + 0xc1, 0xf2, 0x1f, 0x4a, 0x56, 0x99, 0x4f, 0x75, 0x3d, 0x9f, 0xde, 0x54, 0xf9, 0xd4, 0x28, 0x5f, + 0xa3, 0x8c, 0xa2, 0x32, 0x9d, 0xee, 0xc9, 0x74, 0x6a, 0x12, 0xdb, 0x92, 0x4a, 0x27, 0xc5, 0x25, + 0xb2, 0xe9, 0x9e, 0xcc, 0xa6, 0x56, 0xc9, 0x54, 0x84, 0x54, 0x91, 0x4c, 0xf7, 0x64, 0x32, 0xb5, + 0x4b, 0xa6, 0xc2, 0xcd, 0x2a, 0x97, 0xee, 0xb7, 0xa0, 0x41, 0xee, 0x74, 0x3e, 0x00, 0x5b, 0x37, + 0x0d, 0xe5, 0xc4, 0x9b, 0x92, 0x58, 0x09, 0x05, 0x8d, 0xc9, 0x95, 0x67, 0x9f, 0xc3, 0x52, 0xa5, + 0x14, 0xe1, 0x04, 0x11, 0x64, 0x7b, 0x5e, 0xe4, 0xf3, 0xb0, 0xd8, 0x63, 0x34, 0x8c, 0x16, 0x64, + 0x66, 0x29, 0x59, 0x8a, 0xa8, 0x04, 0x99, 0xb6, 0x8d, 0x58, 0x95, 0x6d, 0xe4, 0x2f, 0x06, 0xf4, + 0xf4, 0x03, 0xb8, 0xd0, 0x3c, 0x48, 0xd3, 0xbd, 0x78, 0x28, 0xbc, 0xd9, 0x70, 0x15, 0x88, 0xa1, + 0x8f, 0x8f, 0xa1, 0x97, 0x65, 0x32, 0x02, 0x0b, 0x58, 0xd2, 0x8e, 0xfd, 0x38, 0x51, 0xfb, 0x65, + 0x01, 0x4b, 0xda, 0x21, 0xbf, 0xe4, 0xa1, 0x6c, 0x50, 0x05, 0x8c, 0xb7, 0x3d, 0xe6, 0x59, 0x86, + 0x61, 0x22, 0xea, 0xaa, 0x02, 0xf1, 0x94, 0xeb, 0x5d, 0xed, 0x79, 0x93, 0x8c, 0xcb, 0x19, 0xb0, + 0x80, 0xd1, 0x2c, 0xb8, 0x07, 0x7b, 0x69, 0x3c, 0x89, 0xd4, 0xe4, 0xa7, 0x61, 0x9c, 0x2b, 0x58, + 0x7d, 0x32, 0x49, 0x47, 0x9c, 0x82, 0x58, 0xad, 0xd5, 0x1b, 0xd0, 0x0e, 0x22, 0xcf, 0xcf, 0x83, + 0x4b, 0x2e, 0x2d, 0x59, 0xc0, 0x18, 0xbf, 0x79, 0x30, 0xe6, 0x72, 0xf4, 0xa5, 0x67, 0xe4, 0x3f, + 0x0b, 0x42, 0x4e, 0x71, 0x2d, 0x5f, 0x49, 0xc1, 0x94, 0xa2, 0xa2, 0x27, 0xcb, 0xa5, 0x59, 0x40, + 0xce, 0x2f, 0x4d, 0xd8, 0x38, 0x4a, 0x78, 0xea, 0xe5, 0x5c, 0x2c, 0xea, 0xc7, 0xfe, 0x39, 0x1f, + 0x7b, 0x4a, 0x85, 0x3b, 0x60, 0xc6, 0x09, 0x5d, 0x2e, 0xe3, 0x5d, 0x90, 0x8f, 0x12, 0xd7, 0x8c, + 0x13, 0x52, 0xc2, 0xcb, 0x2e, 0xa4, 0x6d, 0xe9, 0x79, 0xe1, 0xd6, 0xbe, 0x01, 0xed, 0xa1, 0x97, + 0x7b, 0xa7, 0x5e, 0xc6, 0x95, 0x4d, 0x15, 0x4c, 0x0b, 0x2e, 0xee, 0x83, 0xd2, 0xa2, 0x02, 0x20, + 0x49, 0x74, 0x9b, 0xb4, 0xa6, 0x84, 0x90, 0xfb, 0x2c, 0x9c, 0x64, 0xe7, 0x64, 0xc6, 0xb6, 0x2b, + 0x00, 0xd4, 0xa5, 0x88, 0xf9, 0xb6, 0x6c, 0x17, 0x03, 0x80, 0xb3, 0x34, 0x1e, 0x8b, 0xc2, 0x42, + 0x0d, 0xa8, 0xed, 0x6a, 0x18, 0x45, 0x3f, 0x11, 0xeb, 0x0f, 0x94, 0x74, 0x81, 0x71, 0x72, 0x58, + 0x7a, 0xf6, 0xae, 0x0c, 0xfb, 0xc7, 0x3c, 0xf7, 0xd8, 0x86, 0x66, 0x0e, 0x40, 0x73, 0x20, 0x45, + 0x1a, 0xe3, 0x85, 0xd5, 0x43, 0x95, 0x1c, 0x4b, 0x2b, 0x39, 0xca, 0x82, 0x75, 0x0a, 0x71, 0x7a, + 0x76, 0xde, 0x83, 0x75, 0xe9, 0x91, 0x67, 0xef, 0xe2, 0xad, 0x0b, 0x7d, 0x21, 0xc8, 0xe2, 0x7a, + 0xe7, 0x4f, 0x06, 0xdc, 0x9a, 0x3a, 0xf6, 0xd2, 0xdf, 0x3f, 0xde, 0x87, 0x3a, 0x2e, 0x90, 0x7d, + 0x8b, 0x52, 0xf3, 0x1e, 0xde, 0x31, 0x57, 0xe4, 0x0e, 0x02, 0x0f, 0xa2, 0x3c, 0xbd, 0x76, 0xe9, + 0xc0, 0xc6, 0xa7, 0xd0, 0x29, 0x50, 0x28, 0xf7, 0x82, 0x5f, 0xab, 0xea, 0x7b, 0xc1, 0xaf, 0x71, + 0xa2, 0xb8, 0xf4, 0xc2, 0x89, 0x30, 0x8d, 0x6c, 0xb0, 0x15, 0xc3, 0xba, 0x82, 0xfe, 0x81, 0xf9, + 0xff, 0x86, 0xf3, 0x43, 0xe8, 0x3f, 0xf4, 0xa2, 0x61, 0x28, 0xe3, 0x51, 0x14, 0x05, 0x69, 0x82, + 0x57, 0x35, 0x13, 0x74, 0x51, 0x0a, 0x51, 0x6f, 0x88, 0xc6, 0x3b, 0xd0, 0x39, 0x55, 0xed, 0x50, + 0x1a, 0xbe, 0x44, 0x50, 0xcc, 0x3c, 0x0f, 0x33, 0xb9, 0xa6, 0xd2, 0xb3, 0x73, 0x0b, 0xd6, 0x0e, + 0x78, 0x2e, 0xee, 0xde, 0x3b, 0x1b, 0xc9, 0x9b, 0x9d, 0x2d, 0x58, 0xaf, 0xa2, 0xa5, 0x71, 0x6d, + 0xb0, 0xfc, 0xb3, 0xa2, 0xd5, 0xf8, 0x67, 0x23, 0xe7, 0x18, 0xee, 0x8a, 0x69, 0x69, 0x72, 0x8a, + 0x2a, 0x60, 0xe9, 0xfb, 0x3c, 0x19, 0x7a, 0x39, 0x57, 0x2f, 0xb1, 0x0b, 0xeb, 0x99, 0xa0, 0xed, + 0x9d, 0x8d, 0x4e, 0xe2, 0x71, 0x78, 0x9c, 0xa7, 0x41, 0xa4, 0x64, 0xcc, 0xa5, 0x39, 0x87, 0x30, + 0x58, 0x24, 0x54, 0x2a, 0xd2, 0x87, 0x96, 0xfc, 0xf8, 0x23, 0xdd, 0xac, 0xc0, 0x59, 0x3f, 0x3b, + 0x23, 0xd8, 0x38, 0xe0, 0xf9, 0xcc, 0xcc, 0x54, 0x96, 0x1d, 0xbc, 0xe3, 0xb3, 0xb2, 0x3d, 0x16, + 0x30, 0xfb, 0x1f, 0xe8, 0x9d, 0x05, 0x61, 0xce, 0x53, 0xb9, 0x73, 0xcc, 0xc4, 0x7a, 0x85, 0xec, + 0xfc, 0xcd, 0x02, 0x7b, 0xfa, 0x9a, 0xc2, 0x4f, 0xc6, 0xdc, 0xaa, 0x61, 0x56, 0xaa, 0x06, 0x83, + 0xfa, 0x18, 0x0b, 0xbb, 0xcc, 0x19, 0x7c, 0x2e, 0x13, 0xad, 0xbe, 0x20, 0xd1, 0xb6, 0x60, 0x45, + 0x4e, 0x7f, 0xb1, 0xda, 0x6b, 0xe4, 0x02, 0x31, 0x85, 0xc6, 0x81, 0x79, 0x0a, 0x45, 0xeb, 0x86, + 0xa8, 0x37, 0xf3, 0x48, 0xda, 0x34, 0xde, 0xfa, 0x06, 0xd3, 0x78, 0x22, 0x08, 0xe2, 0x13, 0x95, + 0x34, 0x59, 0x5b, 0x08, 0x9f, 0x43, 0x62, 0x6f, 0xc3, 0x6a, 0xc2, 0x23, 0x5c, 0xdc, 0x35, 0xfe, + 0x0e, 0xf1, 0xcf, 0x12, 0xf0, 0x35, 0xa9, 0x55, 0x6a, 0xbc, 0x20, 0x5e, 0x73, 0x0a, 0x8d, 0x1b, + 0x9c, 0x3f, 0xc9, 0xe3, 0x4b, 0xb5, 0xaa, 0x61, 0x32, 0x88, 0xe5, 0x7e, 0x06, 0x8f, 0x3a, 0x54, + 0x70, 0x64, 0x90, 0x9e, 0xd0, 0x61, 0x86, 0xe0, 0xfc, 0xc6, 0x80, 0x5b, 0xa5, 0x83, 0xe9, 0xa3, + 0xde, 0x0b, 0xf6, 0xde, 0x0d, 0x68, 0x67, 0xa9, 0x4f, 0x9c, 0xaa, 0x27, 0x2b, 0x98, 0x7a, 0x44, + 0x96, 0x0b, 0x9a, 0x6c, 0x60, 0x0a, 0x7e, 0xb1, 0xd7, 0xfb, 0xd0, 0x1a, 0x57, 0x1b, 0xb3, 0x04, + 0x9d, 0x3f, 0x18, 0xf0, 0xea, 0xdc, 0x78, 0xff, 0x37, 0x3e, 0x10, 0x43, 0x11, 0x14, 0x99, 0x2c, + 0x93, 0x37, 0xef, 0x1f, 0x38, 0xc9, 0x7c, 0x08, 0x4b, 0x79, 0x69, 0x19, 0xae, 0x3e, 0x10, 0xbf, + 0x52, 0x3d, 0xa8, 0x19, 0xcf, 0xad, 0xf2, 0x3b, 0x17, 0xf0, 0x4a, 0x45, 0xff, 0x4a, 0x4d, 0xdc, + 0xa5, 0xf9, 0x1e, 0x79, 0xb9, 0xac, 0x8c, 0xb7, 0x35, 0xc1, 0x62, 0x9e, 0x26, 0xaa, 0x5b, 0xf0, + 0x55, 0x52, 0xdc, 0xac, 0xa6, 0xb8, 0xf3, 0x6b, 0x13, 0x56, 0xa6, 0xae, 0x62, 0xcb, 0x60, 0x06, + 0x43, 0xe9, 0x48, 0x33, 0x18, 0x2e, 0x4c, 0x57, 0xdd, 0xb9, 0xd6, 0x94, 0x73, 0xb1, 0x40, 0xa5, + 0xfe, 0xbe, 0x97, 0x7b, 0xb2, 0xff, 0x2b, 0xb0, 0xe2, 0xf6, 0xc6, 0x94, 0xdb, 0xfb, 0xd0, 0x1a, + 0x66, 0x39, 0x9d, 0x12, 0x59, 0xa9, 0x40, 0x2c, 0xed, 0x14, 0xe7, 0xf4, 0xa9, 0x4a, 0x4c, 0x54, + 0x25, 0x82, 0xed, 0x14, 0x4b, 0x5d, 0xfb, 0x46, 0x9b, 0x48, 0xae, 0x62, 0x9e, 0xea, 0xc8, 0xa2, + 0x84, 0xf3, 0x94, 0x16, 0x51, 0x50, 0x8d, 0xa8, 0xe7, 0x53, 0x05, 0x54, 0x3a, 0xe4, 0xa5, 0xe3, + 0xe9, 0x2d, 0x35, 0x66, 0x8b, 0x50, 0x5a, 0xab, 0x46, 0x44, 0x65, 0xd2, 0xfe, 0xb9, 0x01, 0x77, + 0x55, 0x33, 0x9e, 0x1f, 0x08, 0xf7, 0xb4, 0xe6, 0x38, 0x2b, 0x49, 0x36, 0x49, 0x9a, 0xcf, 0x3f, + 0x0e, 0x43, 0xb1, 0x58, 0x99, 0x6a, 0x3e, 0x57, 0x98, 0x4a, 0x64, 0x58, 0x53, 0xc5, 0x7f, 0x9d, + 0xb4, 0x7d, 0x24, 0x7e, 0x50, 0xa8, 0xbb, 0x02, 0x70, 0x3e, 0x85, 0xc1, 0x22, 0xbd, 0x5e, 0xd6, + 0x1e, 0xce, 0x35, 0xdc, 0x15, 0x6d, 0xad, 0x14, 0xa5, 0x7e, 0x3e, 0x7a, 0x71, 0x6f, 0xaa, 0xf4, + 0x7a, 0x73, 0xba, 0xd7, 0x17, 0x9f, 0x36, 0xe9, 0x73, 0xb9, 0xa5, 0x7f, 0xda, 0x44, 0xcc, 0xf6, + 0x05, 0x34, 0xc5, 0x30, 0xc7, 0x96, 0xa0, 0xf3, 0x28, 0xa2, 0xf4, 0x3d, 0x4a, 0xec, 0x1a, 0x6b, + 0x43, 0xfd, 0x38, 0x8f, 0x13, 0xdb, 0x60, 0x1d, 0x68, 0x3c, 0xc1, 0x69, 0xde, 0x36, 0x19, 0x40, + 0x13, 0xab, 0xfd, 0x98, 0xdb, 0x16, 0xa2, 0x8f, 0x73, 0x2f, 0xcd, 0xed, 0x3a, 0xa2, 0x85, 0xfe, + 0x76, 0x83, 0x2d, 0x03, 0x7c, 0x3c, 0xc9, 0x63, 0xc9, 0xd6, 0x44, 0xda, 0x3e, 0x0f, 0x79, 0xce, + 0xed, 0xd6, 0xf6, 0x8f, 0xe8, 0xc8, 0x08, 0xc7, 0x87, 0x9e, 0xbc, 0x8b, 0x60, 0xbb, 0xc6, 0x5a, + 0x60, 0x7d, 0xc6, 0xaf, 0x6c, 0x83, 0x75, 0xa1, 0xe5, 0x4e, 0xa2, 0x28, 0x88, 0x46, 0xe2, 0x3e, + 0xba, 0x7a, 0x68, 0x5b, 0x48, 0x40, 0x85, 0x12, 0x3e, 0xb4, 0xeb, 0xac, 0x07, 0xed, 0x4f, 0xe4, + 0xcf, 0x0e, 0x76, 0x03, 0x49, 0xc8, 0x86, 0x67, 0x9a, 0x48, 0xa2, 0xcb, 0x11, 0x6a, 0x21, 0x44, + 0xa7, 0x10, 0x6a, 0x6f, 0x1f, 0x41, 0x5b, 0x6d, 0xae, 0x6c, 0x05, 0xba, 0x52, 0x07, 0x44, 0xd9, + 0x35, 0x7c, 0x21, 0x1a, 0x36, 0x6c, 0x03, 0x5f, 0x1e, 0x77, 0x50, 0xdb, 0xc4, 0x27, 0x5c, 0x34, + 0x6d, 0x8b, 0x0c, 0x72, 0x1d, 0xf9, 0x76, 0x1d, 0x19, 0x69, 0x61, 0xb1, 0x87, 0xdb, 0x8f, 0xa1, + 0x45, 0x8f, 0x47, 0x38, 0x87, 0x2d, 0x4b, 0x79, 0x12, 0x63, 0xd7, 0xd0, 0xa6, 0x78, 0xbb, 0xe0, + 0x36, 0xd0, 0x36, 0xf4, 0x3a, 0x02, 0x36, 0x51, 0x05, 0x61, 0x27, 0x81, 0xb0, 0xb6, 0x7f, 0x6c, + 0x40, 0x5b, 0xad, 0x1a, 0x6c, 0x0d, 0x56, 0x94, 0x91, 0x24, 0x4a, 0x48, 0x3c, 0xe0, 0xb9, 0x40, + 0xd8, 0x06, 0x5d, 0x50, 0x80, 0x26, 0xda, 0xd5, 0xe5, 0xe3, 0xf8, 0x92, 0x4b, 0x8c, 0x85, 0x57, + 0xe2, 0x66, 0x2b, 0xe1, 0x3a, 0x1e, 0x40, 0x98, 0xaa, 0x8c, 0xdd, 0x60, 0xb7, 0x81, 0x21, 0xf8, + 0x38, 0x18, 0x61, 0x24, 0x8b, 0xf9, 0x3f, 0xb3, 0x9b, 0xdb, 0x1f, 0x41, 0x5b, 0x8d, 0xd9, 0x9a, + 0x1e, 0x0a, 0x55, 0xe8, 0x21, 0x10, 0xb6, 0x51, 0x5e, 0x2c, 0x31, 0xe6, 0xf6, 0x33, 0x5a, 0x4f, + 0x71, 0x4a, 0xd5, 0x2c, 0x23, 0x31, 0x32, 0xbc, 0x2e, 0x82, 0x44, 0x3a, 0x9c, 0x27, 0xa1, 0xe7, + 0x17, 0x01, 0x76, 0xc9, 0xd3, 0xdc, 0xb6, 0xf0, 0xf9, 0x51, 0xf4, 0x03, 0xee, 0x63, 0x84, 0xa1, + 0x1b, 0x82, 0x2c, 0xb7, 0x1b, 0xdb, 0x87, 0xd0, 0x7d, 0xa6, 0x7a, 0xcc, 0x51, 0x82, 0x2f, 0xa0, + 0x94, 0x2b, 0xb1, 0x76, 0x0d, 0xef, 0xa4, 0xe8, 0x2c, 0xb0, 0xb6, 0xc1, 0x56, 0x61, 0x09, 0xbd, + 0x51, 0xa2, 0xcc, 0xed, 0xa7, 0xc0, 0x66, 0xab, 0x23, 0x1a, 0xad, 0x54, 0xd8, 0xae, 0xa1, 0x26, + 0x9f, 0xf1, 0x2b, 0x7c, 0x26, 0x1f, 0x3e, 0x1a, 0x45, 0x71, 0xca, 0x89, 0xa6, 0x7c, 0x48, 0xdf, + 0x17, 0x11, 0x61, 0x6d, 0x3f, 0x9b, 0xea, 0x23, 0x47, 0x89, 0x16, 0xee, 0x04, 0xdb, 0x35, 0x0a, + 0x3e, 0x92, 0x22, 0x10, 0xd2, 0x80, 0x24, 0x46, 0x60, 0x4c, 0xbc, 0x68, 0x2f, 0xe4, 0x5e, 0x2a, + 0x60, 0x6b, 0xf7, 0x1f, 0x4d, 0x68, 0x8a, 0xaa, 0xc0, 0x3e, 0x82, 0xae, 0xf6, 0x8b, 0x2f, 0xa3, + 0x22, 0x3f, 0xfb, 0xfb, 0xf4, 0xc6, 0x7f, 0xcd, 0xe0, 0x45, 0x65, 0x72, 0x6a, 0xec, 0x43, 0x80, + 0x72, 0xf1, 0x66, 0xb7, 0x68, 0x9a, 0x9b, 0x5e, 0xc4, 0x37, 0xfa, 0xf4, 0xc9, 0x66, 0xce, 0xaf, + 0xd9, 0x4e, 0x8d, 0x7d, 0x07, 0x96, 0x64, 0xf9, 0x13, 0xa1, 0xc5, 0x06, 0xda, 0xda, 0x34, 0x67, + 0xa5, 0xbe, 0x51, 0xd8, 0x27, 0x85, 0x30, 0x11, 0x3e, 0xac, 0x3f, 0x67, 0x07, 0x13, 0x62, 0x5e, + 0x59, 0xb8, 0x9d, 0x39, 0x35, 0x76, 0x00, 0x5d, 0xb1, 0x43, 0x89, 0xa2, 0x7e, 0x07, 0x79, 0x17, + 0x2d, 0x55, 0x37, 0x2a, 0xb4, 0x07, 0x3d, 0x7d, 0xed, 0x61, 0x64, 0xc9, 0x39, 0xfb, 0x91, 0x10, + 0x32, 0x6f, 0x43, 0x72, 0x6a, 0xcc, 0x83, 0xdb, 0xf3, 0x97, 0x17, 0xf6, 0x7a, 0xf9, 0x6d, 0x79, + 0xc1, 0xb6, 0xb4, 0xe1, 0xdc, 0xc4, 0x52, 0x5c, 0xf1, 0x3d, 0xe8, 0x17, 0x97, 0x17, 0x61, 0x2d, + 0xa3, 0x62, 0x20, 0x55, 0x5b, 0xb0, 0xef, 0x6c, 0xbc, 0xb6, 0x90, 0x5e, 0x88, 0x3f, 0x81, 0xd5, + 0x92, 0x21, 0x16, 0xe6, 0x63, 0x77, 0x67, 0xce, 0x55, 0xcc, 0x3a, 0x58, 0x44, 0x2e, 0xa4, 0x7e, + 0xbf, 0xdc, 0xd8, 0xab, 0x92, 0x5f, 0xd7, 0x7d, 0x3b, 0x5f, 0xba, 0x73, 0x13, 0x4b, 0x71, 0xc3, + 0x13, 0x58, 0xa9, 0xf4, 0x53, 0x25, 0xfb, 0xc6, 0x26, 0x7b, 0x53, 0x40, 0xdc, 0xef, 0x7f, 0xf1, + 0xd5, 0xc0, 0xf8, 0xf2, 0xab, 0x81, 0xf1, 0xf7, 0xaf, 0x06, 0xc6, 0x4f, 0xbf, 0x1e, 0xd4, 0xbe, + 0xfc, 0x7a, 0x50, 0xfb, 0xeb, 0xd7, 0x83, 0xda, 0x69, 0x93, 0xfe, 0x25, 0xf2, 0xbf, 0xff, 0x0a, + 0x00, 0x00, 0xff, 0xff, 0x1d, 0x07, 0x2d, 0x0f, 0x37, 0x22, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4692,6 +4711,20 @@ func (m *SyncStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.DumpIOTotalBytes != 0 { + i = encodeVarintDmworker(dAtA, i, uint64(m.DumpIOTotalBytes)) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x98 + } + if m.IoTotalBytes != 0 { + i = encodeVarintDmworker(dAtA, i, uint64(m.IoTotalBytes)) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x90 + } if m.RecentRps != 0 { i = encodeVarintDmworker(dAtA, i, uint64(m.RecentRps)) i-- @@ -7063,6 +7096,12 @@ func (m *SyncStatus) Size() (n int) { if m.RecentRps != 0 { n += 2 + sovDmworker(uint64(m.RecentRps)) } + if m.IoTotalBytes != 0 { + n += 2 + sovDmworker(uint64(m.IoTotalBytes)) + } + if m.DumpIOTotalBytes != 0 { + n += 2 + sovDmworker(uint64(m.DumpIOTotalBytes)) + } return n } @@ -9639,6 +9678,44 @@ func (m *SyncStatus) Unmarshal(dAtA []byte) error { break } } + case 18: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IoTotalBytes", wireType) + } + m.IoTotalBytes = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDmworker + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.IoTotalBytes |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 19: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DumpIOTotalBytes", wireType) + } + m.DumpIOTotalBytes = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDmworker + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DumpIOTotalBytes |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipDmworker(dAtA[iNdEx:]) diff --git a/dm/pkg/terror/error_list.go b/dm/pkg/terror/error_list.go index dfa040e989f..602a4b58313 100644 --- a/dm/pkg/terror/error_list.go +++ b/dm/pkg/terror/error_list.go @@ -935,7 +935,7 @@ var ( ErrConfigSyncerCfgConflict = New(codeConfigSyncerCfgConflict, ClassConfig, ScopeInternal, LevelMedium, "syncer-config-name and syncer should only specify one", "Please check the `syncer-config-name` and `syncer` config in task configuration file.") ErrConfigReadCfgFromFile = New(codeConfigReadCfgFromFile, ClassConfig, ScopeInternal, LevelMedium, "read config file %v", "") ErrConfigNeedUniqueTaskName = New(codeConfigNeedUniqueTaskName, ClassConfig, ScopeInternal, LevelMedium, "must specify a unique task name", "Please check the `name` config in task configuration file.") - ErrConfigInvalidTaskMode = New(codeConfigInvalidTaskMode, ClassConfig, ScopeInternal, LevelMedium, "please specify right task-mode, support `full`, `incremental`, `all`", "Please check the `task-mode` config in task configuration file.") + ErrConfigInvalidTaskMode = New(codeConfigInvalidTaskMode, ClassConfig, ScopeInternal, LevelMedium, "please specify right task-mode, support `full`, `incremental`, `all`, `dump`, `load`", "Please check the `task-mode` config in task configuration file.") ErrConfigNeedTargetDB = New(codeConfigNeedTargetDB, ClassConfig, ScopeInternal, LevelMedium, "must specify target-database", "Please check the `target-database` config in task configuration file.") ErrConfigMetadataNotSet = New(codeConfigMetadataNotSet, ClassConfig, ScopeInternal, LevelMedium, "mysql-instance(%s) must set meta for task-mode %s", "Please check the `meta` config in task configuration file.") ErrConfigRouteRuleNotFound = New(codeConfigRouteRuleNotFound, ClassConfig, ScopeInternal, LevelMedium, "mysql-instance(%d)'s route-rules %s not exist in routes", "Please check the `route-rules` config in task configuration file.") diff --git a/dm/proto/dmworker.proto b/dm/proto/dmworker.proto index bc067104cf3..4d92b336f96 100644 --- a/dm/proto/dmworker.proto +++ b/dm/proto/dmworker.proto @@ -166,6 +166,10 @@ message SyncStatus { int64 totalRows = 15; int64 totalRps = 16; int64 recentRps = 17; + // meter TCP io to downstream of the subtask + uint64 ioTotalBytes = 18; + // meter TCP io from upstream of the subtask + uint64 dumpIOTotalBytes = 19; } // SourceStatus represents status for source runing on dm-worker diff --git a/dm/syncer/status.go b/dm/syncer/status.go index 4544646f145..e2687ab7e42 100644 --- a/dm/syncer/status.go +++ b/dm/syncer/status.go @@ -39,6 +39,12 @@ func (s *Syncer) Status(sourceStatus *binlog.SourceStatus) interface{} { SyncerBinlog: syncerLocation.Position.String(), SecondsBehindMaster: s.secondsBehindMaster.Load(), } + if s.cfg.IOTotalBytes != nil { + st.IoTotalBytes = s.cfg.IOTotalBytes.Load() + } + if s.cfg.DumpIOTotalBytes != nil { + st.DumpIOTotalBytes = s.cfg.DumpIOTotalBytes.Load() + } if syncerLocation.GetGTID() != nil { st.SyncerBinlogGtid = syncerLocation.GetGTID().String() diff --git a/dm/syncer/syncer.go b/dm/syncer/syncer.go index 75491e0084c..ed08dbc1632 100644 --- a/dm/syncer/syncer.go +++ b/dm/syncer/syncer.go @@ -3376,6 +3376,12 @@ func (s *Syncer) CheckCanUpdateCfg(newCfg *config.SubTaskConfig) error { oldCfg.EnableGTID = newCfg.EnableGTID oldCfg.CaseSensitive = newCfg.CaseSensitive + // Skip comparing atomic values since they cannot be marshaled/unmarshaled + // by the TOML encoder/decoder. These fields will remain uninitialized (zero value) + // after decoding. + newCfg.IOTotalBytes = oldCfg.IOTotalBytes + newCfg.DumpIOTotalBytes = oldCfg.DumpIOTotalBytes + if oldCfg.String() != newCfg.String() { s.tctx.L().Warn("can not update cfg", zap.Stringer("old cfg", oldCfg), zap.Stringer("new cfg", newCfg)) return terror.ErrWorkerUpdateSubTaskConfig.Generatef("can't update subtask config for syncer because new config contains some fields that should not be changed, task: %s", s.cfg.Name) diff --git a/dm/tests/openapi/client/openapi_task_check b/dm/tests/openapi/client/openapi_task_check index 3fbf9a67249..8332a4c7cf1 100755 --- a/dm/tests/openapi/client/openapi_task_check +++ b/dm/tests/openapi/client/openapi_task_check @@ -4,6 +4,7 @@ import sys import requests SHARD_TASK_NAME = "test-shard" +LOAD_TASK_NAME = "test-load" ILLEGAL_CHAR_TASK_NAME = "t-Ë!s`t" SOURCE1_NAME = "mysql-01" SOURCE2_NAME = "mysql-02" @@ -105,10 +106,10 @@ def create_task_with_precheck(task_name, ignore_check, is_success, check_result) assert resp.status_code == 400 assert check_result in resp.json()["error_msg"] -def create_noshard_task_success(task_name, tartget_table_name=""): +def create_noshard_task_success(task_name, tartget_table_name="", task_mode="all"): task = { "name": task_name, - "task_mode": "all", + "task_mode": task_mode, "meta_schema": "dm-meta", "enhance_online_schema_change": True, "on_duplicate": "error", @@ -308,6 +309,45 @@ def create_dump_task_success(): print("create_dump_task_success resp=", resp.json()) assert resp.status_code == 201 +def create_load_task_success(): + task = { + "name": LOAD_TASK_NAME, + "task_mode": "load", + "meta_schema": "dm-meta", + "enhance_online_schema_change": True, + "on_duplicate": "error", + "target_config": { + "host": "127.0.0.1", + "port": 4000, + "user": "root", + "password": "", + }, + "table_migrate_rule": [ + { + "source": { + "source_name": SOURCE1_NAME, + "schema": "openapi", + "table": "*", + }, + "target": {"schema": "openapi", "table": "t"}, + } + ], + "source_config": { + "full_migrate_conf": { + "export_threads": 4, + "import_threads": 16, + "data_dir": "./exported_data", + "consistency": "auto", + }, + "source_conf": [ + {"source_name": SOURCE1_NAME} + ], + }, + } + resp = requests.post(url=API_ENDPOINT, json={"task": task}) + print("create_load_task_success resp=", resp.json()) + assert resp.status_code == 201 + def start_task_success(task_name, source_name): url = API_ENDPOINT + "/" + task_name + "/start" req = {} @@ -413,6 +453,73 @@ def get_task_status_success(task_name, total): print("get_task_status_success resp=", data) assert data["total"] == int(total) +def check_sync_task_status_success( + task_name, + min_dump_io_total_bytes=0, + max_dump_io_total_bytes=sys.maxsize, + min_io_total_bytes=0, + max_io_total_bytes=sys.maxsize +): + url = API_ENDPOINT + "/" + task_name + "/status" + resp = requests.get(url=url) + data = resp.json() + assert resp.status_code == 200 + print("check_sync_task_status_success resp=", data) + + for item in data.get("data", []): + # Only validate sync task status + assert item.get("unit") == "Sync" + sync_status = item.get("sync_status", {}) + dump_io_total_bytes = sync_status.get("dump_io_total_bytes") + io_total_bytes = sync_status.get("io_total_bytes") + assert dump_io_total_bytes is not None and io_total_bytes is not None + assert dump_io_total_bytes > int(min_dump_io_total_bytes) and io_total_bytes > int(min_io_total_bytes) + assert dump_io_total_bytes < int(max_dump_io_total_bytes) and io_total_bytes < int(max_io_total_bytes) + +def check_load_task_finished_status_success(task_name, finished_bytes, total_bytes): + url = API_ENDPOINT + "/" + task_name + "/status" + resp = requests.get(url=url) + data = resp.json() + assert resp.status_code == 200 + print("check_load_task_finished_status_success resp=", data) + + for item in data.get("data", []): + # Only validate load task status + assert item.get("unit") == "Load" + assert item.get("stage") == "Finished" + load_status = item.get("load_status", {}) + assert load_status.get("progress") == "100.00 %" + assert load_status.get("finished_bytes") == int(finished_bytes) + assert load_status.get("total_bytes") == int(total_bytes) + +def check_dump_task_finished_status_success(task_name, completed_tables, total_tables, estimate_total_rows,finished_rows,finished_bytes): + url = API_ENDPOINT + "/" + task_name + "/status" + resp = requests.get(url=url) + data = resp.json() + assert resp.status_code == 200 + print("check_dump_task_finished_status_success resp=", data) + + for item in data.get("data", []): + # Only validate dump task status + assert item.get("unit") == "Dump" + assert item.get("stage") == "Finished" + dump_status = item.get("dump_status", {}) + assert dump_status.get("progress") == "100.00 %" + assert dump_status.get("completed_tables") == int(completed_tables) + assert dump_status.get("total_tables") == int(total_tables) + assert dump_status.get("estimate_total_rows") == int(estimate_total_rows) + assert dump_status.get("finished_rows") == int(finished_rows) + assert dump_status.get("finished_bytes") == int(finished_bytes) + +def check_task_stage_success(task_name, total, stage): + url = API_ENDPOINT + "/" + task_name + "/status" + resp = requests.get(url=url) + data = resp.json() + assert resp.status_code == 200 + print("check_task_stage_success resp=", data) + assert data["total"] == int(total) + for status in data["data"]: + assert status["stage"] == stage def get_task_status_success_but_worker_meet_error(task_name, total): url = API_ENDPOINT + "/" + task_name + "/status" @@ -633,7 +740,7 @@ def check_noshard_task_dump_status_success(task_name, total): resp = requests.get(url=url) data = resp.json() assert resp.status_code == 200 - print("check_dump_status_success resp=", data) + print("check_noshard_task_dump_status_success resp=", data) assert data["data"][0]["dump_status"]["finished_bytes"] == int(total) @@ -743,6 +850,7 @@ if __name__ == "__main__": "create_noshard_task_success": create_noshard_task_success, "create_shard_task_success": create_shard_task_success, "create_dump_task_success": create_dump_task_success, + "create_load_task_success": create_load_task_success, "create_incremental_task_with_gtid_success": create_incremental_task_with_gtid_success, "delete_task_failed": delete_task_failed, "delete_task_success": delete_task_success, @@ -769,6 +877,10 @@ if __name__ == "__main__": "check_noshard_task_dump_status_success": check_noshard_task_dump_status_success, "do_complex_operations": do_complex_operations, "create_task_with_precheck": create_task_with_precheck, + "check_task_stage_success": check_task_stage_success, + "check_sync_task_status_success": check_sync_task_status_success, + "check_load_task_finished_status_success": check_load_task_finished_status_success, + "check_dump_task_finished_status_success": check_dump_task_finished_status_success, } func = FUNC_MAP[sys.argv[1]] diff --git a/dm/tests/openapi/run.sh b/dm/tests/openapi/run.sh index aceae7c16b2..62154be06e8 100644 --- a/dm/tests/openapi/run.sh +++ b/dm/tests/openapi/run.sh @@ -28,6 +28,9 @@ function init_dump_data() { run_sql_source1 "CREATE TABLE openapi.t1(i TINYINT, j INT UNIQUE KEY);" run_sql_source1 "INSERT INTO openapi.t1(i,j) VALUES (1, 2),(3,4);" + + run_sql_source1 "CREATE TABLE openapi.t2(i TINYINT, j INT UNIQUE KEY);" + run_sql_source1 "INSERT INTO openapi.t2(i,j) VALUES (1, 2),(3,4);" } function init_shard_data() { @@ -209,6 +212,7 @@ function test_dump_task() { run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ "query-status $task_name" \ "\"stage\": \"Stopped\"" 1 + openapi_task_check "check_task_stage_success" $task_name 1 "Stopped" init_dump_data @@ -222,12 +226,214 @@ function test_dump_task() { run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ "query-status $task_name" 100 \ "\"stage\": \"Finished\"" 1 + openapi_task_check "check_dump_task_finished_status_success" $task_name 2 2 4 4 228 clean_cluster_sources_and_tasks echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TEST OPENAPI: dump TASK" } +function test_load_task() { + echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>START TEST OPENAPI: dump & load TASK" + prepare_database + + task_name_dump="test-dump" + task_name_load="test-load" + + # create source successfully + openapi_source_check "create_source1_success" + # get source list success + openapi_source_check "list_source_success" 1 + + # create source successfully + openapi_source_check "create_source2_success" + # get source list success + openapi_source_check "list_source_success" 2 + + # get source status success + openapi_source_check "get_source_status_success" "mysql-01" + + # create task success: not valid task create request + openapi_task_check "create_task_failed" + + # create dump task success + openapi_task_check "create_dump_task_success" + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name_dump" \ + "\"stage\": \"Stopped\"" 1 + + init_dump_data + + # start dump task success + openapi_task_check "start_task_success" $task_name_dump "" + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name_dump" \ + "\"stage\": \"Running\"" 1 + + # wait dump task finish + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name_dump" 100 \ + "\"stage\": \"Finished\"" 1 + + # create load task success + openapi_task_check "create_load_task_success" + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name_load" \ + "\"stage\": \"Stopped\"" 1 + + # use the data from the same dir of dump task + + # start load task success + openapi_task_check "start_task_success" $task_name_load "" + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name_load" \ + "\"stage\": \"Running\"" 1 + + # wait load task finish + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name_load" 100 \ + "\"stage\": \"Finished\"" 1 + + clean_cluster_sources_and_tasks + echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TEST OPENAPI: dump & load TASK" + +} + +function test_load_task() { + echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>START TEST OPENAPI: dump & load TASK" + prepare_database + + task_name_dump="test-dump" + task_name_load="test-load" + + # create source successfully + openapi_source_check "create_source1_success" + # get source list success + openapi_source_check "list_source_success" 1 + + # create source successfully + openapi_source_check "create_source2_success" + # get source list success + openapi_source_check "list_source_success" 2 + + # get source status success + openapi_source_check "get_source_status_success" "mysql-01" + + # create task success: not valid task create request + openapi_task_check "create_task_failed" + + # create dump task success + openapi_task_check "create_dump_task_success" + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name_dump" \ + "\"stage\": \"Stopped\"" 1 + + init_dump_data + + # start dump task success + openapi_task_check "start_task_success" $task_name_dump "" + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name_dump" \ + "\"stage\": \"Running\"" 1 + + # wait dump task finish + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name_dump" 100 \ + "\"stage\": \"Finished\"" 1 + + # create load task success + openapi_task_check "create_load_task_success" + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name_load" \ + "\"stage\": \"Stopped\"" 1 + + # use the data from the same dir of dump task + + # start load task success + openapi_task_check "start_task_success" $task_name_load "" + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name_load" \ + "\"stage\": \"Running\"" 1 + + # wait load task finish + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name_load" 100 \ + "\"stage\": \"Finished\"" 1 + + clean_cluster_sources_and_tasks + echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TEST OPENAPI: dump & load TASK" + +} + +function test_full_mode_task() { + echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>START TEST OPENAPI: FULL MODE TASK" + prepare_database + + task_name="test-no-shard" + target_table_name="" + + # create source successfully + openapi_source_check "create_source1_success" + openapi_source_check "list_source_success" 1 + + # get source status success + openapi_source_check "get_source_status_success" "mysql-01" + + # create source successfully + openapi_source_check "create_source2_success" + # get source list success + openapi_source_check "list_source_success" 2 + + # get source status success + openapi_source_check "get_source_status_success" "mysql-02" + + # create no shard task in full mode success + openapi_task_check "create_noshard_task_success" $task_name "" "full" + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name" \ + "\"stage\": \"Stopped\"" 2 + openapi_task_check "check_task_stage_success" $task_name 2 "Stopped" + + init_noshard_data + + # start task success + openapi_task_check "start_task_success" $task_name "" + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name" \ + "\"stage\": \"Running\"" 2 + openapi_task_check "check_task_stage_success" $task_name 2 "Running" + + # get task status and load task status + openapi_task_check "get_task_status_success" "$task_name" 2 + + # wait full task finish + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name" 100 \ + "\"stage\": \"Finished\"" 2 + openapi_task_check "check_task_stage_success" $task_name 2 "Finished" + check_sync_diff $WORK_DIR $cur/conf/diff_config_no_shard.toml + + # check load task status + openapi_task_check "check_load_task_finished_status_success" "$task_name" 107 107 + + # delete source with force + openapi_source_check "delete_source_with_force_success" "mysql-01" + + # get task list + openapi_task_check "get_task_list" 1 + + # delete task success with force + openapi_task_check "delete_task_with_force_success" "$task_name" + + openapi_task_check "get_task_list" 0 + + # delete source success + openapi_source_check "delete_source_success" "mysql-02" + openapi_source_check "list_source_success" 0 + run_sql_tidb "DROP DATABASE if exists openapi;" + echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TEST OPENAPI: FULL MODE TASK" +} + function test_shard_task() { echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>START TEST OPENAPI: SHARD TASK" prepare_database @@ -281,8 +487,9 @@ function test_shard_task() { # get illegal char task_status failed openapi_task_check get_illegal_char_task_status_failed - # get task status success + # get task status and check sync task status success openapi_task_check "get_task_status_success" "$task_name" 2 + openapi_task_check "check_sync_task_status_success" "$task_name" 3000 7000 19000 30000 # get task list openapi_task_check "get_task_list" 1 @@ -342,8 +549,9 @@ function test_noshard_task() { # get task status failed openapi_task_check "get_task_status_failed" "not a task name" - # get task status success + # get task status and check sync task status success openapi_task_check "get_task_status_success" "$task_name" 2 + openapi_task_check "check_sync_task_status_success" "$task_name" 2500 4000 18000 42000 # delete source with force openapi_source_check "delete_source_with_force_success" "mysql-01" @@ -405,6 +613,7 @@ function test_complex_operations_of_source_and_task() { init_noshard_data check_sync_diff $WORK_DIR $cur/conf/diff_config_no_shard.toml openapi_task_check "get_task_status_success" "$task_name" 2 + openapi_task_check "check_sync_task_status_success" "$task_name" 2500 4000 18000 30000 # do some complex operations openapi_task_check "do_complex_operations" "$task_name" @@ -1093,6 +1302,7 @@ function run() { test_multi_tasks test_noshard_task test_dump_task + test_load_task test_task_templates test_noshard_task_dump_status test_complex_operations_of_source_and_task @@ -1101,6 +1311,7 @@ function run() { test_start_task_with_condition test_stop_task_with_condition test_reverse_https + test_full_mode_task # NOTE: this test case MUST running at last, because it will offline some members of cluster test_cluster diff --git a/dm/worker/subtask.go b/dm/worker/subtask.go index 8db5b050a63..e5c2e5980a0 100644 --- a/dm/worker/subtask.go +++ b/dm/worker/subtask.go @@ -69,6 +69,8 @@ func createRealUnits(cfg *config.SubTaskConfig, etcdClient *clientv3.Client, wor us = append(us, syncer.NewSyncer(cfg, etcdClient, relay)) case config.ModeDump: us = append(us, dumpling.NewDumpling(cfg)) + case config.ModeLoad: + us = append(us, loader.NewLightning(cfg, etcdClient, workerName)) case config.ModeLoadSync: us = append(us, loader.NewLightning(cfg, etcdClient, workerName)) us = append(us, syncer.NewSyncer(cfg, etcdClient, relay)) diff --git a/engine/enginepb/datarw.pb.go b/engine/enginepb/datarw.pb.go index bbb6a4c9f6b..d2bd6de6824 100644 --- a/engine/enginepb/datarw.pb.go +++ b/engine/enginepb/datarw.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 +// protoc-gen-go v1.34.2 // protoc v3.20.1 // source: engine/proto/datarw.proto @@ -733,7 +733,7 @@ func file_engine_proto_datarw_proto_rawDescGZIP() []byte { } var file_engine_proto_datarw_proto_msgTypes = make([]protoimpl.MessageInfo, 12) -var file_engine_proto_datarw_proto_goTypes = []interface{}{ +var file_engine_proto_datarw_proto_goTypes = []any{ (*GenerateDataRequest)(nil), // 0: enginepb.GenerateDataRequest (*GenerateDataResponse)(nil), // 1: enginepb.GenerateDataResponse (*CheckDirRequest)(nil), // 2: enginepb.CheckDirRequest @@ -773,7 +773,7 @@ func file_engine_proto_datarw_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_engine_proto_datarw_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*GenerateDataRequest); i { case 0: return &v.state @@ -785,7 +785,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*GenerateDataResponse); i { case 0: return &v.state @@ -797,7 +797,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*CheckDirRequest); i { case 0: return &v.state @@ -809,7 +809,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*CheckDirResponse); i { case 0: return &v.state @@ -821,7 +821,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*IsReadyRequest); i { case 0: return &v.state @@ -833,7 +833,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*IsReadyResponse); i { case 0: return &v.state @@ -845,7 +845,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*ListFilesReq); i { case 0: return &v.state @@ -857,7 +857,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*ListFilesResponse); i { case 0: return &v.state @@ -869,7 +869,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[8].Exporter = func(v any, i int) any { switch v := v.(*ReadLinesRequest); i { case 0: return &v.state @@ -881,7 +881,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[9].Exporter = func(v any, i int) any { switch v := v.(*ReadLinesResponse); i { case 0: return &v.state @@ -893,7 +893,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*WriteLinesRequest); i { case 0: return &v.state @@ -905,7 +905,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[11].Exporter = func(v any, i int) any { switch v := v.(*WriteLinesResponse); i { case 0: return &v.state diff --git a/engine/enginepb/executor.pb.go b/engine/enginepb/executor.pb.go index 1c316b94193..c04627ea745 100644 --- a/engine/enginepb/executor.pb.go +++ b/engine/enginepb/executor.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 +// protoc-gen-go v1.34.2 // protoc v3.20.1 // source: engine/proto/executor.proto @@ -422,7 +422,7 @@ func file_engine_proto_executor_proto_rawDescGZIP() []byte { } var file_engine_proto_executor_proto_msgTypes = make([]protoimpl.MessageInfo, 6) -var file_engine_proto_executor_proto_goTypes = []interface{}{ +var file_engine_proto_executor_proto_goTypes = []any{ (*PreDispatchTaskRequest)(nil), // 0: enginepb.PreDispatchTaskRequest (*PreDispatchTaskResponse)(nil), // 1: enginepb.PreDispatchTaskResponse (*ConfirmDispatchTaskRequest)(nil), // 2: enginepb.ConfirmDispatchTaskRequest @@ -453,7 +453,7 @@ func file_engine_proto_executor_proto_init() { } file_engine_proto_projects_proto_init() if !protoimpl.UnsafeEnabled { - file_engine_proto_executor_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_executor_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*PreDispatchTaskRequest); i { case 0: return &v.state @@ -465,7 +465,7 @@ func file_engine_proto_executor_proto_init() { return nil } } - file_engine_proto_executor_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_executor_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*PreDispatchTaskResponse); i { case 0: return &v.state @@ -477,7 +477,7 @@ func file_engine_proto_executor_proto_init() { return nil } } - file_engine_proto_executor_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_executor_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*ConfirmDispatchTaskRequest); i { case 0: return &v.state @@ -489,7 +489,7 @@ func file_engine_proto_executor_proto_init() { return nil } } - file_engine_proto_executor_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_executor_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*ConfirmDispatchTaskResponse); i { case 0: return &v.state @@ -501,7 +501,7 @@ func file_engine_proto_executor_proto_init() { return nil } } - file_engine_proto_executor_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_executor_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*RemoveLocalResourceRequest); i { case 0: return &v.state @@ -513,7 +513,7 @@ func file_engine_proto_executor_proto_init() { return nil } } - file_engine_proto_executor_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_executor_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*RemoveLocalResourceResponse); i { case 0: return &v.state diff --git a/engine/enginepb/master.pb.go b/engine/enginepb/master.pb.go index 5168ded9d3a..c81d3e28678 100644 --- a/engine/enginepb/master.pb.go +++ b/engine/enginepb/master.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 +// protoc-gen-go v1.34.2 // protoc v3.20.1 // source: engine/proto/master.proto @@ -1782,248 +1782,248 @@ var file_engine_proto_master_proto_rawDesc = []byte{ 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x22, 0x13, 0x0a, 0x11, 0x48, 0x65, 0x61, 0x72, 0x74, - 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc0, 0x01, 0x0a, - 0x08, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x36, 0x0a, 0x06, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x49, 0x0a, 0x17, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x08, 0x65, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x22, 0x16, 0x0a, 0x14, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x49, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x09, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x6f, 0x72, 0x52, 0x09, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x63, 0x0a, - 0x06, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x6c, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x22, 0x14, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x41, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x2a, 0x0a, 0x07, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x07, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x22, 0x95, 0x01, 0x0a, 0x13, - 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x09, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x12, 0x30, 0x0a, 0x09, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x03, + 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc1, 0x01, 0x0a, + 0x08, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x36, 0x0a, + 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x49, 0x0a, 0x17, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x08, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x22, 0x16, 0x0a, 0x14, 0x4c, + 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x49, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x09, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x52, 0x09, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x63, + 0x0a, 0x06, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x6c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x22, 0x14, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x41, 0x0a, 0x13, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x2a, 0x0a, 0x07, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x52, 0x07, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x22, 0x95, 0x01, 0x0a, + 0x13, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x33, 0x0a, + 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x12, 0x30, 0x0a, 0x09, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, + 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x09, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x22, 0x5c, 0x0a, 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a, + 0x0d, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x41, 0x64, + 0x64, 0x72, 0x22, 0x12, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, + 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, + 0x64, 0x72, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x4c, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xee, 0x03, 0x0a, 0x03, 0x4a, 0x6f, + 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x26, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x12, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, + 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x04, 0xe2, + 0x41, 0x01, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0c, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x12, 0x2f, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x12, 0x30, 0x0a, 0x09, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x09, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x22, 0x5c, 0x0a, 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, - 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, - 0x72, 0x22, 0x12, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x64, - 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, - 0x72, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x4c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xeb, 0x03, 0x0a, 0x03, 0x4a, 0x6f, 0x62, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x26, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, - 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, - 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x03, 0xe0, 0x41, - 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x1b, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, - 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x2e, 0x0a, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x30, 0x0a, - 0x09, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x52, 0x09, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x1a, - 0x35, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x42, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, - 0x0a, 0x0b, 0x54, 0x79, 0x70, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, - 0x0b, 0x0a, 0x07, 0x43, 0x56, 0x53, 0x44, 0x65, 0x6d, 0x6f, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, - 0x44, 0x4d, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x43, 0x44, 0x43, 0x10, 0x03, 0x12, 0x0b, 0x0a, - 0x07, 0x46, 0x61, 0x6b, 0x65, 0x4a, 0x6f, 0x62, 0x10, 0x04, 0x22, 0x6a, 0x0a, 0x05, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x55, 0x6e, 0x6b, 0x6e, - 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, - 0x0a, 0x0a, 0x06, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x46, - 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x61, 0x6e, - 0x63, 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x63, - 0x65, 0x6c, 0x65, 0x64, 0x10, 0x06, 0x22, 0x6f, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x03, 0x6a, 0x6f, - 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, - 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x12, 0x1b, 0x0a, 0x09, 0x74, - 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x22, 0x82, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4a, + 0x6f, 0x72, 0x73, 0x1a, 0x35, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, + 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x42, 0x0a, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x79, 0x70, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x56, 0x53, 0x44, 0x65, 0x6d, 0x6f, 0x10, 0x01, + 0x12, 0x06, 0x0a, 0x02, 0x44, 0x4d, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x43, 0x44, 0x43, 0x10, + 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x46, 0x61, 0x6b, 0x65, 0x4a, 0x6f, 0x62, 0x10, 0x04, 0x22, 0x6a, + 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x03, 0x12, + 0x0c, 0x0a, 0x08, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x10, 0x04, 0x12, 0x0d, 0x0a, + 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, + 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x10, 0x06, 0x22, 0x6f, 0x0a, 0x10, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, + 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x65, 0x6e, + 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x12, + 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x22, 0x82, 0x01, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, + 0x09, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x22, 0x83, 0x02, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x26, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x12, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, + 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x65, 0x6e, 0x67, + 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x5d, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, + 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x04, 0x6a, 0x6f, + 0x62, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, + 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x12, 0x26, 0x0a, + 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x5e, 0x0a, 0x10, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x83, 0x02, 0x0a, - 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x09, - 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x26, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, - 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, - 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x22, 0x5d, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, - 0x4a, 0x6f, 0x62, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, - 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x22, 0x5e, 0x0a, 0x10, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x64, 0x22, 0x5e, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x64, 0x22, 0x3c, 0x0a, 0x15, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x53, 0x74, - 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x74, 0x70, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, - 0x62, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x02, 0x74, 0x70, 0x22, - 0x30, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x22, 0x1b, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x34, - 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x2a, 0x32, 0x0a, 0x09, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x53, - 0x74, 0x6f, 0x72, 0x65, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x4d, 0x65, 0x74, - 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x10, 0x01, 0x32, 0x9c, 0x06, 0x0a, 0x09, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x12, 0x77, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, 0x21, 0x2e, 0x65, 0x6e, 0x67, - 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, - 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, - 0x72, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x22, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x72, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, - 0x6b, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, - 0x12, 0x1e, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1f, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x63, 0x0a, 0x0b, - 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x65, 0x6e, - 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x65, 0x6e, 0x67, 0x69, - 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, - 0x12, 0x0f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x73, 0x12, 0x46, 0x0a, 0x09, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x1a, + 0x65, 0x63, 0x74, 0x49, 0x64, 0x22, 0x5e, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x6e, + 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, + 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x49, 0x64, 0x22, 0x3c, 0x0a, 0x15, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, + 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, + 0x0a, 0x02, 0x74, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x65, 0x6e, 0x67, + 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x02, 0x74, 0x70, 0x22, 0x30, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x1b, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x34, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2a, 0x32, 0x0a, 0x09, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4d, + 0x65, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x70, + 0x70, 0x4d, 0x65, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x10, 0x01, 0x32, 0x9c, 0x06, 0x0a, + 0x09, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x12, 0x77, 0x0a, 0x10, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, 0x21, + 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x12, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x3a, 0x08, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x22, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, + 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x12, 0x6b, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, + 0x12, 0x63, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, + 0x1c, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x46, 0x0a, 0x09, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, + 0x61, 0x74, 0x12, 0x1a, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x48, 0x65, + 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, - 0x65, 0x61, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x65, 0x6e, 0x67, - 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x1f, 0x2e, 0x65, 0x6e, - 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, 0x74, - 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x61, 0x0a, 0x12, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x23, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, - 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x65, 0x6e, - 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x12, 0x1a, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x10, 0x12, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x12, 0x64, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x4c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x12, 0x1d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, - 0x69, 0x67, 0x6e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, - 0x22, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x2f, 0x72, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x32, 0x60, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x0c, 0x53, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x1d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, - 0x65, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, - 0x70, 0x62, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xc1, 0x03, 0x0a, 0x0a, 0x4a, 0x6f, - 0x62, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x51, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x12, 0x1a, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x0d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, - 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x31, 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x3a, 0x03, 0x6a, 0x6f, 0x62, 0x12, 0x4d, 0x0a, 0x06, 0x47, - 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x17, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, - 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, - 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x22, 0x1b, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6a, - 0x6f, 0x62, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x3d, 0x2a, 0x7d, 0x12, 0x57, 0x0a, 0x08, 0x4c, 0x69, - 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x19, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, - 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6a, - 0x6f, 0x62, 0x73, 0x12, 0x5a, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, - 0x12, 0x1a, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6e, 0x63, - 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x22, 0x22, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1c, 0x22, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6a, 0x6f, 0x62, - 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x3d, 0x2a, 0x7d, 0x2f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x12, - 0x5c, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x12, 0x1a, 0x2e, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, - 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x31, 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x3d, 0x2a, 0x7d, 0x42, 0x2b, 0x5a, - 0x29, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x69, 0x6e, 0x67, - 0x63, 0x61, 0x70, 0x2f, 0x74, 0x69, 0x66, 0x6c, 0x6f, 0x77, 0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, - 0x65, 0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x65, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, + 0x0e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, + 0x1f, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x4d, 0x65, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x4d, 0x65, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x12, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x23, 0x2e, 0x65, 0x6e, 0x67, + 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4c, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x12, 0x1a, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, + 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1b, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x64, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x4c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1d, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x17, 0x22, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6c, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x32, 0x60, 0x0a, 0x0d, 0x54, + 0x61, 0x73, 0x6b, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x0c, + 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x1d, 0x2e, 0x65, + 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x65, 0x6e, + 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xc1, 0x03, + 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x51, 0x0a, 0x09, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x12, 0x1a, 0x2e, 0x65, 0x6e, 0x67, 0x69, + 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, + 0x2e, 0x4a, 0x6f, 0x62, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x03, 0x6a, 0x6f, + 0x62, 0x22, 0x0c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x12, + 0x4d, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x17, 0x2e, 0x65, 0x6e, 0x67, 0x69, + 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, + 0x62, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x3d, 0x2a, 0x7d, 0x12, 0x57, + 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x19, 0x2e, 0x65, 0x6e, 0x67, + 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x12, 0x5a, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, + 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x1a, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, + 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x0d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x22, + 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x22, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, + 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x3d, 0x2a, 0x7d, 0x2f, 0x63, 0x61, 0x6e, + 0x63, 0x65, 0x6c, 0x12, 0x5c, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, + 0x12, 0x1a, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x3d, 0x2a, + 0x7d, 0x42, 0x2b, 0x5a, 0x29, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x70, 0x69, 0x6e, 0x67, 0x63, 0x61, 0x70, 0x2f, 0x74, 0x69, 0x66, 0x6c, 0x6f, 0x77, 0x2f, 0x65, + 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2040,7 +2040,7 @@ func file_engine_proto_master_proto_rawDescGZIP() []byte { var file_engine_proto_master_proto_enumTypes = make([]protoimpl.EnumInfo, 4) var file_engine_proto_master_proto_msgTypes = make([]protoimpl.MessageInfo, 28) -var file_engine_proto_master_proto_goTypes = []interface{}{ +var file_engine_proto_master_proto_goTypes = []any{ (StoreType)(0), // 0: enginepb.StoreType (Selector_Op)(0), // 1: enginepb.Selector.Op (Job_Type)(0), // 2: enginepb.Job.Type @@ -2135,7 +2135,7 @@ func file_engine_proto_master_proto_init() { } file_engine_proto_resources_proto_init() if !protoimpl.UnsafeEnabled { - file_engine_proto_master_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*Selector); i { case 0: return &v.state @@ -2147,7 +2147,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*HeartbeatRequest); i { case 0: return &v.state @@ -2159,7 +2159,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*HeartbeatResponse); i { case 0: return &v.state @@ -2171,7 +2171,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*Executor); i { case 0: return &v.state @@ -2183,7 +2183,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*RegisterExecutorRequest); i { case 0: return &v.state @@ -2195,7 +2195,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*ListExecutorsRequest); i { case 0: return &v.state @@ -2207,7 +2207,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*ListExecutorsResponse); i { case 0: return &v.state @@ -2219,7 +2219,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*Master); i { case 0: return &v.state @@ -2231,7 +2231,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[8].Exporter = func(v any, i int) any { switch v := v.(*ListMastersRequest); i { case 0: return &v.state @@ -2243,7 +2243,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[9].Exporter = func(v any, i int) any { switch v := v.(*ListMastersResponse); i { case 0: return &v.state @@ -2255,7 +2255,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*ScheduleTaskRequest); i { case 0: return &v.state @@ -2267,7 +2267,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[11].Exporter = func(v any, i int) any { switch v := v.(*ScheduleTaskResponse); i { case 0: return &v.state @@ -2279,7 +2279,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[12].Exporter = func(v any, i int) any { switch v := v.(*GetLeaderRequest); i { case 0: return &v.state @@ -2291,7 +2291,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[13].Exporter = func(v any, i int) any { switch v := v.(*GetLeaderResponse); i { case 0: return &v.state @@ -2303,7 +2303,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[14].Exporter = func(v any, i int) any { switch v := v.(*ResignLeaderRequest); i { case 0: return &v.state @@ -2315,7 +2315,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[15].Exporter = func(v any, i int) any { switch v := v.(*Job); i { case 0: return &v.state @@ -2327,7 +2327,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[16].Exporter = func(v any, i int) any { switch v := v.(*CreateJobRequest); i { case 0: return &v.state @@ -2339,7 +2339,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[17].Exporter = func(v any, i int) any { switch v := v.(*GetJobRequest); i { case 0: return &v.state @@ -2351,7 +2351,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[18].Exporter = func(v any, i int) any { switch v := v.(*ListJobsRequest); i { case 0: return &v.state @@ -2363,7 +2363,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[19].Exporter = func(v any, i int) any { switch v := v.(*ListJobsResponse); i { case 0: return &v.state @@ -2375,7 +2375,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[20].Exporter = func(v any, i int) any { switch v := v.(*CancelJobRequest); i { case 0: return &v.state @@ -2387,7 +2387,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[21].Exporter = func(v any, i int) any { switch v := v.(*DeleteJobRequest); i { case 0: return &v.state @@ -2399,7 +2399,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[22].Exporter = func(v any, i int) any { switch v := v.(*QueryMetaStoreRequest); i { case 0: return &v.state @@ -2411,7 +2411,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[23].Exporter = func(v any, i int) any { switch v := v.(*QueryMetaStoreResponse); i { case 0: return &v.state @@ -2423,7 +2423,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[24].Exporter = func(v any, i int) any { switch v := v.(*QueryStorageConfigRequest); i { case 0: return &v.state @@ -2435,7 +2435,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[25].Exporter = func(v any, i int) any { switch v := v.(*QueryStorageConfigResponse); i { case 0: return &v.state @@ -2447,7 +2447,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[27].Exporter = func(v any, i int) any { switch v := v.(*Job_Error); i { case 0: return &v.state diff --git a/engine/enginepb/projects.pb.go b/engine/enginepb/projects.pb.go index e7a72aae763..c8bccfd6007 100644 --- a/engine/enginepb/projects.pb.go +++ b/engine/enginepb/projects.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 +// protoc-gen-go v1.34.2 // protoc v3.20.1 // source: engine/proto/projects.proto @@ -104,7 +104,7 @@ func file_engine_proto_projects_proto_rawDescGZIP() []byte { } var file_engine_proto_projects_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_engine_proto_projects_proto_goTypes = []interface{}{ +var file_engine_proto_projects_proto_goTypes = []any{ (*ProjectInfo)(nil), // 0: enginepb.ProjectInfo } var file_engine_proto_projects_proto_depIdxs = []int32{ @@ -121,7 +121,7 @@ func file_engine_proto_projects_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_engine_proto_projects_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_projects_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*ProjectInfo); i { case 0: return &v.state diff --git a/engine/enginepb/resources.pb.go b/engine/enginepb/resources.pb.go index fdd1822a8b4..4915c07aaa2 100644 --- a/engine/enginepb/resources.pb.go +++ b/engine/enginepb/resources.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 +// protoc-gen-go v1.34.2 // protoc v3.20.1 // source: engine/proto/resources.proto @@ -471,7 +471,7 @@ func file_engine_proto_resources_proto_rawDescGZIP() []byte { } var file_engine_proto_resources_proto_msgTypes = make([]protoimpl.MessageInfo, 7) -var file_engine_proto_resources_proto_goTypes = []interface{}{ +var file_engine_proto_resources_proto_goTypes = []any{ (*CreateResourceRequest)(nil), // 0: enginepb.CreateResourceRequest (*CreateResourceResponse)(nil), // 1: enginepb.CreateResourceResponse (*ResourceKey)(nil), // 2: enginepb.ResourceKey @@ -505,7 +505,7 @@ func file_engine_proto_resources_proto_init() { } file_engine_proto_projects_proto_init() if !protoimpl.UnsafeEnabled { - file_engine_proto_resources_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_resources_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*CreateResourceRequest); i { case 0: return &v.state @@ -517,7 +517,7 @@ func file_engine_proto_resources_proto_init() { return nil } } - file_engine_proto_resources_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_resources_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*CreateResourceResponse); i { case 0: return &v.state @@ -529,7 +529,7 @@ func file_engine_proto_resources_proto_init() { return nil } } - file_engine_proto_resources_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_resources_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*ResourceKey); i { case 0: return &v.state @@ -541,7 +541,7 @@ func file_engine_proto_resources_proto_init() { return nil } } - file_engine_proto_resources_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_resources_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*QueryResourceRequest); i { case 0: return &v.state @@ -553,7 +553,7 @@ func file_engine_proto_resources_proto_init() { return nil } } - file_engine_proto_resources_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_resources_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*QueryResourceResponse); i { case 0: return &v.state @@ -565,7 +565,7 @@ func file_engine_proto_resources_proto_init() { return nil } } - file_engine_proto_resources_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_resources_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*RemoveResourceRequest); i { case 0: return &v.state @@ -577,7 +577,7 @@ func file_engine_proto_resources_proto_init() { return nil } } - file_engine_proto_resources_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_resources_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*RemoveResourceResponse); i { case 0: return &v.state diff --git a/engine/enginepb/test.pb.go b/engine/enginepb/test.pb.go index 787ff75592f..22435f85ab9 100644 --- a/engine/enginepb/test.pb.go +++ b/engine/enginepb/test.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 +// protoc-gen-go v1.34.2 // protoc v3.20.1 // source: engine/proto/test.proto @@ -246,7 +246,7 @@ func file_engine_proto_test_proto_rawDescGZIP() []byte { var file_engine_proto_test_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_engine_proto_test_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_engine_proto_test_proto_goTypes = []interface{}{ +var file_engine_proto_test_proto_goTypes = []any{ (Record_RecordType)(0), // 0: enginepb.Record.RecordType (*Record)(nil), // 1: enginepb.Record (*TestBinlogRequest)(nil), // 2: enginepb.TestBinlogRequest @@ -268,7 +268,7 @@ func file_engine_proto_test_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_engine_proto_test_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_test_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*Record); i { case 0: return &v.state @@ -280,7 +280,7 @@ func file_engine_proto_test_proto_init() { return nil } } - file_engine_proto_test_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_test_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*TestBinlogRequest); i { case 0: return &v.state diff --git a/engine/executor/dm/worker.go b/engine/executor/dm/worker.go index 21445c8f3b8..502b280e6db 100644 --- a/engine/executor/dm/worker.go +++ b/engine/executor/dm/worker.go @@ -152,12 +152,12 @@ func (w *dmWorker) InitImpl(ctx context.Context) error { if err := w.messageAgent.UpdateClient(w.masterID, w); err != nil { return err } - // for dump/load&sync mode task, we needn't to setup external storage - // these two tasks will directly read/write data from/to user specified external storage without executor's management - // for all/full mode task, the dump/load units run on a same executor, so they can access the s3 data under a same executor - // but for dump/load&sync mode task, import API needs a clear S3 URI without exector's prefix, - // what's more, dump/load units may not be executed on a same executor, - // so we choose to use user's own external storage and don't set up here. + // For dump/load/load&sync mode tasks, we don’t need to set up external storage. + // These tasks directly read/write data to/from user-specified external storage without the executor's management. + // In all/full mode tasks, dump/load units run on the same executor, allowing access to S3 data under the same executor's namespace. + // However, for dump/load & sync mode tasks, the import API requires a plain S3 URI without the executor's prefix. + // Additionally, dump/load units may not run on the same executor, + // so we opt to use the user’s external storage directly instead of configuring it here. if (w.cfg.Mode == dmconfig.ModeAll || w.cfg.Mode == dmconfig.ModeFull) && w.needExtStorage { if err := w.setupStorage(ctx); err != nil { return err @@ -258,8 +258,10 @@ func (w *dmWorker) updateStatusWhenStageChange(ctx context.Context) error { return w.UpdateStatus(ctx, status) } - // now we are in StageFinished - // for all and full mode, resource is managed by engine, we need to discard them + // Now we are in StageFinished + // For all and full mode, resource is managed by engine, we need to discard them + // In standalone modes (e.g., dump and load), we use user-specified storage. + // No additional operations on storage are needed, leaving management to the user. if w.cfg.Mode == dmconfig.ModeAll || w.cfg.Mode == dmconfig.ModeFull { switch w.workerType { case frameModel.WorkerDMDump: diff --git a/engine/jobmaster/dm/task_manager.go b/engine/jobmaster/dm/task_manager.go index 5009e21d439..e2f1973e3e5 100644 --- a/engine/jobmaster/dm/task_manager.go +++ b/engine/jobmaster/dm/task_manager.go @@ -287,7 +287,8 @@ func (tm *TaskManager) allFinished(ctx context.Context) bool { if runningTask.Unit != frameModel.WorkerDMLoad { return false } - case dmconfig.ModeDump: + case dmconfig.ModeDump, dmconfig.ModeLoad, dmconfig.ModeLoadSync: + // passing through, as long as the stage is done default: return false } diff --git a/engine/jobmaster/dm/worker_manager.go b/engine/jobmaster/dm/worker_manager.go index a628e77a009..e845ed11f2d 100644 --- a/engine/jobmaster/dm/worker_manager.go +++ b/engine/jobmaster/dm/worker_manager.go @@ -302,6 +302,9 @@ var workerSeqMap = map[string][]frameModel.WorkerType{ dmconfig.ModeDump: { frameModel.WorkerDMDump, }, + dmconfig.ModeLoad: { + frameModel.WorkerDMLoad, + }, dmconfig.ModeLoadSync: { frameModel.WorkerDMLoad, frameModel.WorkerDMSync, diff --git a/tools/check/go.mod b/tools/check/go.mod index 9f869541869..ec6abb43de9 100644 --- a/tools/check/go.mod +++ b/tools/check/go.mod @@ -85,7 +85,7 @@ require ( github.com/gobwas/glob v0.2.3 // indirect github.com/gofrs/flock v0.12.1 // indirect github.com/golang/glog v1.0.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe // indirect diff --git a/tools/check/go.sum b/tools/check/go.sum index b710465dfc0..f797a06f316 100644 --- a/tools/check/go.sum +++ b/tools/check/go.sum @@ -377,6 +377,8 @@ github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= @@ -1445,7 +1447,12 @@ google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20220719170305-83ca9fad585f h1:P8EiVSxZwC6xH2niv2N66aqwMtYFg+D54gbjpcqKJtM= google.golang.org/genproto v0.0.0-20220719170305-83ca9fad585f/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= +google.golang.org/genproto/googleapis/api v0.0.0-20240725223205-93522f1f2a9f h1:b1Ln/PG8orm0SsBbHZWke8dDp2lrCD4jSmfglFpTZbk= +google.golang.org/genproto/googleapis/api v0.0.0-20240725223205-93522f1f2a9f/go.mod h1:AHT0dDg3SoMOgZGnZk29b5xTbPHMoEC8qthmBLJCpys= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=