lib/model, lib/protocol: Index sending/receiving debugging (#9657)

This adds guardrails to the index sending and receiving, to verify that
what we thinks is happening is what actually happens.
This commit is contained in:
Jakob Borg
2024-08-28 15:00:19 +02:00
committed by GitHub
parent feff334547
commit 42e677c055
6 changed files with 497 additions and 228 deletions
+16 -1
View File
@@ -20,10 +20,14 @@ type FileInfoBatch struct {
infos []protocol.FileInfo infos []protocol.FileInfo
size int size int
flushFn func([]protocol.FileInfo) error flushFn func([]protocol.FileInfo) error
error error
} }
// NewFileInfoBatch returns a new FileInfoBatch that calls fn when it's time // NewFileInfoBatch returns a new FileInfoBatch that calls fn when it's time
// to flush. // to flush. Errors from the flush function are considered non-recoverable;
// once an error is returned the flush function wil not be called again, and
// any further calls to Flush will return the same error (unless Reset is
// called).
func NewFileInfoBatch(fn func([]protocol.FileInfo) error) *FileInfoBatch { func NewFileInfoBatch(fn func([]protocol.FileInfo) error) *FileInfoBatch {
return &FileInfoBatch{flushFn: fn} return &FileInfoBatch{flushFn: fn}
} }
@@ -33,6 +37,9 @@ func (b *FileInfoBatch) SetFlushFunc(fn func([]protocol.FileInfo) error) {
} }
func (b *FileInfoBatch) Append(f protocol.FileInfo) { func (b *FileInfoBatch) Append(f protocol.FileInfo) {
if b.error != nil {
panic("bug: calling append on a failed batch")
}
if b.infos == nil { if b.infos == nil {
b.infos = make([]protocol.FileInfo, 0, MaxBatchSizeFiles) b.infos = make([]protocol.FileInfo, 0, MaxBatchSizeFiles)
} }
@@ -45,6 +52,9 @@ func (b *FileInfoBatch) Full() bool {
} }
func (b *FileInfoBatch) FlushIfFull() error { func (b *FileInfoBatch) FlushIfFull() error {
if b.error != nil {
return b.error
}
if b.Full() { if b.Full() {
return b.Flush() return b.Flush()
} }
@@ -52,10 +62,14 @@ func (b *FileInfoBatch) FlushIfFull() error {
} }
func (b *FileInfoBatch) Flush() error { func (b *FileInfoBatch) Flush() error {
if b.error != nil {
return b.error
}
if len(b.infos) == 0 { if len(b.infos) == 0 {
return nil return nil
} }
if err := b.flushFn(b.infos); err != nil { if err := b.flushFn(b.infos); err != nil {
b.error = err
return err return err
} }
b.Reset() b.Reset()
@@ -64,6 +78,7 @@ func (b *FileInfoBatch) Flush() error {
func (b *FileInfoBatch) Reset() { func (b *FileInfoBatch) Reset() {
b.infos = nil b.infos = nil
b.error = nil
b.size = 0 b.size = 0
} }
+52
View File
@@ -8,12 +8,14 @@ package db
import ( import (
"encoding/json" "encoding/json"
"errors"
"io" "io"
"os" "os"
"testing" "testing"
"github.com/syncthing/syncthing/lib/db/backend" "github.com/syncthing/syncthing/lib/db/backend"
"github.com/syncthing/syncthing/lib/events" "github.com/syncthing/syncthing/lib/events"
"github.com/syncthing/syncthing/lib/protocol"
) )
// writeJSONS serializes the database to a JSON stream that can be checked // writeJSONS serializes the database to a JSON stream that can be checked
@@ -178,3 +180,53 @@ func snapshot(t testing.TB, fset *FileSet) *Snapshot {
// defer fd.Close() // defer fd.Close()
// writeJSONS(fd, db) // writeJSONS(fd, db)
// } // }
func TestFileInfoBatchError(t *testing.T) {
// Verify behaviour of the flush function returning an error.
var errReturn error
var called int
b := NewFileInfoBatch(func([]protocol.FileInfo) error {
called += 1
return errReturn
})
// Flush should work when the flush function error is nil
b.Append(protocol.FileInfo{Name: "test"})
if err := b.Flush(); err != nil {
t.Fatalf("expected nil, got %v", err)
}
if called != 1 {
t.Fatalf("expected 1, got %d", called)
}
// Flush should fail with an error retur
errReturn = errors.New("problem")
b.Append(protocol.FileInfo{Name: "test"})
if err := b.Flush(); err != errReturn {
t.Fatalf("expected %v, got %v", errReturn, err)
}
if called != 2 {
t.Fatalf("expected 2, got %d", called)
}
// Flush function should not be called again when it's already errored,
// same error should be returned by Flush()
if err := b.Flush(); err != errReturn {
t.Fatalf("expected %v, got %v", errReturn, err)
}
if called != 2 {
t.Fatalf("expected 2, got %d", called)
}
// Reset should clear the error (and the file list)
errReturn = nil
b.Reset()
b.Append(protocol.FileInfo{Name: "test"})
if err := b.Flush(); err != nil {
t.Fatalf("expected nil, got %v", err)
}
if called != 3 {
t.Fatalf("expected 3, got %d", called)
}
}
+122 -10
View File
@@ -17,6 +17,7 @@ import (
"github.com/syncthing/syncthing/lib/events" "github.com/syncthing/syncthing/lib/events"
"github.com/syncthing/syncthing/lib/protocol" "github.com/syncthing/syncthing/lib/protocol"
"github.com/syncthing/syncthing/lib/svcutil" "github.com/syncthing/syncthing/lib/svcutil"
"github.com/syncthing/syncthing/lib/ur"
) )
type indexHandler struct { type indexHandler struct {
@@ -222,15 +223,49 @@ func (s *indexHandler) pause() {
// sendIndexTo sends file infos with a sequence number higher than prevSequence and // sendIndexTo sends file infos with a sequence number higher than prevSequence and
// returns the highest sent sequence number. // returns the highest sent sequence number.
func (s *indexHandler) sendIndexTo(ctx context.Context, fset *db.FileSet) error { func (s *indexHandler) sendIndexTo(ctx context.Context, fset *db.FileSet) error {
// Keep track of the previous sequence we sent. This is separate from
// s.prevSequence because the latter will skip over holes in the
// sequence numberings, while sentPrevSequence should always be
// precisely the highest previously sent sequence.
sentPrevSequence := s.prevSequence
initial := s.prevSequence == 0 initial := s.prevSequence == 0
batch := db.NewFileInfoBatch(nil) batch := db.NewFileInfoBatch(nil)
var batchError error
batch.SetFlushFunc(func(fs []protocol.FileInfo) error { batch.SetFlushFunc(func(fs []protocol.FileInfo) error {
if len(fs) == 0 {
// can't happen, flush is not called with an empty batch
panic("bug: flush called with empty batch (race condition?)")
}
if batchError != nil {
// can't happen, once an error is returned the index sender exits
panic(fmt.Sprintf("bug: once failed it should stay failed (%v)", batchError))
}
l.Debugf("%v: Sending %d files (<%d bytes)", s, len(fs), batch.Size()) l.Debugf("%v: Sending %d files (<%d bytes)", s, len(fs), batch.Size())
lastSequence := fs[len(fs)-1].Sequence
var err error
if initial { if initial {
initial = false initial = false
return s.conn.Index(ctx, &protocol.Index{Folder: s.folder, Files: fs}) err = s.conn.Index(ctx, &protocol.Index{
Folder: s.folder,
Files: fs,
LastSequence: lastSequence,
})
} else {
err = s.conn.IndexUpdate(ctx, &protocol.IndexUpdate{
Folder: s.folder,
Files: fs,
PrevSequence: sentPrevSequence,
LastSequence: lastSequence,
})
} }
return s.conn.IndexUpdate(ctx, &protocol.IndexUpdate{Folder: s.folder, Files: fs}) if err != nil {
batchError = err
return err
}
sentPrevSequence = lastSequence
return nil
}) })
var err error var err error
@@ -251,14 +286,19 @@ func (s *indexHandler) sendIndexTo(ctx context.Context, fset *db.FileSet) error
} }
} }
if shouldDebug() { if fi.SequenceNo() < s.prevSequence+1 {
if fi.SequenceNo() < s.prevSequence+1 { s.logSequenceAnomaly("database returned sequence lower than requested", map[string]any{
panic(fmt.Sprintln("sequence lower than requested, got:", fi.SequenceNo(), ", asked to start at:", s.prevSequence+1)) "sequence": fi.SequenceNo(),
} "start": s.prevSequence + 1,
})
} }
if f.Sequence > 0 && fi.SequenceNo() <= f.Sequence { if f.Sequence > 0 && fi.SequenceNo() <= f.Sequence {
l.Warnln("Non-increasing sequence detected: Checking and repairing the db...") s.logSequenceAnomaly("database returned non-increasing sequence", map[string]any{
"sequence": fi.SequenceNo(),
"start": s.prevSequence + 1,
"previous": f.Sequence,
})
// Abort this round of index sending - the next one will pick // Abort this round of index sending - the next one will pick
// up from the last successful one with the repeaired db. // up from the last successful one with the repeaired db.
defer func() { defer func() {
@@ -307,7 +347,7 @@ func (s *indexHandler) sendIndexTo(ctx context.Context, fset *db.FileSet) error
return nil return nil
} }
func (s *indexHandler) receive(fs []protocol.FileInfo, update bool, op string) error { func (s *indexHandler) receive(fs []protocol.FileInfo, update bool, op string, prevSequence, lastSequence int64) error {
deviceID := s.conn.DeviceID() deviceID := s.conn.DeviceID()
s.cond.L.Lock() s.cond.L.Lock()
@@ -328,12 +368,66 @@ func (s *indexHandler) receive(fs []protocol.FileInfo, update bool, op string) e
if !update { if !update {
fset.Drop(deviceID) fset.Drop(deviceID)
} }
l.Debugf("Received %d files for %s from %s, prevSeq=%d, lastSeq=%d", len(fs), s.folder, deviceID.Short(), prevSequence, lastSequence)
// Verify that the previous sequence number matches what we expected
if exp := fset.Sequence(deviceID); prevSequence > 0 && prevSequence != exp {
s.logSequenceAnomaly("index update with unexpected sequence", map[string]any{
"prevSeq": prevSequence,
"lastSeq": lastSequence,
"batch": len(fs),
"expectedPrev": exp,
})
}
for i := range fs { for i := range fs {
// Verify index in relation to the claimed sequence boundaries
if fs[i].Sequence < prevSequence {
s.logSequenceAnomaly("file with sequence before prevSequence", map[string]any{
"prevSeq": prevSequence,
"lastSeq": lastSequence,
"batch": len(fs),
"seenSeq": fs[i].Sequence,
"atIndex": i,
})
}
if lastSequence > 0 && fs[i].Sequence > lastSequence {
s.logSequenceAnomaly("file with sequence after lastSequence", map[string]any{
"prevSeq": prevSequence,
"lastSeq": lastSequence,
"batch": len(fs),
"seenSeq": fs[i].Sequence,
"atIndex": i,
})
}
if i > 0 && fs[i].Sequence <= fs[i-1].Sequence {
s.logSequenceAnomaly("index update with non-increasing sequence", map[string]any{
"prevSeq": prevSequence,
"lastSeq": lastSequence,
"batch": len(fs),
"seenSeq": fs[i].Sequence,
"atIndex": i,
"precedingSeq": fs[i-1].Sequence,
})
}
// The local attributes should never be transmitted over the wire. // The local attributes should never be transmitted over the wire.
// Make sure they look like they weren't. // Make sure they look like they weren't.
fs[i].LocalFlags = 0 fs[i].LocalFlags = 0
fs[i].VersionHash = nil fs[i].VersionHash = nil
} }
// Verify the claimed last sequence number
if lastSequence > 0 && len(fs) > 0 && lastSequence != fs[len(fs)-1].Sequence {
s.logSequenceAnomaly("index update with unexpected last sequence", map[string]any{
"prevSeq": prevSequence,
"lastSeq": lastSequence,
"batch": len(fs),
"seenSeq": fs[len(fs)-1].Sequence,
})
}
fset.Update(deviceID, fs) fset.Update(deviceID, fs)
seq := fset.Sequence(deviceID) seq := fset.Sequence(deviceID)
@@ -348,6 +442,24 @@ func (s *indexHandler) receive(fs []protocol.FileInfo, update bool, op string) e
return nil return nil
} }
var warnSequenceAnomalyOnce sync.Once
func (s *indexHandler) logSequenceAnomaly(msg string, extra map[string]any) {
warnSequenceAnomalyOnce.Do(func() {
l.Warnf("Index sequence anomaly detected (please report at https://forum.syncthing.net/t/22660): %s (%v)", msg, extra)
})
extraStrs := make(map[string]string, len(extra))
for k, v := range extra {
extraStrs[k] = fmt.Sprint(v)
}
s.evLogger.Log(events.Failure, ur.FailureData{
Description: msg,
Extra: extraStrs,
})
}
func prepareFileInfoForIndex(f protocol.FileInfo) protocol.FileInfo { func prepareFileInfoForIndex(f protocol.FileInfo) protocol.FileInfo {
// Mark the file as invalid if any of the local bad stuff flags are set. // Mark the file as invalid if any of the local bad stuff flags are set.
f.RawInvalid = f.IsInvalid() f.RawInvalid = f.IsInvalid()
@@ -534,7 +646,7 @@ func (r *indexHandlerRegistry) folderRunningLocked(folder config.FolderConfigura
} }
} }
func (r *indexHandlerRegistry) ReceiveIndex(folder string, fs []protocol.FileInfo, update bool, op string) error { func (r *indexHandlerRegistry) ReceiveIndex(folder string, fs []protocol.FileInfo, update bool, op string, prevSequence, lastSequence int64) error {
r.mut.Lock() r.mut.Lock()
defer r.mut.Unlock() defer r.mut.Unlock()
is, isOk := r.indexHandlers.Get(folder) is, isOk := r.indexHandlers.Get(folder)
@@ -542,7 +654,7 @@ func (r *indexHandlerRegistry) ReceiveIndex(folder string, fs []protocol.FileInf
l.Infof("%v for nonexistent or paused folder %q", op, folder) l.Infof("%v for nonexistent or paused folder %q", op, folder)
return fmt.Errorf("%s: %w", folder, ErrFolderMissing) return fmt.Errorf("%s: %w", folder, ErrFolderMissing)
} }
return is.receive(fs, update, op) return is.receive(fs, update, op, prevSequence, lastSequence)
} }
// makeForgetUpdate takes an index update and constructs a download progress update // makeForgetUpdate takes an index update and constructs a download progress update
+5 -4
View File
@@ -1136,16 +1136,16 @@ func (p *pager) done() bool {
// Index is called when a new device is connected and we receive their full index. // Index is called when a new device is connected and we receive their full index.
// Implements the protocol.Model interface. // Implements the protocol.Model interface.
func (m *model) Index(conn protocol.Connection, idx *protocol.Index) error { func (m *model) Index(conn protocol.Connection, idx *protocol.Index) error {
return m.handleIndex(conn, idx.Folder, idx.Files, false) return m.handleIndex(conn, idx.Folder, idx.Files, false, 0, idx.LastSequence)
} }
// IndexUpdate is called for incremental updates to connected devices' indexes. // IndexUpdate is called for incremental updates to connected devices' indexes.
// Implements the protocol.Model interface. // Implements the protocol.Model interface.
func (m *model) IndexUpdate(conn protocol.Connection, idxUp *protocol.IndexUpdate) error { func (m *model) IndexUpdate(conn protocol.Connection, idxUp *protocol.IndexUpdate) error {
return m.handleIndex(conn, idxUp.Folder, idxUp.Files, true) return m.handleIndex(conn, idxUp.Folder, idxUp.Files, true, idxUp.PrevSequence, idxUp.LastSequence)
} }
func (m *model) handleIndex(conn protocol.Connection, folder string, fs []protocol.FileInfo, update bool) error { func (m *model) handleIndex(conn protocol.Connection, folder string, fs []protocol.FileInfo, update bool, prevSequence, lastSequence int64) error {
op := "Index" op := "Index"
if update { if update {
op += " update" op += " update"
@@ -1173,7 +1173,8 @@ func (m *model) handleIndex(conn protocol.Connection, folder string, fs []protoc
l.Debugf("%v for folder (ID %q) sent from device %q: missing index handler", op, folder, deviceID) l.Debugf("%v for folder (ID %q) sent from device %q: missing index handler", op, folder, deviceID)
return fmt.Errorf("%s: %w", folder, ErrFolderNotRunning) return fmt.Errorf("%s: %w", folder, ErrFolderNotRunning)
} }
return indexHandler.ReceiveIndex(folder, fs, update, op)
return indexHandler.ReceiveIndex(folder, fs, update, op, prevSequence, lastSequence)
} }
type clusterConfigDeviceInfo struct { type clusterConfigDeviceInfo struct {
+295 -209
View File
@@ -418,8 +418,9 @@ func (m *Device) XXX_DiscardUnknown() {
var xxx_messageInfo_Device proto.InternalMessageInfo var xxx_messageInfo_Device proto.InternalMessageInfo
type Index struct { type Index struct {
Folder string `protobuf:"bytes,1,opt,name=folder,proto3" json:"folder" xml:"folder"` Folder string `protobuf:"bytes,1,opt,name=folder,proto3" json:"folder" xml:"folder"`
Files []FileInfo `protobuf:"bytes,2,rep,name=files,proto3" json:"files" xml:"file"` Files []FileInfo `protobuf:"bytes,2,rep,name=files,proto3" json:"files" xml:"file"`
LastSequence int64 `protobuf:"varint,3,opt,name=last_sequence,json=lastSequence,proto3" json:"lastSequence" xml:"lastSequence"`
} }
func (m *Index) Reset() { *m = Index{} } func (m *Index) Reset() { *m = Index{} }
@@ -456,8 +457,10 @@ func (m *Index) XXX_DiscardUnknown() {
var xxx_messageInfo_Index proto.InternalMessageInfo var xxx_messageInfo_Index proto.InternalMessageInfo
type IndexUpdate struct { type IndexUpdate struct {
Folder string `protobuf:"bytes,1,opt,name=folder,proto3" json:"folder" xml:"folder"` Folder string `protobuf:"bytes,1,opt,name=folder,proto3" json:"folder" xml:"folder"`
Files []FileInfo `protobuf:"bytes,2,rep,name=files,proto3" json:"files" xml:"file"` Files []FileInfo `protobuf:"bytes,2,rep,name=files,proto3" json:"files" xml:"file"`
LastSequence int64 `protobuf:"varint,3,opt,name=last_sequence,json=lastSequence,proto3" json:"lastSequence" xml:"lastSequence"`
PrevSequence int64 `protobuf:"varint,4,opt,name=prev_sequence,json=prevSequence,proto3" json:"prevSequence" xml:"prevSequence"`
} }
func (m *IndexUpdate) Reset() { *m = IndexUpdate{} } func (m *IndexUpdate) Reset() { *m = IndexUpdate{} }
@@ -1145,211 +1148,213 @@ func init() {
func init() { proto.RegisterFile("lib/protocol/bep.proto", fileDescriptor_311ef540e10d9705) } func init() { proto.RegisterFile("lib/protocol/bep.proto", fileDescriptor_311ef540e10d9705) }
var fileDescriptor_311ef540e10d9705 = []byte{ var fileDescriptor_311ef540e10d9705 = []byte{
// 3251 bytes of a gzipped FileDescriptorProto // 3292 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0x4b, 0x6c, 0x23, 0x47, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5a, 0x4d, 0x6c, 0x23, 0x47,
0x7a, 0x16, 0x9f, 0xa2, 0x4a, 0x8f, 0xa1, 0x6a, 0x5e, 0x34, 0x67, 0xac, 0x66, 0x6a, 0x67, 0x13, 0x76, 0x16, 0x7f, 0x45, 0x95, 0x7e, 0x86, 0xaa, 0xf9, 0xa3, 0x39, 0x63, 0x35, 0x53, 0x3b, 0x9b,
0x59, 0x9b, 0x1d, 0xaf, 0xb5, 0xde, 0x8d, 0x63, 0x3b, 0x36, 0xc4, 0x87, 0x34, 0x5c, 0x6b, 0x48, 0xc8, 0xda, 0xec, 0x78, 0xad, 0xf5, 0x6e, 0x1c, 0xdb, 0xb1, 0x21, 0xfe, 0x48, 0xc3, 0xb5, 0x86,
0xb9, 0xa8, 0x19, 0xaf, 0x07, 0x08, 0x88, 0x16, 0xbb, 0x44, 0x35, 0x86, 0xec, 0x66, 0xba, 0x9b, 0x94, 0x8b, 0x9a, 0xf1, 0x7a, 0x80, 0x80, 0x68, 0xb1, 0x4b, 0x54, 0x63, 0xc8, 0x6e, 0xa6, 0xbb,
0x7a, 0x2c, 0x72, 0x49, 0x16, 0x58, 0x2c, 0x74, 0x08, 0x82, 0x3d, 0x05, 0xc1, 0x0a, 0x59, 0xe4, 0xa9, 0x9f, 0x45, 0x2e, 0xc1, 0x02, 0x8b, 0x40, 0x87, 0x20, 0xd8, 0x53, 0x10, 0xac, 0x90, 0xc5,
0x92, 0x5b, 0x80, 0x1c, 0x72, 0xd9, 0x53, 0x8e, 0x73, 0x1c, 0x2c, 0x10, 0x20, 0xc8, 0xa1, 0x01, 0x5e, 0x72, 0x0b, 0x90, 0x43, 0x2e, 0x7b, 0xca, 0x71, 0x6e, 0x19, 0x2c, 0x10, 0x20, 0xc8, 0xa1,
0xcf, 0x5c, 0x12, 0xe6, 0xc6, 0x63, 0x0e, 0x41, 0x50, 0x7f, 0x55, 0x57, 0x57, 0xeb, 0xe1, 0x68, 0x01, 0xcf, 0x5c, 0x12, 0xe6, 0xc6, 0x63, 0x0e, 0x41, 0x50, 0xaf, 0xaa, 0xab, 0xab, 0xf5, 0xe3,
0xec, 0x43, 0x4e, 0xc3, 0xfa, 0xfe, 0xef, 0xff, 0xab, 0xba, 0xea, 0x7f, 0x55, 0x69, 0xd0, 0x9d, 0x68, 0xec, 0x5b, 0x6e, 0xac, 0xef, 0x7d, 0xef, 0x55, 0x75, 0xbd, 0x57, 0xef, 0xbd, 0x2a, 0x09,
0x81, 0xbd, 0xf7, 0xee, 0xc8, 0x73, 0x03, 0xb7, 0xe7, 0x0e, 0xde, 0xdd, 0x63, 0xa3, 0x87, 0x30, 0xdd, 0x19, 0xd8, 0x7b, 0xef, 0x8e, 0x3c, 0x37, 0x70, 0x7b, 0xee, 0xe0, 0xdd, 0x3d, 0x36, 0x7a,
0xc0, 0x85, 0x08, 0x2b, 0xcf, 0xb1, 0xe3, 0x40, 0x80, 0xe5, 0xef, 0x78, 0x6c, 0xe4, 0xfa, 0x82, 0x08, 0x03, 0x5c, 0x88, 0xb0, 0xf2, 0x1c, 0x3b, 0x0e, 0x04, 0x58, 0xfe, 0x8e, 0xc7, 0x46, 0xae,
0xbe, 0x37, 0xde, 0x7f, 0xb7, 0xef, 0xf6, 0x5d, 0x18, 0xc0, 0x2f, 0x41, 0x22, 0xff, 0x93, 0x46, 0x2f, 0xe8, 0x7b, 0xe3, 0xfd, 0x77, 0xfb, 0x6e, 0xdf, 0x85, 0x01, 0xfc, 0x12, 0x24, 0xf2, 0x3f,
0xb9, 0x47, 0x6c, 0x30, 0x70, 0x71, 0x0d, 0xcd, 0x5b, 0xec, 0xd0, 0xee, 0xb1, 0xae, 0x63, 0x0e, 0x69, 0x94, 0x7b, 0xc4, 0x06, 0x03, 0x17, 0xd7, 0xd0, 0xbc, 0xc5, 0x0e, 0xed, 0x1e, 0xeb, 0x3a,
0x59, 0x29, 0x55, 0x49, 0xad, 0xce, 0x55, 0xc9, 0x24, 0x34, 0x90, 0x80, 0x5b, 0xe6, 0x90, 0x4d, 0xe6, 0x90, 0x95, 0x52, 0x95, 0xd4, 0xea, 0x5c, 0x95, 0x4c, 0x42, 0x03, 0x09, 0xb8, 0x65, 0x0e,
0x43, 0xa3, 0x78, 0x3c, 0x1c, 0x7c, 0x48, 0x62, 0x88, 0x50, 0x4d, 0xce, 0x8d, 0xf4, 0x06, 0x36, 0xd9, 0x34, 0x34, 0x8a, 0xc7, 0xc3, 0xc1, 0x87, 0x24, 0x86, 0x08, 0xd5, 0xe4, 0xdc, 0x48, 0x6f,
0x73, 0x02, 0x61, 0x24, 0x1d, 0x1b, 0x11, 0x70, 0xc2, 0x48, 0x0c, 0x11, 0xaa, 0xc9, 0x71, 0x1b, 0x60, 0x33, 0x27, 0x10, 0x46, 0xd2, 0xb1, 0x11, 0x01, 0x27, 0x8c, 0xc4, 0x10, 0xa1, 0x9a, 0x1c,
0x2d, 0x49, 0x23, 0x87, 0xcc, 0xf3, 0x6d, 0xd7, 0x29, 0x65, 0xc0, 0xce, 0xea, 0x24, 0x34, 0x16, 0xb7, 0xd1, 0x92, 0x34, 0x72, 0xc8, 0x3c, 0xdf, 0x76, 0x9d, 0x52, 0x06, 0xec, 0xac, 0x4e, 0x42,
0x85, 0xe4, 0xa9, 0x10, 0x4c, 0x43, 0xe3, 0xa6, 0x66, 0x4a, 0xa2, 0x84, 0x26, 0x59, 0xf8, 0x19, 0x63, 0x51, 0x48, 0x9e, 0x0a, 0xc1, 0x34, 0x34, 0x6e, 0x6a, 0xa6, 0x24, 0x4a, 0x68, 0x92, 0x85,
0xba, 0xe1, 0x8c, 0x87, 0xdd, 0x9e, 0xeb, 0x38, 0xac, 0x17, 0xd8, 0xae, 0xe3, 0x97, 0xb2, 0x95, 0x9f, 0xa1, 0x1b, 0xce, 0x78, 0xd8, 0xed, 0xb9, 0x8e, 0xc3, 0x7a, 0x81, 0xed, 0x3a, 0x7e, 0x29,
0xd4, 0x6a, 0xae, 0xfa, 0xde, 0x24, 0x34, 0x96, 0x9c, 0xf1, 0xb0, 0x16, 0x4b, 0xa6, 0xa1, 0x71, 0x5b, 0x49, 0xad, 0xe6, 0xaa, 0xef, 0x4d, 0x42, 0x63, 0xc9, 0x19, 0x0f, 0x6b, 0xb1, 0x64, 0x1a,
0x0b, 0x4c, 0x26, 0x61, 0xf2, 0xdf, 0xa1, 0x91, 0xb1, 0x9d, 0x80, 0x9e, 0xa3, 0xe3, 0x4f, 0xd0, 0x1a, 0xb7, 0xc0, 0x64, 0x12, 0x26, 0xff, 0x1d, 0x1a, 0x19, 0xdb, 0x09, 0xe8, 0x39, 0x3a, 0xfe,
0x5c, 0x60, 0x0f, 0x99, 0x1f, 0x98, 0xc3, 0x51, 0x29, 0x57, 0x49, 0xad, 0x66, 0xaa, 0x95, 0x49, 0x04, 0xcd, 0x05, 0xf6, 0x90, 0xf9, 0x81, 0x39, 0x1c, 0x95, 0x72, 0x95, 0xd4, 0x6a, 0xa6, 0x5a,
0x68, 0xc4, 0xe0, 0x34, 0x34, 0x6e, 0x80, 0x41, 0x85, 0x10, 0x1a, 0x4b, 0xc9, 0x3f, 0xa5, 0x50, 0x99, 0x84, 0x46, 0x0c, 0x4e, 0x43, 0xe3, 0x06, 0x18, 0x54, 0x08, 0xa1, 0xb1, 0x94, 0xfc, 0x63,
0xfe, 0x11, 0x33, 0x2d, 0xe6, 0xe1, 0x0d, 0x94, 0x0d, 0x4e, 0x46, 0x62, 0xeb, 0x97, 0xd6, 0x6f, 0x0a, 0xe5, 0x1f, 0x31, 0xd3, 0x62, 0x1e, 0xde, 0x40, 0xd9, 0xe0, 0x64, 0x24, 0xb6, 0x7e, 0x69,
0x3f, 0x8c, 0x0e, 0xf5, 0xe1, 0x63, 0xe6, 0xfb, 0x66, 0x9f, 0xed, 0x9e, 0x8c, 0x58, 0xf5, 0xce, 0xfd, 0xf6, 0xc3, 0xc8, 0xa9, 0x0f, 0x1f, 0x33, 0xdf, 0x37, 0xfb, 0x6c, 0xf7, 0x64, 0xc4, 0xaa,
0x24, 0x34, 0x80, 0x36, 0x0d, 0x0d, 0x24, 0xec, 0x9e, 0x8c, 0x18, 0xa1, 0x80, 0x61, 0x0b, 0xcd, 0x77, 0x26, 0xa1, 0x01, 0xb4, 0x69, 0x68, 0x20, 0x61, 0xf7, 0x64, 0xc4, 0x08, 0x05, 0x0c, 0x5b,
0xf7, 0xdc, 0xe1, 0xc8, 0x63, 0x3e, 0xec, 0x5b, 0x1a, 0x2c, 0xdd, 0xbf, 0x60, 0xa9, 0x16, 0x73, 0x68, 0xbe, 0xe7, 0x0e, 0x47, 0x1e, 0xf3, 0x61, 0xdf, 0xd2, 0x60, 0xe9, 0xfe, 0x05, 0x4b, 0xb5,
0xaa, 0x0f, 0x26, 0xa1, 0xa1, 0x2b, 0x4d, 0x43, 0x63, 0x59, 0xec, 0x69, 0x8c, 0x11, 0xaa, 0x33, 0x98, 0x53, 0x7d, 0x30, 0x09, 0x0d, 0x5d, 0x69, 0x1a, 0x1a, 0xcb, 0x62, 0x4f, 0x63, 0x8c, 0x50,
0xc8, 0xaf, 0x53, 0x68, 0xb1, 0x36, 0x18, 0xfb, 0x01, 0xf3, 0x6a, 0xae, 0xb3, 0x6f, 0xf7, 0xf1, 0x9d, 0x41, 0x7e, 0x95, 0x42, 0x8b, 0xb5, 0xc1, 0xd8, 0x0f, 0x98, 0x57, 0x73, 0x9d, 0x7d, 0xbb,
0x67, 0x68, 0x76, 0xdf, 0x1d, 0x58, 0xcc, 0xf3, 0x4b, 0xa9, 0x4a, 0x66, 0x75, 0x7e, 0xbd, 0x18, 0x8f, 0x3f, 0x43, 0xb3, 0xfb, 0xee, 0xc0, 0x62, 0x9e, 0x5f, 0x4a, 0x55, 0x32, 0xab, 0xf3, 0xeb,
0xcf, 0xb9, 0x09, 0x82, 0xaa, 0xf1, 0x22, 0x34, 0x66, 0x26, 0xa1, 0x11, 0x11, 0xa7, 0xa1, 0xb1, 0xc5, 0x78, 0xce, 0x4d, 0x10, 0x54, 0x8d, 0x17, 0xa1, 0x31, 0x33, 0x09, 0x8d, 0x88, 0x38, 0x0d,
0x00, 0xf3, 0x88, 0x31, 0xa1, 0x91, 0x80, 0x6f, 0xa9, 0xcf, 0x7a, 0xae, 0x63, 0x99, 0xde, 0x09, 0x8d, 0x05, 0x98, 0x47, 0x8c, 0x09, 0x8d, 0x04, 0x7c, 0x4b, 0x7d, 0xd6, 0x73, 0x1d, 0xcb, 0xf4,
0x7c, 0x42, 0x41, 0x6c, 0xa9, 0x02, 0xd5, 0x96, 0x2a, 0x84, 0xd0, 0x58, 0x4a, 0x7e, 0x9b, 0x45, 0x4e, 0xe0, 0x13, 0x0a, 0x62, 0x4b, 0x15, 0xa8, 0xb6, 0x54, 0x21, 0x84, 0xc6, 0x52, 0xf2, 0xdb,
0x79, 0x31, 0x29, 0x7e, 0x88, 0xd2, 0xb6, 0x25, 0x7d, 0x79, 0xe5, 0x55, 0x68, 0xa4, 0x9b, 0xf5, 0x2c, 0xca, 0x8b, 0x49, 0xf1, 0x43, 0x94, 0xb6, 0x2d, 0x19, 0xcb, 0x2b, 0xaf, 0x42, 0x23, 0xdd,
0x49, 0x68, 0xa4, 0x6d, 0x6b, 0x1a, 0x1a, 0x05, 0x30, 0x61, 0x5b, 0xe4, 0x57, 0x2f, 0x1f, 0xa4, 0xac, 0x4f, 0x42, 0x23, 0x6d, 0x5b, 0xd3, 0xd0, 0x28, 0x80, 0x09, 0xdb, 0x22, 0xbf, 0x7c, 0xf9,
0x9b, 0x75, 0x9a, 0xb6, 0x2d, 0xfc, 0x10, 0xe5, 0x06, 0xe6, 0x1e, 0x1b, 0x48, 0xcf, 0x2d, 0x4d, 0x20, 0xdd, 0xac, 0xd3, 0xb4, 0x6d, 0xe1, 0x87, 0x28, 0x37, 0x30, 0xf7, 0xd8, 0x40, 0x46, 0x6e,
0x42, 0x43, 0x00, 0xd3, 0xd0, 0x98, 0x07, 0x3e, 0x8c, 0x08, 0x15, 0x28, 0xfe, 0x08, 0xcd, 0x79, 0x69, 0x12, 0x1a, 0x02, 0x98, 0x86, 0xc6, 0x3c, 0xf0, 0x61, 0x44, 0xa8, 0x40, 0xf1, 0x47, 0x68,
0xcc, 0xb4, 0xba, 0xae, 0x33, 0x38, 0x01, 0x2f, 0x2d, 0x54, 0x57, 0x26, 0xa1, 0x51, 0xe0, 0x60, 0xce, 0x63, 0xa6, 0xd5, 0x75, 0x9d, 0xc1, 0x09, 0x44, 0x69, 0xa1, 0xba, 0x32, 0x09, 0x8d, 0x02,
0xdb, 0x19, 0xf0, 0x95, 0x2e, 0x81, 0x5a, 0x04, 0x10, 0xaa, 0x64, 0xb8, 0x8b, 0xb0, 0xdd, 0x77, 0x07, 0xdb, 0xce, 0x80, 0xaf, 0x74, 0x09, 0xd4, 0x22, 0x80, 0x50, 0x25, 0xc3, 0x5d, 0x84, 0xed,
0x5c, 0x8f, 0x75, 0x47, 0xcc, 0x1b, 0xda, 0xb0, 0xb7, 0xc2, 0x33, 0x0b, 0xd5, 0x1f, 0x4c, 0x42, 0xbe, 0xe3, 0x7a, 0xac, 0x3b, 0x62, 0xde, 0xd0, 0x86, 0xbd, 0x15, 0x91, 0x59, 0xa8, 0xfe, 0x60,
0x63, 0x59, 0x48, 0x77, 0x62, 0xe1, 0x34, 0x34, 0xee, 0x8a, 0x55, 0x9f, 0x97, 0x10, 0x7a, 0x91, 0x12, 0x1a, 0xcb, 0x42, 0xba, 0x13, 0x0b, 0xa7, 0xa1, 0x71, 0x57, 0xac, 0xfa, 0xbc, 0x84, 0xd0,
0x8d, 0x3f, 0x43, 0x8b, 0x72, 0x02, 0x8b, 0x0d, 0x58, 0xc0, 0xc0, 0x3f, 0x0b, 0xd5, 0xdf, 0x9f, 0x8b, 0x6c, 0xfc, 0x19, 0x5a, 0x94, 0x13, 0x58, 0x6c, 0xc0, 0x02, 0x06, 0xf1, 0x59, 0xa8, 0xfe,
0x84, 0xc6, 0x82, 0x10, 0xd4, 0x01, 0x9f, 0x86, 0x06, 0xd6, 0xcc, 0x0a, 0x90, 0xd0, 0x04, 0x07, 0xfe, 0x24, 0x34, 0x16, 0x84, 0xa0, 0x0e, 0xf8, 0x34, 0x34, 0xb0, 0x66, 0x56, 0x80, 0x84, 0x26,
0x5b, 0xe8, 0x96, 0x65, 0xfb, 0xe6, 0xde, 0x80, 0x75, 0x03, 0x36, 0x1c, 0x75, 0x6d, 0xc7, 0x62, 0x38, 0xd8, 0x42, 0xb7, 0x2c, 0xdb, 0x37, 0xf7, 0x06, 0xac, 0x1b, 0xb0, 0xe1, 0xa8, 0x6b, 0x3b,
0xc7, 0xcc, 0x2f, 0xe5, 0xc1, 0xe6, 0xfa, 0x24, 0x34, 0xb0, 0x94, 0xef, 0xb2, 0xe1, 0xa8, 0x29, 0x16, 0x3b, 0x66, 0x7e, 0x29, 0x0f, 0x36, 0xd7, 0x27, 0xa1, 0x81, 0xa5, 0x7c, 0x97, 0x0d, 0x47,
0xa4, 0xd3, 0xd0, 0x28, 0x89, 0x84, 0x71, 0x41, 0x44, 0xe8, 0x25, 0x7c, 0xbc, 0x8e, 0xf2, 0x23, 0x4d, 0x21, 0x9d, 0x86, 0x46, 0x49, 0x24, 0x8c, 0x0b, 0x22, 0x42, 0x2f, 0xe1, 0xe3, 0x75, 0x94,
0x73, 0xec, 0x33, 0xab, 0x34, 0x0b, 0x76, 0xcb, 0x93, 0xd0, 0x90, 0x88, 0x72, 0x18, 0x31, 0x24, 0x1f, 0x99, 0x63, 0x9f, 0x59, 0xa5, 0x59, 0xb0, 0x5b, 0x9e, 0x84, 0x86, 0x44, 0x54, 0xc0, 0x88,
0x54, 0xe2, 0xdc, 0xf9, 0x44, 0x0a, 0xf2, 0x4b, 0xc5, 0xf3, 0xce, 0x57, 0x07, 0x41, 0xec, 0x7c, 0x21, 0xa1, 0x12, 0xe7, 0xc1, 0x27, 0x52, 0x90, 0x5f, 0x2a, 0x9e, 0x0f, 0xbe, 0x3a, 0x08, 0xe2,
0x92, 0xa8, 0x6c, 0x89, 0x31, 0xa1, 0x91, 0x80, 0xfc, 0x4b, 0x1e, 0xe5, 0x85, 0x12, 0xae, 0x2a, 0xe0, 0x93, 0x44, 0x65, 0x4b, 0x8c, 0x09, 0x8d, 0x04, 0xe4, 0x9f, 0xf3, 0x28, 0x2f, 0x94, 0x70,
0xe7, 0x59, 0xa8, 0xae, 0x73, 0x03, 0xff, 0x1e, 0x1a, 0x05, 0x21, 0x6b, 0xd6, 0xaf, 0x72, 0xa6, 0x55, 0x05, 0xcf, 0x42, 0x75, 0x9d, 0x1b, 0xf8, 0xf7, 0xd0, 0x28, 0x08, 0x59, 0xb3, 0x7e, 0x55,
0x5f, 0xbe, 0x7c, 0x90, 0xd2, 0x1c, 0x6a, 0x0d, 0x65, 0xb5, 0x4c, 0x08, 0xc1, 0xeb, 0x88, 0x1c, 0x30, 0xfd, 0xe5, 0xcb, 0x07, 0x29, 0x2d, 0xa0, 0xd6, 0x50, 0x56, 0xcb, 0x84, 0x70, 0x78, 0x1d,
0x28, 0x82, 0xd7, 0x81, 0xec, 0x07, 0x18, 0xfe, 0x18, 0xcd, 0x99, 0x96, 0xc5, 0x83, 0x8c, 0xf9, 0x91, 0x03, 0xc5, 0xe1, 0x75, 0x20, 0xfb, 0x01, 0x86, 0x3f, 0x46, 0x73, 0xa6, 0x65, 0xf1, 0x43,
0xa5, 0x4c, 0x25, 0xc3, 0x7d, 0x96, 0xfb, 0xbd, 0x02, 0xa7, 0xa1, 0xb1, 0x08, 0x5a, 0x12, 0x21, 0xc6, 0xfc, 0x52, 0xa6, 0x92, 0xe1, 0x31, 0xcb, 0xe3, 0x5e, 0x81, 0xd3, 0xd0, 0x58, 0x04, 0x2d,
0x34, 0x96, 0xe1, 0x3f, 0x4d, 0x86, 0x7e, 0xf6, 0x7c, 0x12, 0xf9, 0x76, 0x31, 0xcf, 0x3d, 0xbd, 0x89, 0x10, 0x1a, 0xcb, 0xf0, 0x9f, 0x26, 0x8f, 0x7e, 0xf6, 0x7c, 0x12, 0xf9, 0x76, 0x67, 0x9e,
0xc7, 0x3c, 0x99, 0xd7, 0x73, 0x22, 0xa0, 0xb8, 0xa7, 0x73, 0x50, 0x66, 0x75, 0xe1, 0xe9, 0x11, 0x47, 0x7a, 0x8f, 0x79, 0x32, 0xaf, 0xe7, 0xc4, 0x81, 0xe2, 0x91, 0xce, 0x41, 0x99, 0xd5, 0x45,
0x40, 0xa8, 0x92, 0xe1, 0x2d, 0xb4, 0x30, 0x34, 0x8f, 0xbb, 0x3e, 0xfb, 0xb3, 0x31, 0x73, 0x7a, 0xa4, 0x47, 0x00, 0xa1, 0x4a, 0x86, 0xb7, 0xd0, 0xc2, 0xd0, 0x3c, 0xee, 0xfa, 0xec, 0xcf, 0xc6,
0x0c, 0x7c, 0x26, 0x23, 0x56, 0x31, 0x34, 0x8f, 0x3b, 0x12, 0x56, 0xab, 0xd0, 0x30, 0x42, 0x75, 0xcc, 0xe9, 0x31, 0x88, 0x99, 0x8c, 0x58, 0xc5, 0xd0, 0x3c, 0xee, 0x48, 0x58, 0xad, 0x42, 0xc3,
0x06, 0xae, 0x22, 0x64, 0x3b, 0x81, 0xe7, 0x5a, 0xe3, 0x1e, 0xf3, 0xa4, 0x8b, 0x40, 0x79, 0x89, 0x08, 0xd5, 0x19, 0xb8, 0x8a, 0x90, 0xed, 0x04, 0x9e, 0x6b, 0x8d, 0x7b, 0xcc, 0x93, 0x21, 0x02,
0x51, 0x55, 0x5e, 0x62, 0x88, 0x50, 0x4d, 0x8e, 0xfb, 0xa8, 0x00, 0xbe, 0xdb, 0xb5, 0xad, 0x52, 0xe5, 0x25, 0x46, 0x55, 0x79, 0x89, 0x21, 0x42, 0x35, 0x39, 0xee, 0xa3, 0x02, 0xc4, 0x6e, 0xd7,
0xa1, 0x92, 0x5a, 0xcd, 0x56, 0xb7, 0xe5, 0xe1, 0xce, 0x82, 0x17, 0xc2, 0xd9, 0x46, 0x3f, 0xb9, 0xb6, 0x4a, 0x85, 0x4a, 0x6a, 0x35, 0x5b, 0xdd, 0x96, 0xce, 0x9d, 0x85, 0x28, 0x04, 0xdf, 0x46,
0xcf, 0x00, 0xbb, 0x69, 0xa9, 0xdd, 0x97, 0x63, 0x9e, 0x37, 0x22, 0xda, 0xdf, 0xc6, 0x3f, 0x69, 0x3f, 0x79, 0xcc, 0x00, 0xbb, 0x69, 0xa9, 0xdd, 0x97, 0x63, 0x9e, 0x37, 0x22, 0xda, 0xdf, 0xc6,
0xc4, 0xc7, 0x7f, 0x8e, 0xca, 0xfe, 0x73, 0x9b, 0x47, 0x8a, 0x98, 0x9b, 0x17, 0x8c, 0xae, 0xc7, 0x3f, 0x69, 0xc4, 0xc7, 0x7f, 0x8e, 0xca, 0xfe, 0x73, 0x9b, 0x9f, 0x14, 0x31, 0x37, 0x2f, 0x18,
0x86, 0xee, 0xa1, 0x39, 0xf0, 0x4b, 0x73, 0xb0, 0xf8, 0x4f, 0x26, 0xa1, 0x51, 0xe2, 0xac, 0xa6, 0x5d, 0x8f, 0x0d, 0xdd, 0x43, 0x73, 0xe0, 0x97, 0xe6, 0x60, 0xf1, 0x9f, 0x4c, 0x42, 0xa3, 0xc4,
0x46, 0xa2, 0x92, 0x33, 0x0d, 0x8d, 0x15, 0x91, 0xe7, 0xae, 0x20, 0x10, 0x7a, 0xa5, 0x2e, 0x3e, 0x59, 0x4d, 0x8d, 0x44, 0x25, 0x67, 0x1a, 0x1a, 0x2b, 0x22, 0xcf, 0x5d, 0x41, 0x20, 0xf4, 0x4a,
0x46, 0x6f, 0x31, 0xa7, 0xe7, 0x9d, 0x8c, 0x60, 0xda, 0x91, 0xe9, 0xfb, 0x47, 0xae, 0x67, 0x75, 0x5d, 0x7c, 0x8c, 0xde, 0x62, 0x4e, 0xcf, 0x3b, 0x19, 0xc1, 0xb4, 0x23, 0xd3, 0xf7, 0x8f, 0x5c,
0x03, 0xf7, 0x39, 0x73, 0x4a, 0x08, 0x9c, 0xfa, 0xe3, 0x49, 0x68, 0xdc, 0x8d, 0x49, 0x3b, 0x92, 0xcf, 0xea, 0x06, 0xee, 0x73, 0xe6, 0x94, 0x10, 0x04, 0xf5, 0xc7, 0x93, 0xd0, 0xb8, 0x1b, 0x93,
0xb3, 0xcb, 0x29, 0xd3, 0xd0, 0x78, 0x1b, 0xe6, 0xbe, 0x42, 0x4e, 0xe8, 0x55, 0x9a, 0xe4, 0x2f, 0x76, 0x24, 0x67, 0x97, 0x53, 0xa6, 0xa1, 0xf1, 0x36, 0xcc, 0x7d, 0x85, 0x9c, 0xd0, 0xab, 0x34,
0x53, 0x28, 0x07, 0x9b, 0xc1, 0xa3, 0x59, 0x24, 0x75, 0x99, 0x82, 0x21, 0x9a, 0x05, 0x72, 0x21, 0xc9, 0xbf, 0xa4, 0x50, 0x0e, 0x36, 0x83, 0x9f, 0x66, 0x91, 0xd4, 0x65, 0x0a, 0x86, 0xd3, 0x2c,
0xfd, 0x4b, 0x1c, 0x37, 0x50, 0x6e, 0xdf, 0x1e, 0x30, 0xbf, 0x94, 0x86, 0x58, 0xc6, 0x5a, 0x21, 0x90, 0x0b, 0xe9, 0x5f, 0xe2, 0xb8, 0x81, 0x72, 0xfb, 0xf6, 0x80, 0xf9, 0xa5, 0x34, 0x9c, 0x65,
0xb1, 0x07, 0xac, 0xe9, 0xec, 0xbb, 0xd5, 0x7b, 0x32, 0x9a, 0x05, 0x51, 0xc5, 0x12, 0x1f, 0x11, 0xac, 0x15, 0x12, 0x7b, 0xc0, 0x9a, 0xce, 0xbe, 0x5b, 0xbd, 0x27, 0x4f, 0xb3, 0x20, 0xaa, 0xb3,
0x2a, 0x40, 0xf2, 0xcb, 0x14, 0x9a, 0x87, 0x45, 0x3c, 0x19, 0x59, 0x66, 0xc0, 0xfe, 0x3f, 0x97, 0xc4, 0x47, 0x84, 0x0a, 0x90, 0xe7, 0xbe, 0x81, 0xe9, 0x07, 0x71, 0xcc, 0x65, 0x20, 0xe6, 0x20,
0xf2, 0x8b, 0x45, 0x54, 0x88, 0x14, 0x54, 0x42, 0x48, 0x5d, 0x23, 0x21, 0xac, 0xa1, 0xac, 0x6f, 0xf7, 0x71, 0x81, 0x16, 0x74, 0x58, 0x26, 0xf6, 0x18, 0x24, 0x34, 0xc1, 0x21, 0xbf, 0x49, 0xa3,
0xff, 0x8c, 0x41, 0x61, 0xc9, 0x08, 0x2e, 0x1f, 0x2b, 0x2e, 0x1f, 0x10, 0x0a, 0x18, 0xfe, 0x14, 0x79, 0xf8, 0xa2, 0x27, 0x23, 0xcb, 0x0c, 0xd8, 0xff, 0x97, 0xef, 0xe2, 0xc6, 0x46, 0x1e, 0x3b,
0xa1, 0xa1, 0x6b, 0xd9, 0xfb, 0x36, 0xb3, 0xba, 0xbe, 0xde, 0x88, 0x44, 0x68, 0x47, 0x55, 0x4d, 0x8c, 0x8d, 0x65, 0x63, 0x63, 0x5c, 0x70, 0xc1, 0x98, 0x0e, 0x12, 0x9a, 0xe0, 0x90, 0x5f, 0x2c,
0x85, 0x10, 0x1a, 0x4b, 0x79, 0xfe, 0x50, 0x06, 0xf6, 0x4e, 0x4a, 0x0b, 0x10, 0x19, 0x1f, 0x47, 0xa2, 0x42, 0xf4, 0x29, 0x2a, 0xef, 0xa5, 0xae, 0x91, 0xf7, 0xd6, 0x50, 0xd6, 0xb7, 0x7f, 0x16,
0x91, 0xd1, 0x39, 0x70, 0xbd, 0x00, 0xc2, 0x41, 0x4d, 0x53, 0x3d, 0x51, 0xa1, 0x16, 0x43, 0x84, 0x7d, 0x09, 0x70, 0xf9, 0x58, 0x71, 0xf9, 0x80, 0x50, 0xc0, 0xf0, 0xa7, 0x08, 0x0d, 0x5d, 0xcb,
0x47, 0x82, 0x24, 0x53, 0x8d, 0x8a, 0xb7, 0xd1, 0x6c, 0xd4, 0xcd, 0x71, 0xcf, 0x4f, 0x24, 0xe9, 0xde, 0xb7, 0x99, 0xd5, 0xf5, 0xf5, 0x7e, 0x2b, 0x42, 0x3b, 0xaa, 0x39, 0x50, 0x08, 0xa1, 0xb1,
0xa7, 0xac, 0x17, 0xb8, 0x5e, 0xb5, 0x12, 0x25, 0xe9, 0x43, 0xd5, 0xdd, 0x89, 0x80, 0x3b, 0x8c, 0x94, 0xa7, 0x49, 0x65, 0x60, 0xef, 0xa4, 0xb4, 0x00, 0x09, 0xe0, 0xe3, 0x28, 0x01, 0x74, 0x0e,
0xfa, 0xba, 0x48, 0x82, 0x3f, 0x44, 0x05, 0x95, 0x4c, 0x10, 0x7c, 0x2b, 0x24, 0x23, 0x3f, 0xce, 0x5c, 0x2f, 0x80, 0x53, 0xaf, 0xa6, 0xa9, 0x9e, 0xa8, 0x8c, 0x12, 0x43, 0x84, 0x1f, 0x78, 0x49,
0x24, 0x4b, 0xb2, 0x41, 0x88, 0xd2, 0x88, 0x92, 0xe1, 0x9f, 0xa0, 0xfc, 0xde, 0xc0, 0xed, 0x3d, 0xa6, 0x1a, 0x15, 0x6f, 0xa3, 0xd9, 0xa8, 0x69, 0xe5, 0x07, 0x3c, 0x51, 0x8b, 0x9e, 0xb2, 0x5e,
0x8f, 0xaa, 0xc5, 0xcd, 0x78, 0x21, 0x55, 0x8e, 0xc3, 0xb9, 0xbe, 0x2d, 0xd7, 0x22, 0xa9, 0xaa, 0xe0, 0x7a, 0xd5, 0x4a, 0x54, 0x8b, 0x0e, 0x55, 0x13, 0x2b, 0xf2, 0xca, 0x61, 0xd4, 0xbe, 0x46,
0xfc, 0xc3, 0x90, 0x50, 0x09, 0xf3, 0x56, 0xd5, 0x3f, 0x19, 0x0e, 0x6c, 0xe7, 0x79, 0x37, 0x30, 0x12, 0xfc, 0x21, 0x2a, 0x28, 0xd7, 0x20, 0xf8, 0x56, 0xc8, 0xb9, 0x7e, 0xec, 0x96, 0x25, 0xd9,
0xbd, 0x3e, 0x0b, 0x4a, 0xcb, 0x71, 0xab, 0x2a, 0x25, 0xbb, 0x20, 0x50, 0xad, 0x6a, 0x02, 0x25, 0x07, 0x45, 0x2e, 0x51, 0x32, 0xfc, 0x13, 0x94, 0xdf, 0x1b, 0xb8, 0xbd, 0xe7, 0x51, 0x51, 0xbc,
0x34, 0xc9, 0xe2, 0x0d, 0xb4, 0x30, 0xdd, 0x3d, 0x30, 0xfd, 0x83, 0x12, 0x86, 0x38, 0x85, 0x0c, 0x19, 0x2f, 0xa4, 0xca, 0x71, 0x88, 0xb8, 0xb7, 0xe5, 0x5a, 0x24, 0x55, 0x75, 0x39, 0x30, 0x24,
0x27, 0xe0, 0x47, 0xa6, 0x7f, 0xa0, 0xb6, 0x3d, 0x86, 0x08, 0xd5, 0xe4, 0xbc, 0x81, 0x92, 0xb1, 0x54, 0xc2, 0xbc, 0x23, 0xf7, 0x4f, 0x86, 0x03, 0xdb, 0x79, 0xde, 0x0d, 0x4c, 0xaf, 0xcf, 0x82,
0xc9, 0xac, 0xd2, 0x4d, 0x30, 0x01, 0xae, 0xa0, 0x40, 0xe5, 0x0a, 0x0a, 0x21, 0x34, 0x96, 0xe2, 0xd2, 0x72, 0xdc, 0x91, 0x4b, 0xc9, 0x2e, 0x08, 0x54, 0x47, 0x9e, 0x40, 0x09, 0x4d, 0xb2, 0xf8,
0xaa, 0x6c, 0x44, 0x45, 0xfb, 0x78, 0xe7, 0xa2, 0xdb, 0x5f, 0xa3, 0x13, 0xdd, 0x44, 0xf3, 0xe7, 0x3d, 0x41, 0x98, 0xee, 0x1e, 0x98, 0xfe, 0x41, 0x09, 0x43, 0x3a, 0x82, 0x44, 0x2e, 0xe0, 0x47,
0xbb, 0x9a, 0x45, 0x91, 0xf1, 0x47, 0x89, 0x7e, 0x46, 0x64, 0xfc, 0x91, 0xde, 0xc9, 0xe8, 0x0c, 0xa6, 0x7f, 0xa0, 0xb6, 0x3d, 0x86, 0x08, 0xd5, 0xe4, 0xbc, 0x4f, 0x94, 0x29, 0x88, 0x59, 0xa5,
0xfc, 0x13, 0xcd, 0x2d, 0x1d, 0xbf, 0x34, 0x0f, 0x7d, 0xfb, 0x3b, 0xba, 0x1f, 0xb6, 0xfc, 0x0b, 0x9b, 0x60, 0x02, 0x42, 0x41, 0x81, 0x2a, 0x14, 0x14, 0x42, 0x68, 0x2c, 0xc5, 0x55, 0xd9, 0x6f,
0x7e, 0xd8, 0x8a, 0xfb, 0x75, 0x8d, 0x86, 0xf7, 0x91, 0xd8, 0xa5, 0x2e, 0x44, 0xd5, 0x22, 0x98, 0x8b, 0x2e, 0xf9, 0xce, 0xc5, 0x03, 0x79, 0x8d, 0x86, 0x7b, 0x13, 0xcd, 0x9f, 0x6f, 0xde, 0x16,
0xda, 0x7a, 0x15, 0x1a, 0x0b, 0xd4, 0x3c, 0x82, 0xa3, 0xef, 0xd8, 0x3f, 0x63, 0x7c, 0xa3, 0xf6, 0x45, 0x61, 0x1b, 0x25, 0xda, 0x36, 0x51, 0xd8, 0x46, 0x7a, 0xc3, 0xa6, 0x33, 0xf0, 0x4f, 0xb4,
0xa2, 0x81, 0xda, 0x28, 0x85, 0x44, 0x86, 0x7f, 0xf5, 0xf2, 0x41, 0x42, 0x8d, 0xc6, 0x4a, 0xf8, 0xb0, 0x74, 0xfc, 0xd2, 0x3c, 0x5c, 0x4f, 0xde, 0xd1, 0xe3, 0xb0, 0xe5, 0x5f, 0x88, 0xc3, 0x56,
0x29, 0x2a, 0x8c, 0x06, 0x66, 0xb0, 0xef, 0x7a, 0xc3, 0xd2, 0x12, 0x38, 0xbb, 0xb6, 0x87, 0x3b, 0x7c, 0x2d, 0xd1, 0x68, 0x78, 0x1f, 0x89, 0x5d, 0xea, 0xc2, 0xa9, 0x5a, 0x04, 0x53, 0x5b, 0xaf,
0x52, 0x52, 0x37, 0x03, 0xb3, 0x4a, 0xa4, 0x9b, 0x29, 0xbe, 0xf2, 0xdc, 0x08, 0x20, 0x54, 0xc9, 0x42, 0x63, 0x81, 0x9a, 0x47, 0xe0, 0xfa, 0x8e, 0xfd, 0x33, 0xc6, 0x37, 0x6a, 0x2f, 0x1a, 0xa8,
0x70, 0x1d, 0xcd, 0x0f, 0xdc, 0x9e, 0x39, 0xe8, 0xee, 0x0f, 0xcc, 0xbe, 0x5f, 0xfa, 0x8f, 0x59, 0x8d, 0x52, 0x48, 0x64, 0xf8, 0x97, 0x2f, 0x1f, 0x24, 0xd4, 0x68, 0xac, 0x84, 0x9f, 0xa2, 0xc2,
0xd8, 0x54, 0xf0, 0x0e, 0xc0, 0x37, 0x39, 0xac, 0x36, 0x23, 0x86, 0x08, 0xd5, 0xe4, 0xf8, 0x11, 0x68, 0x60, 0x06, 0xfb, 0xae, 0x37, 0x2c, 0x2d, 0x41, 0xb0, 0x6b, 0x7b, 0xb8, 0x23, 0x25, 0x75,
0x5a, 0x90, 0x61, 0x24, 0x7c, 0xec, 0x3f, 0x67, 0xc1, 0x43, 0xe0, 0x6c, 0xa4, 0x40, 0x7a, 0xd9, 0x33, 0x30, 0xab, 0x44, 0x86, 0x99, 0xe2, 0xab, 0xc8, 0x8d, 0x00, 0x42, 0x95, 0x0c, 0xd7, 0xd1,
0xb2, 0x1e, 0x7d, 0xc2, 0xcd, 0x74, 0x06, 0xfe, 0x1c, 0xdd, 0xb0, 0x1d, 0xd7, 0x62, 0xdd, 0xde, 0xfc, 0xc0, 0xed, 0x99, 0x83, 0xee, 0xfe, 0xc0, 0xec, 0xfb, 0xa5, 0xff, 0x98, 0x85, 0x4d, 0x85,
0x81, 0xe9, 0xf4, 0x19, 0x3f, 0x9f, 0xc9, 0x2c, 0x44, 0x23, 0xf8, 0x3f, 0xc8, 0x6a, 0x20, 0x82, 0xe8, 0x00, 0x7c, 0x93, 0xc3, 0x6a, 0x33, 0x62, 0x88, 0x50, 0x4d, 0x8e, 0x1f, 0xa1, 0x05, 0x79,
0x33, 0xba, 0x29, 0xab, 0xa7, 0x86, 0x12, 0x9a, 0x64, 0xe1, 0x63, 0xa4, 0x95, 0x95, 0x6e, 0xe0, 0x8c, 0x44, 0x8c, 0xfd, 0xe7, 0x2c, 0x44, 0x08, 0xf8, 0x46, 0x0a, 0x64, 0x94, 0x2d, 0xeb, 0xa7,
0x99, 0xf6, 0x80, 0x79, 0xe2, 0xbc, 0xfe, 0x6b, 0x16, 0x0e, 0xec, 0xd3, 0x49, 0x68, 0xdc, 0x8e, 0x4f, 0x84, 0x99, 0xce, 0xc0, 0x9f, 0xa3, 0x1b, 0xb6, 0xe3, 0x5a, 0xac, 0xdb, 0x3b, 0x30, 0x9d,
0x39, 0xbb, 0x82, 0x22, 0x0f, 0xeb, 0xde, 0xb9, 0x92, 0xa5, 0x49, 0x95, 0x47, 0x5c, 0xae, 0x8c, 0x3e, 0xe3, 0xfe, 0x99, 0xcc, 0xc2, 0x69, 0x84, 0xf8, 0x07, 0x59, 0x0d, 0x44, 0xe0, 0xa3, 0x9b,
0x7f, 0xcc, 0xbb, 0x48, 0xde, 0xe9, 0x5a, 0xb2, 0xa5, 0xbd, 0x2f, 0xfa, 0x45, 0x80, 0x54, 0x2a, 0xb2, 0x49, 0xd0, 0x50, 0x42, 0x93, 0x2c, 0x7c, 0x8c, 0xb4, 0xea, 0xd9, 0x0d, 0x3c, 0xd3, 0x1e,
0x92, 0x63, 0x68, 0x18, 0xe1, 0x17, 0xa6, 0x68, 0xd6, 0x76, 0x0e, 0xcd, 0x81, 0x1d, 0xb5, 0xac, 0x30, 0x4f, 0xf8, 0xeb, 0xbf, 0x66, 0xc1, 0x61, 0x9f, 0x4e, 0x42, 0xe3, 0x76, 0xcc, 0xd9, 0x15,
0x1f, 0xbc, 0x0a, 0x0d, 0x44, 0xcd, 0xa3, 0xa6, 0x40, 0x45, 0x07, 0x01, 0x3f, 0xb5, 0x0e, 0x02, 0x14, 0xe9, 0xac, 0x7b, 0xe7, 0x2a, 0xb3, 0x26, 0x55, 0x11, 0x71, 0xb9, 0x32, 0xfe, 0x31, 0x6f,
0xc6, 0xbc, 0x83, 0xd0, 0x98, 0x34, 0xe2, 0xf1, 0xb4, 0xe2, 0xb8, 0x89, 0x5b, 0x41, 0x01, 0x4c, 0x96, 0x79, 0x43, 0x6f, 0xc9, 0xce, 0xfd, 0xbe, 0x68, 0x8b, 0x01, 0x52, 0xa9, 0x48, 0x8e, 0xa1,
0xc3, 0xb6, 0x3a, 0x6e, 0xf2, 0x46, 0x20, 0xb6, 0x35, 0x81, 0x12, 0x9a, 0x64, 0x7d, 0x98, 0xfd, 0x2f, 0x86, 0x5f, 0x98, 0xa2, 0x59, 0xdb, 0x39, 0x34, 0x07, 0x76, 0xd4, 0x99, 0x7f, 0xf0, 0x2a,
0x9b, 0xdf, 0x18, 0x33, 0xe4, 0xab, 0x14, 0x9a, 0x53, 0x29, 0x8e, 0x57, 0x17, 0x38, 0xff, 0x0c, 0x34, 0x10, 0x35, 0x8f, 0x9a, 0x02, 0x15, 0x8d, 0x12, 0xfc, 0xd4, 0x1a, 0x25, 0x18, 0xf3, 0x46,
0x1c, 0x3f, 0x44, 0xf3, 0x81, 0x38, 0x77, 0x11, 0xcd, 0x07, 0x70, 0xe0, 0x80, 0xf1, 0xea, 0xe9, 0x49, 0x63, 0xd2, 0x88, 0xc7, 0xd3, 0x8a, 0xe3, 0x26, 0x2e, 0x3f, 0x05, 0x30, 0x0d, 0xdb, 0xea,
0xee, 0xef, 0xfb, 0x2c, 0x80, 0xba, 0x95, 0x11, 0xd5, 0x53, 0x20, 0xaa, 0x7a, 0x8a, 0x21, 0xa1, 0xb8, 0xc9, 0x8b, 0x8f, 0xd8, 0xd6, 0x04, 0x4a, 0x68, 0x92, 0xf5, 0x61, 0xf6, 0x6f, 0x7e, 0x6d,
0x12, 0xc7, 0xef, 0xc9, 0xea, 0x95, 0x86, 0x63, 0x7b, 0xfb, 0xf2, 0xea, 0x15, 0x1d, 0x8a, 0x28, 0xcc, 0x90, 0xaf, 0x52, 0x68, 0x4e, 0xa5, 0x38, 0x5e, 0x5d, 0xc0, 0xff, 0x19, 0x70, 0x3f, 0x9c,
0x62, 0x1f, 0xa1, 0xb9, 0x23, 0x66, 0x3e, 0x17, 0x7e, 0x29, 0x52, 0x06, 0xe4, 0x75, 0x0e, 0x4a, 0xe6, 0x03, 0xe1, 0x77, 0x71, 0x9a, 0x0f, 0xc0, 0xe1, 0x80, 0xf1, 0xba, 0xee, 0xee, 0xef, 0xfb,
0x9f, 0x14, 0xd1, 0x11, 0x01, 0x84, 0x2a, 0x99, 0xfc, 0xc6, 0x67, 0x28, 0x2f, 0xca, 0x09, 0xde, 0x2c, 0x80, 0xba, 0x95, 0x11, 0x75, 0x5d, 0x20, 0xaa, 0xae, 0x8b, 0x21, 0xa1, 0x12, 0xc7, 0xef,
0x41, 0x85, 0x9e, 0x3b, 0x76, 0x82, 0xf8, 0x52, 0xba, 0xac, 0x77, 0xc3, 0x20, 0xa9, 0xfe, 0x5e, 0xc9, 0xea, 0x95, 0x06, 0xb7, 0xbd, 0x7d, 0x79, 0xf5, 0x8a, 0x9c, 0x22, 0x8a, 0xd8, 0x47, 0x68,
0x14, 0x80, 0x11, 0x55, 0x9d, 0x91, 0x04, 0x78, 0x1b, 0x2b, 0x45, 0xe4, 0xe7, 0x29, 0x34, 0x2b, 0xee, 0x88, 0x99, 0xcf, 0x45, 0x5c, 0x8a, 0x94, 0x01, 0x79, 0x9d, 0x83, 0x32, 0x26, 0xc5, 0xe9,
0x15, 0xf1, 0x23, 0x75, 0x39, 0xc8, 0x56, 0x3f, 0x38, 0x57, 0x25, 0xbf, 0xfe, 0xa2, 0xa9, 0x57, 0x88, 0x00, 0x42, 0x95, 0x4c, 0x7e, 0xe3, 0x33, 0x94, 0x17, 0xe5, 0x04, 0xef, 0xa0, 0x42, 0xcf,
0x48, 0x79, 0xe7, 0x3c, 0x34, 0x07, 0x63, 0xb1, 0x51, 0x59, 0x71, 0xe7, 0x04, 0x40, 0x15, 0x1d, 0x1d, 0x3b, 0x41, 0x7c, 0xf7, 0x5e, 0xd6, 0x9b, 0x7e, 0x90, 0x54, 0x7f, 0x2f, 0x3a, 0x80, 0x11,
0x18, 0x11, 0x2a, 0x50, 0xf2, 0xf3, 0x2c, 0x5a, 0xd0, 0x93, 0x08, 0x4f, 0xd7, 0x63, 0xc7, 0x3e, 0x55, 0xf9, 0x48, 0x02, 0xbc, 0x5b, 0x97, 0x22, 0xf2, 0xf3, 0x14, 0x9a, 0x95, 0x8a, 0xf8, 0x91,
0x86, 0xc5, 0x24, 0xba, 0x94, 0x27, 0x8e, 0x7d, 0x0c, 0x69, 0xa6, 0xfc, 0x22, 0x34, 0x52, 0xfc, 0xba, 0x03, 0x65, 0xab, 0x1f, 0x9c, 0xab, 0x92, 0x5f, 0x7f, 0x9f, 0xd6, 0x2b, 0xa4, 0xbc, 0x5a,
0x00, 0x38, 0x4f, 0x1d, 0x00, 0x1f, 0x10, 0x0a, 0x18, 0xfe, 0x1c, 0xcd, 0x1e, 0xd9, 0x8e, 0xe5, 0x1f, 0x9a, 0x83, 0xb1, 0xd8, 0xa8, 0xac, 0xb8, 0x5a, 0x03, 0xa0, 0x8a, 0x0e, 0x8c, 0x08, 0x15,
0x1e, 0xf9, 0xb0, 0x8c, 0x79, 0xfd, 0xe6, 0xf0, 0x85, 0x10, 0x80, 0xa5, 0x8a, 0xb4, 0x14, 0xb1, 0x28, 0xf9, 0x79, 0x16, 0x2d, 0xe8, 0x49, 0x84, 0xa7, 0xeb, 0xb1, 0x63, 0x1f, 0xc3, 0x62, 0x12,
0xd5, 0x76, 0xc9, 0x31, 0xa1, 0x91, 0x04, 0x6f, 0xa1, 0xdc, 0xc0, 0x76, 0xc6, 0xc7, 0xe0, 0x60, 0xfd, 0xd3, 0x13, 0xc7, 0x3e, 0x86, 0x34, 0x53, 0x7e, 0x11, 0x1a, 0x29, 0xee, 0x00, 0xce, 0x53,
0x89, 0x32, 0xfb, 0x53, 0x33, 0x08, 0x3c, 0x30, 0x77, 0x5f, 0x9a, 0x13, 0xcc, 0xf8, 0x92, 0xcd, 0x0e, 0xe0, 0x03, 0x42, 0x01, 0xc3, 0x9f, 0xa3, 0xd9, 0x23, 0xdb, 0xb1, 0xdc, 0x23, 0x1f, 0x96,
0x47, 0xfc, 0x92, 0xcd, 0xff, 0xc5, 0x9f, 0xa1, 0xbc, 0x65, 0x7a, 0x47, 0xb6, 0xb8, 0xd4, 0x5c, 0x31, 0xaf, 0x5f, 0x90, 0xbe, 0x10, 0x02, 0xb0, 0x54, 0x91, 0x96, 0x22, 0xb6, 0xda, 0x2e, 0x39,
0x61, 0x69, 0x45, 0x5a, 0x92, 0xd4, 0xf8, 0x82, 0x07, 0x43, 0x42, 0x25, 0x8e, 0x19, 0x9a, 0xdd, 0x26, 0x34, 0x92, 0xe0, 0x2d, 0x94, 0x1b, 0xd8, 0xce, 0xf8, 0x18, 0x02, 0x2c, 0x51, 0x66, 0x7f,
0xf7, 0x18, 0xdb, 0xf3, 0x2d, 0x68, 0x92, 0xae, 0xb0, 0xf6, 0x63, 0x6e, 0x8d, 0x5f, 0x03, 0x36, 0x6a, 0x06, 0x81, 0x07, 0xe6, 0xee, 0x4b, 0x73, 0x82, 0x19, 0xbf, 0x25, 0xf0, 0x11, 0xa1, 0x02,
0x3d, 0xc6, 0xaa, 0x1d, 0xb8, 0x06, 0x48, 0x35, 0xf5, 0xc5, 0x72, 0x0c, 0xd7, 0x00, 0x49, 0xa3, 0xc5, 0x9f, 0xa1, 0xbc, 0x65, 0x7a, 0x47, 0xb6, 0xb8, 0xbb, 0x5d, 0x61, 0x69, 0x45, 0x5a, 0x92,
0x11, 0x09, 0x77, 0x51, 0xde, 0x61, 0x01, 0x9f, 0x25, 0x7f, 0xf5, 0x2c, 0xeb, 0x72, 0x96, 0x7c, 0xd4, 0xf8, 0x1e, 0x0b, 0x43, 0x42, 0x25, 0x8e, 0x19, 0x9a, 0xdd, 0xf7, 0x18, 0xdb, 0xf3, 0x2d,
0x8b, 0x05, 0x62, 0x12, 0xa9, 0xa4, 0x56, 0x2f, 0x86, 0x7c, 0x0a, 0xc9, 0xa1, 0x92, 0x41, 0x7e, 0x68, 0x92, 0xae, 0xb0, 0xf6, 0x63, 0x6e, 0x8d, 0xdf, 0x76, 0x36, 0x3d, 0xc6, 0xaa, 0x1d, 0xb8,
0x91, 0x46, 0x85, 0xe8, 0x7c, 0x79, 0xf3, 0xe7, 0x1e, 0x39, 0xcc, 0xd3, 0x9f, 0xee, 0xa0, 0xe2, 0xed, 0x48, 0x35, 0xf5, 0xc5, 0x72, 0x0c, 0xb7, 0x1d, 0x49, 0xa3, 0x11, 0x09, 0x77, 0x51, 0xde,
0x03, 0x2a, 0xaf, 0x67, 0xa2, 0x90, 0x29, 0x84, 0xd0, 0x58, 0xca, 0x0d, 0xf4, 0x3d, 0x77, 0x3c, 0x61, 0x01, 0x9f, 0x25, 0x7f, 0xf5, 0x2c, 0xeb, 0x72, 0x96, 0x7c, 0x8b, 0x05, 0x62, 0x12, 0xa9,
0xd2, 0x9f, 0xed, 0xc0, 0x00, 0xa0, 0x09, 0x03, 0x0a, 0x21, 0x34, 0x96, 0xe2, 0x8f, 0x50, 0x66, 0xa4, 0x56, 0x2f, 0x86, 0x7c, 0x0a, 0xc9, 0xa1, 0x92, 0x41, 0x7e, 0x91, 0x46, 0x85, 0xc8, 0xbf,
0x6c, 0x5b, 0x70, 0xd4, 0xb9, 0xea, 0x3b, 0xaf, 0x42, 0x23, 0xf3, 0x04, 0x22, 0x80, 0xa3, 0xd3, 0xbc, 0xf9, 0x73, 0x8f, 0x1c, 0xe6, 0xe9, 0x2f, 0x94, 0x50, 0xf1, 0x01, 0x95, 0xb7, 0x50, 0x51,
0xd0, 0x98, 0x13, 0x0e, 0x67, 0x5b, 0x5a, 0xf9, 0xe4, 0x0c, 0xca, 0xe5, 0x5c, 0xb9, 0x6f, 0x5b, 0xc8, 0x14, 0x42, 0x68, 0x2c, 0xe5, 0x06, 0xfa, 0x9e, 0x3b, 0x1e, 0xe9, 0xaf, 0x93, 0x60, 0x00,
0xf2, 0x4d, 0x0e, 0x94, 0xb7, 0x84, 0x72, 0x5f, 0x53, 0xee, 0x27, 0x95, 0xb7, 0xb8, 0x32, 0xc7, 0xd0, 0x84, 0x01, 0x85, 0x10, 0x1a, 0x4b, 0xf1, 0x47, 0x28, 0x33, 0xb6, 0x2d, 0x70, 0x75, 0xae,
0x7e, 0x9d, 0x42, 0xf3, 0x9a, 0x87, 0x7e, 0xfb, 0xbd, 0xd8, 0x46, 0x4b, 0xc2, 0x80, 0xed, 0x77, 0xfa, 0xce, 0xab, 0xd0, 0xc8, 0x3c, 0x81, 0x13, 0xc0, 0xd1, 0x69, 0x68, 0xcc, 0x89, 0x80, 0xb3,
0xe1, 0x03, 0xe5, 0x1b, 0x14, 0x3c, 0x9b, 0x80, 0xa4, 0xe9, 0x6f, 0x71, 0x5c, 0x3d, 0x9b, 0xe8, 0x2d, 0xad, 0x7c, 0x72, 0x06, 0xe5, 0x72, 0xae, 0xdc, 0xb7, 0x2d, 0xf9, 0xf4, 0x08, 0xca, 0x5b,
0x20, 0xa1, 0x09, 0x0e, 0xe9, 0xa0, 0x39, 0x75, 0xe0, 0x78, 0x13, 0xe5, 0x8f, 0xf9, 0x20, 0x4a, 0x42, 0xb9, 0xaf, 0x29, 0xf7, 0x93, 0xca, 0x5b, 0x5c, 0x99, 0x63, 0xbf, 0x4a, 0xa1, 0x79, 0x2d,
0x48, 0x37, 0xce, 0x79, 0x45, 0xdc, 0x76, 0x0a, 0x9a, 0x0a, 0x08, 0x18, 0x12, 0x2a, 0x61, 0xd2, 0x42, 0xbf, 0xfd, 0x5e, 0x6c, 0xa3, 0x25, 0x61, 0xc0, 0xf6, 0xbb, 0xf0, 0x81, 0xf2, 0xa9, 0x0d,
0x43, 0x39, 0xe0, 0xbf, 0xd1, 0x6d, 0x22, 0x91, 0x67, 0x16, 0xfe, 0xef, 0x3c, 0xf3, 0x17, 0x59, 0x9a, 0x7f, 0x90, 0x34, 0xfd, 0x2d, 0x8e, 0xab, 0xe6, 0x5f, 0x07, 0x09, 0x4d, 0x70, 0x48, 0x07,
0x34, 0x4b, 0x79, 0xd3, 0xec, 0x07, 0xf8, 0x47, 0x2a, 0xdb, 0xe5, 0xaa, 0xdf, 0xbd, 0x2a, 0xbd, 0xcd, 0x29, 0x87, 0xe3, 0x4d, 0x94, 0x3f, 0xe6, 0x83, 0x28, 0x21, 0xdd, 0x38, 0x17, 0x15, 0x71,
0xc5, 0xa7, 0x13, 0xbd, 0x7e, 0xc4, 0x97, 0xae, 0xf4, 0xb5, 0x2f, 0x5d, 0xd1, 0x27, 0x65, 0xae, 0xdb, 0x29, 0x68, 0xea, 0x40, 0xc0, 0x90, 0x50, 0x09, 0x93, 0x1e, 0xca, 0x01, 0xff, 0x8d, 0x6e,
0xf1, 0x49, 0x71, 0x59, 0xca, 0xbe, 0x71, 0x59, 0xca, 0x5d, 0xbf, 0x2c, 0x45, 0x95, 0x32, 0x7f, 0x13, 0x89, 0x3c, 0xb3, 0xf0, 0x7f, 0xe7, 0x99, 0xbf, 0xc8, 0xa2, 0x59, 0xca, 0x9b, 0x66, 0x3f,
0x8d, 0x4a, 0xd9, 0x46, 0x4b, 0xfb, 0x9e, 0x3b, 0x84, 0x37, 0x32, 0xd7, 0x33, 0xbd, 0x13, 0xd9, 0xc0, 0x3f, 0x52, 0xd9, 0x2e, 0x57, 0xfd, 0xee, 0x55, 0xe9, 0x2d, 0xf6, 0x4e, 0xf4, 0xc8, 0x13,
0x15, 0x40, 0xe9, 0xe6, 0x92, 0xdd, 0x48, 0xa0, 0x4a, 0x77, 0x02, 0x25, 0x34, 0xc9, 0x4a, 0xd6, 0x5f, 0x07, 0xd3, 0xd7, 0xbe, 0x0e, 0x46, 0x9f, 0x94, 0xb9, 0xc6, 0x27, 0xc5, 0x65, 0x29, 0xfb,
0xc4, 0xc2, 0x9b, 0xd5, 0x44, 0xfc, 0x09, 0x2a, 0x88, 0x8e, 0xd7, 0x71, 0xe1, 0xda, 0x95, 0xab, 0xc6, 0x65, 0x29, 0x77, 0xfd, 0xb2, 0x14, 0x55, 0xca, 0xfc, 0x35, 0x2a, 0x65, 0x1b, 0x2d, 0xed,
0x7e, 0x87, 0xa7, 0x32, 0xc0, 0x5a, 0xae, 0x4a, 0x65, 0x72, 0xac, 0x3e, 0x3b, 0x22, 0x90, 0x7f, 0x7b, 0xee, 0x10, 0x9e, 0x02, 0x5d, 0xcf, 0xf4, 0x4e, 0x64, 0x57, 0x00, 0xa5, 0x9b, 0x4b, 0x76,
0x4c, 0xa1, 0x02, 0x65, 0xfe, 0xc8, 0x75, 0x7c, 0xf6, 0x4d, 0x9d, 0x60, 0x0d, 0x65, 0x2d, 0x33, 0x23, 0x81, 0x2a, 0xdd, 0x09, 0x94, 0xd0, 0x24, 0x2b, 0x59, 0x13, 0x0b, 0x6f, 0x56, 0x13, 0xf1,
0x30, 0xa5, 0xdb, 0xc1, 0xee, 0xf1, 0xb1, 0xda, 0x3d, 0x3e, 0x20, 0x14, 0x30, 0xfc, 0x29, 0xca, 0x27, 0xa8, 0x20, 0x3a, 0x5e, 0xc7, 0x85, 0x6b, 0x57, 0xae, 0xfa, 0x1d, 0x9e, 0xca, 0x00, 0x6b,
0xf6, 0x5c, 0x4b, 0x1c, 0xfe, 0x92, 0x9e, 0x34, 0x1b, 0x9e, 0xe7, 0x7a, 0x35, 0xd7, 0x92, 0xd7, 0xb9, 0x2a, 0x95, 0xc9, 0xb1, 0xfa, 0xec, 0x88, 0x40, 0xfe, 0x21, 0x85, 0x0a, 0x94, 0xf9, 0x23,
0x0e, 0x4e, 0x52, 0x06, 0xf8, 0x80, 0x50, 0xc0, 0xc8, 0x3f, 0xa4, 0x50, 0xb1, 0xee, 0x1e, 0x39, 0xd7, 0xf1, 0xd9, 0x37, 0x0d, 0x82, 0x35, 0x94, 0xb5, 0xcc, 0xc0, 0x94, 0x61, 0x07, 0xbb, 0xc7,
0x03, 0xd7, 0xb4, 0x76, 0x3c, 0xb7, 0xef, 0x31, 0xdf, 0xff, 0x46, 0x77, 0xff, 0x2e, 0x9a, 0x1d, 0xc7, 0x6a, 0xf7, 0xf8, 0x80, 0x50, 0xc0, 0xf0, 0xa7, 0x28, 0xdb, 0x73, 0x2d, 0xe1, 0xfc, 0x25,
0xc3, 0xcb, 0x41, 0x74, 0xfb, 0x7f, 0x90, 0xbc, 0x06, 0x9d, 0x9f, 0x44, 0x3c, 0x33, 0xc4, 0x0f, 0x3d, 0x69, 0x36, 0x3c, 0xcf, 0xf5, 0x6a, 0xae, 0x25, 0xaf, 0x1d, 0x9c, 0xa4, 0x0c, 0xf0, 0x01,
0x8d, 0x52, 0x59, 0xd9, 0x17, 0x63, 0x42, 0x23, 0x01, 0xf9, 0xfb, 0x0c, 0x2a, 0x5f, 0x6d, 0x08, 0xa1, 0x80, 0x91, 0xbf, 0x4f, 0xa1, 0x62, 0xdd, 0x3d, 0x72, 0x06, 0xae, 0x69, 0xed, 0x78, 0x6e,
0x0f, 0xd1, 0xbc, 0x60, 0x76, 0xb5, 0xbf, 0x09, 0xac, 0x5e, 0x67, 0x0d, 0x70, 0x39, 0x83, 0x4b, 0xdf, 0x63, 0xbe, 0xff, 0x8d, 0x5e, 0x25, 0xba, 0x68, 0x76, 0x0c, 0x6f, 0x1a, 0xd1, 0xbb, 0xc4,
0xc1, 0x58, 0x8d, 0xd5, 0xa5, 0x20, 0x86, 0x08, 0xd5, 0xe4, 0x6f, 0xf4, 0x4e, 0xa9, 0x5d, 0xe5, 0x83, 0xe4, 0x35, 0xe8, 0xfc, 0x24, 0xe2, 0x01, 0x24, 0x7e, 0x4f, 0x95, 0xca, 0xca, 0xbe, 0x18,
0x33, 0xdf, 0xfe, 0x2a, 0xdf, 0x41, 0x8b, 0xc2, 0x45, 0xa3, 0x07, 0xe5, 0x6c, 0x25, 0xb3, 0x9a, 0x13, 0x1a, 0x09, 0xc8, 0x6f, 0x32, 0xa8, 0x7c, 0xb5, 0x21, 0x3c, 0x44, 0xf3, 0x82, 0xd9, 0xd5,
0xab, 0x3e, 0xe4, 0xd9, 0x76, 0x4f, 0x34, 0xab, 0xd1, 0x53, 0xf2, 0x72, 0xec, 0xac, 0x02, 0x8c, 0xfe, 0xf4, 0xb1, 0x7a, 0x9d, 0x35, 0xc0, 0xe5, 0x0c, 0x2e, 0x05, 0x63, 0x35, 0x56, 0x97, 0x82,
0xbc, 0xad, 0x38, 0x43, 0x13, 0x5c, 0xbc, 0x99, 0xb8, 0xe9, 0x89, 0x50, 0xff, 0x83, 0x6b, 0xde, 0x18, 0x22, 0x54, 0x93, 0xbf, 0xd1, 0x73, 0xac, 0x76, 0x95, 0xcf, 0x7c, 0xfb, 0xab, 0x7c, 0x07,
0xec, 0xb4, 0x9b, 0x1c, 0xc9, 0xa3, 0xec, 0x8e, 0xed, 0xf4, 0xc9, 0x47, 0x28, 0x57, 0x1b, 0xb8, 0x2d, 0x8a, 0x10, 0x8d, 0xde, 0xcd, 0xb3, 0x95, 0xcc, 0x6a, 0xae, 0xfa, 0x90, 0x67, 0xdb, 0x3d,
0x3e, 0x64, 0x1c, 0x8f, 0x99, 0xbe, 0xeb, 0xe8, 0xae, 0x24, 0x10, 0x75, 0xd4, 0x62, 0x48, 0xa8, 0xd1, 0xac, 0x46, 0x2f, 0xe6, 0xcb, 0x71, 0xb0, 0x0a, 0x30, 0x8a, 0xb6, 0xe2, 0x0c, 0x4d, 0x70,
0xc4, 0xd7, 0x7e, 0x9b, 0x41, 0xf3, 0xda, 0x9f, 0x70, 0xf0, 0x9f, 0xa0, 0x7b, 0x8f, 0x1b, 0x9d, 0xf1, 0x66, 0xe2, 0xa6, 0x27, 0x8e, 0xfa, 0x1f, 0x5c, 0xf3, 0x66, 0xa7, 0xdd, 0xe4, 0x48, 0x1e,
0xce, 0xc6, 0x56, 0xa3, 0xbb, 0xfb, 0xe5, 0x4e, 0xa3, 0x5b, 0xdb, 0x7e, 0xd2, 0xd9, 0x6d, 0xd0, 0x65, 0x77, 0x6c, 0xa7, 0x4f, 0x3e, 0x42, 0xb9, 0xda, 0xc0, 0xf5, 0x21, 0xe3, 0x78, 0xcc, 0xf4,
0x6e, 0xad, 0xdd, 0xda, 0x6c, 0x6e, 0x15, 0x67, 0xca, 0xf7, 0x4f, 0xcf, 0x2a, 0x25, 0x4d, 0x23, 0x5d, 0x47, 0x0f, 0x25, 0x81, 0x28, 0x57, 0x8b, 0x21, 0xa1, 0x12, 0x5f, 0xfb, 0x6d, 0x06, 0xcd,
0xf9, 0xb7, 0x96, 0x3f, 0x44, 0x38, 0xa1, 0xde, 0x6c, 0xd5, 0x1b, 0x3f, 0x2d, 0xa6, 0xca, 0xb7, 0x6b, 0x7f, 0xa9, 0xc2, 0x7f, 0x82, 0xee, 0x3d, 0x6e, 0x74, 0x3a, 0x1b, 0x5b, 0x8d, 0xee, 0xee,
0x4e, 0xcf, 0x2a, 0x45, 0x4d, 0x4b, 0x3c, 0xc1, 0xfd, 0x31, 0x7a, 0xeb, 0x22, 0xbb, 0xfb, 0x64, 0x97, 0x3b, 0x8d, 0x6e, 0x6d, 0xfb, 0x49, 0x67, 0xb7, 0x41, 0xbb, 0xb5, 0x76, 0x6b, 0xb3, 0xb9,
0xa7, 0xbe, 0xb1, 0xdb, 0x28, 0xa6, 0xcb, 0xe5, 0xd3, 0xb3, 0xca, 0x9d, 0xf3, 0x4a, 0xd2, 0x05, 0x55, 0x9c, 0x29, 0xdf, 0x3f, 0x3d, 0xab, 0x94, 0x34, 0x8d, 0xe4, 0x9f, 0x94, 0xfe, 0x10, 0xe1,
0x7f, 0x80, 0x6e, 0x25, 0x54, 0x69, 0xe3, 0xf3, 0x27, 0x8d, 0xce, 0x6e, 0x31, 0x53, 0xbe, 0x73, 0x84, 0x7a, 0xb3, 0x55, 0x6f, 0xfc, 0xb4, 0x98, 0x2a, 0xdf, 0x3a, 0x3d, 0xab, 0x14, 0x35, 0x2d,
0x7a, 0x56, 0xc1, 0x9a, 0x56, 0x54, 0x26, 0xd6, 0xd1, 0xed, 0x73, 0x1a, 0x9d, 0x9d, 0x76, 0xab, 0xf1, 0xd2, 0xf8, 0xc7, 0xe8, 0xad, 0x8b, 0xec, 0xee, 0x93, 0x9d, 0xfa, 0xc6, 0x6e, 0xa3, 0x98,
0xd3, 0x28, 0x66, 0xcb, 0x77, 0x4f, 0xcf, 0x2a, 0x37, 0x13, 0x2a, 0x32, 0xab, 0xd4, 0xd0, 0x4a, 0x2e, 0x97, 0x4f, 0xcf, 0x2a, 0x77, 0xce, 0x2b, 0xc9, 0x10, 0xfc, 0x01, 0xba, 0x95, 0x50, 0xa5,
0x42, 0xa7, 0xde, 0xfe, 0xa2, 0xb5, 0xdd, 0xde, 0xa8, 0x77, 0x77, 0x68, 0x7b, 0x8b, 0x36, 0x3a, 0x8d, 0xcf, 0x9f, 0x34, 0x3a, 0xbb, 0xc5, 0x4c, 0xf9, 0xce, 0xe9, 0x59, 0x05, 0x6b, 0x5a, 0x51,
0x9d, 0x62, 0xae, 0x6c, 0x9c, 0x9e, 0x55, 0xee, 0x69, 0xca, 0x17, 0x22, 0x7c, 0x0d, 0x2d, 0x27, 0x99, 0x58, 0x47, 0xb7, 0xcf, 0x69, 0x74, 0x76, 0xda, 0xad, 0x4e, 0xa3, 0x98, 0x2d, 0xdf, 0x3d,
0x8c, 0xec, 0x34, 0x5b, 0x5b, 0xc5, 0x7c, 0xf9, 0xe6, 0xe9, 0x59, 0xe5, 0x86, 0xa6, 0xc7, 0xcf, 0x3d, 0xab, 0xdc, 0x4c, 0xa8, 0xc8, 0xac, 0x52, 0x43, 0x2b, 0x09, 0x9d, 0x7a, 0xfb, 0x8b, 0xd6,
0xf2, 0xc2, 0xfe, 0xd5, 0xb6, 0xdb, 0x9d, 0x46, 0x71, 0xf6, 0xc2, 0xfe, 0xc1, 0x81, 0xaf, 0xfd, 0x76, 0x7b, 0xa3, 0xde, 0xdd, 0xa1, 0xed, 0x2d, 0xda, 0xe8, 0x74, 0x8a, 0xb9, 0xb2, 0x71, 0x7a,
0x5d, 0x0a, 0xe1, 0x8b, 0x7f, 0x35, 0xc3, 0x1f, 0xa0, 0x52, 0x64, 0xa4, 0xd6, 0x7e, 0xbc, 0xc3, 0x56, 0xb9, 0xa7, 0x29, 0x5f, 0x38, 0xe1, 0x6b, 0x68, 0x39, 0x61, 0x64, 0xa7, 0xd9, 0xda, 0x2a,
0xd7, 0xd9, 0x6c, 0xb7, 0xba, 0xad, 0x76, 0xab, 0x51, 0x9c, 0x49, 0xec, 0xaa, 0xa6, 0xd5, 0x72, 0xe6, 0xcb, 0x37, 0x4f, 0xcf, 0x2a, 0x37, 0x34, 0x3d, 0xee, 0xcb, 0x0b, 0xfb, 0x57, 0xdb, 0x6e,
0x1d, 0x86, 0xdb, 0xe8, 0xee, 0x65, 0x9a, 0xdb, 0xcf, 0xde, 0x2f, 0xa6, 0xca, 0xeb, 0xa7, 0x67, 0x77, 0x1a, 0xc5, 0xd9, 0x0b, 0xfb, 0x07, 0x0e, 0x5f, 0xfb, 0xbb, 0x14, 0xc2, 0x17, 0xff, 0x38,
0x95, 0xdb, 0x17, 0x15, 0xb7, 0x9f, 0xbd, 0xff, 0xbb, 0xbf, 0xfa, 0xee, 0xe5, 0x82, 0x35, 0xde, 0x88, 0x3f, 0x40, 0xa5, 0xc8, 0x48, 0xad, 0xfd, 0x78, 0x87, 0xaf, 0xb3, 0xd9, 0x6e, 0x75, 0x5b,
0x00, 0xe9, 0x4b, 0x7b, 0x0f, 0xdd, 0xd2, 0x0d, 0x3f, 0x6e, 0xec, 0x6e, 0xd4, 0x37, 0x76, 0x37, 0xed, 0x56, 0xa3, 0x38, 0x93, 0xd8, 0x55, 0x4d, 0xab, 0xe5, 0x3a, 0x0c, 0xb7, 0xd1, 0xdd, 0xcb,
0x8a, 0x33, 0xe2, 0x0c, 0x34, 0xea, 0x63, 0x16, 0x98, 0x90, 0x76, 0xbf, 0x87, 0x96, 0x13, 0x5f, 0x34, 0xb7, 0x9f, 0xbd, 0x5f, 0x4c, 0x95, 0xd7, 0x4f, 0xcf, 0x2a, 0xb7, 0x2f, 0x2a, 0x6e, 0x3f,
0xd1, 0x78, 0xda, 0xa0, 0x91, 0x47, 0xe9, 0xeb, 0x67, 0x87, 0xcc, 0xc3, 0xdf, 0x47, 0x58, 0x27, 0x7b, 0xff, 0x77, 0x7f, 0xf5, 0xdd, 0xcb, 0x05, 0x6b, 0xbc, 0x01, 0xd2, 0x97, 0xf6, 0x1e, 0xba,
0x6f, 0x6c, 0x7f, 0xb1, 0xf1, 0x65, 0xa7, 0x98, 0x2e, 0xdf, 0x3e, 0x3d, 0xab, 0x2c, 0x6b, 0xec, 0xa5, 0x1b, 0x7e, 0xdc, 0xd8, 0xdd, 0xa8, 0x6f, 0xec, 0x6e, 0x14, 0x67, 0x84, 0x0f, 0x34, 0xea,
0x8d, 0xc1, 0x91, 0x79, 0xe2, 0xaf, 0xfd, 0x73, 0x1a, 0x2d, 0xe8, 0xef, 0x46, 0xf8, 0xfb, 0xe8, 0x63, 0x16, 0x98, 0x90, 0x76, 0xbf, 0x87, 0x96, 0x13, 0x5f, 0xd1, 0x78, 0xda, 0xa0, 0x51, 0x44,
0xe6, 0x66, 0x73, 0x9b, 0x7b, 0xe2, 0x66, 0x5b, 0x9c, 0x00, 0x1f, 0x16, 0x67, 0xc4, 0x74, 0x3a, 0xe9, 0xeb, 0x67, 0x87, 0xcc, 0xc3, 0xdf, 0x47, 0x58, 0x27, 0x6f, 0x6c, 0x7f, 0xb1, 0xf1, 0x65,
0x95, 0xff, 0xc6, 0x7f, 0x84, 0x4a, 0xe7, 0xe8, 0xf5, 0x26, 0x6d, 0xd4, 0x76, 0xdb, 0xf4, 0xcb, 0xa7, 0x98, 0x2e, 0xdf, 0x3e, 0x3d, 0xab, 0x2c, 0x6b, 0xec, 0x8d, 0xc1, 0x91, 0x79, 0xe2, 0xaf,
0x62, 0xaa, 0xfc, 0x16, 0xdf, 0x30, 0x5d, 0xa7, 0x6e, 0x7b, 0x90, 0x82, 0x4e, 0xf0, 0x27, 0xe8, 0xfd, 0x53, 0x1a, 0x2d, 0xe8, 0xef, 0x46, 0xf8, 0xfb, 0xe8, 0xe6, 0x66, 0x73, 0x9b, 0x47, 0xe2,
0xde, 0x39, 0xc5, 0xce, 0x97, 0x8f, 0xb7, 0x9b, 0xad, 0xcf, 0xc4, 0x7c, 0xe9, 0xf2, 0xdb, 0xa7, 0x66, 0x5b, 0x78, 0x80, 0x0f, 0x8b, 0x33, 0x62, 0x3a, 0x9d, 0xca, 0x7f, 0xe3, 0x3f, 0x42, 0xa5,
0x67, 0x95, 0xbb, 0xba, 0x6e, 0x47, 0x3c, 0xc5, 0x71, 0xa8, 0x90, 0xc2, 0x8f, 0x50, 0xe5, 0x0a, 0x73, 0xf4, 0x7a, 0x93, 0x36, 0x6a, 0xbb, 0x6d, 0xfa, 0x65, 0x31, 0x55, 0x7e, 0x8b, 0x6f, 0x98,
0xfd, 0x78, 0x01, 0x99, 0x32, 0x39, 0x3d, 0xab, 0xdc, 0xbf, 0xc4, 0x88, 0x5a, 0x47, 0x21, 0x85, 0xae, 0x53, 0xb7, 0x3d, 0x48, 0x41, 0x27, 0xf8, 0x13, 0x74, 0xef, 0x9c, 0x62, 0xe7, 0xcb, 0xc7,
0x7f, 0x88, 0xee, 0x5c, 0x6e, 0x29, 0x8a, 0x8b, 0x4b, 0xf4, 0xd7, 0xfe, 0x35, 0x85, 0xe6, 0x54, 0xdb, 0xcd, 0xd6, 0x67, 0x62, 0xbe, 0x74, 0xf9, 0xed, 0xd3, 0xb3, 0xca, 0x5d, 0x5d, 0xb7, 0x23,
0xd5, 0xe3, 0x9b, 0xd6, 0xa0, 0xb4, 0xcd, 0x93, 0x44, 0xbd, 0xd1, 0x6d, 0xb5, 0xbb, 0x30, 0x8a, 0x9e, 0xe2, 0x38, 0x54, 0x48, 0xe1, 0x47, 0xa8, 0x72, 0x85, 0x7e, 0xbc, 0x80, 0x4c, 0x99, 0x9c,
0x36, 0x4d, 0xf1, 0x5a, 0x2e, 0xfc, 0xe4, 0x3e, 0xae, 0xd1, 0xb7, 0x1a, 0xad, 0x06, 0x6d, 0xd6, 0x9e, 0x55, 0xee, 0x5f, 0x62, 0x44, 0xad, 0xa3, 0x90, 0xc2, 0x3f, 0x44, 0x77, 0x2e, 0xb7, 0x14,
0xa2, 0x13, 0x55, 0xec, 0x2d, 0xe6, 0x30, 0xcf, 0xee, 0xe1, 0xf7, 0xd1, 0xdd, 0xa4, 0xf1, 0xce, 0x9d, 0x8b, 0x4b, 0xf4, 0xd7, 0xfe, 0x35, 0x85, 0xe6, 0x54, 0xd5, 0xe3, 0x9b, 0xd6, 0xa0, 0xb4,
0x93, 0xda, 0xa3, 0x68, 0x97, 0x60, 0x81, 0xda, 0x04, 0x9d, 0x71, 0xef, 0x00, 0x0e, 0xe6, 0x47, 0xcd, 0x93, 0x44, 0xbd, 0xd1, 0x6d, 0xb5, 0xbb, 0x30, 0x8a, 0x36, 0x4d, 0xf1, 0x5a, 0x2e, 0xfc,
0x09, 0xad, 0x66, 0xeb, 0xe9, 0xc6, 0x76, 0xb3, 0x2e, 0xb4, 0x32, 0xe5, 0xd2, 0xe9, 0x59, 0xe5, 0xe4, 0x31, 0xae, 0xd1, 0xb7, 0x1a, 0xad, 0x06, 0x6d, 0xd6, 0x22, 0x8f, 0x2a, 0xf6, 0x16, 0x73,
0x96, 0xd2, 0x92, 0x0f, 0x1c, 0x5c, 0x6d, 0xed, 0x77, 0x29, 0xb4, 0xf2, 0xf5, 0xc5, 0x0b, 0x7f, 0x98, 0x67, 0xf7, 0xf0, 0xfb, 0xe8, 0x6e, 0xd2, 0x78, 0xe7, 0x49, 0xed, 0x51, 0xb4, 0x4b, 0xb0,
0x81, 0xde, 0x81, 0xfd, 0xba, 0x90, 0x0a, 0x64, 0xde, 0x12, 0x7b, 0xb8, 0xb1, 0xb3, 0xd3, 0x68, 0x40, 0x6d, 0x82, 0xce, 0xb8, 0x77, 0x00, 0x8e, 0xf9, 0x51, 0x42, 0xab, 0xd9, 0x7a, 0xba, 0xb1,
0xd5, 0x8b, 0x33, 0xe5, 0xd5, 0xd3, 0xb3, 0xca, 0x83, 0xaf, 0x37, 0xb9, 0x31, 0x1a, 0x31, 0xc7, 0xdd, 0xac, 0x0b, 0xad, 0x4c, 0xb9, 0x74, 0x7a, 0x56, 0xb9, 0xa5, 0xb4, 0xe4, 0x03, 0x07, 0x57,
0xba, 0xa6, 0xe1, 0xcd, 0x36, 0xdd, 0x6a, 0xec, 0x16, 0x53, 0xd7, 0x31, 0xbc, 0xe9, 0x7a, 0x7d, 0x5b, 0xfb, 0x5d, 0x0a, 0xad, 0x7c, 0x7d, 0xf1, 0xc2, 0x5f, 0xa0, 0x77, 0x60, 0xbf, 0x2e, 0xa4,
0x16, 0x54, 0x1f, 0xbf, 0xf8, 0x6a, 0x65, 0xe6, 0xe5, 0x57, 0x2b, 0x33, 0x2f, 0x5e, 0xad, 0xa4, 0x02, 0x99, 0xb7, 0xc4, 0x1e, 0x6e, 0xec, 0xec, 0x34, 0x5a, 0xf5, 0xe2, 0x4c, 0x79, 0xf5, 0xf4,
0x5e, 0xbe, 0x5a, 0x49, 0xfd, 0xf5, 0xeb, 0x95, 0x99, 0xdf, 0xbc, 0x5e, 0x49, 0xbd, 0x7c, 0xbd, 0xac, 0xf2, 0xe0, 0xeb, 0x4d, 0x6e, 0x8c, 0x46, 0xcc, 0xb1, 0xae, 0x69, 0x78, 0xb3, 0x4d, 0xb7,
0x32, 0xf3, 0x6f, 0xaf, 0x57, 0x66, 0x9e, 0x7d, 0xaf, 0x6f, 0x07, 0x07, 0xe3, 0xbd, 0x87, 0x3d, 0x1a, 0xbb, 0xc5, 0xd4, 0x75, 0x0c, 0x6f, 0xba, 0x5e, 0x9f, 0x05, 0xd5, 0xc7, 0x2f, 0xbe, 0x5a,
0x77, 0xf8, 0xae, 0x7f, 0xe2, 0xf4, 0x82, 0x03, 0xdb, 0xe9, 0x6b, 0xbf, 0xf4, 0xff, 0xd9, 0xb1, 0x99, 0x79, 0xf9, 0xd5, 0xca, 0xcc, 0x8b, 0x57, 0x2b, 0xa9, 0x97, 0xaf, 0x56, 0x52, 0x7f, 0xfd,
0x97, 0x87, 0x5f, 0x3f, 0xfc, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x35, 0x55, 0x08, 0x69, 0xf0, 0x7a, 0x65, 0xe6, 0xd7, 0xaf, 0x57, 0x52, 0x2f, 0x5f, 0xaf, 0xcc, 0xfc, 0xdb, 0xeb, 0x95, 0x99,
0x21, 0x00, 0x00, 0x67, 0xdf, 0xeb, 0xdb, 0xc1, 0xc1, 0x78, 0xef, 0x61, 0xcf, 0x1d, 0xbe, 0xeb, 0x9f, 0x38, 0xbd,
0xe0, 0xc0, 0x76, 0xfa, 0xda, 0x2f, 0xfd, 0x1f, 0x58, 0xf6, 0xf2, 0xf0, 0xeb, 0x87, 0xff, 0x1b,
0x00, 0x00, 0xff, 0xff, 0xa6, 0x37, 0xc7, 0xbf, 0xd7, 0x22, 0x00, 0x00,
} }
func (m *Hello) Marshal() (dAtA []byte, err error) { func (m *Hello) Marshal() (dAtA []byte, err error) {
@@ -1707,6 +1712,11 @@ func (m *Index) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i _ = i
var l int var l int
_ = l _ = l
if m.LastSequence != 0 {
i = encodeVarintBep(dAtA, i, uint64(m.LastSequence))
i--
dAtA[i] = 0x18
}
if len(m.Files) > 0 { if len(m.Files) > 0 {
for iNdEx := len(m.Files) - 1; iNdEx >= 0; iNdEx-- { for iNdEx := len(m.Files) - 1; iNdEx >= 0; iNdEx-- {
{ {
@@ -1751,6 +1761,16 @@ func (m *IndexUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i _ = i
var l int var l int
_ = l _ = l
if m.PrevSequence != 0 {
i = encodeVarintBep(dAtA, i, uint64(m.PrevSequence))
i--
dAtA[i] = 0x20
}
if m.LastSequence != 0 {
i = encodeVarintBep(dAtA, i, uint64(m.LastSequence))
i--
dAtA[i] = 0x18
}
if len(m.Files) > 0 { if len(m.Files) > 0 {
for iNdEx := len(m.Files) - 1; iNdEx >= 0; iNdEx-- { for iNdEx := len(m.Files) - 1; iNdEx >= 0; iNdEx-- {
{ {
@@ -2781,6 +2801,9 @@ func (m *Index) ProtoSize() (n int) {
n += 1 + l + sovBep(uint64(l)) n += 1 + l + sovBep(uint64(l))
} }
} }
if m.LastSequence != 0 {
n += 1 + sovBep(uint64(m.LastSequence))
}
return n return n
} }
@@ -2800,6 +2823,12 @@ func (m *IndexUpdate) ProtoSize() (n int) {
n += 1 + l + sovBep(uint64(l)) n += 1 + l + sovBep(uint64(l))
} }
} }
if m.LastSequence != 0 {
n += 1 + sovBep(uint64(m.LastSequence))
}
if m.PrevSequence != 0 {
n += 1 + sovBep(uint64(m.PrevSequence))
}
return n return n
} }
@@ -4200,6 +4229,25 @@ func (m *Index) Unmarshal(dAtA []byte) error {
return err return err
} }
iNdEx = postIndex iNdEx = postIndex
case 3:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field LastSequence", wireType)
}
m.LastSequence = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowBep
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.LastSequence |= int64(b&0x7F) << shift
if b < 0x80 {
break
}
}
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipBep(dAtA[iNdEx:]) skippy, err := skipBep(dAtA[iNdEx:])
@@ -4316,6 +4364,44 @@ func (m *IndexUpdate) Unmarshal(dAtA []byte) error {
return err return err
} }
iNdEx = postIndex iNdEx = postIndex
case 3:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field LastSequence", wireType)
}
m.LastSequence = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowBep
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.LastSequence |= int64(b&0x7F) << shift
if b < 0x80 {
break
}
}
case 4:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field PrevSequence", wireType)
}
m.PrevSequence = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowBep
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.PrevSequence |= int64(b&0x7F) << shift
if b < 0x80 {
break
}
}
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipBep(dAtA[iNdEx:]) skippy, err := skipBep(dAtA[iNdEx:])
+7 -4
View File
@@ -81,13 +81,16 @@ enum Compression {
// Index and Index Update // Index and Index Update
message Index { message Index {
string folder = 1; string folder = 1;
repeated FileInfo files = 2; repeated FileInfo files = 2;
int64 last_sequence = 3; // the highest sequence in this batch
} }
message IndexUpdate { message IndexUpdate {
string folder = 1; string folder = 1;
repeated FileInfo files = 2; repeated FileInfo files = 2;
int64 last_sequence = 3; // the highest sequence in this batch
int64 prev_sequence = 4; // the highest sequence in the previous batch
} }
message FileInfo { message FileInfo {