Implement calculate vectors distance in server (#6219)

* calc distance stage 3

Signed-off-by: yhmo <yihua.mo@zilliz.com>

* calc distance stage 5

Signed-off-by: yhmo <yihua.mo@zilliz.com>

* calc distance stage 6

Signed-off-by: yhmo <yihua.mo@zilliz.com>

* code style

Signed-off-by: yhmo <yihua.mo@zilliz.com>

* typo

Signed-off-by: yhmo <yihua.mo@zilliz.com>

* typo

Signed-off-by: yhmo <yihua.mo@zilliz.com>

* typo

Signed-off-by: yhmo <yihua.mo@zilliz.com>
pull/6260/head
groot 2021-07-01 18:56:17 +08:00 committed by GitHub
parent 3524d87f9b
commit a364d7303b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 4583 additions and 309 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -387,6 +387,10 @@ func (s *Server) Query(ctx context.Context, request *milvuspb.QueryRequest) (*mi
return s.proxy.Query(ctx, request)
}
func (s *Server) CalcDistance(ctx context.Context, request *milvuspb.CalcDistanceRequest) (*milvuspb.CalcDistanceResults, error) {
return s.proxy.CalcDistance(ctx, request)
}
func (s *Server) GetDdChannel(ctx context.Context, request *internalpb.GetDdChannelRequest) (*milvuspb.StringResponse, error) {
return s.proxy.GetDdChannel(ctx, request)
}

View File

@ -35,6 +35,7 @@ service MilvusService {
rpc Retrieve(RetrieveRequest) returns (RetrieveResults) {}
rpc Flush(FlushRequest) returns (FlushResponse) {}
rpc Query(QueryRequest) returns (QueryResults) {}
rpc CalcDistance(CalcDistanceRequest) returns (CalcDistanceResults) {}
rpc GetPersistentSegmentInfo(GetPersistentSegmentInfoRequest) returns (GetPersistentSegmentInfoResponse) {}
rpc GetQuerySegmentInfo(GetQuerySegmentInfoRequest) returns (GetQuerySegmentInfoResponse) {}
@ -389,6 +390,36 @@ message QueryResults {
repeated schema.FieldData fields_data = 2;
}
message VectorIDs {
string collection_name = 1;
string field_name = 2;
schema.IDs id_array = 3;
repeated string partition_names = 4;
}
message VectorsArray {
oneof array {
VectorIDs id_array = 1; // vector ids
schema.VectorField data_array = 2; // vectors data
}
}
message CalcDistanceRequest {
common.MsgBase base = 1;
VectorsArray op_left = 2; // vectors on the left of operator
VectorsArray op_right = 3; // vectors on the right of operator
repeated common.KeyValuePair params = 4; // "metric":"L2"/"IP"/"HAMMIN"/"TANIMOTO"
}
message CalcDistanceResults {
common.Status status = 1;
// num(op_left)*num(op_right) distance values, "HAMMIN" return integer distance
oneof array {
schema.IntArray int_dist = 2;
schema.FloatArray float_dist = 3;
}
}
message PersistentSegmentInfo {
int64 segmentID = 1;
int64 collectionID = 2;

View File

@ -3058,6 +3058,302 @@ func (m *QueryResults) GetFieldsData() []*schemapb.FieldData {
return nil
}
type VectorIDs struct {
CollectionName string `protobuf:"bytes,1,opt,name=collection_name,json=collectionName,proto3" json:"collection_name,omitempty"`
FieldName string `protobuf:"bytes,2,opt,name=field_name,json=fieldName,proto3" json:"field_name,omitempty"`
IdArray *schemapb.IDs `protobuf:"bytes,3,opt,name=id_array,json=idArray,proto3" json:"id_array,omitempty"`
PartitionNames []string `protobuf:"bytes,4,rep,name=partition_names,json=partitionNames,proto3" json:"partition_names,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *VectorIDs) Reset() { *m = VectorIDs{} }
func (m *VectorIDs) String() string { return proto.CompactTextString(m) }
func (*VectorIDs) ProtoMessage() {}
func (*VectorIDs) Descriptor() ([]byte, []int) {
return fileDescriptor_02345ba45cc0e303, []int{48}
}
func (m *VectorIDs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_VectorIDs.Unmarshal(m, b)
}
func (m *VectorIDs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_VectorIDs.Marshal(b, m, deterministic)
}
func (m *VectorIDs) XXX_Merge(src proto.Message) {
xxx_messageInfo_VectorIDs.Merge(m, src)
}
func (m *VectorIDs) XXX_Size() int {
return xxx_messageInfo_VectorIDs.Size(m)
}
func (m *VectorIDs) XXX_DiscardUnknown() {
xxx_messageInfo_VectorIDs.DiscardUnknown(m)
}
var xxx_messageInfo_VectorIDs proto.InternalMessageInfo
func (m *VectorIDs) GetCollectionName() string {
if m != nil {
return m.CollectionName
}
return ""
}
func (m *VectorIDs) GetFieldName() string {
if m != nil {
return m.FieldName
}
return ""
}
func (m *VectorIDs) GetIdArray() *schemapb.IDs {
if m != nil {
return m.IdArray
}
return nil
}
func (m *VectorIDs) GetPartitionNames() []string {
if m != nil {
return m.PartitionNames
}
return nil
}
type VectorsArray struct {
// Types that are valid to be assigned to Array:
// *VectorsArray_IdArray
// *VectorsArray_DataArray
Array isVectorsArray_Array `protobuf_oneof:"array"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *VectorsArray) Reset() { *m = VectorsArray{} }
func (m *VectorsArray) String() string { return proto.CompactTextString(m) }
func (*VectorsArray) ProtoMessage() {}
func (*VectorsArray) Descriptor() ([]byte, []int) {
return fileDescriptor_02345ba45cc0e303, []int{49}
}
func (m *VectorsArray) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_VectorsArray.Unmarshal(m, b)
}
func (m *VectorsArray) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_VectorsArray.Marshal(b, m, deterministic)
}
func (m *VectorsArray) XXX_Merge(src proto.Message) {
xxx_messageInfo_VectorsArray.Merge(m, src)
}
func (m *VectorsArray) XXX_Size() int {
return xxx_messageInfo_VectorsArray.Size(m)
}
func (m *VectorsArray) XXX_DiscardUnknown() {
xxx_messageInfo_VectorsArray.DiscardUnknown(m)
}
var xxx_messageInfo_VectorsArray proto.InternalMessageInfo
type isVectorsArray_Array interface {
isVectorsArray_Array()
}
type VectorsArray_IdArray struct {
IdArray *VectorIDs `protobuf:"bytes,1,opt,name=id_array,json=idArray,proto3,oneof"`
}
type VectorsArray_DataArray struct {
DataArray *schemapb.VectorField `protobuf:"bytes,2,opt,name=data_array,json=dataArray,proto3,oneof"`
}
func (*VectorsArray_IdArray) isVectorsArray_Array() {}
func (*VectorsArray_DataArray) isVectorsArray_Array() {}
func (m *VectorsArray) GetArray() isVectorsArray_Array {
if m != nil {
return m.Array
}
return nil
}
func (m *VectorsArray) GetIdArray() *VectorIDs {
if x, ok := m.GetArray().(*VectorsArray_IdArray); ok {
return x.IdArray
}
return nil
}
func (m *VectorsArray) GetDataArray() *schemapb.VectorField {
if x, ok := m.GetArray().(*VectorsArray_DataArray); ok {
return x.DataArray
}
return nil
}
// XXX_OneofWrappers is for the internal use of the proto package.
func (*VectorsArray) XXX_OneofWrappers() []interface{} {
return []interface{}{
(*VectorsArray_IdArray)(nil),
(*VectorsArray_DataArray)(nil),
}
}
type CalcDistanceRequest struct {
Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
OpLeft *VectorsArray `protobuf:"bytes,2,opt,name=op_left,json=opLeft,proto3" json:"op_left,omitempty"`
OpRight *VectorsArray `protobuf:"bytes,3,opt,name=op_right,json=opRight,proto3" json:"op_right,omitempty"`
Params []*commonpb.KeyValuePair `protobuf:"bytes,4,rep,name=params,proto3" json:"params,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *CalcDistanceRequest) Reset() { *m = CalcDistanceRequest{} }
func (m *CalcDistanceRequest) String() string { return proto.CompactTextString(m) }
func (*CalcDistanceRequest) ProtoMessage() {}
func (*CalcDistanceRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_02345ba45cc0e303, []int{50}
}
func (m *CalcDistanceRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CalcDistanceRequest.Unmarshal(m, b)
}
func (m *CalcDistanceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_CalcDistanceRequest.Marshal(b, m, deterministic)
}
func (m *CalcDistanceRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_CalcDistanceRequest.Merge(m, src)
}
func (m *CalcDistanceRequest) XXX_Size() int {
return xxx_messageInfo_CalcDistanceRequest.Size(m)
}
func (m *CalcDistanceRequest) XXX_DiscardUnknown() {
xxx_messageInfo_CalcDistanceRequest.DiscardUnknown(m)
}
var xxx_messageInfo_CalcDistanceRequest proto.InternalMessageInfo
func (m *CalcDistanceRequest) GetBase() *commonpb.MsgBase {
if m != nil {
return m.Base
}
return nil
}
func (m *CalcDistanceRequest) GetOpLeft() *VectorsArray {
if m != nil {
return m.OpLeft
}
return nil
}
func (m *CalcDistanceRequest) GetOpRight() *VectorsArray {
if m != nil {
return m.OpRight
}
return nil
}
func (m *CalcDistanceRequest) GetParams() []*commonpb.KeyValuePair {
if m != nil {
return m.Params
}
return nil
}
type CalcDistanceResults struct {
Status *commonpb.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"`
// num(op_left)*num(op_right) distance values, "HAMMIN" return integer distance
//
// Types that are valid to be assigned to Array:
// *CalcDistanceResults_IntDist
// *CalcDistanceResults_FloatDist
Array isCalcDistanceResults_Array `protobuf_oneof:"array"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *CalcDistanceResults) Reset() { *m = CalcDistanceResults{} }
func (m *CalcDistanceResults) String() string { return proto.CompactTextString(m) }
func (*CalcDistanceResults) ProtoMessage() {}
func (*CalcDistanceResults) Descriptor() ([]byte, []int) {
return fileDescriptor_02345ba45cc0e303, []int{51}
}
func (m *CalcDistanceResults) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CalcDistanceResults.Unmarshal(m, b)
}
func (m *CalcDistanceResults) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_CalcDistanceResults.Marshal(b, m, deterministic)
}
func (m *CalcDistanceResults) XXX_Merge(src proto.Message) {
xxx_messageInfo_CalcDistanceResults.Merge(m, src)
}
func (m *CalcDistanceResults) XXX_Size() int {
return xxx_messageInfo_CalcDistanceResults.Size(m)
}
func (m *CalcDistanceResults) XXX_DiscardUnknown() {
xxx_messageInfo_CalcDistanceResults.DiscardUnknown(m)
}
var xxx_messageInfo_CalcDistanceResults proto.InternalMessageInfo
func (m *CalcDistanceResults) GetStatus() *commonpb.Status {
if m != nil {
return m.Status
}
return nil
}
type isCalcDistanceResults_Array interface {
isCalcDistanceResults_Array()
}
type CalcDistanceResults_IntDist struct {
IntDist *schemapb.IntArray `protobuf:"bytes,2,opt,name=int_dist,json=intDist,proto3,oneof"`
}
type CalcDistanceResults_FloatDist struct {
FloatDist *schemapb.FloatArray `protobuf:"bytes,3,opt,name=float_dist,json=floatDist,proto3,oneof"`
}
func (*CalcDistanceResults_IntDist) isCalcDistanceResults_Array() {}
func (*CalcDistanceResults_FloatDist) isCalcDistanceResults_Array() {}
func (m *CalcDistanceResults) GetArray() isCalcDistanceResults_Array {
if m != nil {
return m.Array
}
return nil
}
func (m *CalcDistanceResults) GetIntDist() *schemapb.IntArray {
if x, ok := m.GetArray().(*CalcDistanceResults_IntDist); ok {
return x.IntDist
}
return nil
}
func (m *CalcDistanceResults) GetFloatDist() *schemapb.FloatArray {
if x, ok := m.GetArray().(*CalcDistanceResults_FloatDist); ok {
return x.FloatDist
}
return nil
}
// XXX_OneofWrappers is for the internal use of the proto package.
func (*CalcDistanceResults) XXX_OneofWrappers() []interface{} {
return []interface{}{
(*CalcDistanceResults_IntDist)(nil),
(*CalcDistanceResults_FloatDist)(nil),
}
}
type PersistentSegmentInfo struct {
SegmentID int64 `protobuf:"varint,1,opt,name=segmentID,proto3" json:"segmentID,omitempty"`
CollectionID int64 `protobuf:"varint,2,opt,name=collectionID,proto3" json:"collectionID,omitempty"`
@ -3073,7 +3369,7 @@ func (m *PersistentSegmentInfo) Reset() { *m = PersistentSegmentInfo{} }
func (m *PersistentSegmentInfo) String() string { return proto.CompactTextString(m) }
func (*PersistentSegmentInfo) ProtoMessage() {}
func (*PersistentSegmentInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_02345ba45cc0e303, []int{48}
return fileDescriptor_02345ba45cc0e303, []int{52}
}
func (m *PersistentSegmentInfo) XXX_Unmarshal(b []byte) error {
@ -3142,7 +3438,7 @@ func (m *GetPersistentSegmentInfoRequest) Reset() { *m = GetPersistentSe
func (m *GetPersistentSegmentInfoRequest) String() string { return proto.CompactTextString(m) }
func (*GetPersistentSegmentInfoRequest) ProtoMessage() {}
func (*GetPersistentSegmentInfoRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_02345ba45cc0e303, []int{49}
return fileDescriptor_02345ba45cc0e303, []int{53}
}
func (m *GetPersistentSegmentInfoRequest) XXX_Unmarshal(b []byte) error {
@ -3196,7 +3492,7 @@ func (m *GetPersistentSegmentInfoResponse) Reset() { *m = GetPersistentS
func (m *GetPersistentSegmentInfoResponse) String() string { return proto.CompactTextString(m) }
func (*GetPersistentSegmentInfoResponse) ProtoMessage() {}
func (*GetPersistentSegmentInfoResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_02345ba45cc0e303, []int{50}
return fileDescriptor_02345ba45cc0e303, []int{54}
}
func (m *GetPersistentSegmentInfoResponse) XXX_Unmarshal(b []byte) error {
@ -3248,7 +3544,7 @@ func (m *QuerySegmentInfo) Reset() { *m = QuerySegmentInfo{} }
func (m *QuerySegmentInfo) String() string { return proto.CompactTextString(m) }
func (*QuerySegmentInfo) ProtoMessage() {}
func (*QuerySegmentInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_02345ba45cc0e303, []int{51}
return fileDescriptor_02345ba45cc0e303, []int{55}
}
func (m *QuerySegmentInfo) XXX_Unmarshal(b []byte) error {
@ -3331,7 +3627,7 @@ func (m *GetQuerySegmentInfoRequest) Reset() { *m = GetQuerySegmentInfoR
func (m *GetQuerySegmentInfoRequest) String() string { return proto.CompactTextString(m) }
func (*GetQuerySegmentInfoRequest) ProtoMessage() {}
func (*GetQuerySegmentInfoRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_02345ba45cc0e303, []int{52}
return fileDescriptor_02345ba45cc0e303, []int{56}
}
func (m *GetQuerySegmentInfoRequest) XXX_Unmarshal(b []byte) error {
@ -3385,7 +3681,7 @@ func (m *GetQuerySegmentInfoResponse) Reset() { *m = GetQuerySegmentInfo
func (m *GetQuerySegmentInfoResponse) String() string { return proto.CompactTextString(m) }
func (*GetQuerySegmentInfoResponse) ProtoMessage() {}
func (*GetQuerySegmentInfoResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_02345ba45cc0e303, []int{53}
return fileDescriptor_02345ba45cc0e303, []int{57}
}
func (m *GetQuerySegmentInfoResponse) XXX_Unmarshal(b []byte) error {
@ -3431,7 +3727,7 @@ func (m *DummyRequest) Reset() { *m = DummyRequest{} }
func (m *DummyRequest) String() string { return proto.CompactTextString(m) }
func (*DummyRequest) ProtoMessage() {}
func (*DummyRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_02345ba45cc0e303, []int{54}
return fileDescriptor_02345ba45cc0e303, []int{58}
}
func (m *DummyRequest) XXX_Unmarshal(b []byte) error {
@ -3470,7 +3766,7 @@ func (m *DummyResponse) Reset() { *m = DummyResponse{} }
func (m *DummyResponse) String() string { return proto.CompactTextString(m) }
func (*DummyResponse) ProtoMessage() {}
func (*DummyResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_02345ba45cc0e303, []int{55}
return fileDescriptor_02345ba45cc0e303, []int{59}
}
func (m *DummyResponse) XXX_Unmarshal(b []byte) error {
@ -3508,7 +3804,7 @@ func (m *RegisterLinkRequest) Reset() { *m = RegisterLinkRequest{} }
func (m *RegisterLinkRequest) String() string { return proto.CompactTextString(m) }
func (*RegisterLinkRequest) ProtoMessage() {}
func (*RegisterLinkRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_02345ba45cc0e303, []int{56}
return fileDescriptor_02345ba45cc0e303, []int{60}
}
func (m *RegisterLinkRequest) XXX_Unmarshal(b []byte) error {
@ -3541,7 +3837,7 @@ func (m *RegisterLinkResponse) Reset() { *m = RegisterLinkResponse{} }
func (m *RegisterLinkResponse) String() string { return proto.CompactTextString(m) }
func (*RegisterLinkResponse) ProtoMessage() {}
func (*RegisterLinkResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_02345ba45cc0e303, []int{57}
return fileDescriptor_02345ba45cc0e303, []int{61}
}
func (m *RegisterLinkResponse) XXX_Unmarshal(b []byte) error {
@ -3628,6 +3924,10 @@ func init() {
proto.RegisterMapType((map[string]*schemapb.LongArray)(nil), "milvus.proto.milvus.FlushResponse.CollSegIDsEntry")
proto.RegisterType((*QueryRequest)(nil), "milvus.proto.milvus.QueryRequest")
proto.RegisterType((*QueryResults)(nil), "milvus.proto.milvus.QueryResults")
proto.RegisterType((*VectorIDs)(nil), "milvus.proto.milvus.VectorIDs")
proto.RegisterType((*VectorsArray)(nil), "milvus.proto.milvus.VectorsArray")
proto.RegisterType((*CalcDistanceRequest)(nil), "milvus.proto.milvus.CalcDistanceRequest")
proto.RegisterType((*CalcDistanceResults)(nil), "milvus.proto.milvus.CalcDistanceResults")
proto.RegisterType((*PersistentSegmentInfo)(nil), "milvus.proto.milvus.PersistentSegmentInfo")
proto.RegisterType((*GetPersistentSegmentInfoRequest)(nil), "milvus.proto.milvus.GetPersistentSegmentInfoRequest")
proto.RegisterType((*GetPersistentSegmentInfoResponse)(nil), "milvus.proto.milvus.GetPersistentSegmentInfoResponse")
@ -3643,173 +3943,187 @@ func init() {
func init() { proto.RegisterFile("milvus.proto", fileDescriptor_02345ba45cc0e303) }
var fileDescriptor_02345ba45cc0e303 = []byte{
// 2643 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3a, 0xcd, 0x6f, 0xdc, 0xc6,
0xf5, 0x9a, 0x5d, 0xed, 0xd7, 0x5b, 0xae, 0xb4, 0x19, 0x7d, 0x6d, 0xd6, 0x1f, 0x91, 0x98, 0xf8,
0x17, 0x59, 0x76, 0xa4, 0x44, 0xb6, 0x7f, 0x49, 0x3f, 0x53, 0xdb, 0xaa, 0x6d, 0xc1, 0x1f, 0x55,
0xb8, 0x6e, 0xd0, 0x34, 0x30, 0x16, 0xd4, 0x72, 0xbc, 0x4b, 0x88, 0x4b, 0x6e, 0x39, 0xa4, 0xe4,
0xf5, 0xa9, 0x80, 0xd3, 0x02, 0x45, 0x5b, 0x07, 0x45, 0x83, 0x02, 0xed, 0xa1, 0x28, 0x5a, 0xe4,
0xd0, 0x53, 0x5b, 0xa4, 0x40, 0x81, 0x9e, 0x7a, 0xc8, 0xa1, 0x87, 0x02, 0x2d, 0x7a, 0xed, 0xb5,
0x3d, 0xe6, 0x7f, 0x28, 0x38, 0x43, 0x72, 0x49, 0x6a, 0xb8, 0x5a, 0x79, 0xe3, 0x4a, 0xba, 0x91,
0x6f, 0xde, 0x9b, 0x79, 0xdf, 0xf3, 0xe6, 0xcd, 0x80, 0xd4, 0xd5, 0x8d, 0x5d, 0x97, 0xae, 0xf6,
0x6c, 0xcb, 0xb1, 0xf0, 0x4c, 0xf4, 0x6f, 0x95, 0xff, 0xd4, 0xa5, 0x96, 0xd5, 0xed, 0x5a, 0x26,
0x07, 0xd6, 0x25, 0xda, 0xea, 0x90, 0xae, 0xca, 0xff, 0xe4, 0x4f, 0x11, 0x2c, 0x5c, 0xb7, 0x89,
0xea, 0x90, 0xeb, 0x96, 0x61, 0x90, 0x96, 0xa3, 0x5b, 0xa6, 0x42, 0xbe, 0xe3, 0x12, 0xea, 0xe0,
0xd7, 0x61, 0x72, 0x5b, 0xa5, 0xa4, 0x86, 0x16, 0xd1, 0x72, 0x79, 0xfd, 0xf4, 0x6a, 0x6c, 0x6e,
0x7f, 0xce, 0xbb, 0xb4, 0x7d, 0x4d, 0xa5, 0x44, 0x61, 0x98, 0x78, 0x01, 0x0a, 0xda, 0x76, 0xd3,
0x54, 0xbb, 0xa4, 0x96, 0x59, 0x44, 0xcb, 0x25, 0x25, 0xaf, 0x6d, 0xdf, 0x53, 0xbb, 0x04, 0xbf,
0x0a, 0xd3, 0xad, 0x70, 0x7e, 0x8e, 0x90, 0x65, 0x08, 0x53, 0x03, 0x30, 0x43, 0x9c, 0x87, 0x3c,
0xe7, 0xaf, 0x36, 0xb9, 0x88, 0x96, 0x25, 0xc5, 0xff, 0xc3, 0x67, 0x00, 0x68, 0x47, 0xb5, 0x35,
0xda, 0x34, 0xdd, 0x6e, 0x2d, 0xb7, 0x88, 0x96, 0x73, 0x4a, 0x89, 0x43, 0xee, 0xb9, 0x5d, 0xf9,
0x87, 0x08, 0xe6, 0x36, 0x6c, 0xab, 0x77, 0x2c, 0x84, 0x90, 0x7f, 0x8b, 0x60, 0xf6, 0x96, 0x4a,
0x8f, 0x87, 0x46, 0xcf, 0x00, 0x38, 0x7a, 0x97, 0x34, 0xa9, 0xa3, 0x76, 0x7b, 0x4c, 0xab, 0x93,
0x4a, 0xc9, 0x83, 0x34, 0x3c, 0x80, 0xfc, 0x1e, 0x48, 0xd7, 0x2c, 0xcb, 0x50, 0x08, 0xed, 0x59,
0x26, 0x25, 0xf8, 0x12, 0xe4, 0xa9, 0xa3, 0x3a, 0x2e, 0xf5, 0x99, 0x3c, 0x25, 0x64, 0xb2, 0xc1,
0x50, 0x14, 0x1f, 0x15, 0xcf, 0x42, 0x6e, 0x57, 0x35, 0x5c, 0xce, 0x63, 0x51, 0xe1, 0x3f, 0xf2,
0xfb, 0x30, 0xd5, 0x70, 0x6c, 0xdd, 0x6c, 0x7f, 0x8e, 0x93, 0x97, 0x82, 0xc9, 0xff, 0x89, 0xe0,
0xc5, 0x0d, 0x42, 0x5b, 0xb6, 0xbe, 0x7d, 0x4c, 0x5c, 0x57, 0x06, 0x69, 0x00, 0xd9, 0xdc, 0x60,
0xaa, 0xce, 0x2a, 0x31, 0x58, 0xc2, 0x18, 0xb9, 0xa4, 0x31, 0x7e, 0x99, 0x81, 0xba, 0x48, 0xa8,
0x71, 0xd4, 0xf7, 0x95, 0x30, 0xa2, 0x32, 0x8c, 0xe8, 0x5c, 0x9c, 0xc8, 0xcf, 0x06, 0x83, 0xd5,
0x1a, 0x0c, 0x10, 0x06, 0x5e, 0x52, 0xaa, 0xac, 0x40, 0xaa, 0x75, 0x98, 0xdb, 0xd5, 0x6d, 0xc7,
0x55, 0x8d, 0x66, 0xab, 0xa3, 0x9a, 0x26, 0x31, 0x98, 0x9e, 0x68, 0x6d, 0x72, 0x31, 0xbb, 0x5c,
0x52, 0x66, 0xfc, 0xc1, 0xeb, 0x7c, 0xcc, 0x53, 0x16, 0xc5, 0x97, 0x61, 0xbe, 0xd7, 0xe9, 0x53,
0xbd, 0xb5, 0x8f, 0x28, 0xc7, 0x88, 0x66, 0x83, 0xd1, 0x28, 0x15, 0x8b, 0xf3, 0x3b, 0x96, 0xaa,
0x1d, 0x8f, 0x38, 0x7f, 0x8a, 0xa0, 0xa6, 0x10, 0x83, 0xa8, 0xf4, 0x78, 0xb8, 0xa0, 0xfc, 0x11,
0x82, 0xb3, 0x37, 0x89, 0x13, 0x31, 0xa6, 0xa3, 0x3a, 0x3a, 0x75, 0xf4, 0x16, 0x3d, 0x4a, 0xb6,
0x3e, 0x44, 0xf0, 0x52, 0x2a, 0x5b, 0xe3, 0xf8, 0xf6, 0x9b, 0x90, 0xf3, 0xbe, 0x68, 0x2d, 0xb3,
0x98, 0x5d, 0x2e, 0xaf, 0x2f, 0x09, 0x69, 0x6e, 0x93, 0xfe, 0xbb, 0x5e, 0xca, 0xd8, 0x52, 0x75,
0x5b, 0xe1, 0xf8, 0xf2, 0x5f, 0x10, 0xcc, 0x37, 0x3a, 0xd6, 0xde, 0x80, 0xa5, 0xe7, 0xa1, 0xa0,
0x78, 0xb4, 0x67, 0x13, 0xd1, 0x8e, 0xbf, 0x0c, 0x93, 0x4e, 0xbf, 0x47, 0x58, 0xa2, 0x98, 0x5a,
0x5f, 0x5e, 0x15, 0xec, 0xdd, 0xab, 0x09, 0x26, 0xef, 0xf7, 0x7b, 0x44, 0x61, 0x54, 0xf2, 0xaf,
0x10, 0x2c, 0xec, 0x13, 0x61, 0x1c, 0x65, 0x9e, 0x87, 0x6a, 0xc2, 0x9c, 0x5c, 0xaf, 0x25, 0x65,
0x3a, 0x6e, 0x4f, 0x8a, 0xcf, 0x41, 0xc4, 0xc4, 0x4d, 0x5d, 0xa3, 0xb5, 0xec, 0x62, 0x76, 0x39,
0xab, 0x54, 0x22, 0x69, 0x41, 0xa3, 0xf2, 0x27, 0x08, 0xe6, 0x79, 0x71, 0xb1, 0xa5, 0xda, 0x8e,
0x7e, 0xd4, 0x09, 0xfa, 0x1c, 0x4c, 0xf5, 0x02, 0x3e, 0x38, 0xde, 0x24, 0xc3, 0xab, 0x84, 0x50,
0xe6, 0xad, 0x7f, 0x40, 0x30, 0xeb, 0xd5, 0x12, 0x27, 0x89, 0xe7, 0xdf, 0x23, 0x98, 0xb9, 0xa5,
0xd2, 0x93, 0xc4, 0xf2, 0x1f, 0xfd, 0x54, 0x1e, 0xf2, 0x7c, 0x94, 0x29, 0xca, 0x43, 0x8c, 0x33,
0x1d, 0x6c, 0x5e, 0x53, 0x31, 0xae, 0xa9, 0xfc, 0xa7, 0x41, 0xce, 0x3f, 0x61, 0x9c, 0xff, 0x19,
0xc1, 0x99, 0x9b, 0xc4, 0x09, 0xb9, 0x3e, 0x16, 0x7b, 0xc3, 0xa8, 0xde, 0xf2, 0x94, 0xef, 0x6c,
0x42, 0xe6, 0x8f, 0x64, 0x07, 0xf9, 0x1d, 0x82, 0x39, 0x2f, 0xfd, 0x1e, 0x0f, 0x27, 0x18, 0xa1,
0xf6, 0x94, 0x7f, 0xe1, 0xef, 0x79, 0x51, 0x8e, 0xc7, 0x51, 0x9d, 0xc0, 0xf1, 0x32, 0x22, 0xc7,
0xf3, 0x98, 0x0b, 0x21, 0x9b, 0x1b, 0xc1, 0x5e, 0x11, 0x83, 0xc9, 0x3f, 0x42, 0x30, 0x1f, 0x54,
0xbe, 0x0d, 0xd2, 0xee, 0x12, 0xd3, 0x79, 0x76, 0x7d, 0x26, 0xb5, 0x91, 0x11, 0xd4, 0xac, 0xa7,
0xa1, 0x44, 0xf9, 0x3a, 0x61, 0x51, 0x3b, 0x00, 0xc8, 0x1f, 0x23, 0x58, 0xd8, 0xc7, 0xce, 0x38,
0xca, 0xaa, 0x41, 0x41, 0x37, 0x35, 0xf2, 0x28, 0xe4, 0x26, 0xf8, 0xf5, 0x46, 0xb6, 0x5d, 0xdd,
0xd0, 0x42, 0x36, 0x82, 0x5f, 0xbc, 0x04, 0x12, 0x31, 0xd5, 0x6d, 0x83, 0x34, 0x19, 0x2e, 0x33,
0x6a, 0x51, 0x29, 0x73, 0xd8, 0xa6, 0x07, 0x92, 0x7f, 0x8c, 0x60, 0xc6, 0xb3, 0xa9, 0xcf, 0x23,
0x7d, 0xbe, 0x3a, 0x5b, 0x84, 0x72, 0xc4, 0x68, 0x3e, 0xbb, 0x51, 0x90, 0xbc, 0x03, 0xb3, 0x71,
0x76, 0xc6, 0xd1, 0xd9, 0x59, 0x80, 0xd0, 0x22, 0xdc, 0xb7, 0xb2, 0x4a, 0x04, 0x22, 0x7f, 0x86,
0x00, 0xf3, 0xf2, 0x82, 0x29, 0xe3, 0x88, 0x0f, 0xd9, 0x0f, 0x75, 0x62, 0x68, 0xd1, 0x0c, 0x56,
0x62, 0x10, 0x36, 0xbc, 0x01, 0x12, 0x79, 0xe4, 0xd8, 0x6a, 0xb3, 0xa7, 0xda, 0x6a, 0x97, 0x1f,
0x71, 0x46, 0x4a, 0x36, 0x65, 0x46, 0xb6, 0xc5, 0xa8, 0xe4, 0xbf, 0x7a, 0x85, 0x89, 0xef, 0x94,
0xc7, 0x5d, 0xe2, 0x33, 0x00, 0xcc, 0x69, 0xf9, 0x70, 0x8e, 0x0f, 0x33, 0x08, 0x4b, 0xe7, 0x1f,
0x23, 0xa8, 0x32, 0x11, 0xb8, 0x3c, 0x3d, 0x6f, 0xda, 0x04, 0x0d, 0x4a, 0xd0, 0x0c, 0x09, 0xa1,
0x2f, 0x40, 0xde, 0x57, 0x6c, 0x76, 0x54, 0xc5, 0xfa, 0x04, 0x07, 0x88, 0x21, 0xff, 0x1a, 0xc1,
0x5c, 0x42, 0xe5, 0xe3, 0x78, 0xf4, 0x7d, 0xc0, 0x5c, 0x42, 0x6d, 0x20, 0x76, 0xb0, 0xf5, 0x9c,
0x13, 0xd6, 0xff, 0x49, 0x25, 0x29, 0x2f, 0xe8, 0x09, 0x08, 0x95, 0xff, 0x81, 0xe0, 0xf4, 0x4d,
0xe2, 0x30, 0xd4, 0x6b, 0x5e, 0xee, 0xd8, 0xb2, 0xad, 0xb6, 0x4d, 0x28, 0x3d, 0xb9, 0xfe, 0xf1,
0x33, 0x5e, 0xab, 0x88, 0x44, 0x1a, 0x47, 0xff, 0x4b, 0x20, 0xb1, 0x35, 0x88, 0xd6, 0xb4, 0xad,
0x3d, 0xea, 0xfb, 0x51, 0xd9, 0x87, 0x29, 0xd6, 0x1e, 0x73, 0x08, 0xc7, 0x72, 0x54, 0x83, 0x23,
0xf8, 0x1b, 0x03, 0x83, 0x78, 0xc3, 0x2c, 0x06, 0x03, 0xc6, 0xbc, 0xc9, 0xc9, 0xc9, 0xd5, 0xf1,
0x13, 0x04, 0x73, 0x09, 0x51, 0xc6, 0xd1, 0xed, 0x15, 0x5e, 0x49, 0x71, 0x61, 0xa6, 0xd6, 0x5f,
0x12, 0xd2, 0x44, 0x16, 0xe3, 0xd8, 0xf2, 0xa7, 0x08, 0xaa, 0xde, 0x69, 0xeb, 0x84, 0x27, 0xb4,
0xdf, 0x64, 0xa0, 0xb2, 0x69, 0x52, 0x62, 0x3b, 0xc7, 0xbf, 0x98, 0xc6, 0x6f, 0x43, 0x99, 0x09,
0x46, 0x9b, 0x9a, 0xea, 0xa8, 0xfe, 0x6e, 0x74, 0x56, 0xd8, 0x17, 0xbc, 0xe1, 0xe1, 0x6d, 0xa8,
0x8e, 0xaa, 0x70, 0xed, 0x50, 0xef, 0x1b, 0x9f, 0x82, 0x52, 0x47, 0xa5, 0x9d, 0xe6, 0x0e, 0xe9,
0xd3, 0x5a, 0x7e, 0x31, 0xbb, 0x5c, 0x51, 0x8a, 0x1e, 0xe0, 0x36, 0xe9, 0x53, 0xfc, 0x22, 0x14,
0x4d, 0xb7, 0xcb, 0xe3, 0xa7, 0xb0, 0x88, 0x96, 0x2b, 0x4a, 0xc1, 0x74, 0xbb, 0x2c, 0x7a, 0xfe,
0x96, 0x81, 0xa9, 0xbb, 0xae, 0x57, 0xba, 0xb3, 0xae, 0xa6, 0x6b, 0x38, 0xcf, 0xe6, 0x6b, 0x2b,
0x90, 0xe5, 0x25, 0x81, 0x47, 0x51, 0x13, 0x32, 0xbe, 0xb9, 0x41, 0x15, 0x0f, 0x89, 0xdd, 0x1c,
0xb8, 0xad, 0x96, 0x5f, 0x43, 0x65, 0x19, 0xb3, 0x25, 0x0f, 0xc2, 0x3c, 0xce, 0x13, 0x85, 0xd8,
0x76, 0x58, 0x61, 0x31, 0x51, 0x88, 0x6d, 0xf3, 0x41, 0x19, 0x24, 0xb5, 0xb5, 0x63, 0x5a, 0x7b,
0x06, 0xd1, 0xda, 0x44, 0x63, 0x66, 0x2f, 0x2a, 0x31, 0x18, 0x77, 0x0c, 0xcf, 0xf0, 0xcd, 0x96,
0xe9, 0xd4, 0xf2, 0x3c, 0x61, 0x70, 0xc8, 0x75, 0xd3, 0xf1, 0x86, 0x35, 0x62, 0x10, 0x87, 0xb0,
0xe1, 0x02, 0x1f, 0xe6, 0x10, 0x7f, 0xd8, 0xed, 0x85, 0xd4, 0x45, 0x3e, 0xcc, 0x21, 0xde, 0xf0,
0x69, 0x60, 0xfd, 0x22, 0xde, 0x40, 0x2a, 0x0d, 0x1a, 0x48, 0x0c, 0x20, 0xef, 0x42, 0x75, 0xcb,
0x50, 0x5b, 0xa4, 0x63, 0x19, 0x1a, 0xb1, 0xd9, 0xe6, 0x86, 0xab, 0x90, 0x75, 0xd4, 0xb6, 0xbf,
0x7b, 0x7a, 0x9f, 0xf8, 0x2d, 0xbf, 0xcd, 0xc4, 0xe3, 0xf2, 0x15, 0xe1, 0x36, 0x13, 0x99, 0x66,
0xd0, 0x62, 0xc2, 0xf3, 0x90, 0x67, 0xcd, 0x76, 0xbe, 0xaf, 0x4a, 0x8a, 0xff, 0x27, 0x3f, 0x88,
0xad, 0x7b, 0xd3, 0xb6, 0xdc, 0x1e, 0xde, 0x04, 0xa9, 0x37, 0x80, 0x79, 0xd6, 0x4c, 0xdf, 0xd4,
0x92, 0x4c, 0x2b, 0x31, 0x52, 0xf9, 0xb3, 0x2c, 0x54, 0x1a, 0x44, 0xb5, 0x5b, 0x9d, 0x93, 0x70,
0xae, 0xf6, 0x34, 0xae, 0x51, 0xc3, 0x4f, 0x09, 0xde, 0x27, 0xbe, 0x00, 0x2f, 0x44, 0x04, 0x6a,
0xb6, 0x3d, 0x05, 0x31, 0xcf, 0x90, 0x94, 0x6a, 0x2f, 0xa9, 0xb8, 0x37, 0xa1, 0xa8, 0x51, 0xa3,
0xc9, 0x4c, 0x54, 0x60, 0x26, 0x12, 0xcb, 0xb7, 0x41, 0x0d, 0x66, 0x9a, 0x82, 0xc6, 0x3f, 0xf0,
0xcb, 0x50, 0xb1, 0x5c, 0xa7, 0xe7, 0x3a, 0x4d, 0x1e, 0x99, 0xb5, 0x22, 0x63, 0x4f, 0xe2, 0x40,
0x16, 0xb8, 0x14, 0xdf, 0x80, 0x0a, 0x65, 0xaa, 0x0c, 0x4a, 0xcf, 0xd2, 0xa8, 0x15, 0x92, 0xc4,
0xe9, 0x78, 0xed, 0x89, 0xcf, 0x43, 0xd5, 0xb1, 0xd5, 0x5d, 0x62, 0x34, 0x07, 0xfe, 0x08, 0xcc,
0x1f, 0xa7, 0x39, 0xfc, 0x7e, 0x00, 0xc6, 0x6b, 0x30, 0xd3, 0x76, 0x55, 0x5b, 0x35, 0x1d, 0x42,
0x22, 0xd8, 0x65, 0x86, 0x8d, 0xc3, 0xa1, 0x90, 0x40, 0xfe, 0x57, 0x06, 0xa6, 0x15, 0xe2, 0xd8,
0x3a, 0xd9, 0x25, 0x27, 0xc2, 0xe2, 0x2b, 0x90, 0xd5, 0x35, 0xca, 0x2c, 0x3e, 0x34, 0xfd, 0xe8,
0x1a, 0xdd, 0x6f, 0xa5, 0xbc, 0xc0, 0x4a, 0x22, 0xed, 0x16, 0x0e, 0xa5, 0xdd, 0x62, 0xaa, 0x76,
0x3f, 0x41, 0x51, 0xed, 0x7a, 0x39, 0x97, 0x3e, 0x73, 0xd2, 0xf5, 0xa4, 0xce, 0x8c, 0x22, 0x75,
0x62, 0x87, 0xc9, 0x1e, 0x76, 0x87, 0x91, 0x6f, 0xc3, 0xe4, 0x2d, 0xdd, 0x61, 0xc1, 0xe5, 0x65,
0x7a, 0xc4, 0x0e, 0x7f, 0x2c, 0x9f, 0xbf, 0x08, 0x45, 0xdb, 0xda, 0xe3, 0xf3, 0x66, 0x58, 0x5a,
0x2a, 0xd8, 0xd6, 0x1e, 0xdb, 0x96, 0xd8, 0xe5, 0xb1, 0x65, 0xfb, 0xf9, 0x2a, 0xa3, 0xf8, 0x7f,
0xf2, 0xf7, 0xd0, 0x20, 0xa1, 0x8c, 0xa1, 0x80, 0xb7, 0xa1, 0x60, 0x73, 0xfa, 0xa1, 0x57, 0x69,
0xd1, 0x95, 0x98, 0x5c, 0x01, 0x95, 0xfc, 0x01, 0x02, 0xe9, 0x86, 0xe1, 0xd2, 0xe7, 0x91, 0xd7,
0x44, 0xdd, 0xfb, 0xac, 0xb0, 0x7b, 0x2f, 0xff, 0x24, 0x03, 0x15, 0x9f, 0x8d, 0x71, 0x0a, 0xbe,
0x54, 0x56, 0x1a, 0x50, 0xf6, 0x96, 0x6c, 0x52, 0xd2, 0x0e, 0xda, 0x3d, 0xe5, 0xf5, 0x75, 0xe1,
0x4e, 0x10, 0x63, 0x83, 0x5d, 0x42, 0x36, 0x18, 0xd1, 0xd7, 0x4d, 0xc7, 0xee, 0x2b, 0xd0, 0x0a,
0x01, 0xf5, 0x07, 0x30, 0x9d, 0x18, 0xf6, 0x7c, 0x63, 0x87, 0xf4, 0x83, 0xad, 0x6e, 0x87, 0xf4,
0xf1, 0xe5, 0xe8, 0x55, 0x71, 0x9a, 0xc3, 0xdd, 0xb1, 0xcc, 0xf6, 0x55, 0xdb, 0x56, 0xfb, 0xfe,
0x55, 0xf2, 0x17, 0x33, 0x6f, 0x21, 0xf9, 0xdf, 0x08, 0xa4, 0x77, 0x5c, 0x62, 0xf7, 0x8f, 0x32,
0x01, 0x61, 0x98, 0x24, 0x8f, 0x7a, 0xb6, 0x5f, 0xb4, 0xb1, 0xef, 0xfd, 0xf9, 0x23, 0x27, 0xc8,
0x1f, 0x82, 0xcc, 0x95, 0x17, 0xf6, 0x80, 0x3f, 0x18, 0x88, 0x39, 0x56, 0x20, 0xc4, 0xa2, 0x3b,
0x73, 0xe8, 0xe8, 0xfe, 0x3b, 0x82, 0xb9, 0x2d, 0x62, 0x53, 0x9d, 0x3a, 0xc4, 0x74, 0xfc, 0x6e,
0xd1, 0xa6, 0xf9, 0xd0, 0x8a, 0xb7, 0xe5, 0x50, 0xa2, 0x2d, 0xf7, 0xf9, 0x34, 0xa9, 0x62, 0x05,
0x2a, 0x6f, 0x94, 0x06, 0x05, 0x6a, 0xd0, 0x0e, 0xe6, 0x05, 0xfe, 0x54, 0xca, 0x36, 0xe9, 0xf3,
0x1b, 0x3b, 0xc6, 0xfc, 0x94, 0x5f, 0x71, 0x0a, 0x85, 0x7a, 0x76, 0x97, 0x9a, 0x07, 0xdf, 0x87,
0x12, 0x1e, 0xf5, 0x7f, 0x90, 0x70, 0x9d, 0x94, 0x8b, 0xd7, 0x9f, 0x23, 0x58, 0x4c, 0xe7, 0x6a,
0x9c, 0xe0, 0xff, 0x1a, 0xe4, 0x74, 0xf3, 0xa1, 0x15, 0x34, 0x2f, 0x56, 0xc4, 0x75, 0x9e, 0x70,
0x5d, 0x4e, 0x28, 0xff, 0x07, 0x41, 0x95, 0xb9, 0xe2, 0x11, 0x98, 0xbf, 0x4b, 0xba, 0x4d, 0xaa,
0x3f, 0x26, 0x81, 0xf9, 0xbb, 0xa4, 0xdb, 0xd0, 0x1f, 0x93, 0x98, 0x67, 0xe4, 0xe2, 0x9e, 0x11,
0x3f, 0xff, 0xe5, 0x87, 0x34, 0xa7, 0x0a, 0xb1, 0xe6, 0x94, 0xfc, 0x14, 0x41, 0xfd, 0x26, 0x71,
0x92, 0xa2, 0x1e, 0x9d, 0x53, 0x7c, 0x88, 0xe0, 0x94, 0x90, 0xa1, 0x71, 0xfc, 0xe1, 0x4b, 0x71,
0x7f, 0x10, 0xd7, 0xfd, 0xfb, 0x96, 0xf4, 0x5d, 0xe1, 0x0d, 0x90, 0x36, 0xdc, 0x6e, 0x37, 0xcc,
0xbd, 0x4b, 0x20, 0xd9, 0xfc, 0x93, 0x97, 0xc5, 0x3c, 0xc3, 0x97, 0x7d, 0x98, 0x57, 0xfc, 0xca,
0x17, 0xa0, 0xe2, 0x93, 0xf8, 0x5c, 0xd7, 0xa1, 0x68, 0xfb, 0xdf, 0x3e, 0x7e, 0xf8, 0x2f, 0xcf,
0xc1, 0x8c, 0x42, 0xda, 0x9e, 0x27, 0xda, 0x77, 0x74, 0x73, 0xc7, 0x5f, 0x46, 0x7e, 0x82, 0x60,
0x36, 0x0e, 0xf7, 0xe7, 0xfa, 0x7f, 0x28, 0xa8, 0x9a, 0x66, 0x13, 0x4a, 0x87, 0x9a, 0xe5, 0x2a,
0xc7, 0x51, 0x02, 0xe4, 0x88, 0xe6, 0x32, 0x23, 0x6b, 0x6e, 0xe5, 0x22, 0xef, 0xe0, 0x27, 0x2e,
0xf9, 0x71, 0x01, 0xb2, 0x57, 0x0d, 0xa3, 0x3a, 0x81, 0x25, 0x28, 0x6e, 0x9a, 0x77, 0x49, 0xd7,
0xb2, 0xfb, 0x55, 0xb4, 0xf2, 0x55, 0x98, 0x4e, 0x9c, 0xd5, 0x70, 0x11, 0x26, 0xef, 0x59, 0x26,
0xa9, 0x4e, 0xe0, 0x2a, 0x48, 0xd7, 0x74, 0x53, 0xb5, 0xfb, 0xef, 0x92, 0x96, 0x63, 0xd9, 0x55,
0x0d, 0x4f, 0x43, 0xf9, 0x86, 0x61, 0xa9, 0x8e, 0x0f, 0x20, 0xeb, 0x1f, 0x2d, 0x40, 0xe5, 0x2e,
0x63, 0xaa, 0x41, 0xec, 0x5d, 0xbd, 0x45, 0x70, 0x13, 0xaa, 0xc9, 0x07, 0x80, 0xf8, 0xa2, 0xd0,
0x7c, 0x29, 0xef, 0x04, 0xeb, 0xc3, 0xc4, 0x94, 0x27, 0xf0, 0xfb, 0x30, 0x15, 0x7f, 0x9a, 0x87,
0xc5, 0xd9, 0x42, 0xf8, 0x7e, 0xef, 0xa0, 0xc9, 0x9b, 0x50, 0x89, 0xbd, 0xb4, 0xc3, 0xe7, 0x85,
0x73, 0x8b, 0x5e, 0xe3, 0xd5, 0x97, 0x84, 0xa8, 0xd1, 0xd7, 0x70, 0x9c, 0xfb, 0xf8, 0x83, 0xa3,
0x14, 0xee, 0x85, 0xaf, 0x92, 0x0e, 0xe2, 0x5e, 0x85, 0x17, 0xf6, 0xbd, 0x1f, 0xc2, 0xaf, 0x09,
0xe7, 0x4f, 0x7b, 0x67, 0x74, 0xd0, 0x12, 0x7b, 0x80, 0xf7, 0xbf, 0x28, 0xc3, 0xab, 0x62, 0x0b,
0xa4, 0xbd, 0xa7, 0xab, 0xaf, 0x8d, 0x8c, 0x1f, 0x2a, 0xee, 0xfb, 0x08, 0x16, 0x52, 0x1e, 0xfd,
0xe0, 0x4b, 0xc2, 0xe9, 0x86, 0xbf, 0x5c, 0xaa, 0x5f, 0x3e, 0x1c, 0x51, 0xc8, 0x88, 0x09, 0xd3,
0x89, 0x00, 0xc3, 0x17, 0x46, 0x79, 0x6b, 0x13, 0xac, 0x7b, 0x71, 0x34, 0xe4, 0x70, 0x3d, 0xaf,
0x52, 0x8d, 0x3f, 0x7a, 0x49, 0x59, 0x4f, 0xfc, 0x34, 0xe6, 0x20, 0x83, 0xbe, 0x07, 0x95, 0xd8,
0xeb, 0x94, 0x14, 0x8f, 0x17, 0xbd, 0x60, 0x39, 0x68, 0xea, 0x07, 0x20, 0x45, 0x1f, 0x91, 0xe0,
0xe5, 0xb4, 0x58, 0xda, 0x37, 0xf1, 0x61, 0x42, 0x69, 0x70, 0xff, 0x3c, 0x24, 0x94, 0xf6, 0x5d,
0xab, 0x8f, 0x1e, 0x4a, 0x91, 0xf9, 0x87, 0x86, 0xd2, 0xa1, 0x97, 0x78, 0x82, 0x60, 0x5e, 0xfc,
0x06, 0x01, 0xaf, 0xa7, 0xf9, 0x66, 0xfa, 0x6b, 0x8b, 0xfa, 0xa5, 0x43, 0xd1, 0x84, 0x5a, 0xdc,
0x81, 0xa9, 0xf8, 0x2d, 0x7e, 0x8a, 0x16, 0x85, 0x8f, 0x13, 0xea, 0x17, 0x46, 0xc2, 0x0d, 0x17,
0xfb, 0x26, 0x94, 0x23, 0x37, 0xac, 0xf8, 0xd5, 0x21, 0x7e, 0x1c, 0x6d, 0xe0, 0x1f, 0xa4, 0xc9,
0x0e, 0x54, 0x62, 0xb7, 0x6a, 0x69, 0x3e, 0x2c, 0xb8, 0xec, 0xac, 0xaf, 0x8c, 0x82, 0x1a, 0x0a,
0xd0, 0x81, 0x4a, 0xec, 0x8e, 0x23, 0x65, 0x25, 0xd1, 0x95, 0x4e, 0xca, 0x4a, 0xc2, 0x2b, 0x13,
0x79, 0x02, 0x7f, 0x37, 0x72, 0x9d, 0x12, 0xbb, 0xb2, 0xc2, 0x6f, 0x0c, 0x9d, 0x47, 0x74, 0x63,
0x57, 0x5f, 0x3f, 0x0c, 0x49, 0xc8, 0xc2, 0x3b, 0x50, 0x0a, 0xaf, 0x52, 0xf0, 0xb9, 0xd4, 0xb4,
0x70, 0x18, 0x4b, 0x35, 0x20, 0xcf, 0xaf, 0x35, 0xb0, 0x9c, 0x72, 0x3f, 0x19, 0xb9, 0xf3, 0xa8,
0xbf, 0x2c, 0xc4, 0x89, 0x77, 0xfc, 0xe5, 0x09, 0xac, 0x40, 0x9e, 0x37, 0x49, 0x52, 0x26, 0x8d,
0x35, 0x7f, 0xeb, 0xc3, 0x71, 0x78, 0x67, 0x65, 0x02, 0x7f, 0x0b, 0x8a, 0x41, 0x97, 0x0b, 0xbf,
0x92, 0x12, 0xf6, 0xb1, 0x16, 0x63, 0xfd, 0x20, 0xac, 0x60, 0xe6, 0x2d, 0xc8, 0xb1, 0x36, 0x05,
0x5e, 0x1a, 0xd6, 0xc2, 0x18, 0xc6, 0x6b, 0xac, 0xcb, 0x21, 0x4f, 0xe0, 0x6f, 0x40, 0x8e, 0x95,
0xc2, 0x29, 0x33, 0x46, 0xfb, 0x10, 0xf5, 0xa1, 0x28, 0x01, 0x8b, 0x3f, 0x40, 0x50, 0x4b, 0x3b,
0xe7, 0xe1, 0xd4, 0x7d, 0x73, 0xd8, 0x61, 0xb5, 0x7e, 0xe5, 0x90, 0x54, 0xa1, 0x70, 0x8f, 0x61,
0x46, 0x70, 0xba, 0xc0, 0x6b, 0x69, 0xf3, 0xa5, 0x1c, 0x8c, 0xea, 0xaf, 0x8f, 0x4e, 0x10, 0xae,
0xbd, 0x05, 0x39, 0x76, 0x2a, 0x48, 0x51, 0x6c, 0xf4, 0x90, 0x91, 0x62, 0xaa, 0xd8, 0xa1, 0x42,
0x9e, 0xc0, 0x04, 0xa4, 0xe8, 0x11, 0x21, 0x65, 0x4b, 0x14, 0x9c, 0x2e, 0xea, 0xe7, 0x47, 0xc0,
0x0c, 0x96, 0x59, 0x77, 0x41, 0xda, 0xb2, 0xad, 0x47, 0xfd, 0xa0, 0x28, 0xff, 0xdf, 0x2c, 0x7b,
0xed, 0xca, 0xb7, 0x2f, 0xb5, 0x75, 0xa7, 0xe3, 0x6e, 0x7b, 0x71, 0xbf, 0xc6, 0x71, 0x5f, 0xd3,
0x2d, 0xff, 0x6b, 0x4d, 0x37, 0x1d, 0x62, 0x9b, 0xaa, 0xb1, 0xc6, 0xe6, 0xf2, 0xa1, 0xbd, 0xed,
0xed, 0x3c, 0xfb, 0xbf, 0xf4, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x10, 0x05, 0x53, 0xed, 0x7c,
0x34, 0x00, 0x00,
// 2868 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3a, 0xcd, 0x6f, 0x24, 0x47,
0xf5, 0xae, 0x19, 0xcf, 0xd7, 0x9b, 0x1e, 0x7b, 0x52, 0x5e, 0x7b, 0x27, 0x93, 0xdd, 0xc4, 0xdb,
0xc9, 0xfe, 0xe2, 0xdd, 0x4d, 0x76, 0x13, 0x6f, 0xf2, 0x4b, 0x48, 0x02, 0xc9, 0xee, 0x9a, 0xec,
0x5a, 0xd9, 0x0d, 0x4e, 0x3b, 0x44, 0x84, 0x28, 0x1a, 0xb5, 0xa7, 0xcb, 0x33, 0x2d, 0xf7, 0x74,
0x0f, 0x5d, 0x35, 0xf6, 0x4e, 0x4e, 0x48, 0x09, 0x48, 0x08, 0x48, 0x84, 0x40, 0x20, 0x38, 0x20,
0x04, 0xca, 0x81, 0x13, 0x44, 0x41, 0x42, 0xe2, 0xc4, 0x21, 0x07, 0x0e, 0x48, 0x7c, 0x5c, 0xb9,
0xc2, 0x31, 0xff, 0x00, 0xe2, 0x80, 0xaa, 0xaa, 0xbb, 0xa7, 0xbb, 0x5d, 0x3d, 0x1e, 0xef, 0x24,
0xd8, 0xbe, 0x75, 0xbf, 0x7a, 0xaf, 0xea, 0x7d, 0xd5, 0xab, 0x57, 0xaf, 0x1e, 0x68, 0x3d, 0xdb,
0xd9, 0x1d, 0xd0, 0xcb, 0x7d, 0xdf, 0x63, 0x1e, 0x5e, 0x88, 0xff, 0x5d, 0x96, 0x3f, 0x4d, 0xad,
0xed, 0xf5, 0x7a, 0x9e, 0x2b, 0x81, 0x4d, 0x8d, 0xb6, 0xbb, 0xa4, 0x67, 0xca, 0x3f, 0xfd, 0x13,
0x04, 0xa7, 0x6f, 0xf8, 0xc4, 0x64, 0xe4, 0x86, 0xe7, 0x38, 0xa4, 0xcd, 0x6c, 0xcf, 0x35, 0xc8,
0x37, 0x06, 0x84, 0x32, 0xfc, 0x04, 0xcc, 0x6e, 0x99, 0x94, 0x34, 0xd0, 0x32, 0x5a, 0xa9, 0xae,
0x9e, 0xb9, 0x9c, 0x98, 0x3b, 0x98, 0xf3, 0x0e, 0xed, 0x5c, 0x37, 0x29, 0x31, 0x04, 0x26, 0x3e,
0x0d, 0x25, 0x6b, 0xab, 0xe5, 0x9a, 0x3d, 0xd2, 0xc8, 0x2d, 0xa3, 0x95, 0x8a, 0x51, 0xb4, 0xb6,
0x5e, 0x35, 0x7b, 0x04, 0x3f, 0x0a, 0xf3, 0xed, 0x68, 0x7e, 0x89, 0x90, 0x17, 0x08, 0x73, 0x23,
0xb0, 0x40, 0x5c, 0x82, 0xa2, 0xe4, 0xaf, 0x31, 0xbb, 0x8c, 0x56, 0x34, 0x23, 0xf8, 0xc3, 0x67,
0x01, 0x68, 0xd7, 0xf4, 0x2d, 0xda, 0x72, 0x07, 0xbd, 0x46, 0x61, 0x19, 0xad, 0x14, 0x8c, 0x8a,
0x84, 0xbc, 0x3a, 0xe8, 0xe9, 0xdf, 0x45, 0xb0, 0xb8, 0xe6, 0x7b, 0xfd, 0x63, 0x21, 0x84, 0xfe,
0x6b, 0x04, 0xa7, 0x6e, 0x99, 0xf4, 0x78, 0x68, 0xf4, 0x2c, 0x00, 0xb3, 0x7b, 0xa4, 0x45, 0x99,
0xd9, 0xeb, 0x0b, 0xad, 0xce, 0x1a, 0x15, 0x0e, 0xd9, 0xe4, 0x00, 0xfd, 0x4d, 0xd0, 0xae, 0x7b,
0x9e, 0x63, 0x10, 0xda, 0xf7, 0x5c, 0x4a, 0xf0, 0x55, 0x28, 0x52, 0x66, 0xb2, 0x01, 0x0d, 0x98,
0x7c, 0x40, 0xc9, 0xe4, 0xa6, 0x40, 0x31, 0x02, 0x54, 0x7c, 0x0a, 0x0a, 0xbb, 0xa6, 0x33, 0x90,
0x3c, 0x96, 0x0d, 0xf9, 0xa3, 0xbf, 0x05, 0x73, 0x9b, 0xcc, 0xb7, 0xdd, 0xce, 0x67, 0x38, 0x79,
0x25, 0x9c, 0xfc, 0xef, 0x08, 0xee, 0x5f, 0x23, 0xb4, 0xed, 0xdb, 0x5b, 0xc7, 0xc4, 0x75, 0x75,
0xd0, 0x46, 0x90, 0xf5, 0x35, 0xa1, 0xea, 0xbc, 0x91, 0x80, 0xa5, 0x8c, 0x51, 0x48, 0x1b, 0xe3,
0xe7, 0x39, 0x68, 0xaa, 0x84, 0x9a, 0x46, 0x7d, 0x5f, 0x8c, 0x76, 0x54, 0x4e, 0x10, 0x9d, 0x4f,
0x12, 0x05, 0xd1, 0x60, 0xb4, 0xda, 0xa6, 0x00, 0x44, 0x1b, 0x2f, 0x2d, 0x55, 0x5e, 0x21, 0xd5,
0x2a, 0x2c, 0xee, 0xda, 0x3e, 0x1b, 0x98, 0x4e, 0xab, 0xdd, 0x35, 0x5d, 0x97, 0x38, 0x42, 0x4f,
0xb4, 0x31, 0xbb, 0x9c, 0x5f, 0xa9, 0x18, 0x0b, 0xc1, 0xe0, 0x0d, 0x39, 0xc6, 0x95, 0x45, 0xf1,
0x53, 0xb0, 0xd4, 0xef, 0x0e, 0xa9, 0xdd, 0xde, 0x47, 0x54, 0x10, 0x44, 0xa7, 0xc2, 0xd1, 0x38,
0x95, 0xd8, 0xe7, 0xb7, 0x3d, 0xd3, 0x3a, 0x1e, 0xfb, 0xfc, 0x7d, 0x04, 0x0d, 0x83, 0x38, 0xc4,
0xa4, 0xc7, 0xc3, 0x05, 0xf5, 0x1f, 0x21, 0x78, 0xf0, 0x26, 0x61, 0x31, 0x63, 0x32, 0x93, 0xd9,
0x94, 0xd9, 0x6d, 0x7a, 0x94, 0x6c, 0x7d, 0x80, 0xe0, 0xa1, 0x4c, 0xb6, 0xa6, 0xf1, 0xed, 0x67,
0xa0, 0xc0, 0xbf, 0x68, 0x23, 0xb7, 0x9c, 0x5f, 0xa9, 0xae, 0x9e, 0x53, 0xd2, 0xbc, 0x42, 0x86,
0x6f, 0xf0, 0x90, 0xb1, 0x61, 0xda, 0xbe, 0x21, 0xf1, 0xf5, 0x3f, 0x22, 0x58, 0xda, 0xec, 0x7a,
0x7b, 0x23, 0x96, 0x3e, 0x0f, 0x05, 0x25, 0x77, 0x7b, 0x3e, 0xb5, 0xdb, 0xf1, 0x0b, 0x30, 0xcb,
0x86, 0x7d, 0x22, 0x02, 0xc5, 0xdc, 0xea, 0xca, 0x65, 0xc5, 0xd9, 0x7d, 0x39, 0xc5, 0xe4, 0xeb,
0xc3, 0x3e, 0x31, 0x04, 0x95, 0xfe, 0x0b, 0x04, 0xa7, 0xf7, 0x89, 0x30, 0x8d, 0x32, 0x2f, 0x40,
0x3d, 0x65, 0x4e, 0xa9, 0xd7, 0x8a, 0x31, 0x9f, 0xb4, 0x27, 0xc5, 0xe7, 0x21, 0x66, 0xe2, 0x96,
0x6d, 0xd1, 0x46, 0x7e, 0x39, 0xbf, 0x92, 0x37, 0x6a, 0xb1, 0xb0, 0x60, 0x51, 0xfd, 0x63, 0x04,
0x4b, 0x32, 0xb9, 0xd8, 0x30, 0x7d, 0x66, 0x1f, 0x75, 0x80, 0x3e, 0x0f, 0x73, 0xfd, 0x90, 0x0f,
0x89, 0x37, 0x2b, 0xf0, 0x6a, 0x11, 0x54, 0x78, 0xeb, 0x47, 0x08, 0x4e, 0xf1, 0x5c, 0xe2, 0x24,
0xf1, 0xfc, 0x5b, 0x04, 0x0b, 0xb7, 0x4c, 0x7a, 0x92, 0x58, 0xfe, 0x5d, 0x10, 0xca, 0x23, 0x9e,
0x8f, 0x32, 0x44, 0x71, 0xc4, 0x24, 0xd3, 0xe1, 0xe1, 0x35, 0x97, 0xe0, 0x9a, 0xea, 0xbf, 0x1f,
0xc5, 0xfc, 0x13, 0xc6, 0xf9, 0x1f, 0x10, 0x9c, 0xbd, 0x49, 0x58, 0xc4, 0xf5, 0xb1, 0x38, 0x1b,
0x26, 0xf5, 0x96, 0xf7, 0xe5, 0xc9, 0xa6, 0x64, 0xfe, 0x48, 0x4e, 0x90, 0xdf, 0x20, 0x58, 0xe4,
0xe1, 0xf7, 0x78, 0x38, 0xc1, 0x04, 0xb9, 0xa7, 0xfe, 0xb3, 0xe0, 0xcc, 0x8b, 0x73, 0x3c, 0x8d,
0xea, 0x14, 0x8e, 0x97, 0x53, 0x39, 0x1e, 0x67, 0x2e, 0x82, 0xac, 0xaf, 0x85, 0x67, 0x45, 0x02,
0xa6, 0x7f, 0x0f, 0xc1, 0x52, 0x98, 0xf9, 0x6e, 0x92, 0x4e, 0x8f, 0xb8, 0xec, 0xde, 0xf5, 0x99,
0xd6, 0x46, 0x4e, 0x91, 0xb3, 0x9e, 0x81, 0x0a, 0x95, 0xeb, 0x44, 0x49, 0xed, 0x08, 0xa0, 0x7f,
0x88, 0xe0, 0xf4, 0x3e, 0x76, 0xa6, 0x51, 0x56, 0x03, 0x4a, 0xb6, 0x6b, 0x91, 0xbb, 0x11, 0x37,
0xe1, 0x2f, 0x1f, 0xd9, 0x1a, 0xd8, 0x8e, 0x15, 0xb1, 0x11, 0xfe, 0xe2, 0x73, 0xa0, 0x11, 0xd7,
0xdc, 0x72, 0x48, 0x4b, 0xe0, 0x0a, 0xa3, 0x96, 0x8d, 0xaa, 0x84, 0xad, 0x73, 0x90, 0xfe, 0x7d,
0x04, 0x0b, 0xdc, 0xa6, 0x01, 0x8f, 0xf4, 0xf3, 0xd5, 0xd9, 0x32, 0x54, 0x63, 0x46, 0x0b, 0xd8,
0x8d, 0x83, 0xf4, 0x1d, 0x38, 0x95, 0x64, 0x67, 0x1a, 0x9d, 0x3d, 0x08, 0x10, 0x59, 0x44, 0xfa,
0x56, 0xde, 0x88, 0x41, 0xf4, 0x4f, 0x11, 0x60, 0x99, 0x5e, 0x08, 0x65, 0x1c, 0xf1, 0x25, 0x7b,
0xdb, 0x26, 0x8e, 0x15, 0x8f, 0x60, 0x15, 0x01, 0x11, 0xc3, 0x6b, 0xa0, 0x91, 0xbb, 0xcc, 0x37,
0x5b, 0x7d, 0xd3, 0x37, 0x7b, 0xf2, 0x8a, 0x33, 0x51, 0xb0, 0xa9, 0x0a, 0xb2, 0x0d, 0x41, 0xa5,
0xff, 0x89, 0x27, 0x26, 0x81, 0x53, 0x1e, 0x77, 0x89, 0xcf, 0x02, 0x08, 0xa7, 0x95, 0xc3, 0x05,
0x39, 0x2c, 0x20, 0x22, 0x9c, 0x7f, 0x88, 0xa0, 0x2e, 0x44, 0x90, 0xf2, 0xf4, 0xf9, 0xb4, 0x29,
0x1a, 0x94, 0xa2, 0x19, 0xb3, 0x85, 0xbe, 0x00, 0xc5, 0x40, 0xb1, 0xf9, 0x49, 0x15, 0x1b, 0x10,
0x1c, 0x20, 0x86, 0xfe, 0x4b, 0x04, 0x8b, 0x29, 0x95, 0x4f, 0xe3, 0xd1, 0xaf, 0x03, 0x96, 0x12,
0x5a, 0x23, 0xb1, 0xc3, 0xa3, 0xe7, 0xbc, 0x32, 0xff, 0x4f, 0x2b, 0xc9, 0xb8, 0xcf, 0x4e, 0x41,
0xa8, 0xfe, 0x57, 0x04, 0x67, 0x6e, 0x12, 0x26, 0x50, 0xaf, 0xf3, 0xd8, 0xb1, 0xe1, 0x7b, 0x1d,
0x9f, 0x50, 0x7a, 0x72, 0xfd, 0xe3, 0xc7, 0x32, 0x57, 0x51, 0x89, 0x34, 0x8d, 0xfe, 0xcf, 0x81,
0x26, 0xd6, 0x20, 0x56, 0xcb, 0xf7, 0xf6, 0x68, 0xe0, 0x47, 0xd5, 0x00, 0x66, 0x78, 0x7b, 0xc2,
0x21, 0x98, 0xc7, 0x4c, 0x47, 0x22, 0x04, 0x07, 0x83, 0x80, 0xf0, 0x61, 0xb1, 0x07, 0x43, 0xc6,
0xf8, 0xe4, 0xe4, 0xe4, 0xea, 0xf8, 0x5d, 0x04, 0x8b, 0x29, 0x51, 0xa6, 0xd1, 0xed, 0xd3, 0x32,
0x93, 0x92, 0xc2, 0xcc, 0xad, 0x3e, 0xa4, 0xa4, 0x89, 0x2d, 0x26, 0xb1, 0xf5, 0x4f, 0x10, 0xd4,
0xf9, 0x6d, 0xeb, 0x84, 0x07, 0xb4, 0x5f, 0xe5, 0xa0, 0xb6, 0xee, 0x52, 0xe2, 0xb3, 0xe3, 0x9f,
0x4c, 0xe3, 0x17, 0xa1, 0x2a, 0x04, 0xa3, 0x2d, 0xcb, 0x64, 0x66, 0x70, 0x1a, 0x3d, 0xa8, 0xac,
0x0b, 0xbe, 0xcc, 0xf1, 0xd6, 0x4c, 0x66, 0x1a, 0x52, 0x3b, 0x94, 0x7f, 0xe3, 0x07, 0xa0, 0xd2,
0x35, 0x69, 0xb7, 0xb5, 0x43, 0x86, 0xb4, 0x51, 0x5c, 0xce, 0xaf, 0xd4, 0x8c, 0x32, 0x07, 0xbc,
0x42, 0x86, 0x14, 0xdf, 0x0f, 0x65, 0x77, 0xd0, 0x93, 0xfb, 0xa7, 0xb4, 0x8c, 0x56, 0x6a, 0x46,
0xc9, 0x1d, 0xf4, 0xc4, 0xee, 0xf9, 0x73, 0x0e, 0xe6, 0xee, 0x0c, 0x78, 0xea, 0x2e, 0xaa, 0x9a,
0x03, 0x87, 0xdd, 0x9b, 0xaf, 0x5d, 0x84, 0xbc, 0x4c, 0x09, 0x38, 0x45, 0x43, 0xc9, 0xf8, 0xfa,
0x1a, 0x35, 0x38, 0x92, 0x78, 0x39, 0x18, 0xb4, 0xdb, 0x41, 0x0e, 0x95, 0x17, 0xcc, 0x56, 0x38,
0x44, 0x78, 0x1c, 0x17, 0x85, 0xf8, 0x7e, 0x94, 0x61, 0x09, 0x51, 0x88, 0xef, 0xcb, 0x41, 0x1d,
0x34, 0xb3, 0xbd, 0xe3, 0x7a, 0x7b, 0x0e, 0xb1, 0x3a, 0xc4, 0x12, 0x66, 0x2f, 0x1b, 0x09, 0x98,
0x74, 0x0c, 0x6e, 0xf8, 0x56, 0xdb, 0x65, 0x8d, 0xa2, 0x0c, 0x18, 0x12, 0x72, 0xc3, 0x65, 0x7c,
0xd8, 0x22, 0x0e, 0x61, 0x44, 0x0c, 0x97, 0xe4, 0xb0, 0x84, 0x04, 0xc3, 0x83, 0x7e, 0x44, 0x5d,
0x96, 0xc3, 0x12, 0xc2, 0x87, 0xcf, 0x80, 0xa8, 0x17, 0xc9, 0x02, 0x52, 0x65, 0x54, 0x40, 0x12,
0x00, 0x7d, 0x17, 0xea, 0x1b, 0x8e, 0xd9, 0x26, 0x5d, 0xcf, 0xb1, 0x88, 0x2f, 0x0e, 0x37, 0x5c,
0x87, 0x3c, 0x33, 0x3b, 0xc1, 0xe9, 0xc9, 0x3f, 0xf1, 0xb3, 0x41, 0x99, 0x49, 0xee, 0xcb, 0x47,
0x94, 0xc7, 0x4c, 0x6c, 0x9a, 0x51, 0x89, 0x09, 0x2f, 0x41, 0x51, 0x14, 0xdb, 0xe5, 0xb9, 0xaa,
0x19, 0xc1, 0x9f, 0xfe, 0x76, 0x62, 0xdd, 0x9b, 0xbe, 0x37, 0xe8, 0xe3, 0x75, 0xd0, 0xfa, 0x23,
0x18, 0xb7, 0x66, 0xf6, 0xa1, 0x96, 0x66, 0xda, 0x48, 0x90, 0xea, 0x9f, 0xe6, 0xa1, 0xb6, 0x49,
0x4c, 0xbf, 0xdd, 0x3d, 0x09, 0xf7, 0x6a, 0xae, 0x71, 0x8b, 0x3a, 0x41, 0x48, 0xe0, 0x9f, 0xf8,
0x12, 0xdc, 0x17, 0x13, 0xa8, 0xd5, 0xe1, 0x0a, 0x12, 0x9e, 0xa1, 0x19, 0xf5, 0x7e, 0x5a, 0x71,
0xcf, 0x40, 0xd9, 0xa2, 0x4e, 0x4b, 0x98, 0xa8, 0x24, 0x4c, 0xa4, 0x96, 0x6f, 0x8d, 0x3a, 0xc2,
0x34, 0x25, 0x4b, 0x7e, 0xe0, 0x87, 0xa1, 0xe6, 0x0d, 0x58, 0x7f, 0xc0, 0x5a, 0x72, 0x67, 0x36,
0xca, 0x82, 0x3d, 0x4d, 0x02, 0xc5, 0xc6, 0xa5, 0xf8, 0x65, 0xa8, 0x51, 0xa1, 0xca, 0x30, 0xf5,
0xac, 0x4c, 0x9a, 0x21, 0x69, 0x92, 0x4e, 0xe6, 0x9e, 0xf8, 0x02, 0xd4, 0x99, 0x6f, 0xee, 0x12,
0xa7, 0x35, 0xf2, 0x47, 0x10, 0xfe, 0x38, 0x2f, 0xe1, 0xaf, 0x87, 0x60, 0x7c, 0x05, 0x16, 0x3a,
0x03, 0xd3, 0x37, 0x5d, 0x46, 0x48, 0x0c, 0xbb, 0x2a, 0xb0, 0x71, 0x34, 0x14, 0x11, 0xe8, 0xff,
0xc8, 0xc1, 0xbc, 0x41, 0x98, 0x6f, 0x93, 0x5d, 0x72, 0x22, 0x2c, 0x7e, 0x11, 0xf2, 0xb6, 0x45,
0x85, 0xc5, 0xc7, 0x86, 0x1f, 0xdb, 0xa2, 0xfb, 0xad, 0x54, 0x54, 0x58, 0x49, 0xa5, 0xdd, 0xd2,
0xa1, 0xb4, 0x5b, 0xce, 0xd4, 0xee, 0xc7, 0x28, 0xae, 0x5d, 0x1e, 0x73, 0xe9, 0x3d, 0x07, 0x5d,
0x2e, 0x75, 0x6e, 0x12, 0xa9, 0x53, 0x27, 0x4c, 0xfe, 0xb0, 0x27, 0x8c, 0xfe, 0x0a, 0xcc, 0xde,
0xb2, 0x99, 0xd8, 0x5c, 0x3c, 0xd2, 0x23, 0x71, 0xf9, 0x13, 0xf1, 0xfc, 0x7e, 0x28, 0xfb, 0xde,
0x9e, 0x9c, 0x37, 0x27, 0xc2, 0x52, 0xc9, 0xf7, 0xf6, 0xc4, 0xb1, 0x24, 0x1e, 0x8f, 0x3d, 0x3f,
0x88, 0x57, 0x39, 0x23, 0xf8, 0xd3, 0xbf, 0x85, 0x46, 0x01, 0x65, 0x0a, 0x05, 0xbc, 0x08, 0x25,
0x5f, 0xd2, 0x8f, 0x7d, 0x4a, 0x8b, 0xaf, 0x24, 0xe4, 0x0a, 0xa9, 0xf4, 0xf7, 0x10, 0x68, 0x2f,
0x3b, 0x03, 0xfa, 0x79, 0xc4, 0x35, 0x55, 0xf5, 0x3e, 0xaf, 0xac, 0xde, 0xeb, 0x3f, 0xc8, 0x41,
0x2d, 0x60, 0x63, 0x9a, 0x84, 0x2f, 0x93, 0x95, 0x4d, 0xa8, 0xf2, 0x25, 0x5b, 0x94, 0x74, 0xc2,
0x72, 0x4f, 0x75, 0x75, 0x55, 0x79, 0x12, 0x24, 0xd8, 0x10, 0x8f, 0x90, 0x9b, 0x82, 0xe8, 0xcb,
0x2e, 0xf3, 0x87, 0x06, 0xb4, 0x23, 0x40, 0xf3, 0x6d, 0x98, 0x4f, 0x0d, 0x73, 0xdf, 0xd8, 0x21,
0xc3, 0xf0, 0xa8, 0xdb, 0x21, 0x43, 0xfc, 0x54, 0xfc, 0xa9, 0x38, 0xcb, 0xe1, 0x6e, 0x7b, 0x6e,
0xe7, 0x9a, 0xef, 0x9b, 0xc3, 0xe0, 0x29, 0xf9, 0xb9, 0xdc, 0xb3, 0x48, 0xff, 0x27, 0x02, 0xed,
0xb5, 0x01, 0xf1, 0x87, 0x47, 0x19, 0x80, 0x30, 0xcc, 0x92, 0xbb, 0x7d, 0x3f, 0x48, 0xda, 0xc4,
0xf7, 0xfe, 0xf8, 0x51, 0x50, 0xc4, 0x0f, 0x45, 0xe4, 0x2a, 0x2a, 0x6b, 0xc0, 0xef, 0x8d, 0xc4,
0x9c, 0x6a, 0x23, 0x24, 0x76, 0x77, 0xee, 0xd0, 0xbb, 0xfb, 0x23, 0x04, 0x95, 0x37, 0x48, 0x9b,
0x79, 0x3e, 0xdf, 0xd1, 0x0a, 0xfd, 0xa0, 0x09, 0x52, 0xf4, 0x5c, 0x3a, 0x45, 0xbf, 0x0a, 0x65,
0xdb, 0x6a, 0x99, 0xdc, 0xb4, 0x42, 0xc1, 0xe3, 0xa2, 0x54, 0xc9, 0xb6, 0x84, 0x0f, 0x4c, 0x5e,
0x3e, 0xff, 0x09, 0x02, 0x4d, 0xf2, 0x4c, 0x25, 0xe5, 0xf3, 0xb1, 0xe5, 0x90, 0xca, 0xdf, 0x82,
0x9f, 0x48, 0xd0, 0x5b, 0x33, 0xa3, 0x65, 0xaf, 0x01, 0x70, 0xdd, 0x05, 0xe4, 0xd2, 0x5d, 0x97,
0x95, 0xdc, 0x4a, 0x72, 0xa1, 0xc7, 0x5b, 0x33, 0x46, 0x85, 0x53, 0x89, 0x29, 0xae, 0x97, 0xa0,
0x20, 0xa8, 0xf5, 0xff, 0x20, 0x58, 0xb8, 0x61, 0x3a, 0xed, 0x35, 0x9b, 0x32, 0xd3, 0x6d, 0x4f,
0x71, 0x86, 0x3e, 0x07, 0x25, 0xaf, 0xdf, 0x72, 0xc8, 0x36, 0x0b, 0x58, 0x3a, 0x37, 0x46, 0x22,
0xa9, 0x06, 0xa3, 0xe8, 0xf5, 0x6f, 0x93, 0x6d, 0x86, 0x5f, 0x80, 0xb2, 0xd7, 0x6f, 0xf9, 0x76,
0xa7, 0xcb, 0x02, 0xed, 0x4f, 0x40, 0x5c, 0xf2, 0xfa, 0x06, 0xa7, 0x88, 0x95, 0x70, 0x66, 0x0f,
0x59, 0xc2, 0xd1, 0xff, 0xb6, 0x4f, 0xfc, 0x29, 0x5c, 0xfb, 0x39, 0x28, 0xdb, 0x2e, 0x6b, 0x59,
0x36, 0x0d, 0x55, 0x70, 0x56, 0xed, 0x43, 0x2e, 0x13, 0x12, 0x08, 0x9b, 0xba, 0x8c, 0xaf, 0x8d,
0x5f, 0x02, 0xd8, 0x76, 0x3c, 0x33, 0xa0, 0x96, 0x3a, 0x78, 0x48, 0xbd, 0x2b, 0x38, 0x5a, 0x48,
0x5f, 0x11, 0x44, 0x7c, 0x86, 0x91, 0x49, 0xff, 0x82, 0x60, 0x71, 0x83, 0xf8, 0xd4, 0xa6, 0x8c,
0xb8, 0x2c, 0x28, 0xa7, 0xae, 0xbb, 0xdb, 0x5e, 0xb2, 0x6e, 0x8d, 0x52, 0x75, 0xeb, 0xcf, 0xa6,
0x8a, 0x9b, 0xb8, 0xc1, 0xc9, 0x97, 0x84, 0xf0, 0x06, 0x17, 0xbe, 0x97, 0xc8, 0x1b, 0xf0, 0x5c,
0x86, 0x99, 0x02, 0x7e, 0x13, 0xf7, 0xfc, 0x1f, 0xca, 0x1e, 0x00, 0xa5, 0x50, 0xf7, 0xee, 0xb0,
0x4b, 0x10, 0x04, 0xd9, 0x54, 0xc8, 0xfd, 0x3f, 0x48, 0xc5, 0x8e, 0x8c, 0xce, 0x84, 0x9f, 0x22,
0x58, 0xce, 0xe6, 0x6a, 0x9a, 0xd3, 0xf1, 0x25, 0x28, 0xd8, 0xee, 0xb6, 0x17, 0x56, 0xf7, 0x2e,
0xaa, 0x2f, 0x42, 0xca, 0x75, 0x25, 0xa1, 0xfe, 0x2f, 0x04, 0x75, 0x11, 0xab, 0x8f, 0xc0, 0xfc,
0x3d, 0xd2, 0x6b, 0x51, 0xfb, 0x1d, 0x12, 0x9a, 0xbf, 0x47, 0x7a, 0x9b, 0xf6, 0x3b, 0x24, 0xe1,
0x19, 0x85, 0xa4, 0x67, 0x24, 0x0b, 0x24, 0xc5, 0x31, 0xd5, 0xdb, 0x52, 0xa2, 0x7a, 0xab, 0xbf,
0x8f, 0xa0, 0x79, 0x93, 0xb0, 0xb4, 0xa8, 0x47, 0xe7, 0x14, 0x1f, 0x20, 0x78, 0x40, 0xc9, 0xd0,
0x34, 0xfe, 0xf0, 0x7c, 0xd2, 0x1f, 0xd4, 0x17, 0xe3, 0x7d, 0x4b, 0x06, 0xae, 0xf0, 0x24, 0x68,
0x6b, 0x83, 0x5e, 0x2f, 0x4a, 0x4e, 0xce, 0x81, 0xe6, 0xcb, 0x4f, 0x79, 0x6f, 0x94, 0xc7, 0x65,
0x35, 0x80, 0xf1, 0xdb, 0xa1, 0x7e, 0x09, 0x6a, 0x01, 0x49, 0xc0, 0x75, 0x13, 0xca, 0x7e, 0xf0,
0x1d, 0xe0, 0x47, 0xff, 0xfa, 0x22, 0x2c, 0x18, 0xa4, 0xc3, 0x3d, 0xd1, 0xbf, 0x6d, 0xbb, 0x3b,
0xc1, 0x32, 0xfa, 0xbb, 0x08, 0x4e, 0x25, 0xe1, 0xc1, 0x5c, 0xff, 0x0f, 0x25, 0xd3, 0xb2, 0x7c,
0x42, 0xe9, 0x58, 0xb3, 0x5c, 0x93, 0x38, 0x46, 0x88, 0x1c, 0xd3, 0x5c, 0x6e, 0x62, 0xcd, 0x5d,
0x7c, 0x4c, 0x3e, 0x71, 0xa5, 0xba, 0x60, 0x70, 0x09, 0xf2, 0xd7, 0x1c, 0xa7, 0x3e, 0x83, 0x35,
0x28, 0xaf, 0xbb, 0x77, 0x48, 0xcf, 0xf3, 0x87, 0x75, 0x74, 0xf1, 0x4b, 0x30, 0x9f, 0x2a, 0x66,
0xe0, 0x32, 0xcc, 0xbe, 0xea, 0xb9, 0xa4, 0x3e, 0x83, 0xeb, 0xa0, 0x5d, 0xb7, 0x5d, 0xd3, 0x1f,
0xca, 0x43, 0xa8, 0x6e, 0xe1, 0x79, 0xa8, 0x8a, 0x60, 0x1c, 0x00, 0xc8, 0xea, 0xbf, 0x4f, 0x43,
0xed, 0x8e, 0x60, 0x6a, 0x93, 0xf8, 0xbb, 0x76, 0x9b, 0xe0, 0x16, 0xd4, 0xd3, 0x1d, 0xb2, 0xf8,
0x31, 0xa5, 0xf9, 0x32, 0x1a, 0x69, 0x9b, 0xe3, 0xc4, 0xd4, 0x67, 0xf0, 0x5b, 0x30, 0x97, 0xec,
0x5d, 0xc5, 0xea, 0x68, 0xa1, 0x6c, 0x70, 0x3d, 0x68, 0xf2, 0x16, 0xd4, 0x12, 0xad, 0xa8, 0xf8,
0x82, 0x72, 0x6e, 0x55, 0xbb, 0x6a, 0x53, 0x7d, 0x80, 0xc7, 0xdb, 0x45, 0x25, 0xf7, 0xc9, 0x8e,
0xbc, 0x0c, 0xee, 0x95, 0x6d, 0x7b, 0x07, 0x71, 0x6f, 0xc2, 0x7d, 0xfb, 0x1a, 0xec, 0xf0, 0xe3,
0xca, 0xf9, 0xb3, 0x1a, 0xf1, 0x0e, 0x5a, 0x62, 0x0f, 0xf0, 0xfe, 0x96, 0x4b, 0x7c, 0x59, 0x6d,
0x81, 0xac, 0x86, 0xd3, 0xe6, 0x95, 0x89, 0xf1, 0x23, 0xc5, 0x7d, 0x1b, 0xc1, 0xe9, 0x8c, 0xae,
0x38, 0x7c, 0x55, 0x39, 0xdd, 0xf8, 0xd6, 0xbe, 0xe6, 0x53, 0x87, 0x23, 0x8a, 0x18, 0x71, 0x61,
0x3e, 0xb5, 0xc1, 0xf0, 0xa5, 0x49, 0x9a, 0xd1, 0xc2, 0x75, 0x1f, 0x9b, 0x0c, 0x39, 0x5a, 0x8f,
0x5f, 0xe5, 0x92, 0x5d, 0x61, 0x19, 0xeb, 0xa9, 0x7b, 0xc7, 0x0e, 0x32, 0xe8, 0x9b, 0x50, 0x4b,
0xb4, 0x6f, 0x65, 0x78, 0xbc, 0xaa, 0xc5, 0xeb, 0xa0, 0xa9, 0xdf, 0x06, 0x2d, 0xde, 0x65, 0x85,
0x57, 0xb2, 0xf6, 0xd2, 0xbe, 0x89, 0x0f, 0xb3, 0x95, 0x46, 0x0d, 0x1a, 0x63, 0xb6, 0xd2, 0xbe,
0xbe, 0x93, 0xc9, 0xb7, 0x52, 0x6c, 0xfe, 0xb1, 0x5b, 0xe9, 0xd0, 0x4b, 0xbc, 0x8b, 0x60, 0x49,
0xdd, 0xa4, 0x83, 0x57, 0xb3, 0x7c, 0x33, 0xbb, 0x1d, 0xa9, 0x79, 0xf5, 0x50, 0x34, 0x91, 0x16,
0x77, 0x60, 0x2e, 0xd9, 0xe6, 0x92, 0xa1, 0x45, 0x65, 0xf7, 0x4e, 0xf3, 0xd2, 0x44, 0xb8, 0xd1,
0x62, 0x5f, 0x85, 0x6a, 0xac, 0x05, 0x01, 0x3f, 0x3a, 0xc6, 0x8f, 0xe3, 0x2f, 0x5c, 0x07, 0x69,
0xb2, 0x0b, 0xb5, 0xc4, 0xb3, 0x73, 0x96, 0x0f, 0x2b, 0xba, 0x01, 0x9a, 0x17, 0x27, 0x41, 0x8d,
0x04, 0xe8, 0x42, 0x2d, 0xf1, 0x08, 0x98, 0xb1, 0x92, 0xea, 0xcd, 0x33, 0x63, 0x25, 0xe5, 0x9b,
0xa2, 0x3e, 0x83, 0xbf, 0x19, 0x7b, 0x6f, 0x4c, 0xbc, 0xe9, 0xe2, 0x27, 0xc7, 0xce, 0xa3, 0x7a,
0xd2, 0x6e, 0xae, 0x1e, 0x86, 0x24, 0x62, 0xe1, 0x35, 0xa8, 0x44, 0x6f, 0x8d, 0xf8, 0x7c, 0x66,
0x58, 0x38, 0x8c, 0xa5, 0x36, 0xa1, 0x28, 0xdf, 0xfd, 0xb0, 0x9e, 0xf1, 0x80, 0x1f, 0x7b, 0x14,
0x6c, 0x3e, 0xac, 0xc4, 0x49, 0x3e, 0x89, 0xe9, 0x33, 0xd8, 0x80, 0xa2, 0xac, 0x22, 0x66, 0x4c,
0x9a, 0x78, 0x1d, 0x69, 0x8e, 0xc7, 0x91, 0xa5, 0xc7, 0x19, 0xfc, 0x35, 0x28, 0x87, 0x65, 0x60,
0xfc, 0x48, 0xc6, 0xb6, 0x4f, 0xd4, 0xe0, 0x9b, 0x07, 0x61, 0x85, 0x33, 0x6f, 0x40, 0x41, 0xd4,
0xf1, 0xf0, 0xb9, 0x71, 0x35, 0xbe, 0x71, 0xbc, 0x26, 0xca, 0x80, 0xfa, 0x0c, 0xfe, 0x0a, 0x14,
0x44, 0x2a, 0x9c, 0x31, 0x63, 0xbc, 0x50, 0xd7, 0x1c, 0x8b, 0x12, 0xb2, 0x68, 0x81, 0x16, 0x2f,
0x11, 0x64, 0x04, 0x6e, 0x45, 0x11, 0xa5, 0x39, 0x09, 0x66, 0xb8, 0xca, 0x77, 0x10, 0x34, 0xb2,
0x6e, 0x93, 0x38, 0xf3, 0x74, 0x1e, 0x77, 0x25, 0x6e, 0x3e, 0x7d, 0x48, 0xaa, 0x48, 0x85, 0xef,
0xc0, 0x82, 0xe2, 0x0e, 0x83, 0xaf, 0x64, 0xcd, 0x97, 0x71, 0xfd, 0x6a, 0x3e, 0x31, 0x39, 0x41,
0xb4, 0xf6, 0x06, 0x14, 0xc4, 0xdd, 0x23, 0xc3, 0x7c, 0xf1, 0xab, 0x4c, 0x86, 0x43, 0x24, 0xae,
0x2e, 0xfa, 0x0c, 0x26, 0xa0, 0xc5, 0x2f, 0x22, 0x19, 0xf6, 0x53, 0xdc, 0x61, 0x9a, 0x17, 0x26,
0xc0, 0x0c, 0x97, 0x59, 0x1d, 0x80, 0xb6, 0xe1, 0x7b, 0x77, 0x87, 0x61, 0xea, 0xff, 0xbf, 0x59,
0xf6, 0xfa, 0xd3, 0x5f, 0xbf, 0xda, 0xb1, 0x59, 0x77, 0xb0, 0xc5, 0xa3, 0xcb, 0x15, 0x89, 0xfb,
0xb8, 0xed, 0x05, 0x5f, 0x57, 0x6c, 0x97, 0x11, 0xdf, 0x35, 0x9d, 0x2b, 0x62, 0xae, 0x00, 0xda,
0xdf, 0xda, 0x2a, 0x8a, 0xff, 0xab, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x57, 0x0f, 0x08, 0x41,
0x03, 0x38, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -3849,6 +4163,7 @@ type MilvusServiceClient interface {
Retrieve(ctx context.Context, in *RetrieveRequest, opts ...grpc.CallOption) (*RetrieveResults, error)
Flush(ctx context.Context, in *FlushRequest, opts ...grpc.CallOption) (*FlushResponse, error)
Query(ctx context.Context, in *QueryRequest, opts ...grpc.CallOption) (*QueryResults, error)
CalcDistance(ctx context.Context, in *CalcDistanceRequest, opts ...grpc.CallOption) (*CalcDistanceResults, error)
GetPersistentSegmentInfo(ctx context.Context, in *GetPersistentSegmentInfoRequest, opts ...grpc.CallOption) (*GetPersistentSegmentInfoResponse, error)
GetQuerySegmentInfo(ctx context.Context, in *GetQuerySegmentInfoRequest, opts ...grpc.CallOption) (*GetQuerySegmentInfoResponse, error)
Dummy(ctx context.Context, in *DummyRequest, opts ...grpc.CallOption) (*DummyResponse, error)
@ -4089,6 +4404,15 @@ func (c *milvusServiceClient) Query(ctx context.Context, in *QueryRequest, opts
return out, nil
}
func (c *milvusServiceClient) CalcDistance(ctx context.Context, in *CalcDistanceRequest, opts ...grpc.CallOption) (*CalcDistanceResults, error) {
out := new(CalcDistanceResults)
err := c.cc.Invoke(ctx, "/milvus.proto.milvus.MilvusService/CalcDistance", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *milvusServiceClient) GetPersistentSegmentInfo(ctx context.Context, in *GetPersistentSegmentInfoRequest, opts ...grpc.CallOption) (*GetPersistentSegmentInfoResponse, error) {
out := new(GetPersistentSegmentInfoResponse)
err := c.cc.Invoke(ctx, "/milvus.proto.milvus.MilvusService/GetPersistentSegmentInfo", in, out, opts...)
@ -4152,6 +4476,7 @@ type MilvusServiceServer interface {
Retrieve(context.Context, *RetrieveRequest) (*RetrieveResults, error)
Flush(context.Context, *FlushRequest) (*FlushResponse, error)
Query(context.Context, *QueryRequest) (*QueryResults, error)
CalcDistance(context.Context, *CalcDistanceRequest) (*CalcDistanceResults, error)
GetPersistentSegmentInfo(context.Context, *GetPersistentSegmentInfoRequest) (*GetPersistentSegmentInfoResponse, error)
GetQuerySegmentInfo(context.Context, *GetQuerySegmentInfoRequest) (*GetQuerySegmentInfoResponse, error)
Dummy(context.Context, *DummyRequest) (*DummyResponse, error)
@ -4238,6 +4563,9 @@ func (*UnimplementedMilvusServiceServer) Flush(ctx context.Context, req *FlushRe
func (*UnimplementedMilvusServiceServer) Query(ctx context.Context, req *QueryRequest) (*QueryResults, error) {
return nil, status.Errorf(codes.Unimplemented, "method Query not implemented")
}
func (*UnimplementedMilvusServiceServer) CalcDistance(ctx context.Context, req *CalcDistanceRequest) (*CalcDistanceResults, error) {
return nil, status.Errorf(codes.Unimplemented, "method CalcDistance not implemented")
}
func (*UnimplementedMilvusServiceServer) GetPersistentSegmentInfo(ctx context.Context, req *GetPersistentSegmentInfoRequest) (*GetPersistentSegmentInfoResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetPersistentSegmentInfo not implemented")
}
@ -4705,6 +5033,24 @@ func _MilvusService_Query_Handler(srv interface{}, ctx context.Context, dec func
return interceptor(ctx, in, info, handler)
}
func _MilvusService_CalcDistance_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(CalcDistanceRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(MilvusServiceServer).CalcDistance(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/milvus.proto.milvus.MilvusService/CalcDistance",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(MilvusServiceServer).CalcDistance(ctx, req.(*CalcDistanceRequest))
}
return interceptor(ctx, in, info, handler)
}
func _MilvusService_GetPersistentSegmentInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetPersistentSegmentInfoRequest)
if err := dec(in); err != nil {
@ -4881,6 +5227,10 @@ var _MilvusService_serviceDesc = grpc.ServiceDesc{
MethodName: "Query",
Handler: _MilvusService_Query_Handler,
},
{
MethodName: "CalcDistance",
Handler: _MilvusService_CalcDistance_Handler,
},
{
MethodName: "GetPersistentSegmentInfo",
Handler: _MilvusService_GetPersistentSegmentInfo_Handler,

View File

@ -30,6 +30,7 @@ import (
"github.com/milvus-io/milvus/internal/proto/proxypb"
"github.com/milvus-io/milvus/internal/proto/querypb"
"github.com/milvus-io/milvus/internal/proto/schemapb"
"github.com/milvus-io/milvus/internal/util/distance"
"github.com/milvus-io/milvus/internal/util/typeutil"
)
@ -1573,6 +1574,147 @@ func (node *Proxy) Query(ctx context.Context, request *milvuspb.QueryRequest) (*
}
func (node *Proxy) CalcDistance(ctx context.Context, request *milvuspb.CalcDistanceRequest) (*milvuspb.CalcDistanceResults, error) {
param, _ := GetAttrByKeyFromRepeatedKV("metric", request.GetParams())
metric, err := distance.ValidateMetricType(param)
if err != nil {
return &milvuspb.CalcDistanceResults{
Status: &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
Reason: err.Error(),
},
}, nil
}
retrieveTask := func(ids *milvuspb.VectorIDs) (*milvuspb.RetrieveResults, error) {
outputFields := []string{ids.FieldName}
retrieveRequest := &milvuspb.RetrieveRequest{
DbName: "",
CollectionName: ids.CollectionName,
PartitionNames: ids.PartitionNames,
Ids: ids.IdArray,
OutputFields: outputFields,
}
return node.Retrieve(ctx, retrieveRequest)
}
vectorsLeft := request.GetOpLeft().GetDataArray()
opLeft := request.GetOpLeft().GetIdArray()
if opLeft != nil {
result, err := retrieveTask(opLeft)
if err != nil {
return &milvuspb.CalcDistanceResults{
Status: &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
Reason: err.Error(),
},
}, nil
}
for _, fieldData := range result.FieldsData {
if fieldData.FieldName == opLeft.FieldName {
vectorsLeft = fieldData.GetVectors()
break
}
}
}
vectorsRight := request.GetOpRight().GetDataArray()
opRight := request.GetOpRight().GetIdArray()
if opRight != nil {
result, err := retrieveTask(opRight)
if err != nil {
return &milvuspb.CalcDistanceResults{
Status: &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
Reason: err.Error(),
},
}, nil
}
for _, fieldData := range result.FieldsData {
if fieldData.FieldName == opRight.FieldName {
vectorsRight = fieldData.GetVectors()
break
}
}
}
if vectorsLeft.Dim == vectorsRight.Dim && vectorsLeft.GetFloatVector() != nil && vectorsRight.GetFloatVector() != nil {
distances, err := distance.CalcFloatDistance(vectorsLeft.Dim, vectorsLeft.GetFloatVector().Data, vectorsRight.GetFloatVector().Data, metric)
if err != nil {
return &milvuspb.CalcDistanceResults{
Status: &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
Reason: err.Error(),
},
}, nil
}
return &milvuspb.CalcDistanceResults{
Status: &commonpb.Status{ErrorCode: commonpb.ErrorCode_Success, Reason: ""},
Array: &milvuspb.CalcDistanceResults_FloatDist{
FloatDist: &schemapb.FloatArray{
Data: distances,
},
},
}, nil
}
if vectorsLeft.Dim == vectorsRight.Dim && vectorsLeft.GetBinaryVector() != nil && vectorsRight.GetBinaryVector() != nil {
hammin, err := distance.CalcHamminDistance(vectorsLeft.Dim, vectorsLeft.GetBinaryVector(), vectorsRight.GetBinaryVector())
if err != nil {
return &milvuspb.CalcDistanceResults{
Status: &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
Reason: err.Error(),
},
}, nil
}
if metric == distance.HAMMING {
return &milvuspb.CalcDistanceResults{
Status: &commonpb.Status{ErrorCode: commonpb.ErrorCode_Success, Reason: ""},
Array: &milvuspb.CalcDistanceResults_IntDist{
IntDist: &schemapb.IntArray{
Data: hammin,
},
},
}, nil
}
if metric == distance.TANIMOTO {
tanimoto, err := distance.CalcTanimotoCoefficient(vectorsLeft.Dim, hammin)
if err != nil {
return &milvuspb.CalcDistanceResults{
Status: &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
Reason: err.Error(),
},
}, nil
}
return &milvuspb.CalcDistanceResults{
Status: &commonpb.Status{ErrorCode: commonpb.ErrorCode_Success, Reason: ""},
Array: &milvuspb.CalcDistanceResults_FloatDist{
FloatDist: &schemapb.FloatArray{
Data: tanimoto,
},
},
}, nil
}
}
err = errors.New("Unexpected error")
return &milvuspb.CalcDistanceResults{
Status: &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
Reason: err.Error(),
},
}, nil
}
func (node *Proxy) GetDdChannel(ctx context.Context, request *internalpb.GetDdChannelRequest) (*milvuspb.StringResponse, error) {
panic("implement me")
}

View File

@ -0,0 +1,250 @@
// Copyright (C) 2019-2020 Zilliz. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distributed under the License
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
// or implied. See the License for the specific language governing permissions and limitations under the License.
package distance
import (
"errors"
"strings"
"sync"
)
const (
L2 = "L2"
IP = "IP"
HAMMING = "HAMMIN"
TANIMOTO = "TANIMOTO"
)
func ValidateMetricType(metric string) (string, error) {
if metric == "" {
err := errors.New("Metric type is empty")
return "", err
}
m := strings.ToUpper(metric)
if m == L2 || m == IP || m == HAMMING || m == TANIMOTO {
return m, nil
}
err := errors.New("Invalid metric type")
return metric, err
}
func ValidateFloatArrayLength(dim int64, length int) error {
if length == 0 || int64(length)%dim != 0 {
err := errors.New("Invalid float vector length")
return err
}
return nil
}
func CalcL2(dim int64, left []float32, lIndex int64, right []float32, rIndex int64) float32 {
var sum float32 = 0.0
lFrom := lIndex * dim
rFrom := rIndex * dim
for i := int64(0); i < dim; i++ {
gap := left[lFrom+i] - right[rFrom+i]
sum += gap * gap
}
return sum
}
func CalcIP(dim int64, left []float32, lIndex int64, right []float32, rIndex int64) float32 {
var sum float32 = 0.0
lFrom := lIndex * dim
rFrom := rIndex * dim
for i := int64(0); i < dim; i++ {
sum += left[lFrom+i] * right[rFrom+i]
}
return sum
}
func CalcFFBatch(dim int64, left []float32, lIndex int64, right []float32, metric string, result *[]float32) {
rightNum := int64(len(right)) / dim
for i := int64(0); i < rightNum; i++ {
var distance float32 = -1.0
if metric == L2 {
distance = CalcL2(dim, left, lIndex, right, i)
} else if metric == IP {
distance = CalcIP(dim, left, lIndex, right, i)
}
(*result)[lIndex*rightNum+i] = distance
}
}
func CalcFloatDistance(dim int64, left []float32, right []float32, metric string) ([]float32, error) {
if dim <= 0 {
err := errors.New("Invalid dimension")
return nil, err
}
metricUpper := strings.ToUpper(metric)
if metricUpper != L2 && metricUpper != IP {
err := errors.New("Invalid metric type")
return nil, err
}
err := ValidateFloatArrayLength(dim, len(left))
if err != nil {
return nil, err
}
err = ValidateFloatArrayLength(dim, len(right))
if err != nil {
return nil, err
}
leftNum := int64(len(left)) / dim
rightNum := int64(len(right)) / dim
distArray := make([]float32, leftNum*rightNum)
var waitGroup sync.WaitGroup
CalcWorker := func(index int64) {
CalcFFBatch(dim, left, index, right, metricUpper, &distArray)
waitGroup.Done()
}
for i := int64(0); i < leftNum; i++ {
waitGroup.Add(1)
go CalcWorker(i)
}
waitGroup.Wait()
return distArray, nil
}
////////////////////////////////////////////////////////////////////////////////
func SingleBitLen(dim int64) int64 {
if dim%8 == 0 {
return dim
}
return dim + 8 - dim%8
}
func VectorCount(dim int64, length int) int64 {
singleBitLen := SingleBitLen(dim)
return int64(length*8) / singleBitLen
}
func ValidateBinaryArrayLength(dim int64, length int) error {
singleBitLen := SingleBitLen(dim)
totalBitLen := int64(length * 8)
if length == 0 || totalBitLen%singleBitLen != 0 {
err := errors.New("Invalid binary vector length")
return err
}
return nil
}
// Count 1 of uint8
// For 00000010, return 1
// Fro 11111111, return 8
func CountOne(n uint8) int32 {
count := int32(0)
for n != 0 {
count++
n = n & (n - 1)
}
return count
}
// HAMMIN distance
func CalcHammin(dim int64, left []byte, lIndex int64, right []byte, rIndex int64) int32 {
singleBitLen := SingleBitLen(dim)
numBytes := singleBitLen / 8
lFrom := lIndex * numBytes
rFrom := rIndex * numBytes
var hammin int32 = 0
for i := int64(0); i < numBytes; i++ {
var xor uint8 = left[lFrom+i] ^ right[rFrom+i]
// The dimension "dim" may not be an integer multiple of 8
// For example:
// dim = 11, each vector has 2 uint8 value
// the second uint8, only need to calculate 3 bits, the other 5 bits will be set to 0
if i == numBytes-1 && numBytes*8 > dim {
offset := numBytes*8 - dim
xor = xor & (255 << offset)
}
hammin += CountOne(xor)
}
return hammin
}
func CalcHamminBatch(dim int64, left []byte, lIndex int64, right []byte, result *[]int32) {
rightNum := VectorCount(dim, len(right))
for i := int64(0); i < rightNum; i++ {
hammin := CalcHammin(dim, left, lIndex, right, i)
(*result)[lIndex*rightNum+i] = hammin
}
}
func CalcHamminDistance(dim int64, left []byte, right []byte) ([]int32, error) {
if dim <= 0 {
err := errors.New("Invalid dimension")
return nil, err
}
err := ValidateBinaryArrayLength(dim, len(left))
if err != nil {
return nil, err
}
err = ValidateBinaryArrayLength(dim, len(right))
if err != nil {
return nil, err
}
leftNum := VectorCount(dim, len(left))
rightNum := VectorCount(dim, len(right))
distArray := make([]int32, leftNum*rightNum)
var waitGroup sync.WaitGroup
CalcWorker := func(index int64) {
CalcHamminBatch(dim, left, index, right, &distArray)
waitGroup.Done()
}
for i := int64(0); i < leftNum; i++ {
waitGroup.Add(1)
go CalcWorker(i)
}
waitGroup.Wait()
return distArray, nil
}
func CalcTanimotoCoefficient(dim int64, hammin []int32) ([]float32, error) {
if dim <= 0 || len(hammin) == 0 {
err := errors.New("Invalid input for tanimoto")
return nil, err
}
array := make([]float32, len(hammin))
for i := 0; i < len(hammin); i++ {
if hammin[i] >= int32(dim)*2 {
err := errors.New("Invalid hammin for tanimoto")
return nil, err
}
array[i] = float32(hammin[i] / (int32(dim)*2 - hammin[i]))
}
return array, nil
}

View File

@ -0,0 +1,258 @@
// Copyright (C) 2019-2020 Zilliz. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distributed under the License
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
// or implied. See the License for the specific language governing permissions and limitations under the License.
package distance
import (
"math"
"math/rand"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
const PRECISION = 1e-6
func TestValidateMetricType(t *testing.T) {
invalidMetric := []string{"", "aaa"}
for _, str := range invalidMetric {
_, err := ValidateMetricType(str)
assert.Error(t, err)
}
validMetric := []string{"L2", "ip", "Hammin", "Tanimoto"}
for _, str := range validMetric {
metric, err := ValidateMetricType(str)
assert.Nil(t, err)
assert.True(t, metric == L2 || metric == IP || metric == HAMMING || metric == TANIMOTO)
}
}
func TestValidateFloatArrayLength(t *testing.T) {
err := ValidateFloatArrayLength(3, 12)
assert.Nil(t, err)
err = ValidateFloatArrayLength(5, 11)
assert.Error(t, err)
}
////////////////////////////////////////////////////////////////////////////////
func CreateFloatArray(n int64, dim int64) []float32 {
rand.Seed(time.Now().UnixNano())
num := n * dim
array := make([]float32, num)
for i := int64(0); i < num; i++ {
array[i] = rand.Float32()
}
return array
}
func DistanceL2(left []float32, right []float32) float32 {
if len(left) != len(right) {
panic("array dimension not equal")
}
var sum float32 = 0.0
for i := 0; i < len(left); i++ {
gap := left[i] - right[i]
sum += gap * gap
}
return sum
}
func DistanceIP(left []float32, right []float32) float32 {
if len(left) != len(right) {
panic("array dimension not equal")
}
var sum float32 = 0.0
for i := 0; i < len(left); i++ {
sum += left[i] * right[i]
}
return sum
}
func TestCalcL2(t *testing.T) {
var dim int64 = 128
var leftNum int64 = 1
var rightNum int64 = 1
left := CreateFloatArray(leftNum, dim)
right := CreateFloatArray(rightNum, dim)
sum := DistanceL2(left, right)
distance := CalcL2(dim, left, 0, right, 0)
assert.Less(t, math.Abs(float64(sum-distance)), PRECISION)
distance = CalcL2(dim, left, 0, left, 0)
assert.Less(t, float64(distance), PRECISION)
}
func TestCalcIP(t *testing.T) {
var dim int64 = 128
var leftNum int64 = 1
var rightNum int64 = 1
left := CreateFloatArray(leftNum, dim)
right := CreateFloatArray(rightNum, dim)
sum := DistanceIP(left, right)
distance := CalcIP(dim, left, 0, right, 0)
assert.Less(t, math.Abs(float64(sum-distance)), PRECISION)
}
func TestCalcFloatDistance(t *testing.T) {
var dim int64 = 128
var leftNum int64 = 10
var rightNum int64 = 5
left := CreateFloatArray(leftNum, dim)
right := CreateFloatArray(rightNum, dim)
_, err := CalcFloatDistance(dim, left, right, "HAMMIN")
assert.Error(t, err)
_, err = CalcFloatDistance(3, left, right, "L2")
assert.Error(t, err)
_, err = CalcFloatDistance(dim, left, right, "HAMMIN")
assert.Error(t, err)
_, err = CalcFloatDistance(0, left, right, "L2")
assert.Error(t, err)
distances, err := CalcFloatDistance(dim, left, right, "L2")
assert.Nil(t, err)
for i := int64(0); i < leftNum; i++ {
for j := int64(0); j < rightNum; j++ {
v1 := left[i*dim : (i+1)*dim]
v2 := right[j*dim : (j+1)*dim]
sum := DistanceL2(v1, v2)
assert.Less(t, math.Abs(float64(sum-distances[i*rightNum+j])), PRECISION)
}
}
distances, err = CalcFloatDistance(dim, left, right, "IP")
assert.Nil(t, err)
for i := int64(0); i < leftNum; i++ {
for j := int64(0); j < rightNum; j++ {
v1 := left[i*dim : (i+1)*dim]
v2 := right[j*dim : (j+1)*dim]
sum := DistanceIP(v1, v2)
assert.Less(t, math.Abs(float64(sum-distances[i*rightNum+j])), PRECISION)
}
}
}
////////////////////////////////////////////////////////////////////////////////
func CreateBinaryArray(n int64, dim int64) []byte {
rand.Seed(time.Now().UnixNano())
num := n * dim / 8
if num*8 < n*dim {
num = num + 1
}
array := make([]byte, num)
for i := int64(0); i < num; i++ {
n := rand.Intn(256)
array[i] = uint8(n)
}
return array
}
func TestSingleBitLen(t *testing.T) {
n := SingleBitLen(125)
assert.Equal(t, n, int64(128))
n = SingleBitLen(133)
assert.Equal(t, n, int64(136))
}
func TestVectorCount(t *testing.T) {
n := VectorCount(15, 20)
assert.Equal(t, n, int64(10))
n = VectorCount(8, 3)
assert.Equal(t, n, int64(3))
}
func TestValidateBinaryArrayLength(t *testing.T) {
err := ValidateBinaryArrayLength(21, 12)
assert.Nil(t, err)
err = ValidateBinaryArrayLength(21, 11)
assert.Error(t, err)
}
func TestCountOne(t *testing.T) {
n := CountOne(6)
assert.Equal(t, n, int32(2))
n = CountOne(0)
assert.Equal(t, n, int32(0))
n = CountOne(255)
assert.Equal(t, n, int32(8))
}
func TestCalcHammin(t *testing.T) {
var dim int64 = 22
// v1 = 00000010 00000110 00001000
v1 := make([]uint8, 3)
v1[0] = 2
v1[1] = 6
v1[2] = 8
// v2 = 00000001 00000111 00011011
v2 := make([]uint8, 3)
v2[0] = 1
v2[1] = 7
v2[2] = 27
n := CalcHammin(dim, v1, 0, v2, 0)
assert.Equal(t, n, int32(4))
hammin := make([]int32, 1)
hammin[0] = n
tanimoto, err := CalcTanimotoCoefficient(dim, hammin)
assert.Nil(t, err)
assert.Less(t, math.Abs(float64(tanimoto[0]-float32(n/(int32(dim)*2-n)))), float64(PRECISION))
}
func TestCalcHamminDistance(t *testing.T) {
var dim int64 = 125
var leftNum int64 = 2
left := CreateBinaryArray(leftNum, dim)
_, e := CalcHamminDistance(0, left, left)
assert.Error(t, e)
distances, err := CalcHamminDistance(dim, left, left)
assert.Nil(t, err)
n := CalcHammin(dim, left, 0, left, 0)
assert.Equal(t, n, int32(0))
n = CalcHammin(dim, left, 1, left, 1)
assert.Equal(t, n, int32(0))
n = CalcHammin(dim, left, 0, left, 1)
assert.Equal(t, n, distances[1])
n = CalcHammin(dim, left, 1, left, 0)
assert.Equal(t, n, distances[2])
}