From a0ce533727de0ba67cbdc517bfd101cc6330bb51 Mon Sep 17 00:00:00 2001 From: XuanYang-cn Date: Tue, 27 Sep 2022 16:02:53 +0800 Subject: [PATCH] Add a SyncSegments to sync meta between DN and DC (#19298) See also: #19072 Signed-off-by: yangxuan Signed-off-by: yangxuan --- internal/datacoord/compaction.go | 34 +- internal/datacoord/compaction_test.go | 376 +++++++++-------- internal/datacoord/meta.go | 71 ++-- internal/datacoord/meta_test.go | 265 ++++++------ internal/datacoord/session_manager.go | 20 + internal/datanode/compactor.go | 49 +-- internal/datanode/compactor_test.go | 56 +-- internal/datanode/data_node.go | 3 + internal/datanode/data_node_test.go | 1 - internal/proto/data_coord.proto | 1 + internal/proto/datapb/data_coord.pb.go | 539 +++++++++++++------------ 11 files changed, 761 insertions(+), 654 deletions(-) diff --git a/internal/datacoord/compaction.go b/internal/datacoord/compaction.go index 6c26e4e21a..87fff1f69f 100644 --- a/internal/datacoord/compaction.go +++ b/internal/datacoord/compaction.go @@ -246,7 +246,39 @@ func (c *compactionPlanHandler) completeCompaction(result *datapb.CompactionResu } func (c *compactionPlanHandler) handleMergeCompactionResult(plan *datapb.CompactionPlan, result *datapb.CompactionResult) error { - return c.meta.CompleteMergeCompaction(plan.GetSegmentBinlogs(), result) + oldSegments, modSegments, newSegment := c.meta.GetCompleteCompactionMeta(plan.GetSegmentBinlogs(), result) + log := log.With(zap.Int64("planID", plan.GetPlanID())) + + modInfos := make([]*datapb.SegmentInfo, len(modSegments)) + for i := range modSegments { + modInfos[i] = modSegments[i].SegmentInfo + } + + log.Debug("handleCompactionResult: altering metastore after compaction") + if err := c.meta.alterMetaStoreAfterCompaction(modInfos, newSegment.SegmentInfo); err != nil { + log.Warn("handleCompactionResult: fail to alter metastore after compaction", zap.Error(err)) + return fmt.Errorf("fail to alter metastore after compaction, err=%w", err) + } + + var nodeID = c.plans[plan.GetPlanID()].dataNodeID + req := &datapb.SyncSegmentsRequest{ + PlanID: plan.PlanID, + CompactedTo: newSegment.GetID(), + CompactedFrom: newSegment.GetCompactionFrom(), + NumOfRows: newSegment.GetNumOfRows(), + StatsLogs: newSegment.GetStatslogs(), + } + + log.Debug("handleCompactionResult: syncing segments with node", zap.Int64("nodeID", nodeID)) + if err := c.sessions.SyncSegments(nodeID, req); err != nil { + log.Warn("handleCompactionResult: fail to sync segments with node, reverting metastore", + zap.Int64("nodeID", nodeID), zap.String("reason", err.Error())) + return c.meta.revertAlterMetaStoreAfterCompaction(oldSegments, newSegment.SegmentInfo) + } + + c.meta.alterInMemoryMetaAfterCompaction(newSegment, modSegments) + log.Info("handleCompactionResult: success to handle merge compaction result") + return nil } // getCompaction return compaction task. If planId does not exist, return nil. diff --git a/internal/datacoord/compaction_test.go b/internal/datacoord/compaction_test.go index c6faaaef86..0f240ff06d 100644 --- a/internal/datacoord/compaction_test.go +++ b/internal/datacoord/compaction_test.go @@ -31,6 +31,7 @@ import ( "github.com/milvus-io/milvus/internal/util/tsoutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "go.uber.org/zap" ) @@ -218,193 +219,224 @@ func Test_compactionPlanHandler_execWithParallels(t *testing.T) { assert.Less(t, uint64(2), max-min) } -func Test_compactionPlanHandler_completeCompaction(t *testing.T) { - type fields struct { - plans map[int64]*compactionTask - sessions *SessionManager - meta *meta - flushCh chan UniqueID - } - type args struct { - result *datapb.CompactionResult - } - tests := []struct { - name string - fields fields - args args - wantErr bool - want *compactionTask - }{ - { - "test complete non existed compaction task", - fields{ - plans: map[int64]*compactionTask{1: {}}, - }, - args{ - result: &datapb.CompactionResult{PlanID: 2}, - }, - true, - nil, - }, - { - "test complete completed task", - fields{ - plans: map[int64]*compactionTask{1: {state: completed}}, - }, - args{ - result: &datapb.CompactionResult{PlanID: 1}, - }, - true, - nil, - }, - { - "test complete merge compaction", - fields{ - map[int64]*compactionTask{ - 1: { - triggerInfo: &compactionSignal{id: 1}, - state: executing, - plan: &datapb.CompactionPlan{ - PlanID: 1, - SegmentBinlogs: []*datapb.CompactionSegmentBinlogs{ +func TestCompactionPlanHandler_handleMergeCompactionResult(t *testing.T) { + mockDataNode := &mocks.DataNode{} + mockDataNode.EXPECT().SyncSegments(mock.Anything, mock.Anything).Run(func(ctx context.Context, req *datapb.SyncSegmentsRequest) {}).Return(&commonpb.Status{ErrorCode: commonpb.ErrorCode_Success}, nil) - {SegmentID: 1, FieldBinlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log1")}}, - {SegmentID: 2, FieldBinlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log2")}}, - }, - Type: datapb.CompactionType_MergeCompaction, - }, - }, - }, - nil, - &meta{ - catalog: &datacoord.Catalog{Txn: memkv.NewMemoryKV()}, - segments: &SegmentsInfo{ - map[int64]*SegmentInfo{ + dataNodeID := UniqueID(111) - 1: {SegmentInfo: &datapb.SegmentInfo{ID: 1, Binlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log1")}}}, - 2: {SegmentInfo: &datapb.SegmentInfo{ID: 2, Binlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log2")}}}, - }, - }, - }, - make(chan UniqueID, 1), + seg1 := &datapb.SegmentInfo{ + ID: 1, + Binlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(101, "log1")}, + Statslogs: []*datapb.FieldBinlog{getFieldBinlogPaths(101, "log2")}, + Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(101, "log3")}, + } + + seg2 := &datapb.SegmentInfo{ + ID: 2, + Binlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(101, "log4")}, + Statslogs: []*datapb.FieldBinlog{getFieldBinlogPaths(101, "log5")}, + Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(101, "log6")}, + } + + plan := &datapb.CompactionPlan{ + PlanID: 1, + SegmentBinlogs: []*datapb.CompactionSegmentBinlogs{ + { + SegmentID: seg1.ID, + FieldBinlogs: seg1.GetBinlogs(), + Field2StatslogPaths: seg1.GetStatslogs(), + Deltalogs: seg1.GetDeltalogs(), }, - args{ - result: &datapb.CompactionResult{ - PlanID: 1, - SegmentID: 3, - InsertLogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log3")}, - }, + { + SegmentID: seg2.ID, + FieldBinlogs: seg2.GetBinlogs(), + Field2StatslogPaths: seg2.GetStatslogs(), + Deltalogs: seg2.GetDeltalogs(), }, - false, - &compactionTask{ - triggerInfo: &compactionSignal{id: 1}, - state: completed, - plan: &datapb.CompactionPlan{ - PlanID: 1, - SegmentBinlogs: []*datapb.CompactionSegmentBinlogs{ - {SegmentID: 1, FieldBinlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log1")}}, - {SegmentID: 2, FieldBinlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log2")}}, - }, - Type: datapb.CompactionType_MergeCompaction, - }, + }, + Type: datapb.CompactionType_MergeCompaction, + } + + sessions := &SessionManager{ + sessions: struct { + sync.RWMutex + data map[int64]*Session + }{ + data: map[int64]*Session{ + dataNodeID: {client: mockDataNode}}, + }, + } + + task := &compactionTask{ + triggerInfo: &compactionSignal{id: 1}, + state: executing, + plan: plan, + dataNodeID: dataNodeID, + } + + plans := map[int64]*compactionTask{1: task} + + meta := &meta{ + catalog: &datacoord.Catalog{Txn: memkv.NewMemoryKV()}, + segments: &SegmentsInfo{ + map[int64]*SegmentInfo{ + seg1.ID: {SegmentInfo: seg1}, + seg2.ID: {SegmentInfo: seg2}, }, }, } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - c := &compactionPlanHandler{ - plans: tt.fields.plans, - sessions: tt.fields.sessions, - meta: tt.fields.meta, - flushCh: tt.fields.flushCh, - segRefer: &SegmentReferenceManager{ - segmentsLock: map[UniqueID]map[UniqueID]*datapb.SegmentReferenceLock{}, - }, - } - err := c.completeCompaction(tt.args.result) - assert.Equal(t, tt.wantErr, err != nil) - }) + + c := &compactionPlanHandler{ + plans: plans, + sessions: sessions, + meta: meta, + segRefer: &SegmentReferenceManager{ + segmentsLock: map[UniqueID]map[UniqueID]*datapb.SegmentReferenceLock{}, + }, } + + compactionResult := &datapb.CompactionResult{ + PlanID: 1, + SegmentID: 3, + NumOfRows: 15, + InsertLogs: []*datapb.FieldBinlog{getFieldBinlogPaths(101, "log301")}, + Field2StatslogPaths: []*datapb.FieldBinlog{getFieldBinlogPaths(101, "log302")}, + Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(101, "log303")}, + } + + has, err := c.meta.HasSegments([]UniqueID{1, 2}) + require.NoError(t, err) + require.True(t, has) + + has, err = c.meta.HasSegments([]UniqueID{3}) + require.Error(t, err) + require.False(t, has) + + err = c.handleMergeCompactionResult(plan, compactionResult) + assert.NoError(t, err) + + has, err = c.meta.HasSegments([]UniqueID{1, 2, 3}) + require.NoError(t, err) + require.True(t, has) } -func Test_compactionPlanHandler_segment_is_referenced(t *testing.T) { - type fields struct { - plans map[int64]*compactionTask - sessions *SessionManager - meta *meta - flushCh chan UniqueID - } - type args struct { - result *datapb.CompactionResult - } - tests := []struct { - name string - fields fields - args args - wantErr bool - want *compactionTask - }{ - { - "test compaction segment is referenced", - fields{ - map[int64]*compactionTask{ - 1: { - triggerInfo: &compactionSignal{id: 1}, - state: executing, - plan: &datapb.CompactionPlan{ - PlanID: 1, - SegmentBinlogs: []*datapb.CompactionSegmentBinlogs{ - - {SegmentID: 1, FieldBinlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log1")}}, - {SegmentID: 2, FieldBinlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log2")}}, - }, - Type: datapb.CompactionType_MergeCompaction, - }, - }, - }, - nil, - &meta{ - catalog: &datacoord.Catalog{Txn: memkv.NewMemoryKV()}, - segments: &SegmentsInfo{ - map[int64]*SegmentInfo{ - - 1: {SegmentInfo: &datapb.SegmentInfo{ID: 1, Binlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log1")}}}, - 2: {SegmentInfo: &datapb.SegmentInfo{ID: 2, Binlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log2")}}}, - }, - }, - }, - make(chan UniqueID, 1), +func TestCompactionPlanHandler_completeCompaction(t *testing.T) { + t.Run("test not exists compaction task", func(t *testing.T) { + c := &compactionPlanHandler{ + plans: map[int64]*compactionTask{1: {}}, + segRefer: &SegmentReferenceManager{ + segmentsLock: map[UniqueID]map[UniqueID]*datapb.SegmentReferenceLock{}, }, - args{ - result: &datapb.CompactionResult{ - PlanID: 1, - SegmentID: 3, - InsertLogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log3")}, + } + err := c.completeCompaction(&datapb.CompactionResult{PlanID: 2}) + assert.Error(t, err) + }) + t.Run("test completed compaction task", func(t *testing.T) { + c := &compactionPlanHandler{ + plans: map[int64]*compactionTask{1: {state: completed}}, + segRefer: &SegmentReferenceManager{ + segmentsLock: map[UniqueID]map[UniqueID]*datapb.SegmentReferenceLock{}, + }, + } + err := c.completeCompaction(&datapb.CompactionResult{PlanID: 1}) + assert.Error(t, err) + }) + + t.Run("test complete merge compaction task", func(t *testing.T) { + mockDataNode := &mocks.DataNode{} + mockDataNode.EXPECT().SyncSegments(mock.Anything, mock.Anything).Run(func(ctx context.Context, req *datapb.SyncSegmentsRequest) {}).Return(&commonpb.Status{ErrorCode: commonpb.ErrorCode_Success}, nil) + + dataNodeID := UniqueID(111) + + seg1 := &datapb.SegmentInfo{ + ID: 1, + Binlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(101, "log1")}, + Statslogs: []*datapb.FieldBinlog{getFieldBinlogPaths(101, "log2")}, + Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(101, "log3")}, + } + + seg2 := &datapb.SegmentInfo{ + ID: 2, + Binlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(101, "log4")}, + Statslogs: []*datapb.FieldBinlog{getFieldBinlogPaths(101, "log5")}, + Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(101, "log6")}, + } + + plan := &datapb.CompactionPlan{ + PlanID: 1, + SegmentBinlogs: []*datapb.CompactionSegmentBinlogs{ + { + SegmentID: seg1.ID, + FieldBinlogs: seg1.GetBinlogs(), + Field2StatslogPaths: seg1.GetStatslogs(), + Deltalogs: seg1.GetDeltalogs(), + }, + { + SegmentID: seg2.ID, + FieldBinlogs: seg2.GetBinlogs(), + Field2StatslogPaths: seg2.GetStatslogs(), + Deltalogs: seg2.GetDeltalogs(), }, }, - true, - nil, - }, - } + Type: datapb.CompactionType_MergeCompaction, + } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - c := &compactionPlanHandler{ - plans: tt.fields.plans, - sessions: tt.fields.sessions, - meta: tt.fields.meta, - flushCh: tt.fields.flushCh, - segRefer: &SegmentReferenceManager{ - segmentsLock: map[UniqueID]map[UniqueID]*datapb.SegmentReferenceLock{}, - segmentReferCnt: map[UniqueID]int{ - 1: 1, - }, + sessions := &SessionManager{ + sessions: struct { + sync.RWMutex + data map[int64]*Session + }{ + data: map[int64]*Session{ + dataNodeID: {client: mockDataNode}}, + }, + } + + task := &compactionTask{ + triggerInfo: &compactionSignal{id: 1}, + state: executing, + plan: plan, + dataNodeID: dataNodeID, + } + + plans := map[int64]*compactionTask{1: task} + + meta := &meta{ + catalog: &datacoord.Catalog{Txn: memkv.NewMemoryKV()}, + segments: &SegmentsInfo{ + map[int64]*SegmentInfo{ + seg1.ID: {SegmentInfo: seg1}, + seg2.ID: {SegmentInfo: seg2}, }, - } - err := c.completeCompaction(tt.args.result) - assert.Equal(t, tt.wantErr, err == nil) - }) - } + }, + } + compactionResult := datapb.CompactionResult{ + PlanID: 1, + SegmentID: 3, + NumOfRows: 15, + InsertLogs: []*datapb.FieldBinlog{getFieldBinlogPaths(101, "log301")}, + Field2StatslogPaths: []*datapb.FieldBinlog{getFieldBinlogPaths(101, "log302")}, + Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(101, "log303")}, + } + + flushCh := make(chan UniqueID, 1) + c := &compactionPlanHandler{ + plans: plans, + sessions: sessions, + meta: meta, + flushCh: flushCh, + segRefer: &SegmentReferenceManager{ + segmentsLock: map[UniqueID]map[UniqueID]*datapb.SegmentReferenceLock{}, + }, + } + + err := c.completeCompaction(&compactionResult) + + segID, ok := <-flushCh + assert.True(t, ok) + assert.Equal(t, compactionResult.GetSegmentID(), segID) + assert.NoError(t, err) + }) } func Test_compactionPlanHandler_getCompaction(t *testing.T) { diff --git a/internal/datacoord/meta.go b/internal/datacoord/meta.go index e9e8c5523a..fba8e846ef 100644 --- a/internal/datacoord/meta.go +++ b/internal/datacoord/meta.go @@ -801,22 +801,33 @@ func (m *meta) SetSegmentIsImporting(segmentID UniqueID, importing bool) { m.segments.SetIsImporting(segmentID, importing) } -func (m *meta) CompleteMergeCompaction(compactionLogs []*datapb.CompactionSegmentBinlogs, result *datapb.CompactionResult) error { +// GetCompleteComapctionMeta returns +// - the segment info of compactedFrom segments before compaction to revert +// - the segment info of compactedFrom segments after compaction to alter +// - the segment info of compactedTo segment after compaction to add +// The compactedTo segment could contain 0 numRows +func (m *meta) GetCompleteCompactionMeta(compactionLogs []*datapb.CompactionSegmentBinlogs, result *datapb.CompactionResult) ([]*datapb.SegmentInfo, []*SegmentInfo, *SegmentInfo) { m.Lock() defer m.Unlock() - segments := make([]*SegmentInfo, 0, len(compactionLogs)) + var ( + oldSegments = make([]*datapb.SegmentInfo, 0, len(compactionLogs)) + modSegments = make([]*SegmentInfo, 0, len(compactionLogs)) + ) + for _, cl := range compactionLogs { if segment := m.segments.GetSegment(cl.GetSegmentID()); segment != nil { + oldSegments = append(oldSegments, segment.Clone().SegmentInfo) + cloned := segment.Clone() cloned.State = commonpb.SegmentState_Dropped cloned.DroppedAt = uint64(time.Now().UnixNano()) - segments = append(segments, cloned) + modSegments = append(modSegments, cloned) } } var startPosition, dmlPosition *internalpb.MsgPosition - for _, s := range segments { + for _, s := range modSegments { if dmlPosition == nil || s.GetDmlPosition() != nil && s.GetDmlPosition().GetTimestamp() < dmlPosition.GetTimestamp() { dmlPosition = s.GetDmlPosition() @@ -830,7 +841,7 @@ func (m *meta) CompleteMergeCompaction(compactionLogs []*datapb.CompactionSegmen // find new added delta logs when executing compaction var originDeltalogs []*datapb.FieldBinlog - for _, s := range segments { + for _, s := range modSegments { originDeltalogs = append(originDeltalogs, s.GetDeltalogs()...) } @@ -842,19 +853,19 @@ func (m *meta) CompleteMergeCompaction(compactionLogs []*datapb.CompactionSegmen newAddedDeltalogs := m.updateDeltalogs(originDeltalogs, deletedDeltalogs, nil) deltalogs := append(result.GetDeltalogs(), newAddedDeltalogs...) - compactionFrom := make([]UniqueID, 0, len(segments)) - for _, s := range segments { + compactionFrom := make([]UniqueID, 0, len(modSegments)) + for _, s := range modSegments { compactionFrom = append(compactionFrom, s.GetID()) } segmentInfo := &datapb.SegmentInfo{ ID: result.GetSegmentID(), - CollectionID: segments[0].CollectionID, - PartitionID: segments[0].PartitionID, - InsertChannel: segments[0].InsertChannel, + CollectionID: modSegments[0].CollectionID, + PartitionID: modSegments[0].PartitionID, + InsertChannel: modSegments[0].InsertChannel, NumOfRows: result.NumOfRows, State: commonpb.SegmentState_Flushing, - MaxRowNum: segments[0].MaxRowNum, + MaxRowNum: modSegments[0].MaxRowNum, Binlogs: result.GetInsertLogs(), Statslogs: result.GetField2StatslogPaths(), Deltalogs: deltalogs, @@ -865,35 +876,41 @@ func (m *meta) CompleteMergeCompaction(compactionLogs []*datapb.CompactionSegmen } segment := NewSegmentInfo(segmentInfo) - log.Info("CompleteMergeCompaction", zap.Int64("segmentID", segmentInfo.ID), + log.Info("GetCompleteCompactionMeta", zap.Int64("segmentID", segmentInfo.ID), zap.Int64("collectionID", segmentInfo.CollectionID), zap.Int64("partitionID", segmentInfo.PartitionID), zap.Int64("NumOfRows", segmentInfo.NumOfRows), zap.Any("compactionFrom", segmentInfo.CompactionFrom)) - modSegments := make([]*datapb.SegmentInfo, 0) - for _, s := range segments { - modSegments = append(modSegments, s.SegmentInfo) - } + return oldSegments, modSegments, segment +} - var newSegment *datapb.SegmentInfo - if segment.SegmentInfo.NumOfRows > 0 { - newSegment = segment.SegmentInfo - } +func (m *meta) alterMetaStoreAfterCompaction(modSegments []*datapb.SegmentInfo, newSegment *datapb.SegmentInfo) error { + return m.catalog.AlterSegmentsAndAddNewSegment(m.ctx, modSegments, newSegment) +} - if err := m.catalog.AlterSegmentsAndAddNewSegment(m.ctx, modSegments, newSegment); err != nil { - return err - } +func (m *meta) revertAlterMetaStoreAfterCompaction(oldSegments []*datapb.SegmentInfo, removalSegment *datapb.SegmentInfo) error { + log.Info("revert metastore after compaction failure", + zap.Int64("collectionID", removalSegment.CollectionID), + zap.Int64("partitionID", removalSegment.PartitionID), + zap.Int64("compactedTo", removalSegment.ID), + zap.Int64s("compactedFrom", removalSegment.GetCompactionFrom()), + ) + return m.catalog.RevertAlterSegmentsAndAddNewSegment(m.ctx, oldSegments, removalSegment) +} - for _, s := range segments { +func (m *meta) alterInMemoryMetaAfterCompaction(segmentCompactTo *SegmentInfo, segmentsCompactFrom []*SegmentInfo) { + m.Lock() + defer m.Unlock() + + for _, s := range segmentsCompactFrom { m.segments.SetSegment(s.GetID(), s) } // Handle empty segment generated by merge-compaction - if segment.NumOfRows > 0 { - m.segments.SetSegment(segment.GetID(), segment) + if segmentCompactTo.GetNumOfRows() > 0 { + m.segments.SetSegment(segmentCompactTo.GetID(), segmentCompactTo) } - return nil } func (m *meta) updateBinlogs(origin []*datapb.FieldBinlog, removes []*datapb.FieldBinlog, adds []*datapb.FieldBinlog) []*datapb.FieldBinlog { diff --git a/internal/datacoord/meta_test.go b/internal/datacoord/meta_test.go index f3aa3c7eb6..1e9fd293c7 100644 --- a/internal/datacoord/meta_test.go +++ b/internal/datacoord/meta_test.go @@ -33,6 +33,7 @@ import ( "github.com/milvus-io/milvus/internal/proto/internalpb" "github.com/milvus-io/milvus/internal/util" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) type mockEtcdKv struct { @@ -557,137 +558,169 @@ func TestSaveHandoffMeta(t *testing.T) { assert.Equal(t, 100, int(segmentID)) } -func Test_meta_CompleteMergeCompaction(t *testing.T) { - type fields struct { - client kv.TxnKV - collections map[UniqueID]*datapb.CollectionInfo - segments *SegmentsInfo +func TestMeta_alterMetaStore(t *testing.T) { + toAlter := []*datapb.SegmentInfo{ + { + CollectionID: 100, + PartitionID: 10, + ID: 1, + NumOfRows: 10, + }, } - type args struct { - compactionLogs []*datapb.CompactionSegmentBinlogs - result *datapb.CompactionResult + + newSeg := &datapb.SegmentInfo{ + Binlogs: []*datapb.FieldBinlog{ + { + FieldID: 101, + Binlogs: []*datapb.Binlog{}, + }, + }, + Deltalogs: []*datapb.FieldBinlog{ + { + FieldID: 101, + Binlogs: []*datapb.Binlog{}, + }, + }, + CollectionID: 100, + PartitionID: 10, + ID: 2, + NumOfRows: 15, } + + m := &meta{ + catalog: &datacoord.Catalog{Txn: memkv.NewMemoryKV()}, + segments: &SegmentsInfo{map[int64]*SegmentInfo{ + 1: {SegmentInfo: &datapb.SegmentInfo{ + ID: 1, + Binlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log1", "log2")}, + Statslogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "statlog1", "statlog2")}, + Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(0, "deltalog1", "deltalog2")}, + }}, + }}, + } + + err := m.alterMetaStoreAfterCompaction(toAlter, newSeg) + assert.NoError(t, err) + + err = m.revertAlterMetaStoreAfterCompaction(toAlter, newSeg) + assert.NoError(t, err) +} + +func TestMeta_alterInMemoryMetaAfterCompaction(t *testing.T) { + m := &meta{ + catalog: &datacoord.Catalog{Txn: memkv.NewMemoryKV()}, + segments: &SegmentsInfo{make(map[UniqueID]*SegmentInfo)}, + } + tests := []struct { - name string - fields fields - args args - wantErr bool + description string + compactToSeg *SegmentInfo }{ { - "test normal merge compaction", - fields{ - memkv.NewMemoryKV(), - nil, - &SegmentsInfo{map[int64]*SegmentInfo{ - 1: {SegmentInfo: &datapb.SegmentInfo{ - ID: 1, - Binlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log1", "log2")}, - Statslogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "statlog1", "statlog2")}, - Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(0, "deltalog1", "deltalog2")}, - }}, - 2: {SegmentInfo: &datapb.SegmentInfo{ - ID: 2, - Binlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log3", "log4")}, - Statslogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "statlog3", "statlog4")}, - Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(0, "deltalog3", "deltalog4")}, - }}, - }}, - }, - args{ - []*datapb.CompactionSegmentBinlogs{ - { - SegmentID: 1, - FieldBinlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log1", "log2")}, - Field2StatslogPaths: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "statlog1", "statlog2")}, - Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(0, "deltalog1", "deltalog2")}, - }, - { - SegmentID: 2, - FieldBinlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log3", "log4")}, - Field2StatslogPaths: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "statlog3", "statlog4")}, - Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(0, "deltalog3", "deltalog4")}, - }, - }, - &datapb.CompactionResult{ - SegmentID: 3, - InsertLogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log5")}, - Field2StatslogPaths: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "statlog5")}, - Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(0, "deltalog5")}, - NumOfRows: 1, + "numRows>0", &SegmentInfo{ + SegmentInfo: &datapb.SegmentInfo{ + ID: 1, + NumOfRows: 10, }, }, - false, }, { - "test removing all data merge compaction", - fields{ - memkv.NewMemoryKV(), - nil, - &SegmentsInfo{map[int64]*SegmentInfo{ - 1: {SegmentInfo: &datapb.SegmentInfo{ - ID: 1, - Binlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log1", "log2")}, - Statslogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "statlog1", "statlog2")}, - Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(0, "deltalog1", "deltalog2")}, - }}, - 2: {SegmentInfo: &datapb.SegmentInfo{ - ID: 2, - Binlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log3", "log4")}, - Statslogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "statlog3", "statlog4")}, - Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(0, "deltalog3", "deltalog4")}, - }}, - }}, - }, - args{ - []*datapb.CompactionSegmentBinlogs{ - { - SegmentID: 1, - FieldBinlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log1", "log2")}, - Field2StatslogPaths: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "statlog1", "statlog2")}, - Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(0, "deltalog1", "deltalog2")}, - }, - { - SegmentID: 2, - FieldBinlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log3", "log4")}, - Field2StatslogPaths: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "statlog3", "statlog4")}, - Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(0, "deltalog3", "deltalog4")}, - }, - }, - &datapb.CompactionResult{ - SegmentID: 3, - InsertLogs: nil, - Field2StatslogPaths: nil, - Deltalogs: nil, - NumOfRows: 0, + "numRows=0", &SegmentInfo{ + SegmentInfo: &datapb.SegmentInfo{ + ID: 1, }, }, - false, }, } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - m := &meta{ - catalog: &datacoord.Catalog{Txn: tt.fields.client}, - collections: tt.fields.collections, - segments: tt.fields.segments, - } - err := m.CompleteMergeCompaction(tt.args.compactionLogs, tt.args.result) - assert.Equal(t, tt.wantErr, err != nil) - if err == nil { - for _, l := range tt.args.compactionLogs { - assert.Nil(t, m.GetSegment(l.GetSegmentID())) - } - segment := m.GetSegment(tt.args.result.SegmentID) - assert.Equal(t, segment != nil, tt.args.result.NumOfRows > 0) - if segment != nil { - assert.EqualValues(t, tt.args.result.GetInsertLogs(), segment.GetBinlogs()) - assert.EqualValues(t, tt.args.result.GetField2StatslogPaths(), segment.GetStatslogs()) - assert.EqualValues(t, tt.args.result.GetDeltalogs(), segment.GetDeltalogs()) - assert.NotZero(t, segment.lastFlushTime) - } - } + + compactFrom := []*SegmentInfo{{}, {}} + + for _, test := range tests { + t.Run(test.description, func(t *testing.T) { + m.alterInMemoryMetaAfterCompaction(test.compactToSeg, compactFrom) }) } + +} + +func TestMeta_GetCompleteCompactionMeta(t *testing.T) { + prepareSegments := &SegmentsInfo{ + map[UniqueID]*SegmentInfo{ + 1: {SegmentInfo: &datapb.SegmentInfo{ + ID: 1, + CollectionID: 100, + PartitionID: 10, + State: commonpb.SegmentState_Flushed, + Binlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log1", "log2")}, + Statslogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "statlog1", "statlog2")}, + Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(0, "deltalog1", "deltalog2")}, + }}, + 2: {SegmentInfo: &datapb.SegmentInfo{ + ID: 2, + CollectionID: 100, + PartitionID: 10, + State: commonpb.SegmentState_Flushed, + Binlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log3", "log4")}, + Statslogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "statlog3", "statlog4")}, + Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(0, "deltalog3", "deltalog4")}, + }}, + }, + } + + m := &meta{ + catalog: &datacoord.Catalog{Txn: memkv.NewMemoryKV()}, + segments: prepareSegments, + } + + inCompactionLogs := []*datapb.CompactionSegmentBinlogs{ + { + SegmentID: 1, + FieldBinlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log1", "log2")}, + Field2StatslogPaths: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "statlog1", "statlog2")}, + Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(0, "deltalog1", "deltalog2")}, + }, + { + SegmentID: 2, + FieldBinlogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log3", "log4")}, + Field2StatslogPaths: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "statlog3", "statlog4")}, + Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(0, "deltalog3", "deltalog4")}, + }, + } + + inCompactionResult := &datapb.CompactionResult{ + SegmentID: 3, + InsertLogs: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "log5")}, + Field2StatslogPaths: []*datapb.FieldBinlog{getFieldBinlogPaths(1, "statlog5")}, + Deltalogs: []*datapb.FieldBinlog{getFieldBinlogPaths(0, "deltalog5")}, + NumOfRows: 1, + } + beforeCompact, afterCompact, newSegment := m.GetCompleteCompactionMeta(inCompactionLogs, inCompactionResult) + assert.NotNil(t, beforeCompact) + assert.NotNil(t, afterCompact) + assert.NotNil(t, newSegment) + + require.Equal(t, 2, len(beforeCompact)) + assert.Equal(t, commonpb.SegmentState_Flushed, beforeCompact[0].GetState()) + assert.Equal(t, commonpb.SegmentState_Flushed, beforeCompact[1].GetState()) + assert.Zero(t, beforeCompact[0].GetDroppedAt()) + assert.Zero(t, beforeCompact[1].GetDroppedAt()) + + require.Equal(t, 2, len(afterCompact)) + assert.Equal(t, commonpb.SegmentState_Dropped, afterCompact[0].GetState()) + assert.Equal(t, commonpb.SegmentState_Dropped, afterCompact[1].GetState()) + assert.NotZero(t, afterCompact[0].GetDroppedAt()) + assert.NotZero(t, afterCompact[1].GetDroppedAt()) + + assert.Equal(t, inCompactionResult.SegmentID, newSegment.GetID()) + assert.Equal(t, UniqueID(100), newSegment.GetCollectionID()) + assert.Equal(t, UniqueID(10), newSegment.GetPartitionID()) + assert.Equal(t, inCompactionResult.NumOfRows, newSegment.GetNumOfRows()) + assert.Equal(t, commonpb.SegmentState_Flushing, newSegment.GetState()) + + assert.EqualValues(t, inCompactionResult.GetInsertLogs(), newSegment.GetBinlogs()) + assert.EqualValues(t, inCompactionResult.GetField2StatslogPaths(), newSegment.GetStatslogs()) + assert.EqualValues(t, inCompactionResult.GetDeltalogs(), newSegment.GetDeltalogs()) + assert.NotZero(t, newSegment.lastFlushTime) } func Test_meta_SetSegmentCompacting(t *testing.T) { diff --git a/internal/datacoord/session_manager.go b/internal/datacoord/session_manager.go index e20afb8884..6dea0458d7 100644 --- a/internal/datacoord/session_manager.go +++ b/internal/datacoord/session_manager.go @@ -161,6 +161,26 @@ func (c *SessionManager) Compaction(nodeID int64, plan *datapb.CompactionPlan) e return nil } +// SyncSegments is a grpc interface. It will send request to DataNode with provided `nodeID` synchronously. +func (c *SessionManager) SyncSegments(nodeID int64, req *datapb.SyncSegmentsRequest) error { + ctx, cancel := context.WithTimeout(context.Background(), rpcCompactionTimeout) + defer cancel() + cli, err := c.getClient(ctx, nodeID) + if err != nil { + log.Warn("failed to get client", zap.Int64("nodeID", nodeID), zap.Error(err)) + return err + } + + resp, err := cli.SyncSegments(ctx, req) + if err := VerifyResponse(resp, err); err != nil { + log.Warn("failed to sync segments", zap.Int64("node", nodeID), zap.Error(err), zap.Int64("planID", req.GetPlanID())) + return err + } + + log.Info("success to sync segments", zap.Int64("node", nodeID), zap.Any("planID", req.GetPlanID())) + return nil +} + // Import is a grpc interface. It will send request to DataNode with provided `nodeID` asynchronously. func (c *SessionManager) Import(ctx context.Context, nodeID int64, itr *datapb.ImportTaskRequest) { go c.execImport(ctx, nodeID, itr) diff --git a/internal/datanode/compactor.go b/internal/datanode/compactor.go index 270012f82d..a19c8d8862 100644 --- a/internal/datanode/compactor.go +++ b/internal/datanode/compactor.go @@ -250,7 +250,7 @@ func (t *compactionTask) merge( err error // statslog generation - segment *Segment // empty segment used for bf generation + segment = &Segment{} // empty segment used for bf generation pkID UniqueID pkType schemapb.DataType @@ -261,6 +261,8 @@ func (t *compactionTask) merge( insertPaths = make([]*datapb.FieldBinlog, 0) ) + t.Replica.initSegmentBloomFilter(segment) + isDeletedValue := func(v *storage.Value) bool { ts, ok := delta[v.PK.GetValue()] if ok && uint64(v.Timestamp) <= ts { @@ -269,9 +271,6 @@ func (t *compactionTask) merge( return false } - segment = &Segment{} - t.Replica.initSegmentBloomFilter(segment) - addInsertFieldPath := func(inPaths map[UniqueID]*datapb.FieldBinlog) { for fID, path := range inPaths { tmpBinlog, ok := insertField2Path[fID] @@ -456,7 +455,7 @@ func (t *compactionTask) compact() (*datapb.CompactionResult, error) { segIDs = append(segIDs, s.GetSegmentID()) } - collID, partID, meta, err := t.getSegmentMeta(segIDs[0]) + _, partID, meta, err := t.getSegmentMeta(segIDs[0]) if err != nil { log.Error("compact wrong", zap.Int64("planID", t.plan.GetPlanID()), zap.Error(err)) return nil, err @@ -547,7 +546,7 @@ func (t *compactionTask) compact() (*datapb.CompactionResult, error) { return nil, err } - inPaths, statsPaths, segment, numRows, err := t.merge(ctxTimeout, allPs, targetSegID, partID, meta, deltaPk2Ts) + inPaths, statsPaths, _, numRows, err := t.merge(ctxTimeout, allPs, targetSegID, partID, meta, deltaPk2Ts) if err != nil { log.Error("compact wrong", zap.Int64("planID", t.plan.GetPlanID()), zap.Error(err)) return nil, err @@ -579,44 +578,6 @@ func (t *compactionTask) compact() (*datapb.CompactionResult, error) { NumOfRows: numRows, } - // rpcStart := time.Now() - // status, err := t.dc.CompleteCompaction(ctxTimeout, pack) - // if err != nil { - // log.Error("complete compaction rpc wrong", zap.Int64("planID", t.plan.GetPlanID()), zap.Error(err)) - // return err - // } - // if status.ErrorCode != commonpb.ErrorCode_Success { - // log.Error("complete compaction wrong", zap.Int64("planID", t.plan.GetPlanID()), zap.String("reason", status.GetReason())) - // return fmt.Errorf("complete comapction wrong: %s", status.GetReason()) - // } - // rpcEnd := time.Now() - // defer func() { - // log.Debug("rpc elapse in ms", zap.Int64("planID", t.plan.GetPlanID()), zap.Float64("elapse", nano2Milli(rpcEnd.Sub(rpcStart)))) - // }() - // - // Compaction I: update pk range. - // Compaction II: remove the segments and add a new flushed segment with pk range. - if t.hasSegment(targetSegID, true) { - if numRows <= 0 { - t.removeSegments(targetSegID) - } else { - t.refreshFlushedSegStatistics(targetSegID, numRows) - } - // no need to shorten the PK range of a segment, deleting dup PKs is valid - } else { - segment.collectionID = collID - segment.partitionID = partID - segment.segmentID = targetSegID - segment.channelName = t.plan.GetChannel() - segment.numRows = numRows - - err = t.mergeFlushedSegments(segment, t.plan.GetPlanID(), segIDs) - if err != nil { - log.Error("compact wrong", zap.Int64("planID", t.plan.GetPlanID()), zap.Error(err)) - return nil, err - } - } - uninjectStart := time.Now() ti.injectDone(true) uninjectEnd := time.Now() diff --git a/internal/datanode/compactor_test.go b/internal/datanode/compactor_test.go index 7e898c11fc..210ede6de0 100644 --- a/internal/datanode/compactor_test.go +++ b/internal/datanode/compactor_test.go @@ -674,15 +674,15 @@ func TestCompactorInterfaceMethods(t *testing.T) { alloc.random = false // generated ID = 19530 task := newCompactionTask(context.TODO(), mockbIO, mockbIO, replica, mockfm, alloc, plan) - _, err = task.compact() + result, err := task.compact() assert.NoError(t, err) + assert.NotNil(t, result) - assert.False(t, replica.hasSegment(c.segID1, true)) - assert.False(t, replica.hasSegment(c.segID2, true)) - assert.True(t, replica.hasSegment(19530, true)) - updates, err := replica.getSegmentStatisticsUpdates(19530) - assert.NoError(t, err) - assert.Equal(t, int64(2), updates.GetNumRows()) + assert.Equal(t, plan.GetPlanID(), result.GetPlanID()) + assert.Equal(t, UniqueID(19530), result.GetSegmentID()) + assert.Equal(t, int64(2), result.GetNumOfRows()) + assert.NotEmpty(t, result.InsertLogs) + assert.NotEmpty(t, result.Field2StatslogPaths) // New test, remove all the binlogs in memkv // Deltas in timetravel range @@ -698,15 +698,15 @@ func TestCompactorInterfaceMethods(t *testing.T) { require.True(t, replica.hasSegment(c.segID2, true)) require.False(t, replica.hasSegment(19530, true)) - _, err = task.compact() + result, err = task.compact() assert.NoError(t, err) + assert.NotNil(t, result) - assert.False(t, replica.hasSegment(c.segID1, true)) - assert.False(t, replica.hasSegment(c.segID2, true)) - assert.True(t, replica.hasSegment(19530, true)) - updates, err = replica.getSegmentStatisticsUpdates(19530) - assert.NoError(t, err) - assert.Equal(t, int64(3), updates.GetNumRows()) + assert.Equal(t, plan.GetPlanID(), result.GetPlanID()) + assert.Equal(t, UniqueID(19530), result.GetSegmentID()) + assert.Equal(t, int64(3), result.GetNumOfRows()) + assert.NotEmpty(t, result.InsertLogs) + assert.NotEmpty(t, result.Field2StatslogPaths) // New test, remove all the binlogs in memkv // Deltas in timetravel range @@ -722,15 +722,15 @@ func TestCompactorInterfaceMethods(t *testing.T) { require.True(t, replica.hasSegment(c.segID2, true)) require.False(t, replica.hasSegment(19530, true)) - _, err = task.compact() + result, err = task.compact() assert.NoError(t, err) + assert.NotNil(t, result) - assert.False(t, replica.hasSegment(c.segID1, true)) - assert.False(t, replica.hasSegment(c.segID2, true)) - assert.True(t, replica.hasSegment(19530, true)) - updates, err = replica.getSegmentStatisticsUpdates(19530) - assert.NoError(t, err) - assert.Equal(t, int64(4), updates.GetNumRows()) + assert.Equal(t, plan.GetPlanID(), result.GetPlanID()) + assert.Equal(t, UniqueID(19530), result.GetSegmentID()) + assert.Equal(t, int64(4), result.GetNumOfRows()) + assert.NotEmpty(t, result.InsertLogs) + assert.NotEmpty(t, result.Field2StatslogPaths) } }) @@ -806,15 +806,15 @@ func TestCompactorInterfaceMethods(t *testing.T) { alloc.random = false // generated ID = 19530 task := newCompactionTask(context.TODO(), mockbIO, mockbIO, replica, mockfm, alloc, plan) - _, err = task.compact() + result, err := task.compact() assert.NoError(t, err) + assert.NotNil(t, result) - assert.False(t, replica.hasSegment(segID1, true)) - assert.False(t, replica.hasSegment(segID2, true)) - assert.True(t, replica.hasSegment(19530, true)) - updates, err := replica.getSegmentStatisticsUpdates(19530) - assert.NoError(t, err) - assert.Equal(t, int64(2), updates.GetNumRows()) + assert.Equal(t, plan.GetPlanID(), result.GetPlanID()) + assert.Equal(t, UniqueID(19530), result.GetSegmentID()) + assert.Equal(t, int64(2), result.GetNumOfRows()) + assert.NotEmpty(t, result.InsertLogs) + assert.NotEmpty(t, result.Field2StatslogPaths) }) } diff --git a/internal/datanode/data_node.go b/internal/datanode/data_node.go index e64550284c..7f2780200b 100644 --- a/internal/datanode/data_node.go +++ b/internal/datanode/data_node.go @@ -59,6 +59,7 @@ import ( "github.com/milvus-io/milvus/internal/util/retry" "github.com/milvus-io/milvus/internal/util/sessionutil" "github.com/milvus-io/milvus/internal/util/timerecord" + "github.com/milvus-io/milvus/internal/util/tsoutil" "github.com/milvus-io/milvus/internal/util/typeutil" v3rpc "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" clientv3 "go.etcd.io/etcd/client/v3" @@ -927,6 +928,8 @@ func (node *DataNode) SyncSegments(ctx context.Context, req *datapb.SyncSegments numRows: req.GetNumOfRows(), } + replica.(*SegmentReplica).initPKBloomFilter(targetSeg, req.GetStatsLogs(), tsoutil.GetCurrentTime()) + if err := replica.mergeFlushedSegments(targetSeg, req.GetPlanID(), req.GetCompactedFrom()); err != nil { status.Reason = err.Error() return status, nil diff --git a/internal/datanode/data_node_test.go b/internal/datanode/data_node_test.go index 99558023b6..25d78f25f7 100644 --- a/internal/datanode/data_node_test.go +++ b/internal/datanode/data_node_test.go @@ -733,7 +733,6 @@ func TestDataNode(t *testing.T) { assert.False(t, fg.replica.hasSegment(req.CompactedFrom[0], true)) assert.False(t, fg.replica.hasSegment(req.CompactedFrom[1], true)) }) - }) } diff --git a/internal/proto/data_coord.proto b/internal/proto/data_coord.proto index 1b6f7bb454..e77548b9f4 100644 --- a/internal/proto/data_coord.proto +++ b/internal/proto/data_coord.proto @@ -420,6 +420,7 @@ message SyncSegmentsRequest { int64 compacted_to = 2; int64 num_of_rows = 3; repeated int64 compacted_from = 4; + repeated FieldBinlog stats_logs = 5; } message CompactionSegmentBinlogs { diff --git a/internal/proto/datapb/data_coord.pb.go b/internal/proto/datapb/data_coord.pb.go index e1991ef62f..68cf6f4409 100644 --- a/internal/proto/datapb/data_coord.pb.go +++ b/internal/proto/datapb/data_coord.pb.go @@ -2892,13 +2892,14 @@ func (m *CompactionStateRequest) GetBase() *commonpb.MsgBase { } type SyncSegmentsRequest struct { - PlanID int64 `protobuf:"varint,1,opt,name=planID,proto3" json:"planID,omitempty"` - CompactedTo int64 `protobuf:"varint,2,opt,name=compacted_to,json=compactedTo,proto3" json:"compacted_to,omitempty"` - NumOfRows int64 `protobuf:"varint,3,opt,name=num_of_rows,json=numOfRows,proto3" json:"num_of_rows,omitempty"` - CompactedFrom []int64 `protobuf:"varint,4,rep,packed,name=compacted_from,json=compactedFrom,proto3" json:"compacted_from,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + PlanID int64 `protobuf:"varint,1,opt,name=planID,proto3" json:"planID,omitempty"` + CompactedTo int64 `protobuf:"varint,2,opt,name=compacted_to,json=compactedTo,proto3" json:"compacted_to,omitempty"` + NumOfRows int64 `protobuf:"varint,3,opt,name=num_of_rows,json=numOfRows,proto3" json:"num_of_rows,omitempty"` + CompactedFrom []int64 `protobuf:"varint,4,rep,packed,name=compacted_from,json=compactedFrom,proto3" json:"compacted_from,omitempty"` + StatsLogs []*FieldBinlog `protobuf:"bytes,5,rep,name=stats_logs,json=statsLogs,proto3" json:"stats_logs,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *SyncSegmentsRequest) Reset() { *m = SyncSegmentsRequest{} } @@ -2954,6 +2955,13 @@ func (m *SyncSegmentsRequest) GetCompactedFrom() []int64 { return nil } +func (m *SyncSegmentsRequest) GetStatsLogs() []*FieldBinlog { + if m != nil { + return m.StatsLogs + } + return nil +} + type CompactionSegmentBinlogs struct { SegmentID int64 `protobuf:"varint,1,opt,name=segmentID,proto3" json:"segmentID,omitempty"` FieldBinlogs []*FieldBinlog `protobuf:"bytes,2,rep,name=fieldBinlogs,proto3" json:"fieldBinlogs,omitempty"` @@ -4715,267 +4723,268 @@ func init() { func init() { proto.RegisterFile("data_coord.proto", fileDescriptor_82cd95f524594f49) } var fileDescriptor_82cd95f524594f49 = []byte{ - // 4154 bytes of a gzipped FileDescriptorProto + // 4168 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x3c, 0x5b, 0x6f, 0x1c, 0x59, 0x5a, 0xa9, 0xbe, 0xb9, 0xfb, 0xeb, 0x8b, 0xdb, 0x27, 0x19, 0xbb, 0xd3, 0xb9, 0x4e, 0xcd, 0x24, - 0x93, 0xc9, 0x64, 0x92, 0x19, 0x0f, 0xa3, 0x1d, 0x91, 0xdd, 0x59, 0x8d, 0xe3, 0x89, 0xa7, 0xc1, - 0xf6, 0x7a, 0xcb, 0xce, 0x44, 0xda, 0x45, 0x6a, 0x55, 0xba, 0x8e, 0xdb, 0xb5, 0xee, 0xaa, 0xea, - 0x54, 0x55, 0xdb, 0xf1, 0xf2, 0xb0, 0x23, 0x56, 0x42, 0x5a, 0x84, 0x58, 0x2e, 0x42, 0xc0, 0x03, + 0x93, 0xc9, 0x64, 0x92, 0x19, 0x0f, 0xa3, 0x1d, 0x91, 0x9d, 0x59, 0x8d, 0xe3, 0x89, 0xd3, 0x60, + 0x7b, 0xbd, 0x65, 0x67, 0x22, 0xed, 0x22, 0xb5, 0x2a, 0x5d, 0xc7, 0xed, 0x5a, 0x77, 0x55, 0x75, + 0xaa, 0xaa, 0xe3, 0x78, 0x79, 0xd8, 0x11, 0x2b, 0x21, 0x2d, 0x42, 0x2c, 0x17, 0x21, 0xc1, 0x03, 0x12, 0xe2, 0x69, 0x01, 0x21, 0x21, 0xad, 0x78, 0x00, 0x84, 0x78, 0xe0, 0x65, 0x05, 0x48, 0x88, - 0x57, 0x7e, 0x00, 0xfc, 0x00, 0xfe, 0x00, 0x3a, 0x97, 0x3a, 0x75, 0x3b, 0xd5, 0x5d, 0xee, 0x4e, - 0x36, 0x88, 0x7d, 0xf3, 0xf9, 0xfa, 0x3b, 0xdf, 0xf9, 0xce, 0x77, 0xbe, 0xfb, 0x39, 0x65, 0x68, - 0x1b, 0xba, 0xaf, 0xf7, 0x07, 0x8e, 0xe3, 0x1a, 0xf7, 0xc7, 0xae, 0xe3, 0x3b, 0x68, 0xc5, 0x32, - 0x47, 0x27, 0x13, 0x8f, 0x8d, 0xee, 0x93, 0x9f, 0xbb, 0x8d, 0x81, 0x63, 0x59, 0x8e, 0xcd, 0x40, - 0xdd, 0x96, 0x69, 0xfb, 0xd8, 0xb5, 0xf5, 0x11, 0x1f, 0x37, 0xa2, 0x13, 0xba, 0x0d, 0x6f, 0x70, - 0x84, 0x2d, 0x9d, 0x8d, 0xd4, 0x25, 0x28, 0x7f, 0x6e, 0x8d, 0xfd, 0x33, 0xf5, 0x8f, 0x15, 0x68, - 0x3c, 0x1e, 0x4d, 0xbc, 0x23, 0x0d, 0x3f, 0x9f, 0x60, 0xcf, 0x47, 0x1f, 0x40, 0xe9, 0x99, 0xee, - 0xe1, 0x8e, 0x72, 0x53, 0xb9, 0x53, 0x5f, 0xbf, 0x7a, 0x3f, 0xb6, 0x2a, 0x5f, 0x6f, 0xc7, 0x1b, - 0x6e, 0xe8, 0x1e, 0xd6, 0x28, 0x26, 0x42, 0x50, 0x32, 0x9e, 0xf5, 0x36, 0x3b, 0x85, 0x9b, 0xca, - 0x9d, 0xa2, 0x46, 0xff, 0x46, 0xd7, 0x01, 0x3c, 0x3c, 0xb4, 0xb0, 0xed, 0xf7, 0x36, 0xbd, 0x4e, - 0xf1, 0x66, 0xf1, 0x4e, 0x51, 0x8b, 0x40, 0x90, 0x0a, 0x8d, 0x81, 0x33, 0x1a, 0xe1, 0x81, 0x6f, - 0x3a, 0x76, 0x6f, 0xb3, 0x53, 0xa2, 0x73, 0x63, 0x30, 0xf5, 0xbf, 0x14, 0x68, 0x72, 0xd6, 0xbc, - 0xb1, 0x63, 0x7b, 0x18, 0x7d, 0x04, 0x15, 0xcf, 0xd7, 0xfd, 0x89, 0xc7, 0xb9, 0xbb, 0x22, 0xe5, - 0x6e, 0x9f, 0xa2, 0x68, 0x1c, 0x55, 0xca, 0x5e, 0x72, 0xf9, 0x62, 0x7a, 0xf9, 0xc4, 0x16, 0x4a, - 0xa9, 0x2d, 0xdc, 0x81, 0xe5, 0x43, 0xc2, 0xdd, 0x7e, 0x88, 0x54, 0xa6, 0x48, 0x49, 0x30, 0xa1, - 0xe4, 0x9b, 0x16, 0xfe, 0xd6, 0xe1, 0x3e, 0xd6, 0x47, 0x9d, 0x0a, 0x5d, 0x2b, 0x02, 0x51, 0xff, - 0x43, 0x81, 0xb6, 0x40, 0x0f, 0xce, 0xe1, 0x12, 0x94, 0x07, 0xce, 0xc4, 0xf6, 0xe9, 0x56, 0x9b, - 0x1a, 0x1b, 0xa0, 0x37, 0xa1, 0x31, 0x38, 0xd2, 0x6d, 0x1b, 0x8f, 0xfa, 0xb6, 0x6e, 0x61, 0xba, - 0xa9, 0x9a, 0x56, 0xe7, 0xb0, 0x5d, 0xdd, 0xc2, 0xb9, 0xf6, 0x76, 0x13, 0xea, 0x63, 0xdd, 0xf5, - 0xcd, 0x98, 0xf4, 0xa3, 0x20, 0xd4, 0x85, 0xaa, 0xe9, 0xf5, 0xac, 0xb1, 0xe3, 0xfa, 0x9d, 0xf2, - 0x4d, 0xe5, 0x4e, 0x55, 0x13, 0x63, 0xb2, 0x82, 0x49, 0xff, 0x3a, 0xd0, 0xbd, 0xe3, 0xde, 0x26, - 0xdf, 0x51, 0x0c, 0xa6, 0xfe, 0x99, 0x02, 0xab, 0x9f, 0x79, 0x9e, 0x39, 0xb4, 0x53, 0x3b, 0x5b, - 0x85, 0x8a, 0xed, 0x18, 0xb8, 0xb7, 0x49, 0xb7, 0x56, 0xd4, 0xf8, 0x08, 0x5d, 0x81, 0xda, 0x18, - 0x63, 0xb7, 0xef, 0x3a, 0xa3, 0x60, 0x63, 0x55, 0x02, 0xd0, 0x9c, 0x11, 0x46, 0xdf, 0x86, 0x15, - 0x2f, 0x41, 0x88, 0xe9, 0x55, 0x7d, 0xfd, 0xad, 0xfb, 0x29, 0xcb, 0xb8, 0x9f, 0x5c, 0x54, 0x4b, - 0xcf, 0x56, 0xbf, 0x2a, 0xc0, 0x45, 0x81, 0xc7, 0x78, 0x25, 0x7f, 0x13, 0xc9, 0x7b, 0x78, 0x28, - 0xd8, 0x63, 0x83, 0x3c, 0x92, 0x17, 0x47, 0x56, 0x8c, 0x1e, 0x59, 0x0e, 0x55, 0x4f, 0x9e, 0x47, - 0x39, 0x7d, 0x1e, 0x37, 0xa0, 0x8e, 0x5f, 0x8c, 0x4d, 0x17, 0xf7, 0x89, 0xe2, 0x50, 0x91, 0x97, - 0x34, 0x60, 0xa0, 0x03, 0xd3, 0x8a, 0xda, 0xc6, 0x52, 0x6e, 0xdb, 0x50, 0xff, 0x5c, 0x81, 0xb5, - 0xd4, 0x29, 0x71, 0x63, 0xd3, 0xa0, 0x4d, 0x77, 0x1e, 0x4a, 0x86, 0x98, 0x1d, 0x11, 0xf8, 0xed, - 0x69, 0x02, 0x0f, 0xd1, 0xb5, 0xd4, 0xfc, 0x08, 0x93, 0x85, 0xfc, 0x4c, 0x1e, 0xc3, 0xda, 0x16, - 0xf6, 0xf9, 0x02, 0xe4, 0x37, 0xec, 0xcd, 0xef, 0xac, 0xe2, 0x56, 0x5d, 0x48, 0x5a, 0xb5, 0xfa, - 0x37, 0x05, 0x61, 0x8b, 0x74, 0xa9, 0x9e, 0x7d, 0xe8, 0xa0, 0xab, 0x50, 0x13, 0x28, 0x5c, 0x2b, - 0x42, 0x00, 0xfa, 0x1a, 0x94, 0x09, 0xa7, 0x4c, 0x25, 0x5a, 0xeb, 0x6f, 0xca, 0xf7, 0x14, 0xa1, - 0xa9, 0x31, 0x7c, 0xd4, 0x83, 0x96, 0xe7, 0xeb, 0xae, 0xdf, 0x1f, 0x3b, 0x1e, 0x3d, 0x67, 0xaa, - 0x38, 0xf5, 0x75, 0x35, 0x4e, 0x41, 0xb8, 0xf5, 0x1d, 0x6f, 0xb8, 0xc7, 0x31, 0xb5, 0x26, 0x9d, - 0x19, 0x0c, 0xd1, 0xe7, 0xd0, 0xc0, 0xb6, 0x11, 0x12, 0x2a, 0xe5, 0x26, 0x54, 0xc7, 0xb6, 0x21, - 0xc8, 0x84, 0xe7, 0x53, 0xce, 0x7f, 0x3e, 0xbf, 0xad, 0x40, 0x27, 0x7d, 0x40, 0x8b, 0xb8, 0xec, - 0x87, 0x6c, 0x12, 0x66, 0x07, 0x34, 0xd5, 0xc2, 0xc5, 0x21, 0x69, 0x7c, 0x8a, 0xfa, 0x87, 0x0a, - 0xbc, 0x11, 0xb2, 0x43, 0x7f, 0x7a, 0x55, 0xda, 0x82, 0xee, 0x42, 0xdb, 0xb4, 0x07, 0xa3, 0x89, - 0x81, 0x9f, 0xd8, 0x5f, 0x60, 0x7d, 0xe4, 0x1f, 0x9d, 0xd1, 0x33, 0xac, 0x6a, 0x29, 0xb8, 0xfa, - 0x43, 0x05, 0x56, 0x93, 0x7c, 0x2d, 0x22, 0xa4, 0x5f, 0x82, 0xb2, 0x69, 0x1f, 0x3a, 0x81, 0x8c, - 0xae, 0x4f, 0x31, 0x4a, 0xb2, 0x16, 0x43, 0x56, 0x2d, 0xb8, 0xb2, 0x85, 0xfd, 0x9e, 0xed, 0x61, - 0xd7, 0xdf, 0x30, 0xed, 0x91, 0x33, 0xdc, 0xd3, 0xfd, 0xa3, 0x05, 0x0c, 0x2a, 0x66, 0x1b, 0x85, - 0x84, 0x6d, 0xa8, 0x3f, 0x51, 0xe0, 0xaa, 0x7c, 0x3d, 0xbe, 0xf5, 0x2e, 0x54, 0x0f, 0x4d, 0x3c, - 0x32, 0x88, 0x7c, 0x15, 0x2a, 0x5f, 0x31, 0x26, 0x86, 0x35, 0x26, 0xc8, 0x7c, 0x87, 0x6f, 0x66, - 0x68, 0xf3, 0xbe, 0xef, 0x9a, 0xf6, 0x70, 0xdb, 0xf4, 0x7c, 0x8d, 0xe1, 0x47, 0xe4, 0x59, 0xcc, - 0xaf, 0xc6, 0xbf, 0xa5, 0xc0, 0xf5, 0x2d, 0xec, 0x3f, 0x12, 0x7e, 0x99, 0xfc, 0x6e, 0x7a, 0xbe, - 0x39, 0xf0, 0x5e, 0x6e, 0x6e, 0x94, 0x23, 0x40, 0xab, 0x3f, 0x56, 0xe0, 0x46, 0x26, 0x33, 0x5c, - 0x74, 0xdc, 0xef, 0x04, 0x5e, 0x59, 0xee, 0x77, 0x7e, 0x15, 0x9f, 0x7d, 0xa9, 0x8f, 0x26, 0x78, - 0x4f, 0x37, 0x5d, 0xe6, 0x77, 0xe6, 0xf4, 0xc2, 0x7f, 0xad, 0xc0, 0xb5, 0x2d, 0xec, 0xef, 0x05, - 0x31, 0xe9, 0x35, 0x4a, 0x87, 0xe0, 0x44, 0x62, 0x63, 0x90, 0x9c, 0xc5, 0x60, 0xea, 0xef, 0xb0, - 0xe3, 0x94, 0xf2, 0xfb, 0x5a, 0x04, 0x78, 0x9d, 0x5a, 0x42, 0xc4, 0x24, 0x1f, 0xb1, 0xd4, 0x81, - 0x8b, 0x4f, 0xfd, 0x53, 0x05, 0x2e, 0x7f, 0x36, 0x78, 0x3e, 0x31, 0x5d, 0xcc, 0x91, 0xb6, 0x9d, - 0xc1, 0xf1, 0xfc, 0xc2, 0x0d, 0xd3, 0xac, 0x42, 0x2c, 0xcd, 0x9a, 0x95, 0x9a, 0xaf, 0x42, 0xc5, - 0x67, 0x79, 0x1d, 0xcb, 0x54, 0xf8, 0x88, 0xf2, 0xa7, 0xe1, 0x11, 0xd6, 0xbd, 0xff, 0x9b, 0xfc, - 0xfd, 0xb8, 0x04, 0x8d, 0x2f, 0x79, 0x3a, 0x46, 0xa3, 0x76, 0x52, 0x93, 0x14, 0x79, 0xe2, 0x15, - 0xc9, 0xe0, 0x64, 0x49, 0xdd, 0x16, 0x34, 0x3d, 0x8c, 0x8f, 0xe7, 0x89, 0xd1, 0x0d, 0x32, 0x51, - 0xc4, 0xd6, 0x6d, 0x58, 0x99, 0xd8, 0xb4, 0x34, 0xc0, 0x06, 0x17, 0x20, 0xd3, 0xdc, 0xd9, 0xbe, - 0x3b, 0x3d, 0x11, 0x7d, 0xc1, 0xab, 0x8f, 0x08, 0xad, 0x72, 0x2e, 0x5a, 0xc9, 0x69, 0xa8, 0x07, - 0x6d, 0xc3, 0x75, 0xc6, 0x63, 0x6c, 0xf4, 0xbd, 0x80, 0x54, 0x25, 0x1f, 0x29, 0x3e, 0x4f, 0x90, - 0xfa, 0x00, 0x2e, 0x26, 0x39, 0xed, 0x19, 0x24, 0x21, 0x25, 0x67, 0x28, 0xfb, 0x09, 0xdd, 0x83, - 0x95, 0x34, 0x7e, 0x95, 0xe2, 0xa7, 0x7f, 0x40, 0xef, 0x03, 0x4a, 0xb0, 0x4a, 0xd0, 0x6b, 0x0c, - 0x3d, 0xce, 0x4c, 0xcf, 0xf0, 0xd4, 0x1f, 0x29, 0xb0, 0xfa, 0x54, 0xf7, 0x07, 0x47, 0x9b, 0x16, - 0xb7, 0xb5, 0x05, 0x7c, 0xd5, 0x37, 0xa0, 0x76, 0xc2, 0xf5, 0x22, 0x08, 0x48, 0x37, 0x24, 0xf2, - 0x89, 0x6a, 0xa0, 0x16, 0xce, 0x50, 0x7f, 0xa6, 0xc0, 0xa5, 0xc7, 0x91, 0xba, 0xf0, 0x35, 0x78, - 0xcd, 0x59, 0x05, 0xed, 0x6d, 0x68, 0x59, 0xba, 0x7b, 0x9c, 0xaa, 0x67, 0x13, 0x50, 0xf5, 0x05, - 0x00, 0x1f, 0xed, 0x78, 0xc3, 0x39, 0xf8, 0xff, 0x04, 0x96, 0xf8, 0xaa, 0xdc, 0x7d, 0xce, 0xd2, - 0xb3, 0x00, 0x5d, 0xfd, 0x17, 0x05, 0x5a, 0x61, 0x48, 0xa4, 0x46, 0xde, 0x82, 0x82, 0x30, 0xed, - 0x42, 0x6f, 0x13, 0x7d, 0x03, 0x2a, 0xac, 0xd1, 0xc1, 0x69, 0xdf, 0x8a, 0xd3, 0xe6, 0x4d, 0x90, - 0x48, 0x5c, 0xa5, 0x00, 0x8d, 0x4f, 0x22, 0x32, 0x12, 0x51, 0x44, 0x38, 0x9f, 0x10, 0x82, 0x7a, - 0xb0, 0x1c, 0x4f, 0xd9, 0x03, 0x13, 0xbe, 0x99, 0x15, 0x3c, 0x36, 0x75, 0x5f, 0xa7, 0xb1, 0xa3, - 0x15, 0xcb, 0xd8, 0x3d, 0xf5, 0xf7, 0x2a, 0x50, 0x8f, 0xec, 0x32, 0xb5, 0x93, 0xe4, 0x91, 0x16, - 0x66, 0xd7, 0x8d, 0xc5, 0x74, 0xdd, 0x78, 0x0b, 0x5a, 0x26, 0x4d, 0xbe, 0xfa, 0x5c, 0x15, 0xa9, - 0xd7, 0xac, 0x69, 0x4d, 0x06, 0xe5, 0x76, 0x81, 0xae, 0x43, 0xdd, 0x9e, 0x58, 0x7d, 0xe7, 0xb0, - 0xef, 0x3a, 0xa7, 0x1e, 0x2f, 0x40, 0x6b, 0xf6, 0xc4, 0xfa, 0xd6, 0xa1, 0xe6, 0x9c, 0x7a, 0x61, - 0x8d, 0x53, 0x39, 0x67, 0x8d, 0x73, 0x1d, 0xea, 0x96, 0xfe, 0x82, 0x50, 0xed, 0xdb, 0x13, 0x8b, - 0xd6, 0xa6, 0x45, 0xad, 0x66, 0xe9, 0x2f, 0x34, 0xe7, 0x74, 0x77, 0x62, 0xa1, 0x3b, 0xd0, 0x1e, - 0xe9, 0x9e, 0xdf, 0x8f, 0x16, 0xb7, 0x55, 0x5a, 0xdc, 0xb6, 0x08, 0xfc, 0xf3, 0xb0, 0xc0, 0x4d, - 0x57, 0x4b, 0xb5, 0x05, 0xaa, 0x25, 0xc3, 0x1a, 0x85, 0x84, 0x20, 0x7f, 0xb5, 0x64, 0x58, 0x23, - 0x41, 0xe6, 0x13, 0x58, 0x7a, 0x46, 0x53, 0x5a, 0xaf, 0x53, 0xcf, 0x74, 0x98, 0x8f, 0x49, 0x36, - 0xcb, 0x32, 0x5f, 0x2d, 0x40, 0x47, 0x5f, 0x87, 0x1a, 0xcd, 0x24, 0xe8, 0xdc, 0x46, 0xae, 0xb9, - 0xe1, 0x04, 0x32, 0xdb, 0xc0, 0x23, 0x5f, 0xa7, 0xb3, 0x9b, 0xf9, 0x66, 0x8b, 0x09, 0xc4, 0x49, - 0x0f, 0x5c, 0xac, 0xfb, 0xd8, 0xd8, 0x38, 0x7b, 0xe4, 0x58, 0x63, 0x9d, 0x2a, 0x53, 0xa7, 0x45, - 0xcb, 0x16, 0xd9, 0x4f, 0xc4, 0x31, 0x0c, 0xc4, 0xe8, 0xb1, 0xeb, 0x58, 0x9d, 0x65, 0xe6, 0x18, - 0xe2, 0x50, 0x74, 0x0d, 0x20, 0x70, 0xcf, 0xba, 0xdf, 0x69, 0xd3, 0x53, 0xac, 0x71, 0xc8, 0x67, - 0xb4, 0x77, 0x65, 0x7a, 0x7d, 0xd6, 0x25, 0x32, 0xed, 0x61, 0x67, 0x85, 0xae, 0x58, 0x0f, 0xda, - 0x4a, 0xa6, 0x3d, 0x54, 0x7f, 0x00, 0x97, 0x42, 0x25, 0x8a, 0x1c, 0x58, 0xfa, 0xec, 0x95, 0x79, - 0xcf, 0x7e, 0x7a, 0xbd, 0xf2, 0xef, 0x25, 0x58, 0xdd, 0xd7, 0x4f, 0xf0, 0xab, 0x2f, 0x8d, 0x72, - 0xb9, 0xec, 0x6d, 0x58, 0xa1, 0xd5, 0xd0, 0x7a, 0x84, 0x9f, 0x29, 0x39, 0x43, 0xf4, 0xc4, 0xd3, - 0x13, 0xd1, 0x37, 0x49, 0xb2, 0x83, 0x07, 0xc7, 0x7b, 0x8e, 0x19, 0xe6, 0x0b, 0xd7, 0x24, 0x74, - 0x1e, 0x09, 0x2c, 0x2d, 0x3a, 0x03, 0xed, 0xa5, 0xbd, 0x1f, 0xcb, 0x14, 0xde, 0x99, 0x5a, 0xa0, - 0x87, 0xd2, 0x4f, 0x3a, 0x41, 0xd4, 0x81, 0x25, 0x1e, 0xe6, 0xa9, 0x6b, 0xa8, 0x6a, 0xc1, 0x10, - 0xed, 0xc1, 0x45, 0xb6, 0x83, 0x7d, 0xae, 0xf7, 0x6c, 0xf3, 0xd5, 0x5c, 0x9b, 0x97, 0x4d, 0x8d, - 0x9b, 0x4d, 0xed, 0xbc, 0x66, 0xd3, 0x81, 0x25, 0xae, 0xca, 0xd4, 0x5d, 0x54, 0xb5, 0x60, 0x48, - 0x8e, 0x39, 0x54, 0xea, 0x3a, 0xfd, 0x2d, 0x04, 0x90, 0xb2, 0x12, 0x42, 0x79, 0xce, 0x68, 0x25, - 0x7d, 0x0a, 0x55, 0xa1, 0xe1, 0x85, 0xdc, 0x1a, 0x2e, 0xe6, 0x24, 0xdd, 0x78, 0x31, 0xe1, 0xc6, - 0xd5, 0x7f, 0x55, 0xa0, 0xb1, 0x49, 0xb6, 0xb4, 0xed, 0x0c, 0x69, 0xd0, 0xb9, 0x05, 0x2d, 0x17, - 0x0f, 0x1c, 0xd7, 0xe8, 0x63, 0xdb, 0x77, 0x4d, 0xcc, 0x3a, 0x10, 0x25, 0xad, 0xc9, 0xa0, 0x9f, - 0x33, 0x20, 0x41, 0x23, 0x9e, 0xd9, 0xf3, 0x75, 0x6b, 0xdc, 0x3f, 0x24, 0x1e, 0xa0, 0xc0, 0xd0, - 0x04, 0x94, 0x3a, 0x80, 0x37, 0xa1, 0x11, 0xa2, 0xf9, 0x0e, 0x5d, 0xbf, 0xa4, 0xd5, 0x05, 0xec, - 0xc0, 0x41, 0x6f, 0x43, 0x8b, 0xca, 0xb4, 0x3f, 0x72, 0x86, 0x7d, 0x52, 0xad, 0xf3, 0x78, 0xd4, - 0x30, 0x38, 0x5b, 0xe4, 0xac, 0xe2, 0x58, 0x9e, 0xf9, 0x7d, 0xcc, 0x23, 0x92, 0xc0, 0xda, 0x37, - 0xbf, 0x8f, 0x49, 0x3a, 0xd0, 0x24, 0xe1, 0x75, 0xd7, 0x31, 0xf0, 0xc1, 0x9c, 0xc9, 0x48, 0x8e, - 0xb6, 0xee, 0x55, 0xa8, 0x89, 0x1d, 0xf0, 0x2d, 0x85, 0x00, 0xf4, 0x18, 0x5a, 0x41, 0xda, 0xdc, - 0x67, 0xd5, 0x64, 0x29, 0x33, 0x39, 0x8c, 0x04, 0x48, 0x4f, 0x6b, 0x06, 0xd3, 0xe8, 0x50, 0x7d, - 0x0c, 0x8d, 0xe8, 0xcf, 0x64, 0xd5, 0xfd, 0xa4, 0xa2, 0x08, 0x00, 0xd1, 0xc6, 0xdd, 0x89, 0x45, - 0xce, 0x94, 0x3b, 0x96, 0x60, 0xa8, 0xfe, 0x50, 0x81, 0x26, 0x8f, 0xea, 0xfb, 0xe2, 0x02, 0x84, - 0x6e, 0x4d, 0xa1, 0x5b, 0xa3, 0x7f, 0xa3, 0x5f, 0x8e, 0xf7, 0x2c, 0xdf, 0x96, 0x3a, 0x01, 0x4a, - 0x84, 0x26, 0xd0, 0xb1, 0x90, 0x9e, 0xa7, 0x7f, 0xf1, 0x15, 0x51, 0x34, 0x7e, 0x34, 0x54, 0xd1, - 0x3a, 0xb0, 0xa4, 0x1b, 0x86, 0x8b, 0x3d, 0x8f, 0xf3, 0x11, 0x0c, 0xc9, 0x2f, 0x27, 0xd8, 0xf5, - 0x02, 0x95, 0x2f, 0x6a, 0xc1, 0x10, 0x7d, 0x1d, 0xaa, 0x22, 0xe3, 0x2e, 0xca, 0xb2, 0xac, 0x28, - 0x9f, 0xbc, 0xda, 0x16, 0x33, 0xd4, 0xbf, 0x2d, 0x40, 0x8b, 0x0b, 0x6c, 0x83, 0x87, 0xdd, 0xe9, - 0xc6, 0xb7, 0x01, 0x8d, 0xc3, 0xd0, 0xf6, 0xa7, 0xf5, 0xd5, 0xa2, 0x2e, 0x22, 0x36, 0x67, 0x96, - 0x01, 0xc6, 0x03, 0x7f, 0x69, 0xa1, 0xc0, 0x5f, 0x3e, 0xaf, 0x07, 0x4b, 0xa7, 0x82, 0x15, 0x49, - 0x2a, 0xa8, 0xfe, 0x1a, 0xd4, 0x23, 0x04, 0xa8, 0x87, 0x66, 0x0d, 0x39, 0x2e, 0xb1, 0x60, 0x88, - 0x3e, 0x0a, 0xd3, 0x1f, 0x26, 0xaa, 0xcb, 0x12, 0x5e, 0x12, 0x99, 0x8f, 0xfa, 0x4f, 0x0a, 0x54, - 0x38, 0xe5, 0x1b, 0x50, 0xe7, 0x4e, 0x87, 0xa6, 0x86, 0x8c, 0x3a, 0x70, 0x10, 0xc9, 0x0d, 0x5f, - 0x9e, 0xd7, 0xb9, 0x0c, 0xd5, 0x84, 0xbf, 0x59, 0xe2, 0x61, 0x21, 0xf8, 0x29, 0xe2, 0x64, 0xc8, - 0x4f, 0xc4, 0xbf, 0xa0, 0x4b, 0x50, 0x1e, 0x39, 0x43, 0x71, 0xc1, 0xc5, 0x06, 0xa4, 0x92, 0x5b, - 0xdb, 0xc2, 0xbe, 0x86, 0x07, 0xce, 0x09, 0x76, 0xcf, 0x16, 0x6f, 0xe4, 0x3e, 0x8c, 0xa8, 0x79, - 0xce, 0xc2, 0x52, 0x4c, 0x40, 0x0f, 0xc3, 0x43, 0x28, 0xca, 0xba, 0x58, 0x51, 0xbf, 0xc3, 0x95, - 0x34, 0x3c, 0x8c, 0xdf, 0x65, 0x2d, 0xe9, 0xf8, 0x56, 0xe6, 0xcd, 0x76, 0x5e, 0x4a, 0xbd, 0xa2, - 0xfe, 0x81, 0x02, 0x97, 0xb7, 0xb0, 0xff, 0x38, 0xde, 0xa4, 0x78, 0xdd, 0x5c, 0x59, 0xd0, 0x95, - 0x31, 0xb5, 0xc8, 0xa9, 0x77, 0xa1, 0x2a, 0xda, 0x2d, 0xec, 0x62, 0x41, 0x8c, 0xd5, 0xdf, 0x54, - 0xa0, 0xc3, 0x57, 0xa1, 0x6b, 0x92, 0x5c, 0x7c, 0x84, 0x7d, 0x6c, 0xfc, 0xbc, 0x0b, 0xee, 0x7f, - 0x54, 0xa0, 0x1d, 0x8d, 0x03, 0xd4, 0x95, 0x7f, 0x0c, 0x65, 0xda, 0xd7, 0xe0, 0x1c, 0xcc, 0x54, - 0x56, 0x86, 0x4d, 0x1c, 0x09, 0x4d, 0xfe, 0x0e, 0x44, 0xc8, 0xe2, 0xc3, 0x30, 0x18, 0x15, 0xcf, - 0x1f, 0x8c, 0x78, 0x70, 0x76, 0x26, 0x84, 0x2e, 0x6b, 0x08, 0x86, 0x00, 0xf5, 0x57, 0x60, 0x35, - 0xac, 0x63, 0xd8, 0xbc, 0x79, 0x35, 0x49, 0xfd, 0x23, 0x05, 0x2e, 0xee, 0x9f, 0xd9, 0x83, 0xa4, - 0x4e, 0xae, 0x42, 0x65, 0x3c, 0xd2, 0xc3, 0x06, 0x23, 0x1f, 0xd1, 0xcc, 0x82, 0xad, 0x8d, 0x0d, - 0xe2, 0x96, 0xd8, 0xa6, 0xeb, 0x02, 0x76, 0xe0, 0xcc, 0x8c, 0x16, 0xb7, 0x44, 0xe1, 0x85, 0x0d, - 0xe6, 0x00, 0x59, 0xd7, 0xa6, 0x29, 0xa0, 0xc4, 0x01, 0xaa, 0x3f, 0x2d, 0x40, 0x27, 0xb2, 0xcd, - 0x9f, 0x77, 0xcc, 0xcb, 0xc8, 0xd4, 0x8b, 0x2f, 0x29, 0x53, 0x2f, 0x2d, 0x1e, 0xe7, 0xca, 0xb2, - 0x38, 0xf7, 0x0f, 0x05, 0x68, 0x85, 0x52, 0xdb, 0x1b, 0xe9, 0x76, 0xe6, 0x51, 0xee, 0x8b, 0x1c, - 0x2f, 0x2e, 0xa7, 0xf7, 0x64, 0x9a, 0x9a, 0x71, 0x10, 0x5a, 0x82, 0x04, 0xa9, 0x96, 0x59, 0x31, - 0x45, 0x7b, 0x1e, 0x3c, 0xaf, 0x64, 0x26, 0x61, 0x5a, 0x18, 0xdd, 0x03, 0xc4, 0xf5, 0xb8, 0x6f, - 0xda, 0x7d, 0x0f, 0x0f, 0x1c, 0xdb, 0x60, 0x1a, 0x5e, 0xd6, 0xda, 0xfc, 0x97, 0x9e, 0xbd, 0xcf, - 0xe0, 0xe8, 0x63, 0x28, 0xf9, 0x67, 0x63, 0x16, 0xc1, 0x5a, 0xd2, 0x18, 0x10, 0xf2, 0x75, 0x70, - 0x36, 0xc6, 0x1a, 0x45, 0x0f, 0x5e, 0xa6, 0xf8, 0xae, 0x7e, 0xc2, 0xd3, 0x81, 0x92, 0x16, 0x81, - 0x10, 0x9b, 0x0d, 0x64, 0xb8, 0xc4, 0xc2, 0x26, 0x1f, 0xaa, 0x7f, 0x57, 0x80, 0x76, 0x48, 0x52, - 0xc3, 0xde, 0x64, 0x94, 0x6d, 0x0a, 0xd3, 0x0b, 0xe1, 0x59, 0x56, 0xf0, 0x4d, 0xa8, 0xf3, 0xf3, - 0x3c, 0x87, 0x3e, 0x00, 0x9b, 0xb2, 0x3d, 0x45, 0x41, 0xcb, 0x2f, 0x49, 0x41, 0x2b, 0xe7, 0x54, - 0x50, 0xf5, 0x27, 0x0a, 0xbc, 0x91, 0x72, 0x4b, 0x53, 0x05, 0x38, 0x3d, 0x5d, 0xe7, 0xee, 0x2a, - 0x49, 0x92, 0x7b, 0xc8, 0x87, 0x50, 0x71, 0x29, 0x75, 0x7e, 0x73, 0xf1, 0xd6, 0x54, 0xe5, 0x60, - 0x8c, 0x68, 0x7c, 0x8a, 0xfa, 0xfb, 0x0a, 0xac, 0xa5, 0x59, 0x5d, 0x20, 0xec, 0x6d, 0xc0, 0x12, - 0x23, 0x1d, 0xd8, 0xd0, 0x9d, 0xe9, 0x36, 0x14, 0x0a, 0x47, 0x0b, 0x26, 0xaa, 0xfb, 0xb0, 0x1a, - 0x44, 0xc7, 0x50, 0xc0, 0x3b, 0xd8, 0xd7, 0xa7, 0x24, 0xab, 0x37, 0xa0, 0xce, 0xb2, 0x1e, 0x96, - 0x04, 0xb2, 0x32, 0x0f, 0x9e, 0x89, 0xee, 0x88, 0xfa, 0x17, 0x0a, 0x5c, 0xa2, 0xe1, 0x25, 0x79, - 0x55, 0x90, 0xe7, 0x1a, 0x49, 0x15, 0x55, 0x24, 0xa9, 0x18, 0xd9, 0xd6, 0x6a, 0x5a, 0x0c, 0x26, - 0x6b, 0x1d, 0x17, 0xe7, 0x6c, 0x1d, 0x6f, 0xc3, 0x1b, 0x09, 0x56, 0x17, 0x38, 0x12, 0xb2, 0xf3, - 0xd5, 0xfd, 0xf8, 0xfb, 0x8d, 0xf9, 0xf3, 0xad, 0x6b, 0xe2, 0x92, 0xa1, 0x6f, 0x1a, 0x49, 0x5b, - 0x37, 0xd0, 0xa7, 0x50, 0xb3, 0xf1, 0x69, 0x3f, 0x1a, 0xee, 0x73, 0xf4, 0x92, 0xab, 0x36, 0x3e, - 0xa5, 0x7f, 0xa9, 0xbb, 0xb0, 0x96, 0x62, 0x75, 0x91, 0xbd, 0xff, 0xbd, 0x02, 0x97, 0x37, 0x5d, - 0x67, 0xfc, 0xa5, 0xe9, 0xfa, 0x13, 0x7d, 0x14, 0xbf, 0x92, 0x7d, 0x35, 0xed, 0x84, 0x2f, 0x22, - 0x89, 0x1f, 0x53, 0x80, 0x7b, 0x12, 0x13, 0x48, 0x33, 0xc5, 0x37, 0x1d, 0x49, 0x13, 0xff, 0xbb, - 0x28, 0x63, 0x9e, 0xe3, 0xcd, 0x08, 0xfc, 0x79, 0xf2, 0x62, 0x69, 0xf7, 0xb1, 0x38, 0x6f, 0xf7, - 0x31, 0xc3, 0x0b, 0x97, 0x5e, 0x92, 0x17, 0x3e, 0x77, 0x39, 0xfc, 0x05, 0xc4, 0x3b, 0xc3, 0x34, - 0xfc, 0xcd, 0xd5, 0x52, 0xde, 0x00, 0x08, 0xbb, 0xa4, 0xfc, 0xf9, 0x5d, 0x1e, 0x32, 0x91, 0x59, - 0xe4, 0xb4, 0x44, 0xc4, 0xa3, 0x17, 0x20, 0xb1, 0xbe, 0xdd, 0xb7, 0xa1, 0x2b, 0xd3, 0xd2, 0x45, - 0x34, 0xff, 0xa7, 0x05, 0x80, 0x9e, 0x78, 0xb1, 0x39, 0x9f, 0x33, 0x7f, 0x0b, 0x9a, 0xa1, 0xc2, - 0x84, 0xf6, 0x1e, 0xd5, 0x22, 0x83, 0x98, 0x84, 0x28, 0xa5, 0x08, 0x4e, 0xaa, 0xbc, 0x32, 0x28, - 0x9d, 0x88, 0xd5, 0x30, 0xa5, 0x48, 0xfa, 0xcf, 0x2b, 0x50, 0x73, 0x9d, 0xd3, 0x3e, 0x31, 0x33, - 0x23, 0x78, 0x92, 0xea, 0x3a, 0xa7, 0xc4, 0xf8, 0x0c, 0xb4, 0x06, 0x4b, 0xbe, 0xee, 0x1d, 0x13, - 0xfa, 0x95, 0xc8, 0xab, 0x00, 0x83, 0xd4, 0xf0, 0x87, 0xe6, 0x08, 0xb3, 0x4b, 0xe8, 0x9a, 0xc6, - 0x06, 0xe8, 0x6b, 0xc1, 0xdb, 0xa9, 0x6a, 0xee, 0x97, 0x1f, 0xec, 0xf9, 0xd4, 0xcf, 0x14, 0x58, - 0x0e, 0xa5, 0x46, 0x1d, 0x10, 0xf1, 0x69, 0xd4, 0x9f, 0x3d, 0x72, 0x0c, 0xe6, 0x2a, 0x5a, 0x19, - 0x2e, 0x9d, 0x4d, 0x64, 0x5e, 0x2b, 0x9c, 0x32, 0xad, 0x12, 0x24, 0xfb, 0x22, 0x9b, 0x36, 0x8d, - 0xe0, 0x32, 0xb2, 0xe2, 0x3a, 0xa7, 0x3d, 0x43, 0x48, 0x83, 0xbd, 0x37, 0x65, 0x75, 0x0f, 0x91, - 0xc6, 0x23, 0xfa, 0xe4, 0xf4, 0x2d, 0x68, 0x62, 0xd7, 0x75, 0xdc, 0xbe, 0x85, 0x3d, 0x4f, 0x1f, - 0x62, 0x9e, 0x00, 0x37, 0x28, 0x70, 0x87, 0xc1, 0xd4, 0x7f, 0x2e, 0x42, 0x2b, 0xdc, 0x4a, 0x70, - 0x05, 0x69, 0x1a, 0xc1, 0x15, 0xa4, 0x49, 0x8e, 0x0e, 0x5c, 0xe6, 0x0a, 0xc5, 0xe1, 0x6e, 0x14, - 0x3a, 0x8a, 0x56, 0xe3, 0xd0, 0x9e, 0x41, 0xe2, 0x2a, 0x31, 0x32, 0xdb, 0x31, 0x70, 0x78, 0xb8, - 0x10, 0x80, 0xf8, 0xd9, 0xc6, 0x74, 0xa4, 0x94, 0x43, 0x47, 0xca, 0x39, 0x74, 0xa4, 0x22, 0xd1, - 0x91, 0x55, 0xa8, 0x3c, 0x9b, 0x0c, 0x8e, 0xb1, 0xcf, 0xd3, 0x55, 0x3e, 0x8a, 0xeb, 0x4e, 0x35, - 0xa1, 0x3b, 0x42, 0x45, 0x6a, 0x51, 0x15, 0xb9, 0x02, 0x35, 0x76, 0x17, 0xd6, 0xf7, 0x3d, 0xda, - 0xf1, 0x2f, 0x6a, 0x55, 0x06, 0x38, 0xf0, 0xd0, 0x27, 0x41, 0x3e, 0x56, 0x97, 0x19, 0x3b, 0xf5, - 0x3a, 0x09, 0x2d, 0x09, 0xb2, 0xb1, 0x77, 0x60, 0x39, 0x22, 0x0e, 0x1a, 0x23, 0x1a, 0x94, 0xd5, - 0x56, 0x08, 0xa6, 0x61, 0xe2, 0x16, 0xb4, 0x42, 0x91, 0x50, 0xbc, 0x26, 0xab, 0x62, 0x04, 0x94, - 0xa0, 0xa9, 0xdf, 0x03, 0x14, 0xae, 0xb4, 0x58, 0x6a, 0x96, 0x38, 0xca, 0x42, 0xf2, 0x28, 0xd5, - 0xbf, 0x54, 0x60, 0x25, 0xba, 0xd8, 0xbc, 0x41, 0xf2, 0x53, 0xa8, 0xb3, 0xfb, 0x91, 0x3e, 0x31, - 0x52, 0xde, 0x93, 0xb8, 0x36, 0x55, 0x86, 0x1a, 0x84, 0xaf, 0xcb, 0x89, 0x2a, 0x9c, 0x3a, 0xee, - 0xb1, 0x69, 0x0f, 0xfb, 0x84, 0xb3, 0xc0, 0x34, 0x1a, 0x1c, 0xb8, 0x4b, 0x60, 0xea, 0x8f, 0x14, - 0xb8, 0xfe, 0x64, 0x6c, 0xe8, 0x3e, 0x8e, 0x64, 0x0b, 0x8b, 0x3e, 0x58, 0xfb, 0x38, 0x78, 0x31, - 0x56, 0xc8, 0xd7, 0xe3, 0x67, 0xd8, 0xea, 0x0e, 0x5c, 0xd6, 0xb0, 0x87, 0x6d, 0x23, 0xf6, 0xe3, - 0xdc, 0x9d, 0x88, 0x31, 0x74, 0x65, 0xe4, 0x16, 0x39, 0x7b, 0x96, 0xb6, 0xf5, 0x5d, 0x42, 0xd6, - 0xe7, 0x5e, 0x88, 0x64, 0x0b, 0x74, 0x1d, 0x5f, 0xfd, 0xab, 0x02, 0xac, 0x7d, 0x66, 0x18, 0xdc, - 0x81, 0xf1, 0x44, 0xe4, 0x55, 0xe5, 0x88, 0xc9, 0x1c, 0xaa, 0x98, 0xce, 0xa1, 0x5e, 0x96, 0x53, - 0xe1, 0xee, 0xd5, 0x9e, 0x58, 0x41, 0xd8, 0x70, 0xd9, 0xb3, 0x84, 0x87, 0xbc, 0x4f, 0x4f, 0x4a, - 0x4e, 0x1a, 0x3a, 0x66, 0xa7, 0x16, 0x55, 0x3a, 0x61, 0xdb, 0x19, 0xaa, 0x63, 0xe8, 0xa4, 0x85, - 0xb5, 0xa0, 0x65, 0x06, 0x12, 0x19, 0x3b, 0xac, 0x7d, 0xd6, 0x20, 0xd9, 0x03, 0x05, 0xed, 0x39, - 0x9e, 0xfa, 0x3f, 0x05, 0xe8, 0xec, 0xeb, 0x27, 0xf8, 0x17, 0xe7, 0x80, 0xbe, 0x03, 0x97, 0x3c, - 0xfd, 0x04, 0xf7, 0x23, 0x45, 0x5d, 0xdf, 0xc5, 0xcf, 0x79, 0xf6, 0xf5, 0xae, 0xcc, 0x30, 0xa5, - 0xd7, 0xfa, 0xda, 0x8a, 0x17, 0x83, 0x6b, 0xf8, 0x39, 0xba, 0x0d, 0xcb, 0xd1, 0xe7, 0x21, 0x84, - 0xb5, 0x2a, 0x15, 0x79, 0x33, 0xf2, 0xfa, 0xa3, 0x67, 0xa8, 0xcf, 0xe1, 0xea, 0x13, 0xdb, 0xc3, - 0x7e, 0x2f, 0x7c, 0xc1, 0xb0, 0x60, 0xf5, 0x74, 0x03, 0xea, 0xa1, 0xe0, 0x53, 0x0f, 0xce, 0x0d, - 0x4f, 0x75, 0xa0, 0xbb, 0x13, 0xbe, 0xc6, 0xf2, 0x36, 0xd9, 0x15, 0xf4, 0x2b, 0x5c, 0xf0, 0x50, - 0xbc, 0xc8, 0xd0, 0xf0, 0x21, 0x76, 0xb1, 0x3d, 0xc0, 0xdb, 0xce, 0xe0, 0x38, 0xf2, 0x0a, 0x53, - 0x89, 0xbe, 0xc2, 0x9c, 0xf7, 0x55, 0xe7, 0xdd, 0x07, 0xe2, 0x31, 0xd4, 0xc1, 0xd9, 0x18, 0xa3, - 0x25, 0x28, 0xee, 0xe2, 0xd3, 0xf6, 0x05, 0x04, 0x50, 0xd9, 0x75, 0x5c, 0x4b, 0x1f, 0xb5, 0x15, - 0x54, 0x87, 0x25, 0xde, 0x82, 0x6f, 0x17, 0xee, 0xfe, 0x89, 0x02, 0x2b, 0xa9, 0xae, 0x30, 0x6a, - 0x01, 0x3c, 0xb1, 0x07, 0xbc, 0x5d, 0xde, 0xbe, 0x80, 0x1a, 0x50, 0x0d, 0x9a, 0xe7, 0x8c, 0xc0, - 0x81, 0x43, 0xb1, 0xdb, 0x05, 0xd4, 0x86, 0x06, 0x9b, 0x38, 0x19, 0x0c, 0xb0, 0xe7, 0xb5, 0x8b, - 0x02, 0xf2, 0x58, 0x37, 0x47, 0x13, 0x17, 0xb7, 0x4b, 0xa8, 0x09, 0xb5, 0x03, 0x87, 0x3f, 0x7a, - 0x6d, 0x97, 0x11, 0x82, 0x56, 0xf0, 0x02, 0x96, 0x4f, 0xaa, 0x44, 0x60, 0xc1, 0xb4, 0xa5, 0xbb, - 0x4f, 0xa3, 0x9d, 0x45, 0xba, 0x9f, 0x35, 0xb8, 0xf8, 0xc4, 0x36, 0xf0, 0xa1, 0x69, 0x63, 0x23, - 0xfc, 0xa9, 0x7d, 0x01, 0x5d, 0x84, 0xe5, 0x1d, 0xec, 0x0e, 0x71, 0x04, 0x58, 0x40, 0x2b, 0xd0, - 0xdc, 0x31, 0x5f, 0x44, 0x40, 0x45, 0xb5, 0x54, 0x55, 0xda, 0xca, 0xfa, 0x7f, 0x5e, 0x86, 0xda, - 0xa6, 0xee, 0xeb, 0x8f, 0x1c, 0xc7, 0x35, 0xd0, 0x18, 0x10, 0x7d, 0x23, 0x6e, 0x8d, 0x1d, 0x5b, - 0x7c, 0x79, 0x81, 0x3e, 0xc8, 0xa8, 0x3c, 0xd2, 0xa8, 0x5c, 0x6d, 0xba, 0xb7, 0x33, 0x66, 0x24, - 0xd0, 0xd5, 0x0b, 0xc8, 0xa2, 0x2b, 0x1e, 0x98, 0x16, 0x3e, 0x30, 0x07, 0xc7, 0xc1, 0xe3, 0xb1, - 0x29, 0x2b, 0x26, 0x50, 0x83, 0x15, 0x13, 0x3d, 0x28, 0x3e, 0x60, 0x0f, 0xf9, 0x03, 0x57, 0xa9, - 0x5e, 0x40, 0xcf, 0xe1, 0xd2, 0x16, 0x8e, 0x04, 0xee, 0x60, 0xc1, 0xf5, 0xec, 0x05, 0x53, 0xc8, - 0xe7, 0x5c, 0x72, 0x1b, 0xca, 0x54, 0xc7, 0x90, 0x2c, 0xb6, 0x47, 0x3f, 0x94, 0xec, 0xde, 0xcc, - 0x46, 0x10, 0xd4, 0xbe, 0x07, 0xcb, 0x89, 0xcf, 0xab, 0x90, 0xcc, 0x35, 0xc9, 0x3f, 0x94, 0xeb, - 0xde, 0xcd, 0x83, 0x2a, 0xd6, 0x1a, 0x42, 0x2b, 0xfe, 0xbe, 0x1c, 0xc9, 0x5a, 0x6b, 0xd2, 0x2f, - 0x63, 0xba, 0xef, 0xe6, 0xc0, 0x14, 0x0b, 0x59, 0xd0, 0x4e, 0x7e, 0xee, 0x83, 0xee, 0x4e, 0x25, - 0x10, 0x57, 0xb7, 0xf7, 0x72, 0xe1, 0x8a, 0xe5, 0xce, 0xa8, 0x12, 0xa4, 0xbe, 0x20, 0x41, 0xf7, - 0xe5, 0x64, 0xb2, 0x3e, 0x6d, 0xe9, 0x3e, 0xc8, 0x8d, 0x2f, 0x96, 0xfe, 0x0d, 0x76, 0xd5, 0x2b, - 0xfb, 0x0a, 0x03, 0x7d, 0x28, 0x27, 0x37, 0xe5, 0xf3, 0x91, 0xee, 0xfa, 0x79, 0xa6, 0x08, 0x26, - 0x7e, 0x40, 0xef, 0x68, 0x25, 0xdf, 0x31, 0x24, 0xed, 0x2e, 0xa0, 0x97, 0xfd, 0x89, 0x46, 0xf7, - 0xc3, 0x73, 0xcc, 0x10, 0x0c, 0x38, 0xc9, 0xef, 0xa9, 0x02, 0x33, 0x7c, 0x30, 0x53, 0x6b, 0xe6, - 0xb3, 0xc1, 0xef, 0xc2, 0x72, 0x22, 0x58, 0xa3, 0xfc, 0x01, 0xbd, 0x3b, 0x2d, 0xa3, 0x62, 0x26, - 0x99, 0xb8, 0xf2, 0x46, 0x19, 0xda, 0x2f, 0xb9, 0x16, 0xef, 0xde, 0xcd, 0x83, 0x2a, 0x36, 0xe2, - 0x51, 0x77, 0x99, 0xb8, 0x36, 0x46, 0xf7, 0xe4, 0x34, 0xe4, 0x57, 0xde, 0xdd, 0xf7, 0x73, 0x62, - 0x8b, 0x45, 0x7f, 0x1d, 0xd0, 0xfe, 0x91, 0x73, 0xfa, 0xc8, 0xb1, 0x0f, 0xcd, 0xe1, 0xc4, 0xd5, - 0xd9, 0x43, 0xbb, 0x2c, 0x1f, 0x9d, 0x46, 0xcd, 0xd0, 0x95, 0xa9, 0x33, 0xc4, 0xe2, 0x7d, 0x80, - 0x2d, 0xec, 0xef, 0x60, 0xdf, 0x25, 0x0a, 0x7a, 0x5b, 0x7a, 0xde, 0x21, 0x42, 0xb0, 0xd4, 0x3b, - 0x33, 0xf1, 0x22, 0x21, 0xa1, 0xbd, 0xa3, 0xdb, 0x13, 0x7d, 0x14, 0x79, 0x9f, 0x7a, 0x4f, 0x3a, - 0x3d, 0x89, 0x96, 0x21, 0xd0, 0x4c, 0x6c, 0xb1, 0xe4, 0xa9, 0x08, 0xb3, 0x91, 0x3b, 0x89, 0xa4, - 0xfb, 0x09, 0x79, 0x96, 0x5f, 0x38, 0x27, 0xdd, 0xcf, 0x14, 0x7c, 0xb1, 0xf0, 0x57, 0x0a, 0xfd, - 0x58, 0x2f, 0x81, 0xf0, 0xd4, 0xf4, 0x8f, 0xf6, 0x46, 0xba, 0xed, 0xe5, 0x61, 0x81, 0x22, 0x9e, - 0x83, 0x05, 0x8e, 0x2f, 0x58, 0x30, 0xa0, 0x19, 0xbb, 0x69, 0x40, 0xb2, 0x97, 0x9e, 0xb2, 0x6b, - 0x93, 0xee, 0x9d, 0xd9, 0x88, 0x62, 0x95, 0x23, 0x68, 0x06, 0x2a, 0xcd, 0x84, 0xfb, 0x6e, 0x16, - 0xa7, 0x21, 0x4e, 0x86, 0x45, 0xca, 0x51, 0xa3, 0x16, 0x99, 0x6e, 0xa4, 0xa2, 0x7c, 0x0d, 0xf8, - 0x69, 0x16, 0x99, 0xdd, 0x9d, 0x65, 0x2e, 0x27, 0x71, 0x69, 0x21, 0xf7, 0x67, 0xd2, 0x3b, 0x18, - 0xa9, 0xcb, 0xc9, 0xb8, 0x03, 0x51, 0x2f, 0xa0, 0xa7, 0x50, 0xe1, 0x5f, 0xe9, 0xbf, 0x3d, 0xbd, - 0xa1, 0xc2, 0xa9, 0xdf, 0x9a, 0x81, 0x25, 0x08, 0x1f, 0xc3, 0x5a, 0x46, 0x3b, 0x45, 0x1a, 0x0a, - 0xa7, 0xb7, 0x5e, 0x66, 0x39, 0x69, 0x1d, 0x50, 0xfa, 0x53, 0x38, 0xe9, 0x31, 0x65, 0x7e, 0x31, - 0x97, 0x63, 0x89, 0xf4, 0xd7, 0x6c, 0xd2, 0x25, 0x32, 0x3f, 0x7a, 0x9b, 0xb5, 0x44, 0x1f, 0x56, - 0x52, 0x45, 0x39, 0x7a, 0x2f, 0x23, 0x92, 0xc9, 0x4a, 0xf7, 0x59, 0x0b, 0x0c, 0xe1, 0x0d, 0x69, - 0x01, 0x2a, 0x8d, 0xcc, 0xd3, 0x4a, 0xd5, 0x59, 0x0b, 0x0d, 0xe0, 0xa2, 0xa4, 0xec, 0x44, 0x32, - 0x4b, 0xc8, 0x2e, 0x4f, 0x67, 0x2c, 0xb2, 0xfe, 0x6f, 0x35, 0xa8, 0x06, 0x6f, 0x46, 0x5f, 0x43, - 0x6d, 0xf3, 0x1a, 0x8a, 0x8d, 0xef, 0xc2, 0x72, 0xe2, 0xfb, 0x34, 0xa9, 0x63, 0x90, 0x7f, 0xc3, - 0x36, 0xeb, 0xcc, 0x9e, 0xf2, 0xff, 0x9e, 0x22, 0xf2, 0x8e, 0x77, 0xb2, 0x0a, 0x96, 0x64, 0xca, - 0x31, 0x83, 0xf0, 0xff, 0xef, 0x04, 0x63, 0x17, 0x20, 0x92, 0x5a, 0x4c, 0x7f, 0x49, 0x43, 0xa2, - 0xe5, 0x2c, 0x69, 0x59, 0xd2, 0xec, 0xe1, 0xdd, 0x3c, 0xaf, 0x1e, 0xb2, 0xfd, 0x7f, 0x76, 0xce, - 0xf0, 0x04, 0x1a, 0xd1, 0x47, 0x6a, 0x48, 0xfa, 0xbf, 0x3a, 0xd2, 0xaf, 0xd8, 0x66, 0xed, 0x62, - 0xe7, 0x9c, 0x61, 0x65, 0x06, 0x39, 0x8f, 0x38, 0xdf, 0x64, 0x07, 0x3b, 0xc3, 0xf9, 0x66, 0xf4, - 0xcd, 0xa5, 0x61, 0x38, 0xbb, 0x2d, 0xce, 0xea, 0xd6, 0x64, 0x5b, 0x56, 0x5a, 0xb7, 0x66, 0x34, - 0xba, 0xa5, 0x75, 0x6b, 0x56, 0x9f, 0x57, 0xbd, 0xb0, 0xf1, 0xd1, 0x77, 0x3e, 0x1c, 0x9a, 0xfe, - 0xd1, 0xe4, 0x19, 0xd9, 0xfd, 0x03, 0x36, 0xf5, 0x7d, 0xd3, 0xe1, 0x7f, 0x3d, 0x08, 0xd4, 0xfd, - 0x01, 0xa5, 0xf6, 0x80, 0x50, 0x1b, 0x3f, 0x7b, 0x56, 0xa1, 0xa3, 0x8f, 0xfe, 0x37, 0x00, 0x00, - 0xff, 0xff, 0x3b, 0x08, 0xa6, 0x76, 0xff, 0x49, 0x00, 0x00, + 0x17, 0x1e, 0xf8, 0x01, 0xf0, 0x03, 0xf8, 0x03, 0xe8, 0x5c, 0xea, 0xd4, 0xed, 0x54, 0x77, 0xb9, + 0x3b, 0x99, 0x20, 0xf6, 0xcd, 0xe7, 0xeb, 0xef, 0x7c, 0xe7, 0x3b, 0xdf, 0xf9, 0xee, 0xe7, 0x94, + 0xa1, 0x6d, 0xe8, 0xbe, 0xde, 0x1f, 0x38, 0x8e, 0x6b, 0xdc, 0x1d, 0xbb, 0x8e, 0xef, 0xa0, 0x15, + 0xcb, 0x1c, 0x3d, 0x9f, 0x78, 0x6c, 0x74, 0x97, 0xfc, 0xdc, 0x6d, 0x0c, 0x1c, 0xcb, 0x72, 0x6c, + 0x06, 0xea, 0xb6, 0x4c, 0xdb, 0xc7, 0xae, 0xad, 0x8f, 0xf8, 0xb8, 0x11, 0x9d, 0xd0, 0x6d, 0x78, + 0x83, 0x23, 0x6c, 0xe9, 0x6c, 0xa4, 0x2e, 0x41, 0xf9, 0x0b, 0x6b, 0xec, 0x9f, 0xaa, 0x7f, 0xa4, + 0x40, 0xe3, 0xe1, 0x68, 0xe2, 0x1d, 0x69, 0xf8, 0xd9, 0x04, 0x7b, 0x3e, 0xfa, 0x00, 0x4a, 0x4f, + 0x75, 0x0f, 0x77, 0x94, 0xeb, 0xca, 0xad, 0xfa, 0xfa, 0xe5, 0xbb, 0xb1, 0x55, 0xf9, 0x7a, 0x3b, + 0xde, 0x70, 0x43, 0xf7, 0xb0, 0x46, 0x31, 0x11, 0x82, 0x92, 0xf1, 0xb4, 0xb7, 0xd9, 0x29, 0x5c, + 0x57, 0x6e, 0x15, 0x35, 0xfa, 0x37, 0xba, 0x0a, 0xe0, 0xe1, 0xa1, 0x85, 0x6d, 0xbf, 0xb7, 0xe9, + 0x75, 0x8a, 0xd7, 0x8b, 0xb7, 0x8a, 0x5a, 0x04, 0x82, 0x54, 0x68, 0x0c, 0x9c, 0xd1, 0x08, 0x0f, + 0x7c, 0xd3, 0xb1, 0x7b, 0x9b, 0x9d, 0x12, 0x9d, 0x1b, 0x83, 0xa9, 0xff, 0xa5, 0x40, 0x93, 0xb3, + 0xe6, 0x8d, 0x1d, 0xdb, 0xc3, 0xe8, 0x23, 0xa8, 0x78, 0xbe, 0xee, 0x4f, 0x3c, 0xce, 0xdd, 0x25, + 0x29, 0x77, 0xfb, 0x14, 0x45, 0xe3, 0xa8, 0x52, 0xf6, 0x92, 0xcb, 0x17, 0xd3, 0xcb, 0x27, 0xb6, + 0x50, 0x4a, 0x6d, 0xe1, 0x16, 0x2c, 0x1f, 0x12, 0xee, 0xf6, 0x43, 0xa4, 0x32, 0x45, 0x4a, 0x82, + 0x09, 0x25, 0xdf, 0xb4, 0xf0, 0xb7, 0x0f, 0xf7, 0xb1, 0x3e, 0xea, 0x54, 0xe8, 0x5a, 0x11, 0x88, + 0xfa, 0xef, 0x0a, 0xb4, 0x05, 0x7a, 0x70, 0x0e, 0x17, 0xa0, 0x3c, 0x70, 0x26, 0xb6, 0x4f, 0xb7, + 0xda, 0xd4, 0xd8, 0x00, 0xbd, 0x09, 0x8d, 0xc1, 0x91, 0x6e, 0xdb, 0x78, 0xd4, 0xb7, 0x75, 0x0b, + 0xd3, 0x4d, 0xd5, 0xb4, 0x3a, 0x87, 0xed, 0xea, 0x16, 0xce, 0xb5, 0xb7, 0xeb, 0x50, 0x1f, 0xeb, + 0xae, 0x6f, 0xc6, 0xa4, 0x1f, 0x05, 0xa1, 0x2e, 0x54, 0x4d, 0xaf, 0x67, 0x8d, 0x1d, 0xd7, 0xef, + 0x94, 0xaf, 0x2b, 0xb7, 0xaa, 0x9a, 0x18, 0x93, 0x15, 0x4c, 0xfa, 0xd7, 0x81, 0xee, 0x1d, 0xf7, + 0x36, 0xf9, 0x8e, 0x62, 0x30, 0xf5, 0x4f, 0x15, 0x58, 0xfd, 0xdc, 0xf3, 0xcc, 0xa1, 0x9d, 0xda, + 0xd9, 0x2a, 0x54, 0x6c, 0xc7, 0xc0, 0xbd, 0x4d, 0xba, 0xb5, 0xa2, 0xc6, 0x47, 0xe8, 0x12, 0xd4, + 0xc6, 0x18, 0xbb, 0x7d, 0xd7, 0x19, 0x05, 0x1b, 0xab, 0x12, 0x80, 0xe6, 0x8c, 0x30, 0xfa, 0x0e, + 0xac, 0x78, 0x09, 0x42, 0x4c, 0xaf, 0xea, 0xeb, 0x6f, 0xdd, 0x4d, 0x59, 0xc6, 0xdd, 0xe4, 0xa2, + 0x5a, 0x7a, 0xb6, 0xfa, 0x55, 0x01, 0xce, 0x0b, 0x3c, 0xc6, 0x2b, 0xf9, 0x9b, 0x48, 0xde, 0xc3, + 0x43, 0xc1, 0x1e, 0x1b, 0xe4, 0x91, 0xbc, 0x38, 0xb2, 0x62, 0xf4, 0xc8, 0x72, 0xa8, 0x7a, 0xf2, + 0x3c, 0xca, 0xe9, 0xf3, 0xb8, 0x06, 0x75, 0xfc, 0x62, 0x6c, 0xba, 0xb8, 0x4f, 0x14, 0x87, 0x8a, + 0xbc, 0xa4, 0x01, 0x03, 0x1d, 0x98, 0x56, 0xd4, 0x36, 0x96, 0x72, 0xdb, 0x86, 0xfa, 0x67, 0x0a, + 0xac, 0xa5, 0x4e, 0x89, 0x1b, 0x9b, 0x06, 0x6d, 0xba, 0xf3, 0x50, 0x32, 0xc4, 0xec, 0x88, 0xc0, + 0x6f, 0x4e, 0x13, 0x78, 0x88, 0xae, 0xa5, 0xe6, 0x47, 0x98, 0x2c, 0xe4, 0x67, 0xf2, 0x18, 0xd6, + 0xb6, 0xb0, 0xcf, 0x17, 0x20, 0xbf, 0x61, 0x6f, 0x7e, 0x67, 0x15, 0xb7, 0xea, 0x42, 0xd2, 0xaa, + 0xd5, 0xbf, 0x2e, 0x08, 0x5b, 0xa4, 0x4b, 0xf5, 0xec, 0x43, 0x07, 0x5d, 0x86, 0x9a, 0x40, 0xe1, + 0x5a, 0x11, 0x02, 0xd0, 0x37, 0xa0, 0x4c, 0x38, 0x65, 0x2a, 0xd1, 0x5a, 0x7f, 0x53, 0xbe, 0xa7, + 0x08, 0x4d, 0x8d, 0xe1, 0xa3, 0x1e, 0xb4, 0x3c, 0x5f, 0x77, 0xfd, 0xfe, 0xd8, 0xf1, 0xe8, 0x39, + 0x53, 0xc5, 0xa9, 0xaf, 0xab, 0x71, 0x0a, 0xc2, 0xad, 0xef, 0x78, 0xc3, 0x3d, 0x8e, 0xa9, 0x35, + 0xe9, 0xcc, 0x60, 0x88, 0xbe, 0x80, 0x06, 0xb6, 0x8d, 0x90, 0x50, 0x29, 0x37, 0xa1, 0x3a, 0xb6, + 0x0d, 0x41, 0x26, 0x3c, 0x9f, 0x72, 0xfe, 0xf3, 0xf9, 0x6d, 0x05, 0x3a, 0xe9, 0x03, 0x5a, 0xc4, + 0x65, 0xdf, 0x67, 0x93, 0x30, 0x3b, 0xa0, 0xa9, 0x16, 0x2e, 0x0e, 0x49, 0xe3, 0x53, 0xd4, 0x3f, + 0x54, 0xe0, 0x8d, 0x90, 0x1d, 0xfa, 0xd3, 0xab, 0xd2, 0x16, 0x74, 0x1b, 0xda, 0xa6, 0x3d, 0x18, + 0x4d, 0x0c, 0xfc, 0xd8, 0x7e, 0x84, 0xf5, 0x91, 0x7f, 0x74, 0x4a, 0xcf, 0xb0, 0xaa, 0xa5, 0xe0, + 0xea, 0x8f, 0x14, 0x58, 0x4d, 0xf2, 0xb5, 0x88, 0x90, 0x7e, 0x09, 0xca, 0xa6, 0x7d, 0xe8, 0x04, + 0x32, 0xba, 0x3a, 0xc5, 0x28, 0xc9, 0x5a, 0x0c, 0x59, 0xb5, 0xe0, 0xd2, 0x16, 0xf6, 0x7b, 0xb6, + 0x87, 0x5d, 0x7f, 0xc3, 0xb4, 0x47, 0xce, 0x70, 0x4f, 0xf7, 0x8f, 0x16, 0x30, 0xa8, 0x98, 0x6d, + 0x14, 0x12, 0xb6, 0xa1, 0xfe, 0x54, 0x81, 0xcb, 0xf2, 0xf5, 0xf8, 0xd6, 0xbb, 0x50, 0x3d, 0x34, + 0xf1, 0xc8, 0x20, 0xf2, 0x55, 0xa8, 0x7c, 0xc5, 0x98, 0x18, 0xd6, 0x98, 0x20, 0xf3, 0x1d, 0xbe, + 0x99, 0xa1, 0xcd, 0xfb, 0xbe, 0x6b, 0xda, 0xc3, 0x6d, 0xd3, 0xf3, 0x35, 0x86, 0x1f, 0x91, 0x67, + 0x31, 0xbf, 0x1a, 0xff, 0x96, 0x02, 0x57, 0xb7, 0xb0, 0xff, 0x40, 0xf8, 0x65, 0xf2, 0xbb, 0xe9, + 0xf9, 0xe6, 0xc0, 0x7b, 0xb9, 0xb9, 0x51, 0x8e, 0x00, 0xad, 0xfe, 0x44, 0x81, 0x6b, 0x99, 0xcc, + 0x70, 0xd1, 0x71, 0xbf, 0x13, 0x78, 0x65, 0xb9, 0xdf, 0xf9, 0x55, 0x7c, 0xfa, 0xa5, 0x3e, 0x9a, + 0xe0, 0x3d, 0xdd, 0x74, 0x99, 0xdf, 0x99, 0xd3, 0x0b, 0xff, 0x95, 0x02, 0x57, 0xb6, 0xb0, 0xbf, + 0x17, 0xc4, 0xa4, 0xd7, 0x28, 0x1d, 0x82, 0x13, 0x89, 0x8d, 0x41, 0x72, 0x16, 0x83, 0xa9, 0xbf, + 0xc3, 0x8e, 0x53, 0xca, 0xef, 0x6b, 0x11, 0xe0, 0x55, 0x6a, 0x09, 0x11, 0x93, 0x7c, 0xc0, 0x52, + 0x07, 0x2e, 0x3e, 0xf5, 0x4f, 0x14, 0xb8, 0xf8, 0xf9, 0xe0, 0xd9, 0xc4, 0x74, 0x31, 0x47, 0xda, + 0x76, 0x06, 0xc7, 0xf3, 0x0b, 0x37, 0x4c, 0xb3, 0x0a, 0xb1, 0x34, 0x6b, 0x56, 0x6a, 0xbe, 0x0a, + 0x15, 0x9f, 0xe5, 0x75, 0x2c, 0x53, 0xe1, 0x23, 0xca, 0x9f, 0x86, 0x47, 0x58, 0xf7, 0xfe, 0x6f, + 0xf2, 0xf7, 0x93, 0x12, 0x34, 0xbe, 0xe4, 0xe9, 0x18, 0x8d, 0xda, 0x49, 0x4d, 0x52, 0xe4, 0x89, + 0x57, 0x24, 0x83, 0x93, 0x25, 0x75, 0x5b, 0xd0, 0xf4, 0x30, 0x3e, 0x9e, 0x27, 0x46, 0x37, 0xc8, + 0x44, 0x11, 0x5b, 0xb7, 0x61, 0x65, 0x62, 0xd3, 0xd2, 0x00, 0x1b, 0x5c, 0x80, 0x4c, 0x73, 0x67, + 0xfb, 0xee, 0xf4, 0x44, 0xf4, 0x88, 0x57, 0x1f, 0x11, 0x5a, 0xe5, 0x5c, 0xb4, 0x92, 0xd3, 0x50, + 0x0f, 0xda, 0x86, 0xeb, 0x8c, 0xc7, 0xd8, 0xe8, 0x7b, 0x01, 0xa9, 0x4a, 0x3e, 0x52, 0x7c, 0x9e, + 0x20, 0xf5, 0x01, 0x9c, 0x4f, 0x72, 0xda, 0x33, 0x48, 0x42, 0x4a, 0xce, 0x50, 0xf6, 0x13, 0xba, + 0x03, 0x2b, 0x69, 0xfc, 0x2a, 0xc5, 0x4f, 0xff, 0x80, 0xde, 0x07, 0x94, 0x60, 0x95, 0xa0, 0xd7, + 0x18, 0x7a, 0x9c, 0x99, 0x9e, 0xe1, 0xa9, 0x3f, 0x56, 0x60, 0xf5, 0x89, 0xee, 0x0f, 0x8e, 0x36, + 0x2d, 0x6e, 0x6b, 0x0b, 0xf8, 0xaa, 0x4f, 0xa1, 0xf6, 0x9c, 0xeb, 0x45, 0x10, 0x90, 0xae, 0x49, + 0xe4, 0x13, 0xd5, 0x40, 0x2d, 0x9c, 0xa1, 0xfe, 0x5c, 0x81, 0x0b, 0x0f, 0x23, 0x75, 0xe1, 0x6b, + 0xf0, 0x9a, 0xb3, 0x0a, 0xda, 0x9b, 0xd0, 0xb2, 0x74, 0xf7, 0x38, 0x55, 0xcf, 0x26, 0xa0, 0xea, + 0x0b, 0x00, 0x3e, 0xda, 0xf1, 0x86, 0x73, 0xf0, 0xff, 0x09, 0x2c, 0xf1, 0x55, 0xb9, 0xfb, 0x9c, + 0xa5, 0x67, 0x01, 0xba, 0xfa, 0xcf, 0x0a, 0xb4, 0xc2, 0x90, 0x48, 0x8d, 0xbc, 0x05, 0x05, 0x61, + 0xda, 0x85, 0xde, 0x26, 0xfa, 0x14, 0x2a, 0xac, 0xd1, 0xc1, 0x69, 0xdf, 0x88, 0xd3, 0xe6, 0x4d, + 0x90, 0x48, 0x5c, 0xa5, 0x00, 0x8d, 0x4f, 0x22, 0x32, 0x12, 0x51, 0x44, 0x38, 0x9f, 0x10, 0x82, + 0x7a, 0xb0, 0x1c, 0x4f, 0xd9, 0x03, 0x13, 0xbe, 0x9e, 0x15, 0x3c, 0x36, 0x75, 0x5f, 0xa7, 0xb1, + 0xa3, 0x15, 0xcb, 0xd8, 0x3d, 0xf5, 0xf7, 0x2a, 0x50, 0x8f, 0xec, 0x32, 0xb5, 0x93, 0xe4, 0x91, + 0x16, 0x66, 0xd7, 0x8d, 0xc5, 0x74, 0xdd, 0x78, 0x03, 0x5a, 0x26, 0x4d, 0xbe, 0xfa, 0x5c, 0x15, + 0xa9, 0xd7, 0xac, 0x69, 0x4d, 0x06, 0xe5, 0x76, 0x81, 0xae, 0x42, 0xdd, 0x9e, 0x58, 0x7d, 0xe7, + 0xb0, 0xef, 0x3a, 0x27, 0x1e, 0x2f, 0x40, 0x6b, 0xf6, 0xc4, 0xfa, 0xf6, 0xa1, 0xe6, 0x9c, 0x78, + 0x61, 0x8d, 0x53, 0x39, 0x63, 0x8d, 0x73, 0x15, 0xea, 0x96, 0xfe, 0x82, 0x50, 0xed, 0xdb, 0x13, + 0x8b, 0xd6, 0xa6, 0x45, 0xad, 0x66, 0xe9, 0x2f, 0x34, 0xe7, 0x64, 0x77, 0x62, 0xa1, 0x5b, 0xd0, + 0x1e, 0xe9, 0x9e, 0xdf, 0x8f, 0x16, 0xb7, 0x55, 0x5a, 0xdc, 0xb6, 0x08, 0xfc, 0x8b, 0xb0, 0xc0, + 0x4d, 0x57, 0x4b, 0xb5, 0x05, 0xaa, 0x25, 0xc3, 0x1a, 0x85, 0x84, 0x20, 0x7f, 0xb5, 0x64, 0x58, + 0x23, 0x41, 0xe6, 0x13, 0x58, 0x7a, 0x4a, 0x53, 0x5a, 0xaf, 0x53, 0xcf, 0x74, 0x98, 0x0f, 0x49, + 0x36, 0xcb, 0x32, 0x5f, 0x2d, 0x40, 0x47, 0xdf, 0x84, 0x1a, 0xcd, 0x24, 0xe8, 0xdc, 0x46, 0xae, + 0xb9, 0xe1, 0x04, 0x32, 0xdb, 0xc0, 0x23, 0x5f, 0xa7, 0xb3, 0x9b, 0xf9, 0x66, 0x8b, 0x09, 0xc4, + 0x49, 0x0f, 0x5c, 0xac, 0xfb, 0xd8, 0xd8, 0x38, 0x7d, 0xe0, 0x58, 0x63, 0x9d, 0x2a, 0x53, 0xa7, + 0x45, 0xcb, 0x16, 0xd9, 0x4f, 0xc4, 0x31, 0x0c, 0xc4, 0xe8, 0xa1, 0xeb, 0x58, 0x9d, 0x65, 0xe6, + 0x18, 0xe2, 0x50, 0x74, 0x05, 0x20, 0x70, 0xcf, 0xba, 0xdf, 0x69, 0xd3, 0x53, 0xac, 0x71, 0xc8, + 0xe7, 0xb4, 0x77, 0x65, 0x7a, 0x7d, 0xd6, 0x25, 0x32, 0xed, 0x61, 0x67, 0x85, 0xae, 0x58, 0x0f, + 0xda, 0x4a, 0xa6, 0x3d, 0x54, 0x7f, 0x08, 0x17, 0x42, 0x25, 0x8a, 0x1c, 0x58, 0xfa, 0xec, 0x95, + 0x79, 0xcf, 0x7e, 0x7a, 0xbd, 0xf2, 0x6f, 0x25, 0x58, 0xdd, 0xd7, 0x9f, 0xe3, 0x57, 0x5f, 0x1a, + 0xe5, 0x72, 0xd9, 0xdb, 0xb0, 0x42, 0xab, 0xa1, 0xf5, 0x08, 0x3f, 0x53, 0x72, 0x86, 0xe8, 0x89, + 0xa7, 0x27, 0xa2, 0x6f, 0x91, 0x64, 0x07, 0x0f, 0x8e, 0xf7, 0x1c, 0x33, 0xcc, 0x17, 0xae, 0x48, + 0xe8, 0x3c, 0x10, 0x58, 0x5a, 0x74, 0x06, 0xda, 0x4b, 0x7b, 0x3f, 0x96, 0x29, 0xbc, 0x33, 0xb5, + 0x40, 0x0f, 0xa5, 0x9f, 0x74, 0x82, 0xa8, 0x03, 0x4b, 0x3c, 0xcc, 0x53, 0xd7, 0x50, 0xd5, 0x82, + 0x21, 0xda, 0x83, 0xf3, 0x6c, 0x07, 0xfb, 0x5c, 0xef, 0xd9, 0xe6, 0xab, 0xb9, 0x36, 0x2f, 0x9b, + 0x1a, 0x37, 0x9b, 0xda, 0x59, 0xcd, 0xa6, 0x03, 0x4b, 0x5c, 0x95, 0xa9, 0xbb, 0xa8, 0x6a, 0xc1, + 0x90, 0x1c, 0x73, 0xa8, 0xd4, 0x75, 0xfa, 0x5b, 0x08, 0x20, 0x65, 0x25, 0x84, 0xf2, 0x9c, 0xd1, + 0x4a, 0xfa, 0x0c, 0xaa, 0x42, 0xc3, 0x0b, 0xb9, 0x35, 0x5c, 0xcc, 0x49, 0xba, 0xf1, 0x62, 0xc2, + 0x8d, 0xab, 0xff, 0xa2, 0x40, 0x63, 0x93, 0x6c, 0x69, 0xdb, 0x19, 0xd2, 0xa0, 0x73, 0x03, 0x5a, + 0x2e, 0x1e, 0x38, 0xae, 0xd1, 0xc7, 0xb6, 0xef, 0x9a, 0x98, 0x75, 0x20, 0x4a, 0x5a, 0x93, 0x41, + 0xbf, 0x60, 0x40, 0x82, 0x46, 0x3c, 0xb3, 0xe7, 0xeb, 0xd6, 0xb8, 0x7f, 0x48, 0x3c, 0x40, 0x81, + 0xa1, 0x09, 0x28, 0x75, 0x00, 0x6f, 0x42, 0x23, 0x44, 0xf3, 0x1d, 0xba, 0x7e, 0x49, 0xab, 0x0b, + 0xd8, 0x81, 0x83, 0xde, 0x86, 0x16, 0x95, 0x69, 0x7f, 0xe4, 0x0c, 0xfb, 0xa4, 0x5a, 0xe7, 0xf1, + 0xa8, 0x61, 0x70, 0xb6, 0xc8, 0x59, 0xc5, 0xb1, 0x3c, 0xf3, 0x07, 0x98, 0x47, 0x24, 0x81, 0xb5, + 0x6f, 0xfe, 0x00, 0x93, 0x74, 0xa0, 0x49, 0xc2, 0xeb, 0xae, 0x63, 0xe0, 0x83, 0x39, 0x93, 0x91, + 0x1c, 0x6d, 0xdd, 0xcb, 0x50, 0x13, 0x3b, 0xe0, 0x5b, 0x0a, 0x01, 0xe8, 0x21, 0xb4, 0x82, 0xb4, + 0xb9, 0xcf, 0xaa, 0xc9, 0x52, 0x66, 0x72, 0x18, 0x09, 0x90, 0x9e, 0xd6, 0x0c, 0xa6, 0xd1, 0xa1, + 0xfa, 0x10, 0x1a, 0xd1, 0x9f, 0xc9, 0xaa, 0xfb, 0x49, 0x45, 0x11, 0x00, 0xa2, 0x8d, 0xbb, 0x13, + 0x8b, 0x9c, 0x29, 0x77, 0x2c, 0xc1, 0x50, 0xfd, 0x91, 0x02, 0x4d, 0x1e, 0xd5, 0xf7, 0xc5, 0x05, + 0x08, 0xdd, 0x9a, 0x42, 0xb7, 0x46, 0xff, 0x46, 0xbf, 0x1c, 0xef, 0x59, 0xbe, 0x2d, 0x75, 0x02, + 0x94, 0x08, 0x4d, 0xa0, 0x63, 0x21, 0x3d, 0x4f, 0xff, 0xe2, 0x2b, 0xa2, 0x68, 0xfc, 0x68, 0xa8, + 0xa2, 0x75, 0x60, 0x49, 0x37, 0x0c, 0x17, 0x7b, 0x1e, 0xe7, 0x23, 0x18, 0x92, 0x5f, 0x9e, 0x63, + 0xd7, 0x0b, 0x54, 0xbe, 0xa8, 0x05, 0x43, 0xf4, 0x4d, 0xa8, 0x8a, 0x8c, 0xbb, 0x28, 0xcb, 0xb2, + 0xa2, 0x7c, 0xf2, 0x6a, 0x5b, 0xcc, 0x50, 0xff, 0xa6, 0x00, 0x2d, 0x2e, 0xb0, 0x0d, 0x1e, 0x76, + 0xa7, 0x1b, 0xdf, 0x06, 0x34, 0x0e, 0x43, 0xdb, 0x9f, 0xd6, 0x57, 0x8b, 0xba, 0x88, 0xd8, 0x9c, + 0x59, 0x06, 0x18, 0x0f, 0xfc, 0xa5, 0x85, 0x02, 0x7f, 0xf9, 0xac, 0x1e, 0x2c, 0x9d, 0x0a, 0x56, + 0x24, 0xa9, 0xa0, 0xfa, 0x6b, 0x50, 0x8f, 0x10, 0xa0, 0x1e, 0x9a, 0x35, 0xe4, 0xb8, 0xc4, 0x82, + 0x21, 0xfa, 0x28, 0x4c, 0x7f, 0x98, 0xa8, 0x2e, 0x4a, 0x78, 0x49, 0x64, 0x3e, 0xea, 0x3f, 0x2a, + 0x50, 0xe1, 0x94, 0xaf, 0x41, 0x9d, 0x3b, 0x1d, 0x9a, 0x1a, 0x32, 0xea, 0xc0, 0x41, 0x24, 0x37, + 0x7c, 0x79, 0x5e, 0xe7, 0x22, 0x54, 0x13, 0xfe, 0x66, 0x89, 0x87, 0x85, 0xe0, 0xa7, 0x88, 0x93, + 0x21, 0x3f, 0x11, 0xff, 0x82, 0x2e, 0x40, 0x79, 0xe4, 0x0c, 0xc5, 0x05, 0x17, 0x1b, 0x90, 0x4a, + 0x6e, 0x6d, 0x0b, 0xfb, 0x1a, 0x1e, 0x38, 0xcf, 0xb1, 0x7b, 0xba, 0x78, 0x23, 0xf7, 0x7e, 0x44, + 0xcd, 0x73, 0x16, 0x96, 0x62, 0x02, 0xba, 0x1f, 0x1e, 0x42, 0x51, 0xd6, 0xc5, 0x8a, 0xfa, 0x1d, + 0xae, 0xa4, 0xe1, 0x61, 0xfc, 0x2e, 0x6b, 0x49, 0xc7, 0xb7, 0x32, 0x6f, 0xb6, 0xf3, 0x52, 0xea, + 0x15, 0xf5, 0x0f, 0x14, 0xb8, 0xb8, 0x85, 0xfd, 0x87, 0xf1, 0x26, 0xc5, 0xeb, 0xe6, 0xca, 0x82, + 0xae, 0x8c, 0xa9, 0x45, 0x4e, 0xbd, 0x0b, 0x55, 0xd1, 0x6e, 0x61, 0x17, 0x0b, 0x62, 0xac, 0xfe, + 0xa6, 0x02, 0x1d, 0xbe, 0x0a, 0x5d, 0x93, 0xe4, 0xe2, 0x23, 0xec, 0x63, 0xe3, 0xeb, 0x2e, 0xb8, + 0xff, 0x41, 0x81, 0x76, 0x34, 0x0e, 0x50, 0x57, 0xfe, 0x31, 0x94, 0x69, 0x5f, 0x83, 0x73, 0x30, + 0x53, 0x59, 0x19, 0x36, 0x71, 0x24, 0x34, 0xf9, 0x3b, 0x10, 0x21, 0x8b, 0x0f, 0xc3, 0x60, 0x54, + 0x3c, 0x7b, 0x30, 0xe2, 0xc1, 0xd9, 0x99, 0x10, 0xba, 0xac, 0x21, 0x18, 0x02, 0xd4, 0x5f, 0x81, + 0xd5, 0xb0, 0x8e, 0x61, 0xf3, 0xe6, 0xd5, 0x24, 0xf5, 0x3f, 0x14, 0x38, 0xbf, 0x7f, 0x6a, 0x0f, + 0x92, 0x3a, 0xb9, 0x0a, 0x95, 0xf1, 0x48, 0x0f, 0x1b, 0x8c, 0x7c, 0x44, 0x33, 0x0b, 0xb6, 0x36, + 0x36, 0x88, 0x5b, 0x62, 0x9b, 0xae, 0x0b, 0xd8, 0x81, 0x33, 0x33, 0x5a, 0xdc, 0x10, 0x85, 0x17, + 0x36, 0x98, 0x03, 0x64, 0x5d, 0x9b, 0xa6, 0x80, 0x52, 0x07, 0xf8, 0x29, 0x00, 0x8d, 0x11, 0xfd, + 0xb3, 0xc4, 0x05, 0x3a, 0x63, 0x9b, 0x78, 0x81, 0x9f, 0x15, 0xa0, 0x13, 0x91, 0xd2, 0xd7, 0x1d, + 0x32, 0x33, 0x12, 0xfd, 0xe2, 0x4b, 0x4a, 0xf4, 0x4b, 0x8b, 0x87, 0xc9, 0xb2, 0x2c, 0x4c, 0xfe, + 0x7d, 0x01, 0x5a, 0xa1, 0xd4, 0xf6, 0x46, 0xba, 0x9d, 0xa9, 0x09, 0xfb, 0x22, 0x45, 0x8c, 0xcb, + 0xe9, 0x3d, 0x99, 0xa2, 0x67, 0x1c, 0x84, 0x96, 0x20, 0x41, 0x8a, 0x6d, 0x56, 0x8b, 0xd1, 0x96, + 0x09, 0x4f, 0x4b, 0x99, 0x45, 0x99, 0x16, 0x46, 0x77, 0x00, 0x71, 0x33, 0xe8, 0x9b, 0x76, 0xdf, + 0xc3, 0x03, 0xc7, 0x36, 0x98, 0x81, 0x94, 0xb5, 0x36, 0xff, 0xa5, 0x67, 0xef, 0x33, 0x38, 0xfa, + 0x18, 0x4a, 0xfe, 0xe9, 0x98, 0x05, 0xc0, 0x96, 0x34, 0x84, 0x84, 0x7c, 0x1d, 0x9c, 0x8e, 0xb1, + 0x46, 0xd1, 0x83, 0x87, 0x2d, 0xbe, 0xab, 0x3f, 0xe7, 0xd9, 0x44, 0x49, 0x8b, 0x40, 0x88, 0xc9, + 0x07, 0x32, 0x5c, 0x62, 0x51, 0x97, 0x0f, 0xd5, 0xbf, 0x2d, 0x40, 0x3b, 0x24, 0xa9, 0x61, 0x6f, + 0x32, 0xca, 0xb6, 0xa4, 0xe9, 0x75, 0xf4, 0x2c, 0x23, 0xfa, 0x16, 0xd4, 0xf9, 0x79, 0x9e, 0x41, + 0x1f, 0x80, 0x4d, 0xd9, 0x9e, 0xa2, 0xa0, 0xe5, 0x97, 0xa4, 0xa0, 0x95, 0x33, 0x2a, 0xa8, 0xfa, + 0x53, 0x05, 0xde, 0x48, 0x79, 0xb5, 0xa9, 0x02, 0x9c, 0x9e, 0xed, 0x73, 0x6f, 0x97, 0x24, 0xc9, + 0x1d, 0xec, 0x7d, 0xa8, 0xb8, 0x94, 0x3a, 0xbf, 0xf8, 0x78, 0x6b, 0xaa, 0x72, 0x30, 0x46, 0x34, + 0x3e, 0x45, 0xfd, 0x7d, 0x05, 0xd6, 0xd2, 0xac, 0x2e, 0x10, 0x35, 0x37, 0x60, 0x89, 0x91, 0x0e, + 0x6c, 0xe8, 0xd6, 0x74, 0x1b, 0x0a, 0x85, 0xa3, 0x05, 0x13, 0xd5, 0x7d, 0x58, 0x0d, 0x82, 0x6b, + 0x28, 0xe0, 0x1d, 0xec, 0xeb, 0x53, 0x72, 0xdd, 0x6b, 0x50, 0x67, 0x49, 0x13, 0xcb, 0x21, 0x59, + 0x95, 0x08, 0x4f, 0x45, 0x73, 0x45, 0xfd, 0x73, 0x05, 0x2e, 0xd0, 0xe8, 0x94, 0xbc, 0x69, 0xc8, + 0x73, 0x0b, 0xa5, 0x8a, 0x22, 0x94, 0x14, 0x9c, 0x6c, 0x6b, 0x35, 0x2d, 0x06, 0x93, 0x75, 0x9e, + 0x8b, 0x73, 0x76, 0x9e, 0xb7, 0xe1, 0x8d, 0x04, 0xab, 0x0b, 0x1c, 0x09, 0xd9, 0xf9, 0xea, 0x7e, + 0xfc, 0xf9, 0xc7, 0xfc, 0xe9, 0xda, 0x15, 0x71, 0x47, 0xd1, 0x37, 0x8d, 0xa4, 0xad, 0x1b, 0xe8, + 0x33, 0xa8, 0xd9, 0xf8, 0xa4, 0x1f, 0xcd, 0x16, 0x72, 0xb4, 0xa2, 0xab, 0x36, 0x3e, 0xa1, 0x7f, + 0xa9, 0xbb, 0xb0, 0x96, 0x62, 0x75, 0x91, 0xbd, 0xff, 0x9d, 0x02, 0x17, 0x37, 0x5d, 0x67, 0xfc, + 0xa5, 0xe9, 0xfa, 0x13, 0x7d, 0x14, 0xbf, 0xd1, 0x7d, 0x35, 0xdd, 0x88, 0x47, 0x91, 0xbc, 0x91, + 0x29, 0xc0, 0x1d, 0x89, 0x09, 0xa4, 0x99, 0xe2, 0x9b, 0x8e, 0x64, 0x99, 0xff, 0x5d, 0x94, 0x31, + 0xcf, 0xf1, 0x66, 0x04, 0xfe, 0x3c, 0x69, 0xb5, 0xb4, 0x79, 0x59, 0x9c, 0xb7, 0x79, 0x99, 0xe1, + 0x85, 0x4b, 0x2f, 0xc9, 0x0b, 0x9f, 0xb9, 0x9a, 0x7e, 0x04, 0xf1, 0xc6, 0x32, 0x0d, 0x7f, 0x73, + 0x75, 0xa4, 0x37, 0x00, 0xc2, 0x26, 0x2b, 0x7f, 0xbd, 0x97, 0x87, 0x4c, 0x64, 0x16, 0x39, 0x2d, + 0x11, 0xf1, 0xe8, 0xfd, 0x49, 0xac, 0xed, 0xf7, 0x1d, 0xe8, 0xca, 0xb4, 0x74, 0x11, 0xcd, 0xff, + 0x59, 0x01, 0xa0, 0x27, 0x1e, 0x7c, 0xce, 0xe7, 0xcc, 0xdf, 0x82, 0x66, 0xa8, 0x30, 0xa1, 0xbd, + 0x47, 0xb5, 0xc8, 0x20, 0x26, 0x21, 0x2a, 0x31, 0x82, 0x93, 0xaa, 0xce, 0x0c, 0x4a, 0x27, 0x62, + 0x35, 0x4c, 0x29, 0x92, 0xfe, 0xf3, 0x12, 0xd4, 0x5c, 0xe7, 0xa4, 0x4f, 0xcc, 0xcc, 0x08, 0x5e, + 0xb4, 0xba, 0xce, 0x09, 0x31, 0x3e, 0x03, 0xad, 0xc1, 0x92, 0xaf, 0x7b, 0xc7, 0x84, 0x7e, 0x25, + 0xf2, 0xa8, 0xc0, 0x40, 0x17, 0xa0, 0x7c, 0x68, 0x8e, 0x30, 0xbb, 0xc3, 0xae, 0x69, 0x6c, 0x80, + 0xbe, 0x11, 0x3c, 0xbd, 0xaa, 0xe6, 0x7e, 0x38, 0xc2, 0x5e, 0x5f, 0xfd, 0x5c, 0x81, 0xe5, 0x50, + 0x6a, 0xd4, 0x01, 0x11, 0x9f, 0x46, 0xfd, 0xd9, 0x03, 0xc7, 0x60, 0xae, 0xa2, 0x95, 0xe1, 0xd2, + 0xd9, 0x44, 0xe6, 0xb5, 0xc2, 0x29, 0xd3, 0x0a, 0x49, 0xb2, 0x2f, 0xb2, 0x69, 0xd3, 0x08, 0xee, + 0x32, 0x2b, 0xae, 0x73, 0xd2, 0x33, 0x84, 0x34, 0xd8, 0x73, 0x55, 0x56, 0x36, 0x11, 0x69, 0x3c, + 0xa0, 0x2f, 0x56, 0xdf, 0x82, 0x26, 0x76, 0x5d, 0xc7, 0xed, 0x5b, 0xd8, 0xf3, 0xf4, 0x21, 0xe6, + 0x09, 0x70, 0x83, 0x02, 0x77, 0x18, 0x4c, 0xfd, 0xa7, 0x22, 0xb4, 0xc2, 0xad, 0x04, 0x37, 0x98, + 0xa6, 0x11, 0xdc, 0x60, 0x9a, 0xe4, 0xe8, 0xc0, 0x65, 0xae, 0x50, 0x1c, 0xee, 0x46, 0xa1, 0xa3, + 0x68, 0x35, 0x0e, 0xed, 0x19, 0x24, 0xae, 0x12, 0x23, 0xb3, 0x1d, 0x03, 0x87, 0x87, 0x0b, 0x01, + 0x88, 0x9f, 0x6d, 0x4c, 0x47, 0x4a, 0x39, 0x74, 0xa4, 0x9c, 0x43, 0x47, 0x2a, 0x12, 0x1d, 0x59, + 0x85, 0xca, 0xd3, 0xc9, 0xe0, 0x18, 0xfb, 0x3c, 0x5d, 0xe5, 0xa3, 0xb8, 0xee, 0x54, 0x13, 0xba, + 0x23, 0x54, 0xa4, 0x16, 0x55, 0x91, 0x4b, 0x50, 0x63, 0x57, 0x69, 0x7d, 0xdf, 0xa3, 0x17, 0x06, + 0x45, 0xad, 0xca, 0x00, 0x07, 0x1e, 0xfa, 0x24, 0xc8, 0xc7, 0xea, 0x32, 0x63, 0xa7, 0x5e, 0x27, + 0xa1, 0x25, 0x41, 0x36, 0xf6, 0x0e, 0x2c, 0x47, 0xc4, 0x41, 0x63, 0x44, 0x83, 0xb2, 0xda, 0x0a, + 0xc1, 0x34, 0x4c, 0xdc, 0x80, 0x56, 0x28, 0x12, 0x8a, 0xd7, 0x64, 0x55, 0x8c, 0x80, 0x12, 0x34, + 0xf5, 0xfb, 0x80, 0xc2, 0x95, 0x16, 0x4b, 0xcd, 0x12, 0x47, 0x59, 0x48, 0x1e, 0xa5, 0xfa, 0x17, + 0x0a, 0xac, 0x44, 0x17, 0x9b, 0x37, 0x48, 0x7e, 0x06, 0x75, 0x76, 0xbd, 0xd2, 0x27, 0x46, 0xca, + 0x5b, 0x1a, 0x57, 0xa6, 0xca, 0x50, 0x83, 0xf0, 0x71, 0x3a, 0x51, 0x85, 0x13, 0xc7, 0x3d, 0x36, + 0xed, 0x61, 0x9f, 0x70, 0x16, 0x98, 0x46, 0x83, 0x03, 0x77, 0x09, 0x4c, 0xfd, 0xb1, 0x02, 0x57, + 0x1f, 0x8f, 0x0d, 0xdd, 0xc7, 0x91, 0x6c, 0x61, 0xd1, 0xf7, 0x6e, 0x1f, 0x07, 0x0f, 0xce, 0x0a, + 0xf9, 0xae, 0x08, 0x18, 0xb6, 0xba, 0x03, 0x17, 0x35, 0xec, 0x61, 0xdb, 0x88, 0xfd, 0x38, 0x77, + 0x23, 0x63, 0x0c, 0x5d, 0x19, 0xb9, 0x45, 0xce, 0x9e, 0xa5, 0x6d, 0x7d, 0x97, 0x90, 0xf5, 0xb9, + 0x17, 0x22, 0xd9, 0x02, 0x5d, 0xc7, 0x57, 0xff, 0xb2, 0x00, 0x6b, 0x9f, 0x1b, 0x06, 0x77, 0x60, + 0x3c, 0x11, 0x79, 0x55, 0x39, 0x62, 0x32, 0x87, 0x2a, 0xa6, 0x73, 0xa8, 0x97, 0xe5, 0x54, 0xb8, + 0x7b, 0xb5, 0x27, 0x56, 0x10, 0x36, 0x5c, 0xf6, 0xaa, 0xe1, 0x3e, 0x6f, 0xf3, 0x93, 0x92, 0x93, + 0x86, 0x8e, 0xd9, 0xa9, 0x45, 0x35, 0x68, 0xc8, 0xa8, 0x63, 0xe8, 0xa4, 0x85, 0xb5, 0xa0, 0x65, + 0x06, 0x12, 0x19, 0x3b, 0xac, 0xfb, 0xd6, 0x20, 0xd9, 0x03, 0x05, 0xed, 0x39, 0x9e, 0xfa, 0x3f, + 0x05, 0xe8, 0xec, 0xeb, 0xcf, 0xf1, 0x2f, 0xce, 0x01, 0x7d, 0x17, 0x2e, 0x78, 0xfa, 0x73, 0xdc, + 0x8f, 0x14, 0x75, 0x7d, 0x17, 0x3f, 0xe3, 0xd9, 0xd7, 0xbb, 0x32, 0xc3, 0x94, 0xbe, 0x0a, 0xd0, + 0x56, 0xbc, 0x18, 0x5c, 0xc3, 0xcf, 0xd0, 0x4d, 0x58, 0x8e, 0xbe, 0x2e, 0x21, 0xac, 0x55, 0xa9, + 0xc8, 0x9b, 0x91, 0xc7, 0x23, 0x3d, 0x43, 0x7d, 0x06, 0x97, 0x1f, 0xdb, 0x1e, 0xf6, 0x7b, 0xe1, + 0x03, 0x88, 0x05, 0xab, 0xa7, 0x6b, 0x50, 0x0f, 0x05, 0x9f, 0x7a, 0xaf, 0x6e, 0x78, 0xaa, 0x03, + 0xdd, 0x9d, 0xf0, 0x31, 0x97, 0xb7, 0xc9, 0x6e, 0xb0, 0x5f, 0xe1, 0x82, 0x87, 0xe2, 0x41, 0x87, + 0x86, 0x0f, 0xb1, 0x8b, 0xed, 0x01, 0xde, 0x76, 0x06, 0xc7, 0x91, 0x47, 0x9c, 0x4a, 0xf4, 0x11, + 0xe7, 0xbc, 0x8f, 0x42, 0x6f, 0xdf, 0x13, 0x6f, 0xa9, 0x0e, 0x4e, 0xc7, 0x18, 0x2d, 0x41, 0x71, + 0x17, 0x9f, 0xb4, 0xcf, 0x21, 0x80, 0xca, 0xae, 0xe3, 0x5a, 0xfa, 0xa8, 0xad, 0xa0, 0x3a, 0x2c, + 0xf1, 0x0e, 0x7e, 0xbb, 0x70, 0xfb, 0x8f, 0x15, 0x58, 0x49, 0x35, 0x95, 0x51, 0x0b, 0xe0, 0xb1, + 0x3d, 0xe0, 0xdd, 0xf6, 0xf6, 0x39, 0xd4, 0x80, 0x6a, 0xd0, 0x7b, 0x67, 0x04, 0x0e, 0x1c, 0x8a, + 0xdd, 0x2e, 0xa0, 0x36, 0x34, 0xd8, 0xc4, 0xc9, 0x60, 0x80, 0x3d, 0xaf, 0x5d, 0x14, 0x90, 0x87, + 0xba, 0x39, 0x9a, 0xb8, 0xb8, 0x5d, 0x42, 0x4d, 0xa8, 0x1d, 0x38, 0xfc, 0xcd, 0x6c, 0xbb, 0x8c, + 0x10, 0xb4, 0x82, 0x07, 0xb4, 0x7c, 0x52, 0x25, 0x02, 0x0b, 0xa6, 0x2d, 0xdd, 0x7e, 0x12, 0xed, + 0x2c, 0xd2, 0xfd, 0xac, 0xc1, 0xf9, 0xc7, 0xb6, 0x81, 0x0f, 0x4d, 0x1b, 0x1b, 0xe1, 0x4f, 0xed, + 0x73, 0xe8, 0x3c, 0x2c, 0xef, 0x60, 0x77, 0x88, 0x23, 0xc0, 0x02, 0x5a, 0x81, 0xe6, 0x8e, 0xf9, + 0x22, 0x02, 0x2a, 0xaa, 0xa5, 0xaa, 0xd2, 0x56, 0xd6, 0xff, 0xf3, 0x22, 0xd4, 0x36, 0x75, 0x5f, + 0x7f, 0xe0, 0x38, 0xae, 0x81, 0xc6, 0x80, 0xe8, 0x13, 0x73, 0x6b, 0xec, 0xd8, 0xe2, 0xc3, 0x0d, + 0xf4, 0x41, 0x46, 0xe5, 0x91, 0x46, 0xe5, 0x6a, 0xd3, 0xbd, 0x99, 0x31, 0x23, 0x81, 0xae, 0x9e, + 0x43, 0x16, 0x5d, 0xf1, 0xc0, 0xb4, 0xf0, 0x81, 0x39, 0x38, 0x0e, 0xde, 0x9e, 0x4d, 0x59, 0x31, + 0x81, 0x1a, 0xac, 0x98, 0xe8, 0x41, 0xf1, 0x01, 0xfb, 0x0e, 0x20, 0x70, 0x95, 0xea, 0x39, 0xf4, + 0x0c, 0x2e, 0x6c, 0xe1, 0x48, 0xe0, 0x0e, 0x16, 0x5c, 0xcf, 0x5e, 0x30, 0x85, 0x7c, 0xc6, 0x25, + 0xb7, 0xa1, 0x4c, 0x75, 0x0c, 0xc9, 0x62, 0x7b, 0xf4, 0x3b, 0xcb, 0xee, 0xf5, 0x6c, 0x04, 0x41, + 0xed, 0xfb, 0xb0, 0x9c, 0xf8, 0x3a, 0x0b, 0xc9, 0x5c, 0x93, 0xfc, 0x3b, 0xbb, 0xee, 0xed, 0x3c, + 0xa8, 0x62, 0xad, 0x21, 0xb4, 0xe2, 0xcf, 0xd3, 0x91, 0xac, 0xb5, 0x26, 0xfd, 0xb0, 0xa6, 0xfb, + 0x6e, 0x0e, 0x4c, 0xb1, 0x90, 0x05, 0xed, 0xe4, 0xd7, 0x42, 0xe8, 0xf6, 0x54, 0x02, 0x71, 0x75, + 0x7b, 0x2f, 0x17, 0xae, 0x58, 0xee, 0x94, 0x2a, 0x41, 0xea, 0x03, 0x14, 0x74, 0x57, 0x4e, 0x26, + 0xeb, 0xcb, 0x98, 0xee, 0xbd, 0xdc, 0xf8, 0x62, 0xe9, 0xdf, 0x60, 0x37, 0xc5, 0xb2, 0x8f, 0x38, + 0xd0, 0x87, 0x72, 0x72, 0x53, 0xbe, 0x3e, 0xe9, 0xae, 0x9f, 0x65, 0x8a, 0x60, 0xe2, 0x87, 0xf4, + 0x8a, 0x57, 0xf2, 0x19, 0x44, 0xd2, 0xee, 0x02, 0x7a, 0xd9, 0x5f, 0x78, 0x74, 0x3f, 0x3c, 0xc3, + 0x0c, 0xc1, 0x80, 0x93, 0xfc, 0x1c, 0x2b, 0x30, 0xc3, 0x7b, 0x33, 0xb5, 0x66, 0x3e, 0x1b, 0xfc, + 0x1e, 0x2c, 0x27, 0x82, 0x35, 0xca, 0x1f, 0xd0, 0xbb, 0xd3, 0x32, 0x2a, 0x66, 0x92, 0x89, 0x1b, + 0x73, 0x94, 0xa1, 0xfd, 0x92, 0x5b, 0xf5, 0xee, 0xed, 0x3c, 0xa8, 0x62, 0x23, 0x1e, 0x75, 0x97, + 0x89, 0x5b, 0x67, 0x74, 0x47, 0x4e, 0x43, 0x7e, 0x63, 0xde, 0x7d, 0x3f, 0x27, 0xb6, 0x58, 0xf4, + 0xd7, 0x01, 0xed, 0x1f, 0x39, 0x27, 0x0f, 0x1c, 0xfb, 0xd0, 0x1c, 0x4e, 0x5c, 0x9d, 0xbd, 0xd3, + 0xcb, 0xf2, 0xd1, 0x69, 0xd4, 0x0c, 0x5d, 0x99, 0x3a, 0x43, 0x2c, 0xde, 0x07, 0xd8, 0xc2, 0xfe, + 0x0e, 0xf6, 0x5d, 0xa2, 0xa0, 0x37, 0xa5, 0xe7, 0x1d, 0x22, 0x04, 0x4b, 0xbd, 0x33, 0x13, 0x2f, + 0x12, 0x12, 0xda, 0x3b, 0xba, 0x3d, 0xd1, 0x47, 0x91, 0xe7, 0xad, 0x77, 0xa4, 0xd3, 0x93, 0x68, + 0x19, 0x02, 0xcd, 0xc4, 0x16, 0x4b, 0x9e, 0x88, 0x30, 0x1b, 0xb9, 0x93, 0x48, 0xba, 0x9f, 0x90, + 0x67, 0xf9, 0x7d, 0x75, 0xd2, 0xfd, 0x4c, 0xc1, 0x17, 0x0b, 0x7f, 0xa5, 0xd0, 0x6f, 0xfd, 0x12, + 0x08, 0x4f, 0x4c, 0xff, 0x68, 0x6f, 0xa4, 0xdb, 0x5e, 0x1e, 0x16, 0x28, 0xe2, 0x19, 0x58, 0xe0, + 0xf8, 0x82, 0x05, 0x03, 0x9a, 0xb1, 0x9b, 0x06, 0x24, 0x7b, 0x28, 0x2a, 0xbb, 0x36, 0xe9, 0xde, + 0x9a, 0x8d, 0x28, 0x56, 0x39, 0x82, 0x66, 0xa0, 0xd2, 0x4c, 0xb8, 0xef, 0x66, 0x71, 0x1a, 0xe2, + 0x64, 0x58, 0xa4, 0x1c, 0x35, 0x6a, 0x91, 0xe9, 0x46, 0x2a, 0xca, 0xd7, 0x80, 0x9f, 0x66, 0x91, + 0xd9, 0xdd, 0x59, 0xe6, 0x72, 0x12, 0x97, 0x16, 0x72, 0x7f, 0x26, 0xbd, 0x83, 0x91, 0xba, 0x9c, + 0x8c, 0x3b, 0x10, 0xf5, 0x1c, 0x7a, 0x02, 0x15, 0xfe, 0x91, 0xff, 0xdb, 0xd3, 0x1b, 0x2a, 0x9c, + 0xfa, 0x8d, 0x19, 0x58, 0x82, 0xf0, 0x31, 0xac, 0x65, 0xb4, 0x53, 0xa4, 0xa1, 0x70, 0x7a, 0xeb, + 0x65, 0x96, 0x93, 0xd6, 0x01, 0xa5, 0xbf, 0xa4, 0x93, 0x1e, 0x53, 0xe6, 0x07, 0x77, 0x39, 0x96, + 0x48, 0x7f, 0x0c, 0x27, 0x5d, 0x22, 0xf3, 0x9b, 0xb9, 0x59, 0x4b, 0xf4, 0x61, 0x25, 0x55, 0x94, + 0xa3, 0xf7, 0x32, 0x22, 0x99, 0xac, 0x74, 0x9f, 0xb5, 0xc0, 0x10, 0xde, 0x90, 0x16, 0xa0, 0xd2, + 0xc8, 0x3c, 0xad, 0x54, 0x9d, 0xb5, 0xd0, 0x00, 0xce, 0x4b, 0xca, 0x4e, 0x24, 0xb3, 0x84, 0xec, + 0xf2, 0x74, 0xc6, 0x22, 0xeb, 0xff, 0x5a, 0x83, 0x6a, 0xf0, 0xe4, 0xf4, 0x35, 0xd4, 0x36, 0xaf, + 0xa1, 0xd8, 0xf8, 0x1e, 0x2c, 0x27, 0x3e, 0x6f, 0x93, 0x3a, 0x06, 0xf9, 0x27, 0x70, 0xb3, 0xce, + 0xec, 0x09, 0xff, 0xe7, 0x2b, 0x22, 0xef, 0x78, 0x27, 0xab, 0x60, 0x49, 0xa6, 0x1c, 0x33, 0x08, + 0xff, 0xff, 0x4e, 0x30, 0x76, 0x01, 0x22, 0xa9, 0xc5, 0xf4, 0x97, 0x34, 0x24, 0x5a, 0xce, 0x92, + 0x96, 0x25, 0xcd, 0x1e, 0xde, 0xcd, 0xf3, 0xea, 0x21, 0xdb, 0xff, 0x67, 0xe7, 0x0c, 0x8f, 0xa1, + 0x11, 0x7d, 0xe3, 0x86, 0xa4, 0xff, 0xea, 0x23, 0xfd, 0x08, 0x6e, 0xd6, 0x2e, 0x76, 0xce, 0x18, + 0x56, 0x66, 0x90, 0xf3, 0x88, 0xf3, 0x4d, 0x76, 0xb0, 0x33, 0x9c, 0x6f, 0x46, 0xdf, 0x5c, 0x1a, + 0x86, 0xb3, 0xdb, 0xe2, 0xac, 0x6e, 0x4d, 0xb6, 0x65, 0xa5, 0x75, 0x6b, 0x46, 0xa3, 0x5b, 0x5a, + 0xb7, 0x66, 0xf5, 0x79, 0xd5, 0x73, 0x1b, 0x1f, 0x7d, 0xf7, 0xc3, 0xa1, 0xe9, 0x1f, 0x4d, 0x9e, + 0x92, 0xdd, 0xdf, 0x63, 0x53, 0xdf, 0x37, 0x1d, 0xfe, 0xd7, 0xbd, 0x40, 0xdd, 0xef, 0x51, 0x6a, + 0xf7, 0x08, 0xb5, 0xf1, 0xd3, 0xa7, 0x15, 0x3a, 0xfa, 0xe8, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, + 0x51, 0x51, 0xef, 0xc9, 0x3e, 0x4a, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used.