Support Role-Based Access Control II (#18528)

Signed-off-by: SimFG <bang.fu@zilliz.com>
pull/18562/head
SimFG 2022-08-05 16:28:35 +08:00 committed by GitHub
parent b427450593
commit c267ad612d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 1111 additions and 851 deletions

View File

@ -308,6 +308,7 @@ const ::PROTOBUF_NAMESPACE_ID::uint32 TableStruct_common_2eproto::offsets[] PROT
PROTOBUF_FIELD_OFFSET(::milvus::proto::common::PrivilegeExt, object_type_), PROTOBUF_FIELD_OFFSET(::milvus::proto::common::PrivilegeExt, object_type_),
PROTOBUF_FIELD_OFFSET(::milvus::proto::common::PrivilegeExt, object_privilege_), PROTOBUF_FIELD_OFFSET(::milvus::proto::common::PrivilegeExt, object_privilege_),
PROTOBUF_FIELD_OFFSET(::milvus::proto::common::PrivilegeExt, object_name_index_), PROTOBUF_FIELD_OFFSET(::milvus::proto::common::PrivilegeExt, object_name_index_),
PROTOBUF_FIELD_OFFSET(::milvus::proto::common::PrivilegeExt, object_name_indexs_),
}; };
static const ::PROTOBUF_NAMESPACE_ID::internal::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { static const ::PROTOBUF_NAMESPACE_ID::internal::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
{ 0, -1, sizeof(::milvus::proto::common::Status)}, { 0, -1, sizeof(::milvus::proto::common::Status)},
@ -356,107 +357,118 @@ const char descriptor_table_protodef_common_2eproto[] PROTOBUF_SECTION_VARIABLE(
"*\n\004base\030\001 \001(\0132\034.milvus.proto.common.MsgB" "*\n\004base\030\001 \001(\0132\034.milvus.proto.common.MsgB"
"ase\"M\n\014DMLMsgHeader\022*\n\004base\030\001 \001(\0132\034.milv" "ase\"M\n\014DMLMsgHeader\022*\n\004base\030\001 \001(\0132\034.milv"
"us.proto.common.MsgBase\022\021\n\tshardName\030\002 \001" "us.proto.common.MsgBase\022\021\n\tshardName\030\002 \001"
"(\t\"\237\001\n\014PrivilegeExt\0224\n\013object_type\030\001 \001(\016" "(\t\"\273\001\n\014PrivilegeExt\0224\n\013object_type\030\001 \001(\016"
"2\037.milvus.proto.common.ObjectType\022>\n\020obj" "2\037.milvus.proto.common.ObjectType\022>\n\020obj"
"ect_privilege\030\002 \001(\0162$.milvus.proto.commo" "ect_privilege\030\002 \001(\0162$.milvus.proto.commo"
"n.ObjectPrivilege\022\031\n\021object_name_index\030\003" "n.ObjectPrivilege\022\031\n\021object_name_index\030\003"
" \001(\005*\323\010\n\tErrorCode\022\013\n\007Success\020\000\022\023\n\017Unexp" " \001(\005\022\032\n\022object_name_indexs\030\004 \001(\005*\323\010\n\tErr"
"ectedError\020\001\022\021\n\rConnectFailed\020\002\022\024\n\020Permi" "orCode\022\013\n\007Success\020\000\022\023\n\017UnexpectedError\020\001"
"ssionDenied\020\003\022\027\n\023CollectionNotExists\020\004\022\023" "\022\021\n\rConnectFailed\020\002\022\024\n\020PermissionDenied\020"
"\n\017IllegalArgument\020\005\022\024\n\020IllegalDimension\020" "\003\022\027\n\023CollectionNotExists\020\004\022\023\n\017IllegalArg"
"\007\022\024\n\020IllegalIndexType\020\010\022\031\n\025IllegalCollec" "ument\020\005\022\024\n\020IllegalDimension\020\007\022\024\n\020Illegal"
"tionName\020\t\022\017\n\013IllegalTOPK\020\n\022\024\n\020IllegalRo" "IndexType\020\010\022\031\n\025IllegalCollectionName\020\t\022\017"
"wRecord\020\013\022\023\n\017IllegalVectorID\020\014\022\027\n\023Illega" "\n\013IllegalTOPK\020\n\022\024\n\020IllegalRowRecord\020\013\022\023\n"
"lSearchResult\020\r\022\020\n\014FileNotFound\020\016\022\016\n\nMet" "\017IllegalVectorID\020\014\022\027\n\023IllegalSearchResul"
"aFailed\020\017\022\017\n\013CacheFailed\020\020\022\026\n\022CannotCrea" "t\020\r\022\020\n\014FileNotFound\020\016\022\016\n\nMetaFailed\020\017\022\017\n"
"teFolder\020\021\022\024\n\020CannotCreateFile\020\022\022\026\n\022Cann" "\013CacheFailed\020\020\022\026\n\022CannotCreateFolder\020\021\022\024"
"otDeleteFolder\020\023\022\024\n\020CannotDeleteFile\020\024\022\023" "\n\020CannotCreateFile\020\022\022\026\n\022CannotDeleteFold"
"\n\017BuildIndexError\020\025\022\020\n\014IllegalNLIST\020\026\022\025\n" "er\020\023\022\024\n\020CannotDeleteFile\020\024\022\023\n\017BuildIndex"
"\021IllegalMetricType\020\027\022\017\n\013OutOfMemory\020\030\022\021\n" "Error\020\025\022\020\n\014IllegalNLIST\020\026\022\025\n\021IllegalMetr"
"\rIndexNotExist\020\031\022\023\n\017EmptyCollection\020\032\022\033\n" "icType\020\027\022\017\n\013OutOfMemory\020\030\022\021\n\rIndexNotExi"
"\027UpdateImportTaskFailure\020\033\022\032\n\026Collection" "st\020\031\022\023\n\017EmptyCollection\020\032\022\033\n\027UpdateImpor"
"NameNotFound\020\034\022\033\n\027CreateCredentialFailur" "tTaskFailure\020\033\022\032\n\026CollectionNameNotFound"
"e\020\035\022\033\n\027UpdateCredentialFailure\020\036\022\033\n\027Dele" "\020\034\022\033\n\027CreateCredentialFailure\020\035\022\033\n\027Updat"
"teCredentialFailure\020\037\022\030\n\024GetCredentialFa" "eCredentialFailure\020\036\022\033\n\027DeleteCredential"
"ilure\020 \022\030\n\024ListCredUsersFailure\020!\022\022\n\016Get" "Failure\020\037\022\030\n\024GetCredentialFailure\020 \022\030\n\024L"
"UserFailure\020\"\022\025\n\021CreateRoleFailure\020#\022\023\n\017" "istCredUsersFailure\020!\022\022\n\016GetUserFailure\020"
"DropRoleFailure\020$\022\032\n\026OperateUserRoleFail" "\"\022\025\n\021CreateRoleFailure\020#\022\023\n\017DropRoleFail"
"ure\020%\022\025\n\021SelectRoleFailure\020&\022\025\n\021SelectUs" "ure\020$\022\032\n\026OperateUserRoleFailure\020%\022\025\n\021Sel"
"erFailure\020\'\022\031\n\025SelectResourceFailure\020(\022\033" "ectRoleFailure\020&\022\025\n\021SelectUserFailure\020\'\022"
"\n\027OperatePrivilegeFailure\020)\022\026\n\022SelectGra" "\031\n\025SelectResourceFailure\020(\022\033\n\027OperatePri"
"ntFailure\020*\022!\n\035RefreshPolicyInfoCacheFai" "vilegeFailure\020)\022\026\n\022SelectGrantFailure\020*\022"
"lure\020+\022\025\n\021ListPolicyFailure\020,\022\022\n\016NotShar" "!\n\035RefreshPolicyInfoCacheFailure\020+\022\025\n\021Li"
"dLeader\020-\022\026\n\022NoReplicaAvailable\020.\022\023\n\017Seg" "stPolicyFailure\020,\022\022\n\016NotShardLeader\020-\022\026\n"
"mentNotFound\020/\022\022\n\rDDRequestRace\020\350\007*X\n\nIn" "\022NoReplicaAvailable\020.\022\023\n\017SegmentNotFound"
"dexState\022\022\n\016IndexStateNone\020\000\022\014\n\010Unissued" "\020/\022\022\n\rDDRequestRace\020\350\007*X\n\nIndexState\022\022\n\016"
"\020\001\022\016\n\nInProgress\020\002\022\014\n\010Finished\020\003\022\n\n\006Fail" "IndexStateNone\020\000\022\014\n\010Unissued\020\001\022\016\n\nInProg"
"ed\020\004*\202\001\n\014SegmentState\022\024\n\020SegmentStateNon" "ress\020\002\022\014\n\010Finished\020\003\022\n\n\006Failed\020\004*\202\001\n\014Seg"
"e\020\000\022\014\n\010NotExist\020\001\022\013\n\007Growing\020\002\022\n\n\006Sealed" "mentState\022\024\n\020SegmentStateNone\020\000\022\014\n\010NotEx"
"\020\003\022\013\n\007Flushed\020\004\022\014\n\010Flushing\020\005\022\013\n\007Dropped" "ist\020\001\022\013\n\007Growing\020\002\022\n\n\006Sealed\020\003\022\013\n\007Flushe"
"\020\006\022\r\n\tImporting\020\007*>\n\017PlaceholderType\022\010\n\004" "d\020\004\022\014\n\010Flushing\020\005\022\013\n\007Dropped\020\006\022\r\n\tImport"
"None\020\000\022\020\n\014BinaryVector\020d\022\017\n\013FloatVector\020" "ing\020\007*>\n\017PlaceholderType\022\010\n\004None\020\000\022\020\n\014Bi"
"e*\266\014\n\007MsgType\022\r\n\tUndefined\020\000\022\024\n\020CreateCo" "naryVector\020d\022\017\n\013FloatVector\020e*\266\014\n\007MsgTyp"
"llection\020d\022\022\n\016DropCollection\020e\022\021\n\rHasCol" "e\022\r\n\tUndefined\020\000\022\024\n\020CreateCollection\020d\022\022"
"lection\020f\022\026\n\022DescribeCollection\020g\022\023\n\017Sho" "\n\016DropCollection\020e\022\021\n\rHasCollection\020f\022\026\n"
"wCollections\020h\022\024\n\020GetSystemConfigs\020i\022\022\n\016" "\022DescribeCollection\020g\022\023\n\017ShowCollections"
"LoadCollection\020j\022\025\n\021ReleaseCollection\020k\022" "\020h\022\024\n\020GetSystemConfigs\020i\022\022\n\016LoadCollecti"
"\017\n\013CreateAlias\020l\022\r\n\tDropAlias\020m\022\016\n\nAlter" "on\020j\022\025\n\021ReleaseCollection\020k\022\017\n\013CreateAli"
"Alias\020n\022\024\n\017CreatePartition\020\310\001\022\022\n\rDropPar" "as\020l\022\r\n\tDropAlias\020m\022\016\n\nAlterAlias\020n\022\024\n\017C"
"tition\020\311\001\022\021\n\014HasPartition\020\312\001\022\026\n\021Describe" "reatePartition\020\310\001\022\022\n\rDropPartition\020\311\001\022\021\n"
"Partition\020\313\001\022\023\n\016ShowPartitions\020\314\001\022\023\n\016Loa" "\014HasPartition\020\312\001\022\026\n\021DescribePartition\020\313\001"
"dPartitions\020\315\001\022\026\n\021ReleasePartitions\020\316\001\022\021" "\022\023\n\016ShowPartitions\020\314\001\022\023\n\016LoadPartitions\020"
"\n\014ShowSegments\020\372\001\022\024\n\017DescribeSegment\020\373\001\022" "\315\001\022\026\n\021ReleasePartitions\020\316\001\022\021\n\014ShowSegmen"
"\021\n\014LoadSegments\020\374\001\022\024\n\017ReleaseSegments\020\375\001" "ts\020\372\001\022\024\n\017DescribeSegment\020\373\001\022\021\n\014LoadSegme"
"\022\024\n\017HandoffSegments\020\376\001\022\030\n\023LoadBalanceSeg" "nts\020\374\001\022\024\n\017ReleaseSegments\020\375\001\022\024\n\017HandoffS"
"ments\020\377\001\022\025\n\020DescribeSegments\020\200\002\022\020\n\013Creat" "egments\020\376\001\022\030\n\023LoadBalanceSegments\020\377\001\022\025\n\020"
"eIndex\020\254\002\022\022\n\rDescribeIndex\020\255\002\022\016\n\tDropInd" "DescribeSegments\020\200\002\022\020\n\013CreateIndex\020\254\002\022\022\n"
"ex\020\256\002\022\013\n\006Insert\020\220\003\022\013\n\006Delete\020\221\003\022\n\n\005Flush" "\rDescribeIndex\020\255\002\022\016\n\tDropIndex\020\256\002\022\013\n\006Ins"
"\020\222\003\022\027\n\022ResendSegmentStats\020\223\003\022\013\n\006Search\020\364" "ert\020\220\003\022\013\n\006Delete\020\221\003\022\n\n\005Flush\020\222\003\022\027\n\022Resen"
"\003\022\021\n\014SearchResult\020\365\003\022\022\n\rGetIndexState\020\366\003" "dSegmentStats\020\223\003\022\013\n\006Search\020\364\003\022\021\n\014SearchR"
"\022\032\n\025GetIndexBuildProgress\020\367\003\022\034\n\027GetColle" "esult\020\365\003\022\022\n\rGetIndexState\020\366\003\022\032\n\025GetIndex"
"ctionStatistics\020\370\003\022\033\n\026GetPartitionStatis" "BuildProgress\020\367\003\022\034\n\027GetCollectionStatist"
"tics\020\371\003\022\r\n\010Retrieve\020\372\003\022\023\n\016RetrieveResult" "ics\020\370\003\022\033\n\026GetPartitionStatistics\020\371\003\022\r\n\010R"
"\020\373\003\022\024\n\017WatchDmChannels\020\374\003\022\025\n\020RemoveDmCha" "etrieve\020\372\003\022\023\n\016RetrieveResult\020\373\003\022\024\n\017Watch"
"nnels\020\375\003\022\027\n\022WatchQueryChannels\020\376\003\022\030\n\023Rem" "DmChannels\020\374\003\022\025\n\020RemoveDmChannels\020\375\003\022\027\n\022"
"oveQueryChannels\020\377\003\022\035\n\030SealedSegmentsCha" "WatchQueryChannels\020\376\003\022\030\n\023RemoveQueryChan"
"ngeInfo\020\200\004\022\027\n\022WatchDeltaChannels\020\201\004\022\024\n\017G" "nels\020\377\003\022\035\n\030SealedSegmentsChangeInfo\020\200\004\022\027"
"etShardLeaders\020\202\004\022\020\n\013GetReplicas\020\203\004\022\020\n\013S" "\n\022WatchDeltaChannels\020\201\004\022\024\n\017GetShardLeade"
"egmentInfo\020\330\004\022\017\n\nSystemInfo\020\331\004\022\024\n\017GetRec" "rs\020\202\004\022\020\n\013GetReplicas\020\203\004\022\020\n\013SegmentInfo\020\330"
"overyInfo\020\332\004\022\024\n\017GetSegmentState\020\333\004\022\r\n\010Ti" "\004\022\017\n\nSystemInfo\020\331\004\022\024\n\017GetRecoveryInfo\020\332\004"
"meTick\020\260\t\022\023\n\016QueryNodeStats\020\261\t\022\016\n\tLoadIn" "\022\024\n\017GetSegmentState\020\333\004\022\r\n\010TimeTick\020\260\t\022\023\n"
"dex\020\262\t\022\016\n\tRequestID\020\263\t\022\017\n\nRequestTSO\020\264\t\022" "\016QueryNodeStats\020\261\t\022\016\n\tLoadIndex\020\262\t\022\016\n\tRe"
"\024\n\017AllocateSegment\020\265\t\022\026\n\021SegmentStatisti" "questID\020\263\t\022\017\n\nRequestTSO\020\264\t\022\024\n\017AllocateS"
"cs\020\266\t\022\025\n\020SegmentFlushDone\020\267\t\022\017\n\nDataNode" "egment\020\265\t\022\026\n\021SegmentStatistics\020\266\t\022\025\n\020Seg"
"Tt\020\270\t\022\025\n\020CreateCredential\020\334\013\022\022\n\rGetCrede" "mentFlushDone\020\267\t\022\017\n\nDataNodeTt\020\270\t\022\025\n\020Cre"
"ntial\020\335\013\022\025\n\020DeleteCredential\020\336\013\022\025\n\020Updat" "ateCredential\020\334\013\022\022\n\rGetCredential\020\335\013\022\025\n\020"
"eCredential\020\337\013\022\026\n\021ListCredUsernames\020\340\013\022\017" "DeleteCredential\020\336\013\022\025\n\020UpdateCredential\020"
"\n\nCreateRole\020\300\014\022\r\n\010DropRole\020\301\014\022\024\n\017Operat" "\337\013\022\026\n\021ListCredUsernames\020\340\013\022\017\n\nCreateRole"
"eUserRole\020\302\014\022\017\n\nSelectRole\020\303\014\022\017\n\nSelectU" "\020\300\014\022\r\n\010DropRole\020\301\014\022\024\n\017OperateUserRole\020\302\014"
"ser\020\304\014\022\023\n\016SelectResource\020\305\014\022\025\n\020OperatePr" "\022\017\n\nSelectRole\020\303\014\022\017\n\nSelectUser\020\304\014\022\023\n\016Se"
"ivilege\020\306\014\022\020\n\013SelectGrant\020\307\014\022\033\n\026RefreshP" "lectResource\020\305\014\022\025\n\020OperatePrivilege\020\306\014\022\020"
"olicyInfoCache\020\310\014\022\017\n\nListPolicy\020\311\014*\"\n\007Ds" "\n\013SelectGrant\020\307\014\022\033\n\026RefreshPolicyInfoCac"
"lType\022\007\n\003Dsl\020\000\022\016\n\nBoolExprV1\020\001*B\n\017Compac" "he\020\310\014\022\017\n\nListPolicy\020\311\014*\"\n\007DslType\022\007\n\003Dsl"
"tionState\022\021\n\rUndefiedState\020\000\022\r\n\tExecutin" "\020\000\022\016\n\nBoolExprV1\020\001*B\n\017CompactionState\022\021\n"
"g\020\001\022\r\n\tCompleted\020\002*X\n\020ConsistencyLevel\022\n" "\rUndefiedState\020\000\022\r\n\tExecuting\020\001\022\r\n\tCompl"
"\n\006Strong\020\000\022\013\n\007Session\020\001\022\013\n\007Bounded\020\002\022\016\n\n" "eted\020\002*X\n\020ConsistencyLevel\022\n\n\006Strong\020\000\022\013"
"Eventually\020\003\022\016\n\nCustomized\020\004*\257\001\n\013ImportS" "\n\007Session\020\001\022\013\n\007Bounded\020\002\022\016\n\nEventually\020\003"
"tate\022\021\n\rImportPending\020\000\022\020\n\014ImportFailed\020" "\022\016\n\nCustomized\020\004*\257\001\n\013ImportState\022\021\n\rImpo"
"\001\022\021\n\rImportStarted\020\002\022\024\n\020ImportDownloaded" "rtPending\020\000\022\020\n\014ImportFailed\020\001\022\021\n\rImportS"
"\020\003\022\020\n\014ImportParsed\020\004\022\023\n\017ImportPersisted\020" "tarted\020\002\022\024\n\020ImportDownloaded\020\003\022\020\n\014Import"
"\005\022\023\n\017ImportCompleted\020\006\022\026\n\022ImportAllocSeg" "Parsed\020\004\022\023\n\017ImportPersisted\020\005\022\023\n\017ImportC"
"ment\020\n*(\n\nObjectType\022\016\n\nCollection\020\000\022\n\n\006" "ompleted\020\006\022\026\n\022ImportAllocSegment\020\n*2\n\nOb"
"Global\020\001*\212\002\n\017ObjectPrivilege\022\020\n\014Privileg" "jectType\022\016\n\nCollection\020\000\022\n\n\006Global\020\001\022\010\n\004"
"eAll\020\000\022\035\n\031PrivilegeCreateCollection\020\001\022\033\n" "User\020\002*\206\005\n\017ObjectPrivilege\022\020\n\014PrivilegeA"
"\027PrivilegeDropCollection\020\002\022\037\n\033PrivilegeD" "ll\020\000\022\035\n\031PrivilegeCreateCollection\020\001\022\033\n\027P"
"escribeCollection\020\003\022\034\n\030PrivilegeShowColl" "rivilegeDropCollection\020\002\022\037\n\033PrivilegeDes"
"ections\020\004\022\021\n\rPrivilegeLoad\020\005\022\024\n\020Privileg" "cribeCollection\020\003\022\034\n\030PrivilegeShowCollec"
"eRelease\020\006\022\027\n\023PrivilegeCompaction\020\007\022\023\n\017P" "tions\020\004\022\021\n\rPrivilegeLoad\020\005\022\024\n\020PrivilegeR"
"rivilegeInsert\020\010\022\023\n\017PrivilegeDelete\020\t:^\n" "elease\020\006\022\027\n\023PrivilegeCompaction\020\007\022\023\n\017Pri"
"\021privilege_ext_obj\022\037.google.protobuf.Mes" "vilegeInsert\020\010\022\023\n\017PrivilegeDelete\020\t\022\032\n\026P"
"sageOptions\030\351\007 \001(\0132!.milvus.proto.common" "rivilegeGetStatistics\020\n\022\030\n\024PrivilegeCrea"
".PrivilegeExtBW\n\016io.milvus.grpcB\013CommonP" "teIndex\020\013\022\030\n\024PrivilegeIndexDetail\020\014\022\026\n\022P"
"rotoP\001Z3github.com/milvus-io/milvus/inte" "rivilegeDropIndex\020\r\022\023\n\017PrivilegeSearch\020\016"
"rnal/proto/commonpb\240\001\001b\006proto3" "\022\022\n\016PrivilegeFlush\020\017\022\022\n\016PrivilegeQuery\020\020"
"\022\030\n\024PrivilegeLoadBalance\020\021\022\023\n\017PrivilegeI"
"mport\020\022\022\034\n\030PrivilegeCreateOwnership\020\023\022\027\n"
"\023PrivilegeUpdateUser\020\024\022\032\n\026PrivilegeDropO"
"wnership\020\025\022\034\n\030PrivilegeSelectOwnership\020\026"
"\022\034\n\030PrivilegeManageOwnership\020\027\022\027\n\023Privil"
"egeSelectUser\020\030:^\n\021privilege_ext_obj\022\037.g"
"oogle.protobuf.MessageOptions\030\351\007 \001(\0132!.m"
"ilvus.proto.common.PrivilegeExtBW\n\016io.mi"
"lvus.grpcB\013CommonProtoP\001Z3github.com/mil"
"vus-io/milvus/internal/proto/commonpb\240\001\001"
"b\006proto3"
; ;
static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor_table_common_2eproto_deps[1] = { static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor_table_common_2eproto_deps[1] = {
&::descriptor_table_google_2fprotobuf_2fdescriptor_2eproto, &::descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
@ -477,7 +489,7 @@ static ::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase*const descriptor_table_com
static ::PROTOBUF_NAMESPACE_ID::internal::once_flag descriptor_table_common_2eproto_once; static ::PROTOBUF_NAMESPACE_ID::internal::once_flag descriptor_table_common_2eproto_once;
static bool descriptor_table_common_2eproto_initialized = false; static bool descriptor_table_common_2eproto_initialized = false;
const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_common_2eproto = { const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_common_2eproto = {
&descriptor_table_common_2eproto_initialized, descriptor_table_protodef_common_2eproto, "common.proto", 4750, &descriptor_table_common_2eproto_initialized, descriptor_table_protodef_common_2eproto, "common.proto", 5168,
&descriptor_table_common_2eproto_once, descriptor_table_common_2eproto_sccs, descriptor_table_common_2eproto_deps, 11, 1, &descriptor_table_common_2eproto_once, descriptor_table_common_2eproto_sccs, descriptor_table_common_2eproto_deps, 11, 1,
schemas, file_default_instances, TableStruct_common_2eproto::offsets, schemas, file_default_instances, TableStruct_common_2eproto::offsets,
file_level_metadata_common_2eproto, 11, file_level_enum_descriptors_common_2eproto, file_level_service_descriptors_common_2eproto, file_level_metadata_common_2eproto, 11, file_level_enum_descriptors_common_2eproto, file_level_service_descriptors_common_2eproto,
@ -763,6 +775,7 @@ bool ObjectType_IsValid(int value) {
switch (value) { switch (value) {
case 0: case 0:
case 1: case 1:
case 2:
return true; return true;
default: default:
return false; return false;
@ -785,6 +798,21 @@ bool ObjectPrivilege_IsValid(int value) {
case 7: case 7:
case 8: case 8:
case 9: case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
return true; return true;
default: default:
return false; return false;
@ -3948,15 +3976,15 @@ PrivilegeExt::PrivilegeExt(const PrivilegeExt& from)
_internal_metadata_(nullptr) { _internal_metadata_(nullptr) {
_internal_metadata_.MergeFrom(from._internal_metadata_); _internal_metadata_.MergeFrom(from._internal_metadata_);
::memcpy(&object_type_, &from.object_type_, ::memcpy(&object_type_, &from.object_type_,
static_cast<size_t>(reinterpret_cast<char*>(&object_name_index_) - static_cast<size_t>(reinterpret_cast<char*>(&object_name_indexs_) -
reinterpret_cast<char*>(&object_type_)) + sizeof(object_name_index_)); reinterpret_cast<char*>(&object_type_)) + sizeof(object_name_indexs_));
// @@protoc_insertion_point(copy_constructor:milvus.proto.common.PrivilegeExt) // @@protoc_insertion_point(copy_constructor:milvus.proto.common.PrivilegeExt)
} }
void PrivilegeExt::SharedCtor() { void PrivilegeExt::SharedCtor() {
::memset(&object_type_, 0, static_cast<size_t>( ::memset(&object_type_, 0, static_cast<size_t>(
reinterpret_cast<char*>(&object_name_index_) - reinterpret_cast<char*>(&object_name_indexs_) -
reinterpret_cast<char*>(&object_type_)) + sizeof(object_name_index_)); reinterpret_cast<char*>(&object_type_)) + sizeof(object_name_indexs_));
} }
PrivilegeExt::~PrivilegeExt() { PrivilegeExt::~PrivilegeExt() {
@ -3983,8 +4011,8 @@ void PrivilegeExt::Clear() {
(void) cached_has_bits; (void) cached_has_bits;
::memset(&object_type_, 0, static_cast<size_t>( ::memset(&object_type_, 0, static_cast<size_t>(
reinterpret_cast<char*>(&object_name_index_) - reinterpret_cast<char*>(&object_name_indexs_) -
reinterpret_cast<char*>(&object_type_)) + sizeof(object_name_index_)); reinterpret_cast<char*>(&object_type_)) + sizeof(object_name_indexs_));
_internal_metadata_.Clear(); _internal_metadata_.Clear();
} }
@ -4019,6 +4047,13 @@ const char* PrivilegeExt::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_I
CHK_(ptr); CHK_(ptr);
} else goto handle_unusual; } else goto handle_unusual;
continue; continue;
// int32 object_name_indexs = 4;
case 4:
if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 32)) {
object_name_indexs_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
CHK_(ptr);
} else goto handle_unusual;
continue;
default: { default: {
handle_unusual: handle_unusual:
if ((tag & 7) == 4 || tag == 0) { if ((tag & 7) == 4 || tag == 0) {
@ -4090,6 +4125,19 @@ bool PrivilegeExt::MergePartialFromCodedStream(
break; break;
} }
// int32 object_name_indexs = 4;
case 4: {
if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (32 & 0xFF)) {
DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32>(
input, &object_name_indexs_)));
} else {
goto handle_unusual;
}
break;
}
default: { default: {
handle_unusual: handle_unusual:
if (tag == 0) { if (tag == 0) {
@ -4134,6 +4182,11 @@ void PrivilegeExt::SerializeWithCachedSizes(
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32(3, this->object_name_index(), output); ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32(3, this->object_name_index(), output);
} }
// int32 object_name_indexs = 4;
if (this->object_name_indexs() != 0) {
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32(4, this->object_name_indexs(), output);
}
if (_internal_metadata_.have_unknown_fields()) { if (_internal_metadata_.have_unknown_fields()) {
::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFields( ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFields(
_internal_metadata_.unknown_fields(), output); _internal_metadata_.unknown_fields(), output);
@ -4164,6 +4217,11 @@ void PrivilegeExt::SerializeWithCachedSizes(
target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32ToArray(3, this->object_name_index(), target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32ToArray(3, this->object_name_index(), target);
} }
// int32 object_name_indexs = 4;
if (this->object_name_indexs() != 0) {
target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32ToArray(4, this->object_name_indexs(), target);
}
if (_internal_metadata_.have_unknown_fields()) { if (_internal_metadata_.have_unknown_fields()) {
target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFieldsToArray( target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFieldsToArray(
_internal_metadata_.unknown_fields(), target); _internal_metadata_.unknown_fields(), target);
@ -4204,6 +4262,13 @@ size_t PrivilegeExt::ByteSizeLong() const {
this->object_name_index()); this->object_name_index());
} }
// int32 object_name_indexs = 4;
if (this->object_name_indexs() != 0) {
total_size += 1 +
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size(
this->object_name_indexs());
}
int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size);
SetCachedSize(cached_size); SetCachedSize(cached_size);
return total_size; return total_size;
@ -4240,6 +4305,9 @@ void PrivilegeExt::MergeFrom(const PrivilegeExt& from) {
if (from.object_name_index() != 0) { if (from.object_name_index() != 0) {
set_object_name_index(from.object_name_index()); set_object_name_index(from.object_name_index());
} }
if (from.object_name_indexs() != 0) {
set_object_name_indexs(from.object_name_indexs());
}
} }
void PrivilegeExt::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { void PrivilegeExt::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) {
@ -4266,6 +4334,7 @@ void PrivilegeExt::InternalSwap(PrivilegeExt* other) {
swap(object_type_, other->object_type_); swap(object_type_, other->object_type_);
swap(object_privilege_, other->object_privilege_); swap(object_privilege_, other->object_privilege_);
swap(object_name_index_, other->object_name_index_); swap(object_name_index_, other->object_name_index_);
swap(object_name_indexs_, other->object_name_indexs_);
} }
::PROTOBUF_NAMESPACE_ID::Metadata PrivilegeExt::GetMetadata() const { ::PROTOBUF_NAMESPACE_ID::Metadata PrivilegeExt::GetMetadata() const {

View File

@ -481,12 +481,13 @@ inline bool ImportState_Parse(
enum ObjectType : int { enum ObjectType : int {
Collection = 0, Collection = 0,
Global = 1, Global = 1,
User = 2,
ObjectType_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::min(), ObjectType_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::min(),
ObjectType_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::max() ObjectType_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::max()
}; };
bool ObjectType_IsValid(int value); bool ObjectType_IsValid(int value);
constexpr ObjectType ObjectType_MIN = Collection; constexpr ObjectType ObjectType_MIN = Collection;
constexpr ObjectType ObjectType_MAX = Global; constexpr ObjectType ObjectType_MAX = User;
constexpr int ObjectType_ARRAYSIZE = ObjectType_MAX + 1; constexpr int ObjectType_ARRAYSIZE = ObjectType_MAX + 1;
const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* ObjectType_descriptor(); const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* ObjectType_descriptor();
@ -514,12 +515,27 @@ enum ObjectPrivilege : int {
PrivilegeCompaction = 7, PrivilegeCompaction = 7,
PrivilegeInsert = 8, PrivilegeInsert = 8,
PrivilegeDelete = 9, PrivilegeDelete = 9,
PrivilegeGetStatistics = 10,
PrivilegeCreateIndex = 11,
PrivilegeIndexDetail = 12,
PrivilegeDropIndex = 13,
PrivilegeSearch = 14,
PrivilegeFlush = 15,
PrivilegeQuery = 16,
PrivilegeLoadBalance = 17,
PrivilegeImport = 18,
PrivilegeCreateOwnership = 19,
PrivilegeUpdateUser = 20,
PrivilegeDropOwnership = 21,
PrivilegeSelectOwnership = 22,
PrivilegeManageOwnership = 23,
PrivilegeSelectUser = 24,
ObjectPrivilege_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::min(), ObjectPrivilege_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::min(),
ObjectPrivilege_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::max() ObjectPrivilege_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::max()
}; };
bool ObjectPrivilege_IsValid(int value); bool ObjectPrivilege_IsValid(int value);
constexpr ObjectPrivilege ObjectPrivilege_MIN = PrivilegeAll; constexpr ObjectPrivilege ObjectPrivilege_MIN = PrivilegeAll;
constexpr ObjectPrivilege ObjectPrivilege_MAX = PrivilegeDelete; constexpr ObjectPrivilege ObjectPrivilege_MAX = PrivilegeSelectUser;
constexpr int ObjectPrivilege_ARRAYSIZE = ObjectPrivilege_MAX + 1; constexpr int ObjectPrivilege_ARRAYSIZE = ObjectPrivilege_MAX + 1;
const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* ObjectPrivilege_descriptor(); const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* ObjectPrivilege_descriptor();
@ -2112,6 +2128,7 @@ class PrivilegeExt :
kObjectTypeFieldNumber = 1, kObjectTypeFieldNumber = 1,
kObjectPrivilegeFieldNumber = 2, kObjectPrivilegeFieldNumber = 2,
kObjectNameIndexFieldNumber = 3, kObjectNameIndexFieldNumber = 3,
kObjectNameIndexsFieldNumber = 4,
}; };
// .milvus.proto.common.ObjectType object_type = 1; // .milvus.proto.common.ObjectType object_type = 1;
void clear_object_type(); void clear_object_type();
@ -2128,6 +2145,11 @@ class PrivilegeExt :
::PROTOBUF_NAMESPACE_ID::int32 object_name_index() const; ::PROTOBUF_NAMESPACE_ID::int32 object_name_index() const;
void set_object_name_index(::PROTOBUF_NAMESPACE_ID::int32 value); void set_object_name_index(::PROTOBUF_NAMESPACE_ID::int32 value);
// int32 object_name_indexs = 4;
void clear_object_name_indexs();
::PROTOBUF_NAMESPACE_ID::int32 object_name_indexs() const;
void set_object_name_indexs(::PROTOBUF_NAMESPACE_ID::int32 value);
// @@protoc_insertion_point(class_scope:milvus.proto.common.PrivilegeExt) // @@protoc_insertion_point(class_scope:milvus.proto.common.PrivilegeExt)
private: private:
class _Internal; class _Internal;
@ -2136,6 +2158,7 @@ class PrivilegeExt :
int object_type_; int object_type_;
int object_privilege_; int object_privilege_;
::PROTOBUF_NAMESPACE_ID::int32 object_name_index_; ::PROTOBUF_NAMESPACE_ID::int32 object_name_index_;
::PROTOBUF_NAMESPACE_ID::int32 object_name_indexs_;
mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
friend struct ::TableStruct_common_2eproto; friend struct ::TableStruct_common_2eproto;
}; };
@ -2990,6 +3013,20 @@ inline void PrivilegeExt::set_object_name_index(::PROTOBUF_NAMESPACE_ID::int32 v
// @@protoc_insertion_point(field_set:milvus.proto.common.PrivilegeExt.object_name_index) // @@protoc_insertion_point(field_set:milvus.proto.common.PrivilegeExt.object_name_index)
} }
// int32 object_name_indexs = 4;
inline void PrivilegeExt::clear_object_name_indexs() {
object_name_indexs_ = 0;
}
inline ::PROTOBUF_NAMESPACE_ID::int32 PrivilegeExt::object_name_indexs() const {
// @@protoc_insertion_point(field_get:milvus.proto.common.PrivilegeExt.object_name_indexs)
return object_name_indexs_;
}
inline void PrivilegeExt::set_object_name_indexs(::PROTOBUF_NAMESPACE_ID::int32 value) {
object_name_indexs_ = value;
// @@protoc_insertion_point(field_set:milvus.proto.common.PrivilegeExt.object_name_indexs)
}
#ifdef __GNUC__ #ifdef __GNUC__
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
#endif // __GNUC__ #endif // __GNUC__

View File

@ -276,6 +276,7 @@ enum ImportState {
enum ObjectType { enum ObjectType {
Collection = 0; Collection = 0;
Global = 1; Global = 1;
User = 2;
} }
enum ObjectPrivilege { enum ObjectPrivilege {
@ -289,12 +290,29 @@ enum ObjectPrivilege {
PrivilegeCompaction = 7; PrivilegeCompaction = 7;
PrivilegeInsert = 8; PrivilegeInsert = 8;
PrivilegeDelete = 9; PrivilegeDelete = 9;
PrivilegeGetStatistics = 10;
PrivilegeCreateIndex = 11;
PrivilegeIndexDetail = 12;
PrivilegeDropIndex = 13;
PrivilegeSearch = 14;
PrivilegeFlush = 15;
PrivilegeQuery = 16;
PrivilegeLoadBalance = 17;
PrivilegeImport = 18;
PrivilegeCreateOwnership = 19;
PrivilegeUpdateUser = 20;
PrivilegeDropOwnership = 21;
PrivilegeSelectOwnership = 22;
PrivilegeManageOwnership = 23;
PrivilegeSelectUser = 24;
} }
message PrivilegeExt { message PrivilegeExt {
ObjectType object_type = 1; ObjectType object_type = 1;
ObjectPrivilege object_privilege = 2; ObjectPrivilege object_privilege = 2;
int32 object_name_index = 3; int32 object_name_index = 3;
int32 object_name_indexs = 4;
} }
extend google.protobuf.MessageOptions { extend google.protobuf.MessageOptions {

View File

@ -685,16 +685,19 @@ type ObjectType int32
const ( const (
ObjectType_Collection ObjectType = 0 ObjectType_Collection ObjectType = 0
ObjectType_Global ObjectType = 1 ObjectType_Global ObjectType = 1
ObjectType_User ObjectType = 2
) )
var ObjectType_name = map[int32]string{ var ObjectType_name = map[int32]string{
0: "Collection", 0: "Collection",
1: "Global", 1: "Global",
2: "User",
} }
var ObjectType_value = map[string]int32{ var ObjectType_value = map[string]int32{
"Collection": 0, "Collection": 0,
"Global": 1, "Global": 1,
"User": 2,
} }
func (x ObjectType) String() string { func (x ObjectType) String() string {
@ -718,6 +721,21 @@ const (
ObjectPrivilege_PrivilegeCompaction ObjectPrivilege = 7 ObjectPrivilege_PrivilegeCompaction ObjectPrivilege = 7
ObjectPrivilege_PrivilegeInsert ObjectPrivilege = 8 ObjectPrivilege_PrivilegeInsert ObjectPrivilege = 8
ObjectPrivilege_PrivilegeDelete ObjectPrivilege = 9 ObjectPrivilege_PrivilegeDelete ObjectPrivilege = 9
ObjectPrivilege_PrivilegeGetStatistics ObjectPrivilege = 10
ObjectPrivilege_PrivilegeCreateIndex ObjectPrivilege = 11
ObjectPrivilege_PrivilegeIndexDetail ObjectPrivilege = 12
ObjectPrivilege_PrivilegeDropIndex ObjectPrivilege = 13
ObjectPrivilege_PrivilegeSearch ObjectPrivilege = 14
ObjectPrivilege_PrivilegeFlush ObjectPrivilege = 15
ObjectPrivilege_PrivilegeQuery ObjectPrivilege = 16
ObjectPrivilege_PrivilegeLoadBalance ObjectPrivilege = 17
ObjectPrivilege_PrivilegeImport ObjectPrivilege = 18
ObjectPrivilege_PrivilegeCreateOwnership ObjectPrivilege = 19
ObjectPrivilege_PrivilegeUpdateUser ObjectPrivilege = 20
ObjectPrivilege_PrivilegeDropOwnership ObjectPrivilege = 21
ObjectPrivilege_PrivilegeSelectOwnership ObjectPrivilege = 22
ObjectPrivilege_PrivilegeManageOwnership ObjectPrivilege = 23
ObjectPrivilege_PrivilegeSelectUser ObjectPrivilege = 24
) )
var ObjectPrivilege_name = map[int32]string{ var ObjectPrivilege_name = map[int32]string{
@ -731,6 +749,21 @@ var ObjectPrivilege_name = map[int32]string{
7: "PrivilegeCompaction", 7: "PrivilegeCompaction",
8: "PrivilegeInsert", 8: "PrivilegeInsert",
9: "PrivilegeDelete", 9: "PrivilegeDelete",
10: "PrivilegeGetStatistics",
11: "PrivilegeCreateIndex",
12: "PrivilegeIndexDetail",
13: "PrivilegeDropIndex",
14: "PrivilegeSearch",
15: "PrivilegeFlush",
16: "PrivilegeQuery",
17: "PrivilegeLoadBalance",
18: "PrivilegeImport",
19: "PrivilegeCreateOwnership",
20: "PrivilegeUpdateUser",
21: "PrivilegeDropOwnership",
22: "PrivilegeSelectOwnership",
23: "PrivilegeManageOwnership",
24: "PrivilegeSelectUser",
} }
var ObjectPrivilege_value = map[string]int32{ var ObjectPrivilege_value = map[string]int32{
@ -744,6 +777,21 @@ var ObjectPrivilege_value = map[string]int32{
"PrivilegeCompaction": 7, "PrivilegeCompaction": 7,
"PrivilegeInsert": 8, "PrivilegeInsert": 8,
"PrivilegeDelete": 9, "PrivilegeDelete": 9,
"PrivilegeGetStatistics": 10,
"PrivilegeCreateIndex": 11,
"PrivilegeIndexDetail": 12,
"PrivilegeDropIndex": 13,
"PrivilegeSearch": 14,
"PrivilegeFlush": 15,
"PrivilegeQuery": 16,
"PrivilegeLoadBalance": 17,
"PrivilegeImport": 18,
"PrivilegeCreateOwnership": 19,
"PrivilegeUpdateUser": 20,
"PrivilegeDropOwnership": 21,
"PrivilegeSelectOwnership": 22,
"PrivilegeManageOwnership": 23,
"PrivilegeSelectUser": 24,
} }
func (x ObjectPrivilege) String() string { func (x ObjectPrivilege) String() string {
@ -1231,6 +1279,7 @@ type PrivilegeExt struct {
ObjectType ObjectType `protobuf:"varint,1,opt,name=object_type,json=objectType,proto3,enum=milvus.proto.common.ObjectType" json:"object_type,omitempty"` ObjectType ObjectType `protobuf:"varint,1,opt,name=object_type,json=objectType,proto3,enum=milvus.proto.common.ObjectType" json:"object_type,omitempty"`
ObjectPrivilege ObjectPrivilege `protobuf:"varint,2,opt,name=object_privilege,json=objectPrivilege,proto3,enum=milvus.proto.common.ObjectPrivilege" json:"object_privilege,omitempty"` ObjectPrivilege ObjectPrivilege `protobuf:"varint,2,opt,name=object_privilege,json=objectPrivilege,proto3,enum=milvus.proto.common.ObjectPrivilege" json:"object_privilege,omitempty"`
ObjectNameIndex int32 `protobuf:"varint,3,opt,name=object_name_index,json=objectNameIndex,proto3" json:"object_name_index,omitempty"` ObjectNameIndex int32 `protobuf:"varint,3,opt,name=object_name_index,json=objectNameIndex,proto3" json:"object_name_index,omitempty"`
ObjectNameIndexs int32 `protobuf:"varint,4,opt,name=object_name_indexs,json=objectNameIndexs,proto3" json:"object_name_indexs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -1282,6 +1331,13 @@ func (m *PrivilegeExt) GetObjectNameIndex() int32 {
return 0 return 0
} }
func (m *PrivilegeExt) GetObjectNameIndexs() int32 {
if m != nil {
return m.ObjectNameIndexs
}
return 0
}
var E_PrivilegeExtObj = &proto.ExtensionDesc{ var E_PrivilegeExtObj = &proto.ExtensionDesc{
ExtendedType: (*descriptor.MessageOptions)(nil), ExtendedType: (*descriptor.MessageOptions)(nil),
ExtensionType: (*PrivilegeExt)(nil), ExtensionType: (*PrivilegeExt)(nil),
@ -1320,152 +1376,160 @@ func init() {
func init() { proto.RegisterFile("common.proto", fileDescriptor_555bd8c177793206) } func init() { proto.RegisterFile("common.proto", fileDescriptor_555bd8c177793206) }
var fileDescriptor_555bd8c177793206 = []byte{ var fileDescriptor_555bd8c177793206 = []byte{
// 2342 bytes of a gzipped FileDescriptorProto // 2473 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0x49, 0x73, 0x24, 0x47, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0x49, 0x73, 0x24, 0x47,
0xf5, 0x57, 0x75, 0xf7, 0xa8, 0xd5, 0xd9, 0x2d, 0x29, 0x95, 0xd2, 0x68, 0xda, 0xb3, 0x78, 0xe4, 0xf5, 0x57, 0x75, 0xb7, 0x96, 0xce, 0x6e, 0x49, 0x4f, 0x29, 0x8d, 0xa6, 0x3d, 0x8b, 0x47, 0xd6,
0xfe, 0xdb, 0x7f, 0x44, 0x83, 0x25, 0xb0, 0x23, 0x80, 0x20, 0xc2, 0x04, 0x52, 0xb7, 0xa4, 0xe9, 0xdf, 0xfe, 0x33, 0x08, 0x5b, 0x03, 0xe3, 0x08, 0x20, 0x88, 0x30, 0x81, 0xd4, 0x2d, 0x69, 0x14,
0xb0, 0x96, 0xa6, 0xa4, 0x19, 0x3b, 0x88, 0x00, 0x45, 0x76, 0xd5, 0x53, 0xab, 0x66, 0xaa, 0x2a, 0x1e, 0x2d, 0x94, 0x34, 0xb6, 0x83, 0x08, 0x98, 0x48, 0x55, 0x3d, 0x75, 0xd7, 0x4c, 0x75, 0x65,
0x8b, 0xca, 0x6c, 0x8d, 0x9a, 0x93, 0x31, 0x37, 0x4e, 0x60, 0xbe, 0x00, 0x1f, 0x80, 0x7d, 0x31, 0x51, 0x99, 0xad, 0x51, 0x73, 0x32, 0x26, 0x82, 0x33, 0x98, 0x2f, 0xc0, 0x07, 0x60, 0x5f, 0x0c,
0x1c, 0xd9, 0xb1, 0x01, 0x73, 0xe1, 0xc2, 0x0e, 0x47, 0xb8, 0xb3, 0x7a, 0x25, 0x5e, 0x66, 0x6d, 0x47, 0x76, 0x6c, 0xb6, 0x0b, 0x17, 0x76, 0x38, 0xc2, 0x9d, 0xd5, 0x2b, 0xf1, 0x32, 0x6b, 0x6b,
0xd2, 0xc8, 0x70, 0xe0, 0x56, 0xf9, 0x7b, 0x2f, 0xdf, 0x96, 0x6f, 0xc9, 0x2c, 0xd2, 0x70, 0x44, 0xcd, 0x18, 0x0e, 0xdc, 0x3a, 0x7f, 0xef, 0xe5, 0xdb, 0x97, 0xac, 0x66, 0x4d, 0x4f, 0xf6, 0xfb,
0x10, 0x88, 0x70, 0x25, 0x8a, 0x85, 0x12, 0x6c, 0x3e, 0xf0, 0xfc, 0x93, 0x91, 0x34, 0xab, 0x15, 0x32, 0x5a, 0x8d, 0x13, 0xa9, 0x25, 0x9f, 0xef, 0x07, 0xe1, 0xc9, 0x40, 0xd9, 0xd3, 0xaa, 0x25,
0x43, 0xba, 0xba, 0x34, 0x14, 0x62, 0xe8, 0xc3, 0xaa, 0x06, 0x07, 0xa3, 0xa3, 0x55, 0x17, 0xa4, 0x5d, 0x58, 0xea, 0x4a, 0xd9, 0x0d, 0xf1, 0x9a, 0x01, 0x8f, 0x06, 0xc7, 0xd7, 0x7c, 0x54, 0x5e,
0x13, 0x7b, 0x91, 0x12, 0xb1, 0x61, 0x6c, 0x1d, 0x92, 0xc9, 0x7d, 0xc5, 0xd5, 0x48, 0xb2, 0xa7, 0x12, 0xc4, 0x5a, 0x26, 0x96, 0x71, 0xf9, 0x36, 0x9b, 0x38, 0xd0, 0x42, 0x0f, 0x14, 0x7f, 0x8a,
0x08, 0x81, 0x38, 0x16, 0xf1, 0xa1, 0x23, 0x5c, 0x68, 0x5a, 0x4b, 0xd6, 0xf2, 0xcc, 0x13, 0x0f, 0x31, 0x4c, 0x12, 0x99, 0xdc, 0xf6, 0xa4, 0x8f, 0x2d, 0x67, 0xc9, 0xb9, 0x3a, 0x73, 0xfd, 0xe1,
0xaf, 0x5c, 0x20, 0x75, 0x65, 0x03, 0xd9, 0x3a, 0xc2, 0x05, 0xbb, 0x06, 0xe9, 0x27, 0x5b, 0x24, 0xd5, 0x07, 0x48, 0x5d, 0xdd, 0x20, 0xb6, 0xb6, 0xf4, 0xd1, 0xad, 0x63, 0xf6, 0x93, 0x2f, 0xb2,
0x93, 0x31, 0x70, 0x29, 0xc2, 0x66, 0x69, 0xc9, 0x5a, 0xae, 0xd9, 0xc9, 0xaa, 0xf5, 0x3e, 0xd2, 0x89, 0x04, 0x85, 0x92, 0x51, 0xab, 0xb2, 0xe4, 0x5c, 0xad, 0xbb, 0xe9, 0x69, 0xf9, 0xbd, 0xac,
0x78, 0x1a, 0xc6, 0x77, 0xb8, 0x3f, 0x82, 0x3e, 0xf7, 0x62, 0x46, 0x49, 0xf9, 0x1e, 0x8c, 0xb5, 0xf9, 0x34, 0x0e, 0x9f, 0x11, 0xe1, 0x00, 0xf7, 0x45, 0x90, 0x70, 0x60, 0xd5, 0xbb, 0x38, 0x34,
0xfc, 0x9a, 0x8d, 0x9f, 0x6c, 0x81, 0x5c, 0x3a, 0x41, 0x72, 0xb2, 0xd1, 0x2c, 0x5a, 0x4f, 0x92, 0xf2, 0xeb, 0x2e, 0xfd, 0xe4, 0x0b, 0x6c, 0xfc, 0x84, 0xc8, 0xe9, 0x45, 0x7b, 0x58, 0x7e, 0x92,
0xfa, 0xd3, 0x30, 0xee, 0x72, 0xc5, 0xdf, 0x66, 0x1b, 0x23, 0x15, 0x97, 0x2b, 0xae, 0x77, 0x35, 0x35, 0x9e, 0xc6, 0x61, 0x47, 0x68, 0xf1, 0x36, 0xd7, 0x38, 0xab, 0xf9, 0x42, 0x0b, 0x73, 0xab,
0x6c, 0xfd, 0xdd, 0xba, 0x4e, 0x2a, 0xeb, 0xbe, 0x18, 0xe4, 0x22, 0x2d, 0x4d, 0x4c, 0x44, 0x9e, 0xe9, 0x9a, 0xdf, 0xcb, 0x97, 0x58, 0x6d, 0x3d, 0x94, 0x47, 0x85, 0x48, 0xc7, 0x10, 0x53, 0x91,
0x10, 0xda, 0xf7, 0xb9, 0x03, 0xc7, 0xc2, 0x77, 0x21, 0xd6, 0x26, 0xa1, 0x5c, 0xc5, 0x87, 0xa9, 0x27, 0x0c, 0xf6, 0x43, 0xe1, 0x61, 0x4f, 0x86, 0x3e, 0x26, 0xc6, 0x24, 0x92, 0xab, 0x45, 0x37,
0x5c, 0xc5, 0x87, 0xec, 0x03, 0xa4, 0xa2, 0xc6, 0x91, 0xb1, 0x66, 0xe6, 0x89, 0x47, 0x2f, 0x8c, 0x93, 0xab, 0x45, 0x97, 0xbf, 0x9f, 0xd5, 0xf4, 0x30, 0xb6, 0xd6, 0xcc, 0x5c, 0x7f, 0xf4, 0x81,
0x40, 0x41, 0xcc, 0xc1, 0x38, 0x02, 0x5b, 0xef, 0xc0, 0x10, 0x68, 0x45, 0xb2, 0x59, 0x5e, 0x2a, 0x11, 0x28, 0x89, 0x39, 0x1c, 0xc6, 0xe8, 0x9a, 0x1b, 0x14, 0x02, 0xa3, 0x48, 0xb5, 0xaa, 0x4b,
0x2f, 0x37, 0xec, 0x64, 0xd5, 0xfa, 0xd8, 0x19, 0xbd, 0x5b, 0xb1, 0x18, 0x45, 0xac, 0x47, 0x1a, 0xd5, 0xab, 0x4d, 0x37, 0x3d, 0x2d, 0x7f, 0x74, 0x44, 0xef, 0x56, 0x22, 0x07, 0x31, 0xdf, 0x66,
0x51, 0x8e, 0xc9, 0xa6, 0xb5, 0x54, 0x5e, 0xae, 0x3f, 0xf1, 0xd8, 0x7f, 0xd3, 0xa6, 0x8d, 0xb6, 0xcd, 0xb8, 0xc0, 0x54, 0xcb, 0x59, 0xaa, 0x5e, 0x6d, 0x5c, 0x7f, 0xec, 0xbf, 0x69, 0x33, 0x46,
0xcf, 0x6c, 0x6d, 0x3d, 0x4e, 0xaa, 0x6b, 0xae, 0x1b, 0x83, 0x94, 0x6c, 0x86, 0x94, 0xbc, 0x28, 0xbb, 0x23, 0x57, 0x97, 0x9f, 0x60, 0x93, 0x6b, 0xbe, 0x9f, 0xa0, 0x52, 0x7c, 0x86, 0x55, 0x82,
0x71, 0xa6, 0xe4, 0x45, 0x18, 0xa3, 0x48, 0xc4, 0x4a, 0xfb, 0x52, 0xb6, 0xf5, 0x77, 0xeb, 0x05, 0x38, 0x75, 0xa6, 0x12, 0xc4, 0x14, 0xa3, 0x58, 0x26, 0xda, 0xf8, 0x52, 0x75, 0xcd, 0xef, 0xe5,
0x8b, 0x54, 0x77, 0xe4, 0x70, 0x9d, 0x4b, 0x60, 0xef, 0x27, 0x53, 0x81, 0x1c, 0x1e, 0x6a, 0x7f, 0x17, 0x1d, 0x36, 0xb9, 0xa3, 0xba, 0xeb, 0x42, 0x21, 0x7f, 0x1f, 0x9b, 0xea, 0xab, 0xee, 0x6d,
0xcd, 0x89, 0x5f, 0xbf, 0xd0, 0x82, 0x1d, 0x39, 0xd4, 0x7e, 0x56, 0x03, 0xf3, 0x81, 0x01, 0x0e, 0xe3, 0xaf, 0xcd, 0xf8, 0xa5, 0x07, 0x5a, 0xb0, 0xa3, 0xba, 0xc6, 0xcf, 0xc9, 0xbe, 0xfd, 0x41,
0xe4, 0xb0, 0xd7, 0x4d, 0x24, 0x9b, 0x05, 0xbb, 0x4e, 0x6a, 0xca, 0x0b, 0x40, 0x2a, 0x1e, 0x44, 0x01, 0xee, 0xab, 0xee, 0x76, 0x27, 0x95, 0x6c, 0x0f, 0xfc, 0x12, 0xab, 0xeb, 0xa0, 0x8f, 0x4a,
0xcd, 0xf2, 0x92, 0xb5, 0x5c, 0xb1, 0x73, 0x80, 0x5d, 0x25, 0x53, 0x52, 0x8c, 0x62, 0x07, 0x7a, 0x8b, 0x7e, 0xdc, 0xaa, 0x2e, 0x39, 0x57, 0x6b, 0x6e, 0x01, 0xf0, 0x0b, 0x6c, 0x4a, 0xc9, 0x41,
0xdd, 0x66, 0x45, 0x6f, 0xcb, 0xd6, 0xad, 0xa7, 0x48, 0x6d, 0x47, 0x0e, 0x6f, 0x01, 0x77, 0x21, 0xe2, 0xe1, 0x76, 0xa7, 0x55, 0x33, 0xd7, 0xf2, 0xf3, 0xf2, 0x53, 0xac, 0xbe, 0xa3, 0xba, 0x37,
0x66, 0xef, 0x21, 0x95, 0x01, 0x97, 0xc6, 0xa2, 0xfa, 0xdb, 0x5b, 0x84, 0x1e, 0xd8, 0x9a, 0xb3, 0x50, 0xf8, 0x98, 0xf0, 0x77, 0xb3, 0xda, 0x91, 0x50, 0xd6, 0xa2, 0xc6, 0xdb, 0x5b, 0x44, 0x1e,
0xf5, 0x71, 0xd2, 0xe8, 0xee, 0x6c, 0xff, 0x0f, 0x12, 0xd0, 0x74, 0x79, 0xcc, 0x63, 0x77, 0x97, 0xb8, 0x86, 0x73, 0xf9, 0x63, 0xac, 0xd9, 0xd9, 0xb9, 0xf9, 0x3f, 0x48, 0x20, 0xd3, 0x55, 0x4f,
0x07, 0x69, 0x22, 0xe6, 0x40, 0xeb, 0x15, 0x8b, 0x34, 0xfa, 0xb1, 0x77, 0xe2, 0xf9, 0x30, 0x84, 0x24, 0xfe, 0xae, 0xe8, 0x67, 0x85, 0x58, 0x00, 0xcb, 0xaf, 0x39, 0xac, 0xb9, 0x9f, 0x04, 0x27,
0x8d, 0x53, 0xc5, 0x3e, 0x4c, 0xea, 0x62, 0x70, 0x17, 0x1c, 0x55, 0x8c, 0xdd, 0xcd, 0x0b, 0xf5, 0x41, 0x88, 0x5d, 0xdc, 0x38, 0xd5, 0xfc, 0x43, 0xac, 0x21, 0x8f, 0xee, 0xa0, 0xa7, 0xcb, 0xb1,
0xec, 0x69, 0x3e, 0x1d, 0x3e, 0x22, 0xb2, 0x6f, 0xb6, 0x47, 0x68, 0x22, 0x21, 0x4a, 0x05, 0xff, 0xbb, 0xf2, 0x40, 0x3d, 0x7b, 0x86, 0xcf, 0x84, 0x8f, 0xc9, 0xfc, 0x37, 0xdf, 0x63, 0x90, 0x4a,
0xc7, 0x94, 0x33, 0x62, 0x32, 0x23, 0xec, 0x59, 0x71, 0x16, 0x60, 0x6d, 0x32, 0x97, 0x08, 0x0c, 0x88, 0x33, 0xc1, 0xff, 0xb1, 0xe4, 0xac, 0x98, 0xdc, 0x08, 0x77, 0x56, 0x8e, 0x02, 0x7c, 0x85,
0x79, 0x00, 0x87, 0x5e, 0xe8, 0xc2, 0xa9, 0x3e, 0x84, 0x4b, 0x29, 0x2f, 0xba, 0xd2, 0x43, 0xb8, 0xcd, 0xa5, 0x02, 0x23, 0xd1, 0xc7, 0xdb, 0x41, 0xe4, 0xe3, 0xa9, 0x49, 0xc2, 0x78, 0xc6, 0x4b,
0xfd, 0xcb, 0x29, 0x52, 0xcb, 0xaa, 0x98, 0xd5, 0x49, 0x75, 0x7f, 0xe4, 0x38, 0x20, 0x25, 0x9d, 0xae, 0x6c, 0x13, 0xcc, 0x1f, 0x67, 0xfc, 0x3e, 0x5e, 0x65, 0x92, 0x32, 0xee, 0xc2, 0x19, 0x66,
0x60, 0xf3, 0x64, 0xf6, 0x76, 0x08, 0xa7, 0x11, 0x38, 0x0a, 0x5c, 0xcd, 0x43, 0x2d, 0x36, 0x47, 0xb5, 0xf2, 0xcb, 0x29, 0x56, 0xcf, 0x7b, 0x9e, 0x37, 0xd8, 0xe4, 0xc1, 0xc0, 0xf3, 0x50, 0x29,
0xa6, 0x3b, 0x22, 0x0c, 0xc1, 0x51, 0x9b, 0xdc, 0xf3, 0xc1, 0xa5, 0x25, 0xb6, 0x40, 0x68, 0x1f, 0x18, 0xe3, 0xf3, 0x6c, 0xf6, 0x56, 0x84, 0xa7, 0x31, 0x7a, 0x1a, 0x7d, 0xc3, 0x03, 0x0e, 0x9f,
0xe2, 0xc0, 0x93, 0xd2, 0x13, 0x61, 0x17, 0x42, 0x0f, 0x5c, 0x5a, 0x66, 0x57, 0xc8, 0x7c, 0x47, 0x63, 0xd3, 0x6d, 0x19, 0x45, 0xe8, 0xe9, 0x4d, 0x11, 0x84, 0xe8, 0x43, 0x85, 0x2f, 0x30, 0xd8,
0xf8, 0x3e, 0x38, 0xca, 0x13, 0xe1, 0xae, 0x50, 0x1b, 0xa7, 0x9e, 0x54, 0x92, 0x56, 0x50, 0x6c, 0xc7, 0xa4, 0x1f, 0x28, 0x15, 0xc8, 0xa8, 0x83, 0x51, 0x80, 0x3e, 0x54, 0xf9, 0x79, 0x36, 0xdf,
0xcf, 0xf7, 0x61, 0xc8, 0xfd, 0xb5, 0x78, 0x38, 0x0a, 0x20, 0x54, 0xf4, 0x12, 0xca, 0x48, 0xc0, 0x96, 0x61, 0x88, 0x9e, 0x0e, 0x64, 0xb4, 0x2b, 0xf5, 0xc6, 0x69, 0xa0, 0xb4, 0x82, 0x1a, 0x89,
0xae, 0x17, 0x40, 0x88, 0x92, 0x68, 0xb5, 0x80, 0x6a, 0x63, 0x31, 0x5a, 0x74, 0x8a, 0x3d, 0x44, 0xdd, 0x0e, 0x43, 0xec, 0x8a, 0x70, 0x2d, 0xe9, 0x0e, 0xfa, 0x18, 0x69, 0x18, 0x27, 0x19, 0x29,
0x2e, 0x27, 0x68, 0x41, 0x01, 0x0f, 0x80, 0xd6, 0xd8, 0x2c, 0xa9, 0x27, 0xa4, 0x83, 0xbd, 0xfe, 0xd8, 0x09, 0xfa, 0x18, 0x91, 0x24, 0x98, 0x2c, 0xa1, 0xc6, 0x5a, 0x8a, 0x2d, 0x4c, 0xf1, 0x87,
0xd3, 0x94, 0x14, 0x24, 0xd8, 0xe2, 0xbe, 0x0d, 0x8e, 0x88, 0x5d, 0x5a, 0x2f, 0x98, 0x70, 0x07, 0xd8, 0xb9, 0x14, 0x2d, 0x29, 0x10, 0x7d, 0x84, 0x3a, 0x9f, 0x65, 0x8d, 0x94, 0x74, 0xb8, 0xb7,
0x1c, 0x25, 0xe2, 0x5e, 0x97, 0x36, 0xd0, 0xe0, 0x04, 0xdc, 0x07, 0x1e, 0x3b, 0xc7, 0x36, 0xc8, 0xff, 0x34, 0xb0, 0x92, 0x04, 0x57, 0xde, 0x73, 0xd1, 0x93, 0x89, 0x0f, 0x8d, 0x92, 0x09, 0xcf,
0x91, 0xaf, 0xe8, 0x34, 0xa3, 0xa4, 0xb1, 0xe9, 0xf9, 0xb0, 0x2b, 0xd4, 0xa6, 0x18, 0x85, 0x2e, 0xa0, 0xa7, 0x65, 0xb2, 0xdd, 0x81, 0x26, 0x19, 0x9c, 0x82, 0x07, 0x28, 0x12, 0xaf, 0xe7, 0xa2,
0x9d, 0x61, 0x33, 0x84, 0xec, 0x80, 0xe2, 0x49, 0x04, 0x66, 0x51, 0x6d, 0x87, 0x3b, 0xc7, 0x90, 0x1a, 0x84, 0x1a, 0xa6, 0x39, 0xb0, 0xe6, 0x66, 0x10, 0xe2, 0xae, 0xd4, 0x9b, 0x72, 0x10, 0xf9,
0x00, 0x94, 0x2d, 0x12, 0xd6, 0xe1, 0x61, 0x28, 0x54, 0x27, 0x06, 0xae, 0x60, 0x53, 0xd7, 0x27, 0x30, 0xc3, 0x67, 0x18, 0xdb, 0x41, 0x2d, 0xd2, 0x08, 0xcc, 0x92, 0xda, 0xb6, 0xf0, 0x7a, 0x98,
0x9d, 0x43, 0x73, 0xce, 0xe0, 0x9e, 0x0f, 0x94, 0xe5, 0xdc, 0x5d, 0xf0, 0x21, 0xe3, 0x9e, 0xcf, 0x02, 0xc0, 0x17, 0x19, 0x6f, 0x8b, 0x28, 0x92, 0xba, 0x9d, 0xa0, 0xd0, 0xb8, 0x69, 0xba, 0x19,
0xb9, 0x13, 0x1c, 0xb9, 0x17, 0xd0, 0xf8, 0xf5, 0x91, 0xe7, 0xbb, 0x3a, 0x24, 0xe6, 0x58, 0x2e, 0xe6, 0xc8, 0x9c, 0x11, 0x3c, 0x08, 0x11, 0x78, 0xc1, 0xdd, 0xc1, 0x10, 0x73, 0xee, 0xf9, 0x82,
0xa3, 0x8d, 0x89, 0xf1, 0xbb, 0xdb, 0xbd, 0xfd, 0x03, 0xba, 0xc8, 0x2e, 0x93, 0xb9, 0x04, 0xd9, 0x3b, 0xc5, 0x89, 0x7b, 0x81, 0x8c, 0x5f, 0x1f, 0x04, 0xa1, 0x6f, 0x42, 0x62, 0xd3, 0x72, 0x8e,
0x01, 0x15, 0x7b, 0x8e, 0x0e, 0xde, 0x15, 0x34, 0x75, 0x6f, 0xa4, 0xf6, 0x8e, 0x76, 0x20, 0x10, 0x6c, 0x4c, 0x8d, 0xdf, 0xbd, 0xb9, 0x7d, 0x70, 0x08, 0x8b, 0xfc, 0x1c, 0x9b, 0x4b, 0x91, 0x1d,
0xf1, 0x98, 0x36, 0xf1, 0x40, 0xb5, 0xa4, 0xf4, 0x88, 0xe8, 0x43, 0xa8, 0x61, 0x23, 0x88, 0xd4, 0xd4, 0x49, 0xe0, 0x99, 0xe0, 0x9d, 0x27, 0x53, 0xf7, 0x06, 0x7a, 0xef, 0x78, 0x07, 0xfb, 0x32,
0x38, 0x0f, 0x2f, 0xbd, 0xca, 0xae, 0x91, 0x2b, 0xb7, 0x23, 0x97, 0x2b, 0xe8, 0x05, 0xd8, 0x3c, 0x19, 0x42, 0x8b, 0x12, 0x6a, 0x24, 0x65, 0x29, 0x82, 0x87, 0x48, 0xc3, 0x46, 0x3f, 0xd6, 0xc3,
0x0e, 0xb8, 0xbc, 0x87, 0xee, 0x8e, 0x62, 0xa0, 0xd7, 0xd8, 0x55, 0xb2, 0x78, 0xf6, 0x2c, 0xb2, 0x22, 0xbc, 0x70, 0x81, 0x5f, 0x64, 0xe7, 0x6f, 0xc5, 0xbe, 0xd0, 0xb8, 0xdd, 0xa7, 0x51, 0x73,
0x60, 0x5d, 0xc7, 0x8d, 0xc6, 0xdb, 0x4e, 0x0c, 0x2e, 0x84, 0xca, 0xe3, 0x7e, 0xba, 0xf1, 0x46, 0x28, 0xd4, 0x5d, 0x72, 0x77, 0x90, 0x20, 0x5c, 0xe4, 0x17, 0xd8, 0xe2, 0x68, 0x2e, 0xf2, 0x60,
0x2e, 0xf5, 0x41, 0xe2, 0xc3, 0x48, 0x34, 0x9e, 0x3f, 0x48, 0xbc, 0xc9, 0x9a, 0x64, 0x61, 0x0b, 0x5d, 0xa2, 0x8b, 0xd6, 0xdb, 0x76, 0x82, 0x3e, 0x46, 0x3a, 0x10, 0x61, 0x76, 0xf1, 0x72, 0x21,
0xd4, 0x83, 0x94, 0x25, 0xa4, 0x6c, 0x7b, 0x52, 0x93, 0x6e, 0x4b, 0x88, 0x65, 0x4a, 0x79, 0x84, 0xf5, 0x7e, 0xe2, 0xc3, 0x44, 0xb4, 0x9e, 0xdf, 0x4f, 0xbc, 0xc2, 0x5b, 0x6c, 0x61, 0x0b, 0xf5,
0x31, 0x32, 0xb3, 0x05, 0x0a, 0xc1, 0x14, 0x6b, 0x61, 0x9c, 0x8c, 0x79, 0xb6, 0xf0, 0x21, 0x85, 0xfd, 0x94, 0x25, 0xa2, 0xdc, 0x0c, 0x94, 0x21, 0xdd, 0x52, 0x98, 0xa8, 0x8c, 0xf2, 0x08, 0xe7,
0xff, 0x0f, 0x63, 0xd0, 0x8d, 0x45, 0x54, 0x04, 0x1f, 0x45, 0x37, 0xf7, 0x22, 0x88, 0xb9, 0x02, 0x6c, 0x66, 0x0b, 0x35, 0x81, 0x19, 0xb6, 0x4c, 0x71, 0xb2, 0xe6, 0xb9, 0x32, 0xc4, 0x0c, 0xfe,
0x94, 0x51, 0xa4, 0x3d, 0x86, 0x72, 0xf6, 0x01, 0x23, 0x50, 0x84, 0xff, 0x3f, 0x87, 0x8b, 0x5a, 0x3f, 0x8a, 0x41, 0x27, 0x91, 0x71, 0x19, 0x7c, 0x94, 0xdc, 0xdc, 0x8b, 0x31, 0x11, 0x1a, 0x49,
0xdf, 0x81, 0x39, 0x9c, 0x70, 0x83, 0xe9, 0x7c, 0x29, 0x69, 0x19, 0xbd, 0x4e, 0x94, 0x64, 0x15, 0x46, 0x99, 0xf6, 0x18, 0xc9, 0x39, 0x40, 0x8a, 0x40, 0x19, 0xfe, 0xff, 0x02, 0x2e, 0x6b, 0x7d,
0x9d, 0x12, 0xdf, 0x89, 0xa9, 0x62, 0xf6, 0x6d, 0xc5, 0x3c, 0x54, 0x29, 0xde, 0x66, 0x8f, 0x90, 0x07, 0xd5, 0x70, 0xca, 0x8d, 0x76, 0x4e, 0x66, 0xa4, 0xab, 0xe4, 0x75, 0xaa, 0x24, 0xef, 0xff,
0x1b, 0x36, 0x1c, 0xc5, 0x20, 0x8f, 0xfb, 0xc2, 0xf7, 0x9c, 0x71, 0x2f, 0x3c, 0x12, 0x59, 0x4a, 0x8c, 0xf8, 0x4e, 0x2a, 0x15, 0x7b, 0x6f, 0x2b, 0x11, 0x91, 0xce, 0xf0, 0x15, 0xfe, 0x08, 0xbb,
0x22, 0xcb, 0xbb, 0xd0, 0x12, 0x0c, 0x8b, 0xa1, 0xa7, 0xf0, 0xbb, 0x31, 0x26, 0xbb, 0x42, 0xed, 0xec, 0xe2, 0x71, 0x82, 0xaa, 0xb7, 0x2f, 0xc3, 0xc0, 0x1b, 0x6e, 0x47, 0xc7, 0x32, 0x2f, 0x49,
0x63, 0x83, 0xdb, 0xd6, 0x2d, 0x93, 0x3e, 0x8e, 0x5a, 0x76, 0x85, 0x0d, 0x91, 0xef, 0x39, 0x7c, 0x62, 0x79, 0x17, 0x59, 0x42, 0x61, 0xb1, 0xf4, 0x0c, 0x7e, 0x9c, 0x62, 0xb2, 0x2b, 0xf5, 0x01,
0xed, 0x84, 0x7b, 0x3e, 0x1f, 0xf8, 0x40, 0x57, 0x30, 0x28, 0xfb, 0x30, 0xc4, 0x92, 0xcd, 0xce, 0x8d, 0xc3, 0x9b, 0x66, 0xc0, 0xc2, 0x13, 0xa4, 0x65, 0x57, 0xba, 0x18, 0x87, 0x81, 0x27, 0xd6,
0x77, 0x95, 0x31, 0x32, 0xdd, 0xed, 0xda, 0xf0, 0x89, 0x11, 0x48, 0x65, 0x73, 0x07, 0xe8, 0x9f, 0x4e, 0x44, 0x10, 0x8a, 0xa3, 0x10, 0x61, 0x95, 0x82, 0x72, 0x80, 0x5d, 0x6a, 0xd9, 0x3c, 0xbf,
0xab, 0xed, 0x67, 0x09, 0xd1, 0x49, 0x85, 0x17, 0x0a, 0x40, 0x15, 0xf9, 0x6a, 0x57, 0x84, 0x40, 0xd7, 0x38, 0x67, 0xd3, 0x9d, 0x8e, 0x8b, 0x1f, 0x1f, 0xa0, 0xd2, 0xae, 0xf0, 0x10, 0xfe, 0x3c,
0x27, 0x58, 0x83, 0x4c, 0xdd, 0x0e, 0x3d, 0x29, 0x47, 0xe0, 0x52, 0x0b, 0x0b, 0xaa, 0x17, 0xf6, 0xb9, 0xf2, 0x1c, 0x63, 0xa6, 0xa8, 0xe8, 0xf9, 0x81, 0xa4, 0xa2, 0x38, 0xed, 0xca, 0x08, 0x61,
0x63, 0x31, 0xc4, 0xd9, 0x45, 0x4b, 0x48, 0xdd, 0xf4, 0x42, 0x4f, 0x1e, 0xeb, 0x56, 0x42, 0xc8, 0x8c, 0x37, 0xd9, 0xd4, 0xad, 0x28, 0x50, 0x6a, 0x80, 0x3e, 0x38, 0xd4, 0x50, 0xdb, 0xd1, 0x7e,
0x64, 0x52, 0x59, 0x95, 0xf6, 0xf3, 0x16, 0x69, 0x24, 0x36, 0x18, 0xe1, 0x0b, 0x84, 0x16, 0xd7, 0x22, 0xbb, 0xb4, 0xe9, 0xa0, 0x42, 0xd4, 0xcd, 0x20, 0x0a, 0x54, 0xcf, 0x8c, 0x12, 0xc6, 0x26,
0xb9, 0xf8, 0x2c, 0xa1, 0x2d, 0x6c, 0x6b, 0x5b, 0xb1, 0xb8, 0xef, 0x85, 0x43, 0x5a, 0x42, 0x69, 0xd2, 0xce, 0xaa, 0xad, 0xbc, 0xe0, 0xb0, 0x66, 0x6a, 0x83, 0x15, 0xbe, 0xc0, 0xa0, 0x7c, 0x2e,
0xfb, 0xc0, 0x7d, 0x2d, 0xb9, 0x4e, 0xaa, 0x9b, 0xfe, 0x48, 0xab, 0xa9, 0x68, 0xa5, 0xb8, 0x40, 0xc4, 0xe7, 0x05, 0xed, 0xd0, 0x58, 0xdb, 0x4a, 0xe4, 0xbd, 0x20, 0xea, 0x42, 0x85, 0xa4, 0x1d,
0xb6, 0x4b, 0x48, 0xc2, 0x04, 0x88, 0xc0, 0xa5, 0x93, 0x6c, 0x9a, 0xd4, 0x4c, 0xda, 0x23, 0xad, 0xa0, 0x08, 0x8d, 0xe4, 0x06, 0x9b, 0xdc, 0x0c, 0x07, 0x46, 0x4d, 0xcd, 0x28, 0xa5, 0x03, 0xb1,
0xda, 0xfe, 0x10, 0x99, 0x3d, 0x37, 0xf7, 0xd9, 0x14, 0xa9, 0x24, 0xaa, 0x29, 0x69, 0xac, 0x7b, 0x8d, 0x13, 0x89, 0x0a, 0x20, 0x46, 0x1f, 0x26, 0xf8, 0x34, 0xab, 0xdb, 0xb2, 0x27, 0xda, 0xe4,
0x21, 0x8f, 0xc7, 0xa6, 0xb7, 0x50, 0x17, 0x6b, 0x6e, 0xd3, 0x17, 0x5c, 0x25, 0x00, 0xb4, 0x5f, 0xca, 0x07, 0xd9, 0xec, 0x99, 0x57, 0x02, 0x9f, 0x62, 0xb5, 0x54, 0x35, 0xb0, 0xe6, 0x7a, 0x10,
0x6c, 0xe8, 0xc1, 0xab, 0x37, 0x4e, 0x93, 0xda, 0xed, 0xd0, 0x85, 0x23, 0x2f, 0x04, 0x97, 0x4e, 0x89, 0x64, 0x68, 0x67, 0x0b, 0xf8, 0xd4, 0x73, 0x9b, 0xa1, 0x14, 0x3a, 0x05, 0x70, 0xe5, 0xa5,
0xe8, 0x9a, 0x37, 0xd5, 0x92, 0x17, 0x9f, 0x8b, 0x11, 0x44, 0x63, 0x0a, 0x18, 0x60, 0xe1, 0xde, 0xa6, 0x59, 0xd3, 0xe6, 0xe2, 0x34, 0xab, 0xdf, 0x8a, 0x7c, 0x3c, 0x0e, 0x22, 0xf4, 0x61, 0xcc,
0xe2, 0xb2, 0x00, 0x1d, 0xe1, 0xb9, 0x75, 0xf5, 0xb5, 0x6e, 0x50, 0xdc, 0x3e, 0xd4, 0xe7, 0x76, 0xf4, 0xbc, 0xed, 0x96, 0xa2, 0xf9, 0x7c, 0x8a, 0x20, 0x19, 0x53, 0xc2, 0x90, 0x1a, 0xf7, 0x86,
0x2c, 0xee, 0xe7, 0x98, 0xa4, 0xc7, 0xa8, 0x69, 0x0b, 0xd4, 0xfe, 0x58, 0x2a, 0x08, 0x3a, 0x22, 0x50, 0x25, 0xe8, 0x98, 0xf2, 0xd6, 0x31, 0x8f, 0xc0, 0xa3, 0xf2, 0xf5, 0xae, 0xc9, 0x5b, 0x4f,
0x3c, 0xf2, 0x86, 0x92, 0x7a, 0xa8, 0x69, 0x5b, 0x70, 0xb7, 0xb0, 0xfd, 0x2e, 0x66, 0x8e, 0x0d, 0xde, 0x2b, 0x30, 0x05, 0x3d, 0xd2, 0xb4, 0x85, 0xfa, 0x60, 0xa8, 0x34, 0xf6, 0xdb, 0x32, 0x3a,
0x3e, 0x70, 0x59, 0x94, 0x7a, 0x4f, 0x77, 0x3d, 0x6d, 0xea, 0x9a, 0xef, 0x71, 0x49, 0x7d, 0x74, 0x0e, 0xba, 0x0a, 0x02, 0xd2, 0x74, 0x53, 0x0a, 0xbf, 0x74, 0xfd, 0x0e, 0x55, 0x8e, 0x8b, 0x21,
0x05, 0xad, 0x34, 0xcb, 0x00, 0x0f, 0x75, 0xcd, 0x57, 0x10, 0x9b, 0x75, 0xc8, 0x16, 0xc8, 0xac, 0x0a, 0x55, 0x96, 0x7a, 0xd7, 0x4c, 0x3d, 0x63, 0xea, 0x5a, 0x18, 0x08, 0x05, 0x21, 0xb9, 0x42,
0xe1, 0xef, 0xf3, 0x58, 0x79, 0x5a, 0xc8, 0x4b, 0x96, 0x4e, 0x9f, 0x58, 0x44, 0x39, 0xf6, 0x32, 0x56, 0xda, 0x63, 0x9f, 0x92, 0xba, 0x16, 0x6a, 0x4c, 0xec, 0x39, 0xe2, 0x0b, 0x6c, 0xd6, 0xf2,
0x0e, 0x99, 0xc6, 0x2d, 0x2e, 0x73, 0xe8, 0xa7, 0x16, 0x5b, 0x24, 0x73, 0xa9, 0x6b, 0x39, 0xfe, 0xef, 0x8b, 0x44, 0x07, 0x46, 0xc8, 0xcb, 0x8e, 0x29, 0x9f, 0x44, 0xc6, 0x05, 0xf6, 0x0a, 0x2d,
0x33, 0x8b, 0xcd, 0x93, 0x19, 0x74, 0x2d, 0xc3, 0x24, 0xfd, 0xb9, 0x06, 0xd1, 0x89, 0x02, 0xf8, 0x99, 0xe6, 0x0d, 0xa1, 0x0a, 0xe8, 0x27, 0x0e, 0x5f, 0x64, 0x73, 0x99, 0x6b, 0x05, 0xfe, 0x53,
0x8a, 0x96, 0x90, 0x78, 0x51, 0xc0, 0x7f, 0xa1, 0x95, 0xa1, 0x84, 0x24, 0x89, 0x24, 0x7d, 0xd5, 0x87, 0xcf, 0xb3, 0x19, 0x72, 0x2d, 0xc7, 0x14, 0xfc, 0xcc, 0x80, 0xe4, 0x44, 0x09, 0xfc, 0xb9,
0x42, 0x4b, 0x53, 0x65, 0x09, 0x4c, 0x5f, 0xd3, 0x8c, 0x28, 0x35, 0x63, 0x7c, 0x5d, 0x33, 0x26, 0x91, 0x90, 0x7a, 0x51, 0xc2, 0x7f, 0x61, 0x94, 0x91, 0x84, 0xb4, 0x88, 0x14, 0xbc, 0xea, 0x90,
0x32, 0x33, 0xf4, 0x0d, 0x8d, 0xde, 0xe2, 0xa1, 0x2b, 0x8e, 0x8e, 0x32, 0xf4, 0x4d, 0x8b, 0x35, 0xa5, 0x99, 0xb2, 0x14, 0x86, 0xd7, 0x0c, 0x23, 0x49, 0xcd, 0x19, 0x5f, 0x37, 0x8c, 0xa9, 0xcc,
0xc9, 0x3c, 0x6e, 0x5f, 0xe7, 0x3e, 0x0f, 0x9d, 0x9c, 0xff, 0x2d, 0x8b, 0x5d, 0x26, 0xf4, 0x9c, 0x1c, 0x7d, 0xc3, 0xa0, 0x37, 0x44, 0xe4, 0xcb, 0xe3, 0xe3, 0x1c, 0x7d, 0xd3, 0xe1, 0x2d, 0x36,
0x3a, 0x49, 0x9f, 0x2b, 0x31, 0x9a, 0xc6, 0x57, 0x17, 0x0f, 0xfd, 0x62, 0x49, 0xc7, 0x2a, 0x61, 0x4f, 0xd7, 0xd7, 0x45, 0x28, 0x22, 0xaf, 0xe0, 0x7f, 0xcb, 0xe1, 0xe7, 0x18, 0x9c, 0x51, 0xa7,
0x34, 0xd8, 0x97, 0x4a, 0x6c, 0xc6, 0x04, 0xdd, 0xac, 0xbf, 0x5c, 0x62, 0x75, 0x32, 0xd9, 0x0b, 0xe0, 0xf9, 0x0a, 0x87, 0x2c, 0xbe, 0xa6, 0x79, 0xe0, 0x0b, 0x15, 0x13, 0xab, 0x94, 0xd1, 0x62,
0x25, 0xc4, 0x8a, 0x7e, 0x16, 0xf3, 0x7b, 0xd2, 0x74, 0x50, 0xfa, 0x39, 0x2c, 0xa3, 0x4b, 0x3a, 0x5f, 0xac, 0xf0, 0x19, 0x1b, 0x74, 0x7b, 0xfe, 0x52, 0x85, 0x37, 0xd8, 0xc4, 0x76, 0xa4, 0x30,
0xbf, 0xe9, 0x0b, 0x38, 0x9d, 0x99, 0x0d, 0x12, 0x42, 0xb7, 0x50, 0x3b, 0x92, 0x7e, 0x5e, 0xef, 0xd1, 0xf0, 0x19, 0xaa, 0xef, 0x09, 0x3b, 0x41, 0xe1, 0xb3, 0xd4, 0x46, 0xe3, 0xa6, 0xbe, 0xe1,
0x30, 0xe3, 0x8f, 0xfe, 0xb5, 0xac, 0x43, 0x53, 0x9c, 0x85, 0x7f, 0x2b, 0xa3, 0x09, 0x5b, 0xa0, 0x45, 0xda, 0xce, 0xdc, 0x45, 0x85, 0x91, 0x5f, 0xea, 0x1d, 0x05, 0x9f, 0x33, 0x37, 0xec, 0xfa,
0xf2, 0x72, 0xa6, 0x7f, 0x2f, 0xb3, 0xab, 0xe4, 0x72, 0x8a, 0xe9, 0xc9, 0x94, 0x15, 0xf2, 0x3f, 0x83, 0xbf, 0x56, 0x4d, 0x68, 0xca, 0xbb, 0xf0, 0x6f, 0x55, 0x32, 0x61, 0x0b, 0x75, 0xd1, 0xce,
0xca, 0xec, 0x3a, 0xb9, 0x82, 0x6d, 0x3a, 0xcb, 0x1b, 0xdc, 0xe4, 0x49, 0xe5, 0x39, 0x92, 0xfe, 0xf0, 0xf7, 0x2a, 0xbf, 0xc0, 0xce, 0x65, 0x98, 0xd9, 0x4c, 0x79, 0x23, 0xff, 0xa3, 0xca, 0x2f,
0xb3, 0xcc, 0xae, 0x91, 0xc5, 0x2d, 0x50, 0xd9, 0x79, 0x14, 0x88, 0xff, 0x2a, 0xb3, 0x69, 0x32, 0xb1, 0xf3, 0x34, 0xa6, 0xf3, 0xba, 0xa1, 0x4b, 0x81, 0xd2, 0x81, 0xa7, 0xe0, 0x9f, 0x55, 0x7e,
0x65, 0xe3, 0xe8, 0x82, 0x13, 0xa0, 0xaf, 0x96, 0xf1, 0x50, 0xd3, 0x65, 0x62, 0xce, 0x6b, 0x65, 0x91, 0x2d, 0x6e, 0xa1, 0xce, 0xf3, 0x51, 0x22, 0xfe, 0xab, 0xca, 0xa7, 0xd9, 0x94, 0x4b, 0xab,
0x0c, 0xf5, 0x33, 0x5c, 0x39, 0xc7, 0xdd, 0xa0, 0x73, 0xcc, 0xc3, 0x10, 0x7c, 0x49, 0x5f, 0x2f, 0x0b, 0x4f, 0x10, 0x5e, 0xad, 0x52, 0x52, 0xb3, 0x63, 0x6a, 0xce, 0x6b, 0x55, 0x0a, 0xf5, 0xb3,
0x63, 0x40, 0x6d, 0x08, 0xc4, 0x09, 0x14, 0xe0, 0x37, 0xb4, 0xd3, 0x9a, 0xf9, 0x23, 0x23, 0x88, 0x42, 0x7b, 0xbd, 0x4e, 0xbf, 0xdd, 0x13, 0x51, 0x84, 0xa1, 0x82, 0xd7, 0xab, 0x14, 0x50, 0x17,
0xc7, 0x19, 0xe1, 0xcd, 0x32, 0x1e, 0x8d, 0xe1, 0x3f, 0x4b, 0x79, 0xab, 0xcc, 0x6e, 0x90, 0xa6, 0xfb, 0xf2, 0x04, 0x4b, 0xf0, 0x1b, 0xc6, 0x69, 0xc3, 0xfc, 0xe1, 0x01, 0x26, 0xc3, 0x9c, 0xf0,
0x69, 0x16, 0xe9, 0xc1, 0x20, 0x71, 0x08, 0xd8, 0x5e, 0xe9, 0x73, 0x95, 0x4c, 0x62, 0x17, 0x7c, 0x66, 0x95, 0x52, 0x63, 0xf9, 0x47, 0x29, 0x6f, 0x55, 0xf9, 0x65, 0xd6, 0xb2, 0xc3, 0x22, 0x4b,
0xc5, 0xb3, 0x7d, 0x9f, 0xaa, 0xa0, 0x5d, 0x58, 0x5c, 0x79, 0x57, 0x95, 0xf4, 0xf9, 0x0a, 0x9e, 0x0c, 0x11, 0xbb, 0x48, 0xe3, 0x15, 0x9e, 0xaf, 0xe5, 0x12, 0x3b, 0x18, 0x6a, 0x91, 0xdf, 0xfb,
0xe8, 0x16, 0xa8, 0xa4, 0xb1, 0x4a, 0xfa, 0x69, 0x8d, 0x24, 0x92, 0xb5, 0xc8, 0x5f, 0x55, 0xd8, 0x64, 0x8d, 0xec, 0xa2, 0xe6, 0x2a, 0xa6, 0xaa, 0x82, 0x17, 0x6a, 0x94, 0xd1, 0x2d, 0xd4, 0xe9,
0x2c, 0x21, 0xa6, 0x26, 0x35, 0xf0, 0xeb, 0x54, 0x14, 0xde, 0x5d, 0x4e, 0x20, 0xd6, 0x8d, 0x9d, 0x60, 0x55, 0xf0, 0x29, 0x83, 0xa4, 0x92, 0x8d, 0xc8, 0x5f, 0xd5, 0xf8, 0x2c, 0x63, 0xb6, 0x27,
0xfe, 0x26, 0x53, 0x50, 0xe8, 0x7c, 0xf4, 0xb7, 0x15, 0x0c, 0xd9, 0x81, 0x17, 0xc0, 0x81, 0xe7, 0x0d, 0xf0, 0xeb, 0x4c, 0x14, 0xbd, 0x5d, 0x4e, 0x30, 0x31, 0x83, 0x1d, 0x7e, 0x93, 0x2b, 0x28,
0xdc, 0xa3, 0x5f, 0xad, 0x61, 0xc8, 0xb4, 0x47, 0xbb, 0xc2, 0x05, 0x73, 0xc2, 0x5f, 0xab, 0x61, 0x4d, 0x3e, 0xf8, 0x6d, 0x8d, 0x42, 0x76, 0x18, 0xf4, 0xf1, 0x30, 0xf0, 0xee, 0xc2, 0x57, 0xea,
0xc2, 0x60, 0x1e, 0x9a, 0x84, 0xf9, 0xba, 0x5e, 0x27, 0xdd, 0xbb, 0xd7, 0xa5, 0xdf, 0xc0, 0x3b, 0x14, 0x32, 0xe3, 0xd1, 0xae, 0xf4, 0xd1, 0x66, 0xf8, 0xab, 0x75, 0x2a, 0x18, 0xaa, 0x43, 0x5b,
0x14, 0x49, 0xd6, 0x07, 0xfb, 0x7b, 0xf4, 0x9b, 0x35, 0x54, 0xb5, 0xe6, 0xfb, 0xc2, 0xe1, 0x2a, 0x30, 0x5f, 0x33, 0xe7, 0x74, 0x7a, 0x6f, 0x77, 0xe0, 0xeb, 0xf4, 0x86, 0x62, 0xe9, 0xf9, 0xf0,
0xab, 0x86, 0x6f, 0xd5, 0xb0, 0x9c, 0x0a, 0xda, 0x93, 0x53, 0x7b, 0xb1, 0x86, 0xb1, 0x4f, 0x70, 0x60, 0x0f, 0xbe, 0x51, 0x27, 0x55, 0x6b, 0x61, 0x28, 0x3d, 0xa1, 0xf3, 0x6e, 0xf8, 0x66, 0x9d,
0x9d, 0x6c, 0x5d, 0x6c, 0x8a, 0xdf, 0xd6, 0x52, 0xf1, 0x05, 0x87, 0x96, 0x1c, 0x28, 0xfa, 0x1d, 0xda, 0xa9, 0xa4, 0x3d, 0xcd, 0xda, 0x4b, 0x75, 0x8a, 0x7d, 0x8a, 0x9b, 0x62, 0xeb, 0xd0, 0x50,
0xcd, 0x77, 0xfe, 0x5a, 0x40, 0x7f, 0x57, 0x4f, 0xf2, 0xab, 0x80, 0xfd, 0xbe, 0x6e, 0xea, 0xe3, 0xfc, 0x96, 0x91, 0x4a, 0xdf, 0x7b, 0x64, 0xc9, 0xa1, 0x86, 0x6f, 0x1b, 0xbe, 0xb3, 0xcf, 0x02,
0xec, 0x3d, 0x80, 0xfe, 0x41, 0xc3, 0xe7, 0xef, 0x0e, 0xf4, 0x8f, 0x75, 0x34, 0xac, 0x38, 0xfe, 0xf8, 0x5d, 0x23, 0xad, 0xaf, 0x12, 0xf6, 0xfb, 0x86, 0xed, 0x8f, 0xd1, 0x77, 0x00, 0xfc, 0xc1,
0xf1, 0x0a, 0x2c, 0xe9, 0x9f, 0xea, 0x68, 0x41, 0x3e, 0xe8, 0xe9, 0x77, 0x1b, 0x18, 0xac, 0x74, 0xc0, 0x67, 0xdf, 0x0e, 0xf0, 0xc7, 0x06, 0x19, 0x56, 0x5e, 0xff, 0xf4, 0x08, 0x56, 0xf0, 0xa7,
0xc4, 0xd3, 0xef, 0x35, 0xd0, 0xcd, 0x73, 0xc3, 0x9d, 0x7e, 0xbf, 0xa1, 0x8f, 0x23, 0x1b, 0xeb, 0x06, 0x59, 0x50, 0x2c, 0x7a, 0xf8, 0x4e, 0x93, 0x82, 0x95, 0xad, 0x78, 0xf8, 0x6e, 0x93, 0xdc,
0xf4, 0x07, 0x05, 0x00, 0xb9, 0xe8, 0x0f, 0x1b, 0xba, 0x03, 0x9d, 0x19, 0xe5, 0xf4, 0x47, 0x0d, 0x3c, 0xb3, 0xdc, 0xe1, 0x7b, 0x4d, 0x93, 0x8e, 0x7c, 0xad, 0xc3, 0xf7, 0x4b, 0x00, 0x71, 0xc1,
0xb4, 0xed, 0xfc, 0x10, 0xa7, 0x3f, 0x6e, 0x98, 0xe3, 0xce, 0xc6, 0x37, 0xfd, 0x49, 0x03, 0x2b, 0x0f, 0x9a, 0x66, 0x02, 0x8d, 0xac, 0x72, 0xf8, 0x61, 0x93, 0x6c, 0x3b, 0xbb, 0xc4, 0xe1, 0x47,
0xe0, 0xe2, 0xc1, 0x4d, 0x5f, 0xd2, 0xba, 0xf2, 0x91, 0x4d, 0x5f, 0x6e, 0xb4, 0x5b, 0xa4, 0xda, 0x4d, 0x9b, 0xee, 0x7c, 0x7d, 0xc3, 0x8f, 0x9b, 0xd4, 0x01, 0x0f, 0x5e, 0xdc, 0xf0, 0xb2, 0xd1,
0x95, 0xbe, 0x9e, 0x1b, 0x55, 0x52, 0xee, 0x4a, 0x9f, 0x4e, 0x60, 0x9b, 0x5d, 0x17, 0xc2, 0xdf, 0x55, 0xac, 0x6c, 0x78, 0xa5, 0xb9, 0xb2, 0xcc, 0x26, 0x3b, 0x2a, 0x34, 0x7b, 0x63, 0x92, 0x55,
0x38, 0x8d, 0xe2, 0x3b, 0xef, 0xa5, 0x56, 0x7b, 0x9d, 0xcc, 0x76, 0x44, 0x10, 0xf1, 0xac, 0xdc, 0x3b, 0x2a, 0x84, 0x31, 0x1a, 0xb3, 0xeb, 0x52, 0x86, 0x1b, 0xa7, 0x71, 0xf2, 0xcc, 0x7b, 0xc0,
0xf4, 0xa8, 0x30, 0x33, 0x06, 0x5c, 0x93, 0x2a, 0x13, 0xd8, 0xab, 0x37, 0x4e, 0xc1, 0x19, 0xe9, 0x59, 0x59, 0x67, 0xb3, 0x6d, 0xd9, 0x8f, 0x45, 0xde, 0x6e, 0x66, 0x55, 0xd8, 0x1d, 0x83, 0xbe,
0x89, 0x66, 0xe1, 0x12, 0x37, 0x61, 0x90, 0x5d, 0x5a, 0x6a, 0x3f, 0x4b, 0x68, 0x47, 0x84, 0xd2, 0x2d, 0x95, 0x31, 0x9a, 0xd5, 0x1b, 0xa7, 0xe8, 0x0d, 0xcc, 0x46, 0x73, 0xe8, 0x48, 0x97, 0x28,
0x93, 0x0a, 0x42, 0x67, 0xbc, 0x0d, 0x27, 0xe0, 0xeb, 0xb9, 0xa9, 0x62, 0x11, 0x0e, 0xe9, 0x84, 0xc8, 0x3e, 0x54, 0x56, 0x9e, 0x63, 0xd0, 0x96, 0x91, 0x0a, 0x94, 0xc6, 0xc8, 0x1b, 0xde, 0xc4,
0x7e, 0x27, 0x80, 0xbe, 0xef, 0x9b, 0xe9, 0xba, 0x8e, 0x77, 0x01, 0xfd, 0x18, 0x98, 0x21, 0x64, 0x13, 0x0c, 0xcd, 0xde, 0xd4, 0x89, 0x8c, 0xba, 0x30, 0x66, 0xbe, 0x13, 0xd0, 0xbc, 0xf7, 0xed,
0xe3, 0x04, 0x42, 0x35, 0xe2, 0xbe, 0x3f, 0xa6, 0x65, 0x5c, 0x77, 0x46, 0x52, 0x89, 0xc0, 0xfb, 0x76, 0x5d, 0xa7, 0xb7, 0x80, 0xf9, 0x18, 0x98, 0x61, 0x6c, 0xe3, 0x04, 0x23, 0x3d, 0x10, 0x61,
0xa4, 0x9e, 0xdf, 0x5f, 0xb1, 0x48, 0xdd, 0x8c, 0xd2, 0xcc, 0x34, 0xb3, 0xec, 0x43, 0xe8, 0x7a, 0x38, 0x84, 0x2a, 0x9d, 0xdb, 0x03, 0xa5, 0x65, 0x3f, 0xf8, 0x84, 0xd9, 0xdf, 0x5f, 0x76, 0x58,
0x5a, 0x38, 0xde, 0x65, 0x35, 0x94, 0x0c, 0x7d, 0x2b, 0x67, 0xda, 0x57, 0x3c, 0x56, 0xe9, 0xa3, 0xc3, 0xae, 0xd2, 0xdc, 0x34, 0x7b, 0xdc, 0xc7, 0xc8, 0x0f, 0x8c, 0x70, 0x7a, 0xcb, 0x1a, 0x28,
0xc3, 0x40, 0x5d, 0x71, 0x3f, 0xf4, 0x05, 0x77, 0xf5, 0x3c, 0xcf, 0xb6, 0xf6, 0x79, 0x2c, 0xf5, 0x5d, 0xfa, 0x4e, 0xc1, 0x74, 0xa0, 0x45, 0xa2, 0xb3, 0x8f, 0x0e, 0x0b, 0x75, 0xe4, 0xbd, 0x28,
0x50, 0xc7, 0xab, 0x7e, 0x22, 0x3f, 0xd6, 0xfe, 0xb8, 0xf4, 0x52, 0x0e, 0xe6, 0x3e, 0x4f, 0xe2, 0x94, 0xc2, 0x37, 0xfb, 0x3c, 0xbf, 0xba, 0x2f, 0x12, 0x65, 0x96, 0x3a, 0x3d, 0xf5, 0x53, 0xf9,
0xf0, 0x34, 0xa0, 0x4e, 0xf6, 0x34, 0xd3, 0x49, 0x7b, 0x99, 0x90, 0xfc, 0xe1, 0xa6, 0xfd, 0xc9, 0x89, 0xf1, 0xc7, 0x87, 0xf1, 0x02, 0x2c, 0x7c, 0x9e, 0xa0, 0xe5, 0x69, 0x41, 0x53, 0xec, 0x59,
0x87, 0xe0, 0x04, 0x46, 0x65, 0xcb, 0x17, 0x03, 0xee, 0x53, 0xab, 0xfd, 0x99, 0x12, 0x99, 0x3d, 0xa5, 0xb3, 0x95, 0xeb, 0x8c, 0x15, 0x9f, 0x79, 0xc6, 0x9f, 0x62, 0x09, 0x8e, 0x51, 0x54, 0xb6,
0xf7, 0x38, 0x43, 0x8b, 0xb2, 0xc5, 0x9a, 0x8f, 0xe7, 0x75, 0x83, 0x3c, 0x94, 0x21, 0x0f, 0x8c, 0x42, 0x79, 0x24, 0x42, 0x70, 0xe8, 0x0d, 0x60, 0x8a, 0xa2, 0xb2, 0xf2, 0xe9, 0x71, 0x36, 0x7b,
0x7a, 0x0b, 0xaf, 0x7f, 0x19, 0xf9, 0xdc, 0xcc, 0x2f, 0xb1, 0x9b, 0xe4, 0x5a, 0x4e, 0x7c, 0x70, 0xe6, 0xa3, 0x8e, 0x6c, 0xcb, 0x0f, 0x6b, 0x21, 0x65, 0xee, 0x32, 0x7b, 0x28, 0x47, 0xee, 0x5b,
0xd2, 0x63, 0xbb, 0x6d, 0x66, 0x0c, 0xe7, 0x47, 0x7e, 0x05, 0xe3, 0x98, 0x51, 0xb1, 0x07, 0x98, 0xfa, 0x0e, 0x3d, 0x04, 0x73, 0xf2, 0x99, 0xed, 0x5f, 0xe1, 0x57, 0xd8, 0xc5, 0x82, 0x78, 0xff,
0x87, 0x57, 0xfe, 0x92, 0x34, 0xa3, 0x8c, 0x4e, 0xe2, 0x5b, 0x28, 0xb7, 0x31, 0x4b, 0x26, 0x5a, 0xce, 0xa7, 0xc1, 0xdb, 0xca, 0x19, 0xce, 0x2e, 0xff, 0x1a, 0x45, 0x34, 0xa7, 0xd2, 0x34, 0xb0,
0xc5, 0xc8, 0x65, 0x84, 0x64, 0xcc, 0x4c, 0x9d, 0x01, 0x93, 0x71, 0x53, 0xfb, 0xa0, 0x20, 0x73, 0x9f, 0x60, 0xc5, 0x17, 0xa8, 0x5d, 0x6a, 0x30, 0x41, 0x5f, 0x45, 0x85, 0x8d, 0x79, 0x59, 0xc1,
0xd9, 0x73, 0xf6, 0x10, 0x4e, 0xd5, 0xa1, 0x18, 0xdc, 0x65, 0x37, 0x57, 0xcc, 0x6f, 0xa8, 0x95, 0x24, 0xc5, 0x30, 0x27, 0xa4, 0x0b, 0x67, 0x6a, 0x04, 0x4c, 0x17, 0x4f, 0x9d, 0x5e, 0xcd, 0x39,
0xf4, 0x37, 0xd4, 0xca, 0x0e, 0x48, 0xc9, 0x87, 0xb0, 0x17, 0x69, 0x1b, 0x9b, 0x7f, 0xa9, 0xea, 0x48, 0x33, 0xab, 0x18, 0x17, 0x8c, 0xde, 0xea, 0x67, 0x42, 0x60, 0xe7, 0x52, 0x63, 0x84, 0x62,
0x77, 0xfa, 0x23, 0x17, 0xff, 0xfd, 0x28, 0xbc, 0xbb, 0xed, 0xd9, 0xa8, 0xb0, 0xda, 0x1b, 0xdc, 0xb0, 0x0e, 0x6a, 0x11, 0x84, 0xd0, 0xa4, 0x44, 0x8d, 0xc4, 0xc5, 0xde, 0x98, 0x1e, 0x51, 0x9e,
0x5d, 0x7f, 0x86, 0xcc, 0x78, 0x22, 0xdd, 0x37, 0x8c, 0x23, 0x67, 0xbd, 0xde, 0xd1, 0xfb, 0xfa, 0xee, 0xb0, 0x19, 0x7a, 0xcf, 0x14, 0xcf, 0x68, 0xb3, 0xfd, 0x66, 0x47, 0x30, 0x33, 0x1f, 0x01,
0x28, 0xa3, 0x6f, 0x7d, 0xf4, 0xc9, 0xa1, 0xa7, 0x8e, 0x47, 0x03, 0x94, 0xb6, 0x6a, 0xd8, 0x1e, 0x46, 0xd4, 0x95, 0xd6, 0x34, 0xcc, 0x8d, 0x3a, 0x6a, 0x0a, 0x04, 0xf8, 0x48, 0x74, 0xad, 0xdd,
0xf7, 0x44, 0xf2, 0xb5, 0xea, 0x85, 0x0a, 0x7b, 0x85, 0x6f, 0x7e, 0x90, 0xad, 0x1a, 0x8d, 0xd1, 0x7b, 0xf7, 0x22, 0x4c, 0x54, 0x2f, 0x88, 0x61, 0x7e, 0x24, 0x68, 0x76, 0x44, 0x99, 0xba, 0x58,
0xe0, 0x0b, 0x96, 0x35, 0x98, 0xd4, 0xd0, 0x93, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xcb, 0x59, 0x18, 0x09, 0x05, 0x99, 0x5e, 0x5c, 0x3a, 0x37, 0x9a, 0x30, 0x33, 0x24, 0x0a, 0xea, 0xe2, 0x08,
0x0b, 0xcb, 0x66, 0x13, 0x00, 0x00, 0x75, 0x47, 0x44, 0xa2, 0x5b, 0x52, 0x78, 0x7e, 0x44, 0x61, 0x69, 0x3a, 0xb5, 0x3e, 0x20, 0xd9,
0x5c, 0xfe, 0x17, 0xc4, 0x6d, 0x3c, 0xd5, 0xb7, 0xe5, 0xd1, 0x1d, 0x7e, 0x65, 0xd5, 0xfe, 0x75,
0xb8, 0x9a, 0xfd, 0x75, 0xb8, 0xba, 0x83, 0x4a, 0x91, 0xc8, 0xd8, 0xd4, 0x47, 0xeb, 0x2f, 0x93,
0xe6, 0xbf, 0x95, 0x47, 0x1e, 0xfc, 0x8f, 0x55, 0xe9, 0xbf, 0x12, 0x77, 0x36, 0x2e, 0x9d, 0xf6,
0x8e, 0xee, 0xac, 0x3f, 0xcb, 0x66, 0x02, 0x99, 0xdd, 0xeb, 0x26, 0xb1, 0xb7, 0xde, 0x68, 0x9b,
0x7b, 0xfb, 0x24, 0x63, 0xdf, 0xf9, 0xc8, 0x93, 0xdd, 0x40, 0xf7, 0x06, 0x47, 0x24, 0xed, 0x9a,
0x65, 0x7b, 0x22, 0x90, 0xe9, 0xaf, 0x6b, 0x41, 0xa4, 0x69, 0x62, 0x87, 0xf6, 0x4f, 0xcd, 0x6b,
0x56, 0x63, 0x7c, 0xf4, 0x79, 0xc7, 0x39, 0x9a, 0x30, 0xd0, 0x93, 0xff, 0x0e, 0x00, 0x00, 0xff,
0xff, 0xa4, 0x96, 0x88, 0xfc, 0x1a, 0x15, 0x00, 0x00,
} }

View File

@ -263,6 +263,11 @@ message ReleaseCollectionRequest {
* WARNING: This API is experimental and not useful for now. * WARNING: This API is experimental and not useful for now.
*/ */
message GetStatisticsRequest { message GetStatisticsRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeGetStatistics
object_name_index: 3
};
// Not useful for now // Not useful for now
common.MsgBase base = 1; common.MsgBase base = 1;
// Not useful for now // Not useful for now
@ -290,6 +295,11 @@ message GetStatisticsResponse {
* Get collection statistics like row_count. * Get collection statistics like row_count.
*/ */
message GetCollectionStatisticsRequest { message GetCollectionStatisticsRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeGetStatistics
object_name_index: 3
};
// Not useful for now // Not useful for now
common.MsgBase base = 1; common.MsgBase base = 1;
// Not useful for now // Not useful for now
@ -518,6 +528,11 @@ message ShowSegmentsResponse {
* Create index for vector datas * Create index for vector datas
*/ */
message CreateIndexRequest { message CreateIndexRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeCreateIndex
object_name_index: 3
};
// Not useful for now // Not useful for now
common.MsgBase base = 1; common.MsgBase base = 1;
// Not useful for now // Not useful for now
@ -537,6 +552,11 @@ message CreateIndexRequest {
* Current release of Milvus only supports showing latest built index. * Current release of Milvus only supports showing latest built index.
*/ */
message DescribeIndexRequest { message DescribeIndexRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeIndexDetail
object_name_index: 3
};
// Not useful for now // Not useful for now
common.MsgBase base = 1; common.MsgBase base = 1;
// Not useful for now // Not useful for now
@ -577,6 +597,11 @@ message DescribeIndexResponse {
* Get index building progress * Get index building progress
*/ */
message GetIndexBuildProgressRequest { message GetIndexBuildProgressRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeIndexDetail
object_name_index: 3
};
// Not useful for now // Not useful for now
common.MsgBase base = 1; common.MsgBase base = 1;
// Not useful for now // Not useful for now
@ -596,6 +621,11 @@ message GetIndexBuildProgressResponse {
} }
message GetIndexStateRequest { message GetIndexStateRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeIndexDetail
object_name_index: 3
};
common.MsgBase base = 1; // must common.MsgBase base = 1; // must
string db_name = 2 ; string db_name = 2 ;
string collection_name = 3; // must string collection_name = 3; // must
@ -610,6 +640,11 @@ message GetIndexStateResponse {
} }
message DropIndexRequest { message DropIndexRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeDropIndex
object_name_index: 3
};
common.MsgBase base = 1; // must common.MsgBase base = 1; // must
string db_name = 2; string db_name = 2;
string collection_name = 3; // must string collection_name = 3; // must
@ -660,6 +695,11 @@ message DeleteRequest {
message SearchRequest { message SearchRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeSearch
object_name_index: 3
};
common.MsgBase base = 1; // must common.MsgBase base = 1; // must
string db_name = 2; string db_name = 2;
string collection_name = 3; // must string collection_name = 3; // must
@ -688,6 +728,11 @@ message SearchResults {
} }
message FlushRequest { message FlushRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeFlush
object_name_indexs: 3
};
common.MsgBase base = 1; common.MsgBase base = 1;
string db_name = 2; string db_name = 2;
repeated string collection_names = 3; repeated string collection_names = 3;
@ -700,6 +745,11 @@ message FlushResponse{
} }
message QueryRequest { message QueryRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeQuery
object_name_index: 3
};
common.MsgBase base = 1; common.MsgBase base = 1;
string db_name = 2; string db_name = 2;
string collection_name = 3; string collection_name = 3;
@ -821,6 +871,11 @@ message GetMetricsResponse {
* Do load balancing operation from src_nodeID to dst_nodeID. * Do load balancing operation from src_nodeID to dst_nodeID.
*/ */
message LoadBalanceRequest { message LoadBalanceRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeLoadBalance
object_name_index: 5
};
common.MsgBase base = 1; common.MsgBase base = 1;
int64 src_nodeID = 2; int64 src_nodeID = 2;
repeated int64 dst_nodeIDs = 3; repeated int64 dst_nodeIDs = 3;
@ -880,6 +935,11 @@ message GetFlushStateResponse {
} }
message ImportRequest { message ImportRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeImport
object_name_index: 1
};
string collection_name = 1; // target collection string collection_name = 1; // target collection
string partition_name = 2; // target partition string partition_name = 2; // target partition
repeated string channel_names = 3; // channel names for the collection repeated string channel_names = 3; // channel names for the collection
@ -951,6 +1011,11 @@ service ProxyService {
// https://wiki.lfaidata.foundation/display/MIL/MEP+27+--+Support+Basic+Authentication // https://wiki.lfaidata.foundation/display/MIL/MEP+27+--+Support+Basic+Authentication
message CreateCredentialRequest { message CreateCredentialRequest {
option (common.privilege_ext_obj) = {
object_type: Global
object_privilege: PrivilegeCreateOwnership
object_name_index: -1
};
// Not useful for now // Not useful for now
common.MsgBase base = 1; common.MsgBase base = 1;
// username // username
@ -964,6 +1029,11 @@ message CreateCredentialRequest {
} }
message UpdateCredentialRequest { message UpdateCredentialRequest {
option (common.privilege_ext_obj) = {
object_type: User
object_privilege: PrivilegeUpdateUser
object_name_index: 2
};
// Not useful for now // Not useful for now
common.MsgBase base = 1; common.MsgBase base = 1;
// username // username
@ -979,6 +1049,11 @@ message UpdateCredentialRequest {
} }
message DeleteCredentialRequest { message DeleteCredentialRequest {
option (common.privilege_ext_obj) = {
object_type: Global
object_privilege: PrivilegeDropOwnership
object_name_index: -1
};
// Not useful for now // Not useful for now
common.MsgBase base = 1; common.MsgBase base = 1;
// Not useful for now // Not useful for now
@ -993,6 +1068,11 @@ message ListCredUsersResponse {
} }
message ListCredUsersRequest { message ListCredUsersRequest {
option (common.privilege_ext_obj) = {
object_type: Global
object_privilege: PrivilegeSelectOwnership
object_name_index: -1
};
// Not useful for now // Not useful for now
common.MsgBase base = 1; common.MsgBase base = 1;
} }
@ -1007,6 +1087,11 @@ message UserEntity {
} }
message CreateRoleRequest { message CreateRoleRequest {
option (common.privilege_ext_obj) = {
object_type: Global
object_privilege: PrivilegeCreateOwnership
object_name_index: -1
};
// Not useful for now // Not useful for now
common.MsgBase base = 1; common.MsgBase base = 1;
// role // role
@ -1014,6 +1099,11 @@ message CreateRoleRequest {
} }
message DropRoleRequest { message DropRoleRequest {
option (common.privilege_ext_obj) = {
object_type: Global
object_privilege: PrivilegeDropOwnership
object_name_index: -1
};
// Not useful for now // Not useful for now
common.MsgBase base = 1; common.MsgBase base = 1;
// role name // role name
@ -1026,6 +1116,11 @@ enum OperateUserRoleType {
} }
message OperateUserRoleRequest { message OperateUserRoleRequest {
option (common.privilege_ext_obj) = {
object_type: Global
object_privilege: PrivilegeManageOwnership
object_name_index: -1
};
// Not useful for now // Not useful for now
common.MsgBase base = 1; common.MsgBase base = 1;
// username // username
@ -1037,6 +1132,11 @@ message OperateUserRoleRequest {
} }
message SelectRoleRequest { message SelectRoleRequest {
option (common.privilege_ext_obj) = {
object_type: Global
object_privilege: PrivilegeSelectOwnership
object_name_index: -1
};
// Not useful for now // Not useful for now
common.MsgBase base = 1; common.MsgBase base = 1;
// role // role
@ -1058,6 +1158,11 @@ message SelectRoleResponse {
} }
message SelectUserRequest { message SelectUserRequest {
option (common.privilege_ext_obj) = {
object_type: User
object_privilege: PrivilegeSelectUser
object_name_index: 2
};
// Not useful for now // Not useful for now
common.MsgBase base = 1; common.MsgBase base = 1;
// user // user
@ -1107,6 +1212,11 @@ message GrantEntity {
} }
message SelectGrantRequest { message SelectGrantRequest {
option (common.privilege_ext_obj) = {
object_type: Global
object_privilege: PrivilegeSelectOwnership
object_name_index: -1
};
// Not useful for now // Not useful for now
common.MsgBase base = 1; common.MsgBase base = 1;
// grant // grant
@ -1126,6 +1236,11 @@ enum OperatePrivilegeType {
} }
message OperatePrivilegeRequest { message OperatePrivilegeRequest {
option (common.privilege_ext_obj) = {
object_type: Global
object_privilege: PrivilegeManageOwnership
object_name_index: -1
};
// Not useful for now // Not useful for now
common.MsgBase base = 1; common.MsgBase base = 1;
// grant // grant

View File

@ -7049,326 +7049,332 @@ func init() {
func init() { proto.RegisterFile("milvus.proto", fileDescriptor_02345ba45cc0e303) } func init() { proto.RegisterFile("milvus.proto", fileDescriptor_02345ba45cc0e303) }
var fileDescriptor_02345ba45cc0e303 = []byte{ var fileDescriptor_02345ba45cc0e303 = []byte{
// 5101 bytes of a gzipped FileDescriptorProto // 5188 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3d, 0x5b, 0x6c, 0x1c, 0x47, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3d, 0x4b, 0x6c, 0x1c, 0x47,
0x72, 0x9c, 0x5d, 0xee, 0xab, 0xf6, 0xc1, 0x65, 0xf3, 0xb5, 0x5e, 0x49, 0x16, 0x35, 0xb6, 0xce, 0x76, 0xec, 0x19, 0xce, 0xef, 0xcd, 0x87, 0xc3, 0xe2, 0x6f, 0x3c, 0x92, 0x2c, 0xaa, 0x6d, 0xd9,
0xb4, 0x74, 0xa2, 0x2c, 0xca, 0x96, 0xcf, 0xb2, 0xcf, 0xb6, 0x24, 0x5a, 0x12, 0x61, 0x3d, 0xe8, 0xb4, 0xb4, 0xa6, 0x6c, 0xca, 0x96, 0xd7, 0xb2, 0x57, 0xb6, 0x24, 0x5a, 0x12, 0x61, 0x7d, 0xe8,
0xa1, 0xec, 0xe0, 0x62, 0x18, 0x93, 0xe1, 0x4e, 0x73, 0x39, 0xd6, 0xec, 0xcc, 0x6a, 0x66, 0x96, 0xa6, 0xec, 0x60, 0xe3, 0x18, 0x8d, 0xe6, 0x74, 0x71, 0xd8, 0x56, 0x4f, 0xf7, 0xa8, 0xbb, 0x87,
0x14, 0xfd, 0x11, 0x18, 0xb8, 0x4b, 0x72, 0x41, 0x9c, 0x3b, 0x1c, 0x72, 0xc8, 0xe1, 0x3e, 0xf2, 0x14, 0x9d, 0xcb, 0x02, 0x9b, 0xdd, 0x6c, 0x90, 0xcd, 0x2e, 0x36, 0xbf, 0x45, 0x0e, 0xf9, 0x20,
0x40, 0x90, 0x04, 0x08, 0x70, 0x09, 0x72, 0x49, 0x80, 0x00, 0xc9, 0x47, 0x12, 0xe0, 0x3e, 0x02, 0xd8, 0x1c, 0x02, 0x6c, 0x82, 0x38, 0x09, 0x10, 0x60, 0x73, 0xc8, 0x39, 0x46, 0xbe, 0x87, 0x20,
0x23, 0x48, 0x2e, 0x5f, 0x41, 0x90, 0x7c, 0x1e, 0x02, 0xe4, 0x2f, 0x01, 0xee, 0x33, 0x41, 0x82, 0x59, 0x24, 0xc7, 0x45, 0x80, 0x1c, 0x02, 0xe4, 0x90, 0x63, 0x82, 0x04, 0xf5, 0xe9, 0x9e, 0xea,
0x7e, 0xcc, 0x6c, 0xcf, 0x6c, 0xcf, 0x72, 0xc9, 0x3d, 0x99, 0x14, 0xbf, 0xb6, 0xab, 0xab, 0xbb, 0x9e, 0xea, 0xe1, 0x90, 0xb3, 0x32, 0x29, 0xf3, 0x34, 0xf5, 0xea, 0x55, 0xd5, 0xab, 0x57, 0xef,
0xab, 0xab, 0xab, 0xab, 0xaa, 0xbb, 0xaa, 0x87, 0x50, 0xe9, 0x58, 0xf6, 0x4e, 0xcf, 0x5f, 0xee, 0xbd, 0x7a, 0x55, 0xef, 0x55, 0x13, 0x2a, 0x1d, 0xcb, 0xde, 0xe9, 0xf9, 0xcb, 0x5d, 0xcf, 0x0d,
0x7a, 0x6e, 0xe0, 0xa2, 0x19, 0xb1, 0xb4, 0xcc, 0x0a, 0xcd, 0x4a, 0xcb, 0xed, 0x74, 0x5c, 0x87, 0x5c, 0x34, 0x23, 0x96, 0x96, 0x59, 0xa1, 0x59, 0x69, 0xb9, 0x9d, 0x8e, 0xeb, 0x30, 0x60, 0xb3,
0x01, 0x9b, 0x15, 0xbf, 0xb5, 0x8d, 0x3b, 0x06, 0x2f, 0x2d, 0xb6, 0x5d, 0xb7, 0x6d, 0xe3, 0x8b, 0xe2, 0xb7, 0xb6, 0x71, 0xc7, 0xe0, 0xa5, 0xc5, 0xb6, 0xeb, 0xb6, 0x6d, 0x7c, 0x81, 0x96, 0x36,
0xb4, 0xb4, 0xd9, 0xdb, 0xba, 0x68, 0x62, 0xbf, 0xe5, 0x59, 0xdd, 0xc0, 0xf5, 0x18, 0x86, 0xfa, 0x7b, 0x5b, 0x17, 0x4c, 0xec, 0xb7, 0x3c, 0xab, 0x1b, 0xb8, 0x1e, 0xc3, 0x50, 0x7f, 0x47, 0x01,
0xdb, 0x0a, 0xa0, 0x1b, 0x1e, 0x36, 0x02, 0x7c, 0xcd, 0xb6, 0x0c, 0x5f, 0xc3, 0x8f, 0x7a, 0xd8, 0x74, 0xdd, 0xc3, 0x46, 0x80, 0xaf, 0xda, 0x96, 0xe1, 0x6b, 0xf8, 0x61, 0x0f, 0xfb, 0x01, 0x7a,
0x0f, 0xd0, 0x4b, 0x30, 0xb9, 0x69, 0xf8, 0xb8, 0xa1, 0x2c, 0x2a, 0x4b, 0xe5, 0x95, 0x93, 0xcb, 0x09, 0x26, 0x37, 0x0d, 0x1f, 0x37, 0x94, 0x45, 0x65, 0xa9, 0xbc, 0x72, 0x72, 0x39, 0x36, 0x30,
0xb1, 0x81, 0xf9, 0x80, 0x77, 0xfd, 0xf6, 0x75, 0xc3, 0xc7, 0x1a, 0xc5, 0x44, 0x0b, 0x50, 0x30, 0x1f, 0xf0, 0x8e, 0xdf, 0xbe, 0x66, 0xf8, 0x58, 0xa3, 0x98, 0x68, 0x01, 0x0a, 0xe6, 0xa6, 0xee,
0x37, 0x75, 0xc7, 0xe8, 0xe0, 0x46, 0x66, 0x51, 0x59, 0x2a, 0x69, 0x79, 0x73, 0xf3, 0x9e, 0xd1, 0x18, 0x1d, 0xdc, 0xc8, 0x2c, 0x2a, 0x4b, 0x25, 0x2d, 0x6f, 0x6e, 0xde, 0x35, 0x3a, 0x18, 0x3d,
0xc1, 0xe8, 0x05, 0x98, 0x6a, 0xb9, 0xb6, 0x8d, 0x5b, 0x81, 0xe5, 0x3a, 0x0c, 0x21, 0x4b, 0x11, 0x0f, 0x53, 0x2d, 0xd7, 0xb6, 0x71, 0x2b, 0xb0, 0x5c, 0x87, 0x21, 0x64, 0x29, 0x42, 0xad, 0x0f,
0x6a, 0x7d, 0x30, 0x45, 0x9c, 0x85, 0x9c, 0x41, 0x68, 0x68, 0x4c, 0xd2, 0x6a, 0x56, 0x50, 0x7d, 0xa6, 0x88, 0xb3, 0x90, 0x33, 0x08, 0x0d, 0x8d, 0x49, 0x5a, 0xcd, 0x0a, 0xaa, 0x0f, 0xf5, 0x55,
0xa8, 0xaf, 0x7a, 0x6e, 0xf7, 0x49, 0x51, 0x17, 0x0d, 0x9a, 0x15, 0x07, 0xfd, 0x2d, 0x05, 0xa6, 0xcf, 0xed, 0x3e, 0x2e, 0xea, 0xa2, 0x41, 0xb3, 0xe2, 0xa0, 0xbf, 0xad, 0xc0, 0xf4, 0x55, 0x3b,
0xaf, 0xd9, 0x01, 0xf6, 0x8e, 0x29, 0x53, 0x7e, 0x90, 0x81, 0x05, 0xb6, 0x6a, 0x37, 0x22, 0xf4, 0xc0, 0xde, 0x31, 0x65, 0xca, 0x0f, 0x33, 0xb0, 0xc0, 0x56, 0xed, 0x7a, 0x84, 0x7e, 0x94, 0x54,
0xa3, 0xa4, 0x72, 0x1e, 0xf2, 0x4c, 0xee, 0x28, 0x99, 0x15, 0x8d, 0x97, 0xd0, 0x29, 0x00, 0x7f, 0xce, 0x43, 0x9e, 0xc9, 0x1d, 0x25, 0xb3, 0xa2, 0xf1, 0x12, 0x3a, 0x05, 0xe0, 0x6f, 0x1b, 0x9e,
0xdb, 0xf0, 0x4c, 0x5f, 0x77, 0x7a, 0x9d, 0x46, 0x6e, 0x51, 0x59, 0xca, 0x69, 0x25, 0x06, 0xb9, 0xe9, 0xeb, 0x4e, 0xaf, 0xd3, 0xc8, 0x2d, 0x2a, 0x4b, 0x39, 0xad, 0xc4, 0x20, 0x77, 0x7b, 0x1d,
0xd7, 0xeb, 0x20, 0x0d, 0xa6, 0x5b, 0xae, 0xe3, 0x5b, 0x7e, 0x80, 0x9d, 0xd6, 0x9e, 0x6e, 0xe3, 0xa4, 0xc1, 0x74, 0xcb, 0x75, 0x7c, 0xcb, 0x0f, 0xb0, 0xd3, 0xda, 0xd3, 0x6d, 0xbc, 0x83, 0xed,
0x1d, 0x6c, 0x37, 0xf2, 0x8b, 0xca, 0x52, 0x6d, 0xe5, 0xac, 0x94, 0xee, 0x1b, 0x7d, 0xec, 0x3b, 0x46, 0x7e, 0x51, 0x59, 0xaa, 0xad, 0x9c, 0x95, 0xd2, 0x7d, 0xbd, 0x8f, 0x7d, 0x9b, 0x20, 0x6b,
0x04, 0x59, 0xab, 0xb7, 0x12, 0x90, 0xab, 0xe8, 0xf3, 0x37, 0xa7, 0x8a, 0x4a, 0x5d, 0x69, 0xfc, 0xf5, 0x56, 0x02, 0x72, 0x19, 0x7d, 0x76, 0x65, 0xaa, 0xa8, 0xd4, 0x95, 0xc6, 0xff, 0x85, 0x7f,
0x5f, 0xf8, 0xa7, 0xa8, 0xbf, 0xa3, 0xc0, 0x1c, 0x11, 0xa2, 0x63, 0xc1, 0xac, 0x90, 0xc2, 0x8c, 0x8a, 0xfa, 0xbb, 0x0a, 0xcc, 0x11, 0x21, 0x3a, 0x16, 0xcc, 0x0a, 0x29, 0xcc, 0x88, 0x14, 0xfe,
0x48, 0xe1, 0x1f, 0x29, 0x30, 0x7b, 0xdb, 0xf0, 0x8f, 0xc7, 0x6a, 0x9e, 0x02, 0x08, 0xac, 0x0e, 0xa1, 0x02, 0xb3, 0xb7, 0x0c, 0xff, 0x78, 0xac, 0xe6, 0x29, 0x80, 0xc0, 0xea, 0x60, 0xdd, 0x0f,
0xd6, 0xfd, 0xc0, 0xe8, 0x74, 0xe9, 0x8a, 0x4e, 0x6a, 0x25, 0x02, 0xd9, 0x20, 0x00, 0xf5, 0x6b, 0x8c, 0x4e, 0x97, 0xae, 0xe8, 0xa4, 0x56, 0x22, 0x90, 0x0d, 0x02, 0x50, 0xbf, 0x0a, 0x95, 0x6b,
0x50, 0xb9, 0xee, 0xba, 0xb6, 0x86, 0xfd, 0xae, 0xeb, 0xf8, 0x18, 0x5d, 0x86, 0xbc, 0x1f, 0x18, 0xae, 0x6b, 0x6b, 0xd8, 0xef, 0xba, 0x8e, 0x8f, 0xd1, 0x45, 0xc8, 0xfb, 0x81, 0x11, 0xf4, 0x7c,
0x41, 0xcf, 0xe7, 0x44, 0x9e, 0x90, 0x12, 0xb9, 0x41, 0x51, 0x34, 0x8e, 0x4a, 0xe4, 0x7a, 0xc7, 0x4e, 0xe4, 0x09, 0x29, 0x91, 0x1b, 0x14, 0x45, 0xe3, 0xa8, 0x44, 0xae, 0x77, 0x0c, 0xbb, 0xc7,
0xb0, 0x7b, 0x8c, 0xc6, 0xa2, 0xc6, 0x0a, 0xea, 0x87, 0x50, 0xdb, 0x08, 0x3c, 0xcb, 0x69, 0xff, 0x68, 0x2c, 0x6a, 0xac, 0xa0, 0x7e, 0x08, 0xb5, 0x8d, 0xc0, 0xb3, 0x9c, 0xf6, 0x4f, 0xb1, 0xf3,
0x0c, 0x3b, 0x2f, 0x85, 0x9d, 0xff, 0x87, 0x02, 0xcf, 0xac, 0x52, 0xfd, 0xb7, 0x79, 0x4c, 0xb6, 0x52, 0xd8, 0xf9, 0xbf, 0x2b, 0xf0, 0xd4, 0x2a, 0xb5, 0x7f, 0x9b, 0xc7, 0x44, 0x6d, 0x54, 0xa8,
0x8d, 0x0a, 0x95, 0x3e, 0x64, 0x6d, 0x95, 0xb2, 0x3a, 0xab, 0xc5, 0x60, 0x89, 0xc5, 0xc8, 0x25, 0xf4, 0x21, 0x6b, 0xab, 0x94, 0xd5, 0x59, 0x2d, 0x06, 0x4b, 0x2c, 0x46, 0x2e, 0xb1, 0x18, 0xa1,
0x16, 0x23, 0x14, 0xa6, 0xac, 0x28, 0x4c, 0x9f, 0xe6, 0xa0, 0x29, 0x9b, 0xe8, 0x38, 0x2c, 0xfd, 0x30, 0x65, 0x45, 0x61, 0xfa, 0x5a, 0x0e, 0x9a, 0xb2, 0x89, 0x8e, 0xc3, 0xd2, 0xaf, 0x44, 0x1a,
0x6a, 0xb4, 0xc3, 0x33, 0xb4, 0x51, 0x62, 0x7f, 0x72, 0xab, 0xd3, 0x1f, 0x6d, 0x83, 0x02, 0x22, 0x9e, 0xa1, 0x8d, 0x12, 0xfa, 0xc9, 0x77, 0x9d, 0xfe, 0x68, 0x1b, 0x14, 0x10, 0x19, 0x82, 0xe4,
0x45, 0x90, 0x9c, 0x69, 0x56, 0x32, 0xd3, 0x15, 0x98, 0xdb, 0xb1, 0xbc, 0xa0, 0x67, 0xd8, 0x7a, 0x4c, 0xb3, 0x92, 0x99, 0xae, 0xc0, 0xdc, 0x8e, 0xe5, 0x05, 0x3d, 0xc3, 0xd6, 0x5b, 0xdb, 0x86,
0x6b, 0xdb, 0x70, 0x1c, 0x6c, 0x53, 0xde, 0x11, 0xd5, 0x97, 0x5d, 0x2a, 0x69, 0x33, 0xbc, 0xf2, 0xe3, 0x60, 0x9b, 0xf2, 0x8e, 0x98, 0xbe, 0xec, 0x52, 0x49, 0x9b, 0xe1, 0x95, 0xd7, 0x59, 0x1d,
0x06, 0xab, 0x23, 0x0c, 0xf4, 0xd1, 0xcb, 0x30, 0xdf, 0xdd, 0xde, 0xf3, 0xad, 0xd6, 0x40, 0xa3, 0x61, 0xa0, 0x8f, 0x5e, 0x81, 0xf9, 0xee, 0xf6, 0x9e, 0x6f, 0xb5, 0x06, 0x1a, 0xe5, 0x68, 0xa3,
0x1c, 0x6d, 0x34, 0x1b, 0xd6, 0xc6, 0x5a, 0x9d, 0x87, 0xe9, 0x16, 0xd5, 0x9e, 0xa6, 0x4e, 0x38, 0xd9, 0xb0, 0x36, 0xd6, 0xea, 0x3c, 0x4c, 0xb7, 0xa8, 0xf5, 0x34, 0x75, 0xc2, 0x49, 0xc6, 0xda,
0xc9, 0x58, 0x9b, 0xa7, 0xac, 0xad, 0xf3, 0x8a, 0x07, 0x21, 0x9c, 0x90, 0x15, 0x22, 0xf7, 0x82, 0x3c, 0x65, 0x6d, 0x9d, 0x57, 0xdc, 0x0f, 0xe1, 0x84, 0xac, 0x10, 0xb9, 0x17, 0xb4, 0x84, 0x06,
0x96, 0xd0, 0xa0, 0x40, 0x1b, 0xcc, 0xf0, 0xca, 0xf7, 0x83, 0x56, 0xbf, 0x4d, 0x5c, 0xef, 0x15, 0x05, 0xda, 0x60, 0x86, 0x57, 0xbe, 0x1f, 0xb4, 0xfa, 0x6d, 0xe2, 0x76, 0xaf, 0x98, 0xb4, 0x7b,
0x93, 0x7a, 0xaf, 0x01, 0x05, 0xaa, 0xc7, 0xb1, 0xdf, 0x28, 0x51, 0x32, 0xc3, 0x22, 0x5a, 0x83, 0x0d, 0x28, 0x50, 0x3b, 0x8e, 0xfd, 0x46, 0x89, 0x92, 0x19, 0x16, 0xd1, 0x1a, 0x4c, 0xf9, 0x81,
0x29, 0x3f, 0x30, 0xbc, 0x40, 0xef, 0xba, 0xbe, 0x45, 0xf8, 0xe2, 0x37, 0x60, 0x31, 0xbb, 0x54, 0xe1, 0x05, 0x7a, 0xd7, 0xf5, 0x2d, 0xc2, 0x17, 0xbf, 0x01, 0x8b, 0xd9, 0xa5, 0xf2, 0xca, 0xa2,
0x5e, 0x59, 0x94, 0x2e, 0xd2, 0xbb, 0x78, 0x6f, 0xd5, 0x08, 0x8c, 0x75, 0xc3, 0xf2, 0xb4, 0x1a, 0x74, 0x91, 0xde, 0xc5, 0x7b, 0xab, 0x46, 0x60, 0xac, 0x1b, 0x96, 0xa7, 0xd5, 0x68, 0xc3, 0xf5,
0x6d, 0xb8, 0x1e, 0xb6, 0x93, 0x2b, 0xd7, 0xf2, 0x58, 0xca, 0x55, 0x26, 0xd9, 0x15, 0x99, 0x64, 0xb0, 0x9d, 0xdc, 0xb8, 0x96, 0xc7, 0x32, 0xae, 0x32, 0xc9, 0xae, 0xc8, 0x24, 0x5b, 0xfd, 0x4b,
0xab, 0x7f, 0xad, 0xc0, 0xdc, 0x1d, 0xd7, 0x30, 0x8f, 0xc7, 0x3e, 0x3b, 0x0b, 0x35, 0x0f, 0x77, 0x05, 0xe6, 0x6e, 0xbb, 0x86, 0x79, 0x3c, 0xf4, 0xec, 0x2c, 0xd4, 0x3c, 0xdc, 0xb5, 0xad, 0x96,
0x6d, 0xab, 0x65, 0x90, 0xf5, 0xd8, 0xc4, 0x1e, 0xdd, 0x69, 0x39, 0xad, 0xca, 0xa1, 0xf7, 0x28, 0x41, 0xd6, 0x63, 0x13, 0x7b, 0x54, 0xd3, 0x72, 0x5a, 0x95, 0x43, 0xef, 0x52, 0xe0, 0xe5, 0xc2,
0xf0, 0x6a, 0xe1, 0xf3, 0x37, 0x27, 0xeb, 0xb9, 0x46, 0x56, 0xfd, 0x9e, 0x02, 0x0d, 0x0d, 0xdb, 0x67, 0x57, 0x26, 0xeb, 0xb9, 0x46, 0x56, 0xfd, 0xbe, 0x02, 0x0d, 0x0d, 0xdb, 0xd8, 0xf0, 0x8f,
0xd8, 0xf0, 0x8f, 0x87, 0xa2, 0x60, 0x94, 0xe5, 0x1b, 0x59, 0xf5, 0x27, 0x0a, 0xcc, 0xde, 0xc2, 0x87, 0xa1, 0x60, 0x94, 0xe5, 0x1b, 0x59, 0xf5, 0x3f, 0x15, 0x98, 0xbd, 0x89, 0x03, 0xa2, 0x9c,
0x01, 0xd9, 0x9c, 0x96, 0x1f, 0x58, 0xad, 0x23, 0xf5, 0x4d, 0x5e, 0x80, 0xa9, 0xae, 0xe1, 0x05, 0x96, 0x1f, 0x58, 0xad, 0x23, 0xf5, 0x4d, 0x9e, 0x87, 0xa9, 0xae, 0xe1, 0x05, 0x56, 0x84, 0x17,
0x56, 0x84, 0x17, 0x6e, 0xd5, 0x5a, 0x04, 0x66, 0xfb, 0xed, 0x22, 0xcc, 0xb4, 0x7b, 0x86, 0x67, 0xaa, 0x6a, 0x2d, 0x02, 0x33, 0x7d, 0xbb, 0x00, 0x33, 0xed, 0x9e, 0xe1, 0x19, 0x4e, 0x80, 0xb1,
0x38, 0x01, 0xc6, 0xc2, 0x06, 0x62, 0xca, 0x0c, 0x45, 0x55, 0xd1, 0xfe, 0x51, 0x7f, 0x49, 0x81, 0xa0, 0x40, 0xcc, 0x98, 0xa1, 0xa8, 0x2a, 0xd2, 0x1f, 0x36, 0x5f, 0x68, 0x64, 0xd5, 0x6f, 0x28,
0xb9, 0xc4, 0x34, 0xc7, 0x51, 0x5e, 0xaf, 0x42, 0x8e, 0xfc, 0xf2, 0x1b, 0x19, 0xba, 0x97, 0xce, 0x30, 0x97, 0x98, 0xef, 0x38, 0x56, 0xec, 0x35, 0xc8, 0x91, 0x5f, 0x7e, 0x23, 0x43, 0x95, 0xea,
0xa4, 0xed, 0xa5, 0x0f, 0x88, 0x9d, 0xa0, 0x9b, 0x89, 0xe1, 0xab, 0xdf, 0x55, 0xe0, 0xd9, 0x5b, 0x4c, 0x9a, 0x52, 0x7d, 0x40, 0x36, 0x0c, 0xaa, 0x55, 0x0c, 0x9f, 0x38, 0x84, 0x4f, 0xdf, 0xc4,
0x38, 0x10, 0xd4, 0xda, 0x71, 0x60, 0xbc, 0xfa, 0x6d, 0x05, 0x4e, 0xa7, 0x92, 0x75, 0x24, 0x8c, 0x81, 0x60, 0xdf, 0x8e, 0xc3, 0x0a, 0xf4, 0xf9, 0xf4, 0x5d, 0x05, 0x4e, 0xa7, 0xd2, 0x77, 0x24,
0xfa, 0xa9, 0x02, 0xf3, 0x1b, 0xdb, 0xee, 0x6e, 0x9f, 0xa4, 0x27, 0xc1, 0xa0, 0xb8, 0x2d, 0xcc, 0x1c, 0xfb, 0x6f, 0x05, 0xe6, 0x37, 0xb6, 0xdd, 0xdd, 0x3e, 0x49, 0x8f, 0x83, 0x53, 0xf1, 0xdd,
0x26, 0x6c, 0x21, 0xba, 0x04, 0x93, 0xc1, 0x5e, 0x17, 0xd3, 0xcd, 0x5d, 0x5b, 0x39, 0xb5, 0x2c, 0x31, 0x9b, 0xd8, 0x1d, 0xd1, 0xcb, 0x30, 0x19, 0xec, 0x75, 0x31, 0x55, 0xf7, 0xda, 0xca, 0xa9,
0x39, 0x2d, 0x2d, 0x13, 0x22, 0x1f, 0xec, 0x75, 0xb1, 0x46, 0x51, 0xd1, 0x8b, 0x50, 0x4f, 0xb0, 0x65, 0xc9, 0xf9, 0x69, 0x99, 0x10, 0x79, 0x7f, 0xaf, 0x8b, 0x35, 0x8a, 0x8a, 0x5e, 0x80, 0x7a,
0x3c, 0xb4, 0x1c, 0x53, 0x71, 0x9e, 0xfb, 0xa1, 0xa5, 0x9d, 0x14, 0x2d, 0xed, 0x7f, 0x65, 0x60, 0x82, 0xf7, 0xe1, 0x5e, 0x32, 0x15, 0x67, 0xbe, 0x1f, 0xee, 0xbd, 0x93, 0xe2, 0xde, 0xfb, 0x5f,
0x61, 0x60, 0xda, 0xe3, 0x2c, 0x80, 0x8c, 0x9e, 0x8c, 0x94, 0x1e, 0xa2, 0xd4, 0x04, 0x54, 0xcb, 0x19, 0x58, 0x18, 0x98, 0xf6, 0x38, 0x0b, 0x20, 0xa3, 0x27, 0x23, 0xa5, 0x87, 0x98, 0x39, 0x01,
0x24, 0x47, 0x98, 0xec, 0x52, 0x56, 0xab, 0x0a, 0x46, 0xd5, 0xf4, 0xd1, 0x05, 0x40, 0x03, 0xb6, 0xd5, 0x32, 0xc9, 0xa1, 0x26, 0xbb, 0x94, 0xd5, 0xaa, 0xc2, 0x36, 0x6b, 0xfa, 0xe8, 0x45, 0x40,
0x8e, 0xed, 0xd3, 0x49, 0x6d, 0x3a, 0x69, 0xec, 0xa8, 0x41, 0x95, 0x5a, 0x3b, 0xc6, 0x96, 0x49, 0x03, 0xbb, 0x1f, 0xd3, 0xdc, 0x49, 0x6d, 0x3a, 0xb9, 0xfd, 0xd1, 0x2d, 0x56, 0xba, 0xff, 0x31,
0x6d, 0x56, 0x62, 0xee, 0x7c, 0x74, 0x09, 0x66, 0x2d, 0xe7, 0x2e, 0xee, 0xb8, 0xde, 0x9e, 0xde, 0xb6, 0x4c, 0x6a, 0xb3, 0x92, 0x0d, 0xd0, 0x47, 0x2f, 0xc3, 0xac, 0xe5, 0xdc, 0xc1, 0x1d, 0xd7,
0xc5, 0x5e, 0x0b, 0x3b, 0x81, 0xd1, 0xc6, 0x7e, 0x23, 0x4f, 0x29, 0x9a, 0x09, 0xeb, 0xd6, 0xfb, 0xdb, 0xd3, 0xbb, 0xd8, 0x6b, 0x61, 0x27, 0x30, 0xda, 0xd8, 0x6f, 0xe4, 0x29, 0x45, 0x33, 0x61,
0x55, 0xe8, 0x0a, 0x2c, 0x3c, 0xea, 0x61, 0x6f, 0x4f, 0xf7, 0xb1, 0xb7, 0x63, 0xb5, 0xb0, 0x6e, 0xdd, 0x7a, 0xbf, 0x0a, 0x5d, 0x82, 0x85, 0x87, 0x3d, 0xec, 0xed, 0xe9, 0x3e, 0xf6, 0x76, 0xac,
0xec, 0x18, 0x96, 0x6d, 0x6c, 0xda, 0xb8, 0x51, 0x58, 0xcc, 0x2e, 0x15, 0xb5, 0x39, 0x5a, 0xbd, 0x16, 0xd6, 0x8d, 0x1d, 0xc3, 0xb2, 0x8d, 0x4d, 0x1b, 0x37, 0x0a, 0x8b, 0xd9, 0xa5, 0xa2, 0x36,
0xc1, 0x6a, 0xaf, 0x85, 0x95, 0xea, 0x9f, 0x2b, 0x30, 0xcf, 0x8e, 0x3e, 0xeb, 0xa1, 0x92, 0x39, 0x47, 0xab, 0x37, 0x58, 0xed, 0xd5, 0xb0, 0x52, 0xfd, 0x33, 0x05, 0xe6, 0xd9, 0x61, 0x68, 0x3d,
0x62, 0xd3, 0x12, 0xd7, 0x81, 0xfc, 0xa0, 0x56, 0x8d, 0xa9, 0x40, 0xf5, 0x87, 0x0a, 0xcc, 0x92, 0x34, 0x3b, 0x47, 0xbc, 0xd9, 0xc4, 0xad, 0x22, 0x3f, 0xba, 0x55, 0x63, 0x46, 0x51, 0xfd, 0x54,
0x13, 0xc8, 0xd3, 0x44, 0xf3, 0x9f, 0x2a, 0x30, 0x73, 0xdb, 0xf0, 0x9f, 0x26, 0x92, 0xff, 0x8d, 0x81, 0x59, 0x72, 0x26, 0x79, 0x92, 0x68, 0xfe, 0x13, 0x05, 0x66, 0x6e, 0x19, 0xfe, 0x93, 0x44,
0xbb, 0x1d, 0x11, 0xcd, 0x4f, 0x87, 0x7d, 0x1c, 0xf4, 0x4f, 0x72, 0x12, 0xff, 0x44, 0xfd, 0xcb, 0xf2, 0xbf, 0x72, 0x47, 0x24, 0xa2, 0xf9, 0xc9, 0xd8, 0x31, 0x07, 0x3d, 0x96, 0x9c, 0xc4, 0x63,
0xbe, 0x5b, 0xf2, 0x74, 0x4d, 0x50, 0xfd, 0x2b, 0x05, 0x4e, 0xdd, 0xc2, 0x41, 0x44, 0xf5, 0xf1, 0x51, 0xff, 0xa2, 0xef, 0xa8, 0x3c, 0x59, 0x13, 0x54, 0x7f, 0xa4, 0xc0, 0xa9, 0x9b, 0x38, 0x88,
0xf0, 0x5f, 0x46, 0x14, 0xaa, 0x6f, 0x31, 0x27, 0x40, 0x4a, 0xfc, 0x91, 0x18, 0xdb, 0x5f, 0xcb, 0xa8, 0x3e, 0x1e, 0x1e, 0xcd, 0x88, 0x42, 0xf5, 0x1d, 0xe6, 0x0d, 0x48, 0x89, 0x3f, 0x92, 0xcd,
0xc0, 0x1c, 0xb1, 0x3a, 0xc7, 0x43, 0x08, 0x46, 0x39, 0xc4, 0x4a, 0x04, 0x25, 0x27, 0xdd, 0x09, 0xf6, 0x97, 0x33, 0x30, 0x47, 0x76, 0x9d, 0xe3, 0x21, 0x04, 0xa3, 0x1c, 0x6b, 0x25, 0x82, 0x92,
0xa1, 0x09, 0xcf, 0x8f, 0x6c, 0xc2, 0xd5, 0x3f, 0xcb, 0x30, 0xd7, 0x43, 0xe4, 0xc6, 0x38, 0xcb, 0x93, 0x6a, 0x42, 0xb8, 0x85, 0xe7, 0x47, 0xde, 0xc2, 0xd5, 0x3f, 0xcd, 0x30, 0xd7, 0x43, 0xe4,
0x22, 0xa1, 0x35, 0x23, 0xa5, 0x55, 0x85, 0x4a, 0x04, 0x59, 0x5b, 0x0d, 0xcd, 0x6f, 0x0c, 0x76, 0xc6, 0x38, 0xcb, 0x22, 0xa1, 0x35, 0x23, 0xa5, 0x55, 0x85, 0x4a, 0x04, 0x59, 0x5b, 0x0d, 0xb7,
0x5c, 0xad, 0xaf, 0xfa, 0x99, 0x02, 0xf3, 0xe1, 0x15, 0xc1, 0x06, 0x6e, 0x77, 0xb0, 0x13, 0x1c, 0xdf, 0x18, 0xec, 0xb8, 0xee, 0xbe, 0xea, 0xb7, 0x15, 0x98, 0x0f, 0x2f, 0x0d, 0x36, 0x70, 0xbb,
0x5e, 0x86, 0x92, 0x12, 0x90, 0x91, 0x48, 0xc0, 0x49, 0x28, 0xf9, 0x6c, 0x9c, 0xe8, 0xf4, 0xdf, 0x83, 0x9d, 0xe0, 0xf0, 0x32, 0x94, 0x94, 0x80, 0x8c, 0x44, 0x02, 0x4e, 0x42, 0xc9, 0x67, 0xe3,
0x07, 0xa8, 0x7f, 0xa3, 0xc0, 0xc2, 0x00, 0x39, 0xe3, 0x2c, 0x62, 0x03, 0x0a, 0x96, 0x63, 0xe2, 0x44, 0xf7, 0x01, 0x7d, 0x80, 0xfa, 0x57, 0x0a, 0x2c, 0x0c, 0x90, 0x33, 0xce, 0x22, 0x36, 0xa0,
0xc7, 0x11, 0x35, 0x61, 0x91, 0xd4, 0x6c, 0xf6, 0x2c, 0xdb, 0x8c, 0xc8, 0x08, 0x8b, 0xe8, 0x0c, 0x60, 0x39, 0x26, 0x7e, 0x14, 0x51, 0x13, 0x16, 0x49, 0xcd, 0x66, 0xcf, 0xb2, 0xcd, 0x88, 0x8c,
0x54, 0xb0, 0x43, 0x7c, 0x0c, 0x9d, 0xe2, 0x52, 0x41, 0x2e, 0x6a, 0x65, 0x06, 0x5b, 0x23, 0x20, 0xb0, 0x88, 0xce, 0x40, 0x05, 0x3b, 0xc4, 0xc7, 0xd0, 0x29, 0x2e, 0x15, 0xe4, 0xa2, 0x56, 0x66,
0xd2, 0x78, 0xcb, 0xc2, 0xb4, 0x71, 0x8e, 0x35, 0xe6, 0x45, 0xf5, 0xd7, 0x15, 0x98, 0x21, 0x52, 0xb0, 0x35, 0x02, 0x22, 0x8d, 0xb7, 0x2c, 0x4c, 0x1b, 0xe7, 0x58, 0x63, 0x5e, 0x54, 0x7f, 0x45,
0xc8, 0xa9, 0xf7, 0x9f, 0x2c, 0x37, 0x17, 0xa1, 0x2c, 0x88, 0x19, 0x9f, 0x88, 0x08, 0x52, 0x1f, 0x81, 0x19, 0x22, 0x85, 0x9c, 0x7a, 0xff, 0xf1, 0x72, 0x73, 0x11, 0xca, 0x82, 0x98, 0xf1, 0x89,
0xc2, 0x6c, 0x9c, 0x9c, 0x71, 0xb8, 0xf9, 0x2c, 0x40, 0xb4, 0x56, 0x6c, 0x37, 0x64, 0x35, 0x01, 0x88, 0x20, 0xf5, 0x01, 0xcc, 0xc6, 0xc9, 0x19, 0x87, 0x9b, 0x4f, 0x03, 0x44, 0x6b, 0xc5, 0xb4,
0xa2, 0x7e, 0x96, 0x09, 0x83, 0x08, 0x94, 0x4d, 0x47, 0x7c, 0x77, 0x49, 0x97, 0x44, 0xd4, 0xe7, 0x21, 0xab, 0x09, 0x10, 0xf5, 0x37, 0x32, 0x61, 0x58, 0x81, 0xb2, 0xe9, 0x88, 0x6f, 0x33, 0xe9,
0x25, 0x0a, 0xa1, 0xd5, 0xab, 0x50, 0xc1, 0x8f, 0x03, 0xcf, 0xd0, 0xbb, 0x86, 0x67, 0x74, 0xd8, 0x92, 0x88, 0xf6, 0xbc, 0x44, 0x21, 0xb4, 0x7a, 0x15, 0x2a, 0xf8, 0x51, 0xe0, 0x19, 0x7a, 0xd7,
0xb6, 0x1a, 0x49, 0xf5, 0x96, 0x69, 0xb3, 0x75, 0xda, 0x8a, 0x0c, 0x42, 0x45, 0x84, 0x0d, 0x92, 0xf0, 0x8c, 0x0e, 0x53, 0xab, 0x91, 0x4c, 0x6f, 0x99, 0x36, 0x5b, 0xa7, 0xad, 0xc8, 0x20, 0x54,
0x67, 0x83, 0x50, 0x08, 0x35, 0x18, 0x7f, 0x4f, 0x9c, 0x3d, 0x2e, 0xcd, 0xc7, 0x9d, 0x21, 0xf1, 0x44, 0xd8, 0x20, 0x79, 0x36, 0x08, 0x85, 0xf4, 0xcf, 0x69, 0xe5, 0x46, 0x56, 0xfd, 0x47, 0xe2,
0xa9, 0xe4, 0x92, 0x53, 0xf9, 0x03, 0x05, 0xea, 0x74, 0x0a, 0xab, 0x3c, 0x70, 0x64, 0xb9, 0x4e, 0xf5, 0x71, 0xb1, 0x3e, 0xee, 0x9c, 0x89, 0xcf, 0x29, 0x27, 0x9d, 0x53, 0xa5, 0x91, 0x55, 0xff,
0xa2, 0x8d, 0x92, 0x68, 0x33, 0x64, 0xef, 0xbd, 0x06, 0x79, 0xce, 0xf7, 0xec, 0xa8, 0x7c, 0xe7, 0x40, 0x81, 0x3a, 0x9d, 0xcb, 0x2a, 0x0f, 0x2e, 0x59, 0xae, 0x93, 0x68, 0xac, 0x24, 0x1a, 0x0f,
0x0d, 0xf6, 0x99, 0x86, 0xfa, 0x7b, 0x0a, 0xcc, 0x25, 0x58, 0x3e, 0x8e, 0xc0, 0x3f, 0x00, 0xc4, 0xd1, 0xc6, 0xd7, 0x21, 0xcf, 0x57, 0x22, 0x3b, 0xea, 0x4a, 0xf0, 0x06, 0xfb, 0xcc, 0x47, 0xfd,
0x66, 0x68, 0xf6, 0xa7, 0x1d, 0xda, 0xe9, 0xb3, 0x52, 0xa3, 0x94, 0x64, 0x92, 0x36, 0x6d, 0x25, 0x7d, 0x05, 0xe6, 0x12, 0xbc, 0x1f, 0x47, 0x05, 0xee, 0x03, 0x62, 0x33, 0x34, 0xfb, 0xd3, 0x0e,
0x20, 0xbe, 0xfa, 0x63, 0x05, 0x4e, 0xde, 0xc2, 0x01, 0x45, 0xbd, 0x4e, 0x94, 0xce, 0xba, 0xe7, 0x77, 0xee, 0xb3, 0xd2, 0x6d, 0x2a, 0xc9, 0x24, 0x6d, 0xda, 0x4a, 0x40, 0x7c, 0xf5, 0xc7, 0x0a,
0xb6, 0x3d, 0xec, 0xfb, 0x4f, 0xaf, 0x7c, 0xfc, 0x26, 0x73, 0xec, 0x64, 0x53, 0x1a, 0x87, 0xff, 0x9c, 0xbc, 0x89, 0x03, 0x8a, 0x7a, 0x8d, 0x98, 0xa1, 0x75, 0xcf, 0x6d, 0x7b, 0xd8, 0xf7, 0xbf,
0x67, 0xa0, 0x42, 0xc7, 0xc0, 0xa6, 0xee, 0xb9, 0xbb, 0x3e, 0x97, 0xa3, 0x32, 0x87, 0x69, 0xee, 0x00, 0x82, 0xf2, 0x9b, 0xcc, 0xe7, 0x93, 0xcd, 0x6d, 0x9c, 0x85, 0x38, 0x03, 0x15, 0x3a, 0x18,
0x2e, 0x15, 0x88, 0xc0, 0x0d, 0x0c, 0x9b, 0x21, 0x70, 0x8b, 0x42, 0x21, 0xa4, 0x9a, 0xee, 0xc1, 0x36, 0x75, 0xcf, 0xdd, 0xf5, 0xb9, 0x40, 0x95, 0x39, 0x4c, 0x73, 0x77, 0xa9, 0x64, 0x04, 0x6e,
0x90, 0x30, 0xd2, 0x39, 0x7e, 0x7a, 0x79, 0xfc, 0xfb, 0xec, 0x32, 0x4c, 0x9c, 0xca, 0x38, 0xbc, 0x60, 0xd8, 0x0c, 0x81, 0x6f, 0x36, 0x14, 0x42, 0xaa, 0xa9, 0x56, 0x86, 0x84, 0x91, 0xce, 0xf1,
0x7d, 0x85, 0xb9, 0x9d, 0x6c, 0x32, 0xb5, 0x95, 0xd3, 0xd2, 0x36, 0xc2, 0x60, 0x0c, 0x1b, 0x9d, 0x17, 0x80, 0xd9, 0x3f, 0x60, 0x37, 0x67, 0xe2, 0x9c, 0xc6, 0x61, 0xf2, 0xab, 0xcc, 0x35, 0x65,
0x86, 0xf2, 0x96, 0x61, 0xd9, 0xba, 0x87, 0x0d, 0xdf, 0x75, 0xf8, 0x44, 0x81, 0x80, 0x34, 0x0a, 0xb3, 0xaa, 0xad, 0x9c, 0x96, 0xb6, 0x11, 0x06, 0x63, 0xd8, 0xe8, 0x34, 0x94, 0xb7, 0x0c, 0xcb,
0x51, 0x7f, 0xa4, 0xb0, 0x48, 0xed, 0x53, 0xae, 0xf1, 0x7e, 0x90, 0x81, 0xea, 0x9a, 0xe3, 0x63, 0xd6, 0x3d, 0x6c, 0xf8, 0xae, 0xc3, 0x67, 0x0c, 0x04, 0xa4, 0x51, 0x88, 0xfa, 0xb7, 0x0a, 0x8b,
0x2f, 0x38, 0xfe, 0x47, 0x13, 0xf4, 0x16, 0x94, 0xe9, 0xc4, 0x7c, 0xdd, 0x34, 0x02, 0x83, 0x5b, 0xef, 0x7e, 0x11, 0x8c, 0x61, 0xb5, 0x91, 0x55, 0x7f, 0x98, 0x81, 0xea, 0x9a, 0xe3, 0x63, 0x2f,
0xb3, 0x67, 0xa5, 0xa1, 0x99, 0x9b, 0x04, 0x6f, 0xd5, 0x08, 0x0c, 0x8d, 0x71, 0xc7, 0x27, 0xbf, 0x38, 0xfe, 0xe7, 0x18, 0xf4, 0x16, 0x94, 0xe9, 0x0c, 0x7d, 0xdd, 0x34, 0x02, 0x83, 0x6f, 0x7d,
0xd1, 0x09, 0x28, 0x6d, 0x1b, 0xfe, 0xb6, 0xfe, 0x10, 0xef, 0x31, 0x7f, 0xb1, 0xaa, 0x15, 0x09, 0x4f, 0x4b, 0x23, 0x3b, 0x37, 0x08, 0xde, 0xaa, 0x11, 0x18, 0x1a, 0x63, 0x93, 0x4f, 0x7e, 0xa3,
0xe0, 0x5d, 0xbc, 0xe7, 0xa3, 0x67, 0xa0, 0xe8, 0xf4, 0x3a, 0x6c, 0x83, 0x15, 0x16, 0x95, 0xa5, 0x13, 0x50, 0xda, 0x36, 0xfc, 0x6d, 0xfd, 0x01, 0xde, 0x63, 0xce, 0x65, 0x55, 0x2b, 0x12, 0xc0,
0xaa, 0x56, 0x70, 0x7a, 0x1d, 0xb2, 0xbd, 0xd8, 0x85, 0x74, 0xb1, 0x91, 0x55, 0xff, 0x21, 0x03, 0xbb, 0x78, 0xcf, 0x47, 0x4f, 0x41, 0xd1, 0xe9, 0x75, 0x98, 0xca, 0x15, 0x16, 0x95, 0xa5, 0xaa,
0xb5, 0xbb, 0x3d, 0x72, 0x22, 0xa2, 0x11, 0xa6, 0x9e, 0x1d, 0x1c, 0x4e, 0x2a, 0xcf, 0x41, 0x96, 0x56, 0x70, 0x7a, 0x1d, 0xa2, 0x70, 0x8c, 0x5d, 0xc5, 0x46, 0x56, 0xfd, 0x9b, 0x0c, 0xd4, 0xee,
0xf9, 0x16, 0xa4, 0x45, 0x43, 0x3a, 0x83, 0xb5, 0x55, 0x5f, 0x23, 0x48, 0x34, 0xba, 0xd2, 0x6b, 0xf4, 0xc8, 0xf1, 0x89, 0x06, 0xa8, 0x7a, 0x76, 0x70, 0x38, 0xf1, 0x3c, 0x07, 0x59, 0xe6, 0x88,
0xb5, 0xb8, 0x9b, 0x96, 0xa5, 0x54, 0x97, 0x08, 0x84, 0x39, 0x69, 0x27, 0xa0, 0x84, 0x3d, 0x2f, 0x90, 0x16, 0x0d, 0xe9, 0x0c, 0xd6, 0x56, 0x7d, 0x8d, 0x20, 0xd1, 0xe0, 0x4c, 0xaf, 0xd5, 0xe2,
0x72, 0xe2, 0xe8, 0x9c, 0xb0, 0xe7, 0xb1, 0x4a, 0x15, 0x2a, 0x46, 0xeb, 0xa1, 0xe3, 0xee, 0xda, 0x3e, 0x5d, 0x96, 0x52, 0x5d, 0x22, 0x10, 0xe6, 0xd1, 0x9d, 0x80, 0x12, 0xf6, 0xbc, 0xc8, 0xe3,
0xd8, 0x6c, 0x63, 0x93, 0xae, 0x7f, 0x51, 0x8b, 0xc1, 0x98, 0x84, 0x10, 0x09, 0xd0, 0x5b, 0x4e, 0xa3, 0x73, 0xc2, 0x9e, 0xc7, 0x2a, 0x55, 0xa8, 0x18, 0xad, 0x07, 0x8e, 0xbb, 0x6b, 0x63, 0xb3,
0x40, 0xcd, 0x7b, 0x96, 0x48, 0x08, 0x81, 0xdc, 0x70, 0x02, 0x52, 0x6d, 0x62, 0x1b, 0x07, 0x98, 0x8d, 0x4d, 0x2a, 0x08, 0x45, 0x2d, 0x06, 0x63, 0xa2, 0x42, 0x24, 0x40, 0x6f, 0x39, 0x01, 0xf5,
0x56, 0x17, 0x58, 0x35, 0x83, 0xf0, 0xea, 0x5e, 0x37, 0x6a, 0x5d, 0x64, 0xd5, 0x0c, 0x42, 0xaa, 0x05, 0xb2, 0x44, 0x54, 0x08, 0xe4, 0xba, 0x13, 0x90, 0x6a, 0x13, 0xdb, 0x38, 0xc0, 0xb4, 0xba,
0x4f, 0x42, 0xa9, 0x7f, 0x03, 0x5e, 0xea, 0x5f, 0x61, 0xb2, 0x8b, 0xef, 0x9f, 0x28, 0x50, 0x5d, 0xc0, 0xaa, 0x19, 0x84, 0x57, 0xf7, 0xba, 0x51, 0xeb, 0x22, 0xab, 0x66, 0x10, 0x52, 0x7d, 0x12,
0xa5, 0x5d, 0x3d, 0x05, 0xd2, 0x87, 0x60, 0x12, 0x3f, 0xee, 0x7a, 0x7c, 0x0f, 0xd1, 0xdf, 0x43, 0x4a, 0xfd, 0x0b, 0xf4, 0x52, 0xff, 0xbe, 0x93, 0x02, 0xd4, 0x9f, 0x28, 0x50, 0x5d, 0xa5, 0x5d,
0x05, 0x8a, 0x49, 0x4d, 0xa9, 0x91, 0x55, 0xff, 0x37, 0x0b, 0xd5, 0x0d, 0x6c, 0x78, 0xad, 0xed, 0x3d, 0x01, 0xd2, 0x87, 0x60, 0x12, 0x3f, 0xea, 0x7a, 0x5c, 0x99, 0xe8, 0xef, 0xa1, 0x02, 0xc5,
0xa7, 0xe2, 0x7e, 0xa6, 0x0e, 0x59, 0xd3, 0xb7, 0xf9, 0x3c, 0xc9, 0x4f, 0x74, 0x1e, 0xa6, 0xbb, 0xa4, 0xa6, 0xd4, 0xc8, 0xaa, 0xdf, 0x9c, 0x84, 0xea, 0x06, 0x36, 0xbc, 0xd6, 0xf6, 0x13, 0x71,
0xb6, 0xd1, 0xc2, 0xdb, 0xae, 0x6d, 0x62, 0x4f, 0x6f, 0x7b, 0x6e, 0x8f, 0x45, 0x10, 0x2b, 0x5a, 0x99, 0x53, 0x87, 0xac, 0xe9, 0xdb, 0x7c, 0x9e, 0xe4, 0x27, 0x3a, 0x0f, 0xd3, 0x5d, 0xdb, 0x68,
0x5d, 0xa8, 0xb8, 0x45, 0xe0, 0xe8, 0x55, 0x28, 0x9a, 0xbe, 0xad, 0xd3, 0x83, 0x6d, 0x81, 0x2a, 0xe1, 0x6d, 0xd7, 0x36, 0xb1, 0xa7, 0xb7, 0x3d, 0xb7, 0xc7, 0x02, 0x90, 0x15, 0xad, 0x2e, 0x54,
0x5d, 0xf9, 0xfc, 0x56, 0x7d, 0x9b, 0x9e, 0x6b, 0x0b, 0x26, 0xfb, 0x81, 0x9e, 0x83, 0xaa, 0xdb, 0xdc, 0x24, 0x70, 0xf4, 0x1a, 0x14, 0x4d, 0xdf, 0xd6, 0xe9, 0x29, 0xb8, 0x40, 0xad, 0xaf, 0x7c,
0x0b, 0xba, 0xbd, 0x40, 0x67, 0x5b, 0xb6, 0x51, 0xa4, 0xe4, 0x55, 0x18, 0x90, 0xee, 0x68, 0x1f, 0x7e, 0xab, 0xbe, 0x4d, 0x0f, 0xc1, 0x05, 0x93, 0xfd, 0x40, 0xcf, 0x40, 0xd5, 0xed, 0x05, 0xdd,
0xdd, 0x84, 0xaa, 0x4f, 0x59, 0x19, 0xfa, 0xb4, 0xa5, 0x51, 0x7d, 0xab, 0x0a, 0x6b, 0xc7, 0x9d, 0x5e, 0xa0, 0x33, 0x95, 0x6d, 0x14, 0x29, 0x79, 0x15, 0x06, 0xa4, 0x1a, 0xed, 0xa3, 0x1b, 0x50,
0xda, 0x17, 0xa1, 0x1e, 0x78, 0xc6, 0x0e, 0xb6, 0x85, 0x08, 0x0d, 0x50, 0xf9, 0x9c, 0x62, 0xf0, 0xf5, 0x29, 0x2b, 0x43, 0x07, 0xb8, 0x34, 0xaa, 0xdb, 0x55, 0x61, 0xed, 0xb8, 0x07, 0xfc, 0x02,
0x7e, 0x78, 0x33, 0x25, 0x9e, 0x53, 0x4e, 0x8b, 0xe7, 0xa0, 0x1a, 0x64, 0x9c, 0x47, 0x34, 0x54, 0xd4, 0x03, 0xcf, 0xd8, 0xc1, 0xb6, 0x10, 0xe0, 0x01, 0x2a, 0x9f, 0x53, 0x0c, 0xde, 0x8f, 0x8e,
0x98, 0xd5, 0x32, 0xce, 0x23, 0xf5, 0x5d, 0x98, 0xbc, 0x6d, 0x05, 0x94, 0xb1, 0x64, 0xd7, 0x2b, 0xa6, 0x84, 0x83, 0xca, 0x69, 0xe1, 0x20, 0x54, 0x83, 0x8c, 0xf3, 0x90, 0x46, 0x1a, 0xb3, 0x5a,
0xf4, 0x44, 0x41, 0xf7, 0xf6, 0x33, 0x50, 0xf4, 0xdc, 0x5d, 0xa6, 0xce, 0x88, 0xbf, 0x55, 0xd1, 0xc6, 0x79, 0xc8, 0x04, 0xa1, 0xd6, 0xc8, 0xaa, 0xef, 0xc2, 0xe4, 0x2d, 0x2b, 0xa0, 0x1c, 0x26,
0x0a, 0x9e, 0xbb, 0x4b, 0x75, 0x15, 0x4d, 0x32, 0x71, 0x3d, 0xcc, 0xbc, 0xc7, 0x8c, 0xc6, 0x4b, 0xea, 0xaf, 0xd0, 0x73, 0x08, 0x55, 0xf2, 0xa7, 0xa0, 0xe8, 0xb9, 0xbb, 0xcc, 0xae, 0x11, 0x9f,
0xea, 0x9f, 0x28, 0x7d, 0x61, 0x22, 0x0a, 0xc8, 0x3f, 0x9c, 0x06, 0x7a, 0x0b, 0x0a, 0x1e, 0x6b, 0xac, 0xa2, 0x15, 0x3c, 0x77, 0x97, 0x1a, 0x2d, 0x9a, 0xac, 0xe2, 0x7a, 0x98, 0x79, 0x98, 0x19,
0x3f, 0x34, 0xc4, 0x2d, 0x8e, 0x44, 0xd5, 0x69, 0xd8, 0x6a, 0xf4, 0xf0, 0xcd, 0x37, 0x14, 0xa8, 0x8d, 0x97, 0xd4, 0x3f, 0x56, 0xfa, 0x52, 0x45, 0x2c, 0x91, 0x7f, 0x38, 0x53, 0xf4, 0x16, 0x14,
0xdc, 0xb4, 0x7b, 0xfe, 0x93, 0x10, 0x7e, 0x59, 0x00, 0x21, 0x2b, 0x0d, 0x20, 0xa8, 0xdf, 0xc9, 0x3c, 0xd6, 0x7e, 0x68, 0xa8, 0x5c, 0x1c, 0x89, 0xda, 0xd5, 0xb0, 0xd5, 0xc8, 0x02, 0x48, 0x4e,
0x40, 0x95, 0x93, 0x31, 0x8e, 0x3f, 0x91, 0x4a, 0xca, 0x06, 0x94, 0xc9, 0x90, 0xba, 0x8f, 0xdb, 0x98, 0x95, 0x1b, 0x76, 0xcf, 0x7f, 0x1c, 0x5a, 0x20, 0x0b, 0x3b, 0x64, 0xe5, 0x61, 0x10, 0xba,
0xe1, 0xf5, 0x48, 0x79, 0x65, 0x45, 0xea, 0x3d, 0xc7, 0xc8, 0xa0, 0x59, 0x04, 0x1b, 0xb4, 0xd1, 0x1a, 0x53, 0x8b, 0x59, 0xf5, 0x7b, 0x19, 0xa8, 0x72, 0x7a, 0xc6, 0x71, 0x35, 0x52, 0x69, 0xda,
0x3b, 0x4e, 0xe0, 0xed, 0x69, 0xd0, 0x8a, 0x00, 0xcd, 0x8f, 0x60, 0x2a, 0x51, 0x4d, 0x84, 0xe8, 0x80, 0x32, 0x19, 0x5b, 0xf7, 0x71, 0x3b, 0xbc, 0x5d, 0x29, 0xaf, 0xac, 0x48, 0x5d, 0xed, 0x18,
0x21, 0xde, 0xe3, 0xe7, 0x10, 0xf2, 0x13, 0xbd, 0x2c, 0xe6, 0x7f, 0xa4, 0x19, 0xc4, 0x3b, 0xae, 0x19, 0x34, 0x2d, 0x61, 0x83, 0x36, 0x7a, 0xc7, 0x09, 0xbc, 0x3d, 0x0d, 0x5a, 0x11, 0xa0, 0xf9,
0xd3, 0xbe, 0xe6, 0x79, 0xc6, 0x1e, 0xcf, 0x0f, 0xb9, 0x9a, 0xf9, 0x8a, 0xa2, 0xfe, 0x6d, 0x06, 0x11, 0x4c, 0x25, 0xaa, 0x89, 0x34, 0x3d, 0xc0, 0x7b, 0xfc, 0xd0, 0x42, 0x7e, 0xa2, 0x57, 0xc4,
0x2a, 0xef, 0xf5, 0xb0, 0xb7, 0x77, 0x94, 0x7a, 0x29, 0xd4, 0xab, 0x93, 0x82, 0x5e, 0x1d, 0x50, 0x84, 0x92, 0xb4, 0x2d, 0xf2, 0xb6, 0xeb, 0xb4, 0xaf, 0x7a, 0x9e, 0xb1, 0xc7, 0x13, 0x4e, 0x2e,
0x05, 0x39, 0x89, 0x2a, 0x90, 0x28, 0xb4, 0xbc, 0x54, 0xa1, 0xc9, 0xf6, 0x7a, 0xe1, 0x40, 0x7b, 0x67, 0xbe, 0xac, 0xa8, 0x7f, 0x9d, 0x81, 0xca, 0x7b, 0x3d, 0xec, 0xed, 0x1d, 0xa5, 0xa5, 0x0a,
0xbd, 0x98, 0x1a, 0xbb, 0xfd, 0x63, 0x25, 0x62, 0xe1, 0x58, 0xbb, 0x31, 0xe6, 0xd9, 0x64, 0x0e, 0x2d, 0xed, 0xa4, 0x60, 0x69, 0x07, 0x8c, 0x43, 0x4e, 0x62, 0x1c, 0x24, 0x26, 0x2e, 0x2f, 0x35,
0xec, 0xd9, 0x8c, 0xbc, 0x1b, 0x7f, 0xa8, 0x40, 0xe9, 0x03, 0xdc, 0x0a, 0x5c, 0x8f, 0xe8, 0x1f, 0x71, 0x32, 0xed, 0x2f, 0x1c, 0x48, 0xfb, 0x8b, 0xc3, 0x83, 0xc1, 0xf5, 0x46, 0x56, 0xfd, 0x23,
0x49, 0x33, 0x65, 0x04, 0x2f, 0x33, 0x93, 0xf4, 0x32, 0x2f, 0x43, 0xd1, 0x32, 0x75, 0x83, 0xc8, 0x25, 0xe2, 0xe5, 0x58, 0xfa, 0x19, 0x73, 0x7a, 0x32, 0x07, 0x76, 0x7a, 0x46, 0xd6, 0xcf, 0x4f,
0x17, 0x1d, 0x77, 0x98, 0x53, 0x53, 0xb0, 0x4c, 0x2a, 0x88, 0xa3, 0xdf, 0xa7, 0x7f, 0x4f, 0x81, 0x15, 0x28, 0x7d, 0x80, 0x5b, 0x81, 0xeb, 0x11, 0x8b, 0x24, 0x69, 0xa6, 0x8c, 0xe0, 0x89, 0x66,
0x0a, 0xa3, 0xd9, 0x67, 0x2d, 0x5f, 0x17, 0x86, 0x53, 0x64, 0x42, 0xcf, 0x0b, 0xd1, 0x44, 0x6f, 0x92, 0x9e, 0xe8, 0x45, 0x28, 0x5a, 0xa6, 0x6e, 0x10, 0x41, 0xa3, 0xe3, 0x0e, 0xf3, 0x77, 0x0a,
0x4f, 0xf4, 0x87, 0xbd, 0x06, 0x40, 0x98, 0xcc, 0x9b, 0xb3, 0x3d, 0xb3, 0x28, 0xa5, 0x96, 0x35, 0x96, 0x49, 0x25, 0x72, 0xf4, 0x7b, 0xf9, 0xef, 0x2b, 0x50, 0x61, 0x34, 0xfb, 0xac, 0xe5, 0x1b,
0xa7, 0x0c, 0xbf, 0x3d, 0xa1, 0x95, 0x48, 0x2b, 0xda, 0xc5, 0xf5, 0x02, 0xe4, 0x68, 0x6b, 0xf5, 0xc2, 0x70, 0x8a, 0x4c, 0xfa, 0x79, 0x21, 0x9a, 0xe8, 0xad, 0x89, 0xfe, 0xb0, 0x57, 0x01, 0x08,
0x7f, 0x14, 0x98, 0xb9, 0x61, 0xd8, 0xad, 0x55, 0xcb, 0x0f, 0x0c, 0xa7, 0x35, 0x86, 0x1b, 0x73, 0x93, 0x79, 0x73, 0xa6, 0x3c, 0x8b, 0x52, 0x6a, 0x59, 0x73, 0xca, 0xf0, 0x5b, 0x13, 0x5a, 0x89,
0x15, 0x0a, 0x6e, 0x57, 0xb7, 0xf1, 0x56, 0xc0, 0x49, 0x3a, 0x33, 0x64, 0x46, 0x8c, 0x0d, 0x5a, 0xb4, 0xa2, 0x5d, 0x5c, 0x2b, 0x40, 0x8e, 0xb6, 0x56, 0xff, 0x47, 0x81, 0x99, 0xeb, 0x86, 0xdd,
0xde, 0xed, 0xde, 0xc1, 0x5b, 0x01, 0x7a, 0x03, 0x8a, 0x6e, 0x57, 0xf7, 0xac, 0xf6, 0x76, 0xc0, 0x5a, 0xb5, 0xfc, 0xc0, 0x70, 0x5a, 0x63, 0x78, 0x38, 0x97, 0xa1, 0xe0, 0x76, 0x75, 0x1b, 0x6f,
0xb9, 0x3f, 0x42, 0xe3, 0x82, 0xdb, 0xd5, 0x48, 0x0b, 0xe1, 0x9a, 0x62, 0xf2, 0x80, 0xd7, 0x14, 0x05, 0x9c, 0xa4, 0x33, 0x43, 0x66, 0xc4, 0xd8, 0xa0, 0xe5, 0xdd, 0xee, 0x6d, 0xbc, 0x15, 0xa0,
0xea, 0x3f, 0x0f, 0x4c, 0x7f, 0x8c, 0x3d, 0x70, 0x15, 0x8a, 0x96, 0x13, 0xe8, 0xa6, 0xe5, 0x87, 0x37, 0xa1, 0xe8, 0x76, 0x75, 0xcf, 0x6a, 0x6f, 0x07, 0x9c, 0xfb, 0x23, 0x34, 0x2e, 0xb8, 0x5d,
0x2c, 0x38, 0x25, 0x97, 0x21, 0x27, 0xa0, 0x33, 0xa0, 0x6b, 0xea, 0x04, 0x64, 0x6c, 0xf4, 0x36, 0x8d, 0xb4, 0x10, 0x2e, 0x37, 0x26, 0x0f, 0x78, 0xb9, 0x41, 0xce, 0xa8, 0x89, 0xe9, 0x8f, 0xa1,
0xc0, 0x96, 0xed, 0x1a, 0xbc, 0x35, 0xe3, 0xc1, 0x69, 0xf9, 0xf6, 0x21, 0x68, 0x61, 0xfb, 0x12, 0x03, 0x97, 0xa1, 0x68, 0x39, 0x81, 0x6e, 0x5a, 0x7e, 0xc8, 0x82, 0x53, 0x72, 0x19, 0x72, 0x02,
0x6d, 0x44, 0x7a, 0xe8, 0x2f, 0xe9, 0x3f, 0x29, 0x30, 0xb7, 0x8e, 0x3d, 0x96, 0x09, 0x14, 0xf0, 0x3a, 0x03, 0xba, 0xa6, 0x4e, 0x40, 0xc6, 0x46, 0x6f, 0x03, 0x6c, 0xd9, 0xae, 0xc1, 0x5b, 0x33,
0x1b, 0xc5, 0x35, 0x67, 0xcb, 0x8d, 0x5f, 0xea, 0x2a, 0x89, 0x4b, 0xdd, 0x9f, 0xcd, 0x45, 0x66, 0x1e, 0x9c, 0x96, 0xab, 0x0f, 0x41, 0x0b, 0xdb, 0x97, 0x68, 0x23, 0xd2, 0x43, 0x7f, 0x49, 0xff,
0xec, 0x10, 0xc2, 0x42, 0x0b, 0xe1, 0x21, 0x24, 0x0c, 0xa0, 0xb0, 0x43, 0x5c, 0x2d, 0x65, 0x99, 0x5e, 0x81, 0xb9, 0x75, 0xec, 0xb1, 0x1c, 0xa3, 0x80, 0xdf, 0x4c, 0xae, 0x39, 0x5b, 0x6e, 0xfc,
0x38, 0xbd, 0xe2, 0x59, 0x56, 0xfd, 0x0d, 0x96, 0x3f, 0x21, 0x9d, 0xd4, 0xe1, 0x05, 0x76, 0x1e, 0x72, 0x58, 0x49, 0x5c, 0x0e, 0xff, 0x74, 0x2e, 0x44, 0x63, 0xe7, 0x13, 0x16, 0xa2, 0x08, 0xcf,
0xb8, 0xa6, 0x4f, 0xe8, 0xfd, 0x2f, 0x41, 0x42, 0x77, 0xa4, 0x28, 0xa2, 0xef, 0x2b, 0xb0, 0x98, 0x27, 0x61, 0x20, 0x86, 0x1d, 0xf4, 0x6a, 0x29, 0xcb, 0xc4, 0xe9, 0x15, 0xcf, 0xbb, 0xea, 0xaf,
0x4e, 0xd5, 0x38, 0x26, 0xfa, 0x6d, 0xc8, 0x59, 0xce, 0x96, 0x1b, 0xde, 0x60, 0x9d, 0x93, 0xee, 0xb1, 0x3c, 0x0c, 0xe9, 0xa4, 0x0e, 0x2f, 0xb0, 0xf3, 0xc0, 0x4d, 0x7e, 0x62, 0x03, 0x78, 0x0e,
0x05, 0xf9, 0xb8, 0xac, 0xa1, 0xfa, 0xe3, 0x0c, 0xd4, 0xdf, 0x63, 0xf1, 0xf8, 0x2f, 0x7c, 0xf9, 0x12, 0xb6, 0x23, 0xc5, 0x10, 0xfd, 0x96, 0x02, 0x8b, 0xe9, 0x54, 0x8d, 0xb3, 0x57, 0xbf, 0x0d,
0x3b, 0xb8, 0xa3, 0xfb, 0xd6, 0x27, 0x38, 0x5c, 0xfe, 0x0e, 0xee, 0x6c, 0x58, 0x9f, 0xe0, 0x98, 0x39, 0xcb, 0xd9, 0x72, 0xc3, 0x7b, 0xaf, 0x73, 0x52, 0x5d, 0x90, 0x8f, 0xcb, 0x1a, 0xaa, 0xff,
0x64, 0xe4, 0xe2, 0x92, 0x31, 0xfc, 0x82, 0x56, 0xbc, 0xa1, 0x2c, 0xc4, 0x6f, 0x28, 0xe7, 0x21, 0x90, 0x81, 0xfa, 0x7b, 0x2c, 0xae, 0xff, 0xb9, 0x2f, 0x7f, 0x07, 0x77, 0x74, 0xdf, 0xfa, 0x04,
0xef, 0xb8, 0x26, 0x5e, 0x5b, 0xe5, 0x07, 0x37, 0x5e, 0xea, 0x8b, 0x5a, 0xe9, 0x60, 0xa2, 0x46, 0x87, 0xcb, 0xdf, 0xc1, 0x9d, 0x0d, 0xeb, 0x13, 0x1c, 0x93, 0x8c, 0x5c, 0x5c, 0x32, 0x86, 0x5f,
0x86, 0xa2, 0x5d, 0x98, 0x2c, 0x91, 0x8f, 0xd0, 0xc8, 0x8a, 0xea, 0xb7, 0x14, 0x68, 0xde, 0xc2, 0xf4, 0x8a, 0xf7, 0x9a, 0x85, 0xf8, 0xbd, 0xe6, 0x3c, 0xe4, 0x1d, 0xd7, 0xc4, 0x6b, 0xab, 0xfc,
0x41, 0x92, 0xab, 0x47, 0x27, 0x7f, 0xdf, 0x56, 0xe0, 0x84, 0x94, 0xa0, 0x71, 0x44, 0xef, 0xf5, 0x4c, 0xc7, 0x4b, 0x7d, 0x51, 0x2b, 0x1d, 0x4c, 0xd4, 0xc8, 0x50, 0xb4, 0x0b, 0x93, 0xa5, 0x08,
0xb8, 0xe8, 0xc9, 0x2f, 0x4f, 0x07, 0x86, 0xe4, 0x52, 0x77, 0x09, 0x2a, 0xab, 0xbd, 0x4e, 0x27, 0x12, 0x1a, 0x59, 0x51, 0xfd, 0x8e, 0x02, 0xcd, 0x9b, 0x38, 0x48, 0x72, 0xf5, 0xe8, 0xe4, 0xef,
0x72, 0xc6, 0xce, 0x40, 0xc5, 0x63, 0x3f, 0xd9, 0x61, 0x8a, 0x59, 0xe6, 0x32, 0x87, 0x91, 0x23, 0xbb, 0x0a, 0x9c, 0x90, 0x12, 0x34, 0x8e, 0xe8, 0xbd, 0x11, 0x17, 0x3d, 0xf9, 0x95, 0xeb, 0xc0,
0x93, 0x7a, 0x1e, 0xaa, 0xbc, 0x09, 0xa7, 0xba, 0x09, 0x45, 0x8f, 0xff, 0xe6, 0xf8, 0x51, 0x59, 0x90, 0x5c, 0xea, 0x5e, 0x86, 0xca, 0x6a, 0xaf, 0xd3, 0x89, 0xbc, 0xb2, 0x33, 0x50, 0xf1, 0xd8,
0x9d, 0x83, 0x19, 0x0d, 0xb7, 0x89, 0xd0, 0x7b, 0x77, 0x2c, 0xe7, 0x21, 0x1f, 0x46, 0xfd, 0xba, 0x4f, 0x76, 0xce, 0x62, 0x3b, 0x73, 0x99, 0xc3, 0xc8, 0x69, 0x4a, 0x3d, 0x0f, 0x55, 0xde, 0x84,
0x02, 0xb3, 0x71, 0x38, 0xef, 0xeb, 0x0a, 0x14, 0x0c, 0xd3, 0xf4, 0xb0, 0xef, 0x0f, 0x5d, 0x96, 0x53, 0xdd, 0x84, 0xa2, 0xc7, 0x7f, 0x73, 0xfc, 0xa8, 0xac, 0xce, 0xc1, 0x8c, 0x86, 0xdb, 0x44,
0x6b, 0x0c, 0x47, 0x0b, 0x91, 0x05, 0xce, 0x65, 0x46, 0xe6, 0x9c, 0xaa, 0xc3, 0xf4, 0x2d, 0x1c, 0xe8, 0xbd, 0xdb, 0x96, 0xf3, 0x80, 0x0f, 0xa3, 0x7e, 0x5d, 0x81, 0xd9, 0x38, 0x9c, 0xf7, 0x75,
0xdc, 0xc5, 0x81, 0x37, 0x56, 0x98, 0xbc, 0x41, 0x8e, 0x35, 0xb4, 0x31, 0x17, 0x8b, 0xb0, 0xa8, 0x09, 0x0a, 0x86, 0x69, 0x7a, 0xd8, 0xf7, 0x87, 0x2e, 0xcb, 0x55, 0x86, 0xa3, 0x85, 0xc8, 0x02,
0x7e, 0xa6, 0x00, 0x12, 0x47, 0x18, 0x67, 0x99, 0x45, 0x2e, 0x67, 0xe2, 0x5c, 0x66, 0x89, 0x4a, 0xe7, 0x32, 0x23, 0x73, 0x4e, 0xd5, 0x61, 0xfa, 0x26, 0x0e, 0xee, 0xe0, 0xc0, 0x1b, 0x2b, 0xdc,
0x9d, 0xae, 0xeb, 0x60, 0x27, 0x10, 0x1d, 0xb1, 0x6a, 0x04, 0x0d, 0x73, 0x37, 0xd0, 0x1d, 0xd7, 0xde, 0x20, 0x07, 0x1d, 0xda, 0x98, 0x8b, 0x45, 0x58, 0x54, 0xbf, 0xad, 0x00, 0x12, 0x47, 0x18,
0x30, 0xaf, 0x1b, 0xf6, 0x78, 0x8e, 0xc3, 0x29, 0x00, 0xdf, 0x6b, 0xe9, 0x7c, 0x1f, 0x67, 0xb8, 0x67, 0x99, 0x45, 0x2e, 0x67, 0xe2, 0x5c, 0x66, 0x09, 0x4f, 0x9d, 0xae, 0xeb, 0x60, 0x27, 0x10,
0x5e, 0xf2, 0x5a, 0xf7, 0xd8, 0x56, 0x3e, 0x0d, 0x65, 0xd3, 0x0f, 0x78, 0x75, 0x18, 0xb5, 0x05, 0x1d, 0xb1, 0x6a, 0x04, 0xa5, 0xe2, 0xf7, 0x13, 0x05, 0xd0, 0x6d, 0xd7, 0x30, 0xaf, 0x19, 0xf6,
0xd3, 0x0f, 0x58, 0x3d, 0xcd, 0x0e, 0xf6, 0xb1, 0x61, 0x63, 0x53, 0x17, 0x82, 0x5e, 0x93, 0x14, 0x78, 0x8e, 0xc3, 0x29, 0x00, 0xdf, 0x6b, 0xe9, 0x5c, 0x8f, 0x33, 0xdc, 0x2e, 0x79, 0xad, 0xbb,
0xad, 0xce, 0x2a, 0x36, 0x22, 0xb8, 0x64, 0x73, 0xe5, 0xa4, 0x9b, 0x6b, 0x0b, 0x16, 0xee, 0x1a, 0x4c, 0x95, 0x4f, 0x43, 0xd9, 0xf4, 0x03, 0x5e, 0x1d, 0x46, 0x7f, 0xc1, 0xf4, 0x03, 0x56, 0x4f,
0x4e, 0xcf, 0xb0, 0x6f, 0xb8, 0x9d, 0xae, 0x11, 0x4b, 0x28, 0x4d, 0x2a, 0x4a, 0x45, 0xa2, 0x28, 0xf3, 0x8e, 0x7d, 0x6c, 0xd8, 0xd8, 0xd4, 0x85, 0xe0, 0xd9, 0x24, 0x45, 0xab, 0xb3, 0x8a, 0x8d,
0x9f, 0x65, 0x99, 0x6f, 0xcc, 0x39, 0xa7, 0x73, 0x9a, 0xd4, 0x04, 0x08, 0xbb, 0x59, 0x29, 0x34, 0x08, 0x2e, 0x51, 0xae, 0x5c, 0x7a, 0x0e, 0xe0, 0x74, 0x23, 0xa7, 0x6e, 0xc1, 0xc2, 0x1d, 0xc3,
0x14, 0xd5, 0x87, 0xc6, 0xe0, 0x38, 0xe3, 0xac, 0x2c, 0xa5, 0x2e, 0xec, 0x4a, 0x54, 0xe3, 0x7d, 0xe9, 0x19, 0xf6, 0x75, 0xb7, 0xd3, 0x35, 0x62, 0x39, 0xab, 0x49, 0x8b, 0xa9, 0x48, 0x2c, 0xe6,
0x98, 0xfa, 0x16, 0x3c, 0x43, 0xd3, 0x11, 0x43, 0x50, 0xec, 0xc2, 0x3d, 0xd9, 0x81, 0x22, 0xe9, 0xd3, 0x2c, 0x95, 0x8e, 0xb9, 0xeb, 0x74, 0x72, 0x93, 0x9a, 0x00, 0x61, 0xe3, 0x14, 0x1a, 0x8a,
0xe0, 0x57, 0x32, 0x54, 0x17, 0x0e, 0xf4, 0x30, 0x0e, 0xe1, 0x57, 0xe3, 0xf7, 0xdc, 0xcf, 0xa7, 0xea, 0x43, 0x63, 0x70, 0x9c, 0x71, 0x96, 0x98, 0x52, 0x17, 0x76, 0x25, 0xda, 0xf3, 0x3e, 0x4c,
0xe4, 0x3c, 0xc7, 0x47, 0xe4, 0x5a, 0x7b, 0x09, 0xa6, 0xf0, 0x63, 0xdc, 0xea, 0x05, 0x96, 0xd3, 0x7d, 0x0b, 0x9e, 0xa2, 0xf9, 0x8d, 0x21, 0x28, 0x76, 0x4d, 0x9f, 0xec, 0x40, 0x91, 0x74, 0xf0,
0x5e, 0xb7, 0x0d, 0xe7, 0x9e, 0xcb, 0x6d, 0x53, 0x12, 0x8c, 0x9e, 0x87, 0x2a, 0x59, 0x06, 0xb7, 0x8b, 0x19, 0x6a, 0x14, 0x07, 0x7a, 0x18, 0x87, 0xf0, 0xcb, 0xf1, 0x4b, 0xf1, 0x67, 0x53, 0xd2,
0x17, 0x70, 0x3c, 0x66, 0xa4, 0xe2, 0x40, 0xd2, 0x1f, 0x99, 0xaf, 0x8d, 0x03, 0x6c, 0x72, 0x3c, 0xaa, 0xe3, 0x23, 0x72, 0xf3, 0xbd, 0x04, 0x53, 0xf8, 0x11, 0x6e, 0xf5, 0x02, 0xcb, 0x69, 0xaf,
0x66, 0xb1, 0x92, 0xe0, 0x01, 0x56, 0x12, 0xb0, 0x7f, 0x10, 0x56, 0xfe, 0x8b, 0x92, 0x60, 0x25, 0xdb, 0x86, 0x73, 0xd7, 0xe5, 0x9b, 0x54, 0x12, 0x8c, 0x9e, 0x85, 0x2a, 0x59, 0x06, 0xb7, 0x17,
0xef, 0xe1, 0xa8, 0x58, 0x79, 0x1b, 0xa0, 0x83, 0xbd, 0x36, 0x5e, 0xa3, 0x56, 0x80, 0x5d, 0x02, 0x70, 0x3c, 0xb6, 0x5b, 0xc5, 0x81, 0xa4, 0x3f, 0x32, 0x5f, 0x1b, 0x07, 0xd8, 0xe4, 0x78, 0x6c,
0x2c, 0x49, 0xad, 0x40, 0xbf, 0x83, 0xbb, 0x61, 0x03, 0x4d, 0x68, 0xab, 0xde, 0x82, 0x19, 0x09, 0xeb, 0x4a, 0x82, 0x07, 0x58, 0x49, 0xc0, 0xfe, 0x41, 0x58, 0xf9, 0xcf, 0x4a, 0x82, 0x95, 0xbc,
0x0a, 0x51, 0x70, 0xbe, 0xdb, 0xf3, 0x5a, 0x38, 0xbc, 0x47, 0x0a, 0x8b, 0xc4, 0x20, 0x06, 0x86, 0x87, 0xa3, 0x62, 0xe5, 0x2d, 0x80, 0x0e, 0xf6, 0xda, 0x78, 0x8d, 0x6e, 0x07, 0xec, 0x5a, 0x60,
0xd7, 0xc6, 0x01, 0x17, 0x5a, 0x5e, 0x52, 0xaf, 0xd0, 0xd0, 0x10, 0xbd, 0x73, 0x88, 0x49, 0x6a, 0x49, 0xba, 0x1d, 0xf4, 0x3b, 0xb8, 0x13, 0x36, 0xd0, 0x84, 0xb6, 0xea, 0x4d, 0x98, 0x91, 0xa0,
0x3c, 0xcc, 0xad, 0x0c, 0x84, 0xb9, 0xb7, 0x68, 0x1c, 0x46, 0x6c, 0x37, 0x66, 0x8a, 0xc2, 0x16, 0x10, 0x4b, 0xe7, 0xbb, 0x3d, 0xaf, 0x85, 0xc3, 0x2b, 0xa6, 0xb0, 0x48, 0x76, 0xc6, 0xc0, 0xf0,
0xe9, 0x0a, 0x9b, 0xfc, 0x0d, 0x4c, 0x58, 0x54, 0x7f, 0xaa, 0x40, 0x75, 0xad, 0xd3, 0x75, 0xfb, 0xda, 0x38, 0xe0, 0x42, 0xcb, 0x4b, 0xea, 0x25, 0x1a, 0x50, 0xa2, 0xb7, 0x10, 0x31, 0x49, 0x8d,
0x21, 0x88, 0x91, 0x4f, 0xa5, 0x83, 0x37, 0xb7, 0x19, 0xd9, 0xcd, 0xed, 0x73, 0x50, 0x8d, 0xbf, 0xc7, 0xcd, 0x95, 0x81, 0xb8, 0xf9, 0x16, 0x0d, 0xda, 0x88, 0xed, 0xc6, 0xcc, 0x79, 0xd8, 0x22,
0x96, 0x60, 0x57, 0x44, 0x95, 0x96, 0xf8, 0x4a, 0xe2, 0x04, 0x94, 0x3c, 0x77, 0x57, 0x27, 0x3a, 0x5d, 0x61, 0x93, 0x3f, 0xb3, 0x09, 0x8b, 0xea, 0xff, 0x2a, 0x50, 0x5d, 0xeb, 0x74, 0xdd, 0x7e,
0xd5, 0xe4, 0xc9, 0x10, 0x45, 0xcf, 0xdd, 0x25, 0x9a, 0xd6, 0x44, 0xb3, 0x90, 0xdb, 0xb2, 0xec, 0x98, 0x62, 0xe4, 0xe3, 0xe9, 0xe0, 0xed, 0x6e, 0x46, 0x76, 0xbb, 0xfb, 0x0c, 0x54, 0xe3, 0x0f,
0x28, 0x8f, 0x87, 0x15, 0xd0, 0xeb, 0xe4, 0xcc, 0xc6, 0x82, 0xa5, 0xf9, 0x51, 0x8f, 0x4e, 0x61, 0x32, 0xd8, 0xed, 0x51, 0xa5, 0x25, 0x3e, 0xc4, 0x38, 0x01, 0x25, 0xcf, 0xdd, 0xd5, 0x89, 0x71,
0x0b, 0xf5, 0x43, 0xa8, 0x85, 0xb3, 0x1e, 0xf3, 0xf1, 0x4f, 0x60, 0xf8, 0x0f, 0xc3, 0x3c, 0x05, 0x35, 0x79, 0x76, 0x45, 0xd1, 0x73, 0x77, 0x89, 0xc9, 0x35, 0xd1, 0x2c, 0xe4, 0xb6, 0x2c, 0x3b,
0x56, 0x50, 0xcf, 0xb3, 0x18, 0x1a, 0xed, 0x3f, 0xb6, 0xe8, 0x08, 0x26, 0x09, 0x06, 0xdf, 0x4b, 0x4a, 0x0c, 0x62, 0x05, 0xf4, 0x06, 0x39, 0xbc, 0xb1, 0x58, 0x6b, 0x7e, 0xd4, 0x33, 0x54, 0xd8,
0xf4, 0xb7, 0xfa, 0x8f, 0x19, 0x98, 0x4f, 0x62, 0x8f, 0x43, 0xd2, 0x95, 0xf8, 0xfe, 0x91, 0xbf, 0x82, 0xd9, 0x30, 0xd4, 0x50, 0xd4, 0x0f, 0xa1, 0x16, 0x4e, 0x7f, 0xcc, 0x87, 0x46, 0x81, 0xe1,
0xe5, 0x10, 0x47, 0xe3, 0x7b, 0x87, 0xaf, 0x40, 0xcb, 0xed, 0x39, 0x01, 0x57, 0x40, 0x64, 0x05, 0x3f, 0x08, 0x33, 0x20, 0x58, 0x41, 0x3d, 0xcf, 0x22, 0x6f, 0xb4, 0xff, 0xd8, 0xea, 0x23, 0x98,
0x6e, 0x90, 0x32, 0x5a, 0x80, 0x82, 0x65, 0xea, 0x36, 0x39, 0xde, 0x31, 0xe3, 0x94, 0xb7, 0xcc, 0x24, 0x18, 0x5c, 0xa9, 0xe8, 0x6f, 0xf5, 0xef, 0x32, 0x30, 0x9f, 0xc4, 0x1e, 0x87, 0xa4, 0x4b,
0x3b, 0xe4, 0xe8, 0xf7, 0x6a, 0xe8, 0x72, 0x8d, 0x9c, 0xdc, 0xc0, 0xf0, 0x51, 0x0d, 0x32, 0x96, 0x71, 0x45, 0x92, 0xbf, 0x1b, 0x11, 0x47, 0xe3, 0x4a, 0xc4, 0x97, 0xa2, 0xe5, 0xf6, 0x9c, 0x80,
0xc9, 0xe3, 0x1d, 0x19, 0xcb, 0x24, 0xc2, 0x44, 0xef, 0x05, 0x68, 0x22, 0x2e, 0xcf, 0xcc, 0x25, 0x5b, 0x22, 0xb2, 0x14, 0xd7, 0x49, 0x19, 0x2d, 0x40, 0xc1, 0x32, 0x75, 0x9b, 0x1c, 0xf8, 0xd8,
0x52, 0x50, 0x25, 0xd0, 0xf7, 0x42, 0x20, 0xf1, 0xca, 0x28, 0x1a, 0x8f, 0xce, 0x52, 0xcf, 0xb9, 0x76, 0x95, 0xb7, 0xcc, 0xdb, 0xe4, 0x30, 0xf8, 0x5a, 0xe8, 0x84, 0x8d, 0x9c, 0x36, 0xc1, 0xf0,
0xa8, 0x95, 0x09, 0x6c, 0x8d, 0x81, 0xd4, 0x06, 0xcc, 0x13, 0xd2, 0xd8, 0x14, 0x1f, 0x90, 0x05, 0x51, 0x0d, 0x32, 0x96, 0xc9, 0x83, 0x23, 0x19, 0xcb, 0x24, 0x52, 0x45, 0x6f, 0x0a, 0x68, 0x8a,
0x09, 0x7d, 0xad, 0xef, 0x28, 0xb0, 0x30, 0x50, 0x35, 0x0e, 0xaf, 0xaf, 0x89, 0xcb, 0x5f, 0x5e, 0x2f, 0xcf, 0xf9, 0x25, 0xe2, 0x50, 0x25, 0xd0, 0xf7, 0x42, 0x20, 0xf1, 0xd3, 0x28, 0x1a, 0x0f,
0x39, 0x2f, 0x55, 0x35, 0xf2, 0xc5, 0x0d, 0x65, 0xe5, 0xbb, 0xcc, 0x31, 0xd2, 0x58, 0xf2, 0xe5, 0xee, 0x52, 0x5f, 0xba, 0xa8, 0x95, 0x09, 0x6c, 0x8d, 0x81, 0xd4, 0x06, 0xcc, 0x13, 0xd2, 0xd8,
0x13, 0x4e, 0xe5, 0x59, 0x82, 0xfa, 0xae, 0x15, 0x6c, 0xeb, 0xf4, 0x75, 0x10, 0xf5, 0x4a, 0x58, 0x14, 0xef, 0x93, 0x05, 0x09, 0xbd, 0xaf, 0xef, 0x29, 0xb0, 0x30, 0x50, 0x35, 0x0e, 0xaf, 0xaf,
0x34, 0xbb, 0xa8, 0xd5, 0x08, 0x7c, 0x83, 0x80, 0x89, 0x67, 0xe2, 0xab, 0xdf, 0x54, 0x60, 0x26, 0x8a, 0xcb, 0x5f, 0x5e, 0x39, 0x2f, 0xb5, 0x39, 0xf2, 0xc5, 0x0d, 0x65, 0xe5, 0xd7, 0x99, 0xab,
0x46, 0xd6, 0x38, 0x6c, 0x7a, 0x83, 0x38, 0x6c, 0xac, 0x23, 0xce, 0xa9, 0x45, 0x29, 0xa7, 0xf8, 0xa4, 0xb1, 0xb4, 0xce, 0xc7, 0x9c, 0x24, 0xb4, 0x04, 0xf5, 0x5d, 0x2b, 0xd8, 0xd6, 0xe9, 0x4b,
0x68, 0x54, 0x19, 0x47, 0x2d, 0xd4, 0x7f, 0x55, 0xa0, 0x2c, 0xd4, 0x90, 0x93, 0x20, 0xaf, 0xeb, 0x24, 0xea, 0xa7, 0xb0, 0x60, 0x78, 0x51, 0xab, 0x11, 0xf8, 0x06, 0x01, 0x13, 0x5f, 0xc5, 0x57,
0x9f, 0x04, 0x23, 0xc0, 0x48, 0x6c, 0x78, 0x0e, 0xfa, 0x2a, 0x4a, 0x48, 0x66, 0x17, 0xb2, 0xe9, 0xbf, 0xa5, 0xc0, 0x4c, 0x8c, 0xac, 0x71, 0xd8, 0xf4, 0x26, 0x71, 0xe1, 0x58, 0x47, 0x9c, 0x53,
0x4c, 0x1f, 0xdd, 0x86, 0x1a, 0x63, 0x53, 0x44, 0xba, 0xf4, 0x82, 0x26, 0xca, 0x13, 0x34, 0x3c, 0x8b, 0x52, 0x4e, 0xf1, 0xd1, 0xa8, 0x55, 0x8e, 0x5a, 0xa8, 0x3f, 0x56, 0xa0, 0x2c, 0xd4, 0x90,
0x93, 0x53, 0xa9, 0x55, 0x7d, 0xa1, 0xc4, 0x42, 0x9b, 0xae, 0x89, 0xe9, 0x48, 0xb9, 0x81, 0x73, 0xb3, 0x21, 0xaf, 0xeb, 0x9f, 0x0d, 0x23, 0xc0, 0x48, 0x6c, 0x78, 0x06, 0xfa, 0xb6, 0x4a, 0x48,
0x59, 0x45, 0x6c, 0x4a, 0x7c, 0x5b, 0x1b, 0x1b, 0x26, 0xf6, 0xa2, 0xb9, 0x45, 0x65, 0xe2, 0x4c, 0x93, 0x17, 0xf2, 0xf4, 0x4c, 0x1f, 0xdd, 0x82, 0x1a, 0x63, 0x53, 0x44, 0xba, 0xf4, 0xca, 0x26,
0xb2, 0xdf, 0x3a, 0xf1, 0xf5, 0xb9, 0xb2, 0x05, 0x06, 0x22, 0xc7, 0x00, 0xf4, 0x25, 0x98, 0x32, 0xca, 0x40, 0x34, 0x3c, 0x93, 0x53, 0xa9, 0x55, 0x7d, 0xa1, 0xc4, 0xe2, 0xa0, 0xae, 0x89, 0xe9,
0x3b, 0xb1, 0xa7, 0x69, 0xa1, 0xf7, 0x6b, 0x76, 0x84, 0x37, 0x69, 0x31, 0x82, 0x26, 0xe3, 0x04, 0x48, 0xb9, 0x81, 0x93, 0x5a, 0x45, 0x6c, 0x4a, 0xbc, 0x5d, 0x1b, 0x1b, 0x26, 0xf6, 0xa2, 0xb9,
0xfd, 0xb7, 0x12, 0x3d, 0xf6, 0xf5, 0xb0, 0x89, 0x9d, 0xc0, 0x32, 0xec, 0xc3, 0xcb, 0x64, 0x13, 0x45, 0x65, 0xe2, 0x5e, 0xb2, 0xdf, 0x3a, 0xf1, 0xfe, 0xb9, 0xd5, 0x05, 0x06, 0x22, 0x07, 0x03,
0x8a, 0x3d, 0x1f, 0x7b, 0x82, 0x6d, 0x88, 0xca, 0xa4, 0xae, 0x6b, 0xf8, 0xfe, 0xae, 0xeb, 0x99, 0xf4, 0x1c, 0x4c, 0x99, 0x9d, 0xd8, 0x33, 0xb8, 0xd0, 0x1f, 0x36, 0x3b, 0xc2, 0xfb, 0xb7, 0x18,
0x9c, 0xca, 0xa8, 0x3c, 0x24, 0x35, 0x91, 0x3d, 0x10, 0x95, 0xa7, 0x26, 0x5e, 0x81, 0x85, 0x8e, 0x41, 0x93, 0x71, 0x82, 0xbe, 0xd1, 0x7f, 0x58, 0xec, 0x61, 0x13, 0x3b, 0x81, 0x65, 0xd8, 0x87,
0x6b, 0x5a, 0x5b, 0x96, 0x2c, 0xa3, 0x91, 0x34, 0x9b, 0x0b, 0xab, 0x63, 0xed, 0xd4, 0xef, 0x67, 0x97, 0xc9, 0x26, 0x14, 0x7b, 0x3e, 0xf6, 0x84, 0x4d, 0x22, 0x2a, 0x93, 0xba, 0xae, 0xe1, 0xfb,
0x60, 0xe1, 0xfd, 0xae, 0xf9, 0x05, 0xcc, 0x79, 0x11, 0xca, 0xae, 0x6d, 0xae, 0xc7, 0xa7, 0x2d, 0xbb, 0xae, 0x67, 0x72, 0x2a, 0xa3, 0xf2, 0x90, 0xa4, 0x47, 0xf6, 0x18, 0x55, 0x9e, 0xf4, 0x78,
0x82, 0x08, 0x86, 0x83, 0x77, 0x23, 0x0c, 0x76, 0x2b, 0x2f, 0x82, 0x86, 0xa6, 0x6d, 0x1e, 0x8a, 0x09, 0x16, 0x3a, 0xae, 0x69, 0x6d, 0x59, 0xb2, 0x5c, 0x49, 0xd2, 0x6c, 0x2e, 0xac, 0x8e, 0xb5,
0x37, 0xf9, 0x61, 0xbc, 0x69, 0xc3, 0x02, 0x0b, 0x11, 0x3f, 0x61, 0xd6, 0xa8, 0x1f, 0xc3, 0x1c, 0x0b, 0x9f, 0x71, 0xcc, 0x88, 0xcf, 0x38, 0x7e, 0x90, 0x81, 0x85, 0xf7, 0xbb, 0xe6, 0xe7, 0xc0,
0x51, 0xcd, 0x64, 0x98, 0xf7, 0x7d, 0xec, 0x8d, 0xa9, 0x71, 0x4e, 0x42, 0x29, 0xec, 0x39, 0xcc, 0x87, 0x45, 0x28, 0xbb, 0xb6, 0xb9, 0x1e, 0x67, 0x85, 0x08, 0x22, 0x18, 0x0e, 0xde, 0x8d, 0x30,
0xa8, 0xed, 0x03, 0xd4, 0xdb, 0x30, 0x9b, 0x18, 0xeb, 0x90, 0x33, 0x52, 0x17, 0x01, 0x34, 0xd7, 0xd8, 0x25, 0xbe, 0x08, 0x1a, 0x9a, 0x24, 0x7a, 0x28, 0x7e, 0xe5, 0x87, 0xf1, 0xab, 0xf4, 0xd9,
0xc6, 0xef, 0x38, 0x81, 0x15, 0xec, 0x11, 0xf3, 0x2e, 0xb8, 0x4b, 0xf4, 0x37, 0xc1, 0x20, 0x63, 0x95, 0x7c, 0x31, 0x53, 0x9f, 0x6d, 0x64, 0xd4, 0x9f, 0x87, 0x05, 0x16, 0x6e, 0x7e, 0xcc, 0x5c,
0x0c, 0xc1, 0xf8, 0x45, 0x98, 0x66, 0x3b, 0x8e, 0xf4, 0x74, 0x78, 0xe6, 0xbe, 0x0a, 0x79, 0x4c, 0x0a, 0xd7, 0x68, 0x4e, 0x5c, 0xa3, 0x8f, 0x61, 0x8e, 0x58, 0x73, 0x32, 0xf4, 0xfb, 0x3e, 0xf6,
0x07, 0xe1, 0xe7, 0xfe, 0xd3, 0x72, 0x15, 0x1b, 0x51, 0xab, 0x71, 0x74, 0xf5, 0x17, 0x60, 0x6a, 0xc6, 0x34, 0x52, 0x27, 0xa1, 0x14, 0x8e, 0x16, 0xa6, 0xf7, 0xf6, 0x01, 0xea, 0xcf, 0xc1, 0x6c,
0xd5, 0x73, 0xbb, 0xe3, 0x8d, 0x4e, 0xbd, 0x07, 0x1b, 0x8b, 0x6e, 0x60, 0x91, 0x00, 0xe8, 0x79, 0x62, 0xac, 0x43, 0xce, 0x32, 0x9c, 0xc9, 0xbc, 0x38, 0x93, 0x45, 0x00, 0xcd, 0xb5, 0xf1, 0x3b,
0xf4, 0xef, 0x14, 0x98, 0xbf, 0xdf, 0xc5, 0x9e, 0x11, 0x60, 0xc2, 0x8b, 0xf1, 0x46, 0x1a, 0xb6, 0x4e, 0x60, 0x05, 0x7b, 0xc4, 0x4b, 0x10, 0xdc, 0x2f, 0xfa, 0x9b, 0x60, 0x90, 0x71, 0x87, 0x60,
0xbf, 0x62, 0x54, 0x64, 0xe3, 0x54, 0xa0, 0x37, 0x62, 0x2f, 0xb6, 0xe4, 0xc7, 0x82, 0x04, 0x95, 0xfc, 0xaa, 0x02, 0xd3, 0x4c, 0x73, 0x49, 0x57, 0x87, 0x5f, 0x85, 0xd7, 0x20, 0x8f, 0xe9, 0x28,
0x42, 0xe6, 0xf7, 0x1f, 0x2a, 0x30, 0xbd, 0x81, 0x89, 0x0d, 0x19, 0x8f, 0xfc, 0xcb, 0x30, 0x49, 0xfc, 0x46, 0xe1, 0xb4, 0xdc, 0x54, 0x47, 0xe4, 0x6a, 0x1c, 0x5d, 0xaa, 0x46, 0x01, 0x4c, 0xad,
0x28, 0x1a, 0x75, 0x91, 0x28, 0x32, 0x3a, 0x07, 0xd3, 0x96, 0xd3, 0xb2, 0x7b, 0x26, 0xd6, 0xc9, 0x7a, 0x6e, 0x77, 0x3c, 0x8a, 0xa8, 0x67, 0x62, 0x63, 0xd1, 0xd7, 0x2c, 0x12, 0xc0, 0xdd, 0x34,
0x5c, 0x75, 0xe2, 0x42, 0x71, 0xc3, 0x3d, 0xc5, 0x2b, 0x08, 0xc9, 0xc4, 0x3c, 0xaa, 0x8f, 0x99, 0xc1, 0xf8, 0x27, 0x05, 0xe6, 0xef, 0x75, 0xb1, 0x67, 0x04, 0x98, 0x30, 0x6d, 0xbc, 0xd1, 0x87,
0x48, 0x46, 0xf9, 0x31, 0x6c, 0x38, 0xe5, 0x20, 0xc3, 0xbd, 0x02, 0x39, 0x32, 0x4c, 0x68, 0xac, 0xe9, 0x6e, 0x8c, 0xb2, 0x6c, 0x9c, 0x32, 0xf4, 0x66, 0xec, 0xed, 0x99, 0xfc, 0x3c, 0x92, 0xa0,
0xe5, 0xad, 0xfa, 0x52, 0xad, 0x31, 0x6c, 0xf5, 0x1b, 0x0a, 0x20, 0x91, 0x45, 0xe3, 0x6c, 0xe0, 0xb2, 0x9f, 0xc3, 0x1e, 0xce, 0x6b, 0x41, 0x9c, 0xd7, 0x8f, 0x14, 0x98, 0xde, 0xc0, 0x64, 0x1f,
0xd7, 0xc4, 0x00, 0x79, 0x76, 0x28, 0xe9, 0x6c, 0xa6, 0x51, 0x68, 0x5c, 0x58, 0x29, 0xba, 0x8c, 0x1b, 0x6f, 0x4a, 0x17, 0x61, 0x92, 0x50, 0x39, 0xea, 0x02, 0x53, 0x64, 0x74, 0x0e, 0xa6, 0x2d,
0xe3, 0xac, 0x14, 0x99, 0xd7, 0xd0, 0x95, 0x12, 0x98, 0x40, 0x91, 0xc5, 0x95, 0xa2, 0x92, 0x28, 0xa7, 0x65, 0xf7, 0x4c, 0xac, 0x93, 0xf9, 0xeb, 0xc4, 0x8d, 0xe3, 0xce, 0xc3, 0x14, 0xaf, 0x20,
0x59, 0x29, 0x42, 0x73, 0xb8, 0x52, 0x8c, 0xc2, 0x70, 0xa5, 0xe8, 0x70, 0xca, 0x41, 0x86, 0x7b, 0xd3, 0x20, 0x5b, 0xb4, 0x54, 0xc6, 0x1f, 0x31, 0x19, 0x8f, 0x92, 0x7c, 0x18, 0x09, 0xca, 0x41,
0x05, 0x72, 0x64, 0x98, 0xfd, 0x99, 0x14, 0xae, 0x14, 0xc5, 0x16, 0x56, 0x8a, 0x13, 0xf0, 0xe4, 0x48, 0x78, 0x15, 0x72, 0x64, 0xe8, 0xd0, 0x89, 0x90, 0xb7, 0xea, 0xab, 0x89, 0xc6, 0xb0, 0xd5,
0x57, 0xaa, 0x3f, 0xd3, 0xfe, 0x4a, 0xa9, 0x50, 0xb9, 0xbf, 0xf9, 0x31, 0x6e, 0x05, 0x43, 0xb4, 0x5f, 0x50, 0x00, 0x89, 0x6c, 0x1b, 0xc7, 0x4a, 0xbc, 0x2e, 0x06, 0xf7, 0xb3, 0x43, 0x49, 0x67,
0xe3, 0x59, 0x98, 0x5a, 0xf7, 0xac, 0x1d, 0xcb, 0xc6, 0xed, 0x61, 0x6a, 0xf6, 0x9b, 0x0a, 0x54, 0x33, 0x8d, 0xc2, 0xfa, 0xea, 0xa7, 0xd1, 0xea, 0xd1, 0xe5, 0x1e, 0x67, 0xf5, 0xc8, 0xbc, 0x86,
0x6f, 0x79, 0x86, 0x13, 0xb8, 0xa1, 0xaa, 0x3d, 0x14, 0x3f, 0xaf, 0x43, 0xa9, 0x1b, 0x8e, 0xc6, 0xae, 0x9e, 0xc0, 0x04, 0x8a, 0x2c, 0xae, 0x1e, 0x95, 0x58, 0xc9, 0xea, 0x11, 0x9a, 0xe9, 0xea,
0x17, 0xfe, 0x79, 0x79, 0x00, 0x23, 0x4e, 0x93, 0xd6, 0x6f, 0xa6, 0x7e, 0x00, 0xb3, 0x94, 0x92, 0x71, 0xfb, 0xde, 0x68, 0x64, 0xc8, 0xa2, 0x31, 0x62, 0xc3, 0x45, 0xa3, 0x23, 0x2b, 0x07, 0x19,
0x24, 0xd9, 0x6f, 0x42, 0x91, 0x6a, 0x5c, 0x8b, 0x5f, 0x1e, 0x94, 0x57, 0x54, 0xf9, 0x79, 0x41, 0xf9, 0x55, 0xc8, 0x91, 0x11, 0xf7, 0xe7, 0x57, 0xb8, 0x68, 0x14, 0x5b, 0x58, 0x34, 0x4e, 0xc0,
0x9c, 0x86, 0x16, 0xb5, 0x51, 0xff, 0x5d, 0x81, 0x32, 0xad, 0xeb, 0x4f, 0xf0, 0xe0, 0x5b, 0xfb, 0xe3, 0x5f, 0xb4, 0xfe, 0x4c, 0xfb, 0x8b, 0xa6, 0x42, 0xe5, 0xde, 0xe6, 0xc7, 0xb8, 0x15, 0x0c,
0x35, 0xc8, 0xbb, 0x94, 0xe5, 0x43, 0xe3, 0x9c, 0xe2, 0xaa, 0x68, 0xbc, 0x01, 0x71, 0x3f, 0xd9, 0xb1, 0xbc, 0x67, 0x61, 0x6a, 0xdd, 0xb3, 0x76, 0x2c, 0x1b, 0xb7, 0x87, 0x99, 0xf0, 0x6f, 0x29,
0x2f, 0x51, 0xbd, 0x02, 0x03, 0x71, 0x05, 0x5b, 0x68, 0x33, 0xda, 0xa9, 0x8e, 0x1d, 0x6d, 0x7e, 0x50, 0xbd, 0xe9, 0x19, 0x4e, 0xe0, 0x86, 0x66, 0xfc, 0x50, 0xfc, 0xbc, 0x06, 0xa5, 0x6e, 0x38,
0x61, 0x13, 0xf5, 0xd3, 0x48, 0x26, 0x29, 0xc2, 0xe1, 0xf7, 0xed, 0x57, 0x12, 0x86, 0x70, 0x31, 0x1a, 0x97, 0x81, 0x67, 0xe5, 0x51, 0x97, 0x38, 0x4d, 0x5a, 0xbf, 0x99, 0xfa, 0x01, 0xcc, 0x52,
0x9d, 0x8a, 0x84, 0x25, 0x24, 0x87, 0x9e, 0x18, 0x09, 0x63, 0x1e, 0x7a, 0xa2, 0xe5, 0x1e, 0x76, 0x4a, 0x92, 0x64, 0x5f, 0x81, 0x22, 0x35, 0xe6, 0x16, 0xbf, 0xe8, 0x28, 0xaf, 0xa8, 0xf2, 0x23,
0xe8, 0x11, 0x09, 0xe9, 0x2f, 0xf6, 0x8f, 0x14, 0x58, 0xe0, 0xc6, 0x28, 0x92, 0xa3, 0x23, 0x60, 0x8d, 0x38, 0x0d, 0x2d, 0x6a, 0xa3, 0xfe, 0x9b, 0x02, 0x65, 0x5a, 0xd7, 0x9f, 0xe0, 0xc1, 0xb5,
0x09, 0xfa, 0x2a, 0x37, 0x9a, 0x59, 0x6a, 0x34, 0x5f, 0x1c, 0x66, 0x34, 0x23, 0x3a, 0x05, 0xab, 0xfc, 0x75, 0xc8, 0xbb, 0x94, 0xe5, 0x43, 0x83, 0xb3, 0xe2, 0xaa, 0x68, 0xbc, 0x01, 0xf1, 0x90,
0x79, 0x16, 0x4a, 0x77, 0x29, 0xd2, 0x3b, 0x8f, 0x03, 0xd4, 0x80, 0xc2, 0x0e, 0xf6, 0x7c, 0xcb, 0xd9, 0x2f, 0xd1, 0x22, 0x03, 0x03, 0x71, 0x9b, 0x5c, 0x68, 0x33, 0xda, 0xa9, 0x59, 0x1e, 0x6d,
0x75, 0xf8, 0xd6, 0x0d, 0x8b, 0xe7, 0xce, 0x40, 0x31, 0x7c, 0x68, 0x85, 0x0a, 0x90, 0xbd, 0x66, 0x7e, 0x61, 0x13, 0x7a, 0x56, 0x63, 0x32, 0x49, 0x11, 0x0e, 0xaf, 0xc2, 0x5f, 0x4e, 0xec, 0xb1,
0xdb, 0xf5, 0x09, 0x54, 0x81, 0xe2, 0x1a, 0x7f, 0x4d, 0x54, 0x57, 0xce, 0xbd, 0x0d, 0x33, 0x12, 0x8b, 0xe9, 0x54, 0xc8, 0x37, 0xd9, 0x98, 0x65, 0x25, 0x67, 0xb5, 0x18, 0x59, 0x63, 0x9e, 0xd5,
0xe3, 0x8c, 0xa6, 0xa1, 0x7a, 0xcd, 0xa4, 0x5e, 0xdc, 0x03, 0x97, 0x00, 0xeb, 0x13, 0x68, 0x1e, 0x22, 0x11, 0x18, 0x76, 0x56, 0x13, 0x89, 0xeb, 0x0b, 0xc0, 0xbf, 0x28, 0xb0, 0xc0, 0xf7, 0xb4,
0x90, 0x86, 0x3b, 0xee, 0x0e, 0x45, 0xbc, 0xe9, 0xb9, 0x1d, 0x0a, 0x57, 0xce, 0x5d, 0x80, 0x59, 0x48, 0xb6, 0x8e, 0x80, 0x4d, 0xe8, 0x2b, 0x7c, 0xef, 0xcd, 0xd2, 0xbd, 0xf7, 0x85, 0x61, 0x7b,
0x19, 0xa5, 0xa8, 0x04, 0x39, 0x3a, 0xf3, 0xfa, 0x04, 0x02, 0xc8, 0x6b, 0x78, 0xc7, 0x7d, 0x88, 0x6f, 0x44, 0xe7, 0x3e, 0x9b, 0xef, 0x59, 0x28, 0xdd, 0xa1, 0x0d, 0xdf, 0x79, 0x14, 0xa0, 0x06,
0xeb, 0xca, 0xca, 0x5f, 0x9c, 0x83, 0x2a, 0xa3, 0x9d, 0x3f, 0x0b, 0x46, 0x3a, 0xd4, 0x93, 0xdf, 0x14, 0x76, 0xb0, 0xe7, 0x5b, 0xae, 0xc3, 0x55, 0x3c, 0x2c, 0x9e, 0x3b, 0x03, 0xc5, 0xf0, 0x35,
0x41, 0x42, 0x5f, 0x96, 0xdf, 0x2e, 0xca, 0x3f, 0x97, 0xd4, 0x1c, 0x26, 0x38, 0xea, 0x04, 0xfa, 0x1a, 0x2a, 0x40, 0xf6, 0xaa, 0x6d, 0xd7, 0x27, 0x50, 0x05, 0x8a, 0x6b, 0xfc, 0xc9, 0x55, 0x5d,
0x10, 0x6a, 0xf1, 0x2f, 0x07, 0x21, 0x79, 0xf4, 0x54, 0xfa, 0x79, 0xa1, 0xfd, 0x3a, 0xd7, 0xa1, 0x39, 0xf7, 0x36, 0xcc, 0x48, 0xf6, 0x7d, 0x34, 0x0d, 0xd5, 0xab, 0x26, 0xf5, 0x2e, 0xef, 0xbb,
0x1a, 0xfb, 0xe8, 0x0f, 0x92, 0x2f, 0xa6, 0xec, 0xc3, 0x40, 0x4d, 0xb9, 0x96, 0x10, 0x3f, 0xcc, 0x04, 0x58, 0x9f, 0x40, 0xf3, 0x80, 0x34, 0xdc, 0x71, 0x77, 0x28, 0xe2, 0x0d, 0xcf, 0xed, 0x50,
0xc3, 0xa8, 0x8f, 0x7f, 0x85, 0x23, 0x85, 0x7a, 0xe9, 0xa7, 0x3a, 0xf6, 0xa3, 0xde, 0x80, 0xe9, 0xb8, 0x72, 0xee, 0x45, 0x98, 0x95, 0x51, 0x8f, 0x4a, 0x90, 0xa3, 0xdc, 0xa8, 0x4f, 0x20, 0x80,
0x81, 0x8f, 0x64, 0xa0, 0x0b, 0x29, 0xb7, 0x08, 0xf2, 0x8f, 0x69, 0xec, 0x37, 0xc4, 0x2e, 0xa0, 0xbc, 0x86, 0x77, 0xdc, 0x07, 0xb8, 0xae, 0xac, 0xfc, 0xf9, 0x39, 0xa8, 0x32, 0xda, 0xf9, 0xdb,
0xc1, 0x0f, 0xd9, 0xa0, 0x65, 0xf9, 0x0a, 0xa4, 0x7d, 0xda, 0xa7, 0x79, 0x71, 0x64, 0xfc, 0x88, 0x69, 0xa4, 0x43, 0x3d, 0xf9, 0xf9, 0x28, 0xf4, 0x25, 0xf9, 0x8d, 0xa9, 0xfc, 0x2b, 0x53, 0xcd,
0x71, 0xbf, 0xac, 0xc0, 0x42, 0xca, 0x17, 0x16, 0xd0, 0xe5, 0xb4, 0x2b, 0xa5, 0x21, 0x9f, 0x89, 0x61, 0xc2, 0xa4, 0x4e, 0xa0, 0x0f, 0xa1, 0x16, 0xff, 0xe0, 0x12, 0x92, 0x87, 0x86, 0xa5, 0x5f,
0x68, 0xbe, 0x7c, 0xb0, 0x46, 0x11, 0x21, 0x0e, 0x4c, 0x25, 0x3e, 0x30, 0x80, 0xce, 0xa7, 0xbe, 0x65, 0xda, 0xaf, 0x73, 0x1d, 0xaa, 0xb1, 0x6f, 0x25, 0x21, 0xf9, 0x02, 0xcb, 0xbe, 0xa7, 0xd4,
0x8a, 0x1c, 0xfc, 0xfa, 0x42, 0xf3, 0xcb, 0xa3, 0x21, 0x47, 0xe3, 0x7d, 0x04, 0x53, 0x89, 0xd7, 0x94, 0x5b, 0x13, 0xf1, 0x7b, 0x46, 0x8c, 0xfa, 0xf8, 0xc7, 0x4b, 0x52, 0xa8, 0x97, 0x7e, 0xe1,
0xf5, 0x29, 0xe3, 0xc9, 0xdf, 0xe0, 0xef, 0xb7, 0xa0, 0x5f, 0x83, 0x6a, 0xec, 0x19, 0x7c, 0x8a, 0x64, 0x3f, 0xea, 0x0d, 0x98, 0x1e, 0xf8, 0xb6, 0x08, 0x7a, 0x31, 0xe5, 0x42, 0x44, 0xfe, 0x0d,
0xc4, 0xcb, 0x9e, 0xca, 0xef, 0xd7, 0xf5, 0x47, 0x50, 0x11, 0x5f, 0xab, 0xa3, 0xa5, 0xb4, 0xbd, 0x92, 0xfd, 0x86, 0xd8, 0x05, 0x34, 0xf8, 0xfd, 0x1f, 0xb4, 0x2c, 0x5f, 0x81, 0xb4, 0x2f, 0x22,
0x34, 0xd0, 0xf1, 0x41, 0xb6, 0x52, 0xff, 0x95, 0xe9, 0x90, 0xad, 0x34, 0xf0, 0x30, 0x77, 0xf4, 0x35, 0x2f, 0x8c, 0x8c, 0x1f, 0x31, 0xee, 0x9b, 0x0a, 0x2c, 0xa4, 0x7c, 0x86, 0x02, 0x5d, 0x4c,
0xad, 0x24, 0xf4, 0x3f, 0x74, 0x2b, 0x1d, 0x78, 0x88, 0xaf, 0x2b, 0xf4, 0x4e, 0x5b, 0xf2, 0x8a, 0xbb, 0x1d, 0x1b, 0xf2, 0x51, 0x8d, 0xe6, 0x2b, 0x07, 0x6b, 0x14, 0x11, 0xe2, 0xc0, 0x54, 0xe2,
0x19, 0xad, 0xa4, 0xc9, 0x66, 0xfa, 0x7b, 0xed, 0xe6, 0xe5, 0x03, 0xb5, 0x89, 0xb8, 0xf8, 0x10, 0x2b, 0x0c, 0xe8, 0x7c, 0xea, 0xd3, 0xd1, 0xc1, 0x4f, 0x54, 0x34, 0xbf, 0x34, 0x1a, 0x72, 0x34,
0x6a, 0xf1, 0xb7, 0xba, 0x29, 0x5c, 0x94, 0x3e, 0x6f, 0x6e, 0x9e, 0x1f, 0x09, 0x37, 0x1a, 0xec, 0xde, 0x47, 0x30, 0x95, 0xf8, 0x04, 0x41, 0xca, 0x78, 0xf2, 0x0f, 0x15, 0xec, 0xb7, 0xa0, 0x5f,
0x7d, 0x28, 0x0b, 0x9f, 0x36, 0x44, 0x2f, 0x0c, 0x91, 0x63, 0xf1, 0x3b, 0x7f, 0xfb, 0x71, 0xf2, 0x85, 0x6a, 0xec, 0x5b, 0x01, 0x29, 0x12, 0x2f, 0xfb, 0x9e, 0xc0, 0x7e, 0x5d, 0x7f, 0x04, 0x15,
0x3d, 0x28, 0x45, 0x5f, 0x24, 0x44, 0x67, 0x53, 0xe5, 0xf7, 0x20, 0x5d, 0x6e, 0x00, 0xf4, 0x3f, 0xf1, 0x49, 0x3f, 0x5a, 0x4a, 0xd3, 0xa5, 0x81, 0x8e, 0x0f, 0xa2, 0x4a, 0xfd, 0xa7, 0xb8, 0x43,
0x37, 0x88, 0xbe, 0x24, 0xed, 0x73, 0xe0, 0x7b, 0x84, 0xfb, 0x75, 0x1a, 0x4d, 0x9f, 0xbd, 0x7c, 0x54, 0x69, 0xe0, 0xf5, 0xf2, 0xe8, 0xaa, 0x24, 0xf4, 0x3f, 0x54, 0x95, 0x0e, 0x3c, 0xc4, 0xd7,
0x18, 0x36, 0x7d, 0xf1, 0xcd, 0xce, 0x7e, 0xdd, 0x6e, 0x43, 0x35, 0xf6, 0xd2, 0x2e, 0x6d, 0x0b, 0x15, 0x7a, 0x3d, 0x2f, 0x79, 0xea, 0x8d, 0x56, 0xd2, 0x64, 0x33, 0xfd, 0x51, 0x7b, 0xf3, 0xe2,
0x4b, 0x1e, 0x40, 0x36, 0xcf, 0x8d, 0x82, 0x1a, 0xad, 0xdf, 0x36, 0x54, 0x63, 0xef, 0x9e, 0x52, 0x81, 0xda, 0x44, 0x5c, 0x7c, 0x00, 0xb5, 0xf8, 0x83, 0xe6, 0x14, 0x2e, 0x4a, 0xdf, 0x80, 0x37,
0x46, 0x92, 0x3d, 0xf3, 0x4a, 0x19, 0x49, 0xfa, 0x8c, 0x4a, 0x9d, 0x40, 0x9f, 0x0a, 0x4f, 0xac, 0xcf, 0x8f, 0x84, 0x1b, 0x0d, 0xf6, 0x3e, 0x94, 0x85, 0x2f, 0x42, 0xa2, 0xe7, 0x87, 0xc8, 0xb1,
0x62, 0xcf, 0xd8, 0xd0, 0xa5, 0xa1, 0xfd, 0xc8, 0x5e, 0xf1, 0x35, 0x57, 0x0e, 0xd2, 0x24, 0x22, 0xf8, 0x79, 0xc4, 0xfd, 0x38, 0xf9, 0x1e, 0x94, 0xa2, 0x0f, 0x39, 0xa2, 0xb3, 0xa9, 0xf2, 0x7b,
0x81, 0x4b, 0x15, 0x63, 0x69, 0xba, 0x54, 0x1d, 0x64, 0xa5, 0x36, 0x20, 0xcf, 0x5e, 0x32, 0x21, 0x90, 0x2e, 0x37, 0x00, 0xfa, 0x5f, 0x69, 0x44, 0xcf, 0x49, 0xfb, 0x1c, 0xf8, 0x8c, 0xe3, 0x7e,
0x35, 0xe5, 0xcd, 0xa2, 0xf0, 0xcc, 0xa9, 0xf9, 0x9c, 0x14, 0x27, 0xfe, 0xb6, 0x87, 0x75, 0xca, 0x9d, 0x46, 0xd3, 0x67, 0x2f, 0x3e, 0x86, 0x4d, 0x5f, 0x7c, 0xb4, 0xb4, 0x5f, 0xb7, 0xdb, 0x50,
0x6e, 0x1f, 0x53, 0x3a, 0x8d, 0xbd, 0x5e, 0x19, 0xb5, 0x53, 0x0d, 0xf2, 0x2c, 0xaf, 0x3e, 0xa5, 0x8d, 0x3d, 0x3e, 0x4c, 0x53, 0x61, 0xc9, 0xe3, 0xd0, 0xe6, 0xb9, 0x51, 0x50, 0xa3, 0xf5, 0xdb,
0xd3, 0xd8, 0x5b, 0x91, 0xe6, 0x70, 0x1c, 0x76, 0x8e, 0x9d, 0x40, 0xeb, 0x90, 0xa3, 0xa1, 0x5a, 0x86, 0x6a, 0xec, 0xe1, 0x57, 0xca, 0x48, 0xb2, 0x07, 0x6f, 0x29, 0x23, 0x49, 0xdf, 0x91, 0xa9,
0x74, 0x66, 0x58, 0xca, 0xf9, 0xb0, 0x1e, 0x63, 0x59, 0xe9, 0xea, 0x04, 0xba, 0x0f, 0x39, 0x1a, 0x13, 0xe8, 0x6b, 0xc2, 0x1b, 0xb3, 0xd8, 0x83, 0x3e, 0xf4, 0xf2, 0xd0, 0x7e, 0x64, 0x0f, 0x1b,
0xf5, 0x4a, 0xe9, 0x51, 0xcc, 0x1b, 0x6f, 0x0e, 0x45, 0x09, 0x49, 0x34, 0xa1, 0x22, 0x26, 0x8b, 0x9b, 0x2b, 0x07, 0x69, 0x12, 0x91, 0xc0, 0xa5, 0x8a, 0xb1, 0x34, 0x5d, 0xaa, 0x0e, 0xb2, 0x52,
0xa6, 0x98, 0x2c, 0x49, 0x3a, 0x6d, 0x73, 0x14, 0xcc, 0x70, 0x14, 0xb6, 0x8d, 0xfa, 0x61, 0xeb, 0x1b, 0x90, 0x67, 0x2f, 0xb8, 0x90, 0x9a, 0xf2, 0x8c, 0x53, 0x78, 0xde, 0xd5, 0x7c, 0x46, 0x8a,
0xf4, 0x6d, 0x34, 0x10, 0x12, 0x4f, 0xdf, 0x46, 0x83, 0x51, 0x70, 0x75, 0x02, 0xfd, 0xaa, 0x02, 0x13, 0x7f, 0xd3, 0xc4, 0x3a, 0x65, 0x37, 0xa5, 0x29, 0x9d, 0xc6, 0x5e, 0xed, 0x8c, 0xda, 0xa9,
0x8d, 0xb4, 0x0c, 0x46, 0x94, 0xea, 0x01, 0x0d, 0x4b, 0xc3, 0x6c, 0xbe, 0x72, 0xc0, 0x56, 0x11, 0x06, 0x79, 0xf6, 0x8c, 0x20, 0xa5, 0xd3, 0xd8, 0x1b, 0x99, 0xe6, 0x70, 0x1c, 0x76, 0xde, 0x9d,
0x2d, 0x9f, 0xd0, 0x60, 0xd9, 0x40, 0xce, 0xe2, 0xc5, 0xb4, 0xfe, 0x52, 0xf2, 0xf0, 0x9a, 0x2f, 0x40, 0xeb, 0x90, 0xa3, 0xe1, 0x67, 0x74, 0x66, 0x58, 0x62, 0xfd, 0xb0, 0x1e, 0x63, 0xb9, 0xf7,
0x8d, 0xde, 0x20, 0x1a, 0x7b, 0x13, 0xca, 0x42, 0xa0, 0x2e, 0x45, 0xf3, 0x0e, 0x46, 0x18, 0x53, 0xea, 0x04, 0xba, 0x07, 0x39, 0x1a, 0xc0, 0x4b, 0xe9, 0x51, 0xcc, 0x8e, 0x6f, 0x0e, 0x45, 0x09,
0x56, 0x55, 0x12, 0xf3, 0x63, 0xe2, 0x4d, 0x13, 0xdd, 0x52, 0x84, 0x51, 0xcc, 0x9b, 0x4b, 0x11, 0x49, 0x34, 0xa1, 0x22, 0x66, 0xc2, 0xa6, 0x6c, 0x59, 0x92, 0x5c, 0xe1, 0xe6, 0x28, 0x98, 0xe1,
0xef, 0x58, 0x9e, 0x9c, 0x3a, 0x81, 0x30, 0x54, 0xc4, 0xac, 0xb7, 0x14, 0x69, 0x94, 0x24, 0xcc, 0x28, 0x4c, 0x8d, 0xfa, 0xa1, 0xf8, 0x74, 0x35, 0x1a, 0x08, 0xf3, 0xa7, 0xab, 0xd1, 0x60, 0x64,
0x35, 0x5f, 0x1c, 0x01, 0x33, 0x1a, 0x46, 0x07, 0xe8, 0x67, 0x9d, 0xa5, 0xd8, 0xba, 0x81, 0xc4, 0x5f, 0x9d, 0x40, 0xbf, 0xa4, 0x40, 0x23, 0x2d, 0x3d, 0x13, 0xa5, 0x7a, 0x40, 0xc3, 0x72, 0x4c,
0xb7, 0xe6, 0x0b, 0xfb, 0xe2, 0x89, 0x66, 0x5f, 0xc8, 0x23, 0x4b, 0xe1, 0xfe, 0x60, 0xa6, 0xd9, 0x9b, 0xaf, 0x1e, 0xb0, 0x55, 0x44, 0xcb, 0x27, 0x34, 0xee, 0x37, 0x90, 0x90, 0x79, 0x21, 0xad,
0x08, 0x67, 0x91, 0xc1, 0x14, 0xa5, 0x94, 0xb3, 0x48, 0x6a, 0x36, 0x54, 0xf3, 0xe2, 0xc8, 0xf8, 0xbf, 0x94, 0x24, 0xc3, 0xe6, 0x4b, 0xa3, 0x37, 0x88, 0xc6, 0xde, 0x84, 0xb2, 0x10, 0x73, 0x4c,
0xd1, 0x7c, 0x1e, 0x41, 0x3d, 0x99, 0xd2, 0x95, 0x72, 0xc6, 0x4d, 0xc9, 0x30, 0x6b, 0x5e, 0x18, 0xb1, 0xbc, 0x83, 0xc1, 0xd2, 0x94, 0x55, 0x95, 0x84, 0x2f, 0x99, 0x78, 0xd3, 0x2c, 0xbe, 0x14,
0x11, 0x5b, 0xb4, 0x87, 0x27, 0x06, 0x69, 0xfa, 0x39, 0x2b, 0xd8, 0xa6, 0xd9, 0x44, 0xa3, 0xcc, 0x61, 0x14, 0x93, 0x02, 0x53, 0xc4, 0x3b, 0x96, 0x04, 0xa8, 0x4e, 0x20, 0x0c, 0x15, 0x31, 0xa5,
0x5a, 0x4c, 0x5c, 0x1a, 0x65, 0xd6, 0xb1, 0x34, 0x25, 0x6e, 0xbc, 0x68, 0x88, 0x3e, 0xcd, 0x78, 0x2f, 0x45, 0x1a, 0x25, 0xd9, 0x80, 0xcd, 0x17, 0x46, 0xc0, 0x8c, 0x86, 0xd1, 0x01, 0xfa, 0x29,
0x89, 0x09, 0x32, 0x29, 0x76, 0x26, 0x9e, 0x4e, 0xc2, 0xdc, 0xcf, 0x78, 0xe8, 0x1f, 0x9d, 0x1b, 0x75, 0x29, 0x7b, 0xdd, 0x40, 0x56, 0x5f, 0xf3, 0xf9, 0x7d, 0xf1, 0xc4, 0x6d, 0x5f, 0x48, 0x92,
0x29, 0x3f, 0x60, 0x98, 0xfb, 0x29, 0xcf, 0x25, 0x60, 0x47, 0xb7, 0x44, 0x66, 0x43, 0xca, 0x51, 0x4b, 0xe1, 0xfe, 0x60, 0x1a, 0xdd, 0x08, 0x67, 0x91, 0xc1, 0xb4, 0xab, 0x94, 0xb3, 0x48, 0x6a,
0x4a, 0x9e, 0x1a, 0x91, 0x72, 0x74, 0x4b, 0x49, 0x96, 0xa0, 0x1b, 0xab, 0x9e, 0x0c, 0x13, 0x0f, 0x86, 0x57, 0xf3, 0xc2, 0xc8, 0xf8, 0xd1, 0x7c, 0x1e, 0x42, 0x3d, 0x99, 0xa6, 0x96, 0x72, 0xc6,
0xbf, 0x0b, 0x49, 0x86, 0x0f, 0xf7, 0xbf, 0xae, 0xa8, 0x27, 0x63, 0xb2, 0x29, 0x03, 0xa4, 0x84, 0x4d, 0xc9, 0x9a, 0x6b, 0xbe, 0x38, 0x22, 0xb6, 0xb8, 0x1f, 0x9e, 0x18, 0xa4, 0xe9, 0x67, 0xac,
0x6e, 0x47, 0x18, 0x20, 0x19, 0xd9, 0x4c, 0x19, 0x20, 0x25, 0x00, 0x3a, 0x82, 0xef, 0x1a, 0x8b, 0x60, 0x9b, 0x66, 0x48, 0x8d, 0x32, 0x6b, 0x31, 0x19, 0x6b, 0x94, 0x59, 0xc7, 0x52, 0xaf, 0xf8,
0x32, 0xa6, 0x98, 0x42, 0x59, 0x24, 0x32, 0xc5, 0x14, 0x4a, 0x03, 0xa4, 0xcc, 0xa3, 0xef, 0x47, 0xe6, 0x45, 0xb3, 0x0d, 0xd2, 0x36, 0x2f, 0x31, 0xe9, 0x27, 0x65, 0x9f, 0x89, 0x67, 0xc6, 0x30,
0x10, 0x53, 0xb4, 0xdc, 0x40, 0x88, 0x71, 0x3f, 0xf2, 0xef, 0x43, 0x31, 0x0c, 0x0b, 0xa2, 0xe7, 0xf7, 0x33, 0x9e, 0xc5, 0x80, 0xce, 0x8d, 0x94, 0xea, 0x30, 0xcc, 0xfd, 0x94, 0xa7, 0x45, 0xb0,
0x53, 0x5d, 0xc4, 0x03, 0x74, 0xf8, 0x11, 0x4c, 0x25, 0x6e, 0xf0, 0x52, 0x44, 0x54, 0x1e, 0x2a, 0xa3, 0x5b, 0x22, 0x49, 0x23, 0xe5, 0x28, 0x25, 0xcf, 0xf2, 0x48, 0x39, 0xba, 0xa5, 0xe4, 0x7d,
0xdc, 0x7f, 0x3d, 0xa1, 0x1f, 0x7c, 0x4a, 0x61, 0xc2, 0x40, 0x00, 0x2f, 0x45, 0xd5, 0x0f, 0x46, 0x50, 0xc5, 0xaa, 0x27, 0x23, 0xde, 0xc3, 0xef, 0x42, 0x92, 0xa1, 0xce, 0xfd, 0xaf, 0x2b, 0xea,
0xb1, 0xc4, 0x01, 0x08, 0x61, 0x43, 0x07, 0x10, 0xe2, 0x4e, 0x43, 0x07, 0x10, 0x83, 0x2f, 0x4c, 0xc9, 0x50, 0x72, 0xca, 0x00, 0x29, 0x11, 0xe7, 0x11, 0x06, 0x48, 0x46, 0x61, 0x53, 0x06, 0x48,
0x22, 0x93, 0x17, 0x94, 0x29, 0x12, 0x99, 0x72, 0x33, 0xbc, 0x1f, 0x8b, 0x36, 0xa1, 0x2c, 0x5c, 0x09, 0xd6, 0x8e, 0xe0, 0xbb, 0xc6, 0xa2, 0x9f, 0x29, 0x5b, 0xa1, 0x2c, 0x42, 0x9a, 0xb2, 0x15,
0x6f, 0xa3, 0x61, 0xa4, 0x89, 0x77, 0xf0, 0x29, 0xae, 0x82, 0xe4, 0xa6, 0x5c, 0x9d, 0x58, 0xe9, 0x4a, 0x03, 0xb7, 0xcc, 0xa3, 0xef, 0x07, 0x31, 0x53, 0xac, 0xdc, 0x40, 0x94, 0x73, 0x3f, 0xf2,
0x41, 0x65, 0xdd, 0x73, 0x1f, 0x87, 0xdf, 0x52, 0xfc, 0x82, 0x0c, 0xfd, 0xd5, 0x16, 0xd4, 0x18, 0xef, 0x41, 0x31, 0x8c, 0x42, 0xa2, 0x67, 0x53, 0x5d, 0xc4, 0x03, 0x74, 0xf8, 0x11, 0x4c, 0x25,
0x82, 0x8e, 0x1f, 0x07, 0xba, 0xbb, 0xf9, 0x31, 0x3a, 0xb9, 0xcc, 0xfe, 0x1f, 0xc1, 0x72, 0xf8, 0x6e, 0xf0, 0x52, 0x44, 0x54, 0x1e, 0x85, 0xdc, 0x7f, 0x3d, 0xa1, 0x1f, 0xaf, 0x4a, 0x61, 0xc2,
0xff, 0x08, 0x96, 0x6f, 0x5a, 0x36, 0xbe, 0xcf, 0x33, 0x06, 0xff, 0xb3, 0x30, 0xe4, 0xe1, 0x5a, 0x40, 0x1c, 0x30, 0xc5, 0xd4, 0x0f, 0x06, 0xbe, 0xc4, 0x01, 0x08, 0x61, 0x43, 0x07, 0x10, 0x42,
0x74, 0x65, 0xad, 0xf1, 0x7f, 0x89, 0xf0, 0xce, 0xe3, 0xe0, 0xfe, 0xe6, 0xc7, 0xd7, 0x8d, 0xcf, 0x55, 0x43, 0x07, 0x10, 0x83, 0x34, 0x4c, 0x22, 0x93, 0x17, 0x94, 0x29, 0x12, 0x99, 0x72, 0x5b,
0xdf, 0x2c, 0x40, 0x6e, 0x65, 0xf9, 0xd2, 0xf2, 0x4b, 0x50, 0xb3, 0x22, 0xf4, 0xb6, 0xd7, 0x6d, 0xbc, 0x1f, 0x8b, 0x36, 0xa1, 0x2c, 0x5c, 0x79, 0xa3, 0x61, 0xa4, 0x89, 0x77, 0xf5, 0x29, 0xae,
0x5d, 0x2f, 0xb3, 0x46, 0xeb, 0xa4, 0x9f, 0x75, 0xe5, 0xe7, 0x2f, 0xb7, 0xad, 0x60, 0xbb, 0xb7, 0x82, 0xe4, 0xf6, 0x5c, 0x9d, 0x58, 0xe9, 0x41, 0x65, 0xdd, 0x73, 0x1f, 0x85, 0x1f, 0x9c, 0xfc,
0x49, 0x96, 0xe0, 0x22, 0x43, 0xbb, 0x60, 0xb9, 0xfc, 0xd7, 0x45, 0xcb, 0x09, 0xb0, 0xe7, 0x18, 0x9c, 0x36, 0xfa, 0xcb, 0x2d, 0xa8, 0x31, 0x04, 0x1d, 0x3f, 0x0a, 0x74, 0x77, 0xf3, 0x63, 0x74,
0x36, 0xfb, 0x57, 0x09, 0x1c, 0xda, 0xdd, 0xfc, 0x5d, 0x45, 0xd9, 0xcc, 0x53, 0xd0, 0xe5, 0xff, 0x72, 0x99, 0xfd, 0x1b, 0x87, 0xe5, 0xf0, 0xdf, 0x38, 0x2c, 0xdf, 0xb0, 0x6c, 0x7c, 0x8f, 0x67,
0x0f, 0x00, 0x00, 0xff, 0xff, 0xbe, 0xa2, 0xfe, 0xb7, 0x8c, 0x61, 0x00, 0x00, 0x41, 0xfe, 0x47, 0x61, 0xc8, 0xab, 0xbc, 0xe8, 0xca, 0x5a, 0xe3, 0xff, 0x49, 0xe2, 0x9d, 0x47,
0xc1, 0xbd, 0xcd, 0x8f, 0xaf, 0x19, 0x9f, 0x5d, 0x29, 0x40, 0x6e, 0x65, 0xf9, 0xe5, 0xe5, 0x97,
0xa0, 0x66, 0x45, 0xe8, 0x6d, 0xaf, 0xdb, 0xba, 0x56, 0x66, 0x8d, 0xd6, 0x49, 0x3f, 0xeb, 0xca,
0xcf, 0x5e, 0x6c, 0x5b, 0xc1, 0x76, 0x6f, 0x93, 0x2c, 0xc1, 0x05, 0x86, 0xf6, 0xa2, 0xe5, 0xf2,
0x5f, 0x17, 0x2c, 0x27, 0xc0, 0x9e, 0x63, 0xd8, 0xec, 0x3f, 0x4c, 0x70, 0x68, 0x77, 0xf3, 0xf7,
0x14, 0x65, 0x33, 0x4f, 0x41, 0x17, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xb6, 0x47, 0x70,
0xc3, 0x62, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.

View File

@ -3873,10 +3873,6 @@ func (node *Proxy) CreateCredential(ctx context.Context, req *milvuspb.CreateCre
if !node.checkHealthy() { if !node.checkHealthy() {
return unhealthyStatus(), errorutil.UnhealthyError() return unhealthyStatus(), errorutil.UnhealthyError()
} }
// validate root permission
if isValid, status := node.validateAdminPermission(ctx); !isValid {
return status, errorutil.PermissionDenyError()
}
// validate params // validate params
username := req.Username username := req.Username
if err := ValidateUsername(username); err != nil { if err := ValidateUsername(username); err != nil {
@ -3999,10 +3995,6 @@ func (node *Proxy) DeleteCredential(ctx context.Context, req *milvuspb.DeleteCre
if !node.checkHealthy() { if !node.checkHealthy() {
return unhealthyStatus(), errorutil.UnhealthyError() return unhealthyStatus(), errorutil.UnhealthyError()
} }
// validate root permission
if isValid, status := node.validateAdminPermission(ctx); !isValid {
return status, errorutil.PermissionDenyError()
}
if req.Username == util.UserRoot { if req.Username == util.UserRoot {
return &commonpb.Status{ return &commonpb.Status{
@ -4064,18 +4056,6 @@ func (node *Proxy) SendRetrieveResult(ctx context.Context, req *internalpb.Retri
}, nil }, nil
} }
func (node *Proxy) validateAdminPermission(ctx context.Context) (bool, *commonpb.Status) {
err := ValidateAdminPermission(ctx)
if err != nil {
logger.Error("fail to validate admin permission", zap.Error(err))
return false, &commonpb.Status{
ErrorCode: commonpb.ErrorCode_PermissionDenied,
Reason: err.Error(),
}
}
return true, nil
}
func (node *Proxy) CreateRole(ctx context.Context, req *milvuspb.CreateRoleRequest) (*commonpb.Status, error) { func (node *Proxy) CreateRole(ctx context.Context, req *milvuspb.CreateRoleRequest) (*commonpb.Status, error) {
logger.Debug("CreateRole", zap.Any("req", req)) logger.Debug("CreateRole", zap.Any("req", req))
if code, ok := node.checkHealthyAndReturnCode(); !ok { if code, ok := node.checkHealthyAndReturnCode(); !ok {
@ -4093,10 +4073,6 @@ func (node *Proxy) CreateRole(ctx context.Context, req *milvuspb.CreateRoleReque
}, err }, err
} }
if isValid, status := node.validateAdminPermission(ctx); !isValid {
return status, errorutil.PermissionDenyError()
}
result, err := node.rootCoord.CreateRole(ctx, req) result, err := node.rootCoord.CreateRole(ctx, req)
if err != nil { if err != nil {
logger.Error("fail to create role", zap.Error(err)) logger.Error("fail to create role", zap.Error(err))
@ -4119,9 +4095,6 @@ func (node *Proxy) DropRole(ctx context.Context, req *milvuspb.DropRoleRequest)
Reason: err.Error(), Reason: err.Error(),
}, err }, err
} }
if isValid, status := node.validateAdminPermission(ctx); !isValid {
return status, errorutil.PermissionDenyError()
}
result, err := node.rootCoord.DropRole(ctx, req) result, err := node.rootCoord.DropRole(ctx, req)
if err != nil { if err != nil {
logger.Error("fail to drop role", zap.String("role_name", req.RoleName), zap.Error(err)) logger.Error("fail to drop role", zap.String("role_name", req.RoleName), zap.Error(err))
@ -4150,9 +4123,6 @@ func (node *Proxy) OperateUserRole(ctx context.Context, req *milvuspb.OperateUse
Reason: err.Error(), Reason: err.Error(),
}, err }, err
} }
if isValid, status := node.validateAdminPermission(ctx); !isValid {
return status, errorutil.PermissionDenyError()
}
result, err := node.rootCoord.OperateUserRole(ctx, req) result, err := node.rootCoord.OperateUserRole(ctx, req)
if err != nil { if err != nil {
@ -4181,11 +4151,6 @@ func (node *Proxy) SelectRole(ctx context.Context, req *milvuspb.SelectRoleReque
}, err }, err
} }
} }
if isValid, status := node.validateAdminPermission(ctx); !isValid {
return &milvuspb.SelectRoleResponse{
Status: status,
}, errorutil.PermissionDenyError()
}
result, err := node.rootCoord.SelectRole(ctx, req) result, err := node.rootCoord.SelectRole(ctx, req)
if err != nil { if err != nil {
@ -4216,21 +4181,6 @@ func (node *Proxy) SelectUser(ctx context.Context, req *milvuspb.SelectUserReque
}, err }, err
} }
} }
curUser, err := GetCurUserFromContext(ctx)
if err != nil {
return &milvuspb.SelectUserResponse{
Status: &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
Reason: err.Error(),
},
}, err
}
isSelf := req.User != nil && req.User.Name == curUser
if isValid, status := node.validateAdminPermission(ctx); !isValid && !isSelf {
return &milvuspb.SelectUserResponse{
Status: status,
}, errorutil.PermissionDenyError()
}
result, err := node.rootCoord.SelectUser(ctx, req) result, err := node.rootCoord.SelectUser(ctx, req)
if err != nil { if err != nil {
@ -4282,9 +4232,6 @@ func (node *Proxy) OperatePrivilege(ctx context.Context, req *milvuspb.OperatePr
if code, ok := node.checkHealthyAndReturnCode(); !ok { if code, ok := node.checkHealthyAndReturnCode(); !ok {
return errorutil.UnhealthyStatus(code), errorutil.UnhealthyError() return errorutil.UnhealthyStatus(code), errorutil.UnhealthyError()
} }
if isValid, status := node.validateAdminPermission(ctx); !isValid {
return status, errorutil.PermissionDenyError()
}
if err := node.validPrivilegeParams(req); err != nil { if err := node.validPrivilegeParams(req); err != nil {
return &commonpb.Status{ return &commonpb.Status{
ErrorCode: commonpb.ErrorCode_IllegalArgument, ErrorCode: commonpb.ErrorCode_IllegalArgument,
@ -4342,12 +4289,6 @@ func (node *Proxy) SelectGrant(ctx context.Context, req *milvuspb.SelectGrantReq
return &milvuspb.SelectGrantResponse{Status: errorutil.UnhealthyStatus(code)}, errorutil.UnhealthyError() return &milvuspb.SelectGrantResponse{Status: errorutil.UnhealthyStatus(code)}, errorutil.UnhealthyError()
} }
if isValid, status := node.validateAdminPermission(ctx); !isValid {
return &milvuspb.SelectGrantResponse{
Status: status,
}, errorutil.PermissionDenyError()
}
if err := node.validGrantParams(req); err != nil { if err := node.validGrantParams(req); err != nil {
return &milvuspb.SelectGrantResponse{ return &milvuspb.SelectGrantResponse{
Status: &commonpb.Status{ Status: &commonpb.Status{

View File

@ -670,7 +670,11 @@ func (m *MetaCache) InitPolicyInfo(info []string, userRoles []string) {
m.privilegeInfos = util.StringSet(info) m.privilegeInfos = util.StringSet(info)
for _, userRole := range userRoles { for _, userRole := range userRoles {
user, role := funcutil.DecodeUserRoleCache(userRole) user, role, err := funcutil.DecodeUserRoleCache(userRole)
if err != nil {
log.Warn("invalid user-role key", zap.String("user-role", userRole), zap.Error(err))
continue
}
if m.userToRoles[user] == nil { if m.userToRoles[user] == nil {
m.userToRoles[user] = make(map[string]struct{}) m.userToRoles[user] = make(map[string]struct{})
} }
@ -705,13 +709,19 @@ func (m *MetaCache) RefreshPolicyInfo(op typeutil.CacheOp) error {
case typeutil.CacheRevokePrivilege: case typeutil.CacheRevokePrivilege:
delete(m.privilegeInfos, op.OpKey) delete(m.privilegeInfos, op.OpKey)
case typeutil.CacheAddUserToRole: case typeutil.CacheAddUserToRole:
user, role := funcutil.DecodeUserRoleCache(op.OpKey) user, role, err := funcutil.DecodeUserRoleCache(op.OpKey)
if err != nil {
return fmt.Errorf("invalid opKey, fail to decode, op_type: %d, op_key: %s", int(op.OpType), op.OpKey)
}
if m.userToRoles[user] == nil { if m.userToRoles[user] == nil {
m.userToRoles[user] = make(map[string]struct{}) m.userToRoles[user] = make(map[string]struct{})
} }
m.userToRoles[user][role] = struct{}{} m.userToRoles[user][role] = struct{}{}
case typeutil.CacheRemoveUserFromRole: case typeutil.CacheRemoveUserFromRole:
user, role := funcutil.DecodeUserRoleCache(op.OpKey) user, role, err := funcutil.DecodeUserRoleCache(op.OpKey)
if err != nil {
return fmt.Errorf("invalid opKey, fail to decode, op_type: %d, op_key: %s", int(op.OpType), op.OpKey)
}
if m.userToRoles[user] != nil { if m.userToRoles[user] != nil {
delete(m.userToRoles[user], role) delete(m.userToRoles[user], role)
} }

View File

@ -6,6 +6,8 @@ import (
"reflect" "reflect"
"strings" "strings"
"github.com/milvus-io/milvus/internal/proto/commonpb"
"github.com/milvus-io/milvus/internal/util" "github.com/milvus-io/milvus/internal/util"
"github.com/casbin/casbin/v2" "github.com/casbin/casbin/v2"
@ -87,17 +89,24 @@ func PrivilegeInterceptor(ctx context.Context, req interface{}) (context.Context
return ctx, err return ctx, err
} }
roleNames = append(roleNames, util.RolePublic) roleNames = append(roleNames, util.RolePublic)
resourceType := privilegeExt.ObjectType.String() objectType := privilegeExt.ObjectType.String()
resourceNameIndex := privilegeExt.ObjectNameIndex objectNameIndex := privilegeExt.ObjectNameIndex
resourceName := funcutil.GetResourceName(req, privilegeExt.ObjectNameIndex) objectName := funcutil.GetObjectName(req, objectNameIndex)
resourcePrivilege := privilegeExt.ObjectPrivilege.String() if isCurUserObject(objectType, username, objectName) {
return ctx, nil
}
objectNameIndexs := privilegeExt.ObjectNameIndexs
objectNames := funcutil.GetObjectNames(req, objectNameIndexs)
objectPrivilege := privilegeExt.ObjectPrivilege.String()
policyInfo := strings.Join(globalMetaCache.GetPrivilegeInfo(ctx), ",") policyInfo := strings.Join(globalMetaCache.GetPrivilegeInfo(ctx), ",")
log.Debug("current request info", zap.String("username", username), zap.Strings("role_names", roleNames), log.Debug("current request info", zap.String("username", username), zap.Strings("role_names", roleNames),
zap.String("resource_type", resourceType), zap.String("resource_privilege", resourcePrivilege), zap.Int32("resource_index", resourceNameIndex), zap.String("resource_name", resourceName), zap.String("object_type", objectType), zap.String("object_privilege", objectPrivilege),
zap.Int32("object_index", objectNameIndex), zap.String("object_name", objectName),
zap.Strings("object_names", objectNames),
zap.String("policy_info", policyInfo)) zap.String("policy_info", policyInfo))
policy := fmt.Sprintf("[%s]", strings.Join(globalMetaCache.GetPrivilegeInfo(ctx), ",")) policy := fmt.Sprintf("[%s]", policyInfo)
b := []byte(policy) b := []byte(policy)
a := jsonadapter.NewAdapter(&b) a := jsonadapter.NewAdapter(&b)
policyModel, err := initPolicyModel() policyModel, err := initPolicyModel()
@ -112,12 +121,38 @@ func PrivilegeInterceptor(ctx context.Context, req interface{}) (context.Context
return ctx, err return ctx, err
} }
for _, roleName := range roleNames { for _, roleName := range roleNames {
isPermit, err := e.Enforce(roleName, funcutil.PolicyForResource(resourceType, resourceName), privilegeExt.ObjectPrivilege.String()) permitFunc := func(resName string) (bool, error) {
object := funcutil.PolicyForResource(objectType, objectName)
isPermit, err := e.Enforce(roleName, object, objectPrivilege)
if err != nil {
log.Error("Enforce fail", zap.String("role", roleName), zap.String("object", object), zap.String("privilege", objectPrivilege), zap.Error(err))
return false, err
}
return isPermit, nil
}
// handle the api which refers one resource
permitObject, err := permitFunc(objectName)
if err != nil { if err != nil {
log.Error("Enforce fail", zap.String("policy", policy), zap.String("role", roleName), zap.Error(err))
return ctx, err return ctx, err
} }
if isPermit { if permitObject {
return ctx, nil
}
// handle the api which refers many resources
permitObjects := true
for _, name := range objectNames {
p, err := permitFunc(name)
if err != nil {
return ctx, err
}
if !p {
permitObjects = false
break
}
}
if permitObjects && len(objectNames) != 0 {
return ctx, nil return ctx, nil
} }
} }
@ -128,6 +163,16 @@ func PrivilegeInterceptor(ctx context.Context, req interface{}) (context.Context
type ErrPermissionDenied struct{} type ErrPermissionDenied struct{}
func (e ErrPermissionDenied) Error() string { func (e *ErrPermissionDenied) Error() string {
return "permission deny" return "permission deny"
} }
// isCurUserObject Determine whether it is an Object of type User that operates on its own user information,
// like updating password or viewing your own role information.
// make users operate their own user information when the related privileges are not granted.
func isCurUserObject(objectType string, curUser string, object string) bool {
if objectType != commonpb.ObjectType_User.String() {
return false
}
return curUser == object
}

View File

@ -2169,10 +2169,6 @@ func TestProxy(t *testing.T) {
} }
} }
createCredentialReq := constructCreateCredentialRequest() createCredentialReq := constructCreateCredentialRequest()
// permission deny
invalidCtx := GetContext(context.Background(), "foo:12345")
_, err := proxy.CreateCredential(invalidCtx, createCredentialReq)
assert.Error(t, err)
// success // success
resp, err := proxy.CreateCredential(ctx, createCredentialReq) resp, err := proxy.CreateCredential(ctx, createCredentialReq)
assert.NoError(t, err) assert.NoError(t, err)
@ -2311,10 +2307,6 @@ func TestProxy(t *testing.T) {
} }
} }
delCredReq := constructDelCredRequest() delCredReq := constructDelCredRequest()
// permission deny
invalidCtx := GetContext(context.Background(), "foo:12345")
_, err := proxy.DeleteCredential(invalidCtx, delCredReq)
assert.Error(t, err)
deleteResp, err := proxy.DeleteCredential(ctx, delCredReq) deleteResp, err := proxy.DeleteCredential(ctx, delCredReq)
assert.NoError(t, err) assert.NoError(t, err)
@ -3177,10 +3169,6 @@ func TestProxy(t *testing.T) {
cancel() cancel()
} }
func getNotRootCtx() context.Context {
return GetContext(context.Background(), "foo:12345")
}
func testProxyRole(ctx context.Context, t *testing.T, proxy *Proxy) { func testProxyRole(ctx context.Context, t *testing.T, proxy *Proxy) {
var wg sync.WaitGroup var wg sync.WaitGroup
wg.Add(1) wg.Add(1)
@ -3192,9 +3180,6 @@ func testProxyRole(ctx context.Context, t *testing.T, proxy *Proxy) {
assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode) assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode)
entity.Name = "unit_test" entity.Name = "unit_test"
_, err := proxy.CreateRole(getNotRootCtx(), &milvuspb.CreateRoleRequest{Entity: entity})
assert.Error(t, err)
resp, _ = proxy.CreateRole(ctx, &milvuspb.CreateRoleRequest{Entity: entity}) resp, _ = proxy.CreateRole(ctx, &milvuspb.CreateRoleRequest{Entity: entity})
assert.Equal(t, commonpb.ErrorCode_Success, resp.ErrorCode) assert.Equal(t, commonpb.ErrorCode_Success, resp.ErrorCode)
@ -3225,28 +3210,16 @@ func testProxyRole(ctx context.Context, t *testing.T, proxy *Proxy) {
ObjectName: "col1", ObjectName: "col1",
Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Collection.String()}, Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Collection.String()},
Role: &milvuspb.RoleEntity{Name: roleName}, Role: &milvuspb.RoleEntity{Name: roleName},
Grantor: &milvuspb.GrantorEntity{Privilege: &milvuspb.PrivilegeEntity{Name: util.Load.String()}}, Grantor: &milvuspb.GrantorEntity{Privilege: &milvuspb.PrivilegeEntity{Name: util.MetaStore2API(commonpb.ObjectPrivilege_PrivilegeLoad.String())}},
}, },
} }
privilegeResp, _ := proxy.OperatePrivilege(ctx, privilegeRequest) privilegeResp, _ := proxy.OperatePrivilege(ctx, privilegeRequest)
assert.Equal(t, commonpb.ErrorCode_Success, privilegeResp.ErrorCode) assert.Equal(t, commonpb.ErrorCode_Success, privilegeResp.ErrorCode)
_, err := proxy.SelectUser(context.Background(), &milvuspb.SelectUserRequest{User: &milvuspb.UserEntity{Name: username}, IncludeRoleInfo: true})
assert.Error(t, err)
_, err = proxy.SelectUser(getNotRootCtx(), &milvuspb.SelectUserRequest{User: &milvuspb.UserEntity{Name: username}, IncludeRoleInfo: true})
assert.Error(t, err)
userResp, _ := proxy.SelectUser(ctx, &milvuspb.SelectUserRequest{User: &milvuspb.UserEntity{Name: username}, IncludeRoleInfo: true}) userResp, _ := proxy.SelectUser(ctx, &milvuspb.SelectUserRequest{User: &milvuspb.UserEntity{Name: username}, IncludeRoleInfo: true})
assert.Equal(t, commonpb.ErrorCode_Success, userResp.Status.ErrorCode) assert.Equal(t, commonpb.ErrorCode_Success, userResp.Status.ErrorCode)
roleNumOfUser := len(userResp.Results[0].Roles) roleNumOfUser := len(userResp.Results[0].Roles)
_, err = proxy.OperateUserRole(getNotRootCtx(), &milvuspb.OperateUserRoleRequest{
Username: username,
RoleName: roleName,
Type: milvuspb.OperateUserRoleType_AddUserToRole,
})
assert.Error(t, err)
roleResp, _ = proxy.OperateUserRole(ctx, &milvuspb.OperateUserRoleRequest{ roleResp, _ = proxy.OperateUserRole(ctx, &milvuspb.OperateUserRoleRequest{
Username: username, Username: username,
RoleName: roleName, RoleName: roleName,
@ -3261,9 +3234,6 @@ func testProxyRole(ctx context.Context, t *testing.T, proxy *Proxy) {
privilegeResp, _ = proxy.OperatePrivilege(ctx, privilegeRequest) privilegeResp, _ = proxy.OperatePrivilege(ctx, privilegeRequest)
assert.Equal(t, commonpb.ErrorCode_Success, privilegeResp.ErrorCode) assert.Equal(t, commonpb.ErrorCode_Success, privilegeResp.ErrorCode)
_, err = proxy.DropRole(getNotRootCtx(), &milvuspb.DropRoleRequest{RoleName: roleName})
assert.Error(t, err)
roleResp, _ = proxy.DropRole(ctx, &milvuspb.DropRoleRequest{RoleName: roleName}) roleResp, _ = proxy.DropRole(ctx, &milvuspb.DropRoleRequest{RoleName: roleName})
assert.Equal(t, commonpb.ErrorCode_Success, roleResp.ErrorCode) assert.Equal(t, commonpb.ErrorCode_Success, roleResp.ErrorCode)
@ -3305,9 +3275,6 @@ func testProxyRole(ctx context.Context, t *testing.T, proxy *Proxy) {
_, err := proxy.SelectRole(ctx, &milvuspb.SelectRoleRequest{Role: &milvuspb.RoleEntity{Name: " "}}) _, err := proxy.SelectRole(ctx, &milvuspb.SelectRoleRequest{Role: &milvuspb.RoleEntity{Name: " "}})
assert.Error(t, err) assert.Error(t, err)
_, err = proxy.SelectRole(getNotRootCtx(), &milvuspb.SelectRoleRequest{Role: &milvuspb.RoleEntity{Name: " "}})
assert.Error(t, err)
resp, _ := proxy.SelectRole(ctx, &milvuspb.SelectRoleRequest{}) resp, _ := proxy.SelectRole(ctx, &milvuspb.SelectRoleRequest{})
assert.Equal(t, commonpb.ErrorCode_Success, resp.Status.ErrorCode) assert.Equal(t, commonpb.ErrorCode_Success, resp.Status.ErrorCode)
roleNum := len(resp.Results) roleNum := len(resp.Results)
@ -3428,7 +3395,8 @@ func testProxyPrivilege(ctx context.Context, t *testing.T, proxy *Proxy) {
resp, _ = proxy.OperatePrivilege(ctx, req) resp, _ = proxy.OperatePrivilege(ctx, req)
assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode) assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode)
req.Entity.Grantor.Privilege.Name = util.All.String() req.Entity.Grantor.Privilege.Name = util.MetaStore2API(commonpb.ObjectPrivilege_PrivilegeAll.String())
resp, _ = proxy.OperatePrivilege(ctx, req) resp, _ = proxy.OperatePrivilege(ctx, req)
assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode) assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode)
@ -3449,9 +3417,7 @@ func testProxyPrivilege(ctx context.Context, t *testing.T, proxy *Proxy) {
assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode) assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode)
req.Entity.Role = &milvuspb.RoleEntity{Name: "admin"} req.Entity.Role = &milvuspb.RoleEntity{Name: "admin"}
_, err := proxy.OperatePrivilege(getNotRootCtx(), req) _, err := proxy.OperatePrivilege(context.Background(), req)
assert.Error(t, err)
_, err = proxy.OperatePrivilege(context.Background(), req)
assert.Error(t, err) assert.Error(t, err)
resp, _ = proxy.OperatePrivilege(ctx, req) resp, _ = proxy.OperatePrivilege(ctx, req)
@ -3460,8 +3426,7 @@ func testProxyPrivilege(ctx context.Context, t *testing.T, proxy *Proxy) {
req.Entity.Grantor.Privilege.Name = "not existed" req.Entity.Grantor.Privilege.Name = "not existed"
resp, _ = proxy.OperatePrivilege(ctx, req) resp, _ = proxy.OperatePrivilege(ctx, req)
assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode) assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode)
req.Entity.Grantor.Privilege.Name = util.All.String() req.Entity.Grantor.Privilege.Name = util.MetaStore2API(commonpb.ObjectPrivilege_PrivilegeAll.String())
req.Entity.Object.Name = "not existed" req.Entity.Object.Name = "not existed"
resp, _ = proxy.OperatePrivilege(ctx, req) resp, _ = proxy.OperatePrivilege(ctx, req)
assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode) assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode)
@ -3477,7 +3442,7 @@ func testProxyPrivilege(ctx context.Context, t *testing.T, proxy *Proxy) {
Role: &milvuspb.RoleEntity{Name: "public"}, Role: &milvuspb.RoleEntity{Name: "public"},
Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Collection.String()}, Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Collection.String()},
ObjectName: "col1", ObjectName: "col1",
Grantor: &milvuspb.GrantorEntity{Privilege: &milvuspb.PrivilegeEntity{Name: util.Load.String()}}, Grantor: &milvuspb.GrantorEntity{Privilege: &milvuspb.PrivilegeEntity{Name: util.MetaStore2API(commonpb.ObjectPrivilege_PrivilegeLoad.String())}},
}, },
Type: milvuspb.OperatePrivilegeType_Grant, Type: milvuspb.OperatePrivilegeType_Grant,
} }
@ -3510,8 +3475,6 @@ func testProxyPrivilege(ctx context.Context, t *testing.T, proxy *Proxy) {
assert.NotEqual(t, commonpb.ErrorCode_Success, results.Status.ErrorCode) assert.NotEqual(t, commonpb.ErrorCode_Success, results.Status.ErrorCode)
selectReq.Entity.Role = &milvuspb.RoleEntity{Name: "public"} selectReq.Entity.Role = &milvuspb.RoleEntity{Name: "public"}
_, err = proxy.SelectGrant(getNotRootCtx(), selectReq)
assert.Error(t, err)
results, _ = proxy.SelectGrant(ctx, selectReq) results, _ = proxy.SelectGrant(ctx, selectReq)
assert.Equal(t, commonpb.ErrorCode_Success, results.Status.ErrorCode) assert.Equal(t, commonpb.ErrorCode_Success, results.Status.ErrorCode)
@ -3564,7 +3527,7 @@ func testProxyPrivilegeFail(ctx context.Context, t *testing.T, proxy *Proxy, rea
Role: &milvuspb.RoleEntity{Name: "admin"}, Role: &milvuspb.RoleEntity{Name: "admin"},
ObjectName: "col1", ObjectName: "col1",
Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Collection.String()}, Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Collection.String()},
Grantor: &milvuspb.GrantorEntity{Privilege: &milvuspb.PrivilegeEntity{Name: util.All.String()}}, Grantor: &milvuspb.GrantorEntity{Privilege: &milvuspb.PrivilegeEntity{Name: util.MetaStore2API(commonpb.ObjectPrivilege_PrivilegeAll.String())}},
}, },
}) })
assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode) assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode)

View File

@ -696,21 +696,3 @@ func GetRole(username string) ([]string, error) {
} }
return globalMetaCache.GetUserRole(username), nil return globalMetaCache.GetUserRole(username), nil
} }
func ValidateAdminPermission(ctx context.Context) error {
curUser, err := GetCurUserFromContext(ctx)
if err != nil {
return fmt.Errorf("fail to get current user info from the context, err: %w", err)
}
roles, err := GetRole(curUser)
if err != nil {
return fmt.Errorf("fail to get role for the current user info, currtent user:%s, err: %w", curUser, err)
}
for _, role := range roles {
if role == util.RoleAdmin {
return nil
}
}
return fmt.Errorf("the current user doesn't have privileges of the admin role, can't execute this api")
}

View File

@ -714,29 +714,3 @@ func TestGetRole(t *testing.T) {
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, 1, len(roles)) assert.Equal(t, 1, len(roles))
} }
func TestValidateAdminPermission(t *testing.T) {
root := "root"
password := "123456"
err := ValidateAdminPermission(context.Background())
assert.NotNil(t, err)
globalMetaCache = nil
err = ValidateAdminPermission(GetContext(context.Background(), fmt.Sprintf("%s%s%s", root, util.CredentialSeperator, password)))
assert.NotNil(t, err)
globalMetaCache = &mockCache{
getUserRoleFunc: func(username string) []string {
if username == "root" {
return []string{"role1", "admin", "role2"}
}
return []string{"role1"}
},
}
err = ValidateAdminPermission(GetContext(context.Background(), fmt.Sprintf("%s%s%s", root, util.CredentialSeperator, password)))
assert.Nil(t, err)
err = ValidateAdminPermission(GetContext(context.Background(), fmt.Sprintf("%s%s%s", "test", util.CredentialSeperator, password)))
assert.NotNil(t, err)
}

View File

@ -1294,12 +1294,15 @@ func (c *Core) initRbac() (initError error) {
commonpb.ObjectPrivilege_PrivilegeDescribeCollection.String(), commonpb.ObjectPrivilege_PrivilegeDescribeCollection.String(),
commonpb.ObjectPrivilege_PrivilegeShowCollections.String(), commonpb.ObjectPrivilege_PrivilegeShowCollections.String(),
} }
collectionPrivileges := []string{
commonpb.ObjectPrivilege_PrivilegeIndexDetail.String(),
}
for _, globalPrivilege := range globalPrivileges { for _, globalPrivilege := range globalPrivileges {
if initError = c.MetaTable.OperatePrivilege(util.DefaultTenant, &milvuspb.GrantEntity{ if initError = c.MetaTable.OperatePrivilege(util.DefaultTenant, &milvuspb.GrantEntity{
Role: &milvuspb.RoleEntity{Name: util.RolePublic}, Role: &milvuspb.RoleEntity{Name: util.RolePublic},
Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Global.String()}, Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Global.String()},
ObjectName: funcutil.GlobalResourceName, ObjectName: funcutil.AnyObjectName,
Grantor: &milvuspb.GrantorEntity{ Grantor: &milvuspb.GrantorEntity{
User: &milvuspb.UserEntity{Name: util.RoleAdmin}, User: &milvuspb.UserEntity{Name: util.RoleAdmin},
Privilege: &milvuspb.PrivilegeEntity{Name: globalPrivilege}, Privilege: &milvuspb.PrivilegeEntity{Name: globalPrivilege},
@ -1308,6 +1311,19 @@ func (c *Core) initRbac() (initError error) {
return return
} }
} }
for _, collectionPrivilege := range collectionPrivileges {
if initError = c.MetaTable.OperatePrivilege(util.DefaultTenant, &milvuspb.GrantEntity{
Role: &milvuspb.RoleEntity{Name: util.RolePublic},
Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Collection.String()},
ObjectName: funcutil.AnyObjectName,
Grantor: &milvuspb.GrantorEntity{
User: &milvuspb.UserEntity{Name: util.RoleAdmin},
Privilege: &milvuspb.PrivilegeEntity{Name: collectionPrivilege},
},
}, milvuspb.OperatePrivilegeType_Grant); initError != nil {
return
}
}
return nil return nil
} }
@ -3328,7 +3344,7 @@ func (c *Core) isValidGrantor(entity *milvuspb.GrantorEntity, object string) err
if entity.Privilege == nil { if entity.Privilege == nil {
return fmt.Errorf("the privilege entity in the grantor entity is nil") return fmt.Errorf("the privilege entity in the grantor entity is nil")
} }
if privilegeName := util.PrivilegeNameForDb(entity.Privilege.Name); privilegeName == "" { if privilegeName := util.PrivilegeNameForMetastore(entity.Privilege.Name); privilegeName == "" {
return fmt.Errorf("the privilege name in the privilege entity is invalid, current value: %s", entity.Privilege.Name) return fmt.Errorf("the privilege name in the privilege entity is invalid, current value: %s", entity.Privilege.Name)
} }
privileges, ok := util.GetObjectPrivileges()[object] privileges, ok := util.GetObjectPrivileges()[object]
@ -3377,11 +3393,11 @@ func (c *Core) OperatePrivilege(ctx context.Context, in *milvuspb.OperatePrivile
return failStatus(commonpb.ErrorCode_OperatePrivilegeFailure, err.Error()), err return failStatus(commonpb.ErrorCode_OperatePrivilegeFailure, err.Error()), err
} }
logger.Debug("before PrivilegeNameForDb", zap.String("privilege", in.Entity.Grantor.Privilege.Name)) logger.Debug("before PrivilegeNameForMetastore", zap.String("privilege", in.Entity.Grantor.Privilege.Name))
in.Entity.Grantor.Privilege.Name = util.PrivilegeNameForDb(in.Entity.Grantor.Privilege.Name) in.Entity.Grantor.Privilege.Name = util.PrivilegeNameForMetastore(in.Entity.Grantor.Privilege.Name)
logger.Debug("after PrivilegeNameForDb", zap.String("privilege", in.Entity.Grantor.Privilege.Name)) logger.Debug("after PrivilegeNameForMetastore", zap.String("privilege", in.Entity.Grantor.Privilege.Name))
if in.Entity.Object.Name == commonpb.ObjectType_Global.String() { if in.Entity.Object.Name == commonpb.ObjectType_Global.String() {
in.Entity.ObjectName = funcutil.GlobalResourceName in.Entity.ObjectName = funcutil.AnyObjectName
} }
if err := c.MetaTable.OperatePrivilege(util.DefaultTenant, in.Entity, in.Type); err != nil { if err := c.MetaTable.OperatePrivilege(util.DefaultTenant, in.Entity, in.Type); err != nil {
errMsg := "fail to operate the privilege" errMsg := "fail to operate the privilege"

View File

@ -16,7 +16,11 @@
package util package util
import "github.com/milvus-io/milvus/internal/proto/commonpb" import (
"strings"
"github.com/milvus-io/milvus/internal/proto/commonpb"
)
// Meta Prefix consts // Meta Prefix consts
const ( const (
@ -34,80 +38,10 @@ const (
DefaultTenant = "" DefaultTenant = ""
RoleAdmin = "admin" RoleAdmin = "admin"
RolePublic = "public" RolePublic = "public"
PrivilegeWord = "Privilege"
) )
// ObjectPrivilegeAPI privilege name for using api
type ObjectPrivilegeAPI int32
func (o ObjectPrivilegeAPI) String() string {
switch o {
case All:
return "All"
case CreateCollection:
return "CreateCollection"
case DropCollection:
return "DropCollection"
case DescribeCollection:
return "DescribeCollection"
case ShowCollections:
return "ShowCollections"
case Load:
return "Load"
case Release:
return "Release"
case Compact:
return "Compact"
case Insert:
return "Insert"
case Delete:
return "Delete"
default:
return ""
}
}
const (
All ObjectPrivilegeAPI = iota
CreateCollection
DropCollection
DescribeCollection
ShowCollections
Load
Release
Compact
Insert
Delete
None = 999
)
func GetObjectPrivilegeFromName(name string) ObjectPrivilegeAPI {
switch name {
case All.String():
return All
case CreateCollection.String():
return CreateCollection
case DropCollection.String():
return DropCollection
case DescribeCollection.String():
return DescribeCollection
case ShowCollections.String():
return ShowCollections
case Load.String():
return Load
case Release.String():
return Release
case Compact.String():
return Compact
case Insert.String():
return Insert
case Delete.String():
return Delete
default:
return None
}
}
// StringSet convert array to map for conveniently check if the array contains an element // StringSet convert array to map for conveniently check if the array contains an element
func StringSet(strings []string) map[string]struct{} { func StringSet(strings []string) map[string]struct{} {
stringsMap := make(map[string]struct{}) stringsMap := make(map[string]struct{})
@ -129,34 +63,60 @@ func StringList(stringMap map[string]struct{}) []string {
func GetObjectPrivileges() map[string][]string { func GetObjectPrivileges() map[string][]string {
return map[string][]string{ return map[string][]string{
commonpb.ObjectType_Collection.String(): { commonpb.ObjectType_Collection.String(): {
Load.String(), MetaStore2API(commonpb.ObjectPrivilege_PrivilegeLoad.String()),
Release.String(), MetaStore2API(commonpb.ObjectPrivilege_PrivilegeRelease.String()),
Compact.String(), MetaStore2API(commonpb.ObjectPrivilege_PrivilegeCompaction.String()),
Insert.String(), MetaStore2API(commonpb.ObjectPrivilege_PrivilegeInsert.String()),
Delete.String(), MetaStore2API(commonpb.ObjectPrivilege_PrivilegeDelete.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeGetStatistics.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeCreateIndex.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeIndexDetail.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeDropIndex.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeSearch.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeFlush.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeQuery.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeLoadBalance.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeImport.String()),
}, },
commonpb.ObjectType_Global.String(): { commonpb.ObjectType_Global.String(): {
All.String(), MetaStore2API(commonpb.ObjectPrivilege_PrivilegeAll.String()),
CreateCollection.String(), MetaStore2API(commonpb.ObjectPrivilege_PrivilegeCreateCollection.String()),
DropCollection.String(), MetaStore2API(commonpb.ObjectPrivilege_PrivilegeDropCollection.String()),
DescribeCollection.String(), MetaStore2API(commonpb.ObjectPrivilege_PrivilegeDescribeCollection.String()),
ShowCollections.String(), MetaStore2API(commonpb.ObjectPrivilege_PrivilegeShowCollections.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeCreateOwnership.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeDropOwnership.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeSelectOwnership.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeManageOwnership.String()),
},
commonpb.ObjectType_User.String(): {
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeUpdateUser.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeSelectUser.String()),
}, },
} }
} }
// MetaStore2API convert meta-store's privilege name to api's
// example: PrivilegeAll -> All
func MetaStore2API(name string) string {
return name[strings.Index(name, PrivilegeWord)+len(PrivilegeWord):]
}
func PrivilegeNameForAPI(name string) string { func PrivilegeNameForAPI(name string) string {
index, ok := commonpb.ObjectPrivilege_value[name] _, ok := commonpb.ObjectPrivilege_value[name]
if !ok { if !ok {
return "" return ""
} }
return ObjectPrivilegeAPI(index).String() return MetaStore2API(name)
} }
func PrivilegeNameForDb(name string) string { func PrivilegeNameForMetastore(name string) string {
o := GetObjectPrivilegeFromName(name) dbPrivilege := PrivilegeWord + name
if o == None { _, ok := commonpb.ObjectPrivilege_value[dbPrivilege]
if !ok {
return "" return ""
} }
return commonpb.ObjectPrivilege_name[int32(o)] return dbPrivilege
} }

View File

@ -394,9 +394,12 @@ func EncodeUserRoleCache(user string, role string) string {
return fmt.Sprintf("%s/%s", user, role) return fmt.Sprintf("%s/%s", user, role)
} }
func DecodeUserRoleCache(cache string) (string, string) { func DecodeUserRoleCache(cache string) (string, string, error) {
index := strings.LastIndex(cache, "/") index := strings.LastIndex(cache, "/")
if index == -1 {
return "", "", fmt.Errorf("invalid param, cache: [%s]", cache)
}
user := cache[:index] user := cache[:index]
role := cache[index+1:] role := cache[index+1:]
return user, role return user, role, nil
} }

View File

@ -539,7 +539,11 @@ func TestUserRoleCache(t *testing.T) {
user, role := "foo", "root" user, role := "foo", "root"
cache := EncodeUserRoleCache(user, role) cache := EncodeUserRoleCache(user, role)
assert.Equal(t, fmt.Sprintf("%s/%s", user, role), cache) assert.Equal(t, fmt.Sprintf("%s/%s", user, role), cache)
u, r := DecodeUserRoleCache(cache) u, r, err := DecodeUserRoleCache(cache)
assert.Equal(t, user, u) assert.Equal(t, user, u)
assert.Equal(t, role, r) assert.Equal(t, role, r)
assert.NoError(t, err)
_, _, err = DecodeUserRoleCache("foo")
assert.Error(t, err)
} }

View File

@ -13,7 +13,7 @@ import (
) )
const ( const (
GlobalResourceName = "*" AnyObjectName = "*"
) )
func GetVersion(m proto.GeneratedMessage) (string, error) { func GetVersion(m proto.GeneratedMessage) (string, error) {
@ -53,13 +53,42 @@ func GetPrivilegeExtObj(m proto.GeneratedMessage) (commonpb.PrivilegeExt, error)
}, nil }, nil
} }
func GetResourceName(m proto.GeneratedMessage, index int32) string { // GetObjectName get object name from the grpc message according to the filed index. The filed is a string.
func GetObjectName(m proto.GeneratedMessage, index int32) string {
if index <= 0 { if index <= 0 {
return GlobalResourceName return AnyObjectName
} }
msg := proto.MessageReflect(proto.MessageV1(m)) msg := proto.MessageReflect(proto.MessageV1(m))
msgDesc := msg.Descriptor() msgDesc := msg.Descriptor()
return msg.Get(msgDesc.Fields().ByNumber(protoreflect.FieldNumber(index))).String() value := msg.Get(msgDesc.Fields().ByNumber(protoreflect.FieldNumber(index)))
user, ok := value.Interface().(protoreflect.Message)
if ok {
userDesc := user.Descriptor()
value = user.Get(userDesc.Fields().ByNumber(protoreflect.FieldNumber(1)))
if value.String() == "" {
return AnyObjectName
}
}
return value.String()
}
// GetObjectNames get object names from the grpc message according to the filed index. The filed is an array.
func GetObjectNames(m proto.GeneratedMessage, index int32) []string {
if index <= 0 {
return []string{}
}
msg := proto.MessageReflect(proto.MessageV1(m))
msgDesc := msg.Descriptor()
value := msg.Get(msgDesc.Fields().ByNumber(protoreflect.FieldNumber(index)))
names, ok := value.Interface().(protoreflect.List)
if !ok {
return []string{}
}
res := make([]string, names.Len())
for i := 0; i < names.Len(); i++ {
res[i] = names.Get(i).String()
}
return res
} }
func PolicyForPrivilege(roleName string, objectType string, objectName string, privilege string) string { func PolicyForPrivilege(roleName string, objectType string, objectName string, privilege string) string {

View File

@ -44,12 +44,36 @@ func Test_GetPrivilegeExtObj(t *testing.T) {
} }
func Test_GetResourceName(t *testing.T) { func Test_GetResourceName(t *testing.T) {
{
request := &milvuspb.HasCollectionRequest{ request := &milvuspb.HasCollectionRequest{
DbName: "test", DbName: "test",
CollectionName: "col1", CollectionName: "col1",
} }
assert.Equal(t, "*", GetResourceName(request, 0)) assert.Equal(t, "*", GetObjectName(request, 0))
assert.Equal(t, "col1", GetResourceName(request, 3)) assert.Equal(t, "col1", GetObjectName(request, 3))
}
{
request := &milvuspb.SelectUserRequest{
User: &milvuspb.UserEntity{Name: "test"},
}
assert.Equal(t, "test", GetObjectName(request, 2))
request = &milvuspb.SelectUserRequest{}
assert.Equal(t, "*", GetObjectName(request, 2))
}
}
func Test_GetResourceNames(t *testing.T) {
request := &milvuspb.FlushRequest{
DbName: "test",
CollectionNames: []string{"col1", "col2"},
}
assert.Equal(t, 0, len(GetObjectNames(request, 0)))
assert.Equal(t, 0, len(GetObjectNames(request, 2)))
names := GetObjectNames(request, 3)
assert.Equal(t, 2, len(names))
} }
func Test_PolicyForPrivilege(t *testing.T) { func Test_PolicyForPrivilege(t *testing.T) {