Remove collection meta after GC finished (#21595)

Signed-off-by: longjiquan <jiquan.long@zilliz.com>
This commit is contained in:
Jiquan Long 2023-01-12 09:55:42 +08:00 committed by GitHub
parent 6d09bbed68
commit 9fd9bed2b9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
37 changed files with 2494 additions and 467 deletions

View File

@ -297,6 +297,9 @@ mock-datanode:
mock-rootcoord:
mockery --name=RootCoord --dir=$(PWD)/internal/types --output=$(PWD)/internal/mocks --filename=mock_rootcoord.go --with-expecter
mock-datacoord:
mockery --name=DataCoord --dir=$(PWD)/internal/types --output=$(PWD)/internal/mocks --filename=mock_datacoord.go --with-expecter
mock-tnx-kv:
mockery --name=TxnKV --dir=$(PWD)/internal/kv --output=$(PWD)/internal/kv/mocks --filename=TxnKV.go --with-expecter

View File

@ -1269,6 +1269,10 @@ func (m *meta) DropChannelCheckpoint(vChannel string) error {
return nil
}
func (m *meta) GcConfirm(ctx context.Context, collectionID, partitionID UniqueID) bool {
return m.catalog.GcConfirm(ctx, collectionID, partitionID)
}
// addNewSeg update metrics update for a new segment.
func (s *segMetricMutation) addNewSeg(state commonpb.SegmentState, rowCount int64) {
s.stateChange[state.String()]++

View File

@ -23,19 +23,18 @@ import (
"testing"
"github.com/golang/protobuf/proto"
"github.com/samber/lo"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
"github.com/milvus-io/milvus-proto/go-api/commonpb"
"github.com/milvus-io/milvus/internal/common"
"github.com/milvus-io/milvus/internal/kv"
"github.com/milvus-io/milvus/internal/metastore/kv/datacoord"
"github.com/milvus-io/milvus/internal/metastore/mocks"
"github.com/milvus-io/milvus/internal/metastore/model"
"github.com/milvus-io/milvus/internal/mocks"
"github.com/milvus-io/milvus/internal/proto/datapb"
"github.com/milvus-io/milvus/internal/proto/internalpb"
"github.com/samber/lo"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
)
func TestMetaReloadFromKV(t *testing.T) {
@ -945,3 +944,17 @@ func TestChannelCP(t *testing.T) {
assert.NoError(t, err)
})
}
func Test_meta_GcConfirm(t *testing.T) {
m := &meta{}
catalog := mocks.NewDataCoordCatalog(t)
m.catalog = catalog
catalog.On("GcConfirm",
mock.Anything,
mock.AnythingOfType("int64"),
mock.AnythingOfType("int64")).
Return(false)
assert.False(t, m.GcConfirm(context.TODO(), 100, 10000))
}

View File

@ -1443,3 +1443,21 @@ func (s *Server) CheckHealth(ctx context.Context, req *milvuspb.CheckHealthReque
return &milvuspb.CheckHealthResponse{IsHealthy: true, Reasons: errReasons}, nil
}
func (s *Server) GcConfirm(ctx context.Context, request *datapb.GcConfirmRequest) (*datapb.GcConfirmResponse, error) {
resp := &datapb.GcConfirmResponse{
Status: &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
},
GcFinished: false,
}
if s.isClosed() {
resp.Status.Reason = msgDataCoordIsUnhealthy(paramtable.GetNodeID())
return resp, nil
}
resp.GcFinished = s.meta.GcConfirm(ctx, request.GetCollectionId(), request.GetPartitionId())
resp.Status.ErrorCode = commonpb.ErrorCode_Success
return resp, nil
}

View File

@ -4,6 +4,9 @@ import (
"context"
"testing"
"github.com/milvus-io/milvus/internal/mocks"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/assert"
"github.com/milvus-io/milvus-proto/go-api/commonpb"
@ -54,3 +57,35 @@ func TestBroadcastAlteredCollection(t *testing.T) {
assert.NotNil(t, s.meta.collections[1].Properties)
})
}
func TestServer_GcConfirm(t *testing.T) {
t.Run("closed server", func(t *testing.T) {
s := &Server{}
s.stateCode.Store(commonpb.StateCode_Initializing)
resp, err := s.GcConfirm(context.TODO(), &datapb.GcConfirmRequest{CollectionId: 100, PartitionId: 10000})
assert.NoError(t, err)
assert.NotEqual(t, commonpb.ErrorCode_Success, resp.GetStatus().GetErrorCode())
})
t.Run("normal case", func(t *testing.T) {
s := &Server{}
s.stateCode.Store(commonpb.StateCode_Healthy)
m := &meta{}
catalog := mocks.NewDataCoordCatalog(t)
m.catalog = catalog
catalog.On("GcConfirm",
mock.Anything,
mock.AnythingOfType("int64"),
mock.AnythingOfType("int64")).
Return(false)
s.meta = m
resp, err := s.GcConfirm(context.TODO(), &datapb.GcConfirmRequest{CollectionId: 100, PartitionId: 10000})
assert.NoError(t, err)
assert.Equal(t, commonpb.ErrorCode_Success, resp.GetStatus().GetErrorCode())
assert.False(t, resp.GetGcFinished())
})
}

View File

@ -760,6 +760,19 @@ func (c *Client) CheckHealth(ctx context.Context, req *milvuspb.CheckHealthReque
return ret.(*milvuspb.CheckHealthResponse), err
}
func (c *Client) GcConfirm(ctx context.Context, req *datapb.GcConfirmRequest) (*datapb.GcConfirmResponse, error) {
ret, err := c.grpcClient.ReCall(ctx, func(client datapb.DataCoordClient) (any, error) {
if !funcutil.CheckCtxValid(ctx) {
return nil, ctx.Err()
}
return client.GcConfirm(ctx, req)
})
if err != nil || ret == nil {
return nil, err
}
return ret.(*datapb.GcConfirmResponse), err
}
// CreateIndex sends the build index request to IndexCoord.
func (c *Client) CreateIndex(ctx context.Context, req *indexpb.CreateIndexRequest) (*commonpb.Status, error) {
ret, err := c.grpcClient.ReCall(ctx, func(client datapb.DataCoordClient) (any, error) {

View File

@ -386,6 +386,10 @@ func (s *Server) CheckHealth(ctx context.Context, req *milvuspb.CheckHealthReque
return s.dataCoord.CheckHealth(ctx, req)
}
func (s *Server) GcConfirm(ctx context.Context, request *datapb.GcConfirmRequest) (*datapb.GcConfirmResponse, error) {
return s.dataCoord.GcConfirm(ctx, request)
}
// CreateIndex sends the build index request to DataCoord.
func (s *Server) CreateIndex(ctx context.Context, req *indexpb.CreateIndexRequest) (*commonpb.Status, error) {
return s.dataCoord.CreateIndex(ctx, req)

View File

@ -21,12 +21,12 @@ import (
"errors"
"testing"
"github.com/milvus-io/milvus/internal/proto/indexpb"
"github.com/milvus-io/milvus-proto/go-api/commonpb"
"github.com/milvus-io/milvus-proto/go-api/milvuspb"
"github.com/milvus-io/milvus/internal/proto/datapb"
"github.com/milvus-io/milvus/internal/proto/indexpb"
"github.com/milvus-io/milvus/internal/proto/internalpb"
"github.com/milvus-io/milvus/internal/types"
"github.com/milvus-io/milvus/internal/util/paramtable"
"github.com/stretchr/testify/assert"
clientv3 "go.etcd.io/etcd/client/v3"
@ -34,6 +34,8 @@ import (
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
type MockDataCoord struct {
types.DataCoord
states *milvuspb.ComponentStates
status *commonpb.Status
err error

View File

@ -554,6 +554,10 @@ func (m *MockDataCoord) CheckHealth(ctx context.Context, req *milvuspb.CheckHeal
return nil, nil
}
func (m *MockDataCoord) GcConfirm(ctx context.Context, req *datapb.GcConfirmRequest) (*datapb.GcConfirmResponse, error) {
return nil, nil
}
func (m *MockDataCoord) CreateIndex(ctx context.Context, req *indexpb.CreateIndexRequest) (*commonpb.Status, error) {
return nil, nil
}

View File

@ -130,6 +130,8 @@ type DataCoordCatalog interface {
AlterSegmentIndex(ctx context.Context, newSegIndex *model.SegmentIndex) error
AlterSegmentIndexes(ctx context.Context, newSegIdxes []*model.SegmentIndex) error
DropSegmentIndex(ctx context.Context, collID, partID, segID, buildID typeutil.UniqueID) error
GcConfirm(ctx context.Context, collectionID, partitionID typeutil.UniqueID) bool
}
type IndexCoordCatalog interface {

View File

@ -685,6 +685,23 @@ func (kc *Catalog) DropSegmentIndex(ctx context.Context, collID, partID, segID,
return nil
}
const allPartitionID = -1
// GcConfirm returns true if related collection/partition is not found.
// DataCoord will remove all the meta eventually after GC is finished.
func (kc *Catalog) GcConfirm(ctx context.Context, collectionID, partitionID typeutil.UniqueID) bool {
prefix := buildCollectionPrefix(collectionID)
if partitionID != allPartitionID {
prefix = buildPartitionPrefix(collectionID, partitionID)
}
keys, values, err := kc.MetaKv.LoadWithPrefix(prefix)
if err != nil {
// error case can be regarded as not finished.
return false
}
return len(keys) == 0 && len(values) == 0
}
func fillLogPathByLogID(chunkManagerRootPath string, binlogType storage.BinlogType, collectionID, partitionID,
segmentID typeutil.UniqueID, fieldBinlog *datapb.FieldBinlog) error {
for _, binlog := range fieldBinlog.Binlogs {
@ -956,3 +973,11 @@ func BuildIndexKey(collectionID, indexID int64) string {
func BuildSegmentIndexKey(collectionID, partitionID, segmentID, buildID int64) string {
return fmt.Sprintf("%s/%d/%d/%d/%d", util.SegmentIndexPrefix, collectionID, partitionID, segmentID, buildID)
}
func buildCollectionPrefix(collectionID typeutil.UniqueID) string {
return fmt.Sprintf("%s/%d", SegmentPrefix, collectionID)
}
func buildPartitionPrefix(collectionID, partitionID typeutil.UniqueID) string {
return fmt.Sprintf("%s/%d/%d", SegmentPrefix, collectionID, partitionID)
}

View File

@ -1346,3 +1346,20 @@ func TestMain(m *testing.M) {
code := m.Run()
os.Exit(code)
}
func TestCatalog_GcConfirm(t *testing.T) {
kc := &Catalog{}
txn := mocks.NewMetaKv(t)
kc.MetaKv = txn
txn.On("LoadWithPrefix",
mock.AnythingOfType("string")).
Return(nil, nil, errors.New("error mock LoadWithPrefix")).
Once()
assert.False(t, kc.GcConfirm(context.TODO(), 100, 10000))
txn.On("LoadWithPrefix",
mock.AnythingOfType("string")).
Return(nil, nil, nil)
assert.True(t, kc.GcConfirm(context.TODO(), 100, 10000))
}

View File

@ -602,6 +602,45 @@ func (_c *DataCoordCatalog_DropSegmentIndex_Call) Return(_a0 error) *DataCoordCa
return _c
}
// GcConfirm provides a mock function with given fields: ctx, collectionID, partitionID
func (_m *DataCoordCatalog) GcConfirm(ctx context.Context, collectionID int64, partitionID int64) bool {
ret := _m.Called(ctx, collectionID, partitionID)
var r0 bool
if rf, ok := ret.Get(0).(func(context.Context, int64, int64) bool); ok {
r0 = rf(ctx, collectionID, partitionID)
} else {
r0 = ret.Get(0).(bool)
}
return r0
}
// DataCoordCatalog_GcConfirm_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GcConfirm'
type DataCoordCatalog_GcConfirm_Call struct {
*mock.Call
}
// GcConfirm is a helper method to define mock.On call
// - ctx context.Context
// - collectionID int64
// - partitionID int64
func (_e *DataCoordCatalog_Expecter) GcConfirm(ctx interface{}, collectionID interface{}, partitionID interface{}) *DataCoordCatalog_GcConfirm_Call {
return &DataCoordCatalog_GcConfirm_Call{Call: _e.mock.On("GcConfirm", ctx, collectionID, partitionID)}
}
func (_c *DataCoordCatalog_GcConfirm_Call) Run(run func(ctx context.Context, collectionID int64, partitionID int64)) *DataCoordCatalog_GcConfirm_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(int64), args[2].(int64))
})
return _c
}
func (_c *DataCoordCatalog_GcConfirm_Call) Return(_a0 bool) *DataCoordCatalog_GcConfirm_Call {
_c.Call.Return(_a0)
return _c
}
// IsChannelDropped provides a mock function with given fields: ctx, channel
func (_m *DataCoordCatalog) IsChannelDropped(ctx context.Context, channel string) bool {
ret := _m.Called(ctx, channel)

View File

@ -1,4 +1,4 @@
// Code generated by mockery v2.14.0. DO NOT EDIT.
// Code generated by mockery v2.16.0. DO NOT EDIT.
package mocks

View File

@ -1,4 +1,4 @@
// Code generated by mockery v2.14.0. DO NOT EDIT.
// Code generated by mockery v2.16.0. DO NOT EDIT.
package mocks
@ -9,6 +9,8 @@ import (
datapb "github.com/milvus-io/milvus/internal/proto/datapb"
indexpb "github.com/milvus-io/milvus/internal/proto/indexpb"
internalpb "github.com/milvus-io/milvus/internal/proto/internalpb"
milvuspb "github.com/milvus-io/milvus-proto/go-api/milvuspb"
@ -77,11 +79,11 @@ func (_c *DataCoord_AssignSegmentID_Call) Return(_a0 *datapb.AssignSegmentIDResp
}
// BroadcastAlteredCollection provides a mock function with given fields: ctx, req
func (_m *DataCoord) BroadcastAlteredCollection(ctx context.Context, req *milvuspb.AlterCollectionRequest) (*commonpb.Status, error) {
func (_m *DataCoord) BroadcastAlteredCollection(ctx context.Context, req *datapb.AlterCollectionRequest) (*commonpb.Status, error) {
ret := _m.Called(ctx, req)
var r0 *commonpb.Status
if rf, ok := ret.Get(0).(func(context.Context, *milvuspb.AlterCollectionRequest) *commonpb.Status); ok {
if rf, ok := ret.Get(0).(func(context.Context, *datapb.AlterCollectionRequest) *commonpb.Status); ok {
r0 = rf(ctx, req)
} else {
if ret.Get(0) != nil {
@ -90,7 +92,7 @@ func (_m *DataCoord) BroadcastAlteredCollection(ctx context.Context, req *milvus
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, *milvuspb.AlterCollectionRequest) error); ok {
if rf, ok := ret.Get(1).(func(context.Context, *datapb.AlterCollectionRequest) error); ok {
r1 = rf(ctx, req)
} else {
r1 = ret.Error(1)
@ -106,14 +108,14 @@ type DataCoord_BroadcastAlteredCollection_Call struct {
// BroadcastAlteredCollection is a helper method to define mock.On call
// - ctx context.Context
// - req *milvuspb.AlterCollectionRequest
// - req *datapb.AlterCollectionRequest
func (_e *DataCoord_Expecter) BroadcastAlteredCollection(ctx interface{}, req interface{}) *DataCoord_BroadcastAlteredCollection_Call {
return &DataCoord_BroadcastAlteredCollection_Call{Call: _e.mock.On("BroadcastAlteredCollection", ctx, req)}
}
func (_c *DataCoord_BroadcastAlteredCollection_Call) Run(run func(ctx context.Context, req *milvuspb.AlterCollectionRequest)) *DataCoord_BroadcastAlteredCollection_Call {
func (_c *DataCoord_BroadcastAlteredCollection_Call) Run(run func(ctx context.Context, req *datapb.AlterCollectionRequest)) *DataCoord_BroadcastAlteredCollection_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(*milvuspb.AlterCollectionRequest))
run(args[0].(context.Context), args[1].(*datapb.AlterCollectionRequest))
})
return _c
}
@ -170,6 +172,147 @@ func (_c *DataCoord_CheckHealth_Call) Return(_a0 *milvuspb.CheckHealthResponse,
return _c
}
// CreateIndex provides a mock function with given fields: ctx, req
func (_m *DataCoord) CreateIndex(ctx context.Context, req *indexpb.CreateIndexRequest) (*commonpb.Status, error) {
ret := _m.Called(ctx, req)
var r0 *commonpb.Status
if rf, ok := ret.Get(0).(func(context.Context, *indexpb.CreateIndexRequest) *commonpb.Status); ok {
r0 = rf(ctx, req)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*commonpb.Status)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, *indexpb.CreateIndexRequest) error); ok {
r1 = rf(ctx, req)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// DataCoord_CreateIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateIndex'
type DataCoord_CreateIndex_Call struct {
*mock.Call
}
// CreateIndex is a helper method to define mock.On call
// - ctx context.Context
// - req *indexpb.CreateIndexRequest
func (_e *DataCoord_Expecter) CreateIndex(ctx interface{}, req interface{}) *DataCoord_CreateIndex_Call {
return &DataCoord_CreateIndex_Call{Call: _e.mock.On("CreateIndex", ctx, req)}
}
func (_c *DataCoord_CreateIndex_Call) Run(run func(ctx context.Context, req *indexpb.CreateIndexRequest)) *DataCoord_CreateIndex_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(*indexpb.CreateIndexRequest))
})
return _c
}
func (_c *DataCoord_CreateIndex_Call) Return(_a0 *commonpb.Status, _a1 error) *DataCoord_CreateIndex_Call {
_c.Call.Return(_a0, _a1)
return _c
}
// DescribeIndex provides a mock function with given fields: ctx, req
func (_m *DataCoord) DescribeIndex(ctx context.Context, req *indexpb.DescribeIndexRequest) (*indexpb.DescribeIndexResponse, error) {
ret := _m.Called(ctx, req)
var r0 *indexpb.DescribeIndexResponse
if rf, ok := ret.Get(0).(func(context.Context, *indexpb.DescribeIndexRequest) *indexpb.DescribeIndexResponse); ok {
r0 = rf(ctx, req)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*indexpb.DescribeIndexResponse)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, *indexpb.DescribeIndexRequest) error); ok {
r1 = rf(ctx, req)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// DataCoord_DescribeIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DescribeIndex'
type DataCoord_DescribeIndex_Call struct {
*mock.Call
}
// DescribeIndex is a helper method to define mock.On call
// - ctx context.Context
// - req *indexpb.DescribeIndexRequest
func (_e *DataCoord_Expecter) DescribeIndex(ctx interface{}, req interface{}) *DataCoord_DescribeIndex_Call {
return &DataCoord_DescribeIndex_Call{Call: _e.mock.On("DescribeIndex", ctx, req)}
}
func (_c *DataCoord_DescribeIndex_Call) Run(run func(ctx context.Context, req *indexpb.DescribeIndexRequest)) *DataCoord_DescribeIndex_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(*indexpb.DescribeIndexRequest))
})
return _c
}
func (_c *DataCoord_DescribeIndex_Call) Return(_a0 *indexpb.DescribeIndexResponse, _a1 error) *DataCoord_DescribeIndex_Call {
_c.Call.Return(_a0, _a1)
return _c
}
// DropIndex provides a mock function with given fields: ctx, req
func (_m *DataCoord) DropIndex(ctx context.Context, req *indexpb.DropIndexRequest) (*commonpb.Status, error) {
ret := _m.Called(ctx, req)
var r0 *commonpb.Status
if rf, ok := ret.Get(0).(func(context.Context, *indexpb.DropIndexRequest) *commonpb.Status); ok {
r0 = rf(ctx, req)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*commonpb.Status)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, *indexpb.DropIndexRequest) error); ok {
r1 = rf(ctx, req)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// DataCoord_DropIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DropIndex'
type DataCoord_DropIndex_Call struct {
*mock.Call
}
// DropIndex is a helper method to define mock.On call
// - ctx context.Context
// - req *indexpb.DropIndexRequest
func (_e *DataCoord_Expecter) DropIndex(ctx interface{}, req interface{}) *DataCoord_DropIndex_Call {
return &DataCoord_DropIndex_Call{Call: _e.mock.On("DropIndex", ctx, req)}
}
func (_c *DataCoord_DropIndex_Call) Run(run func(ctx context.Context, req *indexpb.DropIndexRequest)) *DataCoord_DropIndex_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(*indexpb.DropIndexRequest))
})
return _c
}
func (_c *DataCoord_DropIndex_Call) Return(_a0 *commonpb.Status, _a1 error) *DataCoord_DropIndex_Call {
_c.Call.Return(_a0, _a1)
return _c
}
// DropVirtualChannel provides a mock function with given fields: ctx, req
func (_m *DataCoord) DropVirtualChannel(ctx context.Context, req *datapb.DropVirtualChannelRequest) (*datapb.DropVirtualChannelResponse, error) {
ret := _m.Called(ctx, req)
@ -264,6 +407,53 @@ func (_c *DataCoord_Flush_Call) Return(_a0 *datapb.FlushResponse, _a1 error) *Da
return _c
}
// GcConfirm provides a mock function with given fields: ctx, request
func (_m *DataCoord) GcConfirm(ctx context.Context, request *datapb.GcConfirmRequest) (*datapb.GcConfirmResponse, error) {
ret := _m.Called(ctx, request)
var r0 *datapb.GcConfirmResponse
if rf, ok := ret.Get(0).(func(context.Context, *datapb.GcConfirmRequest) *datapb.GcConfirmResponse); ok {
r0 = rf(ctx, request)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*datapb.GcConfirmResponse)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, *datapb.GcConfirmRequest) error); ok {
r1 = rf(ctx, request)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// DataCoord_GcConfirm_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GcConfirm'
type DataCoord_GcConfirm_Call struct {
*mock.Call
}
// GcConfirm is a helper method to define mock.On call
// - ctx context.Context
// - request *datapb.GcConfirmRequest
func (_e *DataCoord_Expecter) GcConfirm(ctx interface{}, request interface{}) *DataCoord_GcConfirm_Call {
return &DataCoord_GcConfirm_Call{Call: _e.mock.On("GcConfirm", ctx, request)}
}
func (_c *DataCoord_GcConfirm_Call) Run(run func(ctx context.Context, request *datapb.GcConfirmRequest)) *DataCoord_GcConfirm_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(*datapb.GcConfirmRequest))
})
return _c
}
func (_c *DataCoord_GcConfirm_Call) Return(_a0 *datapb.GcConfirmResponse, _a1 error) *DataCoord_GcConfirm_Call {
_c.Call.Return(_a0, _a1)
return _c
}
// GetCollectionStatistics provides a mock function with given fields: ctx, req
func (_m *DataCoord) GetCollectionStatistics(ctx context.Context, req *datapb.GetCollectionStatisticsRequest) (*datapb.GetCollectionStatisticsResponse, error) {
ret := _m.Called(ctx, req)
@ -545,6 +735,147 @@ func (_c *DataCoord_GetFlushedSegments_Call) Return(_a0 *datapb.GetFlushedSegmen
return _c
}
// GetIndexBuildProgress provides a mock function with given fields: ctx, req
func (_m *DataCoord) GetIndexBuildProgress(ctx context.Context, req *indexpb.GetIndexBuildProgressRequest) (*indexpb.GetIndexBuildProgressResponse, error) {
ret := _m.Called(ctx, req)
var r0 *indexpb.GetIndexBuildProgressResponse
if rf, ok := ret.Get(0).(func(context.Context, *indexpb.GetIndexBuildProgressRequest) *indexpb.GetIndexBuildProgressResponse); ok {
r0 = rf(ctx, req)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*indexpb.GetIndexBuildProgressResponse)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, *indexpb.GetIndexBuildProgressRequest) error); ok {
r1 = rf(ctx, req)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// DataCoord_GetIndexBuildProgress_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetIndexBuildProgress'
type DataCoord_GetIndexBuildProgress_Call struct {
*mock.Call
}
// GetIndexBuildProgress is a helper method to define mock.On call
// - ctx context.Context
// - req *indexpb.GetIndexBuildProgressRequest
func (_e *DataCoord_Expecter) GetIndexBuildProgress(ctx interface{}, req interface{}) *DataCoord_GetIndexBuildProgress_Call {
return &DataCoord_GetIndexBuildProgress_Call{Call: _e.mock.On("GetIndexBuildProgress", ctx, req)}
}
func (_c *DataCoord_GetIndexBuildProgress_Call) Run(run func(ctx context.Context, req *indexpb.GetIndexBuildProgressRequest)) *DataCoord_GetIndexBuildProgress_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(*indexpb.GetIndexBuildProgressRequest))
})
return _c
}
func (_c *DataCoord_GetIndexBuildProgress_Call) Return(_a0 *indexpb.GetIndexBuildProgressResponse, _a1 error) *DataCoord_GetIndexBuildProgress_Call {
_c.Call.Return(_a0, _a1)
return _c
}
// GetIndexInfos provides a mock function with given fields: ctx, req
func (_m *DataCoord) GetIndexInfos(ctx context.Context, req *indexpb.GetIndexInfoRequest) (*indexpb.GetIndexInfoResponse, error) {
ret := _m.Called(ctx, req)
var r0 *indexpb.GetIndexInfoResponse
if rf, ok := ret.Get(0).(func(context.Context, *indexpb.GetIndexInfoRequest) *indexpb.GetIndexInfoResponse); ok {
r0 = rf(ctx, req)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*indexpb.GetIndexInfoResponse)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, *indexpb.GetIndexInfoRequest) error); ok {
r1 = rf(ctx, req)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// DataCoord_GetIndexInfos_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetIndexInfos'
type DataCoord_GetIndexInfos_Call struct {
*mock.Call
}
// GetIndexInfos is a helper method to define mock.On call
// - ctx context.Context
// - req *indexpb.GetIndexInfoRequest
func (_e *DataCoord_Expecter) GetIndexInfos(ctx interface{}, req interface{}) *DataCoord_GetIndexInfos_Call {
return &DataCoord_GetIndexInfos_Call{Call: _e.mock.On("GetIndexInfos", ctx, req)}
}
func (_c *DataCoord_GetIndexInfos_Call) Run(run func(ctx context.Context, req *indexpb.GetIndexInfoRequest)) *DataCoord_GetIndexInfos_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(*indexpb.GetIndexInfoRequest))
})
return _c
}
func (_c *DataCoord_GetIndexInfos_Call) Return(_a0 *indexpb.GetIndexInfoResponse, _a1 error) *DataCoord_GetIndexInfos_Call {
_c.Call.Return(_a0, _a1)
return _c
}
// GetIndexState provides a mock function with given fields: ctx, req
func (_m *DataCoord) GetIndexState(ctx context.Context, req *indexpb.GetIndexStateRequest) (*indexpb.GetIndexStateResponse, error) {
ret := _m.Called(ctx, req)
var r0 *indexpb.GetIndexStateResponse
if rf, ok := ret.Get(0).(func(context.Context, *indexpb.GetIndexStateRequest) *indexpb.GetIndexStateResponse); ok {
r0 = rf(ctx, req)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*indexpb.GetIndexStateResponse)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, *indexpb.GetIndexStateRequest) error); ok {
r1 = rf(ctx, req)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// DataCoord_GetIndexState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetIndexState'
type DataCoord_GetIndexState_Call struct {
*mock.Call
}
// GetIndexState is a helper method to define mock.On call
// - ctx context.Context
// - req *indexpb.GetIndexStateRequest
func (_e *DataCoord_Expecter) GetIndexState(ctx interface{}, req interface{}) *DataCoord_GetIndexState_Call {
return &DataCoord_GetIndexState_Call{Call: _e.mock.On("GetIndexState", ctx, req)}
}
func (_c *DataCoord_GetIndexState_Call) Run(run func(ctx context.Context, req *indexpb.GetIndexStateRequest)) *DataCoord_GetIndexState_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(*indexpb.GetIndexStateRequest))
})
return _c
}
func (_c *DataCoord_GetIndexState_Call) Return(_a0 *indexpb.GetIndexStateResponse, _a1 error) *DataCoord_GetIndexState_Call {
_c.Call.Return(_a0, _a1)
return _c
}
// GetInsertBinlogPaths provides a mock function with given fields: ctx, req
func (_m *DataCoord) GetInsertBinlogPaths(ctx context.Context, req *datapb.GetInsertBinlogPathsRequest) (*datapb.GetInsertBinlogPathsResponse, error) {
ret := _m.Called(ctx, req)
@ -733,6 +1064,53 @@ func (_c *DataCoord_GetRecoveryInfo_Call) Return(_a0 *datapb.GetRecoveryInfoResp
return _c
}
// GetSegmentIndexState provides a mock function with given fields: ctx, req
func (_m *DataCoord) GetSegmentIndexState(ctx context.Context, req *indexpb.GetSegmentIndexStateRequest) (*indexpb.GetSegmentIndexStateResponse, error) {
ret := _m.Called(ctx, req)
var r0 *indexpb.GetSegmentIndexStateResponse
if rf, ok := ret.Get(0).(func(context.Context, *indexpb.GetSegmentIndexStateRequest) *indexpb.GetSegmentIndexStateResponse); ok {
r0 = rf(ctx, req)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*indexpb.GetSegmentIndexStateResponse)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, *indexpb.GetSegmentIndexStateRequest) error); ok {
r1 = rf(ctx, req)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// DataCoord_GetSegmentIndexState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetSegmentIndexState'
type DataCoord_GetSegmentIndexState_Call struct {
*mock.Call
}
// GetSegmentIndexState is a helper method to define mock.On call
// - ctx context.Context
// - req *indexpb.GetSegmentIndexStateRequest
func (_e *DataCoord_Expecter) GetSegmentIndexState(ctx interface{}, req interface{}) *DataCoord_GetSegmentIndexState_Call {
return &DataCoord_GetSegmentIndexState_Call{Call: _e.mock.On("GetSegmentIndexState", ctx, req)}
}
func (_c *DataCoord_GetSegmentIndexState_Call) Run(run func(ctx context.Context, req *indexpb.GetSegmentIndexStateRequest)) *DataCoord_GetSegmentIndexState_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(*indexpb.GetSegmentIndexStateRequest))
})
return _c
}
func (_c *DataCoord_GetSegmentIndexState_Call) Return(_a0 *indexpb.GetSegmentIndexStateResponse, _a1 error) *DataCoord_GetSegmentIndexState_Call {
_c.Call.Return(_a0, _a1)
return _c
}
// GetSegmentInfo provides a mock function with given fields: ctx, req
func (_m *DataCoord) GetSegmentInfo(ctx context.Context, req *datapb.GetSegmentInfoRequest) (*datapb.GetSegmentInfoResponse, error) {
ret := _m.Called(ctx, req)
@ -1532,6 +1910,53 @@ func (_c *DataCoord_UnsetIsImportingState_Call) Return(_a0 *commonpb.Status, _a1
return _c
}
// UpdateChannelCheckpoint provides a mock function with given fields: ctx, req
func (_m *DataCoord) UpdateChannelCheckpoint(ctx context.Context, req *datapb.UpdateChannelCheckpointRequest) (*commonpb.Status, error) {
ret := _m.Called(ctx, req)
var r0 *commonpb.Status
if rf, ok := ret.Get(0).(func(context.Context, *datapb.UpdateChannelCheckpointRequest) *commonpb.Status); ok {
r0 = rf(ctx, req)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*commonpb.Status)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, *datapb.UpdateChannelCheckpointRequest) error); ok {
r1 = rf(ctx, req)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// DataCoord_UpdateChannelCheckpoint_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateChannelCheckpoint'
type DataCoord_UpdateChannelCheckpoint_Call struct {
*mock.Call
}
// UpdateChannelCheckpoint is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.UpdateChannelCheckpointRequest
func (_e *DataCoord_Expecter) UpdateChannelCheckpoint(ctx interface{}, req interface{}) *DataCoord_UpdateChannelCheckpoint_Call {
return &DataCoord_UpdateChannelCheckpoint_Call{Call: _e.mock.On("UpdateChannelCheckpoint", ctx, req)}
}
func (_c *DataCoord_UpdateChannelCheckpoint_Call) Run(run func(ctx context.Context, req *datapb.UpdateChannelCheckpointRequest)) *DataCoord_UpdateChannelCheckpoint_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(*datapb.UpdateChannelCheckpointRequest))
})
return _c
}
func (_c *DataCoord_UpdateChannelCheckpoint_Call) Return(_a0 *commonpb.Status, _a1 error) *DataCoord_UpdateChannelCheckpoint_Call {
_c.Call.Return(_a0, _a1)
return _c
}
// UpdateSegmentStatistics provides a mock function with given fields: ctx, req
func (_m *DataCoord) UpdateSegmentStatistics(ctx context.Context, req *datapb.UpdateSegmentStatisticsRequest) (*commonpb.Status, error) {
ret := _m.Called(ctx, req)

File diff suppressed because it is too large Load Diff

View File

@ -77,6 +77,8 @@ service DataCoord {
rpc DescribeIndex(index.DescribeIndexRequest) returns (index.DescribeIndexResponse) {}
// Deprecated: use DescribeIndex instead
rpc GetIndexBuildProgress(index.GetIndexBuildProgressRequest) returns (index.GetIndexBuildProgressResponse) {}
rpc GcConfirm(GcConfirmRequest) returns (GcConfirmResponse) {}
}
service DataNode {
@ -643,6 +645,16 @@ message AlterCollectionRequest {
repeated common.KeyValuePair properties = 5;
}
message GcConfirmRequest {
int64 collection_id = 1;
int64 partition_id = 2; // -1 means whole collection.
}
message GcConfirmResponse {
common.Status status = 1;
bool gc_finished = 2;
}
//message IndexInfo {
// int64 collectionID = 1;
// int64 fieldID = 2;

View File

@ -4781,6 +4781,100 @@ func (m *AlterCollectionRequest) GetProperties() []*commonpb.KeyValuePair {
return nil
}
type GcConfirmRequest struct {
CollectionId int64 `protobuf:"varint,1,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"`
PartitionId int64 `protobuf:"varint,2,opt,name=partition_id,json=partitionId,proto3" json:"partition_id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GcConfirmRequest) Reset() { *m = GcConfirmRequest{} }
func (m *GcConfirmRequest) String() string { return proto.CompactTextString(m) }
func (*GcConfirmRequest) ProtoMessage() {}
func (*GcConfirmRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_82cd95f524594f49, []int{74}
}
func (m *GcConfirmRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GcConfirmRequest.Unmarshal(m, b)
}
func (m *GcConfirmRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GcConfirmRequest.Marshal(b, m, deterministic)
}
func (m *GcConfirmRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_GcConfirmRequest.Merge(m, src)
}
func (m *GcConfirmRequest) XXX_Size() int {
return xxx_messageInfo_GcConfirmRequest.Size(m)
}
func (m *GcConfirmRequest) XXX_DiscardUnknown() {
xxx_messageInfo_GcConfirmRequest.DiscardUnknown(m)
}
var xxx_messageInfo_GcConfirmRequest proto.InternalMessageInfo
func (m *GcConfirmRequest) GetCollectionId() int64 {
if m != nil {
return m.CollectionId
}
return 0
}
func (m *GcConfirmRequest) GetPartitionId() int64 {
if m != nil {
return m.PartitionId
}
return 0
}
type GcConfirmResponse struct {
Status *commonpb.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"`
GcFinished bool `protobuf:"varint,2,opt,name=gc_finished,json=gcFinished,proto3" json:"gc_finished,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GcConfirmResponse) Reset() { *m = GcConfirmResponse{} }
func (m *GcConfirmResponse) String() string { return proto.CompactTextString(m) }
func (*GcConfirmResponse) ProtoMessage() {}
func (*GcConfirmResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_82cd95f524594f49, []int{75}
}
func (m *GcConfirmResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GcConfirmResponse.Unmarshal(m, b)
}
func (m *GcConfirmResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GcConfirmResponse.Marshal(b, m, deterministic)
}
func (m *GcConfirmResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_GcConfirmResponse.Merge(m, src)
}
func (m *GcConfirmResponse) XXX_Size() int {
return xxx_messageInfo_GcConfirmResponse.Size(m)
}
func (m *GcConfirmResponse) XXX_DiscardUnknown() {
xxx_messageInfo_GcConfirmResponse.DiscardUnknown(m)
}
var xxx_messageInfo_GcConfirmResponse proto.InternalMessageInfo
func (m *GcConfirmResponse) GetStatus() *commonpb.Status {
if m != nil {
return m.Status
}
return nil
}
func (m *GcConfirmResponse) GetGcFinished() bool {
if m != nil {
return m.GcFinished
}
return false
}
func init() {
proto.RegisterEnum("milvus.proto.data.SegmentType", SegmentType_name, SegmentType_value)
proto.RegisterEnum("milvus.proto.data.ChannelWatchState", ChannelWatchState_name, ChannelWatchState_value)
@ -4860,300 +4954,306 @@ func init() {
proto.RegisterType((*MarkSegmentsDroppedRequest)(nil), "milvus.proto.data.MarkSegmentsDroppedRequest")
proto.RegisterType((*SegmentReferenceLock)(nil), "milvus.proto.data.SegmentReferenceLock")
proto.RegisterType((*AlterCollectionRequest)(nil), "milvus.proto.data.AlterCollectionRequest")
proto.RegisterType((*GcConfirmRequest)(nil), "milvus.proto.data.GcConfirmRequest")
proto.RegisterType((*GcConfirmResponse)(nil), "milvus.proto.data.GcConfirmResponse")
}
func init() { proto.RegisterFile("data_coord.proto", fileDescriptor_82cd95f524594f49) }
var fileDescriptor_82cd95f524594f49 = []byte{
// 4597 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x3c, 0x4b, 0x8c, 0x1c, 0x49,
0x56, 0xce, 0xfa, 0x75, 0xd5, 0xab, 0x4f, 0x57, 0x87, 0x3d, 0xed, 0x72, 0xf9, 0x9f, 0xb6, 0xc7,
0x3d, 0x1e, 0x8f, 0xed, 0xf1, 0x30, 0x5a, 0xb3, 0xde, 0x99, 0xc5, 0xdd, 0x6d, 0x7b, 0x0a, 0xdc,
0xbd, 0xbd, 0xd9, 0xed, 0xb1, 0xb4, 0x8b, 0x54, 0xca, 0xae, 0x8c, 0xae, 0xce, 0xed, 0xaa, 0xcc,
0x72, 0x66, 0x56, 0xb7, 0x7b, 0x91, 0xd8, 0x01, 0x24, 0xa4, 0x41, 0x08, 0x10, 0x12, 0x02, 0x24,
0x0e, 0x88, 0xd3, 0xb2, 0x68, 0x11, 0xd2, 0x8a, 0x0b, 0x17, 0xae, 0x23, 0x38, 0x8c, 0x10, 0x12,
0x47, 0x8e, 0xc0, 0x9d, 0x2b, 0x07, 0x14, 0x9f, 0x8c, 0xfc, 0x45, 0x56, 0x65, 0x57, 0xd9, 0x63,
0x09, 0x6e, 0x15, 0x91, 0x2f, 0x5e, 0xbc, 0x88, 0xf7, 0x7f, 0x11, 0x51, 0xd0, 0x34, 0x74, 0x4f,
0xef, 0xf6, 0x6c, 0xdb, 0x31, 0xee, 0x8c, 0x1c, 0xdb, 0xb3, 0xd1, 0xd2, 0xd0, 0x1c, 0x1c, 0x8e,
0x5d, 0xd6, 0xba, 0x43, 0x3e, 0xb7, 0x6b, 0x3d, 0x7b, 0x38, 0xb4, 0x2d, 0xd6, 0xd5, 0x6e, 0x98,
0x96, 0x87, 0x1d, 0x4b, 0x1f, 0xf0, 0x76, 0x2d, 0x3c, 0xa0, 0x5d, 0x73, 0x7b, 0xfb, 0x78, 0xa8,
0xf3, 0xd6, 0x92, 0x69, 0x19, 0xf8, 0x55, 0x18, 0xbf, 0xba, 0x00, 0xc5, 0xc7, 0xc3, 0x91, 0x77,
0xac, 0xfe, 0x99, 0x02, 0xb5, 0x27, 0x83, 0xb1, 0xbb, 0xaf, 0xe1, 0x97, 0x63, 0xec, 0x7a, 0xe8,
0x1e, 0x14, 0x76, 0x75, 0x17, 0xb7, 0x94, 0x2b, 0xca, 0x4a, 0xf5, 0xfe, 0x85, 0x3b, 0x11, 0x42,
0x38, 0x09, 0x1b, 0x6e, 0x7f, 0x55, 0x77, 0xb1, 0x46, 0x21, 0x11, 0x82, 0x82, 0xb1, 0xdb, 0x59,
0x6f, 0xe5, 0xae, 0x28, 0x2b, 0x79, 0x8d, 0xfe, 0x46, 0x97, 0x00, 0x5c, 0xdc, 0x1f, 0x62, 0xcb,
0xeb, 0xac, 0xbb, 0xad, 0xfc, 0x95, 0xfc, 0x4a, 0x5e, 0x0b, 0xf5, 0x20, 0x15, 0x6a, 0x3d, 0x7b,
0x30, 0xc0, 0x3d, 0xcf, 0xb4, 0xad, 0xce, 0x7a, 0xab, 0x40, 0xc7, 0x46, 0xfa, 0xd4, 0xff, 0x50,
0xa0, 0xce, 0x49, 0x73, 0x47, 0xb6, 0xe5, 0x62, 0xf4, 0x11, 0x94, 0x5c, 0x4f, 0xf7, 0xc6, 0x2e,
0xa7, 0xee, 0xbc, 0x94, 0xba, 0x6d, 0x0a, 0xa2, 0x71, 0x50, 0x29, 0x79, 0xf1, 0xe9, 0xf3, 0xc9,
0xe9, 0x63, 0x4b, 0x28, 0x24, 0x96, 0xb0, 0x02, 0x8b, 0x7b, 0x84, 0xba, 0xed, 0x00, 0xa8, 0x48,
0x81, 0xe2, 0xdd, 0x04, 0x93, 0x67, 0x0e, 0xf1, 0xf7, 0xf6, 0xb6, 0xb1, 0x3e, 0x68, 0x95, 0xe8,
0x5c, 0xa1, 0x1e, 0xf5, 0x5f, 0x14, 0x68, 0x0a, 0x70, 0x9f, 0x0f, 0x67, 0xa0, 0xd8, 0xb3, 0xc7,
0x96, 0x47, 0x97, 0x5a, 0xd7, 0x58, 0x03, 0x5d, 0x85, 0x5a, 0x6f, 0x5f, 0xb7, 0x2c, 0x3c, 0xe8,
0x5a, 0xfa, 0x10, 0xd3, 0x45, 0x55, 0xb4, 0x2a, 0xef, 0xdb, 0xd4, 0x87, 0x38, 0xd3, 0xda, 0xae,
0x40, 0x75, 0xa4, 0x3b, 0x9e, 0x19, 0xd9, 0xfd, 0x70, 0x17, 0x6a, 0x43, 0xd9, 0x74, 0x3b, 0xc3,
0x91, 0xed, 0x78, 0xad, 0xe2, 0x15, 0x65, 0xa5, 0xac, 0x89, 0x36, 0x99, 0xc1, 0xa4, 0xbf, 0x76,
0x74, 0xf7, 0xa0, 0xb3, 0xce, 0x57, 0x14, 0xe9, 0x53, 0xff, 0x52, 0x81, 0xe5, 0x47, 0xae, 0x6b,
0xf6, 0xad, 0xc4, 0xca, 0x96, 0xa1, 0x64, 0xd9, 0x06, 0xee, 0xac, 0xd3, 0xa5, 0xe5, 0x35, 0xde,
0x42, 0xe7, 0xa1, 0x32, 0xc2, 0xd8, 0xe9, 0x3a, 0xf6, 0xc0, 0x5f, 0x58, 0x99, 0x74, 0x68, 0xf6,
0x00, 0xa3, 0xef, 0xc3, 0x92, 0x1b, 0x43, 0xc4, 0xe4, 0xaa, 0x7a, 0xff, 0xda, 0x9d, 0x84, 0xb2,
0xdc, 0x89, 0x4f, 0xaa, 0x25, 0x47, 0xab, 0x5f, 0xe4, 0xe0, 0xb4, 0x80, 0x63, 0xb4, 0x92, 0xdf,
0x64, 0xe7, 0x5d, 0xdc, 0x17, 0xe4, 0xb1, 0x46, 0x96, 0x9d, 0x17, 0x2c, 0xcb, 0x87, 0x59, 0x96,
0x41, 0xd4, 0xe3, 0xfc, 0x28, 0x26, 0xf9, 0x71, 0x19, 0xaa, 0xf8, 0xd5, 0xc8, 0x74, 0x70, 0x97,
0x08, 0x0e, 0xdd, 0xf2, 0x82, 0x06, 0xac, 0x6b, 0xc7, 0x1c, 0x86, 0x75, 0x63, 0x21, 0xb3, 0x6e,
0xa8, 0x7f, 0xa5, 0xc0, 0xd9, 0x04, 0x97, 0xb8, 0xb2, 0x69, 0xd0, 0xa4, 0x2b, 0x0f, 0x76, 0x86,
0xa8, 0x1d, 0xd9, 0xf0, 0x77, 0x27, 0x6d, 0x78, 0x00, 0xae, 0x25, 0xc6, 0x87, 0x88, 0xcc, 0x65,
0x27, 0xf2, 0x00, 0xce, 0x3e, 0xc5, 0x1e, 0x9f, 0x80, 0x7c, 0xc3, 0xee, 0xec, 0xc6, 0x2a, 0xaa,
0xd5, 0xb9, 0xb8, 0x56, 0xab, 0x7f, 0x97, 0x13, 0xba, 0x48, 0xa7, 0xea, 0x58, 0x7b, 0x36, 0xba,
0x00, 0x15, 0x01, 0xc2, 0xa5, 0x22, 0xe8, 0x40, 0xdf, 0x82, 0x22, 0xa1, 0x94, 0x89, 0x44, 0xe3,
0xfe, 0x55, 0xf9, 0x9a, 0x42, 0x38, 0x35, 0x06, 0x8f, 0x3a, 0xd0, 0x70, 0x3d, 0xdd, 0xf1, 0xba,
0x23, 0xdb, 0xa5, 0x7c, 0xa6, 0x82, 0x53, 0xbd, 0xaf, 0x46, 0x31, 0x08, 0x4b, 0xbf, 0xe1, 0xf6,
0xb7, 0x38, 0xa4, 0x56, 0xa7, 0x23, 0xfd, 0x26, 0x7a, 0x0c, 0x35, 0x6c, 0x19, 0x01, 0xa2, 0x42,
0x66, 0x44, 0x55, 0x6c, 0x19, 0x02, 0x4d, 0xc0, 0x9f, 0x62, 0x76, 0xfe, 0xfc, 0xbe, 0x02, 0xad,
0x24, 0x83, 0xe6, 0x31, 0xd9, 0x0f, 0xd9, 0x20, 0xcc, 0x18, 0x34, 0x51, 0xc3, 0x05, 0x93, 0x34,
0x3e, 0x44, 0xfd, 0x13, 0x05, 0xde, 0x09, 0xc8, 0xa1, 0x9f, 0xde, 0x94, 0xb4, 0xa0, 0x5b, 0xd0,
0x34, 0xad, 0xde, 0x60, 0x6c, 0xe0, 0xe7, 0xd6, 0x67, 0x58, 0x1f, 0x78, 0xfb, 0xc7, 0x94, 0x87,
0x65, 0x2d, 0xd1, 0xaf, 0xfe, 0x7b, 0x0e, 0x96, 0xe3, 0x74, 0xcd, 0xb3, 0x49, 0xbf, 0x04, 0x45,
0xd3, 0xda, 0xb3, 0xfd, 0x3d, 0xba, 0x34, 0x41, 0x29, 0xc9, 0x5c, 0x0c, 0x18, 0xd9, 0x80, 0x7c,
0x33, 0xd6, 0xdb, 0xc7, 0xbd, 0x83, 0x91, 0x6d, 0x52, 0x83, 0x45, 0x50, 0xfc, 0x8a, 0x04, 0x85,
0x9c, 0xe2, 0x3b, 0x6b, 0x0c, 0xc7, 0x9a, 0x40, 0xf1, 0xd8, 0xf2, 0x9c, 0x63, 0x6d, 0xa9, 0x17,
0xef, 0x6f, 0xef, 0xc3, 0xb2, 0x1c, 0x18, 0x35, 0x21, 0x7f, 0x80, 0x8f, 0xe9, 0x92, 0x2b, 0x1a,
0xf9, 0x89, 0x1e, 0x40, 0xf1, 0x50, 0x1f, 0x8c, 0x31, 0xb7, 0x0e, 0x59, 0xc4, 0x97, 0x0d, 0xf8,
0x76, 0xee, 0x81, 0xa2, 0x0e, 0xe1, 0xfc, 0x53, 0xec, 0x75, 0x2c, 0x17, 0x3b, 0xde, 0xaa, 0x69,
0x0d, 0xec, 0xfe, 0x96, 0xee, 0xed, 0xcf, 0x61, 0x2b, 0x22, 0x6a, 0x9f, 0x8b, 0xa9, 0xbd, 0xfa,
0x53, 0x05, 0x2e, 0xc8, 0xe7, 0xe3, 0x5c, 0x6d, 0x43, 0x79, 0xcf, 0xc4, 0x03, 0x83, 0x88, 0x8e,
0x42, 0x45, 0x47, 0xb4, 0x89, 0xcd, 0x18, 0x11, 0x60, 0xce, 0xbc, 0xab, 0x29, 0x2b, 0xdd, 0xf6,
0x1c, 0xd3, 0xea, 0x3f, 0x33, 0x5d, 0x4f, 0x63, 0xf0, 0x21, 0x51, 0xc9, 0x67, 0xd7, 0xd0, 0xdf,
0x53, 0xe0, 0xd2, 0x53, 0xec, 0xad, 0x09, 0x97, 0x43, 0xbe, 0x9b, 0xae, 0x67, 0xf6, 0xdc, 0xd7,
0x1b, 0xf6, 0x65, 0x88, 0x3d, 0xd4, 0x3f, 0x54, 0xe0, 0x72, 0x2a, 0x31, 0x7c, 0xeb, 0xb8, 0x49,
0xf5, 0x1d, 0x8e, 0xdc, 0xa4, 0xfe, 0x1a, 0x3e, 0xfe, 0x9c, 0x30, 0x7f, 0x4b, 0x37, 0x1d, 0x66,
0x52, 0x67, 0x74, 0x30, 0x3f, 0x57, 0xe0, 0xe2, 0x53, 0xec, 0x6d, 0xf9, 0xee, 0xf6, 0x2d, 0xee,
0x0e, 0x81, 0x09, 0xb9, 0x7d, 0x3f, 0xee, 0x8c, 0xf4, 0xa9, 0x7f, 0xc0, 0xd8, 0x29, 0xa5, 0xf7,
0xad, 0x6c, 0xe0, 0x25, 0xaa, 0x09, 0x21, 0x3b, 0xc1, 0x35, 0x9e, 0x6f, 0x9f, 0xfa, 0x65, 0x11,
0x6a, 0x9f, 0x73, 0xd3, 0x40, 0x1d, 0x6a, 0x7c, 0x27, 0x14, 0x79, 0x4c, 0x14, 0x0a, 0xae, 0x64,
0xf1, 0xd6, 0x53, 0xa8, 0xbb, 0x18, 0x1f, 0xcc, 0xe2, 0x3e, 0x6b, 0x64, 0xa0, 0x70, 0x7b, 0xcf,
0x60, 0x69, 0x6c, 0xd1, 0xa8, 0x1d, 0x1b, 0x7c, 0x15, 0x6c, 0xe7, 0xa7, 0x9b, 0xd5, 0xe4, 0x40,
0xf4, 0x19, 0x4f, 0x0c, 0x42, 0xb8, 0x8a, 0x99, 0x70, 0xc5, 0x87, 0xa1, 0x0e, 0x34, 0x0d, 0xc7,
0x1e, 0x8d, 0xb0, 0xd1, 0x75, 0x7d, 0x54, 0xa5, 0x6c, 0xa8, 0xf8, 0x38, 0x81, 0xea, 0x1e, 0x9c,
0x8e, 0x53, 0xda, 0x31, 0x48, 0xac, 0x48, 0xc4, 0x4b, 0xf6, 0x09, 0xdd, 0x86, 0xa5, 0x24, 0x7c,
0x99, 0xc2, 0x27, 0x3f, 0xa0, 0x0f, 0x00, 0xc5, 0x48, 0x25, 0xe0, 0x15, 0x06, 0x1e, 0x25, 0x86,
0x83, 0xd3, 0xa4, 0x34, 0x0a, 0x0e, 0x0c, 0x9c, 0x7f, 0x09, 0x81, 0x77, 0x88, 0x9f, 0x8d, 0x80,
0xbb, 0xad, 0x6a, 0xb6, 0x8d, 0x88, 0x22, 0x73, 0xd5, 0x2f, 0x15, 0x58, 0x7e, 0xa1, 0x7b, 0xbd,
0xfd, 0xf5, 0x21, 0x97, 0xd2, 0x39, 0xb4, 0xfc, 0x13, 0xa8, 0x1c, 0x72, 0x89, 0xf4, 0x4d, 0xf9,
0x65, 0x09, 0x41, 0x61, 0xd9, 0xd7, 0x82, 0x11, 0x24, 0x49, 0x3a, 0xf3, 0x24, 0x94, 0x2c, 0xbe,
0x05, 0x7b, 0x33, 0x25, 0xcb, 0x55, 0x5f, 0x01, 0x70, 0xe2, 0x36, 0xdc, 0xfe, 0x0c, 0x74, 0x3d,
0x80, 0x05, 0x8e, 0x8d, 0x1b, 0x94, 0x69, 0x0c, 0xf3, 0xc1, 0xd5, 0x9f, 0x95, 0xa0, 0x1a, 0xfa,
0x80, 0x1a, 0x90, 0x13, 0x96, 0x22, 0x27, 0x59, 0x5d, 0x6e, 0x7a, 0x5e, 0x95, 0x4f, 0xe6, 0x55,
0x37, 0xa0, 0x61, 0x52, 0x0f, 0xde, 0xe5, 0x5c, 0xa1, 0xa1, 0x73, 0x45, 0xab, 0xb3, 0x5e, 0x2e,
0x22, 0xe8, 0x12, 0x54, 0xad, 0xf1, 0xb0, 0x6b, 0xef, 0x75, 0x1d, 0xfb, 0xc8, 0xe5, 0x09, 0x5a,
0xc5, 0x1a, 0x0f, 0xbf, 0xb7, 0xa7, 0xd9, 0x47, 0x6e, 0x90, 0x03, 0x94, 0x4e, 0x98, 0x03, 0x5c,
0x82, 0xea, 0x50, 0x7f, 0x45, 0xb0, 0x76, 0xad, 0xf1, 0x90, 0xe6, 0x6e, 0x79, 0xad, 0x32, 0xd4,
0x5f, 0x69, 0xf6, 0xd1, 0xe6, 0x78, 0x88, 0x56, 0xa0, 0x39, 0xd0, 0x5d, 0xaf, 0x1b, 0x4e, 0xfe,
0xca, 0x34, 0xf9, 0x6b, 0x90, 0xfe, 0xc7, 0x41, 0x02, 0x98, 0xcc, 0x26, 0x2a, 0x73, 0x64, 0x13,
0xc6, 0x70, 0x10, 0x20, 0x82, 0xec, 0xd9, 0x84, 0x31, 0x1c, 0x08, 0x34, 0x0f, 0x60, 0x61, 0x97,
0xc6, 0x45, 0x93, 0x94, 0xf5, 0x09, 0x09, 0x89, 0x58, 0xf8, 0xa4, 0xf9, 0xe0, 0xe8, 0x3b, 0x50,
0xa1, 0xee, 0x88, 0x8e, 0xad, 0x65, 0x1a, 0x1b, 0x0c, 0x20, 0xa3, 0x0d, 0x3c, 0xf0, 0x74, 0x3a,
0xba, 0x9e, 0x6d, 0xb4, 0x18, 0x40, 0x2c, 0x65, 0xcf, 0xc1, 0xba, 0x87, 0x8d, 0xd5, 0xe3, 0x35,
0x7b, 0x38, 0xd2, 0xa9, 0x30, 0xb5, 0x1a, 0x34, 0xac, 0x97, 0x7d, 0x42, 0xef, 0x42, 0xa3, 0x27,
0x5a, 0x4f, 0x1c, 0x7b, 0xd8, 0x5a, 0xa4, 0x7a, 0x14, 0xeb, 0x45, 0x17, 0x01, 0x7c, 0x1b, 0xa9,
0x7b, 0xad, 0x26, 0xe5, 0x62, 0x85, 0xf7, 0x3c, 0xa2, 0xb5, 0x1d, 0xd3, 0xed, 0xb2, 0x2a, 0x8a,
0x69, 0xf5, 0x5b, 0x4b, 0x74, 0xc6, 0xaa, 0x5f, 0x76, 0x31, 0xad, 0x3e, 0x3a, 0x0b, 0x0b, 0xa6,
0xdb, 0xdd, 0xd3, 0x0f, 0x70, 0x0b, 0xd1, 0xaf, 0x25, 0xd3, 0x7d, 0xa2, 0x1f, 0x60, 0xf5, 0x27,
0x70, 0x26, 0x90, 0xae, 0x10, 0x27, 0x93, 0x42, 0xa1, 0xcc, 0x2a, 0x14, 0x93, 0xa3, 0xe1, 0xaf,
0x0b, 0xb0, 0xbc, 0xad, 0x1f, 0xe2, 0x37, 0x1f, 0x78, 0x67, 0x32, 0x6b, 0xcf, 0x60, 0x89, 0xc6,
0xda, 0xf7, 0x43, 0xf4, 0x4c, 0xf0, 0xe8, 0x61, 0x51, 0x48, 0x0e, 0x44, 0xdf, 0x25, 0xa1, 0x08,
0xee, 0x1d, 0x6c, 0x91, 0xe4, 0xc5, 0xf7, 0xe6, 0x17, 0x25, 0x78, 0xd6, 0x04, 0x94, 0x16, 0x1e,
0x81, 0xb6, 0x60, 0x31, 0xca, 0x06, 0xdf, 0x8f, 0xdf, 0x9c, 0x98, 0xd9, 0x06, 0xbb, 0xaf, 0x35,
0x22, 0xcc, 0x70, 0x51, 0x0b, 0x16, 0xb8, 0x13, 0xa6, 0x36, 0xa3, 0xac, 0xf9, 0x4d, 0xb4, 0x05,
0xa7, 0xd9, 0x0a, 0xb6, 0xb9, 0x42, 0xb0, 0xc5, 0x97, 0x33, 0x2d, 0x5e, 0x36, 0x34, 0xaa, 0x4f,
0x95, 0x93, 0xea, 0x53, 0x0b, 0x16, 0xb8, 0x8c, 0x53, 0x3b, 0x52, 0xd6, 0xfc, 0x26, 0x61, 0x73,
0x20, 0xed, 0x55, 0xfa, 0x2d, 0xe8, 0x20, 0x49, 0x0b, 0x04, 0xfb, 0x39, 0xa5, 0x06, 0xf3, 0x29,
0x94, 0x85, 0x84, 0x67, 0x4f, 0x1e, 0xc5, 0x98, 0xb8, 0x7d, 0xcf, 0xc7, 0xec, 0xbb, 0xfa, 0xcf,
0x0a, 0xd4, 0xd6, 0xc9, 0x92, 0x9e, 0xd9, 0x7d, 0xea, 0x8d, 0x6e, 0x40, 0xc3, 0xc1, 0x3d, 0xdb,
0x31, 0xba, 0xd8, 0xf2, 0x1c, 0x13, 0xb3, 0xd4, 0xbd, 0xa0, 0xd5, 0x59, 0xef, 0x63, 0xd6, 0x49,
0xc0, 0x88, 0xc9, 0x76, 0x3d, 0x7d, 0x38, 0xea, 0xee, 0x11, 0xd3, 0x90, 0x63, 0x60, 0xa2, 0x97,
0x5a, 0x86, 0xab, 0x50, 0x0b, 0xc0, 0x3c, 0x9b, 0xce, 0x5f, 0xd0, 0xaa, 0xa2, 0x6f, 0xc7, 0x46,
0xd7, 0xa1, 0x41, 0xf7, 0xb4, 0x3b, 0xb0, 0xfb, 0x5d, 0x92, 0x0b, 0x72, 0x47, 0x55, 0x33, 0x38,
0x59, 0x84, 0x57, 0x51, 0x28, 0xd7, 0xfc, 0x31, 0xe6, 0xae, 0x4a, 0x40, 0x6d, 0x9b, 0x3f, 0xc6,
0xea, 0x3f, 0x29, 0x50, 0x5f, 0xd7, 0x3d, 0x7d, 0xd3, 0x36, 0xf0, 0xce, 0x8c, 0x8e, 0x3d, 0x43,
0x3d, 0xf4, 0x02, 0x54, 0xc4, 0x0a, 0xf8, 0x92, 0x82, 0x0e, 0xf4, 0x04, 0x1a, 0x7e, 0x2c, 0xd7,
0x65, 0xb9, 0x4a, 0x21, 0x35, 0x80, 0x0a, 0x79, 0x4e, 0x57, 0xab, 0xfb, 0xc3, 0x68, 0x53, 0x7d,
0x02, 0xb5, 0xf0, 0x67, 0x32, 0xeb, 0x76, 0x5c, 0x50, 0x44, 0x07, 0x91, 0xc6, 0xcd, 0xf1, 0x90,
0xf0, 0x94, 0x1b, 0x16, 0xbf, 0xa9, 0xfe, 0x8e, 0x02, 0x75, 0xee, 0xee, 0xb7, 0xc5, 0xc9, 0x01,
0x5d, 0x1a, 0xab, 0x50, 0xd0, 0xdf, 0xe8, 0xdb, 0xd1, 0x62, 0xdf, 0x75, 0xa9, 0x11, 0xa0, 0x48,
0x68, 0x90, 0x19, 0xf1, 0xf5, 0x59, 0xb2, 0xe3, 0x2f, 0x88, 0xa0, 0x71, 0xd6, 0x50, 0x41, 0x6b,
0xc1, 0x82, 0x6e, 0x18, 0x0e, 0x76, 0x5d, 0x4e, 0x87, 0xdf, 0x24, 0x5f, 0x0e, 0xb1, 0xe3, 0xfa,
0x22, 0x9f, 0xd7, 0xfc, 0x26, 0xfa, 0x0e, 0x94, 0x45, 0x54, 0xca, 0x4a, 0x3b, 0x57, 0xd2, 0xe9,
0xe4, 0xb9, 0x9c, 0x18, 0xa1, 0xfe, 0x7d, 0x0e, 0x1a, 0x7c, 0xc3, 0x56, 0xb9, 0x3f, 0x9e, 0xac,
0x7c, 0xab, 0x50, 0xdb, 0x0b, 0x74, 0x7f, 0x52, 0x41, 0x2a, 0x6c, 0x22, 0x22, 0x63, 0xa6, 0x29,
0x60, 0x34, 0x22, 0x28, 0xcc, 0x15, 0x11, 0x14, 0x4f, 0x6a, 0xc1, 0x92, 0x31, 0x62, 0x49, 0x12,
0x23, 0xaa, 0xbf, 0x0e, 0xd5, 0x10, 0x02, 0x6a, 0xa1, 0x59, 0xb9, 0x87, 0xef, 0x98, 0xdf, 0x44,
0x1f, 0x05, 0x71, 0x11, 0xdb, 0xaa, 0x73, 0x12, 0x5a, 0x62, 0x21, 0x91, 0xfa, 0x8f, 0x0a, 0x94,
0x38, 0xe6, 0xcb, 0x50, 0xe5, 0x46, 0x87, 0xc6, 0x8c, 0x0c, 0x3b, 0xf0, 0x2e, 0x12, 0x34, 0xbe,
0x3e, 0xab, 0x73, 0x0e, 0xca, 0x31, 0x7b, 0xb3, 0xc0, 0xdd, 0x82, 0xff, 0x29, 0x64, 0x64, 0xc8,
0x27, 0x62, 0x5f, 0xd0, 0x19, 0x28, 0x0e, 0xec, 0xbe, 0x38, 0x19, 0x62, 0x0d, 0xf5, 0x2b, 0x85,
0x16, 0xf2, 0x35, 0xdc, 0xb3, 0x0f, 0xb1, 0x73, 0x3c, 0x7f, 0x05, 0xf4, 0x61, 0x48, 0xcc, 0x33,
0x26, 0x5f, 0x62, 0x00, 0x7a, 0x18, 0x30, 0x21, 0x2f, 0xab, 0x91, 0x84, 0xed, 0x0e, 0x17, 0xd2,
0x80, 0x19, 0x7f, 0xa4, 0xd0, 0x5a, 0x6e, 0x74, 0x29, 0xb3, 0x46, 0x3b, 0xaf, 0x25, 0x91, 0x51,
0xbf, 0x56, 0xa0, 0x1d, 0x14, 0x61, 0xdc, 0xd5, 0xe3, 0x79, 0x4f, 0x4a, 0x5e, 0x4f, 0x7e, 0xf5,
0xcb, 0xa2, 0x94, 0x4f, 0x94, 0x36, 0x53, 0x66, 0xe4, 0x17, 0xf2, 0x2d, 0x5a, 0xcf, 0x4d, 0x2e,
0x68, 0x1e, 0x91, 0x69, 0x43, 0x59, 0x14, 0x10, 0x58, 0x39, 0x5f, 0xb4, 0x89, 0x86, 0x9d, 0x7b,
0x8a, 0xbd, 0x27, 0xd1, 0x22, 0xcc, 0xdb, 0xde, 0xc0, 0xf0, 0x11, 0xc3, 0x3e, 0x3f, 0x62, 0x28,
0xc4, 0x8e, 0x18, 0x78, 0xbf, 0x3a, 0xa4, 0x22, 0x90, 0x58, 0xc0, 0x9b, 0xda, 0xb0, 0xdf, 0x55,
0xa0, 0xc5, 0x67, 0xa1, 0x73, 0x92, 0x94, 0x68, 0x80, 0x3d, 0x6c, 0x7c, 0xd3, 0xa5, 0x82, 0xff,
0x51, 0xa0, 0x19, 0xf6, 0xba, 0xd4, 0x71, 0x7e, 0x0c, 0x45, 0x5a, 0x69, 0xe1, 0x14, 0x4c, 0x35,
0x0d, 0x0c, 0x9a, 0x98, 0x6d, 0x1a, 0x6a, 0xef, 0x88, 0x00, 0x81, 0x37, 0x03, 0xd7, 0x9f, 0x3f,
0xb9, 0xeb, 0xe7, 0xa1, 0x90, 0x3d, 0x26, 0x78, 0xd9, 0x09, 0x70, 0xd0, 0x81, 0x3e, 0x81, 0x12,
0xbb, 0xb0, 0xc1, 0x8f, 0xdd, 0x6e, 0x44, 0x51, 0xf3, 0xcb, 0x1c, 0xa1, 0x8a, 0x39, 0xed, 0xd0,
0xf8, 0x20, 0xf5, 0x57, 0x61, 0x39, 0xc8, 0x46, 0xd9, 0xb4, 0xb3, 0x0a, 0xad, 0xfa, 0x6f, 0x0a,
0x9c, 0xde, 0x3e, 0xb6, 0x7a, 0x71, 0xf1, 0x5f, 0x86, 0xd2, 0x68, 0xa0, 0x07, 0xb5, 0x5a, 0xde,
0xa2, 0x61, 0x20, 0x9b, 0x1b, 0x1b, 0xc4, 0x87, 0xb0, 0x3d, 0xab, 0x8a, 0xbe, 0x1d, 0x7b, 0xaa,
0x6b, 0xbf, 0x21, 0xd2, 0x67, 0x6c, 0x30, 0x6f, 0xc5, 0xca, 0x50, 0x75, 0xd1, 0x4b, 0xbd, 0xd5,
0x27, 0x00, 0xd4, 0xa1, 0x77, 0x4f, 0xe2, 0xc4, 0xe9, 0x88, 0x67, 0xc4, 0x64, 0xff, 0x22, 0x07,
0xad, 0xd0, 0x2e, 0x7d, 0xd3, 0xf1, 0x4d, 0x4a, 0x56, 0x96, 0x7f, 0x4d, 0x59, 0x59, 0x61, 0xfe,
0x98, 0xa6, 0x28, 0x8b, 0x69, 0x7e, 0x2b, 0x0f, 0x8d, 0x60, 0xd7, 0xb6, 0x06, 0xba, 0x95, 0x2a,
0x09, 0xdb, 0x22, 0x9e, 0x8f, 0xee, 0xd3, 0xfb, 0x32, 0x3d, 0x49, 0x61, 0x84, 0x16, 0x43, 0x81,
0x2e, 0x52, 0xa6, 0x3b, 0x1e, 0x2b, 0x7c, 0xf1, 0x1c, 0x82, 0x29, 0xa4, 0x39, 0xc4, 0xe8, 0x36,
0x20, 0xae, 0x45, 0x5d, 0xd3, 0xea, 0xba, 0xb8, 0x67, 0x5b, 0x06, 0xd3, 0xaf, 0xa2, 0xd6, 0xe4,
0x5f, 0x3a, 0xd6, 0x36, 0xeb, 0x47, 0x1f, 0x43, 0xc1, 0x3b, 0x1e, 0xb1, 0x68, 0xa5, 0x21, 0xf5,
0xf7, 0x01, 0x5d, 0x3b, 0xc7, 0x23, 0xac, 0x51, 0x70, 0xff, 0xfa, 0x8e, 0xe7, 0xe8, 0x87, 0x3c,
0xf4, 0x2b, 0x68, 0xa1, 0x1e, 0x62, 0x31, 0xfc, 0x3d, 0x5c, 0x60, 0x21, 0x12, 0x6f, 0x32, 0xc9,
0xf6, 0x95, 0xb6, 0xeb, 0x79, 0x03, 0x5a, 0xba, 0xa3, 0x92, 0xed, 0xf7, 0xee, 0x78, 0x03, 0xb2,
0x48, 0xcf, 0xf6, 0xf4, 0x01, 0xd3, 0x8f, 0x0a, 0xb7, 0x0e, 0xa4, 0x87, 0x26, 0x26, 0xff, 0x9a,
0x83, 0x66, 0x40, 0x98, 0x86, 0xdd, 0xf1, 0x20, 0x5d, 0x1f, 0x27, 0x97, 0x4e, 0xa6, 0xa9, 0xe2,
0x77, 0xa1, 0xca, 0xa5, 0xe2, 0x04, 0x52, 0x05, 0x6c, 0xc8, 0xb3, 0x09, 0x62, 0x5e, 0x7c, 0x4d,
0x62, 0x5e, 0x9a, 0xa1, 0xf8, 0x20, 0xe7, 0x8d, 0xfa, 0x53, 0x05, 0xde, 0x49, 0x58, 0xcd, 0x89,
0x5b, 0x3b, 0x39, 0xf5, 0xe3, 0xd6, 0x34, 0x8e, 0x92, 0xdb, 0xff, 0x87, 0x50, 0x72, 0x28, 0x76,
0x7e, 0x46, 0x75, 0x6d, 0xa2, 0xf0, 0x31, 0x42, 0x34, 0x3e, 0x44, 0xfd, 0x63, 0x05, 0xce, 0x26,
0x49, 0x9d, 0xc3, 0xa9, 0xaf, 0xc2, 0x02, 0x43, 0xed, 0xeb, 0xe8, 0xca, 0x64, 0x1d, 0x0d, 0x36,
0x47, 0xf3, 0x07, 0xaa, 0xdb, 0xb0, 0xec, 0xfb, 0xfe, 0x60, 0xeb, 0x37, 0xb0, 0xa7, 0x4f, 0x48,
0x7c, 0x2e, 0x43, 0x95, 0x45, 0xd0, 0x2c, 0xa1, 0x60, 0x25, 0x03, 0xd8, 0x15, 0x95, 0x36, 0xf5,
0xbf, 0x14, 0x38, 0x43, 0x9d, 0x67, 0xfc, 0x68, 0x26, 0xcb, 0x81, 0xa1, 0x2a, 0x2a, 0x12, 0x9b,
0xfa, 0x90, 0xdf, 0x1d, 0xa9, 0x68, 0x91, 0x3e, 0xd4, 0x49, 0x16, 0xe2, 0xa4, 0x09, 0x72, 0x70,
0x42, 0x4a, 0x92, 0x71, 0x7a, 0x40, 0x1a, 0xaf, 0xc0, 0x05, 0x4e, 0xbb, 0x30, 0x8b, 0xd3, 0x7e,
0x06, 0xef, 0xc4, 0x56, 0x3a, 0x07, 0x47, 0xd5, 0xbf, 0x56, 0x08, 0x3b, 0x22, 0x77, 0x70, 0x66,
0x0f, 0x5c, 0x2f, 0x8a, 0x33, 0xa1, 0xae, 0x69, 0xc4, 0x8d, 0x88, 0x81, 0x3e, 0x85, 0x8a, 0x85,
0x8f, 0xba, 0xe1, 0x58, 0x28, 0x43, 0x54, 0x5f, 0xb6, 0xf0, 0x11, 0xfd, 0xa5, 0x6e, 0xc2, 0xd9,
0x04, 0xa9, 0xf3, 0xac, 0xfd, 0x1f, 0x14, 0x38, 0xb7, 0xee, 0xd8, 0xa3, 0xcf, 0x4d, 0xc7, 0x1b,
0xeb, 0x83, 0xe8, 0xd9, 0xf3, 0x9b, 0xa9, 0x6c, 0x7d, 0x16, 0x8a, 0x8a, 0x99, 0xfc, 0xdc, 0x96,
0x68, 0x50, 0x92, 0x28, 0xbe, 0xe8, 0x50, 0x0c, 0xfd, 0x9f, 0x79, 0x19, 0xf1, 0x1c, 0x6e, 0x4a,
0x5c, 0x92, 0x25, 0xc1, 0x90, 0x16, 0xc2, 0xf3, 0xb3, 0x16, 0xc2, 0x53, 0xcc, 0x7b, 0xe1, 0x35,
0x99, 0xf7, 0x13, 0x57, 0x66, 0x3e, 0x83, 0xe8, 0x21, 0x05, 0xf5, 0xce, 0x33, 0x9d, 0x6e, 0xac,
0x02, 0x04, 0x05, 0x7b, 0x7e, 0x85, 0x32, 0x0b, 0x9a, 0xd0, 0x28, 0xc2, 0x2d, 0xe1, 0x4a, 0xb9,
0xa7, 0x0f, 0x95, 0x90, 0xbf, 0x0f, 0x6d, 0x99, 0x94, 0xce, 0x23, 0xf9, 0xbf, 0xc8, 0x01, 0x74,
0xc4, 0xad, 0xdb, 0xd9, 0x7c, 0xc1, 0x35, 0x08, 0x45, 0x23, 0x81, 0xbe, 0x87, 0xa5, 0xc8, 0x20,
0x2a, 0x21, 0x72, 0x52, 0x02, 0x93, 0xc8, 0x53, 0x0d, 0x8a, 0x27, 0xa4, 0x35, 0x4c, 0x28, 0xe2,
0xe6, 0xf7, 0x3c, 0x54, 0x1c, 0xfb, 0xa8, 0x4b, 0xd4, 0xcc, 0xf0, 0xaf, 0x15, 0x3b, 0xf6, 0x11,
0x51, 0x3e, 0x03, 0x9d, 0x85, 0x05, 0x4f, 0x77, 0x0f, 0x08, 0x7e, 0x56, 0x37, 0x2a, 0x91, 0x66,
0xc7, 0x40, 0x67, 0xa0, 0xb8, 0x67, 0x0e, 0x30, 0xbb, 0xad, 0x50, 0xd1, 0x58, 0x03, 0x7d, 0xcb,
0xbf, 0xff, 0x56, 0xce, 0x7c, 0xc5, 0x85, 0xc2, 0xab, 0x5f, 0x29, 0xb0, 0x18, 0xec, 0x1a, 0x35,
0x40, 0xc4, 0xa6, 0x51, 0x7b, 0xb6, 0x66, 0x1b, 0xcc, 0x54, 0x34, 0x52, 0x3c, 0x02, 0x1b, 0xc8,
0xac, 0x56, 0x30, 0x64, 0x52, 0x9a, 0x4c, 0xd6, 0x45, 0x16, 0x6d, 0x1a, 0xfe, 0x45, 0xf8, 0x92,
0x63, 0x1f, 0x75, 0x0c, 0xb1, 0x1b, 0xec, 0xce, 0x30, 0x4b, 0x0a, 0xc9, 0x6e, 0xac, 0xd1, 0x6b,
0xc3, 0xd7, 0xa0, 0x8e, 0x1d, 0xc7, 0x76, 0xba, 0x43, 0xec, 0xba, 0x7a, 0x1f, 0xf3, 0xf8, 0xbc,
0x46, 0x3b, 0x37, 0x58, 0x9f, 0xfa, 0xa7, 0x05, 0x68, 0x04, 0x4b, 0xf1, 0x8f, 0xc9, 0x4d, 0xc3,
0x3f, 0x26, 0x37, 0x09, 0xeb, 0xc0, 0x61, 0xa6, 0x50, 0x30, 0x77, 0x35, 0xd7, 0x52, 0xb4, 0x0a,
0xef, 0xed, 0x18, 0xc4, 0x2d, 0x13, 0x25, 0xb3, 0x6c, 0x03, 0x07, 0xcc, 0x05, 0xbf, 0x8b, 0xf3,
0x36, 0x22, 0x23, 0x85, 0x0c, 0x32, 0x52, 0xcc, 0x20, 0x23, 0x25, 0x89, 0x8c, 0x2c, 0x43, 0x69,
0x77, 0xdc, 0x3b, 0xc0, 0x1e, 0x8f, 0xd8, 0x78, 0x2b, 0x2a, 0x3b, 0xe5, 0x98, 0xec, 0x08, 0x11,
0xa9, 0x84, 0x45, 0xe4, 0x3c, 0x54, 0xd8, 0x79, 0x6d, 0xd7, 0x73, 0xe9, 0xe1, 0x53, 0x5e, 0x2b,
0xb3, 0x8e, 0x1d, 0x17, 0x3d, 0xf0, 0xc3, 0xb9, 0xaa, 0x4c, 0xd9, 0xa9, 0xd5, 0x89, 0x49, 0x89,
0x1f, 0xcc, 0xdd, 0x84, 0xc5, 0xd0, 0x76, 0x50, 0x1f, 0x51, 0xa3, 0xa4, 0x86, 0xa2, 0x7d, 0xea,
0x26, 0x6e, 0x40, 0x23, 0xd8, 0x12, 0x0a, 0x57, 0x67, 0x49, 0x96, 0xe8, 0xa5, 0x60, 0x42, 0x92,
0x1b, 0x27, 0x93, 0x64, 0x74, 0x0e, 0xca, 0x3c, 0x3b, 0x72, 0x5b, 0x8b, 0x91, 0x62, 0x85, 0xfa,
0x23, 0x40, 0x01, 0xf5, 0xf3, 0x45, 0x8b, 0x31, 0xf1, 0xc8, 0xc5, 0xc5, 0x43, 0xfd, 0x99, 0x02,
0x4b, 0xe1, 0xc9, 0x66, 0x75, 0xbc, 0x9f, 0x42, 0x95, 0x1d, 0xff, 0x75, 0x89, 0xe2, 0xf3, 0x22,
0xd0, 0xc5, 0x89, 0x7c, 0xd1, 0x20, 0x78, 0x75, 0x40, 0xc4, 0xeb, 0xc8, 0x76, 0x0e, 0x4c, 0xab,
0xdf, 0x25, 0x94, 0xf9, 0xea, 0x56, 0xe3, 0x9d, 0x9b, 0xa4, 0x4f, 0xfd, 0x52, 0x81, 0x4b, 0xcf,
0x47, 0x86, 0xee, 0xe1, 0x50, 0x04, 0x32, 0xef, 0x6d, 0xbf, 0x8f, 0xfd, 0xeb, 0x76, 0xb9, 0x6c,
0x47, 0x58, 0x0c, 0x5a, 0xfd, 0x5b, 0x41, 0x4b, 0xe2, 0x8a, 0xec, 0xec, 0xb4, 0xb4, 0xa1, 0x7c,
0xc8, 0xd1, 0xf9, 0xaf, 0x28, 0xfc, 0x76, 0xe4, 0x98, 0x34, 0x7f, 0xf2, 0x63, 0x52, 0x75, 0x03,
0xce, 0x69, 0xd8, 0xc5, 0x96, 0x11, 0x59, 0xcd, 0xcc, 0xc5, 0xa6, 0x11, 0xb4, 0x65, 0xe8, 0xe6,
0x11, 0x56, 0x16, 0xbb, 0x76, 0x1d, 0x82, 0xd6, 0xe3, 0xa6, 0x98, 0x84, 0x4c, 0x74, 0x1e, 0x4f,
0xfd, 0x9b, 0x1c, 0x9c, 0x7d, 0x64, 0x18, 0xdc, 0x8a, 0xf3, 0x68, 0xec, 0x4d, 0x05, 0xca, 0xf1,
0x40, 0x32, 0x9f, 0x0c, 0x24, 0x5f, 0x97, 0x65, 0xe5, 0x3e, 0xc6, 0x1a, 0x0f, 0x7d, 0xdf, 0xe9,
0xb0, 0xfb, 0x43, 0x0f, 0xf9, 0xb9, 0x19, 0x49, 0xe8, 0xa9, 0xff, 0x9c, 0x1e, 0x5f, 0x95, 0xfd,
0xa2, 0x99, 0x3a, 0x82, 0x56, 0x72, 0xb3, 0xe6, 0x34, 0x25, 0xfe, 0x8e, 0x8c, 0x6c, 0x56, 0x60,
0xad, 0x91, 0x10, 0x8a, 0x76, 0x6d, 0xd9, 0xae, 0xfa, 0xdf, 0x39, 0x68, 0x6d, 0xeb, 0x87, 0xf8,
0xff, 0x0f, 0x83, 0x7e, 0x00, 0x67, 0x5c, 0xfd, 0x10, 0x77, 0x43, 0x89, 0x71, 0xd7, 0xc1, 0x2f,
0x79, 0x08, 0xfa, 0x9e, 0xcc, 0x92, 0x48, 0xaf, 0xd9, 0x68, 0x4b, 0x6e, 0xa4, 0x5f, 0xc3, 0x2f,
0xd1, 0xbb, 0xb0, 0x18, 0xbe, 0xc7, 0x45, 0x48, 0x2b, 0xd3, 0x2d, 0xaf, 0x87, 0xae, 0x69, 0x75,
0x0c, 0xf5, 0x25, 0x5c, 0x78, 0x6e, 0xb9, 0xd8, 0xeb, 0x04, 0x57, 0x8d, 0xe6, 0x4c, 0x21, 0x2f,
0x43, 0x35, 0xd8, 0xf8, 0xc4, 0xcb, 0x09, 0xc3, 0x55, 0x6d, 0x68, 0x6f, 0xe8, 0xce, 0x81, 0x5f,
0x66, 0x5e, 0x67, 0x57, 0x42, 0xde, 0xe0, 0x84, 0x7b, 0xe2, 0x86, 0x94, 0x86, 0xf7, 0xb0, 0x83,
0xad, 0x1e, 0x7e, 0x66, 0xf7, 0x0e, 0x48, 0xb8, 0xe1, 0xb1, 0x67, 0x6c, 0x4a, 0x28, 0xe8, 0x5c,
0x0f, 0xbd, 0x52, 0xcb, 0x45, 0x5e, 0xa9, 0x4d, 0x79, 0xd9, 0xa8, 0xfe, 0x3c, 0x07, 0xcb, 0x8f,
0x06, 0x1e, 0x76, 0x82, 0xcc, 0xff, 0x24, 0x45, 0x8c, 0xa0, 0xaa, 0x90, 0x9b, 0xa1, 0xaa, 0x90,
0xb8, 0x3e, 0x9e, 0x4f, 0x5e, 0x1f, 0x97, 0xd5, 0x40, 0x0a, 0x33, 0xd6, 0x40, 0x1e, 0x01, 0x8c,
0x1c, 0x7b, 0x84, 0x1d, 0xcf, 0xc4, 0x7e, 0xfa, 0x96, 0x21, 0x7c, 0x09, 0x0d, 0xba, 0xf5, 0xa9,
0xb8, 0xe5, 0xb9, 0x73, 0x3c, 0xc2, 0x68, 0x01, 0xf2, 0x9b, 0xf8, 0xa8, 0x79, 0x0a, 0x01, 0x94,
0x36, 0x6d, 0x67, 0xa8, 0x0f, 0x9a, 0x0a, 0xaa, 0xc2, 0x02, 0x3f, 0xd4, 0x6a, 0xe6, 0x50, 0x1d,
0x2a, 0x6b, 0xfe, 0xc1, 0x40, 0x33, 0x7f, 0xeb, 0xcf, 0x15, 0x58, 0x4a, 0x1c, 0xbb, 0xa0, 0x06,
0xc0, 0x73, 0xab, 0xc7, 0xcf, 0xa3, 0x9a, 0xa7, 0x50, 0x0d, 0xca, 0xfe, 0xe9, 0x14, 0xc3, 0xb7,
0x63, 0x53, 0xe8, 0x66, 0x0e, 0x35, 0xa1, 0xc6, 0x06, 0x8e, 0x7b, 0x3d, 0xec, 0xba, 0xcd, 0xbc,
0xe8, 0x79, 0xa2, 0x9b, 0x83, 0xb1, 0x83, 0x9b, 0x05, 0x32, 0xe7, 0x8e, 0xad, 0xe1, 0x01, 0xd6,
0x5d, 0xdc, 0x2c, 0x22, 0x04, 0x0d, 0xde, 0xf0, 0x07, 0x95, 0x42, 0x7d, 0xfe, 0xb0, 0x85, 0x5b,
0x2f, 0xc2, 0xc5, 0x73, 0xba, 0xbc, 0xb3, 0x70, 0xfa, 0xb9, 0x65, 0xe0, 0x3d, 0xd3, 0xc2, 0x46,
0xf0, 0xa9, 0x79, 0x0a, 0x9d, 0x86, 0xc5, 0x0d, 0xec, 0xf4, 0x71, 0xa8, 0x33, 0x87, 0x96, 0xa0,
0xbe, 0x61, 0xbe, 0x0a, 0x75, 0xe5, 0xd5, 0x42, 0x59, 0x69, 0x2a, 0xf7, 0xff, 0xe2, 0x2a, 0x54,
0x08, 0x53, 0xd6, 0x6c, 0xdb, 0x31, 0xd0, 0x00, 0x10, 0x7d, 0x50, 0x31, 0x1c, 0xd9, 0x96, 0x78,
0x81, 0x85, 0xee, 0x44, 0xf9, 0xc0, 0x1b, 0x49, 0x40, 0x2e, 0x9d, 0xed, 0xeb, 0x52, 0xf8, 0x18,
0xb0, 0x7a, 0x0a, 0x0d, 0xe9, 0x6c, 0x3b, 0xe6, 0x10, 0xef, 0x98, 0xbd, 0x03, 0x3f, 0xb2, 0xb8,
0x97, 0x12, 0x47, 0x24, 0x41, 0xfd, 0xf9, 0xae, 0x49, 0xe7, 0x63, 0x2f, 0x5e, 0x7c, 0x2f, 0xa3,
0x9e, 0x42, 0x2f, 0xe1, 0xcc, 0x53, 0x1c, 0x0a, 0xd2, 0xfc, 0x09, 0xef, 0xa7, 0x4f, 0x98, 0x00,
0x3e, 0xe1, 0x94, 0xcf, 0xa0, 0x48, 0xc5, 0x0d, 0xc9, 0xe2, 0xb8, 0xf0, 0x63, 0xe9, 0xf6, 0x95,
0x74, 0x00, 0x81, 0xed, 0x47, 0xb0, 0x18, 0x7b, 0x62, 0x89, 0x64, 0x56, 0x5d, 0xfe, 0x58, 0xb6,
0x7d, 0x2b, 0x0b, 0xa8, 0x98, 0xab, 0x0f, 0x8d, 0xe8, 0x43, 0x0c, 0xb4, 0x92, 0xe1, 0x4d, 0x17,
0x9b, 0xe9, 0xbd, 0xcc, 0xaf, 0xbf, 0xa8, 0x10, 0x34, 0xe3, 0x4f, 0xfe, 0xd0, 0xad, 0x89, 0x08,
0xa2, 0xc2, 0xf6, 0x7e, 0x26, 0x58, 0x31, 0xdd, 0x31, 0x15, 0x82, 0xc4, 0x53, 0xab, 0xb8, 0x8c,
0xfb, 0x68, 0xd2, 0xde, 0x80, 0xb5, 0xef, 0x66, 0x86, 0x17, 0x53, 0xff, 0x36, 0xbb, 0xb5, 0x22,
0x7b, 0xae, 0x84, 0x3e, 0x94, 0xa3, 0x9b, 0xf0, 0xce, 0xaa, 0x7d, 0xff, 0x24, 0x43, 0x04, 0x11,
0x3f, 0xa1, 0xd7, 0x4d, 0x24, 0x0f, 0x7e, 0xe2, 0x7a, 0xe7, 0xe3, 0x4b, 0x7f, 0xcb, 0xd4, 0xfe,
0xf0, 0x04, 0x23, 0x04, 0x01, 0x76, 0xfc, 0x4d, 0xa5, 0xaf, 0x86, 0x77, 0xa7, 0x4a, 0xcd, 0x6c,
0x3a, 0xf8, 0x43, 0x58, 0x8c, 0xc5, 0x39, 0x28, 0x7b, 0x2c, 0xd4, 0x9e, 0x14, 0x8c, 0x32, 0x95,
0x8c, 0xdd, 0xde, 0x41, 0x29, 0xd2, 0x2f, 0xb9, 0xe1, 0xd3, 0xbe, 0x95, 0x05, 0x54, 0x2c, 0xc4,
0xa5, 0xe6, 0x32, 0x76, 0x27, 0x03, 0xdd, 0x96, 0xe3, 0x90, 0xdf, 0x3d, 0x69, 0x7f, 0x90, 0x11,
0x5a, 0x4c, 0x7a, 0x08, 0xa7, 0x25, 0x57, 0x67, 0xd0, 0x07, 0x13, 0x99, 0x15, 0xbf, 0x33, 0xd4,
0xbe, 0x93, 0x15, 0x5c, 0xcc, 0xfb, 0x1b, 0x80, 0xb6, 0xf7, 0xed, 0xa3, 0x35, 0xdb, 0xda, 0x33,
0xfb, 0x63, 0x47, 0x67, 0x51, 0x42, 0x9a, 0x6f, 0x48, 0x82, 0xa6, 0xc8, 0xe8, 0xc4, 0x11, 0x62,
0xf2, 0x2e, 0xc0, 0x53, 0xec, 0x6d, 0x60, 0xcf, 0x21, 0x8a, 0xf1, 0x6e, 0x9a, 0xfb, 0xe3, 0x00,
0xfe, 0x54, 0x37, 0xa7, 0xc2, 0x85, 0x5c, 0x51, 0x73, 0x43, 0xb7, 0xc6, 0xfa, 0x20, 0x74, 0xf7,
0xff, 0xb6, 0x74, 0x78, 0x1c, 0x2c, 0x85, 0x91, 0xa9, 0xd0, 0x62, 0xca, 0x23, 0xe1, 0xda, 0x43,
0x47, 0x71, 0x93, 0x5d, 0x7b, 0xf2, 0x1a, 0x48, 0xdc, 0xec, 0x4d, 0x80, 0x17, 0x13, 0x7f, 0xa1,
0xd0, 0xdb, 0x57, 0x31, 0x80, 0x17, 0xa6, 0xb7, 0xbf, 0x35, 0xd0, 0x2d, 0x37, 0x0b, 0x09, 0x14,
0xf0, 0x04, 0x24, 0x70, 0x78, 0x41, 0x82, 0x01, 0xf5, 0xc8, 0x09, 0x19, 0x92, 0x5d, 0x96, 0x97,
0x9d, 0x16, 0xb6, 0x57, 0xa6, 0x03, 0x8a, 0x59, 0xf6, 0xa1, 0xee, 0xab, 0x12, 0xdb, 0xdc, 0xf7,
0xd2, 0x28, 0x0d, 0x60, 0x52, 0x2c, 0x81, 0x1c, 0x34, 0x6c, 0x09, 0x92, 0x07, 0x00, 0x28, 0xdb,
0xc1, 0xd1, 0x24, 0x4b, 0x90, 0x7e, 0xaa, 0xc0, 0x4c, 0x5d, 0xec, 0xb0, 0x4d, 0x6e, 0x47, 0xa5,
0x67, 0x87, 0x52, 0x53, 0x97, 0x72, 0x76, 0xa7, 0x9e, 0x42, 0x2f, 0xa0, 0xc4, 0xff, 0x21, 0xe4,
0xfa, 0xe4, 0xa2, 0x1d, 0xc7, 0x7e, 0x63, 0x0a, 0x94, 0x40, 0x7c, 0x00, 0x67, 0x53, 0x4a, 0x76,
0x52, 0x17, 0x3c, 0xb9, 0xbc, 0x37, 0xcd, 0x39, 0x88, 0xc9, 0x12, 0x35, 0xb9, 0x09, 0x93, 0xa5,
0xd5, 0xef, 0xa6, 0x4d, 0xd6, 0x85, 0xa5, 0x44, 0xb9, 0x03, 0xbd, 0x9f, 0xe2, 0xe8, 0x64, 0x45,
0x91, 0x69, 0x13, 0xf4, 0xe1, 0x1d, 0x69, 0x6a, 0x2f, 0x75, 0xdc, 0x93, 0x8a, 0x00, 0xd3, 0x26,
0xea, 0xc1, 0x69, 0x49, 0x42, 0x2f, 0x75, 0x39, 0xe9, 0x89, 0xff, 0xb4, 0x49, 0xf6, 0xa0, 0xbd,
0xea, 0xd8, 0xba, 0xd1, 0xd3, 0x5d, 0x8f, 0x26, 0xd9, 0x24, 0x8b, 0xf2, 0x23, 0x27, 0x79, 0x58,
0x2d, 0x4d, 0xc5, 0xa7, 0xcd, 0xb3, 0x0b, 0x55, 0xca, 0x4a, 0xf6, 0xdf, 0x0d, 0x48, 0xee, 0x23,
0x42, 0x10, 0x29, 0x86, 0x47, 0x06, 0x28, 0x84, 0x7a, 0x07, 0xaa, 0x6b, 0xf4, 0x2c, 0xa2, 0x63,
0x19, 0xf8, 0x55, 0xdc, 0x5f, 0xd1, 0x67, 0xab, 0x77, 0x42, 0x00, 0x99, 0x77, 0xa8, 0x4e, 0x03,
0x5a, 0x03, 0xbf, 0x62, 0x7c, 0x5e, 0x91, 0xe1, 0x8d, 0x80, 0xa4, 0x24, 0x00, 0x52, 0xc8, 0x90,
0xa7, 0x3f, 0x13, 0x0e, 0xf3, 0xc4, 0x74, 0x77, 0x53, 0x90, 0x24, 0x20, 0xfd, 0x59, 0xef, 0x65,
0x1f, 0x10, 0xf6, 0x0c, 0x3e, 0x5d, 0x1d, 0x7a, 0x10, 0x72, 0x73, 0x12, 0xe9, 0xe1, 0xd8, 0x6d,
0x65, 0x3a, 0xa0, 0x98, 0x65, 0x0b, 0x2a, 0x44, 0x3a, 0x19, 0x7b, 0xae, 0xcb, 0x06, 0x8a, 0xcf,
0xd9, 0x99, 0xb3, 0x8e, 0xdd, 0x9e, 0x63, 0xee, 0x72, 0xa6, 0x4b, 0xc9, 0x89, 0x80, 0x4c, 0x64,
0x4e, 0x0c, 0x52, 0x50, 0xfe, 0x9b, 0x34, 0x5a, 0xa7, 0xbd, 0xab, 0x63, 0x73, 0x60, 0x6c, 0x39,
0x76, 0x9f, 0x3e, 0x19, 0xb9, 0x37, 0x69, 0xf9, 0x11, 0xd0, 0xd4, 0x48, 0x6c, 0xc2, 0x08, 0x7f,
0xfe, 0xfb, 0x5f, 0x55, 0xa0, 0xec, 0x3f, 0x62, 0xf9, 0x86, 0xab, 0x13, 0x6f, 0xa1, 0x5c, 0xf0,
0x43, 0x58, 0x8c, 0x3d, 0x28, 0x97, 0x5a, 0x22, 0xf9, 0xa3, 0xf3, 0x69, 0x22, 0xf3, 0x82, 0xff,
0x07, 0x9a, 0xc8, 0x1c, 0x6e, 0xa6, 0x95, 0x1c, 0xe2, 0x49, 0xc3, 0x14, 0xc4, 0xff, 0xb7, 0x43,
0xf5, 0x4d, 0x80, 0x50, 0x90, 0x3e, 0xf9, 0xaa, 0x27, 0x89, 0x3b, 0xa7, 0xed, 0xd6, 0x50, 0x1a,
0x87, 0xbf, 0x97, 0xe5, 0xda, 0x5c, 0x7a, 0x24, 0x95, 0x1e, 0x7d, 0x3f, 0x87, 0x5a, 0xf8, 0x12,
0x36, 0x92, 0xfe, 0xe3, 0x56, 0xf2, 0x96, 0xf6, 0xb4, 0x55, 0x6c, 0x9c, 0x30, 0x40, 0x9b, 0x82,
0xce, 0x05, 0x94, 0x3c, 0xbe, 0x93, 0x06, 0xb4, 0xa9, 0x87, 0x86, 0xd2, 0x80, 0x36, 0xfd, 0x4c,
0x90, 0x55, 0x9e, 0xe2, 0x67, 0x52, 0xd2, 0xca, 0x53, 0xca, 0x29, 0x9f, 0xb4, 0xf2, 0x94, 0x76,
0xc8, 0xa5, 0x9e, 0x5a, 0xfd, 0xe8, 0x07, 0x1f, 0xf6, 0x4d, 0x6f, 0x7f, 0xbc, 0x4b, 0x56, 0x7f,
0x97, 0x0d, 0xfd, 0xc0, 0xb4, 0xf9, 0xaf, 0xbb, 0xbe, 0xb8, 0xdf, 0xa5, 0xd8, 0xee, 0x12, 0x6c,
0xa3, 0xdd, 0xdd, 0x12, 0x6d, 0x7d, 0xf4, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xb0, 0x82, 0x83,
0x41, 0xd8, 0x51, 0x00, 0x00,
// 4664 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0x4b, 0x8c, 0x1c, 0x49,
0x5a, 0xb0, 0xb3, 0x5e, 0x5d, 0xf5, 0xd5, 0xa3, 0xab, 0xc3, 0x9e, 0x76, 0xb9, 0x66, 0xfc, 0x4a,
0xdb, 0xe3, 0x1e, 0x8f, 0xc7, 0xf6, 0x78, 0xfe, 0xd1, 0xfa, 0x5f, 0xef, 0xcc, 0xe2, 0xee, 0x76,
0x7b, 0x0a, 0xdc, 0xbd, 0xbd, 0xd9, 0xed, 0x31, 0x9a, 0x45, 0x2a, 0x65, 0x57, 0x46, 0x57, 0xe7,
0x76, 0x55, 0x66, 0x39, 0x33, 0xab, 0xdb, 0xbd, 0x48, 0xec, 0x00, 0x12, 0xd2, 0x20, 0x04, 0x08,
0x09, 0x01, 0x37, 0xc4, 0x69, 0x59, 0xb4, 0x08, 0x69, 0xc5, 0x85, 0x0b, 0xd7, 0x11, 0x1c, 0x56,
0x08, 0x89, 0x23, 0x47, 0xe0, 0x8e, 0xc4, 0x89, 0x03, 0x8a, 0x47, 0x46, 0xbe, 0x22, 0xab, 0xb2,
0xab, 0xec, 0xb1, 0x04, 0xb7, 0x8a, 0x2f, 0xbf, 0xf8, 0xe2, 0x8b, 0x88, 0xef, 0x1d, 0x11, 0x05,
0x4d, 0x43, 0xf7, 0xf4, 0x6e, 0xcf, 0xb6, 0x1d, 0xe3, 0xce, 0xc8, 0xb1, 0x3d, 0x1b, 0x2d, 0x0d,
0xcd, 0xc1, 0xd1, 0xd8, 0x65, 0xad, 0x3b, 0xe4, 0x73, 0xbb, 0xd6, 0xb3, 0x87, 0x43, 0xdb, 0x62,
0xa0, 0x76, 0xc3, 0xb4, 0x3c, 0xec, 0x58, 0xfa, 0x80, 0xb7, 0x6b, 0xe1, 0x0e, 0xed, 0x9a, 0xdb,
0x3b, 0xc0, 0x43, 0x9d, 0xb7, 0x96, 0x4c, 0xcb, 0xc0, 0x2f, 0xc3, 0xf4, 0xd5, 0x05, 0x28, 0x3e,
0x1e, 0x8e, 0xbc, 0x13, 0xf5, 0x4f, 0x15, 0xa8, 0x6d, 0x0c, 0xc6, 0xee, 0x81, 0x86, 0x5f, 0x8c,
0xb1, 0xeb, 0xa1, 0x7b, 0x50, 0xd8, 0xd3, 0x5d, 0xdc, 0x52, 0xae, 0x28, 0x2b, 0xd5, 0xfb, 0xef,
0xdc, 0x89, 0x30, 0xc2, 0x59, 0xd8, 0x74, 0xfb, 0xab, 0xba, 0x8b, 0x35, 0x8a, 0x89, 0x10, 0x14,
0x8c, 0xbd, 0xce, 0x7a, 0x2b, 0x77, 0x45, 0x59, 0xc9, 0x6b, 0xf4, 0x37, 0xba, 0x04, 0xe0, 0xe2,
0xfe, 0x10, 0x5b, 0x5e, 0x67, 0xdd, 0x6d, 0xe5, 0xaf, 0xe4, 0x57, 0xf2, 0x5a, 0x08, 0x82, 0x54,
0xa8, 0xf5, 0xec, 0xc1, 0x00, 0xf7, 0x3c, 0xd3, 0xb6, 0x3a, 0xeb, 0xad, 0x02, 0xed, 0x1b, 0x81,
0xa9, 0xff, 0xa6, 0x40, 0x9d, 0xb3, 0xe6, 0x8e, 0x6c, 0xcb, 0xc5, 0xe8, 0x23, 0x28, 0xb9, 0x9e,
0xee, 0x8d, 0x5d, 0xce, 0xdd, 0xdb, 0x52, 0xee, 0x76, 0x28, 0x8a, 0xc6, 0x51, 0xa5, 0xec, 0xc5,
0x87, 0xcf, 0x27, 0x87, 0x8f, 0x4d, 0xa1, 0x90, 0x98, 0xc2, 0x0a, 0x2c, 0xee, 0x13, 0xee, 0x76,
0x02, 0xa4, 0x22, 0x45, 0x8a, 0x83, 0x09, 0x25, 0xcf, 0x1c, 0xe2, 0xef, 0xed, 0xef, 0x60, 0x7d,
0xd0, 0x2a, 0xd1, 0xb1, 0x42, 0x10, 0xf5, 0x9f, 0x14, 0x68, 0x0a, 0x74, 0x7f, 0x1f, 0xce, 0x41,
0xb1, 0x67, 0x8f, 0x2d, 0x8f, 0x4e, 0xb5, 0xae, 0xb1, 0x06, 0xba, 0x0a, 0xb5, 0xde, 0x81, 0x6e,
0x59, 0x78, 0xd0, 0xb5, 0xf4, 0x21, 0xa6, 0x93, 0xaa, 0x68, 0x55, 0x0e, 0xdb, 0xd2, 0x87, 0x38,
0xd3, 0xdc, 0xae, 0x40, 0x75, 0xa4, 0x3b, 0x9e, 0x19, 0x59, 0xfd, 0x30, 0x08, 0xb5, 0xa1, 0x6c,
0xba, 0x9d, 0xe1, 0xc8, 0x76, 0xbc, 0x56, 0xf1, 0x8a, 0xb2, 0x52, 0xd6, 0x44, 0x9b, 0x8c, 0x60,
0xd2, 0x5f, 0xbb, 0xba, 0x7b, 0xd8, 0x59, 0xe7, 0x33, 0x8a, 0xc0, 0xd4, 0x3f, 0x57, 0x60, 0xf9,
0x91, 0xeb, 0x9a, 0x7d, 0x2b, 0x31, 0xb3, 0x65, 0x28, 0x59, 0xb6, 0x81, 0x3b, 0xeb, 0x74, 0x6a,
0x79, 0x8d, 0xb7, 0xd0, 0xdb, 0x50, 0x19, 0x61, 0xec, 0x74, 0x1d, 0x7b, 0xe0, 0x4f, 0xac, 0x4c,
0x00, 0x9a, 0x3d, 0xc0, 0xe8, 0xfb, 0xb0, 0xe4, 0xc6, 0x08, 0x31, 0xb9, 0xaa, 0xde, 0xbf, 0x76,
0x27, 0xa1, 0x2c, 0x77, 0xe2, 0x83, 0x6a, 0xc9, 0xde, 0xea, 0x97, 0x39, 0x38, 0x2b, 0xf0, 0x18,
0xaf, 0xe4, 0x37, 0x59, 0x79, 0x17, 0xf7, 0x05, 0x7b, 0xac, 0x91, 0x65, 0xe5, 0xc5, 0x96, 0xe5,
0xc3, 0x5b, 0x96, 0x41, 0xd4, 0xe3, 0xfb, 0x51, 0x4c, 0xee, 0xc7, 0x65, 0xa8, 0xe2, 0x97, 0x23,
0xd3, 0xc1, 0x5d, 0x22, 0x38, 0x74, 0xc9, 0x0b, 0x1a, 0x30, 0xd0, 0xae, 0x39, 0x0c, 0xeb, 0xc6,
0x42, 0x66, 0xdd, 0x50, 0xff, 0x42, 0x81, 0xf3, 0x89, 0x5d, 0xe2, 0xca, 0xa6, 0x41, 0x93, 0xce,
0x3c, 0x58, 0x19, 0xa2, 0x76, 0x64, 0xc1, 0xdf, 0x9d, 0xb4, 0xe0, 0x01, 0xba, 0x96, 0xe8, 0x1f,
0x62, 0x32, 0x97, 0x9d, 0xc9, 0x43, 0x38, 0xff, 0x04, 0x7b, 0x7c, 0x00, 0xf2, 0x0d, 0xbb, 0xb3,
0x1b, 0xab, 0xa8, 0x56, 0xe7, 0xe2, 0x5a, 0xad, 0xfe, 0x4d, 0x4e, 0xe8, 0x22, 0x1d, 0xaa, 0x63,
0xed, 0xdb, 0xe8, 0x1d, 0xa8, 0x08, 0x14, 0x2e, 0x15, 0x01, 0x00, 0x7d, 0x0b, 0x8a, 0x84, 0x53,
0x26, 0x12, 0x8d, 0xfb, 0x57, 0xe5, 0x73, 0x0a, 0xd1, 0xd4, 0x18, 0x3e, 0xea, 0x40, 0xc3, 0xf5,
0x74, 0xc7, 0xeb, 0x8e, 0x6c, 0x97, 0xee, 0x33, 0x15, 0x9c, 0xea, 0x7d, 0x35, 0x4a, 0x41, 0x58,
0xfa, 0x4d, 0xb7, 0xbf, 0xcd, 0x31, 0xb5, 0x3a, 0xed, 0xe9, 0x37, 0xd1, 0x63, 0xa8, 0x61, 0xcb,
0x08, 0x08, 0x15, 0x32, 0x13, 0xaa, 0x62, 0xcb, 0x10, 0x64, 0x82, 0xfd, 0x29, 0x66, 0xdf, 0x9f,
0xdf, 0x53, 0xa0, 0x95, 0xdc, 0xa0, 0x79, 0x4c, 0xf6, 0x43, 0xd6, 0x09, 0xb3, 0x0d, 0x9a, 0xa8,
0xe1, 0x62, 0x93, 0x34, 0xde, 0x45, 0xfd, 0x63, 0x05, 0xde, 0x0a, 0xd8, 0xa1, 0x9f, 0x5e, 0x97,
0xb4, 0xa0, 0x5b, 0xd0, 0x34, 0xad, 0xde, 0x60, 0x6c, 0xe0, 0x67, 0xd6, 0x67, 0x58, 0x1f, 0x78,
0x07, 0x27, 0x74, 0x0f, 0xcb, 0x5a, 0x02, 0xae, 0xfe, 0x6b, 0x0e, 0x96, 0xe3, 0x7c, 0xcd, 0xb3,
0x48, 0xff, 0x0f, 0x8a, 0xa6, 0xb5, 0x6f, 0xfb, 0x6b, 0x74, 0x69, 0x82, 0x52, 0x92, 0xb1, 0x18,
0x32, 0xb2, 0x01, 0xf9, 0x66, 0xac, 0x77, 0x80, 0x7b, 0x87, 0x23, 0xdb, 0xa4, 0x06, 0x8b, 0x90,
0xf8, 0x25, 0x09, 0x09, 0x39, 0xc7, 0x77, 0xd6, 0x18, 0x8d, 0x35, 0x41, 0xe2, 0xb1, 0xe5, 0x39,
0x27, 0xda, 0x52, 0x2f, 0x0e, 0x6f, 0x1f, 0xc0, 0xb2, 0x1c, 0x19, 0x35, 0x21, 0x7f, 0x88, 0x4f,
0xe8, 0x94, 0x2b, 0x1a, 0xf9, 0x89, 0x1e, 0x40, 0xf1, 0x48, 0x1f, 0x8c, 0x31, 0xb7, 0x0e, 0x59,
0xc4, 0x97, 0x75, 0xf8, 0x76, 0xee, 0x81, 0xa2, 0x0e, 0xe1, 0xed, 0x27, 0xd8, 0xeb, 0x58, 0x2e,
0x76, 0xbc, 0x55, 0xd3, 0x1a, 0xd8, 0xfd, 0x6d, 0xdd, 0x3b, 0x98, 0xc3, 0x56, 0x44, 0xd4, 0x3e,
0x17, 0x53, 0x7b, 0xf5, 0x27, 0x0a, 0xbc, 0x23, 0x1f, 0x8f, 0xef, 0x6a, 0x1b, 0xca, 0xfb, 0x26,
0x1e, 0x18, 0x44, 0x74, 0x14, 0x2a, 0x3a, 0xa2, 0x4d, 0x6c, 0xc6, 0x88, 0x20, 0xf3, 0xcd, 0xbb,
0x9a, 0x32, 0xd3, 0x1d, 0xcf, 0x31, 0xad, 0xfe, 0x53, 0xd3, 0xf5, 0x34, 0x86, 0x1f, 0x12, 0x95,
0x7c, 0x76, 0x0d, 0xfd, 0x5d, 0x05, 0x2e, 0x3d, 0xc1, 0xde, 0x9a, 0x70, 0x39, 0xe4, 0xbb, 0xe9,
0x7a, 0x66, 0xcf, 0x7d, 0xb5, 0x61, 0x5f, 0x86, 0xd8, 0x43, 0xfd, 0x03, 0x05, 0x2e, 0xa7, 0x32,
0xc3, 0x97, 0x8e, 0x9b, 0x54, 0xdf, 0xe1, 0xc8, 0x4d, 0xea, 0xaf, 0xe0, 0x93, 0xcf, 0xc9, 0xe6,
0x6f, 0xeb, 0xa6, 0xc3, 0x4c, 0xea, 0x8c, 0x0e, 0xe6, 0x67, 0x0a, 0x5c, 0x7c, 0x82, 0xbd, 0x6d,
0xdf, 0xdd, 0xbe, 0xc1, 0xd5, 0x21, 0x38, 0x21, 0xb7, 0xef, 0xc7, 0x9d, 0x11, 0x98, 0xfa, 0xfb,
0x6c, 0x3b, 0xa5, 0xfc, 0xbe, 0x91, 0x05, 0xbc, 0x44, 0x35, 0x21, 0x64, 0x27, 0xb8, 0xc6, 0xf3,
0xe5, 0x53, 0xbf, 0x2a, 0x42, 0xed, 0x73, 0x6e, 0x1a, 0xa8, 0x43, 0x8d, 0xaf, 0x84, 0x22, 0x8f,
0x89, 0x42, 0xc1, 0x95, 0x2c, 0xde, 0x7a, 0x02, 0x75, 0x17, 0xe3, 0xc3, 0x59, 0xdc, 0x67, 0x8d,
0x74, 0x14, 0x6e, 0xef, 0x29, 0x2c, 0x8d, 0x2d, 0x1a, 0xb5, 0x63, 0x83, 0xcf, 0x82, 0xad, 0xfc,
0x74, 0xb3, 0x9a, 0xec, 0x88, 0x3e, 0xe3, 0x89, 0x41, 0x88, 0x56, 0x31, 0x13, 0xad, 0x78, 0x37,
0xd4, 0x81, 0xa6, 0xe1, 0xd8, 0xa3, 0x11, 0x36, 0xba, 0xae, 0x4f, 0xaa, 0x94, 0x8d, 0x14, 0xef,
0x27, 0x48, 0xdd, 0x83, 0xb3, 0x71, 0x4e, 0x3b, 0x06, 0x89, 0x15, 0x89, 0x78, 0xc9, 0x3e, 0xa1,
0xdb, 0xb0, 0x94, 0xc4, 0x2f, 0x53, 0xfc, 0xe4, 0x07, 0xf4, 0x01, 0xa0, 0x18, 0xab, 0x04, 0xbd,
0xc2, 0xd0, 0xa3, 0xcc, 0x70, 0x74, 0x9a, 0x94, 0x46, 0xd1, 0x81, 0xa1, 0xf3, 0x2f, 0x21, 0xf4,
0x0e, 0xf1, 0xb3, 0x11, 0x74, 0xb7, 0x55, 0xcd, 0xb6, 0x10, 0x51, 0x62, 0xae, 0xfa, 0x95, 0x02,
0xcb, 0xcf, 0x75, 0xaf, 0x77, 0xb0, 0x3e, 0xe4, 0x52, 0x3a, 0x87, 0x96, 0x7f, 0x02, 0x95, 0x23,
0x2e, 0x91, 0xbe, 0x29, 0xbf, 0x2c, 0x61, 0x28, 0x2c, 0xfb, 0x5a, 0xd0, 0x83, 0x24, 0x49, 0xe7,
0x36, 0x42, 0xc9, 0xe2, 0x1b, 0xb0, 0x37, 0x53, 0xb2, 0x5c, 0xf5, 0x25, 0x00, 0x67, 0x6e, 0xd3,
0xed, 0xcf, 0xc0, 0xd7, 0x03, 0x58, 0xe0, 0xd4, 0xb8, 0x41, 0x99, 0xb6, 0x61, 0x3e, 0xba, 0xfa,
0xd3, 0x12, 0x54, 0x43, 0x1f, 0x50, 0x03, 0x72, 0xc2, 0x52, 0xe4, 0x24, 0xb3, 0xcb, 0x4d, 0xcf,
0xab, 0xf2, 0xc9, 0xbc, 0xea, 0x06, 0x34, 0x4c, 0xea, 0xc1, 0xbb, 0x7c, 0x57, 0x68, 0xe8, 0x5c,
0xd1, 0xea, 0x0c, 0xca, 0x45, 0x04, 0x5d, 0x82, 0xaa, 0x35, 0x1e, 0x76, 0xed, 0xfd, 0xae, 0x63,
0x1f, 0xbb, 0x3c, 0x41, 0xab, 0x58, 0xe3, 0xe1, 0xf7, 0xf6, 0x35, 0xfb, 0xd8, 0x0d, 0x72, 0x80,
0xd2, 0x29, 0x73, 0x80, 0x4b, 0x50, 0x1d, 0xea, 0x2f, 0x09, 0xd5, 0xae, 0x35, 0x1e, 0xd2, 0xdc,
0x2d, 0xaf, 0x55, 0x86, 0xfa, 0x4b, 0xcd, 0x3e, 0xde, 0x1a, 0x0f, 0xd1, 0x0a, 0x34, 0x07, 0xba,
0xeb, 0x75, 0xc3, 0xc9, 0x5f, 0x99, 0x26, 0x7f, 0x0d, 0x02, 0x7f, 0x1c, 0x24, 0x80, 0xc9, 0x6c,
0xa2, 0x32, 0x47, 0x36, 0x61, 0x0c, 0x07, 0x01, 0x21, 0xc8, 0x9e, 0x4d, 0x18, 0xc3, 0x81, 0x20,
0xf3, 0x00, 0x16, 0xf6, 0x68, 0x5c, 0x34, 0x49, 0x59, 0x37, 0x48, 0x48, 0xc4, 0xc2, 0x27, 0xcd,
0x47, 0x47, 0xdf, 0x81, 0x0a, 0x75, 0x47, 0xb4, 0x6f, 0x2d, 0x53, 0xdf, 0xa0, 0x03, 0xe9, 0x6d,
0xe0, 0x81, 0xa7, 0xd3, 0xde, 0xf5, 0x6c, 0xbd, 0x45, 0x07, 0x62, 0x29, 0x7b, 0x0e, 0xd6, 0x3d,
0x6c, 0xac, 0x9e, 0xac, 0xd9, 0xc3, 0x91, 0x4e, 0x85, 0xa9, 0xd5, 0xa0, 0x61, 0xbd, 0xec, 0x13,
0x7a, 0x17, 0x1a, 0x3d, 0xd1, 0xda, 0x70, 0xec, 0x61, 0x6b, 0x91, 0xea, 0x51, 0x0c, 0x8a, 0x2e,
0x02, 0xf8, 0x36, 0x52, 0xf7, 0x5a, 0x4d, 0xba, 0x8b, 0x15, 0x0e, 0x79, 0x44, 0x6b, 0x3b, 0xa6,
0xdb, 0x65, 0x55, 0x14, 0xd3, 0xea, 0xb7, 0x96, 0xe8, 0x88, 0x55, 0xbf, 0xec, 0x62, 0x5a, 0x7d,
0x74, 0x1e, 0x16, 0x4c, 0xb7, 0xbb, 0xaf, 0x1f, 0xe2, 0x16, 0xa2, 0x5f, 0x4b, 0xa6, 0xbb, 0xa1,
0x1f, 0x62, 0xf5, 0xc7, 0x70, 0x2e, 0x90, 0xae, 0xd0, 0x4e, 0x26, 0x85, 0x42, 0x99, 0x55, 0x28,
0x26, 0x47, 0xc3, 0xbf, 0x28, 0xc0, 0xf2, 0x8e, 0x7e, 0x84, 0x5f, 0x7f, 0xe0, 0x9d, 0xc9, 0xac,
0x3d, 0x85, 0x25, 0x1a, 0x6b, 0xdf, 0x0f, 0xf1, 0x33, 0xc1, 0xa3, 0x87, 0x45, 0x21, 0xd9, 0x11,
0x7d, 0x97, 0x84, 0x22, 0xb8, 0x77, 0xb8, 0x4d, 0x92, 0x17, 0xdf, 0x9b, 0x5f, 0x94, 0xd0, 0x59,
0x13, 0x58, 0x5a, 0xb8, 0x07, 0xda, 0x86, 0xc5, 0xe8, 0x36, 0xf8, 0x7e, 0xfc, 0xe6, 0xc4, 0xcc,
0x36, 0x58, 0x7d, 0xad, 0x11, 0xd9, 0x0c, 0x17, 0xb5, 0x60, 0x81, 0x3b, 0x61, 0x6a, 0x33, 0xca,
0x9a, 0xdf, 0x44, 0xdb, 0x70, 0x96, 0xcd, 0x60, 0x87, 0x2b, 0x04, 0x9b, 0x7c, 0x39, 0xd3, 0xe4,
0x65, 0x5d, 0xa3, 0xfa, 0x54, 0x39, 0xad, 0x3e, 0xb5, 0x60, 0x81, 0xcb, 0x38, 0xb5, 0x23, 0x65,
0xcd, 0x6f, 0x92, 0x6d, 0x0e, 0xa4, 0xbd, 0x4a, 0xbf, 0x05, 0x00, 0x92, 0xb4, 0x40, 0xb0, 0x9e,
0x53, 0x6a, 0x30, 0x9f, 0x42, 0x59, 0x48, 0x78, 0xf6, 0xe4, 0x51, 0xf4, 0x89, 0xdb, 0xf7, 0x7c,
0xcc, 0xbe, 0xab, 0xff, 0xa8, 0x40, 0x6d, 0x9d, 0x4c, 0xe9, 0xa9, 0xdd, 0xa7, 0xde, 0xe8, 0x06,
0x34, 0x1c, 0xdc, 0xb3, 0x1d, 0xa3, 0x8b, 0x2d, 0xcf, 0x31, 0x31, 0x4b, 0xdd, 0x0b, 0x5a, 0x9d,
0x41, 0x1f, 0x33, 0x20, 0x41, 0x23, 0x26, 0xdb, 0xf5, 0xf4, 0xe1, 0xa8, 0xbb, 0x4f, 0x4c, 0x43,
0x8e, 0xa1, 0x09, 0x28, 0xb5, 0x0c, 0x57, 0xa1, 0x16, 0xa0, 0x79, 0x36, 0x1d, 0xbf, 0xa0, 0x55,
0x05, 0x6c, 0xd7, 0x46, 0xd7, 0xa1, 0x41, 0xd7, 0xb4, 0x3b, 0xb0, 0xfb, 0x5d, 0x92, 0x0b, 0x72,
0x47, 0x55, 0x33, 0x38, 0x5b, 0x64, 0xaf, 0xa2, 0x58, 0xae, 0xf9, 0x23, 0xcc, 0x5d, 0x95, 0xc0,
0xda, 0x31, 0x7f, 0x84, 0xd5, 0x7f, 0x50, 0xa0, 0xbe, 0xae, 0x7b, 0xfa, 0x96, 0x6d, 0xe0, 0xdd,
0x19, 0x1d, 0x7b, 0x86, 0x7a, 0xe8, 0x3b, 0x50, 0x11, 0x33, 0xe0, 0x53, 0x0a, 0x00, 0x68, 0x03,
0x1a, 0x7e, 0x2c, 0xd7, 0x65, 0xb9, 0x4a, 0x21, 0x35, 0x80, 0x0a, 0x79, 0x4e, 0x57, 0xab, 0xfb,
0xdd, 0x68, 0x53, 0xdd, 0x80, 0x5a, 0xf8, 0x33, 0x19, 0x75, 0x27, 0x2e, 0x28, 0x02, 0x40, 0xa4,
0x71, 0x6b, 0x3c, 0x24, 0x7b, 0xca, 0x0d, 0x8b, 0xdf, 0x54, 0x7f, 0x5b, 0x81, 0x3a, 0x77, 0xf7,
0x3b, 0xe2, 0xe4, 0x80, 0x4e, 0x8d, 0x55, 0x28, 0xe8, 0x6f, 0xf4, 0xed, 0x68, 0xb1, 0xef, 0xba,
0xd4, 0x08, 0x50, 0x22, 0x34, 0xc8, 0x8c, 0xf8, 0xfa, 0x2c, 0xd9, 0xf1, 0x97, 0x44, 0xd0, 0xf8,
0xd6, 0x50, 0x41, 0x6b, 0xc1, 0x82, 0x6e, 0x18, 0x0e, 0x76, 0x5d, 0xce, 0x87, 0xdf, 0x24, 0x5f,
0x8e, 0xb0, 0xe3, 0xfa, 0x22, 0x9f, 0xd7, 0xfc, 0x26, 0xfa, 0x0e, 0x94, 0x45, 0x54, 0xca, 0x4a,
0x3b, 0x57, 0xd2, 0xf9, 0xe4, 0xb9, 0x9c, 0xe8, 0xa1, 0xfe, 0x6d, 0x0e, 0x1a, 0x7c, 0xc1, 0x56,
0xb9, 0x3f, 0x9e, 0xac, 0x7c, 0xab, 0x50, 0xdb, 0x0f, 0x74, 0x7f, 0x52, 0x41, 0x2a, 0x6c, 0x22,
0x22, 0x7d, 0xa6, 0x29, 0x60, 0x34, 0x22, 0x28, 0xcc, 0x15, 0x11, 0x14, 0x4f, 0x6b, 0xc1, 0x92,
0x31, 0x62, 0x49, 0x12, 0x23, 0xaa, 0xbf, 0x06, 0xd5, 0x10, 0x01, 0x6a, 0xa1, 0x59, 0xb9, 0x87,
0xaf, 0x98, 0xdf, 0x44, 0x1f, 0x05, 0x71, 0x11, 0x5b, 0xaa, 0x0b, 0x12, 0x5e, 0x62, 0x21, 0x91,
0xfa, 0xf7, 0x0a, 0x94, 0x38, 0xe5, 0xcb, 0x50, 0xe5, 0x46, 0x87, 0xc6, 0x8c, 0x8c, 0x3a, 0x70,
0x10, 0x09, 0x1a, 0x5f, 0x9d, 0xd5, 0xb9, 0x00, 0xe5, 0x98, 0xbd, 0x59, 0xe0, 0x6e, 0xc1, 0xff,
0x14, 0x32, 0x32, 0xe4, 0x13, 0xb1, 0x2f, 0xe8, 0x1c, 0x14, 0x07, 0x76, 0x5f, 0x9c, 0x0c, 0xb1,
0x86, 0xfa, 0xb5, 0x42, 0x0b, 0xf9, 0x1a, 0xee, 0xd9, 0x47, 0xd8, 0x39, 0x99, 0xbf, 0x02, 0xfa,
0x30, 0x24, 0xe6, 0x19, 0x93, 0x2f, 0xd1, 0x01, 0x3d, 0x0c, 0x36, 0x21, 0x2f, 0xab, 0x91, 0x84,
0xed, 0x0e, 0x17, 0xd2, 0x60, 0x33, 0xfe, 0x50, 0xa1, 0xb5, 0xdc, 0xe8, 0x54, 0x66, 0x8d, 0x76,
0x5e, 0x49, 0x22, 0xa3, 0xfe, 0x42, 0x81, 0x76, 0x50, 0x84, 0x71, 0x57, 0x4f, 0xe6, 0x3d, 0x29,
0x79, 0x35, 0xf9, 0xd5, 0xff, 0x17, 0xa5, 0x7c, 0xa2, 0xb4, 0x99, 0x32, 0x23, 0xbf, 0x90, 0x6f,
0xd1, 0x7a, 0x6e, 0x72, 0x42, 0xf3, 0x88, 0x4c, 0x1b, 0xca, 0xa2, 0x80, 0xc0, 0xca, 0xf9, 0xa2,
0x4d, 0x34, 0xec, 0xc2, 0x13, 0xec, 0x6d, 0x44, 0x8b, 0x30, 0x6f, 0x7a, 0x01, 0xc3, 0x47, 0x0c,
0x07, 0xfc, 0x88, 0xa1, 0x10, 0x3b, 0x62, 0xe0, 0x70, 0x75, 0x48, 0x45, 0x20, 0x31, 0x81, 0xd7,
0xb5, 0x60, 0xbf, 0xa3, 0x40, 0x8b, 0x8f, 0x42, 0xc7, 0x24, 0x29, 0xd1, 0x00, 0x7b, 0xd8, 0xf8,
0xa6, 0x4b, 0x05, 0xff, 0xad, 0x40, 0x33, 0xec, 0x75, 0xa9, 0xe3, 0xfc, 0x18, 0x8a, 0xb4, 0xd2,
0xc2, 0x39, 0x98, 0x6a, 0x1a, 0x18, 0x36, 0x31, 0xdb, 0x34, 0xd4, 0xde, 0x15, 0x01, 0x02, 0x6f,
0x06, 0xae, 0x3f, 0x7f, 0x7a, 0xd7, 0xcf, 0x43, 0x21, 0x7b, 0x4c, 0xe8, 0xb2, 0x13, 0xe0, 0x00,
0x80, 0x3e, 0x81, 0x12, 0xbb, 0xb0, 0xc1, 0x8f, 0xdd, 0x6e, 0x44, 0x49, 0xf3, 0xcb, 0x1c, 0xa1,
0x8a, 0x39, 0x05, 0x68, 0xbc, 0x93, 0xfa, 0xcb, 0xb0, 0x1c, 0x64, 0xa3, 0x6c, 0xd8, 0x59, 0x85,
0x56, 0xfd, 0x17, 0x05, 0xce, 0xee, 0x9c, 0x58, 0xbd, 0xb8, 0xf8, 0x2f, 0x43, 0x69, 0x34, 0xd0,
0x83, 0x5a, 0x2d, 0x6f, 0xd1, 0x30, 0x90, 0x8d, 0x8d, 0x0d, 0xe2, 0x43, 0xd8, 0x9a, 0x55, 0x05,
0x6c, 0xd7, 0x9e, 0xea, 0xda, 0x6f, 0x88, 0xf4, 0x19, 0x1b, 0xcc, 0x5b, 0xb1, 0x32, 0x54, 0x5d,
0x40, 0xa9, 0xb7, 0xfa, 0x04, 0x80, 0x3a, 0xf4, 0xee, 0x69, 0x9c, 0x38, 0xed, 0xf1, 0x94, 0x98,
0xec, 0x9f, 0xe7, 0xa0, 0x15, 0x5a, 0xa5, 0x6f, 0x3a, 0xbe, 0x49, 0xc9, 0xca, 0xf2, 0xaf, 0x28,
0x2b, 0x2b, 0xcc, 0x1f, 0xd3, 0x14, 0x65, 0x31, 0xcd, 0x6f, 0xe6, 0xa1, 0x11, 0xac, 0xda, 0xf6,
0x40, 0xb7, 0x52, 0x25, 0x61, 0x47, 0xc4, 0xf3, 0xd1, 0x75, 0x7a, 0x5f, 0xa6, 0x27, 0x29, 0x1b,
0xa1, 0xc5, 0x48, 0xa0, 0x8b, 0x74, 0xd3, 0x1d, 0x8f, 0x15, 0xbe, 0x78, 0x0e, 0xc1, 0x14, 0xd2,
0x1c, 0x62, 0x74, 0x1b, 0x10, 0xd7, 0xa2, 0xae, 0x69, 0x75, 0x5d, 0xdc, 0xb3, 0x2d, 0x83, 0xe9,
0x57, 0x51, 0x6b, 0xf2, 0x2f, 0x1d, 0x6b, 0x87, 0xc1, 0xd1, 0xc7, 0x50, 0xf0, 0x4e, 0x46, 0x2c,
0x5a, 0x69, 0x48, 0xfd, 0x7d, 0xc0, 0xd7, 0xee, 0xc9, 0x08, 0x6b, 0x14, 0xdd, 0xbf, 0xbe, 0xe3,
0x39, 0xfa, 0x11, 0x0f, 0xfd, 0x0a, 0x5a, 0x08, 0x42, 0x2c, 0x86, 0xbf, 0x86, 0x0b, 0x2c, 0x44,
0xe2, 0x4d, 0x26, 0xd9, 0xbe, 0xd2, 0x76, 0x3d, 0x6f, 0x40, 0x4b, 0x77, 0x54, 0xb2, 0x7d, 0xe8,
0xae, 0x37, 0x20, 0x93, 0xf4, 0x6c, 0x4f, 0x1f, 0x30, 0xfd, 0xa8, 0x70, 0xeb, 0x40, 0x20, 0x34,
0x31, 0xf9, 0xe7, 0x1c, 0x34, 0x03, 0xc6, 0x34, 0xec, 0x8e, 0x07, 0xe9, 0xfa, 0x38, 0xb9, 0x74,
0x32, 0x4d, 0x15, 0xbf, 0x0b, 0x55, 0x2e, 0x15, 0xa7, 0x90, 0x2a, 0x60, 0x5d, 0x9e, 0x4e, 0x10,
0xf3, 0xe2, 0x2b, 0x12, 0xf3, 0xd2, 0x0c, 0xc5, 0x07, 0xf9, 0xde, 0xa8, 0x3f, 0x51, 0xe0, 0xad,
0x84, 0xd5, 0x9c, 0xb8, 0xb4, 0x93, 0x53, 0x3f, 0x6e, 0x4d, 0xe3, 0x24, 0xb9, 0xfd, 0x7f, 0x08,
0x25, 0x87, 0x52, 0xe7, 0x67, 0x54, 0xd7, 0x26, 0x0a, 0x1f, 0x63, 0x44, 0xe3, 0x5d, 0xd4, 0x3f,
0x52, 0xe0, 0x7c, 0x92, 0xd5, 0x39, 0x9c, 0xfa, 0x2a, 0x2c, 0x30, 0xd2, 0xbe, 0x8e, 0xae, 0x4c,
0xd6, 0xd1, 0x60, 0x71, 0x34, 0xbf, 0xa3, 0xba, 0x03, 0xcb, 0xbe, 0xef, 0x0f, 0x96, 0x7e, 0x13,
0x7b, 0xfa, 0x84, 0xc4, 0xe7, 0x32, 0x54, 0x59, 0x04, 0xcd, 0x12, 0x0a, 0x56, 0x32, 0x80, 0x3d,
0x51, 0x69, 0x53, 0xff, 0x43, 0x81, 0x73, 0xd4, 0x79, 0xc6, 0x8f, 0x66, 0xb2, 0x1c, 0x18, 0xaa,
0xa2, 0x22, 0xb1, 0xa5, 0x0f, 0xf9, 0xdd, 0x91, 0x8a, 0x16, 0x81, 0xa1, 0x4e, 0xb2, 0x10, 0x27,
0x4d, 0x90, 0x83, 0x13, 0x52, 0x92, 0x8c, 0xd3, 0x03, 0xd2, 0x78, 0x05, 0x2e, 0x70, 0xda, 0x85,
0x59, 0x9c, 0xf6, 0x53, 0x78, 0x2b, 0x36, 0xd3, 0x39, 0x76, 0x54, 0xfd, 0x4b, 0x85, 0x6c, 0x47,
0xe4, 0x0e, 0xce, 0xec, 0x81, 0xeb, 0x45, 0x71, 0x26, 0xd4, 0x35, 0x8d, 0xb8, 0x11, 0x31, 0xd0,
0xa7, 0x50, 0xb1, 0xf0, 0x71, 0x37, 0x1c, 0x0b, 0x65, 0x88, 0xea, 0xcb, 0x16, 0x3e, 0xa6, 0xbf,
0xd4, 0x2d, 0x38, 0x9f, 0x60, 0x75, 0x9e, 0xb9, 0xff, 0x9d, 0x02, 0x17, 0xd6, 0x1d, 0x7b, 0xf4,
0xb9, 0xe9, 0x78, 0x63, 0x7d, 0x10, 0x3d, 0x7b, 0x7e, 0x3d, 0x95, 0xad, 0xcf, 0x42, 0x51, 0x31,
0x93, 0x9f, 0xdb, 0x12, 0x0d, 0x4a, 0x32, 0xc5, 0x27, 0x1d, 0x8a, 0xa1, 0xff, 0x3d, 0x2f, 0x63,
0x9e, 0xe3, 0x4d, 0x89, 0x4b, 0xb2, 0x24, 0x18, 0xd2, 0x42, 0x78, 0x7e, 0xd6, 0x42, 0x78, 0x8a,
0x79, 0x2f, 0xbc, 0x22, 0xf3, 0x7e, 0xea, 0xca, 0xcc, 0x67, 0x10, 0x3d, 0xa4, 0xa0, 0xde, 0x79,
0xa6, 0xd3, 0x8d, 0x55, 0x80, 0xa0, 0x60, 0xcf, 0xaf, 0x50, 0x66, 0x21, 0x13, 0xea, 0x45, 0x76,
0x4b, 0xb8, 0x52, 0xee, 0xe9, 0x43, 0x25, 0xe4, 0xef, 0x43, 0x5b, 0x26, 0xa5, 0xf3, 0x48, 0xfe,
0xcf, 0x73, 0x00, 0x1d, 0x71, 0xeb, 0x76, 0x36, 0x5f, 0x70, 0x0d, 0x42, 0xd1, 0x48, 0xa0, 0xef,
0x61, 0x29, 0x32, 0x88, 0x4a, 0x88, 0x9c, 0x94, 0xe0, 0x24, 0xf2, 0x54, 0x83, 0xd2, 0x09, 0x69,
0x0d, 0x13, 0x8a, 0xb8, 0xf9, 0x7d, 0x1b, 0x2a, 0x8e, 0x7d, 0xdc, 0x25, 0x6a, 0x66, 0xf8, 0xd7,
0x8a, 0x1d, 0xfb, 0x98, 0x28, 0x9f, 0x81, 0xce, 0xc3, 0x82, 0xa7, 0xbb, 0x87, 0x84, 0x3e, 0xab,
0x1b, 0x95, 0x48, 0xb3, 0x63, 0xa0, 0x73, 0x50, 0xdc, 0x37, 0x07, 0x98, 0xdd, 0x56, 0xa8, 0x68,
0xac, 0x81, 0xbe, 0xe5, 0xdf, 0x7f, 0x2b, 0x67, 0xbe, 0xe2, 0x42, 0xf1, 0xd5, 0xaf, 0x15, 0x58,
0x0c, 0x56, 0x8d, 0x1a, 0x20, 0x62, 0xd3, 0xa8, 0x3d, 0x5b, 0xb3, 0x0d, 0x66, 0x2a, 0x1a, 0x29,
0x1e, 0x81, 0x75, 0x64, 0x56, 0x2b, 0xe8, 0x32, 0x29, 0x4d, 0x26, 0xf3, 0x22, 0x93, 0x36, 0x0d,
0xff, 0x22, 0x7c, 0xc9, 0xb1, 0x8f, 0x3b, 0x86, 0x58, 0x0d, 0x76, 0x67, 0x98, 0x25, 0x85, 0x64,
0x35, 0xd6, 0xe8, 0xb5, 0xe1, 0x6b, 0x50, 0xc7, 0x8e, 0x63, 0x3b, 0xdd, 0x21, 0x76, 0x5d, 0xbd,
0x8f, 0x79, 0x7c, 0x5e, 0xa3, 0xc0, 0x4d, 0x06, 0x53, 0xff, 0xa4, 0x00, 0x8d, 0x60, 0x2a, 0xfe,
0x31, 0xb9, 0x69, 0xf8, 0xc7, 0xe4, 0x26, 0xd9, 0x3a, 0x70, 0x98, 0x29, 0x14, 0x9b, 0xbb, 0x9a,
0x6b, 0x29, 0x5a, 0x85, 0x43, 0x3b, 0x06, 0x71, 0xcb, 0x44, 0xc9, 0x2c, 0xdb, 0xc0, 0xc1, 0xe6,
0x82, 0x0f, 0xe2, 0x7b, 0x1b, 0x91, 0x91, 0x42, 0x06, 0x19, 0x29, 0x66, 0x90, 0x91, 0x92, 0x44,
0x46, 0x96, 0xa1, 0xb4, 0x37, 0xee, 0x1d, 0x62, 0x8f, 0x47, 0x6c, 0xbc, 0x15, 0x95, 0x9d, 0x72,
0x4c, 0x76, 0x84, 0x88, 0x54, 0xc2, 0x22, 0xf2, 0x36, 0x54, 0xd8, 0x79, 0x6d, 0xd7, 0x73, 0xe9,
0xe1, 0x53, 0x5e, 0x2b, 0x33, 0xc0, 0xae, 0x8b, 0x1e, 0xf8, 0xe1, 0x5c, 0x55, 0xa6, 0xec, 0xd4,
0xea, 0xc4, 0xa4, 0xc4, 0x0f, 0xe6, 0x6e, 0xc2, 0x62, 0x68, 0x39, 0xa8, 0x8f, 0xa8, 0x51, 0x56,
0x43, 0xd1, 0x3e, 0x75, 0x13, 0x37, 0xa0, 0x11, 0x2c, 0x09, 0xc5, 0xab, 0xb3, 0x24, 0x4b, 0x40,
0x29, 0x9a, 0x90, 0xe4, 0xc6, 0xe9, 0x24, 0x19, 0x5d, 0x80, 0x32, 0xcf, 0x8e, 0xdc, 0xd6, 0x62,
0xa4, 0x58, 0xa1, 0xfe, 0x10, 0x50, 0xc0, 0xfd, 0x7c, 0xd1, 0x62, 0x4c, 0x3c, 0x72, 0x71, 0xf1,
0x50, 0x7f, 0xaa, 0xc0, 0x52, 0x78, 0xb0, 0x59, 0x1d, 0xef, 0xa7, 0x50, 0x65, 0xc7, 0x7f, 0x5d,
0xa2, 0xf8, 0xbc, 0x08, 0x74, 0x71, 0xe2, 0xbe, 0x68, 0x10, 0xbc, 0x3a, 0x20, 0xe2, 0x75, 0x6c,
0x3b, 0x87, 0xa6, 0xd5, 0xef, 0x12, 0xce, 0x7c, 0x75, 0xab, 0x71, 0xe0, 0x16, 0x81, 0xa9, 0x5f,
0x29, 0x70, 0xe9, 0xd9, 0xc8, 0xd0, 0x3d, 0x1c, 0x8a, 0x40, 0xe6, 0xbd, 0xed, 0xf7, 0xb1, 0x7f,
0xdd, 0x2e, 0x97, 0xed, 0x08, 0x8b, 0x61, 0xab, 0x7f, 0x2d, 0x78, 0x49, 0x5c, 0x91, 0x9d, 0x9d,
0x97, 0x36, 0x94, 0x8f, 0x38, 0x39, 0xff, 0x15, 0x85, 0xdf, 0x8e, 0x1c, 0x93, 0xe6, 0x4f, 0x7f,
0x4c, 0xaa, 0x6e, 0xc2, 0x05, 0x0d, 0xbb, 0xd8, 0x32, 0x22, 0xb3, 0x99, 0xb9, 0xd8, 0x34, 0x82,
0xb6, 0x8c, 0xdc, 0x3c, 0xc2, 0xca, 0x62, 0xd7, 0xae, 0x43, 0xc8, 0x7a, 0xdc, 0x14, 0x93, 0x90,
0x89, 0x8e, 0xe3, 0xa9, 0x7f, 0x95, 0x83, 0xf3, 0x8f, 0x0c, 0x83, 0x5b, 0x71, 0x1e, 0x8d, 0xbd,
0xae, 0x40, 0x39, 0x1e, 0x48, 0xe6, 0x93, 0x81, 0xe4, 0xab, 0xb2, 0xac, 0xdc, 0xc7, 0x58, 0xe3,
0xa1, 0xef, 0x3b, 0x1d, 0x76, 0x7f, 0xe8, 0x21, 0x3f, 0x37, 0x23, 0x09, 0x3d, 0xf5, 0x9f, 0xd3,
0xe3, 0xab, 0xb2, 0x5f, 0x34, 0x53, 0x47, 0xd0, 0x4a, 0x2e, 0xd6, 0x9c, 0xa6, 0xc4, 0x5f, 0x91,
0x91, 0xcd, 0x0a, 0xac, 0x35, 0x12, 0x42, 0x51, 0xd0, 0xb6, 0xed, 0xaa, 0xff, 0x99, 0x83, 0xd6,
0x8e, 0x7e, 0x84, 0xff, 0xef, 0x6c, 0xd0, 0x17, 0x70, 0xce, 0xd5, 0x8f, 0x70, 0x37, 0x94, 0x18,
0x77, 0x1d, 0xfc, 0x82, 0x87, 0xa0, 0xef, 0xc9, 0x2c, 0x89, 0xf4, 0x9a, 0x8d, 0xb6, 0xe4, 0x46,
0xe0, 0x1a, 0x7e, 0x81, 0xde, 0x85, 0xc5, 0xf0, 0x3d, 0x2e, 0xc2, 0x5a, 0x99, 0x2e, 0x79, 0x3d,
0x74, 0x4d, 0xab, 0x63, 0xa8, 0x2f, 0xe0, 0x9d, 0x67, 0x96, 0x8b, 0xbd, 0x4e, 0x70, 0xd5, 0x68,
0xce, 0x14, 0xf2, 0x32, 0x54, 0x83, 0x85, 0x4f, 0xbc, 0x9c, 0x30, 0x5c, 0xd5, 0x86, 0xf6, 0xa6,
0xee, 0x1c, 0xfa, 0x65, 0xe6, 0x75, 0x76, 0x25, 0xe4, 0x35, 0x0e, 0xb8, 0x2f, 0x6e, 0x48, 0x69,
0x78, 0x1f, 0x3b, 0xd8, 0xea, 0xe1, 0xa7, 0x76, 0xef, 0x90, 0x84, 0x1b, 0x1e, 0x7b, 0xc6, 0xa6,
0x84, 0x82, 0xce, 0xf5, 0xd0, 0x2b, 0xb5, 0x5c, 0xe4, 0x95, 0xda, 0x94, 0x97, 0x8d, 0xea, 0xcf,
0x72, 0xb0, 0xfc, 0x68, 0xe0, 0x61, 0x27, 0xc8, 0xfc, 0x4f, 0x53, 0xc4, 0x08, 0xaa, 0x0a, 0xb9,
0x19, 0xaa, 0x0a, 0x89, 0xeb, 0xe3, 0xf9, 0xe4, 0xf5, 0x71, 0x59, 0x0d, 0xa4, 0x30, 0x63, 0x0d,
0xe4, 0x11, 0xc0, 0xc8, 0xb1, 0x47, 0xd8, 0xf1, 0x4c, 0xec, 0xa7, 0x6f, 0x19, 0xc2, 0x97, 0x50,
0x27, 0xf5, 0x0b, 0x68, 0x3e, 0xe9, 0xad, 0xd9, 0xd6, 0xbe, 0xe9, 0x0c, 0xfd, 0x85, 0x4a, 0x28,
0x9d, 0x92, 0x41, 0xe9, 0x72, 0x09, 0xa5, 0x53, 0x4d, 0x58, 0x0a, 0xd1, 0x9e, 0xd3, 0x70, 0xf5,
0x7b, 0xdd, 0x7d, 0xd3, 0x32, 0xe9, 0x95, 0xab, 0x1c, 0x0d, 0x3f, 0xa1, 0xdf, 0xdb, 0xe0, 0x90,
0x5b, 0x9f, 0x8a, 0xcb, 0xaa, 0xbb, 0x27, 0x23, 0x8c, 0x16, 0x20, 0xbf, 0x85, 0x8f, 0x9b, 0x67,
0x10, 0x40, 0x69, 0xcb, 0x76, 0x86, 0xfa, 0xa0, 0xa9, 0xa0, 0x2a, 0x2c, 0xf0, 0xb3, 0xb9, 0x66,
0x0e, 0xd5, 0xa1, 0xb2, 0xe6, 0x9f, 0x6f, 0x34, 0xf3, 0xb7, 0xfe, 0x4c, 0x81, 0xa5, 0xc4, 0xe9,
0x11, 0x6a, 0x00, 0x3c, 0xb3, 0x7a, 0xfc, 0x58, 0xad, 0x79, 0x06, 0xd5, 0xa0, 0xec, 0x1f, 0xb2,
0x31, 0x7a, 0xbb, 0x36, 0xc5, 0x6e, 0xe6, 0x50, 0x13, 0x6a, 0xac, 0xe3, 0xb8, 0xd7, 0xc3, 0xae,
0xdb, 0xcc, 0x0b, 0xc8, 0x86, 0x6e, 0x0e, 0xc6, 0x0e, 0x6e, 0x16, 0xc8, 0x98, 0xbb, 0xb6, 0x86,
0x07, 0x58, 0x77, 0x71, 0xb3, 0x88, 0x10, 0x34, 0x78, 0xc3, 0xef, 0x54, 0x0a, 0xc1, 0xfc, 0x6e,
0x0b, 0xb7, 0x9e, 0x87, 0xcf, 0x00, 0xe8, 0xf4, 0xce, 0xc3, 0xd9, 0x67, 0x96, 0x81, 0xf7, 0x4d,
0x0b, 0x1b, 0xc1, 0xa7, 0xe6, 0x19, 0x74, 0x16, 0x16, 0x37, 0xb1, 0xd3, 0xc7, 0x21, 0x60, 0x0e,
0x2d, 0x41, 0x7d, 0xd3, 0x7c, 0x19, 0x02, 0xe5, 0xd5, 0x42, 0x59, 0x69, 0x2a, 0xf7, 0xff, 0xeb,
0x2a, 0x54, 0x88, 0x6c, 0xad, 0xd9, 0xb6, 0x63, 0xa0, 0x01, 0x20, 0xfa, 0x2e, 0x64, 0x38, 0xb2,
0x2d, 0xf1, 0x90, 0x0c, 0xdd, 0x89, 0x6e, 0x0f, 0x6f, 0x24, 0x11, 0xb9, 0xec, 0xb4, 0xaf, 0x4b,
0xf1, 0x63, 0xc8, 0xea, 0x19, 0x34, 0xa4, 0xa3, 0xed, 0x9a, 0x43, 0xbc, 0x6b, 0xf6, 0x0e, 0xfd,
0x00, 0xe9, 0x5e, 0x4a, 0x38, 0x94, 0x44, 0xf5, 0xc7, 0xbb, 0x26, 0x1d, 0x8f, 0x3d, 0xdc, 0xf1,
0x65, 0x4e, 0x3d, 0x83, 0x5e, 0xc0, 0xb9, 0x27, 0x38, 0x14, 0x6b, 0xfa, 0x03, 0xde, 0x4f, 0x1f,
0x30, 0x81, 0x7c, 0xca, 0x21, 0x9f, 0x42, 0x91, 0x8a, 0x1b, 0x92, 0x85, 0xa3, 0xe1, 0x37, 0xdf,
0xed, 0x2b, 0xe9, 0x08, 0x82, 0xda, 0x0f, 0x61, 0x31, 0xf6, 0x52, 0x14, 0xc9, 0x9c, 0x93, 0xfc,
0xcd, 0x6f, 0xfb, 0x56, 0x16, 0x54, 0x31, 0x56, 0x1f, 0x1a, 0xd1, 0xf7, 0x24, 0x68, 0x25, 0xc3,
0xd3, 0x34, 0x36, 0xd2, 0x7b, 0x99, 0x1f, 0xb1, 0x51, 0x21, 0x68, 0xc6, 0x5f, 0x2e, 0xa2, 0x5b,
0x13, 0x09, 0x44, 0x85, 0xed, 0xfd, 0x4c, 0xb8, 0x62, 0xb8, 0x13, 0x2a, 0x04, 0x89, 0x17, 0x63,
0x71, 0x19, 0xf7, 0xc9, 0xa4, 0x3d, 0x65, 0x6b, 0xdf, 0xcd, 0x8c, 0x2f, 0x86, 0xfe, 0x2d, 0x76,
0xf9, 0x46, 0xf6, 0xea, 0x0a, 0x7d, 0x28, 0x27, 0x37, 0xe1, 0xb9, 0x58, 0xfb, 0xfe, 0x69, 0xba,
0x08, 0x26, 0x7e, 0x4c, 0x6f, 0xcd, 0x48, 0xde, 0x2d, 0xc5, 0xf5, 0xce, 0xa7, 0x97, 0xfe, 0x24,
0xab, 0xfd, 0xe1, 0x29, 0x7a, 0x08, 0x06, 0xec, 0xf8, 0xd3, 0x50, 0x5f, 0x0d, 0xef, 0x4e, 0x95,
0x9a, 0xd9, 0x74, 0xf0, 0x07, 0xb0, 0x18, 0x0b, 0xd7, 0x50, 0xf6, 0x90, 0xae, 0x3d, 0xc9, 0x35,
0x31, 0x95, 0x8c, 0x5d, 0x42, 0x42, 0x29, 0xd2, 0x2f, 0xb9, 0xa8, 0xd4, 0xbe, 0x95, 0x05, 0x55,
0x4c, 0xc4, 0xa5, 0xe6, 0x32, 0x76, 0xb5, 0x04, 0xdd, 0x96, 0xd3, 0x90, 0x5f, 0xa1, 0x69, 0x7f,
0x90, 0x11, 0x5b, 0x0c, 0x7a, 0x04, 0x67, 0x25, 0x37, 0x80, 0xd0, 0x07, 0x13, 0x37, 0x2b, 0x7e,
0xf5, 0xa9, 0x7d, 0x27, 0x2b, 0xba, 0x18, 0xf7, 0xd7, 0x01, 0xed, 0x1c, 0xd8, 0xc7, 0x34, 0x72,
0xe8, 0x8f, 0x1d, 0x9d, 0x05, 0x3b, 0x69, 0xbe, 0x21, 0x89, 0x9a, 0x22, 0xa3, 0x13, 0x7b, 0x88,
0xc1, 0xbb, 0x00, 0x4f, 0xb0, 0xb7, 0x89, 0x3d, 0x87, 0x28, 0xc6, 0xbb, 0x69, 0xee, 0x8f, 0x23,
0xf8, 0x43, 0xdd, 0x9c, 0x8a, 0x17, 0x72, 0x45, 0xcd, 0x4d, 0xdd, 0x1a, 0xeb, 0x83, 0xd0, 0x13,
0x86, 0xdb, 0xd2, 0xee, 0x71, 0xb4, 0x94, 0x8d, 0x4c, 0xc5, 0x16, 0x43, 0x1e, 0x0b, 0xd7, 0x1e,
0x3a, 0x51, 0x9c, 0xec, 0xda, 0x93, 0xb7, 0x59, 0xe2, 0x66, 0x6f, 0x02, 0xbe, 0x18, 0xf8, 0x4b,
0x85, 0x5e, 0x22, 0x8b, 0x21, 0x3c, 0x37, 0xbd, 0x83, 0xed, 0x81, 0x6e, 0xb9, 0x59, 0x58, 0xa0,
0x88, 0xa7, 0x60, 0x81, 0xe3, 0x0b, 0x16, 0x0c, 0xa8, 0x47, 0x0e, 0xfa, 0x90, 0xec, 0xce, 0xbf,
0xec, 0xd0, 0xb3, 0xbd, 0x32, 0x1d, 0x51, 0x8c, 0x72, 0x00, 0x75, 0x5f, 0x95, 0xd8, 0xe2, 0xbe,
0x97, 0xc6, 0x69, 0x80, 0x93, 0x62, 0x09, 0xe4, 0xa8, 0x61, 0x4b, 0x90, 0x3c, 0xc7, 0x40, 0xd9,
0xce, 0xbf, 0x26, 0x59, 0x82, 0xf4, 0xc3, 0x11, 0x66, 0xea, 0x62, 0x67, 0x86, 0x72, 0x3b, 0x2a,
0x3d, 0x02, 0x95, 0x9a, 0xba, 0x94, 0x23, 0x48, 0xf5, 0x0c, 0x7a, 0x0e, 0x25, 0xfe, 0x47, 0x27,
0xd7, 0x27, 0xd7, 0x1e, 0x39, 0xf5, 0x1b, 0x53, 0xb0, 0x04, 0xe1, 0x43, 0x38, 0x9f, 0x52, 0x79,
0x94, 0xba, 0xe0, 0xc9, 0x55, 0xca, 0x69, 0xce, 0x41, 0x0c, 0x96, 0x28, 0x2d, 0x4e, 0x18, 0x2c,
0xad, 0x0c, 0x39, 0x6d, 0xb0, 0x2e, 0x2c, 0x25, 0xaa, 0x36, 0xe8, 0xfd, 0x14, 0x47, 0x27, 0xab,
0xed, 0x4c, 0x1b, 0xa0, 0x0f, 0x6f, 0x49, 0x2b, 0x14, 0x52, 0xc7, 0x3d, 0xa9, 0x96, 0x31, 0x6d,
0xa0, 0x1e, 0x9c, 0x95, 0xd4, 0x25, 0xa4, 0x2e, 0x27, 0xbd, 0x7e, 0x31, 0x6d, 0x90, 0x7d, 0x68,
0xaf, 0x3a, 0xb6, 0x6e, 0xf4, 0x74, 0xd7, 0xa3, 0xb5, 0x02, 0x92, 0x45, 0xf9, 0x91, 0x93, 0x3c,
0xac, 0x96, 0x56, 0x14, 0xa6, 0x8d, 0xb3, 0x07, 0x55, 0xba, 0x95, 0xec, 0x2f, 0x28, 0x90, 0xdc,
0x47, 0x84, 0x30, 0x52, 0x0c, 0x8f, 0x0c, 0x51, 0x08, 0xf5, 0x2e, 0x54, 0xd7, 0xe8, 0x91, 0x4a,
0xc7, 0x32, 0xf0, 0xcb, 0xb8, 0xbf, 0xa2, 0xaf, 0x6f, 0xef, 0x84, 0x10, 0x32, 0xaf, 0x50, 0x9d,
0x06, 0xb4, 0x06, 0x7e, 0xc9, 0xf6, 0x79, 0x45, 0x46, 0x37, 0x82, 0x92, 0x92, 0x00, 0x48, 0x31,
0x43, 0x9e, 0xfe, 0x5c, 0x38, 0xcc, 0x13, 0xc3, 0xdd, 0x4d, 0x21, 0x92, 0xc0, 0xf4, 0x47, 0xbd,
0x97, 0xbd, 0x43, 0xd8, 0x33, 0xf8, 0x7c, 0x75, 0xe8, 0x79, 0xce, 0xcd, 0x49, 0xac, 0x87, 0x63,
0xb7, 0x95, 0xe9, 0x88, 0x62, 0x94, 0x6d, 0xa8, 0x10, 0xe9, 0x64, 0xdb, 0x73, 0x5d, 0xd6, 0x51,
0x7c, 0xce, 0xbe, 0x39, 0xeb, 0xd8, 0xed, 0x39, 0xe6, 0x1e, 0xdf, 0x74, 0x29, 0x3b, 0x11, 0x94,
0x89, 0x9b, 0x13, 0xc3, 0x14, 0x9c, 0xff, 0x06, 0x8d, 0xd6, 0x29, 0x74, 0x75, 0x6c, 0x0e, 0x8c,
0x6d, 0xc7, 0xee, 0xd3, 0x97, 0x2f, 0xf7, 0x26, 0x4d, 0x3f, 0x82, 0x9a, 0x1a, 0x89, 0x4d, 0xe8,
0x21, 0xc6, 0xff, 0x55, 0xa8, 0x88, 0xf2, 0x11, 0x92, 0xdd, 0xd8, 0x8a, 0x17, 0xae, 0xda, 0xd7,
0x27, 0x23, 0xf9, 0x94, 0xef, 0x7f, 0x5d, 0x81, 0xb2, 0xff, 0xca, 0xe7, 0x1b, 0xae, 0x7b, 0xbc,
0x81, 0x42, 0xc4, 0x0f, 0x60, 0x31, 0xf6, 0xe2, 0x5e, 0x6a, 0xe3, 0xe4, 0xaf, 0xf2, 0xa7, 0x09,
0xe3, 0x73, 0xfe, 0x27, 0x71, 0x22, 0x27, 0xb9, 0x99, 0x56, 0xcc, 0x88, 0xa7, 0x23, 0x53, 0x08,
0xff, 0xef, 0x4e, 0x02, 0xb6, 0x00, 0x42, 0xe1, 0xff, 0xe4, 0xbb, 0xb0, 0x24, 0xa2, 0x9d, 0xb6,
0x5a, 0x43, 0x69, 0x84, 0xff, 0x5e, 0x96, 0x7b, 0x85, 0xe9, 0x31, 0x5a, 0x7a, 0x5c, 0xff, 0x0c,
0x6a, 0xe1, 0x5b, 0xea, 0x48, 0xfa, 0x97, 0x64, 0xc9, 0x6b, 0xec, 0xd3, 0x66, 0xb1, 0x79, 0xca,
0xd0, 0x6f, 0x0a, 0x39, 0x17, 0x50, 0xf2, 0x7c, 0x53, 0x1a, 0x2a, 0xa7, 0x9e, 0xaa, 0x4a, 0x43,
0xe5, 0xf4, 0x43, 0x53, 0x56, 0xd3, 0x8a, 0x1f, 0xda, 0x49, 0x6b, 0x5a, 0x29, 0xc7, 0xa0, 0xd2,
0x9a, 0x56, 0xda, 0x29, 0xa0, 0x7a, 0x66, 0xf5, 0xa3, 0x2f, 0x3e, 0xec, 0x9b, 0xde, 0xc1, 0x78,
0x8f, 0xcc, 0xfe, 0x2e, 0xeb, 0xfa, 0x81, 0x69, 0xf3, 0x5f, 0x77, 0x7d, 0x71, 0xbf, 0x4b, 0xa9,
0xdd, 0x25, 0xd4, 0x46, 0x7b, 0x7b, 0x25, 0xda, 0xfa, 0xe8, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff,
0x4a, 0x84, 0x21, 0x10, 0xf9, 0x52, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -5211,6 +5311,7 @@ type DataCoordClient interface {
DescribeIndex(ctx context.Context, in *indexpb.DescribeIndexRequest, opts ...grpc.CallOption) (*indexpb.DescribeIndexResponse, error)
// Deprecated: use DescribeIndex instead
GetIndexBuildProgress(ctx context.Context, in *indexpb.GetIndexBuildProgressRequest, opts ...grpc.CallOption) (*indexpb.GetIndexBuildProgressResponse, error)
GcConfirm(ctx context.Context, in *GcConfirmRequest, opts ...grpc.CallOption) (*GcConfirmResponse, error)
}
type dataCoordClient struct {
@ -5572,6 +5673,15 @@ func (c *dataCoordClient) GetIndexBuildProgress(ctx context.Context, in *indexpb
return out, nil
}
func (c *dataCoordClient) GcConfirm(ctx context.Context, in *GcConfirmRequest, opts ...grpc.CallOption) (*GcConfirmResponse, error) {
out := new(GcConfirmResponse)
err := c.cc.Invoke(ctx, "/milvus.proto.data.DataCoord/GcConfirm", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// DataCoordServer is the server API for DataCoord service.
type DataCoordServer interface {
GetComponentStates(context.Context, *milvuspb.GetComponentStatesRequest) (*milvuspb.ComponentStates, error)
@ -5617,6 +5727,7 @@ type DataCoordServer interface {
DescribeIndex(context.Context, *indexpb.DescribeIndexRequest) (*indexpb.DescribeIndexResponse, error)
// Deprecated: use DescribeIndex instead
GetIndexBuildProgress(context.Context, *indexpb.GetIndexBuildProgressRequest) (*indexpb.GetIndexBuildProgressResponse, error)
GcConfirm(context.Context, *GcConfirmRequest) (*GcConfirmResponse, error)
}
// UnimplementedDataCoordServer can be embedded to have forward compatible implementations.
@ -5740,6 +5851,9 @@ func (*UnimplementedDataCoordServer) DescribeIndex(ctx context.Context, req *ind
func (*UnimplementedDataCoordServer) GetIndexBuildProgress(ctx context.Context, req *indexpb.GetIndexBuildProgressRequest) (*indexpb.GetIndexBuildProgressResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetIndexBuildProgress not implemented")
}
func (*UnimplementedDataCoordServer) GcConfirm(ctx context.Context, req *GcConfirmRequest) (*GcConfirmResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method GcConfirm not implemented")
}
func RegisterDataCoordServer(s *grpc.Server, srv DataCoordServer) {
s.RegisterService(&_DataCoord_serviceDesc, srv)
@ -6447,6 +6561,24 @@ func _DataCoord_GetIndexBuildProgress_Handler(srv interface{}, ctx context.Conte
return interceptor(ctx, in, info, handler)
}
func _DataCoord_GcConfirm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GcConfirmRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(DataCoordServer).GcConfirm(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/milvus.proto.data.DataCoord/GcConfirm",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(DataCoordServer).GcConfirm(ctx, req.(*GcConfirmRequest))
}
return interceptor(ctx, in, info, handler)
}
var _DataCoord_serviceDesc = grpc.ServiceDesc{
ServiceName: "milvus.proto.data.DataCoord",
HandlerType: (*DataCoordServer)(nil),
@ -6607,6 +6739,10 @@ var _DataCoord_serviceDesc = grpc.ServiceDesc{
MethodName: "GetIndexBuildProgress",
Handler: _DataCoord_GetIndexBuildProgress_Handler,
},
{
MethodName: "GcConfirm",
Handler: _DataCoord_GcConfirm_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "data_coord.proto",

View File

@ -18,20 +18,22 @@ package proxy
import (
"context"
"sync/atomic"
"github.com/milvus-io/milvus/internal/proto/indexpb"
"github.com/milvus-io/milvus-proto/go-api/commonpb"
"github.com/milvus-io/milvus-proto/go-api/milvuspb"
"github.com/milvus-io/milvus/internal/proto/datapb"
"github.com/milvus-io/milvus/internal/proto/indexpb"
"github.com/milvus-io/milvus/internal/proto/internalpb"
"github.com/milvus-io/milvus/internal/types"
"github.com/milvus-io/milvus/internal/util/funcutil"
"github.com/milvus-io/milvus/internal/util/typeutil"
"github.com/milvus-io/milvus/internal/util/uniquegenerator"
"go.uber.org/atomic"
)
type DataCoordMock struct {
types.DataCoord
nodeID typeutil.UniqueID
address string

View File

@ -40,6 +40,7 @@ type Broker interface {
UnsetIsImportingState(context.Context, *datapb.UnsetIsImportingStateRequest) (*commonpb.Status, error)
MarkSegmentsDropped(context.Context, *datapb.MarkSegmentsDroppedRequest) (*commonpb.Status, error)
GetSegmentStates(context.Context, *datapb.GetSegmentStatesRequest) (*datapb.GetSegmentStatesResponse, error)
GcConfirm(ctx context.Context, collectionID, partitionID UniqueID) bool
DropCollectionIndex(ctx context.Context, collID UniqueID, partIDs []UniqueID) error
GetSegmentIndexState(ctx context.Context, collID UniqueID, indexName string, segIDs []UniqueID) ([]*indexpb.SegmentIndexState, error)
@ -235,3 +236,15 @@ func (b *ServerBroker) DescribeIndex(ctx context.Context, colID UniqueID) (*inde
CollectionID: colID,
})
}
func (b *ServerBroker) GcConfirm(ctx context.Context, collectionID, partitionID UniqueID) bool {
req := &datapb.GcConfirmRequest{CollectionId: collectionID, PartitionId: partitionID}
resp, err := b.s.dataCoord.GcConfirm(ctx, req)
if err != nil {
return false
}
if resp.GetStatus().GetErrorCode() != commonpb.ErrorCode_Success {
return false
}
return resp.GetGcFinished()
}

View File

@ -5,15 +5,15 @@ import (
"errors"
"testing"
"github.com/milvus-io/milvus/internal/proto/indexpb"
"github.com/milvus-io/milvus/internal/metastore/model"
"github.com/milvus-io/milvus-proto/go-api/milvuspb"
"github.com/milvus-io/milvus/internal/proto/datapb"
"github.com/milvus-io/milvus-proto/go-api/commonpb"
"github.com/milvus-io/milvus/internal/proto/datapb"
"github.com/milvus-io/milvus-proto/go-api/milvuspb"
"github.com/milvus-io/milvus/internal/metastore/model"
"github.com/milvus-io/milvus/internal/mocks"
"github.com/milvus-io/milvus/internal/proto/indexpb"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
)
func TestServerBroker_ReleaseCollection(t *testing.T) {
@ -304,3 +304,42 @@ func TestServerBroker_BroadcastAlteredCollection(t *testing.T) {
assert.NoError(t, err)
})
}
func TestServerBroker_GcConfirm(t *testing.T) {
t.Run("invalid datacoord", func(t *testing.T) {
dc := mocks.NewDataCoord(t)
dc.On("GcConfirm",
mock.Anything, // context.Context
mock.Anything, // *datapb.GcConfirmRequest
).Return(nil, errors.New("error mock GcConfirm"))
c := newTestCore(withDataCoord(dc))
broker := newServerBroker(c)
assert.False(t, broker.GcConfirm(context.Background(), 100, 10000))
})
t.Run("non success", func(t *testing.T) {
dc := mocks.NewDataCoord(t)
dc.On("GcConfirm",
mock.Anything, // context.Context
mock.Anything, // *datapb.GcConfirmRequest
).Return(
&datapb.GcConfirmResponse{Status: failStatus(commonpb.ErrorCode_UnexpectedError, "error mock GcConfirm")},
nil)
c := newTestCore(withDataCoord(dc))
broker := newServerBroker(c)
assert.False(t, broker.GcConfirm(context.Background(), 100, 10000))
})
t.Run("normal case", func(t *testing.T) {
dc := mocks.NewDataCoord(t)
dc.On("GcConfirm",
mock.Anything, // context.Context
mock.Anything, // *datapb.GcConfirmRequest
).Return(
&datapb.GcConfirmResponse{Status: succStatus(), GcFinished: true},
nil)
c := newTestCore(withDataCoord(dc))
broker := newServerBroker(c)
assert.True(t, broker.GcConfirm(context.Background(), 100, 10000))
})
}

View File

@ -91,6 +91,7 @@ func (t *dropCollectionTask) Execute(ctx context.Context) error {
baseStep: baseStep{core: t.core},
pChannels: collMeta.PhysicalChannelNames,
})
redoTask.AddAsyncStep(newConfirmGCStep(t.core, collMeta.CollectionID, allPartition))
redoTask.AddAsyncStep(&deleteCollectionMetaStep{
baseStep: baseStep{core: t.core},
collectionID: collMeta.CollectionID,

View File

@ -4,6 +4,7 @@ import (
"context"
"errors"
"testing"
"time"
"github.com/milvus-io/milvus/internal/common"
@ -148,6 +149,9 @@ func Test_dropCollectionTask_Execute(t *testing.T) {
t.Run("normal case, redo", func(t *testing.T) {
defer cleanTestEnv()
confirmGCInterval = time.Millisecond
defer restoreConfirmGCInterval()
collectionName := funcutil.GenRandomStr()
shardNum := 2
@ -187,8 +191,12 @@ func Test_dropCollectionTask_Execute(t *testing.T) {
broker.DropCollectionIndexFunc = func(ctx context.Context, collID UniqueID, partIDs []UniqueID) error {
dropIndexCalled = true
dropIndexChan <- struct{}{}
time.Sleep(confirmGCInterval)
return nil
}
broker.GCConfirmFunc = func(ctx context.Context, collectionID, partitionID UniqueID) bool {
return true
}
gc := newMockGarbageCollector()
deleteCollectionCalled := false

View File

@ -79,6 +79,7 @@ func (t *dropPartitionTask) Execute(ctx context.Context) error {
CollectionID: t.collMeta.CollectionID,
},
})
redoTask.AddAsyncStep(newConfirmGCStep(t.core, t.collMeta.CollectionID, partID))
redoTask.AddAsyncStep(&removePartitionMetaStep{
baseStep: baseStep{core: t.core},
collectionID: t.collMeta.CollectionID,

View File

@ -3,6 +3,7 @@ package rootcoord
import (
"context"
"testing"
"time"
"github.com/milvus-io/milvus/internal/metastore/model"
"github.com/milvus-io/milvus/internal/proto/etcdpb"
@ -125,6 +126,9 @@ func Test_dropPartitionTask_Execute(t *testing.T) {
})
t.Run("normal case", func(t *testing.T) {
confirmGCInterval = time.Millisecond
defer restoreConfirmGCInterval()
collectionName := funcutil.GenRandomStr()
partitionName := funcutil.GenRandomStr()
coll := &model.Collection{Name: collectionName, Partitions: []*model.Partition{{PartitionName: partitionName}}}
@ -146,10 +150,23 @@ func Test_dropPartitionTask_Execute(t *testing.T) {
gc.GcPartitionDataFunc = func(ctx context.Context, pChannels []string, coll *model.Partition) (Timestamp, error) {
deletePartitionChan <- struct{}{}
deletePartitionCalled = true
time.Sleep(confirmGCInterval)
return 0, nil
}
core := newTestCore(withValidProxyManager(), withMeta(meta), withGarbageCollector(gc), withDropIndex())
broker := newMockBroker()
broker.GCConfirmFunc = func(ctx context.Context, collectionID, partitionID UniqueID) bool {
return true
}
broker.DropCollectionIndexFunc = func(ctx context.Context, collID UniqueID, partIDs []UniqueID) error {
return nil
}
core := newTestCore(
withValidProxyManager(),
withMeta(meta),
withGarbageCollector(gc),
withBroker(broker))
task := &dropPartitionTask{
baseTask: baseTask{core: core},

View File

@ -35,7 +35,6 @@ import (
"github.com/milvus-io/milvus-proto/go-api/milvuspb"
"github.com/milvus-io/milvus/internal/log"
"github.com/milvus-io/milvus/internal/metastore"
"github.com/milvus-io/milvus/internal/metastore/kv/rootcoord"
"github.com/milvus-io/milvus/internal/metastore/model"
"github.com/milvus-io/milvus/internal/proto/internalpb"
"github.com/milvus-io/milvus/internal/util/contextutil"
@ -43,29 +42,6 @@ import (
"github.com/milvus-io/milvus/internal/util/typeutil"
)
const (
// TimestampPrefix prefix for timestamp
TimestampPrefix = rootcoord.ComponentPrefix + "/timestamp"
// CreateCollectionDDType name of DD type for create collection
CreateCollectionDDType = "CreateCollection"
// DropCollectionDDType name of DD type for drop collection
DropCollectionDDType = "DropCollection"
// CreatePartitionDDType name of DD type for create partition
CreatePartitionDDType = "CreatePartition"
// DropPartitionDDType name of DD type for drop partition
DropPartitionDDType = "DropPartition"
// DefaultIndexType name of default index type for scalar field
DefaultIndexType = "STL_SORT"
// DefaultStringIndexType name of default index type for varChar/string field
DefaultStringIndexType = "Trie"
)
//go:generate mockery --name=IMetaTable --outpkg=mockrootcoord
type IMetaTable interface {
AddCollection(ctx context.Context, coll *model.Collection) error

View File

@ -765,6 +765,8 @@ type mockBroker struct {
GetSegmentIndexStateFunc func(ctx context.Context, collID UniqueID, indexName string, segIDs []UniqueID) ([]*indexpb.SegmentIndexState, error)
BroadcastAlteredCollectionFunc func(ctx context.Context, req *milvuspb.AlterCollectionRequest) error
GCConfirmFunc func(ctx context.Context, collectionID, partitionID UniqueID) bool
}
func newMockBroker() *mockBroker {
@ -799,6 +801,10 @@ func (b mockBroker) BroadcastAlteredCollection(ctx context.Context, req *milvusp
return b.BroadcastAlteredCollectionFunc(ctx, req)
}
func (b mockBroker) GcConfirm(ctx context.Context, collectionID, partitionID UniqueID) bool {
return b.GCConfirmFunc(ctx, collectionID, partitionID)
}
func withBroker(b Broker) Opt {
return func(c *Core) {
c.broker = b

View File

@ -3,6 +3,7 @@ package rootcoord
import (
"context"
"fmt"
"time"
"github.com/milvus-io/milvus-proto/go-api/milvuspb"
@ -14,10 +15,10 @@ import (
type stepPriority int
const (
stepPriorityLow = iota
stepPriorityNormal
stepPriorityImportant
stepPriorityUrgent
stepPriorityLow = 0
stepPriorityNormal = 1
stepPriorityImportant = 10
stepPriorityUrgent = 1000
)
type nestedStep interface {
@ -374,3 +375,50 @@ func (b *BroadcastAlteredCollectionStep) Execute(ctx context.Context) ([]nestedS
func (b *BroadcastAlteredCollectionStep) Desc() string {
return fmt.Sprintf("broadcast altered collection, collectionID: %d", b.req.CollectionID)
}
var (
confirmGCInterval = time.Minute * 20
allPartition UniqueID = -1
)
type confirmGCStep struct {
baseStep
collectionID UniqueID
partitionID UniqueID
lastScheduledTime time.Time
}
func newConfirmGCStep(core *Core, collectionID, partitionID UniqueID) *confirmGCStep {
return &confirmGCStep{
baseStep: baseStep{core: core},
collectionID: collectionID,
partitionID: partitionID,
lastScheduledTime: time.Now(),
}
}
func (b *confirmGCStep) Execute(ctx context.Context) ([]nestedStep, error) {
if time.Since(b.lastScheduledTime) < confirmGCInterval {
return nil, fmt.Errorf("wait for reschedule to confirm GC, collection: %d, partition: %d, last scheduled time: %s, now: %s",
b.collectionID, b.partitionID, b.lastScheduledTime.String(), time.Now().String())
}
finished := b.core.broker.GcConfirm(ctx, b.collectionID, b.partitionID)
if finished {
return nil, nil
}
b.lastScheduledTime = time.Now()
return nil, fmt.Errorf("GC is not finished, collection: %d, partition: %d, last scheduled time: %s, now: %s",
b.collectionID, b.partitionID, b.lastScheduledTime.String(), time.Now().String())
}
func (b *confirmGCStep) Desc() string {
return fmt.Sprintf("wait for GC finished, collection: %d, partition: %d, last scheduled time: %s, now: %s",
b.collectionID, b.partitionID, b.lastScheduledTime.String(), time.Now().String())
}
func (b *confirmGCStep) Weight() stepPriority {
return stepPriorityLow
}

View File

@ -2,6 +2,7 @@ package rootcoord
import (
"context"
"sort"
"sync"
"time"
@ -25,14 +26,26 @@ type stepStack struct {
steps []nestedStep
}
func (s *stepStack) totalPriority() int {
total := 0
for _, step := range s.steps {
total += int(step.Weight())
}
return total
}
func (s *stepStack) Execute(ctx context.Context) *stepStack {
steps := s.steps
for len(steps) > 0 {
l := len(steps)
todo := steps[l-1]
childSteps, err := todo.Execute(ctx)
// TODO: maybe a interface `step.LogOnError` is better.
_, skipLog := todo.(*waitForTsSyncedStep)
_, isWaitForTsSyncedStep := todo.(*waitForTsSyncedStep)
_, isConfirmGCStep := todo.(*confirmGCStep)
skipLog := isWaitForTsSyncedStep || isConfirmGCStep
if retry.IsUnRecoverable(err) {
if !skipLog {
log.Warn("failed to execute step, not able to reschedule", zap.Error(err), zap.String("step", todo.Desc()))
@ -76,8 +89,28 @@ func randomSelectPolicy(parallel int) selectStepPolicy {
}
}
func selectByPriority(parallel int, m map[*stepStack]struct{}) []*stepStack {
h := make([]*stepStack, 0, len(m))
for k := range m {
h = append(h, k)
}
sort.Slice(h, func(i, j int) bool {
return h[i].totalPriority() > h[j].totalPriority()
})
if len(h) <= parallel {
return h
}
return h[:parallel]
}
func selectByPriorityPolicy(parallel int) selectStepPolicy {
return func(m map[*stepStack]struct{}) []*stepStack {
return selectByPriority(parallel, m)
}
}
func defaultSelectPolicy() selectStepPolicy {
return randomSelectPolicy(defaultBgExecutingParallel)
return selectByPriorityPolicy(defaultBgExecutingParallel)
}
type bgOpt func(*bgStepExecutor)

View File

@ -8,7 +8,6 @@ import (
"time"
"github.com/milvus-io/milvus/internal/util/retry"
"github.com/stretchr/testify/assert"
)
@ -128,7 +127,7 @@ func Test_randomSelect(t *testing.T) {
func Test_bgStepExecutor_scheduleLoop(t *testing.T) {
bg := newBgStepExecutor(context.Background(),
withSelectStepPolicy(defaultSelectPolicy()),
withSelectStepPolicy(randomSelectPolicy(defaultBgExecutingParallel)),
withBgInterval(time.Millisecond*10))
bg.Start()
n := 20
@ -173,3 +172,43 @@ func Test_bgStepExecutor_scheduleLoop(t *testing.T) {
}
bg.Stop()
}
func Test_selectByPriorityPolicy(t *testing.T) {
policy := selectByPriorityPolicy(4)
t.Run("select all", func(t *testing.T) {
m := map[*stepStack]struct{}{
{steps: []nestedStep{}}: {},
{steps: []nestedStep{}}: {},
}
selected := policy(m)
assert.Equal(t, 2, len(selected))
})
t.Run("select by priority", func(t *testing.T) {
steps := []nestedStep{
&releaseCollectionStep{},
&releaseCollectionStep{},
&releaseCollectionStep{},
&releaseCollectionStep{},
&releaseCollectionStep{},
}
s1 := &stepStack{steps: steps[0:1]}
s2 := &stepStack{steps: steps[0:2]}
s3 := &stepStack{steps: steps[0:3]}
s4 := &stepStack{steps: steps[0:4]}
s5 := &stepStack{steps: steps[0:5]}
m := map[*stepStack]struct{}{
s1: {},
s2: {},
s3: {},
s4: {},
s5: {},
}
selected := policy(m)
assert.Equal(t, 4, len(selected))
for i := 1; i < len(selected); i++ {
assert.True(t, selected[i].totalPriority() <= selected[i-1].totalPriority())
}
})
}

View File

@ -3,6 +3,7 @@ package rootcoord
import (
"context"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
@ -27,3 +28,54 @@ func Test_waitForTsSyncedStep_Execute(t *testing.T) {
assert.Equal(t, 0, len(children))
assert.NoError(t, err)
}
func restoreConfirmGCInterval() {
confirmGCInterval = time.Minute * 20
}
func Test_confirmGCStep_Execute(t *testing.T) {
t.Run("wait for reschedule", func(t *testing.T) {
confirmGCInterval = time.Minute * 1000
defer restoreConfirmGCInterval()
s := &confirmGCStep{lastScheduledTime: time.Now()}
_, err := s.Execute(context.TODO())
assert.Error(t, err)
})
t.Run("GC not finished", func(t *testing.T) {
broker := newMockBroker()
broker.GCConfirmFunc = func(ctx context.Context, collectionID, partitionID UniqueID) bool {
return false
}
core := newTestCore(withBroker(broker))
confirmGCInterval = time.Millisecond
defer restoreConfirmGCInterval()
s := newConfirmGCStep(core, 100, 1000)
time.Sleep(confirmGCInterval)
_, err := s.Execute(context.TODO())
assert.Error(t, err)
})
t.Run("normal case", func(t *testing.T) {
broker := newMockBroker()
broker.GCConfirmFunc = func(ctx context.Context, collectionID, partitionID UniqueID) bool {
return true
}
core := newTestCore(withBroker(broker))
confirmGCInterval = time.Millisecond
defer restoreConfirmGCInterval()
s := newConfirmGCStep(core, 100, 1000)
time.Sleep(confirmGCInterval)
_, err := s.Execute(context.TODO())
assert.NoError(t, err)
})
}

View File

@ -331,6 +331,8 @@ type DataCoord interface {
CheckHealth(ctx context.Context, req *milvuspb.CheckHealthRequest) (*milvuspb.CheckHealthResponse, error)
GcConfirm(ctx context.Context, request *datapb.GcConfirmRequest) (*datapb.GcConfirmResponse, error)
// CreateIndex create an index on collection.
// Index building is asynchronous, so when an index building request comes, an IndexID is assigned to the task and
// will get all flushed segments from DataCoord and record tasks with these segments. The background process

View File

@ -19,16 +19,17 @@ package mock
import (
"context"
"google.golang.org/grpc"
"github.com/milvus-io/milvus-proto/go-api/commonpb"
"github.com/milvus-io/milvus-proto/go-api/milvuspb"
"github.com/milvus-io/milvus/internal/proto/datapb"
"github.com/milvus-io/milvus/internal/proto/internalpb"
"github.com/milvus-io/milvus/internal/types"
"google.golang.org/grpc"
)
// DataCoordClient mocks of DataCoordClient
type DataCoordClient struct {
types.DataCoord
Err error
}

View File

@ -36,6 +36,10 @@ type GrpcDataCoordClient struct {
Err error
}
func (m *GrpcDataCoordClient) GcConfirm(ctx context.Context, in *datapb.GcConfirmRequest, opts ...grpc.CallOption) (*datapb.GcConfirmResponse, error) {
return &datapb.GcConfirmResponse{}, m.Err
}
func (m *GrpcDataCoordClient) CheckHealth(ctx context.Context, in *milvuspb.CheckHealthRequest, opts ...grpc.CallOption) (*milvuspb.CheckHealthResponse, error) {
return &milvuspb.CheckHealthResponse{}, m.Err
}