Fix an issue that causes flush hanging (#17169)

issue: #16628
Signed-off-by: Yuchen Gao <yuchen.gao@zilliz.com>
pull/17214/head
Ten Thousand Leaves 2022-05-25 14:34:00 +08:00 committed by GitHub
parent dfce650d78
commit 5e1e7a6896
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
28 changed files with 847 additions and 384 deletions

View File

@ -353,7 +353,7 @@ const char descriptor_table_protodef_common_2eproto[] PROTOBUF_SECTION_VARIABLE(
"led\020\003\022\013\n\007Flushed\020\004\022\014\n\010Flushing\020\005\022\013\n\007Drop"
"ped\020\006\022\r\n\tImporting\020\007*>\n\017PlaceholderType\022"
"\010\n\004None\020\000\022\020\n\014BinaryVector\020d\022\017\n\013FloatVect"
"or\020e*\331\n\n\007MsgType\022\r\n\tUndefined\020\000\022\024\n\020Creat"
"or\020e*\362\n\n\007MsgType\022\r\n\tUndefined\020\000\022\024\n\020Creat"
"eCollection\020d\022\022\n\016DropCollection\020e\022\021\n\rHas"
"Collection\020f\022\026\n\022DescribeCollection\020g\022\023\n\017"
"ShowCollections\020h\022\024\n\020GetSystemConfigs\020i\022"
@ -369,36 +369,37 @@ const char descriptor_table_protodef_common_2eproto[] PROTOBUF_SECTION_VARIABLE(
"Segments\020\377\001\022\025\n\020DescribeSegments\020\200\002\022\020\n\013Cr"
"eateIndex\020\254\002\022\022\n\rDescribeIndex\020\255\002\022\016\n\tDrop"
"Index\020\256\002\022\013\n\006Insert\020\220\003\022\013\n\006Delete\020\221\003\022\n\n\005Fl"
"ush\020\222\003\022\013\n\006Search\020\364\003\022\021\n\014SearchResult\020\365\003\022\022"
"\n\rGetIndexState\020\366\003\022\032\n\025GetIndexBuildProgr"
"ess\020\367\003\022\034\n\027GetCollectionStatistics\020\370\003\022\033\n\026"
"GetPartitionStatistics\020\371\003\022\r\n\010Retrieve\020\372\003"
"\022\023\n\016RetrieveResult\020\373\003\022\024\n\017WatchDmChannels"
"\020\374\003\022\025\n\020RemoveDmChannels\020\375\003\022\027\n\022WatchQuery"
"Channels\020\376\003\022\030\n\023RemoveQueryChannels\020\377\003\022\035\n"
"\030SealedSegmentsChangeInfo\020\200\004\022\027\n\022WatchDel"
"taChannels\020\201\004\022\024\n\017GetShardLeaders\020\202\004\022\020\n\013G"
"etReplicas\020\203\004\022\020\n\013SegmentInfo\020\330\004\022\017\n\nSyste"
"mInfo\020\331\004\022\024\n\017GetRecoveryInfo\020\332\004\022\024\n\017GetSeg"
"mentState\020\333\004\022\r\n\010TimeTick\020\260\t\022\023\n\016QueryNode"
"Stats\020\261\t\022\016\n\tLoadIndex\020\262\t\022\016\n\tRequestID\020\263\t"
"\022\017\n\nRequestTSO\020\264\t\022\024\n\017AllocateSegment\020\265\t\022"
"\026\n\021SegmentStatistics\020\266\t\022\025\n\020SegmentFlushD"
"one\020\267\t\022\017\n\nDataNodeTt\020\270\t\022\025\n\020CreateCredent"
"ial\020\334\013\022\022\n\rGetCredential\020\335\013\022\025\n\020DeleteCred"
"ential\020\336\013\022\025\n\020UpdateCredential\020\337\013\022\026\n\021List"
"CredUsernames\020\340\013*\"\n\007DslType\022\007\n\003Dsl\020\000\022\016\n\n"
"BoolExprV1\020\001*B\n\017CompactionState\022\021\n\rUndef"
"iedState\020\000\022\r\n\tExecuting\020\001\022\r\n\tCompleted\020\002"
"*X\n\020ConsistencyLevel\022\n\n\006Strong\020\000\022\013\n\007Sess"
"ion\020\001\022\013\n\007Bounded\020\002\022\016\n\nEventually\020\003\022\016\n\nCu"
"stomized\020\004*\227\001\n\013ImportState\022\021\n\rImportPend"
"ing\020\000\022\020\n\014ImportFailed\020\001\022\021\n\rImportStarted"
"\020\002\022\024\n\020ImportDownloaded\020\003\022\020\n\014ImportParsed"
"\020\004\022\023\n\017ImportPersisted\020\005\022\023\n\017ImportComplet"
"ed\020\006BW\n\016io.milvus.grpcB\013CommonProtoP\001Z3g"
"ithub.com/milvus-io/milvus/internal/prot"
"o/commonpb\240\001\001b\006proto3"
"ush\020\222\003\022\027\n\022ResendSegmentStats\020\223\003\022\013\n\006Searc"
"h\020\364\003\022\021\n\014SearchResult\020\365\003\022\022\n\rGetIndexState"
"\020\366\003\022\032\n\025GetIndexBuildProgress\020\367\003\022\034\n\027GetCo"
"llectionStatistics\020\370\003\022\033\n\026GetPartitionSta"
"tistics\020\371\003\022\r\n\010Retrieve\020\372\003\022\023\n\016RetrieveRes"
"ult\020\373\003\022\024\n\017WatchDmChannels\020\374\003\022\025\n\020RemoveDm"
"Channels\020\375\003\022\027\n\022WatchQueryChannels\020\376\003\022\030\n\023"
"RemoveQueryChannels\020\377\003\022\035\n\030SealedSegments"
"ChangeInfo\020\200\004\022\027\n\022WatchDeltaChannels\020\201\004\022\024"
"\n\017GetShardLeaders\020\202\004\022\020\n\013GetReplicas\020\203\004\022\020"
"\n\013SegmentInfo\020\330\004\022\017\n\nSystemInfo\020\331\004\022\024\n\017Get"
"RecoveryInfo\020\332\004\022\024\n\017GetSegmentState\020\333\004\022\r\n"
"\010TimeTick\020\260\t\022\023\n\016QueryNodeStats\020\261\t\022\016\n\tLoa"
"dIndex\020\262\t\022\016\n\tRequestID\020\263\t\022\017\n\nRequestTSO\020"
"\264\t\022\024\n\017AllocateSegment\020\265\t\022\026\n\021SegmentStati"
"stics\020\266\t\022\025\n\020SegmentFlushDone\020\267\t\022\017\n\nDataN"
"odeTt\020\270\t\022\025\n\020CreateCredential\020\334\013\022\022\n\rGetCr"
"edential\020\335\013\022\025\n\020DeleteCredential\020\336\013\022\025\n\020Up"
"dateCredential\020\337\013\022\026\n\021ListCredUsernames\020\340"
"\013*\"\n\007DslType\022\007\n\003Dsl\020\000\022\016\n\nBoolExprV1\020\001*B\n"
"\017CompactionState\022\021\n\rUndefiedState\020\000\022\r\n\tE"
"xecuting\020\001\022\r\n\tCompleted\020\002*X\n\020Consistency"
"Level\022\n\n\006Strong\020\000\022\013\n\007Session\020\001\022\013\n\007Bounde"
"d\020\002\022\016\n\nEventually\020\003\022\016\n\nCustomized\020\004*\227\001\n\013"
"ImportState\022\021\n\rImportPending\020\000\022\020\n\014Import"
"Failed\020\001\022\021\n\rImportStarted\020\002\022\024\n\020ImportDow"
"nloaded\020\003\022\020\n\014ImportParsed\020\004\022\023\n\017ImportPer"
"sisted\020\005\022\023\n\017ImportCompleted\020\006BW\n\016io.milv"
"us.grpcB\013CommonProtoP\001Z3github.com/milvu"
"s-io/milvus/internal/proto/commonpb\240\001\001b\006"
"proto3"
;
static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor_table_common_2eproto_deps[1] = {
};
@ -417,7 +418,7 @@ static ::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase*const descriptor_table_com
static ::PROTOBUF_NAMESPACE_ID::internal::once_flag descriptor_table_common_2eproto_once;
static bool descriptor_table_common_2eproto_initialized = false;
const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_common_2eproto = {
&descriptor_table_common_2eproto_initialized, descriptor_table_protodef_common_2eproto, "common.proto", 3581,
&descriptor_table_common_2eproto_initialized, descriptor_table_protodef_common_2eproto, "common.proto", 3606,
&descriptor_table_common_2eproto_once, descriptor_table_common_2eproto_sccs, descriptor_table_common_2eproto_deps, 10, 0,
schemas, file_default_instances, TableStruct_common_2eproto::offsets,
file_level_metadata_common_2eproto, 10, file_level_enum_descriptors_common_2eproto, file_level_service_descriptors_common_2eproto,
@ -565,6 +566,7 @@ bool MsgType_IsValid(int value) {
case 400:
case 401:
case 402:
case 403:
case 500:
case 501:
case 502:

View File

@ -283,6 +283,7 @@ enum MsgType : int {
Insert = 400,
Delete = 401,
Flush = 402,
ResendSegmentStats = 403,
Search = 500,
SearchResult = 501,
GetIndexState = 502,

View File

@ -144,6 +144,11 @@ func (c *Cluster) Import(ctx context.Context, nodeID int64, it *datapb.ImportTas
c.sessionManager.Import(ctx, nodeID, it)
}
// ReCollectSegmentStats triggers a ReCollectSegmentStats call from session manager.
func (c *Cluster) ReCollectSegmentStats(ctx context.Context, nodeID int64) {
c.sessionManager.ReCollectSegmentStats(ctx, nodeID)
}
// GetSessions returns all sessions
func (c *Cluster) GetSessions() []*Session {
return c.sessionManager.GetSessions()

View File

@ -577,3 +577,66 @@ func TestCluster_Import(t *testing.T) {
})
time.Sleep(500 * time.Millisecond)
}
func TestCluster_ReCollectSegmentStats(t *testing.T) {
kv := getMetaKv(t)
defer func() {
kv.RemoveWithPrefix("")
kv.Close()
}()
t.Run("recollect succeed", func(t *testing.T) {
ctx, cancel := context.WithCancel(context.TODO())
defer cancel()
var mockSessionCreator = func(ctx context.Context, addr string) (types.DataNode, error) {
return newMockDataNodeClient(1, nil)
}
sessionManager := NewSessionManager(withSessionCreator(mockSessionCreator))
channelManager, err := NewChannelManager(kv, newMockHandler())
assert.Nil(t, err)
cluster := NewCluster(sessionManager, channelManager)
defer cluster.Close()
addr := "localhost:8080"
info := &NodeInfo{
Address: addr,
NodeID: 1,
}
nodes := []*NodeInfo{info}
err = cluster.Startup(ctx, nodes)
assert.Nil(t, err)
err = cluster.Watch("chan-1", 1)
assert.NoError(t, err)
assert.NotPanics(t, func() {
cluster.ReCollectSegmentStats(ctx, 1)
})
time.Sleep(500 * time.Millisecond)
})
t.Run("recollect failed", func(t *testing.T) {
ctx, cancel := context.WithCancel(context.TODO())
defer cancel()
sessionManager := NewSessionManager()
channelManager, err := NewChannelManager(kv, newMockHandler())
assert.Nil(t, err)
cluster := NewCluster(sessionManager, channelManager)
defer cluster.Close()
addr := "localhost:8080"
info := &NodeInfo{
Address: addr,
NodeID: 1,
}
nodes := []*NodeInfo{info}
err = cluster.Startup(ctx, nodes)
assert.Nil(t, err)
err = cluster.Watch("chan-1", 1)
assert.NoError(t, err)
assert.NotPanics(t, func() {
cluster.ReCollectSegmentStats(ctx, 1)
})
time.Sleep(500 * time.Millisecond)
})
}

View File

@ -157,6 +157,15 @@ func (c *mockDataNodeClient) FlushSegments(ctx context.Context, in *datapb.Flush
return &commonpb.Status{ErrorCode: commonpb.ErrorCode_Success}, nil
}
func (c *mockDataNodeClient) ResendSegmentStats(ctx context.Context, req *datapb.ResendSegmentStatsRequest) (*datapb.ResendSegmentStatsResponse, error) {
return &datapb.ResendSegmentStatsResponse{
Status: &commonpb.Status{
ErrorCode: commonpb.ErrorCode_Success,
Reason: "",
},
}, nil
}
func (c *mockDataNodeClient) GetMetrics(ctx context.Context, req *milvuspb.GetMetricsRequest) (*milvuspb.GetMetricsResponse, error) {
// TODO(dragondriver): change the id, though it's not important in ut
nodeID := UniqueID(c.id)

View File

@ -297,6 +297,13 @@ func (s *Server) Start() error {
atomic.StoreInt64(&s.isServing, ServerStateHealthy)
logutil.Logger(s.ctx).Debug("startup success")
// DataCoord (re)starts successfully and starts to collection segment stats
// data from all DataNode.
// This will prevent DataCoord from missing out any important segment stats
// data while offline.
log.Info("DataNode (re)starts successfully and re-collecting segment stats from DataNodes")
s.reCollectSegmentStats(s.ctx)
return nil
}
@ -849,3 +856,16 @@ func (s *Server) loadCollectionFromRootCoord(ctx context.Context, collectionID i
s.meta.AddCollection(collInfo)
return nil
}
func (s *Server) reCollectSegmentStats(ctx context.Context) {
if s.channelManager == nil {
log.Error("null channel manager found, which should NOT happen in non-testing environment")
return
}
nodes := s.channelManager.store.GetNodes()
log.Info("re-collecting segment stats from DataNodes",
zap.Int64s("DataNode IDs", nodes))
for _, node := range nodes {
s.cluster.ReCollectSegmentStats(ctx, node)
}
}

View File

@ -2538,7 +2538,6 @@ func newTestServer(t *testing.T, receiveCh chan interface{}, opts ...Option) *Se
return newMockRootCoordService(), nil
}
assert.Nil(t, err)
err = svr.Init()
assert.Nil(t, err)
err = svr.Start()

View File

@ -24,6 +24,7 @@ import (
grpcdatanodeclient "github.com/milvus-io/milvus/internal/distributed/datanode/client"
"github.com/milvus-io/milvus/internal/log"
"github.com/milvus-io/milvus/internal/proto/commonpb"
"github.com/milvus-io/milvus/internal/proto/datapb"
"github.com/milvus-io/milvus/internal/types"
"go.uber.org/zap"
@ -32,7 +33,8 @@ import (
const (
flushTimeout = 5 * time.Second
// TODO: evaluate and update import timeout.
importTimeout = 3 * time.Hour
importTimeout = 3 * time.Hour
reCollectTimeout = 5 * time.Second
)
// SessionManager provides the grpc interfaces of cluster
@ -172,6 +174,35 @@ func (c *SessionManager) execImport(ctx context.Context, nodeID int64, itr *data
log.Info("success to import", zap.Int64("node", nodeID), zap.Any("import task", itr))
}
// ReCollectSegmentStats collects segment stats info from DataNodes, after DataCoord reboots.
func (c *SessionManager) ReCollectSegmentStats(ctx context.Context, nodeID int64) {
go c.execReCollectSegmentStats(ctx, nodeID)
}
func (c *SessionManager) execReCollectSegmentStats(ctx context.Context, nodeID int64) {
cli, err := c.getClient(ctx, nodeID)
if err != nil {
log.Warn("failed to get dataNode client", zap.Int64("DataNode ID", nodeID), zap.Error(err))
return
}
ctx, cancel := context.WithTimeout(ctx, reCollectTimeout)
defer cancel()
resp, err := cli.ResendSegmentStats(ctx, &datapb.ResendSegmentStatsRequest{
Base: &commonpb.MsgBase{
MsgType: commonpb.MsgType_ResendSegmentStats,
SourceID: Params.DataCoordCfg.GetNodeID(),
},
})
if err := VerifyResponse(resp, err); err != nil {
log.Error("re-collect segment stats call failed",
zap.Int64("DataNode ID", nodeID), zap.Error(err))
} else {
log.Info("re-collect segment stats call succeeded",
zap.Int64("DataNode ID", nodeID),
zap.Int64s("segment stat collected", resp.GetSegResent()))
}
}
func (c *SessionManager) getClient(ctx context.Context, nodeID int64) (types.DataNode, error) {
c.sessions.RLock()
session, ok := c.sessions.data[nodeID]

View File

@ -629,6 +629,23 @@ func (node *DataNode) FlushSegments(ctx context.Context, req *datapb.FlushSegmen
}, nil
}
// ResendSegmentStats resend un-flushed segment stats back upstream to DataCoord by resending DataNode time tick message.
// It returns a list of segments to be sent.
func (node *DataNode) ResendSegmentStats(ctx context.Context, req *datapb.ResendSegmentStatsRequest) (*datapb.ResendSegmentStatsResponse, error) {
log.Info("start resending segment stats, if any",
zap.Int64("DataNode ID", node.NodeID))
segResent := node.flowgraphManager.resendTT()
log.Info("found segment(s) with stats to resend",
zap.Int64s("segment IDs", segResent))
return &datapb.ResendSegmentStatsResponse{
Status: &commonpb.Status{
ErrorCode: commonpb.ErrorCode_Success,
Reason: "",
},
SegResent: segResent,
}, nil
}
// Stop will release DataNode resources and shutdown datanode
func (node *DataNode) Stop() error {
// https://github.com/milvus-io/milvus/issues/12282

View File

@ -742,3 +742,59 @@ func TestDataNode_GetComponentStates(t *testing.T) {
assert.NoError(t, err)
assert.Equal(t, commonpb.ErrorCode_Success, resp.Status.ErrorCode)
}
func TestDataNode_ResendSegmentStats(t *testing.T) {
etcdCli, err := etcd.GetEtcdClient(&Params.EtcdCfg)
assert.Nil(t, err)
defer etcdCli.Close()
dmChannelName := "fake-by-dev-rootcoord-dml-channel-test-ResendSegmentStats"
node := newIDLEDataNodeMock(context.TODO(), schemapb.DataType_Int64)
node.SetEtcdClient(etcdCli)
err = node.Init()
assert.Nil(t, err)
err = node.Start()
assert.Nil(t, err)
defer func() {
err := node.Stop()
assert.Nil(t, err)
}()
vChan := &datapb.VchannelInfo{
CollectionID: 1,
ChannelName: dmChannelName,
UnflushedSegments: []*datapb.SegmentInfo{},
FlushedSegments: []*datapb.SegmentInfo{},
}
err = node.flowgraphManager.addAndStart(node, vChan)
require.Nil(t, err)
fgService, ok := node.flowgraphManager.getFlowgraphService(dmChannelName)
assert.True(t, ok)
err = fgService.replica.addNewSegment(0, 1, 1, dmChannelName, &internalpb.MsgPosition{}, &internalpb.MsgPosition{})
assert.Nil(t, err)
err = fgService.replica.addNewSegment(1, 1, 2, dmChannelName, &internalpb.MsgPosition{}, &internalpb.MsgPosition{})
assert.Nil(t, err)
err = fgService.replica.addNewSegment(2, 1, 3, dmChannelName, &internalpb.MsgPosition{}, &internalpb.MsgPosition{})
assert.Nil(t, err)
req := &datapb.ResendSegmentStatsRequest{
Base: &commonpb.MsgBase{},
}
wg := sync.WaitGroup{}
wg.Add(2)
resp, err := node.ResendSegmentStats(node.ctx, req)
assert.NoError(t, err)
assert.Equal(t, commonpb.ErrorCode_Success, resp.GetStatus().GetErrorCode())
assert.ElementsMatch(t, []UniqueID{0, 1, 2}, resp.GetSegResent())
// Duplicate call.
resp, err = node.ResendSegmentStats(node.ctx, req)
assert.NoError(t, err)
assert.Equal(t, commonpb.ErrorCode_Success, resp.GetStatus().GetErrorCode())
assert.ElementsMatch(t, []UniqueID{0, 1, 2}, resp.GetSegResent())
}

View File

@ -38,6 +38,7 @@ type dataSyncService struct {
cancelFn context.CancelFunc
fg *flowgraph.TimeTickedFlowGraph // internal flowgraph processes insert/delta messages
flushCh chan flushMsg // chan to notify flush
resendTTCh chan resendTTMsg // chan to ask for resending DataNode time tick message.
replica Replica // segment replica stores meta
idAllocator allocatorInterface // id/timestamp allocator
msFactory msgstream.Factory
@ -54,6 +55,7 @@ type dataSyncService struct {
func newDataSyncService(ctx context.Context,
flushCh chan flushMsg,
resendTTCh chan resendTTMsg,
replica Replica,
alloc allocatorInterface,
factory msgstream.Factory,
@ -76,6 +78,7 @@ func newDataSyncService(ctx context.Context,
cancelFn: cancel,
fg: nil,
flushCh: flushCh,
resendTTCh: resendTTCh,
replica: replica,
idAllocator: alloc,
msFactory: factory,
@ -223,6 +226,7 @@ func (dsService *dataSyncService) initNodes(vchanInfo *datapb.VchannelInfo) erro
dsService.ctx,
dsService.collectionID,
dsService.flushCh,
dsService.resendTTCh,
dsService.flushManager,
dsService.flushingSegCache,
c,

View File

@ -146,6 +146,7 @@ func TestDataSyncService_newDataSyncService(te *testing.T) {
ds, err := newDataSyncService(ctx,
make(chan flushMsg),
make(chan resendTTMsg),
replica,
NewAllocatorFactory(),
test.inMsgFactory,
@ -192,6 +193,7 @@ func TestDataSyncService_Start(t *testing.T) {
collectionID := UniqueID(1)
flushChan := make(chan flushMsg, 100)
resendTTChan := make(chan resendTTMsg, 100)
cm := storage.NewLocalChunkManager(storage.RootPath(dataSyncServiceTestDir))
defer cm.RemoveWithPrefix("")
replica, err := newReplica(context.Background(), mockRootCoord, cm, collectionID)
@ -228,7 +230,7 @@ func TestDataSyncService_Start(t *testing.T) {
}
signalCh := make(chan string, 100)
sync, err := newDataSyncService(ctx, flushChan, replica, allocFactory, factory, vchan, signalCh, &DataCoordFactory{}, newCache(), cm, newCompactionExecutor())
sync, err := newDataSyncService(ctx, flushChan, resendTTChan, replica, allocFactory, factory, vchan, signalCh, &DataCoordFactory{}, newCache(), cm, newCompactionExecutor())
assert.Nil(t, err)
// sync.replica.addCollection(collMeta.ID, collMeta.Schema)

View File

@ -61,6 +61,7 @@ type insertBufferNode struct {
flushMap sync.Map
flushChan <-chan flushMsg
resendTTChan <-chan resendTTMsg
flushingSegCache *Cache
flushManager flushManager
@ -347,6 +348,12 @@ func (ibNode *insertBufferNode) Operate(in []Msg) []Msg {
dropped: false,
})
}
case resendTTMsg := <-ibNode.resendTTChan:
log.Info("resend TT msg received in insertBufferNode",
zap.Int64s("segment IDs", resendTTMsg.segmentIDs))
if err := ibNode.writeHardTimeTick(fgMsg.timeRange.timestampMax, resendTTMsg.segmentIDs); err != nil {
log.Error("send hard time tick into pulsar channel failed", zap.Error(err))
}
default:
}
}
@ -520,8 +527,8 @@ func (ibNode *insertBufferNode) getCollectionandPartitionIDbySegID(segmentID Uni
return ibNode.replica.getCollectionAndPartitionID(segmentID)
}
func newInsertBufferNode(ctx context.Context, collID UniqueID, flushCh <-chan flushMsg, fm flushManager,
flushingSegCache *Cache, config *nodeConfig) (*insertBufferNode, error) {
func newInsertBufferNode(ctx context.Context, collID UniqueID, flushCh <-chan flushMsg, resendTTCh <-chan resendTTMsg,
fm flushManager, flushingSegCache *Cache, config *nodeConfig) (*insertBufferNode, error) {
baseNode := BaseNode{}
baseNode.SetMaxQueueLength(config.maxQueueLength)
@ -581,6 +588,7 @@ func newInsertBufferNode(ctx context.Context, collID UniqueID, flushCh <-chan fl
timeTickStream: wTtMsgStream,
flushMap: sync.Map{},
flushChan: flushCh,
resendTTChan: resendTTCh,
flushingSegCache: flushingSegCache,
flushManager: fm,

View File

@ -90,6 +90,7 @@ func TestFlowGraphInsertBufferNodeCreate(t *testing.T) {
fm := NewRendezvousFlushManager(&allocator{}, cm, replica, func(*segmentFlushPack) {}, emptyFlushAndDropFunc)
flushChan := make(chan flushMsg, 100)
resendTTChan := make(chan resendTTMsg, 100)
c := &nodeConfig{
replica: replica,
@ -98,7 +99,7 @@ func TestFlowGraphInsertBufferNodeCreate(t *testing.T) {
vChannelName: "string",
}
iBNode, err := newInsertBufferNode(ctx, collMeta.ID, flushChan, fm, newCache(), c)
iBNode, err := newInsertBufferNode(ctx, collMeta.ID, flushChan, resendTTChan, fm, newCache(), c)
assert.NotNil(t, iBNode)
require.NoError(t, err)
@ -112,7 +113,7 @@ func TestFlowGraphInsertBufferNodeCreate(t *testing.T) {
cd: 0,
}
_, err = newInsertBufferNode(ctx, collMeta.ID, flushChan, fm, newCache(), c)
_, err = newInsertBufferNode(ctx, collMeta.ID, flushChan, resendTTChan, fm, newCache(), c)
assert.Error(t, err)
}
@ -176,6 +177,7 @@ func TestFlowGraphInsertBufferNode_Operate(t *testing.T) {
fm := NewRendezvousFlushManager(NewAllocatorFactory(), cm, replica, func(*segmentFlushPack) {}, emptyFlushAndDropFunc)
flushChan := make(chan flushMsg, 100)
resendTTChan := make(chan resendTTMsg, 100)
c := &nodeConfig{
replica: replica,
msFactory: factory,
@ -183,7 +185,7 @@ func TestFlowGraphInsertBufferNode_Operate(t *testing.T) {
vChannelName: "string",
}
iBNode, err := newInsertBufferNode(ctx, collMeta.ID, flushChan, fm, newCache(), c)
iBNode, err := newInsertBufferNode(ctx, collMeta.ID, flushChan, resendTTChan, fm, newCache(), c)
require.NoError(t, err)
// trigger log ts
@ -199,6 +201,13 @@ func TestFlowGraphInsertBufferNode_Operate(t *testing.T) {
inMsg := genFlowGraphInsertMsg(insertChannelName)
assert.NotPanics(t, func() { iBNode.Operate([]flowgraph.Msg{&inMsg}) })
resendTTChan <- resendTTMsg{
segmentIDs: []int64{0, 1, 2},
}
inMsg = genFlowGraphInsertMsg(insertChannelName)
assert.NotPanics(t, func() { iBNode.Operate([]flowgraph.Msg{&inMsg}) })
// test drop collection operate
inMsg = genFlowGraphInsertMsg(insertChannelName)
inMsg.dropCollection = true
@ -420,13 +429,14 @@ func TestFlowGraphInsertBufferNode_AutoFlush(t *testing.T) {
}, emptyFlushAndDropFunc)
flushChan := make(chan flushMsg, 100)
resendTTChan := make(chan resendTTMsg, 100)
c := &nodeConfig{
replica: colRep,
msFactory: factory,
allocator: NewAllocatorFactory(),
vChannelName: "string",
}
iBNode, err := newInsertBufferNode(ctx, collMeta.ID, flushChan, fm, newCache(), c)
iBNode, err := newInsertBufferNode(ctx, collMeta.ID, flushChan, resendTTChan, fm, newCache(), c)
require.NoError(t, err)
// Auto flush number of rows set to 2
@ -688,13 +698,14 @@ func TestInsertBufferNode_bufferInsertMsg(t *testing.T) {
fm := NewRendezvousFlushManager(&allocator{}, cm, replica, func(*segmentFlushPack) {}, emptyFlushAndDropFunc)
flushChan := make(chan flushMsg, 100)
resendTTChan := make(chan resendTTMsg, 100)
c := &nodeConfig{
replica: replica,
msFactory: factory,
allocator: NewAllocatorFactory(),
vChannelName: "string",
}
iBNode, err := newInsertBufferNode(ctx, collMeta.ID, flushChan, fm, newCache(), c)
iBNode, err := newInsertBufferNode(ctx, collMeta.ID, flushChan, resendTTChan, fm, newCache(), c)
require.NoError(t, err)
inMsg := genFlowGraphInsertMsg(insertChannelName)

View File

@ -55,7 +55,8 @@ func (fm *flowgraphManager) addAndStart(dn *DataNode, vchan *datapb.VchannelInfo
var alloc allocatorInterface = newAllocator(dn.rootCoord)
dataSyncService, err := newDataSyncService(dn.ctx, make(chan flushMsg, 100), replica, alloc, dn.factory, vchan, dn.clearSignal, dn.dataCoord, dn.segmentCache, dn.chunkManager, dn.compactionExecutor)
dataSyncService, err := newDataSyncService(dn.ctx, make(chan flushMsg, 100), make(chan resendTTMsg, 100), replica,
alloc, dn.factory, vchan, dn.clearSignal, dn.dataCoord, dn.segmentCache, dn.chunkManager, dn.compactionExecutor)
if err != nil {
log.Warn("new data sync service fail", zap.String("vChannelName", vchan.GetChannelName()), zap.Error(err))
return err
@ -104,6 +105,26 @@ func (fm *flowgraphManager) getFlushCh(segID UniqueID) (chan<- flushMsg, error)
return nil, fmt.Errorf("cannot find segment %d in all flowgraphs", segID)
}
// resendTT loops through flow graphs, looks for segments that are not flushed, and sends them to that flow graph's
// `resendTTCh` channel so stats of these segments will be resent.
func (fm *flowgraphManager) resendTT() []UniqueID {
var unFlushedSegments []UniqueID
fm.flowgraphs.Range(func(key, value interface{}) bool {
fg := value.(*dataSyncService)
segIDs := fg.replica.listNotFlushedSegmentIDs()
if len(segIDs) > 0 {
log.Info("un-flushed segments found, stats will be resend",
zap.Int64s("segment IDs", segIDs))
unFlushedSegments = append(unFlushedSegments, segIDs...)
fg.resendTTCh <- resendTTMsg{
segmentIDs: segIDs,
}
}
return true
})
return unFlushedSegments
}
func (fm *flowgraphManager) getFlowgraphService(vchan string) (*dataSyncService, bool) {
fg, ok := fm.flowgraphs.Load(vchan)
if ok {

View File

@ -53,3 +53,8 @@ type flushMsg struct {
collectionID UniqueID
flushed bool
}
type resendTTMsg struct {
msgID UniqueID
segmentIDs []UniqueID
}

View File

@ -55,6 +55,7 @@ type Replica interface {
getCollectionAndPartitionID(segID UniqueID) (collID, partitionID UniqueID, err error)
listAllSegmentIDs() []UniqueID
listNotFlushedSegmentIDs() []UniqueID
addNewSegment(segID, collID, partitionID UniqueID, channelName string, startPos, endPos *internalpb.MsgPosition) error
addNormalSegment(segID, collID, partitionID UniqueID, channelName string, numOfRows int64, statsBinlog []*datapb.FieldBinlog, cp *segmentCheckPoint, recoverTs Timestamp) error
filterSegments(channelName string, partitionID UniqueID) []*Segment
@ -822,3 +823,20 @@ func (replica *SegmentReplica) listAllSegmentIDs() []UniqueID {
return segIDs
}
func (replica *SegmentReplica) listNotFlushedSegmentIDs() []UniqueID {
replica.segMu.RLock()
defer replica.segMu.RUnlock()
var segIDs []UniqueID
for _, seg := range replica.newSegments {
segIDs = append(segIDs, seg.segmentID)
}
for _, seg := range replica.normalSegments {
segIDs = append(segIDs, seg.segmentID)
}
return segIDs
}

View File

@ -198,3 +198,16 @@ func (c *Client) Import(ctx context.Context, req *datapb.ImportTaskRequest) (*co
}
return ret.(*commonpb.Status), err
}
func (c *Client) ResendSegmentStats(ctx context.Context, req *datapb.ResendSegmentStatsRequest) (*datapb.ResendSegmentStatsResponse, error) {
ret, err := c.grpcClient.ReCall(ctx, func(client interface{}) (interface{}, error) {
if !funcutil.CheckCtxValid(ctx) {
return nil, ctx.Err()
}
return client.(datapb.DataNodeClient).ResendSegmentStats(ctx, req)
})
if err != nil || ret == nil {
return nil, err
}
return ret.(*datapb.ResendSegmentStatsResponse), err
}

View File

@ -76,6 +76,12 @@ func Test_NewClient(t *testing.T) {
r6, err := client.Compaction(ctx, nil)
retCheck(retNotNil, r6, err)
r7, err := client.Import(ctx, nil)
retCheck(retNotNil, r7, err)
r8, err := client.ResendSegmentStats(ctx, nil)
retCheck(retNotNil, r8, err)
}
client.grpcClient = &mock.ClientBase{

View File

@ -357,3 +357,7 @@ func (s *Server) Compaction(ctx context.Context, request *datapb.CompactionPlan)
func (s *Server) Import(ctx context.Context, request *datapb.ImportTaskRequest) (*commonpb.Status, error) {
return s.datanode.Import(ctx, request)
}
func (s *Server) ResendSegmentStats(ctx context.Context, request *datapb.ResendSegmentStatsRequest) (*datapb.ResendSegmentStatsResponse, error) {
return s.datanode.ResendSegmentStats(ctx, request)
}

View File

@ -46,6 +46,7 @@ type MockDataNode struct {
regErr error
strResp *milvuspb.StringResponse
metricResp *milvuspb.GetMetricsResponse
resendResp *datapb.ResendSegmentStatsResponse
}
func (m *MockDataNode) Init() error {
@ -115,6 +116,10 @@ func (m *MockDataNode) Import(ctx context.Context, req *datapb.ImportTaskRequest
return m.status, m.err
}
func (m *MockDataNode) ResendSegmentStats(ctx context.Context, req *datapb.ResendSegmentStatsRequest) (*datapb.ResendSegmentStatsResponse, error) {
return m.resendResp, nil
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
type mockDataCoord struct {
types.DataCoord
@ -259,6 +264,15 @@ func Test_NewServer(t *testing.T) {
assert.NotNil(t, resp)
})
t.Run("ResendSegmentStats", func(t *testing.T) {
server.datanode = &MockDataNode{
resendResp: &datapb.ResendSegmentStatsResponse{},
}
resp, err := server.ResendSegmentStats(ctx, nil)
assert.Nil(t, err)
assert.NotNil(t, resp)
})
err = server.Stop()
assert.Nil(t, err)
}

View File

@ -152,6 +152,7 @@ enum MsgType {
Insert = 400;
Delete = 401;
Flush = 402;
ResendSegmentStats = 403;
/* QUERY */
Search = 500;

View File

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

View File

@ -64,6 +64,8 @@ service DataNode {
// https://wiki.lfaidata.foundation/display/MIL/MEP+24+--+Support+bulk+load
rpc Import(ImportTaskRequest) returns(common.Status) {}
rpc ResendSegmentStats(ResendSegmentStatsRequest) returns(ResendSegmentStatsResponse) {}
}
message FlushRequest {
@ -486,4 +488,13 @@ message ImportTaskRequest {
message UpdateSegmentStatisticsRequest {
common.MsgBase base = 1;
repeated SegmentStats stats = 2;
}
}
message ResendSegmentStatsRequest {
common.MsgBase base = 1;
}
message ResendSegmentStatsResponse {
common.Status status = 1;
repeated int64 seg_resent = 2;
}

View File

@ -3721,6 +3721,92 @@ func (m *UpdateSegmentStatisticsRequest) GetStats() []*SegmentStats {
return nil
}
type ResendSegmentStatsRequest struct {
Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ResendSegmentStatsRequest) Reset() { *m = ResendSegmentStatsRequest{} }
func (m *ResendSegmentStatsRequest) String() string { return proto.CompactTextString(m) }
func (*ResendSegmentStatsRequest) ProtoMessage() {}
func (*ResendSegmentStatsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_82cd95f524594f49, []int{59}
}
func (m *ResendSegmentStatsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ResendSegmentStatsRequest.Unmarshal(m, b)
}
func (m *ResendSegmentStatsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ResendSegmentStatsRequest.Marshal(b, m, deterministic)
}
func (m *ResendSegmentStatsRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_ResendSegmentStatsRequest.Merge(m, src)
}
func (m *ResendSegmentStatsRequest) XXX_Size() int {
return xxx_messageInfo_ResendSegmentStatsRequest.Size(m)
}
func (m *ResendSegmentStatsRequest) XXX_DiscardUnknown() {
xxx_messageInfo_ResendSegmentStatsRequest.DiscardUnknown(m)
}
var xxx_messageInfo_ResendSegmentStatsRequest proto.InternalMessageInfo
func (m *ResendSegmentStatsRequest) GetBase() *commonpb.MsgBase {
if m != nil {
return m.Base
}
return nil
}
type ResendSegmentStatsResponse struct {
Status *commonpb.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"`
SegResent []int64 `protobuf:"varint,2,rep,packed,name=seg_resent,json=segResent,proto3" json:"seg_resent,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ResendSegmentStatsResponse) Reset() { *m = ResendSegmentStatsResponse{} }
func (m *ResendSegmentStatsResponse) String() string { return proto.CompactTextString(m) }
func (*ResendSegmentStatsResponse) ProtoMessage() {}
func (*ResendSegmentStatsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_82cd95f524594f49, []int{60}
}
func (m *ResendSegmentStatsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ResendSegmentStatsResponse.Unmarshal(m, b)
}
func (m *ResendSegmentStatsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ResendSegmentStatsResponse.Marshal(b, m, deterministic)
}
func (m *ResendSegmentStatsResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_ResendSegmentStatsResponse.Merge(m, src)
}
func (m *ResendSegmentStatsResponse) XXX_Size() int {
return xxx_messageInfo_ResendSegmentStatsResponse.Size(m)
}
func (m *ResendSegmentStatsResponse) XXX_DiscardUnknown() {
xxx_messageInfo_ResendSegmentStatsResponse.DiscardUnknown(m)
}
var xxx_messageInfo_ResendSegmentStatsResponse proto.InternalMessageInfo
func (m *ResendSegmentStatsResponse) GetStatus() *commonpb.Status {
if m != nil {
return m.Status
}
return nil
}
func (m *ResendSegmentStatsResponse) GetSegResent() []int64 {
if m != nil {
return m.SegResent
}
return nil
}
func init() {
proto.RegisterEnum("milvus.proto.data.ChannelWatchState", ChannelWatchState_name, ChannelWatchState_value)
proto.RegisterEnum("milvus.proto.data.CompactionType", CompactionType_name, CompactionType_value)
@ -3783,229 +3869,234 @@ func init() {
proto.RegisterType((*ImportTaskResponse)(nil), "milvus.proto.data.ImportTaskResponse")
proto.RegisterType((*ImportTaskRequest)(nil), "milvus.proto.data.ImportTaskRequest")
proto.RegisterType((*UpdateSegmentStatisticsRequest)(nil), "milvus.proto.data.UpdateSegmentStatisticsRequest")
proto.RegisterType((*ResendSegmentStatsRequest)(nil), "milvus.proto.data.ResendSegmentStatsRequest")
proto.RegisterType((*ResendSegmentStatsResponse)(nil), "milvus.proto.data.ResendSegmentStatsResponse")
}
func init() { proto.RegisterFile("data_coord.proto", fileDescriptor_82cd95f524594f49) }
var fileDescriptor_82cd95f524594f49 = []byte{
// 3466 bytes of a gzipped FileDescriptorProto
// 3518 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x1b, 0xcb, 0x6e, 0x1b, 0xd7,
0xd5, 0xc3, 0x97, 0xc8, 0xc3, 0x87, 0xa8, 0x6b, 0x45, 0xa6, 0x69, 0x5b, 0x96, 0xc7, 0xb1, 0xa3,
0x38, 0x8e, 0x9d, 0xc8, 0x09, 0x62, 0x34, 0x2f, 0x44, 0x92, 0xa5, 0x10, 0x95, 0x54, 0x65, 0xa4,
0xd5, 0xc3, 0x97, 0xc8, 0xc3, 0x87, 0xe8, 0x6b, 0x47, 0xa6, 0x69, 0x5b, 0x96, 0xc7, 0xb1, 0xa3,
0x38, 0x8e, 0x9d, 0xc8, 0x09, 0x62, 0x34, 0x2f, 0xc4, 0x96, 0xad, 0x10, 0xb5, 0x54, 0x65, 0xa4,
0xc4, 0x45, 0x53, 0x74, 0x30, 0xe2, 0x5c, 0x51, 0x13, 0x71, 0x66, 0xe8, 0x99, 0xa1, 0x65, 0x65,
0x13, 0xa3, 0x01, 0x0a, 0xa4, 0x28, 0xfa, 0x40, 0x37, 0x2d, 0xd0, 0x45, 0x51, 0xa0, 0x40, 0x1f,
0x9b, 0x02, 0x41, 0x17, 0x6d, 0xd1, 0x4d, 0x57, 0x41, 0xbb, 0xe8, 0x27, 0x74, 0xd9, 0x5d, 0xbf,
0xa1, 0xb8, 0x8f, 0xb9, 0xf3, 0xe0, 0x90, 0x1c, 0x89, 0x76, 0xbc, 0xd3, 0x3d, 0x73, 0xce, 0xb9,
0xe7, 0x9e, 0x7b, 0xde, 0xbc, 0x82, 0xba, 0xae, 0x79, 0x9a, 0xda, 0xb6, 0x6d, 0x47, 0xbf, 0xd5,
0x73, 0x6c, 0xcf, 0x46, 0x33, 0xa6, 0xd1, 0x7d, 0xd8, 0x77, 0xd9, 0xea, 0x16, 0xf9, 0xdc, 0xac,
0xb4, 0x6d, 0xd3, 0xb4, 0x2d, 0x06, 0x6a, 0xd6, 0x0c, 0xcb, 0xc3, 0x8e, 0xa5, 0x75, 0xf9, 0xba,
0x12, 0x26, 0x68, 0x56, 0xdc, 0xf6, 0x01, 0x36, 0x35, 0xb6, 0x92, 0xa7, 0x20, 0x7f, 0xcf, 0xec,
0x79, 0xc7, 0xf2, 0x2f, 0x24, 0xa8, 0xac, 0x75, 0xfb, 0xee, 0x81, 0x82, 0x1f, 0xf4, 0xb1, 0xeb,
0xa1, 0x57, 0x20, 0xb7, 0xa7, 0xb9, 0xb8, 0x21, 0x2d, 0x48, 0x8b, 0xe5, 0xa5, 0x8b, 0xb7, 0x22,
0xbb, 0xf2, 0xfd, 0x36, 0xdd, 0xce, 0xb2, 0xe6, 0x62, 0x85, 0x62, 0x22, 0x04, 0x39, 0x7d, 0xaf,
0xb5, 0xda, 0xc8, 0x2c, 0x48, 0x8b, 0x59, 0x85, 0xfe, 0x8d, 0xe6, 0x01, 0x5c, 0xdc, 0x31, 0xb1,
0xe5, 0xb5, 0x56, 0xdd, 0x46, 0x76, 0x21, 0xbb, 0x98, 0x55, 0x42, 0x10, 0x24, 0x43, 0xa5, 0x6d,
0x77, 0xbb, 0xb8, 0xed, 0x19, 0xb6, 0xd5, 0x5a, 0x6d, 0xe4, 0x28, 0x6d, 0x04, 0x26, 0xff, 0x4a,
0x82, 0x2a, 0x17, 0xcd, 0xed, 0xd9, 0x96, 0x8b, 0xd1, 0x1d, 0x28, 0xb8, 0x9e, 0xe6, 0xf5, 0x5d,
0x2e, 0xdd, 0x85, 0x44, 0xe9, 0x76, 0x28, 0x8a, 0xc2, 0x51, 0x13, 0xc5, 0x8b, 0x6f, 0x9f, 0x1d,
0xdc, 0x3e, 0x76, 0x84, 0x5c, 0xfc, 0x08, 0xf2, 0xcf, 0x24, 0xa8, 0xef, 0xf8, 0x4b, 0x5f, 0x7b,
0xb3, 0x90, 0x6f, 0xdb, 0x7d, 0xcb, 0xa3, 0x02, 0x56, 0x15, 0xb6, 0x40, 0x57, 0xa0, 0xd2, 0x3e,
0xd0, 0x2c, 0x0b, 0x77, 0x55, 0x4b, 0x33, 0x31, 0x15, 0xa5, 0xa4, 0x94, 0x39, 0x6c, 0x4b, 0x33,
0x71, 0x2a, 0x89, 0x16, 0xa0, 0xdc, 0xd3, 0x1c, 0xcf, 0x88, 0xe8, 0x2c, 0x0c, 0x92, 0x7f, 0x2d,
0xc1, 0xdc, 0x7b, 0xae, 0x6b, 0x74, 0xac, 0x01, 0xc9, 0xe6, 0xa0, 0x60, 0xd9, 0x3a, 0x6e, 0xad,
0x52, 0xd1, 0xb2, 0x0a, 0x5f, 0xa1, 0x0b, 0x50, 0xea, 0x61, 0xec, 0xa8, 0x8e, 0xdd, 0xf5, 0x05,
0x2b, 0x12, 0x80, 0x62, 0x77, 0x31, 0xfa, 0x00, 0x66, 0xdc, 0x18, 0x23, 0x76, 0x9b, 0xe5, 0xa5,
0xab, 0xb7, 0x06, 0xec, 0xf1, 0x56, 0x7c, 0x53, 0x65, 0x90, 0x5a, 0x7e, 0x9c, 0x81, 0xb3, 0x02,
0x8f, 0xc9, 0x4a, 0xfe, 0x26, 0x9a, 0x73, 0x71, 0x47, 0x88, 0xc7, 0x16, 0x69, 0x34, 0x27, 0x54,
0x9e, 0x0d, 0xab, 0x3c, 0x85, 0x81, 0xc5, 0xf5, 0x99, 0x1f, 0xd0, 0x27, 0xba, 0x0c, 0x65, 0xfc,
0xa8, 0x67, 0x38, 0x58, 0xf5, 0x0c, 0x13, 0x37, 0x0a, 0x0b, 0xd2, 0x62, 0x4e, 0x01, 0x06, 0xda,
0x35, 0xcc, 0xb0, 0x45, 0x4e, 0xa5, 0xb6, 0x48, 0xf9, 0x37, 0x12, 0x9c, 0x1b, 0xb8, 0x25, 0x6e,
0xe2, 0x0a, 0xd4, 0xe9, 0xc9, 0x03, 0xcd, 0x10, 0x63, 0x27, 0x0a, 0xbf, 0x3e, 0x4a, 0xe1, 0x01,
0xba, 0x32, 0x40, 0x1f, 0x12, 0x32, 0x93, 0x5e, 0xc8, 0x43, 0x38, 0xb7, 0x8e, 0x3d, 0xbe, 0x01,
0xf9, 0x86, 0xdd, 0xd3, 0x87, 0x88, 0xa8, 0x2f, 0x65, 0x06, 0x7c, 0xe9, 0x4f, 0x19, 0xe1, 0x4b,
0x74, 0xab, 0x96, 0xb5, 0x6f, 0xa3, 0x8b, 0x50, 0x12, 0x28, 0xdc, 0x2a, 0x02, 0x00, 0x7a, 0x03,
0xf2, 0x44, 0x52, 0x66, 0x12, 0xb5, 0xa5, 0x2b, 0xc9, 0x67, 0x0a, 0xf1, 0x54, 0x18, 0x3e, 0x6a,
0x41, 0xcd, 0xf5, 0x34, 0xc7, 0x53, 0x7b, 0xb6, 0x4b, 0xef, 0x99, 0x1a, 0x4e, 0x79, 0x49, 0x8e,
0x72, 0x10, 0xc1, 0x74, 0xd3, 0xed, 0x6c, 0x73, 0x4c, 0xa5, 0x4a, 0x29, 0xfd, 0x25, 0xba, 0x07,
0x15, 0x6c, 0xe9, 0x01, 0xa3, 0x5c, 0x6a, 0x46, 0x65, 0x6c, 0xe9, 0x82, 0x4d, 0x70, 0x3f, 0xf9,
0xf4, 0xf7, 0xf3, 0x23, 0x09, 0x1a, 0x83, 0x17, 0x34, 0x49, 0xa0, 0x7c, 0x93, 0x11, 0x61, 0x76,
0x41, 0x23, 0x3d, 0x5c, 0x5c, 0x92, 0xc2, 0x49, 0x64, 0x03, 0x9e, 0x0b, 0xa4, 0xa1, 0x5f, 0x9e,
0x9a, 0xb1, 0x7c, 0x2e, 0xc1, 0x5c, 0x7c, 0xaf, 0x49, 0xce, 0xfd, 0x1a, 0xe4, 0x0d, 0x6b, 0xdf,
0xf6, 0x8f, 0x3d, 0x3f, 0xc2, 0xcf, 0xc8, 0x5e, 0x0c, 0x59, 0x36, 0xe1, 0xc2, 0x3a, 0xf6, 0x5a,
0x96, 0x8b, 0x1d, 0x6f, 0xd9, 0xb0, 0xba, 0x76, 0x67, 0x5b, 0xf3, 0x0e, 0x26, 0xf0, 0x91, 0x88,
0xb9, 0x67, 0x62, 0xe6, 0x2e, 0xff, 0x4e, 0x82, 0x8b, 0xc9, 0xfb, 0xf1, 0xa3, 0x37, 0xa1, 0xb8,
0x6f, 0xe0, 0xae, 0x4e, 0x74, 0x26, 0x51, 0x9d, 0x89, 0x35, 0xf1, 0x95, 0x1e, 0x41, 0xe6, 0x27,
0xbc, 0x32, 0xc4, 0x40, 0x77, 0x3c, 0xc7, 0xb0, 0x3a, 0x1b, 0x86, 0xeb, 0x29, 0x0c, 0x3f, 0xa4,
0xcf, 0x6c, 0x7a, 0xcb, 0xfc, 0xa1, 0x04, 0xf3, 0xeb, 0xd8, 0x5b, 0x11, 0xa1, 0x96, 0x7c, 0x37,
0x5c, 0xcf, 0x68, 0xbb, 0x4f, 0xb6, 0xc8, 0x48, 0x91, 0x33, 0xe5, 0x9f, 0x48, 0x70, 0x79, 0xa8,
0x30, 0x5c, 0x75, 0x3c, 0x94, 0xf8, 0x81, 0x36, 0x39, 0x94, 0x7c, 0x13, 0x1f, 0x7f, 0xa4, 0x75,
0xfb, 0x78, 0x5b, 0x33, 0x1c, 0x16, 0x4a, 0x4e, 0x19, 0x58, 0xff, 0x28, 0xc1, 0xa5, 0x75, 0xec,
0x6d, 0xfb, 0x69, 0xe6, 0x19, 0x6a, 0x27, 0x45, 0x45, 0xf1, 0x63, 0x76, 0x99, 0x89, 0xd2, 0x3e,
0x13, 0xf5, 0xcd, 0x53, 0x3f, 0x08, 0x39, 0xe4, 0x0a, 0xab, 0x05, 0xb8, 0xf2, 0xe4, 0xc7, 0x59,
0xa8, 0x7c, 0xc4, 0xeb, 0x03, 0x9a, 0x46, 0xe2, 0x7a, 0x90, 0x92, 0xf5, 0x10, 0x2a, 0x29, 0x92,
0xaa, 0x8c, 0x75, 0xa8, 0xba, 0x18, 0x1f, 0x9e, 0x26, 0x69, 0x54, 0x08, 0xa1, 0x08, 0xf6, 0x1b,
0x30, 0xd3, 0xb7, 0xf6, 0x49, 0x59, 0x8b, 0x75, 0x7e, 0x0a, 0x56, 0x5d, 0x8e, 0x8f, 0x3c, 0x83,
0x84, 0xe8, 0x7d, 0x98, 0x8e, 0xf3, 0xca, 0xa7, 0xe2, 0x15, 0x27, 0x43, 0x2d, 0xa8, 0xeb, 0x8e,
0xdd, 0xeb, 0x61, 0x5d, 0x75, 0x7d, 0x56, 0x85, 0x74, 0xac, 0x38, 0x9d, 0xcf, 0x4a, 0xfe, 0x42,
0x82, 0xb9, 0xfb, 0x9a, 0xd7, 0x3e, 0x58, 0x35, 0xf9, 0xe5, 0x4c, 0x60, 0xda, 0x6f, 0x43, 0xe9,
0x21, 0xbf, 0x08, 0x3f, 0x7e, 0x5d, 0x4e, 0x10, 0x28, 0x7c, 0xe5, 0x4a, 0x40, 0x21, 0x7f, 0x25,
0xc1, 0x2c, 0x6d, 0x22, 0x7c, 0xe9, 0xbe, 0x7e, 0x27, 0x1b, 0xd3, 0x48, 0xa0, 0xeb, 0x50, 0x33,
0x35, 0xe7, 0x70, 0x27, 0xc0, 0xc9, 0x53, 0x9c, 0x18, 0x54, 0x7e, 0x04, 0xc0, 0x57, 0x9b, 0x6e,
0xe7, 0x14, 0xf2, 0xdf, 0x85, 0x29, 0xbe, 0x2b, 0xf7, 0xb7, 0x71, 0x17, 0xeb, 0xa3, 0xcb, 0xff,
0x94, 0xa0, 0x16, 0x44, 0x50, 0xea, 0x55, 0x35, 0xc8, 0x08, 0x5f, 0xca, 0xb4, 0x56, 0xd1, 0xdb,
0x50, 0x60, 0x0d, 0x26, 0xe7, 0x7d, 0x2d, 0xca, 0x9b, 0x37, 0x9f, 0xa1, 0x30, 0x4c, 0x01, 0x0a,
0x27, 0x22, 0x3a, 0x12, 0x51, 0x47, 0xf4, 0x8b, 0x01, 0x04, 0xb5, 0x60, 0x3a, 0x5a, 0xb4, 0xf9,
0x3e, 0xb3, 0x30, 0x2c, 0xda, 0xac, 0x6a, 0x9e, 0x46, 0x83, 0x4d, 0x2d, 0x52, 0xb3, 0xb9, 0xf2,
0xff, 0xf2, 0x50, 0x0e, 0x9d, 0x72, 0xe0, 0x24, 0xf1, 0x2b, 0xcd, 0x8c, 0x8f, 0x9b, 0xd9, 0xc1,
0xce, 0xe1, 0x1a, 0xd4, 0x0c, 0x9a, 0xab, 0x55, 0x6e, 0x8a, 0x34, 0xb8, 0x96, 0x94, 0x2a, 0x83,
0x72, 0xbf, 0x40, 0xf3, 0x50, 0xb6, 0xfa, 0xa6, 0x6a, 0xef, 0xab, 0x8e, 0x7d, 0xe4, 0xf2, 0x16,
0xa4, 0x64, 0xf5, 0xcd, 0x6f, 0xed, 0x2b, 0xf6, 0x91, 0x1b, 0x54, 0xb9, 0x85, 0x13, 0x56, 0xb9,
0xf3, 0x50, 0x36, 0xb5, 0x47, 0x84, 0xab, 0x6a, 0xf5, 0x4d, 0xda, 0x9d, 0x64, 0x95, 0x92, 0xa9,
0x3d, 0x52, 0xec, 0xa3, 0xad, 0xbe, 0x89, 0x16, 0xa1, 0xde, 0xd5, 0x5c, 0x4f, 0x0d, 0xb7, 0x37,
0x45, 0xda, 0xde, 0xd4, 0x08, 0xfc, 0x5e, 0xd0, 0xe2, 0x0c, 0xd6, 0xcb, 0xa5, 0x09, 0xea, 0x65,
0xdd, 0xec, 0x06, 0x8c, 0x20, 0x7d, 0xbd, 0xac, 0x9b, 0x5d, 0xc1, 0xe6, 0x2e, 0x4c, 0xed, 0xd1,
0x0a, 0xc8, 0x6d, 0x94, 0x87, 0x46, 0xa8, 0x35, 0x52, 0xfc, 0xb0, 0x42, 0x49, 0xf1, 0xd1, 0xd1,
0x5b, 0x50, 0xa2, 0xa9, 0x87, 0xd2, 0x56, 0x52, 0xd1, 0x06, 0x04, 0x84, 0x5a, 0xc7, 0x5d, 0x4f,
0xa3, 0xd4, 0xd5, 0x74, 0xd4, 0x82, 0x00, 0xbd, 0x02, 0x67, 0xdb, 0x0e, 0xd6, 0x3c, 0xac, 0x2f,
0x1f, 0xaf, 0xd8, 0x66, 0x4f, 0xa3, 0xc6, 0xd4, 0xa8, 0x2d, 0x48, 0x8b, 0x45, 0x25, 0xe9, 0x13,
0x09, 0x0c, 0x6d, 0xb1, 0x5a, 0x73, 0x6c, 0xb3, 0x31, 0xcd, 0x02, 0x43, 0x14, 0x8a, 0x2e, 0x01,
0xf8, 0xa1, 0x5b, 0xf3, 0x1a, 0x75, 0x7a, 0x8b, 0x25, 0x0e, 0x79, 0xcf, 0x93, 0x3f, 0x83, 0xd9,
0xc0, 0x42, 0x42, 0xb7, 0x31, 0x78, 0xb1, 0xd2, 0x69, 0x2f, 0x76, 0x74, 0xed, 0xfa, 0xef, 0x1c,
0xcc, 0xed, 0x68, 0x0f, 0xf1, 0xd3, 0x2f, 0x93, 0x53, 0xc5, 0xe3, 0x0d, 0x98, 0xa1, 0x95, 0xf1,
0x52, 0x48, 0x9e, 0x11, 0x19, 0x38, 0x7c, 0x9d, 0x83, 0x84, 0xe8, 0x5d, 0x52, 0x3a, 0xe0, 0xf6,
0xe1, 0xb6, 0x6d, 0x04, 0xd9, 0xf7, 0x52, 0x02, 0x9f, 0x15, 0x81, 0xa5, 0x84, 0x29, 0xd0, 0xf6,
0x60, 0x68, 0x63, 0x79, 0xf7, 0x85, 0x91, 0xfd, 0x57, 0xa0, 0xfd, 0x78, 0x84, 0x43, 0x0d, 0x98,
0xe2, 0xd9, 0x9d, 0xfa, 0x7d, 0x51, 0xf1, 0x97, 0x68, 0x1b, 0xce, 0xb2, 0x13, 0xec, 0x70, 0xa3,
0x66, 0x87, 0x2f, 0xa6, 0x3a, 0x7c, 0x12, 0x69, 0xd4, 0x27, 0x4a, 0x27, 0xf5, 0x89, 0x06, 0x4c,
0x71, 0x3b, 0xa5, 0xb1, 0xa0, 0xa8, 0xf8, 0x4b, 0x72, 0xcd, 0x86, 0xd9, 0xb3, 0x1d, 0xcf, 0xb0,
0x3a, 0x8d, 0x32, 0xfd, 0x16, 0x00, 0x48, 0x8b, 0x01, 0x81, 0x3e, 0xc7, 0x4c, 0x0a, 0xde, 0x81,
0xa2, 0xb0, 0xf0, 0x4c, 0x6a, 0x0b, 0x17, 0x34, 0xf1, 0x18, 0x9d, 0x8d, 0xc5, 0x68, 0xf9, 0x5f,
0x12, 0x54, 0x56, 0xc9, 0x91, 0x36, 0xec, 0x0e, 0xcd, 0x28, 0xd7, 0xa0, 0xe6, 0xe0, 0xb6, 0xed,
0xe8, 0x2a, 0xb6, 0x3c, 0xc7, 0xc0, 0xac, 0x1b, 0xcd, 0x29, 0x55, 0x06, 0xbd, 0xc7, 0x80, 0x04,
0x8d, 0x84, 0x5d, 0xd7, 0xd3, 0xcc, 0x9e, 0xba, 0x4f, 0xdc, 0x3b, 0xc3, 0xd0, 0x04, 0x94, 0x7a,
0xf7, 0x15, 0xa8, 0x04, 0x68, 0x9e, 0x4d, 0xf7, 0xcf, 0x29, 0x65, 0x01, 0xdb, 0xb5, 0xd1, 0xf3,
0x50, 0xa3, 0x3a, 0x55, 0xbb, 0x76, 0x47, 0x25, 0x9d, 0x1b, 0x4f, 0x36, 0x15, 0x9d, 0x8b, 0x45,
0xee, 0x2a, 0x8a, 0xe5, 0x1a, 0x9f, 0x62, 0x9e, 0x6e, 0x04, 0xd6, 0x8e, 0xf1, 0x29, 0x26, 0xb9,
0xbe, 0x4a, 0x72, 0xe7, 0x96, 0xad, 0xe3, 0xdd, 0x53, 0x56, 0x1a, 0x29, 0xa6, 0x76, 0x17, 0xa1,
0x24, 0x4e, 0xc0, 0x8f, 0x14, 0x00, 0xd0, 0x1a, 0xd4, 0xfc, 0x22, 0x54, 0x65, 0xbd, 0x45, 0x6e,
0x68, 0xe5, 0x17, 0xca, 0x7e, 0xae, 0x52, 0xf5, 0xc9, 0xe8, 0x52, 0x5e, 0x83, 0x4a, 0xf8, 0x33,
0xd9, 0x75, 0x27, 0x6e, 0x28, 0x02, 0x40, 0xac, 0x71, 0xab, 0x6f, 0x92, 0x3b, 0xe5, 0x81, 0xc5,
0x5f, 0xca, 0x9f, 0x4b, 0x50, 0xe5, 0x29, 0x7b, 0x47, 0x4c, 0x95, 0xe9, 0xd1, 0x24, 0x7a, 0x34,
0xfa, 0x37, 0xfa, 0x46, 0x74, 0x24, 0xf5, 0x7c, 0x62, 0x10, 0xa0, 0x4c, 0x68, 0x75, 0x1c, 0xc9,
0xd7, 0x69, 0x7a, 0xd9, 0xc7, 0xc4, 0xd0, 0xf8, 0xd5, 0x50, 0x43, 0x6b, 0xc0, 0x94, 0xa6, 0xeb,
0x0e, 0x76, 0x5d, 0x2e, 0x87, 0xbf, 0x24, 0x5f, 0x1e, 0x62, 0xc7, 0xf5, 0x4d, 0x3e, 0xab, 0xf8,
0x4b, 0xf4, 0x16, 0x14, 0x45, 0x39, 0x9d, 0x4d, 0x2a, 0xa1, 0xc2, 0x72, 0xf2, 0xde, 0x4b, 0x50,
0xc8, 0x7f, 0xce, 0x40, 0x8d, 0x2b, 0x6c, 0x99, 0xe7, 0xd4, 0xd1, 0xce, 0xb7, 0x0c, 0x95, 0xfd,
0xc0, 0xf7, 0x47, 0xcd, 0x58, 0xc2, 0x21, 0x22, 0x42, 0x33, 0xce, 0x01, 0xa3, 0x59, 0x3d, 0x37,
0x51, 0x56, 0xcf, 0x9f, 0x34, 0x82, 0x0d, 0xd6, 0x79, 0x85, 0x84, 0x3a, 0x4f, 0xfe, 0x2e, 0x94,
0x43, 0x0c, 0x68, 0x84, 0x66, 0xc3, 0x19, 0xae, 0x31, 0x7f, 0x89, 0xee, 0x04, 0xb5, 0x0d, 0x53,
0xd5, 0xf9, 0x04, 0x59, 0x62, 0x65, 0x8d, 0xfc, 0x7b, 0x09, 0x0a, 0x9c, 0xf3, 0x65, 0x28, 0xf3,
0xa0, 0x43, 0xeb, 0x3e, 0xc6, 0x1d, 0x38, 0x88, 0x14, 0x7e, 0x4f, 0x2e, 0xea, 0x9c, 0x87, 0x62,
0x2c, 0xde, 0x4c, 0xf1, 0xb4, 0xe0, 0x7f, 0x0a, 0x05, 0x19, 0xf2, 0x89, 0xc6, 0x97, 0xaf, 0x24,
0x3a, 0x58, 0x56, 0x70, 0xdb, 0x7e, 0x88, 0x9d, 0xe3, 0xc9, 0xc7, 0x77, 0x6f, 0x86, 0x0c, 0x3a,
0x65, 0x7f, 0x28, 0x08, 0xd0, 0x9b, 0x81, 0xba, 0xb3, 0x49, 0xd3, 0x8b, 0x70, 0x84, 0xe1, 0xe6,
0x18, 0xa8, 0xfd, 0xa7, 0x6c, 0x10, 0x19, 0x3d, 0xca, 0x69, 0xeb, 0x9a, 0x27, 0xd2, 0x76, 0xc8,
0x3f, 0x97, 0xe0, 0xfc, 0x3a, 0xf6, 0xd6, 0xa2, 0xcd, 0xfd, 0xb3, 0x96, 0xca, 0x84, 0x66, 0x92,
0x50, 0x93, 0xdc, 0x7a, 0x13, 0x8a, 0x62, 0x4c, 0xc1, 0x46, 0xc4, 0x62, 0x2d, 0xff, 0x40, 0x82,
0x06, 0xdf, 0x85, 0xee, 0x49, 0x4a, 0xea, 0x2e, 0xf6, 0xb0, 0xfe, 0x75, 0xf7, 0xcd, 0x7f, 0x97,
0xa0, 0x1e, 0x8e, 0xf8, 0x34, 0x68, 0xbf, 0x0e, 0x79, 0x3a, 0x9e, 0xe0, 0x12, 0x8c, 0x35, 0x56,
0x86, 0x4d, 0x42, 0x06, 0x2d, 0xf3, 0x76, 0x45, 0x72, 0xe2, 0xcb, 0x20, 0xed, 0x64, 0x4f, 0x9e,
0x76, 0x78, 0x1a, 0xb6, 0xfb, 0x84, 0x2f, 0x1b, 0xff, 0x05, 0x00, 0xf9, 0xcb, 0x0c, 0x34, 0x82,
0x7e, 0xe4, 0x6b, 0x8f, 0xfb, 0x43, 0xaa, 0xd5, 0xec, 0x13, 0xaa, 0x56, 0x73, 0x93, 0xc7, 0xfa,
0x7c, 0x52, 0xac, 0xff, 0x5b, 0x06, 0x6a, 0x81, 0xd6, 0xb6, 0xbb, 0x9a, 0x85, 0xe6, 0xa0, 0xd0,
0xeb, 0x6a, 0xc1, 0xf4, 0x91, 0xaf, 0xd0, 0x8e, 0xa8, 0x73, 0xa2, 0x7a, 0x7a, 0x29, 0xe9, 0x0e,
0x87, 0x5c, 0x84, 0x12, 0x63, 0x41, 0xda, 0x41, 0xd6, 0x50, 0xd0, 0xa6, 0x9e, 0xd7, 0x56, 0xcc,
0x58, 0x48, 0x3f, 0x7f, 0x13, 0x10, 0xbf, 0x61, 0xd5, 0xb0, 0x54, 0x17, 0xb7, 0x6d, 0x4b, 0x67,
0x77, 0x9f, 0x57, 0xea, 0xfc, 0x4b, 0xcb, 0xda, 0x61, 0x70, 0xf4, 0x3a, 0xe4, 0xbc, 0xe3, 0x1e,
0x8b, 0xe2, 0xb5, 0xc4, 0xe8, 0x18, 0xc8, 0xb5, 0x7b, 0xdc, 0xc3, 0x0a, 0x45, 0x47, 0xf3, 0x00,
0x84, 0x95, 0xe7, 0x68, 0x0f, 0x79, 0x4a, 0xcc, 0x29, 0x21, 0x08, 0xb1, 0x66, 0x5f, 0x87, 0x53,
0x2c, 0x75, 0xf0, 0xa5, 0xfc, 0x97, 0x0c, 0xd4, 0x03, 0x96, 0x0a, 0x76, 0xfb, 0x5d, 0x6f, 0xa8,
0xfe, 0x46, 0x37, 0x83, 0xe3, 0xea, 0x86, 0x77, 0xa1, 0xcc, 0xef, 0xf3, 0x04, 0xf6, 0x00, 0x8c,
0x64, 0x63, 0x84, 0x81, 0xe6, 0x9f, 0x90, 0x81, 0x16, 0x4e, 0x68, 0xa0, 0xf2, 0x0e, 0xcc, 0xf9,
0x71, 0x2f, 0x40, 0xd8, 0xc4, 0x9e, 0x36, 0xa2, 0xe0, 0xb8, 0x0c, 0x65, 0x96, 0xcf, 0x58, 0x22,
0x67, 0xa5, 0x3a, 0xec, 0x89, 0x0e, 0x57, 0xfe, 0x1e, 0xcc, 0xd2, 0xb8, 0x11, 0x1f, 0xe5, 0xa6,
0x99, 0xab, 0xcb, 0xa2, 0x11, 0x20, 0x45, 0x3f, 0xb3, 0xee, 0x92, 0x12, 0x81, 0xc9, 0x1b, 0xf0,
0x5c, 0x8c, 0xff, 0x04, 0x79, 0x81, 0x94, 0x42, 0x73, 0x3b, 0xd1, 0x9f, 0x45, 0x4f, 0x9f, 0xfd,
0x2e, 0x89, 0xc9, 0xad, 0x6a, 0xe8, 0x71, 0xfb, 0xd2, 0xd1, 0x3b, 0x50, 0xb2, 0xf0, 0x91, 0x1a,
0x0e, 0xbe, 0x29, 0x06, 0x74, 0x45, 0x0b, 0x1f, 0xd1, 0xbf, 0xe4, 0x2d, 0x38, 0x37, 0x20, 0xea,
0x24, 0x67, 0xff, 0xab, 0x04, 0xe7, 0x57, 0x1d, 0xbb, 0xf7, 0x91, 0xe1, 0x78, 0x7d, 0xad, 0x1b,
0xfd, 0x61, 0xe4, 0xe9, 0xb4, 0x71, 0xef, 0x87, 0xd2, 0x30, 0x8b, 0xcb, 0x37, 0x13, 0xcc, 0x75,
0x50, 0x28, 0x7e, 0xe8, 0x50, 0xd2, 0xfe, 0x6f, 0x36, 0x49, 0x78, 0x8e, 0x37, 0x26, 0xd9, 0xa4,
0xa9, 0x52, 0x12, 0xa7, 0x3e, 0xd9, 0xd3, 0x4e, 0x7d, 0x86, 0x78, 0x7e, 0xee, 0x09, 0x79, 0xfe,
0x89, 0xdb, 0x90, 0xf7, 0x21, 0x3a, 0x91, 0xa3, 0x21, 0xf7, 0x54, 0xa3, 0xbc, 0x65, 0x80, 0x60,
0x3a, 0xc5, 0x5f, 0xb5, 0xa4, 0x61, 0x13, 0xa2, 0x22, 0xb7, 0x25, 0xa2, 0x2c, 0x9d, 0x2a, 0x47,
0xe6, 0x25, 0x1f, 0x40, 0x33, 0xc9, 0x4a, 0x27, 0xb1, 0xfc, 0x2f, 0x33, 0x00, 0x2d, 0x3a, 0x1d,
0xda, 0xd5, 0xdc, 0xc3, 0xd3, 0x55, 0x94, 0x57, 0xa1, 0x1a, 0x18, 0x4c, 0xe0, 0xef, 0x61, 0x2b,
0xd2, 0x89, 0x4b, 0x88, 0xc2, 0x96, 0xe0, 0x0c, 0x14, 0xbb, 0x3a, 0xe5, 0x13, 0xf2, 0x1a, 0x66,
0x14, 0xb1, 0xa0, 0x87, 0x2e, 0x40, 0xc9, 0xb1, 0x8f, 0x54, 0xe2, 0x66, 0x3a, 0xcd, 0xad, 0x45,
0xa5, 0xe8, 0xd8, 0x47, 0xc4, 0xf9, 0x74, 0x74, 0x0e, 0xa6, 0x3c, 0xcd, 0x3d, 0x24, 0xfc, 0x0b,
0x2c, 0xdd, 0x91, 0x65, 0x4b, 0x47, 0xb3, 0x90, 0xdf, 0x37, 0xba, 0xd8, 0x6d, 0x4c, 0x51, 0x96,
0x6c, 0x81, 0xde, 0xf0, 0xdf, 0x2f, 0x14, 0x53, 0xff, 0xfe, 0xca, 0x9e, 0x30, 0x7c, 0x25, 0xc1,
0x74, 0xa0, 0x35, 0x1a, 0x80, 0x48, 0x4c, 0xa3, 0xf1, 0x6c, 0xc5, 0xd6, 0x59, 0xa8, 0xa8, 0x0d,
0xf9, 0x89, 0x85, 0x11, 0xb2, 0xa8, 0x15, 0x90, 0x8c, 0xaa, 0xcb, 0xc9, 0xb9, 0xc8, 0xa1, 0x0d,
0xdd, 0xff, 0x85, 0xa7, 0xe0, 0xd8, 0x47, 0x2d, 0x5d, 0x68, 0x83, 0x3d, 0xe3, 0x62, 0x55, 0x28,
0xd1, 0xc6, 0x0a, 0x7d, 0xc9, 0x75, 0x15, 0xaa, 0xd8, 0x71, 0x6c, 0x47, 0x35, 0xb1, 0xeb, 0x6a,
0x1d, 0xcc, 0x8b, 0xae, 0x0a, 0x05, 0x6e, 0x32, 0x98, 0xfc, 0x9f, 0x2c, 0xd4, 0x82, 0xa3, 0xf8,
0xbf, 0xeb, 0x18, 0xba, 0xff, 0xbb, 0x8e, 0xa1, 0x93, 0x60, 0xee, 0xb0, 0x50, 0x18, 0x0a, 0xe6,
0x1c, 0xd2, 0xd2, 0x49, 0x1e, 0x24, 0x0e, 0x66, 0xd9, 0x3a, 0x0e, 0x2e, 0x16, 0x7c, 0x10, 0xbf,
0xd7, 0x88, 0x7d, 0xe4, 0x52, 0xd8, 0x47, 0x3e, 0x85, 0x7d, 0x14, 0x12, 0xec, 0x63, 0x0e, 0x0a,
0x7b, 0xfd, 0xf6, 0x21, 0xf6, 0x78, 0x79, 0xc4, 0x57, 0x51, 0xbb, 0x29, 0xc6, 0xec, 0x46, 0x98,
0x47, 0x29, 0x6c, 0x1e, 0x17, 0xa0, 0xc4, 0x7e, 0x5c, 0x50, 0x3d, 0x97, 0x4e, 0x59, 0xb3, 0x4a,
0x91, 0x01, 0x76, 0x5d, 0x74, 0xd7, 0xef, 0x1d, 0xca, 0x49, 0x8e, 0x4e, 0x23, 0x4e, 0xcc, 0x42,
0xfc, 0xce, 0xe1, 0x2e, 0x34, 0x0e, 0x70, 0xdf, 0xa1, 0x6f, 0x01, 0x54, 0xfa, 0x58, 0xf5, 0x41,
0x1f, 0x3b, 0xc7, 0xda, 0x5e, 0x17, 0x37, 0x2a, 0x54, 0xb0, 0x39, 0xf1, 0x7d, 0x55, 0xf3, 0xb4,
0x0f, 0xfc, 0xaf, 0xe8, 0x35, 0x98, 0x8b, 0x51, 0x1a, 0x96, 0x8e, 0x1f, 0x61, 0xbd, 0x51, 0xa5,
0x74, 0xb3, 0x11, 0xba, 0x16, 0xfb, 0x26, 0x7f, 0x02, 0x28, 0x90, 0x64, 0xb2, 0xde, 0x31, 0x76,
0xd5, 0x99, 0xf8, 0x55, 0xcb, 0x7f, 0x90, 0x60, 0x26, 0xbc, 0xd9, 0x69, 0x13, 0xe8, 0x3b, 0x50,
0x66, 0x33, 0x6b, 0x95, 0x38, 0x30, 0xef, 0x1e, 0x2f, 0x8d, 0xd4, 0xb1, 0x02, 0x46, 0x10, 0xc7,
0xae, 0x42, 0xf5, 0xc8, 0x76, 0x0e, 0x0d, 0xab, 0xa3, 0x12, 0xc9, 0x7c, 0xb7, 0xa9, 0x70, 0xe0,
0x16, 0x81, 0xc9, 0x5f, 0x48, 0x30, 0xff, 0x61, 0x4f, 0xd7, 0x3c, 0x1c, 0xaa, 0x24, 0x26, 0x7d,
0x50, 0xf2, 0xba, 0xff, 0xa6, 0x23, 0x93, 0x6e, 0xee, 0xca, 0xb0, 0x6f, 0xfc, 0x52, 0x82, 0x99,
0x81, 0x5e, 0x13, 0xd5, 0x00, 0x3e, 0xb4, 0xda, 0xbc, 0x09, 0xaf, 0x9f, 0x41, 0x15, 0x28, 0xfa,
0x2d, 0x79, 0x5d, 0x42, 0x65, 0x98, 0xda, 0xb5, 0x29, 0x76, 0x3d, 0x83, 0xea, 0x50, 0x61, 0x84,
0xfd, 0x76, 0x1b, 0xbb, 0x6e, 0x3d, 0x2b, 0x20, 0x6b, 0x9a, 0xd1, 0xed, 0x3b, 0xb8, 0x9e, 0x43,
0x55, 0x28, 0xed, 0xda, 0x0a, 0xee, 0x62, 0xcd, 0xc5, 0xf5, 0x3c, 0x42, 0x50, 0xe3, 0x0b, 0x9f,
0xa8, 0x10, 0x82, 0xf9, 0x64, 0x53, 0x37, 0xf6, 0xc3, 0x5d, 0x19, 0x69, 0x55, 0xd0, 0x39, 0x38,
0xfb, 0xa1, 0xa5, 0xe3, 0x7d, 0xc3, 0xc2, 0x7a, 0xf0, 0xa9, 0x7e, 0x06, 0x9d, 0x85, 0xe9, 0x96,
0x65, 0x61, 0x27, 0x04, 0x94, 0x08, 0x70, 0x13, 0x3b, 0x1d, 0x1c, 0x02, 0x66, 0xd0, 0x0c, 0x54,
0x37, 0x8d, 0x47, 0x21, 0x50, 0x76, 0xe9, 0x1f, 0xcf, 0x41, 0x89, 0x18, 0xee, 0x8a, 0x6d, 0x3b,
0x3a, 0xea, 0x01, 0xa2, 0xcf, 0x8f, 0xcc, 0x9e, 0x6d, 0x89, 0x77, 0x7a, 0xe8, 0x95, 0x21, 0x09,
0x75, 0x10, 0x95, 0x5f, 0x61, 0xf3, 0xfa, 0x10, 0x8a, 0x18, 0xba, 0x7c, 0x06, 0x99, 0x74, 0x47,
0xd2, 0xea, 0xed, 0x1a, 0xed, 0x43, 0xff, 0x87, 0xe6, 0x11, 0x3b, 0xc6, 0x50, 0xfd, 0x1d, 0x63,
0xcf, 0xff, 0xf8, 0x82, 0xbd, 0x11, 0xf3, 0xfd, 0x4f, 0x3e, 0x83, 0x1e, 0xc0, 0xec, 0x3a, 0x0e,
0xd9, 0x9c, 0xbf, 0xe1, 0xd2, 0xf0, 0x0d, 0x07, 0x90, 0x4f, 0xb8, 0xe5, 0x06, 0xe4, 0xe9, 0x5c,
0x07, 0x25, 0x99, 0x65, 0xf8, 0x31, 0x7b, 0x73, 0x61, 0x38, 0x82, 0xe0, 0xf6, 0x09, 0x4c, 0xc7,
0x1e, 0xe3, 0xa2, 0x17, 0x13, 0xc8, 0x92, 0x9f, 0x55, 0x37, 0x6f, 0xa4, 0x41, 0x15, 0x7b, 0x75,
0xa0, 0x16, 0x7d, 0xbc, 0x84, 0x16, 0x13, 0xe8, 0x13, 0x1f, 0x52, 0x36, 0x5f, 0x4c, 0x81, 0x29,
0x36, 0x32, 0xa1, 0x1e, 0x7f, 0x1c, 0x8a, 0x6e, 0x8c, 0x64, 0x10, 0x35, 0xb7, 0x97, 0x52, 0xe1,
0x8a, 0xed, 0x8e, 0xa9, 0x11, 0x0c, 0x3c, 0x4e, 0x44, 0xb7, 0x92, 0xd9, 0x0c, 0x7b, 0x35, 0xd9,
0xbc, 0x9d, 0x1a, 0x5f, 0x6c, 0xfd, 0x7d, 0x36, 0x4f, 0x4e, 0x7a, 0xe0, 0x87, 0x5e, 0x4d, 0x66,
0x37, 0xe2, 0x65, 0x62, 0x73, 0xe9, 0x24, 0x24, 0x42, 0x88, 0xcf, 0xe8, 0x20, 0x38, 0xe1, 0x91,
0x5c, 0xdc, 0xef, 0x7c, 0x7e, 0xc3, 0x5f, 0xff, 0x35, 0x5f, 0x3d, 0x01, 0x85, 0x10, 0xc0, 0x8e,
0x3f, 0xbf, 0xf5, 0xdd, 0xf0, 0xf6, 0x58, 0xab, 0x39, 0x9d, 0x0f, 0x7e, 0x0c, 0xd3, 0xb1, 0x9f,
0xf4, 0x13, 0xbd, 0x26, 0xf9, 0x67, 0xff, 0xe6, 0xa8, 0x34, 0xcd, 0x5c, 0x32, 0x36, 0x57, 0x47,
0x43, 0xac, 0x3f, 0x61, 0xf6, 0xde, 0xbc, 0x91, 0x06, 0x55, 0x1c, 0xc4, 0xa5, 0xe1, 0x32, 0x36,
0x9b, 0x46, 0x37, 0x93, 0x79, 0x24, 0xcf, 0xd5, 0x9b, 0x2f, 0xa7, 0xc4, 0x16, 0x9b, 0xaa, 0x00,
0xeb, 0xd8, 0xdb, 0xc4, 0x9e, 0x43, 0x6c, 0xe4, 0x7a, 0xa2, 0xca, 0x03, 0x04, 0x7f, 0x9b, 0x17,
0xc6, 0xe2, 0x89, 0x0d, 0xbe, 0x0d, 0xc8, 0x4f, 0xb1, 0xa1, 0x07, 0x25, 0x57, 0x47, 0x8e, 0xef,
0xd8, 0xac, 0x6d, 0xdc, 0xdd, 0x3c, 0x80, 0xfa, 0xa6, 0x66, 0x91, 0xc6, 0x2d, 0xe0, 0x7b, 0x33,
0x51, 0xb0, 0x38, 0xda, 0x10, 0x6d, 0x0d, 0xc5, 0x16, 0x87, 0x39, 0x12, 0x39, 0x54, 0x13, 0x2e,
0x88, 0xe3, 0xb1, 0x25, 0xd0, 0x46, 0x0c, 0x71, 0x48, 0x6c, 0x19, 0x81, 0x2f, 0x36, 0x7e, 0x2c,
0xd1, 0x47, 0xde, 0x31, 0x84, 0xfb, 0x86, 0x77, 0xb0, 0xdd, 0xd5, 0x2c, 0x37, 0x8d, 0x08, 0x14,
0xf1, 0x04, 0x22, 0x70, 0x7c, 0x21, 0x82, 0x0e, 0xd5, 0xc8, 0x74, 0x0c, 0x25, 0xbd, 0x0a, 0x49,
0x9a, 0xcf, 0x35, 0x17, 0xc7, 0x23, 0x8a, 0x5d, 0x0e, 0xa0, 0xea, 0xdb, 0x2b, 0x53, 0xee, 0x8b,
0xc3, 0x24, 0x0d, 0x70, 0x86, 0xb8, 0x5b, 0x32, 0x6a, 0xd8, 0xdd, 0x06, 0x9b, 0x7f, 0x94, 0x6e,
0x68, 0x34, 0xca, 0xdd, 0x86, 0x4f, 0x14, 0x58, 0x3c, 0x89, 0x0d, 0xda, 0x92, 0x83, 0x55, 0xe2,
0xdc, 0x30, 0x31, 0x9e, 0x0c, 0x99, 0xdb, 0xc9, 0x67, 0xd0, 0x7d, 0x28, 0xb0, 0x6a, 0x1e, 0x3d,
0x3f, 0xba, 0xd0, 0xe7, 0xdc, 0xaf, 0x8d, 0xc1, 0x12, 0x8c, 0x0f, 0xe1, 0xdc, 0x90, 0x32, 0x3f,
0x31, 0xcf, 0x8d, 0x6e, 0x09, 0xc6, 0x78, 0xf9, 0xd2, 0x6f, 0xf3, 0x50, 0xf4, 0x9f, 0x1a, 0x3c,
0x83, 0x1a, 0xf6, 0x19, 0x14, 0x95, 0x1f, 0xc3, 0x74, 0xec, 0xcd, 0x72, 0xa2, 0x8d, 0x24, 0xbf,
0x6b, 0x1e, 0x17, 0x34, 0xef, 0xf3, 0xff, 0x64, 0x14, 0xf9, 0xe5, 0x85, 0x61, 0x85, 0x69, 0x3c,
0xb5, 0x8c, 0x61, 0xfc, 0xd4, 0x13, 0xc9, 0x16, 0x40, 0x28, 0xd0, 0x8f, 0xfe, 0xfd, 0x87, 0xc4,
0xae, 0x71, 0x02, 0x6f, 0x9e, 0xd0, 0x3d, 0x46, 0xb3, 0x5b, 0xbe, 0xf3, 0x9d, 0x57, 0x3b, 0x86,
0x77, 0xd0, 0xdf, 0x23, 0x5f, 0x6e, 0x33, 0xd4, 0x97, 0x0d, 0x9b, 0xff, 0x75, 0xdb, 0x37, 0x90,
0xdb, 0x94, 0xfa, 0x36, 0xd9, 0xa3, 0xb7, 0xb7, 0x57, 0xa0, 0xab, 0x3b, 0xff, 0x0f, 0x00, 0x00,
0xff, 0xff, 0x99, 0xf2, 0x88, 0x67, 0x64, 0x3b, 0x00, 0x00,
0x13, 0xa3, 0x01, 0x0a, 0xa4, 0x28, 0xfa, 0x40, 0x37, 0x6d, 0xd1, 0x45, 0xd1, 0x55, 0x1f, 0x9b,
0x02, 0x41, 0x17, 0x6d, 0xd1, 0x4d, 0x57, 0x41, 0xbb, 0xe8, 0x27, 0x74, 0xd9, 0x5d, 0xbf, 0xa1,
0xb8, 0x8f, 0xb9, 0xf3, 0xe0, 0x0c, 0x39, 0x22, 0xed, 0x78, 0xa7, 0x7b, 0xe6, 0x9c, 0x73, 0xcf,
0x3d, 0xf7, 0xbc, 0x79, 0x05, 0x4d, 0x5d, 0xf3, 0x34, 0xb5, 0x6b, 0xdb, 0x8e, 0x7e, 0x6d, 0xe0,
0xd8, 0x9e, 0x8d, 0x8e, 0x9b, 0x46, 0xff, 0xe1, 0xd0, 0x65, 0xab, 0x6b, 0xe4, 0x73, 0xbb, 0xd6,
0xb5, 0x4d, 0xd3, 0xb6, 0x18, 0xa8, 0xdd, 0x30, 0x2c, 0x0f, 0x3b, 0x96, 0xd6, 0xe7, 0xeb, 0x5a,
0x98, 0xa0, 0x5d, 0x73, 0xbb, 0x7b, 0xd8, 0xd4, 0xd8, 0x4a, 0x9e, 0x83, 0xe2, 0x1d, 0x73, 0xe0,
0x1d, 0xca, 0xbf, 0x90, 0xa0, 0x76, 0xb7, 0x3f, 0x74, 0xf7, 0x14, 0xfc, 0x60, 0x88, 0x5d, 0x0f,
0xbd, 0x02, 0x85, 0x1d, 0xcd, 0xc5, 0x2d, 0x69, 0x49, 0x5a, 0xae, 0xae, 0x9c, 0xbd, 0x16, 0xd9,
0x95, 0xef, 0xb7, 0xee, 0xf6, 0x6e, 0x69, 0x2e, 0x56, 0x28, 0x26, 0x42, 0x50, 0xd0, 0x77, 0x3a,
0xab, 0xad, 0xdc, 0x92, 0xb4, 0x9c, 0x57, 0xe8, 0xdf, 0x68, 0x11, 0xc0, 0xc5, 0x3d, 0x13, 0x5b,
0x5e, 0x67, 0xd5, 0x6d, 0xe5, 0x97, 0xf2, 0xcb, 0x79, 0x25, 0x04, 0x41, 0x32, 0xd4, 0xba, 0x76,
0xbf, 0x8f, 0xbb, 0x9e, 0x61, 0x5b, 0x9d, 0xd5, 0x56, 0x81, 0xd2, 0x46, 0x60, 0xf2, 0xaf, 0x25,
0xa8, 0x73, 0xd1, 0xdc, 0x81, 0x6d, 0xb9, 0x18, 0xdd, 0x80, 0x92, 0xeb, 0x69, 0xde, 0xd0, 0xe5,
0xd2, 0x9d, 0x49, 0x94, 0x6e, 0x8b, 0xa2, 0x28, 0x1c, 0x35, 0x51, 0xbc, 0xf8, 0xf6, 0xf9, 0xd1,
0xed, 0x63, 0x47, 0x28, 0xc4, 0x8f, 0x20, 0xff, 0x4c, 0x82, 0xe6, 0x96, 0xbf, 0xf4, 0xb5, 0x77,
0x12, 0x8a, 0x5d, 0x7b, 0x68, 0x79, 0x54, 0xc0, 0xba, 0xc2, 0x16, 0xe8, 0x02, 0xd4, 0xba, 0x7b,
0x9a, 0x65, 0xe1, 0xbe, 0x6a, 0x69, 0x26, 0xa6, 0xa2, 0x54, 0x94, 0x2a, 0x87, 0x6d, 0x68, 0x26,
0xce, 0x24, 0xd1, 0x12, 0x54, 0x07, 0x9a, 0xe3, 0x19, 0x11, 0x9d, 0x85, 0x41, 0xf2, 0x6f, 0x24,
0x58, 0x78, 0xcf, 0x75, 0x8d, 0x9e, 0x35, 0x22, 0xd9, 0x02, 0x94, 0x2c, 0x5b, 0xc7, 0x9d, 0x55,
0x2a, 0x5a, 0x5e, 0xe1, 0x2b, 0x74, 0x06, 0x2a, 0x03, 0x8c, 0x1d, 0xd5, 0xb1, 0xfb, 0xbe, 0x60,
0x65, 0x02, 0x50, 0xec, 0x3e, 0x46, 0x1f, 0xc0, 0x71, 0x37, 0xc6, 0x88, 0xdd, 0x66, 0x75, 0xe5,
0xe2, 0xb5, 0x11, 0x7b, 0xbc, 0x16, 0xdf, 0x54, 0x19, 0xa5, 0x96, 0x1f, 0xe7, 0xe0, 0x84, 0xc0,
0x63, 0xb2, 0x92, 0xbf, 0x89, 0xe6, 0x5c, 0xdc, 0x13, 0xe2, 0xb1, 0x45, 0x16, 0xcd, 0x09, 0x95,
0xe7, 0xc3, 0x2a, 0xcf, 0x60, 0x60, 0x71, 0x7d, 0x16, 0x47, 0xf4, 0x89, 0xce, 0x43, 0x15, 0x3f,
0x1a, 0x18, 0x0e, 0x56, 0x3d, 0xc3, 0xc4, 0xad, 0xd2, 0x92, 0xb4, 0x5c, 0x50, 0x80, 0x81, 0xb6,
0x0d, 0x33, 0x6c, 0x91, 0x73, 0x99, 0x2d, 0x52, 0xfe, 0xad, 0x04, 0xa7, 0x46, 0x6e, 0x89, 0x9b,
0xb8, 0x02, 0x4d, 0x7a, 0xf2, 0x40, 0x33, 0xc4, 0xd8, 0x89, 0xc2, 0x2f, 0x8f, 0x53, 0x78, 0x80,
0xae, 0x8c, 0xd0, 0x87, 0x84, 0xcc, 0x65, 0x17, 0x72, 0x1f, 0x4e, 0xad, 0x61, 0x8f, 0x6f, 0x40,
0xbe, 0x61, 0x77, 0xfa, 0x10, 0x11, 0xf5, 0xa5, 0xdc, 0x88, 0x2f, 0xfd, 0x29, 0x27, 0x7c, 0x89,
0x6e, 0xd5, 0xb1, 0x76, 0x6d, 0x74, 0x16, 0x2a, 0x02, 0x85, 0x5b, 0x45, 0x00, 0x40, 0x6f, 0x40,
0x91, 0x48, 0xca, 0x4c, 0xa2, 0xb1, 0x72, 0x21, 0xf9, 0x4c, 0x21, 0x9e, 0x0a, 0xc3, 0x47, 0x1d,
0x68, 0xb8, 0x9e, 0xe6, 0x78, 0xea, 0xc0, 0x76, 0xe9, 0x3d, 0x53, 0xc3, 0xa9, 0xae, 0xc8, 0x51,
0x0e, 0x22, 0x98, 0xae, 0xbb, 0xbd, 0x4d, 0x8e, 0xa9, 0xd4, 0x29, 0xa5, 0xbf, 0x44, 0x77, 0xa0,
0x86, 0x2d, 0x3d, 0x60, 0x54, 0xc8, 0xcc, 0xa8, 0x8a, 0x2d, 0x5d, 0xb0, 0x09, 0xee, 0xa7, 0x98,
0xfd, 0x7e, 0x7e, 0x24, 0x41, 0x6b, 0xf4, 0x82, 0x66, 0x09, 0x94, 0x6f, 0x32, 0x22, 0xcc, 0x2e,
0x68, 0xac, 0x87, 0x8b, 0x4b, 0x52, 0x38, 0x89, 0x6c, 0xc0, 0x73, 0x81, 0x34, 0xf4, 0xcb, 0x53,
0x33, 0x96, 0xcf, 0x25, 0x58, 0x88, 0xef, 0x35, 0xcb, 0xb9, 0x5f, 0x83, 0xa2, 0x61, 0xed, 0xda,
0xfe, 0xb1, 0x17, 0xc7, 0xf8, 0x19, 0xd9, 0x8b, 0x21, 0xcb, 0x26, 0x9c, 0x59, 0xc3, 0x5e, 0xc7,
0x72, 0xb1, 0xe3, 0xdd, 0x32, 0xac, 0xbe, 0xdd, 0xdb, 0xd4, 0xbc, 0xbd, 0x19, 0x7c, 0x24, 0x62,
0xee, 0xb9, 0x98, 0xb9, 0xcb, 0xbf, 0x93, 0xe0, 0x6c, 0xf2, 0x7e, 0xfc, 0xe8, 0x6d, 0x28, 0xef,
0x1a, 0xb8, 0xaf, 0x13, 0x9d, 0x49, 0x54, 0x67, 0x62, 0x4d, 0x7c, 0x65, 0x40, 0x90, 0xf9, 0x09,
0x2f, 0xa4, 0x18, 0xe8, 0x96, 0xe7, 0x18, 0x56, 0xef, 0x9e, 0xe1, 0x7a, 0x0a, 0xc3, 0x0f, 0xe9,
0x33, 0x9f, 0xdd, 0x32, 0x7f, 0x28, 0xc1, 0xe2, 0x1a, 0xf6, 0x6e, 0x8b, 0x50, 0x4b, 0xbe, 0x1b,
0xae, 0x67, 0x74, 0xdd, 0x27, 0x5b, 0x64, 0x64, 0xc8, 0x99, 0xf2, 0x4f, 0x24, 0x38, 0x9f, 0x2a,
0x0c, 0x57, 0x1d, 0x0f, 0x25, 0x7e, 0xa0, 0x4d, 0x0e, 0x25, 0xdf, 0xc4, 0x87, 0x1f, 0x69, 0xfd,
0x21, 0xde, 0xd4, 0x0c, 0x87, 0x85, 0x92, 0x29, 0x03, 0xeb, 0x1f, 0x25, 0x38, 0xb7, 0x86, 0xbd,
0x4d, 0x3f, 0xcd, 0x3c, 0x43, 0xed, 0x64, 0xa8, 0x28, 0x7e, 0xcc, 0x2e, 0x33, 0x51, 0xda, 0x67,
0xa2, 0xbe, 0x45, 0xea, 0x07, 0x21, 0x87, 0xbc, 0xcd, 0x6a, 0x01, 0xae, 0x3c, 0xf9, 0x71, 0x1e,
0x6a, 0x1f, 0xf1, 0xfa, 0x80, 0xa6, 0x91, 0xb8, 0x1e, 0xa4, 0x64, 0x3d, 0x84, 0x4a, 0x8a, 0xa4,
0x2a, 0x63, 0x0d, 0xea, 0x2e, 0xc6, 0xfb, 0xd3, 0x24, 0x8d, 0x1a, 0x21, 0x14, 0xc1, 0xfe, 0x1e,
0x1c, 0x1f, 0x5a, 0xbb, 0xa4, 0xac, 0xc5, 0x3a, 0x3f, 0x05, 0xab, 0x2e, 0x27, 0x47, 0x9e, 0x51,
0x42, 0xf4, 0x3e, 0xcc, 0xc7, 0x79, 0x15, 0x33, 0xf1, 0x8a, 0x93, 0xa1, 0x0e, 0x34, 0x75, 0xc7,
0x1e, 0x0c, 0xb0, 0xae, 0xba, 0x3e, 0xab, 0x52, 0x36, 0x56, 0x9c, 0xce, 0x67, 0x25, 0x7f, 0x21,
0xc1, 0xc2, 0x7d, 0xcd, 0xeb, 0xee, 0xad, 0x9a, 0xfc, 0x72, 0x66, 0x30, 0xed, 0xb7, 0xa1, 0xf2,
0x90, 0x5f, 0x84, 0x1f, 0xbf, 0xce, 0x27, 0x08, 0x14, 0xbe, 0x72, 0x25, 0xa0, 0x90, 0xbf, 0x92,
0xe0, 0x24, 0x6d, 0x22, 0x7c, 0xe9, 0xbe, 0x7e, 0x27, 0x9b, 0xd0, 0x48, 0xa0, 0xcb, 0xd0, 0x30,
0x35, 0x67, 0x7f, 0x2b, 0xc0, 0x29, 0x52, 0x9c, 0x18, 0x54, 0x7e, 0x04, 0xc0, 0x57, 0xeb, 0x6e,
0x6f, 0x0a, 0xf9, 0x6f, 0xc2, 0x1c, 0xdf, 0x95, 0xfb, 0xdb, 0xa4, 0x8b, 0xf5, 0xd1, 0xe5, 0x7f,
0x4a, 0xd0, 0x08, 0x22, 0x28, 0xf5, 0xaa, 0x06, 0xe4, 0x84, 0x2f, 0xe5, 0x3a, 0xab, 0xe8, 0x6d,
0x28, 0xb1, 0x06, 0x93, 0xf3, 0xbe, 0x14, 0xe5, 0xcd, 0x9b, 0xcf, 0x50, 0x18, 0xa6, 0x00, 0x85,
0x13, 0x11, 0x1d, 0x89, 0xa8, 0x23, 0xfa, 0xc5, 0x00, 0x82, 0x3a, 0x30, 0x1f, 0x2d, 0xda, 0x7c,
0x9f, 0x59, 0x4a, 0x8b, 0x36, 0xab, 0x9a, 0xa7, 0xd1, 0x60, 0xd3, 0x88, 0xd4, 0x6c, 0xae, 0xfc,
0xbf, 0x22, 0x54, 0x43, 0xa7, 0x1c, 0x39, 0x49, 0xfc, 0x4a, 0x73, 0x93, 0xe3, 0x66, 0x7e, 0xb4,
0x73, 0xb8, 0x04, 0x0d, 0x83, 0xe6, 0x6a, 0x95, 0x9b, 0x22, 0x0d, 0xae, 0x15, 0xa5, 0xce, 0xa0,
0xdc, 0x2f, 0xd0, 0x22, 0x54, 0xad, 0xa1, 0xa9, 0xda, 0xbb, 0xaa, 0x63, 0x1f, 0xb8, 0xbc, 0x05,
0xa9, 0x58, 0x43, 0xf3, 0x5b, 0xbb, 0x8a, 0x7d, 0xe0, 0x06, 0x55, 0x6e, 0xe9, 0x88, 0x55, 0xee,
0x22, 0x54, 0x4d, 0xed, 0x11, 0xe1, 0xaa, 0x5a, 0x43, 0x93, 0x76, 0x27, 0x79, 0xa5, 0x62, 0x6a,
0x8f, 0x14, 0xfb, 0x60, 0x63, 0x68, 0xa2, 0x65, 0x68, 0xf6, 0x35, 0xd7, 0x53, 0xc3, 0xed, 0x4d,
0x99, 0xb6, 0x37, 0x0d, 0x02, 0xbf, 0x13, 0xb4, 0x38, 0xa3, 0xf5, 0x72, 0x65, 0x86, 0x7a, 0x59,
0x37, 0xfb, 0x01, 0x23, 0xc8, 0x5e, 0x2f, 0xeb, 0x66, 0x5f, 0xb0, 0xb9, 0x09, 0x73, 0x3b, 0xb4,
0x02, 0x72, 0x5b, 0xd5, 0xd4, 0x08, 0x75, 0x97, 0x14, 0x3f, 0xac, 0x50, 0x52, 0x7c, 0x74, 0xf4,
0x16, 0x54, 0x68, 0xea, 0xa1, 0xb4, 0xb5, 0x4c, 0xb4, 0x01, 0x01, 0xa1, 0xd6, 0x71, 0xdf, 0xd3,
0x28, 0x75, 0x3d, 0x1b, 0xb5, 0x20, 0x40, 0xaf, 0xc0, 0x89, 0xae, 0x83, 0x35, 0x0f, 0xeb, 0xb7,
0x0e, 0x6f, 0xdb, 0xe6, 0x40, 0xa3, 0xc6, 0xd4, 0x6a, 0x2c, 0x49, 0xcb, 0x65, 0x25, 0xe9, 0x13,
0x09, 0x0c, 0x5d, 0xb1, 0xba, 0xeb, 0xd8, 0x66, 0x6b, 0x9e, 0x05, 0x86, 0x28, 0x14, 0x9d, 0x03,
0xf0, 0x43, 0xb7, 0xe6, 0xb5, 0x9a, 0xf4, 0x16, 0x2b, 0x1c, 0xf2, 0x9e, 0x27, 0x7f, 0x06, 0x27,
0x03, 0x0b, 0x09, 0xdd, 0xc6, 0xe8, 0xc5, 0x4a, 0xd3, 0x5e, 0xec, 0xf8, 0xda, 0xf5, 0xdf, 0x05,
0x58, 0xd8, 0xd2, 0x1e, 0xe2, 0xa7, 0x5f, 0x26, 0x67, 0x8a, 0xc7, 0xf7, 0xe0, 0x38, 0xad, 0x8c,
0x57, 0x42, 0xf2, 0x8c, 0xc9, 0xc0, 0xe1, 0xeb, 0x1c, 0x25, 0x44, 0xef, 0x92, 0xd2, 0x01, 0x77,
0xf7, 0x37, 0x6d, 0x23, 0xc8, 0xbe, 0xe7, 0x12, 0xf8, 0xdc, 0x16, 0x58, 0x4a, 0x98, 0x02, 0x6d,
0x8e, 0x86, 0x36, 0x96, 0x77, 0x5f, 0x18, 0xdb, 0x7f, 0x05, 0xda, 0x8f, 0x47, 0x38, 0xd4, 0x82,
0x39, 0x9e, 0xdd, 0xa9, 0xdf, 0x97, 0x15, 0x7f, 0x89, 0x36, 0xe1, 0x04, 0x3b, 0xc1, 0x16, 0x37,
0x6a, 0x76, 0xf8, 0x72, 0xa6, 0xc3, 0x27, 0x91, 0x46, 0x7d, 0xa2, 0x72, 0x54, 0x9f, 0x68, 0xc1,
0x1c, 0xb7, 0x53, 0x1a, 0x0b, 0xca, 0x8a, 0xbf, 0x24, 0xd7, 0x6c, 0x98, 0x03, 0xdb, 0xf1, 0x0c,
0xab, 0xd7, 0xaa, 0xd2, 0x6f, 0x01, 0x80, 0xb4, 0x18, 0x10, 0xe8, 0x73, 0xc2, 0xa4, 0xe0, 0x1d,
0x28, 0x0b, 0x0b, 0xcf, 0x65, 0xb6, 0x70, 0x41, 0x13, 0x8f, 0xd1, 0xf9, 0x58, 0x8c, 0x96, 0xff,
0x25, 0x41, 0x6d, 0x95, 0x1c, 0xe9, 0x9e, 0xdd, 0xa3, 0x19, 0xe5, 0x12, 0x34, 0x1c, 0xdc, 0xb5,
0x1d, 0x5d, 0xc5, 0x96, 0xe7, 0x18, 0x98, 0x75, 0xa3, 0x05, 0xa5, 0xce, 0xa0, 0x77, 0x18, 0x90,
0xa0, 0x91, 0xb0, 0xeb, 0x7a, 0x9a, 0x39, 0x50, 0x77, 0x89, 0x7b, 0xe7, 0x18, 0x9a, 0x80, 0x52,
0xef, 0xbe, 0x00, 0xb5, 0x00, 0xcd, 0xb3, 0xe9, 0xfe, 0x05, 0xa5, 0x2a, 0x60, 0xdb, 0x36, 0x7a,
0x1e, 0x1a, 0x54, 0xa7, 0x6a, 0xdf, 0xee, 0xa9, 0xa4, 0x73, 0xe3, 0xc9, 0xa6, 0xa6, 0x73, 0xb1,
0xc8, 0x5d, 0x45, 0xb1, 0x5c, 0xe3, 0x53, 0xcc, 0xd3, 0x8d, 0xc0, 0xda, 0x32, 0x3e, 0xc5, 0x24,
0xd7, 0xd7, 0x49, 0xee, 0xdc, 0xb0, 0x75, 0xbc, 0x3d, 0x65, 0xa5, 0x91, 0x61, 0x6a, 0x77, 0x16,
0x2a, 0xe2, 0x04, 0xfc, 0x48, 0x01, 0x00, 0xdd, 0x85, 0x86, 0x5f, 0x84, 0xaa, 0xac, 0xb7, 0x28,
0xa4, 0x56, 0x7e, 0xa1, 0xec, 0xe7, 0x2a, 0x75, 0x9f, 0x8c, 0x2e, 0xe5, 0xbb, 0x50, 0x0b, 0x7f,
0x26, 0xbb, 0x6e, 0xc5, 0x0d, 0x45, 0x00, 0x88, 0x35, 0x6e, 0x0c, 0x4d, 0x72, 0xa7, 0x3c, 0xb0,
0xf8, 0x4b, 0xf9, 0x73, 0x09, 0xea, 0x3c, 0x65, 0x6f, 0x89, 0xa9, 0x32, 0x3d, 0x9a, 0x44, 0x8f,
0x46, 0xff, 0x46, 0xdf, 0x88, 0x8e, 0xa4, 0x9e, 0x4f, 0x0c, 0x02, 0x94, 0x09, 0xad, 0x8e, 0x23,
0xf9, 0x3a, 0x4b, 0x2f, 0xfb, 0x98, 0x18, 0x1a, 0xbf, 0x1a, 0x6a, 0x68, 0x2d, 0x98, 0xd3, 0x74,
0xdd, 0xc1, 0xae, 0xcb, 0xe5, 0xf0, 0x97, 0xe4, 0xcb, 0x43, 0xec, 0xb8, 0xbe, 0xc9, 0xe7, 0x15,
0x7f, 0x89, 0xde, 0x82, 0xb2, 0x28, 0xa7, 0xf3, 0x49, 0x25, 0x54, 0x58, 0x4e, 0xde, 0x7b, 0x09,
0x0a, 0xf9, 0xcf, 0x39, 0x68, 0x70, 0x85, 0xdd, 0xe2, 0x39, 0x75, 0xbc, 0xf3, 0xdd, 0x82, 0xda,
0x6e, 0xe0, 0xfb, 0xe3, 0x66, 0x2c, 0xe1, 0x10, 0x11, 0xa1, 0x99, 0xe4, 0x80, 0xd1, 0xac, 0x5e,
0x98, 0x29, 0xab, 0x17, 0x8f, 0x1a, 0xc1, 0x46, 0xeb, 0xbc, 0x52, 0x42, 0x9d, 0x27, 0x7f, 0x17,
0xaa, 0x21, 0x06, 0x34, 0x42, 0xb3, 0xe1, 0x0c, 0xd7, 0x98, 0xbf, 0x44, 0x37, 0x82, 0xda, 0x86,
0xa9, 0xea, 0x74, 0x82, 0x2c, 0xb1, 0xb2, 0x46, 0xfe, 0xbd, 0x04, 0x25, 0xce, 0xf9, 0x3c, 0x54,
0x79, 0xd0, 0xa1, 0x75, 0x1f, 0xe3, 0x0e, 0x1c, 0x44, 0x0a, 0xbf, 0x27, 0x17, 0x75, 0x4e, 0x43,
0x39, 0x16, 0x6f, 0xe6, 0x78, 0x5a, 0xf0, 0x3f, 0x85, 0x82, 0x0c, 0xf9, 0x44, 0xe3, 0xcb, 0x57,
0x12, 0x1d, 0x2c, 0x2b, 0xb8, 0x6b, 0x3f, 0xc4, 0xce, 0xe1, 0xec, 0xe3, 0xbb, 0x37, 0x43, 0x06,
0x9d, 0xb1, 0x3f, 0x14, 0x04, 0xe8, 0xcd, 0x40, 0xdd, 0xf9, 0xa4, 0xe9, 0x45, 0x38, 0xc2, 0x70,
0x73, 0x0c, 0xd4, 0xfe, 0x53, 0x36, 0x88, 0x8c, 0x1e, 0x65, 0xda, 0xba, 0xe6, 0x89, 0xb4, 0x1d,
0xf2, 0xcf, 0x25, 0x38, 0xbd, 0x86, 0xbd, 0xbb, 0xd1, 0xe6, 0xfe, 0x59, 0x4b, 0x65, 0x42, 0x3b,
0x49, 0xa8, 0x59, 0x6e, 0xbd, 0x0d, 0x65, 0x31, 0xa6, 0x60, 0x23, 0x62, 0xb1, 0x96, 0x7f, 0x20,
0x41, 0x8b, 0xef, 0x42, 0xf7, 0x24, 0x25, 0x75, 0x1f, 0x7b, 0x58, 0xff, 0xba, 0xfb, 0xe6, 0xbf,
0x4b, 0xd0, 0x0c, 0x47, 0x7c, 0x1a, 0xb4, 0x5f, 0x87, 0x22, 0x1d, 0x4f, 0x70, 0x09, 0x26, 0x1a,
0x2b, 0xc3, 0x26, 0x21, 0x83, 0x96, 0x79, 0xdb, 0x22, 0x39, 0xf1, 0x65, 0x90, 0x76, 0xf2, 0x47,
0x4f, 0x3b, 0x3c, 0x0d, 0xdb, 0x43, 0xc2, 0x97, 0x8d, 0xff, 0x02, 0x80, 0xfc, 0x65, 0x0e, 0x5a,
0x41, 0x3f, 0xf2, 0xb5, 0xc7, 0xfd, 0x94, 0x6a, 0x35, 0xff, 0x84, 0xaa, 0xd5, 0xc2, 0xec, 0xb1,
0xbe, 0x98, 0x14, 0xeb, 0xff, 0x96, 0x83, 0x46, 0xa0, 0xb5, 0xcd, 0xbe, 0x66, 0xa1, 0x05, 0x28,
0x0d, 0xfa, 0x5a, 0x30, 0x7d, 0xe4, 0x2b, 0xb4, 0x25, 0xea, 0x9c, 0xa8, 0x9e, 0x5e, 0x4a, 0xba,
0xc3, 0x94, 0x8b, 0x50, 0x62, 0x2c, 0x48, 0x3b, 0xc8, 0x1a, 0x0a, 0xda, 0xd4, 0xf3, 0xda, 0x8a,
0x19, 0x0b, 0xe9, 0xe7, 0xaf, 0x02, 0xe2, 0x37, 0xac, 0x1a, 0x96, 0xea, 0xe2, 0xae, 0x6d, 0xe9,
0xec, 0xee, 0x8b, 0x4a, 0x93, 0x7f, 0xe9, 0x58, 0x5b, 0x0c, 0x8e, 0x5e, 0x87, 0x82, 0x77, 0x38,
0x60, 0x51, 0xbc, 0x91, 0x18, 0x1d, 0x03, 0xb9, 0xb6, 0x0f, 0x07, 0x58, 0xa1, 0xe8, 0x68, 0x11,
0x80, 0xb0, 0xf2, 0x1c, 0xed, 0x21, 0x4f, 0x89, 0x05, 0x25, 0x04, 0x21, 0xd6, 0xec, 0xeb, 0x70,
0x8e, 0xa5, 0x0e, 0xbe, 0x94, 0xff, 0x92, 0x83, 0x66, 0xc0, 0x52, 0xc1, 0xee, 0xb0, 0xef, 0xa5,
0xea, 0x6f, 0x7c, 0x33, 0x38, 0xa9, 0x6e, 0x78, 0x17, 0xaa, 0xfc, 0x3e, 0x8f, 0x60, 0x0f, 0xc0,
0x48, 0xee, 0x8d, 0x31, 0xd0, 0xe2, 0x13, 0x32, 0xd0, 0xd2, 0x11, 0x0d, 0x54, 0xde, 0x82, 0x05,
0x3f, 0xee, 0x05, 0x08, 0xeb, 0xd8, 0xd3, 0xc6, 0x14, 0x1c, 0xe7, 0xa1, 0xca, 0xf2, 0x19, 0x4b,
0xe4, 0xac, 0x54, 0x87, 0x1d, 0xd1, 0xe1, 0xca, 0xdf, 0x83, 0x93, 0x34, 0x6e, 0xc4, 0x47, 0xb9,
0x59, 0xe6, 0xea, 0xb2, 0x68, 0x04, 0x48, 0xd1, 0xcf, 0xac, 0xbb, 0xa2, 0x44, 0x60, 0xf2, 0x3d,
0x78, 0x2e, 0xc6, 0x7f, 0x86, 0xbc, 0x40, 0x4a, 0xa1, 0x85, 0xad, 0xe8, 0xcf, 0xa2, 0xd3, 0x67,
0xbf, 0x73, 0x62, 0x72, 0xab, 0x1a, 0x7a, 0xdc, 0xbe, 0x74, 0xf4, 0x0e, 0x54, 0x2c, 0x7c, 0xa0,
0x86, 0x83, 0x6f, 0x86, 0x01, 0x5d, 0xd9, 0xc2, 0x07, 0xf4, 0x2f, 0x79, 0x03, 0x4e, 0x8d, 0x88,
0x3a, 0xcb, 0xd9, 0xff, 0x2a, 0xc1, 0xe9, 0x55, 0xc7, 0x1e, 0x7c, 0x64, 0x38, 0xde, 0x50, 0xeb,
0x47, 0x7f, 0x18, 0x79, 0x3a, 0x6d, 0xdc, 0xfb, 0xa1, 0x34, 0xcc, 0xe2, 0xf2, 0xd5, 0x04, 0x73,
0x1d, 0x15, 0x8a, 0x1f, 0x3a, 0x94, 0xb4, 0xff, 0x9b, 0x4f, 0x12, 0x9e, 0xe3, 0x4d, 0x48, 0x36,
0x59, 0xaa, 0x94, 0xc4, 0xa9, 0x4f, 0x7e, 0xda, 0xa9, 0x4f, 0x8a, 0xe7, 0x17, 0x9e, 0x90, 0xe7,
0x1f, 0xb9, 0x0d, 0x79, 0x1f, 0xa2, 0x13, 0x39, 0x1a, 0x72, 0xa7, 0x1a, 0xe5, 0xdd, 0x02, 0x08,
0xa6, 0x53, 0xfc, 0x55, 0x4b, 0x16, 0x36, 0x21, 0x2a, 0x72, 0x5b, 0x22, 0xca, 0xd2, 0xa9, 0x72,
0x64, 0x5e, 0xf2, 0x01, 0xb4, 0x93, 0xac, 0x74, 0x16, 0xcb, 0xff, 0x32, 0x07, 0xd0, 0xa1, 0xd3,
0xa1, 0x6d, 0xcd, 0xdd, 0x9f, 0xae, 0xa2, 0xbc, 0x08, 0xf5, 0xc0, 0x60, 0x02, 0x7f, 0x0f, 0x5b,
0x91, 0x4e, 0x5c, 0x42, 0x14, 0xb6, 0x04, 0x67, 0xa4, 0xd8, 0xd5, 0x29, 0x9f, 0x90, 0xd7, 0x30,
0xa3, 0x88, 0x05, 0x3d, 0x74, 0x06, 0x2a, 0x8e, 0x7d, 0xa0, 0x12, 0x37, 0xd3, 0x69, 0x6e, 0x2d,
0x2b, 0x65, 0xc7, 0x3e, 0x20, 0xce, 0xa7, 0xa3, 0x53, 0x30, 0xe7, 0x69, 0xee, 0x3e, 0xe1, 0x5f,
0x62, 0xe9, 0x8e, 0x2c, 0x3b, 0x3a, 0x3a, 0x09, 0xc5, 0x5d, 0xa3, 0x8f, 0xdd, 0xd6, 0x1c, 0x65,
0xc9, 0x16, 0xe8, 0x0d, 0xff, 0xfd, 0x42, 0x39, 0xf3, 0xef, 0xaf, 0xec, 0x09, 0xc3, 0x57, 0x12,
0xcc, 0x07, 0x5a, 0xa3, 0x01, 0x88, 0xc4, 0x34, 0x1a, 0xcf, 0x6e, 0xdb, 0x3a, 0x0b, 0x15, 0x8d,
0x94, 0x9f, 0x58, 0x18, 0x21, 0x8b, 0x5a, 0x01, 0xc9, 0xb8, 0xba, 0x9c, 0x9c, 0x8b, 0x1c, 0xda,
0xd0, 0xfd, 0x5f, 0x78, 0x4a, 0x8e, 0x7d, 0xd0, 0xd1, 0x85, 0x36, 0xd8, 0x33, 0x2e, 0x56, 0x85,
0x12, 0x6d, 0xdc, 0xa6, 0x2f, 0xb9, 0x2e, 0x42, 0x1d, 0x3b, 0x8e, 0xed, 0xa8, 0x26, 0x76, 0x5d,
0xad, 0x87, 0x79, 0xd1, 0x55, 0xa3, 0xc0, 0x75, 0x06, 0x93, 0xff, 0x93, 0x87, 0x46, 0x70, 0x14,
0xff, 0x77, 0x1d, 0x43, 0xf7, 0x7f, 0xd7, 0x31, 0x74, 0x12, 0xcc, 0x1d, 0x16, 0x0a, 0x43, 0xc1,
0x9c, 0x43, 0x3a, 0x3a, 0xc9, 0x83, 0xc4, 0xc1, 0x2c, 0x5b, 0xc7, 0xc1, 0xc5, 0x82, 0x0f, 0xe2,
0xf7, 0x1a, 0xb1, 0x8f, 0x42, 0x06, 0xfb, 0x28, 0x66, 0xb0, 0x8f, 0x52, 0x82, 0x7d, 0x2c, 0x40,
0x69, 0x67, 0xd8, 0xdd, 0xc7, 0x1e, 0x2f, 0x8f, 0xf8, 0x2a, 0x6a, 0x37, 0xe5, 0x98, 0xdd, 0x08,
0xf3, 0xa8, 0x84, 0xcd, 0xe3, 0x0c, 0x54, 0xd8, 0x8f, 0x0b, 0xaa, 0xe7, 0xd2, 0x29, 0x6b, 0x5e,
0x29, 0x33, 0xc0, 0xb6, 0x8b, 0x6e, 0xfa, 0xbd, 0x43, 0x35, 0xc9, 0xd1, 0x69, 0xc4, 0x89, 0x59,
0x88, 0xdf, 0x39, 0xdc, 0x84, 0xd6, 0x1e, 0x1e, 0x3a, 0xf4, 0x2d, 0x80, 0x4a, 0x1f, 0xab, 0x3e,
0x18, 0x62, 0xe7, 0x50, 0xdb, 0xe9, 0xe3, 0x56, 0x8d, 0x0a, 0xb6, 0x20, 0xbe, 0xaf, 0x6a, 0x9e,
0xf6, 0x81, 0xff, 0x15, 0xbd, 0x06, 0x0b, 0x31, 0x4a, 0xc3, 0xd2, 0xf1, 0x23, 0xac, 0xb7, 0xea,
0x94, 0xee, 0x64, 0x84, 0xae, 0xc3, 0xbe, 0xc9, 0x9f, 0x00, 0x0a, 0x24, 0x99, 0xad, 0x77, 0x8c,
0x5d, 0x75, 0x2e, 0x7e, 0xd5, 0xf2, 0x1f, 0x24, 0x38, 0x1e, 0xde, 0x6c, 0xda, 0x04, 0xfa, 0x0e,
0x54, 0xd9, 0xcc, 0x5a, 0x25, 0x0e, 0xcc, 0xbb, 0xc7, 0x73, 0x63, 0x75, 0xac, 0x80, 0x11, 0xc4,
0xb1, 0x8b, 0x50, 0x3f, 0xb0, 0x9d, 0x7d, 0xc3, 0xea, 0xa9, 0x44, 0x32, 0xdf, 0x6d, 0x6a, 0x1c,
0xb8, 0x41, 0x60, 0xf2, 0x17, 0x12, 0x2c, 0x7e, 0x38, 0xd0, 0x35, 0x0f, 0x87, 0x2a, 0x89, 0x59,
0x1f, 0x94, 0xbc, 0xee, 0xbf, 0xe9, 0xc8, 0x65, 0x9b, 0xbb, 0x32, 0x6c, 0x79, 0x1d, 0x4e, 0x2b,
0xd8, 0xc5, 0x96, 0x1e, 0xf9, 0x38, 0xad, 0x14, 0xf2, 0x00, 0xda, 0x49, 0xec, 0x66, 0xb9, 0x7b,
0x56, 0xd2, 0xa9, 0x0e, 0x61, 0xeb, 0xf1, 0x08, 0x45, 0x2a, 0x09, 0xba, 0x8f, 0x77, 0xe5, 0x97,
0x12, 0x1c, 0x1f, 0x69, 0x96, 0x51, 0x03, 0xe0, 0x43, 0xab, 0xcb, 0xa7, 0x08, 0xcd, 0x63, 0xa8,
0x06, 0x65, 0x7f, 0xa6, 0xd0, 0x94, 0x50, 0x15, 0xe6, 0xb6, 0x6d, 0x8a, 0xdd, 0xcc, 0xa1, 0x26,
0xd4, 0x18, 0xe1, 0xb0, 0xdb, 0xc5, 0xae, 0xdb, 0xcc, 0x0b, 0xc8, 0x5d, 0xcd, 0xe8, 0x0f, 0x1d,
0xdc, 0x2c, 0xa0, 0x3a, 0x54, 0xb6, 0x6d, 0x05, 0xf7, 0xb1, 0xe6, 0xe2, 0x66, 0x11, 0x21, 0x68,
0xf0, 0x85, 0x4f, 0x54, 0x0a, 0xc1, 0x7c, 0xb2, 0xb9, 0x2b, 0xbb, 0xe1, 0xb6, 0x92, 0xf4, 0x5a,
0xe8, 0x14, 0x9c, 0xf8, 0xd0, 0xd2, 0xf1, 0xae, 0x61, 0x61, 0x3d, 0xf8, 0xd4, 0x3c, 0x86, 0x4e,
0xc0, 0x7c, 0xc7, 0xb2, 0xb0, 0x13, 0x02, 0x4a, 0x04, 0xb8, 0x8e, 0x9d, 0x1e, 0x0e, 0x01, 0x73,
0xe8, 0x38, 0xd4, 0xd7, 0x8d, 0x47, 0x21, 0x50, 0x7e, 0xe5, 0x1f, 0xcf, 0x41, 0x85, 0x78, 0xde,
0x6d, 0xdb, 0x76, 0x74, 0x34, 0x00, 0x44, 0xdf, 0x4f, 0x99, 0x03, 0xdb, 0x12, 0x0f, 0x0d, 0xd1,
0x2b, 0x29, 0x15, 0xc1, 0x28, 0x2a, 0xbf, 0xfd, 0xf6, 0xe5, 0x14, 0x8a, 0x18, 0xba, 0x7c, 0x0c,
0x99, 0x74, 0x47, 0xd2, 0xab, 0x6e, 0x1b, 0xdd, 0x7d, 0xff, 0x97, 0xf2, 0x31, 0x3b, 0xc6, 0x50,
0xfd, 0x1d, 0x63, 0xef, 0x17, 0xf9, 0x82, 0x3d, 0x72, 0xf3, 0x8d, 0x48, 0x3e, 0x86, 0x1e, 0xc0,
0xc9, 0x35, 0x1c, 0x72, 0x1a, 0x7f, 0xc3, 0x95, 0xf4, 0x0d, 0x47, 0x90, 0x8f, 0xb8, 0xe5, 0x3d,
0x28, 0xd2, 0xc1, 0x14, 0x4a, 0xf2, 0xab, 0xf0, 0x6b, 0xfc, 0xf6, 0x52, 0x3a, 0x82, 0xe0, 0xf6,
0x09, 0xcc, 0xc7, 0x5e, 0x13, 0xa3, 0x17, 0x13, 0xc8, 0x92, 0xdf, 0x85, 0xb7, 0xaf, 0x64, 0x41,
0x15, 0x7b, 0xf5, 0xa0, 0x11, 0x7d, 0x7d, 0x85, 0x96, 0x13, 0xe8, 0x13, 0x5f, 0x82, 0xb6, 0x5f,
0xcc, 0x80, 0x29, 0x36, 0x32, 0xa1, 0x19, 0x7f, 0xdd, 0x8a, 0xae, 0x8c, 0x65, 0x10, 0x35, 0xb7,
0x97, 0x32, 0xe1, 0x8a, 0xed, 0x0e, 0xa9, 0x11, 0x8c, 0xbc, 0xae, 0x44, 0xd7, 0x92, 0xd9, 0xa4,
0x3d, 0xfb, 0x6c, 0x5f, 0xcf, 0x8c, 0x2f, 0xb6, 0xfe, 0x3e, 0x1b, 0x88, 0x27, 0xbd, 0x50, 0x44,
0xaf, 0x26, 0xb3, 0x1b, 0xf3, 0xb4, 0xb2, 0xbd, 0x72, 0x14, 0x12, 0x21, 0xc4, 0x67, 0x74, 0x92,
0x9d, 0xf0, 0xca, 0x2f, 0xee, 0x77, 0x3e, 0xbf, 0xf4, 0xe7, 0x8b, 0xed, 0x57, 0x8f, 0x40, 0x21,
0x04, 0xb0, 0xe3, 0xef, 0x87, 0x7d, 0x37, 0xbc, 0x3e, 0xd1, 0x6a, 0xa6, 0xf3, 0xc1, 0x8f, 0x61,
0x3e, 0xf6, 0x26, 0x21, 0xd1, 0x6b, 0x92, 0xdf, 0x2d, 0xb4, 0xc7, 0xe5, 0x1a, 0xe6, 0x92, 0xb1,
0x1f, 0x06, 0x50, 0x8a, 0xf5, 0x27, 0xfc, 0x78, 0xd0, 0xbe, 0x92, 0x05, 0x55, 0x1c, 0xc4, 0xa5,
0xe1, 0x32, 0x36, 0x5c, 0x47, 0x57, 0x93, 0x79, 0x24, 0xff, 0x30, 0xd0, 0x7e, 0x39, 0x23, 0xb6,
0xd8, 0x54, 0x05, 0x58, 0xc3, 0xde, 0x3a, 0xf6, 0x1c, 0x62, 0x23, 0x97, 0x13, 0x55, 0x1e, 0x20,
0xf8, 0xdb, 0xbc, 0x30, 0x11, 0x4f, 0x6c, 0xf0, 0x6d, 0x40, 0x7e, 0x8a, 0x0d, 0xbd, 0x88, 0xb9,
0x38, 0x76, 0xfe, 0xc8, 0x86, 0x85, 0x93, 0xee, 0xe6, 0x01, 0x34, 0xd7, 0x35, 0x8b, 0x74, 0x9e,
0x01, 0xdf, 0xab, 0x89, 0x82, 0xc5, 0xd1, 0x52, 0xb4, 0x95, 0x8a, 0x2d, 0x0e, 0x73, 0x20, 0x72,
0xa8, 0x26, 0x5c, 0x10, 0xc7, 0x63, 0x4b, 0xa0, 0x8d, 0x18, 0x62, 0x4a, 0x6c, 0x19, 0x83, 0x2f,
0x36, 0x7e, 0x2c, 0xd1, 0x57, 0xea, 0x31, 0x84, 0xfb, 0x86, 0xb7, 0xb7, 0xd9, 0xd7, 0x2c, 0x37,
0x8b, 0x08, 0x14, 0xf1, 0x08, 0x22, 0x70, 0x7c, 0x21, 0x82, 0x0e, 0xf5, 0xc8, 0x78, 0x0f, 0x25,
0x3d, 0x6b, 0x49, 0x1a, 0x30, 0xb6, 0x97, 0x27, 0x23, 0x8a, 0x5d, 0xf6, 0xa0, 0xee, 0xdb, 0x2b,
0x53, 0xee, 0x8b, 0x69, 0x92, 0x06, 0x38, 0x29, 0xee, 0x96, 0x8c, 0x1a, 0x76, 0xb7, 0xd1, 0xe9,
0x05, 0xca, 0x36, 0xf5, 0x1a, 0xe7, 0x6e, 0xe9, 0x23, 0x11, 0x16, 0x4f, 0x62, 0x93, 0xc2, 0xe4,
0x60, 0x95, 0x38, 0xf8, 0x4c, 0x8c, 0x27, 0x29, 0x83, 0x47, 0xf9, 0x18, 0xba, 0x0f, 0x25, 0xd6,
0x8e, 0xa0, 0xe7, 0xc7, 0x77, 0x2a, 0x9c, 0xfb, 0xa5, 0x09, 0x58, 0x82, 0xf1, 0x3e, 0x9c, 0x4a,
0xe9, 0x53, 0x12, 0xf3, 0xdc, 0xf8, 0x9e, 0x66, 0x82, 0x97, 0xaf, 0xfc, 0xaa, 0x04, 0x65, 0xff,
0xad, 0xc4, 0x33, 0xa8, 0x61, 0x9f, 0x41, 0x51, 0xf9, 0x31, 0xcc, 0xc7, 0x1e, 0x5d, 0x27, 0xda,
0x48, 0xf2, 0xc3, 0xec, 0x49, 0x41, 0xf3, 0x3e, 0xff, 0x57, 0x4c, 0x91, 0x5f, 0x5e, 0x48, 0x2b,
0x4c, 0xe3, 0xa9, 0x65, 0x02, 0xe3, 0xa7, 0x9e, 0x48, 0x36, 0x00, 0x42, 0x81, 0x7e, 0xfc, 0x0f,
0x58, 0x24, 0x76, 0x4d, 0x12, 0x78, 0xfd, 0x88, 0xee, 0x31, 0x81, 0x9d, 0x0b, 0x68, 0xb4, 0xc5,
0x4d, 0x0c, 0x27, 0xa9, 0x8d, 0x75, 0x62, 0x38, 0x49, 0xef, 0x9b, 0xe5, 0x63, 0xb7, 0x6e, 0x7c,
0xe7, 0xd5, 0x9e, 0xe1, 0xed, 0x0d, 0x77, 0x88, 0x38, 0xd7, 0x19, 0xf1, 0xcb, 0x86, 0xcd, 0xff,
0xba, 0xee, 0x5b, 0xe5, 0x75, 0xca, 0xef, 0x3a, 0xe1, 0x37, 0xd8, 0xd9, 0x29, 0xd1, 0xd5, 0x8d,
0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x3b, 0x4f, 0x3d, 0x31, 0x9a, 0x3c, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -4969,6 +5060,7 @@ type DataNodeClient interface {
Compaction(ctx context.Context, in *CompactionPlan, opts ...grpc.CallOption) (*commonpb.Status, error)
// https://wiki.lfaidata.foundation/display/MIL/MEP+24+--+Support+bulk+load
Import(ctx context.Context, in *ImportTaskRequest, opts ...grpc.CallOption) (*commonpb.Status, error)
ResendSegmentStats(ctx context.Context, in *ResendSegmentStatsRequest, opts ...grpc.CallOption) (*ResendSegmentStatsResponse, error)
}
type dataNodeClient struct {
@ -5042,6 +5134,15 @@ func (c *dataNodeClient) Import(ctx context.Context, in *ImportTaskRequest, opts
return out, nil
}
func (c *dataNodeClient) ResendSegmentStats(ctx context.Context, in *ResendSegmentStatsRequest, opts ...grpc.CallOption) (*ResendSegmentStatsResponse, error) {
out := new(ResendSegmentStatsResponse)
err := c.cc.Invoke(ctx, "/milvus.proto.data.DataNode/ResendSegmentStats", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// DataNodeServer is the server API for DataNode service.
type DataNodeServer interface {
GetComponentStates(context.Context, *internalpb.GetComponentStatesRequest) (*internalpb.ComponentStates, error)
@ -5053,6 +5154,7 @@ type DataNodeServer interface {
Compaction(context.Context, *CompactionPlan) (*commonpb.Status, error)
// https://wiki.lfaidata.foundation/display/MIL/MEP+24+--+Support+bulk+load
Import(context.Context, *ImportTaskRequest) (*commonpb.Status, error)
ResendSegmentStats(context.Context, *ResendSegmentStatsRequest) (*ResendSegmentStatsResponse, error)
}
// UnimplementedDataNodeServer can be embedded to have forward compatible implementations.
@ -5080,6 +5182,9 @@ func (*UnimplementedDataNodeServer) Compaction(ctx context.Context, req *Compact
func (*UnimplementedDataNodeServer) Import(ctx context.Context, req *ImportTaskRequest) (*commonpb.Status, error) {
return nil, status.Errorf(codes.Unimplemented, "method Import not implemented")
}
func (*UnimplementedDataNodeServer) ResendSegmentStats(ctx context.Context, req *ResendSegmentStatsRequest) (*ResendSegmentStatsResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method ResendSegmentStats not implemented")
}
func RegisterDataNodeServer(s *grpc.Server, srv DataNodeServer) {
s.RegisterService(&_DataNode_serviceDesc, srv)
@ -5211,6 +5316,24 @@ func _DataNode_Import_Handler(srv interface{}, ctx context.Context, dec func(int
return interceptor(ctx, in, info, handler)
}
func _DataNode_ResendSegmentStats_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ResendSegmentStatsRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(DataNodeServer).ResendSegmentStats(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/milvus.proto.data.DataNode/ResendSegmentStats",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(DataNodeServer).ResendSegmentStats(ctx, req.(*ResendSegmentStatsRequest))
}
return interceptor(ctx, in, info, handler)
}
var _DataNode_serviceDesc = grpc.ServiceDesc{
ServiceName: "milvus.proto.data.DataNode",
HandlerType: (*DataNodeServer)(nil),
@ -5243,6 +5366,10 @@ var _DataNode_serviceDesc = grpc.ServiceDesc{
MethodName: "Import",
Handler: _DataNode_Import_Handler,
},
{
MethodName: "ResendSegmentStats",
Handler: _DataNode_ResendSegmentStats_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "data_coord.proto",

View File

@ -77,6 +77,10 @@ type DataNode interface {
// Return status indicates if this operation is processed successfully or fail cause;
// error is always nil
Import(ctx context.Context, req *datapb.ImportTaskRequest) (*commonpb.Status, error)
// ResendSegmentStats resend un-flushed segment stats back upstream to DataCoord by resending DataNode time tick message.
// It returns a list of segments to be sent.
ResendSegmentStats(ctx context.Context, req *datapb.ResendSegmentStatsRequest) (*datapb.ResendSegmentStatsResponse, error)
}
// DataNodeComponent is used by grpc server of DataNode

View File

@ -58,3 +58,7 @@ func (m *DataNodeClient) Compaction(ctx context.Context, req *datapb.CompactionP
func (m *DataNodeClient) Import(ctx context.Context, req *datapb.ImportTaskRequest, opts ...grpc.CallOption) (*commonpb.Status, error) {
return &commonpb.Status{}, m.Err
}
func (m *DataNodeClient) ResendSegmentStats(ctx context.Context, req *datapb.ResendSegmentStatsRequest, opts ...grpc.CallOption) (*datapb.ResendSegmentStatsResponse, error) {
return &datapb.ResendSegmentStatsResponse{}, m.Err
}

View File

@ -55,9 +55,12 @@ go test -race -cover ${APPLE_SILICON_FLAG} "${MILVUS_DIR}/proxy/..." -failfast
go test -race -cover ${APPLE_SILICON_FLAG} "${MILVUS_DIR}/datanode/..." -failfast
go test -race -cover ${APPLE_SILICON_FLAG} "${MILVUS_DIR}/indexnode/..." -failfast
go test -race -cover ${APPLE_SILICON_FLAG} "${MILVUS_DIR}/querynode/..." -failfast
go test -race -cover ${APPLE_SILICON_FLAG} "${MILVUS_DIR}/distributed/rootcoord" -failfast
go test -race -cover ${APPLE_SILICON_FLAG} "${MILVUS_DIR}/distributed/datacoord" -failfast
go test -race -cover ${APPLE_SILICON_FLAG} "${MILVUS_DIR}/distributed/querycoord" -failfast
go test -race -cover ${APPLE_SILICON_FLAG} "${MILVUS_DIR}/distributed/rootcoord/..." -failfast
go test -race -cover ${APPLE_SILICON_FLAG} "${MILVUS_DIR}/distributed/datacoord/..." -failfast
go test -race -cover ${APPLE_SILICON_FLAG} "${MILVUS_DIR}/distributed/querycoord/..." -failfast
go test -race -cover ${APPLE_SILICON_FLAG} "${MILVUS_DIR}/distributed/proxy/..." -failfast
go test -race -cover ${APPLE_SILICON_FLAG} "${MILVUS_DIR}/distributed/datanode/..." -failfast
go test -race -cover ${APPLE_SILICON_FLAG} "${MILVUS_DIR}/distributed/querynode/..." -failfast
go test -race -cover ${APPLE_SILICON_FLAG} "${MILVUS_DIR}/rootcoord" -failfast
go test -race -cover ${APPLE_SILICON_FLAG} "${MILVUS_DIR}/datacoord/..." -failfast
go test -race -cover ${APPLE_SILICON_FLAG} "${MILVUS_DIR}/indexcoord/..." -failfast