diff --git a/conn/raft_server.go b/conn/raft_server.go index 46388c2a967..9eaaec0c9f5 100644 --- a/conn/raft_server.go +++ b/conn/raft_server.go @@ -65,17 +65,17 @@ type ProposalCtx struct { type proposals struct { sync.RWMutex - all map[string]*ProposalCtx + all map[uint64]*ProposalCtx } -func (p *proposals) Store(key string, pctx *ProposalCtx) bool { - if len(key) == 0 { +func (p *proposals) Store(key uint64, pctx *ProposalCtx) bool { + if key == 0 { return false } p.Lock() defer p.Unlock() if p.all == nil { - p.all = make(map[string]*ProposalCtx) + p.all = make(map[uint64]*ProposalCtx) } if _, has := p.all[key]; has { return false @@ -84,21 +84,21 @@ func (p *proposals) Store(key string, pctx *ProposalCtx) bool { return true } -func (p *proposals) Ctx(key string) context.Context { +func (p *proposals) Ctx(key uint64) context.Context { if pctx := p.Get(key); pctx != nil { return pctx.Ctx } return context.Background() } -func (p *proposals) Get(key string) *ProposalCtx { +func (p *proposals) Get(key uint64) *ProposalCtx { p.RLock() defer p.RUnlock() return p.all[key] } -func (p *proposals) Delete(key string) { - if len(key) == 0 { +func (p *proposals) Delete(key uint64) { + if key == 0 { return } p.Lock() @@ -106,8 +106,8 @@ func (p *proposals) Delete(key string) { delete(p.all, key) } -func (p *proposals) Done(key string, err error) { - if len(key) == 0 { +func (p *proposals) Done(key uint64, err error) { + if key == 0 { return } p.Lock() diff --git a/dgraph/cmd/debug/wal.go b/dgraph/cmd/debug/wal.go index 4bf3c8c47b2..c6087fa391a 100644 --- a/dgraph/cmd/debug/wal.go +++ b/dgraph/cmd/debug/wal.go @@ -35,23 +35,26 @@ import ( func printEntry(es raftpb.Entry, pending map[uint64]bool) { var buf bytes.Buffer + defer func() { + fmt.Printf("%s\n", buf.Bytes()) + }() fmt.Fprintf(&buf, "%d . %d . %v . %-6s .", es.Term, es.Index, es.Type, humanize.Bytes(uint64(es.Size()))) if es.Type == raftpb.EntryConfChange { - fmt.Printf("%s\n", buf.Bytes()) + return + } + if len(es.Data) == 0 { return } var pr pb.Proposal var zpr pb.ZeroProposal - if err := pr.Unmarshal(es.Data); err == nil { + if err := pr.Unmarshal(es.Data[8:]); err == nil { printAlphaProposal(&buf, &pr, pending) - } else if err := zpr.Unmarshal(es.Data); err == nil { + } else if err := zpr.Unmarshal(es.Data[8:]); err == nil { printZeroProposal(&buf, &zpr) } else { - fmt.Printf("%s Unable to parse Proposal: %v\n", buf.Bytes(), err) - return + fmt.Fprintf(&buf, " Unable to parse Proposal: %v", err) } - fmt.Printf("%s\n", buf.Bytes()) } type RaftStore interface { diff --git a/dgraph/cmd/zero/raft.go b/dgraph/cmd/zero/raft.go index 7870955b3a3..553914fd596 100644 --- a/dgraph/cmd/zero/raft.go +++ b/dgraph/cmd/zero/raft.go @@ -18,6 +18,7 @@ package zero import ( "context" + "encoding/binary" "fmt" "log" "math" @@ -73,8 +74,8 @@ func (n *node) AmLeader() bool { return time.Since(n.lastQuorum) <= 5*time.Second } -func (n *node) uniqueKey() string { - return fmt.Sprintf("z%x-%d", n.Id, n.Rand.Uint64()) +func (n *node) uniqueKey() uint64 { + return uint64(n.Id)<<32 | uint64(n.Rand.Uint32()) } var errInternalRetry = errors.New("Retry Raft proposal internally") @@ -120,13 +121,15 @@ func (n *node) proposeAndWait(ctx context.Context, proposal *pb.ZeroProposal) er key := n.uniqueKey() x.AssertTruef(n.Proposals.Store(key, pctx), "Found existing proposal with key: [%v]", key) defer n.Proposals.Delete(key) - proposal.Key = key - span.Annotatef(nil, "Proposing with key: %s. Timeout: %v", key, timeout) + span.Annotatef(nil, "Proposing with key: %d. Timeout: %v", key, timeout) - data, err := proposal.Marshal() + data := make([]byte, 8+proposal.Size()) + binary.BigEndian.PutUint64(data[:8], key) + sz, err := proposal.MarshalToSizedBuffer(data[8:]) if err != nil { return err } + data = data[:8+sz] // Propose the change. if err := n.Raft().Propose(cctx, data); err != nil { span.Annotatef(nil, "Error while proposing via Raft: %v", err) @@ -322,19 +325,18 @@ func (n *node) applySnapshot(snap *pb.ZeroSnapshot) error { return nil } -func (n *node) applyProposal(e raftpb.Entry) (string, error) { +func (n *node) applyProposal(e raftpb.Entry) (uint64, error) { + x.AssertTrue(len(e.Data) > 0) + var p pb.ZeroProposal - // Raft commits empty entry on becoming a leader. - if len(e.Data) == 0 { - return p.Key, nil - } - if err := p.Unmarshal(e.Data); err != nil { - return p.Key, err + key := binary.BigEndian.Uint64(e.Data[:8]) + if err := p.Unmarshal(e.Data[8:]); err != nil { + return key, err } - if p.Key == "" { - return p.Key, errInvalidProposal + if key == 0 { + return key, errInvalidProposal } - span := otrace.FromContext(n.Proposals.Ctx(p.Key)) + span := otrace.FromContext(n.Proposals.Ctx(key)) n.server.Lock() defer n.server.Unlock() @@ -343,13 +345,13 @@ func (n *node) applyProposal(e raftpb.Entry) (string, error) { state.Counter = e.Index if len(p.Cid) > 0 { if len(state.Cid) > 0 { - return p.Key, errInvalidProposal + return key, errInvalidProposal } state.Cid = p.Cid } if p.MaxRaftId > 0 { if p.MaxRaftId <= state.MaxRaftId { - return p.Key, errInvalidProposal + return key, errInvalidProposal } state.MaxRaftId = p.MaxRaftId n.server.nextRaftId = x.Max(n.server.nextRaftId, p.MaxRaftId+1) @@ -365,14 +367,14 @@ func (n *node) applyProposal(e raftpb.Entry) (string, error) { if err := n.handleMemberProposal(p.Member); err != nil { span.Annotatef(nil, "While applying membership proposal: %+v", err) glog.Errorf("While applying membership proposal: %+v", err) - return p.Key, err + return key, err } } if p.Tablet != nil { if err := n.handleTabletProposal(p.Tablet); err != nil { span.Annotatef(nil, "While applying tablet proposal: %v", err) glog.Errorf("While applying tablet proposal: %v", err) - return p.Key, err + return key, err } } if p.License != nil { @@ -383,7 +385,7 @@ func (n *node) applyProposal(e raftpb.Entry) (string, error) { numNodes += len(group.GetMembers()) } if uint64(numNodes) > p.GetLicense().GetMaxNodes() { - return p.Key, errInvalidProposal + return key, errInvalidProposal } state.License = p.License // Check expiry and set enabled accordingly. @@ -411,7 +413,7 @@ func (n *node) applyProposal(e raftpb.Entry) (string, error) { n.server.orc.updateCommitStatus(e.Index, p.Txn) } - return p.Key, nil + return key, nil } func (n *node) applyConfChange(e raftpb.Entry) { @@ -516,12 +518,11 @@ func (n *node) checkForCIDInEntries() (bool, error) { batch = entries[len(entries)-1].Index + 1 for _, entry := range entries { - if entry.Type != raftpb.EntryNormal { + if entry.Type != raftpb.EntryNormal || len(entry.Data) == 0 { continue } var proposal pb.ZeroProposal - err = proposal.Unmarshal(entry.Data) - if err != nil { + if err = proposal.Unmarshal(entry.Data[8:]); err != nil { return false, err } if len(proposal.Cid) > 0 { @@ -749,11 +750,11 @@ func (n *node) calculateAndProposeSnapshot() error { break } for _, entry := range entries { - if entry.Type != raftpb.EntryNormal { + if entry.Type != raftpb.EntryNormal || len(entry.Data) == 0 { continue } var p pb.ZeroProposal - if err := p.Unmarshal(entry.Data); err != nil { + if err := p.Unmarshal(entry.Data[8:]); err != nil { span.Annotatef(nil, "Error: %v", err) return err } @@ -876,6 +877,10 @@ func (n *node) Run() { n.applyConfChange(entry) glog.Infof("Done applying conf change at %#x", n.Id) + case len(entry.Data) == 0: + // Raft commits empty entry on becoming a leader. + // Do nothing. + case entry.Type == raftpb.EntryNormal: start := time.Now() key, err := n.applyProposal(entry) @@ -886,11 +891,10 @@ func (n *node) Run() { if took := time.Since(start); took > time.Second { var p pb.ZeroProposal // Raft commits empty entry on becoming a leader. - if err := p.Unmarshal(entry.Data); err == nil { + if err := p.Unmarshal(entry.Data[8:]); err == nil { glog.V(2).Infof("Proposal took %s to apply: %+v\n", took.Round(time.Second), p) } - } default: diff --git a/protos/pb.proto b/protos/pb.proto index 66bc56c3be7..3e50db37926 100644 --- a/protos/pb.proto +++ b/protos/pb.proto @@ -150,6 +150,7 @@ message License { } message ZeroProposal { + reserved 8; // Was used for string key. map snapshot_ts = 1; // Group ID -> Snapshot Ts. Member member = 2; Tablet tablet = 3; @@ -157,7 +158,6 @@ message ZeroProposal { uint64 maxTxnTs = 5; uint64 maxRaftId = 6; api.TxnContext txn = 7; - string key = 8; // Used as unique identifier for proposal id. string cid = 9; // Used as unique identifier for the cluster. License license = 10; ZeroSnapshot snapshot = 11; // Used to make Zeros take a snapshot. @@ -302,11 +302,11 @@ message RestoreRequest { } message Proposal { + reserved 7; // Was used for string key. Mutations mutations = 2; repeated badgerpb2.KV kv = 4; MembershipState state = 5; string clean_predicate = 6; // Delete the predicate which was moved to other group. - string key = 7; OracleDelta delta = 8; Snapshot snapshot = 9; // Used to tell the group when to take snapshot. uint64 index = 10; // Used to store Raft index, in raft.Ready. diff --git a/protos/pb/pb.pb.go b/protos/pb/pb.pb.go index 7fc2ef635bd..8bd4e1bda96 100644 --- a/protos/pb/pb.pb.go +++ b/protos/pb/pb.pb.go @@ -1324,7 +1324,6 @@ type ZeroProposal struct { MaxTxnTs uint64 `protobuf:"varint,5,opt,name=maxTxnTs,proto3" json:"maxTxnTs,omitempty"` MaxRaftId uint64 `protobuf:"varint,6,opt,name=maxRaftId,proto3" json:"maxRaftId,omitempty"` Txn *api.TxnContext `protobuf:"bytes,7,opt,name=txn,proto3" json:"txn,omitempty"` - Key string `protobuf:"bytes,8,opt,name=key,proto3" json:"key,omitempty"` Cid string `protobuf:"bytes,9,opt,name=cid,proto3" json:"cid,omitempty"` License *License `protobuf:"bytes,10,opt,name=license,proto3" json:"license,omitempty"` Snapshot *ZeroSnapshot `protobuf:"bytes,11,opt,name=snapshot,proto3" json:"snapshot,omitempty"` @@ -1415,13 +1414,6 @@ func (m *ZeroProposal) GetTxn() *api.TxnContext { return nil } -func (m *ZeroProposal) GetKey() string { - if m != nil { - return m.Key - } - return "" -} - func (m *ZeroProposal) GetCid() string { if m != nil { return m.Cid @@ -2439,7 +2431,6 @@ type Proposal struct { Kv []*pb.KV `protobuf:"bytes,4,rep,name=kv,proto3" json:"kv,omitempty"` State *MembershipState `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` CleanPredicate string `protobuf:"bytes,6,opt,name=clean_predicate,json=cleanPredicate,proto3" json:"clean_predicate,omitempty"` - Key string `protobuf:"bytes,7,opt,name=key,proto3" json:"key,omitempty"` Delta *OracleDelta `protobuf:"bytes,8,opt,name=delta,proto3" json:"delta,omitempty"` Snapshot *Snapshot `protobuf:"bytes,9,opt,name=snapshot,proto3" json:"snapshot,omitempty"` Index uint64 `protobuf:"varint,10,opt,name=index,proto3" json:"index,omitempty"` @@ -2511,13 +2502,6 @@ func (m *Proposal) GetCleanPredicate() string { return "" } -func (m *Proposal) GetKey() string { - if m != nil { - return m.Key - } - return "" -} - func (m *Proposal) GetDelta() *OracleDelta { if m != nil { return m.Delta @@ -5217,15 +5201,15 @@ func init() { func init() { proto.RegisterFile("pb.proto", fileDescriptor_f80abaa17e25ccc8) } var fileDescriptor_f80abaa17e25ccc8 = []byte{ - // 4855 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x7b, 0xcd, 0x6f, 0x1c, 0xd9, - 0x71, 0xb8, 0xa6, 0xe7, 0xb3, 0x6b, 0x66, 0xa8, 0xd1, 0x93, 0xac, 0x1d, 0x8f, 0x76, 0x45, 0x6e, - 0x6b, 0xe5, 0xa5, 0x57, 0x2b, 0x4a, 0xe2, 0xfa, 0x87, 0x9f, 0x77, 0x8d, 0x00, 0x21, 0xc5, 0xa1, - 0x96, 0x16, 0x45, 0xd2, 0xcd, 0xa1, 0x6c, 0xef, 0x21, 0x83, 0x66, 0xf7, 0x23, 0xd9, 0x66, 0x4f, - 0x77, 0xbb, 0xbb, 0x87, 0x26, 0xf7, 0x16, 0x04, 0x08, 0x72, 0x48, 0x4e, 0x39, 0xc4, 0xa7, 0x04, - 0xc8, 0x3f, 0x10, 0x24, 0xa7, 0x20, 0x40, 0x6e, 0x41, 0x10, 0xe4, 0x60, 0xe4, 0x1f, 0x88, 0x12, - 0x6c, 0x72, 0x12, 0x90, 0x53, 0x80, 0x00, 0xb9, 0x04, 0x41, 0x55, 0xbd, 0xfe, 0x1a, 0x0e, 0xa5, - 0x5d, 0x03, 0x3e, 0xe4, 0x34, 0xaf, 0xaa, 0xde, 0x67, 0x55, 0xbd, 0xfa, 0x7a, 0x3d, 0xd0, 0x0a, + // 4853 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x7b, 0xcd, 0x6f, 0x1c, 0x57, + 0x72, 0xb8, 0xa6, 0xe7, 0xb3, 0x6b, 0x66, 0xa8, 0xd1, 0x93, 0x56, 0x9e, 0x1d, 0xd9, 0x22, 0xdd, + 0xb2, 0xd6, 0x5c, 0xcb, 0xa2, 0x24, 0x7a, 0x7f, 0xf8, 0xad, 0xbd, 0x08, 0x10, 0x52, 0x1c, 0xca, + 0xb4, 0x28, 0x92, 0xdb, 0x1c, 0x6a, 0x3f, 0x0e, 0x19, 0x34, 0xbb, 0x1f, 0xc9, 0x5e, 0xf6, 0x74, + 0xf7, 0x76, 0xf7, 0x70, 0x49, 0xdf, 0x82, 0x00, 0x41, 0x0e, 0xc9, 0x29, 0x87, 0xec, 0x29, 0x01, + 0xf2, 0x0f, 0x04, 0xc9, 0x29, 0x08, 0x90, 0x4b, 0x10, 0x04, 0x41, 0x0e, 0x41, 0xfe, 0x81, 0x28, + 0x81, 0x93, 0x93, 0x80, 0x5c, 0x12, 0x20, 0x40, 0x6e, 0x41, 0x55, 0xbd, 0xfe, 0x1a, 0x0e, 0x25, + 0x7b, 0x81, 0x3d, 0xe4, 0x34, 0xaf, 0xaa, 0xde, 0x67, 0x55, 0xbd, 0xfa, 0x7a, 0x3d, 0xd0, 0x0a, 0x0f, 0x57, 0xc2, 0x28, 0x48, 0x02, 0xa1, 0x85, 0x87, 0x03, 0xdd, 0x0a, 0x5d, 0x06, 0x07, 0x1f, 0x1d, 0xbb, 0xc9, 0xc9, 0xf4, 0x70, 0xc5, 0x0e, 0x26, 0x8f, 0x9c, 0xe3, 0xc8, 0x0a, 0x4f, 0x1e, 0xba, 0xc1, 0xa3, 0x43, 0xcb, 0x39, 0x96, 0xd1, 0xa3, 0xb3, 0xd5, 0x47, 0xe1, 0xe1, 0xa3, 0x74, @@ -5238,7 +5222,7 @@ var fileDescriptor_f80abaa17e25ccc8 = []byte{ 0xb3, 0x79, 0xc6, 0x0d, 0x63, 0x17, 0xda, 0xfb, 0x91, 0xbd, 0x39, 0xf5, 0xed, 0xc4, 0x0d, 0x7c, 0x5c, 0xd1, 0xb7, 0x26, 0x92, 0x66, 0xd4, 0x4d, 0x6a, 0x23, 0xce, 0x8a, 0x8e, 0xe3, 0x7e, 0x75, 0xa9, 0x8a, 0x38, 0x6c, 0x8b, 0x3e, 0x34, 0xdd, 0xf8, 0x69, 0x30, 0xf5, 0x93, 0x7e, 0x6d, 0xa9, - 0xb2, 0xdc, 0x32, 0x53, 0xd0, 0xf8, 0xb3, 0x2a, 0xd4, 0x7f, 0x34, 0x95, 0xd1, 0x05, 0x8d, 0x4b, + 0xb2, 0xdc, 0x32, 0x53, 0xd0, 0xf8, 0x93, 0x2a, 0xd4, 0x7f, 0x38, 0x95, 0xd1, 0x05, 0x8d, 0x4b, 0x92, 0x28, 0x9d, 0x0b, 0xdb, 0xe2, 0x16, 0xd4, 0x3d, 0xcb, 0x3f, 0x8e, 0xfb, 0x1a, 0x4d, 0xc6, 0x80, 0xb8, 0x03, 0xba, 0x75, 0x94, 0xc8, 0x68, 0x3c, 0x75, 0x9d, 0x7e, 0x75, 0xa9, 0xb2, 0xdc, 0x30, 0x5b, 0x84, 0x38, 0x70, 0x1d, 0xf1, 0x6d, 0x68, 0x39, 0xc1, 0xd8, 0x2e, 0xae, 0xe5, 0x04, @@ -5264,7 +5248,7 @@ var fileDescriptor_f80abaa17e25ccc8 = []byte{ 0xf3, 0xa5, 0x23, 0x1a, 0x34, 0xa2, 0x43, 0xa7, 0x51, 0xec, 0x30, 0x01, 0x3b, 0xa8, 0xee, 0xc8, 0x1a, 0x54, 0x46, 0x56, 0x1e, 0x6a, 0x1b, 0x43, 0xa8, 0xef, 0x46, 0x8e, 0x8c, 0xe6, 0xde, 0x07, 0x01, 0x35, 0x47, 0xc6, 0x36, 0x5d, 0xd5, 0x96, 0x49, 0xed, 0xfc, 0x8e, 0x54, 0x0b, 0x77, 0xc4, - 0xf8, 0xd3, 0x0a, 0xb4, 0xf7, 0x83, 0x28, 0x79, 0x21, 0xe3, 0xd8, 0x3a, 0x96, 0x62, 0x11, 0xea, + 0xf8, 0xe3, 0x0a, 0xb4, 0xf7, 0x83, 0x28, 0x79, 0x21, 0xe3, 0xd8, 0x3a, 0x96, 0x62, 0x11, 0xea, 0x01, 0x4e, 0xab, 0x38, 0xac, 0xe3, 0x9e, 0x68, 0x1d, 0x93, 0xf1, 0x33, 0x72, 0xd0, 0xae, 0x96, 0x03, 0xea, 0x0e, 0xdd, 0xae, 0xaa, 0xd2, 0x1d, 0xba, 0x5b, 0xb7, 0xa1, 0x11, 0x1c, 0x1d, 0xc5, 0x92, 0x79, 0x59, 0x37, 0x15, 0x74, 0xa5, 0x0a, 0x1a, 0xff, 0x0f, 0x00, 0xf7, 0xf7, 0x0d, 0xb5, @@ -5281,7 +5265,7 @@ var fileDescriptor_f80abaa17e25ccc8 = []byte{ 0xde, 0x42, 0xf4, 0x01, 0x61, 0x0b, 0xc3, 0x20, 0xc7, 0x8a, 0x2d, 0xb8, 0x61, 0x7b, 0xd3, 0x18, 0x4d, 0xa9, 0xeb, 0x1f, 0x05, 0xe3, 0xc0, 0xf7, 0x2e, 0x48, 0x4c, 0xad, 0xf5, 0xf7, 0x5e, 0xbf, 0x5a, 0xfc, 0xb6, 0x22, 0x6e, 0xf9, 0x47, 0xc1, 0xae, 0xef, 0x5d, 0x14, 0x66, 0xb9, 0x3e, 0x43, - 0x12, 0xbf, 0x0d, 0x0b, 0x47, 0x41, 0x64, 0xcb, 0x71, 0xc6, 0x98, 0x05, 0x9a, 0x67, 0xf0, 0xfa, + 0x12, 0xbf, 0x09, 0x0b, 0x47, 0x41, 0x64, 0xcb, 0x71, 0xc6, 0x98, 0x05, 0x9a, 0x67, 0xf0, 0xfa, 0xd5, 0xe2, 0x6d, 0xa2, 0x3c, 0xbb, 0xc4, 0x9d, 0x4e, 0x11, 0x6f, 0xfc, 0xb3, 0x06, 0x75, 0x6a, 0x8b, 0xc7, 0xd0, 0x9c, 0x10, 0xe3, 0x53, 0x2b, 0x73, 0x1b, 0x35, 0x81, 0x68, 0x2b, 0x2c, 0x91, 0x78, 0xe8, 0x27, 0xd1, 0x85, 0x99, 0x76, 0xc3, 0x11, 0x89, 0x75, 0xe8, 0xc9, 0x24, 0x56, 0x9a, @@ -5293,235 +5277,235 @@ var fileDescriptor_f80abaa17e25ccc8 = []byte{ 0x47, 0x28, 0xce, 0xa3, 0x5f, 0x3d, 0x0f, 0x0f, 0x29, 0xcc, 0x63, 0x04, 0xd0, 0xdc, 0x76, 0x6d, 0xe9, 0xc7, 0xe4, 0xa2, 0xa7, 0xb1, 0xcc, 0x4c, 0x0b, 0xb6, 0xf1, 0xbc, 0x13, 0xeb, 0x7c, 0x27, 0x70, 0x64, 0x4c, 0xf3, 0xd4, 0xcc, 0x0c, 0x46, 0x9a, 0x3c, 0x0f, 0xdd, 0xe8, 0x62, 0xc4, 0x9c, - 0xaa, 0x9a, 0x19, 0x8c, 0x3e, 0x50, 0xfa, 0xb8, 0x98, 0x93, 0xba, 0x5b, 0x05, 0x1a, 0xbf, 0xaa, - 0x42, 0xe7, 0x0b, 0x19, 0x05, 0x7b, 0x51, 0x10, 0x06, 0xb1, 0xe5, 0x89, 0xb5, 0x32, 0xcf, 0x59, - 0xb6, 0x4b, 0xb8, 0xdb, 0x62, 0xb7, 0x95, 0xfd, 0x4c, 0x08, 0x2c, 0xb3, 0xa2, 0x54, 0x0c, 0x68, - 0xb0, 0xcc, 0xe7, 0xf0, 0x4c, 0x51, 0xb0, 0x0f, 0x4b, 0x99, 0xf6, 0x5a, 0xe6, 0x87, 0xa2, 0x88, - 0xbb, 0x00, 0x13, 0xeb, 0x7c, 0x5b, 0x5a, 0xb1, 0xdc, 0x72, 0xd2, 0xcb, 0x9f, 0x63, 0x14, 0x37, - 0x46, 0xe7, 0xfe, 0x28, 0x15, 0x6e, 0x06, 0x8b, 0x77, 0x41, 0x9f, 0x58, 0xe7, 0x68, 0x85, 0xb6, - 0x1c, 0xbe, 0x6e, 0x66, 0x8e, 0x10, 0xef, 0x43, 0x35, 0x39, 0xf7, 0xc9, 0xa4, 0xa3, 0xc7, 0xc7, - 0x00, 0x70, 0x74, 0xee, 0x2b, 0x7b, 0x65, 0x22, 0x2d, 0x95, 0x60, 0x2b, 0x97, 0x60, 0x0f, 0xaa, - 0xb6, 0xeb, 0x90, 0xcb, 0xd7, 0x4d, 0x6c, 0x8a, 0xfb, 0xd0, 0xf4, 0x58, 0x5a, 0xe4, 0xd6, 0xdb, - 0xab, 0x6d, 0xb6, 0x86, 0x84, 0x32, 0x53, 0x9a, 0xf8, 0x18, 0x5a, 0x29, 0x77, 0xfa, 0x6d, 0xea, - 0xd7, 0x4b, 0xf9, 0x99, 0xb2, 0xd1, 0xcc, 0x7a, 0x0c, 0x7e, 0x0b, 0xae, 0xcf, 0x30, 0xb7, 0xa8, - 0x4d, 0x5d, 0xde, 0xcb, 0xad, 0xa2, 0x36, 0xd5, 0x8a, 0x1a, 0xf4, 0x2f, 0x55, 0xb8, 0xae, 0x54, - 0xfa, 0xc4, 0x0d, 0xf7, 0x13, 0x34, 0x21, 0x7d, 0x68, 0x92, 0x03, 0x50, 0xda, 0x54, 0x33, 0x53, - 0x50, 0xfc, 0x7f, 0x68, 0x90, 0x2d, 0x48, 0xaf, 0xe4, 0x62, 0x2e, 0xaa, 0x6c, 0x38, 0x5f, 0x51, - 0x25, 0x67, 0xd5, 0x5d, 0x7c, 0x0f, 0xea, 0x5f, 0xca, 0x28, 0x60, 0x87, 0xd6, 0x5e, 0xbd, 0x3b, - 0x6f, 0x1c, 0x1e, 0x50, 0x0d, 0xe3, 0xce, 0xbf, 0x41, 0x89, 0x7e, 0x80, 0x2e, 0x6c, 0x12, 0x9c, - 0x49, 0xa7, 0xdf, 0xa4, 0x1d, 0x15, 0x95, 0x2e, 0x25, 0xa5, 0x22, 0x6c, 0xcd, 0x15, 0xa1, 0x7e, - 0xb5, 0x08, 0x07, 0x1b, 0xd0, 0x2e, 0x70, 0x61, 0x8e, 0x40, 0x16, 0xcb, 0xd7, 0x5b, 0xcf, 0x4c, - 0x5b, 0xd1, 0x4a, 0x6c, 0x00, 0xe4, 0x3c, 0xf9, 0x75, 0x6d, 0x8d, 0xf1, 0xbb, 0x15, 0xb8, 0xfe, - 0x34, 0xf0, 0x7d, 0x49, 0x81, 0x2e, 0x4b, 0x38, 0xbf, 0x72, 0x95, 0x2b, 0xaf, 0xdc, 0x77, 0xa1, - 0x1e, 0x63, 0x67, 0x35, 0xfb, 0xcd, 0x39, 0x22, 0x33, 0xb9, 0x07, 0x1a, 0xde, 0x89, 0x75, 0x3e, - 0x0e, 0xa5, 0xef, 0xb8, 0xfe, 0x71, 0x6a, 0x78, 0x27, 0xd6, 0xf9, 0x1e, 0x63, 0x8c, 0xbf, 0xd6, - 0x00, 0x3e, 0x97, 0x96, 0x97, 0x9c, 0xa0, 0x73, 0x41, 0xb9, 0xb9, 0x7e, 0x9c, 0x58, 0xbe, 0x9d, - 0xa6, 0x19, 0x19, 0x8c, 0xca, 0x87, 0x9e, 0x54, 0xc6, 0x6c, 0xb2, 0x74, 0x33, 0x05, 0xd1, 0xb7, - 0xe2, 0x72, 0xd3, 0x58, 0x79, 0x5c, 0x05, 0xe5, 0xf1, 0x41, 0x8d, 0xd0, 0x2a, 0x3e, 0xe8, 0x43, - 0x13, 0xc3, 0x76, 0x37, 0xf0, 0x49, 0x35, 0x74, 0x33, 0x05, 0x71, 0x9e, 0x69, 0x98, 0xb8, 0x13, - 0xf6, 0xab, 0x55, 0x53, 0x41, 0xb8, 0x2b, 0xf4, 0xa3, 0x43, 0xfb, 0x24, 0xa0, 0xab, 0x5e, 0x35, - 0x33, 0x18, 0x67, 0x0b, 0xfc, 0xe3, 0x00, 0x4f, 0xd7, 0xa2, 0x90, 0x2c, 0x05, 0xf9, 0x2c, 0x8e, - 0x3c, 0x47, 0x92, 0x4e, 0xa4, 0x0c, 0x46, 0xbe, 0x48, 0x39, 0x3e, 0x92, 0x56, 0x32, 0x8d, 0x64, - 0xdc, 0x07, 0x22, 0x83, 0x94, 0x9b, 0x0a, 0x23, 0xde, 0x87, 0x0e, 0x32, 0xce, 0x8a, 0x63, 0xf7, - 0xd8, 0x97, 0x0e, 0x5d, 0xf7, 0x9a, 0x89, 0xcc, 0x5c, 0x53, 0x28, 0xe3, 0x6f, 0x35, 0x68, 0xb0, - 0xa1, 0x2b, 0x85, 0x28, 0x95, 0xaf, 0x15, 0xa2, 0xbc, 0x0b, 0x7a, 0x18, 0x49, 0xc7, 0xb5, 0x53, - 0x39, 0xea, 0x66, 0x8e, 0xa0, 0xdc, 0x00, 0xbd, 0x35, 0xf1, 0xb3, 0x65, 0x32, 0x20, 0x0c, 0xe8, - 0x06, 0xfe, 0xd8, 0x71, 0xe3, 0xd3, 0xf1, 0xe1, 0x45, 0x22, 0x63, 0xc5, 0x8b, 0x76, 0xe0, 0x6f, - 0xb8, 0xf1, 0xe9, 0x3a, 0xa2, 0x90, 0x85, 0x7c, 0x47, 0xe8, 0x6e, 0xb4, 0x4c, 0x05, 0x89, 0x4f, - 0x40, 0xa7, 0xc8, 0x90, 0x82, 0x0e, 0x9d, 0x82, 0x85, 0xdb, 0xaf, 0x5f, 0x2d, 0x0a, 0x44, 0xce, - 0x44, 0x1b, 0xad, 0x14, 0x87, 0xb1, 0x11, 0x0e, 0x46, 0xf7, 0x01, 0x14, 0xe8, 0x50, 0x6c, 0x84, - 0xa8, 0x51, 0x5c, 0x8c, 0x8d, 0x18, 0x23, 0x1e, 0x82, 0x98, 0xfa, 0x76, 0x30, 0x09, 0x51, 0x29, - 0xa4, 0xa3, 0x36, 0xd9, 0xa6, 0x4d, 0xde, 0x28, 0x52, 0x68, 0xab, 0xc6, 0xaf, 0x34, 0xe8, 0x6c, - 0xb8, 0x91, 0xb4, 0x13, 0xe9, 0x0c, 0x9d, 0x63, 0x89, 0x7b, 0x97, 0x7e, 0xe2, 0x26, 0x17, 0x2a, - 0xf8, 0x53, 0x50, 0x16, 0x9b, 0x6b, 0xe5, 0x5c, 0x95, 0x6f, 0x58, 0x95, 0xd2, 0x6b, 0x06, 0xc4, - 0x2a, 0x00, 0x67, 0x2d, 0x94, 0x62, 0xd7, 0xae, 0x4e, 0xb1, 0x75, 0xea, 0x86, 0x4d, 0x4c, 0x61, - 0x79, 0x8c, 0xcb, 0x11, 0x60, 0x83, 0xf2, 0xef, 0x29, 0x5a, 0x31, 0x0a, 0xf6, 0x0f, 0xa5, 0x47, - 0xea, 0x48, 0xc1, 0xfe, 0xa1, 0xf4, 0xb2, 0x14, 0xab, 0xc9, 0xdb, 0xc1, 0xb6, 0xb8, 0x07, 0x5a, - 0x10, 0x12, 0xcb, 0xd5, 0x82, 0xc5, 0x83, 0xad, 0xec, 0x86, 0xa6, 0x16, 0x84, 0x78, 0xb7, 0x39, - 0x9f, 0x24, 0x75, 0xc4, 0xbb, 0x8d, 0xfe, 0x8a, 0xb2, 0x1b, 0x53, 0x51, 0x84, 0x01, 0x1d, 0xcb, - 0xf3, 0x82, 0x5f, 0x48, 0x67, 0x2f, 0x92, 0x4e, 0xaa, 0x99, 0x25, 0x9c, 0x71, 0x1b, 0xb4, 0xdd, - 0x50, 0x34, 0xa1, 0xba, 0x3f, 0x1c, 0xf5, 0xae, 0x61, 0x63, 0x63, 0xb8, 0xdd, 0xab, 0x18, 0x5f, - 0x69, 0xa0, 0xbf, 0x98, 0x26, 0x16, 0x5a, 0x93, 0x18, 0xcf, 0x55, 0xd6, 0xc9, 0x5c, 0xf9, 0xbe, - 0x0d, 0xad, 0x38, 0xb1, 0x22, 0x8a, 0x0b, 0xd8, 0xef, 0x34, 0x09, 0x1e, 0xc5, 0xe2, 0x3b, 0x50, - 0x97, 0xce, 0xb1, 0x4c, 0xdd, 0x41, 0x6f, 0xf6, 0x2c, 0x26, 0x93, 0xc5, 0x32, 0x34, 0x62, 0xfb, - 0x44, 0x4e, 0xac, 0x7e, 0x2d, 0xef, 0xb8, 0x4f, 0x18, 0x0e, 0x77, 0x4d, 0x45, 0x17, 0x1f, 0x40, - 0x1d, 0xa5, 0x11, 0xab, 0xfc, 0x8c, 0x32, 0x3a, 0x64, 0xbc, 0xea, 0xc6, 0x44, 0x54, 0x35, 0x27, - 0x0a, 0xc2, 0x71, 0x10, 0x12, 0x5f, 0x17, 0x56, 0x6f, 0x91, 0x55, 0x4b, 0x4f, 0xb3, 0xb2, 0x11, - 0x05, 0xe1, 0x6e, 0x68, 0x36, 0x1c, 0xfa, 0xc5, 0x54, 0x9c, 0xba, 0xb3, 0x0e, 0xb0, 0x1b, 0xd0, - 0x11, 0xc3, 0xa5, 0x97, 0x65, 0x68, 0x4d, 0x64, 0x62, 0x39, 0x56, 0x62, 0x29, 0x6f, 0xd0, 0x61, - 0x23, 0xc9, 0x38, 0x33, 0xa3, 0x1a, 0x8f, 0xa0, 0xc1, 0x53, 0x8b, 0x16, 0xd4, 0x76, 0x76, 0x77, - 0x86, 0xcc, 0xd0, 0xb5, 0xed, 0xed, 0x5e, 0x05, 0x51, 0x1b, 0x6b, 0xa3, 0xb5, 0x9e, 0x86, 0xad, - 0xd1, 0x4f, 0xf7, 0x86, 0xbd, 0xaa, 0xf1, 0x8f, 0x15, 0x68, 0xa5, 0xf3, 0x88, 0xcf, 0x00, 0xf0, - 0xd2, 0x8e, 0x4f, 0x5c, 0x3f, 0x0b, 0xb1, 0xee, 0x14, 0x57, 0x5a, 0x41, 0x89, 0x7d, 0x8e, 0x54, - 0x76, 0x9f, 0x74, 0xc7, 0x09, 0x1e, 0xec, 0xc3, 0x42, 0x99, 0x38, 0x27, 0xd6, 0x7c, 0x50, 0xf4, - 0x23, 0x0b, 0xab, 0xdf, 0x2a, 0x4d, 0x8d, 0x23, 0x49, 0x99, 0x0b, 0x2e, 0xe5, 0x21, 0xb4, 0x52, - 0xb4, 0x68, 0x43, 0x73, 0x63, 0xb8, 0xb9, 0x76, 0xb0, 0x8d, 0x4a, 0x02, 0xd0, 0xd8, 0xdf, 0xda, - 0x79, 0xb6, 0x3d, 0xe4, 0x63, 0x6d, 0x6f, 0xed, 0x8f, 0x7a, 0x9a, 0xf1, 0xc7, 0x15, 0x68, 0xa5, - 0x31, 0x8a, 0xf8, 0x2e, 0x06, 0x17, 0x14, 0x38, 0x29, 0xdf, 0x43, 0x15, 0x94, 0x42, 0xfe, 0x67, - 0xa6, 0x74, 0xbc, 0x18, 0x64, 0x4a, 0xd3, 0xa8, 0x85, 0x80, 0x62, 0xf6, 0x59, 0x2d, 0x15, 0x40, - 0x30, 0x91, 0x0e, 0x7c, 0xa9, 0x42, 0x56, 0x6a, 0x93, 0x0e, 0xba, 0xbe, 0x2d, 0xf3, 0x80, 0xbe, - 0x49, 0xf0, 0x28, 0x36, 0x12, 0x8e, 0x64, 0xb3, 0x8d, 0x65, 0xab, 0x55, 0x8a, 0xab, 0x5d, 0x4a, - 0x0b, 0xb4, 0xcb, 0x69, 0x41, 0xee, 0x2a, 0xeb, 0x6f, 0x73, 0x95, 0xc6, 0x5f, 0xd6, 0x60, 0xc1, - 0x94, 0x71, 0x12, 0x44, 0xd2, 0x94, 0x3f, 0x9f, 0xca, 0x38, 0x79, 0xd3, 0x15, 0x7a, 0x0f, 0x20, - 0xe2, 0xce, 0xf9, 0xd2, 0xba, 0xc2, 0x70, 0x3e, 0xe3, 0x05, 0x36, 0xe9, 0xae, 0xf2, 0x89, 0x19, - 0x2c, 0xee, 0x80, 0x7e, 0x68, 0xd9, 0xa7, 0x3c, 0x2d, 0x7b, 0xc6, 0x16, 0x23, 0x78, 0x5e, 0xcb, - 0xb6, 0x65, 0x1c, 0x8f, 0x51, 0x15, 0xd8, 0x3f, 0xea, 0x8c, 0x79, 0x2e, 0x2f, 0x90, 0x1c, 0x4b, - 0x3b, 0x92, 0x09, 0x91, 0xd9, 0x2c, 0xe9, 0x8c, 0x41, 0xf2, 0x3d, 0xe8, 0xc6, 0x32, 0x46, 0x5f, - 0x3a, 0x4e, 0x82, 0x53, 0xe9, 0x2b, 0x1b, 0xd5, 0x51, 0xc8, 0x11, 0xe2, 0xd0, 0xf5, 0x58, 0x7e, - 0xe0, 0x5f, 0x4c, 0x82, 0x69, 0xac, 0xbc, 0x44, 0x8e, 0x10, 0x2b, 0x70, 0x53, 0xfa, 0x76, 0x74, - 0x11, 0xe2, 0x5e, 0x71, 0x95, 0xf1, 0x91, 0xeb, 0x49, 0x15, 0x2c, 0xdf, 0xc8, 0x49, 0xcf, 0xe5, - 0xc5, 0xa6, 0xeb, 0x49, 0xdc, 0xd1, 0x99, 0x35, 0xf5, 0x92, 0x31, 0x65, 0xdc, 0xc0, 0x3b, 0x22, - 0xcc, 0x1a, 0xa6, 0xdd, 0x1f, 0xc1, 0x0d, 0x26, 0x47, 0x81, 0x27, 0x5d, 0x87, 0x27, 0x6b, 0x53, - 0xaf, 0xeb, 0x44, 0x30, 0x09, 0x4f, 0x53, 0xad, 0xc0, 0x4d, 0xee, 0xcb, 0x07, 0x4a, 0x7b, 0x77, - 0x78, 0x69, 0x22, 0xed, 0x2b, 0x4a, 0x79, 0xe9, 0xd0, 0x4a, 0x4e, 0x28, 0x93, 0x4e, 0x97, 0xde, - 0xb3, 0x92, 0x13, 0xf4, 0xf1, 0x4c, 0x3e, 0x72, 0xa5, 0xc7, 0x19, 0xb2, 0x6e, 0xf2, 0x88, 0x4d, - 0xc4, 0xa0, 0x8f, 0x57, 0x1d, 0x82, 0x68, 0x62, 0x71, 0x21, 0x4e, 0x37, 0x79, 0xd0, 0x26, 0xa1, - 0x70, 0x09, 0x25, 0x2b, 0x7f, 0x3a, 0xe9, 0xf7, 0x58, 0xcc, 0x8c, 0xd9, 0x99, 0x4e, 0x8c, 0xff, - 0xd1, 0xa0, 0x95, 0x25, 0x5c, 0x0f, 0x40, 0x9f, 0xa4, 0xf6, 0x4a, 0x85, 0x66, 0xdd, 0x92, 0x11, - 0x33, 0x73, 0xba, 0x78, 0x0f, 0xb4, 0xd3, 0x33, 0x65, 0x3b, 0xbb, 0x2b, 0x5c, 0x98, 0x0e, 0x0f, - 0x57, 0x57, 0x9e, 0xbf, 0x34, 0xb5, 0xd3, 0xb3, 0x6f, 0xa0, 0xb7, 0xe2, 0x43, 0xb8, 0x6e, 0x7b, - 0xd2, 0xf2, 0xc7, 0x79, 0x3c, 0xc1, 0x7a, 0xb1, 0x40, 0xe8, 0xbd, 0x2c, 0xa8, 0x50, 0xe6, 0xa5, - 0x99, 0x9b, 0x97, 0xfb, 0x50, 0x77, 0xa4, 0x97, 0x58, 0xc5, 0x8a, 0xe9, 0x6e, 0x64, 0xd9, 0x9e, - 0xdc, 0x40, 0xb4, 0xc9, 0x54, 0xb4, 0xa6, 0x59, 0xda, 0x53, 0xb0, 0xa6, 0x97, 0x53, 0x9e, 0xfc, - 0xa6, 0x42, 0xf1, 0xa6, 0x3e, 0x80, 0x1b, 0xf2, 0x3c, 0x24, 0x17, 0x32, 0xce, 0xb2, 0x7c, 0x0e, - 0xa8, 0x7a, 0x29, 0xe1, 0x69, 0x9a, 0xed, 0x7f, 0x8c, 0x46, 0x84, 0xae, 0x11, 0x09, 0xbe, 0xbd, - 0x2a, 0xc8, 0x0a, 0x95, 0x2e, 0xa6, 0x99, 0x76, 0x31, 0x6c, 0xa8, 0x3e, 0x7f, 0xb9, 0x4f, 0x06, - 0x06, 0x6d, 0x7d, 0x9d, 0x82, 0x01, 0x6a, 0x67, 0x46, 0x47, 0x2b, 0x18, 0x9d, 0xbb, 0x6c, 0xaf, - 0x89, 0x1f, 0x69, 0x09, 0xaf, 0x80, 0xc1, 0xfd, 0xb3, 0xaf, 0xaa, 0x71, 0x75, 0x8f, 0x00, 0xe3, - 0xbf, 0xaa, 0xd0, 0x54, 0x01, 0x04, 0x32, 0x71, 0x9a, 0x55, 0xa7, 0xb0, 0x59, 0xce, 0xe0, 0xb2, - 0x48, 0xa4, 0x58, 0xea, 0xaf, 0xbe, 0xbd, 0xd4, 0x2f, 0x3e, 0x83, 0x4e, 0xc8, 0xb4, 0x62, 0xec, - 0xf2, 0x4e, 0x71, 0x8c, 0xfa, 0xa5, 0x71, 0xed, 0x30, 0x07, 0xd0, 0x4c, 0x51, 0x1d, 0x34, 0xb1, - 0x8e, 0x15, 0x07, 0x9a, 0x08, 0x8f, 0xac, 0xe3, 0x2b, 0x22, 0x98, 0xaf, 0x13, 0x88, 0x2c, 0x50, - 0x44, 0xd3, 0x21, 0xab, 0x87, 0xc1, 0x4b, 0x31, 0x66, 0xe8, 0x96, 0x63, 0x86, 0x3b, 0xa0, 0xdb, - 0xc1, 0x64, 0xe2, 0x12, 0x6d, 0x41, 0x55, 0x6f, 0x08, 0x31, 0x8a, 0x8d, 0xdf, 0xaf, 0x40, 0x53, - 0x9d, 0xf6, 0x92, 0x47, 0x5a, 0xdf, 0xda, 0x59, 0x33, 0x7f, 0xda, 0xab, 0xa0, 0xc7, 0xdd, 0xda, - 0x19, 0xf5, 0x34, 0xa1, 0x43, 0x7d, 0x73, 0x7b, 0x77, 0x6d, 0xd4, 0xab, 0xa2, 0x97, 0x5a, 0xdf, - 0xdd, 0xdd, 0xee, 0xd5, 0x44, 0x07, 0x5a, 0x1b, 0x6b, 0xa3, 0xe1, 0x68, 0xeb, 0xc5, 0xb0, 0x57, - 0xc7, 0xbe, 0xcf, 0x86, 0xbb, 0xbd, 0x06, 0x36, 0x0e, 0xb6, 0x36, 0x7a, 0x4d, 0xa4, 0xef, 0xad, - 0xed, 0xef, 0xff, 0x78, 0xd7, 0xdc, 0xe8, 0xb5, 0xc8, 0xd3, 0x8d, 0xcc, 0xad, 0x9d, 0x67, 0x3d, - 0x1d, 0xdb, 0xbb, 0xeb, 0x3f, 0x1c, 0x3e, 0x1d, 0xf5, 0xc0, 0x78, 0x02, 0xed, 0x02, 0x07, 0x71, - 0xb4, 0x39, 0xdc, 0xec, 0x5d, 0xc3, 0x25, 0x5f, 0xae, 0x6d, 0x1f, 0xa0, 0x63, 0x5c, 0x00, 0xa0, - 0xe6, 0x78, 0x7b, 0x6d, 0xe7, 0x59, 0x4f, 0x33, 0x7e, 0x04, 0xad, 0x03, 0xd7, 0x59, 0xf7, 0x02, - 0xfb, 0x14, 0xd5, 0xe9, 0xd0, 0x8a, 0xa5, 0xf2, 0x41, 0xd4, 0xc6, 0x80, 0x95, 0x6e, 0x48, 0xac, - 0x64, 0xaf, 0x20, 0xe4, 0x95, 0x3f, 0x9d, 0x8c, 0xe9, 0x79, 0xa8, 0xca, 0x7e, 0xc3, 0x9f, 0x4e, - 0x0e, 0x5c, 0x27, 0x36, 0x4e, 0xa1, 0x79, 0xe0, 0x3a, 0x7b, 0x96, 0x7d, 0x4a, 0xb6, 0x05, 0xa7, - 0x1e, 0xc7, 0xee, 0x97, 0x52, 0xf9, 0x17, 0x9d, 0x30, 0xfb, 0xee, 0x97, 0x52, 0x7c, 0x00, 0x0d, - 0x02, 0xd2, 0x8c, 0x9e, 0xee, 0x5c, 0xba, 0x1d, 0x53, 0xd1, 0xe8, 0x75, 0xc6, 0xf3, 0x02, 0x7b, - 0x1c, 0xc9, 0xa3, 0xfe, 0x3b, 0xcc, 0x7b, 0x42, 0x98, 0xf2, 0xc8, 0xf8, 0xc3, 0x4a, 0x76, 0x66, - 0x7a, 0x1c, 0x58, 0x84, 0x5a, 0x68, 0xd9, 0xa7, 0xca, 0xbd, 0xb7, 0xd5, 0x84, 0xb8, 0x19, 0x93, - 0x08, 0xe2, 0x43, 0x68, 0x29, 0xc5, 0x4a, 0x57, 0x6d, 0x17, 0x34, 0xd0, 0xcc, 0x88, 0x65, 0x91, - 0x57, 0xcb, 0x22, 0xa7, 0x74, 0x30, 0xf4, 0xdc, 0x84, 0xaf, 0x51, 0xcd, 0x54, 0x90, 0xf1, 0x3d, - 0x80, 0xfc, 0x3d, 0x66, 0x4e, 0xb4, 0x73, 0x0b, 0xea, 0x96, 0xe7, 0x5a, 0x69, 0x7a, 0xc9, 0x80, - 0xb1, 0x03, 0xed, 0xc2, 0x2b, 0x0e, 0xf2, 0xd6, 0xf2, 0x3c, 0x74, 0x4c, 0x31, 0x8d, 0x6d, 0x99, - 0x4d, 0xcb, 0xf3, 0x9e, 0xcb, 0x8b, 0x18, 0x23, 0x4d, 0x7e, 0x00, 0xd2, 0x66, 0xde, 0x0e, 0x68, - 0xa8, 0xc9, 0x44, 0xe3, 0x63, 0x68, 0x6c, 0xa6, 0xb1, 0x76, 0x7a, 0x0d, 0x2a, 0x57, 0x5d, 0x03, - 0xe3, 0x53, 0xb5, 0x67, 0x7a, 0x7e, 0x10, 0x0f, 0xd4, 0x43, 0x53, 0xcc, 0xcf, 0x5a, 0x95, 0xbc, - 0x40, 0xc1, 0x9d, 0xd4, 0x1b, 0x13, 0x75, 0x36, 0x36, 0xa0, 0xf5, 0xc6, 0xa7, 0x3b, 0xc5, 0x00, - 0x2d, 0x67, 0xc0, 0x9c, 0xc7, 0x3c, 0xe3, 0x67, 0x00, 0xf9, 0x83, 0x94, 0xba, 0x95, 0x3c, 0x0b, - 0xde, 0xca, 0x8f, 0xa0, 0x65, 0x9f, 0xb8, 0x9e, 0x13, 0x49, 0xbf, 0x74, 0xea, 0xfc, 0x09, 0x2b, - 0xa3, 0x8b, 0x25, 0xa8, 0xd1, 0x3b, 0x5b, 0x35, 0x37, 0xe1, 0xd9, 0x23, 0x1b, 0x51, 0x8c, 0x73, - 0xe8, 0x72, 0x08, 0xff, 0x35, 0x02, 0xa0, 0xb2, 0x29, 0xd5, 0x2e, 0x99, 0xd2, 0xdb, 0xd0, 0x20, - 0xbf, 0x9b, 0x9e, 0x46, 0x41, 0x57, 0x98, 0xd8, 0xdf, 0xd3, 0x00, 0x78, 0xe9, 0x9d, 0xc0, 0x91, - 0xe5, 0xec, 0xb8, 0x32, 0x9b, 0x1d, 0x0b, 0xa8, 0x65, 0x4f, 0xa8, 0xba, 0x49, 0xed, 0xdc, 0xf3, - 0xa8, 0x8c, 0x99, 0x3d, 0xcf, 0xbb, 0xa0, 0x53, 0x1c, 0xe4, 0x7e, 0x49, 0x75, 0x7f, 0x5c, 0x30, - 0x47, 0x14, 0x1f, 0x14, 0xeb, 0xe5, 0x07, 0xc5, 0xec, 0xd5, 0xa5, 0xc1, 0xb3, 0xf1, 0xab, 0xcb, - 0x9c, 0x07, 0x24, 0x2e, 0x59, 0xc4, 0x32, 0x4a, 0xd2, 0x7c, 0x9b, 0xa1, 0x2c, 0x49, 0xd4, 0x55, - 0x5f, 0x8b, 0x8b, 0x0e, 0x7e, 0x30, 0xb6, 0x03, 0xff, 0xc8, 0x73, 0xed, 0x44, 0x3d, 0x20, 0x82, - 0x1f, 0x3c, 0x55, 0x18, 0xe3, 0x33, 0xe8, 0xa4, 0xfc, 0xa7, 0x77, 0x9a, 0x8f, 0xb2, 0x24, 0xab, - 0x92, 0xcb, 0x36, 0x67, 0xd3, 0xba, 0xd6, 0xaf, 0xa4, 0x69, 0x96, 0xf1, 0x9f, 0xd5, 0x74, 0xb0, - 0x7a, 0x6e, 0x78, 0x33, 0x0f, 0xcb, 0x99, 0xb2, 0xf6, 0xb5, 0x32, 0xe5, 0xef, 0x83, 0xee, 0x50, - 0x2a, 0xe8, 0x9e, 0xa5, 0x4e, 0x6d, 0x30, 0x9b, 0xf6, 0xa9, 0x64, 0xd1, 0x3d, 0x93, 0x66, 0xde, - 0xf9, 0x2d, 0x72, 0xc8, 0xb8, 0x5d, 0x9f, 0xc7, 0xed, 0xc6, 0xaf, 0xc9, 0xed, 0xf7, 0xa1, 0xe3, - 0x07, 0xfe, 0xd8, 0x9f, 0x7a, 0x9e, 0x75, 0xe8, 0x49, 0xc5, 0xee, 0xb6, 0x1f, 0xf8, 0x3b, 0x0a, - 0x85, 0xc1, 0x69, 0xb1, 0x0b, 0x5f, 0xea, 0x36, 0xf5, 0xbb, 0x5e, 0xe8, 0x47, 0x57, 0x7f, 0x19, - 0x7a, 0xc1, 0xe1, 0xcf, 0xa4, 0x9d, 0x10, 0xc7, 0xc6, 0x74, 0x9b, 0x39, 0x32, 0x5d, 0x60, 0x3c, - 0xb2, 0x68, 0x07, 0xef, 0xf5, 0x8c, 0x98, 0xbb, 0x97, 0xc4, 0xfc, 0x29, 0xe8, 0x19, 0x97, 0x0a, - 0x69, 0xa7, 0x0e, 0xf5, 0xad, 0x9d, 0x8d, 0xe1, 0x4f, 0x7a, 0x15, 0x74, 0x94, 0xe6, 0xf0, 0xe5, - 0xd0, 0xdc, 0x1f, 0xf6, 0x34, 0x74, 0x62, 0x1b, 0xc3, 0xed, 0xe1, 0x68, 0xd8, 0xab, 0xfe, 0xb0, - 0xd6, 0x6a, 0xf6, 0x5a, 0xf4, 0x1e, 0xe0, 0xb9, 0xb6, 0x9b, 0x18, 0xfb, 0x00, 0x79, 0x2e, 0x8d, - 0x56, 0x39, 0xdf, 0x9c, 0x2a, 0xdf, 0x25, 0xe9, 0xb6, 0x96, 0xb3, 0x0b, 0xa9, 0x5d, 0x95, 0xb1, - 0x33, 0xdd, 0x58, 0x05, 0xfd, 0x85, 0x15, 0x7e, 0xce, 0xef, 0x63, 0xf7, 0x61, 0x21, 0xb4, 0xa2, - 0xc4, 0x4d, 0xd3, 0x01, 0x36, 0x96, 0x1d, 0xb3, 0x9b, 0x61, 0xd1, 0xf6, 0x1a, 0x7f, 0x55, 0x81, - 0x5b, 0x2f, 0x82, 0x33, 0x99, 0x85, 0x9b, 0x7b, 0xd6, 0x85, 0x17, 0x58, 0xce, 0x5b, 0xd4, 0x10, - 0xf3, 0x99, 0x60, 0x4a, 0x2f, 0x59, 0xe9, 0xeb, 0x9e, 0xa9, 0x33, 0xe6, 0x99, 0xfa, 0xbc, 0x40, - 0xc6, 0x09, 0x11, 0x95, 0x23, 0x45, 0x18, 0x49, 0xdf, 0x82, 0x46, 0x72, 0xee, 0xe7, 0x8f, 0x89, - 0xf5, 0x84, 0x8a, 0xcb, 0x73, 0x63, 0xcd, 0xfa, 0xfc, 0x58, 0xd3, 0x78, 0x0a, 0xfa, 0xe8, 0x9c, - 0x0a, 0xaf, 0xd3, 0xb8, 0x14, 0xe0, 0x54, 0xde, 0x10, 0xe0, 0x68, 0x33, 0x01, 0xce, 0xbf, 0x57, - 0xa0, 0x5d, 0x08, 0x9a, 0xc5, 0xfb, 0x50, 0x4b, 0xce, 0xfd, 0xf2, 0x93, 0x7d, 0xba, 0x88, 0x49, - 0xa4, 0x4b, 0xc5, 0x45, 0xed, 0x52, 0x71, 0x51, 0x6c, 0xc3, 0x75, 0xb6, 0xbc, 0xe9, 0x21, 0xd2, - 0x8a, 0xcc, 0xbd, 0x99, 0x20, 0x9d, 0x8b, 0xd3, 0xe9, 0x91, 0x54, 0x99, 0x61, 0xe1, 0xb8, 0x84, - 0x1c, 0xac, 0xc1, 0xcd, 0x39, 0xdd, 0xbe, 0xd1, 0x73, 0xc4, 0x22, 0x74, 0x47, 0xe7, 0xfe, 0xc8, - 0x9d, 0xc8, 0x38, 0xb1, 0x26, 0x21, 0x05, 0x88, 0xca, 0x73, 0xd6, 0x4c, 0x2d, 0x89, 0x8d, 0xef, - 0x40, 0x67, 0x4f, 0xca, 0xc8, 0x94, 0x71, 0x18, 0xf8, 0x1c, 0x1c, 0xa9, 0xa2, 0x30, 0xbb, 0x69, - 0x05, 0x19, 0xbf, 0x03, 0xba, 0x69, 0x1d, 0x25, 0xeb, 0x56, 0x62, 0x9f, 0x7c, 0x93, 0x9a, 0xc3, - 0x77, 0xa0, 0x19, 0xb2, 0x4e, 0xa9, 0xe4, 0xaa, 0x43, 0xee, 0x5a, 0xe9, 0x99, 0x99, 0x12, 0x8d, - 0x27, 0x70, 0x73, 0x7f, 0x7a, 0x18, 0xdb, 0x91, 0x4b, 0x79, 0x6a, 0xea, 0xca, 0x06, 0xd0, 0x0a, - 0x23, 0x79, 0xe4, 0x9e, 0xcb, 0x54, 0x83, 0x33, 0xd8, 0xf8, 0x01, 0xdc, 0x2a, 0x0f, 0x51, 0x47, - 0xb8, 0x07, 0xd5, 0xd3, 0xb3, 0x58, 0xed, 0xec, 0x46, 0x29, 0x4b, 0xa3, 0x97, 0x72, 0xa4, 0x1a, - 0x26, 0x54, 0x77, 0xa6, 0x93, 0xe2, 0xd7, 0x3e, 0x35, 0xfe, 0xda, 0xe7, 0x4e, 0xb1, 0xe4, 0xca, - 0x59, 0x48, 0x5e, 0x5a, 0x7d, 0x17, 0xf4, 0xa3, 0x20, 0xfa, 0x85, 0x15, 0x39, 0xd2, 0x51, 0x3e, - 0x2b, 0x47, 0x18, 0x5f, 0x40, 0x3b, 0xd5, 0x84, 0x2d, 0x87, 0x5e, 0xfd, 0x48, 0x15, 0xb7, 0x9c, - 0x92, 0x66, 0x72, 0x85, 0x52, 0xfa, 0xce, 0x56, 0xaa, 0x42, 0x0c, 0x94, 0x57, 0x56, 0xcf, 0x2f, - 0xe9, 0xca, 0xc6, 0x26, 0x74, 0xd2, 0xcc, 0xed, 0x85, 0x4c, 0x2c, 0x52, 0x6e, 0xcf, 0x95, 0x7e, - 0x41, 0xf1, 0x5b, 0x8c, 0x18, 0x95, 0x8b, 0x88, 0x5a, 0x29, 0x00, 0x30, 0x56, 0xa0, 0xa1, 0x6e, - 0x8e, 0x80, 0x9a, 0x1d, 0x38, 0x7c, 0xbb, 0xeb, 0x26, 0xb5, 0x91, 0x1d, 0x93, 0xf8, 0x38, 0x0d, - 0x6e, 0x26, 0xf1, 0xb1, 0xf1, 0x37, 0x1a, 0x74, 0xd7, 0x29, 0x73, 0x4e, 0x45, 0x52, 0xa8, 0x17, - 0x55, 0x4a, 0xf5, 0xa2, 0x62, 0x6d, 0x48, 0x2b, 0xd5, 0x86, 0x4a, 0x1b, 0xaa, 0x96, 0x23, 0x92, - 0x77, 0xa0, 0x39, 0xf5, 0xdd, 0xf3, 0xd4, 0x24, 0xe8, 0x66, 0x03, 0xc1, 0x51, 0x2c, 0x96, 0xa0, - 0x8d, 0x56, 0xc3, 0xf5, 0xb9, 0x1e, 0xc3, 0x45, 0x95, 0x22, 0x6a, 0xa6, 0xea, 0xd2, 0x78, 0x73, - 0xd5, 0xa5, 0xf9, 0xd6, 0xaa, 0x4b, 0xeb, 0x6d, 0x55, 0x17, 0x7d, 0xb6, 0xea, 0x52, 0x8e, 0xa6, - 0x60, 0x36, 0x9a, 0x32, 0xb6, 0x61, 0x21, 0xe5, 0x9d, 0xd2, 0xcd, 0xcf, 0xe0, 0xba, 0x2a, 0x98, - 0xca, 0x48, 0xd5, 0x1c, 0xd8, 0xe2, 0xdc, 0xa0, 0x92, 0x2d, 0xd5, 0x34, 0x15, 0xc5, 0x5c, 0x70, - 0x8a, 0x60, 0x6c, 0xfc, 0x41, 0x05, 0xba, 0xa5, 0x1e, 0xe2, 0x49, 0x5e, 0x7e, 0xad, 0x90, 0x63, - 0xef, 0x5f, 0x9a, 0xe5, 0xcd, 0x25, 0x58, 0x6d, 0xa6, 0x04, 0x6b, 0xdc, 0xcf, 0x0a, 0xab, 0xaa, - 0x9c, 0x7a, 0x2d, 0x2b, 0xa7, 0x52, 0x05, 0x72, 0x6d, 0x34, 0x32, 0x7b, 0x9a, 0xf1, 0x27, 0x1a, - 0x74, 0x87, 0xe7, 0x21, 0x7d, 0x9b, 0xf2, 0xd6, 0x98, 0xb3, 0xa0, 0x30, 0x5a, 0x49, 0x61, 0x0a, - 0xa2, 0xaf, 0xaa, 0x97, 0x23, 0x16, 0x3d, 0x46, 0xa1, 0x5c, 0xdc, 0x51, 0x2a, 0xc1, 0xd0, 0xff, - 0x01, 0x95, 0x40, 0x91, 0xa7, 0x8c, 0x51, 0x22, 0xff, 0x5a, 0xf7, 0x8c, 0xbf, 0x2b, 0xf3, 0xb2, - 0xf2, 0x06, 0x03, 0xc6, 0x1f, 0x69, 0xa0, 0xb3, 0x06, 0xe1, 0xf6, 0xbe, 0xab, 0x22, 0xe8, 0x4a, - 0x5e, 0x56, 0xce, 0x88, 0x2b, 0xcf, 0xe5, 0x05, 0x45, 0x7e, 0x1c, 0x58, 0xcf, 0x7b, 0x7c, 0x51, - 0x45, 0x10, 0xce, 0xfb, 0xa8, 0x08, 0x72, 0x07, 0x74, 0x76, 0x9e, 0x53, 0x37, 0x7d, 0x0e, 0x66, - 0x6f, 0x7a, 0xe0, 0xd2, 0xe7, 0x38, 0x89, 0x8c, 0x26, 0x8a, 0xcb, 0xd4, 0x2e, 0x47, 0xd8, 0x5d, - 0x15, 0xf3, 0x19, 0x27, 0xd0, 0x54, 0xab, 0x63, 0x08, 0x74, 0xb0, 0xf3, 0x7c, 0x67, 0xf7, 0xc7, - 0x3b, 0x25, 0xcd, 0xc9, 0x82, 0x24, 0xad, 0x18, 0x24, 0x55, 0x11, 0xff, 0x74, 0xf7, 0x60, 0x67, - 0xd4, 0xab, 0x89, 0x2e, 0xe8, 0xd4, 0x1c, 0x9b, 0xc3, 0x97, 0xbd, 0x3a, 0xd5, 0x03, 0x9e, 0x7e, - 0x3e, 0x7c, 0xb1, 0xd6, 0x6b, 0x64, 0x65, 0xfc, 0xa6, 0xf1, 0xe7, 0x15, 0xb8, 0xc1, 0x47, 0x2e, - 0x26, 0xc8, 0xc5, 0x6f, 0x3a, 0x6b, 0xfc, 0x4d, 0xe7, 0x6f, 0x36, 0x27, 0xc6, 0x41, 0x53, 0x37, - 0x7d, 0x2a, 0xe3, 0xe2, 0x4d, 0x6b, 0xea, 0xaa, 0x17, 0xb2, 0xbf, 0xaf, 0xc0, 0x80, 0x63, 0xb3, - 0x67, 0x91, 0x15, 0x9e, 0xfc, 0x68, 0xfb, 0x52, 0x76, 0x76, 0x55, 0xc4, 0x72, 0x1f, 0x16, 0xe8, - 0xab, 0xd7, 0x9f, 0x7b, 0x63, 0x95, 0x41, 0xb0, 0xfc, 0xba, 0x0a, 0xcb, 0x13, 0x89, 0x4f, 0xa0, - 0xc3, 0x5f, 0xc7, 0x52, 0xf1, 0xb0, 0xf4, 0xe8, 0x53, 0x8a, 0x0c, 0xdb, 0xdc, 0x8b, 0x9e, 0x9f, - 0xc4, 0x93, 0x6c, 0x50, 0x9e, 0xc8, 0x5d, 0x7e, 0xd7, 0x51, 0x43, 0x46, 0x94, 0xde, 0x3d, 0x82, - 0x3b, 0x73, 0xcf, 0xa1, 0x14, 0xbb, 0x50, 0x54, 0x63, 0x7d, 0x5a, 0xfd, 0xbb, 0x0a, 0xd4, 0x30, - 0x0a, 0x10, 0x0f, 0x41, 0xff, 0x5c, 0x5a, 0x51, 0x72, 0x28, 0xad, 0x44, 0x94, 0x3c, 0xfe, 0x80, - 0x56, 0xcc, 0xdf, 0xae, 0x8d, 0x6b, 0x8f, 0x2b, 0x62, 0x85, 0x3f, 0x58, 0x4b, 0xbf, 0xc3, 0xeb, - 0xa6, 0xd1, 0x04, 0x45, 0x1b, 0x83, 0xd2, 0x78, 0xe3, 0xda, 0x32, 0xf5, 0xff, 0x61, 0xe0, 0xfa, - 0x4f, 0xf9, 0xfb, 0x2a, 0x31, 0x1b, 0x7d, 0xcc, 0x8e, 0x10, 0x0f, 0xa1, 0xb1, 0x15, 0x63, 0x98, - 0x73, 0xb9, 0x2b, 0x71, 0xad, 0x18, 0x01, 0x19, 0xd7, 0x56, 0xff, 0xa2, 0x0a, 0xb5, 0x2f, 0x64, - 0x14, 0x88, 0x8f, 0xa1, 0xa9, 0x5e, 0xfa, 0x45, 0xe1, 0x45, 0x7f, 0x40, 0x19, 0xd7, 0xcc, 0x27, - 0x00, 0xb4, 0x4a, 0x8f, 0xd9, 0x95, 0x97, 0x7c, 0x45, 0xfe, 0x21, 0xc2, 0xa5, 0x4d, 0x7d, 0x0a, - 0xbd, 0xfd, 0x24, 0x92, 0xd6, 0xa4, 0xd0, 0xbd, 0xcc, 0xaa, 0x79, 0xf5, 0x63, 0xe2, 0xd7, 0x03, - 0x68, 0x70, 0x2c, 0x39, 0x33, 0x60, 0xb6, 0x14, 0x4c, 0x9d, 0x3f, 0x84, 0xf6, 0xfe, 0x49, 0x30, - 0xf5, 0x9c, 0x7d, 0x19, 0x9d, 0x49, 0x51, 0xf8, 0xd2, 0x67, 0x50, 0x68, 0x1b, 0xd7, 0xc4, 0x32, - 0x00, 0x87, 0x2f, 0x07, 0x78, 0x81, 0x9a, 0x48, 0xdb, 0x99, 0x4e, 0x78, 0xd2, 0x42, 0x5c, 0xc3, - 0x3d, 0x0b, 0x21, 0xe5, 0x9b, 0x7a, 0x7e, 0x02, 0xdd, 0xa7, 0x74, 0x99, 0x76, 0xa3, 0xb5, 0xc3, - 0x20, 0x4a, 0xc4, 0xec, 0xd7, 0x3e, 0x83, 0x59, 0x84, 0x71, 0x4d, 0x3c, 0x86, 0xd6, 0x28, 0xba, - 0xe0, 0xfe, 0x37, 0x54, 0x24, 0x9e, 0xaf, 0x37, 0xe7, 0x94, 0xab, 0xff, 0x5d, 0x83, 0xc6, 0x8f, - 0x83, 0xe8, 0x54, 0x46, 0x98, 0x7d, 0x53, 0xe9, 0x5e, 0xa9, 0x51, 0x56, 0xc6, 0x9f, 0xb7, 0xd0, - 0x07, 0xa0, 0x13, 0x53, 0x46, 0x56, 0x7c, 0xca, 0xa2, 0xa2, 0xcf, 0xac, 0x99, 0x2f, 0x9c, 0xcd, - 0x93, 0x5c, 0x17, 0x58, 0x50, 0xd9, 0xd3, 0x56, 0xa9, 0x90, 0x3e, 0xa0, 0xf3, 0x3f, 0x7f, 0xb9, - 0x8f, 0xaa, 0xf9, 0xb8, 0x82, 0x56, 0x7a, 0x9f, 0x4f, 0x8a, 0x9d, 0xf2, 0xcf, 0x4b, 0x59, 0xf3, - 0xf3, 0xef, 0x39, 0x8d, 0x6b, 0xe2, 0x11, 0x34, 0xd4, 0x95, 0xbe, 0x91, 0x5f, 0x5e, 0x65, 0x27, - 0x06, 0xbd, 0x22, 0x4a, 0x0d, 0x78, 0x02, 0x0d, 0x36, 0x7f, 0x3c, 0xa0, 0x14, 0x98, 0x0d, 0x44, - 0x11, 0x95, 0x2a, 0xb3, 0x78, 0x00, 0x4d, 0x55, 0x86, 0x17, 0x73, 0x6a, 0xf2, 0x7c, 0x54, 0x8e, - 0x08, 0x79, 0x7e, 0xf6, 0x5e, 0x3c, 0x7f, 0xc9, 0xc5, 0xf3, 0xfc, 0x65, 0xe7, 0xc6, 0x5a, 0x6f, - 0x4a, 0x5b, 0xba, 0x85, 0x24, 0x52, 0xa4, 0x1c, 0x99, 0x73, 0x75, 0x3f, 0x85, 0x6e, 0x29, 0xe1, - 0x14, 0x14, 0xb2, 0xcc, 0xcb, 0x41, 0x2f, 0x5d, 0x98, 0x1f, 0x80, 0xae, 0xe2, 0xfd, 0x43, 0x29, - 0xa8, 0xc6, 0x3e, 0x27, 0x63, 0x18, 0x5c, 0x0e, 0xf8, 0xe9, 0x16, 0xfc, 0x04, 0x6e, 0xce, 0xb1, - 0x65, 0x82, 0x3e, 0x9c, 0xba, 0xda, 0x58, 0x0f, 0x16, 0xaf, 0xa4, 0xa7, 0x0c, 0x58, 0xef, 0xfd, - 0xc3, 0x57, 0x77, 0x2b, 0xff, 0xf4, 0xd5, 0xdd, 0xca, 0xbf, 0x7e, 0x75, 0xb7, 0xf2, 0xcb, 0x7f, - 0xbb, 0x7b, 0xed, 0xb0, 0x41, 0x7f, 0x39, 0xf8, 0xe4, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xe7, - 0x3d, 0xe4, 0x8a, 0xe8, 0x30, 0x00, 0x00, + 0xaa, 0x9a, 0x19, 0x8c, 0x3e, 0x50, 0xfa, 0xb8, 0x98, 0x93, 0xba, 0x5b, 0x05, 0x1a, 0x7f, 0x53, + 0x85, 0xce, 0x4f, 0x65, 0x14, 0xec, 0x45, 0x41, 0x18, 0xc4, 0x96, 0x27, 0xd6, 0xca, 0x3c, 0x67, + 0xd9, 0x2e, 0xe1, 0x6e, 0x8b, 0xdd, 0x56, 0xf6, 0x33, 0x21, 0xb0, 0xcc, 0x8a, 0x52, 0x31, 0xa0, + 0xc1, 0x32, 0x9f, 0xc3, 0x33, 0x45, 0xc1, 0x3e, 0x2c, 0x65, 0xda, 0x6b, 0x99, 0x1f, 0x8a, 0x22, + 0xee, 0x02, 0x4c, 0xac, 0xf3, 0x6d, 0x69, 0xc5, 0x72, 0xcb, 0x49, 0x2f, 0x7f, 0x8e, 0x51, 0xdc, + 0x18, 0x9d, 0xfb, 0xa3, 0x54, 0xb8, 0x19, 0x2c, 0xde, 0x05, 0x7d, 0x62, 0x9d, 0xa3, 0x15, 0xda, + 0x72, 0xf8, 0xba, 0x99, 0x39, 0x42, 0xbc, 0x0f, 0xd5, 0xe4, 0xdc, 0x27, 0x93, 0x8e, 0x1e, 0x1f, + 0x03, 0xc0, 0xd1, 0xb9, 0xaf, 0xec, 0x95, 0x89, 0x34, 0x94, 0xa0, 0xed, 0x3a, 0xe4, 0xe0, 0x75, + 0x13, 0x9b, 0xe2, 0x3e, 0x34, 0x3d, 0x96, 0x0d, 0x39, 0xf1, 0xf6, 0x6a, 0x9b, 0x6d, 0x1f, 0xa1, + 0xcc, 0x94, 0x26, 0x3e, 0x86, 0x56, 0xca, 0x8b, 0x7e, 0x9b, 0xfa, 0xf5, 0x52, 0xee, 0xa5, 0x4c, + 0x33, 0xb3, 0x1e, 0x83, 0xdf, 0x80, 0xeb, 0x33, 0xac, 0x2c, 0xea, 0x4e, 0x97, 0x75, 0xe7, 0x56, + 0x51, 0x77, 0x6a, 0x05, 0x7d, 0xf9, 0xa2, 0xd6, 0x6a, 0xf5, 0x74, 0xe3, 0x5f, 0xaa, 0x70, 0x5d, + 0xa9, 0xf1, 0x89, 0x1b, 0xee, 0x27, 0x68, 0x36, 0xfa, 0xd0, 0x24, 0xa3, 0xaf, 0x34, 0xa8, 0x66, + 0xa6, 0xa0, 0xf8, 0xff, 0xd0, 0xa0, 0xfb, 0x9f, 0x5e, 0xc3, 0xc5, 0x5c, 0x3c, 0xd9, 0x70, 0xbe, + 0x96, 0x4a, 0xb6, 0xaa, 0xbb, 0xf8, 0x1e, 0xd4, 0xbf, 0x94, 0x51, 0xc0, 0x4e, 0xac, 0xbd, 0x7a, + 0x77, 0xde, 0x38, 0x3c, 0xa6, 0x1a, 0xc6, 0x9d, 0x7f, 0x8d, 0x52, 0xfc, 0x00, 0xdd, 0xd6, 0x24, + 0x38, 0x93, 0x4e, 0xbf, 0x49, 0x3b, 0x2a, 0x2a, 0x5a, 0x4a, 0x4a, 0x05, 0xd9, 0x9a, 0x2b, 0x48, + 0xfd, 0x6a, 0x41, 0x0e, 0x36, 0xa0, 0x5d, 0xe0, 0xc2, 0x1c, 0xb1, 0x2c, 0x96, 0xaf, 0xb4, 0x9e, + 0x99, 0xb3, 0xa2, 0x65, 0xd8, 0x00, 0xc8, 0x79, 0xf2, 0xab, 0xda, 0x17, 0xe3, 0xb7, 0x2b, 0x70, + 0xfd, 0x69, 0xe0, 0xfb, 0x92, 0x82, 0x5b, 0x96, 0x70, 0x7e, 0xcd, 0x2a, 0x57, 0x5e, 0xb3, 0xef, + 0x42, 0x3d, 0xc6, 0xce, 0x6a, 0xf6, 0x9b, 0x73, 0x44, 0x66, 0x72, 0x0f, 0x34, 0xb6, 0x13, 0xeb, + 0x7c, 0x1c, 0x4a, 0xdf, 0x71, 0xfd, 0xe3, 0xd4, 0xd8, 0x4e, 0xac, 0xf3, 0x3d, 0xc6, 0x18, 0x7f, + 0xa9, 0x01, 0x7c, 0x2e, 0x2d, 0x2f, 0x39, 0x41, 0x87, 0x82, 0x72, 0x73, 0xfd, 0x38, 0xb1, 0x7c, + 0x3b, 0x4d, 0x2d, 0x32, 0x18, 0x95, 0x0f, 0xbd, 0xa7, 0x8c, 0xd9, 0x4c, 0xe9, 0x66, 0x0a, 0xa2, + 0x3f, 0xc5, 0xe5, 0xa6, 0xb1, 0xf2, 0xb2, 0x0a, 0xca, 0x63, 0x82, 0x1a, 0xa1, 0x55, 0x4c, 0xd0, + 0x87, 0x26, 0x86, 0xea, 0x6e, 0xe0, 0x93, 0x6a, 0xe8, 0x66, 0x0a, 0xe2, 0x3c, 0xd3, 0x30, 0x71, + 0x27, 0xec, 0x4b, 0xab, 0xa6, 0x82, 0x70, 0x57, 0xe8, 0x3b, 0x87, 0xf6, 0x49, 0x40, 0xd7, 0xbb, + 0x6a, 0x66, 0x30, 0xce, 0x16, 0xf8, 0xc7, 0x01, 0x9e, 0xae, 0x45, 0x61, 0x58, 0x0a, 0xf2, 0x59, + 0x1c, 0x79, 0x8e, 0x24, 0x9d, 0x48, 0x19, 0x8c, 0x7c, 0x91, 0x72, 0x7c, 0x24, 0xad, 0x64, 0x1a, + 0xc9, 0xb8, 0x0f, 0x44, 0x06, 0x29, 0x37, 0x15, 0x46, 0xbc, 0x0f, 0x1d, 0x64, 0x9c, 0x15, 0xc7, + 0xee, 0xb1, 0x2f, 0x1d, 0xba, 0xf4, 0x35, 0x13, 0x99, 0xb9, 0xa6, 0x50, 0xc6, 0x5f, 0x6b, 0xd0, + 0x60, 0xe3, 0x56, 0x0a, 0x4b, 0x2a, 0x5f, 0x2b, 0x2c, 0x79, 0x17, 0xf4, 0x30, 0x92, 0x8e, 0x6b, + 0xa7, 0x72, 0xd4, 0xcd, 0x1c, 0x41, 0xf9, 0x00, 0x7a, 0x68, 0xe2, 0x67, 0xcb, 0x64, 0x40, 0x18, + 0xd0, 0x0d, 0xfc, 0xb1, 0xe3, 0xc6, 0xa7, 0xe3, 0xc3, 0x8b, 0x44, 0xc6, 0x8a, 0x17, 0xed, 0xc0, + 0xdf, 0x70, 0xe3, 0xd3, 0x75, 0x44, 0x21, 0x0b, 0xf9, 0x8e, 0xd0, 0xdd, 0x68, 0x99, 0x0a, 0x12, + 0x9f, 0x80, 0x4e, 0xd1, 0x20, 0x05, 0x1a, 0x3a, 0x05, 0x08, 0xb7, 0x5f, 0xbf, 0x5a, 0x14, 0x88, + 0x9c, 0x89, 0x30, 0x5a, 0x29, 0x0e, 0xe3, 0x21, 0x1c, 0x8c, 0x2e, 0x03, 0x28, 0xb8, 0xa1, 0x78, + 0x08, 0x51, 0xa3, 0xb8, 0x18, 0x0f, 0x31, 0x46, 0x3c, 0x04, 0x31, 0xf5, 0xed, 0x60, 0x12, 0xa2, + 0x52, 0x48, 0x47, 0x6d, 0xb2, 0x4d, 0x9b, 0xbc, 0x51, 0xa4, 0xd0, 0x56, 0x8d, 0x7f, 0xd4, 0xa0, + 0xb3, 0xe1, 0x46, 0xd2, 0x4e, 0xa4, 0x33, 0x74, 0x8e, 0x25, 0xee, 0x5d, 0xfa, 0x89, 0x9b, 0x5c, + 0xa8, 0x80, 0x4f, 0x41, 0x59, 0x3c, 0xae, 0x95, 0xf3, 0x53, 0xbe, 0x61, 0x55, 0x4a, 0xa9, 0x19, + 0x10, 0xab, 0x00, 0x9c, 0xa9, 0x50, 0x5a, 0x5d, 0xbb, 0x3a, 0xad, 0xd6, 0xa9, 0x1b, 0x36, 0x31, + 0x6d, 0xe5, 0x31, 0x2e, 0x47, 0x7d, 0x0d, 0xca, 0xb9, 0xa7, 0x68, 0xc5, 0x28, 0xc0, 0x3f, 0x94, + 0x1e, 0xa9, 0x23, 0x05, 0xf8, 0x87, 0xd2, 0xcb, 0xd2, 0xaa, 0x26, 0x6f, 0x07, 0xdb, 0xe2, 0x1e, + 0x68, 0x41, 0x48, 0x2c, 0x57, 0x0b, 0x16, 0x0f, 0xb6, 0xb2, 0x1b, 0x9a, 0x5a, 0x10, 0xe2, 0xdd, + 0xe6, 0x1c, 0x92, 0xd4, 0x11, 0xef, 0x36, 0xfa, 0x28, 0xca, 0x68, 0x4c, 0x45, 0x11, 0x06, 0x74, + 0x2c, 0xcf, 0x0b, 0x7e, 0x21, 0x9d, 0xbd, 0x48, 0x3a, 0xa9, 0x66, 0x96, 0x70, 0xc6, 0x6d, 0xd0, + 0x76, 0x43, 0xd1, 0x84, 0xea, 0xfe, 0x70, 0xd4, 0xbb, 0x86, 0x8d, 0x8d, 0xe1, 0x76, 0xaf, 0x62, + 0x7c, 0xa5, 0x81, 0xfe, 0x62, 0x9a, 0x58, 0x68, 0x4d, 0x62, 0x3c, 0x57, 0x59, 0x27, 0x73, 0xe5, + 0xfb, 0x36, 0xb4, 0xe2, 0xc4, 0x8a, 0x28, 0x16, 0x60, 0xef, 0xd3, 0x24, 0x78, 0x14, 0x8b, 0xef, + 0x40, 0x5d, 0x3a, 0xc7, 0x32, 0x75, 0x07, 0xbd, 0xd9, 0xb3, 0x98, 0x4c, 0x16, 0xcb, 0xd0, 0x88, + 0xed, 0x13, 0x39, 0xb1, 0xfa, 0xb5, 0xbc, 0xe3, 0x3e, 0x61, 0x38, 0xc4, 0x35, 0x15, 0x5d, 0x7c, + 0x00, 0x75, 0x94, 0x46, 0xac, 0x72, 0x32, 0xca, 0xe2, 0x90, 0xf1, 0xaa, 0x1b, 0x13, 0x51, 0xd5, + 0x9c, 0x28, 0x08, 0xc7, 0x41, 0x48, 0x7c, 0x5d, 0x58, 0xbd, 0x45, 0x56, 0x2d, 0x3d, 0xcd, 0xca, + 0x46, 0x14, 0x84, 0xbb, 0xa1, 0xd9, 0x70, 0xe8, 0x17, 0xd3, 0x6f, 0xea, 0xce, 0x3a, 0xc0, 0x6e, + 0x40, 0x47, 0x0c, 0x97, 0x5b, 0x96, 0xa1, 0x35, 0x91, 0x89, 0xe5, 0x58, 0x89, 0xa5, 0xbc, 0x41, + 0x87, 0x8d, 0x24, 0xe3, 0xcc, 0x8c, 0x6a, 0x3c, 0x82, 0x06, 0x4f, 0x2d, 0x5a, 0x50, 0xdb, 0xd9, + 0xdd, 0x19, 0x32, 0x43, 0xd7, 0xb6, 0xb7, 0x7b, 0x15, 0x44, 0x6d, 0xac, 0x8d, 0xd6, 0x7a, 0x1a, + 0xb6, 0x46, 0x3f, 0xd9, 0x1b, 0xf6, 0xaa, 0xc6, 0x3f, 0x54, 0xa0, 0x95, 0xce, 0x23, 0x3e, 0x03, + 0xc0, 0x4b, 0x3b, 0x3e, 0x71, 0xfd, 0x2c, 0xac, 0xba, 0x53, 0x5c, 0x69, 0x05, 0x25, 0xf6, 0x39, + 0x52, 0xd9, 0x7d, 0xd2, 0x1d, 0x27, 0x78, 0xb0, 0x0f, 0x0b, 0x65, 0xe2, 0x9c, 0xf8, 0xf2, 0x41, + 0xd1, 0x8f, 0x2c, 0xac, 0x7e, 0xab, 0x34, 0x35, 0x8e, 0x24, 0x65, 0x2e, 0xb8, 0x94, 0x87, 0xd0, + 0x4a, 0xd1, 0xa2, 0x0d, 0xcd, 0x8d, 0xe1, 0xe6, 0xda, 0xc1, 0x36, 0x2a, 0x09, 0x40, 0x63, 0x7f, + 0x6b, 0xe7, 0xd9, 0xf6, 0x90, 0x8f, 0xb5, 0xbd, 0xb5, 0x3f, 0xea, 0x69, 0xc6, 0x1f, 0x56, 0xa0, + 0x95, 0x46, 0x2a, 0xe2, 0xbb, 0x18, 0x5c, 0x50, 0xb0, 0xa4, 0x7c, 0x0f, 0x55, 0x4d, 0x0a, 0x39, + 0x9f, 0x99, 0xd2, 0xf1, 0x62, 0x90, 0x29, 0x4d, 0x63, 0x17, 0x02, 0x8a, 0x19, 0x67, 0xb5, 0x54, + 0xf4, 0xc0, 0xe4, 0x39, 0xf0, 0xa5, 0x0a, 0x53, 0xa9, 0x4d, 0x3a, 0xe8, 0xfa, 0xb6, 0xcc, 0x83, + 0xf8, 0x26, 0xc1, 0xa3, 0xd8, 0x48, 0x38, 0x7a, 0xcd, 0x36, 0x96, 0xad, 0x56, 0x29, 0xae, 0x76, + 0x29, 0x15, 0xd0, 0x2e, 0xa7, 0x02, 0xb9, 0xab, 0xac, 0xbf, 0xcd, 0x55, 0x1a, 0x7f, 0x5e, 0x83, + 0x05, 0x53, 0xc6, 0x49, 0x10, 0x49, 0x53, 0xfe, 0x7c, 0x2a, 0xe3, 0xe4, 0x4d, 0x57, 0xe8, 0x3d, + 0x80, 0x88, 0x3b, 0xe7, 0x4b, 0xeb, 0x0a, 0xc3, 0x39, 0x8c, 0x17, 0xd8, 0xa4, 0xbb, 0xca, 0x27, + 0x66, 0xb0, 0xb8, 0x03, 0xfa, 0xa1, 0x65, 0x9f, 0xf2, 0xb4, 0xec, 0x19, 0x5b, 0x8c, 0xe0, 0x79, + 0x2d, 0xdb, 0x96, 0x71, 0x3c, 0x46, 0x55, 0x60, 0xff, 0xa8, 0x33, 0xe6, 0xb9, 0xbc, 0x40, 0x72, + 0x2c, 0xed, 0x48, 0x26, 0x44, 0x66, 0xb3, 0xa4, 0x33, 0x06, 0xc9, 0xf7, 0xa0, 0x1b, 0xcb, 0x18, + 0x7d, 0xe9, 0x38, 0x09, 0x4e, 0xa5, 0xaf, 0x6c, 0x54, 0x47, 0x21, 0x47, 0x88, 0x43, 0xd7, 0x63, + 0xf9, 0x81, 0x7f, 0x31, 0x09, 0xa6, 0xb1, 0xf2, 0x12, 0x39, 0x42, 0xac, 0xc0, 0x4d, 0xe9, 0xdb, + 0xd1, 0x45, 0x88, 0x7b, 0xc5, 0x55, 0xc6, 0x47, 0xae, 0x27, 0x55, 0xc8, 0x7c, 0x23, 0x27, 0x3d, + 0x97, 0x17, 0x9b, 0xae, 0x27, 0x71, 0x47, 0x67, 0xd6, 0xd4, 0x4b, 0xc6, 0x94, 0x65, 0x03, 0xef, + 0x88, 0x30, 0x6b, 0x98, 0x6a, 0x7f, 0x04, 0x37, 0x98, 0x1c, 0x05, 0x9e, 0x74, 0x1d, 0x9e, 0xac, + 0x4d, 0xbd, 0xae, 0x13, 0xc1, 0x24, 0x3c, 0x4d, 0xb5, 0x02, 0x37, 0xb9, 0x2f, 0x1f, 0x28, 0xed, + 0xdd, 0xe1, 0xa5, 0x89, 0xb4, 0xaf, 0x28, 0xe5, 0xa5, 0x43, 0x2b, 0x39, 0xa1, 0xec, 0x39, 0x5d, + 0x7a, 0xcf, 0x4a, 0x4e, 0xd0, 0xc7, 0x33, 0xf9, 0xc8, 0x95, 0x1e, 0x67, 0xc5, 0xba, 0xc9, 0x23, + 0x36, 0x11, 0x83, 0x3e, 0x5e, 0x75, 0x08, 0xa2, 0x89, 0xc5, 0xc5, 0x37, 0xdd, 0xe4, 0x41, 0x9b, + 0x84, 0xc2, 0x25, 0x94, 0xac, 0xfc, 0xe9, 0xa4, 0xdf, 0x63, 0x31, 0x33, 0x66, 0x67, 0x3a, 0x31, + 0xfe, 0x53, 0x83, 0x56, 0x96, 0x64, 0x3d, 0x00, 0x7d, 0x92, 0xda, 0x2b, 0x15, 0x9a, 0x75, 0x4b, + 0x46, 0xcc, 0xcc, 0xe9, 0xe2, 0x3d, 0xd0, 0x4e, 0xcf, 0x94, 0xed, 0xec, 0xae, 0x70, 0x31, 0x3a, + 0x3c, 0x5c, 0x5d, 0x79, 0xfe, 0xd2, 0xd4, 0x4e, 0xcf, 0xbe, 0x81, 0xde, 0x8a, 0x0f, 0xe1, 0xba, + 0xed, 0x49, 0xcb, 0x1f, 0xe7, 0xf1, 0x04, 0xeb, 0xc5, 0x02, 0xa1, 0xf7, 0xb2, 0xa0, 0xe2, 0x3e, + 0xd4, 0x1d, 0xe9, 0x25, 0x56, 0xb1, 0x26, 0xba, 0x1b, 0x59, 0xb6, 0x27, 0x37, 0x10, 0x6d, 0x32, + 0x15, 0x6d, 0x67, 0x96, 0xea, 0x14, 0x6c, 0xe7, 0xe5, 0x34, 0x27, 0xbf, 0x97, 0x50, 0xbc, 0x97, + 0x0f, 0xe0, 0x86, 0x3c, 0x0f, 0xc9, 0x61, 0x8c, 0xb3, 0x3c, 0x9e, 0xc3, 0xa7, 0x5e, 0x4a, 0x78, + 0x9a, 0xe6, 0xf3, 0x1f, 0xa3, 0xc9, 0xa0, 0x4b, 0x43, 0x62, 0x6e, 0xaf, 0x0a, 0xb2, 0x39, 0xa5, + 0x6b, 0x68, 0xa6, 0x5d, 0xbe, 0xa8, 0xb5, 0x9a, 0xbd, 0x96, 0x61, 0x43, 0xf5, 0xf9, 0xcb, 0x7d, + 0x32, 0x2a, 0x68, 0xdf, 0xeb, 0x14, 0x00, 0x50, 0x3b, 0x33, 0x34, 0x5a, 0xc1, 0xd0, 0xdc, 0x65, + 0x1b, 0x4d, 0x3c, 0x48, 0x4b, 0x75, 0x05, 0x0c, 0x9e, 0x82, 0xfd, 0x53, 0x8d, 0xab, 0x78, 0x04, + 0x18, 0xff, 0x5d, 0x85, 0xa6, 0x0a, 0x1a, 0xd0, 0x2e, 0x4f, 0xb3, 0x2a, 0x14, 0x36, 0xcb, 0xb9, + 0x5b, 0x16, 0x7d, 0x14, 0x4b, 0xfa, 0xd5, 0xb7, 0x97, 0xf4, 0xc5, 0x67, 0xd0, 0x09, 0x99, 0x56, + 0x8c, 0x57, 0xde, 0x29, 0x8e, 0x51, 0xbf, 0x34, 0xae, 0x1d, 0xe6, 0x00, 0x9a, 0x26, 0xaa, 0x77, + 0x26, 0xd6, 0xb1, 0xe2, 0x40, 0x13, 0xe1, 0x91, 0x75, 0x7c, 0x45, 0xd4, 0xf2, 0x75, 0x82, 0x8f, + 0x05, 0x8a, 0x62, 0x3a, 0x64, 0xe9, 0x30, 0x60, 0x29, 0xc6, 0x09, 0xdd, 0x72, 0x9c, 0x70, 0x07, + 0x74, 0x3b, 0x98, 0x4c, 0x5c, 0xa2, 0x2d, 0xa8, 0x2a, 0x0d, 0x21, 0x46, 0xb1, 0xf1, 0xbb, 0x15, + 0x68, 0xaa, 0xd3, 0x5e, 0xf2, 0x42, 0xeb, 0x5b, 0x3b, 0x6b, 0xe6, 0x4f, 0x7a, 0x15, 0xf4, 0xb2, + 0x5b, 0x3b, 0xa3, 0x9e, 0x26, 0x74, 0xa8, 0x6f, 0x6e, 0xef, 0xae, 0x8d, 0x7a, 0x55, 0xf4, 0x4c, + 0xeb, 0xbb, 0xbb, 0xdb, 0xbd, 0x9a, 0xe8, 0x40, 0x6b, 0x63, 0x6d, 0x34, 0x1c, 0x6d, 0xbd, 0x18, + 0xf6, 0xea, 0xd8, 0xf7, 0xd9, 0x70, 0xb7, 0xd7, 0xc0, 0xc6, 0xc1, 0xd6, 0x46, 0xaf, 0x89, 0xf4, + 0xbd, 0xb5, 0xfd, 0xfd, 0x1f, 0xed, 0x9a, 0x1b, 0xbd, 0x16, 0x79, 0xb7, 0x91, 0xb9, 0xb5, 0xf3, + 0xac, 0xa7, 0x63, 0x7b, 0x77, 0xfd, 0x8b, 0xe1, 0xd3, 0x51, 0x0f, 0x8c, 0x27, 0xd0, 0x2e, 0x70, + 0x10, 0x47, 0x9b, 0xc3, 0xcd, 0xde, 0x35, 0x5c, 0xf2, 0xe5, 0xda, 0xf6, 0x01, 0x3a, 0xc3, 0x05, + 0x00, 0x6a, 0x8e, 0xb7, 0xd7, 0x76, 0x9e, 0xf5, 0x34, 0xe3, 0x87, 0xd0, 0x3a, 0x70, 0x9d, 0x75, + 0x2f, 0xb0, 0x4f, 0x51, 0x9d, 0x0e, 0xad, 0x58, 0x2a, 0xbf, 0x43, 0x6d, 0x0c, 0x52, 0xe9, 0x9e, + 0xc4, 0x4a, 0xf6, 0x0a, 0x42, 0x5e, 0xf9, 0xd3, 0xc9, 0x98, 0x9e, 0x81, 0xaa, 0xec, 0x2b, 0xfc, + 0xe9, 0xe4, 0xc0, 0x75, 0x62, 0xe3, 0x14, 0x9a, 0x07, 0xae, 0xb3, 0x67, 0xd9, 0xa7, 0x64, 0x4f, + 0x70, 0xea, 0x71, 0xec, 0x7e, 0x29, 0x95, 0x4f, 0xd1, 0x09, 0xb3, 0xef, 0x7e, 0x29, 0xc5, 0x07, + 0xd0, 0x20, 0x20, 0xcd, 0xe2, 0xe9, 0xe6, 0xa5, 0xdb, 0x31, 0x15, 0x8d, 0x5e, 0x61, 0x3c, 0x2f, + 0xb0, 0xc7, 0x91, 0x3c, 0xea, 0xbf, 0xc3, 0xbc, 0x27, 0x84, 0x29, 0x8f, 0x8c, 0xdf, 0xaf, 0x64, + 0x67, 0xa6, 0x47, 0x80, 0x45, 0xa8, 0x85, 0x96, 0x7d, 0xaa, 0x5c, 0x7a, 0x5b, 0x4d, 0x88, 0x9b, + 0x31, 0x89, 0x20, 0x3e, 0x84, 0x96, 0x52, 0xac, 0x74, 0xd5, 0x76, 0x41, 0x03, 0xcd, 0x8c, 0x58, + 0x16, 0x79, 0xb5, 0x2c, 0x72, 0x4a, 0x01, 0x43, 0xcf, 0x4d, 0xf8, 0x1a, 0xd5, 0x4c, 0x05, 0x19, + 0xdf, 0x03, 0xc8, 0xdf, 0x5d, 0xe6, 0x44, 0x38, 0xb7, 0xa0, 0x6e, 0x79, 0xae, 0x95, 0xa6, 0x94, + 0x0c, 0x18, 0x3b, 0xd0, 0x2e, 0xbc, 0xd6, 0x20, 0x6f, 0x2d, 0xcf, 0x43, 0x67, 0x14, 0xd3, 0xd8, + 0x96, 0xd9, 0xb4, 0x3c, 0xef, 0xb9, 0xbc, 0x88, 0x31, 0xba, 0xe4, 0x87, 0x1e, 0x6d, 0xe6, 0x8d, + 0x80, 0x86, 0x9a, 0x4c, 0x34, 0x3e, 0x86, 0xc6, 0x66, 0x1a, 0x5f, 0xa7, 0xd7, 0xa0, 0x72, 0xd5, + 0x35, 0x30, 0x3e, 0x55, 0x7b, 0xa6, 0x67, 0x06, 0xf1, 0x40, 0x3d, 0x28, 0xc5, 0xfc, 0x7c, 0x55, + 0xc9, 0x8b, 0x12, 0xdc, 0x49, 0xbd, 0x25, 0x51, 0x67, 0x63, 0x03, 0x5a, 0x6f, 0x7c, 0xa2, 0x53, + 0x0c, 0xd0, 0x72, 0x06, 0xcc, 0x79, 0xb4, 0x33, 0x7e, 0x06, 0x90, 0x3f, 0x3c, 0xa9, 0x5b, 0xc9, + 0xb3, 0xe0, 0xad, 0xfc, 0x08, 0x5a, 0xf6, 0x89, 0xeb, 0x39, 0x91, 0xf4, 0x4b, 0xa7, 0xce, 0x9f, + 0xaa, 0x32, 0xba, 0x58, 0x82, 0x1a, 0xbd, 0xa7, 0x55, 0x73, 0x43, 0x9e, 0x3d, 0xa6, 0x11, 0xc5, + 0x38, 0x87, 0x2e, 0x87, 0xed, 0x5f, 0x23, 0xe8, 0x29, 0x9b, 0x52, 0xed, 0x92, 0x29, 0xbd, 0x0d, + 0x0d, 0xf2, 0xb5, 0xe9, 0x69, 0x14, 0x74, 0x85, 0x89, 0xfd, 0x1d, 0x0d, 0x80, 0x97, 0xde, 0x09, + 0x1c, 0x59, 0xce, 0x88, 0x2b, 0xb3, 0x19, 0xb1, 0x80, 0x5a, 0xf6, 0x54, 0xaa, 0x9b, 0xd4, 0xce, + 0xfd, 0x8f, 0xca, 0x92, 0xd9, 0xff, 0xbc, 0x0b, 0x3a, 0xc5, 0x3e, 0xee, 0x97, 0x54, 0xdf, 0xc7, + 0x05, 0x73, 0x44, 0xf1, 0xe1, 0xb0, 0x5e, 0x7e, 0x38, 0xcc, 0x5e, 0x57, 0x1a, 0x3c, 0x1b, 0xbf, + 0xae, 0xcc, 0x79, 0x28, 0xe2, 0x32, 0x45, 0x2c, 0xa3, 0x24, 0xcd, 0xb1, 0x19, 0xca, 0x12, 0x43, + 0x5d, 0xf5, 0xb5, 0xb8, 0xd0, 0xe0, 0x07, 0x63, 0x3b, 0xf0, 0x8f, 0x3c, 0xd7, 0x4e, 0xd4, 0x43, + 0x21, 0xf8, 0xc1, 0x53, 0x85, 0x31, 0x3e, 0x83, 0x4e, 0xca, 0x7f, 0x7a, 0x8f, 0xf9, 0x28, 0x4b, + 0xac, 0x2a, 0xb9, 0x6c, 0x73, 0x36, 0xad, 0x6b, 0xfd, 0x4a, 0x9a, 0x5a, 0x19, 0xff, 0x55, 0x4d, + 0x07, 0xab, 0x67, 0x85, 0x37, 0xf3, 0xb0, 0x9c, 0x1d, 0x6b, 0x5f, 0x2b, 0x3b, 0xfe, 0x3e, 0xe8, + 0x0e, 0xa5, 0x7f, 0xee, 0x59, 0xea, 0xd4, 0x06, 0xb3, 0xa9, 0x9e, 0x4a, 0x10, 0xdd, 0x33, 0x69, + 0xe6, 0x9d, 0xdf, 0x22, 0x87, 0x8c, 0xdb, 0xf5, 0x79, 0xdc, 0x6e, 0xfc, 0x8a, 0xdc, 0x7e, 0x1f, + 0x3a, 0x7e, 0xe0, 0x8f, 0xfd, 0xa9, 0xe7, 0x59, 0x87, 0x9e, 0x54, 0xec, 0x6e, 0xfb, 0x81, 0xbf, + 0xa3, 0x50, 0x18, 0x90, 0x16, 0xbb, 0xf0, 0xa5, 0x6e, 0x53, 0xbf, 0xeb, 0x85, 0x7e, 0x74, 0xf5, + 0x97, 0xa1, 0x17, 0x1c, 0xfe, 0x4c, 0xda, 0x09, 0x71, 0x6c, 0x4c, 0xb7, 0x99, 0xa3, 0xd1, 0x05, + 0xc6, 0x23, 0x8b, 0x76, 0xf0, 0x5e, 0xcf, 0x88, 0xb9, 0x7b, 0x49, 0xcc, 0x9f, 0x82, 0x9e, 0x71, + 0xa9, 0x90, 0x6a, 0xea, 0x50, 0xdf, 0xda, 0xd9, 0x18, 0xfe, 0xb8, 0x57, 0x41, 0x47, 0x69, 0x0e, + 0x5f, 0x0e, 0xcd, 0xfd, 0x61, 0x4f, 0x43, 0x27, 0xb6, 0x31, 0xdc, 0x1e, 0x8e, 0x86, 0xbd, 0x2a, + 0x47, 0x3d, 0x54, 0xf7, 0xf7, 0x5c, 0xdb, 0x4d, 0x8c, 0x7d, 0x80, 0x3c, 0x7f, 0x46, 0xab, 0x9c, + 0x6f, 0x4e, 0x95, 0xec, 0x92, 0x74, 0x5b, 0xcb, 0xd9, 0x85, 0xd4, 0xae, 0xca, 0xd2, 0x99, 0x6e, + 0xac, 0x82, 0xfe, 0xc2, 0x0a, 0x3f, 0xe7, 0x77, 0xb0, 0xfb, 0xb0, 0x10, 0x5a, 0x51, 0xe2, 0xa6, + 0x29, 0x00, 0x1b, 0xcb, 0x8e, 0xd9, 0xcd, 0xb0, 0x68, 0x7b, 0x8d, 0xbf, 0xa8, 0xc0, 0xad, 0x17, + 0xc1, 0x99, 0xcc, 0x42, 0xcc, 0x3d, 0xeb, 0xc2, 0x0b, 0x2c, 0xe7, 0x2d, 0x6a, 0x88, 0x39, 0x4c, + 0x30, 0xa5, 0x17, 0xab, 0xf4, 0x15, 0xcf, 0xd4, 0x19, 0xf3, 0x4c, 0x7d, 0x46, 0x20, 0xe3, 0x84, + 0x88, 0xca, 0x91, 0x22, 0x8c, 0xa4, 0x6f, 0x41, 0x23, 0x39, 0xf7, 0xf3, 0x47, 0xc3, 0x7a, 0x42, + 0x05, 0xe5, 0xb9, 0x11, 0x67, 0x7d, 0x7e, 0xc4, 0x69, 0x3c, 0x05, 0x7d, 0x74, 0x4e, 0xc5, 0xd6, + 0x69, 0x5c, 0x0a, 0x70, 0x2a, 0x6f, 0x08, 0x70, 0xb4, 0x99, 0x00, 0xe7, 0xdf, 0x2b, 0xd0, 0x2e, + 0x84, 0xce, 0xe2, 0x7d, 0xa8, 0x25, 0xe7, 0x7e, 0xf9, 0x69, 0x3e, 0x5d, 0xc4, 0x24, 0xd2, 0xa5, + 0x82, 0xa2, 0x76, 0xa9, 0xa0, 0x28, 0xb6, 0xe1, 0x3a, 0x5b, 0xde, 0xf4, 0x10, 0x69, 0x15, 0xe6, + 0xde, 0x4c, 0xa8, 0xce, 0x05, 0xe9, 0xf4, 0x48, 0xaa, 0xb4, 0xb0, 0x70, 0x5c, 0x42, 0x0e, 0xd6, + 0xe0, 0xe6, 0x9c, 0x6e, 0xdf, 0xe4, 0x21, 0xc2, 0x58, 0x84, 0xee, 0xe8, 0xdc, 0x1f, 0xb9, 0x13, + 0x19, 0x27, 0xd6, 0x24, 0xa4, 0x00, 0x51, 0x79, 0xce, 0x9a, 0xa9, 0x25, 0xb1, 0xf1, 0x1d, 0xe8, + 0xec, 0x49, 0x19, 0x99, 0x32, 0x0e, 0x03, 0x9f, 0x83, 0x23, 0x55, 0x08, 0x66, 0x37, 0xad, 0x20, + 0xe3, 0xb7, 0x40, 0x37, 0xad, 0xa3, 0x64, 0xdd, 0x4a, 0xec, 0x93, 0x6f, 0x52, 0x67, 0xf8, 0x0e, + 0x34, 0x43, 0xd6, 0x29, 0x95, 0x50, 0x75, 0xc8, 0x5d, 0x2b, 0x3d, 0x33, 0x53, 0xa2, 0xf1, 0x04, + 0x6e, 0xee, 0x4f, 0x0f, 0x63, 0x3b, 0x72, 0x29, 0x37, 0x4d, 0x5d, 0xd9, 0x00, 0x5a, 0x61, 0x24, + 0x8f, 0xdc, 0x73, 0x99, 0x6a, 0x70, 0x06, 0x1b, 0x3f, 0x80, 0x5b, 0xe5, 0x21, 0xea, 0x08, 0xf7, + 0xa0, 0x7a, 0x7a, 0x16, 0xab, 0x9d, 0xdd, 0x28, 0x65, 0x66, 0xf4, 0x22, 0x8e, 0x54, 0xc3, 0x84, + 0xea, 0xce, 0x74, 0x52, 0xfc, 0xaa, 0xa7, 0xc6, 0x5f, 0xf5, 0xdc, 0x29, 0x96, 0x59, 0x39, 0x0b, + 0xc9, 0xcb, 0xa9, 0xef, 0x82, 0x7e, 0x14, 0x44, 0xbf, 0xb0, 0x22, 0x47, 0x3a, 0xca, 0x67, 0xe5, + 0x08, 0xe3, 0xa7, 0xd0, 0x4e, 0x35, 0x61, 0xcb, 0xa1, 0xd7, 0x3d, 0x52, 0xc5, 0x2d, 0xa7, 0xa4, + 0x99, 0x5c, 0x95, 0x94, 0xbe, 0xb3, 0x95, 0xaa, 0x10, 0x03, 0xe5, 0x95, 0xd5, 0x93, 0x4b, 0xba, + 0xb2, 0xb1, 0x09, 0x9d, 0x34, 0x7f, 0x7b, 0x21, 0x13, 0x8b, 0x94, 0xdb, 0x73, 0xa5, 0x5f, 0x50, + 0xfc, 0x16, 0x23, 0x46, 0xe5, 0xc2, 0xa1, 0x56, 0x0a, 0x00, 0x8c, 0x15, 0x68, 0xa8, 0x9b, 0x23, + 0xa0, 0x66, 0x07, 0x0e, 0xdf, 0xee, 0xba, 0x49, 0x6d, 0x64, 0xc7, 0x24, 0x3e, 0x4e, 0x83, 0x9b, + 0x49, 0x7c, 0x6c, 0xfc, 0x95, 0x06, 0xdd, 0x75, 0xca, 0x96, 0x53, 0x91, 0x14, 0x6a, 0x44, 0x95, + 0x52, 0x8d, 0xa8, 0x58, 0x0f, 0xd2, 0x4a, 0xf5, 0xa0, 0xd2, 0x86, 0xaa, 0xe5, 0x88, 0xe4, 0x1d, + 0x68, 0x4e, 0x7d, 0xf7, 0x3c, 0x35, 0x09, 0xba, 0xd9, 0x40, 0x70, 0x14, 0x8b, 0x25, 0x68, 0xa3, + 0xd5, 0x70, 0x7d, 0xae, 0xc1, 0x70, 0x21, 0xa5, 0x88, 0x9a, 0xa9, 0xb4, 0x34, 0xde, 0x5c, 0x69, + 0x69, 0xbe, 0xb5, 0xd2, 0xd2, 0x7a, 0x5b, 0xa5, 0x45, 0x9f, 0xad, 0xb4, 0x94, 0xa3, 0x29, 0x98, + 0x8d, 0xa6, 0x8c, 0x6d, 0x58, 0x48, 0x79, 0xa7, 0x74, 0xf3, 0x33, 0xb8, 0xae, 0x8a, 0xa4, 0x32, + 0x52, 0x75, 0x06, 0xb6, 0x38, 0x37, 0xa8, 0x4c, 0x4b, 0x75, 0x4c, 0x45, 0x31, 0x17, 0x9c, 0x22, + 0x18, 0x1b, 0xbf, 0x57, 0x81, 0x6e, 0xa9, 0x87, 0x78, 0x92, 0x97, 0x5c, 0x2b, 0xe4, 0xd8, 0xfb, + 0x97, 0x66, 0x79, 0x73, 0xd9, 0x55, 0x9b, 0x29, 0xbb, 0x1a, 0xf7, 0xb3, 0x62, 0xaa, 0x2a, 0xa1, + 0x5e, 0xcb, 0x4a, 0xa8, 0x54, 0x75, 0x5c, 0x1b, 0x8d, 0xcc, 0x9e, 0x66, 0xfc, 0x91, 0x06, 0xdd, + 0xe1, 0x79, 0x48, 0xdf, 0xa0, 0xbc, 0x35, 0xe6, 0x2c, 0x28, 0x8c, 0x56, 0x52, 0x98, 0x82, 0xe8, + 0xab, 0xea, 0xb5, 0x88, 0x45, 0x8f, 0x51, 0x28, 0x17, 0x74, 0x94, 0x4a, 0x30, 0xf4, 0x7f, 0x40, + 0x25, 0x50, 0xe4, 0x29, 0x63, 0x94, 0xc8, 0xbf, 0xd6, 0x3d, 0xe3, 0xef, 0xc7, 0xbc, 0xac, 0xbc, + 0xc1, 0x80, 0xf1, 0x07, 0x1a, 0xe8, 0xac, 0x41, 0xb8, 0xbd, 0xef, 0xaa, 0x08, 0xba, 0x92, 0x97, + 0x92, 0x33, 0xe2, 0xca, 0x73, 0x79, 0x41, 0x91, 0x1f, 0x07, 0xd6, 0xf3, 0x1e, 0x5c, 0x54, 0x11, + 0x84, 0xf3, 0x3e, 0x2a, 0x82, 0xdc, 0x01, 0x9d, 0x9d, 0xe7, 0xd4, 0x4d, 0x9f, 0x80, 0xd9, 0x9b, + 0x1e, 0xb8, 0xf4, 0xd9, 0x4d, 0x22, 0xa3, 0x89, 0xe2, 0x32, 0xb5, 0xcb, 0x11, 0x76, 0x57, 0xc5, + 0x7c, 0xc6, 0x09, 0x34, 0xd5, 0xea, 0x18, 0x02, 0x1d, 0xec, 0x3c, 0xdf, 0xd9, 0xfd, 0xd1, 0x4e, + 0x49, 0x73, 0xb2, 0x20, 0x49, 0x2b, 0x06, 0x49, 0x55, 0xc4, 0x3f, 0xdd, 0x3d, 0xd8, 0x19, 0xf5, + 0x6a, 0xa2, 0x0b, 0x3a, 0x35, 0xc7, 0xe6, 0xf0, 0x65, 0xaf, 0x4e, 0xf5, 0x80, 0xa7, 0x9f, 0x0f, + 0x5f, 0xac, 0xf5, 0x1a, 0x59, 0xe9, 0xbe, 0x69, 0xfc, 0x69, 0x05, 0x6e, 0xf0, 0x91, 0x8b, 0x09, + 0x72, 0xf1, 0xdb, 0xcd, 0x1a, 0x7f, 0xbb, 0xf9, 0xeb, 0xcd, 0x89, 0x71, 0xd0, 0xd4, 0x4d, 0x9f, + 0xc7, 0xb8, 0x78, 0xd3, 0x9a, 0xba, 0xea, 0x55, 0xec, 0xef, 0x2a, 0x30, 0xe0, 0xd8, 0xec, 0x59, + 0x64, 0x85, 0x27, 0x3f, 0xdc, 0xbe, 0x94, 0x9d, 0x5d, 0x15, 0xb1, 0xdc, 0x87, 0x05, 0xfa, 0xba, + 0xf5, 0xe7, 0xde, 0x58, 0x65, 0x10, 0x2c, 0xbf, 0xae, 0xc2, 0xf2, 0x44, 0xe2, 0x13, 0xe8, 0xf0, + 0x57, 0xb0, 0x54, 0x30, 0x2c, 0x3d, 0xf4, 0x94, 0x22, 0xc3, 0x36, 0xf7, 0xa2, 0x27, 0x27, 0xf1, + 0x24, 0x1b, 0x94, 0x27, 0x72, 0x97, 0xdf, 0x72, 0xd4, 0x90, 0x11, 0xa5, 0x77, 0x8f, 0xe0, 0xce, + 0xdc, 0x73, 0x28, 0xc5, 0x2e, 0x14, 0xd5, 0x58, 0x9f, 0x56, 0xff, 0xb6, 0x02, 0x35, 0x8c, 0x02, + 0xc4, 0x43, 0xd0, 0x3f, 0x97, 0x56, 0x94, 0x1c, 0x4a, 0x2b, 0x11, 0x25, 0x8f, 0x3f, 0xa0, 0x15, + 0xf3, 0xf7, 0x6a, 0xe3, 0xda, 0xe3, 0x8a, 0x58, 0xe1, 0x0f, 0xd3, 0xd2, 0xef, 0xed, 0xba, 0x69, + 0x34, 0x41, 0xd1, 0xc6, 0xa0, 0x34, 0xde, 0xb8, 0xb6, 0x4c, 0xfd, 0xbf, 0x08, 0x5c, 0xff, 0x29, + 0x7f, 0x47, 0x25, 0x66, 0xa3, 0x8f, 0xd9, 0x11, 0xe2, 0x21, 0x34, 0xb6, 0x62, 0x0c, 0x73, 0x2e, + 0x77, 0x25, 0xae, 0x15, 0x23, 0x20, 0xe3, 0xda, 0xea, 0x9f, 0x55, 0xa1, 0xf6, 0x53, 0x19, 0x05, + 0xe2, 0x63, 0x68, 0xaa, 0xd7, 0x7d, 0x51, 0x78, 0xc5, 0x1f, 0x50, 0xc6, 0x35, 0xf3, 0xec, 0x4f, + 0xab, 0xf4, 0x98, 0x5d, 0x79, 0x99, 0x57, 0xe4, 0x1f, 0x1f, 0x5c, 0xda, 0xd4, 0xa7, 0xd0, 0xdb, + 0x4f, 0x22, 0x69, 0x4d, 0x0a, 0xdd, 0xcb, 0xac, 0x9a, 0x57, 0x33, 0x26, 0x7e, 0x3d, 0x80, 0x06, + 0xc7, 0x92, 0x33, 0x03, 0x66, 0x0b, 0xc2, 0xd4, 0xf9, 0x43, 0x68, 0xef, 0x9f, 0x04, 0x53, 0xcf, + 0xd9, 0x97, 0xd1, 0x99, 0x14, 0x85, 0x2f, 0x7a, 0x06, 0x85, 0xb6, 0x71, 0x4d, 0x2c, 0x03, 0x70, + 0xf8, 0x72, 0x80, 0x17, 0xa8, 0x89, 0xb4, 0x9d, 0xe9, 0x84, 0x27, 0x2d, 0xc4, 0x35, 0xdc, 0xb3, + 0x10, 0x52, 0xbe, 0xa9, 0xe7, 0x27, 0xd0, 0x7d, 0x4a, 0x97, 0x69, 0x37, 0x5a, 0x3b, 0x0c, 0xa2, + 0x44, 0xcc, 0x7e, 0xd5, 0x33, 0x98, 0x45, 0x18, 0xd7, 0xc4, 0x63, 0x68, 0x8d, 0xa2, 0x0b, 0xee, + 0x7f, 0x43, 0x45, 0xe2, 0xf9, 0x7a, 0x73, 0x4e, 0xb9, 0xfa, 0x3f, 0x35, 0x68, 0xfc, 0x28, 0x88, + 0x4e, 0x65, 0x84, 0xd9, 0x37, 0x95, 0xeb, 0x95, 0x1a, 0x65, 0xa5, 0xfb, 0x79, 0x0b, 0x7d, 0x00, + 0x3a, 0x31, 0x65, 0x64, 0xc5, 0xa7, 0x2c, 0x2a, 0xfa, 0x9c, 0x9a, 0xf9, 0xc2, 0xd9, 0x3c, 0xc9, + 0x75, 0x81, 0x05, 0x95, 0x3d, 0x67, 0x95, 0xca, 0xe9, 0x03, 0x3a, 0xff, 0xf3, 0x97, 0xfb, 0xa8, + 0x9a, 0x8f, 0x2b, 0x68, 0xa5, 0xf7, 0xf9, 0xa4, 0xd8, 0x29, 0xff, 0x8c, 0x94, 0x35, 0x3f, 0xff, + 0x6e, 0xd3, 0xb8, 0x26, 0x1e, 0x41, 0x43, 0x5d, 0xe9, 0x1b, 0xf9, 0xe5, 0x55, 0x76, 0x62, 0xd0, + 0x2b, 0xa2, 0xd4, 0x80, 0x27, 0xd0, 0x60, 0xf3, 0xc7, 0x03, 0x4a, 0x81, 0xd9, 0x40, 0x14, 0x51, + 0xa9, 0x32, 0x8b, 0x07, 0xd0, 0x54, 0xc5, 0x78, 0x31, 0xa7, 0x32, 0xcf, 0x47, 0xe5, 0x88, 0x90, + 0xe7, 0x67, 0xef, 0xc5, 0xf3, 0x97, 0x5c, 0x3c, 0xcf, 0x5f, 0x76, 0x6e, 0xac, 0xf5, 0xa6, 0xb4, + 0xa5, 0x5b, 0x48, 0x22, 0x45, 0xca, 0x91, 0x39, 0x57, 0xf7, 0x53, 0xe8, 0x96, 0x12, 0x4e, 0x41, + 0x21, 0xcb, 0xbc, 0x1c, 0xf4, 0xd2, 0x85, 0xf9, 0x01, 0xe8, 0x2a, 0xde, 0x3f, 0x94, 0x82, 0x6a, + 0xec, 0x73, 0x32, 0x86, 0xc1, 0xe5, 0x80, 0x9f, 0x6e, 0xc1, 0x8f, 0xe1, 0xe6, 0x1c, 0x5b, 0x26, + 0xe8, 0x63, 0xa9, 0xab, 0x8d, 0xf5, 0x60, 0xf1, 0x4a, 0x7a, 0xca, 0x80, 0xf5, 0xde, 0xdf, 0x7f, + 0x75, 0xb7, 0xf2, 0x4f, 0x5f, 0xdd, 0xad, 0xfc, 0xeb, 0x57, 0x77, 0x2b, 0xbf, 0xfc, 0xb7, 0xbb, + 0xd7, 0x0e, 0x1b, 0xf4, 0xd7, 0x82, 0x4f, 0xfe, 0x37, 0x00, 0x00, 0xff, 0xff, 0x22, 0xa8, 0x8d, + 0xae, 0xd0, 0x30, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -7728,13 +7712,6 @@ func (m *ZeroProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x4a } - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintPb(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0x42 - } if m.Txn != nil { { size, err := m.Txn.MarshalToSizedBuffer(dAtA[:i]) @@ -8744,13 +8721,6 @@ func (m *Proposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x42 } - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintPb(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0x3a - } if len(m.CleanPredicate) > 0 { i -= len(m.CleanPredicate) copy(dAtA[i:], m.CleanPredicate) @@ -11394,10 +11364,6 @@ func (m *ZeroProposal) Size() (n int) { l = m.Txn.Size() n += 1 + l + sovPb(uint64(l)) } - l = len(m.Key) - if l > 0 { - n += 1 + l + sovPb(uint64(l)) - } l = len(m.Cid) if l > 0 { n += 1 + l + sovPb(uint64(l)) @@ -11864,10 +11830,6 @@ func (m *Proposal) Size() (n int) { if l > 0 { n += 1 + l + sovPb(uint64(l)) } - l = len(m.Key) - if l > 0 { - n += 1 + l + sovPb(uint64(l)) - } if m.Delta != nil { l = m.Delta.Size() n += 1 + l + sovPb(uint64(l)) @@ -15655,38 +15617,6 @@ func (m *ZeroProposal) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPb - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthPb - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthPb - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Key = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex case 9: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Cid", wireType) @@ -18745,38 +18675,6 @@ func (m *Proposal) Unmarshal(dAtA []byte) error { } m.CleanPredicate = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPb - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthPb - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthPb - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Key = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex case 8: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Delta", wireType) diff --git a/worker/draft.go b/worker/draft.go index e3f65858719..4b1b6a63b16 100644 --- a/worker/draft.go +++ b/worker/draft.go @@ -19,6 +19,7 @@ package worker import ( "bytes" "context" + "encoding/binary" "encoding/hex" "fmt" "sort" @@ -58,7 +59,7 @@ type node struct { *conn.Node // Fields which are never changed after init. - applyCh chan []*pb.Proposal + applyCh chan []raftpb.Entry ctx context.Context gid uint32 closer *z.Closer @@ -242,7 +243,7 @@ func newNode(store *raftwal.DiskStorage, gid uint32, id uint64, myAddr string) * // We need a generous size for applyCh, because raft.Tick happens every // 10ms. If we restrict the size here, then Raft goes into a loop trying // to maintain quorum health. - applyCh: make(chan []*pb.Proposal, 1000), + applyCh: make(chan []raftpb.Entry, 1000), elog: trace.NewEventLog("Dgraph", "ApplyCh"), closer: z.NewCloser(4), // Matches CLOSER:1 ops: make(map[op]*z.Closer), @@ -253,7 +254,7 @@ func newNode(store *raftwal.DiskStorage, gid uint32, id uint64, myAddr string) * return n } -func (n *node) Ctx(key string) context.Context { +func (n *node) Ctx(key uint64) context.Context { if pctx := n.Proposals.Get(key); pctx != nil { return pctx.Ctx } @@ -535,11 +536,11 @@ func (n *node) applyMutations(ctx context.Context, proposal *pb.Proposal) (rerr return nil } -func (n *node) applyCommitted(proposal *pb.Proposal) error { - ctx := n.Ctx(proposal.Key) +func (n *node) applyCommitted(proposal *pb.Proposal, key uint64) error { + ctx := n.Ctx(key) span := otrace.FromContext(ctx) - span.Annotatef(nil, "node.applyCommitted Node id: %d. Group id: %d. Got proposal key: %s", - n.Id, n.gid, proposal.Key) + span.Annotatef(nil, "node.applyCommitted Node id: %d. Group id: %d. Got proposal key: %d", + n.Id, n.gid, key) if proposal.Mutations != nil { // syncmarks for this shouldn't be marked done until it's committed. @@ -558,7 +559,7 @@ func (n *node) applyCommitted(proposal *pb.Proposal) error { return populateKeyValues(ctx, proposal.Kv) case proposal.State != nil: - n.elog.Printf("Applying state for key: %s", proposal.Key) + n.elog.Printf("Applying state for key: %s", key) // This state needn't be snapshotted in this group, on restart we would fetch // a state which is latest or equal to this. groups().applyState(proposal.State) @@ -585,8 +586,8 @@ func (n *node) applyCommitted(proposal *pb.Proposal) error { return posting.DeletePredicate(ctx, proposal.CleanPredicate) case proposal.Delta != nil: - n.elog.Printf("Applying Oracle Delta for key: %s", proposal.Key) - return n.commitOrAbort(proposal.Key, proposal.Delta) + n.elog.Printf("Applying Oracle Delta for key: %d", key) + return n.commitOrAbort(key, proposal.Delta) case proposal.Snapshot != nil: existing, err := n.Store.Snapshot() @@ -637,7 +638,7 @@ func (n *node) applyCommitted(proposal *pb.Proposal) error { // Call commitOrAbort to update the group checksums. ts := proposal.Restore.RestoreTs - return n.commitOrAbort(proposal.Key, &pb.OracleDelta{ + return n.commitOrAbort(key, &pb.OracleDelta{ Txns: []*pb.TxnStatus{ {StartTs: ts, CommitTs: ts}, }, @@ -670,17 +671,24 @@ func (n *node) processApplyCh() { size int seen time.Time } - previous := make(map[string]*P) + previous := make(map[uint64]*P) // This function must be run serially. - handle := func(proposals []*pb.Proposal) { + handle := func(entries []raftpb.Entry) { var totalSize int64 - for _, proposal := range proposals { + for _, entry := range entries { + x.AssertTrue(len(entry.Data) > 0) + // We use the size as a double check to ensure that we're // working with the same proposal as before. - psz := proposal.Size() + psz := entry.Size() totalSize += int64(psz) + var proposal pb.Proposal + key := binary.BigEndian.Uint64(entry.Data[:8]) + x.Check(proposal.Unmarshal(entry.Data[8:])) + proposal.Index = entry.Index + // Ignore the start ts in case of ludicrous mode. We get a new ts and use that as the // commit ts. if x.WorkerConfig.LudicrousMode && proposal.Mutations != nil { @@ -688,25 +696,25 @@ func (n *node) processApplyCh() { } var perr error - p, ok := previous[proposal.Key] + p, ok := previous[key] if ok && p.err == nil && p.size == psz { n.elog.Printf("Proposal with key: %s already applied. Skipping index: %d.\n", - proposal.Key, proposal.Index) - previous[proposal.Key].seen = time.Now() // Update the ts. + key, proposal.Index) + previous[key].seen = time.Now() // Update the ts. // Don't break here. We still need to call the Done below. } else { start := time.Now() - perr = n.applyCommitted(proposal) - if len(proposal.Key) > 0 { + perr = n.applyCommitted(&proposal, key) + if key != 0 { p := &P{err: perr, size: psz, seen: time.Now()} - previous[proposal.Key] = p + previous[key] = p } if perr != nil { glog.Errorf("Applying proposal. Error: %v. Proposal: %q.", perr, proposal) } - n.elog.Printf("Applied proposal with key: %s, index: %d. Err: %v", - proposal.Key, proposal.Index, perr) + n.elog.Printf("Applied proposal with key: %d, index: %d. Err: %v", + key, proposal.Index, perr) var tags []tag.Mutator switch { @@ -719,7 +727,7 @@ func (n *node) processApplyCh() { _ = ostats.RecordWithTags(context.Background(), tags, x.LatencyMs.M(ms)) } - n.Proposals.Done(proposal.Key, perr) + n.Proposals.Done(key, perr) n.Applied.Done(proposal.Index) ostats.Record(context.Background(), x.RaftAppliedIndex.M(int64(n.Applied.DoneUntil()))) } @@ -753,7 +761,7 @@ func (n *node) processApplyCh() { } // TODO(Anurag - 4 May 2020): Are we using pkey? Remove if unused. -func (n *node) commitOrAbort(pkey string, delta *pb.OracleDelta) error { +func (n *node) commitOrAbort(pkey uint64, delta *pb.OracleDelta) error { // First let's commit all mutations to disk. writer := posting.NewTxnWriter(pstore) toDisk := func(start, commit uint64) { @@ -900,13 +908,15 @@ func (n *node) proposeSnapshot(discardN int) error { Snapshot: snap, } glog.V(2).Infof("Proposing snapshot: %+v\n", snap) - data, err := proposal.Marshal() + data := make([]byte, 8+proposal.Size()) + sz, err := proposal.MarshalToSizedBuffer(data[8:]) + data = data[:8+sz] x.Check(err) return n.Raft().Propose(n.ctx, data) } const ( - maxPendingSize int64 = 64 << 20 // in bytes. + maxPendingSize int64 = 256 << 20 // in bytes. nodeApplyChan = "pushing to raft node applyCh" ) @@ -1027,11 +1037,12 @@ func (n *node) drainApplyChan() { numDrained := 0 for { select { - case proposals := <-n.applyCh: - numDrained += len(proposals) - for _, proposal := range proposals { - n.Proposals.Done(proposal.Key, nil) - n.Applied.Done(proposal.Index) + case entries := <-n.applyCh: + numDrained += len(entries) + for _, entry := range entries { + key := binary.BigEndian.Uint64(entry.Data[:8]) + n.Proposals.Done(key, nil) + n.Applied.Done(entry.Index) } default: glog.Infof("Drained %d proposals\n", numDrained) @@ -1197,7 +1208,7 @@ func (n *node) Run() { } // Now schedule or apply committed entries. - var proposals []*pb.Proposal + var entries []raftpb.Entry for _, entry := range rd.CommittedEntries { // Need applied watermarks for schema mutation also for read linearazibility // Applied watermarks needs to be emitted as soon as possible sequentially. @@ -1220,40 +1231,46 @@ func (n *node) Run() { n.elog.Printf("Skipping over already applied entry: %d", entry.Index) n.Applied.Done(entry.Index) default: - proposal := &pb.Proposal{} - if err := proposal.Unmarshal(entry.Data); err != nil { - glog.Errorf("Unable to unmarshal proposal: %v %x\n", err, entry.Data) - break - } - if pctx := n.Proposals.Get(proposal.Key); pctx != nil { + key := binary.BigEndian.Uint64(entry.Data[:8]) + if pctx := n.Proposals.Get(key); pctx != nil { atomic.AddUint32(&pctx.Found, 1) if span := otrace.FromContext(pctx.Ctx); span != nil { span.Annotate(nil, "Proposal found in CommittedEntries") } - if x.WorkerConfig.LudicrousMode && len(proposal.Mutations.GetEdges()) > 0 { - // Assuming that there will be no error while applying. But this - // assumption is only made for data mutations and not schema mutations. - n.Proposals.Done(proposal.Key, nil) + if x.WorkerConfig.LudicrousMode { + var p pb.Proposal + if err := p.Unmarshal(entry.Data[8:]); err != nil { + glog.Errorf("Unable to unmarshal proposal: %v %x\n", + err, entry.Data) + break + } + if len(p.Mutations.GetEdges()) > 0 { + // Assuming that there will be no error while applying. But this + // assumption is only made for data mutations and not schema + // mutations. + // TODO: This should not be done here. Instead, it should be done + // within the ludicrous mode scheduler. + n.Proposals.Done(key, nil) + } } } - proposal.Index = entry.Index - proposals = append(proposals, proposal) + entries = append(entries, entry) } } // Send the whole lot to applyCh in one go, instead of sending proposals one by one. - if len(proposals) > 0 { + if len(entries) > 0 { // Apply the meter this before adding size to pending size so some crazy big // proposal can be pushed to applyCh. If this do this after adding its size to // pending size, we could block forever in rampMeter. rampMeter(&n.pendingSize, maxPendingSize, nodeApplyChan) var pendingSize int64 - for _, p := range proposals { - pendingSize += int64(p.Size()) + for _, e := range entries { + pendingSize += int64(e.Size()) } if sz := atomic.AddInt64(&n.pendingSize, pendingSize); sz > 2*maxPendingSize { glog.Warningf("Inflight proposal size: %d. There would be some throttling.", sz) } - n.applyCh <- proposals + n.applyCh <- entries } if span != nil { @@ -1546,11 +1563,11 @@ func (n *node) calculateSnapshot(startIdx uint64, discardN int) (*pb.Snapshot, e batchFirst = lastEntry.Index + 1 for _, entry := range entries { - if entry.Type != raftpb.EntryNormal { + if entry.Type != raftpb.EntryNormal || len(entry.Data) == 0 { continue } var proposal pb.Proposal - if err := proposal.Unmarshal(entry.Data); err != nil { + if err := proposal.Unmarshal(entry.Data[8:]); err != nil { span.Annotatef(nil, "Error: %v", err) return nil, err } diff --git a/worker/draft_test.go b/worker/draft_test.go index 9fc15f6a98b..9d1fa72ec0f 100644 --- a/worker/draft_test.go +++ b/worker/draft_test.go @@ -31,8 +31,10 @@ import ( func getEntryForMutation(index, startTs uint64) raftpb.Entry { proposal := pb.Proposal{Mutations: &pb.Mutations{StartTs: startTs}} - data, err := proposal.Marshal() + data := make([]byte, 8+proposal.Size()) + sz, err := proposal.MarshalToSizedBuffer(data) x.Check(err) + data = data[:8+sz] return raftpb.Entry{Index: index, Term: 1, Type: raftpb.EntryNormal, Data: data} } @@ -40,8 +42,10 @@ func getEntryForCommit(index, startTs, commitTs uint64) raftpb.Entry { delta := &pb.OracleDelta{} delta.Txns = append(delta.Txns, &pb.TxnStatus{StartTs: startTs, CommitTs: commitTs}) proposal := pb.Proposal{Delta: delta} - data, err := proposal.Marshal() + data := make([]byte, 8+proposal.Size()) + sz, err := proposal.MarshalToSizedBuffer(data) x.Check(err) + data = data[:8+sz] return raftpb.Entry{Index: index, Term: 1, Type: raftpb.EntryNormal, Data: data} } diff --git a/worker/proposal.go b/worker/proposal.go index 4610ca2e7fb..ed3e84c07b5 100644 --- a/worker/proposal.go +++ b/worker/proposal.go @@ -18,7 +18,7 @@ package worker import ( "context" - "fmt" + "encoding/binary" "sync" "sync/atomic" "time" @@ -109,8 +109,8 @@ func (rl *rateLimiter) decr(retry int) { } // uniqueKey is meant to be unique across all the replicas. -func uniqueKey() string { - return fmt.Sprintf("%02d-%d", groups().Node.Id, groups().Node.Rand.Uint64()) +func uniqueKey() uint64 { + return uint64(groups().Node.Id)<<32 | uint64(groups().Node.Rand.Uint32()) } var errInternalRetry = errors.New("Retry Raft proposal internally") @@ -195,9 +195,17 @@ func (n *node) proposeAndWait(ctx context.Context, proposal *pb.Proposal) (perr // have this shared key. Thus, each server in the group can identify // whether it has already done this work, and if so, skip it. key := uniqueKey() - proposal.Key = key - span := otrace.FromContext(ctx) + data := make([]byte, 8+proposal.Size()) + binary.BigEndian.PutUint64(data, key) + sz, err := proposal.MarshalToSizedBuffer(data[8:]) + if err != nil { + return err + } + // Trim data to the new size after Marshal. + data = data[:8+sz] + + span := otrace.FromContext(ctx) stop := x.SpanTimer(span, "n.proposeAndWait") defer stop() @@ -210,14 +218,11 @@ func (n *node) proposeAndWait(ctx context.Context, proposal *pb.Proposal) (perr ErrCh: errCh, Ctx: cctx, } - x.AssertTruef(n.Proposals.Store(key, pctx), "Found existing proposal with key: [%v]", key) + x.AssertTruef(n.Proposals.Store(key, pctx), "Found existing proposal with key: [%x]", key) defer n.Proposals.Delete(key) // Ensure that it gets deleted on return. - span.Annotatef(nil, "Proposing with key: %s. Timeout: %v", key, timeout) - data, err := proposal.Marshal() - if err != nil { - return err - } + span.Annotatef(nil, "Proposing with key: %d. Timeout: %v", key, timeout) + if err = n.Raft().Propose(cctx, data); err != nil { return errors.Wrapf(err, "While proposing") }