diff --git a/account/mock_test.go b/account/mock_test.go index f8c9d00bc..dfb7be82e 100644 --- a/account/mock_test.go +++ b/account/mock_test.go @@ -214,8 +214,7 @@ func (a *mockAuctioneer) SubscribeAccountUpdates(_ context.Context, func (a *mockAuctioneer) Terms(context.Context) (*terms.AuctioneerTerms, error) { return &terms.AuctioneerTerms{ - MaxAccountValue: maxAccountValue, - MaxOrderDuration: maxAccountExpiry, + MaxAccountValue: maxAccountValue, }, nil } diff --git a/auctioneer/account_subscription.go b/auctioneer/account_subscription.go index 7f6592dc8..f31eb9c02 100644 --- a/auctioneer/account_subscription.go +++ b/auctioneer/account_subscription.go @@ -50,7 +50,7 @@ func (s *acctSubscription) authenticate(ctx context.Context) error { Msg: &poolrpc.ClientAuctionMessage_Commit{ Commit: &poolrpc.AccountCommitment{ CommitHash: s.commitHash[:], - BatchVersion: uint32(order.CurrentVersion), + BatchVersion: uint32(order.CurrentBatchVersion), }, }, }) diff --git a/auctioneer/client.go b/auctioneer/client.go index 5f980b40e..bed3c5479 100644 --- a/auctioneer/client.go +++ b/auctioneer/client.go @@ -1162,14 +1162,13 @@ func (c *Client) Terms(ctx context.Context) (*terms.AuctioneerTerms, error) { } return &terms.AuctioneerTerms{ - MaxAccountValue: btcutil.Amount(resp.MaxAccountValue), - MaxOrderDuration: resp.MaxOrderDurationBlocks, - OrderExecBaseFee: btcutil.Amount(resp.ExecutionFee.BaseFee), - OrderExecFeeRate: btcutil.Amount(resp.ExecutionFee.FeeRate), - LeaseDurations: resp.LeaseDurations, - NextBatchConfTarget: resp.NextBatchConfTarget, - NextBatchFeeRate: chainfee.SatPerKWeight(resp.NextBatchFeeRateSatPerKw), - NextBatchClear: time.Unix(int64(resp.NextBatchClearTimestamp), 0), + MaxAccountValue: btcutil.Amount(resp.MaxAccountValue), + OrderExecBaseFee: btcutil.Amount(resp.ExecutionFee.BaseFee), + OrderExecFeeRate: btcutil.Amount(resp.ExecutionFee.FeeRate), + LeaseDurationBuckets: resp.LeaseDurationBuckets, + NextBatchConfTarget: resp.NextBatchConfTarget, + NextBatchFeeRate: chainfee.SatPerKWeight(resp.NextBatchFeeRateSatPerKw), + NextBatchClear: time.Unix(int64(resp.NextBatchClearTimestamp), 0), }, nil } diff --git a/clientdb/batch_snapshot.go b/clientdb/batch_snapshot.go index 3eb25be3f..f4209afb3 100644 --- a/clientdb/batch_snapshot.go +++ b/clientdb/batch_snapshot.go @@ -65,8 +65,9 @@ type LocalBatchSnapshot struct { // BatchID is the batch's unique ID. BatchID order.BatchID - // ClearingPrice is the fixed rate the orders were cleared at. - ClearingPrice order.FixedRatePremium + // ClearingPrices is a map of the lease duration markets and the fixed + // rate the orders were cleared at within that market. + ClearingPrices map[uint32]order.FixedRatePremium // ExecutionFee is the FeeSchedule that was used by the server to // calculate the execution fee. @@ -120,7 +121,7 @@ func NewSnapshot(batch *order.Batch, ourOrders []order.Order, snapshot := &LocalBatchSnapshot{ Version: batch.Version, BatchID: batch.ID, - ClearingPrice: batch.ClearingPrice, + ClearingPrices: batch.ClearingPrices, ExecutionFee: *feeSched, BatchTX: batch.BatchTX, BatchTxFeeRate: batch.BatchTxFeeRate, @@ -398,8 +399,12 @@ func getSnapshotBuckets(tx *bbolt.Tx) (*bbolt.Bucket, *bbolt.Bucket, } func serializeLocalBatchSnapshot(w io.Writer, b *LocalBatchSnapshot) error { + // The previous batch versions had a single clearing price but because + // we now always store the price map afterwards, we signal a new batch + // by storing an explicit zero price. + var zeroPrice order.FixedRatePremium err := WriteElements( - w, uint32(b.Version), b.BatchID[:], b.ClearingPrice, + w, b.Version, b.BatchID[:], zeroPrice, b.ExecutionFee, b.BatchTX, b.BatchTxFeeRate, ) if err != nil { @@ -442,22 +447,37 @@ func serializeLocalBatchSnapshot(w io.Writer, b *LocalBatchSnapshot) error { } } + // New batch versions have an additional map of duration->price that we + // need to serialize. Since both values are uint32 this is pretty + // straightforward. + numPrices := uint32(len(b.ClearingPrices)) + err = WriteElements(w, numPrices) + if err != nil { + return err + } + for duration, price := range b.ClearingPrices { + err = WriteElements(w, duration, price) + if err != nil { + return err + } + } + return nil } func deserializeLocalBatchSnapshot(r io.Reader) (*LocalBatchSnapshot, error) { - b := &LocalBatchSnapshot{} - var version uint32 + b := &LocalBatchSnapshot{ + ClearingPrices: make(map[uint32]order.FixedRatePremium), + } + var clearingPrice order.FixedRatePremium err := ReadElements( - r, &version, b.BatchID[:], &b.ClearingPrice, &b.ExecutionFee, + r, &b.Version, b.BatchID[:], &clearingPrice, &b.ExecutionFee, &b.BatchTX, &b.BatchTxFeeRate, ) if err != nil { return nil, err } - b.Version = order.BatchVersion(version) - b.Accounts, err = deserializeAccounts(r) if err != nil { return nil, err @@ -484,6 +504,34 @@ func deserializeLocalBatchSnapshot(r io.Reader) (*LocalBatchSnapshot, error) { b.MatchedOrders[nonce] = append(b.MatchedOrders[nonce], m) } + // Older batches had a single clearing price instead of a map. If we + // have a non-zero price, it means this is an old snapshot and we don't + // need to read any further. + if clearingPrice > 0 { + b.ClearingPrices[order.LegacyLeaseDurationBucket] = clearingPrice + + return b, nil + } + + var numPrices uint32 + err = ReadElements(r, &numPrices) + if err != nil { + return nil, err + } + + for i := uint32(0); i < numPrices; i++ { + var ( + price order.FixedRatePremium + duration uint32 + ) + err = ReadElements(r, &duration, &price) + if err != nil { + return nil, err + } + + b.ClearingPrices[duration] = price + } + return b, nil } diff --git a/clientdb/batch_snapshot_test.go b/clientdb/batch_snapshot_test.go index 11bddb6b0..9d4c00472 100644 --- a/clientdb/batch_snapshot_test.go +++ b/clientdb/batch_snapshot_test.go @@ -2,6 +2,7 @@ package clientdb import ( "bytes" + "fmt" "net" "reflect" "testing" @@ -15,46 +16,37 @@ import ( "go.etcd.io/bbolt" ) -var testAccount = &account.Account{ - Value: btcutil.SatoshiPerBitcoin, - Expiry: 1337, - TraderKey: testTraderKeyDesc, - AuctioneerKey: testAuctioneerKey, - BatchKey: testBatchKey, - Secret: sharedSecret, - State: account.StateInitiated, - HeightHint: 1, -} +var ( + testAccount = &account.Account{ + Value: btcutil.SatoshiPerBitcoin, + Expiry: 1337, + TraderKey: testTraderKeyDesc, + AuctioneerKey: testAuctioneerKey, + BatchKey: testBatchKey, + Secret: sharedSecret, + State: account.StateInitiated, + HeightHint: 1, + } -var testNonce1 = order.Nonce([32]byte{1, 1, 1}) -var testNonce2 = order.Nonce([32]byte{2, 2, 2}) + testNonce1 = order.Nonce([32]byte{1, 1, 1}) + testNonce2 = order.Nonce([32]byte{2, 2, 2}) -func newOrderKit(nonce order.Nonce, duration uint32) *order.Kit { - kit := order.NewKit(nonce) - kit.LeaseDuration = duration - return kit -} + testDuration uint32 = 144 -var testSnapshot = &LocalBatchSnapshot{ - Version: 5, - BatchID: testBatchID, - ClearingPrice: 999, - ExecutionFee: *terms.NewLinearFeeSchedule(101, 900), - BatchTX: testBatchTx, - BatchTxFeeRate: 123456, - Accounts: map[[33]byte]*account.Account{ + testAccounts = map[[33]byte]*account.Account{ testRawTraderKeyArr: testAccount, - }, - Orders: map[order.Nonce]order.Order{ + } + + testOrders = map[order.Nonce]order.Order{ testNonce1: &order.Bid{ - Kit: *newOrderKit(testNonce1, 144), + Kit: *newOrderKit(testNonce1, testDuration), }, testNonce2: &order.Ask{ - Kit: *newOrderKit(testNonce2, 1024), + Kit: *newOrderKit(testNonce2, testDuration), }, - }, + } - MatchedOrders: map[order.Nonce][]*order.MatchedOrder{ + testMatchedOrders = map[order.Nonce][]*order.MatchedOrder{ testNonce1: { { Order: &order.Ask{ @@ -64,7 +56,9 @@ var testSnapshot = &LocalBatchSnapshot{ NodeKey: [33]byte{1, 2, 3}, NodeAddrs: []net.Addr{ &net.TCPAddr{ - IP: net.IP{0x12, 0x34, 0x56, 0x78}, + IP: net.IP{ + 0x12, 0x34, 0x56, 0x78, + }, Port: 8080, }, }, @@ -78,7 +72,9 @@ var testSnapshot = &LocalBatchSnapshot{ NodeKey: [33]byte{2, 2, 3}, NodeAddrs: []net.Addr{ &net.TCPAddr{ - IP: net.IP{0x12, 0x34, 0x56, 0x78}, + IP: net.IP{ + 0x12, 0x34, 0x56, 0x78, + }, Port: 8080, }, }, @@ -95,7 +91,9 @@ var testSnapshot = &LocalBatchSnapshot{ NodeKey: [33]byte{1, 2, 3}, NodeAddrs: []net.Addr{ &net.TCPAddr{ - IP: net.IP{0x12, 0x34, 0x56, 0x78}, + IP: net.IP{ + 0x12, 0x34, 0x56, 0x78, + }, Port: 8080, }, }, @@ -110,7 +108,9 @@ var testSnapshot = &LocalBatchSnapshot{ NodeKey: [33]byte{2, 2, 3}, NodeAddrs: []net.Addr{ &net.TCPAddr{ - IP: net.IP{0x12, 0x34, 0x56, 0x78}, + IP: net.IP{ + 0x12, 0x34, 0x56, 0x78, + }, Port: 8080, }, }, @@ -118,36 +118,67 @@ var testSnapshot = &LocalBatchSnapshot{ UnitsFilled: 10, }, }, - }, + } + + testSnapshot = &LocalBatchSnapshot{ + Version: order.DefaultBatchVersion, + BatchID: testBatchID, + ClearingPrices: map[uint32]order.FixedRatePremium{ + testDuration: 999, + testDuration * 2: 1234, + }, + ExecutionFee: *terms.NewLinearFeeSchedule(101, 900), + BatchTX: testBatchTx, + BatchTxFeeRate: 123456, + Accounts: testAccounts, + Orders: testOrders, + MatchedOrders: testMatchedOrders, + } + + allSnapshots = []*LocalBatchSnapshot{ + testSnapshot, + { + Version: order.DefaultBatchVersion, + BatchID: testBatchID, + ClearingPrices: map[uint32]order.FixedRatePremium{ + order.LegacyLeaseDurationBucket: 999, + }, + ExecutionFee: *terms.NewLinearFeeSchedule(101, 900), + BatchTX: testBatchTx, + BatchTxFeeRate: 123456, + Accounts: testAccounts, + Orders: testOrders, + MatchedOrders: testMatchedOrders, + }, + } +) + +func newOrderKit(nonce order.Nonce, duration uint32) *order.Kit { + kit := order.NewKit(nonce) + kit.LeaseDuration = duration + return kit } // TestSerializeLocalBatchSnapshot checks that (de)serialization of local batch -// snapshots worsk as expected. +// snapshots works as expected. func TestSerializeLocalBatchSnapshot(t *testing.T) { - pre := testSnapshot - buf := bytes.Buffer{} - if err := serializeLocalBatchSnapshot(&buf, pre); err != nil { - t.Fatal(err) - } + for idx, testSnapshot := range allSnapshots { + pre := testSnapshot + t.Run(fmt.Sprintf("snapshot-%d", idx), func(t *testing.T) { + t.Parallel() - post, err := deserializeLocalBatchSnapshot(&buf) - if err != nil { - t.Fatal(err) - } + buf := bytes.Buffer{} + if err := serializeLocalBatchSnapshot(&buf, pre); err != nil { + t.Fatal(err) + } - if !reflect.DeepEqual(pre, post) { - for _, a := range pre.Accounts { - a.TraderKey.PubKey.Curve = nil - a.AuctioneerKey.Curve = nil - a.BatchKey.Curve = nil - } - for _, a := range post.Accounts { - a.TraderKey.PubKey.Curve = nil - a.AuctioneerKey.Curve = nil - a.BatchKey.Curve = nil - } + post, err := deserializeLocalBatchSnapshot(&buf) + if err != nil { + t.Fatal(err) + } - t.Fatalf("mismatch: %v vs %v", spew.Sdump(pre), spew.Sdump(post)) + require.Equal(t, pre, post) + }) } } @@ -198,10 +229,7 @@ func TestGetLocalBatchSnapshots(t *testing.T) { for i, snapshot := range snapshots { testSnapshot.BatchID[0] = byte(i) - if !reflect.DeepEqual(testSnapshot, snapshot) { - t.Fatalf("mismatch: %v vs %v", - spew.Sdump(testSnapshot), spew.Sdump(snapshot)) - } + require.Equal(t, testSnapshot, snapshot) } // Store and delete a pending snapshot, and make sure all other batches are diff --git a/clientdb/codec.go b/clientdb/codec.go index b41365db4..1cc682995 100644 --- a/clientdb/codec.go +++ b/clientdb/codec.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "reflect" + "time" "github.com/btcsuite/btcd/wire" "github.com/btcsuite/btcutil" @@ -58,6 +59,9 @@ func WriteElement(w io.Writer, element interface{}) error { case order.Version: return lnwire.WriteElement(w, uint32(e)) + case order.BatchVersion: + return lnwire.WriteElement(w, uint32(e)) + case order.Type: return lnwire.WriteElement(w, uint8(e)) @@ -103,6 +107,9 @@ func WriteElement(w io.Writer, element interface{}) error { case [32]byte: return lnwire.WriteElement(w, e[:]) + case time.Time: + return lnwire.WriteElement(w, uint64(e.UnixNano())) + case *wire.MsgTx: if err := e.Serialize(w); err != nil { return err @@ -152,6 +159,13 @@ func ReadElement(r io.Reader, element interface{}) error { // nolint:gocyclo } *e = order.Version(v) + case *order.BatchVersion: + var v uint32 + if err := lnwire.ReadElement(r, &v); err != nil { + return err + } + *e = order.BatchVersion(v) + case *order.Type: var v uint8 if err := lnwire.ReadElement(r, &v); err != nil { @@ -235,6 +249,13 @@ func ReadElement(r io.Reader, element interface{}) error { // nolint:gocyclo return err } + case *time.Time: + var ns uint64 + if err := lnwire.ReadElement(r, &ns); err != nil { + return err + } + *e = time.Unix(0, int64(ns)) + case **wire.MsgTx: var tx wire.MsgTx if err := tx.Deserialize(r); err != nil { diff --git a/clientdb/order_test.go b/clientdb/order_test.go index 7ed623958..451b65122 100644 --- a/clientdb/order_test.go +++ b/clientdb/order_test.go @@ -145,7 +145,7 @@ func dummyOrder(amt btcutil.Amount, leaseDuration uint32) *order.Kit { panic(fmt.Sprintf("could not create private key: %v", err)) } kit := order.NewKitWithPreimage(testPreimage) - kit.Version = order.VersionDefault + kit.Version = order.VersionLeaseDurationBuckets kit.State = order.StateExecuted kit.FixedRate = 21 kit.Amt = amt diff --git a/cmd/pool/auction.go b/cmd/pool/auction.go index eaecdae34..ca5c3f23c 100644 --- a/cmd/pool/auction.go +++ b/cmd/pool/auction.go @@ -7,7 +7,6 @@ import ( "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/lightninglabs/pool/poolrpc" - "github.com/lightninglabs/protobuf-hex-display/proto" "github.com/urfave/cli" ) @@ -50,6 +49,48 @@ func NewLeaseFromProto(a *poolrpc.Lease) *Lease { } } +// Markets is a simple type alias to make the following Snapshot struct more +// compact. +type Markets = map[uint32]*poolrpc.MatchedMarketSnapshot + +// Snapshot is a copy of poolrpc.BatchSnapshotResponse that does not include the +// deprecated fields. +type Snapshot struct { + Version uint32 `json:"version"` + BatchID string `json:"batch_id"` + PrevBatchID string `json:"prev_batch_id"` + BatchTxID string `json:"batch_tx_id"` + BatchTx string `json:"batch_tx"` + BatchTxFeeRateSatPerKw uint64 `json:"batch_tx_fee_rate_sat_per_kw"` + CreationTimestampNs uint64 `json:"creation_timestamp_ns"` + MatchedMarkets Markets `json:"matched_markets"` +} + +// NewSnapshotsFromProtos creates a display Snapshot from its proto. +func NewSnapshotsFromProto(s []*poolrpc.BatchSnapshotResponse) []*Snapshot { + result := make([]*Snapshot, len(s)) + for idx, snapshot := range s { + result[idx] = &Snapshot{ + Version: snapshot.Version, + BatchID: hex.EncodeToString( + snapshot.BatchId, + ), + PrevBatchID: hex.EncodeToString( + snapshot.PrevBatchId, + ), + BatchTxID: snapshot.BatchTxId, + BatchTx: hex.EncodeToString( + snapshot.BatchTx, + ), + BatchTxFeeRateSatPerKw: snapshot.BatchTxFeeRateSatPerKw, + CreationTimestampNs: snapshot.CreationTimestampNs, + MatchedMarkets: snapshot.MatchedMarkets, + } + } + + return result +} + var auctionCommands = []cli.Command{ { Name: "auction", @@ -136,7 +177,6 @@ func batchSnapshot(ctx *cli.Context) error { var ( batchIDStr string ctxb = context.Background() - resp proto.Message ) switch { case ctx.Args().Present(): @@ -151,7 +191,7 @@ func batchSnapshot(ctx *cli.Context) error { return fmt.Errorf("unable to decode batch ID: %v", err) } - resp, err = client.BatchSnapshots( + resp, err := client.BatchSnapshots( ctxb, &poolrpc.BatchSnapshotsRequest{ StartBatchId: batchID, NumBatchesBack: uint32(ctx.Uint64("num_batches")), @@ -161,7 +201,12 @@ func batchSnapshot(ctx *cli.Context) error { return err } - printRespJSON(resp) + // Get rid of the deprecated fields by copying the response into a new + // struct just for displaying. Can be removed once the deprecated fields + // are removed from the proto (alpha->beta transition?). + // TODO(guggero): Use original proto message once deprecated fields are + // removed. + printJSON(NewSnapshotsFromProto(resp.Batches)) return nil } diff --git a/cmd/pool/order.go b/cmd/pool/order.go index f2f6b943d..6def1dbdd 100644 --- a/cmd/pool/order.go +++ b/cmd/pool/order.go @@ -255,7 +255,7 @@ func ordersSubmitAsk(ctx *cli.Context) error { // nolint: dupl ask := &poolrpc.Ask{ LeaseDurationBlocks: uint32(ctx.Uint64("lease_duration_blocks")), - Version: uint32(order.VersionNodeTierMinMatch), + Version: uint32(order.VersionLeaseDurationBuckets), } params, err := parseCommonParams(ctx, ask.LeaseDurationBlocks) @@ -431,7 +431,7 @@ func ordersSubmitBid(ctx *cli.Context) error { // nolint: dupl bid := &poolrpc.Bid{ LeaseDurationBlocks: uint32(ctx.Uint64("lease_duration_blocks")), - Version: uint32(order.VersionNodeTierMinMatch), + Version: uint32(order.VersionLeaseDurationBuckets), MinNodeTier: nodeTier, } diff --git a/order/batch.go b/order/batch.go index 170801f4c..6d1440e44 100644 --- a/order/batch.go +++ b/order/batch.go @@ -31,16 +31,20 @@ const ( type BatchVersion uint32 const ( - // DefaultVersion is the first implemented version of the batch + // DefaultBatchVersion is the first implemented version of the batch // verification protocol. - DefaultVersion BatchVersion = 0 + DefaultBatchVersion BatchVersion = 0 - // CurrentVersion must point to the latest implemented version of the + // CurrentBatchVersion must point to the latest implemented version of the // batch verification protocol. Both server and client should always // refer to this constant. If a client's binary is not updated in time // it will point to a previous version than the server and the mismatch // will be detected during the OrderMatchPrepare call. - CurrentVersion = DefaultVersion + CurrentBatchVersion = DefaultBatchVersion + + // LegacyLeaseDurationBucket is the single static duration bucket that + // was used for orders before dynamic duration buckets were added. + LegacyLeaseDurationBucket uint32 = 2016 ) // BatchID is a 33-byte point that uniquely identifies this batch. This ID @@ -171,8 +175,9 @@ type Batch struct { // calculate the execution fee. ExecutionFee terms.FeeSchedule - // ClearingPrice is the fixed rate the orders were cleared at. - ClearingPrice FixedRatePremium + // ClearingPrices is a map of the lease duration markets and the fixed + // rate the orders were cleared at within that market. + ClearingPrices map[uint32]FixedRatePremium // BatchTX is the complete batch transaction with all non-witness data // fully populated. diff --git a/order/batch_storer_test.go b/order/batch_storer_test.go index 667c3d469..e718455bd 100644 --- a/order/batch_storer_test.go +++ b/order/batch_storer_test.go @@ -101,7 +101,7 @@ func TestBatchStorer(t *testing.T) { } batch := &Batch{ ID: batchID, - Version: DefaultVersion, + Version: DefaultBatchVersion, MatchedOrders: matchedOrders, AccountDiffs: accountDiffs, BatchTX: batchTx, diff --git a/order/batch_verifier.go b/order/batch_verifier.go index 9276d7dd4..204543efa 100644 --- a/order/batch_verifier.go +++ b/order/batch_verifier.go @@ -73,7 +73,7 @@ func (v *batchVerifier) Verify(batch *Batch) error { // as the server. Otherwise we bail out of the batch. This should // already be handled when the client connects/authenticates. But // doesn't hurt to check again. - if batch.Version != CurrentVersion { + if batch.Version != CurrentBatchVersion { return ErrVersionMismatch } @@ -112,6 +112,10 @@ func (v *batchVerifier) Verify(batch *Batch) error { accounts[acctKeyRaw] = acct } + // The clearing price is different for each duration. + ourOrderDuration := ourOrder.Details().LeaseDuration + clearingPrice := batch.ClearingPrices[ourOrderDuration] + // Now that we know which of our orders were involved in the // match, we can start validating the match and tally up the // account balance, executed units and fee diffs. @@ -120,7 +124,7 @@ func (v *batchVerifier) Verify(batch *Batch) error { // Verify order compatibility and fee structure. err = v.validateMatchedOrder( tally, ourOrder, theirOrder, batch.ExecutionFee, - batch.ClearingPrice, + clearingPrice, ) if err != nil { return newMismatchErr( @@ -150,8 +154,7 @@ func (v *batchVerifier) Verify(batch *Batch) error { } // Verify the clearing price satisfies our order. - ourOrderPrice := ourOrder.Details().FixedRate - clearingPrice := uint32(batch.ClearingPrice) + ourOrderPrice := FixedRatePremium(ourOrder.Details().FixedRate) switch { // Bids should always have a price greater than or equal to the // clearing price. diff --git a/order/batch_verifier_test.go b/order/batch_verifier_test.go index 7b3d916bd..fc9d4168c 100644 --- a/order/batch_verifier_test.go +++ b/order/batch_verifier_test.go @@ -28,6 +28,7 @@ var ( execFeeBase = btcutil.Amount(1_100) execFeeRate = btcutil.Amount(50) clearingPrice = FixedRatePremium(5000) + leaseDuration = uint32(1000) stateRecreated = poolrpc.AccountDiff_OUTPUT_RECREATED stateExtendedOffchain = poolrpc.AccountDiff_OUTPUT_DUST_EXTENDED_OFFCHAIN ) @@ -200,7 +201,7 @@ func TestBatchVerifier(t *testing.T) { b *Batch) error { delete(b.MatchedOrders, a.nonce) - b1.FixedRate = uint32(b.ClearingPrice) - 1 + b1.FixedRate = uint32(clearingPrice) - 1 return v.Verify(b) }, }, @@ -224,7 +225,7 @@ func TestBatchVerifier(t *testing.T) { UnitsUnfulfilled: 4, AcctKey: acctIDSmall, FixedRate: b1.FixedRate, - LeaseDuration: 1000, + LeaseDuration: leaseDuration, }), } v.(*batchVerifier).orderStore.(*mockStore).orders[ask.nonce] = ask @@ -347,7 +348,7 @@ func TestBatchVerifier(t *testing.T) { MinUnitsMatch: 1, AcctKey: acctIDSmall, FixedRate: uint32(clearingPrice) / 2, - LeaseDuration: 1000, + LeaseDuration: leaseDuration, }), } bid1 := &Bid{ @@ -361,7 +362,7 @@ func TestBatchVerifier(t *testing.T) { AcctKey: acctIDBig, FixedRate: uint32(clearingPrice) * 2, // 1000 * (200_000 * 5000 / 1_000_000_000) = 1000 sats premium - LeaseDuration: 1000, + LeaseDuration: leaseDuration, }), } bid2 := &Bid{ @@ -375,7 +376,7 @@ func TestBatchVerifier(t *testing.T) { AcctKey: acctIDBig, FixedRate: uint32(clearingPrice), // 2000 * (200_000 * 5000 / 1_000_000_000) = 1000 sats premium - LeaseDuration: 1000, + LeaseDuration: leaseDuration, }), } batchTx := &wire.MsgTx{ @@ -468,13 +469,15 @@ func TestBatchVerifier(t *testing.T) { } batch := &Batch{ ID: batchID, - Version: DefaultVersion, + Version: DefaultBatchVersion, MatchedOrders: matchedOrders, AccountDiffs: accountDiffs, ExecutionFee: terms.NewLinearFeeSchedule( execFeeBase, execFeeRate, ), - ClearingPrice: clearingPrice, + ClearingPrices: map[uint32]FixedRatePremium{ + 1000: clearingPrice, + }, BatchTX: batchTx, BatchTxFeeRate: chainfee.FeePerKwFloor, } diff --git a/order/interface.go b/order/interface.go index fd83922e9..caf37c591 100644 --- a/order/interface.go +++ b/order/interface.go @@ -37,6 +37,12 @@ const ( // VersionNodeTierMinMatch is the order version that added recognition // of the new node tier and min matchable order size fields. VersionNodeTierMinMatch Version = 1 + + // VersionLeaseDurationBuckets is the order version that added use of + // multiple lease durations. Only orders with this version are allowed + // to use lease durations outside of the default/legacy 2016 block + // duration. + VersionLeaseDurationBuckets Version = 2 ) // Type is the type of an order. We don't use iota for the constants due to the @@ -310,7 +316,7 @@ func NewKitWithPreimage(preimage lntypes.Preimage) *Kit { return &Kit{ nonce: nonce, Preimage: preimage, - Version: VersionNodeTierMinMatch, + Version: VersionLeaseDurationBuckets, } } @@ -318,7 +324,7 @@ func NewKitWithPreimage(preimage lntypes.Preimage) *Kit { func NewKit(nonce Nonce) *Kit { return &Kit{ nonce: nonce, - Version: VersionNodeTierMinMatch, + Version: VersionLeaseDurationBuckets, } } @@ -357,7 +363,7 @@ func (a *Ask) Digest() ([sha256.Size]byte, error) { return result, err } - case VersionNodeTierMinMatch: + case VersionNodeTierMinMatch, VersionLeaseDurationBuckets: err := lnwire.WriteElements( &msg, a.nonce[:], uint32(a.Version), a.FixedRate, a.Amt, a.LeaseDuration, uint64(a.MaxBatchFeeRate), @@ -530,7 +536,7 @@ func (b *Bid) Digest() ([sha256.Size]byte, error) { return result, err } - case VersionNodeTierMinMatch: + case VersionNodeTierMinMatch, VersionLeaseDurationBuckets: err := lnwire.WriteElements( &msg, b.nonce[:], uint32(b.Version), b.FixedRate, b.Amt, b.LeaseDuration, uint64(b.MaxBatchFeeRate), diff --git a/order/manager.go b/order/manager.go index 9bae6156e..b2bef0bc9 100644 --- a/order/manager.go +++ b/order/manager.go @@ -32,7 +32,7 @@ var ( // ErrVersionMismatch is the error that is returned if we don't // implement the same batch verification version as the server. ErrVersionMismatch = fmt.Errorf("version %d mismatches server version", - CurrentVersion) + CurrentBatchVersion) ) // ManagerConfig contains all of the required dependencies for the Manager to @@ -198,18 +198,11 @@ func (m *Manager) PrepareOrder(ctx context.Context, order Order, func (m *Manager) validateOrder(order Order, acct *account.Account, terms *terms.AuctioneerTerms) error { - if order.Details().LeaseDuration < MinimumOrderDurationBlocks { - return fmt.Errorf("invalid lease duration, must be "+ - "at least %d", MinimumOrderDurationBlocks) - } - if order.Details().LeaseDuration > terms.MaxOrderDuration { - return fmt.Errorf("invalid lease duration, must be "+ - "smaller than or equal to %d", - terms.MaxOrderDuration) - } - if order.Details().LeaseDuration%MinimumOrderDurationBlocks != 0 { - return fmt.Errorf("invalid lease duration, must be "+ - "multiple of %d", MinimumOrderDurationBlocks) + duration := order.Details().LeaseDuration + _, ok := terms.LeaseDurationBuckets[duration] + if !ok { + return fmt.Errorf("invalid lease duration, must be one of %v", + terms.LeaseDurationBuckets) } if order.Details().MaxBatchFeeRate < chainfee.FeePerKwFloor { diff --git a/order/manager_test.go b/order/manager_test.go index fe07f259b..37210e3eb 100644 --- a/order/manager_test.go +++ b/order/manager_test.go @@ -5,6 +5,7 @@ import ( "github.com/btcsuite/btcutil" "github.com/lightninglabs/pool/account" + "github.com/lightninglabs/pool/poolrpc" "github.com/lightninglabs/pool/terms" "github.com/lightningnetwork/lnd/keychain" ) @@ -52,9 +53,11 @@ func TestValidateOrderAccountIsolation(t *testing.T) { } testTerms := &terms.AuctioneerTerms{ - MaxOrderDuration: 100 * MinimumOrderDurationBlocks, OrderExecBaseFee: 1, OrderExecFeeRate: 100, + LeaseDurationBuckets: map[uint32]poolrpc.DurationBucketState{ + 144: poolrpc.DurationBucketState_MARKET_OPEN, + }, } // Submitting this order for account B should pass validation. diff --git a/order/rpc_parse.go b/order/rpc_parse.go index e3a5b343d..54f8aa6b9 100644 --- a/order/rpc_parse.go +++ b/order/rpc_parse.go @@ -223,26 +223,53 @@ func ParseRPCBatch(prepareMsg *poolrpc.OrderMatchPrepare) (*Batch, error) { b := &Batch{ - Version: BatchVersion(prepareMsg.BatchVersion), - MatchedOrders: make(map[Nonce][]*MatchedOrder), - BatchTX: &wire.MsgTx{}, + Version: BatchVersion(prepareMsg.BatchVersion), + MatchedOrders: make(map[Nonce][]*MatchedOrder), + BatchTX: &wire.MsgTx{}, + ClearingPrices: make(map[uint32]FixedRatePremium), } - // Parse matched orders. - for ourOrderHex, rpcMatchedOrders := range prepareMsg.MatchedOrders { - var ourOrder Nonce - ourOrderBytes, err := hex.DecodeString(ourOrderHex) - if err != nil { - return nil, fmt.Errorf("error parsing nonce: %v", err) + // Parse matched orders market by market. + for leaseDuration, matchedMarket := range prepareMsg.MatchedMarkets { + orders := matchedMarket.MatchedOrders + for ourOrderHex, rpcMatchedOrders := range orders { + var ourOrder Nonce + ourOrderBytes, err := hex.DecodeString(ourOrderHex) + if err != nil { + return nil, fmt.Errorf("error parsing nonce: "+ + "%v", err) + } + copy(ourOrder[:], ourOrderBytes) + matchedOrders, err := ParseRPCMatchedOrders( + rpcMatchedOrders, + ) + if err != nil { + return nil, fmt.Errorf("error parsing matched "+ + "order: %v", err) + } + + // It is imperative that all matched orders have the + // correct lease duration. Otherwise assumptions in the + // batch verifier won't be correct. That's why we + // validate this here already. + for _, matchedOrder := range matchedOrders { + details := matchedOrder.Order.Details() + if details.LeaseDuration != leaseDuration { + return nil, fmt.Errorf("matched order "+ + "%s has incorrect lease "+ + "duration %d for bucket %d", + details.Nonce(), + details.LeaseDuration, + leaseDuration) + } + } + + b.MatchedOrders[ourOrder] = matchedOrders } - copy(ourOrder[:], ourOrderBytes) - b.MatchedOrders[ourOrder], err = ParseRPCMatchedOrders( - rpcMatchedOrders, + + b.ClearingPrices[leaseDuration] = FixedRatePremium( + matchedMarket.ClearingPriceRate, ) - if err != nil { - return nil, fmt.Errorf("error parsing matched order: "+ - "%v", err) - } } // Parse account diff. @@ -274,7 +301,6 @@ func ParseRPCBatch(prepareMsg *poolrpc.OrderMatchPrepare) (*Batch, } // Convert clearing price, fee rate and rebate. - b.ClearingPrice = FixedRatePremium(prepareMsg.ClearingPriceRate) b.BatchTxFeeRate = chainfee.SatPerKWeight(prepareMsg.FeeRateSatPerKw) b.FeeRebate = btcutil.Amount(prepareMsg.FeeRebateSat) diff --git a/poolrpc/auctioneer.pb.go b/poolrpc/auctioneer.pb.go index 6c2aa761f..b09489d1c 100644 --- a/poolrpc/auctioneer.pb.go +++ b/poolrpc/auctioneer.pb.go @@ -181,6 +181,49 @@ func (OrderState) EnumDescriptor() ([]byte, []int) { return fileDescriptor_f3883418d94ca37f, []int{3} } +type DurationBucketState int32 + +const ( + // + //NO_MARKET indicates that this bucket doesn't actually exist, in that no + //market is present for this market. + DurationBucketState_NO_MARKET DurationBucketState = 0 + // + //MARKET_CLOSED indicates that this market exists, but that it isn't currently + //running. + DurationBucketState_MARKET_CLOSED DurationBucketState = 1 + // + //ACCEPTING_ORDERS indicates that we're accepting orders for this bucket, but + //not yet clearing for this duration. + DurationBucketState_ACCEPTING_ORDERS DurationBucketState = 2 + // + //MARKET_OPEN indicates that we're accepting orders, and fully clearing the + //market for this duration. + DurationBucketState_MARKET_OPEN DurationBucketState = 3 +) + +var DurationBucketState_name = map[int32]string{ + 0: "NO_MARKET", + 1: "MARKET_CLOSED", + 2: "ACCEPTING_ORDERS", + 3: "MARKET_OPEN", +} + +var DurationBucketState_value = map[string]int32{ + "NO_MARKET": 0, + "MARKET_CLOSED": 1, + "ACCEPTING_ORDERS": 2, + "MARKET_OPEN": 3, +} + +func (x DurationBucketState) String() string { + return proto.EnumName(DurationBucketState_name, int32(x)) +} + +func (DurationBucketState) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_f3883418d94ca37f, []int{4} +} + type OrderMatchReject_RejectReason int32 const ( @@ -297,7 +340,7 @@ func (x SubscribeError_Error) String() string { } func (SubscribeError_Error) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{23, 0} + return fileDescriptor_f3883418d94ca37f, []int{24, 0} } type AccountDiff_AccountState int32 @@ -328,7 +371,7 @@ func (x AccountDiff_AccountState) String() string { } func (AccountDiff_AccountState) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{28, 0} + return fileDescriptor_f3883418d94ca37f, []int{29, 0} } type InvalidOrder_FailReason int32 @@ -350,7 +393,7 @@ func (x InvalidOrder_FailReason) String() string { } func (InvalidOrder_FailReason) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{33, 0} + return fileDescriptor_f3883418d94ca37f, []int{34, 0} } type ReserveAccountRequest struct { @@ -1688,7 +1731,7 @@ func (m *SubscribeSuccess) GetTraderKey() []byte { return nil } -type OrderMatchPrepare struct { +type MatchedMarket struct { // //Maps a user's own order_nonce to the opposite order type they were matched //with. The order_nonce is a 32 byte hex encoded string because bytes is not @@ -1697,7 +1740,58 @@ type OrderMatchPrepare struct { // //The uniform clearing price rate in parts per billion that was used for this //batch. - ClearingPriceRate uint32 `protobuf:"varint,2,opt,name=clearing_price_rate,json=clearingPriceRate,proto3" json:"clearing_price_rate,omitempty"` + ClearingPriceRate uint32 `protobuf:"varint,2,opt,name=clearing_price_rate,json=clearingPriceRate,proto3" json:"clearing_price_rate,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MatchedMarket) Reset() { *m = MatchedMarket{} } +func (m *MatchedMarket) String() string { return proto.CompactTextString(m) } +func (*MatchedMarket) ProtoMessage() {} +func (*MatchedMarket) Descriptor() ([]byte, []int) { + return fileDescriptor_f3883418d94ca37f, []int{20} +} + +func (m *MatchedMarket) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MatchedMarket.Unmarshal(m, b) +} +func (m *MatchedMarket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MatchedMarket.Marshal(b, m, deterministic) +} +func (m *MatchedMarket) XXX_Merge(src proto.Message) { + xxx_messageInfo_MatchedMarket.Merge(m, src) +} +func (m *MatchedMarket) XXX_Size() int { + return xxx_messageInfo_MatchedMarket.Size(m) +} +func (m *MatchedMarket) XXX_DiscardUnknown() { + xxx_messageInfo_MatchedMarket.DiscardUnknown(m) +} + +var xxx_messageInfo_MatchedMarket proto.InternalMessageInfo + +func (m *MatchedMarket) GetMatchedOrders() map[string]*MatchedOrder { + if m != nil { + return m.MatchedOrders + } + return nil +} + +func (m *MatchedMarket) GetClearingPriceRate() uint32 { + if m != nil { + return m.ClearingPriceRate + } + return 0 +} + +type OrderMatchPrepare struct { + // + //Deprecated, use matched_markets. + MatchedOrders map[string]*MatchedOrder `protobuf:"bytes,1,rep,name=matched_orders,json=matchedOrders,proto3" json:"matched_orders,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Deprecated: Do not use. + // + //Deprecated, use matched_markets. + ClearingPriceRate uint32 `protobuf:"varint,2,opt,name=clearing_price_rate,json=clearingPriceRate,proto3" json:"clearing_price_rate,omitempty"` // Deprecated: Do not use. // //A list of the user's own accounts that are being spent by the matched //orders. The list contains the differences that would be applied by the @@ -1725,17 +1819,21 @@ type OrderMatchPrepare struct { //don't support this version MUST return an `OrderMatchAccept` message with //an empty list of orders so the batch can continue. The user should then be //informed that a software update is required. - BatchVersion uint32 `protobuf:"varint,9,opt,name=batch_version,json=batchVersion,proto3" json:"batch_version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + BatchVersion uint32 `protobuf:"varint,9,opt,name=batch_version,json=batchVersion,proto3" json:"batch_version,omitempty"` + // + //Maps the distinct lease duration markets to the orders that were matched + //within and the discovered market clearing price. + MatchedMarkets map[uint32]*MatchedMarket `protobuf:"bytes,10,rep,name=matched_markets,json=matchedMarkets,proto3" json:"matched_markets,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *OrderMatchPrepare) Reset() { *m = OrderMatchPrepare{} } func (m *OrderMatchPrepare) String() string { return proto.CompactTextString(m) } func (*OrderMatchPrepare) ProtoMessage() {} func (*OrderMatchPrepare) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{20} + return fileDescriptor_f3883418d94ca37f, []int{21} } func (m *OrderMatchPrepare) XXX_Unmarshal(b []byte) error { @@ -1756,6 +1854,7 @@ func (m *OrderMatchPrepare) XXX_DiscardUnknown() { var xxx_messageInfo_OrderMatchPrepare proto.InternalMessageInfo +// Deprecated: Do not use. func (m *OrderMatchPrepare) GetMatchedOrders() map[string]*MatchedOrder { if m != nil { return m.MatchedOrders @@ -1763,6 +1862,7 @@ func (m *OrderMatchPrepare) GetMatchedOrders() map[string]*MatchedOrder { return nil } +// Deprecated: Do not use. func (m *OrderMatchPrepare) GetClearingPriceRate() uint32 { if m != nil { return m.ClearingPriceRate @@ -1819,6 +1919,13 @@ func (m *OrderMatchPrepare) GetBatchVersion() uint32 { return 0 } +func (m *OrderMatchPrepare) GetMatchedMarkets() map[uint32]*MatchedMarket { + if m != nil { + return m.MatchedMarkets + } + return nil +} + type OrderMatchSignBegin struct { // //The 32 byte unique identifier of this batch. @@ -1832,7 +1939,7 @@ func (m *OrderMatchSignBegin) Reset() { *m = OrderMatchSignBegin{} } func (m *OrderMatchSignBegin) String() string { return proto.CompactTextString(m) } func (*OrderMatchSignBegin) ProtoMessage() {} func (*OrderMatchSignBegin) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{21} + return fileDescriptor_f3883418d94ca37f, []int{22} } func (m *OrderMatchSignBegin) XXX_Unmarshal(b []byte) error { @@ -1880,7 +1987,7 @@ func (m *OrderMatchFinalize) Reset() { *m = OrderMatchFinalize{} } func (m *OrderMatchFinalize) String() string { return proto.CompactTextString(m) } func (*OrderMatchFinalize) ProtoMessage() {} func (*OrderMatchFinalize) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{22} + return fileDescriptor_f3883418d94ca37f, []int{23} } func (m *OrderMatchFinalize) XXX_Unmarshal(b []byte) error { @@ -1950,7 +2057,7 @@ func (m *SubscribeError) Reset() { *m = SubscribeError{} } func (m *SubscribeError) String() string { return proto.CompactTextString(m) } func (*SubscribeError) ProtoMessage() {} func (*SubscribeError) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{23} + return fileDescriptor_f3883418d94ca37f, []int{24} } func (m *SubscribeError) XXX_Unmarshal(b []byte) error { @@ -2040,7 +2147,7 @@ func (m *AuctionAccount) Reset() { *m = AuctionAccount{} } func (m *AuctionAccount) String() string { return proto.CompactTextString(m) } func (*AuctionAccount) ProtoMessage() {} func (*AuctionAccount) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{24} + return fileDescriptor_f3883418d94ca37f, []int{25} } func (m *AuctionAccount) XXX_Unmarshal(b []byte) error { @@ -2142,7 +2249,7 @@ func (m *MatchedOrder) Reset() { *m = MatchedOrder{} } func (m *MatchedOrder) String() string { return proto.CompactTextString(m) } func (*MatchedOrder) ProtoMessage() {} func (*MatchedOrder) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{25} + return fileDescriptor_f3883418d94ca37f, []int{26} } func (m *MatchedOrder) XXX_Unmarshal(b []byte) error { @@ -2193,7 +2300,7 @@ func (m *MatchedAsk) Reset() { *m = MatchedAsk{} } func (m *MatchedAsk) String() string { return proto.CompactTextString(m) } func (*MatchedAsk) ProtoMessage() {} func (*MatchedAsk) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{26} + return fileDescriptor_f3883418d94ca37f, []int{27} } func (m *MatchedAsk) XXX_Unmarshal(b []byte) error { @@ -2244,7 +2351,7 @@ func (m *MatchedBid) Reset() { *m = MatchedBid{} } func (m *MatchedBid) String() string { return proto.CompactTextString(m) } func (*MatchedBid) ProtoMessage() {} func (*MatchedBid) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{27} + return fileDescriptor_f3883418d94ca37f, []int{28} } func (m *MatchedBid) XXX_Unmarshal(b []byte) error { @@ -2306,7 +2413,7 @@ func (m *AccountDiff) Reset() { *m = AccountDiff{} } func (m *AccountDiff) String() string { return proto.CompactTextString(m) } func (*AccountDiff) ProtoMessage() {} func (*AccountDiff) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{28} + return fileDescriptor_f3883418d94ca37f, []int{29} } func (m *AccountDiff) XXX_Unmarshal(b []byte) error { @@ -2401,7 +2508,7 @@ func (m *ServerOrder) Reset() { *m = ServerOrder{} } func (m *ServerOrder) String() string { return proto.CompactTextString(m) } func (*ServerOrder) ProtoMessage() {} func (*ServerOrder) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{29} + return fileDescriptor_f3883418d94ca37f, []int{30} } func (m *ServerOrder) XXX_Unmarshal(b []byte) error { @@ -2524,7 +2631,7 @@ func (m *ServerBid) Reset() { *m = ServerBid{} } func (m *ServerBid) String() string { return proto.CompactTextString(m) } func (*ServerBid) ProtoMessage() {} func (*ServerBid) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{30} + return fileDescriptor_f3883418d94ca37f, []int{31} } func (m *ServerBid) XXX_Unmarshal(b []byte) error { @@ -2594,7 +2701,7 @@ func (m *ServerAsk) Reset() { *m = ServerAsk{} } func (m *ServerAsk) String() string { return proto.CompactTextString(m) } func (*ServerAsk) ProtoMessage() {} func (*ServerAsk) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{31} + return fileDescriptor_f3883418d94ca37f, []int{32} } func (m *ServerAsk) XXX_Unmarshal(b []byte) error { @@ -2647,7 +2754,7 @@ func (m *CancelOrder) Reset() { *m = CancelOrder{} } func (m *CancelOrder) String() string { return proto.CompactTextString(m) } func (*CancelOrder) ProtoMessage() {} func (*CancelOrder) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{32} + return fileDescriptor_f3883418d94ca37f, []int{33} } func (m *CancelOrder) XXX_Unmarshal(b []byte) error { @@ -2688,7 +2795,7 @@ func (m *InvalidOrder) Reset() { *m = InvalidOrder{} } func (m *InvalidOrder) String() string { return proto.CompactTextString(m) } func (*InvalidOrder) ProtoMessage() {} func (*InvalidOrder) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{33} + return fileDescriptor_f3883418d94ca37f, []int{34} } func (m *InvalidOrder) XXX_Unmarshal(b []byte) error { @@ -2746,7 +2853,7 @@ func (m *ServerInput) Reset() { *m = ServerInput{} } func (m *ServerInput) String() string { return proto.CompactTextString(m) } func (*ServerInput) ProtoMessage() {} func (*ServerInput) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{34} + return fileDescriptor_f3883418d94ca37f, []int{35} } func (m *ServerInput) XXX_Unmarshal(b []byte) error { @@ -2795,7 +2902,7 @@ func (m *ServerOutput) Reset() { *m = ServerOutput{} } func (m *ServerOutput) String() string { return proto.CompactTextString(m) } func (*ServerOutput) ProtoMessage() {} func (*ServerOutput) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{35} + return fileDescriptor_f3883418d94ca37f, []int{36} } func (m *ServerOutput) XXX_Unmarshal(b []byte) error { @@ -2855,7 +2962,7 @@ func (m *ServerModifyAccountRequest) Reset() { *m = ServerModifyAccountR func (m *ServerModifyAccountRequest) String() string { return proto.CompactTextString(m) } func (*ServerModifyAccountRequest) ProtoMessage() {} func (*ServerModifyAccountRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{36} + return fileDescriptor_f3883418d94ca37f, []int{37} } func (m *ServerModifyAccountRequest) XXX_Unmarshal(b []byte) error { @@ -2920,7 +3027,7 @@ func (m *ServerModifyAccountRequest_NewAccountParameters) String() string { } func (*ServerModifyAccountRequest_NewAccountParameters) ProtoMessage() {} func (*ServerModifyAccountRequest_NewAccountParameters) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{36, 0} + return fileDescriptor_f3883418d94ca37f, []int{37, 0} } func (m *ServerModifyAccountRequest_NewAccountParameters) XXX_Unmarshal(b []byte) error { @@ -2962,7 +3069,7 @@ func (m *ServerModifyAccountResponse) Reset() { *m = ServerModifyAccount func (m *ServerModifyAccountResponse) String() string { return proto.CompactTextString(m) } func (*ServerModifyAccountResponse) ProtoMessage() {} func (*ServerModifyAccountResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{37} + return fileDescriptor_f3883418d94ca37f, []int{38} } func (m *ServerModifyAccountResponse) XXX_Unmarshal(b []byte) error { @@ -3001,7 +3108,7 @@ func (m *ServerOrderStateRequest) Reset() { *m = ServerOrderStateRequest func (m *ServerOrderStateRequest) String() string { return proto.CompactTextString(m) } func (*ServerOrderStateRequest) ProtoMessage() {} func (*ServerOrderStateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{38} + return fileDescriptor_f3883418d94ca37f, []int{39} } func (m *ServerOrderStateRequest) XXX_Unmarshal(b []byte) error { @@ -3047,7 +3154,7 @@ func (m *ServerOrderStateResponse) Reset() { *m = ServerOrderStateRespon func (m *ServerOrderStateResponse) String() string { return proto.CompactTextString(m) } func (*ServerOrderStateResponse) ProtoMessage() {} func (*ServerOrderStateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{39} + return fileDescriptor_f3883418d94ca37f, []int{40} } func (m *ServerOrderStateResponse) XXX_Unmarshal(b []byte) error { @@ -3092,7 +3199,7 @@ func (m *TermsRequest) Reset() { *m = TermsRequest{} } func (m *TermsRequest) String() string { return proto.CompactTextString(m) } func (*TermsRequest) ProtoMessage() {} func (*TermsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{40} + return fileDescriptor_f3883418d94ca37f, []int{41} } func (m *TermsRequest) XXX_Unmarshal(b []byte) error { @@ -3118,18 +3225,14 @@ type TermsResponse struct { //The maximum account size in satoshis currently allowed by the auctioneer. MaxAccountValue uint64 `protobuf:"varint,1,opt,name=max_account_value,json=maxAccountValue,proto3" json:"max_account_value,omitempty"` // - //The maximum order duration in blocks currently allowed by the auctioneer. + //Deprecated, use explicit order duration from lease_duration_buckets. MaxOrderDurationBlocks uint32 `protobuf:"varint,2,opt,name=max_order_duration_blocks,json=maxOrderDurationBlocks,proto3" json:"max_order_duration_blocks,omitempty"` // Deprecated: Do not use. // //The execution fee charged per matched order. ExecutionFee *ExecutionFee `protobuf:"bytes,3,opt,name=execution_fee,json=executionFee,proto3" json:"execution_fee,omitempty"` // - //The set of lease durations the market is currently accepting. If a duration - //is mapped to false, then this means the durations are being accepted, but - //the market may be paused (not clearing batches). This might happen if a new - //duration is added, and the auction wishes to build of sufficient market - //thickness before starting to clear batches. - LeaseDurations map[uint32]bool `protobuf:"bytes,4,rep,name=lease_durations,json=leaseDurations,proto3" json:"lease_durations,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + //Deprecated, use lease_duration_buckets. + LeaseDurations map[uint32]bool `protobuf:"bytes,4,rep,name=lease_durations,json=leaseDurations,proto3" json:"lease_durations,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` // Deprecated: Do not use. // The confirmation target to use for fee estimation of the next batch. NextBatchConfTarget uint32 `protobuf:"varint,5,opt,name=next_batch_conf_target,json=nextBatchConfTarget,proto3" json:"next_batch_conf_target,omitempty"` // @@ -3139,17 +3242,21 @@ type TermsResponse struct { // //The absolute unix timestamp at which the auctioneer will attempt to clear //the next batch. - NextBatchClearTimestamp uint64 `protobuf:"varint,7,opt,name=next_batch_clear_timestamp,json=nextBatchClearTimestamp,proto3" json:"next_batch_clear_timestamp,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + NextBatchClearTimestamp uint64 `protobuf:"varint,7,opt,name=next_batch_clear_timestamp,json=nextBatchClearTimestamp,proto3" json:"next_batch_clear_timestamp,omitempty"` + // + //The set of lease durations the market is currently accepting and the state + //the duration buckets currently are in. + LeaseDurationBuckets map[uint32]DurationBucketState `protobuf:"bytes,8,rep,name=lease_duration_buckets,json=leaseDurationBuckets,proto3" json:"lease_duration_buckets,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=poolrpc.DurationBucketState"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *TermsResponse) Reset() { *m = TermsResponse{} } func (m *TermsResponse) String() string { return proto.CompactTextString(m) } func (*TermsResponse) ProtoMessage() {} func (*TermsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{41} + return fileDescriptor_f3883418d94ca37f, []int{42} } func (m *TermsResponse) XXX_Unmarshal(b []byte) error { @@ -3192,6 +3299,7 @@ func (m *TermsResponse) GetExecutionFee() *ExecutionFee { return nil } +// Deprecated: Do not use. func (m *TermsResponse) GetLeaseDurations() map[uint32]bool { if m != nil { return m.LeaseDurations @@ -3220,6 +3328,13 @@ func (m *TermsResponse) GetNextBatchClearTimestamp() uint64 { return 0 } +func (m *TermsResponse) GetLeaseDurationBuckets() map[uint32]DurationBucketState { + if m != nil { + return m.LeaseDurationBuckets + } + return nil +} + type RelevantBatchRequest struct { // The unique identifier of the batch. Id []byte `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` @@ -3236,7 +3351,7 @@ func (m *RelevantBatchRequest) Reset() { *m = RelevantBatchRequest{} } func (m *RelevantBatchRequest) String() string { return proto.CompactTextString(m) } func (*RelevantBatchRequest) ProtoMessage() {} func (*RelevantBatchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{42} + return fileDescriptor_f3883418d94ca37f, []int{43} } func (m *RelevantBatchRequest) XXX_Unmarshal(b []byte) error { @@ -3281,11 +3396,11 @@ type RelevantBatch struct { //a result of this batch. ChargedAccounts []*AccountDiff `protobuf:"bytes,3,rep,name=charged_accounts,json=chargedAccounts,proto3" json:"charged_accounts,omitempty"` // - //The set of orders that were matched against the orders belonging to the - //requested accounts. - MatchedOrders map[string]*MatchedOrder `protobuf:"bytes,4,rep,name=matched_orders,json=matchedOrders,proto3" json:"matched_orders,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // The uniform clearing price rate in parts per billion of the batch. - ClearingPriceRate uint32 `protobuf:"varint,5,opt,name=clearing_price_rate,json=clearingPriceRate,proto3" json:"clearing_price_rate,omitempty"` + //Deprecated, use matched_markets. + MatchedOrders map[string]*MatchedOrder `protobuf:"bytes,4,rep,name=matched_orders,json=matchedOrders,proto3" json:"matched_orders,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Deprecated: Do not use. + // + //Deprecated, use matched_markets. + ClearingPriceRate uint32 `protobuf:"varint,5,opt,name=clearing_price_rate,json=clearingPriceRate,proto3" json:"clearing_price_rate,omitempty"` // Deprecated: Do not use. // The fee parameters used to calculate the execution fees. ExecutionFee *ExecutionFee `protobuf:"bytes,6,opt,name=execution_fee,json=executionFee,proto3" json:"execution_fee,omitempty"` // The batch transaction including all witness data. @@ -3293,17 +3408,23 @@ type RelevantBatch struct { // //Fee rate of the batch transaction, expressed in satoshis per 1000 weight //units (sat/kW). - FeeRateSatPerKw uint64 `protobuf:"varint,8,opt,name=fee_rate_sat_per_kw,json=feeRateSatPerKw,proto3" json:"fee_rate_sat_per_kw,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + FeeRateSatPerKw uint64 `protobuf:"varint,8,opt,name=fee_rate_sat_per_kw,json=feeRateSatPerKw,proto3" json:"fee_rate_sat_per_kw,omitempty"` + // The unix timestamp in nanoseconds the batch was made. + CreationTimestampNs uint64 `protobuf:"varint,9,opt,name=creation_timestamp_ns,json=creationTimestampNs,proto3" json:"creation_timestamp_ns,omitempty"` + // + //Maps the distinct lease duration markets to the orders that were matched + //within and the discovered market clearing price. + MatchedMarkets map[uint32]*MatchedMarket `protobuf:"bytes,10,rep,name=matched_markets,json=matchedMarkets,proto3" json:"matched_markets,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *RelevantBatch) Reset() { *m = RelevantBatch{} } func (m *RelevantBatch) String() string { return proto.CompactTextString(m) } func (*RelevantBatch) ProtoMessage() {} func (*RelevantBatch) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{43} + return fileDescriptor_f3883418d94ca37f, []int{44} } func (m *RelevantBatch) XXX_Unmarshal(b []byte) error { @@ -3345,6 +3466,7 @@ func (m *RelevantBatch) GetChargedAccounts() []*AccountDiff { return nil } +// Deprecated: Do not use. func (m *RelevantBatch) GetMatchedOrders() map[string]*MatchedOrder { if m != nil { return m.MatchedOrders @@ -3352,6 +3474,7 @@ func (m *RelevantBatch) GetMatchedOrders() map[string]*MatchedOrder { return nil } +// Deprecated: Do not use. func (m *RelevantBatch) GetClearingPriceRate() uint32 { if m != nil { return m.ClearingPriceRate @@ -3380,6 +3503,20 @@ func (m *RelevantBatch) GetFeeRateSatPerKw() uint64 { return 0 } +func (m *RelevantBatch) GetCreationTimestampNs() uint64 { + if m != nil { + return m.CreationTimestampNs + } + return 0 +} + +func (m *RelevantBatch) GetMatchedMarkets() map[uint32]*MatchedMarket { + if m != nil { + return m.MatchedMarkets + } + return nil +} + type ExecutionFee struct { // //The base fee in satoshis charged per order, regardless of the matched size. @@ -3396,7 +3533,7 @@ func (m *ExecutionFee) Reset() { *m = ExecutionFee{} } func (m *ExecutionFee) String() string { return proto.CompactTextString(m) } func (*ExecutionFee) ProtoMessage() {} func (*ExecutionFee) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{44} + return fileDescriptor_f3883418d94ca37f, []int{45} } func (m *ExecutionFee) XXX_Unmarshal(b []byte) error { @@ -3443,7 +3580,7 @@ func (m *NodeAddress) Reset() { *m = NodeAddress{} } func (m *NodeAddress) String() string { return proto.CompactTextString(m) } func (*NodeAddress) ProtoMessage() {} func (*NodeAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{45} + return fileDescriptor_f3883418d94ca37f, []int{46} } func (m *NodeAddress) XXX_Unmarshal(b []byte) error { @@ -3494,7 +3631,7 @@ func (m *OutPoint) Reset() { *m = OutPoint{} } func (m *OutPoint) String() string { return proto.CompactTextString(m) } func (*OutPoint) ProtoMessage() {} func (*OutPoint) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{46} + return fileDescriptor_f3883418d94ca37f, []int{47} } func (m *OutPoint) XXX_Unmarshal(b []byte) error { @@ -3547,7 +3684,7 @@ func (m *AskSnapshot) Reset() { *m = AskSnapshot{} } func (m *AskSnapshot) String() string { return proto.CompactTextString(m) } func (*AskSnapshot) ProtoMessage() {} func (*AskSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{47} + return fileDescriptor_f3883418d94ca37f, []int{48} } func (m *AskSnapshot) XXX_Unmarshal(b []byte) error { @@ -3614,7 +3751,7 @@ func (m *BidSnapshot) Reset() { *m = BidSnapshot{} } func (m *BidSnapshot) String() string { return proto.CompactTextString(m) } func (*BidSnapshot) ProtoMessage() {} func (*BidSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{48} + return fileDescriptor_f3883418d94ca37f, []int{49} } func (m *BidSnapshot) XXX_Unmarshal(b []byte) error { @@ -3683,7 +3820,7 @@ func (m *MatchedOrderSnapshot) Reset() { *m = MatchedOrderSnapshot{} } func (m *MatchedOrderSnapshot) String() string { return proto.CompactTextString(m) } func (*MatchedOrderSnapshot) ProtoMessage() {} func (*MatchedOrderSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{49} + return fileDescriptor_f3883418d94ca37f, []int{50} } func (m *MatchedOrderSnapshot) XXX_Unmarshal(b []byte) error { @@ -3751,7 +3888,7 @@ func (m *BatchSnapshotRequest) Reset() { *m = BatchSnapshotRequest{} } func (m *BatchSnapshotRequest) String() string { return proto.CompactTextString(m) } func (*BatchSnapshotRequest) ProtoMessage() {} func (*BatchSnapshotRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{50} + return fileDescriptor_f3883418d94ca37f, []int{51} } func (m *BatchSnapshotRequest) XXX_Unmarshal(b []byte) error { @@ -3779,6 +3916,58 @@ func (m *BatchSnapshotRequest) GetBatchId() []byte { return nil } +type MatchedMarketSnapshot struct { + // + //The set of all orders matched in the batch. + MatchedOrders []*MatchedOrderSnapshot `protobuf:"bytes,1,rep,name=matched_orders,json=matchedOrders,proto3" json:"matched_orders,omitempty"` + // + //The uniform clearing price rate in parts per billion that was used for this + //batch. + ClearingPriceRate uint32 `protobuf:"varint,2,opt,name=clearing_price_rate,json=clearingPriceRate,proto3" json:"clearing_price_rate,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MatchedMarketSnapshot) Reset() { *m = MatchedMarketSnapshot{} } +func (m *MatchedMarketSnapshot) String() string { return proto.CompactTextString(m) } +func (*MatchedMarketSnapshot) ProtoMessage() {} +func (*MatchedMarketSnapshot) Descriptor() ([]byte, []int) { + return fileDescriptor_f3883418d94ca37f, []int{52} +} + +func (m *MatchedMarketSnapshot) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MatchedMarketSnapshot.Unmarshal(m, b) +} +func (m *MatchedMarketSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MatchedMarketSnapshot.Marshal(b, m, deterministic) +} +func (m *MatchedMarketSnapshot) XXX_Merge(src proto.Message) { + xxx_messageInfo_MatchedMarketSnapshot.Merge(m, src) +} +func (m *MatchedMarketSnapshot) XXX_Size() int { + return xxx_messageInfo_MatchedMarketSnapshot.Size(m) +} +func (m *MatchedMarketSnapshot) XXX_DiscardUnknown() { + xxx_messageInfo_MatchedMarketSnapshot.DiscardUnknown(m) +} + +var xxx_messageInfo_MatchedMarketSnapshot proto.InternalMessageInfo + +func (m *MatchedMarketSnapshot) GetMatchedOrders() []*MatchedOrderSnapshot { + if m != nil { + return m.MatchedOrders + } + return nil +} + +func (m *MatchedMarketSnapshot) GetClearingPriceRate() uint32 { + if m != nil { + return m.ClearingPriceRate + } + return 0 +} + type BatchSnapshotResponse struct { // The version of the batch. Version uint32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` @@ -3786,26 +3975,34 @@ type BatchSnapshotResponse struct { BatchId []byte `protobuf:"bytes,2,opt,name=batch_id,json=batchId,proto3" json:"batch_id,omitempty"` // The unique identifier of the prior batch. PrevBatchId []byte `protobuf:"bytes,3,opt,name=prev_batch_id,json=prevBatchId,proto3" json:"prev_batch_id,omitempty"` - // The uniform clearing price rate in parts per billion of the batch. - ClearingPriceRate uint32 `protobuf:"varint,4,opt,name=clearing_price_rate,json=clearingPriceRate,proto3" json:"clearing_price_rate,omitempty"` - // The set of all orders matched in the batch. - MatchedOrders []*MatchedOrderSnapshot `protobuf:"bytes,5,rep,name=matched_orders,json=matchedOrders,proto3" json:"matched_orders,omitempty"` + // + //Deprecated, use matched_markets. + ClearingPriceRate uint32 `protobuf:"varint,4,opt,name=clearing_price_rate,json=clearingPriceRate,proto3" json:"clearing_price_rate,omitempty"` // Deprecated: Do not use. + // + //Deprecated, use matched_markets. + MatchedOrders []*MatchedOrderSnapshot `protobuf:"bytes,5,rep,name=matched_orders,json=matchedOrders,proto3" json:"matched_orders,omitempty"` // Deprecated: Do not use. // The txid of the batch transaction. BatchTxId string `protobuf:"bytes,7,opt,name=batch_tx_id,json=batchTxId,proto3" json:"batch_tx_id,omitempty"` // The batch transaction including all witness data. BatchTx []byte `protobuf:"bytes,6,opt,name=batch_tx,json=batchTx,proto3" json:"batch_tx,omitempty"` // The fee rate, in satoshis per kiloweight, of the batch transaction. - BatchTxFeeRateSatPerKw uint64 `protobuf:"varint,8,opt,name=batch_tx_fee_rate_sat_per_kw,json=batchTxFeeRateSatPerKw,proto3" json:"batch_tx_fee_rate_sat_per_kw,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + BatchTxFeeRateSatPerKw uint64 `protobuf:"varint,8,opt,name=batch_tx_fee_rate_sat_per_kw,json=batchTxFeeRateSatPerKw,proto3" json:"batch_tx_fee_rate_sat_per_kw,omitempty"` + // The unix timestamp in nanoseconds the batch was made. + CreationTimestampNs uint64 `protobuf:"varint,9,opt,name=creation_timestamp_ns,json=creationTimestampNs,proto3" json:"creation_timestamp_ns,omitempty"` + // + //Maps the distinct lease duration markets to the orders that were matched + //within and the discovered market clearing price. + MatchedMarkets map[uint32]*MatchedMarketSnapshot `protobuf:"bytes,10,rep,name=matched_markets,json=matchedMarkets,proto3" json:"matched_markets,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *BatchSnapshotResponse) Reset() { *m = BatchSnapshotResponse{} } func (m *BatchSnapshotResponse) String() string { return proto.CompactTextString(m) } func (*BatchSnapshotResponse) ProtoMessage() {} func (*BatchSnapshotResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{51} + return fileDescriptor_f3883418d94ca37f, []int{53} } func (m *BatchSnapshotResponse) XXX_Unmarshal(b []byte) error { @@ -3847,6 +4044,7 @@ func (m *BatchSnapshotResponse) GetPrevBatchId() []byte { return nil } +// Deprecated: Do not use. func (m *BatchSnapshotResponse) GetClearingPriceRate() uint32 { if m != nil { return m.ClearingPriceRate @@ -3854,6 +4052,7 @@ func (m *BatchSnapshotResponse) GetClearingPriceRate() uint32 { return 0 } +// Deprecated: Do not use. func (m *BatchSnapshotResponse) GetMatchedOrders() []*MatchedOrderSnapshot { if m != nil { return m.MatchedOrders @@ -3882,6 +4081,20 @@ func (m *BatchSnapshotResponse) GetBatchTxFeeRateSatPerKw() uint64 { return 0 } +func (m *BatchSnapshotResponse) GetCreationTimestampNs() uint64 { + if m != nil { + return m.CreationTimestampNs + } + return 0 +} + +func (m *BatchSnapshotResponse) GetMatchedMarkets() map[uint32]*MatchedMarketSnapshot { + if m != nil { + return m.MatchedMarkets + } + return nil +} + type ServerNodeRatingRequest struct { // The target node to obtain ratings information for. NodePubkeys [][]byte `protobuf:"bytes,1,rep,name=node_pubkeys,json=nodePubkeys,proto3" json:"node_pubkeys,omitempty"` @@ -3894,7 +4107,7 @@ func (m *ServerNodeRatingRequest) Reset() { *m = ServerNodeRatingRequest func (m *ServerNodeRatingRequest) String() string { return proto.CompactTextString(m) } func (*ServerNodeRatingRequest) ProtoMessage() {} func (*ServerNodeRatingRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{52} + return fileDescriptor_f3883418d94ca37f, []int{54} } func (m *ServerNodeRatingRequest) XXX_Unmarshal(b []byte) error { @@ -3936,7 +4149,7 @@ func (m *NodeRating) Reset() { *m = NodeRating{} } func (m *NodeRating) String() string { return proto.CompactTextString(m) } func (*NodeRating) ProtoMessage() {} func (*NodeRating) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{53} + return fileDescriptor_f3883418d94ca37f, []int{55} } func (m *NodeRating) XXX_Unmarshal(b []byte) error { @@ -3983,7 +4196,7 @@ func (m *ServerNodeRatingResponse) Reset() { *m = ServerNodeRatingRespon func (m *ServerNodeRatingResponse) String() string { return proto.CompactTextString(m) } func (*ServerNodeRatingResponse) ProtoMessage() {} func (*ServerNodeRatingResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{54} + return fileDescriptor_f3883418d94ca37f, []int{56} } func (m *ServerNodeRatingResponse) XXX_Unmarshal(b []byte) error { @@ -4030,7 +4243,7 @@ func (m *BatchSnapshotsRequest) Reset() { *m = BatchSnapshotsRequest{} } func (m *BatchSnapshotsRequest) String() string { return proto.CompactTextString(m) } func (*BatchSnapshotsRequest) ProtoMessage() {} func (*BatchSnapshotsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{55} + return fileDescriptor_f3883418d94ca37f, []int{57} } func (m *BatchSnapshotsRequest) XXX_Unmarshal(b []byte) error { @@ -4077,7 +4290,7 @@ func (m *BatchSnapshotsResponse) Reset() { *m = BatchSnapshotsResponse{} func (m *BatchSnapshotsResponse) String() string { return proto.CompactTextString(m) } func (*BatchSnapshotsResponse) ProtoMessage() {} func (*BatchSnapshotsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_f3883418d94ca37f, []int{56} + return fileDescriptor_f3883418d94ca37f, []int{58} } func (m *BatchSnapshotsResponse) XXX_Unmarshal(b []byte) error { @@ -4110,6 +4323,7 @@ func init() { proto.RegisterEnum("poolrpc.AuctionAccountState", AuctionAccountState_name, AuctionAccountState_value) proto.RegisterEnum("poolrpc.NodeTier", NodeTier_name, NodeTier_value) proto.RegisterEnum("poolrpc.OrderState", OrderState_name, OrderState_value) + proto.RegisterEnum("poolrpc.DurationBucketState", DurationBucketState_name, DurationBucketState_value) proto.RegisterEnum("poolrpc.OrderMatchReject_RejectReason", OrderMatchReject_RejectReason_name, OrderMatchReject_RejectReason_value) proto.RegisterEnum("poolrpc.OrderReject_OrderRejectReason", OrderReject_OrderRejectReason_name, OrderReject_OrderRejectReason_value) proto.RegisterEnum("poolrpc.SubscribeError_Error", SubscribeError_Error_name, SubscribeError_Error_value) @@ -4138,7 +4352,10 @@ func init() { proto.RegisterType((*ServerAuctionMessage)(nil), "poolrpc.ServerAuctionMessage") proto.RegisterType((*ServerChallenge)(nil), "poolrpc.ServerChallenge") proto.RegisterType((*SubscribeSuccess)(nil), "poolrpc.SubscribeSuccess") + proto.RegisterType((*MatchedMarket)(nil), "poolrpc.MatchedMarket") + proto.RegisterMapType((map[string]*MatchedOrder)(nil), "poolrpc.MatchedMarket.MatchedOrdersEntry") proto.RegisterType((*OrderMatchPrepare)(nil), "poolrpc.OrderMatchPrepare") + proto.RegisterMapType((map[uint32]*MatchedMarket)(nil), "poolrpc.OrderMatchPrepare.MatchedMarketsEntry") proto.RegisterMapType((map[string]*MatchedOrder)(nil), "poolrpc.OrderMatchPrepare.MatchedOrdersEntry") proto.RegisterType((*OrderMatchSignBegin)(nil), "poolrpc.OrderMatchSignBegin") proto.RegisterType((*OrderMatchFinalize)(nil), "poolrpc.OrderMatchFinalize") @@ -4162,9 +4379,11 @@ func init() { proto.RegisterType((*ServerOrderStateResponse)(nil), "poolrpc.ServerOrderStateResponse") proto.RegisterType((*TermsRequest)(nil), "poolrpc.TermsRequest") proto.RegisterType((*TermsResponse)(nil), "poolrpc.TermsResponse") + proto.RegisterMapType((map[uint32]DurationBucketState)(nil), "poolrpc.TermsResponse.LeaseDurationBucketsEntry") proto.RegisterMapType((map[uint32]bool)(nil), "poolrpc.TermsResponse.LeaseDurationsEntry") proto.RegisterType((*RelevantBatchRequest)(nil), "poolrpc.RelevantBatchRequest") proto.RegisterType((*RelevantBatch)(nil), "poolrpc.RelevantBatch") + proto.RegisterMapType((map[uint32]*MatchedMarket)(nil), "poolrpc.RelevantBatch.MatchedMarketsEntry") proto.RegisterMapType((map[string]*MatchedOrder)(nil), "poolrpc.RelevantBatch.MatchedOrdersEntry") proto.RegisterType((*ExecutionFee)(nil), "poolrpc.ExecutionFee") proto.RegisterType((*NodeAddress)(nil), "poolrpc.NodeAddress") @@ -4173,7 +4392,9 @@ func init() { proto.RegisterType((*BidSnapshot)(nil), "poolrpc.BidSnapshot") proto.RegisterType((*MatchedOrderSnapshot)(nil), "poolrpc.MatchedOrderSnapshot") proto.RegisterType((*BatchSnapshotRequest)(nil), "poolrpc.BatchSnapshotRequest") + proto.RegisterType((*MatchedMarketSnapshot)(nil), "poolrpc.MatchedMarketSnapshot") proto.RegisterType((*BatchSnapshotResponse)(nil), "poolrpc.BatchSnapshotResponse") + proto.RegisterMapType((map[uint32]*MatchedMarketSnapshot)(nil), "poolrpc.BatchSnapshotResponse.MatchedMarketsEntry") proto.RegisterType((*ServerNodeRatingRequest)(nil), "poolrpc.ServerNodeRatingRequest") proto.RegisterType((*NodeRating)(nil), "poolrpc.NodeRating") proto.RegisterType((*ServerNodeRatingResponse)(nil), "poolrpc.ServerNodeRatingResponse") @@ -4184,246 +4405,263 @@ func init() { func init() { proto.RegisterFile("auctioneer.proto", fileDescriptor_f3883418d94ca37f) } var fileDescriptor_f3883418d94ca37f = []byte{ - // 3822 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x3a, 0x4b, 0x73, 0xe3, 0xd8, - 0x5a, 0xf1, 0x23, 0xb1, 0xfd, 0x59, 0x76, 0x94, 0x93, 0x47, 0x3b, 0x9e, 0x4e, 0x4f, 0x5a, 0x33, - 0x77, 0xc8, 0x64, 0x66, 0x32, 0x33, 0xe9, 0xb9, 0x4d, 0xdf, 0xb9, 0xcd, 0x80, 0x6c, 0x2b, 0xd7, - 0xee, 0x76, 0x6c, 0x8f, 0x6c, 0x77, 0x4f, 0x5f, 0x8a, 0x52, 0xc9, 0xf6, 0xb1, 0x23, 0x62, 0x4b, - 0x46, 0x92, 0xbb, 0x13, 0x16, 0x77, 0x71, 0x77, 0xfc, 0x00, 0x0a, 0xaa, 0x28, 0x76, 0xec, 0xa1, - 0x60, 0xc3, 0x92, 0x62, 0xc1, 0xcf, 0xe0, 0x42, 0x15, 0x3f, 0x80, 0x2d, 0x3b, 0xea, 0x3c, 0x24, - 0x4b, 0xb2, 0x9c, 0x34, 0x03, 0x54, 0xdd, 0x4d, 0x22, 0x7d, 0x8f, 0x73, 0xbe, 0xef, 0x9c, 0xef, - 0x2d, 0x83, 0xa8, 0x2f, 0x86, 0xae, 0x61, 0x99, 0x18, 0xdb, 0x67, 0x73, 0xdb, 0x72, 0x2d, 0x94, - 0x99, 0x5b, 0xd6, 0xd4, 0x9e, 0x0f, 0xa5, 0x5f, 0x27, 0x60, 0x5f, 0xc5, 0x0e, 0xb6, 0xdf, 0x62, - 0x79, 0x38, 0xb4, 0x16, 0xa6, 0xab, 0xe2, 0x3f, 0x59, 0x60, 0xc7, 0x45, 0x1f, 0x41, 0x41, 0x67, - 0x10, 0xed, 0xad, 0x3e, 0x5d, 0xe0, 0x52, 0xe2, 0x38, 0x71, 0x92, 0x56, 0x05, 0x0e, 0x7c, 0x45, - 0x60, 0xe8, 0x27, 0x50, 0xf4, 0x88, 0xf0, 0xcd, 0xdc, 0xb0, 0x6f, 0x4b, 0xc9, 0xe3, 0xc4, 0x49, - 0x41, 0xf5, 0x58, 0x15, 0x0a, 0x44, 0x47, 0x00, 0xae, 0xad, 0x8f, 0xb0, 0xad, 0x5d, 0xe3, 0xdb, - 0x52, 0xea, 0x38, 0x71, 0x22, 0xa8, 0x39, 0x06, 0x79, 0x89, 0x6f, 0xa5, 0x6b, 0x38, 0x88, 0xca, - 0xe0, 0xcc, 0x2d, 0xd3, 0x61, 0xeb, 0xfb, 0xb2, 0x53, 0xe6, 0x04, 0x65, 0x2e, 0x2c, 0xa1, 0x2f, - 0xf1, 0x2d, 0x3a, 0x85, 0x1d, 0xc3, 0x34, 0x5c, 0x43, 0x9f, 0x6a, 0x03, 0xdd, 0x1d, 0x5e, 0x51, - 0xca, 0x24, 0xa5, 0xdc, 0xe6, 0x88, 0x0a, 0x81, 0x93, 0xcd, 0xfe, 0x23, 0x01, 0xa5, 0x2e, 0xd9, - 0xcb, 0x6e, 0x98, 0x86, 0x1b, 0x51, 0xfa, 0xe9, 0x52, 0xe9, 0xb9, 0x65, 0x98, 0x2e, 0xdd, 0x2e, - 0x7f, 0xbe, 0x73, 0xc6, 0xcf, 0xeb, 0xac, 0xbd, 0x70, 0x3b, 0x04, 0xe1, 0x9f, 0x03, 0x7d, 0x0b, - 0x9e, 0x83, 0x33, 0xb4, 0x8d, 0xb9, 0xcb, 0x77, 0xf7, 0x56, 0xeb, 0x52, 0xe0, 0xea, 0x99, 0xa6, - 0xde, 0xeb, 0x4c, 0xd3, 0xf7, 0x9f, 0xe9, 0x66, 0xf4, 0x4c, 0x3f, 0x80, 0xc3, 0x18, 0x2d, 0xd9, - 0xb1, 0x4a, 0x0b, 0xef, 0x08, 0xba, 0x8b, 0xc1, 0xcc, 0x70, 0xdb, 0xf6, 0x08, 0xdb, 0xde, 0x11, - 0x7c, 0x02, 0x29, 0xdd, 0xb9, 0xe6, 0x8a, 0x23, 0x5f, 0x71, 0x46, 0x2f, 0x3b, 0xd7, 0xf5, 0x0d, - 0x95, 0x10, 0x10, 0xba, 0x81, 0x31, 0xa2, 0x7a, 0xae, 0xd2, 0x55, 0x8c, 0x11, 0xa1, 0x1b, 0x18, - 0xa3, 0x4a, 0x0e, 0x32, 0x23, 0xec, 0xea, 0xc6, 0xd4, 0x21, 0xc6, 0x76, 0x18, 0xb3, 0x2f, 0xbf, - 0xeb, 0xe7, 0x50, 0x30, 0xcc, 0xb7, 0xfa, 0xd4, 0x18, 0x69, 0x16, 0x41, 0x70, 0x11, 0xf6, 0xfd, - 0xa5, 0x1b, 0x0c, 0x4b, 0xb9, 0xea, 0x1b, 0xaa, 0x60, 0x04, 0xde, 0xd1, 0x43, 0xc8, 0xea, 0xc3, - 0x21, 0x9e, 0xbb, 0x98, 0xc9, 0x94, 0xad, 0x6f, 0xa8, 0x3e, 0x24, 0x28, 0x44, 0xd3, 0xd3, 0xbd, - 0xaa, 0x9b, 0x43, 0x3c, 0x0d, 0xe9, 0xfe, 0x15, 0xec, 0xd1, 0xad, 0x35, 0xd3, 0x32, 0x87, 0x58, - 0x9b, 0xdb, 0xd8, 0x98, 0xe9, 0x13, 0xcc, 0x8d, 0x0e, 0x51, 0x5c, 0x8b, 0xa0, 0x3a, 0x1c, 0xb3, - 0x3c, 0xe6, 0xd0, 0x6a, 0xfc, 0x98, 0xff, 0x2d, 0x09, 0x7b, 0xd5, 0xa9, 0x81, 0x4d, 0x57, 0x66, - 0xe6, 0x7a, 0x89, 0x1d, 0x47, 0x9f, 0x60, 0xf4, 0x0d, 0x6c, 0x0d, 0xad, 0xd9, 0xcc, 0xf0, 0xec, - 0xab, 0xec, 0xeb, 0xc8, 0x6f, 0xaa, 0x4a, 0xb1, 0x33, 0x6c, 0xba, 0xf5, 0x0d, 0x95, 0xd3, 0xa2, - 0xe7, 0x90, 0x73, 0x16, 0x03, 0x62, 0x5f, 0x03, 0xcc, 0xcf, 0xfd, 0x61, 0x94, 0xb1, 0xcb, 0x08, - 0xe6, 0x64, 0xb7, 0xfa, 0x86, 0xba, 0x64, 0x40, 0x4f, 0x60, 0x8b, 0x1d, 0x07, 0x35, 0xba, 0xfc, - 0xf9, 0xe1, 0xd2, 0xa6, 0x89, 0xd0, 0x97, 0xc4, 0x3f, 0x64, 0x4a, 0x40, 0xb6, 0x64, 0xa4, 0x84, - 0xc9, 0xc6, 0x7f, 0x8c, 0x87, 0x2e, 0xb5, 0xc1, 0x78, 0x26, 0x95, 0x12, 0x10, 0x26, 0x46, 0x8a, - 0xbe, 0x80, 0xb4, 0x63, 0x4c, 0x4c, 0x6a, 0x93, 0xf9, 0xf3, 0x07, 0x31, 0x2c, 0x5d, 0x63, 0x42, - 0xa4, 0xa3, 0x64, 0xe8, 0x1b, 0xc8, 0xd8, 0x78, 0x68, 0xbd, 0xc5, 0x76, 0x69, 0x8b, 0x72, 0x94, - 0xa2, 0x4a, 0xa9, 0x0c, 0x7d, 0x5b, 0xdf, 0x50, 0x3d, 0xd2, 0xca, 0x26, 0xa4, 0x66, 0xce, 0x44, - 0x7a, 0x03, 0x3b, 0x2b, 0x47, 0x86, 0x3e, 0x84, 0x3c, 0x3b, 0x32, 0xed, 0x4a, 0x77, 0xae, 0xf8, - 0xed, 0x01, 0x03, 0xd5, 0x75, 0xe7, 0x8a, 0xf8, 0x21, 0x8b, 0x13, 0x6f, 0xb1, 0xed, 0x18, 0x96, - 0xc9, 0xa3, 0x96, 0x40, 0x81, 0xaf, 0x18, 0x4c, 0xb2, 0x61, 0x37, 0xe6, 0x50, 0x23, 0x7e, 0x97, - 0x88, 0xf8, 0x1d, 0x7a, 0x0c, 0x02, 0xdf, 0x9b, 0xda, 0x10, 0x8f, 0x03, 0x5c, 0x1e, 0x6a, 0x3b, - 0xe8, 0x10, 0xb2, 0xfa, 0xc2, 0xbd, 0xd2, 0x1c, 0x63, 0xc2, 0x63, 0x61, 0x86, 0xbc, 0x77, 0x8d, - 0x89, 0xf4, 0x05, 0x88, 0xd1, 0xdb, 0x20, 0xe4, 0x4c, 0x58, 0x63, 0xc4, 0xb7, 0xcb, 0xd0, 0xf7, - 0xc6, 0x48, 0xfa, 0x9b, 0x54, 0x90, 0x9e, 0x5d, 0xc4, 0x1d, 0xf4, 0xe8, 0x80, 0x5c, 0xa7, 0xee, - 0x70, 0x85, 0x73, 0x2a, 0x7f, 0x43, 0xbf, 0x80, 0x3c, 0x7b, 0xd2, 0x86, 0xd6, 0x88, 0x45, 0xa5, - 0xe2, 0xf9, 0x27, 0x6b, 0xef, 0xfa, 0x8c, 0xfd, 0x53, 0x29, 0x8b, 0x0a, 0x8c, 0xb5, 0x6a, 0x8d, - 0x30, 0x7a, 0x05, 0xdb, 0xcc, 0x08, 0x30, 0x77, 0x62, 0xa7, 0x94, 0x3e, 0x4e, 0x9d, 0xe4, 0xcf, - 0xbf, 0xb8, 0x6f, 0x31, 0xcc, 0xfc, 0xd8, 0x51, 0x4c, 0xd7, 0xbe, 0x55, 0x8b, 0x76, 0x08, 0x58, - 0x7e, 0x0d, 0xbb, 0x31, 0x64, 0x48, 0x84, 0x94, 0x77, 0x09, 0x39, 0x95, 0x3c, 0xa2, 0x53, 0xd8, - 0x64, 0x91, 0x95, 0xf9, 0xc7, 0x5e, 0x78, 0x5b, 0x2e, 0x37, 0x23, 0xf9, 0x36, 0xf9, 0x2c, 0x21, - 0x0d, 0x41, 0x08, 0x2a, 0x83, 0xf2, 0x90, 0xe9, 0xb7, 0x5e, 0xb6, 0xda, 0xaf, 0x5b, 0xe2, 0x06, - 0x3a, 0x00, 0xd4, 0x55, 0xd4, 0x57, 0x8a, 0xaa, 0x5d, 0x36, 0xba, 0x15, 0xa5, 0x2e, 0xbf, 0x6a, - 0xb4, 0x55, 0x31, 0x81, 0xca, 0x70, 0x50, 0x91, 0x7b, 0xd5, 0xba, 0xf6, 0x4a, 0x51, 0xbb, 0x8d, - 0x76, 0x8b, 0xa0, 0x2f, 0x09, 0x40, 0x4c, 0x22, 0x04, 0xc5, 0x8e, 0xac, 0xf6, 0x1a, 0x72, 0x53, - 0x53, 0x95, 0x17, 0x4a, 0xb5, 0x27, 0xa6, 0xa4, 0x7f, 0x48, 0x40, 0x3e, 0xb0, 0x7f, 0xe0, 0x1a, - 0x12, 0x77, 0x5d, 0x43, 0x32, 0xee, 0x1a, 0xf8, 0xa1, 0x05, 0xd5, 0x59, 0xb9, 0x06, 0xa9, 0x0a, - 0x3b, 0x2b, 0x04, 0x44, 0xb2, 0x5a, 0xbf, 0xd3, 0x6c, 0x54, 0xe5, 0x9e, 0xa2, 0x75, 0x14, 0x45, - 0x15, 0x37, 0x88, 0x26, 0xd5, 0xba, 0xdc, 0x6a, 0x29, 0x4d, 0xed, 0xa2, 0xdf, 0xaa, 0x35, 0x5a, - 0xbf, 0xd0, 0x2e, 0xe4, 0x46, 0x53, 0xa9, 0x89, 0x09, 0xe9, 0xbf, 0x12, 0x90, 0xaf, 0x5e, 0xe9, - 0xa6, 0x89, 0xa7, 0x0d, 0x73, 0x6c, 0xa1, 0x13, 0x48, 0xbb, 0xb7, 0x73, 0x16, 0x0c, 0x8b, 0x81, - 0x93, 0xe5, 0x34, 0xbd, 0xdb, 0x39, 0x56, 0x29, 0x05, 0xfa, 0x18, 0x8a, 0x53, 0x6b, 0xa8, 0x4f, - 0x35, 0xd3, 0x1a, 0xe1, 0x40, 0x2e, 0x16, 0x28, 0xb4, 0x65, 0x8d, 0x30, 0xf1, 0x94, 0x4f, 0x88, - 0xad, 0xcc, 0x2c, 0x17, 0x2f, 0xc9, 0x98, 0x37, 0x14, 0x18, 0xd8, 0xa3, 0xfb, 0x5d, 0x28, 0xb1, - 0xd5, 0xe6, 0xfa, 0x2d, 0x71, 0x6f, 0x6d, 0xa0, 0x3b, 0x98, 0xa7, 0xe7, 0x34, 0x65, 0xd8, 0xa7, - 0xf8, 0x0e, 0x43, 0x57, 0x74, 0x07, 0xb3, 0xa4, 0xfc, 0x33, 0x38, 0xe4, 0x1b, 0xc4, 0x70, 0xb2, - 0x84, 0x79, 0xc0, 0x08, 0xa2, 0xac, 0xd2, 0x6f, 0x92, 0x50, 0x0c, 0x87, 0xab, 0xbb, 0xdc, 0xea, - 0x25, 0x08, 0x7e, 0xf6, 0x37, 0x26, 0x4e, 0x29, 0x49, 0x4d, 0xfe, 0x64, 0x4d, 0xe0, 0xf3, 0x43, - 0xb5, 0x31, 0xe1, 0xd6, 0x9e, 0xd7, 0x97, 0x10, 0xd4, 0x82, 0xc2, 0x90, 0x9d, 0xa8, 0x66, 0x98, - 0x63, 0xcb, 0x29, 0xa5, 0xe8, 0x6a, 0x9f, 0xae, 0x5b, 0x2d, 0x70, 0x45, 0x7c, 0x39, 0x61, 0x18, - 0x00, 0x95, 0xbf, 0x03, 0x31, 0xba, 0x61, 0x8c, 0xdf, 0xec, 0x05, 0xfd, 0x46, 0x08, 0x78, 0x48, - 0xb9, 0x0f, 0x3b, 0x2b, 0x5b, 0xfc, 0x4f, 0x1c, 0x2f, 0xc0, 0x1c, 0x74, 0xbc, 0xaf, 0x60, 0x3b, - 0x12, 0xdd, 0xef, 0x89, 0xac, 0xd2, 0x5f, 0xa5, 0x60, 0x8f, 0x57, 0x21, 0xe1, 0x6c, 0xfa, 0x0c, - 0x72, 0xc3, 0x2b, 0x7d, 0x3a, 0xc5, 0x26, 0x4f, 0xd5, 0xc1, 0x14, 0xc2, 0xb3, 0xb3, 0x87, 0x27, - 0x39, 0xd1, 0x27, 0x46, 0x3f, 0x85, 0x8c, 0xb3, 0x18, 0x0e, 0xb1, 0xe3, 0x70, 0xb1, 0x97, 0xf9, - 0xad, 0xeb, 0x25, 0xce, 0x2e, 0x23, 0x20, 0xb9, 0x87, 0xd3, 0xa2, 0x2f, 0x61, 0x13, 0xdb, 0xb6, - 0x65, 0xf3, 0x4c, 0xfa, 0x60, 0x95, 0x49, 0x21, 0xe8, 0xfa, 0x86, 0xca, 0xe8, 0xd0, 0x53, 0xc8, - 0xcc, 0x6d, 0x3c, 0xd7, 0x6d, 0xcc, 0xf3, 0x68, 0x39, 0xe6, 0x36, 0x3b, 0x8c, 0x82, 0x6c, 0xc4, - 0x89, 0xd1, 0x79, 0x28, 0x93, 0x3e, 0x5c, 0x63, 0x02, 0x15, 0x3c, 0x31, 0x96, 0xe9, 0xf4, 0x67, - 0x90, 0x1d, 0x1b, 0xa6, 0x3e, 0x35, 0xfe, 0x14, 0xf3, 0x7c, 0xfa, 0x41, 0x0c, 0xdf, 0x05, 0x27, - 0x21, 0x55, 0x92, 0x47, 0x8e, 0x9e, 0x40, 0x86, 0x5b, 0x62, 0x29, 0x13, 0xd1, 0x8c, 0x1f, 0x39, - 0xbf, 0x32, 0x22, 0x23, 0xa7, 0xf4, 0x12, 0x71, 0x07, 0xb6, 0x23, 0x47, 0x8d, 0x1e, 0x46, 0xef, - 0x45, 0x08, 0x9e, 0x7d, 0x24, 0x49, 0x27, 0xa3, 0x49, 0x5a, 0xfa, 0x1a, 0xc4, 0xe8, 0x25, 0xdc, - 0x67, 0x22, 0x7f, 0x97, 0xe6, 0x81, 0x2f, 0x78, 0xa0, 0xa8, 0x07, 0xc5, 0x19, 0x79, 0x5f, 0xe6, - 0xa4, 0xc4, 0xda, 0x9c, 0xc4, 0x79, 0xce, 0x2e, 0x19, 0x43, 0x30, 0x27, 0x15, 0x66, 0x41, 0x18, - 0x3a, 0x83, 0xdd, 0xe1, 0x14, 0xeb, 0xb6, 0x61, 0x4e, 0xb4, 0xb9, 0x6d, 0x0c, 0xb1, 0x66, 0xeb, - 0x2e, 0xe6, 0x95, 0xc4, 0x8e, 0x87, 0xea, 0x10, 0x8c, 0xaa, 0xbb, 0x18, 0xfd, 0x3e, 0x88, 0xc3, - 0x2b, 0xdd, 0x9e, 0xe0, 0x91, 0xc6, 0x8f, 0xce, 0x73, 0xed, 0xbd, 0x68, 0xbd, 0x53, 0x33, 0xc6, - 0x63, 0x75, 0x9b, 0x53, 0x73, 0x98, 0x83, 0xbe, 0x85, 0x02, 0xbe, 0xc1, 0xc3, 0x05, 0xb9, 0x07, - 0x6d, 0x8c, 0x3d, 0x53, 0x5a, 0xd6, 0xc7, 0x8a, 0x87, 0xbd, 0xc0, 0x58, 0x15, 0x70, 0xe0, 0x0d, - 0x7d, 0x06, 0x3b, 0x2c, 0x78, 0xb9, 0xb6, 0x6e, 0x3a, 0x3a, 0xbd, 0x4b, 0x1e, 0x02, 0x45, 0x8a, - 0xe8, 0x2d, 0xe1, 0xe8, 0x73, 0xd8, 0x1d, 0x63, 0xa6, 0x8e, 0xe6, 0xe8, 0xae, 0x36, 0x27, 0xc7, - 0xfd, 0x8e, 0x1a, 0x53, 0x5a, 0xdd, 0x1e, 0x63, 0xaa, 0x4f, 0x57, 0x77, 0x3b, 0xd8, 0x7e, 0xf9, - 0x8e, 0x04, 0x7b, 0x4a, 0x8d, 0x07, 0x9c, 0x9e, 0xda, 0x4e, 0x5a, 0x15, 0x08, 0x21, 0x05, 0x76, - 0xf5, 0x70, 0x51, 0x92, 0x0d, 0x47, 0xcf, 0x95, 0x62, 0x2c, 0xb7, 0x5a, 0x8c, 0x95, 0x5f, 0x03, - 0x5a, 0xbd, 0x92, 0x98, 0x30, 0xf4, 0x59, 0x38, 0x0c, 0x2d, 0x0f, 0x27, 0xc8, 0x1d, 0x8e, 0x43, - 0xbb, 0x31, 0xde, 0x74, 0x57, 0xd1, 0x65, 0x01, 0x5a, 0xf5, 0xa3, 0xbb, 0xd2, 0xc3, 0x11, 0x00, - 0x3f, 0xfc, 0x1b, 0xde, 0x30, 0x09, 0x6a, 0x8e, 0x9d, 0xfa, 0x8d, 0x31, 0x22, 0x8e, 0x70, 0x85, - 0x8d, 0xc9, 0x95, 0xab, 0x5d, 0x91, 0xc4, 0x94, 0xa2, 0xda, 0x03, 0x03, 0xd5, 0x49, 0x32, 0xfa, - 0xc7, 0x24, 0x14, 0xc3, 0x91, 0x85, 0x84, 0x6b, 0x16, 0x81, 0x98, 0xea, 0x3c, 0xcc, 0x3c, 0x07, - 0xa0, 0x0f, 0xc1, 0xf2, 0xe1, 0x68, 0x4d, 0x70, 0x3a, 0xa3, 0x7f, 0xd5, 0x1c, 0x65, 0xa0, 0xb5, - 0xdb, 0xdd, 0x4d, 0x3a, 0xaa, 0xc3, 0xae, 0x97, 0xe4, 0x6c, 0xda, 0xac, 0xeb, 0xd4, 0x88, 0xd2, - 0x77, 0x06, 0x0a, 0x15, 0xe9, 0x7e, 0xeb, 0xe9, 0xb1, 0x48, 0x06, 0x6c, 0x32, 0x2d, 0x42, 0xc5, - 0xd6, 0x2e, 0x6c, 0xf3, 0x62, 0xab, 0x5b, 0xef, 0xf7, 0x6a, 0x04, 0x48, 0x2b, 0x2d, 0xb9, 0x5a, - 0x6d, 0xf7, 0x5b, 0x3d, 0xad, 0xd6, 0x56, 0xba, 0x5a, 0xab, 0xdd, 0xd3, 0x94, 0x1f, 0x1a, 0xdd, - 0x9e, 0x98, 0x44, 0x12, 0x3c, 0x6a, 0xb4, 0xaa, 0xed, 0xcb, 0x4e, 0x53, 0xe9, 0x29, 0x9a, 0x47, - 0xa6, 0x2a, 0x64, 0x15, 0xb9, 0xd7, 0x68, 0xb7, 0xc4, 0x94, 0xf4, 0xcf, 0x49, 0x28, 0x86, 0x25, - 0x5a, 0x66, 0x3a, 0x36, 0xcf, 0x60, 0x2f, 0xa4, 0x24, 0x0b, 0x0d, 0x30, 0xf8, 0xdb, 0x7d, 0x87, - 0xb2, 0x3a, 0x9f, 0x48, 0xc7, 0xcd, 0x27, 0x3e, 0x80, 0xdc, 0x72, 0x2e, 0xc1, 0xdc, 0x8e, 0x59, - 0x0b, 0x41, 0x9e, 0xc3, 0xa6, 0xe3, 0x92, 0xd0, 0xb1, 0x45, 0x2f, 0xec, 0xe1, 0x9a, 0xa3, 0xec, - 0x12, 0x1a, 0x95, 0x91, 0x46, 0x6d, 0x26, 0x13, 0xb5, 0x19, 0xf4, 0x05, 0x64, 0xad, 0x85, 0xcb, - 0x4a, 0x9d, 0xec, 0xba, 0x19, 0x86, 0x4f, 0x42, 0x04, 0x9c, 0xea, 0x2e, 0x76, 0x5c, 0xcd, 0xbd, - 0xa1, 0xfe, 0x27, 0xa8, 0x59, 0x06, 0xe8, 0xdd, 0x48, 0xbf, 0x02, 0x21, 0xe8, 0x3d, 0xe8, 0x29, - 0x08, 0x5e, 0x3c, 0x1d, 0x18, 0x23, 0x2f, 0x9a, 0xee, 0x46, 0x5d, 0xad, 0x62, 0x8c, 0xd4, 0xfc, - 0xcc, 0x7f, 0x76, 0x82, 0x7c, 0xba, 0x73, 0xed, 0x95, 0x49, 0x2b, 0x7c, 0xb2, 0x73, 0xed, 0xf3, - 0xc9, 0xce, 0xb5, 0x23, 0xf5, 0x01, 0x96, 0x28, 0xf4, 0xf1, 0x3d, 0xf3, 0x09, 0x36, 0x9d, 0x78, - 0x0c, 0xc2, 0xc2, 0x34, 0x5c, 0x47, 0x1b, 0x1b, 0xd3, 0x29, 0x1f, 0x09, 0x14, 0xd4, 0x3c, 0x85, - 0x5d, 0x50, 0x50, 0x60, 0xd9, 0x8a, 0x31, 0x22, 0xcb, 0x0e, 0xb8, 0xeb, 0xc6, 0x8e, 0x33, 0xe8, - 0x30, 0xe3, 0x7d, 0x96, 0xfd, 0xa7, 0x24, 0xe4, 0x03, 0x71, 0x9c, 0x98, 0x08, 0x36, 0x47, 0x24, - 0x4b, 0x0c, 0xf4, 0xa9, 0x4e, 0x5a, 0x42, 0x66, 0x78, 0x05, 0x06, 0xad, 0x30, 0x20, 0xaa, 0x81, - 0xc0, 0xc9, 0x98, 0x31, 0x30, 0xef, 0x7d, 0x1c, 0x97, 0x1a, 0xce, 0x42, 0x16, 0x91, 0x67, 0x6c, - 0xf4, 0x85, 0x6c, 0xe6, 0xdd, 0xa9, 0x66, 0x98, 0x23, 0x7c, 0x43, 0x4d, 0x76, 0x53, 0x2d, 0x78, - 0xd0, 0x06, 0x01, 0x46, 0xac, 0x3a, 0x1d, 0x4d, 0xa3, 0xbf, 0x02, 0x21, 0xb8, 0x05, 0xda, 0x03, - 0xb1, 0xdd, 0xef, 0x75, 0xfa, 0xc4, 0xbb, 0xaa, 0xaa, 0x22, 0xf7, 0x94, 0x9a, 0xb8, 0x81, 0x1e, - 0xc3, 0x11, 0x87, 0xd6, 0xfa, 0x5d, 0xe2, 0x96, 0x3d, 0xa5, 0x55, 0x53, 0x6a, 0x5a, 0xfb, 0xe2, - 0xa2, 0x5a, 0x97, 0x1b, 0xc4, 0x7d, 0x8f, 0xe0, 0x30, 0x48, 0x22, 0xd7, 0x08, 0xbe, 0xd7, 0xd6, - 0x2e, 0x14, 0xa5, 0x2b, 0x26, 0x49, 0x7f, 0xc5, 0xd1, 0x17, 0xfd, 0x66, 0xf3, 0x8d, 0xd6, 0xed, - 0x28, 0x2d, 0xd2, 0x2f, 0xfd, 0x65, 0x0a, 0xf2, 0xec, 0xe0, 0x99, 0xc1, 0xdd, 0xd3, 0x72, 0x1f, - 0x01, 0xd0, 0x5c, 0x35, 0x36, 0x6e, 0xfc, 0x2b, 0xc9, 0x11, 0xc8, 0x05, 0x01, 0x90, 0x24, 0xa1, - 0xcf, 0x5c, 0x3e, 0x6a, 0x23, 0x8f, 0xe8, 0x18, 0x84, 0x99, 0x61, 0x6a, 0xa4, 0x4c, 0xd6, 0x08, - 0x2a, 0x4d, 0x51, 0x30, 0x33, 0x4c, 0x52, 0xac, 0xca, 0x33, 0x3a, 0x41, 0x08, 0x0c, 0x82, 0xa8, - 0x67, 0x0a, 0x2a, 0x2c, 0xe7, 0x3f, 0xc4, 0x61, 0x18, 0x01, 0x69, 0xe2, 0x33, 0xcc, 0x61, 0x28, - 0xa0, 0x6b, 0x4c, 0x90, 0x04, 0x85, 0xd9, 0x62, 0xea, 0x1a, 0x04, 0x49, 0x45, 0x66, 0x19, 0x2f, - 0x4f, 0x81, 0x5d, 0x63, 0x42, 0x84, 0x3e, 0x84, 0x2c, 0x6d, 0x7b, 0xe6, 0x8b, 0x01, 0x77, 0xb8, - 0x0c, 0x79, 0xef, 0x2c, 0x06, 0xe8, 0x6b, 0xc8, 0x51, 0x94, 0x3e, 0x1a, 0xd9, 0x25, 0x88, 0x94, - 0x08, 0xa4, 0x2b, 0x92, 0x47, 0x23, 0x1b, 0x3b, 0x8e, 0x4a, 0x57, 0x20, 0x2f, 0x44, 0x1c, 0xaa, - 0x0d, 0x6d, 0xd0, 0x04, 0x7a, 0x02, 0x59, 0x02, 0x20, 0x4d, 0x19, 0xfa, 0x0e, 0x8e, 0x66, 0xfa, - 0x0d, 0x9f, 0x8c, 0xc6, 0x65, 0xf6, 0x02, 0xd5, 0xff, 0xc1, 0x4c, 0xbf, 0xa1, 0x53, 0xd2, 0x8b, - 0x70, 0x86, 0x7f, 0x91, 0xce, 0x6e, 0x8a, 0x5b, 0x2f, 0xd2, 0xd9, 0xbc, 0x28, 0x48, 0xff, 0x92, - 0x80, 0x9c, 0xef, 0x13, 0xe8, 0xcc, 0x1f, 0xab, 0x71, 0xc7, 0xd9, 0x8b, 0x38, 0x0e, 0x4b, 0xb7, - 0x1e, 0x11, 0x3a, 0x87, 0xfd, 0x29, 0x26, 0x3d, 0xd8, 0x68, 0x61, 0xd3, 0x5c, 0xa0, 0x0d, 0xa6, - 0xd6, 0xf0, 0xda, 0xe1, 0x97, 0xb6, 0x4b, 0x91, 0x35, 0x8e, 0xab, 0x50, 0x14, 0x2a, 0x41, 0xc6, - 0x2b, 0x0c, 0xd8, 0x1c, 0xd4, 0x7b, 0x45, 0x3f, 0x85, 0x02, 0xb9, 0x46, 0x7a, 0x56, 0xae, 0x81, - 0x6d, 0x1a, 0x59, 0x8b, 0x81, 0x40, 0x47, 0xce, 0xaa, 0x67, 0x60, 0x5b, 0xcd, 0xcf, 0x0c, 0xd3, - 0x7b, 0x79, 0x91, 0xce, 0xa6, 0xc4, 0xb4, 0xf4, 0x67, 0xbe, 0x22, 0x24, 0xa8, 0xfc, 0x9f, 0x29, - 0x92, 0x7e, 0x2f, 0x45, 0x36, 0x43, 0x8a, 0x48, 0x67, 0x90, 0x0f, 0x8c, 0x0f, 0xa3, 0xc6, 0x97, - 0x88, 0x1a, 0x9f, 0xf4, 0xf7, 0x09, 0x10, 0x82, 0xc3, 0xd0, 0x7b, 0x39, 0x90, 0x0c, 0xf9, 0xb1, - 0x6e, 0x4c, 0xb5, 0xc0, 0xf4, 0xa7, 0x78, 0x7e, 0x1c, 0x3b, 0x59, 0x3d, 0xbb, 0xd0, 0x8d, 0xa9, - 0x37, 0x53, 0x18, 0xfb, 0xcf, 0x64, 0x0f, 0xba, 0x84, 0xe3, 0x92, 0xba, 0x96, 0xba, 0x53, 0x8e, - 0x11, 0x74, 0x29, 0x44, 0x3a, 0x02, 0x58, 0xb2, 0xa2, 0x6d, 0xc8, 0x37, 0x5a, 0xaf, 0xe4, 0x66, - 0xa3, 0xa6, 0xc9, 0x97, 0x3d, 0x71, 0x43, 0xfa, 0x43, 0xcf, 0xa7, 0x1b, 0xe6, 0x7c, 0x11, 0x4e, - 0x50, 0x89, 0xfb, 0x13, 0xd4, 0x11, 0x00, 0x71, 0xa6, 0xd0, 0x70, 0x3d, 0xe7, 0x18, 0x13, 0x36, - 0x58, 0x97, 0x9e, 0x83, 0xc0, 0xef, 0x69, 0xe1, 0x92, 0xd5, 0xd7, 0x26, 0xf9, 0xd0, 0x02, 0xfc, - 0x4d, 0xfa, 0xdb, 0x24, 0x94, 0x19, 0xfb, 0xa5, 0x35, 0x32, 0xc6, 0xb7, 0x91, 0x8f, 0x02, 0xf7, - 0x84, 0x9f, 0x27, 0x00, 0x26, 0x7e, 0xa7, 0x19, 0x44, 0x2d, 0x2f, 0xa9, 0x45, 0xcd, 0x87, 0xea, - 0xac, 0xe6, 0x4c, 0xfc, 0x8e, 0x3e, 0x91, 0x5c, 0x98, 0x27, 0x4c, 0x16, 0x15, 0xd7, 0x6b, 0x04, - 0xf6, 0xa3, 0x46, 0x47, 0xb1, 0x2a, 0x59, 0x9e, 0x3d, 0x3a, 0xe8, 0x35, 0xdb, 0x6c, 0xae, 0xdb, - 0xfa, 0xcc, 0xe1, 0xc5, 0xd7, 0xb3, 0x08, 0x5b, 0x9c, 0x12, 0x67, 0x2d, 0xfc, 0x8e, 0x43, 0x3a, - 0x84, 0x17, 0xbb, 0xd8, 0x76, 0xa8, 0x40, 0xf4, 0xd5, 0x29, 0x7f, 0x0e, 0x7b, 0x71, 0x24, 0xf1, - 0x27, 0x29, 0x7d, 0x07, 0x1f, 0xc4, 0xee, 0xc5, 0x47, 0xf9, 0x1f, 0x42, 0x3e, 0x30, 0x10, 0xf1, - 0xec, 0x71, 0x39, 0xe5, 0x90, 0xbe, 0x85, 0x07, 0x01, 0xbf, 0x62, 0x89, 0x8c, 0x9f, 0xf6, 0xbd, - 0xd6, 0x6f, 0x7b, 0x03, 0xfc, 0x20, 0x2f, 0xdf, 0xf8, 0x53, 0xaf, 0x96, 0x62, 0x43, 0xaa, 0xdd, - 0x70, 0x87, 0x17, 0x2a, 0xa1, 0x3e, 0x83, 0x1d, 0x96, 0xca, 0x17, 0xe6, 0x78, 0x31, 0x0d, 0xe5, - 0x73, 0x91, 0x22, 0xfa, 0x4b, 0xb8, 0x54, 0x04, 0xa1, 0x87, 0xed, 0x99, 0xc3, 0x85, 0x94, 0x7e, - 0x9d, 0x86, 0x02, 0x07, 0xf0, 0x9d, 0x4f, 0x61, 0x87, 0x04, 0xd9, 0xb8, 0x4f, 0x66, 0xdb, 0x33, - 0xfd, 0x46, 0x0e, 0x7e, 0xe1, 0xf9, 0x3d, 0x38, 0x24, 0xb4, 0x4c, 0xcd, 0xd8, 0x50, 0x58, 0x49, - 0x96, 0x12, 0xea, 0xc1, 0x4c, 0xbf, 0xa1, 0x72, 0x47, 0x02, 0xc9, 0x4a, 0x23, 0x98, 0x7a, 0xff, - 0x46, 0xb0, 0x0b, 0xdb, 0xe1, 0xc0, 0xe5, 0x0d, 0x68, 0x4f, 0x7d, 0xee, 0x90, 0x5e, 0x67, 0xcd, - 0x60, 0x24, 0xf3, 0xa6, 0xb3, 0xa1, 0xf0, 0xe6, 0xa0, 0x27, 0x70, 0x60, 0xe2, 0x1b, 0x97, 0x67, - 0x98, 0xa1, 0x65, 0x8e, 0x35, 0x97, 0xf4, 0xae, 0x2e, 0x0f, 0x74, 0xbb, 0x04, 0x4b, 0x53, 0x4b, - 0xd5, 0x32, 0xc7, 0x3d, 0x8a, 0x42, 0x7f, 0x00, 0x8f, 0x02, 0x4c, 0xeb, 0x1b, 0xce, 0x92, 0xcf, - 0x1c, 0xc9, 0x4b, 0xe8, 0xe7, 0x50, 0x0e, 0x6e, 0x4b, 0x3a, 0x6e, 0xcd, 0x35, 0x66, 0xd8, 0x71, - 0xf5, 0xd9, 0x9c, 0x77, 0xa1, 0x0f, 0x96, 0x5b, 0x13, 0x7c, 0xcf, 0x43, 0x97, 0x65, 0xd8, 0x8d, - 0x51, 0x2d, 0xd8, 0x51, 0x16, 0x62, 0x26, 0x63, 0xd9, 0x60, 0xeb, 0x58, 0x81, 0x3d, 0x15, 0x4f, - 0xf1, 0x5b, 0xdd, 0x64, 0x3b, 0x78, 0x16, 0x5c, 0x84, 0xa4, 0xdf, 0x04, 0x26, 0x8d, 0x11, 0x2a, - 0xd3, 0x4f, 0x53, 0xac, 0xe3, 0x27, 0xe1, 0x41, 0x50, 0xfd, 0x77, 0xe9, 0xdf, 0x53, 0x50, 0x08, - 0x2d, 0x12, 0x4c, 0x13, 0x89, 0x70, 0xbe, 0x63, 0xeb, 0x26, 0xfd, 0x75, 0xff, 0xd7, 0x13, 0x85, - 0xce, 0xca, 0x60, 0x24, 0x1d, 0x99, 0x35, 0x86, 0x44, 0xfb, 0xf1, 0x43, 0x91, 0xcd, 0x75, 0x43, - 0x91, 0x15, 0x53, 0xde, 0x7a, 0x7f, 0x53, 0x3e, 0x86, 0x7c, 0x70, 0x9a, 0xc1, 0x8a, 0xb0, 0x20, - 0x68, 0xdd, 0x20, 0x23, 0x1b, 0x3b, 0xc8, 0xf8, 0xff, 0x1b, 0x31, 0xd4, 0x40, 0x08, 0xaa, 0xc1, - 0x46, 0x05, 0x0e, 0xa6, 0xfa, 0xb2, 0x08, 0x91, 0x21, 0xef, 0x1c, 0xe5, 0x49, 0x4c, 0x97, 0x4f, - 0xab, 0x19, 0x2e, 0xa6, 0xf4, 0x73, 0xc8, 0x07, 0x6a, 0x3f, 0x62, 0x26, 0x26, 0x76, 0xdf, 0x59, - 0xf6, 0x35, 0x97, 0xcd, 0x7b, 0x45, 0x08, 0xd2, 0xb4, 0x72, 0x64, 0x9f, 0x78, 0xe8, 0xb3, 0x24, - 0x43, 0xd6, 0x4b, 0xaa, 0x04, 0x4f, 0x07, 0x11, 0xcc, 0x40, 0xe9, 0x33, 0xe9, 0x6b, 0x58, 0x2a, - 0xe2, 0x5d, 0x03, 0xef, 0x6b, 0x18, 0x8c, 0xf6, 0x0c, 0xd2, 0x5f, 0x24, 0x20, 0x2f, 0x3b, 0xd7, - 0x5d, 0x53, 0x9f, 0x3b, 0x57, 0x96, 0x7b, 0x87, 0x9d, 0xfe, 0x98, 0x2a, 0x2f, 0x5c, 0xc3, 0xa7, - 0xa2, 0x35, 0x7c, 0xa8, 0xbe, 0x4d, 0x87, 0xeb, 0x5b, 0x2a, 0x59, 0xc5, 0x18, 0xfd, 0x16, 0x4a, - 0xf6, 0xaf, 0x09, 0xd8, 0x0b, 0x5a, 0x85, 0x2f, 0x62, 0xe8, 0x23, 0x7b, 0xc0, 0x5b, 0x97, 0xe7, - 0x1b, 0xf3, 0x91, 0x7d, 0x49, 0x17, 0xd0, 0x96, 0xf5, 0xa5, 0x1f, 0x01, 0x73, 0x44, 0xe2, 0x77, - 0xd4, 0x78, 0x98, 0x9c, 0x82, 0x07, 0xa4, 0xce, 0xf6, 0x39, 0x20, 0xd7, 0x72, 0xf5, 0x29, 0xf1, - 0x05, 0x87, 0xc5, 0x4b, 0x3c, 0xe2, 0xcd, 0x8f, 0x48, 0x31, 0x5d, 0xdd, 0x75, 0xaa, 0x0c, 0x4e, - 0x96, 0x64, 0xf9, 0x91, 0x7b, 0x38, 0x77, 0x62, 0xd6, 0xff, 0x72, 0xa5, 0xa4, 0xaf, 0x61, 0x8f, - 0x86, 0x06, 0x5f, 0x1a, 0x1e, 0x02, 0xef, 0x18, 0x9f, 0xfd, 0x26, 0x09, 0xfb, 0x11, 0x1e, 0x9e, - 0x42, 0xd7, 0xdf, 0x5b, 0x70, 0xb9, 0x64, 0x78, 0xb8, 0x26, 0x41, 0x61, 0x6e, 0xe3, 0xb7, 0x9a, - 0x8f, 0x67, 0x33, 0x9a, 0x3c, 0x01, 0x56, 0x38, 0xcd, 0x9a, 0xa8, 0x94, 0x5e, 0x17, 0x95, 0x6a, - 0x2b, 0x71, 0x71, 0x93, 0xc6, 0xc5, 0xa3, 0x58, 0x57, 0xf7, 0xf5, 0x88, 0xc4, 0xc2, 0x47, 0x90, - 0xf7, 0xc6, 0x7e, 0x44, 0xae, 0x0c, 0x75, 0x47, 0x6f, 0xee, 0xd7, 0x18, 0x2d, 0x95, 0x72, 0x6f, - 0x78, 0x83, 0x99, 0xe1, 0x48, 0xf4, 0x1c, 0x1e, 0xfa, 0xac, 0xeb, 0x23, 0xd8, 0x01, 0x27, 0x8f, - 0xe4, 0x45, 0xe9, 0xb9, 0x57, 0x5c, 0x91, 0x78, 0xa1, 0xea, 0x2e, 0xb9, 0x7f, 0x7e, 0x2f, 0x8f, - 0x41, 0xf0, 0xba, 0xce, 0x6b, 0x7c, 0xcb, 0x46, 0x37, 0x82, 0x9a, 0xe7, 0x9d, 0x27, 0x01, 0x49, - 0x7f, 0x04, 0xb0, 0xe4, 0x23, 0xd5, 0x58, 0x80, 0xc1, 0xab, 0xc6, 0x96, 0xf4, 0xe8, 0x8c, 0x37, - 0xab, 0xb4, 0x01, 0x4b, 0xae, 0x6b, 0xc0, 0x68, 0xa7, 0x4a, 0x9e, 0x24, 0xd5, 0xab, 0xde, 0x82, - 0xc2, 0x71, 0x03, 0x78, 0xca, 0xa5, 0xb3, 0x29, 0x78, 0x75, 0xb0, 0x14, 0x60, 0xa1, 0x52, 0xb1, - 0x67, 0x47, 0x9a, 0x44, 0x2c, 0xca, 0x2b, 0xd3, 0xd0, 0xc7, 0x50, 0x74, 0x5c, 0xdd, 0x76, 0xb5, - 0x88, 0x31, 0x0a, 0x14, 0xea, 0x99, 0xc7, 0x09, 0x88, 0xe6, 0x62, 0xc6, 0x68, 0xb0, 0xa3, 0x0d, - 0xf4, 0xe1, 0x35, 0x0f, 0x08, 0x45, 0x73, 0x31, 0xab, 0x30, 0x70, 0x45, 0x1f, 0x5e, 0x4b, 0x2a, - 0x1c, 0x44, 0x37, 0xe2, 0xa2, 0x3f, 0x83, 0x0c, 0xe7, 0xe7, 0x52, 0x3f, 0x5a, 0x3a, 0x6b, 0x9c, - 0xb1, 0xab, 0x1e, 0xf9, 0xe9, 0xa7, 0xfe, 0x57, 0x56, 0xda, 0xac, 0x17, 0x20, 0xd7, 0x7b, 0xad, - 0xc8, 0x2f, 0x9b, 0x4a, 0xb7, 0x2b, 0x6e, 0xa0, 0x3c, 0x64, 0xe4, 0x56, 0xb5, 0xde, 0x56, 0xbb, - 0x62, 0xe2, 0xf4, 0xcf, 0x13, 0xb0, 0x1b, 0x33, 0x14, 0xa4, 0xdf, 0xa9, 0x7b, 0xec, 0xab, 0x2e, - 0xfb, 0x86, 0xdb, 0xee, 0x28, 0x2d, 0x71, 0x03, 0x15, 0x01, 0x18, 0x9c, 0xbe, 0x27, 0xd0, 0x0e, - 0x14, 0xd8, 0xbb, 0xf2, 0x43, 0xa7, 0xa1, 0x2a, 0x35, 0x31, 0x89, 0x4a, 0xb0, 0x17, 0x66, 0xed, - 0x77, 0x6a, 0x72, 0x4f, 0x11, 0x53, 0x48, 0x04, 0x81, 0x61, 0xaa, 0xcd, 0x76, 0x57, 0xa9, 0x89, - 0x69, 0xf4, 0x00, 0x76, 0xc3, 0xb4, 0xf4, 0x23, 0xb8, 0xb8, 0x79, 0xfa, 0x0d, 0x64, 0xbd, 0x9b, - 0x26, 0x6c, 0xbd, 0x86, 0xa2, 0x6a, 0x35, 0xe5, 0x42, 0xee, 0x37, 0x7b, 0xe2, 0x06, 0x02, 0xd8, - 0xa2, 0x90, 0xaf, 0xc4, 0x84, 0xff, 0xfc, 0xb5, 0x98, 0x3c, 0xfd, 0xeb, 0x04, 0xc0, 0xb2, 0x2c, - 0x47, 0xbb, 0xb0, 0xdd, 0x56, 0x6b, 0x8a, 0xaa, 0x75, 0xfb, 0x95, 0xcb, 0x46, 0x8f, 0xcd, 0x98, - 0x76, 0xa0, 0xc0, 0x80, 0xd5, 0xa6, 0x22, 0x13, 0x89, 0xe9, 0x48, 0x98, 0x81, 0xf8, 0x67, 0xf6, - 0xe6, 0x1b, 0xed, 0xa2, 0xd1, 0x6c, 0x52, 0x6d, 0x10, 0x14, 0x19, 0x4e, 0xf9, 0x41, 0xa9, 0xf6, - 0xc9, 0x12, 0xa9, 0x25, 0xac, 0x2a, 0xb7, 0xaa, 0x4a, 0x93, 0x6a, 0xe2, 0x2f, 0xeb, 0x1d, 0xc4, - 0x26, 0x91, 0x9b, 0x81, 0xf8, 0xf7, 0xef, 0xad, 0xf3, 0xff, 0xcc, 0xf8, 0x5f, 0x3e, 0x65, 0x7f, - 0x9a, 0x8b, 0xbe, 0x87, 0x62, 0xf8, 0xb7, 0x6a, 0xe8, 0x51, 0xa0, 0x5a, 0x8a, 0xf9, 0x21, 0x5d, - 0xf9, 0xc3, 0xb5, 0x78, 0x6e, 0x3b, 0x3d, 0xc8, 0x07, 0x7e, 0xa4, 0x85, 0x1e, 0xaf, 0xf4, 0x8e, - 0xd1, 0x9f, 0xa9, 0x95, 0xa5, 0xbb, 0x48, 0xf8, 0xaa, 0xbf, 0x84, 0x42, 0xa8, 0x39, 0x43, 0x1f, - 0xbd, 0x47, 0x9b, 0x58, 0xfe, 0xf8, 0x6e, 0xa2, 0xa5, 0xc4, 0x81, 0x5f, 0x70, 0xad, 0x48, 0xbc, - 0xfa, 0xab, 0xb2, 0x15, 0x89, 0xe3, 0x7e, 0x00, 0xd6, 0x0b, 0x8f, 0x41, 0xa2, 0xab, 0xae, 0xfe, - 0x5e, 0x6b, 0x65, 0xd5, 0x98, 0x1f, 0x61, 0xa1, 0xef, 0x43, 0x56, 0x76, 0x1c, 0x37, 0xd7, 0x09, - 0xf6, 0x9f, 0xe5, 0xc7, 0x77, 0x50, 0xf0, 0x25, 0xdf, 0xc0, 0xbe, 0xff, 0x31, 0x85, 0x7a, 0x37, - 0xb7, 0x0f, 0xb4, 0x4c, 0x10, 0x71, 0x3f, 0xfb, 0x2a, 0x1f, 0x45, 0xa7, 0xd5, 0x21, 0xf4, 0x49, - 0xe2, 0xab, 0x04, 0x7a, 0x0a, 0x9b, 0xb4, 0xff, 0x42, 0xfb, 0xd1, 0x7e, 0x8c, 0x49, 0x77, 0x10, - 0xdf, 0xa6, 0xa1, 0x16, 0xec, 0x87, 0x6a, 0x75, 0xbf, 0xd2, 0x38, 0x8a, 0xaf, 0xe5, 0x57, 0xd7, - 0x0b, 0x77, 0x21, 0x2d, 0x28, 0xac, 0x5b, 0x27, 0x2e, 0xe1, 0x97, 0xef, 0x09, 0x77, 0xe4, 0x16, - 0x02, 0x59, 0x25, 0x7a, 0x0b, 0x2b, 0x89, 0x6a, 0xe5, 0x16, 0x62, 0xb2, 0xc5, 0xf7, 0x50, 0x0c, - 0x07, 0x63, 0xb4, 0x46, 0x08, 0x67, 0xd5, 0x13, 0xe3, 0xa3, 0x78, 0xe5, 0x77, 0x7e, 0xf9, 0x93, - 0x89, 0xe1, 0x5e, 0x2d, 0x06, 0x67, 0x43, 0x6b, 0xf6, 0xe5, 0xd4, 0x98, 0x5c, 0xb9, 0xa6, 0x61, - 0x4e, 0xa6, 0xfa, 0xc0, 0xf9, 0x92, 0xb0, 0x7e, 0xc9, 0xf9, 0x07, 0x5b, 0xf4, 0x67, 0xb4, 0x4f, - 0xfe, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x8e, 0x2b, 0x7b, 0x3b, 0x5a, 0x2b, 0x00, 0x00, + // 4089 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3b, 0x4b, 0x70, 0xe3, 0xd8, + 0x56, 0xf1, 0x27, 0xb1, 0x7d, 0x2c, 0x3b, 0xca, 0x75, 0x92, 0x4e, 0x3c, 0x9d, 0x9e, 0x6e, 0xcd, + 0xbc, 0xa1, 0x27, 0x33, 0x9d, 0xe9, 0x49, 0xcf, 0x6b, 0xe6, 0xcd, 0x6b, 0x06, 0x64, 0x5b, 0x79, + 0xf6, 0xb4, 0x63, 0x7b, 0x64, 0xa7, 0x7b, 0xfa, 0xbd, 0x02, 0x95, 0x6c, 0x5f, 0x3b, 0x22, 0xb6, + 0x64, 0x24, 0xb9, 0x3b, 0x61, 0xf1, 0x16, 0xec, 0x58, 0xb0, 0xa4, 0xa0, 0x8a, 0x62, 0xc7, 0x9e, + 0x2a, 0xd8, 0xb0, 0xa4, 0x58, 0xb0, 0x63, 0xc9, 0x8a, 0x2a, 0x60, 0xc1, 0x8a, 0x62, 0xc1, 0x96, + 0x1d, 0x75, 0x3f, 0x92, 0x25, 0x59, 0x76, 0x02, 0x33, 0x54, 0x51, 0x6f, 0xd3, 0x6d, 0x9d, 0xcf, + 0xbd, 0xe7, 0x9c, 0x7b, 0x3e, 0xf7, 0x1c, 0x29, 0x20, 0xea, 0xf3, 0x81, 0x6b, 0x58, 0x26, 0xc6, + 0xf6, 0xc9, 0xcc, 0xb6, 0x5c, 0x0b, 0x65, 0x66, 0x96, 0x35, 0xb1, 0x67, 0x03, 0xe9, 0x0f, 0x12, + 0xb0, 0xa7, 0x62, 0x07, 0xdb, 0x6f, 0xb1, 0x3c, 0x18, 0x58, 0x73, 0xd3, 0x55, 0xf1, 0xef, 0xcd, + 0xb1, 0xe3, 0xa2, 0x0f, 0xa0, 0xa0, 0x33, 0x88, 0xf6, 0x56, 0x9f, 0xcc, 0xf1, 0x41, 0xe2, 0x61, + 0xe2, 0x71, 0x5a, 0x15, 0x38, 0xf0, 0x15, 0x81, 0xa1, 0x1f, 0x41, 0xd1, 0x23, 0xc2, 0xd7, 0x33, + 0xc3, 0xbe, 0x39, 0x48, 0x3e, 0x4c, 0x3c, 0x2e, 0xa8, 0x1e, 0xab, 0x42, 0x81, 0xe8, 0x08, 0xc0, + 0xb5, 0xf5, 0x21, 0xb6, 0xb5, 0x2b, 0x7c, 0x73, 0x90, 0x7a, 0x98, 0x78, 0x2c, 0xa8, 0x39, 0x06, + 0x79, 0x89, 0x6f, 0xa4, 0x2b, 0xd8, 0x8f, 0xca, 0xe0, 0xcc, 0x2c, 0xd3, 0x61, 0xeb, 0xfb, 0xb2, + 0x53, 0xe6, 0x04, 0x65, 0x2e, 0x2c, 0xa0, 0x2f, 0xf1, 0x0d, 0x3a, 0x86, 0x1d, 0xc3, 0x34, 0x5c, + 0x43, 0x9f, 0x68, 0x7d, 0xdd, 0x1d, 0x5c, 0x52, 0xca, 0x24, 0xa5, 0xdc, 0xe6, 0x88, 0x0a, 0x81, + 0x93, 0xcd, 0xfe, 0x2d, 0x01, 0x07, 0x5d, 0xb2, 0x97, 0xdd, 0x30, 0x0d, 0x37, 0xa2, 0xf4, 0xf3, + 0x85, 0xd2, 0x33, 0xcb, 0x30, 0x5d, 0xba, 0x5d, 0xfe, 0x74, 0xe7, 0x84, 0xdb, 0xeb, 0xa4, 0x3d, + 0x77, 0x3b, 0x04, 0xe1, 0xdb, 0x81, 0x3e, 0x05, 0xed, 0xe0, 0x0c, 0x6c, 0x63, 0xe6, 0xf2, 0xdd, + 0xbd, 0xd5, 0xba, 0x14, 0xb8, 0x6c, 0xd3, 0xd4, 0x9d, 0x6c, 0x9a, 0xbe, 0xdd, 0xa6, 0x9b, 0x51, + 0x9b, 0xbe, 0x07, 0x87, 0x31, 0x5a, 0x32, 0xb3, 0x4a, 0x73, 0xcf, 0x04, 0xdd, 0x79, 0x7f, 0x6a, + 0xb8, 0x6d, 0x7b, 0x88, 0x6d, 0xcf, 0x04, 0x1f, 0x41, 0x4a, 0x77, 0xae, 0xb8, 0xe2, 0xc8, 0x57, + 0x9c, 0xd1, 0xcb, 0xce, 0x55, 0x7d, 0x43, 0x25, 0x04, 0x84, 0xae, 0x6f, 0x0c, 0xa9, 0x9e, 0xcb, + 0x74, 0x15, 0x63, 0x48, 0xe8, 0xfa, 0xc6, 0xb0, 0x92, 0x83, 0xcc, 0x10, 0xbb, 0xba, 0x31, 0x71, + 0x88, 0xb3, 0x1d, 0xc6, 0xec, 0xcb, 0xcf, 0xfa, 0x05, 0x14, 0x0c, 0xf3, 0xad, 0x3e, 0x31, 0x86, + 0x9a, 0x45, 0x10, 0x5c, 0x84, 0x3d, 0x7f, 0xe9, 0x06, 0xc3, 0x52, 0xae, 0xfa, 0x86, 0x2a, 0x18, + 0x81, 0x67, 0x74, 0x1f, 0xb2, 0xfa, 0x60, 0x80, 0x67, 0x2e, 0x66, 0x32, 0x65, 0xeb, 0x1b, 0xaa, + 0x0f, 0x09, 0x0a, 0xd1, 0xf4, 0x74, 0xaf, 0xea, 0xe6, 0x00, 0x4f, 0x42, 0xba, 0x3f, 0x85, 0x5d, + 0xba, 0xb5, 0x66, 0x5a, 0xe6, 0x00, 0x6b, 0x33, 0x1b, 0x1b, 0x53, 0x7d, 0x8c, 0xb9, 0xd3, 0x21, + 0x8a, 0x6b, 0x11, 0x54, 0x87, 0x63, 0x16, 0x66, 0x0e, 0xad, 0xc6, 0xcd, 0xfc, 0xaf, 0x49, 0xd8, + 0xad, 0x4e, 0x0c, 0x6c, 0xba, 0x32, 0x73, 0xd7, 0x73, 0xec, 0x38, 0xfa, 0x18, 0xa3, 0x2f, 0x60, + 0x6b, 0x60, 0x4d, 0xa7, 0x86, 0xe7, 0x5f, 0x65, 0x5f, 0x47, 0x7e, 0x52, 0x55, 0x8a, 0x9d, 0x62, + 0xd3, 0xad, 0x6f, 0xa8, 0x9c, 0x16, 0xbd, 0x80, 0x9c, 0x33, 0xef, 0x13, 0xff, 0xea, 0x63, 0x6e, + 0xf7, 0xfb, 0x51, 0xc6, 0x2e, 0x23, 0x98, 0x91, 0xdd, 0xea, 0x1b, 0xea, 0x82, 0x01, 0x3d, 0x83, + 0x2d, 0x66, 0x0e, 0xea, 0x74, 0xf9, 0xd3, 0xc3, 0x85, 0x4f, 0x13, 0xa1, 0xcf, 0x49, 0x7c, 0xc8, + 0x94, 0x80, 0x6c, 0xc9, 0x48, 0x09, 0x93, 0x8d, 0x7f, 0x17, 0x0f, 0x5c, 0xea, 0x83, 0xf1, 0x4c, + 0x2a, 0x25, 0x20, 0x4c, 0x8c, 0x14, 0x3d, 0x81, 0xb4, 0x63, 0x8c, 0x4d, 0xea, 0x93, 0xf9, 0xd3, + 0x7b, 0x31, 0x2c, 0x5d, 0x63, 0x4c, 0xa4, 0xa3, 0x64, 0xe8, 0x0b, 0xc8, 0xd8, 0x78, 0x60, 0xbd, + 0xc5, 0xf6, 0xc1, 0x16, 0xe5, 0x38, 0x88, 0x2a, 0xa5, 0x32, 0xf4, 0x4d, 0x7d, 0x43, 0xf5, 0x48, + 0x2b, 0x9b, 0x90, 0x9a, 0x3a, 0x63, 0xe9, 0x0d, 0xec, 0x2c, 0x99, 0x0c, 0xbd, 0x0f, 0x79, 0x66, + 0x32, 0xed, 0x52, 0x77, 0x2e, 0xf9, 0xe9, 0x01, 0x03, 0xd5, 0x75, 0xe7, 0x92, 0xc4, 0x21, 0xcb, + 0x13, 0x6f, 0xb1, 0xed, 0x18, 0x96, 0xc9, 0xb3, 0x96, 0x40, 0x81, 0xaf, 0x18, 0x4c, 0xb2, 0xa1, + 0x14, 0x63, 0xd4, 0x48, 0xdc, 0x25, 0x22, 0x71, 0x87, 0x1e, 0x81, 0xc0, 0xf7, 0xa6, 0x3e, 0xc4, + 0xf3, 0x00, 0x97, 0x87, 0xfa, 0x0e, 0x3a, 0x84, 0xac, 0x3e, 0x77, 0x2f, 0x35, 0xc7, 0x18, 0xf3, + 0x5c, 0x98, 0x21, 0xcf, 0x5d, 0x63, 0x2c, 0x3d, 0x01, 0x31, 0x7a, 0x1a, 0x84, 0x9c, 0x09, 0x6b, + 0x0c, 0xf9, 0x76, 0x19, 0xfa, 0xdc, 0x18, 0x4a, 0x7f, 0x91, 0x0a, 0xd2, 0xb3, 0x83, 0x58, 0x43, + 0x8f, 0xf6, 0xc9, 0x71, 0xea, 0x0e, 0x57, 0x38, 0xa7, 0xf2, 0x27, 0xf4, 0x33, 0xc8, 0xb3, 0x5f, + 0xda, 0xc0, 0x1a, 0xb2, 0xac, 0x54, 0x3c, 0xfd, 0x68, 0xe5, 0x59, 0x9f, 0xb0, 0xff, 0x54, 0xca, + 0xa2, 0x02, 0x63, 0xad, 0x5a, 0x43, 0x8c, 0x5e, 0xc1, 0x36, 0x73, 0x02, 0xcc, 0x83, 0xd8, 0x39, + 0x48, 0x3f, 0x4c, 0x3d, 0xce, 0x9f, 0x3e, 0xb9, 0x6d, 0x31, 0xcc, 0xe2, 0xd8, 0x51, 0x4c, 0xd7, + 0xbe, 0x51, 0x8b, 0x76, 0x08, 0x58, 0x7e, 0x0d, 0xa5, 0x18, 0x32, 0x24, 0x42, 0xca, 0x3b, 0x84, + 0x9c, 0x4a, 0x7e, 0xa2, 0x63, 0xd8, 0x64, 0x99, 0x95, 0xc5, 0xc7, 0x6e, 0x78, 0x5b, 0x2e, 0x37, + 0x23, 0xf9, 0x2a, 0xf9, 0x65, 0x42, 0x1a, 0x80, 0x10, 0x54, 0x06, 0xe5, 0x21, 0x73, 0xd1, 0x7a, + 0xd9, 0x6a, 0xbf, 0x6e, 0x89, 0x1b, 0x68, 0x1f, 0x50, 0x57, 0x51, 0x5f, 0x29, 0xaa, 0x76, 0xde, + 0xe8, 0x56, 0x94, 0xba, 0xfc, 0xaa, 0xd1, 0x56, 0xc5, 0x04, 0x2a, 0xc3, 0x7e, 0x45, 0xee, 0x55, + 0xeb, 0xda, 0x2b, 0x45, 0xed, 0x36, 0xda, 0x2d, 0x82, 0x3e, 0x27, 0x00, 0x31, 0x89, 0x10, 0x14, + 0x3b, 0xb2, 0xda, 0x6b, 0xc8, 0x4d, 0x4d, 0x55, 0xbe, 0x51, 0xaa, 0x3d, 0x31, 0x25, 0xfd, 0x75, + 0x02, 0xf2, 0x81, 0xfd, 0x03, 0xc7, 0x90, 0x58, 0x77, 0x0c, 0xc9, 0xb8, 0x63, 0xe0, 0x46, 0x0b, + 0xaa, 0xb3, 0x74, 0x0c, 0x52, 0x15, 0x76, 0x96, 0x08, 0x88, 0x64, 0xb5, 0x8b, 0x4e, 0xb3, 0x51, + 0x95, 0x7b, 0x8a, 0xd6, 0x51, 0x14, 0x55, 0xdc, 0x20, 0x9a, 0x54, 0xeb, 0x72, 0xab, 0xa5, 0x34, + 0xb5, 0xb3, 0x8b, 0x56, 0xad, 0xd1, 0xfa, 0x99, 0x76, 0x26, 0x37, 0x9a, 0x4a, 0x4d, 0x4c, 0x48, + 0xff, 0x95, 0x80, 0x7c, 0xf5, 0x52, 0x37, 0x4d, 0x3c, 0x69, 0x98, 0x23, 0x0b, 0x3d, 0x86, 0xb4, + 0x7b, 0x33, 0x63, 0xc9, 0xb0, 0x18, 0xb0, 0x2c, 0xa7, 0xe9, 0xdd, 0xcc, 0xb0, 0x4a, 0x29, 0xd0, + 0x87, 0x50, 0x9c, 0x58, 0x03, 0x7d, 0xa2, 0x99, 0xd6, 0x10, 0x07, 0x6a, 0xb1, 0x40, 0xa1, 0x2d, + 0x6b, 0x88, 0x49, 0xa4, 0x7c, 0x44, 0x7c, 0x65, 0x6a, 0xb9, 0x78, 0x41, 0xc6, 0xa2, 0xa1, 0xc0, + 0xc0, 0x1e, 0xdd, 0xaf, 0xc3, 0x01, 0x5b, 0x6d, 0xa6, 0xdf, 0x90, 0xf0, 0xd6, 0xfa, 0xba, 0x83, + 0x79, 0x79, 0x4e, 0x53, 0x86, 0x3d, 0x8a, 0xef, 0x30, 0x74, 0x45, 0x77, 0x30, 0x2b, 0xca, 0x3f, + 0x81, 0x43, 0xbe, 0x41, 0x0c, 0x27, 0x2b, 0x98, 0xfb, 0x8c, 0x20, 0xca, 0x2a, 0xfd, 0x4b, 0x12, + 0x8a, 0xe1, 0x74, 0xb5, 0x2e, 0xac, 0x5e, 0x82, 0xe0, 0x57, 0x7f, 0x63, 0xec, 0x1c, 0x24, 0xa9, + 0xcb, 0x3f, 0x5e, 0x91, 0xf8, 0xfc, 0x54, 0x6d, 0x8c, 0xb9, 0xb7, 0xe7, 0xf5, 0x05, 0x04, 0xb5, + 0xa0, 0x30, 0x60, 0x16, 0xd5, 0x0c, 0x73, 0x64, 0x39, 0x07, 0x29, 0xba, 0xda, 0xc7, 0xab, 0x56, + 0x0b, 0x1c, 0x11, 0x5f, 0x4e, 0x18, 0x04, 0x40, 0xe5, 0xaf, 0x41, 0x8c, 0x6e, 0x18, 0x13, 0x37, + 0xbb, 0xc1, 0xb8, 0x11, 0x02, 0x11, 0x52, 0xbe, 0x80, 0x9d, 0xa5, 0x2d, 0xfe, 0x27, 0x81, 0x17, + 0x60, 0x0e, 0x06, 0xde, 0x53, 0xd8, 0x8e, 0x64, 0xf7, 0x5b, 0x32, 0xab, 0xf4, 0x67, 0x29, 0xd8, + 0xe5, 0xb7, 0x90, 0x70, 0x35, 0xfd, 0x12, 0x72, 0x83, 0x4b, 0x7d, 0x32, 0xc1, 0x26, 0x2f, 0xd5, + 0xc1, 0x12, 0xc2, 0xab, 0xb3, 0x87, 0x27, 0x35, 0xd1, 0x27, 0x46, 0x3f, 0x86, 0x8c, 0x33, 0x1f, + 0x0c, 0xb0, 0xe3, 0x70, 0xb1, 0x17, 0xf5, 0xad, 0xeb, 0x15, 0xce, 0x2e, 0x23, 0x20, 0xb5, 0x87, + 0xd3, 0xa2, 0xcf, 0x60, 0x13, 0xdb, 0xb6, 0x65, 0xf3, 0x4a, 0x7a, 0x6f, 0x99, 0x49, 0x21, 0xe8, + 0xfa, 0x86, 0xca, 0xe8, 0xd0, 0x73, 0xc8, 0xcc, 0x6c, 0x3c, 0xd3, 0x6d, 0xcc, 0xeb, 0x68, 0x39, + 0xe6, 0x34, 0x3b, 0x8c, 0x82, 0x6c, 0xc4, 0x89, 0xd1, 0x69, 0xa8, 0x92, 0xde, 0x5f, 0xe1, 0x02, + 0x15, 0x3c, 0x36, 0x16, 0xe5, 0xf4, 0x27, 0x90, 0x1d, 0x19, 0xa6, 0x3e, 0x31, 0x7e, 0x1f, 0xf3, + 0x7a, 0xfa, 0x5e, 0x0c, 0xdf, 0x19, 0x27, 0x21, 0xb7, 0x24, 0x8f, 0x1c, 0x3d, 0x83, 0x0c, 0xf7, + 0xc4, 0x83, 0x4c, 0x44, 0x33, 0x6e, 0x72, 0x7e, 0x64, 0x44, 0x46, 0x4e, 0xe9, 0x15, 0xe2, 0x0e, + 0x6c, 0x47, 0x4c, 0x8d, 0xee, 0x47, 0xcf, 0x45, 0x08, 0xda, 0x3e, 0x52, 0xa4, 0x93, 0xd1, 0x22, + 0x2d, 0x7d, 0x0e, 0x62, 0xf4, 0x10, 0x6e, 0x73, 0x91, 0x7f, 0x4f, 0x40, 0x81, 0xaa, 0x87, 0x87, + 0xe7, 0xba, 0x7d, 0x85, 0x5d, 0xd4, 0x81, 0xe2, 0x94, 0x01, 0xbc, 0x7a, 0x94, 0x88, 0x84, 0x53, + 0x88, 0xde, 0x7b, 0x0a, 0xd6, 0xa2, 0xc2, 0x34, 0x08, 0x43, 0x27, 0x50, 0x1a, 0x4c, 0xb0, 0x6e, + 0x1b, 0xe6, 0x58, 0x9b, 0xd9, 0xc6, 0x00, 0x6b, 0xb6, 0xee, 0x62, 0x7e, 0x83, 0xd8, 0xf1, 0x50, + 0x1d, 0x82, 0x51, 0x75, 0x17, 0x97, 0x5f, 0x03, 0x5a, 0x5e, 0x34, 0x26, 0x80, 0x3e, 0x09, 0x07, + 0xd0, 0x5e, 0x54, 0x40, 0x96, 0xd0, 0x03, 0x11, 0xf4, 0x1f, 0x9b, 0x3c, 0xcb, 0x07, 0xbd, 0x07, + 0x7d, 0xb7, 0x42, 0xe1, 0x27, 0xab, 0x3d, 0x2e, 0x46, 0xe9, 0x4a, 0xf2, 0x20, 0x11, 0x55, 0xfc, + 0x74, 0x8d, 0xe2, 0x94, 0x7e, 0x59, 0x79, 0xf4, 0x9b, 0x20, 0x0e, 0x2e, 0x75, 0x7b, 0x8c, 0x87, + 0x1a, 0xf7, 0x17, 0x2f, 0x9f, 0xed, 0x46, 0x2f, 0x79, 0x35, 0x63, 0x34, 0x52, 0xb7, 0x39, 0x35, + 0x87, 0x39, 0xe8, 0x2b, 0x28, 0xe0, 0x6b, 0x3c, 0x98, 0x13, 0xe7, 0xd3, 0x46, 0xd8, 0x8b, 0x9f, + 0x85, 0x75, 0x14, 0x0f, 0x7b, 0x86, 0xb1, 0x2a, 0xe0, 0xc0, 0x13, 0xfa, 0x04, 0x76, 0x58, 0xc6, + 0x76, 0x6d, 0xdd, 0x74, 0x74, 0xea, 0xc0, 0x3c, 0xef, 0x8b, 0x14, 0xd1, 0x5b, 0xc0, 0xd1, 0xa7, + 0x50, 0x1a, 0x61, 0xa6, 0x92, 0xe6, 0xe8, 0xae, 0x36, 0x23, 0x3e, 0xf6, 0x8e, 0x46, 0x50, 0x5a, + 0xdd, 0x1e, 0x61, 0xaa, 0x4f, 0x57, 0x77, 0x3b, 0xd8, 0x7e, 0xf9, 0x8e, 0x54, 0x38, 0x4a, 0x8d, + 0xfb, 0x9c, 0x9e, 0x06, 0x4c, 0x5a, 0x15, 0x08, 0x21, 0x05, 0x76, 0xf5, 0xf0, 0x4d, 0x2c, 0x1b, + 0x2e, 0x19, 0x4b, 0x37, 0xd0, 0xdc, 0xf2, 0x0d, 0x14, 0xbd, 0x86, 0x6d, 0xef, 0x2c, 0xa7, 0xd4, + 0x3d, 0x9d, 0x03, 0xa0, 0xc6, 0x3b, 0xb9, 0xfd, 0x30, 0x99, 0x3f, 0x7b, 0xd7, 0xa9, 0x69, 0x08, + 0xf8, 0x7f, 0xe6, 0x93, 0xe5, 0x37, 0x50, 0x8a, 0xd9, 0x3f, 0xb8, 0x72, 0x81, 0xad, 0xfc, 0x69, + 0x78, 0xe5, 0xfd, 0xf8, 0x70, 0x0c, 0x17, 0x8c, 0x52, 0x4c, 0xda, 0x5b, 0x77, 0x3b, 0xb6, 0x00, + 0x2d, 0x27, 0xbc, 0x75, 0x75, 0xfc, 0x08, 0x80, 0x3b, 0xcc, 0x35, 0xef, 0x6c, 0x05, 0x35, 0xc7, + 0x3c, 0xe5, 0xda, 0x18, 0x92, 0x8c, 0x75, 0x89, 0x8d, 0xf1, 0xa5, 0xab, 0x5d, 0x92, 0x1b, 0x44, + 0x8a, 0x6a, 0x03, 0x0c, 0x54, 0x27, 0xb7, 0x86, 0xbf, 0x49, 0x42, 0x31, 0x5c, 0x02, 0x48, 0x5d, + 0x65, 0xa5, 0x82, 0x59, 0x95, 0xd7, 0x83, 0x17, 0x00, 0xf4, 0x47, 0xf0, 0x9e, 0x77, 0xb4, 0xa2, + 0x8a, 0x9c, 0xd0, 0x7f, 0xd5, 0x1c, 0x65, 0xa0, 0x97, 0xec, 0xf5, 0xd3, 0x14, 0x54, 0x87, 0x92, + 0x77, 0x1b, 0xb1, 0xe9, 0x54, 0x45, 0xa7, 0x8e, 0x9f, 0x5e, 0x9b, 0xd1, 0x55, 0xa4, 0xfb, 0x33, + 0x02, 0x8f, 0x45, 0x32, 0x60, 0x93, 0x69, 0x11, 0xba, 0x15, 0x97, 0x60, 0x9b, 0xdf, 0x8a, 0xbb, + 0xf5, 0x8b, 0x5e, 0x8d, 0x00, 0xe9, 0x95, 0x58, 0xae, 0x56, 0xdb, 0x17, 0xad, 0x9e, 0x56, 0x6b, + 0x2b, 0x5d, 0xad, 0xd5, 0xee, 0x69, 0xca, 0x77, 0x8d, 0x6e, 0x4f, 0x4c, 0x22, 0x09, 0x1e, 0x34, + 0x5a, 0xd5, 0xf6, 0x79, 0xa7, 0xa9, 0xf4, 0x14, 0xcd, 0x23, 0x53, 0x15, 0xb2, 0x8a, 0xdc, 0x6b, + 0xb4, 0x5b, 0x62, 0x4a, 0xfa, 0xbb, 0x24, 0x14, 0xc3, 0x12, 0x2d, 0xae, 0x24, 0x6c, 0xf0, 0xc4, + 0x1e, 0xc8, 0xdd, 0x39, 0x34, 0x69, 0xe2, 0x4f, 0xb7, 0x19, 0x65, 0x79, 0x90, 0x94, 0x8e, 0x1b, + 0x24, 0xbd, 0x07, 0xb9, 0xc5, 0x00, 0x89, 0xa5, 0x0a, 0xe6, 0x2d, 0x04, 0x79, 0x0a, 0x9b, 0x8e, + 0x4b, 0x52, 0xde, 0x16, 0x3d, 0xb0, 0xfb, 0x2b, 0x4c, 0xd9, 0x25, 0x34, 0x2a, 0x23, 0x8d, 0xfa, + 0x4c, 0x26, 0xea, 0x33, 0xe8, 0x09, 0x64, 0xad, 0xb9, 0xcb, 0xee, 0xa4, 0xd9, 0x55, 0xc3, 0x26, + 0x9f, 0x84, 0x08, 0x38, 0xd1, 0x5d, 0xec, 0xb8, 0x9a, 0x7b, 0x4d, 0x73, 0x86, 0xa0, 0x66, 0x19, + 0xa0, 0x77, 0x2d, 0xfd, 0x12, 0x84, 0x60, 0x60, 0xa2, 0xe7, 0x20, 0x78, 0xf9, 0xa3, 0x6f, 0x0c, + 0xbd, 0x4a, 0x50, 0x8a, 0xc6, 0x5a, 0xc5, 0x18, 0xaa, 0xf9, 0xa9, 0xff, 0xdb, 0x09, 0xf2, 0xe9, + 0xce, 0x95, 0x77, 0x9f, 0x5d, 0xe2, 0x93, 0x9d, 0x2b, 0x9f, 0x4f, 0x76, 0xae, 0x1c, 0xe9, 0x02, + 0x60, 0x81, 0x42, 0x1f, 0xde, 0x32, 0x48, 0x62, 0x63, 0xa4, 0x47, 0x20, 0xcc, 0x4d, 0xc3, 0x75, + 0xb4, 0x91, 0x31, 0x99, 0xf0, 0xd9, 0x4d, 0x41, 0xcd, 0x53, 0xd8, 0x19, 0x05, 0x05, 0x96, 0xad, + 0x18, 0x43, 0xb2, 0x6c, 0x9f, 0x87, 0x6e, 0xec, 0xdc, 0x89, 0x4e, 0x9d, 0xee, 0xb2, 0xec, 0xdf, + 0x26, 0x21, 0x1f, 0xa8, 0x3d, 0xc4, 0x45, 0xb0, 0x39, 0x24, 0xd5, 0xad, 0xaf, 0x4f, 0x74, 0xd2, + 0xbb, 0x33, 0xc7, 0x2b, 0x30, 0x68, 0x85, 0x01, 0x51, 0x0d, 0x04, 0x4e, 0xc6, 0x9c, 0x81, 0x45, + 0xef, 0xa3, 0xb8, 0x72, 0x76, 0x12, 0xf2, 0x88, 0x3c, 0x63, 0xa3, 0x0f, 0x64, 0x33, 0xef, 0x4c, + 0x35, 0xc3, 0x1c, 0xe2, 0x6b, 0xea, 0xb2, 0x9b, 0x6a, 0xc1, 0x83, 0x36, 0x08, 0x30, 0xe2, 0xd5, + 0xe9, 0xe8, 0x7d, 0xe7, 0x97, 0x20, 0x04, 0xb7, 0x40, 0xbb, 0x20, 0xb6, 0x2f, 0x7a, 0x9d, 0x0b, + 0x12, 0x5d, 0x55, 0x55, 0x91, 0x7b, 0x4a, 0x4d, 0xdc, 0x40, 0x8f, 0xe0, 0x88, 0x43, 0x6b, 0x17, + 0x5d, 0x12, 0x96, 0x3d, 0xa5, 0x55, 0x53, 0x6a, 0x5a, 0xfb, 0xec, 0xac, 0x5a, 0x97, 0x1b, 0x24, + 0x7c, 0x8f, 0xe0, 0x30, 0x48, 0x22, 0xd7, 0x08, 0xbe, 0xd7, 0xd6, 0xce, 0x14, 0xa5, 0x2b, 0x26, + 0x49, 0x23, 0xcc, 0xd1, 0x67, 0x17, 0xcd, 0xe6, 0x1b, 0xad, 0xdb, 0x51, 0x5a, 0xa4, 0xb1, 0xfd, + 0xd3, 0x14, 0xe4, 0x99, 0xe1, 0x99, 0xc3, 0xdd, 0x32, 0x1b, 0x39, 0x02, 0xa0, 0xf5, 0x75, 0x64, + 0x5c, 0xfb, 0x47, 0x92, 0x23, 0x90, 0x33, 0x02, 0x20, 0x55, 0x42, 0x9f, 0xba, 0x7c, 0x26, 0x4a, + 0x7e, 0xa2, 0x87, 0x20, 0x4c, 0x0d, 0x53, 0x23, 0xfd, 0x8c, 0x46, 0x50, 0x69, 0x8a, 0x82, 0xa9, + 0x61, 0x92, 0xae, 0x42, 0x9e, 0xd2, 0x51, 0x4f, 0x60, 0x62, 0x47, 0x23, 0x53, 0x50, 0x61, 0x31, + 0xa8, 0x23, 0x01, 0xc3, 0x08, 0x1c, 0x63, 0x4c, 0xc3, 0x4f, 0x50, 0xb3, 0x14, 0xd0, 0x35, 0xc6, + 0x48, 0x82, 0xc2, 0x74, 0x3e, 0x71, 0x0d, 0x82, 0xa4, 0x22, 0xb3, 0x2a, 0x9d, 0xa7, 0xc0, 0xae, + 0x31, 0x26, 0x42, 0x1f, 0x42, 0x96, 0xf6, 0xa7, 0xb3, 0x79, 0x9f, 0x07, 0x5c, 0x86, 0x3c, 0x77, + 0xe6, 0x7d, 0xf4, 0x39, 0xe4, 0x28, 0x4a, 0x1f, 0x0e, 0x6d, 0x5e, 0x99, 0x17, 0xd7, 0x1a, 0xd2, + 0xbe, 0xca, 0xc3, 0xa1, 0x8d, 0x1d, 0x47, 0xa5, 0x2b, 0x90, 0x07, 0x22, 0x0e, 0xd5, 0x86, 0x76, + 0xd2, 0x02, 0xb5, 0x40, 0x96, 0x00, 0x48, 0xf7, 0x8c, 0xbe, 0x86, 0xa3, 0xa9, 0x7e, 0xcd, 0x47, + 0xd8, 0x71, 0xb7, 0x91, 0x02, 0xd5, 0xff, 0xde, 0x54, 0xbf, 0xa6, 0xe3, 0xec, 0xb3, 0xf0, 0xad, + 0xe4, 0x9b, 0x74, 0x76, 0x53, 0xdc, 0xfa, 0x26, 0x9d, 0xcd, 0x8b, 0x82, 0xf4, 0xf7, 0x09, 0xc8, + 0xf9, 0x31, 0x81, 0x4e, 0xfc, 0xf9, 0x27, 0x0f, 0x9c, 0xdd, 0x48, 0xe0, 0xb0, 0x4a, 0xee, 0x11, + 0xa1, 0x53, 0xd8, 0x9b, 0x60, 0xd2, 0x2c, 0x0f, 0xe7, 0x36, 0xad, 0x05, 0x5a, 0x7f, 0x62, 0x0d, + 0xae, 0x1c, 0x7e, 0x68, 0x25, 0x8a, 0xac, 0x71, 0x5c, 0x85, 0xa2, 0xd0, 0x01, 0x64, 0xbc, 0xcb, + 0x0c, 0x1b, 0x58, 0x7b, 0x8f, 0xe8, 0xc7, 0x50, 0x20, 0xc7, 0x48, 0x6d, 0xe5, 0x1a, 0xd8, 0xa6, + 0x99, 0xb5, 0x18, 0x48, 0x74, 0xc4, 0x56, 0x3d, 0x03, 0xdb, 0x6a, 0x7e, 0x6a, 0x98, 0xde, 0xc3, + 0x37, 0xe9, 0x6c, 0x4a, 0x4c, 0x4b, 0x7f, 0xe8, 0x2b, 0x42, 0x92, 0xca, 0x0f, 0xa6, 0x48, 0xfa, + 0x4e, 0x8a, 0x6c, 0x86, 0x14, 0x91, 0x4e, 0x20, 0x1f, 0x98, 0xf3, 0x46, 0x9d, 0x2f, 0x11, 0x75, + 0x3e, 0xe9, 0xaf, 0x12, 0x20, 0x04, 0xa7, 0xd6, 0xb7, 0x72, 0x20, 0x19, 0xf2, 0x23, 0xdd, 0x98, + 0x68, 0x81, 0x31, 0x5d, 0xf1, 0xf4, 0x61, 0xec, 0x08, 0xfc, 0xe4, 0x4c, 0x37, 0x26, 0xde, 0xf0, + 0x67, 0xe4, 0xff, 0x26, 0x7b, 0xd0, 0x25, 0x1c, 0x97, 0xdc, 0xc5, 0x69, 0x38, 0xe5, 0x18, 0x41, + 0x97, 0x42, 0xa4, 0x23, 0x80, 0x05, 0x2b, 0xda, 0x86, 0x7c, 0xa3, 0xf5, 0x4a, 0x6e, 0x36, 0x6a, + 0x9a, 0x7c, 0xde, 0x13, 0x37, 0xa4, 0x5f, 0x78, 0x31, 0xdd, 0x30, 0x67, 0xf3, 0x70, 0x81, 0x4a, + 0xdc, 0x5e, 0xa0, 0x8e, 0x00, 0x48, 0x30, 0x85, 0xde, 0x82, 0xe4, 0x1c, 0x63, 0xcc, 0xde, 0x80, + 0x48, 0x2f, 0x40, 0xe0, 0xe7, 0x34, 0x77, 0xc9, 0xea, 0x2b, 0x8b, 0x7c, 0x68, 0x01, 0xfe, 0x24, + 0xfd, 0x65, 0x12, 0xca, 0x8c, 0xfd, 0xdc, 0x1a, 0x1a, 0xa3, 0x9b, 0xc8, 0xdb, 0x9b, 0x5b, 0xd2, + 0xcf, 0x33, 0x00, 0x13, 0xbf, 0xd3, 0x0c, 0xa2, 0x96, 0x57, 0xd4, 0xa2, 0xee, 0x43, 0x75, 0x56, + 0x73, 0x26, 0x7e, 0x47, 0x7f, 0x91, 0x5a, 0x98, 0x27, 0x4c, 0x16, 0x15, 0xd7, 0x6b, 0x5e, 0xf6, + 0xa2, 0x4e, 0x47, 0xb1, 0x2a, 0x59, 0x9e, 0xfd, 0x74, 0xd0, 0x6b, 0xb6, 0xd9, 0x4c, 0xb7, 0xf5, + 0xa9, 0xc3, 0x2f, 0x5f, 0x5f, 0x46, 0xd8, 0xe2, 0x94, 0x38, 0x69, 0xe1, 0x77, 0x1c, 0xd2, 0x21, + 0xbc, 0xd8, 0xc5, 0xb6, 0x43, 0x05, 0xa2, 0x8f, 0x4e, 0xf9, 0x53, 0xd8, 0x8d, 0x23, 0x89, 0xb7, + 0xa4, 0xf4, 0x35, 0xbc, 0x17, 0xbb, 0x17, 0x7f, 0xe7, 0xf2, 0x3e, 0xe4, 0x03, 0x93, 0x2b, 0xcf, + 0x1f, 0x17, 0xe3, 0x28, 0xe9, 0x2b, 0xb8, 0x17, 0x88, 0x2b, 0x56, 0xc8, 0xb8, 0xb5, 0x6f, 0xf5, + 0x7e, 0xdb, 0x7b, 0xd3, 0x12, 0xe4, 0xe5, 0x1b, 0x7f, 0xec, 0xdd, 0xa5, 0xd8, 0x34, 0xb1, 0x14, + 0x6e, 0x68, 0x42, 0x57, 0xa8, 0x4f, 0x60, 0x87, 0x95, 0xf2, 0xb9, 0x39, 0x9a, 0x4f, 0x42, 0xf5, + 0x5c, 0xa4, 0x88, 0x8b, 0x05, 0x5c, 0x2a, 0x82, 0xd0, 0xc3, 0xf6, 0xd4, 0xe1, 0x42, 0x4a, 0xff, + 0xb8, 0x09, 0x05, 0x0e, 0xe0, 0x3b, 0x1f, 0xc3, 0x0e, 0x49, 0xb2, 0x71, 0xef, 0x36, 0xb7, 0xa7, + 0xfa, 0xb5, 0x1c, 0x7c, 0x15, 0xf7, 0x1b, 0x70, 0x48, 0x68, 0x99, 0x9a, 0xb1, 0xa9, 0x90, 0x36, + 0xbe, 0xfb, 0x53, 0xfd, 0x9a, 0xca, 0x1d, 0x49, 0x24, 0x4b, 0xcd, 0x6b, 0xea, 0xee, 0xcd, 0xeb, + 0x6b, 0xd8, 0x0e, 0x27, 0x2e, 0x6f, 0x92, 0x7e, 0xec, 0x73, 0x87, 0xf4, 0x3a, 0x69, 0x06, 0x33, + 0x59, 0xa0, 0x8b, 0x2f, 0x86, 0x52, 0x9c, 0x83, 0x9e, 0xc1, 0xbe, 0x89, 0xaf, 0x5d, 0x5e, 0x65, + 0x06, 0x96, 0x39, 0xd2, 0x5c, 0xd2, 0x73, 0xbb, 0x3c, 0xd9, 0x95, 0x08, 0x96, 0x96, 0x97, 0xaa, + 0x65, 0x8e, 0x7a, 0x14, 0x85, 0x7e, 0x0b, 0x1e, 0x04, 0x98, 0x56, 0x37, 0xca, 0x07, 0x3e, 0x73, + 0xa4, 0x36, 0xa1, 0x9f, 0x42, 0x39, 0xb8, 0xed, 0x04, 0xeb, 0xb6, 0xe6, 0x1a, 0x53, 0xec, 0xb8, + 0xfa, 0x74, 0xc6, 0xbb, 0xe7, 0x7b, 0x8b, 0xad, 0x09, 0xbe, 0xe7, 0xa1, 0xd1, 0x08, 0xf6, 0xa3, + 0x59, 0x7c, 0x3e, 0xa0, 0xfd, 0x70, 0x96, 0xda, 0xe4, 0xe9, 0x5d, 0x6c, 0x52, 0x61, 0x2c, 0xac, + 0x23, 0xde, 0x9d, 0xc4, 0xa0, 0xca, 0x32, 0x94, 0x62, 0xcc, 0x18, 0xd3, 0xbe, 0x86, 0xc6, 0xa5, + 0xd9, 0x60, 0x07, 0x8c, 0xe1, 0x70, 0xe5, 0xae, 0x31, 0x0b, 0x9d, 0x06, 0x17, 0x0a, 0xf6, 0x14, + 0x61, 0x7e, 0x1e, 0x10, 0x8b, 0x6e, 0xb8, 0x02, 0xbb, 0x2a, 0x9e, 0xe0, 0xb7, 0xba, 0xc9, 0x0c, + 0xe6, 0x05, 0x65, 0x11, 0x92, 0x7e, 0x5f, 0x9b, 0x34, 0x86, 0xa8, 0x4c, 0x5f, 0x8b, 0xb2, 0xc1, + 0x0b, 0xc9, 0x78, 0x82, 0xea, 0x3f, 0x4b, 0xff, 0xb0, 0x09, 0x85, 0xd0, 0x22, 0xc1, 0xca, 0x97, + 0x08, 0x97, 0x70, 0xb6, 0x6e, 0xd2, 0x5f, 0xf7, 0x7b, 0x0f, 0x76, 0x7a, 0x4b, 0x73, 0xaa, 0x74, + 0x64, 0x30, 0x17, 0x12, 0xed, 0xfb, 0xcd, 0xa8, 0x36, 0xd7, 0xcd, 0xa8, 0x96, 0xa2, 0x74, 0xeb, + 0xee, 0x51, 0xfa, 0x10, 0xf2, 0xc1, 0xe1, 0x12, 0xbb, 0x5f, 0x06, 0x41, 0xab, 0xe6, 0x4a, 0xd9, + 0xf8, 0xb9, 0xd2, 0x29, 0xec, 0x0d, 0x6c, 0xcc, 0x5c, 0xdc, 0x8f, 0x0e, 0xcd, 0x74, 0xe8, 0xcd, + 0x33, 0xad, 0x96, 0x3c, 0xa4, 0x1f, 0x1a, 0x2d, 0x07, 0x75, 0x57, 0x4d, 0x89, 0x8e, 0xd7, 0x9b, + 0xf2, 0x57, 0x6e, 0x42, 0x54, 0x03, 0x21, 0x78, 0x54, 0x6c, 0xd2, 0xe3, 0x60, 0x7a, 0xa6, 0x2c, + 0xc1, 0x67, 0xc8, 0x33, 0x47, 0x79, 0xa7, 0x42, 0xd7, 0x4f, 0xab, 0x19, 0x7e, 0x14, 0xd2, 0x4f, + 0x21, 0x1f, 0xb8, 0xba, 0x93, 0x90, 0x30, 0xb1, 0xfb, 0xce, 0xb2, 0xaf, 0xb8, 0xda, 0xde, 0x23, + 0x42, 0x90, 0xa6, 0x17, 0x7f, 0xf6, 0x2a, 0x95, 0xfe, 0x96, 0x64, 0xc8, 0x7a, 0x77, 0x22, 0x82, + 0xa7, 0x73, 0x24, 0x16, 0x8c, 0xf4, 0x37, 0x69, 0x4b, 0xd9, 0x4d, 0x82, 0x37, 0x7d, 0xbc, 0x2d, + 0x65, 0x30, 0xda, 0xf2, 0x49, 0x7f, 0x92, 0x80, 0xbc, 0xec, 0x5c, 0x75, 0x4d, 0x7d, 0xe6, 0x5c, + 0x5a, 0xee, 0x9a, 0x98, 0xfc, 0xdf, 0x5c, 0xd2, 0xc3, 0x2d, 0x58, 0x2a, 0xda, 0x82, 0x85, 0xda, + 0x93, 0x74, 0xb8, 0x3d, 0xa1, 0x92, 0x55, 0x8c, 0xe1, 0xff, 0x43, 0xc9, 0xfe, 0x39, 0x01, 0xbb, + 0x41, 0x87, 0xf3, 0x45, 0x0c, 0x7d, 0xcc, 0x12, 0xc8, 0x4c, 0x0b, 0xfb, 0xc6, 0x7c, 0xcc, 0xb2, + 0xa0, 0x0b, 0x68, 0xcb, 0xc6, 0x0a, 0x1f, 0x00, 0x4b, 0x38, 0x24, 0xbf, 0x50, 0xe7, 0x61, 0x72, + 0x0a, 0x1e, 0x90, 0x26, 0x94, 0x4f, 0x01, 0xb9, 0x96, 0xab, 0x4f, 0x48, 0xbc, 0x3b, 0xac, 0xd4, + 0xe1, 0x21, 0xef, 0x5d, 0x45, 0x8a, 0xe9, 0xea, 0xae, 0x53, 0x65, 0x70, 0xb2, 0x24, 0xbb, 0xde, + 0xf0, 0x08, 0xe4, 0x65, 0x98, 0x8d, 0x2f, 0xb8, 0x52, 0xd2, 0xe7, 0xb0, 0x4b, 0x63, 0xd7, 0x97, + 0x86, 0xa7, 0xfb, 0x35, 0xd3, 0xcf, 0x3f, 0x4a, 0xc0, 0x5e, 0x28, 0x54, 0x7c, 0xa3, 0xd4, 0x56, + 0xbc, 0x22, 0x38, 0x8a, 0x0d, 0x5e, 0x7f, 0xcb, 0xef, 0xf7, 0x1e, 0x44, 0xfa, 0xa7, 0x34, 0xec, + 0x45, 0x74, 0xe0, 0x37, 0xb2, 0xd5, 0x7e, 0x14, 0x54, 0x2f, 0x19, 0x9e, 0xd5, 0x4a, 0x50, 0x98, + 0xd9, 0xf8, 0xad, 0xe6, 0xe3, 0xd9, 0xc8, 0x2f, 0x4f, 0x80, 0x15, 0x4e, 0xb3, 0xa2, 0x1a, 0xa4, + 0xd7, 0x55, 0x83, 0xfa, 0x92, 0x71, 0x36, 0xef, 0x60, 0x9c, 0xb8, 0x5a, 0xf4, 0x00, 0xf2, 0xde, + 0x34, 0x99, 0xc8, 0x97, 0xa1, 0x69, 0xc2, 0x1b, 0x27, 0x37, 0x86, 0x0b, 0xe5, 0xdc, 0x6b, 0x3e, + 0xb7, 0xc8, 0x70, 0x24, 0x7a, 0x01, 0xf7, 0x7d, 0xd6, 0xd5, 0xd5, 0x63, 0x9f, 0x93, 0x9f, 0xfd, + 0x00, 0x45, 0xe4, 0x17, 0xab, 0x8a, 0xc8, 0xe9, 0x22, 0x18, 0xe2, 0x0e, 0xef, 0x4e, 0xc5, 0x44, + 0xbf, 0x6b, 0xce, 0xff, 0x22, 0x9c, 0xf3, 0x1f, 0xc4, 0xe7, 0x7c, 0x5f, 0x86, 0x40, 0xee, 0x7f, + 0xe1, 0xf5, 0x29, 0x24, 0x77, 0xab, 0xba, 0x4b, 0x62, 0x91, 0xc7, 0xc8, 0x23, 0x10, 0xbc, 0x01, + 0xce, 0x15, 0xbe, 0x61, 0xce, 0x2e, 0xa8, 0x79, 0x3e, 0xc4, 0x21, 0x20, 0xe9, 0xb7, 0x01, 0x16, + 0x7c, 0xa4, 0xb1, 0x09, 0x30, 0x78, 0x8d, 0xcd, 0x82, 0x1e, 0x9d, 0xf0, 0xb9, 0x0f, 0x9d, 0x65, + 0x24, 0x57, 0xcd, 0x32, 0xe8, 0xd0, 0x87, 0xfc, 0x92, 0x54, 0xaf, 0x11, 0x0a, 0x0a, 0xc7, 0x9d, + 0xff, 0x39, 0x97, 0xce, 0xa6, 0xe0, 0xe5, 0x19, 0x6d, 0x80, 0x85, 0x4a, 0xc5, 0x7e, 0x3b, 0xd2, + 0x38, 0x12, 0x4d, 0x5e, 0xc7, 0x83, 0x3e, 0x84, 0xa2, 0xe3, 0xea, 0xb6, 0xab, 0x45, 0x12, 0x83, + 0x40, 0xa1, 0x5e, 0x68, 0x3c, 0x06, 0xd1, 0x9c, 0x4f, 0x19, 0x0d, 0x76, 0xb4, 0xbe, 0x3e, 0xb8, + 0xe2, 0xa1, 0x5b, 0x34, 0xe7, 0xd3, 0x0a, 0x03, 0x57, 0xf4, 0xc1, 0x95, 0xa4, 0xc2, 0x7e, 0x74, + 0x23, 0x2e, 0xfa, 0x97, 0x90, 0xe1, 0xfc, 0x5c, 0xea, 0x07, 0xeb, 0x7d, 0x45, 0xf5, 0xc8, 0x8f, + 0x3f, 0xf6, 0xbf, 0x2c, 0xa1, 0x73, 0xaf, 0x02, 0xe4, 0x7a, 0xaf, 0x15, 0xf9, 0x65, 0x53, 0xe9, + 0x76, 0xc5, 0x0d, 0x94, 0x87, 0x8c, 0xdc, 0xaa, 0xd6, 0xdb, 0x6a, 0x57, 0x4c, 0x1c, 0xff, 0x71, + 0x02, 0x4a, 0x31, 0xf3, 0x75, 0xfa, 0x6d, 0x4e, 0x8f, 0x7d, 0xc9, 0xc2, 0xbe, 0x5b, 0x69, 0x77, + 0x94, 0x96, 0xb8, 0x81, 0x8a, 0x00, 0x0c, 0x4e, 0x9f, 0x13, 0x68, 0x07, 0x0a, 0xec, 0x59, 0xf9, + 0xae, 0xd3, 0x50, 0x95, 0x9a, 0x98, 0x44, 0x07, 0xb0, 0x1b, 0x66, 0xbd, 0xe8, 0xd4, 0xe4, 0x9e, + 0x22, 0xa6, 0x90, 0x08, 0x02, 0xc3, 0x54, 0x9b, 0xed, 0xae, 0x52, 0x13, 0xd3, 0xe8, 0x1e, 0x94, + 0xc2, 0xb4, 0xf4, 0xc3, 0x1f, 0x71, 0xf3, 0xf8, 0x0b, 0xc8, 0x7a, 0x27, 0x4d, 0xd8, 0x7a, 0x0d, + 0x45, 0xd5, 0x6a, 0xca, 0x99, 0x7c, 0xd1, 0xec, 0x89, 0x1b, 0x08, 0x60, 0x8b, 0x42, 0x9e, 0x8a, + 0x09, 0xff, 0xf7, 0xe7, 0x62, 0xf2, 0xf8, 0xcf, 0x13, 0x00, 0x8b, 0x0e, 0x17, 0x95, 0x60, 0xbb, + 0xad, 0xd6, 0x14, 0x55, 0xeb, 0x5e, 0x54, 0xce, 0x1b, 0x3d, 0x36, 0xae, 0xdd, 0x81, 0x02, 0x03, + 0x56, 0x9b, 0x8a, 0x4c, 0x24, 0xa6, 0x6f, 0x57, 0x18, 0x88, 0x7f, 0x5a, 0xd4, 0x7c, 0xa3, 0x9d, + 0x35, 0x9a, 0x4d, 0xaa, 0x0d, 0x82, 0x22, 0xc3, 0x29, 0xdf, 0x29, 0xd5, 0x0b, 0xb2, 0x44, 0x6a, + 0x01, 0xab, 0xca, 0xad, 0xaa, 0xd2, 0xa4, 0x9a, 0xf8, 0xcb, 0x7a, 0x86, 0xd8, 0x24, 0x72, 0x33, + 0x10, 0xff, 0xe6, 0x67, 0xeb, 0xf8, 0x77, 0xa0, 0x14, 0xd3, 0x78, 0x90, 0x03, 0x6a, 0xb5, 0xb5, + 0x73, 0x59, 0x7d, 0xa9, 0xf4, 0x98, 0x84, 0xec, 0xb7, 0x67, 0xa7, 0x04, 0xda, 0x05, 0x51, 0xae, + 0x56, 0x95, 0x4e, 0x8f, 0x1e, 0x05, 0x59, 0xb4, 0x2b, 0x26, 0xd1, 0x36, 0xe4, 0x39, 0x21, 0x3d, + 0x8d, 0xd4, 0xe9, 0x7f, 0x66, 0xfc, 0xaf, 0x49, 0x64, 0xff, 0xc5, 0x0b, 0xfa, 0x16, 0x8a, 0xe1, + 0xef, 0x7f, 0xd1, 0x83, 0xc0, 0xd5, 0x35, 0xe6, 0xe3, 0xe4, 0xf2, 0xfb, 0x2b, 0xf1, 0xdc, 0x37, + 0x7b, 0x90, 0x0f, 0x7c, 0xf8, 0x8a, 0x1e, 0x2d, 0x8d, 0x79, 0xa2, 0x9f, 0xfe, 0x96, 0xa5, 0x75, + 0x24, 0x7c, 0xd5, 0x9f, 0x43, 0x21, 0x34, 0x47, 0x41, 0x1f, 0xdc, 0x61, 0xa2, 0x53, 0xfe, 0x70, + 0x3d, 0xd1, 0x42, 0xe2, 0xc0, 0x57, 0xb1, 0x4b, 0x12, 0x2f, 0x7f, 0xa9, 0xbb, 0x24, 0x71, 0xdc, + 0x47, 0xb5, 0xbd, 0xf0, 0xc4, 0x32, 0xba, 0xea, 0xf2, 0x37, 0xb0, 0x4b, 0xab, 0xc6, 0x7c, 0xd8, + 0x8a, 0xbe, 0x0d, 0x79, 0xf1, 0xc3, 0xb8, 0x11, 0x6c, 0x70, 0x54, 0x54, 0x7e, 0xb4, 0x86, 0x82, + 0x2f, 0xf9, 0x06, 0xf6, 0xfc, 0xf7, 0x9e, 0x34, 0x7b, 0x70, 0xff, 0x40, 0x8b, 0xc2, 0x1b, 0xf7, + 0x29, 0x6d, 0xf9, 0x28, 0xfa, 0x62, 0x29, 0x84, 0x7e, 0x9c, 0x78, 0x9a, 0x40, 0xcf, 0x61, 0x93, + 0x8e, 0x05, 0xd0, 0x5e, 0x74, 0x4c, 0xc0, 0xa4, 0xdb, 0x8f, 0x9f, 0x1e, 0xa0, 0x16, 0xec, 0x85, + 0x1a, 0x27, 0xff, 0x02, 0x75, 0x14, 0xdf, 0x58, 0x2d, 0xaf, 0x17, 0xee, 0xae, 0x5b, 0x50, 0x58, + 0xb5, 0x4e, 0xdc, 0xe5, 0xae, 0x7c, 0x4b, 0x3a, 0x25, 0xa7, 0x10, 0xa8, 0x5a, 0xd1, 0x53, 0x58, + 0x2a, 0x84, 0x4b, 0xa7, 0x10, 0x53, 0x8d, 0xbe, 0x85, 0x62, 0x38, 0xd9, 0xa3, 0x15, 0x42, 0x38, + 0xcb, 0x91, 0x18, 0x5f, 0x25, 0x2a, 0xbf, 0xf6, 0xf3, 0x1f, 0x8d, 0x0d, 0xf7, 0x72, 0xde, 0x3f, + 0x19, 0x58, 0xd3, 0xcf, 0x26, 0xc6, 0xf8, 0xd2, 0x35, 0x0d, 0x73, 0x3c, 0xd1, 0xfb, 0xce, 0x67, + 0x84, 0xf5, 0x33, 0xce, 0xdf, 0xdf, 0xa2, 0x7f, 0x9a, 0xf0, 0xec, 0xbf, 0x03, 0x00, 0x00, 0xff, + 0xff, 0xcd, 0xf3, 0x3e, 0x5a, 0xae, 0x30, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/poolrpc/auctioneer.proto b/poolrpc/auctioneer.proto index 4f17e7f66..5e0c0a5d2 100644 --- a/poolrpc/auctioneer.proto +++ b/poolrpc/auctioneer.proto @@ -445,7 +445,7 @@ message SubscribeSuccess { bytes trader_key = 1; } -message OrderMatchPrepare { +message MatchedMarket { /* Maps a user's own order_nonce to the opposite order type they were matched with. The order_nonce is a 32 byte hex encoded string because bytes is not @@ -458,6 +458,18 @@ message OrderMatchPrepare { batch. */ uint32 clearing_price_rate = 2; +} + +message OrderMatchPrepare { + /* + Deprecated, use matched_markets. + */ + map matched_orders = 1 [deprecated = true]; + + /* + Deprecated, use matched_markets. + */ + uint32 clearing_price_rate = 2 [deprecated = true]; /* A list of the user's own accounts that are being spent by the matched @@ -500,6 +512,12 @@ message OrderMatchPrepare { informed that a software update is required. */ uint32 batch_version = 9; + + /* + Maps the distinct lease duration markets to the orders that were matched + within and the discovered market clearing price. + */ + map matched_markets = 10; } message OrderMatchSignBegin { @@ -971,6 +989,32 @@ message ServerOrderStateResponse { message TermsRequest { } +enum DurationBucketState { + /* + NO_MARKET indicates that this bucket doesn't actually exist, in that no + market is present for this market. + */ + NO_MARKET = 0; + + /* + MARKET_CLOSED indicates that this market exists, but that it isn't currently + running. + */ + MARKET_CLOSED = 1; + + /* + ACCEPTING_ORDERS indicates that we're accepting orders for this bucket, but + not yet clearing for this duration. + */ + ACCEPTING_ORDERS = 2; + + /* + MARKET_OPEN indicates that we're accepting orders, and fully clearing the + market for this duration. + */ + MARKET_OPEN = 3; +} + message TermsResponse { /* The maximum account size in satoshis currently allowed by the auctioneer. @@ -978,7 +1022,7 @@ message TermsResponse { uint64 max_account_value = 1; /* - The maximum order duration in blocks currently allowed by the auctioneer. + Deprecated, use explicit order duration from lease_duration_buckets. */ uint32 max_order_duration_blocks = 2 [deprecated = true]; @@ -988,13 +1032,9 @@ message TermsResponse { ExecutionFee execution_fee = 3; /* - The set of lease durations the market is currently accepting. If a duration - is mapped to false, then this means the durations are being accepted, but - the market may be paused (not clearing batches). This might happen if a new - duration is added, and the auction wishes to build of sufficient market - thickness before starting to clear batches. + Deprecated, use lease_duration_buckets. */ - map lease_durations = 4; + map lease_durations = 4 [deprecated = true]; // The confirmation target to use for fee estimation of the next batch. uint32 next_batch_conf_target = 5; @@ -1010,6 +1050,12 @@ message TermsResponse { the next batch. */ uint64 next_batch_clear_timestamp = 7; + + /* + The set of lease durations the market is currently accepting and the state + the duration buckets currently are in. + */ + map lease_duration_buckets = 8; } message RelevantBatchRequest { @@ -1037,13 +1083,14 @@ message RelevantBatch { repeated AccountDiff charged_accounts = 3; /* - The set of orders that were matched against the orders belonging to the - requested accounts. + Deprecated, use matched_markets. */ - map matched_orders = 4; + map matched_orders = 4 [deprecated = true]; - // The uniform clearing price rate in parts per billion of the batch. - uint32 clearing_price_rate = 5; + /* + Deprecated, use matched_markets. + */ + uint32 clearing_price_rate = 5 [deprecated = true]; // The fee parameters used to calculate the execution fees. ExecutionFee execution_fee = 6; @@ -1056,6 +1103,15 @@ message RelevantBatch { units (sat/kW). */ uint64 fee_rate_sat_per_kw = 8; + + // The unix timestamp in nanoseconds the batch was made. + uint64 creation_timestamp_ns = 9; + + /* + Maps the distinct lease duration markets to the orders that were matched + within and the discovered market clearing price. + */ + map matched_markets = 10; } message ExecutionFee { @@ -1135,6 +1191,19 @@ message BatchSnapshotRequest { bytes batch_id = 1; } +message MatchedMarketSnapshot { + /* + The set of all orders matched in the batch. + */ + repeated MatchedOrderSnapshot matched_orders = 1; + + /* + The uniform clearing price rate in parts per billion that was used for this + batch. + */ + uint32 clearing_price_rate = 2; +} + message BatchSnapshotResponse { // The version of the batch. uint32 version = 1; @@ -1145,11 +1214,15 @@ message BatchSnapshotResponse { // The unique identifier of the prior batch. bytes prev_batch_id = 3; - // The uniform clearing price rate in parts per billion of the batch. - uint32 clearing_price_rate = 4; + /* + Deprecated, use matched_markets. + */ + uint32 clearing_price_rate = 4 [deprecated = true]; - // The set of all orders matched in the batch. - repeated MatchedOrderSnapshot matched_orders = 5; + /* + Deprecated, use matched_markets. + */ + repeated MatchedOrderSnapshot matched_orders = 5 [deprecated = true]; // The txid of the batch transaction. string batch_tx_id = 7; @@ -1159,6 +1232,15 @@ message BatchSnapshotResponse { // The fee rate, in satoshis per kiloweight, of the batch transaction. uint64 batch_tx_fee_rate_sat_per_kw = 8; + + // The unix timestamp in nanoseconds the batch was made. + uint64 creation_timestamp_ns = 9; + + /* + Maps the distinct lease duration markets to the orders that were matched + within and the discovered market clearing price. + */ + map matched_markets = 10; } message ServerNodeRatingRequest { diff --git a/poolrpc/trader.pb.go b/poolrpc/trader.pb.go index b0b3c061f..d0fcb3d60 100644 --- a/poolrpc/trader.pb.go +++ b/poolrpc/trader.pb.go @@ -2700,10 +2700,16 @@ func (m *LeaseDurationRequest) XXX_DiscardUnknown() { var xxx_messageInfo_LeaseDurationRequest proto.InternalMessageInfo type LeaseDurationResponse struct { - LeaseDurations map[uint32]bool `protobuf:"bytes,1,rep,name=lease_durations,json=leaseDurations,proto3" json:"lease_durations,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + // + //Deprecated, use lease_duration_buckets. + LeaseDurations map[uint32]bool `protobuf:"bytes,1,rep,name=lease_durations,json=leaseDurations,proto3" json:"lease_durations,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` // Deprecated: Do not use. + // + //The set of lease durations the market is currently accepting and the state + //the duration buckets currently are in. + LeaseDurationBuckets map[uint32]DurationBucketState `protobuf:"bytes,2,rep,name=lease_duration_buckets,json=leaseDurationBuckets,proto3" json:"lease_duration_buckets,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=poolrpc.DurationBucketState"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *LeaseDurationResponse) Reset() { *m = LeaseDurationResponse{} } @@ -2731,6 +2737,7 @@ func (m *LeaseDurationResponse) XXX_DiscardUnknown() { var xxx_messageInfo_LeaseDurationResponse proto.InternalMessageInfo +// Deprecated: Do not use. func (m *LeaseDurationResponse) GetLeaseDurations() map[uint32]bool { if m != nil { return m.LeaseDurations @@ -2738,6 +2745,13 @@ func (m *LeaseDurationResponse) GetLeaseDurations() map[uint32]bool { return nil } +func (m *LeaseDurationResponse) GetLeaseDurationBuckets() map[uint32]DurationBucketState { + if m != nil { + return m.LeaseDurationBuckets + } + return nil +} + type NextBatchInfoRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -2958,6 +2972,7 @@ func init() { proto.RegisterType((*LsatToken)(nil), "poolrpc.LsatToken") proto.RegisterType((*LeaseDurationRequest)(nil), "poolrpc.LeaseDurationRequest") proto.RegisterType((*LeaseDurationResponse)(nil), "poolrpc.LeaseDurationResponse") + proto.RegisterMapType((map[uint32]DurationBucketState)(nil), "poolrpc.LeaseDurationResponse.LeaseDurationBucketsEntry") proto.RegisterMapType((map[uint32]bool)(nil), "poolrpc.LeaseDurationResponse.LeaseDurationsEntry") proto.RegisterType((*NextBatchInfoRequest)(nil), "poolrpc.NextBatchInfoRequest") proto.RegisterType((*NextBatchInfoResponse)(nil), "poolrpc.NextBatchInfoResponse") @@ -2968,203 +2983,206 @@ func init() { func init() { proto.RegisterFile("trader.proto", fileDescriptor_b8f61804588c75fe) } var fileDescriptor_b8f61804588c75fe = []byte{ - // 3132 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0xcd, 0x73, 0x1b, 0xc7, - 0x95, 0xe7, 0xf0, 0x9b, 0x0f, 0x1f, 0x04, 0x1b, 0xfc, 0x12, 0x24, 0x5a, 0xd4, 0xec, 0xda, 0x96, - 0x68, 0xaf, 0x68, 0x6b, 0x2d, 0xed, 0x96, 0xd6, 0x6b, 0x2f, 0x48, 0x82, 0x26, 0xd6, 0x14, 0x88, - 0x34, 0x29, 0xc5, 0x1f, 0x55, 0x99, 0x6a, 0x60, 0x9a, 0xe4, 0x98, 0x98, 0x19, 0x78, 0xa6, 0x41, - 0x52, 0x51, 0xe9, 0x92, 0xe4, 0x9e, 0x54, 0x5c, 0x49, 0x8e, 0xa9, 0xca, 0xdf, 0x90, 0xaa, 0x1c, - 0x52, 0x95, 0x43, 0x4e, 0xa9, 0x4a, 0x2e, 0xa9, 0x9c, 0x73, 0xcb, 0x1f, 0x92, 0xea, 0xd7, 0xdd, - 0xc0, 0xcc, 0x00, 0x90, 0x3f, 0x2e, 0xb9, 0x61, 0xde, 0x7b, 0xdd, 0xbf, 0x7e, 0x5f, 0xfd, 0x5e, - 0x3f, 0x12, 0xf2, 0x22, 0x62, 0x2e, 0x8f, 0xee, 0x77, 0xa3, 0x50, 0x84, 0x64, 0xae, 0x1b, 0x86, - 0x9d, 0xa8, 0xdb, 0xae, 0xdc, 0x3a, 0x0b, 0xc3, 0xb3, 0x0e, 0xdf, 0x66, 0x5d, 0x6f, 0x9b, 0x05, - 0x41, 0x28, 0x98, 0xf0, 0xc2, 0x20, 0x56, 0x62, 0x95, 0x12, 0xeb, 0xb5, 0xe5, 0x37, 0x37, 0x0b, - 0xed, 0xbf, 0x58, 0x40, 0xea, 0x81, 0x27, 0xaa, 0xed, 0x76, 0xd8, 0x0b, 0x04, 0xe5, 0x5f, 0xf6, - 0x78, 0x2c, 0xc8, 0xbf, 0x41, 0x81, 0x29, 0x8a, 0x73, 0xc9, 0x3a, 0x3d, 0xbe, 0x6e, 0x6d, 0x5a, - 0x77, 0xa7, 0x69, 0x5e, 0x13, 0x9f, 0x49, 0x1a, 0xb9, 0x07, 0x8b, 0xac, 0x15, 0x87, 0x9d, 0x9e, - 0xe0, 0xce, 0x39, 0xf7, 0xce, 0xce, 0xc5, 0xfa, 0xe4, 0xa6, 0x75, 0xb7, 0x70, 0x30, 0x41, 0x8b, - 0x86, 0x71, 0x80, 0x74, 0x29, 0x1a, 0xf1, 0x0e, 0x13, 0xde, 0x65, 0x5f, 0x74, 0xca, 0x88, 0x1a, - 0x86, 0x16, 0xbd, 0x03, 0xb9, 0x76, 0x18, 0x9c, 0x3a, 0x82, 0x45, 0x67, 0x5c, 0xac, 0x4f, 0xa3, - 0x98, 0x45, 0x41, 0x12, 0x4f, 0x90, 0xb6, 0x53, 0x82, 0xa2, 0x39, 0x1d, 0xbf, 0xee, 0x7a, 0xd1, - 0xf3, 0x9d, 0x59, 0x98, 0x3e, 0xe5, 0x3c, 0xb6, 0x39, 0x94, 0xbf, 0xd7, 0x0b, 0x05, 0xff, 0x2e, - 0xea, 0x64, 0x80, 0x8d, 0x2a, 0x49, 0x60, 0x03, 0x73, 0x05, 0xcb, 0x69, 0x98, 0xb8, 0x1b, 0x06, - 0x31, 0x27, 0xff, 0x05, 0x37, 0x7c, 0x2f, 0xe0, 0x91, 0x73, 0xca, 0xb9, 0x13, 0x31, 0xc1, 0x9d, - 0x98, 0x09, 0xa7, 0xcb, 0x23, 0xe7, 0xe2, 0x4a, 0x63, 0x2e, 0xa3, 0xc0, 0x3e, 0xe7, 0x94, 0x09, - 0x7e, 0xcc, 0x44, 0x93, 0x47, 0x1f, 0x5f, 0x91, 0x37, 0x60, 0x71, 0xb0, 0x50, 0x84, 0x82, 0x75, - 0x10, 0x7f, 0x9a, 0x16, 0x8c, 0xf8, 0x89, 0x24, 0xda, 0x8f, 0xa0, 0x7c, 0xe8, 0xc5, 0xc6, 0x5b, - 0xb1, 0xd1, 0xef, 0x36, 0xe4, 0x58, 0x1b, 0x8d, 0x1b, 0x06, 0x9d, 0xe7, 0x88, 0x34, 0x4f, 0x41, - 0x91, 0x8e, 0x82, 0xce, 0x73, 0x7b, 0x0f, 0x96, 0xd3, 0xeb, 0xf4, 0x81, 0xdf, 0x86, 0x79, 0x6d, - 0x83, 0x78, 0xdd, 0xda, 0x9c, 0xba, 0x9b, 0x7b, 0x50, 0xba, 0xaf, 0x43, 0xe9, 0xbe, 0x51, 0xae, - 0x2f, 0x61, 0x7f, 0x08, 0xb3, 0x47, 0x3d, 0xd1, 0xed, 0x09, 0x72, 0x13, 0x16, 0xd0, 0x90, 0x52, - 0x3f, 0xad, 0xd8, 0x3c, 0x12, 0x8e, 0x99, 0x20, 0xeb, 0x30, 0xc7, 0x5c, 0x37, 0xe2, 0x71, 0x8c, - 0x4a, 0x2c, 0x50, 0xf3, 0x69, 0xff, 0xc4, 0x82, 0x82, 0xda, 0xe1, 0xfb, 0x9e, 0x38, 0xdf, 0xe7, - 0x3c, 0x29, 0x6b, 0xa5, 0x64, 0xbf, 0x81, 0x3b, 0xc8, 0x7d, 0x28, 0x8f, 0x32, 0xb4, 0x8c, 0xac, - 0xe9, 0x83, 0x09, 0xba, 0x78, 0x9a, 0xb6, 0x72, 0xdf, 0x7d, 0xbb, 0xb0, 0xaa, 0x4e, 0x11, 0xcb, - 0x63, 0xd4, 0xfd, 0x6e, 0xc7, 0x6b, 0x7b, 0x42, 0x1e, 0xe7, 0x1e, 0xcc, 0x85, 0x8a, 0xa3, 0xcd, - 0xb1, 0xd8, 0x37, 0x87, 0x5a, 0x41, 0x0d, 0xdf, 0xfe, 0x93, 0x05, 0xe5, 0xdd, 0x4e, 0x18, 0x67, - 0x63, 0x6d, 0x03, 0x40, 0xa5, 0xa6, 0x73, 0xc1, 0x95, 0x2b, 0xf2, 0x74, 0x41, 0x51, 0x3e, 0xe6, - 0xcf, 0xc9, 0xff, 0xc1, 0xa2, 0xda, 0xc1, 0xb9, 0xf2, 0xc4, 0xb9, 0xf4, 0x37, 0xaa, 0x96, 0x7b, - 0xb0, 0x9a, 0x41, 0xd2, 0x16, 0x3a, 0x98, 0xa0, 0x85, 0x30, 0x65, 0xb2, 0xff, 0x19, 0x9c, 0x71, - 0x0a, 0x57, 0xde, 0xce, 0xac, 0xcc, 0x6a, 0x75, 0x30, 0xd1, 0x3f, 0xf5, 0x4e, 0x19, 0x96, 0x4e, - 0x7b, 0x81, 0x1b, 0x3b, 0x2e, 0x8f, 0x85, 0x17, 0xe0, 0xed, 0x60, 0x3f, 0x84, 0xe5, 0xb4, 0x26, - 0x3a, 0x3a, 0x36, 0x00, 0xda, 0x92, 0xee, 0x88, 0x6b, 0xcf, 0x35, 0xaa, 0x20, 0xe5, 0xe4, 0xda, - 0x73, 0xed, 0x9f, 0x59, 0xb0, 0x2a, 0xa1, 0xdc, 0x88, 0x5d, 0x7d, 0x3b, 0x23, 0x24, 0xcc, 0x3c, - 0xf9, 0x6a, 0x33, 0x93, 0xb7, 0x5f, 0xe1, 0xe3, 0x21, 0x0f, 0xdb, 0x5f, 0xc0, 0xda, 0xd0, 0x89, - 0xb4, 0x32, 0x5b, 0x30, 0xa7, 0x03, 0x19, 0xcf, 0x33, 0x2a, 0xd2, 0x8d, 0x80, 0xbc, 0x2f, 0xae, - 0xf4, 0x36, 0x4a, 0xf7, 0x49, 0xd4, 0x20, 0x6f, 0x88, 0xa8, 0xfe, 0x8f, 0x2d, 0x58, 0xd9, 0xe3, - 0xdd, 0x30, 0x1e, 0xba, 0x3d, 0xbf, 0x46, 0xfb, 0x0d, 0x00, 0xe6, 0xe3, 0x65, 0x24, 0xb3, 0x47, - 0xe5, 0xf9, 0x82, 0xa2, 0xc8, 0xf4, 0xf9, 0x76, 0x1a, 0x9f, 0xc1, 0x6a, 0xf6, 0x10, 0xdf, 0x41, - 0xe1, 0x3b, 0x90, 0x77, 0xd5, 0x2e, 0x49, 0x7d, 0x73, 0x9a, 0x86, 0xea, 0xba, 0xb0, 0xb2, 0xd3, - 0xf3, 0xbb, 0x7a, 0xa9, 0xbc, 0xc0, 0xbe, 0x99, 0xb6, 0x63, 0xd4, 0x99, 0x1c, 0xad, 0xce, 0x3a, - 0xac, 0x66, 0x51, 0x94, 0x3a, 0xf6, 0x2f, 0x26, 0x61, 0x4e, 0x93, 0xbf, 0x0e, 0xf2, 0x3f, 0x60, - 0x5e, 0x86, 0x4f, 0xe8, 0x05, 0x42, 0x27, 0xd7, 0x52, 0x32, 0xbe, 0x9a, 0x92, 0x41, 0xfb, 0x22, - 0x64, 0x19, 0x66, 0x54, 0x55, 0x50, 0x26, 0x56, 0x1f, 0xe4, 0x2d, 0x58, 0x62, 0x97, 0xcc, 0xeb, - 0xb0, 0x56, 0x87, 0x3b, 0x2d, 0xd6, 0x61, 0x41, 0x9b, 0x63, 0x35, 0x9a, 0xa6, 0xa5, 0x3e, 0x63, - 0x47, 0xd1, 0xa5, 0x30, 0x56, 0x22, 0xcc, 0x27, 0x53, 0xe1, 0x66, 0xe4, 0x95, 0x45, 0x4b, 0x03, - 0x86, 0xae, 0x70, 0x6f, 0xc1, 0x4c, 0x2c, 0x98, 0xe0, 0xeb, 0xb3, 0x9b, 0xd6, 0xdd, 0xe2, 0x83, - 0x95, 0xac, 0x5b, 0x8e, 0x25, 0x93, 0x2a, 0x19, 0x79, 0xb5, 0x77, 0x98, 0xe0, 0xb1, 0x76, 0xcc, - 0x1c, 0xea, 0x0a, 0x8a, 0x84, 0x7e, 0x69, 0x03, 0x39, 0xee, 0xb5, 0x7c, 0x4f, 0x1c, 0x45, 0x2e, - 0x8f, 0x8c, 0x53, 0x36, 0x61, 0x8a, 0xc5, 0x17, 0xda, 0xf1, 0xf9, 0x01, 0x42, 0x7c, 0x71, 0x30, - 0x41, 0x25, 0x4b, 0x4a, 0xb4, 0xb4, 0xa7, 0x93, 0x12, 0x3b, 0x9e, 0x2b, 0x25, 0x5a, 0x9e, 0xbb, - 0xb3, 0x00, 0x73, 0x2e, 0x17, 0xcc, 0xeb, 0xc4, 0xf6, 0xcf, 0x2d, 0x28, 0xa7, 0x50, 0x74, 0x8c, - 0xbd, 0x0f, 0x05, 0x2f, 0xb8, 0x64, 0x1d, 0xcf, 0x75, 0x42, 0xc9, 0xd0, 0x80, 0x03, 0x95, 0xea, - 0x8a, 0x8b, 0xab, 0x0e, 0x26, 0x68, 0xde, 0x4b, 0x7c, 0x93, 0x07, 0xb0, 0xcc, 0xda, 0x6d, 0xde, - 0x15, 0x5c, 0x2f, 0x77, 0x82, 0x50, 0x5a, 0x19, 0xa3, 0xef, 0x60, 0x82, 0x12, 0xc3, 0x45, 0xf1, - 0x86, 0xe4, 0x25, 0x0f, 0xd5, 0x80, 0x25, 0x59, 0xd4, 0x90, 0xd9, 0x2f, 0x85, 0xeb, 0x30, 0x77, - 0xc9, 0xa3, 0x56, 0x18, 0x73, 0x5d, 0x06, 0xcd, 0x67, 0xb6, 0x48, 0x4e, 0x0e, 0x15, 0xc9, 0x4f, - 0x80, 0x24, 0xf7, 0xd3, 0x2a, 0x6e, 0xc2, 0x34, 0x8b, 0x2f, 0x4c, 0x3d, 0x48, 0x99, 0x92, 0x22, - 0x47, 0x4a, 0xb4, 0x3c, 0xd7, 0x5c, 0x65, 0x29, 0x53, 0x52, 0xe4, 0xd8, 0x0f, 0x81, 0xec, 0xca, - 0x38, 0xe9, 0xa4, 0x7c, 0x74, 0x1b, 0x72, 0x49, 0xad, 0x55, 0x18, 0x43, 0xd8, 0xd7, 0xd5, 0x5e, - 0x81, 0x72, 0x6a, 0x99, 0xce, 0x84, 0xbf, 0x4f, 0xc1, 0x8c, 0x32, 0xe0, 0xd7, 0x5f, 0x34, 0x98, - 0x76, 0xa7, 0xde, 0x35, 0x57, 0x9e, 0x2e, 0xd0, 0x05, 0x49, 0xd9, 0x97, 0x04, 0x52, 0x82, 0x29, - 0xe6, 0x0b, 0x1d, 0xf5, 0xf2, 0x27, 0xf9, 0x00, 0x36, 0x7c, 0x76, 0xed, 0xb4, 0x98, 0x68, 0x9f, - 0x8f, 0xec, 0x61, 0x54, 0xfc, 0xaf, 0xf9, 0xec, 0x7a, 0x47, 0xca, 0x64, 0xdb, 0x98, 0x8c, 0x46, - 0x33, 0x59, 0x8d, 0xc8, 0xbd, 0x74, 0xe8, 0x97, 0x07, 0x69, 0x29, 0x65, 0x52, 0x81, 0xbf, 0x0c, - 0x33, 0xbd, 0xc0, 0x13, 0x31, 0x86, 0x7c, 0x81, 0xaa, 0x0f, 0x99, 0x68, 0xf8, 0xc3, 0xe9, 0x05, - 0xa7, 0xbd, 0xce, 0xa9, 0xd7, 0xe9, 0x70, 0x77, 0x7d, 0x5e, 0x25, 0x1a, 0x32, 0x9e, 0x0e, 0xe8, - 0xe4, 0x6d, 0x20, 0x11, 0x8f, 0x79, 0x74, 0xc9, 0x5d, 0x67, 0xd0, 0xae, 0x2c, 0xa8, 0x1c, 0x36, - 0x9c, 0x67, 0xa6, 0x6d, 0x79, 0x00, 0x2b, 0xed, 0x88, 0xab, 0x0c, 0x16, 0x9e, 0xcf, 0x63, 0xc1, - 0xfc, 0xae, 0x13, 0xc4, 0xeb, 0x80, 0x0b, 0xca, 0x86, 0x79, 0x62, 0x78, 0x0d, 0x79, 0x9c, 0x59, - 0x7e, 0xc9, 0x65, 0xf7, 0x94, 0x43, 0xe7, 0x67, 0x14, 0xaa, 0x49, 0x1e, 0xd5, 0x22, 0xba, 0xc9, - 0x73, 0xd4, 0xf9, 0x7d, 0x69, 0xbf, 0xf5, 0x3c, 0x9e, 0x5c, 0x36, 0x79, 0x4f, 0x25, 0xf5, 0x89, - 0x24, 0xda, 0xbf, 0xb5, 0x60, 0x6a, 0xc7, 0x73, 0xc9, 0xdd, 0x7e, 0xa8, 0xeb, 0xb4, 0x2a, 0xa6, - 0x77, 0xa7, 0x86, 0x2d, 0x8f, 0xde, 0xe1, 0x2c, 0xe6, 0x8e, 0xdb, 0xd3, 0x57, 0x50, 0xab, 0x13, - 0xb6, 0x2f, 0x62, 0xed, 0xf3, 0x32, 0x32, 0xf7, 0x34, 0x6f, 0x07, 0x59, 0x3a, 0x51, 0x62, 0x2f, - 0x0c, 0x54, 0x2b, 0x4e, 0xcd, 0x27, 0x79, 0x08, 0xf2, 0x40, 0x4e, 0x10, 0xba, 0xdc, 0x11, 0x1e, - 0x8f, 0xd0, 0xeb, 0xc5, 0xc4, 0x1d, 0xda, 0x08, 0x5d, 0x7e, 0xe2, 0xf1, 0x88, 0xe6, 0x7c, 0x2f, - 0x30, 0x1f, 0xf6, 0x4b, 0x98, 0xaa, 0xc6, 0x17, 0xff, 0xaa, 0x53, 0xdb, 0x7f, 0xb4, 0x00, 0x06, - 0x46, 0x97, 0x15, 0x2d, 0xe5, 0x44, 0x79, 0x96, 0x29, 0x9a, 0x13, 0x09, 0xe7, 0xdd, 0x84, 0x05, - 0xf4, 0x8c, 0x13, 0x8b, 0x48, 0x77, 0xaa, 0xf3, 0x48, 0x38, 0x16, 0x11, 0x79, 0x0c, 0x79, 0x8c, - 0x43, 0xa7, 0x7d, 0xce, 0x82, 0x33, 0xae, 0x5b, 0xad, 0xc1, 0xc5, 0xf6, 0xb4, 0xeb, 0x32, 0xc1, - 0x5d, 0x04, 0x3b, 0x98, 0xa0, 0x39, 0x14, 0xde, 0x45, 0x59, 0xb2, 0x0d, 0x73, 0xe8, 0x5e, 0xee, - 0xa2, 0xe9, 0x92, 0x61, 0x81, 0x1e, 0x36, 0x8b, 0x8c, 0xd4, 0xce, 0x1c, 0xcc, 0x20, 0xb0, 0xfd, - 0x6b, 0x0b, 0xf2, 0xc9, 0x9d, 0xc9, 0x63, 0x28, 0x76, 0x23, 0x7e, 0xe9, 0x85, 0xbd, 0xd8, 0x51, - 0x99, 0x63, 0x8d, 0xcf, 0x9c, 0x82, 0x11, 0xc5, 0x4f, 0xf2, 0x0e, 0x2c, 0x04, 0xfc, 0x4a, 0x2f, - 0x9b, 0x1c, 0xbf, 0x6c, 0x3e, 0xe0, 0x57, 0x6a, 0xc5, 0x1d, 0xc8, 0xab, 0xe8, 0xd4, 0x89, 0xa5, - 0x4c, 0x9c, 0x43, 0xda, 0x3e, 0x92, 0xec, 0x3f, 0x5b, 0x00, 0x03, 0x25, 0xc8, 0x7b, 0x90, 0x43, - 0x25, 0xc6, 0x1c, 0x0e, 0x25, 0x15, 0x0a, 0xf8, 0xfd, 0xdf, 0x43, 0x38, 0x93, 0x43, 0x38, 0xb2, - 0x05, 0xd3, 0xd6, 0xd1, 0x95, 0x65, 0x4a, 0xb5, 0x60, 0x9a, 0xa8, 0xee, 0xbf, 0x0f, 0xa1, 0x10, - 0xf1, 0x2f, 0x78, 0x5b, 0x38, 0x11, 0x67, 0x71, 0x18, 0xe8, 0x48, 0xad, 0xa4, 0xf1, 0x29, 0x8a, - 0x50, 0x94, 0xa0, 0xf9, 0x28, 0xf1, 0x25, 0xdb, 0x0d, 0xca, 0xdb, 0xe1, 0x25, 0x8f, 0x32, 0x4f, - 0x2a, 0xfb, 0x08, 0xd6, 0x86, 0x38, 0xba, 0x22, 0xbc, 0x07, 0xab, 0x41, 0xcf, 0x77, 0x22, 0xc5, - 0xe6, 0xae, 0x93, 0x78, 0x42, 0x49, 0x3d, 0x96, 0x83, 0x9e, 0x4f, 0x0d, 0xd3, 0xac, 0xb6, 0xcb, - 0xb0, 0x54, 0x55, 0xaf, 0xef, 0x41, 0xef, 0x64, 0x37, 0x81, 0x24, 0x89, 0x1a, 0xe0, 0x31, 0x14, - 0xf8, 0x35, 0x6f, 0xf7, 0x30, 0x27, 0xe4, 0x0b, 0x21, 0x5b, 0x55, 0x6b, 0x86, 0x2b, 0x57, 0xe5, - 0x79, 0xe2, 0xcb, 0xfe, 0xeb, 0x34, 0xcc, 0x1c, 0xca, 0xc4, 0x21, 0x8f, 0xa0, 0x20, 0x63, 0x37, - 0xe0, 0x1d, 0x47, 0xb5, 0x42, 0xd6, 0xb8, 0x56, 0x28, 0xaf, 0xe5, 0xf0, 0x4b, 0x5e, 0x53, 0x66, - 0x1d, 0xf3, 0x93, 0x3d, 0xaa, 0xd9, 0xae, 0xea, 0x63, 0x9f, 0xfa, 0x08, 0xd6, 0x8c, 0x5c, 0x36, - 0x81, 0x55, 0xdc, 0xac, 0x68, 0x76, 0x26, 0x85, 0xdf, 0x81, 0x65, 0xb3, 0x4e, 0xa5, 0xbf, 0x7a, - 0xc3, 0xab, 0x97, 0x3e, 0x25, 0x9a, 0x87, 0x3a, 0xd4, 0x90, 0x23, 0xcb, 0x4a, 0x37, 0xe2, 0xbe, - 0xd7, 0xf3, 0xf1, 0x34, 0x33, 0x78, 0x1a, 0xd0, 0x24, 0x79, 0x94, 0x2d, 0xd9, 0x7e, 0x25, 0x0c, - 0x86, 0x62, 0xb3, 0xaa, 0xc3, 0x4c, 0x5a, 0x47, 0xca, 0xda, 0x68, 0x16, 0x6f, 0x20, 0x37, 0x87, - 0x72, 0x39, 0x24, 0x6a, 0x99, 0xfb, 0x50, 0x6e, 0x77, 0x38, 0x8b, 0xbc, 0xe0, 0x4c, 0x95, 0xc0, - 0x6e, 0xe4, 0xb5, 0x39, 0xd6, 0x99, 0x69, 0xba, 0x64, 0x58, 0xb2, 0xf4, 0x35, 0x25, 0x83, 0xdc, - 0x85, 0x92, 0xaa, 0x7b, 0x58, 0x69, 0x71, 0x89, 0x2e, 0x33, 0x45, 0xa4, 0x63, 0xbd, 0xa5, 0xba, - 0x9d, 0x4b, 0x56, 0x48, 0x18, 0xaa, 0x90, 0xb7, 0x60, 0xa1, 0xdb, 0x8b, 0xda, 0xe7, 0x2c, 0xe6, - 0xee, 0x7a, 0x0e, 0x7b, 0x94, 0x01, 0x81, 0x3c, 0x1c, 0xd8, 0x3c, 0xe2, 0x7e, 0x28, 0xb8, 0xba, - 0xa5, 0x65, 0xf5, 0xcf, 0xe3, 0x56, 0xc6, 0xb4, 0x14, 0xb9, 0xf2, 0x6e, 0x96, 0x8d, 0xc0, 0xff, - 0xc2, 0x92, 0x59, 0x36, 0xb8, 0xd5, 0x0b, 0xe3, 0x6e, 0x75, 0xe3, 0xfe, 0xfe, 0xcd, 0x7e, 0x00, - 0x05, 0x74, 0x47, 0xbf, 0xc9, 0xba, 0x09, 0x0b, 0xaa, 0x47, 0x90, 0x6d, 0x8f, 0x6c, 0x8c, 0xf2, - 0x74, 0x1e, 0x09, 0x75, 0x37, 0x26, 0x95, 0xc4, 0x4c, 0x61, 0x52, 0xf1, 0xfa, 0x13, 0x84, 0x5f, - 0x5a, 0x50, 0x34, 0x5b, 0xe9, 0x60, 0x7f, 0x03, 0x66, 0x31, 0x0c, 0x4c, 0x87, 0x35, 0x28, 0x17, - 0x28, 0x48, 0x35, 0x97, 0x6c, 0xc3, 0x32, 0x0e, 0x46, 0x30, 0x28, 0x39, 0x8b, 0x02, 0xee, 0x26, - 0x62, 0x73, 0x09, 0x79, 0x55, 0x5f, 0xd4, 0x90, 0x23, 0x9d, 0xf8, 0x16, 0x90, 0xc1, 0x82, 0x2e, - 0xf3, 0x94, 0xb8, 0x7e, 0x46, 0x19, 0xf1, 0x26, 0xf3, 0xa4, 0xb0, 0xbd, 0x08, 0x85, 0x93, 0xf0, - 0x82, 0x07, 0xfd, 0xfc, 0x7f, 0x1f, 0x8a, 0x86, 0xd0, 0x7f, 0x4f, 0xcd, 0x0a, 0xa4, 0xe8, 0x83, - 0x92, 0xc1, 0x41, 0x63, 0x26, 0x50, 0x98, 0x6a, 0x09, 0xfb, 0xf7, 0x93, 0xb0, 0xd0, 0xa7, 0xca, - 0xbb, 0xac, 0x25, 0x03, 0xdd, 0x67, 0x6d, 0x16, 0x85, 0x61, 0xa0, 0x3b, 0xb5, 0xbc, 0x24, 0x3e, - 0xd1, 0x34, 0x79, 0x27, 0x76, 0xd9, 0x73, 0x5f, 0xd6, 0xa3, 0x73, 0x16, 0x9f, 0x9b, 0x27, 0x98, - 0xa6, 0x1d, 0xb0, 0xf8, 0x9c, 0xdc, 0x83, 0x92, 0x11, 0xe9, 0x46, 0xdc, 0xf3, 0x99, 0xae, 0x4b, - 0x79, 0xba, 0xa8, 0xe9, 0x4d, 0x4d, 0x96, 0x11, 0xa9, 0xdf, 0x98, 0xa8, 0xb9, 0x2f, 0x55, 0x9f, - 0xc6, 0x12, 0x58, 0x54, 0x74, 0xa9, 0xf8, 0x93, 0x98, 0x09, 0xf2, 0x2e, 0xac, 0x44, 0x61, 0x4f, - 0xc8, 0x50, 0x97, 0x19, 0x31, 0x10, 0x9f, 0x41, 0x71, 0xa2, 0x99, 0xfb, 0x9c, 0xf7, 0x97, 0xe8, - 0xda, 0xea, 0x60, 0x47, 0xc4, 0x5d, 0xcc, 0x34, 0x5d, 0x5b, 0x77, 0x15, 0x49, 0xd6, 0x69, 0x4c, - 0x6b, 0xae, 0x9e, 0x2c, 0xf3, 0xd4, 0x7c, 0xca, 0xc5, 0xb1, 0x08, 0x23, 0x76, 0xc6, 0x9d, 0x80, - 0xf9, 0x2a, 0xa9, 0x16, 0x64, 0xfd, 0x44, 0x5a, 0x83, 0xf9, 0xdc, 0x5e, 0x85, 0xe5, 0xc3, 0x64, - 0xed, 0x37, 0x3e, 0xf9, 0x9d, 0x05, 0x2b, 0x19, 0x86, 0xf6, 0xcd, 0xe7, 0xb0, 0x98, 0x6e, 0x25, - 0x8c, 0x93, 0x1e, 0xa4, 0xa3, 0x29, 0xbb, 0x30, 0x4d, 0x8d, 0x6b, 0x81, 0x88, 0x9e, 0xd3, 0x62, - 0xaa, 0xf1, 0x88, 0x2b, 0x55, 0x28, 0x8f, 0x10, 0x93, 0xed, 0xb3, 0xe9, 0xba, 0x0b, 0x54, 0xfe, - 0x1c, 0x3c, 0x24, 0xd5, 0xdb, 0x42, 0x7d, 0x3c, 0x9e, 0xfc, 0x6f, 0x4b, 0x6a, 0xd4, 0xe0, 0xd7, - 0x02, 0x9b, 0xe6, 0x7a, 0x70, 0x1a, 0x1a, 0x8d, 0x7e, 0x6a, 0xc1, 0x4a, 0x86, 0xa1, 0x35, 0xba, - 0x9d, 0x1e, 0x7f, 0xa9, 0xb7, 0x64, 0x72, 0xf8, 0x35, 0xe6, 0x5d, 0x3d, 0x3b, 0xf2, 0x5d, 0x4d, - 0xde, 0x84, 0x45, 0xbc, 0xb6, 0x06, 0x9d, 0xad, 0xbe, 0xf7, 0x8a, 0x48, 0xee, 0xf7, 0xb4, 0xf6, - 0x23, 0x58, 0x92, 0x79, 0x4f, 0x99, 0x74, 0xba, 0xc9, 0xf7, 0x3b, 0x90, 0xc7, 0x7b, 0xa3, 0xdb, - 0x6b, 0x5d, 0xf0, 0xe7, 0x26, 0xe5, 0x73, 0x92, 0xd6, 0x54, 0x24, 0xfb, 0x10, 0x48, 0x72, 0x9d, - 0xd6, 0xe2, 0x91, 0x5e, 0x18, 0x21, 0xd9, 0x38, 0xa5, 0x9c, 0xba, 0x73, 0xf4, 0x12, 0xdc, 0x4d, - 0xfd, 0x8e, 0xb7, 0xbe, 0xb2, 0x20, 0x9f, 0x7c, 0x0d, 0x93, 0x12, 0xe4, 0x9b, 0xb5, 0xc6, 0x5e, - 0xbd, 0xf1, 0x91, 0x73, 0xd4, 0xac, 0x35, 0x4a, 0x13, 0x84, 0x40, 0xd1, 0x50, 0x9e, 0x36, 0xf7, - 0xaa, 0x27, 0xb5, 0x92, 0x45, 0xe6, 0x61, 0x1a, 0xb9, 0x93, 0x24, 0x07, 0x73, 0xb5, 0x4f, 0x9a, - 0x75, 0x5a, 0xdb, 0x2b, 0x4d, 0x25, 0x45, 0x77, 0x0f, 0x8f, 0x8e, 0x6b, 0x7b, 0xa5, 0x69, 0x02, - 0x30, 0xab, 0x7f, 0xcf, 0x90, 0x32, 0x2c, 0xd2, 0xda, 0xee, 0xd1, 0xb3, 0x1a, 0xfd, 0xd4, 0xd9, - 0xaf, 0xd6, 0x0f, 0x6b, 0x7b, 0xa5, 0x59, 0xb2, 0x04, 0x05, 0xb3, 0x68, 0xa7, 0x7a, 0xb2, 0x7b, - 0x50, 0x9a, 0xdb, 0x6a, 0xea, 0xd6, 0x47, 0x1d, 0x29, 0x07, 0x73, 0x4d, 0x5a, 0x6b, 0x56, 0x69, - 0xad, 0x34, 0x41, 0xf2, 0x30, 0x5f, 0xdd, 0xdd, 0xad, 0x35, 0x4f, 0x6a, 0x7b, 0x25, 0x4b, 0x7e, - 0xd1, 0xda, 0xff, 0xd7, 0x76, 0xe5, 0xd7, 0xa4, 0x84, 0x3a, 0xae, 0x7f, 0xd4, 0xc0, 0xa3, 0x14, - 0x60, 0x61, 0xbf, 0xde, 0xa8, 0x1e, 0xd6, 0x3f, 0x93, 0xa7, 0xd8, 0xfa, 0x83, 0x05, 0x4b, 0x43, - 0x3d, 0x8a, 0x54, 0xa3, 0x71, 0xd4, 0x90, 0xdb, 0xae, 0x02, 0x39, 0xae, 0xd1, 0x67, 0x35, 0xea, - 0x3c, 0xa9, 0x1f, 0xef, 0xd4, 0x0e, 0xaa, 0xcf, 0xea, 0x47, 0xb4, 0x64, 0x91, 0x0a, 0xac, 0xe2, - 0xa1, 0x9c, 0x67, 0x35, 0x7a, 0x5c, 0x3f, 0x6a, 0x48, 0xf6, 0x13, 0x3c, 0xe5, 0x24, 0xd9, 0x80, - 0x1b, 0xcd, 0x2a, 0x3d, 0xa9, 0x57, 0x0f, 0x1d, 0x75, 0x08, 0x67, 0xf7, 0xe8, 0xf0, 0xb0, 0x7a, - 0x52, 0xa3, 0xd5, 0xc3, 0xd2, 0x14, 0xb9, 0x03, 0x1b, 0x19, 0xf6, 0xde, 0xd3, 0xe6, 0x61, 0x7d, - 0xb7, 0x7a, 0x52, 0x73, 0x9a, 0xb5, 0x1a, 0x2d, 0x4d, 0x93, 0x7b, 0xf0, 0x7a, 0x76, 0x87, 0x83, - 0x6a, 0xa3, 0x51, 0x3b, 0x74, 0xf6, 0x9f, 0x2a, 0x8b, 0x68, 0x2b, 0xcd, 0x3c, 0xf8, 0x4d, 0x09, - 0x66, 0x4f, 0xf0, 0xc1, 0x49, 0x42, 0xc8, 0x27, 0x87, 0xe2, 0xe4, 0x56, 0xdf, 0xcb, 0x23, 0x46, - 0xf2, 0x95, 0x8d, 0x31, 0x5c, 0xfd, 0xc6, 0xb5, 0x7f, 0xf4, 0xb7, 0x7f, 0x7c, 0x35, 0x79, 0xcb, - 0x5e, 0xdb, 0xbe, 0x7c, 0x77, 0x5b, 0x4a, 0x6e, 0x9b, 0x1a, 0xb2, 0xfd, 0xa5, 0x94, 0x7f, 0x6c, - 0x6d, 0x91, 0xcf, 0x20, 0x97, 0xf8, 0xd3, 0x05, 0xb9, 0x99, 0x18, 0x3a, 0x64, 0x47, 0x72, 0x95, - 0xa1, 0xd9, 0x97, 0x7d, 0x0b, 0x11, 0x56, 0xed, 0xa5, 0x21, 0x04, 0xb9, 0xf7, 0x29, 0xe4, 0x93, - 0x03, 0xf3, 0x84, 0x32, 0x23, 0xe6, 0xef, 0x09, 0x65, 0x46, 0x4d, 0xd9, 0xed, 0x1b, 0x08, 0x55, - 0x26, 0xc3, 0x50, 0x12, 0x27, 0x39, 0x7a, 0x4d, 0xe0, 0x8c, 0x98, 0x2d, 0x27, 0x70, 0x46, 0xcd, - 0x6b, 0x0d, 0xce, 0xd6, 0x08, 0x9c, 0x17, 0xb0, 0x98, 0x19, 0x8c, 0x92, 0xc1, 0xd8, 0x78, 0xf4, - 0x10, 0xb7, 0xb2, 0x39, 0x5e, 0x40, 0x03, 0xbe, 0x8e, 0x80, 0xb7, 0xed, 0xca, 0xb0, 0x97, 0xcc, - 0xa8, 0x54, 0x1a, 0xf3, 0x0a, 0x8a, 0xe9, 0x19, 0x25, 0x79, 0xad, 0xbf, 0xf5, 0xc8, 0x09, 0x6a, - 0xe5, 0xf6, 0x58, 0xbe, 0x46, 0xfe, 0x77, 0x44, 0x7e, 0xcd, 0xbe, 0x31, 0x8c, 0xac, 0x87, 0x96, - 0x12, 0x58, 0x40, 0x31, 0x3d, 0x4d, 0x4c, 0x00, 0x8f, 0x1c, 0x66, 0x26, 0x80, 0xc7, 0x8c, 0x21, - 0xef, 0x20, 0xf0, 0x4d, 0x7b, 0x75, 0x18, 0xb8, 0xd5, 0xf3, 0xbb, 0x12, 0xf5, 0x87, 0xb0, 0x98, - 0x79, 0x3a, 0x24, 0x6c, 0x3d, 0xfa, 0xb9, 0x91, 0xb0, 0xf5, 0x98, 0x57, 0xc7, 0xab, 0x34, 0xd6, - 0x2f, 0x11, 0x89, 0xed, 0x42, 0x2e, 0x31, 0xa7, 0x4b, 0xe4, 0xc4, 0xf0, 0x8c, 0xb0, 0x72, 0x6b, - 0x34, 0x53, 0xe3, 0x55, 0x10, 0x6f, 0xd9, 0x5e, 0xec, 0xe3, 0x61, 0x97, 0x8a, 0xd9, 0xf1, 0x03, - 0x80, 0xc1, 0xa4, 0x8c, 0x54, 0x52, 0xd1, 0x9f, 0x1a, 0xc7, 0x55, 0x6e, 0x8e, 0xe4, 0x69, 0x88, - 0x35, 0x84, 0x58, 0x22, 0x59, 0x08, 0x12, 0x42, 0x2e, 0x31, 0xf8, 0x4a, 0x68, 0x31, 0x3c, 0x45, - 0x4b, 0x68, 0x31, 0x6a, 0x56, 0xa6, 0x23, 0x74, 0x6b, 0x23, 0x03, 0xb1, 0xfd, 0x22, 0xd1, 0x86, - 0xbf, 0x24, 0x9f, 0x03, 0x0c, 0xde, 0x61, 0x09, 0x85, 0x86, 0x5e, 0x6c, 0x09, 0x85, 0x86, 0x1f, - 0x6e, 0xf6, 0x32, 0xa2, 0x15, 0x49, 0xbe, 0x8f, 0x76, 0xca, 0x39, 0xf9, 0x52, 0xf7, 0xbc, 0xfd, - 0xfe, 0x81, 0x6c, 0x8c, 0xeb, 0x4a, 0x14, 0xc6, 0x6b, 0xaf, 0x6e, 0x5a, 0xec, 0x4d, 0x84, 0xa9, - 0x90, 0xf5, 0x3e, 0x4c, 0xa6, 0xf9, 0x21, 0x17, 0x50, 0x48, 0xb5, 0x15, 0x09, 0xc4, 0x51, 0x7d, - 0x48, 0x02, 0x71, 0x64, 0x37, 0x62, 0xdf, 0x44, 0xc4, 0x15, 0x52, 0xee, 0x23, 0x62, 0xbb, 0xbf, - 0x1d, 0xf0, 0x6b, 0x41, 0x42, 0x28, 0xe0, 0x8a, 0xe3, 0x80, 0x75, 0xe3, 0xf3, 0x50, 0x24, 0xc0, - 0x52, 0xf4, 0x61, 0xb0, 0x0c, 0x5b, 0x83, 0xdd, 0x46, 0xb0, 0x1b, 0x64, 0x2d, 0x03, 0x16, 0x9b, - 0xfd, 0x3f, 0x85, 0xc2, 0x47, 0x5c, 0xf4, 0xfb, 0xeb, 0x98, 0x0c, 0xfe, 0x76, 0x96, 0x6a, 0xe2, - 0x2b, 0x6b, 0x43, 0xf4, 0x51, 0x91, 0xd7, 0x89, 0x99, 0xd8, 0x56, 0x8d, 0x3b, 0xa1, 0x30, 0xab, - 0xde, 0x27, 0x89, 0x3d, 0x53, 0x6f, 0x9f, 0xc4, 0x9e, 0xe9, 0x87, 0xcc, 0x88, 0x68, 0xd6, 0x2f, - 0x17, 0x0e, 0xb9, 0x41, 0x9f, 0x93, 0x4c, 0x97, 0xa1, 0x46, 0x2b, 0x11, 0x5d, 0xc3, 0xcd, 0x94, - 0xbd, 0x81, 0x00, 0x6b, 0x64, 0xa5, 0x0f, 0x90, 0xec, 0xad, 0xc8, 0xaf, 0x2c, 0x28, 0xa6, 0x0c, - 0x1a, 0x93, 0x31, 0x96, 0x8e, 0x47, 0xdc, 0x76, 0x19, 0xbe, 0x86, 0xdc, 0x43, 0xc8, 0x0f, 0xc8, - 0xfb, 0x63, 0x5c, 0x11, 0x6f, 0xbf, 0x88, 0x05, 0x8b, 0x84, 0x63, 0x9e, 0x83, 0x2f, 0xb7, 0x5f, - 0x04, 0x3d, 0x5f, 0x7d, 0xf2, 0xd8, 0x69, 0xb1, 0xf6, 0xc5, 0xcb, 0x9d, 0x37, 0x3f, 0x7b, 0xfd, - 0xcc, 0x13, 0xe7, 0xbd, 0xd6, 0xfd, 0x76, 0xe8, 0x6f, 0x77, 0xbc, 0xb3, 0x73, 0x11, 0x78, 0xc1, - 0x59, 0x87, 0xb5, 0x62, 0xb5, 0xa9, 0x3e, 0x45, 0x6b, 0x16, 0xff, 0x29, 0xe1, 0x3f, 0xff, 0x19, - 0x00, 0x00, 0xff, 0xff, 0x2f, 0x44, 0xde, 0x60, 0xdd, 0x20, 0x00, 0x00, + // 3184 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0xcb, 0x73, 0x23, 0xc7, + 0x79, 0x27, 0xc0, 0xf7, 0x87, 0x07, 0xc1, 0x06, 0x5f, 0x8b, 0x5d, 0x6a, 0xb9, 0x93, 0x48, 0xda, + 0xa5, 0x94, 0xa5, 0xc4, 0x68, 0x37, 0xaa, 0x8d, 0x22, 0x05, 0x20, 0x41, 0x11, 0x11, 0x17, 0x44, + 0x9a, 0xdc, 0x8d, 0xa4, 0x54, 0x65, 0xaa, 0x81, 0x69, 0x92, 0x23, 0x02, 0x33, 0xd0, 0x4c, 0x83, + 0xe4, 0x66, 0x6b, 0x2f, 0x49, 0xee, 0x71, 0x49, 0x65, 0xfb, 0xe8, 0x2a, 0xff, 0x0d, 0xbe, 0xb9, + 0xca, 0x07, 0x9f, 0x5c, 0x65, 0x5f, 0x5c, 0x3e, 0xfb, 0xe6, 0x3f, 0xc4, 0xd5, 0x5f, 0x77, 0x63, + 0x1e, 0x00, 0x56, 0x8f, 0x8b, 0x6f, 0x9c, 0xef, 0xfb, 0xba, 0x7f, 0xfd, 0x3d, 0xba, 0xbf, 0x07, + 0x08, 0x79, 0x11, 0x30, 0x87, 0x07, 0x0f, 0xfb, 0x81, 0x2f, 0x7c, 0x32, 0xdf, 0xf7, 0xfd, 0x6e, + 0xd0, 0xef, 0x54, 0xee, 0x9c, 0xfb, 0xfe, 0x79, 0x97, 0xef, 0xb0, 0xbe, 0xbb, 0xc3, 0x3c, 0xcf, + 0x17, 0x4c, 0xb8, 0xbe, 0x17, 0x2a, 0xb1, 0x4a, 0x89, 0x0d, 0x3a, 0xf2, 0x9b, 0x9b, 0x85, 0xd6, + 0x1f, 0x32, 0x40, 0x1a, 0x9e, 0x2b, 0xaa, 0x9d, 0x8e, 0x3f, 0xf0, 0x04, 0xe5, 0x5f, 0x0f, 0x78, + 0x28, 0xc8, 0xdf, 0x41, 0x81, 0x29, 0x8a, 0x7d, 0xc5, 0xba, 0x03, 0xbe, 0x91, 0xd9, 0xca, 0xdc, + 0x9f, 0xa1, 0x79, 0x4d, 0x7c, 0x2e, 0x69, 0xe4, 0x01, 0x2c, 0xb1, 0x76, 0xe8, 0x77, 0x07, 0x82, + 0xdb, 0x17, 0xdc, 0x3d, 0xbf, 0x10, 0x1b, 0xd9, 0xad, 0xcc, 0xfd, 0xc2, 0xe1, 0x14, 0x2d, 0x1a, + 0xc6, 0x21, 0xd2, 0xa5, 0x68, 0xc0, 0xbb, 0x4c, 0xb8, 0x57, 0x43, 0xd1, 0x69, 0x23, 0x6a, 0x18, + 0x5a, 0xf4, 0x1e, 0xe4, 0x3a, 0xbe, 0x77, 0x66, 0x0b, 0x16, 0x9c, 0x73, 0xb1, 0x31, 0x83, 0x62, + 0x19, 0x0a, 0x92, 0x78, 0x8a, 0xb4, 0x5a, 0x09, 0x8a, 0xe6, 0x74, 0xfc, 0xa6, 0xef, 0x06, 0x2f, + 0x6a, 0x73, 0x30, 0x73, 0xc6, 0x79, 0x68, 0x71, 0x28, 0xff, 0xfb, 0xc0, 0x17, 0xfc, 0xc7, 0xa8, + 0x93, 0x02, 0x36, 0xaa, 0xc4, 0x81, 0x0d, 0xcc, 0x35, 0xac, 0x24, 0x61, 0xc2, 0xbe, 0xef, 0x85, + 0x9c, 0xfc, 0x13, 0xdc, 0xea, 0xb9, 0x1e, 0x0f, 0xec, 0x33, 0xce, 0xed, 0x80, 0x09, 0x6e, 0x87, + 0x4c, 0xd8, 0x7d, 0x1e, 0xd8, 0x97, 0xd7, 0x1a, 0x73, 0x05, 0x05, 0x0e, 0x38, 0xa7, 0x4c, 0xf0, + 0x13, 0x26, 0x5a, 0x3c, 0xf8, 0xec, 0x9a, 0xbc, 0x05, 0x4b, 0xd1, 0x42, 0xe1, 0x0b, 0xd6, 0x45, + 0xfc, 0x19, 0x5a, 0x30, 0xe2, 0xa7, 0x92, 0x68, 0x3d, 0x86, 0xf2, 0x91, 0x1b, 0x1a, 0x6f, 0x85, + 0x46, 0xbf, 0xbb, 0x90, 0x63, 0x1d, 0x34, 0xae, 0xef, 0x75, 0x5f, 0x20, 0xd2, 0x02, 0x05, 0x45, + 0x3a, 0xf6, 0xba, 0x2f, 0xac, 0x7d, 0x58, 0x49, 0xae, 0xd3, 0x07, 0x7e, 0x17, 0x16, 0xb4, 0x0d, + 0xc2, 0x8d, 0xcc, 0xd6, 0xf4, 0xfd, 0xdc, 0x6e, 0xe9, 0xa1, 0x0e, 0xa5, 0x87, 0x46, 0xb9, 0xa1, + 0x84, 0xf5, 0x09, 0xcc, 0x1d, 0x0f, 0x44, 0x7f, 0x20, 0xc8, 0x6d, 0x58, 0x44, 0x43, 0x4a, 0xfd, + 0xb4, 0x62, 0x0b, 0x48, 0x38, 0x61, 0x82, 0x6c, 0xc0, 0x3c, 0x73, 0x9c, 0x80, 0x87, 0x21, 0x2a, + 0xb1, 0x48, 0xcd, 0xa7, 0xf5, 0x7f, 0x19, 0x28, 0xa8, 0x1d, 0xfe, 0xc3, 0x15, 0x17, 0x07, 0x9c, + 0xc7, 0x65, 0x33, 0x09, 0xd9, 0xef, 0xe1, 0x0e, 0xf2, 0x10, 0xca, 0xe3, 0x0c, 0x2d, 0x23, 0x6b, + 0xe6, 0x70, 0x8a, 0x2e, 0x9d, 0x25, 0xad, 0x3c, 0x74, 0xdf, 0x1e, 0xac, 0xa9, 0x53, 0x84, 0xf2, + 0x18, 0x8d, 0x5e, 0xbf, 0xeb, 0x76, 0x5c, 0x21, 0x8f, 0xf3, 0x00, 0xe6, 0x7d, 0xc5, 0xd1, 0xe6, + 0x58, 0x1a, 0x9a, 0x43, 0xad, 0xa0, 0x86, 0x6f, 0xfd, 0x2e, 0x03, 0xe5, 0xbd, 0xae, 0x1f, 0xa6, + 0x63, 0x6d, 0x13, 0x40, 0x5d, 0x4d, 0xfb, 0x92, 0x2b, 0x57, 0xe4, 0xe9, 0xa2, 0xa2, 0x7c, 0xc6, + 0x5f, 0x90, 0x7f, 0x85, 0x25, 0xb5, 0x83, 0x7d, 0xed, 0x8a, 0x0b, 0xe9, 0x6f, 0x54, 0x2d, 0xb7, + 0xbb, 0x96, 0x42, 0xd2, 0x16, 0x3a, 0x9c, 0xa2, 0x05, 0x3f, 0x61, 0xb2, 0x7f, 0x8e, 0xce, 0x38, + 0x8d, 0x2b, 0xef, 0xa6, 0x56, 0xa6, 0xb5, 0x3a, 0x9c, 0x1a, 0x9e, 0xba, 0x56, 0x86, 0xe5, 0xb3, + 0x81, 0xe7, 0x84, 0xb6, 0xc3, 0x43, 0xe1, 0x7a, 0xf8, 0x3a, 0x58, 0x8f, 0x60, 0x25, 0xa9, 0x89, + 0x8e, 0x8e, 0x4d, 0x80, 0x8e, 0xa4, 0xdb, 0xe2, 0xc6, 0x75, 0x8c, 0x2a, 0x48, 0x39, 0xbd, 0x71, + 0x1d, 0xeb, 0x27, 0x19, 0x58, 0x93, 0x50, 0x4e, 0xc0, 0xae, 0x7f, 0x98, 0x11, 0x62, 0x66, 0xce, + 0xbe, 0xde, 0xcc, 0xe4, 0xdd, 0xd7, 0xf8, 0x78, 0xc4, 0xc3, 0xd6, 0x57, 0xb0, 0x3e, 0x72, 0x22, + 0xad, 0xcc, 0x36, 0xcc, 0xeb, 0x40, 0xc6, 0xf3, 0x8c, 0x8b, 0x74, 0x23, 0x20, 0xdf, 0x8b, 0x6b, + 0xbd, 0x8d, 0xd2, 0x3d, 0x8b, 0x1a, 0xe4, 0x0d, 0x11, 0xd5, 0xff, 0xdf, 0x0c, 0xac, 0xee, 0xf3, + 0xbe, 0x1f, 0x8e, 0xbc, 0x9e, 0xdf, 0xa1, 0xfd, 0x26, 0x00, 0xeb, 0xe1, 0x63, 0x24, 0x6f, 0x8f, + 0xba, 0xe7, 0x8b, 0x8a, 0x22, 0xaf, 0xcf, 0x0f, 0xd3, 0xf8, 0x1c, 0xd6, 0xd2, 0x87, 0xf8, 0x11, + 0x0a, 0xdf, 0x83, 0xbc, 0xa3, 0x76, 0x89, 0xeb, 0x9b, 0xd3, 0x34, 0x54, 0xd7, 0x81, 0xd5, 0xda, + 0xa0, 0xd7, 0xd7, 0x4b, 0xe5, 0x03, 0xf6, 0xfd, 0xb4, 0x9d, 0xa0, 0x4e, 0x76, 0xbc, 0x3a, 0x1b, + 0xb0, 0x96, 0x46, 0x51, 0xea, 0x58, 0x3f, 0xcd, 0xc2, 0xbc, 0x26, 0x7f, 0x17, 0xe4, 0x3f, 0xc0, + 0x82, 0x0c, 0x1f, 0xdf, 0xf5, 0x84, 0xbe, 0x5c, 0xcb, 0xf1, 0xf8, 0x6a, 0x49, 0x06, 0x1d, 0x8a, + 0x90, 0x15, 0x98, 0x55, 0x59, 0x41, 0x99, 0x58, 0x7d, 0x90, 0x77, 0x60, 0x99, 0x5d, 0x31, 0xb7, + 0xcb, 0xda, 0x5d, 0x6e, 0xb7, 0x59, 0x97, 0x79, 0x1d, 0x8e, 0xd9, 0x68, 0x86, 0x96, 0x86, 0x8c, + 0x9a, 0xa2, 0x4b, 0x61, 0xcc, 0x44, 0x78, 0x9f, 0x4c, 0x86, 0x9b, 0x95, 0x4f, 0x16, 0x2d, 0x45, + 0x0c, 0x9d, 0xe1, 0xde, 0x81, 0xd9, 0x50, 0x30, 0xc1, 0x37, 0xe6, 0xb6, 0x32, 0xf7, 0x8b, 0xbb, + 0xab, 0x69, 0xb7, 0x9c, 0x48, 0x26, 0x55, 0x32, 0xf2, 0x69, 0xef, 0x32, 0xc1, 0x43, 0xed, 0x98, + 0x79, 0xd4, 0x15, 0x14, 0x09, 0xfd, 0xd2, 0x01, 0x72, 0x32, 0x68, 0xf7, 0x5c, 0x71, 0x1c, 0x38, + 0x3c, 0x30, 0x4e, 0xd9, 0x82, 0x69, 0x16, 0x5e, 0x6a, 0xc7, 0xe7, 0x23, 0x84, 0xf0, 0xf2, 0x70, + 0x8a, 0x4a, 0x96, 0x94, 0x68, 0x6b, 0x4f, 0xc7, 0x25, 0x6a, 0xae, 0x23, 0x25, 0xda, 0xae, 0x53, + 0x5b, 0x84, 0x79, 0x87, 0x0b, 0xe6, 0x76, 0x43, 0xeb, 0x9b, 0x0c, 0x94, 0x13, 0x28, 0x3a, 0xc6, + 0x3e, 0x82, 0x82, 0xeb, 0x5d, 0xb1, 0xae, 0xeb, 0xd8, 0xbe, 0x64, 0x68, 0xc0, 0x48, 0xa5, 0x86, + 0xe2, 0xe2, 0xaa, 0xc3, 0x29, 0x9a, 0x77, 0x63, 0xdf, 0x64, 0x17, 0x56, 0x58, 0xa7, 0xc3, 0xfb, + 0x82, 0xeb, 0xe5, 0xb6, 0xe7, 0x4b, 0x2b, 0x63, 0xf4, 0x1d, 0x4e, 0x51, 0x62, 0xb8, 0x28, 0xde, + 0x94, 0xbc, 0xf8, 0xa1, 0x9a, 0xb0, 0x2c, 0x93, 0x1a, 0x32, 0x87, 0xa9, 0x70, 0x03, 0xe6, 0xaf, + 0x78, 0xd0, 0xf6, 0x43, 0xae, 0xd3, 0xa0, 0xf9, 0x4c, 0x27, 0xc9, 0xec, 0x48, 0x92, 0xfc, 0x1c, + 0x48, 0x7c, 0x3f, 0xad, 0xe2, 0x16, 0xcc, 0xb0, 0xf0, 0xd2, 0xe4, 0x83, 0x84, 0x29, 0x29, 0x72, + 0xa4, 0x44, 0xdb, 0x75, 0xcc, 0x53, 0x96, 0x30, 0x25, 0x45, 0x8e, 0xf5, 0x08, 0xc8, 0x9e, 0x8c, + 0x93, 0x6e, 0xc2, 0x47, 0x77, 0x21, 0x17, 0xd7, 0x5a, 0x85, 0x31, 0xf8, 0x43, 0x5d, 0xad, 0x55, + 0x28, 0x27, 0x96, 0xe9, 0x9b, 0xf0, 0xe7, 0x69, 0x98, 0x55, 0x06, 0xfc, 0xee, 0x87, 0x06, 0xaf, + 0xdd, 0x99, 0x7b, 0xc3, 0x95, 0xa7, 0x0b, 0x74, 0x51, 0x52, 0x0e, 0x24, 0x81, 0x94, 0x60, 0x9a, + 0xf5, 0x84, 0x8e, 0x7a, 0xf9, 0x27, 0xf9, 0x18, 0x36, 0x7b, 0xec, 0xc6, 0x6e, 0x33, 0xd1, 0xb9, + 0x18, 0x5b, 0xc3, 0xa8, 0xf8, 0x5f, 0xef, 0xb1, 0x9b, 0x9a, 0x94, 0x49, 0x97, 0x31, 0x29, 0x8d, + 0x66, 0xd3, 0x1a, 0x91, 0x07, 0xc9, 0xd0, 0x2f, 0x47, 0xd7, 0x52, 0xca, 0x24, 0x02, 0x7f, 0x05, + 0x66, 0x07, 0x9e, 0x2b, 0x42, 0x0c, 0xf9, 0x02, 0x55, 0x1f, 0xf2, 0xa2, 0xe1, 0x1f, 0xf6, 0xc0, + 0x3b, 0x1b, 0x74, 0xcf, 0xdc, 0x6e, 0x97, 0x3b, 0x1b, 0x0b, 0xea, 0xa2, 0x21, 0xe3, 0x59, 0x44, + 0x27, 0xef, 0x02, 0x09, 0x78, 0xc8, 0x83, 0x2b, 0xee, 0xd8, 0x51, 0xb9, 0xb2, 0xa8, 0xee, 0xb0, + 0xe1, 0x3c, 0x37, 0x65, 0xcb, 0x2e, 0xac, 0x76, 0x02, 0xae, 0x6e, 0xb0, 0x70, 0x7b, 0x3c, 0x14, + 0xac, 0xd7, 0xb7, 0xbd, 0x70, 0x03, 0x70, 0x41, 0xd9, 0x30, 0x4f, 0x0d, 0xaf, 0x29, 0x8f, 0x33, + 0xc7, 0xaf, 0xb8, 0xac, 0x9e, 0x72, 0xe8, 0xfc, 0x94, 0x42, 0x75, 0xc9, 0xa3, 0x5a, 0x44, 0x17, + 0x79, 0xb6, 0x3a, 0x7f, 0x4f, 0xda, 0x6f, 0x23, 0x8f, 0x27, 0x97, 0x45, 0xde, 0x33, 0x49, 0x7d, + 0x2a, 0x89, 0xd6, 0xaf, 0x32, 0x30, 0x5d, 0x73, 0x1d, 0x72, 0x7f, 0x18, 0xea, 0xfa, 0x5a, 0x15, + 0x93, 0xbb, 0x53, 0xc3, 0x96, 0x47, 0xef, 0x72, 0x16, 0x72, 0xdb, 0x19, 0xe8, 0x27, 0xa8, 0xdd, + 0xf5, 0x3b, 0x97, 0xa1, 0xf6, 0x79, 0x19, 0x99, 0xfb, 0x9a, 0x57, 0x43, 0x96, 0xbe, 0x28, 0xa1, + 0xeb, 0x7b, 0xaa, 0x14, 0xa7, 0xe6, 0x93, 0x3c, 0x02, 0x79, 0x20, 0xdb, 0xf3, 0x1d, 0x6e, 0x0b, + 0x97, 0x07, 0xe8, 0xf5, 0x62, 0xec, 0x0d, 0x6d, 0xfa, 0x0e, 0x3f, 0x75, 0x79, 0x40, 0x73, 0x3d, + 0xd7, 0x33, 0x1f, 0xd6, 0x2b, 0x98, 0xae, 0x86, 0x97, 0x7f, 0xab, 0x53, 0x5b, 0xbf, 0xcd, 0x00, + 0x44, 0x46, 0x97, 0x19, 0x2d, 0xe1, 0x44, 0x79, 0x96, 0x69, 0x9a, 0x13, 0x31, 0xe7, 0xdd, 0x86, + 0x45, 0xf4, 0x8c, 0x1d, 0x8a, 0x40, 0x57, 0xaa, 0x0b, 0x48, 0x38, 0x11, 0x01, 0x79, 0x02, 0x79, + 0x8c, 0x43, 0xbb, 0x73, 0xc1, 0xbc, 0x73, 0xae, 0x4b, 0xad, 0xe8, 0x61, 0x7b, 0xd6, 0x77, 0x98, + 0xe0, 0x0e, 0x82, 0x1d, 0x4e, 0xd1, 0x1c, 0x0a, 0xef, 0xa1, 0x2c, 0xd9, 0x81, 0x79, 0x74, 0x2f, + 0x77, 0xd0, 0x74, 0xf1, 0xb0, 0x40, 0x0f, 0x9b, 0x45, 0x46, 0xaa, 0x36, 0x0f, 0xb3, 0x08, 0x6c, + 0xfd, 0x22, 0x03, 0xf9, 0xf8, 0xce, 0xe4, 0x09, 0x14, 0xfb, 0x01, 0xbf, 0x72, 0xfd, 0x41, 0x68, + 0xab, 0x9b, 0x93, 0x99, 0x7c, 0x73, 0x0a, 0x46, 0x14, 0x3f, 0xc9, 0x7b, 0xb0, 0xe8, 0xf1, 0x6b, + 0xbd, 0x2c, 0x3b, 0x79, 0xd9, 0x82, 0xc7, 0xaf, 0xd5, 0x8a, 0x7b, 0x90, 0x57, 0xd1, 0xa9, 0x2f, + 0x96, 0x32, 0x71, 0x0e, 0x69, 0x07, 0x48, 0xb2, 0x7e, 0x9f, 0x01, 0x88, 0x94, 0x20, 0x1f, 0x40, + 0x0e, 0x95, 0x98, 0x70, 0x38, 0x94, 0x54, 0x28, 0xd0, 0x1b, 0xfe, 0x3d, 0x82, 0x93, 0x1d, 0xc1, + 0x91, 0x25, 0x98, 0xb6, 0x8e, 0xce, 0x2c, 0xd3, 0xaa, 0x04, 0xd3, 0x44, 0xf5, 0xfe, 0x7d, 0x02, + 0x85, 0x80, 0x7f, 0xc5, 0x3b, 0xc2, 0x0e, 0x38, 0x0b, 0x7d, 0x4f, 0x47, 0x6a, 0x25, 0x89, 0x4f, + 0x51, 0x84, 0xa2, 0x04, 0xcd, 0x07, 0xb1, 0x2f, 0x59, 0x6e, 0x50, 0xde, 0xf1, 0xaf, 0x78, 0x90, + 0x6a, 0xa9, 0xac, 0x63, 0x58, 0x1f, 0xe1, 0xe8, 0x8c, 0xf0, 0x01, 0xac, 0x79, 0x83, 0x9e, 0x1d, + 0x28, 0x36, 0x77, 0xec, 0x58, 0x0b, 0x25, 0xf5, 0x58, 0xf1, 0x06, 0x3d, 0x6a, 0x98, 0x66, 0xb5, + 0x55, 0x86, 0xe5, 0xaa, 0xea, 0xbe, 0xa3, 0xda, 0xc9, 0x6a, 0x01, 0x89, 0x13, 0x35, 0xc0, 0x13, + 0x28, 0xf0, 0x1b, 0xde, 0x19, 0xe0, 0x9d, 0x90, 0x1d, 0x42, 0x3a, 0xab, 0xd6, 0x0d, 0x57, 0xae, + 0xca, 0xf3, 0xd8, 0x97, 0xf5, 0xc7, 0x19, 0x98, 0x3d, 0x92, 0x17, 0x87, 0x3c, 0x86, 0x82, 0x8c, + 0x5d, 0x8f, 0x77, 0x6d, 0x55, 0x0a, 0x65, 0x26, 0x95, 0x42, 0x79, 0x2d, 0x87, 0x5f, 0xf2, 0x99, + 0x32, 0xeb, 0x58, 0x2f, 0x5e, 0xa3, 0x9a, 0xed, 0xaa, 0x3d, 0xac, 0x53, 0x1f, 0xc3, 0xba, 0x91, + 0x4b, 0x5f, 0x60, 0x15, 0x37, 0xab, 0x9a, 0x9d, 0xba, 0xc2, 0xef, 0xc1, 0x8a, 0x59, 0xa7, 0xae, + 0xbf, 0xea, 0xe1, 0x55, 0xa7, 0x4f, 0x89, 0xe6, 0xa1, 0x0e, 0x75, 0xe4, 0xc8, 0xb4, 0xd2, 0x0f, + 0x78, 0xcf, 0x1d, 0xf4, 0xf0, 0x34, 0xb3, 0x78, 0x1a, 0xd0, 0x24, 0x79, 0x94, 0x6d, 0x59, 0x7e, + 0xc5, 0x0c, 0x86, 0x62, 0x73, 0xaa, 0xc2, 0x8c, 0x5b, 0x47, 0xca, 0x5a, 0x68, 0x16, 0x37, 0x92, + 0x9b, 0x47, 0xb9, 0x1c, 0x12, 0xb5, 0xcc, 0x43, 0x28, 0x77, 0xba, 0x9c, 0x05, 0xae, 0x77, 0xae, + 0x52, 0x60, 0x3f, 0x70, 0x3b, 0x1c, 0xf3, 0xcc, 0x0c, 0x5d, 0x36, 0x2c, 0x99, 0xfa, 0x5a, 0x92, + 0x41, 0xee, 0x43, 0x49, 0xe5, 0x3d, 0xcc, 0xb4, 0xb8, 0x44, 0xa7, 0x99, 0x22, 0xd2, 0x31, 0xdf, + 0x52, 0x5d, 0xce, 0xc5, 0x33, 0x24, 0x8c, 0x64, 0xc8, 0x3b, 0xb0, 0xd8, 0x1f, 0x04, 0x9d, 0x0b, + 0x16, 0x72, 0x67, 0x23, 0x87, 0x35, 0x4a, 0x44, 0x20, 0x8f, 0x22, 0x9b, 0x07, 0xbc, 0xe7, 0x0b, + 0xae, 0x5e, 0x69, 0x99, 0xfd, 0xf3, 0xb8, 0x95, 0x31, 0x2d, 0x45, 0xae, 0x7c, 0x9b, 0x65, 0x21, + 0xf0, 0x2f, 0xb0, 0x6c, 0x96, 0x45, 0xaf, 0x7a, 0x61, 0xd2, 0xab, 0x6e, 0xdc, 0x3f, 0x7c, 0xd9, + 0x0f, 0xa1, 0x80, 0xee, 0x18, 0x16, 0x59, 0xb7, 0x61, 0x51, 0xd5, 0x08, 0xb2, 0xec, 0x91, 0x85, + 0x51, 0x9e, 0x2e, 0x20, 0xa1, 0xe1, 0x84, 0xa4, 0x12, 0x9b, 0x29, 0x64, 0x15, 0x6f, 0x38, 0x41, + 0xf8, 0x59, 0x06, 0x8a, 0x66, 0x2b, 0x1d, 0xec, 0x6f, 0xc1, 0x1c, 0x86, 0x81, 0xa9, 0xb0, 0xa2, + 0x74, 0x81, 0x82, 0x54, 0x73, 0xc9, 0x0e, 0xac, 0xe0, 0x60, 0x04, 0x83, 0x92, 0xb3, 0xc0, 0xe3, + 0x4e, 0x2c, 0x36, 0x97, 0x91, 0x57, 0xed, 0x89, 0x3a, 0x72, 0xa4, 0x13, 0xdf, 0x01, 0x12, 0x2d, + 0xe8, 0x33, 0x57, 0x89, 0xeb, 0x36, 0xca, 0x88, 0xb7, 0x98, 0x2b, 0x85, 0xad, 0x25, 0x28, 0x9c, + 0xfa, 0x97, 0xdc, 0x1b, 0xde, 0xff, 0x8f, 0xa0, 0x68, 0x08, 0xc3, 0x7e, 0x6a, 0x4e, 0x20, 0x45, + 0x1f, 0x94, 0x44, 0x07, 0x0d, 0x99, 0x40, 0x61, 0xaa, 0x25, 0xac, 0x5f, 0x67, 0x61, 0x71, 0x48, + 0x95, 0x6f, 0x59, 0x5b, 0x06, 0x7a, 0x8f, 0x75, 0x58, 0xe0, 0xfb, 0x9e, 0xae, 0xd4, 0xf2, 0x92, + 0xf8, 0x54, 0xd3, 0xe4, 0x9b, 0xd8, 0x67, 0x2f, 0x7a, 0x32, 0x1f, 0x5d, 0xb0, 0xf0, 0xc2, 0xb4, + 0x60, 0x9a, 0x76, 0xc8, 0xc2, 0x0b, 0xf2, 0x00, 0x4a, 0x46, 0xa4, 0x1f, 0x70, 0xb7, 0xc7, 0x74, + 0x5e, 0xca, 0xd3, 0x25, 0x4d, 0x6f, 0x69, 0xb2, 0x8c, 0x48, 0xdd, 0x63, 0xa2, 0xe6, 0x3d, 0xa9, + 0xfa, 0x0c, 0xa6, 0xc0, 0xa2, 0xa2, 0x4b, 0xc5, 0x9f, 0x86, 0x4c, 0x90, 0xf7, 0x61, 0x35, 0xf0, + 0x07, 0x42, 0x86, 0xba, 0xbc, 0x11, 0x91, 0xf8, 0x2c, 0x8a, 0x13, 0xcd, 0x3c, 0xe0, 0x7c, 0xb8, + 0x44, 0xe7, 0x56, 0x1b, 0x2b, 0x22, 0xee, 0xe0, 0x4d, 0xd3, 0xb9, 0x75, 0x4f, 0x91, 0x64, 0x9e, + 0xc6, 0x6b, 0xcd, 0x55, 0xcb, 0xb2, 0x40, 0xcd, 0xa7, 0x5c, 0x1c, 0x0a, 0x3f, 0x60, 0xe7, 0xdc, + 0xf6, 0x58, 0x4f, 0x5d, 0xaa, 0x45, 0x99, 0x3f, 0x91, 0xd6, 0x64, 0x3d, 0x6e, 0xad, 0xc1, 0xca, + 0x51, 0x3c, 0xf7, 0x1b, 0x9f, 0x7c, 0x33, 0x0d, 0xab, 0x29, 0x86, 0xf6, 0x8d, 0x0d, 0x4b, 0xc9, + 0x52, 0xc2, 0x38, 0x69, 0x37, 0x19, 0x4d, 0xe9, 0x85, 0x49, 0x6a, 0x58, 0xf7, 0x44, 0xf0, 0xa2, + 0x96, 0xdd, 0xc8, 0xd0, 0x62, 0xa2, 0xf8, 0x08, 0x89, 0x07, 0x6b, 0xe9, 0x5a, 0x65, 0xd0, 0xb9, + 0xe4, 0xc3, 0x01, 0xc6, 0x87, 0x3f, 0x04, 0xa7, 0xa6, 0x96, 0x22, 0x1a, 0x5d, 0xe9, 0x8e, 0x61, + 0x55, 0xaa, 0x50, 0x1e, 0x73, 0x34, 0x59, 0xb2, 0x9b, 0x4a, 0xbf, 0x40, 0xe5, 0x9f, 0x51, 0xf3, + 0xaa, 0xfa, 0x19, 0xf5, 0xf1, 0x24, 0xfb, 0x61, 0xa6, 0xc2, 0xe1, 0xd6, 0x44, 0xd4, 0x31, 0x1b, + 0xed, 0xc6, 0x37, 0x2a, 0xee, 0xde, 0x19, 0x2a, 0x94, 0x5c, 0xaf, 0x6b, 0xf4, 0x21, 0x8c, 0x74, + 0x56, 0x93, 0xdf, 0x08, 0xec, 0x07, 0x1a, 0xde, 0x99, 0x6f, 0x9c, 0xf5, 0xff, 0x19, 0x58, 0x4d, + 0x31, 0xb4, 0xb3, 0xee, 0x26, 0x27, 0x7b, 0xaa, 0x4d, 0x8e, 0xcf, 0xf5, 0x26, 0x8c, 0x0c, 0xe6, + 0xc6, 0x8e, 0x0c, 0xc8, 0xdb, 0xb0, 0x84, 0x2f, 0x72, 0x54, 0xb4, 0xeb, 0x27, 0xbd, 0x88, 0xe4, + 0x61, 0xb9, 0x6e, 0x3d, 0x86, 0x65, 0xf9, 0xa4, 0x51, 0x26, 0xe3, 0xd9, 0x3c, 0x65, 0xf7, 0x20, + 0x8f, 0x4f, 0x62, 0x7f, 0xd0, 0xbe, 0xe4, 0x2f, 0xcc, 0x6b, 0x96, 0x93, 0xb4, 0x96, 0x22, 0x59, + 0x47, 0x40, 0xe2, 0xeb, 0xb4, 0x16, 0x8f, 0xf5, 0xc2, 0x00, 0xc9, 0x26, 0xde, 0xca, 0x89, 0xe7, + 0x54, 0x2f, 0xc1, 0xdd, 0xd4, 0xdf, 0xe1, 0xf6, 0xb7, 0x19, 0xc8, 0xc7, 0x1b, 0x7d, 0x52, 0x82, + 0x7c, 0xab, 0xde, 0xdc, 0x6f, 0x34, 0x3f, 0xb5, 0x8f, 0x5b, 0xf5, 0x66, 0x69, 0x8a, 0x10, 0x28, + 0x1a, 0xca, 0xb3, 0xd6, 0x7e, 0xf5, 0xb4, 0x5e, 0xca, 0x90, 0x05, 0x98, 0x41, 0x6e, 0x96, 0xe4, + 0x60, 0xbe, 0xfe, 0x79, 0xab, 0x41, 0xeb, 0xfb, 0xa5, 0xe9, 0xb8, 0xe8, 0xde, 0xd1, 0xf1, 0x49, + 0x7d, 0xbf, 0x34, 0x43, 0x00, 0xe6, 0xf4, 0xdf, 0xb3, 0xa4, 0x0c, 0x4b, 0xb4, 0xbe, 0x77, 0xfc, + 0xbc, 0x4e, 0xbf, 0xb0, 0x0f, 0xaa, 0x8d, 0xa3, 0xfa, 0x7e, 0x69, 0x8e, 0x2c, 0x43, 0xc1, 0x2c, + 0xaa, 0x55, 0x4f, 0xf7, 0x0e, 0x4b, 0xf3, 0xdb, 0x2d, 0x5d, 0xd5, 0xa9, 0x23, 0xe5, 0x60, 0xbe, + 0x45, 0xeb, 0xad, 0x2a, 0xad, 0x97, 0xa6, 0x48, 0x1e, 0x16, 0xaa, 0x7b, 0x7b, 0xf5, 0xd6, 0x69, + 0x7d, 0xbf, 0x94, 0x91, 0x5f, 0xb4, 0xfe, 0x6f, 0xf5, 0x3d, 0xf9, 0x95, 0x95, 0x50, 0x27, 0x8d, + 0x4f, 0x9b, 0x78, 0x94, 0x02, 0x2c, 0x1e, 0x34, 0x9a, 0xd5, 0xa3, 0xc6, 0x97, 0xf2, 0x14, 0xdb, + 0xbf, 0xc9, 0xc0, 0xf2, 0x48, 0xf9, 0x25, 0xd5, 0x68, 0x1e, 0x37, 0xe5, 0xb6, 0x6b, 0x40, 0x4e, + 0xea, 0xf4, 0x79, 0x9d, 0xda, 0x4f, 0x1b, 0x27, 0xb5, 0xfa, 0x61, 0xf5, 0x79, 0xe3, 0x98, 0x96, + 0x32, 0xa4, 0x02, 0x6b, 0x78, 0x28, 0xfb, 0x79, 0x9d, 0x9e, 0x34, 0x8e, 0x9b, 0x92, 0xfd, 0x14, + 0x4f, 0x99, 0x25, 0x9b, 0x70, 0xab, 0x55, 0xa5, 0xa7, 0x8d, 0xea, 0x91, 0xad, 0x0e, 0x61, 0xef, + 0x1d, 0x1f, 0x1d, 0x55, 0x4f, 0xeb, 0xb4, 0x7a, 0x54, 0x9a, 0x26, 0xf7, 0x60, 0x33, 0xc5, 0xde, + 0x7f, 0xd6, 0x3a, 0x6a, 0xec, 0x55, 0x4f, 0xeb, 0x76, 0xab, 0x5e, 0xa7, 0xa5, 0x19, 0xf2, 0x00, + 0xde, 0x4c, 0xef, 0x70, 0x58, 0x6d, 0x36, 0xeb, 0x47, 0xf6, 0xc1, 0x33, 0x65, 0x11, 0x6d, 0xa5, + 0xd9, 0xdd, 0x5f, 0x96, 0x60, 0xee, 0x14, 0x7b, 0x69, 0xe2, 0x43, 0x3e, 0x3e, 0xef, 0x27, 0xd1, + 0xe5, 0x18, 0xf3, 0x6b, 0x43, 0x65, 0x73, 0x02, 0x57, 0xb7, 0xef, 0xd6, 0xff, 0xfc, 0xe9, 0x2f, + 0xdf, 0x66, 0xef, 0x58, 0xeb, 0x3b, 0x57, 0xef, 0xef, 0x48, 0xc9, 0x1d, 0x93, 0x1e, 0x77, 0xbe, + 0x96, 0xf2, 0x4f, 0x32, 0xdb, 0xe4, 0x4b, 0xc8, 0xc5, 0x7e, 0x95, 0x21, 0xb7, 0x63, 0xf3, 0x94, + 0xf4, 0xb4, 0xb1, 0x32, 0x32, 0xd6, 0xb3, 0xee, 0x20, 0xc2, 0x9a, 0xb5, 0x3c, 0x82, 0x20, 0xf7, + 0x3e, 0x83, 0x7c, 0xfc, 0xb7, 0x80, 0x98, 0x32, 0x63, 0x7e, 0x5a, 0x88, 0x29, 0x33, 0xee, 0x07, + 0x04, 0xeb, 0x16, 0x42, 0x95, 0xc9, 0x28, 0x94, 0xc4, 0x89, 0x4f, 0x95, 0x63, 0x38, 0x63, 0xc6, + 0xe6, 0x31, 0x9c, 0x71, 0xa3, 0x68, 0x83, 0xb3, 0x3d, 0x06, 0xe7, 0x25, 0x2c, 0xa5, 0x66, 0xbe, + 0x24, 0x9a, 0x88, 0x8f, 0x9f, 0x4f, 0x57, 0xb6, 0x26, 0x0b, 0x68, 0xc0, 0x37, 0x11, 0xf0, 0xae, + 0x55, 0x19, 0xf5, 0x92, 0x99, 0x02, 0x4b, 0x63, 0x5e, 0x43, 0x31, 0x39, 0x7e, 0x25, 0x6f, 0x44, + 0x0f, 0xe7, 0xb8, 0xe1, 0x70, 0xe5, 0xee, 0x44, 0xbe, 0x46, 0xfe, 0x7b, 0x44, 0x7e, 0xc3, 0xba, + 0x35, 0x8a, 0xac, 0xe7, 0xb1, 0x12, 0x58, 0x40, 0x31, 0x39, 0x28, 0x8d, 0x01, 0x8f, 0x9d, 0xd3, + 0xc6, 0x80, 0x27, 0x4c, 0x58, 0xef, 0x21, 0xf0, 0x6d, 0x6b, 0x6d, 0x14, 0xb8, 0x3d, 0xe8, 0xf5, + 0x25, 0xea, 0x7f, 0xc3, 0x52, 0xaa, 0x2b, 0x8a, 0xd9, 0x7a, 0x7c, 0x27, 0x15, 0xb3, 0xf5, 0x84, + 0x86, 0xea, 0x75, 0x1a, 0xeb, 0x26, 0x4b, 0x62, 0x3b, 0x90, 0x8b, 0x8d, 0x20, 0x63, 0x77, 0x62, + 0x74, 0xfc, 0x59, 0xb9, 0x33, 0x9e, 0xa9, 0xf1, 0x2a, 0x88, 0xb7, 0x62, 0x2d, 0x0d, 0xf1, 0xb0, + 0x00, 0xc7, 0xdb, 0xf1, 0x5f, 0x00, 0xd1, 0x10, 0x90, 0x54, 0x12, 0xd1, 0x9f, 0x98, 0x34, 0x56, + 0x6e, 0x8f, 0xe5, 0x69, 0x88, 0x75, 0x84, 0x58, 0x26, 0x69, 0x08, 0xe2, 0x43, 0x2e, 0x36, 0xd3, + 0x8b, 0x69, 0x31, 0x3a, 0x20, 0x8c, 0x69, 0x31, 0x6e, 0x0c, 0xa8, 0x23, 0x74, 0x7b, 0x33, 0x05, + 0xb1, 0xf3, 0x32, 0xd6, 0x61, 0xbc, 0x22, 0xff, 0x09, 0x10, 0xb5, 0x98, 0x31, 0x85, 0x46, 0x9a, + 0xd1, 0x98, 0x42, 0xa3, 0x3d, 0xa9, 0xb5, 0x82, 0x68, 0x45, 0x92, 0x1f, 0xa2, 0x9d, 0x71, 0x4e, + 0xbe, 0xd6, 0xe5, 0x7c, 0x54, 0x28, 0x6d, 0x4e, 0x2a, 0x84, 0x14, 0xc6, 0x1b, 0xaf, 0xaf, 0x93, + 0xac, 0x2d, 0x84, 0xa9, 0x90, 0x8d, 0x21, 0x4c, 0xaa, 0xae, 0x23, 0x97, 0x50, 0x48, 0x94, 0x15, + 0x31, 0xc4, 0x71, 0x75, 0x48, 0x0c, 0x71, 0x6c, 0x35, 0x62, 0xdd, 0x46, 0xc4, 0x55, 0x52, 0x1e, + 0x22, 0x62, 0x27, 0xb3, 0xe3, 0xf1, 0x1b, 0x41, 0x7c, 0x28, 0xe0, 0x8a, 0x13, 0x8f, 0xf5, 0xc3, + 0x0b, 0x5f, 0xc4, 0xc0, 0x12, 0xf4, 0x51, 0xb0, 0x14, 0x5b, 0x83, 0xdd, 0x45, 0xb0, 0x5b, 0x64, + 0x3d, 0x05, 0x16, 0x9a, 0xfd, 0xbf, 0x80, 0xc2, 0xa7, 0x5c, 0x0c, 0x5b, 0x87, 0x90, 0x44, 0x3f, + 0x0b, 0x26, 0xfa, 0x93, 0xca, 0xfa, 0x08, 0x7d, 0x5c, 0xe4, 0x75, 0x43, 0x26, 0x76, 0x54, 0x4f, + 0x42, 0x28, 0xcc, 0xa9, 0xd6, 0x2b, 0xb6, 0x67, 0xa2, 0xad, 0x8b, 0xed, 0x99, 0xec, 0xd1, 0xc6, + 0x44, 0xb3, 0x6e, 0xca, 0x38, 0xe4, 0xa2, 0x3a, 0x27, 0x7e, 0x5d, 0x46, 0x0a, 0xad, 0x58, 0x74, + 0x8d, 0x16, 0x53, 0xd6, 0x26, 0x02, 0xac, 0x93, 0xd5, 0x21, 0x40, 0xbc, 0xb6, 0x22, 0x3f, 0xcf, + 0x40, 0x31, 0x61, 0xd0, 0x90, 0x4c, 0xb0, 0x74, 0x38, 0xe6, 0xb5, 0x4b, 0xf1, 0x35, 0xe4, 0x3e, + 0x42, 0x7e, 0x4c, 0x3e, 0x9a, 0xe0, 0x8a, 0x70, 0xe7, 0x65, 0x28, 0x58, 0x20, 0x6c, 0xd3, 0xe9, + 0xbe, 0xda, 0x79, 0xe9, 0x0d, 0x7a, 0xea, 0x93, 0x87, 0x76, 0x9b, 0x75, 0x2e, 0x5f, 0xd5, 0xde, + 0xfe, 0xf2, 0xcd, 0x73, 0x57, 0x5c, 0x0c, 0xda, 0x0f, 0x3b, 0x7e, 0x6f, 0xa7, 0xeb, 0x9e, 0x5f, + 0x08, 0xcf, 0xf5, 0xce, 0xbb, 0xac, 0x1d, 0xaa, 0x4d, 0xf5, 0x29, 0xda, 0x73, 0xf8, 0xff, 0x16, + 0xff, 0xf8, 0xd7, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc1, 0x3a, 0x0e, 0x91, 0xb8, 0x21, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/poolrpc/trader.proto b/poolrpc/trader.proto index 21065df18..61f4d3cd9 100644 --- a/poolrpc/trader.proto +++ b/poolrpc/trader.proto @@ -891,7 +891,16 @@ message LeaseDurationRequest { } message LeaseDurationResponse { - map lease_durations = 1; + /* + Deprecated, use lease_duration_buckets. + */ + map lease_durations = 1 [deprecated = true]; + + /* + The set of lease durations the market is currently accepting and the state + the duration buckets currently are in. + */ + map lease_duration_buckets = 2; } message NextBatchInfoRequest { diff --git a/poolrpc/trader.swagger.json b/poolrpc/trader.swagger.json index f6b8ee3a1..975c8cbc2 100644 --- a/poolrpc/trader.swagger.json +++ b/poolrpc/trader.swagger.json @@ -807,14 +807,14 @@ "clearing_price_rate": { "type": "integer", "format": "int64", - "description": "The uniform clearing price rate in parts per billion of the batch." + "description": "Deprecated, use matched_markets." }, "matched_orders": { "type": "array", "items": { "$ref": "#/definitions/poolrpcMatchedOrderSnapshot" }, - "description": "The set of all orders matched in the batch." + "description": "Deprecated, use matched_markets." }, "batch_tx_id": { "type": "string", @@ -829,6 +829,18 @@ "type": "string", "format": "uint64", "description": "The fee rate, in satoshis per kiloweight, of the batch transaction." + }, + "creation_timestamp_ns": { + "type": "string", + "format": "uint64", + "description": "The unix timestamp in nanoseconds the batch was made." + }, + "matched_markets": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/poolrpcMatchedMarketSnapshot" + }, + "description": "Maps the distinct lease duration markets to the orders that were matched\nwithin and the discovered market clearing price." } } }, @@ -957,6 +969,17 @@ } } }, + "poolrpcDurationBucketState": { + "type": "string", + "enum": [ + "NO_MARKET", + "MARKET_CLOSED", + "ACCEPTING_ORDERS", + "MARKET_OPEN" + ], + "default": "NO_MARKET", + "description": " - NO_MARKET: NO_MARKET indicates that this bucket doesn't actually exist, in that no\nmarket is present for this market.\n - MARKET_CLOSED: MARKET_CLOSED indicates that this market exists, but that it isn't currently\nrunning.\n - ACCEPTING_ORDERS: ACCEPTING_ORDERS indicates that we're accepting orders for this bucket, but\nnot yet clearing for this duration.\n - MARKET_OPEN: MARKET_OPEN indicates that we're accepting orders, and fully clearing the\nmarket for this duration." + }, "poolrpcExecutionFee": { "type": "object", "properties": { @@ -1085,7 +1108,15 @@ "additionalProperties": { "type": "boolean", "format": "boolean" - } + }, + "description": "Deprecated, use lease_duration_buckets." + }, + "lease_duration_buckets": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/poolrpcDurationBucketState" + }, + "description": "The set of lease durations the market is currently accepting and the state\nthe duration buckets currently are in." } } }, @@ -1231,6 +1262,23 @@ "default": "PREPARE", "description": " - PREPARE: The OrderMatchPrepare message from the auctioneer was received initially.\n - ACCEPTED: The OrderMatchPrepare message from the auctioneer was processed successfully\nand the batch was accepted.\n - REJECTED: The order was rejected by the trader daemon, either as an answer to a\nOrderMatchSignBegin or OrderMatchFinalize message from the auctioneer.\n - SIGNED: The OrderMatchSignBegin message from the auctioneer was processed\nsuccessfully.\n - FINALIZED: The OrderMatchFinalize message from the auctioneer was processed\nsuccessfully." }, + "poolrpcMatchedMarketSnapshot": { + "type": "object", + "properties": { + "matched_orders": { + "type": "array", + "items": { + "$ref": "#/definitions/poolrpcMatchedOrderSnapshot" + }, + "description": "The set of all orders matched in the batch." + }, + "clearing_price_rate": { + "type": "integer", + "format": "int64", + "description": "The uniform clearing price rate in parts per billion that was used for this\nbatch." + } + } + }, "poolrpcMatchedOrderSnapshot": { "type": "object", "properties": { diff --git a/rpcserver.go b/rpcserver.go index 6f5d6da78..ddcfebb51 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -6,6 +6,7 @@ import ( "encoding/hex" "errors" "fmt" + "io" "net" "sync" "sync/atomic" @@ -36,6 +37,8 @@ import ( "github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/signal" "github.com/lightningnetwork/lnd/tor" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) const ( @@ -221,6 +224,14 @@ func (s *rpcServer) consumePendingOpenChannels( } rpcLog.Errorf("Unable to read channel event: %v", err) + + // If the lnd node shut down, there's no use continuing. + if err == io.EOF || err == io.ErrUnexpectedEOF || + status.Code(err) == codes.Unavailable { + + return + } + continue } @@ -1124,10 +1135,10 @@ func (s *rpcServer) SubmitOrder(ctx context.Context, // If the market isn't currently accepting orders for this particular // lease duration, then we'll exit here as the order will be rejected. leaseDuration := o.Details().LeaseDuration - if _, ok := auctionTerms.LeaseDurations[leaseDuration]; !ok { + if _, ok := auctionTerms.LeaseDurationBuckets[leaseDuration]; !ok { return nil, fmt.Errorf("invalid channel lease duration %v "+ "blocks, active durations are: %v", - leaseDuration, auctionTerms.LeaseDurations) + leaseDuration, auctionTerms.LeaseDurationBuckets) } // Collect all the order data and sign it before sending it to the @@ -1790,10 +1801,23 @@ func (s *rpcServer) prepareLeasesResponse(ctx context.Context, bidDuration = match.Order.(*order.Bid).LeaseDuration } + // The clearing price is dependent on the lease + // duration, except for older batch versions + // where there was just one single duration + // which is returned in the default/legacy + // bucket independent of what bids were + // contained within. + duration := bidDuration + clearingPrice, ok := batch.ClearingPrices[duration] + if !ok { + duration = order.LegacyLeaseDurationBucket + clearingPrice = batch.ClearingPrices[duration] + } + // Calculate the premium paid/received to/from // the maker/taker and the execution fee paid // to the auctioneer and tally them. - premium := batch.ClearingPrice.LumpSumPremium( + premium := clearingPrice.LumpSumPremium( chanAmt, bidDuration, ) exeFee := batch.ExecutionFee.BaseFee() + @@ -1822,13 +1846,15 @@ func (s *rpcServer) prepareLeasesResponse(ctx context.Context, ChannelDurationBlocks: bidDuration, ChannelLeaseExpiry: leaseExpiryHeight, PremiumSat: uint64(premium), - ClearingRatePrice: uint64(batch.ClearingPrice), - OrderFixedRate: uint64(ourOrder.Details().FixedRate), - ExecutionFeeSat: uint64(exeFee), - OrderNonce: nonce[:], - Purchased: purchased, - ChannelRemoteNodeKey: match.NodeKey[:], - ChannelNodeTier: nodeTier, + ClearingRatePrice: uint64(clearingPrice), + OrderFixedRate: uint64( + ourOrder.Details().FixedRate, + ), + ExecutionFeeSat: uint64(exeFee), + OrderNonce: nonce[:], + Purchased: purchased, + ChannelRemoteNodeKey: match.NodeKey[:], + ChannelNodeTier: nodeTier, }) numChans++ @@ -1899,9 +1925,19 @@ func (s *rpcServer) LeaseDurations(ctx context.Context, return nil, fmt.Errorf("unable to query auctioneer terms: %v", err) } + legacyDurations := make( + map[uint32]bool, len(auctionTerms.LeaseDurationBuckets), + ) + for duration, market := range auctionTerms.LeaseDurationBuckets { + const accept = poolrpc.DurationBucketState_ACCEPTING_ORDERS + const open = poolrpc.DurationBucketState_MARKET_OPEN + + legacyDurations[duration] = market == accept || market == open + } return &poolrpc.LeaseDurationResponse{ - LeaseDurations: auctionTerms.LeaseDurations, + LeaseDurations: legacyDurations, + LeaseDurationBuckets: auctionTerms.LeaseDurationBuckets, }, nil } diff --git a/terms/terms.go b/terms/terms.go index e18fcfdb4..981d90877 100644 --- a/terms/terms.go +++ b/terms/terms.go @@ -4,6 +4,7 @@ import ( "time" "github.com/btcsuite/btcutil" + "github.com/lightninglabs/pool/poolrpc" "github.com/lightningnetwork/lnd/lnwallet/chainfee" ) @@ -12,11 +13,6 @@ type AuctioneerTerms struct { // MaxAccountValue is the current maximum allowed account value. MaxAccountValue btcutil.Amount - // MaxOrderDuration is the current maximum value for an order duration. - // That means that an ask's MaxDuration or a bid's MinDuration cannot - // exceed this value. - MaxOrderDuration uint32 - // OrderExecBaseFee is the base fee charged per order, regardless of the // matched size. OrderExecBaseFee btcutil.Amount @@ -24,11 +20,9 @@ type AuctioneerTerms struct { // OrderExecFeeRate is the fee rate in parts per million. OrderExecFeeRate btcutil.Amount - // LeaseDurations lists the current set of active lease durations in - // the market at this instance. The duration in blocks is mapped to a - // bool which indicates if this market is actively clearing order or - // not. - LeaseDurations map[uint32]bool + // LeaseDurationBuckets lists the current set of lease durations and + // maps them to their current market state. + LeaseDurationBuckets map[uint32]poolrpc.DurationBucketState // NextBatchConfTarget is the confirmation target the auctioneer will // use to estimate the fee rate of the next batch.