From caad00444fe2bb46a8ff23303b6d02cdc856e9d8 Mon Sep 17 00:00:00 2001 From: wwestgarth Date: Tue, 5 Dec 2023 17:14:42 +0000 Subject: [PATCH 01/10] chore: connect to bootstrap peers after startup to avoid race bug in kubo --- CHANGELOG.md | 1 + datanode/networkhistory/store/store.go | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87a7e0a34f2..14f468f7751 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ - [9516](https://github.com/vegaprotocol/vega/issues/9516) - Add filter by transfer ID for ledger entries API. - [9943](https://github.com/vegaprotocol/vega/issues/9943) - Support amending the order size by defining the target size. - [9231](https://github.com/vegaprotocol/vega/issues/9231) - Add a `JoinTeam API` +- [10222](https://github.com/vegaprotocol/vega/issues/10222) - Supply bootstrap peers after starting the `IPFS` node to increase reliability. - [10097](https://github.com/vegaprotocol/vega/issues/10097) - Add funding rate modifiers to perpetual product definition. - [9981](https://github.com/vegaprotocol/vega/issues/9981) - Support filtering on epoch range on transfers. - [9981](https://github.com/vegaprotocol/vega/issues/9981) - Support filtering on status on transfers. diff --git a/datanode/networkhistory/store/store.go b/datanode/networkhistory/store/store.go index a78ef4887cf..b3275619c39 100644 --- a/datanode/networkhistory/store/store.go +++ b/datanode/networkhistory/store/store.go @@ -44,6 +44,7 @@ import ( "github.com/ipfs/kubo/config" serialize "github.com/ipfs/kubo/config/serialize" "github.com/ipfs/kubo/core" + "github.com/ipfs/kubo/core/bootstrap" "github.com/ipfs/kubo/core/coreapi" "github.com/ipfs/kubo/core/corehttp" "github.com/ipfs/kubo/core/corerepo" @@ -167,8 +168,7 @@ func New(ctx context.Context, log *logging.Logger, chainID string, cfg Config, n } p.log.Debugf("ipfs swarm port:%d", cfg.SwarmPort) - ipfsCfg, err := createIpfsNodeConfiguration(p.log, p.identity, cfg.BootstrapPeers, - cfg.SwarmPort) + ipfsCfg, err := createIpfsNodeConfiguration(p.log, p.identity, cfg.SwarmPort) p.log.Debugf("ipfs bootstrap peers:%v", ipfsCfg.Bootstrap) @@ -188,13 +188,21 @@ func New(ctx context.Context, log *logging.Logger, chainID string, cfg Config, n } p.ipfsAPI, err = coreapi.NewCoreAPI(p.ipfsNode) - if err != nil { return nil, fmt.Errorf("failed to create ipfs api:%w", err) } + peers, err := config.ParseBootstrapPeers(cfg.BootstrapPeers) + if err != nil { + return nil, fmt.Errorf("failed to parse bootstrap peers: %w", err) + } + + if err = p.ipfsNode.Bootstrap(bootstrap.BootstrapConfigWithPeers(peers)); err != nil { + return nil, fmt.Errorf("failed to bootstrap peers: %w", err) + } + if err = setupMetrics(p.ipfsNode); err != nil { - return nil, fmt.Errorf("failed to setup metrics:%w", err) + return nil, fmt.Errorf("failed to setup metrics: %w", err) } return p, nil @@ -744,7 +752,7 @@ func (p *Store) StagedContiguousHistory(ctx context.Context, chunk segment.Conti return staged, nil } -func createIpfsNodeConfiguration(log *logging.Logger, identity config.Identity, bootstrapPeers []string, swarmPort int) (*config.Config, error) { +func createIpfsNodeConfiguration(log *logging.Logger, identity config.Identity, swarmPort int) (*config.Config, error) { cfg, err := config.InitWithIdentity(identity) // Don't try and do local node discovery with mDNS; we're probably on the internet if running @@ -765,8 +773,7 @@ func createIpfsNodeConfiguration(log *logging.Logger, identity config.Identity, } cfg.Addresses.Swarm = updatedSwarmAddrs - cfg.Bootstrap = bootstrapPeers - + cfg.Bootstrap = []string{} // we'll provide these later, but we empty them here so we don't get the default set prettyCfgJSON, _ := json.MarshalIndent(cfg, "", " ") log.Debugf("IPFS Node Config:\n%s", prettyCfgJSON) From 40c61e4e45d4a4536995c9ef394cd761c130deb6 Mon Sep 17 00:00:00 2001 From: Charlie Date: Wed, 6 Dec 2023 12:11:59 +0000 Subject: [PATCH 02/10] feat: nullchain configurable staking asset --- core/blockchain/nullchain/staking_loop.go | 11 ++++++++--- core/protocol/all_services.go | 6 ++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/core/blockchain/nullchain/staking_loop.go b/core/blockchain/nullchain/staking_loop.go index c0b52bdebe0..b5cfbef0976 100644 --- a/core/blockchain/nullchain/staking_loop.go +++ b/core/blockchain/nullchain/staking_loop.go @@ -16,6 +16,7 @@ package nullchain import ( + "context" "time" "code.vegaprotocol.io/vega/core/assets" @@ -44,12 +45,16 @@ type StakingLoop struct { // from the collateral engine. Used by the null-blockchain to remove the need for an Ethereum connection. func NewStakingLoop(col Collateral, assets Assets) *StakingLoop { return &StakingLoop{ - col: col, - assets: assets, - stakingAsset: "VOTE", + col: col, + assets: assets, } } +func (s *StakingLoop) OnStakingAsstUpdate(_ context.Context, value string) error { + s.stakingAsset = value + return nil +} + func (s *StakingLoop) GetAvailableBalance(party string) (*num.Uint, error) { acc, err := s.col.GetPartyGeneralAccount(party, s.stakingAsset) if err != nil { diff --git a/core/protocol/all_services.go b/core/protocol/all_services.go index 1a089b28bb2..947545a4ee3 100644 --- a/core/protocol/all_services.go +++ b/core/protocol/all_services.go @@ -315,6 +315,12 @@ func newServices( svcs.delegation = delegation.New(svcs.log, svcs.conf.Delegation, svcs.broker, svcs.topology, svcs.stakingAccounts, svcs.epochService, svcs.timeService) } else { stakingLoop := nullchain.NewStakingLoop(svcs.collateral, svcs.assets) + svcs.netParams.Watch([]netparams.WatchParam{ + { + Param: netparams.RewardAsset, + Watcher: stakingLoop.OnStakingAsstUpdate, + }, + }...) svcs.governance = governance.NewEngine(svcs.log, svcs.conf.Governance, stakingLoop, svcs.timeService, svcs.broker, svcs.assets, svcs.witness, svcs.executionEngine, svcs.netParams, svcs.banking) svcs.delegation = delegation.New(svcs.log, svcs.conf.Delegation, svcs.broker, svcs.topology, stakingLoop, svcs.epochService, svcs.timeService) } From 8877fad75126849382650e5571096626d5c09ca8 Mon Sep 17 00:00:00 2001 From: Valentin Trinque Date: Wed, 6 Dec 2023 16:15:01 +0100 Subject: [PATCH 03/10] fix: Make the wallet errors on spam stats meaningful --- CHANGELOG.md | 1 + wallet/api/client_check_transaction.go | 8 ++++---- wallet/api/client_check_transaction_test.go | 4 ++-- wallet/api/client_send_transaction.go | 10 +++++----- wallet/api/client_send_transaction_test.go | 4 ++-- wallet/api/client_sign_transaction.go | 10 +++++----- wallet/api/client_sign_transaction_test.go | 4 ++-- wallet/api/errors.go | 1 + 8 files changed, 22 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 14f468f7751..50c1a62493c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -65,6 +65,7 @@ - [10205](https://github.com/vegaprotocol/vega/issues/10205) - Fix for transfer discount fees. - [10211](https://github.com/vegaprotocol/vega/issues/10211) - Ensure infra fees don't get counted for vesting. - [10217](https://github.com/vegaprotocol/vega/issues/10217) - Game ID for reward entity should be optional +- [10227](https://github.com/vegaprotocol/vega/issues/10227) - Make the wallet errors on spam stats meaningful. ## 0.73.0 diff --git a/wallet/api/client_check_transaction.go b/wallet/api/client_check_transaction.go index e9375451dad..222244dd508 100644 --- a/wallet/api/client_check_transaction.go +++ b/wallet/api/client_check_transaction.go @@ -133,14 +133,14 @@ func (h *ClientCheckTransaction) Handle(ctx context.Context, rawParams jsonrpc.P h.interactor.Log(ctx, traceID, InfoLog, "Retrieving latest block information...") stats, err := currentNode.SpamStatistics(ctx, request.PubKey) if err != nil { - h.interactor.NotifyError(ctx, traceID, NetworkErrorType, fmt.Errorf("could not get the latest block information from the node: %w", err)) - return nil, NodeCommunicationError(ErrCouldNotGetLastBlockInformation) + h.interactor.NotifyError(ctx, traceID, NetworkErrorType, fmt.Errorf("could not get the latest spam statistics for the public key from the node: %w", err)) + return nil, NodeCommunicationError(ErrCouldNotGetSpamStatistics) } h.interactor.Log(ctx, traceID, SuccessLog, "Latest block information has been retrieved.") if stats.LastBlockHeight == 0 { - h.interactor.NotifyError(ctx, traceID, NetworkErrorType, ErrCouldNotGetLastBlockInformation) - return nil, NodeCommunicationError(ErrCouldNotGetLastBlockInformation) + h.interactor.NotifyError(ctx, traceID, NetworkErrorType, ErrCouldNotGetSpamStatistics) + return nil, NodeCommunicationError(ErrCouldNotGetSpamStatistics) } if stats.ChainID == "" { diff --git a/wallet/api/client_check_transaction_test.go b/wallet/api/client_check_transaction_test.go index 4ef1c1c5070..2600c9c4b75 100644 --- a/wallet/api/client_check_transaction_test.go +++ b/wallet/api/client_check_transaction_test.go @@ -645,7 +645,7 @@ func testFailingToGetSpamStatsDoesNotCheckTransaction(t *testing.T) { handler.interactor.EXPECT().RequestTransactionReviewForChecking(ctx, traceID, uint8(1), hostname, wallet1.Name(), kp.PublicKey(), fakeTransaction, gomock.Any()).Times(1).Return(true, nil) handler.nodeSelector.EXPECT().Node(ctx, gomock.Any()).Times(1).Return(handler.node, nil) handler.node.EXPECT().SpamStatistics(ctx, kp.PublicKey()).Times(1).Return(types.SpamStatistics{}, assert.AnError) - handler.interactor.EXPECT().NotifyError(ctx, traceID, api.NetworkErrorType, fmt.Errorf("could not get the latest block information from the node: %w", assert.AnError)).Times(1) + handler.interactor.EXPECT().NotifyError(ctx, traceID, api.NetworkErrorType, fmt.Errorf("could not get the latest spam statistics for the public key from the node: %w", assert.AnError)).Times(1) handler.interactor.EXPECT().Log(ctx, traceID, gomock.Any(), gomock.Any()).AnyTimes() @@ -659,7 +659,7 @@ func testFailingToGetSpamStatsDoesNotCheckTransaction(t *testing.T) { require.NotNil(t, errorDetails) assert.Equal(t, api.ErrorCodeNodeCommunicationFailed, errorDetails.Code) assert.Equal(t, "Network error", errorDetails.Message) - assert.Equal(t, api.ErrCouldNotGetLastBlockInformation.Error(), errorDetails.Data) + assert.Equal(t, api.ErrCouldNotGetSpamStatistics.Error(), errorDetails.Data) assert.Empty(t, result) } diff --git a/wallet/api/client_send_transaction.go b/wallet/api/client_send_transaction.go index a5ff2acb786..657cebf43ab 100644 --- a/wallet/api/client_send_transaction.go +++ b/wallet/api/client_send_transaction.go @@ -137,14 +137,14 @@ func (h *ClientSendTransaction) Handle(ctx context.Context, rawParams jsonrpc.Pa h.interactor.Log(ctx, traceID, InfoLog, "Retrieving latest block information...") stats, err := currentNode.SpamStatistics(ctx, request.PubKey) if err != nil { - h.interactor.NotifyError(ctx, traceID, NetworkErrorType, fmt.Errorf("could not get the latest block from node: %w", err)) - return nil, NodeCommunicationError(ErrCouldNotGetLastBlockInformation) + h.interactor.NotifyError(ctx, traceID, NetworkErrorType, fmt.Errorf("could not get the latest spam statistics for the public key from the node: %w", err)) + return nil, NodeCommunicationError(ErrCouldNotGetSpamStatistics) } - h.interactor.Log(ctx, traceID, SuccessLog, "Latest block information has been retrieved.") + h.interactor.Log(ctx, traceID, SuccessLog, "Latest spam statistics for the public key have been retrieved.") if stats.LastBlockHeight == 0 { - h.interactor.NotifyError(ctx, traceID, NetworkErrorType, ErrCouldNotGetLastBlockInformation) - return nil, NodeCommunicationError(ErrCouldNotGetLastBlockInformation) + h.interactor.NotifyError(ctx, traceID, NetworkErrorType, ErrCouldNotGetSpamStatistics) + return nil, NodeCommunicationError(ErrCouldNotGetSpamStatistics) } if stats.ChainID == "" { diff --git a/wallet/api/client_send_transaction_test.go b/wallet/api/client_send_transaction_test.go index 7bf9615e3a2..180c7896ae5 100644 --- a/wallet/api/client_send_transaction_test.go +++ b/wallet/api/client_send_transaction_test.go @@ -696,7 +696,7 @@ func testFailingToGetSpamStatsDoesNotSendTransaction(t *testing.T) { handler.interactor.EXPECT().RequestTransactionReviewForSending(ctx, traceID, uint8(1), hostname, wallet1.Name(), kp.PublicKey(), fakeTransaction, gomock.Any()).Times(1).Return(true, nil) handler.nodeSelector.EXPECT().Node(ctx, gomock.Any()).Times(1).Return(handler.node, nil) handler.node.EXPECT().SpamStatistics(ctx, kp.PublicKey()).Times(1).Return(types.SpamStatistics{}, assert.AnError) - handler.interactor.EXPECT().NotifyError(ctx, traceID, api.NetworkErrorType, fmt.Errorf("could not get the latest block from node: %w", assert.AnError)).Times(1) + handler.interactor.EXPECT().NotifyError(ctx, traceID, api.NetworkErrorType, fmt.Errorf("could not get the latest spam statistics for the public key from the node: %w", assert.AnError)).Times(1) handler.interactor.EXPECT().Log(ctx, traceID, gomock.Any(), gomock.Any()).AnyTimes() // when @@ -710,7 +710,7 @@ func testFailingToGetSpamStatsDoesNotSendTransaction(t *testing.T) { require.NotNil(t, errorDetails) assert.Equal(t, api.ErrorCodeNodeCommunicationFailed, errorDetails.Code) assert.Equal(t, "Network error", errorDetails.Message) - assert.Equal(t, api.ErrCouldNotGetLastBlockInformation.Error(), errorDetails.Data) + assert.Equal(t, api.ErrCouldNotGetSpamStatistics.Error(), errorDetails.Data) assert.Empty(t, result) } diff --git a/wallet/api/client_sign_transaction.go b/wallet/api/client_sign_transaction.go index 7d4d6e9d35d..b3ac28e263d 100644 --- a/wallet/api/client_sign_transaction.go +++ b/wallet/api/client_sign_transaction.go @@ -131,14 +131,14 @@ func (h *ClientSignTransaction) Handle(ctx context.Context, rawParams jsonrpc.Pa h.interactor.Log(ctx, traceID, InfoLog, "Retrieving latest block information...") stats, err := currentNode.SpamStatistics(ctx, request.PubKey) if err != nil { - h.interactor.NotifyError(ctx, traceID, NetworkErrorType, fmt.Errorf("could not get the latest block information from the node: %w", err)) - return nil, NodeCommunicationError(ErrCouldNotGetLastBlockInformation) + h.interactor.NotifyError(ctx, traceID, NetworkErrorType, fmt.Errorf("could not get the latest spam statistics for the public key from the node: %w", err)) + return nil, NodeCommunicationError(ErrCouldNotGetSpamStatistics) } - h.interactor.Log(ctx, traceID, SuccessLog, "Latest block information has been retrieved.") + h.interactor.Log(ctx, traceID, SuccessLog, "Latest spam statistics for the public key have been retrieved.") if stats.LastBlockHeight == 0 { - h.interactor.NotifyError(ctx, traceID, NetworkErrorType, ErrCouldNotGetLastBlockInformation) - return nil, NodeCommunicationError(ErrCouldNotGetLastBlockInformation) + h.interactor.NotifyError(ctx, traceID, NetworkErrorType, ErrCouldNotGetSpamStatistics) + return nil, NodeCommunicationError(ErrCouldNotGetSpamStatistics) } if stats.ChainID == "" { diff --git a/wallet/api/client_sign_transaction_test.go b/wallet/api/client_sign_transaction_test.go index 437d4e4078d..fb4484e5a8f 100644 --- a/wallet/api/client_sign_transaction_test.go +++ b/wallet/api/client_sign_transaction_test.go @@ -628,7 +628,7 @@ func testFailingToGetSpamStatsDoesNotSignTransaction(t *testing.T) { handler.interactor.EXPECT().RequestTransactionReviewForSigning(ctx, traceID, uint8(1), hostname, wallet1.Name(), kp.PublicKey(), fakeTransaction, gomock.Any()).Times(1).Return(true, nil) handler.nodeSelector.EXPECT().Node(ctx, gomock.Any()).Times(1).Return(handler.node, nil) handler.node.EXPECT().SpamStatistics(ctx, kp.PublicKey()).Times(1).Return(types.SpamStatistics{}, assert.AnError) - handler.interactor.EXPECT().NotifyError(ctx, traceID, api.NetworkErrorType, fmt.Errorf("could not get the latest block information from the node: %w", assert.AnError)).Times(1) + handler.interactor.EXPECT().NotifyError(ctx, traceID, api.NetworkErrorType, fmt.Errorf("could not get the latest spam statistics for the public key from the node: %w", assert.AnError)).Times(1) handler.interactor.EXPECT().Log(ctx, traceID, gomock.Any(), gomock.Any()).AnyTimes() // when @@ -641,7 +641,7 @@ func testFailingToGetSpamStatsDoesNotSignTransaction(t *testing.T) { require.NotNil(t, errorDetails) assert.Equal(t, api.ErrorCodeNodeCommunicationFailed, errorDetails.Code) assert.Equal(t, "Network error", errorDetails.Message) - assert.Equal(t, api.ErrCouldNotGetLastBlockInformation.Error(), errorDetails.Data) + assert.Equal(t, api.ErrCouldNotGetSpamStatistics.Error(), errorDetails.Data) assert.Empty(t, result) } diff --git a/wallet/api/errors.go b/wallet/api/errors.go index 35354d7e9cf..f7df4b398f9 100644 --- a/wallet/api/errors.go +++ b/wallet/api/errors.go @@ -120,6 +120,7 @@ var ( ErrCouldNotConnectToWallet = errors.New("could not connect to the wallet") ErrCouldNotGetChainIDFromNode = errors.New("could not get the chain ID from the node") ErrCouldNotGetLastBlockInformation = errors.New("could not get information about the last block on the network") + ErrCouldNotGetSpamStatistics = errors.New("could not get latest spam statistics for the public key on the network") ErrCouldNotListKeys = errors.New("could not list the keys") ErrCouldNotSendTransaction = errors.New("could not send transaction") ErrCouldNotSignTransaction = errors.New("could not sign transaction") From 0fafdeda76b8825c8ddac2fcc2bec1ba69879163 Mon Sep 17 00:00:00 2001 From: Jeremy Letang Date: Wed, 22 Nov 2023 12:44:13 +0000 Subject: [PATCH 04/10] chore: add some more eth rpc monitoring + introduce cache in the ethereum RPC client Signed-off-by: Jeremy Letang --- core/client/eth/client.go | 15 +- core/client/eth/client_wrapper.go | 190 +++++++++++++++++++++ core/datasource/external/ethcall/engine.go | 24 +-- core/metrics/prometheus.go | 26 +++ go.mod | 2 +- go.sum | 4 +- 6 files changed, 233 insertions(+), 28 deletions(-) create mode 100644 core/client/eth/client_wrapper.go diff --git a/core/client/eth/client.go b/core/client/eth/client.go index a95c2d8cf7d..1872fa9748c 100644 --- a/core/client/eth/client.go +++ b/core/client/eth/client.go @@ -20,7 +20,6 @@ import ( "encoding/hex" "errors" "fmt" - "math/big" "strings" "sync" "time" @@ -28,8 +27,6 @@ import ( "code.vegaprotocol.io/vega/core/types" vgcrypto "code.vegaprotocol.io/vega/libs/crypto" - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi/bind" ethcommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" ) @@ -47,16 +44,6 @@ var ContractHashes = map[string]string{ "multisig": "5b7070e6159628455b38f5796e8d0dc08185aaaa1fb6073767c88552d396c6c2", } -// ETHClient ... -// -//go:generate go run github.com/golang/mock/mockgen -destination mocks/eth_client_mock.go -package mocks code.vegaprotocol.io/vega/core/client/eth ETHClient -type ETHClient interface { //revive:disable:exported - bind.ContractBackend - ethereum.ChainReader - ChainID(context.Context) (*big.Int, error) - NetworkID(context.Context) (*big.Int, error) -} - type Client struct { ETHClient ethConfig *types.EthereumConfig @@ -80,7 +67,7 @@ func Dial(ctx context.Context, cfg Config) (*Client, error) { return nil, fmt.Errorf("couldn't instantiate Ethereum client: %w", err) } - return &Client{ETHClient: ethClient, cfg: cfg}, nil + return &Client{ETHClient: newEthClientWrapper(ethClient), cfg: cfg}, nil } func (c *Client) UpdateEthereumConfig(ethConfig *types.EthereumConfig) error { diff --git a/core/client/eth/client_wrapper.go b/core/client/eth/client_wrapper.go new file mode 100644 index 00000000000..1aa50ce3ddf --- /dev/null +++ b/core/client/eth/client_wrapper.go @@ -0,0 +1,190 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package eth + +import ( + "context" + "math/big" + "time" + + "code.vegaprotocol.io/vega/core/metrics" + + "github.com/ethereum/go-ethereum" + ethcommon "github.com/ethereum/go-ethereum/common" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/hashicorp/golang-lru/v2/expirable" +) + +// ETHClient ... +// +//go:generate go run github.com/golang/mock/mockgen -destination mocks/eth_client_mock.go -package mocks code.vegaprotocol.io/vega/core/client/eth ETHClient +type ETHClient interface { //revive:disable:exported + // bind.ContractBackend + // ethereum.ChainReader + + // client + ChainID(context.Context) (*big.Int, error) + NetworkID(context.Context) (*big.Int, error) + + // ethereum.ChainReader + BlockByHash(ctx context.Context, hash ethcommon.Hash) (*ethtypes.Block, error) + HeaderByNumber(ctx context.Context, number *big.Int) (*ethtypes.Header, error) + BlockByNumber(ctx context.Context, number *big.Int) (*ethtypes.Block, error) + HeaderByHash(ctx context.Context, hash ethcommon.Hash) (*ethtypes.Header, error) + SubscribeNewHead(ctx context.Context, ch chan<- *ethtypes.Header) (ethereum.Subscription, error) + TransactionCount(ctx context.Context, blockHash ethcommon.Hash) (uint, error) + TransactionInBlock(ctx context.Context, blockHash ethcommon.Hash, index uint) (*ethtypes.Transaction, error) + + // bind.ContractCaller + CodeAt(ctx context.Context, contract ethcommon.Address, blockNumber *big.Int) ([]byte, error) + CallContract(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) + + // bind.ContractTransactor + EstimateGas(ctx context.Context, call ethereum.CallMsg) (gas uint64, err error) + PendingCodeAt(ctx context.Context, account ethcommon.Address) ([]byte, error) + PendingNonceAt(ctx context.Context, account ethcommon.Address) (uint64, error) + SendTransaction(ctx context.Context, tx *ethtypes.Transaction) error + SuggestGasPrice(ctx context.Context) (*big.Int, error) + SuggestGasTipCap(ctx context.Context) (*big.Int, error) + + // bind.ContractFilterer + FilterLogs(ctx context.Context, query ethereum.FilterQuery) ([]ethtypes.Log, error) + SubscribeFilterLogs(ctx context.Context, query ethereum.FilterQuery, ch chan<- ethtypes.Log) (ethereum.Subscription, error) +} + +type ethClientWrapper struct { + clt ETHClient + + headerByNumberCache *expirable.LRU[string, *ethtypes.Header] +} + +func newEthClientWrapper(clt ETHClient) *ethClientWrapper { + return ðClientWrapper{ + clt: clt, + // arbitrary size of 100 blocks, kept for at most 10 minutes, + // let see later how to make this less hardcoded + headerByNumberCache: expirable.NewLRU[string, *ethtypes.Header](100, nil, 10*time.Minute), + } +} + +func (c *ethClientWrapper) ChainID(ctx context.Context) (*big.Int, error) { + metrics.EthereumRPCCallCounterInc("chain_id") + return c.clt.ChainID(ctx) +} + +func (c *ethClientWrapper) NetworkID(ctx context.Context) (*big.Int, error) { + metrics.EthereumRPCCallCounterInc("network_id") + return c.clt.NetworkID(ctx) +} + +func (c *ethClientWrapper) BlockByHash(ctx context.Context, hash ethcommon.Hash) (*ethtypes.Block, error) { + metrics.EthereumRPCCallCounterInc("block_by_hash") + return c.clt.BlockByHash(ctx, hash) +} + +func (c *ethClientWrapper) HeaderByNumber(ctx context.Context, number *big.Int) (*ethtypes.Header, error) { + if number != nil { + // first check the cache + if header, ok := c.headerByNumberCache.Get(number.String()); ok { + return ethtypes.CopyHeader(header), nil + } + } + + // cache miss, so let's inc the counter, and call the rpc. + metrics.EthereumRPCCallCounterInc("header_by_number") + header, err := c.clt.HeaderByNumber(ctx, number) + if err != nil { + return nil, err + } + + c.headerByNumberCache.Add(header.Number.String(), ethtypes.CopyHeader(header)) + + return header, nil +} + +func (c *ethClientWrapper) BlockByNumber(ctx context.Context, number *big.Int) (*ethtypes.Block, error) { + metrics.EthereumRPCCallCounterInc("block_by_number") + return c.clt.BlockByNumber(ctx, number) +} + +func (c *ethClientWrapper) HeaderByHash(ctx context.Context, hash ethcommon.Hash) (*ethtypes.Header, error) { + metrics.EthereumRPCCallCounterInc("header_by_hash") + return c.clt.HeaderByHash(ctx, hash) +} + +func (c *ethClientWrapper) SubscribeNewHead(ctx context.Context, ch chan<- *ethtypes.Header) (ethereum.Subscription, error) { + return c.clt.SubscribeNewHead(ctx, ch) +} + +func (c *ethClientWrapper) TransactionCount(ctx context.Context, blockHash ethcommon.Hash) (uint, error) { + metrics.EthereumRPCCallCounterInc("transaction_count") + return c.clt.TransactionCount(ctx, blockHash) +} + +func (c *ethClientWrapper) TransactionInBlock(ctx context.Context, blockHash ethcommon.Hash, index uint) (*ethtypes.Transaction, error) { + metrics.EthereumRPCCallCounterInc("transaction_in_block") + return c.clt.TransactionInBlock(ctx, blockHash, index) +} + +func (c *ethClientWrapper) CodeAt(ctx context.Context, contract ethcommon.Address, blockNumber *big.Int) ([]byte, error) { + metrics.EthereumRPCCallCounterInc("code_at") + return c.clt.CodeAt(ctx, contract, blockNumber) +} + +func (c *ethClientWrapper) CallContract(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) { + metrics.EthereumRPCCallCounterInc("call_contract") + return c.clt.CallContract(ctx, call, blockNumber) +} + +func (c *ethClientWrapper) EstimateGas(ctx context.Context, call ethereum.CallMsg) (gas uint64, err error) { + metrics.EthereumRPCCallCounterInc("estimate_gas") + return c.clt.EstimateGas(ctx, call) +} + +func (c *ethClientWrapper) PendingCodeAt(ctx context.Context, account ethcommon.Address) ([]byte, error) { + metrics.EthereumRPCCallCounterInc("pending_code_at") + return c.clt.PendingCodeAt(ctx, account) +} + +func (c *ethClientWrapper) PendingNonceAt(ctx context.Context, account ethcommon.Address) (uint64, error) { + metrics.EthereumRPCCallCounterInc("pending_nonce_at") + return c.clt.PendingNonceAt(ctx, account) +} + +func (c *ethClientWrapper) SendTransaction(ctx context.Context, tx *ethtypes.Transaction) error { + metrics.EthereumRPCCallCounterInc("send_transaction") + return c.clt.SendTransaction(ctx, tx) +} + +func (c *ethClientWrapper) SuggestGasPrice(ctx context.Context) (*big.Int, error) { + metrics.EthereumRPCCallCounterInc("suggest_gas_price") + return c.clt.SuggestGasPrice(ctx) +} + +func (c *ethClientWrapper) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { + metrics.EthereumRPCCallCounterInc("suggest_gas_tip_cap") + return c.clt.SuggestGasTipCap(ctx) +} + +func (c *ethClientWrapper) FilterLogs(ctx context.Context, query ethereum.FilterQuery) ([]ethtypes.Log, error) { + metrics.EthereumRPCCallCounterInc("filter_logs") + return c.clt.FilterLogs(ctx, query) +} + +func (c *ethClientWrapper) SubscribeFilterLogs(ctx context.Context, query ethereum.FilterQuery, ch chan<- ethtypes.Log) (ethereum.Subscription, error) { + metrics.EthereumRPCCallCounterInc("subscribe_filter_logs") + return c.clt.SubscribeFilterLogs(ctx, query, ch) +} diff --git a/core/datasource/external/ethcall/engine.go b/core/datasource/external/ethcall/engine.go index c9f8e41bf17..42aeb77559c 100644 --- a/core/datasource/external/ethcall/engine.go +++ b/core/datasource/external/ethcall/engine.go @@ -239,7 +239,7 @@ func (e *Engine) Poll(ctx context.Context, wallTime time.Time) { // Instead call methods on the engine that take the mutex for a small time where needed. // We do need to make use direct use of of e.log, e.client and e.forwarder; but these are static after creation // and the methods used are safe for concurrent access. - lastEthBlock, err := e.client.BlockByNumber(ctx, nil) + lastEthBlock, err := e.client.HeaderByNumber(ctx, nil) if err != nil { e.log.Error("failed to get current block header", logging.Error(err)) return @@ -247,41 +247,43 @@ func (e *Engine) Poll(ctx context.Context, wallTime time.Time) { e.log.Info("tick", logging.Time("wallTime", wallTime), - logging.BigInt("ethBlock", lastEthBlock.Number()), - logging.Time("ethTime", time.Unix(int64(lastEthBlock.Time()), 0))) + logging.BigInt("ethBlock", lastEthBlock.Number), + logging.Time("ethTime", time.Unix(int64(lastEthBlock.Time), 0))) // If the previous eth block has not been set, set it to the current eth block if e.prevEthBlock == nil { - e.prevEthBlock = blockIndex{number: lastEthBlock.NumberU64(), time: lastEthBlock.Time()} + e.prevEthBlock = blockIndex{number: lastEthBlock.Number.Uint64(), time: lastEthBlock.Time} } // Go through an eth blocks one at a time until we get to the most recent one - for prevEthBlock := e.prevEthBlock; prevEthBlock.NumberU64() < lastEthBlock.NumberU64(); prevEthBlock = e.prevEthBlock { + for prevEthBlock := e.prevEthBlock; prevEthBlock.NumberU64() < lastEthBlock.Number.Uint64(); prevEthBlock = e.prevEthBlock { nextBlockNum := big.NewInt(0).SetUint64(prevEthBlock.NumberU64() + 1) - nextEthBlock, err := e.client.BlockByNumber(ctx, nextBlockNum) + nextEthBlock, err := e.client.HeaderByNumber(ctx, nextBlockNum) if err != nil { e.log.Error("failed to get next block header", logging.Error(err)) return } + nextEthBlockIsh := blockIndex{number: nextEthBlock.Number.Uint64(), time: nextEthBlock.Time} + for specID, call := range e.getCalls() { - if call.triggered(prevEthBlock, nextEthBlock) { - res, err := call.Call(ctx, e.client, nextEthBlock.NumberU64()) + if call.triggered(prevEthBlock, nextEthBlockIsh) { + res, err := call.Call(ctx, e.client, nextEthBlock.Number.Uint64()) if err != nil { e.log.Error("failed to call contract", logging.Error(err)) - event := makeErrorChainEvent(err.Error(), specID, nextEthBlock) + event := makeErrorChainEvent(err.Error(), specID, nextEthBlockIsh) e.forwarder.ForwardFromSelf(event) continue } if res.PassesFilters { - event := makeChainEvent(res, specID, nextEthBlock) + event := makeChainEvent(res, specID, nextEthBlockIsh) e.forwarder.ForwardFromSelf(event) } } } - e.prevEthBlock = blockIndex{nextEthBlock.NumberU64(), nextEthBlock.Time()} + e.prevEthBlock = nextEthBlockIsh } } diff --git a/core/metrics/prometheus.go b/core/metrics/prometheus.go index d528627c50e..88df6f9c07d 100644 --- a/core/metrics/prometheus.go +++ b/core/metrics/prometheus.go @@ -52,6 +52,7 @@ var ( engineTime *prometheus.CounterVec orderCounter *prometheus.CounterVec dataSourceEthVerifierOnGoingCallCounter *prometheus.CounterVec + ethereumRPCCallCounter *prometheus.CounterVec ethCallCounter *prometheus.CounterVec evtForwardCounter *prometheus.CounterVec orderGauge *prometheus.GaugeVec @@ -395,6 +396,22 @@ func setupMetrics() error { } dataSourceEthVerifierOnGoingCallCounter = dataC + h, err = addInstrument( + Counter, + "ethereum_rpc_calls_total", + Namespace("vega"), + Vectors("endpoint"), + Help("Number of calls made to the ethereum RPC"), + ) + if err != nil { + return err + } + ethRPCC, err := h.CounterVec() + if err != nil { + return err + } + ethereumRPCCallCounter = ethRPCC + h, err = addInstrument( Counter, "eth_calls_total", @@ -591,6 +608,15 @@ func DataSourceEthVerifierCallCounterInc(labelValues ...string) { dataSourceEthVerifierOnGoingCallCounter.WithLabelValues(labelValues...).Inc() } +// EthereumRPCCallCounterInc increments the order counter. +func EthereumRPCCallCounterInc(labelValues ...string) { + if ethereumRPCCallCounter == nil { + return + } + ethereumRPCCallCounter.WithLabelValues("all").Inc() + ethereumRPCCallCounter.WithLabelValues(labelValues...).Inc() +} + // EthCallInc increments the eth call counter. func EthCallInc(labelValues ...string) { if ethCallCounter == nil { diff --git a/go.mod b/go.mod index bb858cb3d1b..f90ba3b7a0a 100644 --- a/go.mod +++ b/go.mod @@ -62,6 +62,7 @@ require ( github.com/google/go-github/v50 v50.0.0 github.com/gorilla/websocket v1.5.0 github.com/grpc-ecosystem/grpc-gateway/v2 v2.9.0 + github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf github.com/ipfs/boxo v0.8.1 github.com/ipfs/go-cid v0.4.1 @@ -147,7 +148,6 @@ require ( github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.2 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/huin/goupnp v1.1.0 // indirect github.com/ipfs/bbloom v0.0.4 // indirect diff --git a/go.sum b/go.sum index 94baea1e4ae..f8a05c1dd90 100644 --- a/go.sum +++ b/go.sum @@ -607,8 +607,8 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru/v2 v2.0.2 h1:Dwmkdr5Nc/oBiXgJS3CDHNhJtIHkuZ3DZF5twqnfBdU= -github.com/hashicorp/golang-lru/v2 v2.0.2/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= From 87e9452110dacfdfabd700e0ae1ea07c2c6c312f Mon Sep 17 00:00:00 2001 From: Valentin Trinque Date: Mon, 4 Dec 2023 15:51:02 +0100 Subject: [PATCH 05/10] fix: Denormalize tx_results to avoid joins with blocks when queried --- CHANGELOG.md | 1 + blockexplorer/entities/transaction.go | 22 +++---- .../0005_add_block_height_to_tx_result.sql | 42 ++++++++++++++ blockexplorer/store/transactions.go | 20 +++---- blockexplorer/store/transactions_test.go | 58 +++++++++---------- 5 files changed, 93 insertions(+), 50 deletions(-) create mode 100644 blockexplorer/store/migrations/0005_add_block_height_to_tx_result.sql diff --git a/CHANGELOG.md b/CHANGELOG.md index 14f468f7751..07b16b7a344 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -65,6 +65,7 @@ - [10205](https://github.com/vegaprotocol/vega/issues/10205) - Fix for transfer discount fees. - [10211](https://github.com/vegaprotocol/vega/issues/10211) - Ensure infra fees don't get counted for vesting. - [10217](https://github.com/vegaprotocol/vega/issues/10217) - Game ID for reward entity should be optional +- [10193](https://github.com/vegaprotocol/vega/issues/10193) - Denormalize `tx_results` to avoid joins with blocks when queried. ## 0.73.0 diff --git a/blockexplorer/entities/transaction.go b/blockexplorer/entities/transaction.go index c39f850d804..4979eb41d34 100644 --- a/blockexplorer/entities/transaction.go +++ b/blockexplorer/entities/transaction.go @@ -31,14 +31,14 @@ import ( ) type TxResultRow struct { - RowID int64 `db:"rowid"` - BlockID int64 `db:"block_id"` - Index int64 `db:"index"` - CreatedAt time.Time `db:"created_at"` - TxHash string `db:"tx_hash"` - TxResult []byte `db:"tx_result"` - Submitter string `db:"submitter"` - CmdType string `db:"cmd_type"` + RowID int64 `db:"rowid"` + BlockHeight int64 `db:"block_height"` + Index int64 `db:"index"` + CreatedAt time.Time `db:"created_at"` + TxHash string `db:"tx_hash"` + TxResult []byte `db:"tx_result"` + Submitter string `db:"submitter"` + CmdType string `db:"cmd_type"` } func (t *TxResultRow) ToProto() (*pb.Transaction, error) { @@ -65,7 +65,7 @@ func (t *TxResultRow) ToProto() (*pb.Transaction, error) { } return &pb.Transaction{ - Block: uint64(t.BlockID), + Block: uint64(t.BlockHeight), Index: uint32(t.Index), Type: extractAttribute(&txResult, "command", "type"), Submitter: extractAttribute(&txResult, "tx", "submitter"), @@ -83,7 +83,7 @@ func (t *TxResultRow) ToProto() (*pb.Transaction, error) { func (t *TxResultRow) Cursor() TxCursor { return TxCursor{ - BlockNumber: uint64(t.BlockID), + BlockNumber: uint64(t.BlockHeight), TxIndex: uint32(t.Index), } } @@ -123,7 +123,7 @@ func TxCursorFromString(s string) (TxCursor, error) { } return TxCursor{ - BlockNumber: blockNumber, // increase by one again to make the behaviour consistent + BlockNumber: blockNumber, TxIndex: uint32(txIndex), }, nil } diff --git a/blockexplorer/store/migrations/0005_add_block_height_to_tx_result.sql b/blockexplorer/store/migrations/0005_add_block_height_to_tx_result.sql new file mode 100644 index 00000000000..7c726f4dfa2 --- /dev/null +++ b/blockexplorer/store/migrations/0005_add_block_height_to_tx_result.sql @@ -0,0 +1,42 @@ +-- +goose Up + +-- make the block height nullable so tendermint can still insert and the +-- trigger takes over to set the value. +ALTER TABLE tx_results + ADD COLUMN IF NOT EXISTS block_height BIGINT DEFAULT 0; + +UPDATE tx_results +SET block_height=b.height +FROM blocks b +WHERE b.rowid = tx_results.block_id; + +-- +goose StatementBegin +CREATE OR REPLACE FUNCTION add_block_height_to_tx_results() + RETURNS TRIGGER + LANGUAGE plpgsql AS +$$ +BEGIN + UPDATE tx_results + SET block_height=b.height + FROM blocks b + WHERE b.rowid = NEW.block_id + AND tx_results.rowid = NEW.rowid; + + RETURN NULL; +END; +$$; +-- +goose StatementEnd + +CREATE TRIGGER add_block_height_to_tx_results + AFTER INSERT + ON tx_results + FOR EACH ROW +EXECUTE PROCEDURE add_block_height_to_tx_results(); + +-- +goose Down + +DROP TRIGGER IF EXISTS add_block_height_to_tx_results ON tx_results; + +ALTER TABLE tx_results + DROP COLUMN IF EXISTS block_height; + diff --git a/blockexplorer/store/transactions.go b/blockexplorer/store/transactions.go index cfbb477cf0b..c4f88341024 100644 --- a/blockexplorer/store/transactions.go +++ b/blockexplorer/store/transactions.go @@ -36,11 +36,11 @@ var ( func (s *Store) GetTransaction(ctx context.Context, txID string) (*pb.Transaction, error) { txID = strings.ToUpper(txID) - query := `SELECT t.rowid, b.height as block_id, t.index, t.created_at, t.tx_hash, t.tx_result, t.cmd_type, t.submitter FROM tx_results t JOIN blocks b ON t.block_id = b.rowid WHERE t.tx_hash=$1` + query := `SELECT t.rowid, t.block_id, t.index, t.created_at, t.tx_hash, t.tx_result, t.cmd_type, t.submitter FROM tx_results t WHERE t.tx_hash=$1` var rows []entities.TxResultRow if err := pgxscan.Select(ctx, s.pool, &rows, query, txID); err != nil { - return nil, fmt.Errorf("querying tx_results:%w", err) + return nil, fmt.Errorf("querying tx_results: %w", err) } if len(rows) == 0 { @@ -66,7 +66,7 @@ func (s *Store) ListTransactions(ctx context.Context, last uint32, before *entities.TxCursor, ) ([]*pb.Transaction, error) { - query := `SELECT t.rowid, b.height as block_id, t.index, t.created_at, t.tx_hash, t.tx_result, t.cmd_type, t.submitter FROM tx_results t JOIN blocks b ON t.block_id = b.rowid` + query := `SELECT t.rowid, t.block_height, t.index, t.created_at, t.tx_hash, t.tx_result, t.cmd_type, t.submitter FROM tx_results t` args := []interface{}{} predicates := []string{} @@ -81,7 +81,7 @@ func (s *Store) ListTransactions(ctx context.Context, if before != nil { block := nextBindVar(&args, before.BlockNumber) index := nextBindVar(&args, before.TxIndex) - predicate := fmt.Sprintf("(b.height, t.index) > (%s, %s)", block, index) + predicate := fmt.Sprintf("(t.block_height, t.index) > (%s, %s)", block, index) predicates = append(predicates, predicate) limit = last sortOrder = "asc" @@ -90,7 +90,7 @@ func (s *Store) ListTransactions(ctx context.Context, if after != nil { block := nextBindVar(&args, after.BlockNumber) index := nextBindVar(&args, after.TxIndex) - predicate := fmt.Sprintf("(b.height, t.index) < (%s, %s)", block, index) + predicate := fmt.Sprintf("(t.block_height, t.index) < (%s, %s)", block, index) predicates = append(predicates, predicate) } @@ -122,12 +122,12 @@ func (s *Store) ListTransactions(ctx context.Context, if key == "tx.submitter" { // tx.submitter is lifted out of attributes and into tx_results by a trigger for faster access - predicate = fmt.Sprintf("t.submitter=%s", nextBindVar(&args, value)) + predicate = fmt.Sprintf("t.submitter= %s", nextBindVar(&args, value)) } else if key == "cmd.type" { - predicate = fmt.Sprintf("t.cmd_type=%s", nextBindVar(&args, value)) + predicate = fmt.Sprintf("t.cmd_type= %s", nextBindVar(&args, value)) } else if key == "block.height" { // much quicker to filter block height by joining to the block table than looking in attributes - predicate = fmt.Sprintf("b.height = %s", nextBindVar(&args, value)) + predicate = fmt.Sprintf("t.block_height = %s", nextBindVar(&args, value)) } else { predicate = fmt.Sprintf(` EXISTS (SELECT 1 FROM events e JOIN attributes a ON e.rowid = a.event_id @@ -142,12 +142,12 @@ func (s *Store) ListTransactions(ctx context.Context, query = fmt.Sprintf("%s WHERE %s", query, strings.Join(predicates, " AND ")) } - query = fmt.Sprintf("%s ORDER BY t.block_id %s, t.index %s", query, sortOrder, sortOrder) + query = fmt.Sprintf("%s ORDER BY t.block_height %s, t.index %s", query, sortOrder, sortOrder) query = fmt.Sprintf("%s LIMIT %d", query, limit) var rows []entities.TxResultRow if err := pgxscan.Select(ctx, s.pool, &rows, query, args...); err != nil { - return nil, fmt.Errorf("querying tx_results:%w", err) + return nil, fmt.Errorf("querying tx_results: %w", err) } txs := make([]*pb.Transaction, 0, len(rows)) diff --git a/blockexplorer/store/transactions_test.go b/blockexplorer/store/transactions_test.go index 0b402adab57..094ebe6a805 100644 --- a/blockexplorer/store/transactions_test.go +++ b/blockexplorer/store/transactions_test.go @@ -18,6 +18,7 @@ package store_test import ( "bytes" "context" + "fmt" "io/fs" "os" "path/filepath" @@ -50,12 +51,12 @@ func TestMain(m *testing.M) { tempDir, err := os.MkdirTemp("", "block_explorer") if err != nil { - panic(err) + panic(fmt.Errorf("could not create temporary root directory for block_explorer tests: %w", err)) } postgresRuntimePath = filepath.Join(tempDir, "sqlstore") err = os.Mkdir(postgresRuntimePath, fs.ModePerm) if err != nil { - panic(err) + panic(fmt.Errorf("could not create temporary directory for postgres runtime: %w", err)) } defer os.RemoveAll(postgresRuntimePath) @@ -117,39 +118,38 @@ type txResult struct { func addTestTxResults(ctx context.Context, t *testing.T, txResults ...txResult) []*pb.Transaction { t.Helper() + conn := connectionSource.Connection rows := make([]*pb.Transaction, 0, len(txResults)) blockIDs := make(map[int64]int64) + blockSQL := `INSERT INTO blocks (height, chain_id, created_at) VALUES ($1, $2, $3) ON CONFLICT (height, chain_id) DO UPDATE SET created_at = EXCLUDED.created_at RETURNING rowid` + resultSQL := `INSERT INTO tx_results (block_id, index, created_at, tx_hash, tx_result, submitter, cmd_type) VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING rowid` + for _, txr := range txResults { var blockID int64 var ok bool - blockSQL := `INSERT INTO blocks (height, chain_id, created_at) VALUES ($1, $2, $3) ON CONFLICT (height, chain_id) DO UPDATE SET created_at = EXCLUDED.created_at RETURNING rowid` - resultSQL := `INSERT INTO tx_results (block_id, index, created_at, tx_hash, tx_result, submitter, cmd_type) VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING rowid` - if blockID, ok = blockIDs[txr.height]; !ok { - err := conn.QueryRow(ctx, blockSQL, txr.height, "test-chain", txr.createdAt).Scan(&blockID) - require.NoError(t, err) + require.NoError(t, conn.QueryRow(ctx, blockSQL, txr.height, "test-chain", txr.createdAt).Scan(&blockID)) blockIDs[txr.height] = blockID } - row := entities.TxResultRow{ - BlockID: blockID, - Index: txr.index, - CreatedAt: txr.createdAt, - TxHash: txr.txHash, - TxResult: txr.txResult, - Submitter: txr.submitter, - CmdType: txr.cmdType, - } + index := txr.index var rowID int64 + require.NoError(t, conn.QueryRow(ctx, resultSQL, blockID, index, txr.createdAt, txr.txHash, txr.txResult, txr.submitter, txr.cmdType).Scan(&rowID)) - err := conn.QueryRow(ctx, resultSQL, blockID, txr.index, txr.createdAt, txr.txHash, txr.txResult, txr.submitter, txr.cmdType).Scan(&rowID) - require.NoError(t, err) - row.RowID = rowID - row.BlockID = txr.height + row := entities.TxResultRow{ + RowID: rowID, + BlockHeight: txr.height, + Index: index, + CreatedAt: txr.createdAt, + TxHash: txr.txHash, + TxResult: txr.txResult, + Submitter: txr.submitter, + CmdType: txr.cmdType, + } proto, err := row.ToProto() require.NoError(t, err) @@ -190,7 +190,7 @@ func setupTestTransactions(ctx context.Context, t *testing.T) []*pb.Transaction height: 1, index: 1, createdAt: now.Add(1 * time.Second), - txHash: "deadbeef03", + txHash: "deadbeef11", txResult: txr, submitter: "TEST", cmdType: "TEST", @@ -199,7 +199,7 @@ func setupTestTransactions(ctx context.Context, t *testing.T) []*pb.Transaction height: 2, index: 1, createdAt: now.Add(2 * time.Second), - txHash: "deadbeef04", + txHash: "deadbeef21", txResult: txr, submitter: "TEST", cmdType: "TEST", @@ -208,7 +208,7 @@ func setupTestTransactions(ctx context.Context, t *testing.T) []*pb.Transaction height: 2, index: 2, createdAt: now.Add(2*time.Second + 50), - txHash: "deadbeef05", + txHash: "deadbeef22", txResult: txr, submitter: "TEST", cmdType: "TEST", @@ -217,7 +217,7 @@ func setupTestTransactions(ctx context.Context, t *testing.T) []*pb.Transaction height: 2, index: 4, createdAt: now.Add(2*time.Second + 700), - txHash: "deadbeef06", + txHash: "deadbeef24", txResult: txr, submitter: "TEST", cmdType: "TEST", @@ -226,7 +226,7 @@ func setupTestTransactions(ctx context.Context, t *testing.T) []*pb.Transaction height: 3, index: 1, createdAt: now.Add(3 * time.Second), - txHash: "deadbeef07", + txHash: "deadbeef31", txResult: txr, submitter: "TEST", cmdType: "TEST", @@ -235,7 +235,7 @@ func setupTestTransactions(ctx context.Context, t *testing.T) []*pb.Transaction height: 4, index: 1, createdAt: now.Add(4 * time.Second), - txHash: "deadbeef08", + txHash: "deadbeef41", txResult: txr, submitter: "TEST", cmdType: "TEST", @@ -244,7 +244,7 @@ func setupTestTransactions(ctx context.Context, t *testing.T) []*pb.Transaction height: 5, index: 1, createdAt: now.Add(5 * time.Second), - txHash: "deadbeef09", + txHash: "deadbeef51", txResult: txr, submitter: "TEST", cmdType: "TEST", @@ -253,7 +253,7 @@ func setupTestTransactions(ctx context.Context, t *testing.T) []*pb.Transaction height: 6, index: 1, createdAt: now.Add(6 * time.Second), - txHash: "deadbeef10", + txHash: "deadbeef61", txResult: txr, submitter: "TEST", cmdType: "TEST", @@ -265,7 +265,7 @@ func setupTestTransactions(ctx context.Context, t *testing.T) []*pb.Transaction func TestStore_ListTransactions(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), postgresServerTimeout) - defer cancel() + t.Cleanup(cancel) inserted := setupTestTransactions(ctx, t) From 6d6a78ab6a0be729a5bf11c4032c0610a6403deb Mon Sep 17 00:00:00 2001 From: Tan Quach Date: Wed, 6 Dec 2023 18:21:35 +0000 Subject: [PATCH 06/10] feat: add more candle intervals --- CHANGELOG.md | 1 + .../gateway/graphql/connection_handlers.go | 10 + datanode/gateway/graphql/helpers_enum.go | 10 + datanode/gateway/graphql/schema.graphql | 16 +- datanode/networkhistory/service_test.go | 17 +- datanode/sqlstore/candles_test.go | 2 +- .../0061_additional_candle_intervals.sql | 114 +++ datanode/sqlstore/sqlstore.go | 5 + protos/sources/vega/vega.proto | 10 + protos/vega/vega.pb.go | 868 +++++++++--------- 10 files changed, 619 insertions(+), 434 deletions(-) create mode 100644 datanode/sqlstore/migrations/0061_additional_candle_intervals.sql diff --git a/CHANGELOG.md b/CHANGELOG.md index 07b16b7a344..13fcc5bfefa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ - [9983](https://github.com/vegaprotocol/vega/issues/9983) - Implement cap and discount for transfer fees. - [9257](https://github.com/vegaprotocol/vega/issues/9257) - Add games details API - [9260](https://github.com/vegaprotocol/vega/issues/9260) - Enhance rewards API for competitions +- [10180](https://github.com/vegaprotocol/vega/issues/10180) - Additional candle intervals ### 🐛 Fixes diff --git a/datanode/gateway/graphql/connection_handlers.go b/datanode/gateway/graphql/connection_handlers.go index 213b6692d73..f2c9969f7e6 100644 --- a/datanode/gateway/graphql/connection_handlers.go +++ b/datanode/gateway/graphql/connection_handlers.go @@ -101,12 +101,22 @@ func toV2IntervalString(interval vega.Interval) (string, error) { return "5 minutes", nil case vega.Interval_INTERVAL_I15M: return "15 minutes", nil + case vega.Interval_INTERVAL_I30M: + return "30 minutes", nil case vega.Interval_INTERVAL_I1H: return "1 hour", nil + case vega.Interval_INTERVAL_I4H: + return "4 hours", nil case vega.Interval_INTERVAL_I6H: return "6 hours", nil + case vega.Interval_INTERVAL_I8H: + return "8 hours", nil + case vega.Interval_INTERVAL_I12H: + return "12 hours", nil case vega.Interval_INTERVAL_I1D: return "1 day", nil + case vega.Interval_INTERVAL_I7D: + return "7 days", nil default: return "", fmt.Errorf("interval not support:%s", interval) } diff --git a/datanode/gateway/graphql/helpers_enum.go b/datanode/gateway/graphql/helpers_enum.go index 6a47309347a..17de7d99840 100644 --- a/datanode/gateway/graphql/helpers_enum.go +++ b/datanode/gateway/graphql/helpers_enum.go @@ -31,12 +31,22 @@ func convertDataNodeIntervalToProto(interval string) (types.Interval, error) { return types.Interval_INTERVAL_I5M, nil case "15 minutes": return types.Interval_INTERVAL_I15M, nil + case "30 minutes": + return types.Interval_INTERVAL_I30M, nil case "1 hour": return types.Interval_INTERVAL_I1H, nil + case "4 hours": + return types.Interval_INTERVAL_I4H, nil case "6 hours": return types.Interval_INTERVAL_I6H, nil + case "8 hours": + return types.Interval_INTERVAL_I8H, nil + case "12 hours": + return types.Interval_INTERVAL_I12H, nil case "1 day": return types.Interval_INTERVAL_I1D, nil + case "7 days": + return types.Interval_INTERVAL_I7D, nil default: err := fmt.Errorf("failed to convert Interval from GraphQL to Proto: %v", interval) return types.Interval_INTERVAL_UNSPECIFIED, err diff --git a/datanode/gateway/graphql/schema.graphql b/datanode/gateway/graphql/schema.graphql index 54a0f31fdcd..17f9b269bda 100644 --- a/datanode/gateway/graphql/schema.graphql +++ b/datanode/gateway/graphql/schema.graphql @@ -4047,24 +4047,28 @@ enum Side { enum Interval { "The block interval is not a fixed amount of time, rather it used to indicate grouping of events that occur in a single block. It is usually about a second." INTERVAL_BLOCK - "1 minute interval" INTERVAL_I1M - "5 minute interval" INTERVAL_I5M - "15 minute interval (default)" INTERVAL_I15M - + "30 minute interval" + INTERVAL_I30M "1 hour interval" INTERVAL_I1H - + "4 hour interval" + INTERVAL_I4H "6 hour interval" INTERVAL_I6H - + "8 hour interval" + INTERVAL_I8H + "12 hour interval" + INTERVAL_I12H "1 day interval" INTERVAL_I1D + "7 day interval" + INTERVAL_I7D } "The various account types in Vega (used by collateral)" diff --git a/datanode/networkhistory/service_test.go b/datanode/networkhistory/service_test.go index 139c13e5ce3..d2eb046e476 100644 --- a/datanode/networkhistory/service_test.go +++ b/datanode/networkhistory/service_test.go @@ -379,12 +379,12 @@ func TestMain(t *testing.M) { log.Infof("%s", goldenSourceHistorySegment[4000].HistorySegmentID) log.Infof("%s", goldenSourceHistorySegment[5000].HistorySegmentID) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[1000].HistorySegmentID, "QmXgqxv7LPron9hrKywkAaArVELQCqX4dBudatgjRFoLDj", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2000].HistorySegmentID, "QmVGzmonWCZHYcauWQmBXnUSHWXm4CEiiPFtdd2WPunAsR", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2500].HistorySegmentID, "QmZ5u2VDJE9UMwvb5sY1ZTvbHnfcRjUs1TJVLWUjNAH7NW", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[3000].HistorySegmentID, "QmRmWJyqENDpnpykf2cLEAoe67xyRPn5dnKWbksQEMR8aA", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[4000].HistorySegmentID, "Qmdb8ktSLs2FboAouHSzJWDLCEWi7ZUboh9Htjj2wFUG3P", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[5000].HistorySegmentID, "QmNsg4BJCUoTzKGEfGoDvgvVnsWRqHqUnQEJCPfqDGCdvV", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[1000].HistorySegmentID, "QmcjD1fnd9SHMHMQbvuwXvviPMK7FVtAdUceKLneUqYSnB", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2000].HistorySegmentID, "QmNvRrYTJZJowszhNN7LVSLSoKdh2XYEfGfojAx1kUKW49", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2500].HistorySegmentID, "QmRd5SgTTi7Sy9qL4MGuRfAGDux3aGYWkrZ3kLZnMr6SWd", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[3000].HistorySegmentID, "QmNZ7hR3tbpFA3EvhW6shoRDLnVdwKdPT8qteCvrERRz6c", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[4000].HistorySegmentID, "Qmf4HRZKum31r9LSP5CDKhV1hsAdeHwVpbtozsbWvAS2S4", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[5000].HistorySegmentID, "QmRuzTpwy3JJZwn2L6opiCe177i74dWXgxhA1KZFodwFU9", snapshots) }, postgresRuntimePath, sqlFs) if exitCode != 0 { @@ -1465,6 +1465,11 @@ func getDatabaseDataSummary(ctx context.Context, connConfig sqlstore.ConnectionC "trades_candle_1_minute": "market_id, period_start", "trades_candle_5_minutes": "market_id, period_start", "trades_candle_6_hours": "market_id, period_start", + "trades_candle_30_minutes": "market_id, period_start", + "trades_candle_4_hours": "market_id, period_start", + "trades_candle_8_hours": "market_id, period_start", + "trades_candle_12_hours": "market_id, period_start", + "trades_candle_7_days": "market_id, period_start", } caggSummaries := map[string]tableDataSummary{} diff --git a/datanode/sqlstore/candles_test.go b/datanode/sqlstore/candles_test.go index b2997502225..8e8581e13c7 100644 --- a/datanode/sqlstore/candles_test.go +++ b/datanode/sqlstore/candles_test.go @@ -53,7 +53,7 @@ func TestGetExistingCandles(t *testing.T) { t.Fatalf("failed to get candles for market:%s", err) } - defaultCandles := "block,1 minute,5 minutes,15 minutes,1 hour,6 hours,1 day" + defaultCandles := "block,1 minute,5 minutes,15 minutes,30 minutes,1 hour,4 hours,6 hours,8 hours,12 hours,1 day,7 days" intervals := strings.Split(defaultCandles, ",") assert.Equal(t, len(intervals), len(candles)) diff --git a/datanode/sqlstore/migrations/0061_additional_candle_intervals.sql b/datanode/sqlstore/migrations/0061_additional_candle_intervals.sql new file mode 100644 index 00000000000..3be58c00b3f --- /dev/null +++ b/datanode/sqlstore/migrations/0061_additional_candle_intervals.sql @@ -0,0 +1,114 @@ +-- +goose Up + +CREATE MATERIALIZED VIEW trades_candle_30_minutes + WITH (timescaledb.continuous) AS +SELECT market_id, time_bucket('30 minute', synthetic_time) AS period_start, + first(price, synthetic_time) AS open, + last(price, synthetic_time) AS close, + max(price) AS high, + min(price) AS low, + sum(size) AS volume, + sum(size * price) as notional, + last(synthetic_time, + synthetic_time) AS last_update_in_period +FROM trades +GROUP BY market_id, period_start WITH NO DATA; + +-- start_offset is set to a day, as data is append only this does not impact the processing time and ensures +-- that the CAGG data will be correct on recovery in the event of a transient outage ( < 1 day ) +SELECT add_continuous_aggregate_policy('trades_candle_30_minutes', start_offset => INTERVAL '1 day', end_offset => INTERVAL '30 minutes', schedule_interval => INTERVAL '30 minutes'); + +CREATE MATERIALIZED VIEW trades_candle_4_hours + WITH (timescaledb.continuous) AS +SELECT market_id, time_bucket('4 hours', synthetic_time) AS period_start, + first(price, synthetic_time) AS open, + last(price, synthetic_time) AS close, + max(price) AS high, + min(price) AS low, + sum(size) AS volume, + sum(size * price) as notional, + last(synthetic_time, + synthetic_time) AS last_update_in_period +FROM trades +GROUP BY market_id, period_start WITH NO DATA; + +-- start_offset is set to a day, as data is append only this does not impact the processing time and ensures +-- that the CAGG data will be correct on recovery in the event of a transient outage ( < 1 day ) +SELECT add_continuous_aggregate_policy('trades_candle_4_hours', start_offset => INTERVAL '1 day', end_offset => INTERVAL '4 hours', schedule_interval => INTERVAL '4 hours'); + +CREATE MATERIALIZED VIEW trades_candle_8_hours + WITH (timescaledb.continuous) AS +SELECT market_id, time_bucket('8 hours', synthetic_time) AS period_start, + first(price, synthetic_time) AS open, + last(price, synthetic_time) AS close, + max(price) AS high, + min(price) AS low, + sum(size) AS volume, + sum(size * price) as notional, + last(synthetic_time, + synthetic_time) AS last_update_in_period +FROM trades +GROUP BY market_id, period_start WITH NO DATA; + +-- start_offset is set to a day, as data is append only this does not impact the processing time and ensures +-- that the CAGG data will be correct on recovery in the event of a transient outage ( < 1 day ) +SELECT add_continuous_aggregate_policy('trades_candle_8_hours', start_offset => INTERVAL '1 day', end_offset => INTERVAL '8 hours', schedule_interval => INTERVAL '8 hours'); + +CREATE MATERIALIZED VIEW trades_candle_12_hours + WITH (timescaledb.continuous) AS +SELECT market_id, time_bucket('12 hours', synthetic_time) AS period_start, + first(price, synthetic_time) AS open, + last(price, synthetic_time) AS close, + max(price) AS high, + min(price) AS low, + sum(size) AS volume, + sum(size * price) as notional, + last(synthetic_time, + synthetic_time) AS last_update_in_period +FROM trades +GROUP BY market_id, period_start WITH NO DATA; + +-- start_offset is set to a day, as data is append only this does not impact the processing time and ensures +-- that the CAGG data will be correct on recovery in the event of a transient outage ( < 1 day ) +SELECT add_continuous_aggregate_policy('trades_candle_12_hours', start_offset => INTERVAL '2 days', end_offset => INTERVAL '12 hours', schedule_interval => INTERVAL '12 hours'); + +CREATE MATERIALIZED VIEW trades_candle_7_days + WITH (timescaledb.continuous) AS +SELECT market_id, time_bucket('7 days', synthetic_time) AS period_start, + first(price, synthetic_time) AS open, + last(price, synthetic_time) AS close, + max(price) AS high, + min(price) AS low, + sum(size) AS volume, + sum(size * price) as notional, + last(synthetic_time, + synthetic_time) AS last_update_in_period +FROM trades +GROUP BY market_id, period_start WITH NO DATA; + +-- start_offset is set to a day, as data is append only this does not impact the processing time and ensures +-- that the CAGG data will be correct on recovery in the event of a transient outage ( < 1 day ) +SELECT add_continuous_aggregate_policy('trades_candle_7_days', start_offset => INTERVAL '21 days', end_offset => INTERVAL '7 days', schedule_interval => INTERVAL '7 days'); + + + +-- +goose Down +SELECT remove_continuous_aggregate_policy('trades_candle_7_days', true); + +DROP MATERIALIZED VIEW trades_candle_7_days; + +SELECT remove_continuous_aggregate_policy('trades_candle_12_hours', true); + +DROP MATERIALIZED VIEW trades_candle_12_hours; + +SELECT remove_continuous_aggregate_policy('trades_candle_8_hours', true); + +DROP MATERIALIZED VIEW trades_candle_8_hours; + +SELECT remove_continuous_aggregate_policy('trades_candle_4_hours', true); + +DROP MATERIALIZED VIEW trades_candle_4_hours; + +SELECT remove_continuous_aggregate_policy('trades_candle_30_minutes', true); + +DROP MATERIALIZED VIEW trades_candle_30_minutes; diff --git a/datanode/sqlstore/sqlstore.go b/datanode/sqlstore/sqlstore.go index 74009266033..24afbba91bc 100644 --- a/datanode/sqlstore/sqlstore.go +++ b/datanode/sqlstore/sqlstore.go @@ -61,9 +61,14 @@ var defaultRetentionPolicies = map[RetentionPeriod][]RetentionPolicy{ {HypertableOrCaggName: "trades_candle_1_minute", DataRetentionPeriod: "1 month"}, {HypertableOrCaggName: "trades_candle_5_minutes", DataRetentionPeriod: "1 month"}, {HypertableOrCaggName: "trades_candle_15_minutes", DataRetentionPeriod: "1 month"}, + {HypertableOrCaggName: "trades_candle_30_minutes", DataRetentionPeriod: "2 months"}, {HypertableOrCaggName: "trades_candle_1_hour", DataRetentionPeriod: "1 year"}, + {HypertableOrCaggName: "trades_candle_4_hours", DataRetentionPeriod: "1 year"}, {HypertableOrCaggName: "trades_candle_6_hours", DataRetentionPeriod: "1 year"}, + {HypertableOrCaggName: "trades_candle_8_hours", DataRetentionPeriod: "1 year"}, + {HypertableOrCaggName: "trades_candle_12_hours", DataRetentionPeriod: "1 year"}, {HypertableOrCaggName: "trades_candle_1_day", DataRetentionPeriod: "1 year"}, + {HypertableOrCaggName: "trades_candle_7_days", DataRetentionPeriod: "10 years"}, {HypertableOrCaggName: "market_data", DataRetentionPeriod: "7 days"}, {HypertableOrCaggName: "margin_levels", DataRetentionPeriod: "7 days"}, {HypertableOrCaggName: "conflated_margin_levels", DataRetentionPeriod: "1 year"}, diff --git a/protos/sources/vega/vega.proto b/protos/sources/vega/vega.proto index f90dc83d5ab..a573776ce0e 100644 --- a/protos/sources/vega/vega.proto +++ b/protos/sources/vega/vega.proto @@ -122,12 +122,22 @@ enum Interval { INTERVAL_I5M = 300; // 15 minutes. INTERVAL_I15M = 900; + // 30 minutes. + INTERVAL_I30M = 1800; // 1 hour. INTERVAL_I1H = 3600; + // 4 hours. + INTERVAL_I4H = 14400; // 6 hours. INTERVAL_I6H = 21600; + // 8 hours. + INTERVAL_I8H = 28800; + // 12 hours. + INTERVAL_I12H = 43200; // 1 day. INTERVAL_I1D = 86400; + // 7 days. + INTERVAL_I7D = 604800; // Note: If adding an enum value, add a matching entry in: // - gateway/graphql/helpers_enum.go diff --git a/protos/vega/vega.pb.go b/protos/vega/vega.pb.go index b4d9b9736a8..aab7309adc0 100644 --- a/protos/vega/vega.pb.go +++ b/protos/vega/vega.pb.go @@ -87,25 +87,40 @@ const ( Interval_INTERVAL_I5M Interval = 300 // 15 minutes. Interval_INTERVAL_I15M Interval = 900 + // 30 minutes. + Interval_INTERVAL_I30M Interval = 1800 // 1 hour. Interval_INTERVAL_I1H Interval = 3600 + // 4 hours. + Interval_INTERVAL_I4H Interval = 14400 // 6 hours. Interval_INTERVAL_I6H Interval = 21600 + // 8 hours. + Interval_INTERVAL_I8H Interval = 28800 + // 12 hours. + Interval_INTERVAL_I12H Interval = 43200 // 1 day. Interval_INTERVAL_I1D Interval = 86400 + // 7 days. + Interval_INTERVAL_I7D Interval = 604800 ) // Enum value maps for Interval. var ( Interval_name = map[int32]string{ - 0: "INTERVAL_UNSPECIFIED", - -1: "INTERVAL_BLOCK", - 60: "INTERVAL_I1M", - 300: "INTERVAL_I5M", - 900: "INTERVAL_I15M", - 3600: "INTERVAL_I1H", - 21600: "INTERVAL_I6H", - 86400: "INTERVAL_I1D", + 0: "INTERVAL_UNSPECIFIED", + -1: "INTERVAL_BLOCK", + 60: "INTERVAL_I1M", + 300: "INTERVAL_I5M", + 900: "INTERVAL_I15M", + 1800: "INTERVAL_I30M", + 3600: "INTERVAL_I1H", + 14400: "INTERVAL_I4H", + 21600: "INTERVAL_I6H", + 28800: "INTERVAL_I8H", + 43200: "INTERVAL_I12H", + 86400: "INTERVAL_I1D", + 604800: "INTERVAL_I7D", } Interval_value = map[string]int32{ "INTERVAL_UNSPECIFIED": 0, @@ -113,9 +128,14 @@ var ( "INTERVAL_I1M": 60, "INTERVAL_I5M": 300, "INTERVAL_I15M": 900, + "INTERVAL_I30M": 1800, "INTERVAL_I1H": 3600, + "INTERVAL_I4H": 14400, "INTERVAL_I6H": 21600, + "INTERVAL_I8H": 28800, + "INTERVAL_I12H": 43200, "INTERVAL_I1D": 86400, + "INTERVAL_I7D": 604800, } ) @@ -10105,432 +10125,438 @@ var file_vega_vega_proto_rawDesc = []byte{ 0x0a, 0x10, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x42, 0x55, 0x59, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x45, 0x4c, 0x4c, 0x10, - 0x02, 0x2a, 0xb5, 0x01, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x18, + 0x02, 0x2a, 0x99, 0x02, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x0e, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x31, 0x4d, 0x10, 0x3c, 0x12, 0x11, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x35, 0x4d, 0x10, 0xac, 0x02, 0x12, 0x12, 0x0a, 0x0d, 0x49, 0x4e, - 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x31, 0x35, 0x4d, 0x10, 0x84, 0x07, 0x12, 0x11, - 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x31, 0x48, 0x10, 0x90, - 0x1c, 0x12, 0x12, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x36, - 0x48, 0x10, 0xe0, 0xa8, 0x01, 0x12, 0x12, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, - 0x4c, 0x5f, 0x49, 0x31, 0x44, 0x10, 0x80, 0xa3, 0x05, 0x2a, 0x94, 0x01, 0x0a, 0x0e, 0x50, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x1b, - 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, - 0x1d, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x53, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x01, - 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x5f, 0x4f, 0x55, 0x54, 0x10, 0x02, - 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x45, 0x53, 0x53, 0x45, 0x44, 0x10, 0x04, - 0x2a, 0xb0, 0x02, 0x0a, 0x0e, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, - 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x42, 0x41, 0x54, 0x43, 0x48, 0x10, 0x01, 0x12, - 0x1b, 0x0a, 0x17, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, - 0x45, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, + 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x31, 0x35, 0x4d, 0x10, 0x84, 0x07, 0x12, 0x12, + 0x0a, 0x0d, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x33, 0x30, 0x4d, 0x10, + 0x88, 0x0e, 0x12, 0x11, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, + 0x31, 0x48, 0x10, 0x90, 0x1c, 0x12, 0x11, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, + 0x4c, 0x5f, 0x49, 0x34, 0x48, 0x10, 0xc0, 0x70, 0x12, 0x12, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, + 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x36, 0x48, 0x10, 0xe0, 0xa8, 0x01, 0x12, 0x12, 0x0a, 0x0c, + 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x38, 0x48, 0x10, 0x80, 0xe1, 0x01, + 0x12, 0x13, 0x0a, 0x0d, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x31, 0x32, + 0x48, 0x10, 0xc0, 0xd1, 0x02, 0x12, 0x12, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, + 0x4c, 0x5f, 0x49, 0x31, 0x44, 0x10, 0x80, 0xa3, 0x05, 0x12, 0x12, 0x0a, 0x0c, 0x49, 0x4e, 0x54, + 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x37, 0x44, 0x10, 0x80, 0xf5, 0x24, 0x2a, 0x94, 0x01, + 0x0a, 0x0e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x1f, 0x0a, 0x1b, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x53, 0x5f, 0x43, 0x4c, 0x4f, 0x53, + 0x45, 0x44, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x5f, 0x4f, + 0x55, 0x54, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x45, 0x53, 0x53, + 0x45, 0x44, 0x10, 0x04, 0x2a, 0xb0, 0x02, 0x0a, 0x0e, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x55, 0x43, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x55, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x42, 0x41, 0x54, 0x43, + 0x48, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, + 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, + 0x12, 0x19, 0x0a, 0x15, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, + 0x47, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x1d, 0x0a, 0x19, 0x41, + 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x4c, + 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x10, 0x04, 0x12, 0x2c, 0x0a, 0x28, 0x41, 0x55, + 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x4c, 0x49, + 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x4e, + 0x4f, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x10, 0x05, 0x12, 0x32, 0x0a, 0x2a, 0x41, 0x55, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x42, + 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x5f, 0x4c, 0x50, 0x5f, + 0x4f, 0x52, 0x44, 0x45, 0x52, 0x53, 0x10, 0x06, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x29, 0x0a, 0x25, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, - 0x50, 0x52, 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x55, 0x43, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, - 0x44, 0x49, 0x54, 0x59, 0x10, 0x04, 0x12, 0x2c, 0x0a, 0x28, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, - 0x49, 0x54, 0x59, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x4d, - 0x45, 0x54, 0x10, 0x05, 0x12, 0x32, 0x0a, 0x2a, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x54, - 0x4f, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x5f, 0x4c, 0x50, 0x5f, 0x4f, 0x52, 0x44, 0x45, - 0x52, 0x53, 0x10, 0x06, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x29, 0x0a, 0x25, 0x41, 0x55, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x47, 0x4f, 0x56, 0x45, - 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, 0x53, 0x49, 0x4f, - 0x4e, 0x10, 0x07, 0x2a, 0x8b, 0x01, 0x0a, 0x0f, 0x50, 0x65, 0x67, 0x67, 0x65, 0x64, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x1c, 0x50, 0x45, 0x47, 0x47, 0x45, - 0x44, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x45, 0x47, - 0x47, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x4d, 0x49, - 0x44, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x52, 0x45, - 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x42, 0x45, 0x53, 0x54, 0x5f, 0x42, 0x49, 0x44, - 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x46, - 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x42, 0x45, 0x53, 0x54, 0x5f, 0x41, 0x53, 0x4b, 0x10, - 0x03, 0x2a, 0xc9, 0x10, 0x0a, 0x0a, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x12, 0x1b, 0x0a, 0x17, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, - 0x1d, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x49, 0x44, 0x10, 0x01, - 0x12, 0x20, 0x0a, 0x1c, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, - 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x49, 0x44, - 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, 0x5f, 0x53, 0x45, 0x51, 0x55, 0x45, 0x4e, 0x43, - 0x45, 0x10, 0x03, 0x12, 0x26, 0x0a, 0x22, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x52, 0x45, 0x4d, 0x41, 0x49, - 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x04, 0x12, 0x1c, 0x0a, 0x18, 0x4f, - 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, - 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x05, 0x12, 0x1f, 0x0a, 0x1b, 0x4f, 0x52, 0x44, - 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x41, 0x4c, - 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x06, 0x12, 0x2b, 0x0a, 0x27, 0x4f, 0x52, - 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x41, 0x54, - 0x45, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x07, 0x12, 0x27, 0x0a, 0x23, 0x4f, 0x52, 0x44, 0x45, 0x52, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4f, - 0x52, 0x44, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x10, 0x08, - 0x12, 0x20, 0x0a, 0x1c, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, - 0x45, 0x44, 0x49, 0x54, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, - 0x10, 0x09, 0x12, 0x1d, 0x0a, 0x19, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x5f, 0x41, 0x4d, 0x45, 0x4e, 0x44, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, - 0x0a, 0x12, 0x19, 0x0a, 0x15, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x0b, 0x12, 0x20, 0x0a, 0x1c, - 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x5f, 0x49, 0x44, 0x10, 0x0c, 0x12, 0x1d, - 0x0a, 0x19, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x41, - 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x0d, 0x12, 0x23, 0x0a, - 0x1f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x41, 0x52, - 0x47, 0x49, 0x4e, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, - 0x10, 0x0e, 0x12, 0x27, 0x0a, 0x23, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, - 0x4c, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x0f, 0x12, 0x1e, 0x0a, 0x1a, 0x4f, - 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, - 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, 0x4f, + 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, + 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x2a, 0x8b, 0x01, 0x0a, 0x0f, 0x50, 0x65, 0x67, 0x67, + 0x65, 0x64, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x1c, 0x50, + 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, + 0x14, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, + 0x45, 0x5f, 0x4d, 0x49, 0x44, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x45, 0x47, 0x47, 0x45, + 0x44, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x42, 0x45, 0x53, 0x54, + 0x5f, 0x42, 0x49, 0x44, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, + 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x42, 0x45, 0x53, 0x54, 0x5f, + 0x41, 0x53, 0x4b, 0x10, 0x03, 0x2a, 0xc9, 0x10, 0x0a, 0x0a, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1b, 0x0a, 0x17, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, + 0x49, 0x44, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, + 0x52, 0x5f, 0x49, 0x44, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, 0x5f, 0x53, 0x45, 0x51, + 0x55, 0x45, 0x4e, 0x43, 0x45, 0x10, 0x03, 0x12, 0x26, 0x0a, 0x22, 0x4f, 0x52, 0x44, 0x45, 0x52, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x52, + 0x45, 0x4d, 0x41, 0x49, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x04, 0x12, + 0x1c, 0x0a, 0x18, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x54, + 0x49, 0x4d, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x05, 0x12, 0x1f, 0x0a, + 0x1b, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x52, 0x45, 0x4d, + 0x4f, 0x56, 0x41, 0x4c, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x06, 0x12, 0x2b, + 0x0a, 0x27, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x44, 0x41, 0x54, 0x45, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x07, 0x12, 0x27, 0x0a, 0x23, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x11, 0x12, 0x23, 0x0a, 0x1f, 0x4f, 0x52, 0x44, - 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, - 0x5f, 0x50, 0x45, 0x52, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x43, 0x45, 0x10, 0x12, 0x12, 0x1c, - 0x0a, 0x18, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x13, 0x12, 0x1c, 0x0a, 0x18, - 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x53, 0x45, 0x4c, 0x46, - 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x14, 0x12, 0x2e, 0x0a, 0x2a, 0x4f, 0x52, - 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x46, 0x46, - 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x53, 0x5f, 0x54, 0x4f, 0x5f, - 0x50, 0x41, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x10, 0x15, 0x12, 0x25, 0x0a, 0x21, 0x4f, 0x52, - 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x52, 0x52, - 0x45, 0x43, 0x54, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, - 0x16, 0x12, 0x25, 0x0a, 0x21, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x49, 0x4e, - 0x5f, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, 0x17, 0x12, 0x37, 0x0a, 0x33, 0x4f, 0x52, 0x44, 0x45, - 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x53, - 0x45, 0x4e, 0x44, 0x5f, 0x47, 0x46, 0x4e, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x44, 0x55, - 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, - 0x18, 0x12, 0x3f, 0x0a, 0x3b, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x47, 0x46, 0x41, - 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x44, 0x55, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x4f, - 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, - 0x10, 0x19, 0x12, 0x34, 0x0a, 0x30, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4d, 0x45, 0x4e, 0x44, 0x5f, 0x54, - 0x4f, 0x5f, 0x47, 0x54, 0x54, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, 0x54, 0x5f, 0x45, 0x58, - 0x50, 0x49, 0x52, 0x59, 0x41, 0x54, 0x10, 0x1a, 0x12, 0x29, 0x0a, 0x25, 0x4f, 0x52, 0x44, 0x45, - 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x59, 0x41, 0x54, - 0x5f, 0x42, 0x45, 0x46, 0x4f, 0x52, 0x45, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x41, - 0x54, 0x10, 0x1b, 0x12, 0x2c, 0x0a, 0x28, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x48, 0x41, 0x56, 0x45, 0x5f, 0x47, - 0x54, 0x43, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x59, 0x41, 0x54, 0x10, - 0x1c, 0x12, 0x2a, 0x0a, 0x26, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x49, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, + 0x43, 0x45, 0x10, 0x08, 0x12, 0x20, 0x0a, 0x1c, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x44, 0x49, 0x54, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4c, 0x4c, + 0x4f, 0x57, 0x45, 0x44, 0x10, 0x09, 0x12, 0x1d, 0x0a, 0x19, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x41, 0x4d, 0x45, 0x4e, 0x44, 0x5f, 0x46, 0x41, 0x49, 0x4c, + 0x55, 0x52, 0x45, 0x10, 0x0a, 0x12, 0x19, 0x0a, 0x15, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x0b, + 0x12, 0x20, 0x0a, 0x1c, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, + 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x5f, 0x49, 0x44, + 0x10, 0x0c, 0x12, 0x1d, 0x0a, 0x19, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, + 0x0d, 0x12, 0x23, 0x0a, 0x1f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x5f, 0x46, 0x41, + 0x49, 0x4c, 0x45, 0x44, 0x10, 0x0e, 0x12, 0x27, 0x0a, 0x23, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x47, 0x45, + 0x4e, 0x45, 0x52, 0x41, 0x4c, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x0f, 0x12, + 0x1e, 0x0a, 0x1a, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, + 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x10, 0x12, + 0x1c, 0x0a, 0x18, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, + 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x11, 0x12, 0x23, 0x0a, + 0x1f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, + 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x43, 0x45, + 0x10, 0x12, 0x12, 0x1c, 0x0a, 0x18, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x13, + 0x12, 0x1c, 0x0a, 0x18, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, + 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x14, 0x12, 0x2e, + 0x0a, 0x2a, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, + 0x53, 0x55, 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x53, + 0x5f, 0x54, 0x4f, 0x5f, 0x50, 0x41, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x10, 0x15, 0x12, 0x25, + 0x0a, 0x21, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, + 0x43, 0x4f, 0x52, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x10, 0x16, 0x12, 0x25, 0x0a, 0x21, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x49, 0x4d, + 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, 0x17, 0x12, 0x37, 0x0a, 0x33, + 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, + 0x4f, 0x54, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x47, 0x46, 0x4e, 0x5f, 0x4f, 0x52, 0x44, 0x45, + 0x52, 0x5f, 0x44, 0x55, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x5f, 0x41, 0x55, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x10, 0x18, 0x12, 0x3f, 0x0a, 0x3b, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x45, 0x4e, 0x44, + 0x5f, 0x47, 0x46, 0x41, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x44, 0x55, 0x52, 0x49, 0x4e, + 0x47, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x5f, 0x54, 0x52, 0x41, + 0x44, 0x49, 0x4e, 0x47, 0x10, 0x19, 0x12, 0x34, 0x0a, 0x30, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4d, 0x45, + 0x4e, 0x44, 0x5f, 0x54, 0x4f, 0x5f, 0x47, 0x54, 0x54, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, + 0x54, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x59, 0x41, 0x54, 0x10, 0x1a, 0x12, 0x29, 0x0a, 0x25, + 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x58, 0x50, 0x49, + 0x52, 0x59, 0x41, 0x54, 0x5f, 0x42, 0x45, 0x46, 0x4f, 0x52, 0x45, 0x5f, 0x43, 0x52, 0x45, 0x41, + 0x54, 0x45, 0x44, 0x41, 0x54, 0x10, 0x1b, 0x12, 0x2c, 0x0a, 0x28, 0x4f, 0x52, 0x44, 0x45, 0x52, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x48, 0x41, + 0x56, 0x45, 0x5f, 0x47, 0x54, 0x43, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, + 0x59, 0x41, 0x54, 0x10, 0x1c, 0x12, 0x2a, 0x0a, 0x26, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4d, 0x45, 0x4e, + 0x44, 0x5f, 0x54, 0x4f, 0x5f, 0x46, 0x4f, 0x4b, 0x5f, 0x4f, 0x52, 0x5f, 0x49, 0x4f, 0x43, 0x10, + 0x1d, 0x12, 0x2a, 0x0a, 0x26, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4d, 0x45, 0x4e, 0x44, 0x5f, 0x54, 0x4f, - 0x5f, 0x46, 0x4f, 0x4b, 0x5f, 0x4f, 0x52, 0x5f, 0x49, 0x4f, 0x43, 0x10, 0x1d, 0x12, 0x2a, 0x0a, - 0x26, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, - 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4d, 0x45, 0x4e, 0x44, 0x5f, 0x54, 0x4f, 0x5f, 0x47, 0x46, 0x41, - 0x5f, 0x4f, 0x52, 0x5f, 0x47, 0x46, 0x4e, 0x10, 0x1e, 0x12, 0x2c, 0x0a, 0x28, 0x4f, 0x52, 0x44, - 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, - 0x41, 0x4d, 0x45, 0x4e, 0x44, 0x5f, 0x46, 0x52, 0x4f, 0x4d, 0x5f, 0x47, 0x46, 0x41, 0x5f, 0x4f, - 0x52, 0x5f, 0x47, 0x46, 0x4e, 0x10, 0x1f, 0x12, 0x34, 0x0a, 0x30, 0x4f, 0x52, 0x44, 0x45, 0x52, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x45, - 0x4e, 0x44, 0x5f, 0x49, 0x4f, 0x43, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x44, 0x55, 0x52, - 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x20, 0x12, 0x34, 0x0a, - 0x30, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, - 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x46, 0x4f, 0x4b, 0x5f, 0x4f, 0x52, 0x44, - 0x45, 0x52, 0x5f, 0x44, 0x55, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x10, 0x21, 0x12, 0x23, 0x0a, 0x1f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x5f, 0x4d, 0x55, 0x53, 0x54, 0x5f, 0x42, 0x45, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, - 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x22, 0x12, 0x22, 0x0a, 0x1e, 0x4f, 0x52, 0x44, 0x45, - 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x55, 0x53, 0x54, 0x5f, 0x42, 0x45, 0x5f, - 0x47, 0x54, 0x54, 0x5f, 0x4f, 0x52, 0x5f, 0x47, 0x54, 0x43, 0x10, 0x23, 0x12, 0x27, 0x0a, 0x23, - 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x57, 0x49, 0x54, 0x48, - 0x4f, 0x55, 0x54, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x50, 0x52, - 0x49, 0x43, 0x45, 0x10, 0x24, 0x12, 0x33, 0x0a, 0x2f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x42, 0x55, 0x59, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, - 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x42, 0x45, 0x53, 0x54, 0x5f, 0x41, - 0x53, 0x4b, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x10, 0x25, 0x12, 0x37, 0x0a, 0x33, 0x4f, 0x52, - 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, - 0x5f, 0x4d, 0x55, 0x53, 0x54, 0x5f, 0x42, 0x45, 0x5f, 0x47, 0x52, 0x45, 0x41, 0x54, 0x45, 0x52, - 0x5f, 0x4f, 0x52, 0x5f, 0x45, 0x51, 0x55, 0x41, 0x4c, 0x5f, 0x54, 0x4f, 0x5f, 0x5a, 0x45, 0x52, - 0x4f, 0x10, 0x28, 0x12, 0x34, 0x0a, 0x30, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x5f, 0x53, 0x45, 0x4c, 0x4c, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x52, - 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x42, 0x45, 0x53, 0x54, 0x5f, 0x42, 0x49, - 0x44, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x10, 0x29, 0x12, 0x30, 0x0a, 0x2c, 0x4f, 0x52, 0x44, - 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x5f, - 0x4d, 0x55, 0x53, 0x54, 0x5f, 0x42, 0x45, 0x5f, 0x47, 0x52, 0x45, 0x41, 0x54, 0x45, 0x52, 0x5f, - 0x54, 0x48, 0x41, 0x4e, 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x2a, 0x12, 0x2a, 0x0a, 0x26, 0x4f, - 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x46, - 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x42, 0x41, - 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x2b, 0x12, 0x45, 0x0a, 0x41, 0x4f, 0x52, 0x44, 0x45, 0x52, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4d, - 0x45, 0x4e, 0x44, 0x5f, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, - 0x5f, 0x44, 0x45, 0x54, 0x41, 0x49, 0x4c, 0x53, 0x5f, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, - 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x2c, 0x12, 0x2e, - 0x0a, 0x2a, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, - 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, - 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x2d, 0x12, 0x35, - 0x0a, 0x31, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, - 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x41, 0x4d, 0x45, 0x4e, 0x44, 0x5f, 0x50, 0x52, - 0x49, 0x43, 0x45, 0x5f, 0x4f, 0x4e, 0x5f, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x4f, 0x52, - 0x44, 0x45, 0x52, 0x10, 0x2e, 0x12, 0x38, 0x0a, 0x34, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x53, 0x49, 0x53, 0x54, - 0x45, 0x4e, 0x54, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, - 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x53, 0x10, 0x2f, 0x12, - 0x26, 0x0a, 0x22, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x54, - 0x4f, 0x4f, 0x5f, 0x4d, 0x41, 0x4e, 0x59, 0x5f, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x4f, - 0x52, 0x44, 0x45, 0x52, 0x53, 0x10, 0x30, 0x12, 0x2b, 0x0a, 0x27, 0x4f, 0x52, 0x44, 0x45, 0x52, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, - 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x57, 0x4f, 0x55, 0x4c, 0x44, 0x5f, 0x54, 0x52, 0x41, - 0x44, 0x45, 0x10, 0x31, 0x12, 0x3b, 0x0a, 0x37, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x5f, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, - 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x57, 0x4f, 0x55, 0x4c, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, - 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x10, - 0x32, 0x22, 0x04, 0x08, 0x26, 0x10, 0x26, 0x22, 0x04, 0x08, 0x27, 0x10, 0x27, 0x2a, 0x82, 0x01, - 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, - 0x18, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x43, - 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x43, - 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x48, - 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x41, - 0x59, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, - 0x10, 0x03, 0x2a, 0x92, 0x08, 0x0a, 0x0b, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x52, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, - 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x54, - 0x54, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x43, 0x43, - 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, - 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x4c, 0x10, 0x04, 0x12, 0x24, 0x0a, 0x20, - 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x45, 0x45, - 0x53, 0x5f, 0x49, 0x4e, 0x46, 0x52, 0x41, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x55, 0x52, 0x45, - 0x10, 0x05, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, - 0x59, 0x10, 0x06, 0x12, 0x1b, 0x0a, 0x17, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x10, 0x07, - 0x12, 0x15, 0x0a, 0x11, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x42, 0x4f, 0x4e, 0x44, 0x10, 0x09, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x43, 0x43, 0x4f, 0x55, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, - 0x10, 0x0a, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x52, 0x41, - 0x4e, 0x43, 0x45, 0x10, 0x0b, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x5f, 0x52, 0x45, 0x57, - 0x41, 0x52, 0x44, 0x10, 0x0c, 0x12, 0x22, 0x0a, 0x1e, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x52, - 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x53, 0x10, 0x0d, 0x12, 0x27, 0x0a, 0x23, 0x41, 0x43, 0x43, - 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, - 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, 0x50, 0x41, 0x49, 0x44, 0x5f, 0x46, 0x45, 0x45, 0x53, - 0x10, 0x0e, 0x12, 0x2b, 0x0a, 0x27, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, - 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x10, 0x0f, 0x12, + 0x5f, 0x47, 0x46, 0x41, 0x5f, 0x4f, 0x52, 0x5f, 0x47, 0x46, 0x4e, 0x10, 0x1e, 0x12, 0x2c, 0x0a, + 0x28, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, + 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4d, 0x45, 0x4e, 0x44, 0x5f, 0x46, 0x52, 0x4f, 0x4d, 0x5f, 0x47, + 0x46, 0x41, 0x5f, 0x4f, 0x52, 0x5f, 0x47, 0x46, 0x4e, 0x10, 0x1f, 0x12, 0x34, 0x0a, 0x30, 0x4f, + 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, + 0x54, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x49, 0x4f, 0x43, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, + 0x5f, 0x44, 0x55, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, + 0x20, 0x12, 0x34, 0x0a, 0x30, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x46, 0x4f, 0x4b, + 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x44, 0x55, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x55, + 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x21, 0x12, 0x23, 0x0a, 0x1f, 0x4f, 0x52, 0x44, 0x45, 0x52, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x55, 0x53, 0x54, 0x5f, 0x42, 0x45, 0x5f, 0x4c, + 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x22, 0x12, 0x22, 0x0a, 0x1e, + 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x55, 0x53, 0x54, + 0x5f, 0x42, 0x45, 0x5f, 0x47, 0x54, 0x54, 0x5f, 0x4f, 0x52, 0x5f, 0x47, 0x54, 0x43, 0x10, 0x23, + 0x12, 0x27, 0x0a, 0x23, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, + 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, 0x54, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, + 0x45, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x10, 0x24, 0x12, 0x33, 0x0a, 0x2f, 0x4f, 0x52, 0x44, + 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x42, 0x55, 0x59, 0x5f, 0x43, 0x41, 0x4e, + 0x4e, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x42, 0x45, + 0x53, 0x54, 0x5f, 0x41, 0x53, 0x4b, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x10, 0x25, 0x12, 0x37, + 0x0a, 0x33, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x46, + 0x46, 0x53, 0x45, 0x54, 0x5f, 0x4d, 0x55, 0x53, 0x54, 0x5f, 0x42, 0x45, 0x5f, 0x47, 0x52, 0x45, + 0x41, 0x54, 0x45, 0x52, 0x5f, 0x4f, 0x52, 0x5f, 0x45, 0x51, 0x55, 0x41, 0x4c, 0x5f, 0x54, 0x4f, + 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x28, 0x12, 0x34, 0x0a, 0x30, 0x4f, 0x52, 0x44, 0x45, 0x52, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x53, 0x45, 0x4c, 0x4c, 0x5f, 0x43, 0x41, 0x4e, 0x4e, + 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x42, 0x45, 0x53, + 0x54, 0x5f, 0x42, 0x49, 0x44, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x10, 0x29, 0x12, 0x30, 0x0a, + 0x2c, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x46, 0x46, + 0x53, 0x45, 0x54, 0x5f, 0x4d, 0x55, 0x53, 0x54, 0x5f, 0x42, 0x45, 0x5f, 0x47, 0x52, 0x45, 0x41, + 0x54, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x41, 0x4e, 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x2a, 0x12, + 0x2a, 0x0a, 0x26, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, + 0x4e, 0x53, 0x55, 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x53, 0x53, 0x45, + 0x54, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x2b, 0x12, 0x45, 0x0a, 0x41, 0x4f, + 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, + 0x54, 0x5f, 0x41, 0x4d, 0x45, 0x4e, 0x44, 0x5f, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x4f, + 0x52, 0x44, 0x45, 0x52, 0x5f, 0x44, 0x45, 0x54, 0x41, 0x49, 0x4c, 0x53, 0x5f, 0x4f, 0x4e, 0x5f, + 0x4e, 0x4f, 0x4e, 0x5f, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, + 0x10, 0x2c, 0x12, 0x2e, 0x0a, 0x2a, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x50, 0x52, + 0x49, 0x43, 0x45, 0x5f, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, + 0x10, 0x2d, 0x12, 0x35, 0x0a, 0x31, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x41, 0x4d, 0x45, 0x4e, + 0x44, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x4f, 0x4e, 0x5f, 0x50, 0x45, 0x47, 0x47, 0x45, + 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x2e, 0x12, 0x38, 0x0a, 0x34, 0x4f, 0x52, 0x44, + 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x50, 0x45, 0x52, + 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x4f, 0x55, + 0x54, 0x5f, 0x4f, 0x46, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x42, 0x4f, 0x55, 0x4e, 0x44, + 0x53, 0x10, 0x2f, 0x12, 0x26, 0x0a, 0x22, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4d, 0x41, 0x4e, 0x59, 0x5f, 0x50, 0x45, 0x47, 0x47, + 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x53, 0x10, 0x30, 0x12, 0x2b, 0x0a, 0x27, 0x4f, + 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x5f, + 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x57, 0x4f, 0x55, 0x4c, 0x44, + 0x5f, 0x54, 0x52, 0x41, 0x44, 0x45, 0x10, 0x31, 0x12, 0x3b, 0x0a, 0x37, 0x4f, 0x52, 0x44, 0x45, + 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x4f, + 0x4e, 0x4c, 0x59, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x57, 0x4f, 0x55, 0x4c, 0x44, 0x5f, + 0x4e, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, + 0x49, 0x4f, 0x4e, 0x10, 0x32, 0x22, 0x04, 0x08, 0x26, 0x10, 0x26, 0x22, 0x04, 0x08, 0x27, 0x10, + 0x27, 0x2a, 0x82, 0x01, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x1d, 0x0a, 0x19, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x1a, + 0x0a, 0x16, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, + 0x45, 0x50, 0x4c, 0x41, 0x59, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x48, + 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, + 0x43, 0x54, 0x45, 0x44, 0x10, 0x03, 0x2a, 0x92, 0x08, 0x0a, 0x0b, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x52, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x01, + 0x12, 0x1b, 0x0a, 0x17, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x53, 0x45, 0x54, 0x54, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x12, 0x17, 0x0a, + 0x13, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, + 0x52, 0x47, 0x49, 0x4e, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x4c, 0x10, 0x04, + 0x12, 0x24, 0x0a, 0x20, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x49, 0x4e, 0x46, 0x52, 0x41, 0x53, 0x54, 0x52, 0x55, 0x43, + 0x54, 0x55, 0x52, 0x45, 0x10, 0x05, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x4c, 0x49, 0x51, 0x55, + 0x49, 0x44, 0x49, 0x54, 0x59, 0x10, 0x06, 0x12, 0x1b, 0x0a, 0x17, 0x41, 0x43, 0x43, 0x4f, 0x55, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x4d, 0x41, 0x4b, + 0x45, 0x52, 0x10, 0x07, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4e, 0x44, 0x10, 0x09, 0x12, 0x19, 0x0a, 0x15, 0x41, + 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x54, 0x45, + 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x0a, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x5f, 0x49, 0x4e, + 0x53, 0x55, 0x52, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x0b, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x43, 0x43, + 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, + 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x10, 0x0c, 0x12, 0x22, 0x0a, 0x1e, 0x41, 0x43, 0x43, + 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, + 0x47, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x53, 0x10, 0x0d, 0x12, 0x27, 0x0a, + 0x23, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, + 0x57, 0x41, 0x52, 0x44, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, 0x50, 0x41, 0x49, 0x44, 0x5f, + 0x46, 0x45, 0x45, 0x53, 0x10, 0x0e, 0x12, 0x2b, 0x0a, 0x27, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x4d, 0x41, + 0x4b, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x5f, 0x46, 0x45, 0x45, + 0x53, 0x10, 0x0f, 0x12, 0x28, 0x0a, 0x24, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x4c, 0x50, 0x5f, 0x52, 0x45, + 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x10, 0x10, 0x12, 0x28, 0x0a, + 0x24, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, + 0x57, 0x41, 0x52, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x50, + 0x4f, 0x53, 0x45, 0x52, 0x53, 0x10, 0x11, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x43, 0x43, 0x4f, 0x55, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x4f, 0x4c, 0x44, 0x49, 0x4e, 0x47, 0x10, + 0x12, 0x12, 0x22, 0x0a, 0x1e, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x4c, 0x50, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, + 0x45, 0x45, 0x53, 0x10, 0x13, 0x12, 0x32, 0x0a, 0x2e, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, + 0x46, 0x45, 0x45, 0x53, 0x5f, 0x42, 0x4f, 0x4e, 0x55, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, + 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x14, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x43, 0x43, + 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, + 0x4b, 0x5f, 0x54, 0x52, 0x45, 0x41, 0x53, 0x55, 0x52, 0x59, 0x10, 0x15, 0x12, 0x20, 0x0a, 0x1c, + 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x45, 0x53, + 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x53, 0x10, 0x16, 0x12, 0x1f, + 0x0a, 0x1b, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, + 0x45, 0x53, 0x54, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x53, 0x10, 0x17, 0x12, 0x28, 0x0a, 0x24, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x4c, 0x50, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, - 0x45, 0x44, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x10, 0x10, 0x12, 0x28, 0x0a, 0x24, 0x41, 0x43, 0x43, - 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, - 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x45, 0x52, - 0x53, 0x10, 0x11, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x48, 0x4f, 0x4c, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x12, 0x12, 0x22, 0x0a, - 0x1e, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x50, - 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x10, - 0x13, 0x12, 0x32, 0x0a, 0x2e, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x53, - 0x5f, 0x42, 0x4f, 0x4e, 0x55, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, - 0x49, 0x4f, 0x4e, 0x10, 0x14, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x54, 0x52, - 0x45, 0x41, 0x53, 0x55, 0x52, 0x59, 0x10, 0x15, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x43, 0x43, 0x4f, - 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x45, 0x53, 0x54, 0x49, 0x4e, 0x47, - 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x53, 0x10, 0x16, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x43, - 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x45, 0x53, 0x54, 0x45, - 0x44, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x53, 0x10, 0x17, 0x12, 0x28, 0x0a, 0x24, 0x41, - 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, - 0x52, 0x44, 0x5f, 0x41, 0x56, 0x45, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, - 0x49, 0x4f, 0x4e, 0x10, 0x18, 0x12, 0x27, 0x0a, 0x23, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x52, 0x45, 0x4c, - 0x41, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x10, 0x19, 0x12, 0x29, - 0x0a, 0x25, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, - 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x5f, 0x56, 0x4f, 0x4c, - 0x41, 0x54, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x10, 0x1a, 0x12, 0x29, 0x0a, 0x25, 0x41, 0x43, 0x43, + 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x41, 0x56, 0x45, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x50, + 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x18, 0x12, 0x27, 0x0a, 0x23, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, - 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x49, - 0x4e, 0x47, 0x10, 0x1b, 0x12, 0x2c, 0x0a, 0x28, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x45, 0x45, - 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, - 0x10, 0x1c, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x10, - 0x1d, 0x22, 0x04, 0x08, 0x08, 0x10, 0x08, 0x2a, 0xbc, 0x0b, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x54, 0x52, 0x41, 0x4e, - 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x52, 0x41, 0x4e, 0x53, - 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x4f, 0x53, 0x53, 0x10, 0x01, 0x12, - 0x15, 0x0a, 0x11, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x57, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, - 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x54, 0x4d, 0x5f, 0x4c, 0x4f, 0x53, 0x53, - 0x10, 0x04, 0x12, 0x19, 0x0a, 0x15, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x54, 0x4d, 0x5f, 0x57, 0x49, 0x4e, 0x10, 0x05, 0x12, 0x1c, 0x0a, - 0x18, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, - 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x06, 0x12, 0x1d, 0x0a, 0x19, 0x54, - 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, - 0x47, 0x49, 0x4e, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, 0x07, 0x12, 0x24, 0x0a, 0x20, 0x54, 0x52, - 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x47, - 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x53, 0x43, 0x41, 0x54, 0x45, 0x44, 0x10, 0x08, - 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x50, 0x41, 0x59, 0x10, - 0x09, 0x12, 0x23, 0x0a, 0x1f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x52, 0x45, 0x43, - 0x45, 0x49, 0x56, 0x45, 0x10, 0x0a, 0x12, 0x28, 0x0a, 0x24, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, - 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x52, 0x41, 0x53, 0x54, 0x52, - 0x55, 0x43, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x50, 0x41, 0x59, 0x10, 0x0b, - 0x12, 0x2f, 0x0a, 0x2b, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x52, 0x41, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x55, 0x52, 0x45, - 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x10, - 0x0c, 0x12, 0x23, 0x0a, 0x1f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, 0x45, - 0x5f, 0x50, 0x41, 0x59, 0x10, 0x0d, 0x12, 0x2a, 0x0a, 0x26, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, + 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, + 0x10, 0x19, 0x12, 0x29, 0x0a, 0x25, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, + 0x5f, 0x56, 0x4f, 0x4c, 0x41, 0x54, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x10, 0x1a, 0x12, 0x29, 0x0a, + 0x25, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, + 0x57, 0x41, 0x52, 0x44, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x52, + 0x41, 0x4e, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x1b, 0x12, 0x2c, 0x0a, 0x28, 0x41, 0x43, 0x43, 0x4f, + 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, + 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x52, 0x45, + 0x57, 0x41, 0x52, 0x44, 0x10, 0x1c, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x4d, 0x41, 0x52, + 0x47, 0x49, 0x4e, 0x10, 0x1d, 0x22, 0x04, 0x08, 0x08, 0x10, 0x08, 0x2a, 0xbc, 0x0b, 0x0a, 0x0c, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, + 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x54, + 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x4f, 0x53, + 0x53, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x52, + 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x54, 0x4d, 0x5f, + 0x4c, 0x4f, 0x53, 0x53, 0x10, 0x04, 0x12, 0x19, 0x0a, 0x15, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, + 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x54, 0x4d, 0x5f, 0x57, 0x49, 0x4e, 0x10, + 0x05, 0x12, 0x1c, 0x0a, 0x18, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x06, 0x12, + 0x1d, 0x0a, 0x19, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, 0x07, 0x12, 0x24, + 0x0a, 0x20, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x53, 0x43, 0x41, 0x54, + 0x45, 0x44, 0x10, 0x08, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, 0x5f, + 0x50, 0x41, 0x59, 0x10, 0x09, 0x12, 0x23, 0x0a, 0x1f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, + 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, + 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x10, 0x0a, 0x12, 0x28, 0x0a, 0x24, 0x54, 0x52, + 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x52, + 0x41, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x50, + 0x41, 0x59, 0x10, 0x0b, 0x12, 0x2f, 0x0a, 0x2b, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x52, 0x41, 0x53, 0x54, 0x52, 0x55, 0x43, + 0x54, 0x55, 0x52, 0x45, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, + 0x55, 0x54, 0x45, 0x10, 0x0c, 0x12, 0x23, 0x0a, 0x1f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, + 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, + 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x50, 0x41, 0x59, 0x10, 0x0d, 0x12, 0x2a, 0x0a, 0x26, 0x54, 0x52, + 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, + 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, + 0x42, 0x55, 0x54, 0x45, 0x10, 0x0e, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, + 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x4c, 0x4f, 0x57, + 0x10, 0x0f, 0x12, 0x1b, 0x0a, 0x17, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, 0x10, 0x12, + 0x1a, 0x0a, 0x16, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, 0x10, 0x12, 0x12, 0x19, 0x0a, 0x15, 0x54, + 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x50, + 0x4f, 0x53, 0x49, 0x54, 0x10, 0x13, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, + 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, 0x4c, 0x41, + 0x53, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x14, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x52, 0x41, 0x4e, 0x53, + 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, + 0x50, 0x41, 0x59, 0x4f, 0x55, 0x54, 0x10, 0x15, 0x12, 0x25, 0x0a, 0x21, 0x54, 0x52, 0x41, 0x4e, + 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, + 0x45, 0x52, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x53, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x10, 0x16, 0x12, + 0x2b, 0x0a, 0x27, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x53, 0x5f, + 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x10, 0x17, 0x12, 0x1f, 0x0a, 0x1b, + 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4c, + 0x45, 0x41, 0x52, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x18, 0x12, 0x2c, 0x0a, + 0x28, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, + 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, + 0x45, 0x5f, 0x52, 0x45, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x19, 0x12, 0x16, 0x0a, 0x12, 0x54, + 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x50, 0x4f, + 0x54, 0x10, 0x1a, 0x12, 0x1e, 0x0a, 0x1a, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x4f, 0x4c, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4c, 0x4f, 0x43, + 0x4b, 0x10, 0x1b, 0x12, 0x21, 0x0a, 0x1d, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x4f, 0x4c, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x4c, + 0x45, 0x41, 0x53, 0x45, 0x10, 0x1c, 0x12, 0x2e, 0x0a, 0x2a, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, + 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x4f, + 0x52, 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x52, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x46, 0x52, 0x41, 0x43, + 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x1d, 0x12, 0x28, 0x0a, 0x24, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, + 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, + 0x59, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x45, 0x10, 0x1e, + 0x12, 0x2e, 0x0a, 0x2a, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x5f, + 0x4e, 0x45, 0x54, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x10, 0x1f, + 0x12, 0x28, 0x0a, 0x24, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x53, 0x4c, 0x41, 0x5f, 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, 0x5f, 0x42, 0x4f, + 0x4e, 0x44, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x59, 0x10, 0x20, 0x12, 0x2a, 0x0a, 0x26, 0x54, 0x52, + 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x4c, 0x41, 0x5f, + 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, 0x5f, 0x4c, 0x50, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x41, + 0x50, 0x50, 0x4c, 0x59, 0x10, 0x21, 0x12, 0x2e, 0x0a, 0x2a, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, - 0x59, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, - 0x10, 0x0e, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x0f, 0x12, 0x1b, - 0x0a, 0x17, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, 0x10, 0x12, 0x1a, 0x0a, 0x16, 0x54, - 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x49, 0x54, - 0x48, 0x44, 0x52, 0x41, 0x57, 0x10, 0x12, 0x12, 0x19, 0x0a, 0x15, 0x54, 0x52, 0x41, 0x4e, 0x53, - 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, - 0x10, 0x13, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0x49, 0x4e, - 0x47, 0x10, 0x14, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x4f, - 0x55, 0x54, 0x10, 0x15, 0x12, 0x25, 0x0a, 0x21, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x46, - 0x55, 0x4e, 0x44, 0x53, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x10, 0x16, 0x12, 0x2b, 0x0a, 0x27, 0x54, - 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, - 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x54, - 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x10, 0x17, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x52, 0x41, 0x4e, - 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4c, 0x45, 0x41, 0x52, 0x5f, - 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x18, 0x12, 0x2c, 0x0a, 0x28, 0x54, 0x52, 0x41, - 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, - 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x52, 0x45, - 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x19, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x52, 0x41, 0x4e, 0x53, - 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x50, 0x4f, 0x54, 0x10, 0x1a, 0x12, - 0x1e, 0x0a, 0x1a, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x48, 0x4f, 0x4c, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x1b, 0x12, - 0x21, 0x0a, 0x1d, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x48, 0x4f, 0x4c, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, - 0x10, 0x1c, 0x12, 0x2e, 0x0a, 0x2a, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x4f, 0x52, 0x5f, 0x49, 0x4e, - 0x53, 0x55, 0x52, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x46, 0x52, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, - 0x10, 0x1d, 0x12, 0x28, 0x0a, 0x24, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, - 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x45, 0x10, 0x1e, 0x12, 0x2e, 0x0a, 0x2a, - 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, - 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x5f, - 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x10, 0x1f, 0x12, 0x28, 0x0a, 0x24, - 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x4c, - 0x41, 0x5f, 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, 0x5f, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x41, - 0x50, 0x50, 0x4c, 0x59, 0x10, 0x20, 0x12, 0x2a, 0x0a, 0x26, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, - 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x4c, 0x41, 0x5f, 0x50, 0x45, 0x4e, 0x41, - 0x4c, 0x54, 0x59, 0x5f, 0x4c, 0x50, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x59, - 0x10, 0x21, 0x12, 0x2e, 0x0a, 0x2a, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, - 0x45, 0x5f, 0x55, 0x4e, 0x50, 0x41, 0x49, 0x44, 0x5f, 0x43, 0x4f, 0x4c, 0x4c, 0x45, 0x43, 0x54, - 0x10, 0x22, 0x12, 0x32, 0x0a, 0x2e, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x53, 0x4c, 0x41, 0x5f, 0x50, 0x45, 0x52, 0x46, 0x4f, 0x52, 0x4d, 0x41, - 0x4e, 0x43, 0x45, 0x5f, 0x42, 0x4f, 0x4e, 0x55, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, - 0x42, 0x55, 0x54, 0x45, 0x10, 0x23, 0x12, 0x29, 0x0a, 0x25, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, - 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x50, 0x45, 0x54, 0x55, 0x41, - 0x4c, 0x53, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4c, 0x4f, 0x53, 0x53, 0x10, - 0x24, 0x12, 0x28, 0x0a, 0x24, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x50, 0x45, 0x54, 0x55, 0x41, 0x4c, 0x53, 0x5f, 0x46, 0x55, - 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x57, 0x49, 0x4e, 0x10, 0x25, 0x12, 0x20, 0x0a, 0x1c, 0x54, - 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, - 0x41, 0x52, 0x44, 0x53, 0x5f, 0x56, 0x45, 0x53, 0x54, 0x45, 0x44, 0x10, 0x26, 0x12, 0x29, 0x0a, - 0x25, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, - 0x45, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x57, 0x41, - 0x52, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x10, 0x27, 0x12, 0x30, 0x0a, 0x2c, 0x54, 0x52, 0x41, 0x4e, - 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x52, 0x45, - 0x46, 0x45, 0x52, 0x52, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x44, 0x49, - 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x10, 0x2c, 0x22, 0x04, 0x08, 0x03, 0x10, 0x03, - 0x22, 0x04, 0x08, 0x11, 0x10, 0x11, 0x2a, 0xe0, 0x02, 0x0a, 0x0e, 0x44, 0x69, 0x73, 0x70, 0x61, - 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1f, 0x0a, 0x1b, 0x44, 0x49, 0x53, - 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x23, 0x0a, 0x1f, 0x44, 0x49, - 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x4d, 0x41, - 0x4b, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x50, 0x41, 0x49, 0x44, 0x10, 0x01, 0x12, - 0x27, 0x0a, 0x23, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, - 0x49, 0x43, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x52, 0x45, - 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x44, 0x49, 0x53, 0x50, - 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x4c, 0x50, 0x5f, 0x46, - 0x45, 0x45, 0x53, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x10, 0x03, 0x12, 0x20, - 0x0a, 0x1c, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, - 0x43, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x04, - 0x12, 0x24, 0x0a, 0x20, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, - 0x52, 0x49, 0x43, 0x5f, 0x41, 0x56, 0x45, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, - 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x23, 0x0a, 0x1f, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, - 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, - 0x56, 0x45, 0x5f, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x10, 0x06, 0x12, 0x25, 0x0a, 0x21, 0x44, - 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x52, - 0x45, 0x54, 0x55, 0x52, 0x4e, 0x5f, 0x56, 0x4f, 0x4c, 0x41, 0x54, 0x49, 0x4c, 0x49, 0x54, 0x59, - 0x10, 0x07, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, - 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, - 0x52, 0x41, 0x4e, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x08, 0x2a, 0x61, 0x0a, 0x0b, 0x45, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x4e, 0x54, 0x49, - 0x54, 0x59, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, - 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, 0x41, - 0x4c, 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x53, - 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x53, 0x10, 0x02, 0x2a, 0x8d, 0x01, 0x0a, - 0x0f, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, - 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x53, - 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, 0x41, 0x4c, - 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, - 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, - 0x5f, 0x49, 0x4e, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x4e, - 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x4e, - 0x4f, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x10, 0x03, 0x2a, 0x81, 0x01, 0x0a, - 0x14, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, - 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, - 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x22, 0x0a, 0x1e, - 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x52, - 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x5f, 0x52, 0x41, 0x54, 0x41, 0x10, 0x01, - 0x12, 0x1e, 0x0a, 0x1a, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x10, 0x02, - 0x2a, 0x63, 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, - 0x0a, 0x17, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x4e, - 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, - 0x41, 0x54, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, - 0x54, 0x4f, 0x52, 0x10, 0x02, 0x2a, 0x59, 0x0a, 0x0b, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x50, 0x4f, 0x43, 0x48, 0x5f, 0x41, 0x43, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x50, 0x4f, 0x43, 0x48, 0x5f, 0x41, 0x43, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x50, - 0x4f, 0x43, 0x48, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x44, 0x10, 0x02, - 0x2a, 0xa7, 0x01, 0x0a, 0x13, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x6f, - 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x21, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x59, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x55, 0x4e, 0x50, 0x41, 0x49, 0x44, 0x5f, 0x43, 0x4f, 0x4c, + 0x4c, 0x45, 0x43, 0x54, 0x10, 0x22, 0x12, 0x32, 0x0a, 0x2e, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, + 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x4c, 0x41, 0x5f, 0x50, 0x45, 0x52, 0x46, + 0x4f, 0x52, 0x4d, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x42, 0x4f, 0x4e, 0x55, 0x53, 0x5f, 0x44, 0x49, + 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x10, 0x23, 0x12, 0x29, 0x0a, 0x25, 0x54, 0x52, + 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x50, + 0x45, 0x54, 0x55, 0x41, 0x4c, 0x53, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4c, + 0x4f, 0x53, 0x53, 0x10, 0x24, 0x12, 0x28, 0x0a, 0x24, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, + 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x50, 0x45, 0x54, 0x55, 0x41, 0x4c, + 0x53, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x57, 0x49, 0x4e, 0x10, 0x25, 0x12, + 0x20, 0x0a, 0x1c, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x53, 0x5f, 0x56, 0x45, 0x53, 0x54, 0x45, 0x44, 0x10, + 0x26, 0x12, 0x29, 0x0a, 0x25, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x52, 0x5f, + 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x10, 0x27, 0x12, 0x30, 0x0a, 0x2c, + 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x45, + 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, + 0x44, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x10, 0x2c, 0x22, 0x04, + 0x08, 0x03, 0x10, 0x03, 0x22, 0x04, 0x08, 0x11, 0x10, 0x11, 0x2a, 0xe0, 0x02, 0x0a, 0x0e, 0x44, + 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1f, 0x0a, + 0x1b, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x23, + 0x0a, 0x1f, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, + 0x43, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x50, 0x41, 0x49, + 0x44, 0x10, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, + 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, + 0x53, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, + 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, + 0x4c, 0x50, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, + 0x10, 0x03, 0x12, 0x20, 0x0a, 0x1c, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, + 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x56, 0x41, 0x4c, + 0x55, 0x45, 0x10, 0x04, 0x12, 0x24, 0x0a, 0x20, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, + 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x41, 0x56, 0x45, 0x52, 0x41, 0x47, 0x45, 0x5f, + 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x23, 0x0a, 0x1f, 0x44, 0x49, + 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x52, 0x45, + 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x10, 0x06, 0x12, + 0x25, 0x0a, 0x21, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, + 0x49, 0x43, 0x5f, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x5f, 0x56, 0x4f, 0x4c, 0x41, 0x54, 0x49, + 0x4c, 0x49, 0x54, 0x59, 0x10, 0x07, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, + 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, + 0x54, 0x4f, 0x52, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x08, 0x2a, 0x61, 0x0a, + 0x0b, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x18, + 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x4e, + 0x54, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x44, 0x49, 0x56, + 0x49, 0x44, 0x55, 0x41, 0x4c, 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x4e, 0x54, 0x49, + 0x54, 0x59, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x53, 0x10, 0x02, + 0x2a, 0x8d, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x53, + 0x63, 0x6f, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, + 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, + 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x10, 0x01, + 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x53, + 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x10, 0x02, 0x12, 0x20, + 0x0a, 0x1c, 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x4f, + 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x10, 0x03, + 0x2a, 0x81, 0x01, 0x0a, 0x14, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x49, 0x53, + 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, + 0x47, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x22, 0x0a, 0x1e, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x5f, 0x52, 0x41, + 0x54, 0x41, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x52, 0x41, + 0x4e, 0x4b, 0x10, 0x02, 0x2a, 0x63, 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x17, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x24, 0x0a, 0x20, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, - 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x4d, - 0x49, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, - 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, - 0x52, 0x53, 0x41, 0x54, 0x5a, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x56, 0x41, 0x4c, 0x49, 0x44, - 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x2a, 0x68, 0x0a, 0x0a, 0x4d, 0x61, - 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x4d, 0x41, 0x52, 0x47, - 0x49, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, - 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, - 0x4e, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4d, 0x4f, - 0x44, 0x45, 0x5f, 0x49, 0x53, 0x4f, 0x4c, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x47, - 0x49, 0x4e, 0x10, 0x02, 0x42, 0x27, 0x5a, 0x25, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x65, 0x67, - 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x19, 0x0a, 0x15, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x56, + 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x4e, 0x4f, + 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x56, 0x41, + 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x10, 0x02, 0x2a, 0x59, 0x0a, 0x0b, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x50, 0x4f, 0x43, + 0x48, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x50, 0x4f, 0x43, 0x48, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x01, 0x12, 0x14, + 0x0a, 0x10, 0x45, 0x50, 0x4f, 0x43, 0x48, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, + 0x4e, 0x44, 0x10, 0x02, 0x2a, 0xa7, 0x01, 0x0a, 0x13, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x21, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x24, 0x0a, 0x20, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, + 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x45, 0x4e, + 0x44, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x56, 0x41, 0x4c, + 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x45, 0x52, 0x53, 0x41, 0x54, 0x5a, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x56, + 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x2a, 0x68, + 0x0a, 0x0a, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17, + 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x41, 0x52, + 0x47, 0x49, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x4d, + 0x41, 0x52, 0x47, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x4d, 0x41, 0x52, 0x47, 0x49, + 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x49, 0x53, 0x4f, 0x4c, 0x41, 0x54, 0x45, 0x44, 0x5f, + 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x10, 0x02, 0x42, 0x27, 0x5a, 0x25, 0x63, 0x6f, 0x64, 0x65, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, + 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x67, + 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( From 883fd04914e979a59c5063a8f781105810abdfe1 Mon Sep 17 00:00:00 2001 From: Tan Quach Date: Thu, 7 Dec 2023 13:22:11 +0000 Subject: [PATCH 07/10] feat: volume discount stats api shows volume for all participants --- CHANGELOG.md | 1 + core/volumediscount/engine.go | 10 ++++++++++ core/volumediscount/engine_test.go | 4 ++-- core/volumediscount/helpers_for_test.go | 19 +++++++++++++++++++ .../sqlstore/volume_discount_stats_test.go | 19 ++++++++++++++----- 5 files changed, 46 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 811108c0877..05a5b5727d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ - [9257](https://github.com/vegaprotocol/vega/issues/9257) - Add games details API - [9260](https://github.com/vegaprotocol/vega/issues/9260) - Enhance rewards API for competitions - [10180](https://github.com/vegaprotocol/vega/issues/10180) - Additional candle intervals +- [10218](https://github.com/vegaprotocol/vega/issues/10218) - Volume discount stats shows volumes even if party doesn't qualify for a discount tier. ### 🐛 Fixes diff --git a/core/volumediscount/engine.go b/core/volumediscount/engine.go index e7a162e8b3c..7d0b91350db 100644 --- a/core/volumediscount/engine.go +++ b/core/volumediscount/engine.go @@ -191,6 +191,7 @@ func (e *Engine) computeFactorsByParty(ctx context.Context, epoch uint64) { for _, party := range parties { notionalVolume := e.avgVolumePerParty[party] + qualifiedForTier := false for i := tiersLen - 1; i >= 0; i-- { tier := e.currentProgram.VolumeBenefitTiers[i] if notionalVolume.GreaterThanOrEqual(tier.MinimumRunningNotionalTakerVolume.ToDecimal()) { @@ -202,9 +203,18 @@ func (e *Engine) computeFactorsByParty(ctx context.Context, epoch uint64) { DiscountFactor: tier.VolumeDiscountFactor.String(), RunningVolume: notionalVolume.Round(0).String(), }) + qualifiedForTier = true break } } + // if the party hasn't qualified, then still send the stats but with a zero factor + if !qualifiedForTier { + evt.Stats = append(evt.Stats, &eventspb.PartyVolumeDiscountStats{ + PartyId: party.String(), + DiscountFactor: "0", + RunningVolume: notionalVolume.Round(0).String(), + }) + } } e.broker.Send(events.NewVolumeDiscountStatsUpdatedEvent(ctx, evt)) diff --git a/core/volumediscount/engine_test.go b/core/volumediscount/engine_test.go index 30c9cea6d06..82494e6ea34 100644 --- a/core/volumediscount/engine_test.go +++ b/core/volumediscount/engine_test.go @@ -177,7 +177,7 @@ func TestDiscountFactor(t *testing.T) { }).Times(1) // end the epoch to get the market activity recorded - expectStatsUpdated(t, broker) + expectStatsUpdatedWithUnqualifiedParties(t, broker) currentTime = currentTime.Add(1 * time.Minute) endEpoch(t, engine, currentEpoch, currentTime.Add(1*time.Minute)) @@ -279,7 +279,7 @@ func TestDiscountFactorWithWindow(t *testing.T) { "p7": num.NewUint(5000), }).Times(1) - expectStatsUpdated(t, broker) + expectStatsUpdatedWithUnqualifiedParties(t, broker) currentTime = currentTime.Add(1 * time.Minute) endEpoch(t, engine, currentEpoch, currentTime) // start a new epoch for the discount factors to be in place diff --git a/core/volumediscount/helpers_for_test.go b/core/volumediscount/helpers_for_test.go index 23bc166fdc8..75cfde13e24 100644 --- a/core/volumediscount/helpers_for_test.go +++ b/core/volumediscount/helpers_for_test.go @@ -68,6 +68,25 @@ func expectStatsUpdated(t *testing.T, broker *mocks.MockBroker) { }).Times(1) } +func expectStatsUpdatedWithUnqualifiedParties(t *testing.T, broker *mocks.MockBroker) { + t.Helper() + + broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + update, ok := evt.(*events.VolumeDiscountStatsUpdated) + require.Truef(t, ok, "expecting event of type *events.VolumeDiscountStatsUpdated but got %T", evt) + stats := update.VolumeDiscountStatsUpdated() + foundUnqualifiedParty := false + for _, s := range stats.Stats { + if s.PartyId == "p1" { + foundUnqualifiedParty = true + require.Equal(t, "0", s.DiscountFactor) + require.Equal(t, "900", s.RunningVolume) + } + } + require.True(t, foundUnqualifiedParty) + }).Times(1) +} + func expectProgramStarted(t *testing.T, broker *mocks.MockBroker, p1 *types.VolumeDiscountProgram) { t.Helper() diff --git a/datanode/sqlstore/volume_discount_stats_test.go b/datanode/sqlstore/volume_discount_stats_test.go index 0ed4fb9bb34..dfd1f7df92b 100644 --- a/datanode/sqlstore/volume_discount_stats_test.go +++ b/datanode/sqlstore/volume_discount_stats_test.go @@ -85,8 +85,8 @@ func TestVolumeDiscountStats_GetVolumeDiscountStats(t *testing.T) { ps := sqlstore.NewParties(connectionSource) vds := sqlstore.NewVolumeDiscountStats(connectionSource) - parties := make([]entities.Party, 0, 5) - for i := 0; i < 5; i++ { + parties := make([]entities.Party, 0, 6) + for i := 0; i < 6; i++ { block := addTestBlockForTime(t, ctx, bs, time.Now().Add(time.Duration(i-10)*time.Minute)) parties = append(parties, addTestParty(t, ctx, ps, block)) } @@ -231,8 +231,8 @@ func flattenVolumeDiscountStatsForParty(flattenStats []entities.FlattenVolumeDis func setupPartyVolumeDiscountStats(t *testing.T, ctx context.Context, ps *sqlstore.Parties, bs *sqlstore.Blocks) []*eventspb.PartyVolumeDiscountStats { t.Helper() - parties := make([]entities.Party, 0, 5) - for i := 0; i < 5; i++ { + parties := make([]entities.Party, 0, 6) + for i := 0; i < 6; i++ { block := addTestBlockForTime(t, ctx, bs, time.Now().Add(time.Duration(i-10)*time.Minute)) parties = append(parties, addTestParty(t, ctx, ps, block)) } @@ -249,8 +249,17 @@ func setupPartyVolumeDiscountStats(t *testing.T, ctx context.Context, ps *sqlsto func setupPartyVolumeDiscountStatsMod(t *testing.T, parties []entities.Party, f func(i int, party entities.Party) *eventspb.PartyVolumeDiscountStats) []*eventspb.PartyVolumeDiscountStats { t.Helper() - partiesStats := make([]*eventspb.PartyVolumeDiscountStats, 0, 5) + partiesStats := make([]*eventspb.PartyVolumeDiscountStats, 0, 6) for i, p := range parties { + // make the last party an unqualified party + if i == len(parties)-1 { + partiesStats = append(partiesStats, &eventspb.PartyVolumeDiscountStats{ + PartyId: p.ID.String(), + DiscountFactor: "0", + RunningVolume: "99", + }) + continue + } partiesStats = append(partiesStats, f(i, p)) } From be2e810da7f79ffec551b3bd1cbc06e367defe1c Mon Sep 17 00:00:00 2001 From: ze97286 Date: Fri, 8 Dec 2023 06:33:46 +0000 Subject: [PATCH 08/10] fix: expiring stop orders fixed --- CHANGELOG.md | 1 + core/execution/future/market.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05a5b5727d5..59906d18cb5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,6 +69,7 @@ - [10217](https://github.com/vegaprotocol/vega/issues/10217) - Game ID for reward entity should be optional - [10227](https://github.com/vegaprotocol/vega/issues/10227) - Make the wallet errors on spam stats meaningful. - [10193](https://github.com/vegaprotocol/vega/issues/10193) - Denormalize `tx_results` to avoid joins with blocks when queried. +- [10233](https://github.com/vegaprotocol/vega/issues/10233) - Fix expiring stop orders panic. ## 0.73.0 diff --git a/core/execution/future/market.go b/core/execution/future/market.go index 2c87ad65799..49d363a58be 100644 --- a/core/execution/future/market.go +++ b/core/execution/future/market.go @@ -997,7 +997,7 @@ func (m *Market) removeAllStopOrders( sos, _ := m.stopOrders.Cancel(v.Party(), "") for _, so := range sos { if so.Expiry.Expires() { - _ = m.expiringOrders.RemoveOrder(so.Expiry.ExpiresAt.UnixNano(), so.ID) + _ = m.expiringStopOrders.RemoveOrder(so.Expiry.ExpiresAt.UnixNano(), so.ID) } evts = append(evts, events.NewStopOrderEvent(ctx, so)) } From ae745f9292fd54f8eafedb345a6eefefe0e86dea Mon Sep 17 00:00:00 2001 From: Valentin Trinque Date: Tue, 21 Nov 2023 14:59:51 +0100 Subject: [PATCH 09/10] feat: Add teams statistics API --- CHANGELOG.md | 1 + datanode/api/trading_data_v2.go | 56 +- datanode/entities/entities.go | 2 +- datanode/entities/teams.go | 291 +- datanode/gateway/graphql/generated.go | 1398 +++++- datanode/gateway/graphql/gqlgen.yml | 8 + datanode/gateway/graphql/mocks/mocks.go | 20 + datanode/gateway/graphql/resolvers.go | 26 + datanode/gateway/graphql/schema.graphql | 135 +- datanode/gateway/graphql/team_resolvers.go | 12 + .../testdata/events/system_tests.evt | Bin 0 -> 1975688 bytes datanode/networkhistory/service_test.go | 12 +- .../sqlstore/migrations/0062_teams_stats.sql | 77 + datanode/sqlstore/rewards.go | 11 +- datanode/sqlstore/rewards_test.go | 19 +- datanode/sqlstore/teams.go | 120 +- datanode/sqlstore/teams_test.go | 204 + protos/data-node/api/v2/trading_data.pb.go | 4468 +++++++++-------- protos/data-node/api/v2/trading_data.pb.gw.go | 83 + .../data-node/api/v2/trading_data_grpc.pb.go | 44 + protos/embed_test.go | 2 +- .../data-node/api/v2/trading_data.proto | 67 + .../sources/data-node/grpc-rest-bindings.yml | 2 + 23 files changed, 4762 insertions(+), 2296 deletions(-) create mode 100644 datanode/integration/testdata/events/system_tests.evt create mode 100644 datanode/sqlstore/migrations/0062_teams_stats.sql diff --git a/CHANGELOG.md b/CHANGELOG.md index 59906d18cb5..fce6cc48d41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ - [10104](https://github.com/vegaprotocol/vega/issues/10104) - Add network position tracking. - [9981](https://github.com/vegaprotocol/vega/issues/9981) - Support filtering on scope on transfers. - [9983](https://github.com/vegaprotocol/vega/issues/9983) - Implement cap and discount for transfer fees. +- [9980](https://github.com/vegaprotocol/vega/issues/9980) - Add teams statistics API. - [9257](https://github.com/vegaprotocol/vega/issues/9257) - Add games details API - [9260](https://github.com/vegaprotocol/vega/issues/9260) - Enhance rewards API for competitions - [10180](https://github.com/vegaprotocol/vega/issues/10180) - Additional candle intervals diff --git a/datanode/api/trading_data_v2.go b/datanode/api/trading_data_v2.go index e389e29cd23..88a9e90200a 100644 --- a/datanode/api/trading_data_v2.go +++ b/datanode/api/trading_data_v2.go @@ -4566,18 +4566,16 @@ func listTeam(ctx context.Context, teamsService *service.Teams, teamID entities. return nil, formatE(err) } - connection := &v2.TeamConnection{ - Edges: edges, - PageInfo: &v2.PageInfo{ - HasNextPage: false, - HasPreviousPage: false, - StartCursor: team.Cursor().Encode(), - EndCursor: team.Cursor().Encode(), - }, - } - return &v2.ListTeamsResponse{ - Teams: connection, + Teams: &v2.TeamConnection{ + Edges: edges, + PageInfo: &v2.PageInfo{ + HasNextPage: false, + HasPreviousPage: false, + StartCursor: team.Cursor().Encode(), + EndCursor: team.Cursor().Encode(), + }, + }, }, nil } @@ -4600,6 +4598,42 @@ func listTeams(ctx context.Context, teamsService *service.Teams, pagination enti }, nil } +func (t *TradingDataServiceV2) ListTeamsStatistics(ctx context.Context, req *v2.ListTeamsStatisticsRequest) (*v2.ListTeamsStatisticsResponse, error) { + defer metrics.StartAPIRequestAndTimeGRPC("ListTeamsStatistics")() + + pagination, err := entities.CursorPaginationFromProto(req.Pagination) + if err != nil { + return nil, formatE(ErrInvalidPagination, err) + } + + filters := sqlstore.ListTeamsStatisticsFilters{ + AggregationEpochs: 10, + } + if req.TeamId != nil { + filters.TeamID = ptr.From(entities.TeamID(*req.TeamId)) + } + if req.AggregationEpochs != nil { + filters.AggregationEpochs = *req.AggregationEpochs + } + + stats, pageInfo, err := t.teamsService.ListTeamsStatistics(ctx, pagination, filters) + if err != nil { + return nil, formatE(ErrListTeamReferees, err) + } + + edges, err := makeEdges[*v2.TeamStatisticsEdge](stats) + if err != nil { + return nil, formatE(err) + } + + return &v2.ListTeamsStatisticsResponse{ + Statistics: &v2.TeamsStatisticsConnection{ + Edges: edges, + PageInfo: pageInfo.ToProto(), + }, + }, nil +} + func (t *TradingDataServiceV2) ListTeamReferees(ctx context.Context, req *v2.ListTeamRefereesRequest) (*v2.ListTeamRefereesResponse, error) { defer metrics.StartAPIRequestAndTimeGRPC("ListTeamReferees")() pagination, err := entities.CursorPaginationFromProto(req.Pagination) diff --git a/datanode/entities/entities.go b/datanode/entities/entities.go index 055c0f694e1..8b34222e322 100644 --- a/datanode/entities/entities.go +++ b/datanode/entities/entities.go @@ -26,7 +26,7 @@ type Entities interface { ProtocolUpgradeProposal | CoreSnapshotData | EpochRewardSummary | SuccessorMarket | StopOrder | LiquidityProvider | FundingPeriod | FundingPeriodDataPoint | ReferralSet | ReferralSetRefereeStats | FlattenReferralSetStats | Team | TeamMember | TeamMemberHistory | FundingPayment | FlattenVolumeDiscountStats | - PaidLiquidityFeesStats | CurrentAndPreviousLiquidityProvisions | TransferDetails | Game + PaidLiquidityFeesStats | CurrentAndPreviousLiquidityProvisions | TransferDetails | Game | TeamsStatistics } type PagedEntity[T proto.Message] interface { diff --git a/datanode/entities/teams.go b/datanode/entities/teams.go index 2981ac9de12..0805cc1d98c 100644 --- a/datanode/entities/teams.go +++ b/datanode/entities/teams.go @@ -20,6 +20,7 @@ import ( "fmt" "time" + "code.vegaprotocol.io/vega/libs/num" v2 "code.vegaprotocol.io/vega/protos/data-node/api/v2" eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" ) @@ -27,64 +28,47 @@ import ( type ( _Team struct{} TeamID = ID[_Team] +) - Team struct { - ID TeamID - Referrer PartyID - Name string - TeamURL *string - AvatarURL *string - Closed bool - CreatedAt time.Time - CreatedAtEpoch uint64 - VegaTime time.Time - } - - TeamUpdated struct { - ID TeamID - Name string - TeamURL *string - AvatarURL *string - Closed bool - VegaTime time.Time - } - - TeamCursor struct { - CreatedAt time.Time - ID TeamID - } - - TeamMember struct { - TeamID TeamID - PartyID PartyID - JoinedAt time.Time - JoinedAtEpoch uint64 - VegaTime time.Time - } - - TeamMemberHistory struct { - TeamID TeamID - JoinedAt time.Time - JoinedAtEpoch uint64 - } +type Team struct { + ID TeamID + Referrer PartyID + Name string + TeamURL *string + AvatarURL *string + Closed bool + CreatedAt time.Time + CreatedAtEpoch uint64 + VegaTime time.Time +} - RefereeTeamSwitch struct { - FromTeamID TeamID - ToTeamID TeamID - PartyID PartyID - SwitchedAt time.Time - SwitchedAtEpoch uint64 - VegaTime time.Time +func (t Team) Cursor() *Cursor { + tc := TeamCursor{ + CreatedAt: t.CreatedAt, + ID: t.ID, } + return NewCursor(tc.String()) +} - RefereeCursor struct { - PartyID PartyID +func (t Team) ToProto() *v2.Team { + return &v2.Team{ + TeamId: string(t.ID), + Referrer: string(t.Referrer), + Name: t.Name, + TeamUrl: t.TeamURL, + AvatarUrl: t.AvatarURL, + CreatedAt: t.CreatedAt.UnixNano(), + Closed: t.Closed, + CreatedAtEpoch: t.CreatedAtEpoch, } +} - RefereeHistoryCursor struct { - JoinedAtEpoch uint64 - } -) +func (t Team) ToProtoEdge(_ ...any) (*v2.TeamEdge, error) { + return &v2.TeamEdge{ + Node: t.ToProto(), + Cursor: t.Cursor().Encode(), + }, nil +} func TeamCreatedFromProto(created *eventspb.TeamCreated, vegaTime time.Time) *Team { return &Team{ @@ -100,6 +84,15 @@ func TeamCreatedFromProto(created *eventspb.TeamCreated, vegaTime time.Time) *Te } } +type TeamUpdated struct { + ID TeamID + Name string + TeamURL *string + AvatarURL *string + Closed bool + VegaTime time.Time +} + func TeamUpdatedFromProto(updated *eventspb.TeamUpdated, vegaTime time.Time) *TeamUpdated { return &TeamUpdated{ ID: TeamID(updated.TeamId), @@ -111,25 +104,9 @@ func TeamUpdatedFromProto(updated *eventspb.TeamUpdated, vegaTime time.Time) *Te } } -func TeamRefereeFromProto(joined *eventspb.RefereeJoinedTeam, vegaTime time.Time) *TeamMember { - return &TeamMember{ - TeamID: TeamID(joined.TeamId), - PartyID: PartyID(joined.Referee), - JoinedAt: time.Unix(0, joined.JoinedAt), - JoinedAtEpoch: joined.AtEpoch, - VegaTime: vegaTime, - } -} - -func TeamRefereeHistoryFromProto(switched *eventspb.RefereeSwitchedTeam, vegaTime time.Time) *RefereeTeamSwitch { - return &RefereeTeamSwitch{ - FromTeamID: TeamID(switched.FromTeamId), - ToTeamID: TeamID(switched.ToTeamId), - PartyID: PartyID(switched.Referee), - SwitchedAt: time.Unix(0, switched.SwitchedAt), - SwitchedAtEpoch: switched.AtEpoch, - VegaTime: vegaTime, - } +type TeamCursor struct { + CreatedAt time.Time + ID TeamID } func (tc TeamCursor) String() string { @@ -147,64 +124,84 @@ func (tc *TeamCursor) Parse(cursorString string) error { return json.Unmarshal([]byte(cursorString), tc) } -func (rc RefereeCursor) String() string { - bs, err := json.Marshal(rc) - if err != nil { - panic(fmt.Errorf("could not marshal referee cursor: %v", err)) - } - return string(bs) +type TeamsStatistics struct { + TeamID TeamID + TotalQuantumRewards num.Decimal + QuantumRewards []QuantumRewardsPerEpoch + TotalGamesPlayed uint64 + GamesPlayed []GameID } -func (rc *RefereeCursor) Parse(cursorString string) error { - if cursorString == "" { - return nil - } - return json.Unmarshal([]byte(cursorString), rc) +type QuantumRewardsPerEpoch struct { + Epoch uint64 + Total num.Decimal } -func (rh RefereeHistoryCursor) String() string { - bs, err := json.Marshal(rh) - if err != nil { - panic(fmt.Errorf("could not marshal referee history cursor: %v", err)) +func (t TeamsStatistics) Cursor() *Cursor { + tc := TeamsStatisticsCursor{ + ID: t.TeamID, } - return string(bs) + return NewCursor(tc.String()) } -func (rh *RefereeHistoryCursor) Parse(cursorString string) error { - if cursorString == "" { - return nil +func (t TeamsStatistics) ToProto() *v2.TeamStatistics { + gamesPlayed := make([]string, 0, len(t.GamesPlayed)) + for _, id := range t.GamesPlayed { + gamesPlayed = append(gamesPlayed, id.String()) } - return json.Unmarshal([]byte(cursorString), rh) -} -func (t Team) Cursor() *Cursor { - tc := TeamCursor{ - CreatedAt: t.CreatedAt, - ID: t.ID, + quantumRewards := make([]*v2.QuantumRewardsPerEpoch, 0, len(t.QuantumRewards)) + for _, r := range t.QuantumRewards { + quantumRewards = append(quantumRewards, &v2.QuantumRewardsPerEpoch{ + Epoch: r.Epoch, + TotalQuantumRewards: r.Total.String(), + }) } - return NewCursor(tc.String()) -} -func (t Team) ToProto() *v2.Team { - return &v2.Team{ - TeamId: string(t.ID), - Referrer: string(t.Referrer), - Name: t.Name, - TeamUrl: t.TeamURL, - AvatarUrl: t.AvatarURL, - CreatedAt: t.CreatedAt.UnixNano(), - Closed: t.Closed, - CreatedAtEpoch: t.CreatedAtEpoch, + return &v2.TeamStatistics{ + TeamId: string(t.TeamID), + TotalQuantumVolume: "", + TotalQuantumRewards: t.TotalQuantumRewards.String(), + QuantumRewards: quantumRewards, + TotalGamePlayed: t.TotalGamesPlayed, + GamesPlayed: gamesPlayed, } } -func (t Team) ToProtoEdge(_ ...any) (*v2.TeamEdge, error) { - return &v2.TeamEdge{ +func (t TeamsStatistics) ToProtoEdge(_ ...any) (*v2.TeamStatisticsEdge, error) { + return &v2.TeamStatisticsEdge{ Node: t.ToProto(), Cursor: t.Cursor().Encode(), }, nil } +type TeamsStatisticsCursor struct { + ID TeamID +} + +func (c TeamsStatisticsCursor) String() string { + bs, err := json.Marshal(c) + if err != nil { + panic(fmt.Errorf("could not marshal teams stats cursor: %v", err)) + } + return string(bs) +} + +func (c *TeamsStatisticsCursor) Parse(cursorString string) error { + if cursorString == "" { + return nil + } + return json.Unmarshal([]byte(cursorString), c) +} + +type TeamMember struct { + TeamID TeamID + PartyID PartyID + JoinedAt time.Time + JoinedAtEpoch uint64 + VegaTime time.Time +} + func (t TeamMember) Cursor() *Cursor { rc := RefereeCursor{ PartyID: t.PartyID, @@ -228,6 +225,41 @@ func (t TeamMember) ToProtoEdge(_ ...any) (*v2.TeamRefereeEdge, error) { }, nil } +func TeamRefereeFromProto(joined *eventspb.RefereeJoinedTeam, vegaTime time.Time) *TeamMember { + return &TeamMember{ + TeamID: TeamID(joined.TeamId), + PartyID: PartyID(joined.Referee), + JoinedAt: time.Unix(0, joined.JoinedAt), + JoinedAtEpoch: joined.AtEpoch, + VegaTime: vegaTime, + } +} + +type RefereeCursor struct { + PartyID PartyID +} + +func (rc RefereeCursor) String() string { + bs, err := json.Marshal(rc) + if err != nil { + panic(fmt.Errorf("could not marshal referee cursor: %v", err)) + } + return string(bs) +} + +func (rc *RefereeCursor) Parse(cursorString string) error { + if cursorString == "" { + return nil + } + return json.Unmarshal([]byte(cursorString), rc) +} + +type TeamMemberHistory struct { + TeamID TeamID + JoinedAt time.Time + JoinedAtEpoch uint64 +} + func (t TeamMemberHistory) Cursor() *Cursor { rc := RefereeHistoryCursor{ JoinedAtEpoch: t.JoinedAtEpoch, @@ -253,3 +285,42 @@ func (t TeamMemberHistory) ToProtoEdge(_ ...any) (*v2.TeamRefereeHistoryEdge, er Cursor: t.Cursor().Encode(), }, nil } + +type RefereeHistoryCursor struct { + JoinedAtEpoch uint64 +} + +func (rh RefereeHistoryCursor) String() string { + bs, err := json.Marshal(rh) + if err != nil { + panic(fmt.Errorf("could not marshal referee history cursor: %v", err)) + } + return string(bs) +} + +func (rh *RefereeHistoryCursor) Parse(cursorString string) error { + if cursorString == "" { + return nil + } + return json.Unmarshal([]byte(cursorString), rh) +} + +type RefereeTeamSwitch struct { + FromTeamID TeamID + ToTeamID TeamID + PartyID PartyID + SwitchedAt time.Time + SwitchedAtEpoch uint64 + VegaTime time.Time +} + +func TeamRefereeHistoryFromProto(switched *eventspb.RefereeSwitchedTeam, vegaTime time.Time) *RefereeTeamSwitch { + return &RefereeTeamSwitch{ + FromTeamID: TeamID(switched.FromTeamId), + ToTeamID: TeamID(switched.ToTeamId), + PartyID: PartyID(switched.Referee), + SwitchedAt: time.Unix(0, switched.SwitchedAt), + SwitchedAtEpoch: switched.AtEpoch, + VegaTime: vegaTime, + } +} diff --git a/datanode/gateway/graphql/generated.go b/datanode/gateway/graphql/generated.go index ef554ef98fe..f76e54cdc47 100644 --- a/datanode/gateway/graphql/generated.go +++ b/datanode/gateway/graphql/generated.go @@ -130,6 +130,7 @@ type ResolverRoot interface { ProposalDetail() ProposalDetailResolver ProposalTerms() ProposalTermsResolver ProtocolUpgradeProposal() ProtocolUpgradeProposalResolver + QuantumRewardsPerEpoch() QuantumRewardsPerEpochResolver Query() QueryResolver RankingScore() RankingScoreResolver RecurringGovernanceTransfer() RecurringGovernanceTransferResolver @@ -149,6 +150,7 @@ type ResolverRoot interface { Team() TeamResolver TeamReferee() TeamRefereeResolver TeamRefereeHistory() TeamRefereeHistoryResolver + TeamStatistics() TeamStatisticsResolver TradableInstrument() TradableInstrumentResolver Trade() TradeResolver TradeUpdate() TradeUpdateResolver @@ -1923,6 +1925,11 @@ type ComplexityRoot struct { Key func(childComplexity int) int } + QuantumRewardsPerEpoch struct { + Epoch func(childComplexity int) int + TotalQuantumRewards func(childComplexity int) int + } + Query struct { Asset func(childComplexity int, id string) int AssetsConnection func(childComplexity int, id *string, pagination *v2.Pagination) int @@ -1991,6 +1998,7 @@ type ComplexityRoot struct { TeamRefereeHistory func(childComplexity int, referee string, pagination *v2.Pagination) int TeamReferees func(childComplexity int, teamID string, pagination *v2.Pagination) int Teams func(childComplexity int, teamID *string, partyID *string, pagination *v2.Pagination) int + TeamsStatistics func(childComplexity int, teamID *string, aggregationEpochs *int, pagination *v2.Pagination) int TotalTransferFeeDiscount func(childComplexity int, partyID string, assetID string) int Trades func(childComplexity int, filter *TradesFilter, pagination *v2.Pagination, dateRange *v2.DateRange) int Transfer func(childComplexity int, id string) int @@ -2408,6 +2416,25 @@ type ComplexityRoot struct { Node func(childComplexity int) int } + TeamStatistics struct { + GamesPlayed func(childComplexity int) int + QuantumRewards func(childComplexity int) int + TeamId func(childComplexity int) int + TotalGamePlayed func(childComplexity int) int + TotalQuantumRewards func(childComplexity int) int + TotalQuantumVolume func(childComplexity int) int + } + + TeamStatisticsEdge struct { + Cursor func(childComplexity int) int + Node func(childComplexity int) int + } + + TeamsStatisticsConnection struct { + Edges func(childComplexity int) int + PageInfo func(childComplexity int) int + } + TimeUpdate struct { Timestamp func(childComplexity int) int } @@ -3246,6 +3273,9 @@ type ProposalTermsResolver interface { type ProtocolUpgradeProposalResolver interface { UpgradeBlockHeight(ctx context.Context, obj *v1.ProtocolUpgradeEvent) (string, error) } +type QuantumRewardsPerEpochResolver interface { + Epoch(ctx context.Context, obj *v2.QuantumRewardsPerEpoch) (int, error) +} type QueryResolver interface { Asset(ctx context.Context, id string) (*vega.Asset, error) AssetsConnection(ctx context.Context, id *string, pagination *v2.Pagination) (*v2.AssetsConnection, error) @@ -3311,9 +3341,10 @@ type QueryResolver interface { StopOrder(ctx context.Context, id string) (*v1.StopOrderEvent, error) StopOrders(ctx context.Context, filter *v2.StopOrderFilter, pagination *v2.Pagination) (*v2.StopOrderConnection, error) SuccessorMarkets(ctx context.Context, marketID string, fullHistory *bool, pagination *v2.Pagination) (*v2.SuccessorMarketConnection, error) + Teams(ctx context.Context, teamID *string, partyID *string, pagination *v2.Pagination) (*v2.TeamConnection, error) + TeamsStatistics(ctx context.Context, teamID *string, aggregationEpochs *int, pagination *v2.Pagination) (*v2.TeamsStatisticsConnection, error) TeamReferees(ctx context.Context, teamID string, pagination *v2.Pagination) (*v2.TeamRefereeConnection, error) TeamRefereeHistory(ctx context.Context, referee string, pagination *v2.Pagination) (*v2.TeamRefereeHistoryConnection, error) - Teams(ctx context.Context, teamID *string, partyID *string, pagination *v2.Pagination) (*v2.TeamConnection, error) TotalTransferFeeDiscount(ctx context.Context, partyID string, assetID string) (*v2.GetTotalTransferFeeDiscountResponse, error) Trades(ctx context.Context, filter *TradesFilter, pagination *v2.Pagination, dateRange *v2.DateRange) (*v2.TradeConnection, error) TransfersConnection(ctx context.Context, partyID *string, direction *TransferDirection, pagination *v2.Pagination, isReward *bool, fromEpoch *int, toEpoch *int, status *v1.Transfer_Status, scope *v2.ListTransfersRequest_Scope) (*v2.TransferConnection, error) @@ -3444,6 +3475,9 @@ type TeamRefereeResolver interface { type TeamRefereeHistoryResolver interface { JoinedAtEpoch(ctx context.Context, obj *v2.TeamRefereeHistory) (int, error) } +type TeamStatisticsResolver interface { + TotalGamePlayed(ctx context.Context, obj *v2.TeamStatistics) (int, error) +} type TradableInstrumentResolver interface { RiskModel(ctx context.Context, obj *vega.TradableInstrument) (RiskModel, error) } @@ -10979,6 +11013,20 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.PubKey.Key(childComplexity), true + case "QuantumRewardsPerEpoch.epoch": + if e.complexity.QuantumRewardsPerEpoch.Epoch == nil { + break + } + + return e.complexity.QuantumRewardsPerEpoch.Epoch(childComplexity), true + + case "QuantumRewardsPerEpoch.total_quantum_rewards": + if e.complexity.QuantumRewardsPerEpoch.TotalQuantumRewards == nil { + break + } + + return e.complexity.QuantumRewardsPerEpoch.TotalQuantumRewards(childComplexity), true + case "Query.asset": if e.complexity.Query.Asset == nil { break @@ -11743,6 +11791,18 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Query.Teams(childComplexity, args["teamId"].(*string), args["partyId"].(*string), args["pagination"].(*v2.Pagination)), true + case "Query.teamsStatistics": + if e.complexity.Query.TeamsStatistics == nil { + break + } + + args, err := ec.field_Query_teamsStatistics_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Query.TeamsStatistics(childComplexity, args["teamId"].(*string), args["aggregationEpochs"].(*int), args["pagination"].(*v2.Pagination)), true + case "Query.totalTransferFeeDiscount": if e.complexity.Query.TotalTransferFeeDiscount == nil { break @@ -13524,6 +13584,76 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.TeamRefereeHistoryEdge.Node(childComplexity), true + case "TeamStatistics.gamesPlayed": + if e.complexity.TeamStatistics.GamesPlayed == nil { + break + } + + return e.complexity.TeamStatistics.GamesPlayed(childComplexity), true + + case "TeamStatistics.quantumRewards": + if e.complexity.TeamStatistics.QuantumRewards == nil { + break + } + + return e.complexity.TeamStatistics.QuantumRewards(childComplexity), true + + case "TeamStatistics.teamId": + if e.complexity.TeamStatistics.TeamId == nil { + break + } + + return e.complexity.TeamStatistics.TeamId(childComplexity), true + + case "TeamStatistics.totalGamePlayed": + if e.complexity.TeamStatistics.TotalGamePlayed == nil { + break + } + + return e.complexity.TeamStatistics.TotalGamePlayed(childComplexity), true + + case "TeamStatistics.totalQuantumRewards": + if e.complexity.TeamStatistics.TotalQuantumRewards == nil { + break + } + + return e.complexity.TeamStatistics.TotalQuantumRewards(childComplexity), true + + case "TeamStatistics.totalQuantumVolume": + if e.complexity.TeamStatistics.TotalQuantumVolume == nil { + break + } + + return e.complexity.TeamStatistics.TotalQuantumVolume(childComplexity), true + + case "TeamStatisticsEdge.cursor": + if e.complexity.TeamStatisticsEdge.Cursor == nil { + break + } + + return e.complexity.TeamStatisticsEdge.Cursor(childComplexity), true + + case "TeamStatisticsEdge.node": + if e.complexity.TeamStatisticsEdge.Node == nil { + break + } + + return e.complexity.TeamStatisticsEdge.Node(childComplexity), true + + case "TeamsStatisticsConnection.edges": + if e.complexity.TeamsStatisticsConnection.Edges == nil { + break + } + + return e.complexity.TeamsStatisticsConnection.Edges(childComplexity), true + + case "TeamsStatisticsConnection.pageInfo": + if e.complexity.TeamsStatisticsConnection.PageInfo == nil { + break + } + + return e.complexity.TeamsStatisticsConnection.PageInfo(childComplexity), true + case "TimeUpdate.timestamp": if e.complexity.TimeUpdate.Timestamp == nil { break @@ -17429,6 +17559,39 @@ func (ec *executionContext) field_Query_teamReferees_args(ctx context.Context, r return args, nil } +func (ec *executionContext) field_Query_teamsStatistics_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 *string + if tmp, ok := rawArgs["teamId"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("teamId")) + arg0, err = ec.unmarshalOID2ᚖstring(ctx, tmp) + if err != nil { + return nil, err + } + } + args["teamId"] = arg0 + var arg1 *int + if tmp, ok := rawArgs["aggregationEpochs"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("aggregationEpochs")) + arg1, err = ec.unmarshalOInt2ᚖint(ctx, tmp) + if err != nil { + return nil, err + } + } + args["aggregationEpochs"] = arg1 + var arg2 *v2.Pagination + if tmp, ok := rawArgs["pagination"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("pagination")) + arg2, err = ec.unmarshalOPagination2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐPagination(ctx, tmp) + if err != nil { + return nil, err + } + } + args["pagination"] = arg2 + return args, nil +} + func (ec *executionContext) field_Query_teams_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { var err error args := map[string]interface{}{} @@ -67942,6 +68105,94 @@ func (ec *executionContext) fieldContext_PubKey_key(ctx context.Context, field g return fc, nil } +func (ec *executionContext) _QuantumRewardsPerEpoch_epoch(ctx context.Context, field graphql.CollectedField, obj *v2.QuantumRewardsPerEpoch) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_QuantumRewardsPerEpoch_epoch(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.QuantumRewardsPerEpoch().Epoch(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(int) + fc.Result = res + return ec.marshalNInt2int(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_QuantumRewardsPerEpoch_epoch(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "QuantumRewardsPerEpoch", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _QuantumRewardsPerEpoch_total_quantum_rewards(ctx context.Context, field graphql.CollectedField, obj *v2.QuantumRewardsPerEpoch) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_QuantumRewardsPerEpoch_total_quantum_rewards(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.TotalQuantumRewards, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_QuantumRewardsPerEpoch_total_quantum_rewards(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "QuantumRewardsPerEpoch", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _Query_asset(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Query_asset(ctx, field) if err != nil { @@ -72105,6 +72356,122 @@ func (ec *executionContext) fieldContext_Query_successorMarkets(ctx context.Cont return fc, nil } +func (ec *executionContext) _Query_teams(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_teams(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Query().Teams(rctx, fc.Args["teamId"].(*string), fc.Args["partyId"].(*string), fc.Args["pagination"].(*v2.Pagination)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*v2.TeamConnection) + fc.Result = res + return ec.marshalOTeamConnection2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐTeamConnection(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_teams(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "edges": + return ec.fieldContext_TeamConnection_edges(ctx, field) + case "pageInfo": + return ec.fieldContext_TeamConnection_pageInfo(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type TeamConnection", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Query_teams_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return + } + return fc, nil +} + +func (ec *executionContext) _Query_teamsStatistics(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_teamsStatistics(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Query().TeamsStatistics(rctx, fc.Args["teamId"].(*string), fc.Args["aggregationEpochs"].(*int), fc.Args["pagination"].(*v2.Pagination)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*v2.TeamsStatisticsConnection) + fc.Result = res + return ec.marshalOTeamsStatisticsConnection2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐTeamsStatisticsConnection(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_teamsStatistics(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "edges": + return ec.fieldContext_TeamsStatisticsConnection_edges(ctx, field) + case "pageInfo": + return ec.fieldContext_TeamsStatisticsConnection_pageInfo(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type TeamsStatisticsConnection", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Query_teamsStatistics_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return + } + return fc, nil +} + func (ec *executionContext) _Query_teamReferees(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Query_teamReferees(ctx, field) if err != nil { @@ -72221,64 +72588,6 @@ func (ec *executionContext) fieldContext_Query_teamRefereeHistory(ctx context.Co return fc, nil } -func (ec *executionContext) _Query_teams(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Query_teams(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().Teams(rctx, fc.Args["teamId"].(*string), fc.Args["partyId"].(*string), fc.Args["pagination"].(*v2.Pagination)) - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*v2.TeamConnection) - fc.Result = res - return ec.marshalOTeamConnection2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐTeamConnection(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext_Query_teams(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Query", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "edges": - return ec.fieldContext_TeamConnection_edges(ctx, field) - case "pageInfo": - return ec.fieldContext_TeamConnection_pageInfo(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type TeamConnection", field.Name) - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Query_teams_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return - } - return fc, nil -} - func (ec *executionContext) _Query_totalTransferFeeDiscount(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Query_totalTransferFeeDiscount(ctx, field) if err != nil { @@ -84217,9 +84526,341 @@ func (ec *executionContext) _TeamRefereeEdge_cursor(ctx context.Context, field g return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_TeamRefereeEdge_cursor(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_TeamRefereeEdge_cursor(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TeamRefereeEdge", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _TeamRefereeHistory_teamId(ctx context.Context, field graphql.CollectedField, obj *v2.TeamRefereeHistory) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TeamRefereeHistory_teamId(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.TeamId, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNID2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TeamRefereeHistory_teamId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TeamRefereeHistory", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type ID does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _TeamRefereeHistory_joinedAt(ctx context.Context, field graphql.CollectedField, obj *v2.TeamRefereeHistory) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TeamRefereeHistory_joinedAt(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.JoinedAt, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(int64) + fc.Result = res + return ec.marshalNTimestamp2int64(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TeamRefereeHistory_joinedAt(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TeamRefereeHistory", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Timestamp does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _TeamRefereeHistory_joinedAtEpoch(ctx context.Context, field graphql.CollectedField, obj *v2.TeamRefereeHistory) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TeamRefereeHistory_joinedAtEpoch(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.TeamRefereeHistory().JoinedAtEpoch(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(int) + fc.Result = res + return ec.marshalNInt2int(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TeamRefereeHistory_joinedAtEpoch(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TeamRefereeHistory", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _TeamRefereeHistoryConnection_edges(ctx context.Context, field graphql.CollectedField, obj *v2.TeamRefereeHistoryConnection) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TeamRefereeHistoryConnection_edges(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Edges, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]*v2.TeamRefereeHistoryEdge) + fc.Result = res + return ec.marshalNTeamRefereeHistoryEdge2ᚕᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐTeamRefereeHistoryEdgeᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TeamRefereeHistoryConnection_edges(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TeamRefereeHistoryConnection", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "node": + return ec.fieldContext_TeamRefereeHistoryEdge_node(ctx, field) + case "cursor": + return ec.fieldContext_TeamRefereeHistoryEdge_cursor(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type TeamRefereeHistoryEdge", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _TeamRefereeHistoryConnection_pageInfo(ctx context.Context, field graphql.CollectedField, obj *v2.TeamRefereeHistoryConnection) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TeamRefereeHistoryConnection_pageInfo(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.PageInfo, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*v2.PageInfo) + fc.Result = res + return ec.marshalNPageInfo2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐPageInfo(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TeamRefereeHistoryConnection_pageInfo(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TeamRefereeHistoryConnection", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "hasNextPage": + return ec.fieldContext_PageInfo_hasNextPage(ctx, field) + case "hasPreviousPage": + return ec.fieldContext_PageInfo_hasPreviousPage(ctx, field) + case "startCursor": + return ec.fieldContext_PageInfo_startCursor(ctx, field) + case "endCursor": + return ec.fieldContext_PageInfo_endCursor(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type PageInfo", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _TeamRefereeHistoryEdge_node(ctx context.Context, field graphql.CollectedField, obj *v2.TeamRefereeHistoryEdge) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TeamRefereeHistoryEdge_node(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Node, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*v2.TeamRefereeHistory) + fc.Result = res + return ec.marshalNTeamRefereeHistory2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐTeamRefereeHistory(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TeamRefereeHistoryEdge_node(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TeamRefereeHistoryEdge", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "teamId": + return ec.fieldContext_TeamRefereeHistory_teamId(ctx, field) + case "joinedAt": + return ec.fieldContext_TeamRefereeHistory_joinedAt(ctx, field) + case "joinedAtEpoch": + return ec.fieldContext_TeamRefereeHistory_joinedAtEpoch(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type TeamRefereeHistory", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _TeamRefereeHistoryEdge_cursor(ctx context.Context, field graphql.CollectedField, obj *v2.TeamRefereeHistoryEdge) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TeamRefereeHistoryEdge_cursor(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Cursor, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TeamRefereeHistoryEdge_cursor(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "TeamRefereeEdge", + Object: "TeamRefereeHistoryEdge", Field: field, IsMethod: false, IsResolver: false, @@ -84230,8 +84871,8 @@ func (ec *executionContext) fieldContext_TeamRefereeEdge_cursor(ctx context.Cont return fc, nil } -func (ec *executionContext) _TeamRefereeHistory_teamId(ctx context.Context, field graphql.CollectedField, obj *v2.TeamRefereeHistory) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_TeamRefereeHistory_teamId(ctx, field) +func (ec *executionContext) _TeamStatistics_teamId(ctx context.Context, field graphql.CollectedField, obj *v2.TeamStatistics) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TeamStatistics_teamId(ctx, field) if err != nil { return graphql.Null } @@ -84258,24 +84899,24 @@ func (ec *executionContext) _TeamRefereeHistory_teamId(ctx context.Context, fiel } res := resTmp.(string) fc.Result = res - return ec.marshalNID2string(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_TeamRefereeHistory_teamId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_TeamStatistics_teamId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "TeamRefereeHistory", + Object: "TeamStatistics", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type ID does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _TeamRefereeHistory_joinedAt(ctx context.Context, field graphql.CollectedField, obj *v2.TeamRefereeHistory) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_TeamRefereeHistory_joinedAt(ctx, field) +func (ec *executionContext) _TeamStatistics_totalQuantumVolume(ctx context.Context, field graphql.CollectedField, obj *v2.TeamStatistics) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TeamStatistics_totalQuantumVolume(ctx, field) if err != nil { return graphql.Null } @@ -84288,7 +84929,7 @@ func (ec *executionContext) _TeamRefereeHistory_joinedAt(ctx context.Context, fi }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.JoinedAt, nil + return obj.TotalQuantumVolume, nil }) if err != nil { ec.Error(ctx, err) @@ -84300,26 +84941,26 @@ func (ec *executionContext) _TeamRefereeHistory_joinedAt(ctx context.Context, fi } return graphql.Null } - res := resTmp.(int64) + res := resTmp.(string) fc.Result = res - return ec.marshalNTimestamp2int64(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_TeamRefereeHistory_joinedAt(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_TeamStatistics_totalQuantumVolume(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "TeamRefereeHistory", + Object: "TeamStatistics", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Timestamp does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _TeamRefereeHistory_joinedAtEpoch(ctx context.Context, field graphql.CollectedField, obj *v2.TeamRefereeHistory) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_TeamRefereeHistory_joinedAtEpoch(ctx, field) +func (ec *executionContext) _TeamStatistics_totalQuantumRewards(ctx context.Context, field graphql.CollectedField, obj *v2.TeamStatistics) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TeamStatistics_totalQuantumRewards(ctx, field) if err != nil { return graphql.Null } @@ -84332,7 +84973,7 @@ func (ec *executionContext) _TeamRefereeHistory_joinedAtEpoch(ctx context.Contex }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.TeamRefereeHistory().JoinedAtEpoch(rctx, obj) + return obj.TotalQuantumRewards, nil }) if err != nil { ec.Error(ctx, err) @@ -84344,26 +84985,26 @@ func (ec *executionContext) _TeamRefereeHistory_joinedAtEpoch(ctx context.Contex } return graphql.Null } - res := resTmp.(int) + res := resTmp.(string) fc.Result = res - return ec.marshalNInt2int(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_TeamRefereeHistory_joinedAtEpoch(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_TeamStatistics_totalQuantumRewards(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "TeamRefereeHistory", + Object: "TeamStatistics", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _TeamRefereeHistoryConnection_edges(ctx context.Context, field graphql.CollectedField, obj *v2.TeamRefereeHistoryConnection) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_TeamRefereeHistoryConnection_edges(ctx, field) +func (ec *executionContext) _TeamStatistics_quantumRewards(ctx context.Context, field graphql.CollectedField, obj *v2.TeamStatistics) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TeamStatistics_quantumRewards(ctx, field) if err != nil { return graphql.Null } @@ -84376,7 +85017,7 @@ func (ec *executionContext) _TeamRefereeHistoryConnection_edges(ctx context.Cont }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.Edges, nil + return obj.QuantumRewards, nil }) if err != nil { ec.Error(ctx, err) @@ -84388,32 +85029,32 @@ func (ec *executionContext) _TeamRefereeHistoryConnection_edges(ctx context.Cont } return graphql.Null } - res := resTmp.([]*v2.TeamRefereeHistoryEdge) + res := resTmp.([]*v2.QuantumRewardsPerEpoch) fc.Result = res - return ec.marshalNTeamRefereeHistoryEdge2ᚕᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐTeamRefereeHistoryEdgeᚄ(ctx, field.Selections, res) + return ec.marshalNQuantumRewardsPerEpoch2ᚕᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐQuantumRewardsPerEpochᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_TeamRefereeHistoryConnection_edges(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_TeamStatistics_quantumRewards(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "TeamRefereeHistoryConnection", + Object: "TeamStatistics", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "node": - return ec.fieldContext_TeamRefereeHistoryEdge_node(ctx, field) - case "cursor": - return ec.fieldContext_TeamRefereeHistoryEdge_cursor(ctx, field) + case "epoch": + return ec.fieldContext_QuantumRewardsPerEpoch_epoch(ctx, field) + case "total_quantum_rewards": + return ec.fieldContext_QuantumRewardsPerEpoch_total_quantum_rewards(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type TeamRefereeHistoryEdge", field.Name) + return nil, fmt.Errorf("no field named %q was found under type QuantumRewardsPerEpoch", field.Name) }, } return fc, nil } -func (ec *executionContext) _TeamRefereeHistoryConnection_pageInfo(ctx context.Context, field graphql.CollectedField, obj *v2.TeamRefereeHistoryConnection) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_TeamRefereeHistoryConnection_pageInfo(ctx, field) +func (ec *executionContext) _TeamStatistics_totalGamePlayed(ctx context.Context, field graphql.CollectedField, obj *v2.TeamStatistics) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TeamStatistics_totalGamePlayed(ctx, field) if err != nil { return graphql.Null } @@ -84426,7 +85067,7 @@ func (ec *executionContext) _TeamRefereeHistoryConnection_pageInfo(ctx context.C }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.PageInfo, nil + return ec.resolvers.TeamStatistics().TotalGamePlayed(rctx, obj) }) if err != nil { ec.Error(ctx, err) @@ -84438,36 +85079,70 @@ func (ec *executionContext) _TeamRefereeHistoryConnection_pageInfo(ctx context.C } return graphql.Null } - res := resTmp.(*v2.PageInfo) + res := resTmp.(int) fc.Result = res - return ec.marshalNPageInfo2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐPageInfo(ctx, field.Selections, res) + return ec.marshalNInt2int(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_TeamRefereeHistoryConnection_pageInfo(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_TeamStatistics_totalGamePlayed(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "TeamRefereeHistoryConnection", + Object: "TeamStatistics", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _TeamStatistics_gamesPlayed(ctx context.Context, field graphql.CollectedField, obj *v2.TeamStatistics) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TeamStatistics_gamesPlayed(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.GamesPlayed, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]string) + fc.Result = res + return ec.marshalNString2ᚕstringᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TeamStatistics_gamesPlayed(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TeamStatistics", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "hasNextPage": - return ec.fieldContext_PageInfo_hasNextPage(ctx, field) - case "hasPreviousPage": - return ec.fieldContext_PageInfo_hasPreviousPage(ctx, field) - case "startCursor": - return ec.fieldContext_PageInfo_startCursor(ctx, field) - case "endCursor": - return ec.fieldContext_PageInfo_endCursor(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type PageInfo", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _TeamRefereeHistoryEdge_node(ctx context.Context, field graphql.CollectedField, obj *v2.TeamRefereeHistoryEdge) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_TeamRefereeHistoryEdge_node(ctx, field) +func (ec *executionContext) _TeamStatisticsEdge_node(ctx context.Context, field graphql.CollectedField, obj *v2.TeamStatisticsEdge) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TeamStatisticsEdge_node(ctx, field) if err != nil { return graphql.Null } @@ -84492,34 +85167,40 @@ func (ec *executionContext) _TeamRefereeHistoryEdge_node(ctx context.Context, fi } return graphql.Null } - res := resTmp.(*v2.TeamRefereeHistory) + res := resTmp.(*v2.TeamStatistics) fc.Result = res - return ec.marshalNTeamRefereeHistory2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐTeamRefereeHistory(ctx, field.Selections, res) + return ec.marshalNTeamStatistics2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐTeamStatistics(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_TeamRefereeHistoryEdge_node(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_TeamStatisticsEdge_node(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "TeamRefereeHistoryEdge", + Object: "TeamStatisticsEdge", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { case "teamId": - return ec.fieldContext_TeamRefereeHistory_teamId(ctx, field) - case "joinedAt": - return ec.fieldContext_TeamRefereeHistory_joinedAt(ctx, field) - case "joinedAtEpoch": - return ec.fieldContext_TeamRefereeHistory_joinedAtEpoch(ctx, field) + return ec.fieldContext_TeamStatistics_teamId(ctx, field) + case "totalQuantumVolume": + return ec.fieldContext_TeamStatistics_totalQuantumVolume(ctx, field) + case "totalQuantumRewards": + return ec.fieldContext_TeamStatistics_totalQuantumRewards(ctx, field) + case "quantumRewards": + return ec.fieldContext_TeamStatistics_quantumRewards(ctx, field) + case "totalGamePlayed": + return ec.fieldContext_TeamStatistics_totalGamePlayed(ctx, field) + case "gamesPlayed": + return ec.fieldContext_TeamStatistics_gamesPlayed(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type TeamRefereeHistory", field.Name) + return nil, fmt.Errorf("no field named %q was found under type TeamStatistics", field.Name) }, } return fc, nil } -func (ec *executionContext) _TeamRefereeHistoryEdge_cursor(ctx context.Context, field graphql.CollectedField, obj *v2.TeamRefereeHistoryEdge) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_TeamRefereeHistoryEdge_cursor(ctx, field) +func (ec *executionContext) _TeamStatisticsEdge_cursor(ctx context.Context, field graphql.CollectedField, obj *v2.TeamStatisticsEdge) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TeamStatisticsEdge_cursor(ctx, field) if err != nil { return graphql.Null } @@ -84549,9 +85230,9 @@ func (ec *executionContext) _TeamRefereeHistoryEdge_cursor(ctx context.Context, return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_TeamRefereeHistoryEdge_cursor(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_TeamStatisticsEdge_cursor(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "TeamRefereeHistoryEdge", + Object: "TeamStatisticsEdge", Field: field, IsMethod: false, IsResolver: false, @@ -84562,6 +85243,110 @@ func (ec *executionContext) fieldContext_TeamRefereeHistoryEdge_cursor(ctx conte return fc, nil } +func (ec *executionContext) _TeamsStatisticsConnection_edges(ctx context.Context, field graphql.CollectedField, obj *v2.TeamsStatisticsConnection) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TeamsStatisticsConnection_edges(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Edges, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]*v2.TeamStatisticsEdge) + fc.Result = res + return ec.marshalNTeamStatisticsEdge2ᚕᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐTeamStatisticsEdgeᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TeamsStatisticsConnection_edges(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TeamsStatisticsConnection", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "node": + return ec.fieldContext_TeamStatisticsEdge_node(ctx, field) + case "cursor": + return ec.fieldContext_TeamStatisticsEdge_cursor(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type TeamStatisticsEdge", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _TeamsStatisticsConnection_pageInfo(ctx context.Context, field graphql.CollectedField, obj *v2.TeamsStatisticsConnection) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TeamsStatisticsConnection_pageInfo(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.PageInfo, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*v2.PageInfo) + fc.Result = res + return ec.marshalNPageInfo2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐPageInfo(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TeamsStatisticsConnection_pageInfo(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TeamsStatisticsConnection", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "hasNextPage": + return ec.fieldContext_PageInfo_hasNextPage(ctx, field) + case "hasPreviousPage": + return ec.fieldContext_PageInfo_hasPreviousPage(ctx, field) + case "startCursor": + return ec.fieldContext_PageInfo_startCursor(ctx, field) + case "endCursor": + return ec.fieldContext_PageInfo_endCursor(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type PageInfo", field.Name) + }, + } + return fc, nil +} + func (ec *executionContext) _TimeUpdate_timestamp(ctx context.Context, field graphql.CollectedField, obj *TimeUpdate) (ret graphql.Marshaler) { fc, err := ec.fieldContext_TimeUpdate_timestamp(ctx, field) if err != nil { @@ -111384,6 +112169,54 @@ func (ec *executionContext) _PubKey(ctx context.Context, sel ast.SelectionSet, o return out } +var quantumRewardsPerEpochImplementors = []string{"QuantumRewardsPerEpoch"} + +func (ec *executionContext) _QuantumRewardsPerEpoch(ctx context.Context, sel ast.SelectionSet, obj *v2.QuantumRewardsPerEpoch) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, quantumRewardsPerEpochImplementors) + out := graphql.NewFieldSet(fields) + var invalids uint32 + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("QuantumRewardsPerEpoch") + case "epoch": + field := field + + innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._QuantumRewardsPerEpoch_epoch(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + return res + } + + out.Concurrently(i, func() graphql.Marshaler { + return innerFunc(ctx) + + }) + case "total_quantum_rewards": + + out.Values[i] = ec._QuantumRewardsPerEpoch_total_quantum_rewards(ctx, field, obj) + + if out.Values[i] == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch() + if invalids > 0 { + return graphql.Null + } + return out +} + var queryImplementors = []string{"Query"} func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { @@ -112758,7 +113591,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr out.Concurrently(i, func() graphql.Marshaler { return rrm(innerCtx) }) - case "teamReferees": + case "teams": field := field innerFunc := func(ctx context.Context) (res graphql.Marshaler) { @@ -112767,7 +113600,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr ec.Error(ctx, ec.Recover(ctx, r)) } }() - res = ec._Query_teamReferees(ctx, field) + res = ec._Query_teams(ctx, field) return res } @@ -112778,7 +113611,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr out.Concurrently(i, func() graphql.Marshaler { return rrm(innerCtx) }) - case "teamRefereeHistory": + case "teamsStatistics": field := field innerFunc := func(ctx context.Context) (res graphql.Marshaler) { @@ -112787,7 +113620,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr ec.Error(ctx, ec.Recover(ctx, r)) } }() - res = ec._Query_teamRefereeHistory(ctx, field) + res = ec._Query_teamsStatistics(ctx, field) return res } @@ -112798,7 +113631,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr out.Concurrently(i, func() graphql.Marshaler { return rrm(innerCtx) }) - case "teams": + case "teamReferees": field := field innerFunc := func(ctx context.Context) (res graphql.Marshaler) { @@ -112807,7 +113640,27 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr ec.Error(ctx, ec.Recover(ctx, r)) } }() - res = ec._Query_teams(ctx, field) + res = ec._Query_teamReferees(ctx, field) + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + } + + out.Concurrently(i, func() graphql.Marshaler { + return rrm(innerCtx) + }) + case "teamRefereeHistory": + field := field + + innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_teamRefereeHistory(ctx, field) return res } @@ -116501,6 +117354,152 @@ func (ec *executionContext) _TeamRefereeHistoryEdge(ctx context.Context, sel ast return out } +var teamStatisticsImplementors = []string{"TeamStatistics"} + +func (ec *executionContext) _TeamStatistics(ctx context.Context, sel ast.SelectionSet, obj *v2.TeamStatistics) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, teamStatisticsImplementors) + out := graphql.NewFieldSet(fields) + var invalids uint32 + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("TeamStatistics") + case "teamId": + + out.Values[i] = ec._TeamStatistics_teamId(ctx, field, obj) + + if out.Values[i] == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + case "totalQuantumVolume": + + out.Values[i] = ec._TeamStatistics_totalQuantumVolume(ctx, field, obj) + + if out.Values[i] == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + case "totalQuantumRewards": + + out.Values[i] = ec._TeamStatistics_totalQuantumRewards(ctx, field, obj) + + if out.Values[i] == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + case "quantumRewards": + + out.Values[i] = ec._TeamStatistics_quantumRewards(ctx, field, obj) + + if out.Values[i] == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + case "totalGamePlayed": + field := field + + innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._TeamStatistics_totalGamePlayed(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + return res + } + + out.Concurrently(i, func() graphql.Marshaler { + return innerFunc(ctx) + + }) + case "gamesPlayed": + + out.Values[i] = ec._TeamStatistics_gamesPlayed(ctx, field, obj) + + if out.Values[i] == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch() + if invalids > 0 { + return graphql.Null + } + return out +} + +var teamStatisticsEdgeImplementors = []string{"TeamStatisticsEdge"} + +func (ec *executionContext) _TeamStatisticsEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.TeamStatisticsEdge) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, teamStatisticsEdgeImplementors) + out := graphql.NewFieldSet(fields) + var invalids uint32 + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("TeamStatisticsEdge") + case "node": + + out.Values[i] = ec._TeamStatisticsEdge_node(ctx, field, obj) + + if out.Values[i] == graphql.Null { + invalids++ + } + case "cursor": + + out.Values[i] = ec._TeamStatisticsEdge_cursor(ctx, field, obj) + + if out.Values[i] == graphql.Null { + invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch() + if invalids > 0 { + return graphql.Null + } + return out +} + +var teamsStatisticsConnectionImplementors = []string{"TeamsStatisticsConnection"} + +func (ec *executionContext) _TeamsStatisticsConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.TeamsStatisticsConnection) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, teamsStatisticsConnectionImplementors) + out := graphql.NewFieldSet(fields) + var invalids uint32 + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("TeamsStatisticsConnection") + case "edges": + + out.Values[i] = ec._TeamsStatisticsConnection_edges(ctx, field, obj) + + if out.Values[i] == graphql.Null { + invalids++ + } + case "pageInfo": + + out.Values[i] = ec._TeamsStatisticsConnection_pageInfo(ctx, field, obj) + + if out.Values[i] == graphql.Null { + invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch() + if invalids > 0 { + return graphql.Null + } + return out +} + var timeUpdateImplementors = []string{"TimeUpdate", "Event"} func (ec *executionContext) _TimeUpdate(ctx context.Context, sel ast.SelectionSet, obj *TimeUpdate) graphql.Marshaler { @@ -122848,6 +123847,60 @@ func (ec *executionContext) marshalNProtocolUpgradeProposalStatus2codeᚗvegapro return res } +func (ec *executionContext) marshalNQuantumRewardsPerEpoch2ᚕᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐQuantumRewardsPerEpochᚄ(ctx context.Context, sel ast.SelectionSet, v []*v2.QuantumRewardsPerEpoch) graphql.Marshaler { + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalNQuantumRewardsPerEpoch2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐQuantumRewardsPerEpoch(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalNQuantumRewardsPerEpoch2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐQuantumRewardsPerEpoch(ctx context.Context, sel ast.SelectionSet, v *v2.QuantumRewardsPerEpoch) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec._QuantumRewardsPerEpoch(ctx, sel, v) +} + func (ec *executionContext) marshalNRankingScore2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐRankingScore(ctx context.Context, sel ast.SelectionSet, v *vega.RankingScore) graphql.Marshaler { if v == nil { if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { @@ -123728,6 +124781,70 @@ func (ec *executionContext) marshalNTeamRefereeHistoryEdge2ᚖcodeᚗvegaprotoco return ec._TeamRefereeHistoryEdge(ctx, sel, v) } +func (ec *executionContext) marshalNTeamStatistics2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐTeamStatistics(ctx context.Context, sel ast.SelectionSet, v *v2.TeamStatistics) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec._TeamStatistics(ctx, sel, v) +} + +func (ec *executionContext) marshalNTeamStatisticsEdge2ᚕᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐTeamStatisticsEdgeᚄ(ctx context.Context, sel ast.SelectionSet, v []*v2.TeamStatisticsEdge) graphql.Marshaler { + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalNTeamStatisticsEdge2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐTeamStatisticsEdge(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalNTeamStatisticsEdge2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐTeamStatisticsEdge(ctx context.Context, sel ast.SelectionSet, v *v2.TeamStatisticsEdge) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec._TeamStatisticsEdge(ctx, sel, v) +} + func (ec *executionContext) unmarshalNTimestamp2int64(ctx context.Context, v interface{}) (int64, error) { res, err := marshallers.UnmarshalTimestamp(v) return res, graphql.ErrorOnPath(ctx, err) @@ -129690,6 +130807,13 @@ func (ec *executionContext) marshalOTeamRefereeHistoryConnection2ᚖcodeᚗvegap return ec._TeamRefereeHistoryConnection(ctx, sel, v) } +func (ec *executionContext) marshalOTeamsStatisticsConnection2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐTeamsStatisticsConnection(ctx context.Context, sel ast.SelectionSet, v *v2.TeamsStatisticsConnection) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._TeamsStatisticsConnection(ctx, sel, v) +} + func (ec *executionContext) unmarshalOTimestamp2int64(ctx context.Context, v interface{}) (int64, error) { res, err := marshallers.UnmarshalTimestamp(v) return res, graphql.ErrorOnPath(ctx, err) diff --git a/datanode/gateway/graphql/gqlgen.yml b/datanode/gateway/graphql/gqlgen.yml index 82bde7ce97b..55bff3db6d8 100644 --- a/datanode/gateway/graphql/gqlgen.yml +++ b/datanode/gateway/graphql/gqlgen.yml @@ -688,6 +688,14 @@ models: model: code.vegaprotocol.io/vega/protos/data-node/api/v2.TeamEdge TeamConnection: model: code.vegaprotocol.io/vega/protos/data-node/api/v2.TeamConnection + TeamStatistics: + model: code.vegaprotocol.io/vega/protos/data-node/api/v2.TeamStatistics + QuantumRewardsPerEpoch: + model: code.vegaprotocol.io/vega/protos/data-node/api/v2.QuantumRewardsPerEpoch + TeamStatisticsEdge: + model: code.vegaprotocol.io/vega/protos/data-node/api/v2.TeamStatisticsEdge + TeamsStatisticsConnection: + model: code.vegaprotocol.io/vega/protos/data-node/api/v2.TeamsStatisticsConnection TeamReferee: model: code.vegaprotocol.io/vega/protos/data-node/api/v2.TeamReferee TeamRefereeEdge: diff --git a/datanode/gateway/graphql/mocks/mocks.go b/datanode/gateway/graphql/mocks/mocks.go index 985ecbb0e27..156fcc5b8eb 100644 --- a/datanode/gateway/graphql/mocks/mocks.go +++ b/datanode/gateway/graphql/mocks/mocks.go @@ -2180,6 +2180,26 @@ func (mr *MockTradingDataServiceClientV2MockRecorder) ListTeams(arg0, arg1 inter return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListTeams", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListTeams), varargs...) } +// ListTeamsStatistics mocks base method. +func (m *MockTradingDataServiceClientV2) ListTeamsStatistics(arg0 context.Context, arg1 *v2.ListTeamsStatisticsRequest, arg2 ...grpc.CallOption) (*v2.ListTeamsStatisticsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListTeamsStatistics", varargs...) + ret0, _ := ret[0].(*v2.ListTeamsStatisticsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListTeamsStatistics indicates an expected call of ListTeamsStatistics. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListTeamsStatistics(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListTeamsStatistics", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListTeamsStatistics), varargs...) +} + // ListTrades mocks base method. func (m *MockTradingDataServiceClientV2) ListTrades(arg0 context.Context, arg1 *v2.ListTradesRequest, arg2 ...grpc.CallOption) (*v2.ListTradesResponse, error) { m.ctrl.T.Helper() diff --git a/datanode/gateway/graphql/resolvers.go b/datanode/gateway/graphql/resolvers.go index 1540b7f30c5..12e52e79d4c 100644 --- a/datanode/gateway/graphql/resolvers.go +++ b/datanode/gateway/graphql/resolvers.go @@ -525,6 +525,14 @@ func (r *VegaResolverRoot) Team() TeamResolver { return (*teamResolver)(r) } +func (r *VegaResolverRoot) TeamStatistics() TeamStatisticsResolver { + return (*teamStatsResolver)(r) +} + +func (r *VegaResolverRoot) QuantumRewardsPerEpoch() QuantumRewardsPerEpochResolver { + return (*quantumRewardsPerEpochResolver)(r) +} + func (r *VegaResolverRoot) TeamReferee() TeamRefereeResolver { return (*teamRefereeResolver)(r) } @@ -1771,6 +1779,24 @@ func (r *myQueryResolver) Teams(ctx context.Context, teamID *string, partyID *st return teams.Teams, nil } +func (r *myQueryResolver) TeamsStatistics(ctx context.Context, teamID *string, aggregationEpochs *int, pagination *v2.Pagination) (*v2.TeamsStatisticsConnection, error) { + filters := &v2.ListTeamsStatisticsRequest{ + TeamId: teamID, + Pagination: pagination, + } + + if aggregationEpochs != nil { + filters.AggregationEpochs = ptr.From(uint64(*aggregationEpochs)) + } + + stats, err := r.tradingDataClientV2.ListTeamsStatistics(ctx, filters) + if err != nil { + return nil, err + } + + return stats.Statistics, nil +} + func (r *myQueryResolver) TeamReferees(ctx context.Context, teamID string, pagination *v2.Pagination) (*v2.TeamRefereeConnection, error) { referees, err := r.tradingDataClientV2.ListTeamReferees(ctx, &v2.ListTeamRefereesRequest{ TeamId: teamID, diff --git a/datanode/gateway/graphql/schema.graphql b/datanode/gateway/graphql/schema.graphql index 17f9b269bda..1134b5486f2 100644 --- a/datanode/gateway/graphql/schema.graphql +++ b/datanode/gateway/graphql/schema.graphql @@ -127,9 +127,9 @@ type Subscription { "ID of the party from which you want trades updates" partyId: ID ): [TradeUpdate!] - @deprecated( - reason: "Use tradesStream instead as it allows for filtering multiple markets and/or parties at once" - ) + @deprecated( + reason: "Use tradesStream instead as it allows for filtering multiple markets and/or parties at once" + ) "Subscribe to the trades updates" tradesStream( @@ -584,7 +584,7 @@ type Query { "Type of the order" type: OrderType! ): OrderEstimate! - @deprecated(reason: "Use estimateFees and estimatePosition instead") + @deprecated(reason: "Use estimateFees and estimatePosition instead") "Return an estimation of the potential cost for a new order" estimateFees( @@ -994,22 +994,6 @@ type Query { pagination: Pagination ): SuccessorMarketConnection - "List all referees for a team" - teamReferees( - "ID of the team to list referees for" - teamId: ID! - "Optional pagination information" - pagination: Pagination - ): TeamRefereeConnection - - "List a referee's team history" - teamRefereeHistory( - "ID of the referee to list team history for" - referee: ID! - "Optional pagination information" - pagination: Pagination - ): TeamRefereeHistoryConnection - """ List information about all teams or filter for a specific team ID or referrer, or referee's party ID If no filter is provided all teams will be listed. @@ -1026,6 +1010,36 @@ type Query { pagination: Pagination ): TeamConnection + """ + List teams statistics + Get the statistics of all teams, or for a specific team by using team ID, over a number of epochs. + If a team does not have at least the number of epochs worth of data, it is ignored. + """ + teamsStatistics( + "Optional team ID to filter for" + teamId: ID + "Optional number of epochs to aggregate referee volume and reward statistics for. If omitted, the default is 30 epochs." + aggregationEpochs: Int + "Optional pagination information" + pagination: Pagination + ): TeamsStatisticsConnection + + "List all referees for a team" + teamReferees( + "ID of the team to list referees for" + teamId: ID! + "Optional pagination information" + pagination: Pagination + ): TeamRefereeConnection + + "List a referee's team history" + teamRefereeHistory( + "ID of the referee to list team history for" + referee: ID! + "Optional pagination information" + pagination: Pagination + ): TeamRefereeHistoryConnection + "Get total transfer fee discount available" totalTransferFeeDiscount( "ID of party eligible for the discount." @@ -1156,7 +1170,7 @@ type Transfer { } union TransferKind = - OneOffTransfer + OneOffTransfer | RecurringTransfer | OneOffGovernanceTransfer | RecurringGovernanceTransfer @@ -2354,9 +2368,9 @@ type Market { "Pagination information" pagination: Pagination ): TradeConnection - @deprecated( - reason: "Simplify and consolidate trades query and remove nesting. Use trades query instead" - ) + @deprecated( + reason: "Simplify and consolidate trades query and remove nesting. Use trades query instead" + ) "Current depth on the order book for this market" depth( @@ -2398,7 +2412,7 @@ type Market { "Pagination information" pagination: Pagination ): LiquidityProvisionsConnection - @deprecated(reason: "Use liquidityProvisions instead") + @deprecated(reason: "Use liquidityProvisions instead") "Timestamps for state changes in the market" marketTimestamps: MarketTimestamps! @@ -2411,7 +2425,7 @@ type Market { "Quadratic slippage factor is used to cap the slippage component of maintainence margin - it is applied to the square of the slippage volume" quadraticSlippageFactor: String! - @deprecated(reason: "This field will be removed in a future release") + @deprecated(reason: "This field will be removed in a future release") """ Optional: Parent market ID. A market can be a successor to another market. If this market is a successor to a previous market, @@ -2589,9 +2603,9 @@ type Party { "Pagination information" pagination: Pagination ): TradeConnection - @deprecated( - reason: "Simplify and consolidate trades query and remove nesting. Use trades query instead" - ) + @deprecated( + reason: "Simplify and consolidate trades query and remove nesting. Use trades query instead" + ) "Collateral accounts relating to a party" accountsConnection( @@ -2607,7 +2621,7 @@ type Party { "Trading positions relating to a party" positionsConnection(market: ID, pagination: Pagination): PositionConnection - @deprecated(reason: "Use root positions query instead of sub-query") + @deprecated(reason: "Use root positions query instead of sub-query") "Margin levels for a market" marginsConnection( @@ -2672,7 +2686,7 @@ type Party { "Optional Pagination information" pagination: Pagination ): LiquidityProvisionsConnection - @deprecated(reason: "Use liquidityProvisions instead") + @deprecated(reason: "Use liquidityProvisions instead") # All delegations for a party to a given node if node is specified, or all delegations if not delegationsConnection( @@ -3011,9 +3025,9 @@ type Order { dateRange: DateRange pagination: Pagination ): TradeConnection - @deprecated( - reason: "Simplify and consolidate trades query and remove nesting. Use trades query instead" - ) + @deprecated( + reason: "Simplify and consolidate trades query and remove nesting. Use trades query instead" + ) "The order type" type: OrderType @@ -4386,7 +4400,7 @@ type NewMarket { linearSlippageFactor: String! "Quadratic slippage factor is used to cap the slippage component of maintenance margin - it is applied to the square of the slippage volume" quadraticSlippageFactor: String! - @deprecated(reason: "This field will be removed in a future release") + @deprecated(reason: "This field will be removed in a future release") "Successor market configuration. If this proposed market is meant to succeed a given market, then this needs to be set." successorConfiguration: SuccessorConfiguration "Liquidity SLA Parameters" @@ -4428,7 +4442,7 @@ type UpdateMarketConfiguration { linearSlippageFactor: String! "Quadratic slippage factor is used to cap the slippage component of maintenance margin - it is applied to the square of the slippage volume." quadraticSlippageFactor: String! - @deprecated(reason: "This field will be removed in a future release") + @deprecated(reason: "This field will be removed in a future release") "Liquidity SLA Parameters." liquiditySLAParameters: LiquiditySLAParameters "Specifies how the liquidity fee for the market will be calculated" @@ -4477,7 +4491,7 @@ type UpdatePerpetualProduct { } union UpdateMarketRiskParameters = - UpdateMarketSimpleRiskModel + UpdateMarketSimpleRiskModel | UpdateMarketLogNormalRiskModel type UpdateMarketSimpleRiskModel { @@ -4558,7 +4572,7 @@ type NewTransfer { } union GovernanceTransferKind = - OneOffGovernanceTransfer + OneOffGovernanceTransfer | RecurringGovernanceTransfer "Allows for cancellation of an existing governance transfer" @@ -4719,7 +4733,7 @@ type NetworkParameter { } union ProposalChange = - NewMarket + NewMarket | UpdateMarket | UpdateNetworkParameter | NewAsset @@ -6101,7 +6115,7 @@ type DataSourceSpecConfigurationTimeTrigger { } union InternalDataSourceKind = - DataSourceSpecConfigurationTime + DataSourceSpecConfigurationTime | DataSourceSpecConfigurationTimeTrigger """ @@ -6123,7 +6137,7 @@ type DataSourceDefinitionExternal { } union DataSourceKind = - DataSourceDefinitionInternal + DataSourceDefinitionInternal | DataSourceDefinitionExternal """ @@ -6480,6 +6494,45 @@ type TeamConnection { pageInfo: PageInfo! } +"Team's statistics record containing the team information." +type TeamStatistics { + "Team ID the statistics are related to." + teamId: String! + "Total of volume accumulated over the requested epoch period, expressed in quantum value." + totalQuantumVolume: String! + "Total of rewards accumulated over the requested epoch period, expressed in quantum value." + totalQuantumRewards: String! + "List of rewards over the requested epoch period, expressed in quantum value for each epoch" + quantumRewards: [QuantumRewardsPerEpoch!]! + "Total of games played." + totalGamePlayed: Int! + "List of games played over the requested epoch period." + gamesPlayed: [String!]! +} + +type QuantumRewardsPerEpoch { + "Epoch for which this information is valid." + epoch: Int! + "Total of rewards accumulated over the epoch period expressed in quantum value." + total_quantum_rewards: String! +} + +"Edge type containing a team statistics cursor and its associated team's statistics data" +type TeamStatisticsEdge { + "Team's statistics data" + node: TeamStatistics! + "Cursor identifying the team data" + cursor: String! +} + +"Connection type for retrieving cursor-based paginated team statistics data" +type TeamsStatisticsConnection { + "Teams' statistics in this connection" + edges: [TeamStatisticsEdge!]! + "Pagination information" + pageInfo: PageInfo! +} + "A team's referee info" type TeamReferee { "Team ID." diff --git a/datanode/gateway/graphql/team_resolvers.go b/datanode/gateway/graphql/team_resolvers.go index 14f854086c8..30451cb6410 100644 --- a/datanode/gateway/graphql/team_resolvers.go +++ b/datanode/gateway/graphql/team_resolvers.go @@ -38,3 +38,15 @@ type teamRefereeHistoryResolver VegaResolverRoot func (t teamRefereeHistoryResolver) JoinedAtEpoch(_ context.Context, obj *v2.TeamRefereeHistory) (int, error) { return int(obj.JoinedAtEpoch), nil } + +type teamStatsResolver VegaResolverRoot + +func (t teamStatsResolver) TotalGamePlayed(ctx context.Context, obj *v2.TeamStatistics) (int, error) { + return int(obj.TotalGamePlayed), nil +} + +type quantumRewardsPerEpochResolver VegaResolverRoot + +func (q quantumRewardsPerEpochResolver) Epoch(ctx context.Context, obj *v2.QuantumRewardsPerEpoch) (int, error) { + return int(obj.Epoch), nil +} diff --git a/datanode/integration/testdata/events/system_tests.evt b/datanode/integration/testdata/events/system_tests.evt new file mode 100644 index 0000000000000000000000000000000000000000..3e0dc3a655a32e3382688d9fcb7f281bda077fc6 GIT binary patch literal 1975688 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

p>XVg^p=&LJwno3wPM8t{u5to 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

I3Ozm_b+ zN2by@ES8n~$iI;+!$&5wJm@1+mmGB;xxO~4edPP3RNy01x3IxSrY<>5AGzL9s*haT z$bXkx2_KotcY}?jE-7r}b^SK-x1iST!V#Mo%V*l57FhVnjUw0^Tg>v&49DUK(0B;K z#j)o`jum74tQDKKh8|F^#c^Z@K@+SPbxC0(ub-HH`Gs$N!>6Q;lq=?1)+MqimJ*qO zNYq-ng=3W%KWmjB5}!jz<^}?UM|!WcbIx6)2rN!OS)k z0Gn>&6e#jVhQel;ey%4x1I8sPnoN^t7?Z=%T|-q13QCMy8(QqxT6`x=JiqNZp&591 z|FZL2n;FAM0a5zv7=~5=RiSV(N!0;5CoeFJz)sLXi=jWJl^D#z;2#YADeyO4)3pTm z$ja0bos<$qWME_^T9gd)b+Rli3L8bxuEXpUdQ4( z|FnU8PPD_|Z}&|it4ESCwh`5Ex_>O{H>sz2?bP`6L9>%`wB}J*k*x97PK`~E^;SH# zb;4xYr*2lP7!ytQ_*y%K3O@1XK;InsXiX|VT6-qX8E;?JqTY4t$)XnP3j;(v+$iIm zC-;!hZv$K1cXn1+X9t~v2hPrNtwq$cgXiV`a(2eyquf;KopyD0R6O~Ip?5AEYrmxR zcQxG_Kr5xp?yJE8A~f*}izZ{kP~~q2BoE3HnpBbBzi@R?`WY zCm)1;oYT2St*_mDZ68W*jjn2veLx?bRA;ZvFT7{ttElHDHhN1IR%W|veg`sbp1k?xFnC(MB z&k8xu-!BZb;eH_;?SA2#UIXUZM^yq;5xpO5z@)zFMTYzOz6|%;X%WZl4psDA!!yx+ zX?u)29GI4<{o;HzJqWRM2mLCKdveg7~OkGlBxNn%4 zzU-wJyzfex;Z9s5G0}Z#CpD4iwFHr(KgQ(=au8Xja{+jdc1v_&8abLTQ;uXrh9O%5 z#-{3&Sc|S)!8xA0R5BYf+|(sShP!4PL|2^>Ydex?Jm#pM(2(w>E;*bGH}tQN6W$tB z`i8|aH5fX*q*G$;qb1952+1rDX1J+Kj(Uc>zBZ~d++V9q^ExRNSZ3-LHe|S|Oa5x| zBV)sAz^r%l0cE(CfAj2VE&pdXwlcb7f%emVJWtV?dTXnpEwopgw)RjdU|4RdG#YBt zs7ngVeM7(HevF{DJMz*D94%nB<{K=q08nKG4(1X>z8_&Grp+RD(ro0+3!ATl*r)+G{U1A1PhX(5SB z1(CUx)s(>5b+{7h?<^E#7<$kQ7wmXp2^L0=60B+=qiEhBp zjGfqUElcMxhA1-+BS313VRN1yq1`HW{0RO2s6vlzR|}%1p>xzFh2{Rz#PpZ${=oI0 zsovbFE=u_FGVKy6D*ehnB8$8z@Z@%K{H+4*R;7~`AQGiKAQEl^lu0*WvN84#;Dt_zIkMdJ;uv$rxf|KB8<@ar zVrJNYD@0vVSneAqrtkgHrDt9vEqAGZHxHLxD1Ch{ zdw<+qA2-P4mtD!MSo;(y8UfZwbyKVX(NLG%vw92Ml+I?Vb27W;Gz?jAk7NsZaT*w} zkSf;m zuI*`Pz|_rv$H?)-h921_a{|Ej;P_ingGWhSQh1a%Ar|zO&waByF>Q8plJLaHL1dER zbZd5wzD^yulvW8MOP;uPB8kj+2_j2FF9eZ5iswMdwhG9p=TSaYaxP*)RL&b>LBu7y zv7jE?Ai7t7!6eZl7DW7n2KS1(8jB{K!H2eUtc80I%foHqAhmr`> zw=@<926uejvN5RJk1X5Q{2{L}O*I~Mil4UqmWR?e=D(aG>?o`#+MzvG*G$|E0Rn#qP2-8uQ9A=oV z-qHQjsj9;ve<%eEr-~|#hHwaVNnyEf?zh~3B&hAq17op<(O()uUml_%2Q>W_eTVygLpX%Gq_Esyo|wM$V^`gNowVGnM92>? zi;N|RhFArb@GiD$b0wQyhl^MQ+$SkXfOv}{aY1(JG|5$Pk%S|P-!E#fV z6qdVY8$@4=|M0bTlO!6JoB9bej~fUyQkOh`YJTbuF*3KF+&p*tPhR=`ZXj!YA2Y3m zikZ!l8Q5g%C(k@qIWy-@y$k_ugxE^cOf?LbL$8yCM~0a)Ooqvd%*ZUmO#tQT>S&t7 zgF!D`)MS~M9E7pTsjb;o#yevco9&>nZOPX>n%&F|Ev_~E*~a!_u|4mO175`FT_A?^ zHq4V728%wj8zzQPS{BEs%ADIN!*@)fPIMRd(}DvH94P~3YXCXpOl&0b;~2t&vCo!a zCa6}=)NI%x)d}lD z+Y-oafr%Q`Z6P0{2eBL zao1g!bmy)?$Wg^jB)LIahRn?o%Fq5;Q*VKG#q--LPMsq?4>TLHt^8n`56_@D*VhL@vJQJ@Y+hwe^T+R!c83vJy7L5 z>Y;~P!>bBCe7zFOQI%L!INZY!%kUC9^_K3Zv4?6H`Px6NB&_0vFqk%=UOW+e_;P>n z;m?GN(w!P=_1H)hpIfMY{&${cmn1K`tAZ<(w4bWrjA#DSM zjL6cPf)CUsMeyODC#J9d-0g3>K?Wa;G|fO{X_jcSu~UxsUh0^cAQCx*tV?79BFjR+ ztYBJbh927lL;@kBu=M`m!_ks+7zHYs4Z#QMk|Ov}vkl$RtHpSxBpOf5;q9voT|rG! zgXH{v-ag*Gb-exFv395cVz}K=g;Y$wqWhBa+#&00 z`=_mI2vuSN$G-l3=iM!3kjzv@JNqIOw&8;696qNyhX@i<4^2a#3w6oetA44X&t-h% z`&^v*;N7p|r59=V^GZr8Ua*6a2C9@qq~V|YBMm1Ao7J7Y%t98szK1HsAPS8LeZvet z>7H$)xk>kZ*NY=7(hbxmMo}Eay6vI5LH7WfrD66`C?V( zkh9WF6I3Z?MUEt?Q8N6bBmL~4WhzBLA8C;SM5bj?ltroA391`(MD;;rk|BFhcYQop zaxTKpL^2y94b&w?q@iXTME9QECrYA4{Fq8~L(H7Gq?$;>ElUa%|C?l4#Ab=~HAEVy zOLkc%M;a=Y>jK5UkSvQ}C6(pDNCS1rQI9m#*G6@u;lE3%h?_!@>4I6!thOLrWQPV+Xb}-UFU9uNxpz^CA(m*9)D3ON$DTOCW zSVmEJGSWcZxls__zMf|4BMpgoJHQzi1vON;4n`WNOO9-$fqKwp_a$XS8fyFZNJko| zj6TpvLt33fQI14ChlBl()Fox4f!zOyNCS006=;Bc9X+Q$c$@n>A$yUAtdf$77wll9 zfhr{tX}G07(vY`TVw&{=&Xf&|(a3f^jk^xUJL{q2$FUhjfFuip5P#;`j_muhFj54@y0j5@kSYGuz@jJ*e*J1C6T$4mZez~Xt&L? z9DkO8$OKptTA3GmVQ3j3T?CP+iAQx|e@#OnIftC6WHv+^s7rPmDtc`9MH)&;G$IYu zPiS~{QX{4ct4E1~|U_=_I(r9Rfq%J8e_pSYw`vrp9?qn`A)Iv`~Kcp8h z-#1*qgli@K&`elw?wP zG+1uxlEQM|)^E9Y3TnHPxsb?rG>py^7>+#B!q@|5sTl&e(KgXM;KhIjN9RD``WUzw zaLvX~Hr~D=%sR|?ljWu^DJ=I_@aBHW<>z$aduKNzkq;u#P7Vx5UTArl0M69R0o({8 z(aBc=8XTPi8K$)|Hv^IQNf4RCtiz1=Tkc(wb69RFnGKekx@7mw-DA7YaxY4vVY#WF z&|t=>ORBNlw=J>Ur%IM#xvBIGi)FIqu2`-u_i2)4SZ*@QgO;1RhB=^GZy$}RW*ku1Yu-w!ohiSR%9o;`I_m~X@i?6l+PYM{8n<|ZlzADGI zyjZ+;H4DQ%Jj}=Pc%%cV*U^15a_mqK8Jg+i7)Cg7;}F5`5Owd|uw1;JnZ9T8obmQm zEvl}eHjz+^rC_^#phCDi`avaH{bK!o|k~a$=au;)ObeH4u zn837iH4YEeVN5}lOx2P1r?!ckhb(n#~0QzVfK%xh3nQ3a8 zlJlTMNsRw-b(~((p6tH0PqMbYp1#HBI01%Jke7N6D@45EE8Vn03~8YX%uOh6{ek_XV9^Wf&s(U)C|Mnw!l{I zkd+R-wG~^l8qLmCzw_I6Ki0v2n_JIl9b2E)6I#zNsGi(H!3v(5cDazbrn6vVX0d>& zTG@h?<(Mz$madtwGg>X2fG<}k;BTrEpdxIuTKNgMa}w?G>wuMIFjIF;-GrawVCIU+ zSZAH)xVB-sy5YD6CbL+!2Keq}^uqi)9jKca&4M);x3LZ~QH*UMJI@;VbZsPS+Oyz>zz4{tlZR&aNPFJ+8q!bCo?mIBS2x6fbFbu`fQ?qdFT+bQs z%E}UPP9TKls4vRVS}fjyNKi8U!pTpXIV)@YRXw%RYb3558Iz{23*PLL)Zr;;BojNj`jKN!h?FCCj4Vk1D4@90cl;U6!eqV7g+tE*tne$+9T;qq01he4s8l z>dA-t+C13g!z<6e>B@f-YG%oB@t;+e@>NnQqTp{7rE=X^yTz6`74t2o?R7K63&L-) zEiHCpi=|`-=6Ur_@8?O0v!&ogAs|)ogZ=Y5YUN|g2yO0a9{=#xy}2828L^FeTDfl$4a z##3bv(@rH}wimcF41}Q#2gAZS!qJv%8be4*yjn^XNr{n^s*6ZbcW-hAW22Gog#BtCna7Zo{V^dAt^yVPlHJbs(~3oQi6K6I;sNhR6^#- z2SEfM8_p<_618_#CnXwmn@CDD{BxB_iAR2qL{g%GNd&R(t6cMQs~d!*1o;LHCMBph zX!qpJB68^(R_PjMkte!|^aJB)dC(lAD0I8XndVrgp&6-V*=c4Vc>!d@!eE%0fME-m z;0PCj`p%@IV9bqem~zdAoJ4(CMNWcxVixo?$@8Sh7hI-i3xHZE7F-M2i42~vouD_w zNt65MBwkw`02R@k!JGv30Q7Panrpb4i%dCY0J?^uVGMjXCxOfpFe{OL!W0c;B~Vkb zj9TdCB)H}xErc|?V`Ef2@>j@7P`7*}auW3+!p-iDj(S}sSQQbk!JGtDu)9}(4mX>+ z`64HwqZ=6mAan5yM9MPFFtt?#EVBgKLDNeVUF(U3!EoXkSTZNWyw~0{Fu^nM!pSRC z_@zXx=mA@iFmZT|X7<|;ydgAZ;1(BJ}@PR!ARr(?>mfz)rLL%-;# zxYz9j2)QIj}K+TGnkBuGdJ`a=oECPbvbkgU=?ani#^f zi7HrS&n7A%DxOX7oVlx8P|c=pa};!olx)MZsZqIYY(C;DpG}Ya9tqd7VUPNrP3KiN zNJV6O@YzJYLGsyDa0_E^fyIUqawW?%)3Q*km1A1Al_W0edYl|kE{VnSBxkMwdC?to zl544ehRJ!Z;@L!%CCVbEP&y>Pkc6pAxoVGBNhuez@KD5<;Dy3Uv;{*e*@6puzEHR} z29moL=8LEIe>T0bIshu-(}T|@>H(0?CKPUIIv&G_0pR6?CzLGZGEIhY>NXzDmV4#FQqeIbe(y0rs{T9Fer|EuQOi=XTHEFZ8-C&a8&kesxG(EO0EZTpZlIo zZ;~?CRD_WS{p*N#3n`J3v`syXB4z+DM0Y}4_d|3eGaD^c5g@@B3U1K59HW59_nE21 zXasSL1XAgfC@A!3Jo0!K+H(oLp?B!kjqQ}5aI=1Qz8Vw=MdtCDBaBYi5A zWSeZRBjM<9G28T(>O83kl@30esA^&e&nD{GQub`35~AYSgkpFO7us|X zeTH`CCVpvpHZ>}@jq4hZxXNeKBfm$;HZ|=L3~jFk=B?EYQW29Ld^S;UkZgfLduCQZ zA0dxq6&b8D9!_>@vyF9HR?A382@8l>o}xHEgbBI*Q^8^vl3+9EohxYIy3^ z*Rt;>>XBJ6nVH%MxGx~>#up6TMY@SQ_JYF`3^h-!4CTc4e>eR@bpljGs0ZIo)Duv> zn;=mT&K#2)t_d$$rkg~TQR5scMvtRj{%JhI-z`yQz@gJTgo0=5sW_835MPo!r*b+_loKH(vldS9_%L*P&R1&HxJzZ!L0T{py zkIhZ9vK)KdW;h)RM8+F2&jOekhR5*GHzMjCQ- z%Jeo?Y3X-V=SfAdbnxLsRTCFazGh|n?3L|*I)ELZC1#R3nF-e>@1j#EcsLzmA^wcu zF+=~bW zkFmGCYSO`fUD$v+O`s&#lsko1+Nr&eYnHWuoQk>N$O%`}#!rIFyIGmIZ` z#C$Nr&EUwF1&)4^m(r2PQ>yF8rs)FlN7!`CLJulu{JzxOo> z!rL5NVzE>ZSqLIa3{uRsBn6R$AhHld7B+tA5}61h`{yNIBsqr~p_18v08L#| zfH2f-;}O^cVR)}38h4fY2@N0&)Fp=l!tg%HGVT+VzG1OU^}Gi_7~U^gMkJWb@*oHU zb;(f&VW_W-A`phLUJ&L3QYr}5Qn#=H0h+qxuO`nOZvbJan<~}|6rm+}4D}yA1An+> z%C%9!hOZOrpHlLp@_Ds1mH}$0KkL;k5OH2>{B5nVi(7|s9eqj_J$rqZkGBrf(Lb^G zH~N0svyVT!v6TTdOJg=K0mx>c4$INpA~kd^#LZp&>o(ALmR4sAw|$CDP( zUh*Xx4EIwn(eBAxx-h{e06hg@3}kJ%XwK$#hS|WDmZolMpuE@0Q`^+^!bxFN9cJsf zE9!wzQI0bKAC&s&P|}gVrWX(t2em)qU!PbdP5DMDrY9T4g2gjYC1s#J-{i>xW<9yU zQ$+>7lglcp+bTW!;pz;ih-(Z+{HbT)&dCpswGXwp7*WL-{BB3nk^YfoQiob-9)PQc zz@33=5>$B0I;mx@_xz!biNA=<2NDEGWTUcSf2x$K4-#DIpH#yANF`hqp_{>|KUKK9 zSMO2OnD3T21t^!w95XFarsdMB&r*2xMZppF$L~w8KJ9w-Sy~j*t4CFpm0dV_rHaP< z{!88s{HyBCe<0TyV!yW%`$sFWs|bEQaR4ruYAW_j-7wZZr$v1MZKdkUosd(>YYd+N?@&rbg88GQE8 zY{&Lp#r9pN?%J9q+p?{@7L%QeMGl(|@OSaG_G6XoRYU=YA^Tg$+UJeHPM@-KN1CK3 zZ98f4^sPI}t&2O8{G{!F`8$3HT1Quh;L_?4sECUWW~!(P;H=f}gtn!6$aKeUy~tD{ z^Y<9|W|nXym;4W#*#iu}tlCf&AJuIg+3xvGzg$FU`HRTwA^IC2ADu7@9e zfP?eciFl0cRU8-?t`=BP3}B-uM!8gM$D!kfK8B3L+d_X}}^+Q(7DV*vR-vx*W#Vkn5gO1sP*H&0RR10vzn_Rksr zgyb9!51I2pz;No4B3D(jjnmc3Rb4KLhPkGGLPO$)x}=(1)$L0F!>^Dm!%9)<8y3q{ z_hPzYxdsgXq+}U7nauKFu8O+ksOPHcYoj_>^(iS8D0b==Hsq?POO9%;s+Puo(p=Sw z3oA$KN_l#atD=g!X^1(|&-}!QRf1YuxCNnz2L*Z<`j+R1s8g|hKmnM69eBPO zyD=BY<`(eGbx-4HgTW{fBjlDDBhwh7_D#p5Si(D zo?1zoqfP~-tVL>Oc9x`O>6TpJ?xFVA)X^Y`5(-Dg2)_1LPj5|;1)r8g!!4kGLW7N@E;$^x;4_kCxCK=DhQ+dSx8SpqWw-@omIvJe z>XM`G7Sz{9wOeqtlnUGe>J~P*1=J-+)h(!{@t@Q!X#JovH=mQI2W|mX)H8!IIO>vn zrmj8^e@)6v$EZNfDA49wBwAwGoNxUPT0E2&&^zs=<7GYwNmt`L?MfQFf>SAQoI4a(fMLSJ)jGm2ecmSe17j4~j@*Q3br?I6G}5uO4_xN5#1>JHutVZ$4Mx}irK;r-U`T! z)Ng>#OV05Ippx0}2B0n}-T*b*Ao|)$uY5rgjW+=G6J{Pa@MNPddH&S=)E`Zc&0PAi zt8Twe$ZPJ>H{Eto_w}~EkD1m&#mse*8F=^9PoBXj)(vYGi(QM`i^T;@VAjY>o;&q2 zWF^d!m!_F&d6DqMu@ZC$rkL`;vLZ7wj06CzDGpzfCK<{m3)evts*ySgF$jr7eAqj8x{(_lARbCOH2n-(zOho9A%c7aQ~<`ZXY|jqStkP zbG4Hyyv@P6z*OO=31NO!W;Vw#EKYo_{c^>#3O{qOsFup}?#Zw0r(>>`;AgCSm_}T^ zsMgQjy4ta4Rmb3;t7D+TbDvVKj=wSq2%^n}2H-%rt|k{AEEKGsa2F{T4fBgiKvIhF z>>89yS!iymm-xLBF#d3VG1^Ed7kUZKY~9s1ho-g-WSA$###B468m;&!T6kwOAzQ^rMm$1v|5zwi41YtLil{P2C#i$EH+HJ09Is%rK<+vR ztfH81034<)gP&^`ro~MgEi7oYvrEV9teqO4K4^AQ`l?4^MU7{gj^iRgfirY2Bn8l} z#E?o0oeZX%IAYI$rY5=}5~%Ua&Y`X`k&|Z`2C=wUacp|5x8kv_6IyB8b3!w~z%(Yh zZ+}`Ht=p=jrQ!)a3>EWvs2K8QkPpEu`EcUaO*w8gaOSEHee}tW_}0}k^&57I4axgx2M_yYPShIE-DEC)&)Wx2QDF?2vLs>kI`~%KnTHaR50$m z0@i(ICDyN2VpS0i8irWkrJ~`UDiZ3cz~hce!t7&Aq!4UZv?QXB(bkz}o1#5Y!I2=V zJBFafcvzjNugMc7Mi)_|5Ho`<_tYgXo_y2FHoETNdj2gUja11_PtZ-gvX*=58KXCo zFMCSSb6-DI(R077g4?*rV3yjdajo#Lh`1~(tTA^AZ^i_yZN&Ft~k4!uBcB41N1;^SEWzB zQSF0@KWRytE9iA%AY@j-ld2ko^Sl&>HINNglPwjwov7i*hhYoFchX~liD{;2xQJ{RD=n~>F9v;!_ZL` z@g(cNLovfthgAf`p21xd6JdHSH=MaueNnW)bTk*!Nsw(pwg92RVO?y<)ov++66)4jRim@U!VanC(& z?)d1q<7W?#PhC89XR&MUxYKtn7AG$pk8X`!b4MpTUr;R0uWzqQcI_$_w`SY$>&Eg$ zPtA6oe#+vG_M?Ezm7kg|ZY<@$zF_ht6ZCL?XZ+d6g|nCA#&cK4q>BR0La2(!9KZ?W zsjHQRV`nKQ=aw44g;=VgkQVhDhQZ;_J8b*dLn=`EQ`(Pj zAHHK}l5H!F6wNG0Vn-IY6(<+l7efp=GtpZ!-dQy@))_~>cwUgNTN%q;7v!6{lWD07 zkajW7-a!i#7;w$BM7M>BYF`ucuf$k1QRnNR>B2RQtgsZ5KiB@fe)1Q)O)SacNjtWC zQ55Ub6P>B4R%hb)ou?KXp0-a`JNsOyb42^_)#txaeEn$C!LqaFCz}of`aHgVzUhL= zC$9d@dwz7|(dn_94!+zx?+35{&JmktI|s|(d-bNnShW~zO#{QHmI3@H1V7IO0|w>);Lj%QEbe$G$de5r_R?=8+h zVP)Fl&&Nu9r}&0{->ZTCZlw%Vgt>=Q15J%`Pggb2tsbcC-4)L&V$6e}vQ%eRg39vV zG;QHS0qz{=vcL`L9Ey@P6O$ly)aC$Y8esyAh0?8M-+G5?_?s9|rDw{xYg* zH;~^F8ab%2k(>qHTxV_&#=Nz%Zr`hft0IIw4B>uYti8?!ATW2uJV3a`4kp#YDG{<| zI;N~cOX5$^R$>5682@+Kzz~LOzz{&JsE+0aP6wt-qANv3nKJdtDVFWmD%t*9C0iBY z^kK;M!(;8o7=UfYjkN^Yv*Q}v!MFlTvpbJLv!P=G#L>kq#OQSN@K~HV?y|Y-`Nvqm zmDT_P?JzvmMHRe=4BGYvvSlB+%lq0&z~8R~tRe?72scC3%%cuBQ>#N&a5Eb!vHYMC zi;5h=FvRlW@pj#*(V42MR@n?v(DS02QGRtNC)I!G;1B)1f7qRzgrfRtCeev|e@w}S z?sws{_f)c15z8Nj z><{33{|B{ETOax%Xq`}*iyz5DAcmP!P43JfzBhHrvsQlqkqUC0jcgWX_Ll0bzw(CP z-#65E>zHb9e_ZXYis0Qa_V(S_TWV+>Wy{10KVkak#HQ|J(r>G*w)7{}mZ}JW3}Z{L zz?PC@dE_mf6AeJ?MKcICwbvQcU-XBhP2D)s|NHO^(7`3X*8a5GX%&H&Cn)y}K0ftw z>@?=HmzXP8A~l29q~jPR8rsktXc~-}h_oW&lIAJGt{P%8m`e!wS75$lTnhkR9W+cR z(0O-=THGGC|IeyDQxVS?1n{CNQvu-BCHLoD39nfDa{=?=cIQxQapc;e1qd%A2zX>L zJZ1w;_jMx>V7<0yVGwl~M4E2vku3&a#sW_a=o^?=9osX5AigefNde&X&57xceDLD4 zzbyi!vztY1-9XHJ$t7aPn_ptr%l|Kzx z0NoB^ro{#aLVgegap?Jm6-F#@xf90>Gl61cMM7pYcmdQUg%@z=#Pl0~aMs)ZReAv! z5uR}lB$ccLDqxpL;1YnytYko#5kzKLR^~}+Sb4!R5LuQCGl5DFnKJ{N_q>3Amz={3 zppx0(1yGk1UO>$@i0*j-zm-J83!r{NgGr<=sm2TV+WjZ|9JE5R3@?C6->_IFdjS>8 zy$L@DwIs{%0>~^6dI8iWN8JmkuZ?0a;Gi)n6?g&EEo|@ts7sE#7tkk`{n!f_6YorX z9W*Wv3%mfTWM>9@d9(<{TAtyVT4Z}+5W1n~>JhgvZqEsASZL2RJlocMhDK^%_k9zU zTvimuK)J@BYkMZoQGuGk@C?WJbX`x2OmmC`gR%3XWM^zGCDJ6l^QxmPy2!#gh$5JMwWFY*nV(mWwCPUfF)-$~Kz&lywsj?ToT^9jeBm zcW5*pQFQCn?v=KTR@>NkxI5oehnn)p?@p(YM|8wWJ-p(eRn^r|5$+fSr=wn--IKQf zoGvqf4-3_Uu_RhrSfypA|DU}t0k^EG&g8y&uXuH}svZvti-*IbNDNkdc&2@ZG9BuS zF-aS3z(mvO*k?>MiZ+zCCY^3Ta6kbC4T=MU;($XU#0iN+G%DZ_5u76m4uFbGqM%6s z>+W;UJG^^}maKiv=_=nRSQON{Ywfk~`uEy{tP6qQq89!UiT?h?f3W(Isy6Q2SlQ-Ptt!zBdz7PQ~$`uTS5@+VLuG5GQNVxk3N>^>3dU9zczbX!vk2szMj0 zfv|=)g9Bvq_x-yMx=#Sx4sg&WiE?$&L84mS!gyYr8VtB0wios1&F(-HuNw?DKBRW4 ziaXM2IQ7>J252V4KoN{Xv`ZaxnhabGm7~*2UZ6rl2S<4!4DjHKY-iiSb-UZfht>{O zaos8=Dv-F}+RHb55=S-ew`*arw9_bYmzP?pFiIya^1>@p4+~{im|}x@0k}lNR2$so zp(oSUK>nSL?()i_LUM|KZ(O*3RCUHI!&_{QYg=(tTOJ%X!2E(=%>fNx>iTtS3EC+3~jEeIPo)h<_Y+c^!F|9aply9|B8_kUO)%r@7)S8*>o zSH}R*wSRv?SkDMRIfX(j^4N+my>vvxwdx{^K(U>vf=;x z>gaK$@5cS=l~!?$G+F7(U1_TExxQ87vvHB0AN0|vUdxV65#tFk@GZj+!Z7fCG^dBA zZuzbeg2)b|dd&dOhoRvoxN?f^*w%2z;wP5r*c~-KAyXvP_}nnNaLe@<{p0s!jZbdb zr723BZSa6-q#4Gaq$!llp=9b}^qhsF-_oRMe;^dDpk!&6BPG*{ltgr?YkW3>p@A%? zQg5c39W_2&kyPW;m<^@Jr=SC*(zvJKenLmV3s>ZHYJ9dxlaZlw^_!N-%4>WMlqOSy zJa=nO*7$Hm_PxfZ`P!(i@p+i^3U#&j(JMW#^liCi53cbUSNd+;DmM%D+H*I{3Pv`+yCk+ue%0wOyAtE6UPV2Go|mIw_y^1~o-A}7E&M#Bx0IPwzP4RII<&A`yZ zAO!!UADM~k>srStfGd(t0pFfoxZ#cGeddw+QzP5>6tE;M$0>lTX2&UjE0RtDjoGbJz`;^!oC3I? z&;f~Dk<&Q^JY1TLQvg@LX_>726z~XXGEM<(lP6CBT#b&%Y=A*rKTP zZH`x?O5cvChDzU#KdG|P_dkAhQ0d!YBOb#(hZGt=8xO6&Ix4O^CL6H0U!5!0?^)Q2 zwuz}>>)_M1OMjzwsfv4?X}I*w)ELFRA=u7EM`v-ceQAG?)~@|gaM^%d1XPd=^V@1UMax$)7pOI2LqO~a*_N*Nx){)!3uiY<=GYgfN#3cg`T zC+1pTk>9GuF1-(Eqo4#UO3}^Mr)%;4q zw~UWt>+vPMq&}BCruJxGZvbD_3y+S@B|Yi3r&CBhOn2k<+IxMygxm9m>3U*%!*u7( z`b+uSwOdu(#7*PsG4=%n* z(Zn|emMwNEIJ{?O`1&4ggNQ#QZDFqKbiDkKH7@KpZtdteRWJT2hNQ745G~9tcE}!{ zGCTZsj}~7EW5Rj`-@)#q*Yd{uxv=xZyrcV%E}pCCd#J#=#cmaccdZ*;d{CRzBc&t1&P!9$B#bvTdoO^A2 z`T8%Q>ku=^M26XuXc^Wjl)sy1Zf7FRi`2nidhXy=9!D&fAF+?s;ZKD={!u6V8fdSLuocUhtLFa?%yN{$?20 znObP=8IwcIAS0lkjVrbPRXiI^!~fra|Ir+pf;`R39UH8tMJ{YRrQxC#{y)W}T;UdZ zTBf#Mq=n|8QKB?mw-QEH82BAsiT}BSBZwfRxj@4R2>1B+Z5{1_4_$ToEnlY!P$CH7 ze##2wFXkG)0xPAR8Y`AjX)74eX03op9zz;EP|1tz1$jv;I;us*nby4t}I+&^~ z%2GowvB(M~TrrIssZUMCL__Wu-<=8AUy(mx2iYe#yXvWfY{PJ%VFD~lke<17*p&oy zolSRh{ROZZGub?@-k~ZUP^J;A_F^WR#{1J?ve9b4t9WIZhTr#QCYz}^e*A^kYsag2 z4w{DJfBl8O;9=AF!W*^URlFHZ!|%WT!sEcI((z;JDzkRHil?PXmLu*Nw5F~yF-r^7 zgBm7WJ7D%99$ipZd6=IJ3ZV8-bWm4y6m5aJ3gpzf;R@F>z`BY_*%+t1ot{nkqADsGlV)KyZGDn)ZjT2gaLRg`GIL~7}jXimwsET!g@qNs8^ubWc} zYEG$gy+CuyRH& z;Iz*p>m_ySB~@`3H;pBI2k3#g+l+q~yY-v5-+kZcXF!8#yNQCZQLB1Y-Fj73Tx(5Z zRreg0Ag^9&71uM9`~cjLK>PsTZu0}|pw=aGGzrX&4A1vmO!kNq-L-9W7n)iqbRR>s z91+Kw<@E{gr#@z12{~P#1HVD*@e?Cyyd!^>PcX3VR-3C z$+99Pfik9+3(S2bC2`4VrKw&(Nel)pte|Eu9_YE09=v8 z573wmrN=Bmzay2#=Hh-rN3%Rvq#AyJZ^%htgAdiA>pw}8aqY#`ucOnJEAqntLQ;l2iKb2RP?mqa;My=xJcvfs%gO`w{vV^443sR>5aZLnV5B%r>_nc z6RyaO6|d}uVGiXP+cwZpg3-@ml)^U;|5UpXtp3X<;9nlO zLB}k$(a)c*{xW0tUHs*$TX2(b%3z?qb}+bTaNua{fhj+5_3xJq4l=#59;?4S`qh;W z@b9i3zY!?wf;C-+#lscTz%g^PpKzM6Gw$@ETGIiJT0#O6=V-nL=_! zQVRKtri(SyxM5f^cn(NuIAKT$5s@Dxb=5J zO~=?H-x9GQI#NikNJ=5UJG*eoTQ7b4_hkxcWhtt{a<9~@G|f}5#6(KWS2CQ8lq}P1 zq-0u*lq`yzlteiZluRvA8Ujulr;xF<94RDM&5jh3E0R*k#_Sd*CQ@mnklat`z(lS{ zr72{SHUFM88Ru-Se$z5p`7z)L(qtrFY?CJ`=C~sJehg^7HmZ*Szc0Ol#EH9v9mfE! z$lX%R_2n3_>XtqE7%+H#eGK>mxml3Ba6P;A;E769C-h@K)I5}iT0tU&7KFmnaH;F+ zQDXam??_;%6fj$WHrDbS-Epiaa6uz4^u!5n-}keF;Z<^sq-p0`;dyykio(r}43EPe zRRLh^bCzR*jmRpzm|)&6sNr0Zp%}HuQK_zj$yHc+X)j#!p?m-7G(zWXFIas3a2Gm% z0tH90#}1c=4}Z?FY5uJ8@LlC`yYRPTpZ$zu(p}GZ&M|%*C+5QJ;{5zzarWqApI07+ zX_13t>y`gQx$?-N*ekzT`O2TM@0ECh;sVAZzd>Y6Q_9^wWpDeL{84k+J9D>6~uwOp)W}&an#= zcIPzb3B#UrGZ%Qya9vbS*tWUUy|At29J6vfk+KLJ%aKLw!RyIQ*nau-{G)n3RpdF- zhzg4KCv)=6|9d_Ex(>2Ws@GFR_B4(4{JfIyJGWF|H|x3WvGc1H01qPA&WxkOlk3%2 zkp@l@l5kHKSFV4vis|&+P9pBZ4i=ZI!qOH81$hSQBn1${K*^;?5BPZ+!!N*8({zBPcJ-5hu|^6&5^Z7Ra_xV!=wFpcprJRClBxN-pmtg zbUmu}o{Fo6X?X7~D&jl$Fs&fIb5&S6(4fn3)AC%@OMAHYH<1VEy#Ji`^;?@0lH*u}%$9lL{?WZEJ48n%-`jYwac!q3k9wE?zG$9aVhA z|KrzUH=7SYK2Fr0Qpa5tmyy!|@?R%vg(E8AEN!t3$2J70IM5P>+j7jD&@`(T$9hWC z#>|I*T<<3p*R0dnPkS2kAzni89-?WsZRoCH;HZaFo`PK=N02nk_kSYYN)$%y+umuo zbx-09Mtv=cfdnX5(Cz9O_^zWwN|{TW$p6&Zr7A9*r{Pj1k)L}%$~^|)ijJ!SQML$b zhDO;KMsaCqh&6D-qhLd@-XS?Xr#~!uNrtP2?cX{8|nY;S{Q*-=v!kDr&PJxAs-4+f{ zn;X7WQ5pv=xv^qT8dbE#&{5lgd0K{P*tUanuV-m4W)-bo3ZO){3oD5&v?F4wOzpUi z;-|UjPUu>nefF8%PzU5ctpl=(H@GF`btX6O`_1(VDjqJL8{Rm(cu;uc)1G|vlXm=Z z{Coa#_@pD_<)fZ<)bi2sQAaNwoIG#W^NuZ#TR!TA$L%Vgy>c{4b&gwpVtVXfmAkeb zHr$dPcU-ya>G`wp|2wJ|JT5=>h0opfoZ;r@9{Zf)dHJp#mHgA^uRn2?fA6=r?kPt_ zOPAsXQ3r1YDuYqegsScw%#k^YGK{Kp9aJ>gMrBlmt7TvTau+%{RdHqwf*rA zXzJnvR&*^sVtDX|vtLI)w;i#cIr_Qdh=Wk6kDt4aIDh@4H~jn^w_W|j?8!&$cd2;o zEwB0BBaT>F+)w`AD~~uxeldS~#MZfOTZa1&=d{C-!Y_{gPhVQ69d2%)nSZD;Gu&s# z;_xB!!~Nucf51-A{B0fVoO{Cjk&m2jirE&vcKV%f_#lYc`&$V-;WH2A07-pI8aoa_ZtsfnkS3$me~7vxxpeV z^`F;E{b%)3t9aR*WNP8oK3u-xeN=hEY(ycZ7KaF7b6Mk=RVX0Ha@2UDCm!*s0&6VD zgQ><7Ee|4VYCMa~6(wpsDQ99!3gVEFk2Jo{Sc^c)u^6v@jwH;vxbg-58>KqrgdFB%V`?D z(+T3XvRs^_P0U0_ixFjc2O3}@u!JsbXY?mDj1(CKaL(dPA zB>e8S1CS=^fO6C+8-jk5y5QhcW_euioO*5T)Th@@Rq@O)4X3_qX1E3U@PzxU#Vx|Y zHyF)&a3RRbJiMm^w0CzMzr`_8M1}7)c8BBQlHP@5g$f2^ZbkME_N(>I_P2HH*#BNT zR>gh)v>a;~9(cLo3iua{GD06k;w=colM#A%w{2TYe6!J`pd)&lLi2FnF$%-nM6h?? z*fF7CDjiGQW9%FMX*l-Rgo0>+@hS_G2kcVEPzIy4%~E$!_@5VRuK3#D+@=jUs~xQ3 z{(rI!n7e1F4fwn5HsGAvH^it7IEh6V+DW7ZZY+`@F!jKTBg^%@5CoC7XZXU60uBH3 zl0*wkBlLYRTZN{D2yP}_ZNN;C)CT;$*@ZK2`uU|lsM~<6QslW^6|aQ)P%_S3!l`&= zM2&&7Km9B=?Q2{6(i6MtmOY>+c7C_i7#G%|_AljTp?d}HX6b-LrbvRs@3kTE8KkXE zkZ9^Lt{Tus8zfO8LJtIs1cvm!XLw+~utE!PC}R8@%x}^SOZQP-VCewH*mn}I0}{C+ z2@-FdUAX#{7rf&Z35lj&N+q+ZsL+ZCf<*#DsU(;$tlR<|iW2{(RuU74pd^5?1S5*q zg2ZP^%K?d8H9H`YE0Q3wF}nqcej=JF zk$s26W)G=`#Ai#d01~-NI2Et-91>UEvPVPW-8Cd0BR2~mk-b^$iFYHe$SXG-36LSx zc+j%+kmqZM+uq^YN>LI&#`rw&9BDkRqPd!Gojeb4MbdfT#`byOxumT_=YiPuQG^qQ zcy@@qI7mQ>6@f=NF%k`LFTQ8cKLwr{nw}qPczB30S_7@0i3f@`CyYDJ16+}G9=K_C z;Z@gt{C&5{^FZmQP%_VO-iPoLH`6gkKDv008+A)N>(E!^Rjgw z_#e`8oCmmScAN*eBI!KPnB6)L94nQ^d4T%~9p?eANHynyZ>~8H94Af2d4Q{52l8-5 z_WeB2?4bvH9=Q6>OYc7Zo)I4)coXX%^ng634)MFBS8yKSF5y(X()07cs$2Hx^S~Gq zpC>m9&I9btG6{)Xkpzi1wIT8Oq^(Pk2=Z#o9CAP(i8L86v`&JdLa1(vTtCo4SLktK zAU_6~r0-}E9{XYuB}ri8bvMC_Pgjb}6-khI^X$TB&iTwIZQTy@J{0f{Hb z%>qbdZ1_*w@fnoN-di9eWK_?Itz_q%u152;87Ny(~Kvar3}DfQIJ zE0h>XB@4SGB~x6oqR+_9M@kl@S!Ai!g2Wd|%jqGNsb&Wxazzp(HfFaV@g%7{uUs>52w3|4AmUM`IR*l|C3>m!vLbH@D1 z=${moj*iF7z-)Rwb?ww~M5dXRhV5nLHfA~L*n?)8rC`@LF(eol7*^(Dl2_({#w*ts zXKZ6>5gos4ezu`)S8N~XM#sO~G2B%iQ;dd8>lJz*(PQf5Y8Gt&dWW4V7YwnO zy>$?JrDa3uDx7ZFF+Glg(W4d z-jb$opPTEQ`YQBv(Wwnhd)%eoI;E{zl_`q4aV|rDJlfZC@K~0ZkO-y|ykBP?er2IW z+AKv`IjNOvXp=%gxRGN}W|ilHU~fzze@1PsibLx3_A1w41$&jNg37%*7&FhFS$j{# zL3Xxj*G99(D&iHKZkF_RrPoO)%AL+$N{FYp6AaDPlU=$ zq~iKRMdY5EJCT479$&ljHMKicWI@w#=Nan09;%SA{cZTWdihl3MAKM4`EB3^W(D5{ zt_sr&ZumCLF4o_Mvuby$$k-;yMY(6Ci`L(?et5~c;aM}FuVV9TEX=8y%m6+~ZnW)k z?(&w^OByB4Y1Il5?AAjSG7vFpQSI!$?D<$>U`1R5p z8ZN*^;;oNR{xv>j9^l3Q8nd4amiBLYcUo!WjBT}6@(uM$s<;uE)=IL!lsmbXzz?vJ z``lXZ$v4(3sp58GvdDzH&D9i{TwfQNoLSrarrKr|HwcqeCS05QUS-mRJ5^OC+iSO+ zQ@cgQO~5qV((^KtRln>RWhVdf;a|M}WwM*I;S0h}d1t*_&aHQgii?lQIuq`fnCeV^ z*se1aMGC8?R;rDm0mK{?5H#0iX1iQjm?JAV_LU2OQoswlB@J2 zDsn}tLB$)^lwQ6?nvCen)vu%Ooh!2MpxAtMRDt5SXZ-@{6)L^tZp2AU zRzO2ivb2h7q$KJrp=9pmpmfPe$r5a*o>69Hfkr)25~V3-fd~Bt65lQ@2PAUU?0`hB zNP@)1>=q=xLn;kOiSLq|1(3+zER&GP6-kizqc$YIo3ynE5@U=P)J1}+8@8@Fj^={kR0|^! zB$kg!8$tjU6FmeET4?xz<(YAupkvPsEnTxMzpH1RE0Q4b*4c&2-*EPQCsJOH7lV3vs;k( z_fly!6yM$BmO3xv2 z)h&AkBwi#p3m}obStcQoE0Q4b);1(wOxlj-VZ<6(zl{L=-@YHlm=uP=HlF7DLW_K4 zWM~q%frn9S1(-JFhNf@2T5Nb>U-g@#ar@Xj^L=CLpMg}F( zl2DG7OjDs1X{{viuqdsJl+39YNGlC5FH)&wD@*)GX*oe6*YZhbGpiI*RL(dS+xpNBfhK0hG6 zLXg-;uk;)eSKYE#K;j4GW+6!AZk7&6WQrt6ysZt1A0ll>^DuNj#K=C}g@VdcOWeTr z+(3&lnh*IP$XYDCDvHE)E#JWStS|)Mr>T2@(8$qz8@HDokjNEDka#;TPJj63SC3wA zmv-uDPD)les64gG&7fqal_Mp~k&?JUt)OH|O6EEEK1s<;6pogXk}XKQL|P6=6d0w;=JuQfWXU_Y*p@M6O6Rkoes-ka(#y8IZ`;uOlDfitIZiHeVgpkoZs1 zD}Y4q5>CY{J%_|qx9rJ~ICvZ)7k)N=L~a&9B73tOI#H|26?w`0OHiwd>sOFtnkM+6 zbwd{(9^a5m2Io=mK{BKv-dX!elmQ^d!m zSLpe*k6!8dDPq+vd-5rwfy952n}wcVxtnD&vF3^-NW7z+Sbu`F9Zk`QJSoN>(`Y=&5euT^45_FpxmWtUX2J zlhSg!Yvx+sao5ZgNs!o>-GanVNu}wonfVDFi8WW`bRh8xX)@h4b4{LvM6SrbLt?Xs zR72vG(kpb=+()nU91>UEvS&czhu{A0^Ujek6Ya*8ah7s4I;qyPf_QY38NKAor1(ZxpEw4%|cZ#BN3*>;9wQS}nMUqNZt4dad zYh!>0DOpzSzLn2N%K?d8H9N9Iu1JE!#%w_1m>>1CQfWXU_Y*q!QMn?CAN2_Eqc)vt zt%m8AF%8}4=cF+JJMJfU@S}1?D&t2r)$ybLt6VVP5ZAh?Ef}|_88i_J7Hmue`gyrv zh{fy$o8(93iu@JwqgwapN4;7u3obIbHf){Jvaq+&FU5~4mt~(T5n%DN@e6WUzy!ix zmPs}WuE?|J51ro$Hi{;YE`R6a^#lKQ)57e0F3r!G5FCiRY)nN>o~LP*>8U75$r4}b@zd|uq~!>Kn76^!Vxb>r!ciBJL-2 zpdweK8dSV#&C~C{Nt5w?;_BB?s>Bu9cTjBhkSb6dlTmy_dIk3j+$EffS9*?#t8Uq& zF>!p)eVyDaxLaXwmPttDiX=$9s||_YByC4?z`)34M24dqE()emEFCz$hWAoop}W>d zOdYr1c;|I=;dqYidqIQ|(%`Z1BGg0SMY; ziQkc%1(3+zER&GP6-kizlQtxNm$V&G7WzSy2-k`QQ7^@&?QUt zFxDIq>xPCW;MnpLjK)NPREYnwBTM9pBuM-zC=1{CwQrnNKmBG!1tm*C)JvtAdX)`I zLZ>7p@ecsO6d0M8P_l%Qcmgi1w315Z_%B;o;`gNGbS1~Ne6kvfE0Q3wF}nqcH%g`H z!iuZ(WPvbOq#8)Pc}Z6`$9 z6zXP@I3Wf|>*%+QOdXZN!or_(Vi6e;{!pZu9gxTsNsxH=?82wtbLly+mylRuIIrzu zz@UpMm-(tt$nCv;?qT#;%Z@%w8a@ki2RKq6Paj^N7`*>^~6_Rxcc#Lt{?$9pcM z@7&FUPBMyHrB?un+$EffS9+c$uDWHffW+J6W&tF!H_Id>azzp(-ra`8+ezCIWuY0w zW}+EL2~96af{0Qp3%xOh9VT{+M$tGjy-?^$WQ8^gg%d~kwr(e`gIiY9=*kkgA_)@j znO*qYO`m+(s3Lo5ra;1`>ZPO$H=#_3H?} zT#qN!t-+ zVWc|qg zA_)?IHoNe)kDc_r^JJEo>)A-jf|N`v%PMjUya^R4Sr(wquyZI`=xHS~l;CKOqvWxazzp({;Um&zaVW# zl!ZV;&gC%6-_jh(HJ0zH_X6^L0xE>o)-9FWG9**nw}|q-L*W!G5rom z#-l9^M2x{#F2(!8)MEzL>Ev{o{0 zLE?SVazG+i%??Q9iX=#E%wC1WP5Vft0g2pC=zv77$f-c$rhzmWkjT}qBlvPf_8k(N zJ){^CH_b?|01~-NI2Et-91>UEvS&cz+urtu5B#INX76BD*tAY=7C<6AO)7C%Rz^FLLoF7ig|wB(CR$xEc-oAn=0FG%?`CLnRLWW_!Bh zf}zieb+_v+kt>oQ@m|b&x${Twdb@cGgRkH&UxgrS?8?&Kw&8)C#y;K^I$o+&4W(BTDVpiA* zW`(Bhs@444GG@%IuxVdu48V^2$sI%iT#?F{6)a`U3Y+HTf&quP)=h1}*e&rhwt@w# znH4r|kPC)b%wDib3IVRjUm>%CxF55^rlDLGFe`9v=wMdhiX1HqdmH^y%nEW@#>@(v z9wL_o%nDo^rV?Bao%g}4&;-)u%fI}RdoLka>||Eh^iXMyr@)#?W(Dp7^_^J(M7?8X zg-sjLR!c`DFe`A)?qF8nitIbH0#P2{iofu)X;ZzDU{>Io-I39AMXJf@Z>cZ2Yi5N_ zn`@g@oHHlOgSj^MJ*97=ovM_+W>(m=P`gFNNqQP?>3L4S>X$t_r>~h6HtkpM78R+= zWKz%l5>rxtZ#$`9B_>>VGl2@UgF5e9Jp!Qg7-w?wO^Nns#bf7|ROs{7OSx zOioHxS(bxnA+_{U!{aadX57lmpkyg9+#FNQTTj26_Lr6;*mBkENb0#FDXDMF1|HVT z3Y!j)N+T3;KcNE^xgyn|;*akC^t)+`G#TF~u6`Xis$7wM2gPO&sRG5CSz*(G(koOA z#f=-2n8+2``<|Iqx9riFc=zZmzt5(J$<0F5P~6R8PmJc_io9~ekpLM|jR!4D4|%?J zxa}RTtrX?+VR%g|v1zL`9ycglO*@9{a7EI2;1})lz(J(#h(6giG(U(js@(@AQDQg| za5V6Z$PR3b7I0%DG($@R`0HWh;4#2AF=Qu-{Wx$j{XI51-o3dZ={#`X?80pyI^jj{ zmgfOTOtTWB+EXZ58BPHuv(zZ;%*JQ|w={Ayw={sio)-=t15y)1c8W4BGg7iN;HR2t zY15Ll9OnV9njPl>u1Go$G-kKX0|!f`aUS4)LdSW4D^ksQ;MO(gfrm?zaUS66*Kr=; zitPJ&pxHwY_B`;h%dYy!N9a4(-7vK25z;F-4{(=oDqiV%j=buYJ^DN_hQvq8&4Tj) zd$UZY$Xt;GiTAZ3@lnv$8j%m`2{oQu`#;^iHAs~0g2pC z=zv77$mu}hHfb^-k*i-v@a2l^J0v!HNHruLD!l?oTy@J{0g1mMHwz$< zy;&w9kt>oQ@%TB!*t_r-em4CkX*(hxG-5OM9M3mI6dGVNa?vm3g2dL+JrmP)`~dY~ zBDCVbw*oD~e}Td<&=G2$>3FdbboJ13MG_>QFt>2&KYsb`e=i}?D9sW|riLi;k&@^a zYAKm!!Yf2>m044L^-Q^CilkFSV|MElakx~P-k!Pcn&fNbid1uoxNXf{^W&t+^!Cg( zx#N|SDYEaUh-MF|K1FEKEA;lvT*8i11XpD5-=0_9vL~M+8c5XTW}&xd?q-=xthpiy z5>IR=)&^-i;%iI-OS5o$8@u4AvK_|&2V>}XiQ|Q~W5kAmD`*hxe)& zzGpdL%y;b$NaTtnNPN-U!p~lH?>!ewNUSocWC5Yi6w+is zB3HkT;L8=+cSvmZkZMS@rB?un+$EffS9+dUuexQgfJ8@b7C<6`7yJ*vK5+sIN?AbQ5Lc{R!-WuW_TA*AhN;J() zx|le)A_)>tnp?Q`+B0r@pM*rq%YlJjUK${v8Yzh~BpbKNQppO5p;nHSO!3~DlaeS` zDk>;hwU{_IdD3z~B3I20NaTtnNNmh*LE;XnG$4`t2_2Bg6*(P9e7rOnkjT}qBlvPf z_8k(NJ){~Ee@A)+kjP!asd%O5khtoWy#f;dliVzTMD}KxghZ}Lg2a>Bkodc#?TD|@ z5DsdOP=llyp`MslfUX>*eO7GCm!4_y7h`uSBjs69drl4j(3Wm*}!a!AQiD@r@XzqFj(bt*j*x#?s@mgxnG zk{Tt8R+e~#w45%^xt323y5Wi>NNmh*LE=uSG(Ep^m7csf<%(1TiFd5Y5`AehJ->2I zp1e5aitIZiHhV}lBnHwe^!(aKuk;)eSKYE_K;pF@y6~f)q6mHSpo^R;l$(W~U%8uQ z5)!#02@+3kLt;eQj`$h_PeSK(A1EUg~$$ZS!x(TWTL%Q zH@!IUd=o{zp{scvkjNEDkoe-cg%iK}lq_>7*@DDaS`J9$s@ahxazzp(HfFaVF_B6G61ktyktK3P zs)58i*FfU$Ns|GIT>U!o5w6I-Lt?XsR72tuq*nlm+$EffS9%VKt8UpVAo2I*W&tF! zH_Id>azzp(zPJsEe?Z!f_!^@C)c1xL1PO|dyd*}4isflGUJ^0%CK3Qf043fX@n7k> z4wC=acMJ>(2eo5pBv#kODOV&x;!EZhetg=`&b~}SVv&uM%(9AoA^ELiwsWc#w`w1PC zVqB5L*XV<0N@T^n7v?=e2rX@ze2u7`~G~5PnOGq3Q(>M9ej;kk-tK|M!75vU*ms~ z%L2Yet_@QOu7}PC;A?CG>GF?nKjZtKCs^#}Ydlg~<0-IalCP1wKz-+HbXt6kM}e%1 zj!58Z$eoTxaxSzQ(82Hmf*iPTq2J zZSH$Y-$XlADgBtQ@sDe_s5nVa!!13}=~w--N9XiozQ#YPcZ-TtWiqMfeu*ime@Q#3 ze=0%$h_4avzOK+*Uvn^_HnBqub+(R;x#*}6c5E*(aOtfHON%2^1q&@mgfNT~UpVPwby6>tOi9VAvh$XbIh3pnTzZp|Wr3<-p=A{*S=36V zMVqhjY0`2Ewp`06pMJR_DXDMFZryYLsZ^Rm5m)KSr(do}HK=&kntSg5Dov*E6W8R9 z=*tw@cTjBh(1QiVCS%wQKhvK{uh9Jha|t`{xw#^H-!rr7mOUC1$8DtlO>P#tTj6e& z4oGB*BuIQ|8xsGVv>j0vYO(8TK@bNCCc{RFhj(2Yv-v!XA+kK(Harj-2K3vmV_At7 z3rz<>ld$j#>k0f`$I~xYBthcK<`!Q3o_jz1aS4f92_>_v%ql2ZR36@SZOrELFosAf z2|~k+ew&o6w33u8TS@|5#%-iemzDz(xoURYb8|%!BsONZAo0ITr2&cDPv}S#xgw_n ziK#RhkjT}qBlvPf_8k(NJ){~EGwBsTB6kU=;+3AKiK}keDBQKthExgrS?PnlbI|D_+fU{rp#v@^FduR#B3UMrbmTrFB*MoOls$TK6goC2H~ zQpwB%pOcmgk%FfQf0XVa$BXy9%5}zSA3m}obStcQo zE0Q4blr|(jle8UC7P_wI+rAY=V5t|rqZ5?^#@TvCg!#4L>q&GyHWO3^yS^Ks;WWY^ z_gEz8D78Jq_qwLnazzp(zI<-si`RYj7PDh){FenJN% zaz(0v#GkH##Ai#B0f}7wI)X1(WZxmN*+Z%!@fhh9Kq7Yur{a~KL*lAi_6kURj@&GO zMD}KxghZ}Lg2b1%A@RAS?TCL*Gew|*pEm+=kdt`0jf_Fp3(j7F7egNph!Fm7aV{(kQCq>`mqi8OWcD$ndJcTz$=^pt9%a?8roawwSrK`T*MWvXj!W`+MLEe9lW z)$GU;xgrS?8?#%G_yVakAd&kC9a$n*IVI;{PITNBnyr*Yg83kzz0?ID||s z4lE}a@y^CxpnIX=gMZIX;xG|rh?hhgLqUBPrKk~xg*tj?mdF%Ika*hM!Ut~u&h=N< zSz_s>8Jb8j7!({rrdDQ_lZ|+1OE1&C+(^N{XIEuj2{Xq_qK%=TDU_@V3=4<t|0x zrR9_*GS%#WM6O7J#K!CvB>r!yG-Zigr8}}jrbsoAc+Z+F@&8DZDNAJP*AaZVBKr=B z%^p$>iN{N?P?p$7uk;)eSKYE#K;j840Pb6(6|6XLo;G-2G z0MQ3of}saypy8%gGb|L^(0ytWMW$t%5y)vB%qmH&5RZwG6N<>!yI9(BjRAwX32aB@2+#I(p$&R*uKS!pTLE z>UIkfUnDIDBy!d4fJClHg2cvbC_QFYI7uoENaTJ(NAoXNBrz)lU{+|_u3F8%En^yH zg_ET*06Xp{cMt_|MJi)fu+=duyjU(6aENQ&)D}zuvx0&J+aF&U{A_xOTrk99_JU0^ zD{w{r3Yit0`!g%NR4xn6)?!BJ4rT?e$X_9|f?Sq{S>a`JS-`BowP7m3_0ainVX(Cc zq{~;_^sP64k6^KzS>Y6E4VV?!)=V-ha7Ff=S;1{FE4&rW`)ygx2QNtPs1%e&*@kFvM1;C1FilNpI+}46{$+c09WQAOb&3h@qB87 zi6AS4R=Akis)KeucTB^>1n>+ML?u{w%{)aeEQ&0*Ft5ci!Cy~fU4@gU3S#oI>k-FmvuCJow(uj50HiU0uv;dw5FzubHr#;>GLf;csEKJ+9 zlfV~I6o}Yy92;d?!cBCHA+SNcY=uVG+W=Q2U4*=HZs8r*ed-%uk{2P6nA#XEfad{B zd#CDYPfxu(g_7k+$tp`lQDmZQl&nTdf_mA?jrQBX8Pak96j#lTix93zx(I2^#_k%= zfj?6!jquI=gpQL0SEQPg#Lw2e4ZK>Kj2Oh#uj6fiE3)qgiDnO}I!HXGhKAQjuOP~C zmvAax>G?Tg)h&DSIii{1`gd}(;694IStcQoE0Q4bmF>5Ivq;+!>vCXYOskf-Rutql-Yd!yt5puUocjC8qFVOhy$LMUV*3?P$H_iX=#U)!f3DfA+RJ zzAPazvoWSst6Zxn^%6=F(v6kOMoQvHlxMjs(vgxClq^X}j3TI@B)-t&*4x)g%K?d8 zH9H`YE0Q3wF}nqcuaimx61kty0f}6Z(}BdZrOALqu6`ZCmn*XGkl5@Y)sXml=@mdC zcL}HBm7YW5s$2F7NPL6bEPzDzW|@RUu1JE!SG6JWjil{}v(Ob7R_10Bf~=vow+C-!@xQ{2_4r2Yen3ZC2~a)B%U$1@R3j5@b<4t zNQ6Z26_S#v?q#?i5CxR1Dzx0%nBFSTc$;P;C36p*xhNgOz&gFkp(I!<%669cCTTe! zk*j70ByvR(BsONZAn_cjG$4`t2_2Bg6{!Xif4(M5JXe|wNaX6*5q!BK`wofC9#Rd7 z=Si;s61ht_6|eLh5?9@_S3u(VaZ?}55k zXqe99p?=J9bxku|&9}8!(+v+p&qHFLFarFRry(!1EzOTm!4-F8iCmEciD%9&eC_Tt zE*mv=E$svldLUv-$4XWn>c_@PrnXj+k{EiP6Z?dbX=$TmT0qINl_kDKS`J9$s@VaF zT#*EcjoB?oyg(`qNaTJ(2PASus)59N*FfT1rOALqu6`ZCmn*XGkl5@Y)sXl$=@mdC zcL}HBm7YW5s$2GCNSq-)Jp62WyWA{*MD}J`zdYFfkX_|*yN)S$t!Rk$JB6!-eiX#9 zZQJzLrwJ$4&=BjGx{2woBGxU_NsJ&A;7oG-B=&%Do~>!%pV#a_yK?>M>xLg40bI!JZFQBf5jLc$|$?tw4Dv0c{n7eFbz=vKlhQ_BRB0m0A@lv-6< zU@EyLT-~cI$hS*f(<`I2%~A(#FL;(r80g|LSQs!=WTPyJr^3=e+qRRd$M&7vmDJXu zeCz6Z>%2p59TYqEa_d|;Gdyu{$bYo&N9iKd_e&mrER1BpmqNS$kAh7xI7FL;S3g^O z^+M@Y)N1z9t8XQ*a<}nz?l;L;9Bf}YP?(-)de;3t(vR=y3_SXo+N1B39!0%sFFkre ze>}Ry^}zD(_0*v=PplpKE-C;*Vu-rgUV8K`DnMH^%``^^jtNAiTU9O3@O1;}uV(3v zDRK`72)h6$Fcn-CI1A`zj!`#`i?>tD1{U){o2$aofwqUIP}GUJnuBwVZkkYCHxvYI zHAsF*y`kP+Zzz-x_i{tMsy`v3C+9H4_a+>?r}mzT>yl}l;gy7gbQA|1&9zgU-@RNn zGt)&`f|r{G4%=FlIc8ND_`6=1rf@Tdm{4;R?V%kl{!^f;>j;{3cd7f%P8>Mq{!m- z;iHBJKj+vqe^z-oCB%mxSMJ*Ntn%6AF}otu)5XHf;=c1Ui|cTKdl zz3?h7)Yd6q_>0zmaKGUN`wm~VZulvzJ@*^6ux<(0@VwM$8yg1~U#!BE8NMP*TWrHY zr5RER6Sw9L&NxW+tmVOB&5e{X&~|kHSHqiUhDr>X<@=;RD|(>iI65wNaGzuwI)bfj z;RtEpZ%H2@x8AXv1aI-Yfttluuxl1~qvPyMhM0tWX;uHbumpk?7U29r?k z|Fb;P`l5Cxk~?;j4=mm=P!>`D;}>XgHw!epXLfkT9=IjB$3g{LvU|JTZ$|<;c60n( zyk6bz`;T9X#qPC0xSX6x^`KB1Gx0`3b!n7X<3D47OrkuE_Yi{Okk?erjJ`h3{kkmTm#W#>zUGARf!eKoeIip561eG`f{?&fp^qno57v99uMc#inwmqn zE6;U4P6%8TmJT#-bF*4s-2?mHNFM__TeD)cEFj86!c)O$z8 zE8jHsjyxf7SDx#9tPWR&r6tr7d%|$mgai6V^&#QIwOjY-dqu8GxVr)w8CQkAgoF*K zxES9nURv*+e%~u{SDx#96(K?1D{9k?37b$&LqD7TsrIXid&OxKbbNJbc-idmwdx8w zxc9#N$1pYJ2dIPKnzFm<&*iPHhhjX-JKyyR&Eb zFSEnfD~dlGme}d)p0tGyGCgf=-K4ymS-XiIC{0^@OOJNZ?oHZfpIM~%qcrd%bsDIm zL|{pIUH{GdesevV9+*w`ixMR4;g3 ze(VdMyX!f_&CfmdImPqxT{|lIr_W!1;w-=UU~%13j*6BpRnS7R?FEa^AMR4rIP%!x zA^(rYk*({R){$+bzG>%L;d$tQ5e3G!WgePVJWvy$awkI%j3=@RSSvtSFDzGN=trbM zQm$SWAT-ZQTe14f!-u!~UUrqoKKmKRq`RK+oMZeLjPDDxi}Uk?#o42eeO|f!@egR~ z;sXj=e8lkJ4QIcOer`KrKXdeR#}Nmi8wWpk9dZ8pM{oG~J8rxBiP@8n*zZ#D+FM@p zy+<6ew78%Ay;mM_ko;o)^oXr<+qMk%AI@oqqu6Y5^nd!&I_+?C`^@}9jhW#-I~Ioz znIG;a|N8@W;(WSwuygJS8;*SBeA7F$@U_$Le8UH+i)ibqS6}t+>*-fdoy!LLGa*So zmi~sjzB{FiO_$ZdKt*xMobq6B`TDD7hC2-%O!k>@(wvIHbSuRuT(?Nkk^;aNUh09W!Us+)&3x0${n7Wn|1mE8ZRg+#gD1b_!Z)3D z*~m+?&m8)0gwc$|I`V=W-gw@pZlvEoelU3HU~u+eCumGOL98Cg!i}=BEh>xytx2xw zCHhI6RL=?{H-w#9AcM?7dR(Do&hUh1(-Il*`@OZ_|5^IoR8bf*4ZmLlzgrbLWOT<8 zg(<*jQlgvE)+uP1@P7sV>B`83SsIows@%q01T9N7*EBWLD00JsXQ!04w<&Sjn*W?c1e$0x{M25D~du$h(FIY`_`I{+=7qn}Ne*E>K(A;>g#z?ZNCJV$s%Y1yDs03=eUlkVht zioWG6^D+zbZ@{|XfZ3>YF%{hcvw;cr1y~C<27KZ0g2fL3T-RU+JfsN$YofqsUh#?V z|JyhUa6f3p$`JR^WWHkSIqdk34IR7+QIAQCGW1%xvJjzg7U%hLo}koK+Pz{l%7 zprQg~8hhXyhy$e#{m}=2?{$vGci@1XQulm?|4-4RjE$YAWoqkSQPaEHt} z2*0BjD)s;uq-hT{wO|AU$G>muBoJ^vWks_E&VyOHQrfApVi}dT;u)H?QhGEZ%Cl`t zWcNE;;!yD8dMo@(y%khcjZ9-Je44gGrJ*4`&odkdL3>ARHW&`ByO{k^Vm4Y~Ic|nM zfs;?3W6wCHu)#hHfG|*MTe&ce9}c+Jef6QBMuoFpdcvbz`rEHO9hmu(+VP*L9j~I~ z;~;Ewwakmx@B5y0Lw5E9$1|xkwl=BSa`P)bjiIsoTe}^U{0C1~u<0KP*&3UJ+BSthd%D>#e1t>SS^RCzsUop7rO=4Cg?ZscE=P z**4IOfffw3BL~`_4z!FND*m#e%Xn^^z;#i_!-YX-+UDny!9crmu=}lW^&nTk1vAi> zcK;Eu{>y_6-yD4LW8b}YM5BH4K&}kDxxV)1r)qDixI6}(h~hwT$%a2yaCf{o+769p z=ojOCj+G#4aQtk#qFxCVH)ju5z7qHBi~HCQ4TkR@D7p;Z_Q3a}U=Pxl*bGR^&DRAB z{b%(;Unv)w?sM3Da6JMT4IPuq4ZZ-b|{{VmpZJi+yS2t2JHMLADD+f)?P!hag zq$GyaS!Gs@l`Px>N|xXdtE>!4=1%2RCLHzN`it-xX*up|xN3F`BH)S~jjJ1*4TZ-O zTt6$7#svfS6FLSFa79jM5W(l9$;hX<`gKs=b4B)j5JB_RQ8b8Pa7F#?`B&)`nMhaJ&IAM7no}rO0pB%D_M?|#58u|`VG{);|q~*ZtvCx0Fi5rF@jEuxaJxfQFBKscYnmwdC%6(mW1yPQ>gdI_iE0Utz-?gLMzmc{kMLE#U zYEh&IiS8#B=*De{n*Du4BL$K$c?+A99JYo zxwGaL&i?Rymwa1BIg(g_)4Kv&x>Pa+F*}AmqL#?ZP%oyV?v#`)q>^|sEz^;bcrtd& zc9i>uv>Z{6t7gaD3s)pXxyI~Pl)FwUjVQ><@r?px9;h;rN|?1*w)krd_5YDc;2Nn4AeoKG2OU?;X7p?biLsnQImGzY{! zp@kWNZs>``wDr)|g2WDR!iyX;F%T1jSo1Zb<1EJ&Nm1^#a|`FZ{N^jZC!<_S8EA&O zC`=QClI2LrYNTWiB~v%|LtTgxgt!wIjzbP@wGF)OuHLsf8-vECppN0j5L*%9Tq zA}Pu>X1Ai;x24jEa@KE4_j!$6dmX zD905^QSPD^IiVF0S32k4WtLNf|QAWR?s zY(+_e0pJnpaW!EF9Z`-elA_$}<`%B|_N%{ivy5_i3MDhCWU67_Qi?e^nBI+vYj_1U z&=&wDF@7l*8OEaGpREGJa72oBBvLYKMY$WL<%n`zH9MjlS0qKb#%w4(e!jR#Dvc<| z{e-QLnz)zaiadLM+kCh%v-OITul&L_lU1Iw{H#+{^j^VEIm}1nWwksG=o7Q;2zAqOHp{2JA zMxA`P=trMlp*xv|zoT3`HN6V`NGR2(ucwLTzf9Nh6mD82YMqM=ql!_FihRt;)hyWl z^$z=iTrfNku@~$y%6HiH^UqSS!Du5b4fJgTeS2%)7_DFLn6cfRFa0g-qw%u*P%aCe zj{3SR>}~WQmSvxDjp8kGSy0r*UY2PD*F)!{g~8S)kS<^Msdv5YUJA2^9e@0dH(q@2 z@n1QQTD#(U@Bc_z<0-J_5z6=eDf4ecbVaY04f=o2HPE(!G3p4KX$1_oQi=s`<)UoA zDs8lLpq3kLJ+_0%>Xro@*L4iPLmcGB=cWDIJvnu;-?kas!$KzYLf(qXC^{mc@{GMN zrnQn4=E|edr?528VN^H)3A-%Q0z(Gz1d$=vGja0;gc7JeO08T=(R_`VoMVV!g$sQg z|G3|{2Uy8{Zmn1Hwt6L1oHi$)6}iq)lcXL0@^_t!GTFhIwavHJHmf*iPQEL0ZSH%P z)sib7?U>1y7 zl9F)LxP0Qr(sF!#xN3H!X2dkQT~cXmF779ETt;z4s)=(a)N$^NI?nw> znv7(Qt6#@u6jx;5!(6k6RE4>5k=ReAS8!6|E@8)I6jvlgxwG3*?rzf789gj&ROYVh zacsp}h#~d9WoTX$#YPx-W+=SGus!^Si$d>E4`NG%UNm}!^dcQq;2oDy7E>fex!2=i z@l_wW{6{j%jU|?)Rf3MvG*eQtC`uy-KLw~r&}R!JQPGW_d_5~Ik$c7H84}I;r~+?A zxqGDLh;n10|8C1C%O|)ZM-Pi*vs+Q_XHscIIqoNPL^-a==|s7oOOxqgk-42Zq8wLb z-=kdf)lnVg?v-9al;bX8N0j4=q$v0Lc9i=CY3ovy(}XVsF4QBC^8`rQV%rmDXeVai z8&2Yc5h`SZ$hGvqHtfK{mAvnGNgUZh5(u=nbVNC>NQ!cAm|OVh9Vc9QyNq(0NCgPG zL;)o;$}34p(65+TYB-gX7f>=QpkxLm!7*Z{DN@j~u(K+Il6fo2-6t(al;f(|ahBtX zq$t;zy&B~WBg%0__C3lqdq{DV+l&rn ziW`V>+$HRYa$J!V<=)VWa+}wYwjM>f7*8X17#N`Vvke2utD_4v;zh2D{yPwK#X`q} z9@xp^FhThQa#j?^`ZoSikC4;a9Z`-elA_!j=N2x1^Cd66OGdepl+3eQNn(}I1sd@R zC|Qw`aQr0HLGWOEI!=*x7+GczBC)l=@8|?bWv$5coX`PT zkJb_8xFRXay=iXYiq{|i>bqr>10_&_T7M`BiX4=GffLR^4|(2FGA}GM%Sp-9Eu0Lg ztW`kCe57P6%59LABg%2r?1*w)krd?`vs+PaD3wN(<9emtFxFY)=<(fUDI?6p%dIeFAyM!H4jw_O)+?(1_ZX;FD2Y2clOCNxlM5yBJdqXPkZVP`P115Y%W*BA zyqDvOq$t;z-HLLXrP6ek<0?J*%E}d~Cd!?>Cdw^Hlj$tSHF@%pl`FFEQLfoTilW@$ zaoCLb*}R|h3Z3P+UO9B41cfW|lKGdQ1jWM<2UR7GR#{e|Bb}=p!z(Z1(FSWIK}4t!B${RG zz8)rV2QX+%kpv9qqDSJgv)*}MeU+KxT^gk@P%_PRx3Vg5gw{#|E|Axgk~x$_8>~@* zM;A(F6)6cm`KpA~^|SQm1El42mC01ICIcD(sY%{ReBN_xFXd6 z!;9Ad!-3Ldy2|95JP8b3k$ne-W)D4BV7Tn058Qg%&nByH#!>EJ(kpb8$@R))@eNlb zMY(g^$KS1_?Wo^12wmUTwa74&B#9Fj)MA0Aqs&J0V%>>j^iH53Rzv@U8wNHai>W&i z{;cgsD07UuxJ$SqDaxHUxA4{5?>XxPTJfcw8GtI)wZbqlccjFO1iagz!n%NxrS6m^ zDOrF_A1(fQRx4SMl4$`Yixzju=7Xf=h;m#tJE9y{Bt^N#Y(%-bM`H7mR2or^`w1OA z5?qngBN3rTqA6@^mGQQW8JGNTK3E!q_{II?jvfiFNM$_|uCgA9%@3CghS0*bZfXn0 zEwx3Dgn|XDn*laILM|AQXmO+4WRC<_Y^C2jwrXv!1B)Dd8oz_bBwnu_ia@-@ad0V}bcsOUT<|D$6B*Jwg zn$`oy^dsH(!^A|j2?{*WtDZ!lC~|~u`5GQ9!U&v`zT-wjE{SSgALV#j*DD2AB&BKR z&npY*}mq1%4o+d)^41XmZTu-)DF@sVo}P2PG@3pmAOp>WOYKQZfhoWD3p>O!~@FjB-T4 z7+<;nwzQnC+_{!dzQuAyQj}}VZbiArN~P(_ovZZZX^ty$I#F&#noL*jT$3jcb6k;q zk8;f(QXSH zC1{<{09z|rAkblQm7Qf!vT$2bPDsn?EXP!{Bg%0_Qj}}VZbdm;DotlOuF@T6Ii^T8 zQSN1HqMRd5rn4MVzm6!!71{SF*X$wHQO=cKp|c#XaB?FhL0N}sZJBOXQpwb*N~vUy0SRC-87W!ldWqY(O5{*7Gum|F zn|DadM^TPxc}K>|w49<`V|FXbJzgq3igHY)yP_OV%&=}{K4rm$~krcCBXzv zN*3S^hmz??$r2T>dXZ+Dhr(AAY)ww)=3p@?L0M8#!PrR2)>-ZdX*r@CSIv&I99JYo zxyI~Pl-ntlMwH`zLPy5R6{#l5owDXE=S!0j<+%EFL^-a=zDK!c52=oFf%FQZ9Cryj zq8wKwMY*@Nqg)7W-BG`5qJ@}z5G96&3ph+Uu$(}+Hqul4+BXag;zfTLc*HF?_LJDq z;xM)h!%uLX=Ud=B>4nrP6VW2V&v(?i4)D7nKAAJmpHg(s#9FCt&qft5xp0I>BfjEBvA!e0!$G|7y+hZ zstl$VQ)EmNnE!9hK4%!+v*B;D<|@ZY9u}6K9&5g}_rBlWYwxwb^^zya&)gxo&FvfO z_nTRP<+MX+VL7cyVYv(EEO!S%JJ!1vae;zn>eI1mohE4OdZ7d5Ido$$!ZJmE4hg4V zo##AKR3XxH5z2H-2Pq_CvDcVi!R+Xm-Mi-QT>?p{A)=9Ll&^}O!hw`xtw?)8lM?)9UBb}Y)xJ&xvOkQC9{&5E2w zz}Y+F{irHXq$#SkNA;bXy186aFd|N#+5RgsXq#Ynz0eL;;tsgU}>BehLSpPT<%DqG};B;{&Kw{7KWN|R{MJs()i=EpfzK_@(S|!`-t1iG>?l3kxqa84i`&~`y`R~5zr@jdH%Qfb zFG1=>^C0zSWh)ysRh)G~u$Ps@r+GmdP#RG8R+f>Up^BQV{VZP7&pOTWBnV13O?>{5 znmykS*HN}EZN++8lM2H1bV@#0hv;wlGS7p<5qydc}`#$n(K-R5abK?NW zx&dS_Ao)jX_5j&Nb=%L2^?uHH4tZ!{T7p!qNeNOXw^?0V<*1)Gp!w0#e!;@>T9eDL z{DTf%vHpT_nV%;uKFbxW*5tmE{IrIaBKhrA+`l)oLcFXULd!#v)}*l9#dDUc1?^ap zOeu<=7vux2D<|P;DCO?8f+(ocTL;oBn1babr1hB;?gjKRBC|8i5y#I^pN~V|@{pu8 zDJ*x%!Ro_*_N3=N*07vdY&!CR+JR=A2IK%ps`T0o$a(`3xkP#yIWz-l5XY|#NC;zF ztk)RNVL2^K3(ILu3d>Dy&seTCpkX=f7c4BNHF-2F*BO^#IW0a5%V|ySJIhULXla(~ z&8)z3+99;CoYthU+$D3C8wBlGl8n54xn4)UOI|ncDW&iEVIG%x#Y@oIiCl+Qm^GRU zp^Fwnk@7qI7yqh69hxp~wlWs2NnyEX9<0v)%tx+xoMAcCT>G{KBzfI{>;+^K_dF8u zT(tqoD^n*RyG}szU;L{cb!fV{&C6JR(RdEaX<=GePHR$FZgP9Za{s}AhUK(hu&|ug z5(`a$0;AmeZQtcb1#h&{8b-F%~1gZvLOltiW>GAv|^ZPQ0!)`R3#K3H3`i zSB{r&oc+(nS>7$Q$W9$!+}W#-KkT#o$}3OJ?$TUD?aYd&>VYlV{EASZqE|yYpr~f7#3@&qC_?yz$~cjL$p%yc?f*_Ki>6 z|FjbY2|LPEnbnC~+#8*HwV9jf^M1~>&hA;ayzR8Zc*mUYwf>=7{Qj{M`{KqetO#L? zYc{LvSIp|-nNGdBcGJMLCa*aCg-fJ?-B`aI7WlEY&cqUFV9B&3ua^+Ey=?zgxojum z;r&oMAC>@3Yf=KVXU+q(Uy}tns;MNX-$g-GrF3D8JUTHrsk@F`VlsY*mJM!5YX;XV zQIet{w<5>6bc(PDNy78}Bn~XsP+F4`pgrqg_3F<)@AXeG0a}9k9UzC4E{uR|1Y{ez zlKI#7v}|xgS~Iw$DfS%&xdS=Qz0-x=1d<=a?KRY|8_x;Qv@k6Jn%1NQXp`H3-d?uf z#egP2(|*AcplMAm6QDi#&}I8?7?(N!Y4KSCG_A>f574GHv{Zn$y=?zYGb;pW+99;C zoYthU+_UB^_gjK?R8xuL&?_A@RKhZ$0U3$TRT=t4<&-|pa&DH=iLqQK4#}=zQBgSI zR4!_ubZaOm!?kvt)tVHRd-lQV{-6KkW1eVOPAv8#$UdO~86bx~^t-|7N04<&C&s=_ z9FkqbZV-?IAW3g_JIZjcm-l+E@f?=Z!nClQ)}*l9{=b@8f#tMAcb5$$`omUG~k!N&MTjij5y26>P4p$+@C{vMwn8>iSIsfJLj$r%AsN1`%zStXd@>T3|P2HoQ~xlQJ-c*;0zx9x2K!7|7PZs zn>O`)?%uR%=kx#Fv>mGCF*j|eea9wt{_ke;xM@>Q-tNtecJiKg{8Oi$_{3>)GqX3B z5sO?AeS@2sTikZ~dHlvVGe5h~EtQpEW_Pf^ZB_<%cIuV!|7iMKEx5bwjTfWoZFA87 zVdj%tGWC4!HV4(3G|fQ~hG_i8qw6Qyu6;=FNXi`tbPt=l_Kip-&@Z8-RFXsYXec-Qg!9y?*>6Y_7B z_vvST%LkJwMfZ0$(?_nndir)#bhRcWo|e^iqiu87yU7pesN3h}R2!3WTR0y5TdO?H z$ia2MlDwt`y{p@&HF-4g^gWErgg07zmUvoga^K_WX$>tE zPj5H&dzx91H6#n3&c+=MjZAcKF2>KBuZ%C+4^g~b!NPe&B0oh8{pMb1q z8^e8!=WGmGn3juHtx4G!CbwrB!+i~CHU{k%EEla>lSi{L+|Rho#-PP#*%-7Y_kClS z*3d#5!^Cp;H?zXVpdCUB%V|vt%RP5~{Cxmu(^2Zst0+m!Y4S~3n&FaDoYthU-181ruY2iLFMEn%Id1?Y(mPJj zqnyKIQW$oqs7PnIu4zTBhwwEeq1k|J1Z3@qe80~_x-)0F2O7^|IW0^J%V|vt%S~?2 zSnfdvG%Tn6f`#R@CYNEkhaP%Pda!XBmeb<1u$5zyy#$&2G8 zCcg)LuoM}6KS%8}@b7;5eMkmWKPP2ZzvoWRe%n8P?H9iKmEU~DrPu!Y&pr0m!%zLp z(;t2HQ^WiHWyzP!(dEJAbar~jT{*|99^P64yxbJ%B>u&nfSD$~?doB*{ z^7`+5;jvSvaj&%NS>w>#|-$#Gpt6x0*%1@vE3s3ymgTCVz z@A#$%jYBr=r4KVh#yg36$ab%iv?gUQecpU8Jzvm{f|_|*hEzc!1B~ii=>+RAjnK4< zvV?V;kd)z}kDj|(LPU`VTqPCMM~?4)@miYUSRw|kN!d#;Jy`w4AAjZzPc?ffuc&~e zr-Oj(oq&)JkV8}_-1H_SWq9bLH*O6`ZX>x$>Zp$d7TQZEmV2a`74}l? z5LzMztw~|IOXn>2C_y_4FGg9x=9@SUX|+W}Pu8{Lx*_QwT!nbPQ&Aup(RDh={j4kt zZlNpEH(Vzx$~Ym**0Hdh)}*l9^AA>EdHK_?xzMm&RCfuz9UOG)yWW7DvD~AL=dhd>riJCSCWYlDw`VN(7y}xX(|*Cia$1wi zu-wBAMGTKMF2izKd={3|n%sAmo7T|MEcZAwE3lk)2rVq9H7P9j{5i`#UeJ!pJqe`( ziA&5Mw|!9;#xq;Rey^#y6ZP}+qPlX3>}GO z)3f038P8!kEldl`X-x{tO>WOv?g<7oET{c~h2^v+mtnc{53$_u8<$}@Ej|m&X-)1s z%S~%&X_kAUnH5-0JA@XN)0z~Pd%>LLE)cY%au0<8oXW~7^mx`nfjz5`vxtK%q;VGw zZBWUHqIDWc`h!oWn=~){9L0-3q_jny-NJHOlfrT@JXk&Blb1aG*@opP4B%AO50U{4 z$hIDkvxoyShD9p79zpWLDd`V9eD-P6`3;H}fkIMaEZIWvi9KgBo$e`&vL(S+8TTuMYcc9s*- zeySNTs734Dkqwwy{rI#c25c*${WLRRT)3(SY*$2EYw`vZ(RQydqWyF;EL^H;eXxjV zYfX;BqFzRSEfH-qER%@#g=SdDyw>_~B;=dCHnP@ji-@+?Gjq)KQ^ud? zKMuOnnQu$d(VCPn?GNa>{I~}_|9K`%t4EMsYe2Su>`76NyNDFjh76vR{8M+Rd(wC4 z%p7z5RBu3{J6-$pB%Nm)&-wAu!nA~GT9Xo{O>V<*+Z^@h7|<*(?H4ROr!~1O&z(O~ z`;Bh?T;npqoED$uGD>T5-)U}ILrc-zHsShtW>$z8wL@sRjMADEmivP_%UvpHNBtg` z>-MxtT|}fkx)^i8UecPByQl&RlRoow@Z(>R6qIDNbxX(u49HdV170EFJDXU()}*l9 zWe2NIe&|uJzSOYXXmLngM5F~I7wkPCxr^$cFzGYD1xW@zZQVwYG6r!~3nEH|y8 zrCII|%&fq2+99;CoYthU++}l?yG+oI`aNVyBzfg!1;Wr2-_nAaWD1xpS!dCjl*W{# z>%gOvW$xu+T+t%b%R-u1(q%M?1M8K$)}*l9)Rn{zISA`848q8XXyRPvxtE5CTdi}R7;_#TT{q1VmsZSq zoTi0UEMI9-Snfp!tEb)bf@>}}Ea$r*5FKXcbFE16PZUtwkimeUTQh2^v+h2>r}XSpi`?N}o0pzK9O zN?uiN?xKN4t0UxG30vbZib6MZD4h#kFU$(60^D>>m-l3pj;PiFl3$fAeL`tcSnkC{ ztS@}pM_yuBPC)i)*bIZ)d>tfV>lP%Xa{{vNs0wh?)__DhVrYY*cLoS!s~z!5<2fv+ z_I#J+v?j-hb?f$wjdpsyqTpj$^FEoZbhkauQ(y=$Efm@n~1;Q@GrcqjYw0J}ND~j^M39|@AZJsA0 z&(=LaYf@P54-Z!N{PVA!_e#TZH6S~WxYQkdI`obp>Db%Qz%6aU4q+G9ZKAaIXz_;j zR}?j!6V?%m+B{DHa(0$`z408D)55f{oYthU+~oF*<^I@!hUK(hu&|ugu$=Y_mYh_rNlEzseiHttEUj5i>dcub;s3418Td>4WlR3L*5qOd z|L$@L|8Fw`2DNCtJF)>&XKJ4oFEC)+g#Wjj0VCmGJz%>D|5}qbV8Xw5{e=HNF~dT_ zzt#s!!oSw!4Vdt6hGk0le}@?s68^P590|GJ=8QX#@IMjhS?_-78{hK|*%s{y|L-*3 zknpeeW;fwqYjWQc{{30P|GQ2cACE{R{A=B|B>Zbl?t8*NBRM7fzk4&1+#G7%wghQf zlgk8YkJ$ui+l2r3YD`2X?X*ak_R@Kn zc8!qvs6N5Vp%W9Okpo)=P9FORPteFMM{>T*eV@GkwYv_<4_l{U8YHOZ5rkDiu8&%qzyH+%wM!oyLiY(#V0OPf-*52v5++twD0WZv*yITvRCOYC;Pi+s2?YDI3Gf4^~fj^HcxyYIA=#f^58Y1lhHSaQG+^p*x8T zTaTb*)24n4NFFJ|nvJ88eBuF+WSj`d*~ai83?DHr%f_I@XWJN*Cii_~nAXs@x-q=}efK^8J@PYmD6j5IEJl9a{G(=8 zWMfbc;i+gxu32mH>YLsP-q=7>u*I1-JJ&foO3!v~-}UF>^_Jp4W}Fv_*E+v@_Sc#e zihue1?Ei5=I~M!WA2qK+(gWQfNh3tD)2iTEy7cH#MWS@@uy#FC|(+|4k77*Bgh_*L&vjp@6n@*MCsT;vWebQ zO-vV4Kn~K{Ii&(P?b{I~^R!JW{Dkowir2!lP`uWpQ2gXJptooLPa4ory!Hzgir1Pv z8jAmO<1!Sl#b=>-t;v0-_-PF-Me$pf`;?g#C|)~+mV>O;q_Es8<}CMVK|2=v`fL6} z|L8Ib!>G(iA0+oCicmCI`woi29;t>tZ_i#RNrhgPcs>Ohd6GFU&6G=9v9H#ou-p|C zh`i@LuYJ8?IltvU^lR(|WM7j$NbZe*>{{PJQP?BZ(C6(LkR%m)wE@{A^$4<`7yEw3 zcn-^HVOm&DYf@Nla(l*dpEaOiIqerLET=WO49h+4&<)46#${Mei_gMxT9f%1^nw9hrb-1mK>0J^>=(l7rT#3SF znI}HKU4+nKKp_TN2c#Mnq~JuEEp=LJQdsVl2dkHU;F<@&VSAPff>uD*v;lS;ZfiFn zNy35QdK5PMW(3)V(4l}t>wr|lPC(Z4)ak!8o{wiarRTc^B3jRddOXW1 zLGLyf)q*}6mivNnc|6N0UEY1J(z?9wEH|y8rCIKaW>&_toN`unBUbIK2+O^4&T?N8 zv}3Vv;1txgam`pJ9NN+>j@N}ReVUStgu)~!{LCpcCrjz38I^ufW|gE)7u*AfL6MY} zOG&LsVYycwtS)}Xd5?dyVY$HR0Le9DpKxeP>o{&ZU%H|uH3@}D(D}8~*G`?%O*86! z+NKVYI^B&RyQH5*tY0>s!*W`fmb0AJq_EuN_KfAOGoWEP?H4R(IjzZMSnlzM&T?Nd zF2izKe3rAE*5tmk+_Z+4X1TALS%KxWLufh6X-x{ty=u;KedR(0SMMgLOcMEne~cqzHm4wz8bkq_EtT2dfXg^M$W? z+lJ-bZUotP8;~6!YZ9Y-B&+<|r-W%^Ii*Qq zxykLXv)t-N2DGr8@(VVWQ<_|c<$mw_EVnvlTo#s7;$pd zltXA^Ii*QqxhrQZx4JQC-Lcqr?d7poxfR_Bd3>lG7%%lnDOy)fO0Rf&8KOIifJ<0L zF;B`VDh581DODLdflpHi%UMoqQdsV)gVn1qKkw;dChVE#v|bZ?gFDcjFpc_Q19I@% z!GNUcP22@dANEnqlX8lRfq)$P5o9-uSXVbOp2Kolm=>1PniQ6s+@7)AfdLK6X}@4$ zIjzZMSndgjSnjxS8J5%Hv#^}juxzo+8z;fClw6L7kq_EsobCx?p(2m8v zA&qVlj|`e9gwPTLgRSBoNDofFJam%7YVmVn?yd@_#c`B_* zVYycytp4cTmp}L2<}4S|=te+xQ3#<4$hK(+RGYpFqRwxVj_&8)kZ`&i>J)7kx9@0?TQK(86+BlfrVZp0nKF7PMorFZu=OOwqfGhsuImIF4ymjObn* z`6>A$UhIZdlx7Z3u@PDVv{VYxp#SiR#T@3`z5!*c1+qccVC zE+2m2XP(qTSF3ebvo-uz4|-Gb68Fb)53CElfrV7 z+pyfG*mrev0~(goe!)_YrZp+WzIUM5cdF2s)uYXv*%te*R>m3lOZ#O@?W)$~V#U7R zV#U6zlV-r67Oi(jHed@B`z|nGn_}P9EzE$C)u$e?-C|#@$s4fP*S}t|@9LIjSSa?@ z`d}&c)tbBki+#RzY-)4q|VqdKfM?$W*IpYT?_MM3ItarTjGxzU=n-_^Gp zZ_)+4*)8_f4$!_A`=Wic?e4Yu4(bBsh(xik)@@6%uh!(g7yF8e)TX=F>hEqwl44)2 z+m;|rYjT+&?e{lVQJZ4l)v1loOPn)zvnRAZ?|YOsvE5Qp+NRid_4hW@vcySxH+@1o zEfS{v(L78$Q^;)U5oAiTlq;zy;F3u+G-RSkj#u+@?S@gH6ZH^$eu*lmKtEG?FxJ% zxDjMu3rJcvQ~m3^U6;--qyE0}oF5-8OiP%iH7Q}*K_=;EH3RAEIg+*xeU)e z@z9m~cN&)o=Ct@Mmr+`i`%ZJy8v0ggZaM>AzozT7Gg*xMTKz*aD@2UiAw2bMJ2hRR z4VM)jU0iZ{y;E!iF~w<~aFLXgi|<9LLjsqF4lsEQg@-;S!kE72`;_-Yf#baB^lMK$ zaZZ$aVH(mCD@fbE>0B3ewut|6*!vFp0Q_5??c!egx%WKGHGww_B+;jd6Q*?>4P7KjVjXavM zxhUN`PJ%3H5HaBttvMO(+Q@qr_2}}VGoHZe;8}z2Y4m}N14d(r7`>!*Nx}=r%k$lU z;)%xPxr6p@Y0A<{DIIQEMSU93h@%gPm`1(xTb~njj6Sc^R2Z}W#GT7G`JcvpK+;Pe zCCozWP*0o&emuxDG(#7Jv@q%#mVlq!?v`mRV%A9z&KAotnN~j;kg1@9rI;Z#ri=O> zdH=v4YSuLw(KJKqYGf?f6uFLU+L|6A&EPW|f!q1R9bRygJB}!S`m~0b9I_-yy_D62 zH*MVYRhbQ`RJBA=>#UOu?Lx;Hdthz~dsb(enIxiD&*biDMr%?|Gq0JSW^N^D#|rf* zcM8AEozj6kND&Cg6R4s%T~qkutw|$?CM02i7qvAdjkJ7;O3(2;ZmAugOKHn#Mr%?| zGglw1-gU(T?*0LDnu!{x^ZUkO5dyLmknI4-RzS8BNRmbAXIhUSdjZKUwc~Rs%}?8= zd~tPa<2k1pElkU4Mr%?|Gn3nZ-jpw{Zeu`mn$dp2a+=YaJet$YKQ=D2xoGiOPBU7Q z`+l04*3d$ynQf8w>Ytcd;WVQiLd(;d)}*l9)pM5nr-F7Y(oWWH;AB;ZRBu)hhDFp~ zmvoNulQJ&RWlG>cb^6k%=TTzWmry&&%$zAll#tc(;8Zu9nE@;Oh?J^_KE1Wn+FP!EsWfsxViiCx7O=eU{o)l>UzLy4Zi3U*= za;~FsLg{k@R1l~oHnkzGNnyFy9ju;t&(}QvLx$!0nuw|cBzoaAcj@cMY0woSt$@s^ zo;)ei1V)fOfy4-s#tFTElxQ-UsST~Z+jtJkX<=GePHR$FZgP9Za<@02VL9y=EG(xr zc{D6{ws9Gj)8ezRoYv&Nv)r_XmS(x{F|z{8X@}6la$1wZa<7}SoFiz*B5l|z3?#ul zBdvXn%1#`530#M=P8QOTzT`3stT`Gdh+#R{3XmkY*QB+#sO$(xxDI8VI!uSO|2oK?BJO?!SsRe;;LbX~tX$(cET@HO zVL7cyVY$g|Sngx|#jllTK*Ms{FPu7k=VD81^3BKd6YAS2Zt>o@an?7^!f#q+r*?1g zv?eb)lgn(=PdXHggvMnqqqX=f+qBl? zzHigh@?CnHj?AoZv8)|J%QmewDckhx=i78FXh)TSn78k|Kn*r<*HuZUUBphkBwZ(N z-~|CKC`0z>bxLh6U3UZD36Yn|c&Vb75l>WAX1Q|Fnv`w&j}KN~eAfjJ`ncJq#iG1; z0kR!>Kq7Vu$aVv=YXoE~AnCe0f^3?aj+KCHeQ&7Q0Jay)iSe9mS_{*%O>0fcHa)ow z=q<~o1~l8W_6ru4)0#XQmiu1gGMlv)pM~YLCik7?rZu!Q%l!*8D{QygA+)fZ)}*l9 zAJ19tUkch$WgtT?pvs&iCv_$))3}I>GH`jMDtT@WvUL`f>ylEmG(a;Cp(ZcRP?cJz zR7-^NI~JDHniQ6M!@=s_ue1PniQ6s+@7)AzcQdmfkbc= zPy0btIC&OCVOh{MGUdMrCY{pwwQ`K&wM z=g>J#%}VGyT62=@WmW=m{*g3zkd@H0RYX@D_fE{F@fKen_%pxpz%#zvT$tPpGa-w5 zn0Iqwv?gUUf5Ut;UxU^g#WbR*a3Y@_+(8uZIsR%*3d_BDe*FD$K|7Z3#zB>&6qet3ZDXgYt18NneZH$_y_`r$(jRlP*D68ds#-y2NI8B%kfuhQdsUS2djs_`CTvn zoME{*7?O0L%c6j!r)C-=Y2H)F#Ba4cQc{^_K(<`daX=2b5oBG{@`1#ocy|2#3FA2| zr-f-@Iju=yxyfxnZ&j9l(tw8Lv|q3YfoM&N%F+*@vNV;(&xAl`&P*yxKV_VOzqDVr zhz4m*E~c{NFQ>BfZ_R)~En4r6Y`_*!Sz2Jgwkk_MZ3c`Jr+UD4RhG0SZ$Oo$;QA^{ z|IQ2x_t07&EGkP{lQ*Esk{OmsW$DglSWsEg`fw!VdYdzTaCPj|M5Jdu{Ds#(^gdtt zhAK-xW4uWh@Mc$KNjpIMuCm0_{-m<>vk0=t5ebzgt=krrC9TPQS6PxIiLJ`g&uvB$ zl_jm)mLN@Qa@inltFrX-8=sdrXYQ&jX?@=JC~ac9Z#7DL`_<=NbuS^u>&uVaXsfdH z3!7T3De#(57Yj=kh#$%2t23AO0Jut9CeCyT1oY8m607@$#aEUQrUqD zcvjL3Dogz&tdeT&1v%BaZW7oezaynd3De$6V%3}Pd+*P0-eR%X)jiiuQ3J>}9i)19 zsGG(aP5v`xe_6 z&@3+P7c4xdHMtDWJ?+qCRBK$8w^-$JvRp=KP3}9*O>1Z=n%iEvcV<@PEmk`#yDXAfK%V~$ua^2a+tB)e>R@Oa$1-c zmeZOPmYdw3vD_~i(6F5L3l^5snp}qEo_^>o_shm*SWb)2!g5-Z`_6LH8d{3wzQkhW z*XmcytiW>GAv_iBBx!3+UVYO$!5bqq6_4Xk9tHyb5^0i1U z6t6WY6#w=)#s8Y19Yq-e5zC^EGV}d7T<1KS20oeEJgE|*`$2`+BuOQRQD(elhJ^AF z;#-mLl~v^PPqu1Ltx2KyKRH-k_=x+zKywlS zLAS1lT0j!YZ$S1#$2LZ_^}AT^fp|IO9g47u%%YwI+q- z-f^(H=26$({c9VRYueVMI-Pce)P?k}hy08~XVpHY=*OiBgyXFNStD)S01{mq0oieo z1tf&AO`Sg1crGlb_58G*typVPSZ;EA#&Z9~fEJe1g1+VAppS;-?rK~Xmeabt`}U$W zx$i7Dt)Zn^?!TH@5th@=%I>A4)}*l9JLW9+-vsSg)9!mtnO7cK%j?kfsw#^LPIMKj z;FOKHWrfHVy;k!wcSU|4L2p_CmT4GMK9Zymo+Vt@niQ6MCt|60d)n1^lh>{@&%t8f z3<9zRBo(NndQ%D4ro`sFy9|hI(QCEo8;V(Jw>pCC1!N0I2ye!6|J`^F%V}X+&T?9l z!g7<_GnV^p0~(goe!+5<)0#XQmir&ZWmry&&vKU2n%sAmo7T`mEO+e3S&aNz{ZBJ1 zu$*=XPu*;1yN!#~p{}EHlRToiPEo}H(Pb9%V^5c7>JkFFUGOYSd74vsgr8-K-d~c% zS%S246jT21whK9}xEo~v__|Vic!F0%`rXxt3geP@M`)Hj(=-$&(B1vfCzy$Y0 zaP{#*uUW7pXWvZEH;jhsbg10uy@`W$snLkCScJR+^Mu`&|dC&)?(9yWf4Y zYd2m>wuE$T37RgU2?y8f{B26sy3=@F7bS!#bQI}OC-^$Zfim|2kPY*+jZN-uJeOTt z3DdS~D^1F-J-H3&?G4O53~1T4m0z&!+Denl?Ap&bbOUowkA^lsfc|&xi z>y@9Ov6Xuvrvp0H(2lC2D^Zn_Ex{GEtzC`Qq_Et(4_0sb-Dkb}9$S{9Mkk6J15*B< zfaE#`4V{R#SE#JiUQDTa$PP!x8bH!rh`-2|;0k))uI4_*^O5D0p6}kkXgwE}o7|qU z+!-2cW+>{ppS;-?q^&cSx)Kl?hTCA<$Y(lX$>vSa`!j0GP0aZB^3$F zy?f4b4-mAb5d-j=paOxlF+4+3(ac}+KhY+72R4K#B= zAPkUP%?QXEkTlAx=V@UNG@i>nvl6D|ET=UoEH}A5W4Q+z&~neL1-;91T9eDL+(n1Z zat}5x%RRH!V7_8c+9fk2Idca$1-c zmeZOPmYduL^j2@;Q3f0WM=$;A-QIb@F&<{i&D#Gx<4wANH@kWh+5y^ky$KEqlitJ=C{33m5_%I_w=H@T zT9f;(Hz7x^t=`1%Z$=Wm39Z|fAWds>nIP?wO_28R&5z*|H$E?M&fL9=()zsbQQE|I zOGRm0y@?Ap)3U@#diOF)J1r8XT{92Uo+M;GR$}{M9F#oN@rGFXPDLn|lHBdlB;JWg zk&a8=@UqyYda;U2Cteq+n}sx2PQ559)56wORBKYgv_CyqedxSbUGrcQrisN~K$7a{ zI|HFuN^-YHlXwHN2V@<)R4)#3@5F7Fx^+l%WdYfz-Mp*lla1&6_-J8T!ZfW(3DYLG z`GMc2PdvqdW^rl1VBtBf$z^%&{0+}N)wnDVi`o^sOLJP2`%ZJy8d{3xwwF;)GqWNO zi`rS)WjU=$VYxq@v)t1Kt*OM0GOsFV`;(A5>6BF^8I>L~r|Ei9)sDJ(a+J!83N7|^hs z_6ru4)0$j{<;F%%!~$EEyU4f<%W3ghuH3aI_nqaYHMBI#U2J9rmeUTQ<;q=aQdsVN zbC$bA(2m8(1=3)7p87>mk^>%xNYy9t+KFfo?|N~F7FU&1vyysiCwJW}S+8Ak%R`@@ zSONFnwhkv+lfrWEr%dlP5BSpghUGe>!I~!ZyN(WKfJCZ3iCZV4LHq{f(2O8kr*Yjn zXFt(|%&orLHa$1-cmeZOPmYdw3vD~u^Xjo4B1q;h*O&$%)J=?ep%W3gh zSWatl-&t;2Lrb&VbIh#3a@rxZu$`{R%Szg90a1R zw4dKh@QVcPC=0;}Z5@>b%|L^&qJ%Vwa>}Z5M7)w{?YSOFY-`s;mb(ZFzYL<(4IF9| zGS@HCEU`CEQksvX6r>ryt_2uQfkbNeXmnuy}8peD-hQ%X%8hYQ4R z1li7CNM3F{hvl>|Em5`B4a;3&T!!Ve_$(}^HM#FB zH~r{*t1NfPwV(aK#qu-v4T=(8X=VkM(+;79<+LV+X3=_`Ip}9)X<6CCLbN7@J&hjrApwScVCewd4eTxmQP zmeYE^dzRCh6qcLZp0V6j2DGr87W8g`sn+B&Eccv4XSr7!mxblDF7IZ$Xie@r%S~%& zX_osVGb_S!+F99+ShXgFQqzdqI%V$sED3s`Lwf-=`Q0b!tl)z1F0#+=mZVpMB!__aAf2&pgLN*$9wG6xNM^ zq}p@~vNa%SCPk$^AZt3ABYHLTekUL)#scIlV!hgUE-xfn&v#i)Yf@Nla(l*duQj0M zg+vQ_m*uo3mtnc*9%8xI8JFdSMCo{_OYgtIcn-^HVOk5fJ3qR&y=aJn)2T)O_rgomouPiDNgI!CZ1{Y#<7)hOAZR;VWH7P9jQC=UO z`P%zE&9EGq%7MHv4I&oe(>A1uJ3z|yn}Fn%!R@J?2V@=f2%5H1s39Qx0g&yyhtyk* z=dhd>riJCSCWYlDw_&+$8U5P~Xjo4B1xux;)})lt{}5&LQ|;5N(sSm_R7U@H;|%`qI(E4yB63$1)=t4w~StEa^K77NmH20=-)%dtsIdkqu07^DWlh#-1jniN%+{7 z(Z6>yl9bVF-L?d2T9eBJX_sz-w1o4FP8vmw<|ahWGx zS*|m$$kzT9r+=FE53an#HHq)I$?uStn>x>cRsemP27ZfpY#e%STe}V|#sk{#(%5Hc zJ%=2=)QOw=*5}ZW*H37h-aA9+*TGPCz0)~i;-;XB-Kck|4fXoS@7*MEd{Ck!p2Sqe zd%o+3&F%ia>wLps=S&j};cn;VeVe&iA~4vU8>({iBJfL}e3Lc81M7^gCjqS+3Vfn) zmqzii<5S5Il}-^vo*R^olV$6ySo^u}ZRW;_d!9rY!!T%T+P5=&LEX`my>4PAJBXZ` za@mAywz{Nw~(3+a~EcmpYQ#iFt|`f+40SUhlaC zy5ZnaI@kE#;P|1_llF&-XE6Nln49-+=4Oc)#4mrzt;CZoyS@TJodAZwKb*rcL|S4|?>Hqc-rP-fP1iX8 zx6BN80SG*hqS`uX*GZ#{zD_$X6P&P?x#3nc<_@9p8Xs-GAa!G>_E_~kcdIlvmFeYY zoBIbZ@WU20KN|hi`KS^SsCpHX!ScJ}Y!1 z2P3}`k??H4R(H?7HK&u-hI`41bH z*@v|FEEnurlly*jo7T`mN4F{Q^&@6h*nzY|Xt`k5niQ7%*qr4)DriS(5PzLJxu0`) zUeary)=oWbvq*0X=q`0m*9agkj03c^9 z_c7x+ET@HOVL7cyVY$ie8Owd#fQIF?U$C&8*5uK!+$W67u$&g3h2^v+_nqaYHMBI# zebUSdETKOvBgndj-vlH=ZzITgvc#v1=dhd>riJCSCWYlDw`VN(X#*OT(|*Cia$1wiu-x+x zB};t9xD3l_@mW|-YjWRNZdyZ2v)pIRtiW>GA+)fZ)}*l9C*~}7t)LyHK{)atPZ=O` zDy&sgqr2DGr87W8i7tJdVvu-so7mxblDF7G}zXie@r%S~%& zDVF;fi;-We&zo5hmebD4={s)?T9a=+o}W-(MRR+9`Nr8V7-zYJ)FL}|d~s*5KK`)N zPTc+2t+ZF~+D8$7K(!FgJhsFo^RZhwH(~PLvYEUun#m(GWG^T0;{RhN@0&e}E%0_= zruDRYY^L=~W?IQ?QBUiQ7yp@j-tl+e_{2MIeBzSRPS9#z`;)agaf^HNcB(dW6aD+# zncr-Z&${Jpr~StJcIy-A_kOeg{Vkq$?8Lq}dW&xc6n42_vkbp%mLVxg>Seh5cBnOZ z#pz#S-KgJnZ>(Q83;g_lvk6J2bvJ)~ztP7xlXRWDA`;|~?xY>kQ%7`K(Iz#pBww`g z_A482Nl8+BdvwPYt;1S2Sp$qh)a)R_RM)jJ9PUnd*6&u7T~MR zdF7s)dHt)+ye<*C|6g=q(Jr*VF$Wf{qyK*gmM3l2;nz0naEberqdKvuvjjP@XvcE_ z2KZ(K^UY5zCvUWwr9Hl1(WaAq{ls$e*v8xazF^ThyuhBPg>V!nmXoJ#W^cc5ShPd8 z53~2p2xS4jy8emfriAC$^U-QIr@+O;gxX*Vi>ild@ zEZXs0fC0W4!F+=g%a_f$^5lV;C2xs4mT2({*{g4QCti{_7b1%H<1=q|u5)&jp6%Se z>(9mWO`iJ6;~VdnxO3UfQ`cVO$gBS+XRrPzPnTQEQJ^_myKxaA(wsVZJ?Xh{IX|na+_K= z?jl5*Q>Pi6j>3|fCT=505;y@_H+2iho|Z>`)A=1B`R`Uhc7SA}HhJnN&oG|L?TXfO z%d5ZAq`dl1ZUcIgr+)IL2DDrqD8FFKZBm+C=GFfN*UxP_dBV6XQK}N3Ew@Q&a^GM5 zr#1AgzWQJHsRzCBrSdapmo7bdGczj^l`4nOmfNH>DJ=KrbC&yCpbbZXW-^z2Kh3N4 z+RviIN4d{)NKmh;C@au+58TwvlPsiGE}+n`N{blUi`HpT`2n?nu_d=jYf@P5Q#9(m z_kFK z>l~-?x-H0h1G00S&VcM@EO!gzIV`7zX<<37NnyFk?HSA6(tw8Lv|q5WoYv$rEce1g zXSr`PF2izKd={3|n%sAmo7T|MEcfkZR$w{p5L#GHYf@P5({q;l4naE#G}C-Mrck{s z5*JyCHH9~xP{z6kv#`8rQ+XF07&VY$y7tggD^ zi%tpVB5!WW^xq-mRU)>7!?-!-1Y za$1-cmeZOPmYdw3vD_&G8kW<3!NPJ{lgqH&9~@%2zh_*A<+S)LET=WO?<_a1p`}^w zOfxI6oOTE;ET=UoEccl?%l&;pI|?*cK3Y1?Iz%oc4H2S`io&nBk#mYLE>aq5xK+Ha z)AFHk!b`HGq97-WIQvzp*+W{R3FR7D(f*cfNI^;`dXSsi1JQtSJdcJ!vr!^@o zH@Q7yx$iWfh2^xMcdK!kN=mt^9-=t|$_<^_1 zIPrxk71-R%A)!-6k%i^7CWYm$Jy^Z%-cLX8CFU&G0TTTPw2+#%^>}IUdyn$zp>7(CvRh%fxon0w&)FOO)e(T94#i$eDWWg0fSn!-W}P1 zEg;amz<_N8nos@{GhpPhsRwLVpjm731{7$HuP4xa@}HVvAxTW@gGHcOYw`vZXg0&L z6=**B&&;rpW2N=sNXYdzXZ*$c@8N^5f2AZ;Vi zeDa@fd|u+5xf`WvectydZDPBHqO@b8I>N7$-@TcZB~H?}*-4SpPRonVxDUmmHOU6_ zN_9dv^oAHYDd{WdrwQ$6{4T2dIF8aGB>st-D2S2uP2-++G+g(PlNEVO922jVSaF+J zcl*tlEpcGq4Q;h!CZX*J_w(Zn-{|DovH^|)ur$35y{MpBTC#RXt3w_;q~ThCqOO;R zj$io^X&nB#3_`#162z26@Rv4hYsV$M&L$eBH7TL(UmUEie83|f^fD9L()1RP9nI1Z z6DF;01UVRx4Il>tvh4vm7?3nsqYYc@xTM$3M8i&gkMSJJ(ZaNZwpx=C+D>jWRolcm z$AIPsQu_tV-k>$P%-(SMp$k0MxXjO!7N6yrLThs0w}xpAEwnXk1z=BlW>%n2?GRd? zDYPbq<^E!Rf#(a_Q2-V_cbBe_KGKItnnpZ6tSdUF6_pb?N$zI86Q^krtb=tH@sh!t zMV!c;U${;xuZRN61)kQVu-xa6Mm+y%k9+xsA1%W>$pdw6n5%meZOP zmiyeC;4ohKn^#9Na9Ygo0E% zFO2=L$a7oDiPogB++QB7KK#Ddyyq2$i??@0fAR7ac)@gM0 z;@+(VWKZRU| z=0zn$TI6X$wp>8jS46MDFwfF7k4lPM1D{}(mYzOc9k~Px0;l3dg4Z6~y`0vhu-q39 zR*!$di(hc{_AIvrNuR<7kW{vgAp0n6>NIVlo+4KPS;x%`BuzV80Xbv2I~dQ$v)tC` z|Dxx+5v$g7VY$ie8O!~E0X?4Ol%RJbRxRjdSnef<&T>C!TprJIN|$#dR;|nX&T`Wl zTAJm4$jr)kmQ&8kZp5mc6=AtA&ROn<1?^byI=)Lsu3JQLCf#Vmbw-O*+Lv(kR<51Y zFVZNfim-_NzzH09Z@o?f&!@y6l@n`|O|3~`xi1~8EC+Eg-BK{E$s4c~EV+Iu*w30_p%hH( zgQXNqYw`vx1vA4km4f}885T;xv_2dOx!&fCAEgv*BGR)i_`Nq@^kLZ+?WJHpZ@ftt z@MgCZOgljPUJ8aX##9RS3sgYJ5s6YTt=pDTFs;dbF9j2gk!>m1zu$}`rC?gOEkT;r z+`-xX%pKm6{T&i!1i-c*{&BL@- z$b3}nNZq0&-N5smJgJf>^GJ&*LNdj?vd9y(C!^T)b8fX!o=kH7Y?LQO5r}+|A5@iV z3DdMDB~1Iu!RoTtzw$$GH(^@pcD(`FBtsI_9%&IBAUm(`ngs1h0oec&<;kSs&qhts zQTB#>ksl1hTra#cp7Z0Qg=q=Xv?e7?o7|pVM)d|Xi%a_j3(sjyF2i##KXe&27?%m= zwD>HSQCgGxPIJ>5`c`RfIs<-#g#TYOvqHqE9YV`xl-8uM+*jr-_a6l9SiBiJVUYx+ zf=M!e7*U^DI5F}>Wf|pOUL;{qm1#x269tnFVnk@udYSyWIHhzpv8BRlO$y6>^|Ei9)sDJ(a+J!855WI)4m+AmmGPHXaLSnfX?mti?AJ`2lfP3}9(O>1armir|$ zE3lk)2rVq9H7P9j)j7-kvY;J{H9DfX)>u5!<>GFyqd)}*l9UmdLe>{C}?`fkH=N!uVB88-s56OfIcv{h8J5%Hv#^}juxnDQ40?TQK(86+BlfrU;HD|fI z2->lDlcp*(eJQgdLRk`djjGJn5n*W=rCv@(1@%olG@`AGMtJEup+^q|j(&Mw(c>l$ zZCw$xCWYm`cCdQuJzsXkHHPKHVjcB05-Sj#*A9K%0V7nNs@m(c#Dk}$O* z$2F{S*Uu^PgrA)$8BC zIm`J$Q;#4iRwqmyXk!%)jqBF~kt-l+edUoQRwp5;6BMo2F}g%OAp3yC3LnDQ3US=k zcrIr-t>?R`uv(MCa+BLLmiw;;w4CL%pm!7gwI+{-<^G#-S+JfPX4wTGIBYz{#iB#tx4G!MzmWU zy8j_)$9mV8<~Wq?=Z+Uu8Fl;giExV`qmndRQ|X`i8J%=Wwt$jXn#9ey&y1aQ6$Ej~ zGfrTuch#Ddjp4lGtCwATn}xO2q5B;JT8_V3(7PLh*5oo9 z!z&LRfA3~omgBG1<=u@zYjWQ=hG`8gv@uL9cb=IQIsR&AW%pTHYf@P5JmKUm%iSHc z@mTNbQ~gkKiCL|^xF|UFQrt?Fs~gbCHHhL|3i@e~vtEZqnV?geQcjWkZY&ZfguQe*Bmwb>=xf)ek+Fm_zHuUB{`H;#R6$-GEN6fNZ3op9VQ?8+N?` zIfTs!vg3~r^9P%I7|&rjElf+0uQe$wH@Q7yxqBMWu$=Y_mLOkiav7F;)ghL9qssR7y0$vfn}*XwAW=0W=cl6l(RaNN&$E)=hXX`^_h zNul`3?HR@2-+&g1SAM}p@k*0NL-7wVE(^sg@!2R|X>#8wep*9IQT&$W9%yDoC|)^) zHkMPG6qdWkoaG)QXvbn-DR0ZtjQpdu%U?0l1xP51&>p(U={oQ|^yPzs=Xj6ywn#5? zOfN$}%rdvk+$y)+<7!O`%iZ(%>b=i-=e<8>SWYa~X-)o7>+)BObb$fc3CMN>vg0`( zkPXtyg!erlYp!%^cW7oT_h92WET@HOVL7cyVY$g|KyS<79%4Yla@sFgDmAnwr3~&z zDTAAGmuHn4GiRnUxQ7~N;4kf$Emd7wlZ%zXCCin;JY+D9* zz8Nr1oazDFErZjVyaCJL((9MOJ=_cnWpG*_EM;(7lQ&=)oEes>4DJzTSSW+j`fw!V zdYdzTY<29^M5JfE_Yt3c`*pG{+RNa6*LXu2oZ6e+GB~ZtJuibxXq+^a!99|S895?R z2B&q~QU<3rx#wkYGLlmn+@m%lNg15hZA*}*HMwk%wk?Bu^v35U&Y8Q<4O*Y~JxZI{ z?pux0K78S8AMs@&$3yiY+cLPvY^G(2ll1O;gLYaZOuOeiOna=5`KVSBp&`f1sYow5 zuIo8rocTU-AaNcAl)AY=<*%KvBr1w4MAgx0atbdiQ~Kn%DK|uxFimSx!nAuGUp@Bi z_qzJyCQKVG*1bqCZ9vurB(2*hb#sHkZ+TT0kOQLX=rlQaz>D|Fzs>1bAEiZ zFfC!4)}(}KliPsazN$XnfM#)NzhL1xt;uD0?#e^&4ZmkxCYaOWvs^}LP3}9*O>1Z= zn%iDRJ;BTh5uRw?ah|smd~l9qQoxJVG3pW`;pp1y16H zc~$UyiW*a#1~DnqejF9K6GV=eMq%MZrG@3RCWYnheSG!c`(FE3pD-*pprQ%LUO?83 z-$aN5)66hPhY@5mbky|*q#6pyRzP;m7G&o{{fy4_Y^@p z7W#Q1?GRd6PHR$F?mlytdxoGLi+x>Zy>_yQ{;NTrL`9M$VO;o8 zn62Y7OCs0z^C~Z?o((wE5!m|D`5Uo=yvmZ;k8A}ZT9d+Z_dULP+Xa7g#kGdzT&HcF zI->t-&?Heeg6sfUw{c&OAe*7-1tf<$0^1QJVh7Dok057fxr>bFu$&gAh2^v+h2A^6TU?&8)z3 z+95o3tDOuv&mmMx(AT_D<9EZPphg#s6}NC{ z9qs1pi_Un$X(!I1V8C%H4r$PEim8N6>M$j(7HucEp$#2383wWxe7V`83u@GMZXLoK zsGvZ0(ZDOtC?a(0b82J+>fWzwKW^HdW;g>G3?yawi4*rNooXYGl&-#QXxI><``bhf z6>3QmcTT_=vb)_aU1#^#u{?L~nxb>=#9n~Lc^^cL^qsCzF^D|Rji54wfdNkiOPad; zDUNlH*U{9_rBZO9d5?RCYi@GK5#>*x*4)myD|*6V2-GM-8QG_|1xLHWm5$numlMmT z8A0#hp{72~l8mst?x0e!w>(%aZPa*m#rw7^_vYqIgk zXh}*onWS(X*Q0~(x->KCQ_!6D417R#bTD`%M%RAO;!Y5{e(NFZ&~S4(&>qN5P@wP= zIs;JvQU{a-@khQslWx<}I!a!x{ik1-7=As>@ZI@qYgzn5|PTyTu{Q& zp$Oe3thj_KZNG_!v4|Q(?p&swnF}b6^k|e`^3y<>dO|fgsvG<;Zf}vE zZDx}9V)ab!-j!=j%E{xt^OMJO1npRWPgfS2iRN+ThY9`l$~8htjJLB6IgRjBPkLrR z;eA;;j!OnVokzK-NeIZ+v}^G_n`E5Uq?|nNcYO7_cR%a?pEDPCIgL0djFj$zlEF{s(GAF!b}fKpp0WEB4e0G% z`ST2DP9EAXSWX^VlSgy%xYW4J$>aZH?@a(LJBs^mX21_=$nyLKCzEk(k5Lk1Y~()s zIV5)GtahBl#$fEkiIbca6F^dgknJQ+*mp1zNW$!5H;VzYOJWndK!6rNAa=8gRV+dR z1K+Q2-+OfQZZn{-&XX?R=dlsP%v0T}?!N!7s;>H%R6mR7Ar-mlp2v8G=Jq^ZZgvIF zL%M_(&x028EMowkulwP{oT=@3=@lS7Es=ic_#RV&Bc~|x3YUVh$4TaAdbBb9L|#^A ziMg-1Y`L34zo)7@iiQ^A$eu<;8r%J-?Gm?!rYPuwPNJ#rPH2veW8b~Q z!Q=r)X8B$%{qBPi@)Hpmtlr+mN|lEI9*mI){Oc3ZjE!cpeS0FWZ#R=G-YB zYhyRTjl~7g&Sf18HA03)4}-<&rAHdKk^Q4Rntkv4rrYIt^eMIljJ|cdvWTkMccDb3 zIj&C=2pMWW^NO06>!}aa7WOKa4%hO6zEfNn<+ni*XhcgdNS>iCQ&7s_y zT4*w_Bxdn2OSgh^kz(gW` z;iIy2IGgzA-Z8$DoB}r)@b+R327{3T-q{-VDq#0GDRJ-8+|HbGq=Zq+nR7_IbUluz z?hlOnT|4P|Nt8E`{dy%|?0&$lW+=N)A9u<((;GCoQBRlrPME6zf+nCr z@m;5P(WvS1&3gj=1G|c zl@stn%vKg=C%b@$Sr0x`o@C+T>l0FrEClP6DDI#-z*^{EaI(2M^+t35>ARH>9U_N8 z$92nlGHhXLh5s>X-=q z2i}vhieZnS3Wfnbd;y)P^T-5DpcVVg*pan>@*ao0`~ zjYBOBaY4(=c-^?A8{{=n1pKf}2l7(DCnb_7alKbXP_NNNP((_)vQhe_To3G|B6VQ* z@M&Ooo<4XB&Y_H3H7@yTmheaWGdOk4 z_YNh=(QwVfK%x01r$dI%HSqb;q#`#xup7TRGX-{I`s#INR|xE+OK5pGlZwtx5hUO^uT0tu^Q0

0%vWCNDT@wQCH@4Gz^n%1QOJpqy0X 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�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 cIFCAj+y|KSD1R7Uam89-k{eRP10mD;aR2}S literal 0 HcmV?d00001 diff --git a/datanode/networkhistory/service_test.go b/datanode/networkhistory/service_test.go index d2eb046e476..f0f51d2305f 100644 --- a/datanode/networkhistory/service_test.go +++ b/datanode/networkhistory/service_test.go @@ -379,12 +379,12 @@ func TestMain(t *testing.M) { log.Infof("%s", goldenSourceHistorySegment[4000].HistorySegmentID) log.Infof("%s", goldenSourceHistorySegment[5000].HistorySegmentID) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[1000].HistorySegmentID, "QmcjD1fnd9SHMHMQbvuwXvviPMK7FVtAdUceKLneUqYSnB", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2000].HistorySegmentID, "QmNvRrYTJZJowszhNN7LVSLSoKdh2XYEfGfojAx1kUKW49", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2500].HistorySegmentID, "QmRd5SgTTi7Sy9qL4MGuRfAGDux3aGYWkrZ3kLZnMr6SWd", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[3000].HistorySegmentID, "QmNZ7hR3tbpFA3EvhW6shoRDLnVdwKdPT8qteCvrERRz6c", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[4000].HistorySegmentID, "Qmf4HRZKum31r9LSP5CDKhV1hsAdeHwVpbtozsbWvAS2S4", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[5000].HistorySegmentID, "QmRuzTpwy3JJZwn2L6opiCe177i74dWXgxhA1KZFodwFU9", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[1000].HistorySegmentID, "Qmb37vQANU8UWK52ogCB9LdYFH9MsMUdKN4JKkykiCgyGm", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2000].HistorySegmentID, "QmP3yEwwQtNjZJbCnwVJP4XJmVLi7Sp9KrN4bUKkeFtUcA", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2500].HistorySegmentID, "Qmaoc7eDEhgCQMu2ufZdkx5U7ksqakQFp1gj68QbhXL4mJ", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[3000].HistorySegmentID, "QmQneYFsD3gnXyqkJXEWG58m5B1tqqyQ7Adt8Gj7FZPZ5Q", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[4000].HistorySegmentID, "QmYSBS3XpXoDWYaveBahQyfoffeqS8Z9vbiKvTR3MakSrF", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[5000].HistorySegmentID, "QmQU5DvHjcJASeceZMJHsm5hKuFpgaGaJZZRUHXzHA5su1", snapshots) }, postgresRuntimePath, sqlFs) if exitCode != 0 { diff --git a/datanode/sqlstore/migrations/0062_teams_stats.sql b/datanode/sqlstore/migrations/0062_teams_stats.sql new file mode 100644 index 00000000000..927c3f69510 --- /dev/null +++ b/datanode/sqlstore/migrations/0062_teams_stats.sql @@ -0,0 +1,77 @@ +-- +goose Up +CREATE TABLE IF NOT EXISTS teams_stats +( + team_id BYTEA NOT NULL, + at_epoch BIGINT NOT NULL, + total_volume NUMERIC(1000, 16) NOT NULL, + total_quantum_reward NUMERIC(1000, 16) NOT NULL, + games_played JSONB NOT NULL, + PRIMARY KEY (team_id, at_epoch) +); + +-- +goose StatementBegin +CREATE OR REPLACE FUNCTION update_teams_stats() + RETURNS TRIGGER + LANGUAGE plpgsql AS +$$ +DECLARE + party_team_id BYTEA; + additional_game_id JSONB; + +BEGIN + + WITH + current_team_members AS ( + SELECT DISTINCT ON (party_id) * + FROM team_members + ORDER BY + party_id, + joined_at_epoch DESC + ) + SELECT team_id + INTO party_team_id + FROM current_team_members + WHERE party_id = new.party_id; + + -- If the party does not belong to a team, no reporting needs to be done. + IF party_team_id IS NULL THEN + RETURN NULL; + END IF; + + -- This build a JSON object so we can merge its content into any existing record, + -- using the concatenation operator "||". + -- Building an object, and not an array, is important for the concatenation + -- operator to deduplicate the keys. We don't want to insert the same game ID + -- several times. + IF new.game_id IS NOT NULL THEN + -- Create an object as: { "GAME_ID": true }. + -- The value "true" is just a filler. + additional_game_id = JSONB_BUILD_OBJECT(new.game_id, TRUE); + ELSE + -- No game ID, then create an empty object. + additional_game_id = JSONB_BUILD_OBJECT(); + END IF; + + INSERT INTO teams_stats(team_id, at_epoch, total_volume, total_quantum_reward, games_played) + VALUES (party_team_id, new.epoch_id, 0, new.quantum_amount, additional_game_id) + ON CONFLICT (team_id, at_epoch) DO UPDATE + SET total_quantum_reward = teams_stats.total_quantum_reward + new.quantum_amount, + games_played = teams_stats.games_played || additional_game_id; + + RETURN NULL; +END; +$$; +-- +goose StatementEnd + +CREATE TRIGGER update_teams_stats + AFTER INSERT + ON rewards + FOR EACH ROW +EXECUTE PROCEDURE update_teams_stats(); + +-- +goose Down + +DROP TRIGGER IF EXISTS update_teams_stats ON rewards; +DROP FUNCTION IF EXISTS update_teams_stats; + +DROP TABLE IF EXISTS teams_stats; diff --git a/datanode/sqlstore/rewards.go b/datanode/sqlstore/rewards.go index 21d15020959..bbf23268860 100644 --- a/datanode/sqlstore/rewards.go +++ b/datanode/sqlstore/rewards.go @@ -82,7 +82,7 @@ func (rs *Rewards) Add(ctx context.Context, r entities.Reward) error { vega_time, seq_num, locked_until_epoch_id, - game_id + game_id ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14);`, r.PartyID, r.AssetID, r.MarketID, r.RewardType, r.EpochID, r.Amount, r.QuantumAmount, r.PercentOfTotal, r.Timestamp, r.TxHash, @@ -106,7 +106,7 @@ func (rs *Rewards) Add(ctx context.Context, r entities.Reward) error { epoch_id, team_id, total_rewards - ) values ($1, $2, $3, $4, $5, $6, $7);`, + ) VALUES ($1, $2, $3, $4, $5, $6, $7);`, r.GameID, r.PartyID, r.AssetID, @@ -142,8 +142,7 @@ type scannedRewards struct { func (rs *Rewards) GetAll(ctx context.Context) ([]entities.Reward, error) { defer metrics.StartSQLQuery("Rewards", "GetAll")() scanned := []scannedRewards{} - err := pgxscan.Select(ctx, rs.Connection, &scanned, ` - SELECT * from rewards;`) + err := pgxscan.Select(ctx, rs.Connection, &scanned, `SELECT * FROM rewards;`) if err != nil { return nil, err } @@ -199,7 +198,7 @@ func (rs *Rewards) GetByCursor(ctx context.Context, func (rs *Rewards) GetSummaries(ctx context.Context, partyIDHex *string, assetIDHex *string, ) ([]entities.RewardSummary, error) { - query := `SELECT party_id, asset_id, sum(amount) as amount FROM rewards` + query := `SELECT party_id, asset_id, SUM(amount) AS amount FROM rewards` args := []interface{}{} query, args = addRewardWhereClause(query, args, partyIDHex, assetIDHex, nil, nil, nil, nil) query = fmt.Sprintf("%s GROUP BY party_id, asset_id", query) @@ -219,7 +218,7 @@ func (rs *Rewards) GetEpochSummaries(ctx context.Context, pagination entities.CursorPagination, ) ([]entities.EpochRewardSummary, entities.PageInfo, error) { var pageInfo entities.PageInfo - query := `SELECT epoch_id, asset_id, market_id, reward_type, sum(amount) as amount FROM rewards ` + query := `SELECT epoch_id, asset_id, market_id, reward_type, SUM(amount) AS amount FROM rewards ` where, args, err := FilterRewardsQuery(filter) if err != nil { return nil, pageInfo, err diff --git a/datanode/sqlstore/rewards_test.go b/datanode/sqlstore/rewards_test.go index a644a231c3b..fe9edf3ee1a 100644 --- a/datanode/sqlstore/rewards_test.go +++ b/datanode/sqlstore/rewards_test.go @@ -60,16 +60,15 @@ func addTestReward(t *testing.T, RewardType: rewardType, EpochID: epochID, Amount: amount, + QuantumAmount: amount, PercentOfTotal: 0.2, Timestamp: timestamp.Truncate(time.Microsecond), VegaTime: block.VegaTime, SeqNum: seqNum, TxHash: txHash, - QuantumAmount: amount, GameID: gameID, } - err := rs.Add(ctx, r) - require.NoError(t, err) + require.NoError(t, rs.Add(ctx, r)) return r } @@ -906,8 +905,8 @@ func TestRewardsGameTotals(t *testing.T) { } for _, team := range teams { _, err := connectionSource.Connection.Exec(ctx, - `insert into teams (id, referrer, name, team_url, avatar_url, closed, created_at_epoch, created_at, vega_time) - values ($1, $2, $3, $4, $5, $6, $7, $8, $9)`, + `INSERT INTO teams (id, referrer, name, team_url, avatar_url, closed, created_at_epoch, created_at, vega_time) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`, team.ID, team.Referrer, team.Name, team.TeamURL, team.AvatarURL, team.Closed, team.CreatedAtEpoch, team.CreatedAt, team.VegaTime) require.NoError(t, err) } @@ -937,8 +936,8 @@ func TestRewardsGameTotals(t *testing.T) { } for _, member := range teamMembers { _, err := connectionSource.Connection.Exec(ctx, - `insert into team_members (team_id, party_id, joined_at_epoch, joined_at, vega_time) - values ($1, $2, $3, $4, $5)`, + `INSERT INTO team_members (team_id, party_id, joined_at_epoch, joined_at, vega_time) + VALUES ($1, $2, $3, $4, $5)`, member.TeamID, member.PartyID, member.JoinedAtEpoch, member.JoinedAt, member.VegaTime) require.NoError(t, err) } @@ -974,8 +973,8 @@ func TestRewardsGameTotals(t *testing.T) { } for _, total := range existingTotals { _, err := connectionSource.Connection.Exec(ctx, - `insert into game_reward_totals (game_id, party_id, asset_id, market_id, epoch_id, team_id, total_rewards) - values ($1, $2, $3, $4, $5, $6, $7)`, + `INSERT INTO game_reward_totals (game_id, party_id, asset_id, market_id, epoch_id, team_id, total_rewards) + VALUES ($1, $2, $3, $4, $5, $6, $7)`, total.GameID, total.PartyID, total.AssetID, total.MarketID, total.EpochID, total.TeamID, total.TotalRewards) require.NoError(t, err) } @@ -1122,7 +1121,7 @@ func TestRewardsGameTotals(t *testing.T) { for _, tc := range testCases { var totals []entities.RewardTotals require.NoError(t, pgxscan.Select(ctx, connectionSource.Connection, &totals, - `select * from game_reward_totals where game_id = $1 and party_id = $2 and epoch_id = $3`, + `SELECT * FROM game_reward_totals WHERE game_id = $1 AND party_id = $2 AND epoch_id = $3`, tc.game_id, tc.party_id, tc.epoch_id)) assert.Equal(t, 1, len(totals)) assert.True(t, tc.want.Equal(totals[0].TotalRewards), "totals don't match, got: %s, want: %s", totals[0].TotalRewards, tc.want) diff --git a/datanode/sqlstore/teams.go b/datanode/sqlstore/teams.go index 6fdb0c7d1c6..5dfc78d10c2 100644 --- a/datanode/sqlstore/teams.go +++ b/datanode/sqlstore/teams.go @@ -18,6 +18,7 @@ package sqlstore import ( "context" "fmt" + "strings" "code.vegaprotocol.io/vega/datanode/entities" "code.vegaprotocol.io/vega/datanode/metrics" @@ -26,16 +27,72 @@ import ( "github.com/georgysavva/scany/pgxscan" ) +const listTeamsStatsQuery = ` +-- This CTE retrieves the teams statistics for the last N epochs. +WITH windowed_teams_stats AS ( + SELECT * + FROM teams_stats + WHERE at_epoch > ( + SELECT max(at_epoch) - $1 + FROM teams_stats + ) %s -- This is where we filter the output either based on team ID or party ID. + ), + -- This CTE filters the team that have exactly N epochs worth of statistics. + -- We are exclusively computing the stats for teams that have at least N epochs worth of data. + -- If we are looking at the stats for the last 30 epochs, a team that has less than 30 epochs + -- worth of data aggregated, then it's ignored. + eligible_teams AS ( + SELECT team_id, + count(*) AS total_of_data_points + FROM windowed_teams_stats + GROUP BY + team_id + HAVING count(*) = $1 + ) +SELECT eligible_teams.team_id AS team_id, + rewards.total_in_quantum AS total_quantum_rewards, + rewards.list AS quantum_rewards, + COALESCE(games_played.count, 0) AS total_games_played, + games_played.list AS games_played +FROM eligible_teams + -- For each team ID in 'eligible_teams', we expand the JSON object keys from column 'games_played' to get a row + -- for each game ID, that we deduplicate and aggregate into an array. + INNER JOIN LATERAL (SELECT ARRAY_LENGTH(ARRAY_AGG(DISTINCT game_played), 1) AS count, + JSONB_AGG(DISTINCT game_played::bytea ORDER BY game_played::bytea) AS list + FROM windowed_teams_stats AS stats + -- That is the tricky part. For each rows matching 'team_id', we generate a row for each object's + -- key from the column 'games_played'. This allows us to flatten the object and effectively + -- deduplicate the game IDs before counting. + INNER JOIN LATERAL JSONB_OBJECT_KEYS(stats.games_played) AS game_played ON TRUE + WHERE eligible_teams.team_id = stats.team_id ) AS games_played ON TRUE + -- For each team ID in 'eligible_teams', we compute the rewards from the statistics retrieved from the table + -- 'windowed_teams_stats'. + INNER JOIN LATERAL ( + SELECT SUM(total_quantum_reward) AS total_in_quantum, + -- For each line before the aggregation, we build an object { epoch: total }, and group + -- all these objects into an array. + JSONB_AGG(JSONB_BUILD_OBJECT('epoch', stats.at_epoch, 'total', stats.total_quantum_reward)) AS list + FROM windowed_teams_stats AS stats + WHERE eligible_teams.team_id = stats.team_id ) AS rewards ON TRUE` + type ( Teams struct { *ConnectionSource } + + ListTeamsStatisticsFilters struct { + TeamID *entities.TeamID + AggregationEpochs uint64 + } ) var ( teamsOrdering = TableOrdering{ ColumnOrdering{Name: "created_at", Sorting: ASC}, } + teamsStatsOrdering = TableOrdering{ + ColumnOrdering{Name: "team_id", Sorting: ASC}, + } refereesOrdering = TableOrdering{ ColumnOrdering{Name: "party_id", Sorting: ASC}, } @@ -54,7 +111,7 @@ func (t *Teams) AddTeam(ctx context.Context, team *entities.Team) error { defer metrics.StartSQLQuery("Teams", "AddTeam")() if _, err := t.Connection.Exec( ctx, - "INSERT INTO teams(id, referrer, name, team_url, avatar_url, closed, created_at, created_at_epoch, vega_time) values ($1, $2, $3, $4, $5, $6, $7, $8, $9)", + "INSERT INTO teams(id, referrer, name, team_url, avatar_url, closed, created_at, created_at_epoch, vega_time) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)", team.ID, team.Referrer, team.Name, @@ -70,7 +127,7 @@ func (t *Teams) AddTeam(ctx context.Context, team *entities.Team) error { if _, err := t.Connection.Exec( ctx, - "INSERT INTO team_members(team_id, party_id, joined_at_epoch, joined_at, vega_time) values ($1, $2, $3, $4, $5)", + "INSERT INTO team_members(team_id, party_id, joined_at_epoch, joined_at, vega_time) VALUES ($1, $2, $3, $4, $5)", team.ID, team.Referrer, team.CreatedAtEpoch, @@ -91,7 +148,7 @@ func (t *Teams) UpdateTeam(ctx context.Context, team *entities.TeamUpdated) erro team_url = $2, avatar_url = $3, closed = $4 - where id = $5`, + WHERE id = $5`, team.Name, team.TeamURL, team.AvatarURL, @@ -108,7 +165,7 @@ func (t *Teams) UpdateTeam(ctx context.Context, team *entities.TeamUpdated) erro func (t *Teams) RefereeJoinedTeam(ctx context.Context, referee *entities.TeamMember) error { defer metrics.StartSQLQuery("Teams", "RefereeJoinedTeam")() _, err := t.Connection.Exec(ctx, - `INSERT INTO team_members(team_id, party_id, joined_at, joined_at_epoch, vega_time) values ($1, $2, $3, $4, $5)`, + `INSERT INTO team_members(team_id, party_id, joined_at, joined_at_epoch, vega_time) VALUES ($1, $2, $3, $4, $5)`, referee.TeamID, referee.PartyID, referee.JoinedAt, @@ -123,7 +180,7 @@ func (t *Teams) RefereeSwitchedTeam(ctx context.Context, referee *entities.Refer defer metrics.StartSQLQuery("Teams", "RefereeJoinedTeam")() _, err := t.Connection.Exec(ctx, - `INSERT INTO team_members(team_id, party_id, joined_at, joined_at_epoch, vega_time) values ($1, $2, $3, $4, $5)`, + `INSERT INTO team_members(team_id, party_id, joined_at, joined_at_epoch, vega_time) VALUES ($1, $2, $3, $4, $5)`, referee.ToTeamID, referee.PartyID, referee.SwitchedAt, @@ -148,9 +205,9 @@ func (t *Teams) GetTeam(ctx context.Context, teamID entities.TeamID, partyID ent var query string if teamID != "" { - query = fmt.Sprintf("select * from teams where id = %s", nextBindVar(&args, teamID)) + query = fmt.Sprintf("SELECT * FROM teams WHERE id = %s", nextBindVar(&args, teamID)) } else if partyID != "" { - query = fmt.Sprintf("select t.* from teams t left join current_team_members ctm on t.id = ctm.team_id where ctm.party_id = %s", nextBindVar(&args, partyID)) + query = fmt.Sprintf("SELECT t.* FROM teams t LEFT JOIN current_team_members ctm ON t.id = ctm.team_id WHERE ctm.party_id = %s", nextBindVar(&args, partyID)) } if err := pgxscan.Get(ctx, t.Connection, &team, query, args...); err != nil { @@ -185,6 +242,47 @@ func (t *Teams) ListTeams(ctx context.Context, pagination entities.CursorPaginat return teams, pageInfo, nil } +func (t *Teams) ListTeamsStatistics(ctx context.Context, pagination entities.CursorPagination, filters ListTeamsStatisticsFilters) ([]entities.TeamsStatistics, entities.PageInfo, error) { + defer metrics.StartSQLQuery("Teams", "ListTeamsStatistics")() + + var ( + teamsStats []entities.TeamsStatistics + pageInfo entities.PageInfo + ) + + args := []any{filters.AggregationEpochs} + + query := listTeamsStatsQuery + if filters.TeamID != nil { + query = fmt.Sprintf(query, fmt.Sprintf(`AND team_id = %s`, nextBindVar(&args, *filters.TeamID))) + } else { + query = fmt.Sprintf(query, "") + } + + query, args, err := PaginateQuery[entities.TeamsStatisticsCursor](query, args, teamsStatsOrdering, pagination) + if err != nil { + return nil, pageInfo, err + } + + if err := pgxscan.Select(ctx, t.Connection, &teamsStats, query, args...); err != nil { + return nil, pageInfo, err + } + + teamsStats, pageInfo = entities.PageEntities[*v2.TeamStatisticsEdge](teamsStats, pagination) + + // Deserializing the GameID array as a PostgreSQL array is not correctly + // interpreted by the scanny library. So, we have to use the JSONB array which + // convert the bytea as strings. This leaves the prefix `\\x` on the game ID. + // As a result, we have to manually clean up of the ID. + for i := range teamsStats { + for j := range teamsStats[i].GamesPlayed { + teamsStats[i].GamesPlayed[j] = entities.GameID(strings.TrimLeft(teamsStats[i].GamesPlayed[j].String(), "\\x")) + } + } + + return teamsStats, pageInfo, nil +} + func (t *Teams) ListReferees(ctx context.Context, teamID entities.TeamID, pagination entities.CursorPagination) ([]entities.TeamMember, entities.PageInfo, error) { defer metrics.StartSQLQuery("Teams", "ListReferees")() var ( @@ -197,10 +295,10 @@ func (t *Teams) ListReferees(ctx context.Context, teamID entities.TeamID, pagina return nil, pageInfo, fmt.Errorf("teamID must be provided") } - query := `select ctm.* - from current_team_members ctm - left join teams t on t.id = ctm.team_id - where ctm.party_id != t.referrer and ctm.team_id = %s` + query := `SELECT ctm.* + FROM current_team_members ctm + LEFT JOIN teams t ON t.id = ctm.team_id + WHERE ctm.party_id != t.referrer AND ctm.team_id = %s` query = fmt.Sprintf(query, nextBindVar(&args, teamID)) diff --git a/datanode/sqlstore/teams_test.go b/datanode/sqlstore/teams_test.go index 2666c895ca7..dc095e6517b 100644 --- a/datanode/sqlstore/teams_test.go +++ b/datanode/sqlstore/teams_test.go @@ -16,15 +16,20 @@ package sqlstore_test import ( + "encoding/json" "math/rand" "sort" "testing" + "time" "code.vegaprotocol.io/vega/datanode/entities" + "code.vegaprotocol.io/vega/datanode/sqlstore" + vgcrypto "code.vegaprotocol.io/vega/libs/crypto" "code.vegaprotocol.io/vega/libs/ptr" eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" "github.com/georgysavva/scany/pgxscan" + "github.com/shopspring/decimal" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/exp/slices" @@ -767,3 +772,202 @@ func testShouldReturnPageOfRefereeHistoryGivenPagination(t *testing.T) { }, pageInfo) }) } + +func TestListTeamStatistics(t *testing.T) { + ctx := tempTransaction(t) + + teamsStore := sqlstore.NewTeams(connectionSource) + blocksStore := sqlstore.NewBlocks(connectionSource) + rewardsStore := sqlstore.NewRewards(ctx, connectionSource) + + member1 := entities.PartyID(GenerateID()) + member2 := entities.PartyID(GenerateID()) + member3 := entities.PartyID(GenerateID()) + member4 := entities.PartyID(GenerateID()) + + team1 := entities.TeamID(GenerateID()) + team2 := entities.TeamID(GenerateID()) + team3 := entities.TeamID(GenerateID()) + team4 := entities.TeamID(GenerateID()) + + teams := map[entities.TeamID][]entities.PartyID{ + team1: {member1}, + team2: {member2}, + team3: {member3}, + team4: {member4}, + } + + teamIDs := []entities.TeamID{team1, team2, team3, team4} + gameIDs := []entities.GameID{ + entities.GameID(GenerateID()), + entities.GameID(GenerateID()), + entities.GameID(GenerateID()), + entities.GameID(GenerateID()), + } + + startTime := time.Now() + + for team, members := range teams { + require.NoError(t, teamsStore.AddTeam(ctx, &entities.Team{ + ID: team, + Referrer: entities.PartyID(GenerateID()), + Name: "Name", + Closed: false, + CreatedAt: startTime, + CreatedAtEpoch: 1, + VegaTime: startTime, + })) + + for _, member := range members { + require.NoError(t, teamsStore.RefereeJoinedTeam(ctx, &entities.TeamMember{ + TeamID: team, + PartyID: member, + JoinedAt: startTime, + JoinedAtEpoch: 1, + VegaTime: startTime, + })) + } + } + + for epoch := int64(1); epoch < 4; epoch++ { + blockTime := startTime.Add(time.Duration(epoch) * time.Minute).Truncate(time.Microsecond) + + require.NoError(t, blocksStore.Add(ctx, entities.Block{ + VegaTime: blockTime, + Height: epoch, + Hash: []byte(vgcrypto.RandomHash()), + })) + + seqNum := uint64(0) + for _, teamID := range teamIDs { + for _, member := range teams[teamID] { + seqNum += 1 + require.NoError(t, rewardsStore.Add(ctx, entities.Reward{ + PartyID: member, + AssetID: entities.AssetID(GenerateID()), + MarketID: entities.MarketID(GenerateID()), + EpochID: epoch, + Amount: decimal.NewFromInt(int64(seqNum)), + QuantumAmount: decimal.NewFromInt(epoch + int64(seqNum)), + PercentOfTotal: 0.1 * float64(epoch), + RewardType: "NICE_BOY", + Timestamp: blockTime, + TxHash: generateTxHash(), + VegaTime: blockTime, + SeqNum: seqNum, + LockedUntilEpochID: epoch, + GameID: ptr.From(gameIDs[(seqNum-1)%4]), + })) + } + } + } + + t.Run("Getting all stats from the last 2 epochs", func(t *testing.T) { + stats, _, err := teamsStore.ListTeamsStatistics(ctx, entities.DefaultCursorPagination(false), sqlstore.ListTeamsStatisticsFilters{ + AggregationEpochs: 2, + }) + + require.NoError(t, err) + expectedStats := []entities.TeamsStatistics{ + { + TeamID: team1, + TotalQuantumRewards: decimal.NewFromInt(7), + QuantumRewards: []entities.QuantumRewardsPerEpoch{ + { + Epoch: 2, + Total: decimal.NewFromInt(3), + }, { + Epoch: 3, + Total: decimal.NewFromInt(4), + }, + }, + TotalGamesPlayed: 1, + GamesPlayed: []entities.GameID{gameIDs[0]}, + }, + { + TeamID: team2, + TotalQuantumRewards: decimal.NewFromInt(9), + QuantumRewards: []entities.QuantumRewardsPerEpoch{ + { + Epoch: 2, + Total: decimal.NewFromInt(4), + }, { + Epoch: 3, + Total: decimal.NewFromInt(5), + }, + }, + TotalGamesPlayed: 1, + GamesPlayed: []entities.GameID{gameIDs[1]}, + }, + { + TeamID: team3, + TotalQuantumRewards: decimal.NewFromInt(11), + QuantumRewards: []entities.QuantumRewardsPerEpoch{ + { + Epoch: 2, + Total: decimal.NewFromInt(5), + }, { + Epoch: 3, + Total: decimal.NewFromInt(6), + }, + }, + TotalGamesPlayed: 1, + GamesPlayed: []entities.GameID{gameIDs[2]}, + }, + { + TeamID: team4, + TotalQuantumRewards: decimal.NewFromInt(13), + QuantumRewards: []entities.QuantumRewardsPerEpoch{ + { + Epoch: 2, + Total: decimal.NewFromInt(6), + }, { + Epoch: 3, + Total: decimal.NewFromInt(7), + }, + }, + TotalGamesPlayed: 1, + GamesPlayed: []entities.GameID{gameIDs[3]}, + }, + } + slices.SortStableFunc(expectedStats, func(a, b entities.TeamsStatistics) bool { + return a.TeamID < b.TeamID + }) + + // Ugly hack to bypass deep-equal limitation with assert.Equal(). + expectedStatsJson, _ := json.Marshal(expectedStats) + statsJson, _ := json.Marshal(stats) + assert.JSONEq(t, string(expectedStatsJson), string(statsJson)) + }) + + t.Run("Getting stats from a given team from the last 2 epochs ", func(t *testing.T) { + stats, _, err := teamsStore.ListTeamsStatistics(ctx, entities.DefaultCursorPagination(false), sqlstore.ListTeamsStatisticsFilters{ + TeamID: ptr.From(entities.TeamID(team1.String())), + AggregationEpochs: 2, + }) + + require.NoError(t, err) + expectedStats := []entities.TeamsStatistics{ + { + TeamID: team1, + TotalQuantumRewards: decimal.NewFromInt(7), + QuantumRewards: []entities.QuantumRewardsPerEpoch{ + { + Epoch: 2, + Total: decimal.NewFromInt(3), + }, { + Epoch: 3, + Total: decimal.NewFromInt(4), + }, + }, + TotalGamesPlayed: 1, + GamesPlayed: []entities.GameID{gameIDs[0]}, + }, + } + + // Ugly hack to bypass deep-equal limitation with assert.Equal(). + expectedStatsJson, _ := json.Marshal(expectedStats) + statsJson, _ := json.Marshal(stats) + assert.JSONEq(t, string(expectedStatsJson), string(statsJson)) + }) +} diff --git a/protos/data-node/api/v2/trading_data.pb.go b/protos/data-node/api/v2/trading_data.pb.go index 0e1e509d733..fc960c891b5 100644 --- a/protos/data-node/api/v2/trading_data.pb.go +++ b/protos/data-node/api/v2/trading_data.pb.go @@ -21432,6 +21432,393 @@ func (x *ListTeamsResponse) GetTeams() *TeamConnection { return nil } +// Request to list all teams' statistics. +type ListTeamsStatisticsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Restrict team statistics to those with the given team ID. + TeamId *string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3,oneof" json:"team_id,omitempty"` + // Defines the number of past epochs to aggregate data from. By default, it takes + // the last 10 epochs. + AggregationEpochs *uint64 `protobuf:"varint,2,opt,name=aggregation_epochs,json=aggregationEpochs,proto3,oneof" json:"aggregation_epochs,omitempty"` + // Pagination controls. + Pagination *Pagination `protobuf:"bytes,3,opt,name=pagination,proto3,oneof" json:"pagination,omitempty"` +} + +func (x *ListTeamsStatisticsRequest) Reset() { + *x = ListTeamsStatisticsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[349] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListTeamsStatisticsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListTeamsStatisticsRequest) ProtoMessage() {} + +func (x *ListTeamsStatisticsRequest) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[349] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListTeamsStatisticsRequest.ProtoReflect.Descriptor instead. +func (*ListTeamsStatisticsRequest) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{349} +} + +func (x *ListTeamsStatisticsRequest) GetTeamId() string { + if x != nil && x.TeamId != nil { + return *x.TeamId + } + return "" +} + +func (x *ListTeamsStatisticsRequest) GetAggregationEpochs() uint64 { + if x != nil && x.AggregationEpochs != nil { + return *x.AggregationEpochs + } + return 0 +} + +func (x *ListTeamsStatisticsRequest) GetPagination() *Pagination { + if x != nil { + return x.Pagination + } + return nil +} + +// Response for the list teams' statistics request containing the statistics. +type ListTeamsStatisticsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Page of teams' statistics data and corresponding page information. + Statistics *TeamsStatisticsConnection `protobuf:"bytes,1,opt,name=statistics,proto3" json:"statistics,omitempty"` +} + +func (x *ListTeamsStatisticsResponse) Reset() { + *x = ListTeamsStatisticsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[350] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListTeamsStatisticsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListTeamsStatisticsResponse) ProtoMessage() {} + +func (x *ListTeamsStatisticsResponse) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[350] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListTeamsStatisticsResponse.ProtoReflect.Descriptor instead. +func (*ListTeamsStatisticsResponse) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{350} +} + +func (x *ListTeamsStatisticsResponse) GetStatistics() *TeamsStatisticsConnection { + if x != nil { + return x.Statistics + } + return nil +} + +// Page of teams' statistics and corresponding page information. +type TeamsStatisticsConnection struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Page of team data and their corresponding cursors. + Edges []*TeamStatisticsEdge `protobuf:"bytes,1,rep,name=edges,proto3" json:"edges,omitempty"` + // Page information that is used for fetching further pages. + PageInfo *PageInfo `protobuf:"bytes,2,opt,name=page_info,json=pageInfo,proto3" json:"page_info,omitempty"` +} + +func (x *TeamsStatisticsConnection) Reset() { + *x = TeamsStatisticsConnection{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[351] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TeamsStatisticsConnection) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TeamsStatisticsConnection) ProtoMessage() {} + +func (x *TeamsStatisticsConnection) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[351] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TeamsStatisticsConnection.ProtoReflect.Descriptor instead. +func (*TeamsStatisticsConnection) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{351} +} + +func (x *TeamsStatisticsConnection) GetEdges() []*TeamStatisticsEdge { + if x != nil { + return x.Edges + } + return nil +} + +func (x *TeamsStatisticsConnection) GetPageInfo() *PageInfo { + if x != nil { + return x.PageInfo + } + return nil +} + +// Team data item with the corresponding cursor. +type TeamStatisticsEdge struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Team's statistics data. + Node *TeamStatistics `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` + // Cursor that can be used to fetch further pages. + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` +} + +func (x *TeamStatisticsEdge) Reset() { + *x = TeamStatisticsEdge{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[352] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TeamStatisticsEdge) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TeamStatisticsEdge) ProtoMessage() {} + +func (x *TeamStatisticsEdge) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[352] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TeamStatisticsEdge.ProtoReflect.Descriptor instead. +func (*TeamStatisticsEdge) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{352} +} + +func (x *TeamStatisticsEdge) GetNode() *TeamStatistics { + if x != nil { + return x.Node + } + return nil +} + +func (x *TeamStatisticsEdge) GetCursor() string { + if x != nil { + return x.Cursor + } + return "" +} + +// Team's statistics record containing the team information. +type TeamStatistics struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Team ID the statistics are related to. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + // Total of volume accumulated over the requested epoch period, expressed in + // quantum value. + TotalQuantumVolume string `protobuf:"bytes,2,opt,name=total_quantum_volume,json=totalQuantumVolume,proto3" json:"total_quantum_volume,omitempty"` + // Total of rewards accumulated over the requested epoch period, expressed in + // quantum value. + TotalQuantumRewards string `protobuf:"bytes,3,opt,name=total_quantum_rewards,json=totalQuantumRewards,proto3" json:"total_quantum_rewards,omitempty"` + // List of rewards over the requested epoch period, expressed in quantum + // value for each epoch. + QuantumRewards []*QuantumRewardsPerEpoch `protobuf:"bytes,4,rep,name=quantum_rewards,json=quantumRewards,proto3" json:"quantum_rewards,omitempty"` + // Total of games played. + TotalGamePlayed uint64 `protobuf:"varint,5,opt,name=total_game_played,json=totalGamePlayed,proto3" json:"total_game_played,omitempty"` + // List of games played over the requested epoch period. + GamesPlayed []string `protobuf:"bytes,6,rep,name=games_played,json=gamesPlayed,proto3" json:"games_played,omitempty"` +} + +func (x *TeamStatistics) Reset() { + *x = TeamStatistics{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[353] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TeamStatistics) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TeamStatistics) ProtoMessage() {} + +func (x *TeamStatistics) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[353] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TeamStatistics.ProtoReflect.Descriptor instead. +func (*TeamStatistics) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{353} +} + +func (x *TeamStatistics) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *TeamStatistics) GetTotalQuantumVolume() string { + if x != nil { + return x.TotalQuantumVolume + } + return "" +} + +func (x *TeamStatistics) GetTotalQuantumRewards() string { + if x != nil { + return x.TotalQuantumRewards + } + return "" +} + +func (x *TeamStatistics) GetQuantumRewards() []*QuantumRewardsPerEpoch { + if x != nil { + return x.QuantumRewards + } + return nil +} + +func (x *TeamStatistics) GetTotalGamePlayed() uint64 { + if x != nil { + return x.TotalGamePlayed + } + return 0 +} + +func (x *TeamStatistics) GetGamesPlayed() []string { + if x != nil { + return x.GamesPlayed + } + return nil +} + +type QuantumRewardsPerEpoch struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Epoch for which this information is valid. + Epoch uint64 `protobuf:"varint,1,opt,name=epoch,proto3" json:"epoch,omitempty"` + // Total rewards accumulated over the epoch period, expressed in quantum value. + TotalQuantumRewards string `protobuf:"bytes,2,opt,name=total_quantum_rewards,json=totalQuantumRewards,proto3" json:"total_quantum_rewards,omitempty"` +} + +func (x *QuantumRewardsPerEpoch) Reset() { + *x = QuantumRewardsPerEpoch{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[354] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QuantumRewardsPerEpoch) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QuantumRewardsPerEpoch) ProtoMessage() {} + +func (x *QuantumRewardsPerEpoch) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[354] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use QuantumRewardsPerEpoch.ProtoReflect.Descriptor instead. +func (*QuantumRewardsPerEpoch) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{354} +} + +func (x *QuantumRewardsPerEpoch) GetEpoch() uint64 { + if x != nil { + return x.Epoch + } + return 0 +} + +func (x *QuantumRewardsPerEpoch) GetTotalQuantumRewards() string { + if x != nil { + return x.TotalQuantumRewards + } + return "" +} + // Request that is sent when listing the referees for a given team. type ListTeamRefereesRequest struct { state protoimpl.MessageState @@ -21447,7 +21834,7 @@ type ListTeamRefereesRequest struct { func (x *ListTeamRefereesRequest) Reset() { *x = ListTeamRefereesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[349] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[355] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21460,7 +21847,7 @@ func (x *ListTeamRefereesRequest) String() string { func (*ListTeamRefereesRequest) ProtoMessage() {} func (x *ListTeamRefereesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[349] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[355] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21473,7 +21860,7 @@ func (x *ListTeamRefereesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTeamRefereesRequest.ProtoReflect.Descriptor instead. func (*ListTeamRefereesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{349} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{355} } func (x *ListTeamRefereesRequest) GetTeamId() string { @@ -21509,7 +21896,7 @@ type TeamReferee struct { func (x *TeamReferee) Reset() { *x = TeamReferee{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[350] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[356] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21522,7 +21909,7 @@ func (x *TeamReferee) String() string { func (*TeamReferee) ProtoMessage() {} func (x *TeamReferee) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[350] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[356] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21535,7 +21922,7 @@ func (x *TeamReferee) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamReferee.ProtoReflect.Descriptor instead. func (*TeamReferee) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{350} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{356} } func (x *TeamReferee) GetTeamId() string { @@ -21581,7 +21968,7 @@ type TeamRefereeEdge struct { func (x *TeamRefereeEdge) Reset() { *x = TeamRefereeEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[351] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[357] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21594,7 +21981,7 @@ func (x *TeamRefereeEdge) String() string { func (*TeamRefereeEdge) ProtoMessage() {} func (x *TeamRefereeEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[351] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[357] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21607,7 +21994,7 @@ func (x *TeamRefereeEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamRefereeEdge.ProtoReflect.Descriptor instead. func (*TeamRefereeEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{351} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{357} } func (x *TeamRefereeEdge) GetNode() *TeamReferee { @@ -21639,7 +22026,7 @@ type TeamRefereeConnection struct { func (x *TeamRefereeConnection) Reset() { *x = TeamRefereeConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[352] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[358] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21652,7 +22039,7 @@ func (x *TeamRefereeConnection) String() string { func (*TeamRefereeConnection) ProtoMessage() {} func (x *TeamRefereeConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[352] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[358] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21665,7 +22052,7 @@ func (x *TeamRefereeConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamRefereeConnection.ProtoReflect.Descriptor instead. func (*TeamRefereeConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{352} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{358} } func (x *TeamRefereeConnection) GetEdges() []*TeamRefereeEdge { @@ -21695,7 +22082,7 @@ type ListTeamRefereesResponse struct { func (x *ListTeamRefereesResponse) Reset() { *x = ListTeamRefereesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[353] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[359] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21708,7 +22095,7 @@ func (x *ListTeamRefereesResponse) String() string { func (*ListTeamRefereesResponse) ProtoMessage() {} func (x *ListTeamRefereesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[353] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[359] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21721,7 +22108,7 @@ func (x *ListTeamRefereesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTeamRefereesResponse.ProtoReflect.Descriptor instead. func (*ListTeamRefereesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{353} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{359} } func (x *ListTeamRefereesResponse) GetTeamReferees() *TeamRefereeConnection { @@ -21748,7 +22135,7 @@ type TeamRefereeHistory struct { func (x *TeamRefereeHistory) Reset() { *x = TeamRefereeHistory{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[354] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[360] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21761,7 +22148,7 @@ func (x *TeamRefereeHistory) String() string { func (*TeamRefereeHistory) ProtoMessage() {} func (x *TeamRefereeHistory) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[354] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[360] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21774,7 +22161,7 @@ func (x *TeamRefereeHistory) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamRefereeHistory.ProtoReflect.Descriptor instead. func (*TeamRefereeHistory) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{354} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{360} } func (x *TeamRefereeHistory) GetTeamId() string { @@ -21813,7 +22200,7 @@ type TeamRefereeHistoryEdge struct { func (x *TeamRefereeHistoryEdge) Reset() { *x = TeamRefereeHistoryEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[355] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[361] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21826,7 +22213,7 @@ func (x *TeamRefereeHistoryEdge) String() string { func (*TeamRefereeHistoryEdge) ProtoMessage() {} func (x *TeamRefereeHistoryEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[355] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[361] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21839,7 +22226,7 @@ func (x *TeamRefereeHistoryEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamRefereeHistoryEdge.ProtoReflect.Descriptor instead. func (*TeamRefereeHistoryEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{355} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{361} } func (x *TeamRefereeHistoryEdge) GetNode() *TeamRefereeHistory { @@ -21871,7 +22258,7 @@ type TeamRefereeHistoryConnection struct { func (x *TeamRefereeHistoryConnection) Reset() { *x = TeamRefereeHistoryConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[356] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[362] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21884,7 +22271,7 @@ func (x *TeamRefereeHistoryConnection) String() string { func (*TeamRefereeHistoryConnection) ProtoMessage() {} func (x *TeamRefereeHistoryConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[356] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[362] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21897,7 +22284,7 @@ func (x *TeamRefereeHistoryConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamRefereeHistoryConnection.ProtoReflect.Descriptor instead. func (*TeamRefereeHistoryConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{356} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{362} } func (x *TeamRefereeHistoryConnection) GetEdges() []*TeamRefereeHistoryEdge { @@ -21929,7 +22316,7 @@ type ListTeamRefereeHistoryRequest struct { func (x *ListTeamRefereeHistoryRequest) Reset() { *x = ListTeamRefereeHistoryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[357] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[363] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21942,7 +22329,7 @@ func (x *ListTeamRefereeHistoryRequest) String() string { func (*ListTeamRefereeHistoryRequest) ProtoMessage() {} func (x *ListTeamRefereeHistoryRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[357] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[363] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21955,7 +22342,7 @@ func (x *ListTeamRefereeHistoryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTeamRefereeHistoryRequest.ProtoReflect.Descriptor instead. func (*ListTeamRefereeHistoryRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{357} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{363} } func (x *ListTeamRefereeHistoryRequest) GetReferee() string { @@ -21985,7 +22372,7 @@ type ListTeamRefereeHistoryResponse struct { func (x *ListTeamRefereeHistoryResponse) Reset() { *x = ListTeamRefereeHistoryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[358] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[364] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21998,7 +22385,7 @@ func (x *ListTeamRefereeHistoryResponse) String() string { func (*ListTeamRefereeHistoryResponse) ProtoMessage() {} func (x *ListTeamRefereeHistoryResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[358] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[364] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22011,7 +22398,7 @@ func (x *ListTeamRefereeHistoryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTeamRefereeHistoryResponse.ProtoReflect.Descriptor instead. func (*ListTeamRefereeHistoryResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{358} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{364} } func (x *ListTeamRefereeHistoryResponse) GetTeamRefereeHistory() *TeamRefereeHistoryConnection { @@ -22040,7 +22427,7 @@ type GetFeesStatsRequest struct { func (x *GetFeesStatsRequest) Reset() { *x = GetFeesStatsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[359] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[365] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22053,7 +22440,7 @@ func (x *GetFeesStatsRequest) String() string { func (*GetFeesStatsRequest) ProtoMessage() {} func (x *GetFeesStatsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[359] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[365] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22066,7 +22453,7 @@ func (x *GetFeesStatsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFeesStatsRequest.ProtoReflect.Descriptor instead. func (*GetFeesStatsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{359} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{365} } func (x *GetFeesStatsRequest) GetMarketId() string { @@ -22110,7 +22497,7 @@ type GetFeesStatsResponse struct { func (x *GetFeesStatsResponse) Reset() { *x = GetFeesStatsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[360] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[366] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22123,7 +22510,7 @@ func (x *GetFeesStatsResponse) String() string { func (*GetFeesStatsResponse) ProtoMessage() {} func (x *GetFeesStatsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[360] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[366] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22136,7 +22523,7 @@ func (x *GetFeesStatsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFeesStatsResponse.ProtoReflect.Descriptor instead. func (*GetFeesStatsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{360} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{366} } func (x *GetFeesStatsResponse) GetFeesStats() *v1.FeesStats { @@ -22165,7 +22552,7 @@ type GetFeesStatsForPartyRequest struct { func (x *GetFeesStatsForPartyRequest) Reset() { *x = GetFeesStatsForPartyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[361] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[367] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22178,7 +22565,7 @@ func (x *GetFeesStatsForPartyRequest) String() string { func (*GetFeesStatsForPartyRequest) ProtoMessage() {} func (x *GetFeesStatsForPartyRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[361] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[367] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22191,7 +22578,7 @@ func (x *GetFeesStatsForPartyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFeesStatsForPartyRequest.ProtoReflect.Descriptor instead. func (*GetFeesStatsForPartyRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{361} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{367} } func (x *GetFeesStatsForPartyRequest) GetPartyId() string { @@ -22235,7 +22622,7 @@ type GetFeesStatsForPartyResponse struct { func (x *GetFeesStatsForPartyResponse) Reset() { *x = GetFeesStatsForPartyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[362] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[368] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22248,7 +22635,7 @@ func (x *GetFeesStatsForPartyResponse) String() string { func (*GetFeesStatsForPartyResponse) ProtoMessage() {} func (x *GetFeesStatsForPartyResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[362] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[368] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22261,7 +22648,7 @@ func (x *GetFeesStatsForPartyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFeesStatsForPartyResponse.ProtoReflect.Descriptor instead. func (*GetFeesStatsForPartyResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{362} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{368} } func (x *GetFeesStatsForPartyResponse) GetFeesStatsForParty() []*FeesStatsForParty { @@ -22281,7 +22668,7 @@ type GetCurrentVolumeDiscountProgramRequest struct { func (x *GetCurrentVolumeDiscountProgramRequest) Reset() { *x = GetCurrentVolumeDiscountProgramRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[363] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[369] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22294,7 +22681,7 @@ func (x *GetCurrentVolumeDiscountProgramRequest) String() string { func (*GetCurrentVolumeDiscountProgramRequest) ProtoMessage() {} func (x *GetCurrentVolumeDiscountProgramRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[363] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[369] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22307,7 +22694,7 @@ func (x *GetCurrentVolumeDiscountProgramRequest) ProtoReflect() protoreflect.Mes // Deprecated: Use GetCurrentVolumeDiscountProgramRequest.ProtoReflect.Descriptor instead. func (*GetCurrentVolumeDiscountProgramRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{363} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{369} } // Response containing the current referral program @@ -22323,7 +22710,7 @@ type GetCurrentVolumeDiscountProgramResponse struct { func (x *GetCurrentVolumeDiscountProgramResponse) Reset() { *x = GetCurrentVolumeDiscountProgramResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[364] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[370] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22336,7 +22723,7 @@ func (x *GetCurrentVolumeDiscountProgramResponse) String() string { func (*GetCurrentVolumeDiscountProgramResponse) ProtoMessage() {} func (x *GetCurrentVolumeDiscountProgramResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[364] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[370] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22349,7 +22736,7 @@ func (x *GetCurrentVolumeDiscountProgramResponse) ProtoReflect() protoreflect.Me // Deprecated: Use GetCurrentVolumeDiscountProgramResponse.ProtoReflect.Descriptor instead. func (*GetCurrentVolumeDiscountProgramResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{364} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{370} } func (x *GetCurrentVolumeDiscountProgramResponse) GetCurrentVolumeDiscountProgram() *VolumeDiscountProgram { @@ -22376,7 +22763,7 @@ type GetVolumeDiscountStatsRequest struct { func (x *GetVolumeDiscountStatsRequest) Reset() { *x = GetVolumeDiscountStatsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[365] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[371] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22389,7 +22776,7 @@ func (x *GetVolumeDiscountStatsRequest) String() string { func (*GetVolumeDiscountStatsRequest) ProtoMessage() {} func (x *GetVolumeDiscountStatsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[365] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[371] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22402,7 +22789,7 @@ func (x *GetVolumeDiscountStatsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVolumeDiscountStatsRequest.ProtoReflect.Descriptor instead. func (*GetVolumeDiscountStatsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{365} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{371} } func (x *GetVolumeDiscountStatsRequest) GetAtEpoch() uint64 { @@ -22439,7 +22826,7 @@ type GetVolumeDiscountStatsResponse struct { func (x *GetVolumeDiscountStatsResponse) Reset() { *x = GetVolumeDiscountStatsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[366] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[372] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22452,7 +22839,7 @@ func (x *GetVolumeDiscountStatsResponse) String() string { func (*GetVolumeDiscountStatsResponse) ProtoMessage() {} func (x *GetVolumeDiscountStatsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[366] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[372] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22465,7 +22852,7 @@ func (x *GetVolumeDiscountStatsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVolumeDiscountStatsResponse.ProtoReflect.Descriptor instead. func (*GetVolumeDiscountStatsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{366} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{372} } func (x *GetVolumeDiscountStatsResponse) GetStats() *VolumeDiscountStatsConnection { @@ -22490,7 +22877,7 @@ type VolumeDiscountStatsConnection struct { func (x *VolumeDiscountStatsConnection) Reset() { *x = VolumeDiscountStatsConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[367] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[373] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22503,7 +22890,7 @@ func (x *VolumeDiscountStatsConnection) String() string { func (*VolumeDiscountStatsConnection) ProtoMessage() {} func (x *VolumeDiscountStatsConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[367] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[373] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22516,7 +22903,7 @@ func (x *VolumeDiscountStatsConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeDiscountStatsConnection.ProtoReflect.Descriptor instead. func (*VolumeDiscountStatsConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{367} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{373} } func (x *VolumeDiscountStatsConnection) GetEdges() []*VolumeDiscountStatsEdge { @@ -22548,7 +22935,7 @@ type VolumeDiscountStatsEdge struct { func (x *VolumeDiscountStatsEdge) Reset() { *x = VolumeDiscountStatsEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[368] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[374] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22561,7 +22948,7 @@ func (x *VolumeDiscountStatsEdge) String() string { func (*VolumeDiscountStatsEdge) ProtoMessage() {} func (x *VolumeDiscountStatsEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[368] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[374] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22574,7 +22961,7 @@ func (x *VolumeDiscountStatsEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeDiscountStatsEdge.ProtoReflect.Descriptor instead. func (*VolumeDiscountStatsEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{368} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{374} } func (x *VolumeDiscountStatsEdge) GetNode() *VolumeDiscountStats { @@ -22610,7 +22997,7 @@ type VolumeDiscountStats struct { func (x *VolumeDiscountStats) Reset() { *x = VolumeDiscountStats{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[369] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[375] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22623,7 +23010,7 @@ func (x *VolumeDiscountStats) String() string { func (*VolumeDiscountStats) ProtoMessage() {} func (x *VolumeDiscountStats) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[369] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[375] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22636,7 +23023,7 @@ func (x *VolumeDiscountStats) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeDiscountStats.ProtoReflect.Descriptor instead. func (*VolumeDiscountStats) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{369} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{375} } func (x *VolumeDiscountStats) GetAtEpoch() uint64 { @@ -22693,7 +23080,7 @@ type VolumeDiscountProgram struct { func (x *VolumeDiscountProgram) Reset() { *x = VolumeDiscountProgram{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[370] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[376] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22706,7 +23093,7 @@ func (x *VolumeDiscountProgram) String() string { func (*VolumeDiscountProgram) ProtoMessage() {} func (x *VolumeDiscountProgram) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[370] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[376] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22719,7 +23106,7 @@ func (x *VolumeDiscountProgram) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeDiscountProgram.ProtoReflect.Descriptor instead. func (*VolumeDiscountProgram) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{370} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{376} } func (x *VolumeDiscountProgram) GetVersion() uint64 { @@ -22784,7 +23171,7 @@ type FeesStatsForParty struct { func (x *FeesStatsForParty) Reset() { *x = FeesStatsForParty{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[371] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[377] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22797,7 +23184,7 @@ func (x *FeesStatsForParty) String() string { func (*FeesStatsForParty) ProtoMessage() {} func (x *FeesStatsForParty) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[371] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[377] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22810,7 +23197,7 @@ func (x *FeesStatsForParty) ProtoReflect() protoreflect.Message { // Deprecated: Use FeesStatsForParty.ProtoReflect.Descriptor instead. func (*FeesStatsForParty) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{371} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{377} } func (x *FeesStatsForParty) GetAssetId() string { @@ -22865,7 +23252,7 @@ type ObserveTransactionResultsRequest struct { func (x *ObserveTransactionResultsRequest) Reset() { *x = ObserveTransactionResultsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[372] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[378] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22878,7 +23265,7 @@ func (x *ObserveTransactionResultsRequest) String() string { func (*ObserveTransactionResultsRequest) ProtoMessage() {} func (x *ObserveTransactionResultsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[372] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[378] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22891,7 +23278,7 @@ func (x *ObserveTransactionResultsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveTransactionResultsRequest.ProtoReflect.Descriptor instead. func (*ObserveTransactionResultsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{372} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{378} } func (x *ObserveTransactionResultsRequest) GetPartyIds() []string { @@ -22928,7 +23315,7 @@ type ObserveTransactionResultsResponse struct { func (x *ObserveTransactionResultsResponse) Reset() { *x = ObserveTransactionResultsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[373] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[379] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22941,7 +23328,7 @@ func (x *ObserveTransactionResultsResponse) String() string { func (*ObserveTransactionResultsResponse) ProtoMessage() {} func (x *ObserveTransactionResultsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[373] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[379] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22954,7 +23341,7 @@ func (x *ObserveTransactionResultsResponse) ProtoReflect() protoreflect.Message // Deprecated: Use ObserveTransactionResultsResponse.ProtoReflect.Descriptor instead. func (*ObserveTransactionResultsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{373} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{379} } func (x *ObserveTransactionResultsResponse) GetTransactionResults() []*v1.TransactionResult { @@ -22985,7 +23372,7 @@ type EstimateTransferFeeRequest struct { func (x *EstimateTransferFeeRequest) Reset() { *x = EstimateTransferFeeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[374] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[380] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22998,7 +23385,7 @@ func (x *EstimateTransferFeeRequest) String() string { func (*EstimateTransferFeeRequest) ProtoMessage() {} func (x *EstimateTransferFeeRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[374] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[380] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23011,7 +23398,7 @@ func (x *EstimateTransferFeeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EstimateTransferFeeRequest.ProtoReflect.Descriptor instead. func (*EstimateTransferFeeRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{374} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{380} } func (x *EstimateTransferFeeRequest) GetFromAccount() string { @@ -23064,7 +23451,7 @@ type EstimateTransferFeeResponse struct { func (x *EstimateTransferFeeResponse) Reset() { *x = EstimateTransferFeeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[375] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[381] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23077,7 +23464,7 @@ func (x *EstimateTransferFeeResponse) String() string { func (*EstimateTransferFeeResponse) ProtoMessage() {} func (x *EstimateTransferFeeResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[375] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[381] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23090,7 +23477,7 @@ func (x *EstimateTransferFeeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EstimateTransferFeeResponse.ProtoReflect.Descriptor instead. func (*EstimateTransferFeeResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{375} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{381} } func (x *EstimateTransferFeeResponse) GetFee() string { @@ -23122,7 +23509,7 @@ type GetTotalTransferFeeDiscountRequest struct { func (x *GetTotalTransferFeeDiscountRequest) Reset() { *x = GetTotalTransferFeeDiscountRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[376] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[382] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23135,7 +23522,7 @@ func (x *GetTotalTransferFeeDiscountRequest) String() string { func (*GetTotalTransferFeeDiscountRequest) ProtoMessage() {} func (x *GetTotalTransferFeeDiscountRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[376] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[382] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23148,7 +23535,7 @@ func (x *GetTotalTransferFeeDiscountRequest) ProtoReflect() protoreflect.Message // Deprecated: Use GetTotalTransferFeeDiscountRequest.ProtoReflect.Descriptor instead. func (*GetTotalTransferFeeDiscountRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{376} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{382} } func (x *GetTotalTransferFeeDiscountRequest) GetPartyId() string { @@ -23178,7 +23565,7 @@ type GetTotalTransferFeeDiscountResponse struct { func (x *GetTotalTransferFeeDiscountResponse) Reset() { *x = GetTotalTransferFeeDiscountResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[377] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[383] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23191,7 +23578,7 @@ func (x *GetTotalTransferFeeDiscountResponse) String() string { func (*GetTotalTransferFeeDiscountResponse) ProtoMessage() {} func (x *GetTotalTransferFeeDiscountResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[377] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[383] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23204,7 +23591,7 @@ func (x *GetTotalTransferFeeDiscountResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use GetTotalTransferFeeDiscountResponse.ProtoReflect.Descriptor instead. func (*GetTotalTransferFeeDiscountResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{377} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{383} } func (x *GetTotalTransferFeeDiscountResponse) GetTotalDiscount() string { @@ -23236,7 +23623,7 @@ type ListGamesRequest struct { func (x *ListGamesRequest) Reset() { *x = ListGamesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[378] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[384] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23249,7 +23636,7 @@ func (x *ListGamesRequest) String() string { func (*ListGamesRequest) ProtoMessage() {} func (x *ListGamesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[378] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[384] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23262,7 +23649,7 @@ func (x *ListGamesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListGamesRequest.ProtoReflect.Descriptor instead. func (*ListGamesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{378} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{384} } func (x *ListGamesRequest) GetGameId() string { @@ -23313,7 +23700,7 @@ type ListGamesResponse struct { func (x *ListGamesResponse) Reset() { *x = ListGamesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[379] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[385] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23326,7 +23713,7 @@ func (x *ListGamesResponse) String() string { func (*ListGamesResponse) ProtoMessage() {} func (x *ListGamesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[379] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[385] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23339,7 +23726,7 @@ func (x *ListGamesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListGamesResponse.ProtoReflect.Descriptor instead. func (*ListGamesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{379} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{385} } func (x *ListGamesResponse) GetGames() *GamesConnection { @@ -23364,7 +23751,7 @@ type GamesConnection struct { func (x *GamesConnection) Reset() { *x = GamesConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[380] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[386] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23377,7 +23764,7 @@ func (x *GamesConnection) String() string { func (*GamesConnection) ProtoMessage() {} func (x *GamesConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[380] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[386] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23390,7 +23777,7 @@ func (x *GamesConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use GamesConnection.ProtoReflect.Descriptor instead. func (*GamesConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{380} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{386} } func (x *GamesConnection) GetEdges() []*GameEdge { @@ -23422,7 +23809,7 @@ type GameEdge struct { func (x *GameEdge) Reset() { *x = GameEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[381] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[387] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23435,7 +23822,7 @@ func (x *GameEdge) String() string { func (*GameEdge) ProtoMessage() {} func (x *GameEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[381] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[387] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23448,7 +23835,7 @@ func (x *GameEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use GameEdge.ProtoReflect.Descriptor instead. func (*GameEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{381} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{387} } func (x *GameEdge) GetNode() *Game { @@ -23489,7 +23876,7 @@ type Game struct { func (x *Game) Reset() { *x = Game{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[382] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[388] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23502,7 +23889,7 @@ func (x *Game) String() string { func (*Game) ProtoMessage() {} func (x *Game) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[382] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[388] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23515,7 +23902,7 @@ func (x *Game) ProtoReflect() protoreflect.Message { // Deprecated: Use Game.ProtoReflect.Descriptor instead. func (*Game) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{382} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{388} } func (x *Game) GetId() string { @@ -23591,7 +23978,7 @@ type TeamGameEntities struct { func (x *TeamGameEntities) Reset() { *x = TeamGameEntities{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[383] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[389] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23604,7 +23991,7 @@ func (x *TeamGameEntities) String() string { func (*TeamGameEntities) ProtoMessage() {} func (x *TeamGameEntities) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[383] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[389] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23617,7 +24004,7 @@ func (x *TeamGameEntities) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamGameEntities.ProtoReflect.Descriptor instead. func (*TeamGameEntities) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{383} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{389} } func (x *TeamGameEntities) GetTeam() []*TeamGameEntity { @@ -23640,7 +24027,7 @@ type IndividualGameEntities struct { func (x *IndividualGameEntities) Reset() { *x = IndividualGameEntities{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[384] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[390] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23653,7 +24040,7 @@ func (x *IndividualGameEntities) String() string { func (*IndividualGameEntities) ProtoMessage() {} func (x *IndividualGameEntities) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[384] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[390] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23666,7 +24053,7 @@ func (x *IndividualGameEntities) ProtoReflect() protoreflect.Message { // Deprecated: Use IndividualGameEntities.ProtoReflect.Descriptor instead. func (*IndividualGameEntities) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{384} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{390} } func (x *IndividualGameEntities) GetIndividual() []*IndividualGameEntity { @@ -23699,7 +24086,7 @@ type TeamGameEntity struct { func (x *TeamGameEntity) Reset() { *x = TeamGameEntity{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[385] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[391] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23712,7 +24099,7 @@ func (x *TeamGameEntity) String() string { func (*TeamGameEntity) ProtoMessage() {} func (x *TeamGameEntity) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[385] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[391] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23725,7 +24112,7 @@ func (x *TeamGameEntity) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamGameEntity.ProtoReflect.Descriptor instead. func (*TeamGameEntity) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{385} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{391} } func (x *TeamGameEntity) GetTeam() *TeamGameParticipation { @@ -23785,7 +24172,7 @@ type TeamGameParticipation struct { func (x *TeamGameParticipation) Reset() { *x = TeamGameParticipation{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[386] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[392] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23798,7 +24185,7 @@ func (x *TeamGameParticipation) String() string { func (*TeamGameParticipation) ProtoMessage() {} func (x *TeamGameParticipation) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[386] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[392] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23811,7 +24198,7 @@ func (x *TeamGameParticipation) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamGameParticipation.ProtoReflect.Descriptor instead. func (*TeamGameParticipation) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{386} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{392} } func (x *TeamGameParticipation) GetTeamId() string { @@ -23853,7 +24240,7 @@ type IndividualGameEntity struct { func (x *IndividualGameEntity) Reset() { *x = IndividualGameEntity{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[387] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[393] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23866,7 +24253,7 @@ func (x *IndividualGameEntity) String() string { func (*IndividualGameEntity) ProtoMessage() {} func (x *IndividualGameEntity) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[387] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[393] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23879,7 +24266,7 @@ func (x *IndividualGameEntity) ProtoReflect() protoreflect.Message { // Deprecated: Use IndividualGameEntity.ProtoReflect.Descriptor instead. func (*IndividualGameEntity) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{387} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{393} } func (x *IndividualGameEntity) GetIndividual() string { @@ -26923,1343 +27310,1413 @@ var file_data_node_api_v2_trading_data_proto_rawDesc = []byte{ 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x74, 0x65, 0x61, 0x6d, 0x73, - 0x22, 0x89, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x07, - 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, - 0x41, 0x01, 0x02, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x0a, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x85, 0x01, 0x0a, - 0x0b, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x12, 0x17, 0x0a, 0x07, - 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x74, 0x12, 0x26, 0x0a, 0x0f, - 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x74, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x22, 0x5b, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x22, 0xe2, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, + 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1c, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, + 0x12, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x11, 0x61, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x88, 0x01, + 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x48, 0x02, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x42, + 0x15, 0x0a, 0x13, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x69, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, + 0x6d, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, + 0x63, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x73, + 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, + 0x22, 0x8e, 0x01, 0x0a, 0x19, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, + 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x54, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x45, 0x64, + 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x09, 0x70, 0x61, 0x67, + 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, + 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x22, 0x61, 0x0a, 0x12, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x45, 0x64, 0x67, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, + 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, + 0x72, 0x73, 0x6f, 0x72, 0x22, 0xb0, 0x02, 0x0a, 0x0e, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, + 0x12, 0x30, 0x0a, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, + 0x6d, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x71, 0x75, 0x61, 0x6e, + 0x74, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x52, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x50, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, + 0x6d, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, + 0x50, 0x65, 0x72, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, + 0x6d, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x47, 0x61, 0x6d, 0x65, 0x50, 0x6c, + 0x61, 0x79, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x70, 0x6c, + 0x61, 0x79, 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x67, 0x61, 0x6d, 0x65, + 0x73, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x22, 0x62, 0x0a, 0x16, 0x51, 0x75, 0x61, 0x6e, 0x74, + 0x75, 0x6d, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x65, 0x72, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x32, 0x0a, 0x15, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x51, 0x75, 0x61, + 0x6e, 0x74, 0x75, 0x6d, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x17, + 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x85, 0x01, 0x0a, 0x0b, 0x54, 0x65, 0x61, 0x6d, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x6f, + 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6a, + 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6a, 0x6f, 0x69, 0x6e, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0d, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, + 0x5b, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x45, 0x64, + 0x67, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x52, 0x04, + 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x87, 0x01, 0x0a, + 0x15, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x22, 0x87, 0x01, 0x0a, 0x15, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x05, 0x65, - 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, - 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, - 0x67, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x67, 0x0a, 0x18, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0d, 0x74, 0x65, 0x61, 0x6d, 0x5f, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, + 0x72, 0x65, 0x65, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x12, 0x36, + 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, + 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x67, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, + 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0d, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0c, 0x74, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x22, + 0x72, 0x0a, 0x12, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, + 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6a, + 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x74, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x22, 0x69, 0x0a, 0x16, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x64, 0x67, 0x65, 0x12, 0x37, 0x0a, + 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, + 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x95, + 0x01, 0x0a, 0x1c, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x3d, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x74, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x65, 0x73, 0x22, 0x72, 0x0a, 0x12, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, - 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, - 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x26, 0x0a, 0x0f, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6a, 0x6f, 0x69, 0x6e, 0x65, - 0x64, 0x41, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x69, 0x0a, 0x16, 0x54, 0x65, 0x61, 0x6d, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x64, - 0x67, 0x65, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, - 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x22, 0x95, 0x01, 0x0a, 0x1c, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, - 0x67, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x90, 0x01, 0x0a, 0x1d, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, - 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, - 0xe2, 0x41, 0x01, 0x02, 0x52, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x12, 0x40, 0x0a, - 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, - 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, - 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x81, - 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x5f, 0x0a, 0x14, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x65, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, - 0x74, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x22, 0xcf, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, - 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, - 0x02, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x88, 0x01, 0x01, 0x12, 0x1e, - 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x03, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0c, - 0x0a, 0x0a, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0b, 0x0a, 0x09, - 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x5f, 0x69, 0x64, 0x22, 0x50, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0a, - 0x66, 0x65, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x09, 0x66, 0x65, 0x65, - 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0xc5, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x46, 0x65, - 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, - 0x64, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, - 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x74, 0x6f, 0x5f, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x07, 0x74, 0x6f, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, - 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x73, - 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x46, 0x6f, - 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, - 0x0a, 0x14, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x66, 0x6f, 0x72, - 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x46, - 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, - 0x52, 0x11, 0x66, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x61, - 0x72, 0x74, 0x79, 0x22, 0x28, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x98, 0x01, - 0x0a, 0x27, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, + 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x12, 0x36, + 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, + 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x90, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x54, + 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, + 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x81, 0x01, 0x0a, 0x1e, 0x4c, 0x69, + 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x14, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x5f, 0x68, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, + 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x74, 0x65, 0x61, 0x6d, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x22, 0xcf, 0x01, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x5f, 0x73, 0x65, 0x71, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x08, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x72, + 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x07, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, + 0x65, 0x71, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x22, + 0x50, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x66, 0x65, 0x65, 0x73, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, + 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x09, 0x66, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x22, 0xc5, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x08, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, + 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x48, 0x01, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, + 0x12, 0x1e, 0x0a, 0x08, 0x74, 0x6f, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x04, 0x48, 0x02, 0x52, 0x07, 0x74, 0x6f, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, + 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, + 0x0b, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x0b, 0x0a, 0x09, + 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x73, 0x0a, 0x1c, 0x47, 0x65, 0x74, + 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x14, 0x66, 0x65, 0x65, + 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x70, 0x61, 0x72, 0x74, + 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x11, 0x66, 0x65, 0x65, + 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x22, 0x28, + 0x0a, 0x26, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, - 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x1f, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x1c, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x22, 0xca, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x74, - 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x07, - 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x02, 0x52, 0x0a, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, - 0x5f, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x66, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, - 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0x97, 0x01, - 0x0a, 0x1d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x3e, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x12, - 0x36, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, - 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x6b, 0x0a, 0x17, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x45, 0x64, - 0x67, 0x65, 0x12, 0x38, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x22, 0x9b, 0x01, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, - 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x19, 0x0a, 0x08, - 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, - 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, - 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x69, 0x73, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x72, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x22, 0x8a, 0x02, 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x18, 0x0a, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3c, 0x0a, 0x0d, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, - 0x74, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x42, 0x65, 0x6e, 0x65, 0x66, - 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x52, 0x0c, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, - 0x69, 0x65, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x66, 0x5f, 0x70, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, - 0x0d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x12, 0x1e, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x41, 0x74, 0x88, - 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, - 0x93, 0x02, 0x0a, 0x11, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x46, 0x6f, 0x72, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, - 0x12, 0x34, 0x0a, 0x16, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x73, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x65, 0x73, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x69, - 0x65, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x15, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x72, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x52, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x64, 0x22, 0x7f, 0x0a, 0x20, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x72, - 0x74, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x49, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x1b, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x77, 0x0a, 0x21, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x13, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x12, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, - 0xd0, 0x01, 0x0a, 0x1a, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, - 0x0a, 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x3d, 0x0a, 0x11, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x0f, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x49, 0x64, 0x22, 0x4b, 0x0a, 0x1b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x66, 0x65, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0x5a, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, - 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x22, 0x4c, 0x0a, 0x23, 0x47, - 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, - 0x65, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xb9, 0x02, 0x0a, 0x10, 0x4c, 0x69, - 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, - 0x0a, 0x07, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x48, 0x01, 0x52, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x46, 0x72, 0x6f, 0x6d, 0x88, 0x01, 0x01, - 0x12, 0x1e, 0x0a, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x04, 0x48, 0x02, 0x52, 0x07, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x54, 0x6f, 0x88, 0x01, 0x01, - 0x12, 0x39, 0x0a, 0x0c, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x48, 0x03, 0x52, 0x0b, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x04, 0x52, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, - 0x08, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x70, 0x6f, - 0x63, 0x68, 0x5f, 0x74, 0x6f, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4b, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x67, 0x61, - 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x61, 0x6d, 0x65, - 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x67, 0x61, 0x6d, - 0x65, 0x73, 0x22, 0x7a, 0x0a, 0x0f, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x64, 0x67, 0x65, 0x52, - 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x69, - 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x67, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x4d, - 0x0a, 0x08, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6e, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x52, - 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xe0, 0x01, - 0x0a, 0x04, 0x47, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x22, 0x0a, 0x0c, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, - 0x12, 0x37, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x48, 0x00, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x12, 0x49, 0x0a, 0x0a, 0x69, 0x6e, 0x64, - 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x98, 0x01, 0x0a, 0x27, 0x47, 0x65, 0x74, + 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x1f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, + 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x1c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x61, 0x6d, 0x22, 0xca, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x02, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x74, 0x5f, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, + 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x66, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x44, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0x97, 0x01, 0x0a, 0x1d, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x05, 0x65, 0x64, + 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x45, + 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x09, 0x70, 0x61, + 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x22, 0x6b, 0x0a, 0x17, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x45, 0x64, 0x67, 0x65, 0x12, 0x38, 0x0a, + 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, + 0x9b, 0x01, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x27, 0x0a, + 0x0f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x8a, 0x02, + 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x3c, 0x0a, 0x0d, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x65, + 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, + 0x72, 0x52, 0x0c, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x73, 0x12, + 0x37, 0x0a, 0x18, 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x15, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1e, 0x0a, + 0x08, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, + 0x00, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, + 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0x93, 0x02, 0x0a, 0x11, 0x46, + 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, + 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x72, 0x65, 0x63, + 0x65, 0x69, 0x76, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x5f, 0x64, 0x69, + 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x44, 0x69, + 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x36, 0x0a, + 0x17, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x70, + 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, + 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, + 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, + 0x22, 0x7f, 0x0a, 0x20, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x22, 0x77, 0x0a, 0x21, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x13, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xd0, 0x01, 0x0a, 0x1a, 0x45, + 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, + 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x6f, + 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x11, + 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x66, 0x72, 0x6f, 0x6d, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, + 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x74, 0x6f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x22, 0x4b, 0x0a, + 0x1b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, + 0x66, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x66, 0x65, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x5a, 0x0a, 0x22, 0x47, 0x65, + 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, + 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x22, 0x4c, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x44, 0x69, 0x73, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, + 0x0e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xb9, 0x02, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x07, 0x67, 0x61, 0x6d, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x67, 0x61, + 0x6d, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x09, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x46, 0x72, 0x6f, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, + 0x07, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x54, 0x6f, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0c, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, + 0x63, 0x6f, 0x70, 0x65, 0x48, 0x03, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x63, + 0x6f, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x04, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x67, 0x61, 0x6d, + 0x65, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x66, + 0x72, 0x6f, 0x6d, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x6f, + 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x4b, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x7a, 0x0a, + 0x0f, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x2f, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, + 0x73, 0x12, 0x36, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x4d, 0x0a, 0x08, 0x47, 0x61, 0x6d, + 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xe0, 0x01, 0x0a, 0x04, 0x47, 0x61, 0x6d, + 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x04, 0x74, + 0x65, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, + 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x48, 0x00, 0x52, 0x04, + 0x74, 0x65, 0x61, 0x6d, 0x12, 0x49, 0x0a, 0x0a, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, + 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x49, 0x6e, 0x64, 0x69, 0x76, + 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x42, + 0x0a, 0x0a, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x47, 0x0a, 0x10, 0x54, + 0x65, 0x61, 0x6d, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, + 0x33, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x54, 0x65, 0x61, 0x6d, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x04, + 0x74, 0x65, 0x61, 0x6d, 0x22, 0x5f, 0x0a, 0x16, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, + 0x61, 0x6c, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x45, + 0x0a, 0x0a, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, + 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x0a, 0x69, 0x6e, 0x64, 0x69, 0x76, + 0x69, 0x64, 0x75, 0x61, 0x6c, 0x22, 0xf4, 0x01, 0x0a, 0x0e, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x61, + 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x61, 0x6d, + 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, + 0x74, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, + 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, + 0x77, 0x61, 0x72, 0x64, 0x45, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x61, 0x72, 0x6e, + 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x45, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x22, 0x8c, 0x01, 0x0a, + 0x15, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, + 0x5a, 0x0a, 0x15, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x61, 0x6d, 0x65, 0x45, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x14, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x22, 0xde, 0x01, 0x0a, 0x14, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, - 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, - 0x64, 0x75, 0x61, 0x6c, 0x42, 0x0a, 0x0a, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, - 0x22, 0x47, 0x0a, 0x10, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x5f, 0x0a, 0x16, 0x49, 0x6e, 0x64, - 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, - 0x69, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x0a, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, - 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, - 0x64, 0x75, 0x61, 0x6c, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x0a, - 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x22, 0xf4, 0x01, 0x0a, 0x0e, 0x54, - 0x65, 0x61, 0x6d, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x3a, 0x0a, - 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, - 0x61, 0x6d, 0x47, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, - 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x16, 0x0a, - 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x5f, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x45, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x12, - 0x30, 0x0a, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, - 0x5f, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x45, 0x61, 0x72, 0x6e, 0x65, - 0x64, 0x22, 0x8c, 0x01, 0x0a, 0x15, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x61, 0x6d, 0x65, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, - 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, - 0x61, 0x6d, 0x49, 0x64, 0x12, 0x5a, 0x0a, 0x15, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x5f, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, - 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x14, 0x6d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6e, 0x67, - 0x22, 0xde, 0x01, 0x0a, 0x14, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, - 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x64, - 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, - 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, - 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x16, 0x0a, - 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x5f, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x45, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x12, - 0x30, 0x0a, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, - 0x5f, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x45, 0x61, 0x72, 0x6e, 0x65, - 0x64, 0x2a, 0xaa, 0x01, 0x0a, 0x10, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x22, 0x0a, 0x1e, 0x4c, 0x45, 0x44, 0x47, 0x45, 0x52, - 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x26, 0x0a, 0x22, 0x4c, 0x45, - 0x44, 0x47, 0x45, 0x52, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, - 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x52, 0x4f, 0x4d, 0x5f, 0x49, 0x44, - 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x4c, 0x45, 0x44, 0x47, 0x45, 0x52, 0x5f, 0x45, 0x4e, 0x54, - 0x52, 0x59, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, - 0x5f, 0x54, 0x4f, 0x5f, 0x49, 0x44, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x4c, 0x45, 0x44, 0x47, - 0x45, 0x52, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x54, - 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x03, 0x2a, 0xb0, - 0x01, 0x0a, 0x0c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, - 0x1d, 0x0a, 0x19, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, - 0x0a, 0x10, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, - 0x49, 0x44, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, - 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x5f, 0x49, 0x44, 0x10, 0x02, - 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, - 0x44, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x49, 0x44, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, - 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x4d, 0x41, - 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x49, 0x44, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x43, 0x43, - 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, - 0x05, 0x2a, 0xad, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x44, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x1e, 0x54, 0x52, 0x41, 0x4e, 0x53, - 0x46, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x24, 0x0a, 0x20, 0x54, - 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x46, 0x52, 0x4f, 0x4d, 0x10, - 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x44, 0x49, - 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, - 0x5f, 0x54, 0x4f, 0x10, 0x02, 0x12, 0x2a, 0x0a, 0x26, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, - 0x52, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x4e, - 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x5f, 0x4f, 0x52, 0x5f, 0x46, 0x52, 0x4f, 0x4d, 0x10, - 0x03, 0x2a, 0xde, 0x02, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x54, - 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x42, 0x41, 0x4c, 0x41, - 0x4e, 0x43, 0x45, 0x53, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, - 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x53, 0x10, 0x02, 0x12, 0x15, 0x0a, - 0x11, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x47, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x53, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4c, 0x45, - 0x44, 0x47, 0x45, 0x52, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, - 0x4f, 0x52, 0x44, 0x45, 0x52, 0x53, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x41, 0x42, 0x4c, - 0x45, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x45, 0x53, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, - 0x42, 0x4c, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x10, - 0x07, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, - 0x4e, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x53, 0x10, 0x08, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x41, - 0x42, 0x4c, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x09, 0x12, - 0x1e, 0x0a, 0x1a, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, - 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x0a, 0x12, - 0x11, 0x0a, 0x0d, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x53, - 0x10, 0x0b, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4f, - 0x53, 0x49, 0x54, 0x53, 0x10, 0x0c, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, - 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, 0x41, 0x4c, 0x53, 0x10, 0x0d, 0x12, 0x10, 0x0a, - 0x0c, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x53, 0x10, 0x0e, 0x12, - 0x11, 0x0a, 0x0d, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x53, - 0x10, 0x0f, 0x32, 0xa4, 0x72, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x61, - 0x74, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6a, 0x0a, 0x0c, 0x4c, 0x69, 0x73, - 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x74, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, + 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, + 0x64, 0x75, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, + 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, + 0x77, 0x61, 0x72, 0x64, 0x45, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x61, 0x72, 0x6e, + 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x45, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x2a, 0xaa, 0x01, 0x0a, + 0x10, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x12, 0x22, 0x0a, 0x1e, 0x4c, 0x45, 0x44, 0x47, 0x45, 0x52, 0x5f, 0x45, 0x4e, 0x54, 0x52, + 0x59, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x26, 0x0a, 0x22, 0x4c, 0x45, 0x44, 0x47, 0x45, 0x52, 0x5f, + 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x41, 0x43, 0x43, 0x4f, + 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x52, 0x4f, 0x4d, 0x5f, 0x49, 0x44, 0x10, 0x01, 0x12, 0x24, 0x0a, + 0x20, 0x4c, 0x45, 0x44, 0x47, 0x45, 0x52, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x46, 0x49, + 0x45, 0x4c, 0x44, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x4f, 0x5f, 0x49, + 0x44, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x4c, 0x45, 0x44, 0x47, 0x45, 0x52, 0x5f, 0x45, 0x4e, + 0x54, 0x52, 0x59, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, + 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x03, 0x2a, 0xb0, 0x01, 0x0a, 0x0c, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x43, + 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x43, 0x43, + 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x49, 0x44, 0x10, 0x01, 0x12, + 0x1a, 0x0a, 0x16, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, + 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x5f, 0x49, 0x44, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x41, + 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x41, 0x53, 0x53, + 0x45, 0x54, 0x5f, 0x49, 0x44, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x41, 0x43, 0x43, 0x4f, 0x55, + 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, + 0x49, 0x44, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, + 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x05, 0x2a, 0xad, 0x01, 0x0a, + 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x1e, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x44, + 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x24, 0x0a, 0x20, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, + 0x45, 0x52, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x41, + 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x46, 0x52, 0x4f, 0x4d, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, + 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x10, 0x02, + 0x12, 0x2a, 0x0a, 0x26, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x52, + 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, + 0x54, 0x4f, 0x5f, 0x4f, 0x52, 0x5f, 0x46, 0x52, 0x4f, 0x4d, 0x10, 0x03, 0x2a, 0xde, 0x02, 0x0a, + 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, + 0x0e, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x10, + 0x01, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, + 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x53, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x42, 0x4c, + 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x03, 0x12, + 0x10, 0x0a, 0x0c, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4c, 0x45, 0x44, 0x47, 0x45, 0x52, 0x10, + 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, + 0x53, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x52, 0x41, + 0x44, 0x45, 0x53, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4d, + 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, + 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4c, 0x45, 0x56, + 0x45, 0x4c, 0x53, 0x10, 0x08, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x50, + 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x09, 0x12, 0x1e, 0x0a, 0x1a, 0x54, 0x41, + 0x42, 0x4c, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, + 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x0a, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x41, + 0x42, 0x4c, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x0b, 0x12, 0x12, 0x0a, + 0x0e, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x53, 0x10, + 0x0c, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x44, + 0x52, 0x41, 0x57, 0x41, 0x4c, 0x53, 0x10, 0x0d, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x41, 0x42, 0x4c, + 0x45, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x53, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x41, + 0x42, 0x4c, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x53, 0x10, 0x0f, 0x32, 0xa2, 0x73, + 0x0a, 0x12, 0x54, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x6a, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x12, 0x75, 0x0a, 0x0f, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x75, 0x0a, 0x0f, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0d, 0x92, 0x41, 0x0a, - 0x0a, 0x08, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x04, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x62, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x73, 0x12, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, - 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x77, 0x0a, 0x11, 0x4c, 0x69, - 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x1c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x92, 0x41, + 0x12, 0x0a, 0x10, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, + 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x62, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, + 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x77, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x73, 0x12, 0x6d, 0x0a, 0x0d, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, - 0x30, 0x01, 0x12, 0x68, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, - 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x6e, 0x0a, 0x0e, - 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x26, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, - 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x71, 0x0a, 0x0d, - 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x88, 0x02, - 0x01, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x77, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x79, 0x0a, 0x10, 0x4f, 0x62, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, - 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x6d, + 0x0a, 0x0d, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, + 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x30, 0x01, 0x12, 0x7f, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, - 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, - 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, + 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x30, 0x01, 0x12, 0x68, 0x0a, + 0x0c, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x24, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, + 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x6e, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x53, + 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, + 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x71, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x50, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x88, 0x02, 0x01, 0x92, 0x41, 0x0b, 0x0a, + 0x09, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x77, 0x0a, 0x10, 0x4c, 0x69, + 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x6c, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x79, 0x0a, 0x10, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, + 0x0b, 0x0a, 0x09, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x01, 0x12, 0x7f, + 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x13, 0x92, 0x41, 0x10, 0x0a, 0x0e, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x12, 0x6f, 0x0a, 0x13, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4c, 0x65, - 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x13, - 0x92, 0x41, 0x10, 0x0a, 0x0e, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x30, 0x01, 0x12, 0x7c, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x2a, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x73, 0x12, 0x7e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, - 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, - 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x61, 0x74, 0x65, - 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4c, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x92, 0x41, 0x10, 0x0a, + 0x0e, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, + 0x6f, 0x0a, 0x13, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4c, + 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x13, 0x92, 0x41, 0x10, 0x0a, 0x0e, + 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x30, 0x01, + 0x12, 0x7c, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x7e, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, + 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x81, + 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x61, + 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x61, 0x74, 0x65, + 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x12, 0x2c, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, + 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x65, 0x70, + 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, - 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x80, 0x01, 0x0a, 0x13, 0x4f, 0x62, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x65, 0x70, 0x74, 0x68, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x44, 0x65, 0x70, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, - 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x80, 0x01, 0x0a, 0x13, - 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x65, - 0x70, 0x74, 0x68, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x73, 0x44, 0x65, 0x70, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x73, 0x44, 0x65, 0x70, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, - 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x30, 0x01, 0x12, 0x95, - 0x01, 0x0a, 0x1a, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x73, 0x44, 0x65, 0x70, 0x74, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x65, - 0x70, 0x74, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x33, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x73, 0x44, 0x65, 0x70, 0x74, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x73, 0x30, 0x01, 0x12, 0x7d, 0x0a, 0x12, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, - 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, + 0x65, 0x70, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x65, 0x70, 0x74, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x30, 0x01, 0x12, 0x95, 0x01, 0x0a, 0x1a, 0x4f, 0x62, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x65, 0x70, 0x74, + 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x73, 0x30, 0x01, 0x12, 0x8d, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, - 0x49, 0x44, 0x12, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, - 0x74, 0x61, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x44, 0x61, 0x74, 0x61, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, 0x44, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x6e, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x65, 0x70, 0x74, 0x68, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x65, 0x70, + 0x74, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x30, + 0x01, 0x12, 0x7d, 0x0a, 0x12, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x30, 0x01, + 0x12, 0x8d, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, 0x44, 0x12, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x68, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, + 0x12, 0x6e, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x73, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, + 0x12, 0x68, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, + 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, - 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x6f, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, - 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, - 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, - 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x12, 0x7a, 0x0a, 0x11, 0x4f, 0x62, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x29, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, - 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, + 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x75, 0x0a, 0x10, 0x47, 0x65, + 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x28, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x12, 0x6f, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x43, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x73, 0x12, 0x7a, 0x0a, 0x11, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x43, 0x61, 0x6e, + 0x64, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x73, 0x30, 0x01, 0x12, 0x7e, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x6c, - 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, - 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x43, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x73, 0x12, 0x63, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x74, 0x65, 0x73, - 0x12, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0x47, 0x6f, - 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x6e, 0x0a, 0x0c, 0x4f, 0x62, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 0x65, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x43, 0x61, 0x6e, 0x64, + 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, + 0x92, 0x41, 0x09, 0x0a, 0x07, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x30, 0x01, 0x12, 0x7e, + 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x64, + 0x6c, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x12, 0x63, + 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0x47, 0x6f, 0x76, 0x65, - 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x30, 0x01, 0x12, 0xb3, 0x01, 0x0a, 0x23, 0x4c, 0x69, 0x73, - 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, - 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, - 0x12, 0x3b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, - 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x42, - 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, - 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, - 0x0a, 0x0c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x12, 0xb9, - 0x01, 0x0a, 0x25, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, - 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x12, 0x6e, 0x0a, 0x0c, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x56, 0x6f, + 0x74, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x56, 0x6f, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, + 0x65, 0x30, 0x01, 0x12, 0xb3, 0x01, 0x0a, 0x23, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, + 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, + 0x64, 0x64, 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, + 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, - 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, - 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x45, 0x52, - 0x43, 0x32, 0x30, 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x17, 0x47, - 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, - 0x30, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, + 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x45, 0x52, 0x43, + 0x32, 0x30, 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x12, 0xb9, 0x01, 0x0a, 0x25, 0x4c, 0x69, + 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, + 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, + 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, + 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, + 0x72, 0x69, 0x64, 0x67, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, - 0x45, 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x12, 0x9e, 0x01, 0x0a, - 0x1c, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x53, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x34, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x53, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x53, 0x65, - 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x75, 0x6e, 0x64, - 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, - 0x0c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x12, 0x98, 0x01, - 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, - 0x61, 0x77, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x12, 0x32, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, - 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, - 0x6c, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x33, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, - 0x72, 0x61, 0x77, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x45, 0x52, 0x43, 0x32, - 0x30, 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x12, 0x68, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4c, - 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, - 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x54, 0x72, 0x61, 0x64, - 0x65, 0x73, 0x12, 0x62, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, - 0x12, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, - 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x12, 0x6d, 0x0a, 0x0d, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, + 0x65, 0x12, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4c, 0x69, 0x73, 0x74, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x45, 0x52, 0x43, 0x32, 0x30, + 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x12, 0x9e, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x45, + 0x52, 0x43, 0x32, 0x30, 0x53, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x73, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x34, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x52, + 0x43, 0x32, 0x30, 0x53, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x54, 0x72, 0x61, - 0x64, 0x65, 0x73, 0x30, 0x01, 0x12, 0x71, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x61, 0x63, - 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x61, 0x63, - 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x47, 0x65, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, - 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x77, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, - 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, - 0x65, 0x53, 0x70, 0x65, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, - 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x12, 0x74, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, + 0x2e, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x53, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x45, 0x52, 0x43, 0x32, + 0x30, 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x12, 0x98, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, + 0x45, 0x52, 0x43, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x41, + 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x12, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, + 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x72, + 0x6f, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, + 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, + 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, 0x72, 0x69, + 0x64, 0x67, 0x65, 0x12, 0x68, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, + 0x61, 0x64, 0x65, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, + 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4c, + 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x12, 0x62, 0x0a, + 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x20, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x60, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x12, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, - 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, - 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x73, 0x12, 0x81, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x5d, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, - 0x79, 0x12, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x54, 0x72, 0x61, 0x64, 0x65, + 0x73, 0x12, 0x6d, 0x0a, 0x0d, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x64, + 0x65, 0x73, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x64, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x30, 0x01, + 0x12, 0x71, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, + 0x63, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, + 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x20, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x12, 0x77, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x53, 0x70, 0x65, 0x63, 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, + 0x44, 0x61, 0x74, 0x61, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x74, 0x0a, 0x0e, + 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x26, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x12, 0x60, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, + 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x73, 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, - 0x92, 0x41, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x7b, 0x0a, 0x10, - 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, - 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, - 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x67, - 0x69, 0x6e, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, 0x86, 0x01, 0x0a, 0x13, 0x4f, 0x62, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, - 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, - 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, + 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x81, 0x01, 0x0a, + 0x14, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, + 0x12, 0x5d, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x20, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, + 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, - 0x76, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x92, 0x41, - 0x0f, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, - 0x30, 0x01, 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x73, 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, - 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, - 0x09, 0x0a, 0x07, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x7e, 0x0a, 0x13, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, - 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, + 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, + 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, - 0x09, 0x0a, 0x07, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x8d, 0x01, 0x0a, 0x18, 0x4c, - 0x69, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x70, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x7b, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x20, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x73, 0x12, 0x86, 0x01, 0x0a, 0x13, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, 0x2b, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x4d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x30, 0x01, 0x12, 0x66, 0x0a, + 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x23, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x52, 0x65, + 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x7e, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, + 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x52, 0x65, + 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x8d, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x65, 0x73, 0x12, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, + 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x52, 0x65, + 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x62, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, + 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x68, 0x0a, 0x0c, 0x4c, 0x69, 0x73, + 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, - 0x09, 0x0a, 0x07, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x62, 0x0a, 0x0a, 0x47, 0x65, - 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, - 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x68, - 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x24, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, - 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x6b, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x57, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, + 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x73, 0x12, 0x6b, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x61, 0x6c, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, + 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, + 0x12, 0x71, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x61, 0x6c, 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x73, 0x12, 0x5c, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, + 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x73, 0x12, 0x62, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, + 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x71, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, - 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, - 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x5c, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x12, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x62, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x73, 0x12, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, - 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x17, 0x4c, - 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, - 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, + 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x88, 0x02, 0x01, 0x92, 0x41, - 0x0b, 0x0a, 0x09, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x12, 0x95, 0x01, 0x0a, - 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, - 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x33, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x73, 0x12, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, + 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x4c, 0x69, 0x71, 0x75, 0x69, - 0x64, 0x69, 0x74, 0x79, 0x12, 0x97, 0x01, 0x0a, 0x1a, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x88, 0x02, 0x01, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x4c, 0x69, + 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x12, 0x95, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, + 0x41, 0x6c, 0x6c, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4c, 0x69, 0x71, - 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, - 0x0b, 0x0a, 0x09, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x30, 0x01, 0x12, 0x89, - 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, - 0x09, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x12, 0x86, 0x01, 0x0a, 0x15, 0x4c, - 0x69, 0x73, 0x74, 0x50, 0x61, 0x69, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, - 0x46, 0x65, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x69, 0x64, 0x4c, - 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x69, 0x64, 0x4c, 0x69, - 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x12, 0x7b, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, - 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x6f, - 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, - 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, - 0x12, 0x7e, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, - 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x6f, 0x76, - 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, - 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, - 0x12, 0x7d, 0x0a, 0x11, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x47, 0x6f, 0x76, 0x65, 0x72, - 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x47, - 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, - 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, - 0x0c, 0x0a, 0x0a, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x30, 0x01, 0x12, - 0x72, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x12, 0x6f, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x5a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, - 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x12, 0x60, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x21, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x12, 0x80, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, - 0x72, 0x69, 0x64, 0x67, 0x65, 0x12, 0x5d, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x12, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x65, 0x0a, 0x0b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, - 0x46, 0x65, 0x65, 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x46, 0x65, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, - 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, - 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x6e, 0x0a, 0x0e, 0x45, - 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x12, 0x26, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, - 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, - 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x77, 0x0a, 0x10, 0x45, - 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, - 0x6d, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x50, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x2d, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x6c, 0x6c, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x12, + 0x97, 0x01, 0x0a, 0x1a, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, - 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x7e, 0x0a, 0x13, 0x47, - 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, - 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x72, 0x0a, 0x0f, 0x4c, - 0x69, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x27, + 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, + 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4c, 0x69, 0x71, 0x75, + 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x4c, 0x69, + 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x30, 0x01, 0x12, 0x89, 0x01, 0x0a, 0x16, 0x4c, 0x69, + 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x73, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x4c, 0x69, 0x71, 0x75, + 0x69, 0x64, 0x69, 0x74, 0x79, 0x12, 0x86, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, + 0x69, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x12, + 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x69, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, - 0x5d, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x20, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, - 0x74, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x69, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x12, 0x7b, + 0x0a, 0x11, 0x47, 0x65, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x47, 0x65, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, 0x0c, 0x0a, + 0x0a, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x7e, 0x0a, 0x12, 0x4c, + 0x69, 0x73, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, + 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, 0x0c, 0x0a, + 0x0a, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x7d, 0x0a, 0x11, 0x4f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, + 0x12, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, + 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0x47, 0x6f, + 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x30, 0x01, 0x12, 0x72, 0x0a, 0x0f, 0x4c, 0x69, + 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x6c, + 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x6f, - 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x52, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x69, - 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, - 0x75, 0x0a, 0x0f, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, - 0x75, 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x42, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x28, 0x01, 0x30, 0x01, 0x12, 0x92, 0x01, 0x0a, 0x16, 0x4f, 0x62, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4c, 0x65, 0x64, 0x67, 0x65, - 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4c, 0x65, 0x64, 0x67, 0x65, - 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x20, - 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x30, 0x01, 0x12, 0x75, 0x0a, 0x10, 0x4c, - 0x69, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x61, 0x74, + 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, + 0x5a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, + 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x60, 0x0a, 0x09, 0x4c, + 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x80, 0x01, + 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, + 0x41, 0x0e, 0x0a, 0x0c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, + 0x12, 0x5d, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, + 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, + 0x65, 0x0a, 0x0b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x12, 0x23, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x46, 0x65, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x6e, 0x0a, 0x0e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, + 0x74, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x12, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, + 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x77, 0x0a, 0x10, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, + 0x74, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, + 0x69, 0x6d, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x50, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x84, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x7e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x2b, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x72, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x12, 0x8d, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, - 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x12, 0x66, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x56, 0x65, 0x67, 0x61, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, + 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x5d, 0x0a, 0x08, 0x47, 0x65, + 0x74, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x6b, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, + 0x61, 0x6b, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, + 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x6f, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x52, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x26, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, + 0x74, 0x52, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, + 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x75, 0x0a, 0x0f, 0x4f, 0x62, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x73, 0x12, 0x27, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x28, 0x01, 0x30, + 0x01, 0x12, 0x92, 0x01, 0x0a, 0x16, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4c, 0x65, 0x64, + 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2e, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x92, + 0x41, 0x12, 0x0a, 0x10, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x20, 0x6d, 0x6f, 0x76, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x30, 0x01, 0x12, 0x75, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4b, 0x65, + 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x8d, 0x01, + 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, + 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x66, 0x0a, + 0x0b, 0x47, 0x65, 0x74, 0x56, 0x65, 0x67, 0x61, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x23, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, + 0x65, 0x74, 0x56, 0x65, 0x67, 0x61, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x67, 0x61, 0x54, 0x69, 0x6d, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x67, 0x61, - 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, - 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x8d, 0x01, 0x0a, 0x18, 0x47, - 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x8d, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, - 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x99, 0x01, 0x0a, 0x1c, 0x4c, + 0x75, 0x73, 0x12, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x99, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x12, 0x34, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, - 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x12, 0x34, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, - 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x35, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x78, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, - 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x12, 0x78, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x72, - 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x12, 0xb3, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, + 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, + 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0xb3, 0x01, 0x0a, 0x22, + 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x3a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x73, - 0x74, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x63, - 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x68, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0xa4, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x6c, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x35, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x6c, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x36, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, 0x4e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0xb9, 0x01, - 0x0a, 0x24, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x92, 0x41, 0x11, + 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x12, 0xa4, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x35, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x6c, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0xb9, 0x01, 0x0a, 0x24, 0x47, 0x65, 0x74, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x73, 0x12, 0x3c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x50, 0x65, 0x65, 0x72, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x3d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x3c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x50, 0x65, - 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x92, 0x01, 0x0a, 0x17, 0x47, 0x65, - 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, + 0x92, 0x41, 0x11, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x68, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x92, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0xaa, - 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x50, 0x65, 0x65, - 0x72, 0x73, 0x12, 0x37, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x50, - 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, + 0x12, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0xaa, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x42, - 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x6a, 0x0a, 0x0c, 0x4c, - 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0x45, - 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x12, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x46, - 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x12, 0x2a, 0x2e, + 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x50, 0x65, 0x65, 0x72, 0x73, 0x12, 0x37, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x73, 0x12, 0x96, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, - 0x69, 0x6e, 0x74, 0x73, 0x12, 0x33, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, + 0x72, 0x61, 0x70, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x68, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x6a, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, + 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0x45, 0x78, 0x70, 0x6c, 0x6f, 0x72, + 0x65, 0x72, 0x12, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, + 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, - 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x7e, 0x0a, - 0x13, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, + 0x96, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, + 0x33, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, - 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x90, 0x01, - 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, - 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, - 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, - 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, - 0x12, 0x99, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x31, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x72, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x7e, 0x0a, 0x10, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x73, - 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, - 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x72, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x93, 0x01, 0x0a, - 0x17, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x12, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, + 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x7e, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, + 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, + 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x90, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, + 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6b, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x72, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x99, 0x01, 0x0a, 0x19, + 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x43, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, + 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, + 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x20, + 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x7e, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x20, + 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x93, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x92, 0x41, 0x12, - 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x12, 0x87, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x72, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x5e, 0x0a, 0x09, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x65, 0x65, 0x73, 0x12, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x72, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x87, 0x01, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, + 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x20, + 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x5e, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x54, + 0x65, 0x61, 0x6d, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, + 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, + 0x0a, 0x05, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x7c, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x54, + 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2b, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, 0x0a, 0x05, + 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x73, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, + 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x0a, 0x92, 0x41, 0x07, 0x0a, 0x05, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x73, 0x0a, 0x10, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, - 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, 0x0a, 0x05, 0x54, 0x65, 0x61, 0x6d, - 0x73, 0x12, 0x85, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x2e, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, + 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, + 0x92, 0x41, 0x07, 0x0a, 0x05, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, - 0x41, 0x07, 0x0a, 0x05, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x66, 0x0a, 0x0c, 0x47, 0x65, 0x74, - 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x46, - 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x09, 0x92, 0x41, 0x06, 0x0a, 0x04, 0x46, 0x65, 0x65, - 0x73, 0x12, 0x7e, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x46, - 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, - 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x09, 0x92, 0x41, 0x06, 0x0a, 0x04, 0x46, 0x65, 0x65, - 0x73, 0x12, 0xb2, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x37, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, 0x0a, 0x05, 0x54, 0x65, 0x61, + 0x6d, 0x73, 0x12, 0x66, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, + 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x09, 0x92, 0x41, 0x06, 0x0a, 0x04, 0x46, 0x65, 0x65, 0x73, 0x12, 0x7e, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x72, + 0x74, 0x79, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x46, + 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x09, 0x92, 0x41, 0x06, 0x0a, 0x04, 0x46, 0x65, 0x65, 0x73, 0x12, 0xb2, 0x01, 0x0a, 0x1f, 0x47, + 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, + 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x37, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x92, 0x41, 0x19, 0x0a, 0x17, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x70, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x97, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x1c, 0x92, 0x41, 0x19, 0x0a, 0x17, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, - 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, - 0x12, 0x90, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x31, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x56, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x12, 0x81, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, - 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2c, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, - 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x1c, 0x92, 0x41, 0x19, 0x0a, 0x17, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x64, + 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, + 0x97, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, - 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x9d, 0x01, 0x0a, 0x19, 0x4f, 0x62, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x92, 0x41, - 0x14, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x30, 0x01, 0x12, 0x80, 0x01, 0x0a, 0x13, 0x45, 0x73, 0x74, 0x69, - 0x6d, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x12, - 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, - 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, - 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, - 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x98, 0x01, 0x0a, 0x1b, 0x47, - 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, - 0x65, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x33, 0x2e, 0x64, 0x61, 0x74, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, - 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x34, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x46, 0x65, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x5e, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, - 0x65, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, 0x0a, 0x05, - 0x47, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x72, 0x0a, 0x14, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x2c, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, - 0x79, 0x22, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, - 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x30, 0x01, 0x12, 0x4e, 0x0a, 0x04, 0x50, 0x69, 0x6e, - 0x67, 0x12, 0x1c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x09, - 0x92, 0x41, 0x06, 0x0a, 0x04, 0x4d, 0x69, 0x73, 0x63, 0x42, 0xca, 0x01, 0x5a, 0x31, 0x63, 0x6f, - 0x64, 0x65, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x69, 0x6f, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x64, - 0x61, 0x74, 0x61, 0x2d, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x92, - 0x41, 0x93, 0x01, 0x12, 0x22, 0x0a, 0x13, 0x56, 0x65, 0x67, 0x61, 0x20, 0x64, 0x61, 0x74, 0x61, - 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x41, 0x50, 0x49, 0x73, 0x32, 0x0b, 0x76, 0x30, 0x2e, 0x37, - 0x34, 0x2e, 0x30, 0x2d, 0x64, 0x65, 0x76, 0x1a, 0x1c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, - 0x2f, 0x61, 0x70, 0x69, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x78, 0x79, 0x7a, 0x2a, 0x02, 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x52, 0x39, 0x0a, 0x03, 0x35, - 0x30, 0x30, 0x12, 0x32, 0x0a, 0x18, 0x41, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, - 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x92, 0x41, 0x19, + 0x0a, 0x17, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x90, 0x01, 0x0a, 0x19, 0x47, 0x65, + 0x74, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, + 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, + 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, + 0x92, 0x41, 0x09, 0x0a, 0x07, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x81, 0x01, 0x0a, + 0x14, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, + 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x12, 0x9d, 0x01, 0x0a, 0x19, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x92, 0x41, 0x14, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x30, 0x01, + 0x12, 0x80, 0x01, 0x0a, 0x13, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, + 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x73, 0x12, 0x98, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x33, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x44, 0x69, + 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x5e, + 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, 0x0a, 0x05, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x72, + 0x0a, 0x14, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x14, 0x92, 0x41, 0x11, 0x0a, + 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x30, 0x01, 0x12, 0x4e, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x09, 0x92, 0x41, 0x06, 0x0a, 0x04, 0x4d, 0x69, + 0x73, 0x63, 0x42, 0xca, 0x01, 0x5a, 0x31, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x65, 0x67, 0x61, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x6e, 0x6f, 0x64, + 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x92, 0x41, 0x93, 0x01, 0x12, 0x22, 0x0a, 0x13, + 0x56, 0x65, 0x67, 0x61, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x41, + 0x50, 0x49, 0x73, 0x32, 0x0b, 0x76, 0x30, 0x2e, 0x37, 0x34, 0x2e, 0x30, 0x2d, 0x64, 0x65, 0x76, + 0x1a, 0x1c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x61, 0x70, 0x69, 0x2e, 0x74, 0x65, + 0x73, 0x74, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x78, 0x79, 0x7a, 0x2a, 0x02, + 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x52, 0x39, 0x0a, 0x03, 0x35, 0x30, 0x30, 0x12, 0x32, 0x0a, 0x18, 0x41, + 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -28275,7 +28732,7 @@ func file_data_node_api_v2_trading_data_proto_rawDescGZIP() []byte { } var file_data_node_api_v2_trading_data_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_data_node_api_v2_trading_data_proto_msgTypes = make([]protoimpl.MessageInfo, 388) +var file_data_node_api_v2_trading_data_proto_msgTypes = make([]protoimpl.MessageInfo, 394) var file_data_node_api_v2_trading_data_proto_goTypes = []interface{}{ (LedgerEntryField)(0), // 0: datanode.api.v2.LedgerEntryField (AccountField)(0), // 1: datanode.api.v2.AccountField @@ -28632,139 +29089,145 @@ var file_data_node_api_v2_trading_data_proto_goTypes = []interface{}{ (*TeamConnection)(nil), // 352: datanode.api.v2.TeamConnection (*ListTeamsRequest)(nil), // 353: datanode.api.v2.ListTeamsRequest (*ListTeamsResponse)(nil), // 354: datanode.api.v2.ListTeamsResponse - (*ListTeamRefereesRequest)(nil), // 355: datanode.api.v2.ListTeamRefereesRequest - (*TeamReferee)(nil), // 356: datanode.api.v2.TeamReferee - (*TeamRefereeEdge)(nil), // 357: datanode.api.v2.TeamRefereeEdge - (*TeamRefereeConnection)(nil), // 358: datanode.api.v2.TeamRefereeConnection - (*ListTeamRefereesResponse)(nil), // 359: datanode.api.v2.ListTeamRefereesResponse - (*TeamRefereeHistory)(nil), // 360: datanode.api.v2.TeamRefereeHistory - (*TeamRefereeHistoryEdge)(nil), // 361: datanode.api.v2.TeamRefereeHistoryEdge - (*TeamRefereeHistoryConnection)(nil), // 362: datanode.api.v2.TeamRefereeHistoryConnection - (*ListTeamRefereeHistoryRequest)(nil), // 363: datanode.api.v2.ListTeamRefereeHistoryRequest - (*ListTeamRefereeHistoryResponse)(nil), // 364: datanode.api.v2.ListTeamRefereeHistoryResponse - (*GetFeesStatsRequest)(nil), // 365: datanode.api.v2.GetFeesStatsRequest - (*GetFeesStatsResponse)(nil), // 366: datanode.api.v2.GetFeesStatsResponse - (*GetFeesStatsForPartyRequest)(nil), // 367: datanode.api.v2.GetFeesStatsForPartyRequest - (*GetFeesStatsForPartyResponse)(nil), // 368: datanode.api.v2.GetFeesStatsForPartyResponse - (*GetCurrentVolumeDiscountProgramRequest)(nil), // 369: datanode.api.v2.GetCurrentVolumeDiscountProgramRequest - (*GetCurrentVolumeDiscountProgramResponse)(nil), // 370: datanode.api.v2.GetCurrentVolumeDiscountProgramResponse - (*GetVolumeDiscountStatsRequest)(nil), // 371: datanode.api.v2.GetVolumeDiscountStatsRequest - (*GetVolumeDiscountStatsResponse)(nil), // 372: datanode.api.v2.GetVolumeDiscountStatsResponse - (*VolumeDiscountStatsConnection)(nil), // 373: datanode.api.v2.VolumeDiscountStatsConnection - (*VolumeDiscountStatsEdge)(nil), // 374: datanode.api.v2.VolumeDiscountStatsEdge - (*VolumeDiscountStats)(nil), // 375: datanode.api.v2.VolumeDiscountStats - (*VolumeDiscountProgram)(nil), // 376: datanode.api.v2.VolumeDiscountProgram - (*FeesStatsForParty)(nil), // 377: datanode.api.v2.FeesStatsForParty - (*ObserveTransactionResultsRequest)(nil), // 378: datanode.api.v2.ObserveTransactionResultsRequest - (*ObserveTransactionResultsResponse)(nil), // 379: datanode.api.v2.ObserveTransactionResultsResponse - (*EstimateTransferFeeRequest)(nil), // 380: datanode.api.v2.EstimateTransferFeeRequest - (*EstimateTransferFeeResponse)(nil), // 381: datanode.api.v2.EstimateTransferFeeResponse - (*GetTotalTransferFeeDiscountRequest)(nil), // 382: datanode.api.v2.GetTotalTransferFeeDiscountRequest - (*GetTotalTransferFeeDiscountResponse)(nil), // 383: datanode.api.v2.GetTotalTransferFeeDiscountResponse - (*ListGamesRequest)(nil), // 384: datanode.api.v2.ListGamesRequest - (*ListGamesResponse)(nil), // 385: datanode.api.v2.ListGamesResponse - (*GamesConnection)(nil), // 386: datanode.api.v2.GamesConnection - (*GameEdge)(nil), // 387: datanode.api.v2.GameEdge - (*Game)(nil), // 388: datanode.api.v2.Game - (*TeamGameEntities)(nil), // 389: datanode.api.v2.TeamGameEntities - (*IndividualGameEntities)(nil), // 390: datanode.api.v2.IndividualGameEntities - (*TeamGameEntity)(nil), // 391: datanode.api.v2.TeamGameEntity - (*TeamGameParticipation)(nil), // 392: datanode.api.v2.TeamGameParticipation - (*IndividualGameEntity)(nil), // 393: datanode.api.v2.IndividualGameEntity - (*v1.PartyLockedBalance)(nil), // 394: vega.events.v1.PartyLockedBalance - (*v1.PartyVestingBalance)(nil), // 395: vega.events.v1.PartyVestingBalance - (vega.AccountType)(0), // 396: vega.AccountType - (*vega.Order)(nil), // 397: vega.Order - (vega.Order_Status)(0), // 398: vega.Order.Status - (vega.Order_Type)(0), // 399: vega.Order.Type - (vega.Order_TimeInForce)(0), // 400: vega.Order.TimeInForce - (*v1.StopOrderEvent)(nil), // 401: vega.events.v1.StopOrderEvent - (vega.StopOrder_Status)(0), // 402: vega.StopOrder.Status - (vega.StopOrder_ExpiryStrategy)(0), // 403: vega.StopOrder.ExpiryStrategy - (*vega.Position)(nil), // 404: vega.Position - (vega.TransferType)(0), // 405: vega.TransferType - (*vega.MarketDepth)(nil), // 406: vega.MarketDepth - (*vega.MarketDepthUpdate)(nil), // 407: vega.MarketDepthUpdate - (*vega.MarketData)(nil), // 408: vega.MarketData - (*vega.PriceLevel)(nil), // 409: vega.PriceLevel - (*vega.Trade)(nil), // 410: vega.Trade - (v1.Transfer_Status)(0), // 411: vega.events.v1.Transfer.Status - (*v1.Transfer)(nil), // 412: vega.events.v1.Transfer - (*v1.TransferFees)(nil), // 413: vega.events.v1.TransferFees - (*vega.NetworkLimits)(nil), // 414: vega.NetworkLimits - (*vega.Vote)(nil), // 415: vega.Vote - (*v1.ERC20MultiSigSignerAdded)(nil), // 416: vega.events.v1.ERC20MultiSigSignerAdded - (*v1.ERC20MultiSigSignerRemoved)(nil), // 417: vega.events.v1.ERC20MultiSigSignerRemoved - (*vega.OracleSpec)(nil), // 418: vega.OracleSpec - (*vega.OracleData)(nil), // 419: vega.OracleData - (*vega.Market)(nil), // 420: vega.Market - (*vega.GovernanceData)(nil), // 421: vega.GovernanceData - (*vega.Party)(nil), // 422: vega.Party - (*vega.MarginLevels)(nil), // 423: vega.MarginLevels - (*vega.Reward)(nil), // 424: vega.Reward - (*vega.RewardSummary)(nil), // 425: vega.RewardSummary - (*vega.EpochRewardSummary)(nil), // 426: vega.EpochRewardSummary - (*vega.Deposit)(nil), // 427: vega.Deposit - (*vega.Withdrawal)(nil), // 428: vega.Withdrawal - (*vega.Asset)(nil), // 429: vega.Asset - (*vega.LiquidityProvision)(nil), // 430: vega.LiquidityProvision - (*vega.LiquidityProviderFeeShare)(nil), // 431: vega.LiquidityProviderFeeShare - (*vega.LiquidityProviderSLA)(nil), // 432: vega.LiquidityProviderSLA - (*v1.PaidLiquidityFeesStats)(nil), // 433: vega.events.v1.PaidLiquidityFeesStats - (vega.Proposal_State)(0), // 434: vega.Proposal.State - (*vega.Delegation)(nil), // 435: vega.Delegation - (vega.NodeStatus)(0), // 436: vega.NodeStatus - (*vega.NodeData)(nil), // 437: vega.NodeData - (*vega.Node)(nil), // 438: vega.Node - (*v11.NodeSignature)(nil), // 439: vega.commands.v1.NodeSignature - (*vega.Epoch)(nil), // 440: vega.Epoch - (*vega.Fee)(nil), // 441: vega.Fee - (vega.Side)(0), // 442: vega.Side - (*vega.NetworkParameter)(nil), // 443: vega.NetworkParameter - (*v1.StakeLinking)(nil), // 444: vega.events.v1.StakeLinking - (*vega.RiskFactor)(nil), // 445: vega.RiskFactor - (v1.BusEventType)(0), // 446: vega.events.v1.BusEventType - (*v1.BusEvent)(nil), // 447: vega.events.v1.BusEvent - (*vega.LedgerMovement)(nil), // 448: vega.LedgerMovement - (*v1.KeyRotation)(nil), // 449: vega.events.v1.KeyRotation - (*v1.EthereumKeyRotation)(nil), // 450: vega.events.v1.EthereumKeyRotation - (v1.ProtocolUpgradeProposalStatus)(0), // 451: vega.events.v1.ProtocolUpgradeProposalStatus - (*v1.ProtocolUpgradeEvent)(nil), // 452: vega.events.v1.ProtocolUpgradeEvent - (*v1.CoreSnapshotData)(nil), // 453: vega.events.v1.CoreSnapshotData - (*vega.Account)(nil), // 454: vega.Account - (*vega.LedgerEntry)(nil), // 455: vega.LedgerEntry - (*vega.Proposal)(nil), // 456: vega.Proposal - (*v1.PartyActivityStreak)(nil), // 457: vega.events.v1.PartyActivityStreak - (*v1.FundingPeriod)(nil), // 458: vega.events.v1.FundingPeriod - (v1.FundingPeriodDataPoint_Source)(0), // 459: vega.events.v1.FundingPeriodDataPoint.Source - (*v1.FundingPeriodDataPoint)(nil), // 460: vega.events.v1.FundingPeriodDataPoint - (*vega.BenefitTier)(nil), // 461: vega.BenefitTier - (*vega.StakingTier)(nil), // 462: vega.StakingTier - (*v1.FeesStats)(nil), // 463: vega.events.v1.FeesStats - (*vega.VolumeBenefitTier)(nil), // 464: vega.VolumeBenefitTier - (*v1.TransactionResult)(nil), // 465: vega.events.v1.TransactionResult - (vega.EntityScope)(0), // 466: vega.EntityScope - (*httpbody.HttpBody)(nil), // 467: google.api.HttpBody + (*ListTeamsStatisticsRequest)(nil), // 355: datanode.api.v2.ListTeamsStatisticsRequest + (*ListTeamsStatisticsResponse)(nil), // 356: datanode.api.v2.ListTeamsStatisticsResponse + (*TeamsStatisticsConnection)(nil), // 357: datanode.api.v2.TeamsStatisticsConnection + (*TeamStatisticsEdge)(nil), // 358: datanode.api.v2.TeamStatisticsEdge + (*TeamStatistics)(nil), // 359: datanode.api.v2.TeamStatistics + (*QuantumRewardsPerEpoch)(nil), // 360: datanode.api.v2.QuantumRewardsPerEpoch + (*ListTeamRefereesRequest)(nil), // 361: datanode.api.v2.ListTeamRefereesRequest + (*TeamReferee)(nil), // 362: datanode.api.v2.TeamReferee + (*TeamRefereeEdge)(nil), // 363: datanode.api.v2.TeamRefereeEdge + (*TeamRefereeConnection)(nil), // 364: datanode.api.v2.TeamRefereeConnection + (*ListTeamRefereesResponse)(nil), // 365: datanode.api.v2.ListTeamRefereesResponse + (*TeamRefereeHistory)(nil), // 366: datanode.api.v2.TeamRefereeHistory + (*TeamRefereeHistoryEdge)(nil), // 367: datanode.api.v2.TeamRefereeHistoryEdge + (*TeamRefereeHistoryConnection)(nil), // 368: datanode.api.v2.TeamRefereeHistoryConnection + (*ListTeamRefereeHistoryRequest)(nil), // 369: datanode.api.v2.ListTeamRefereeHistoryRequest + (*ListTeamRefereeHistoryResponse)(nil), // 370: datanode.api.v2.ListTeamRefereeHistoryResponse + (*GetFeesStatsRequest)(nil), // 371: datanode.api.v2.GetFeesStatsRequest + (*GetFeesStatsResponse)(nil), // 372: datanode.api.v2.GetFeesStatsResponse + (*GetFeesStatsForPartyRequest)(nil), // 373: datanode.api.v2.GetFeesStatsForPartyRequest + (*GetFeesStatsForPartyResponse)(nil), // 374: datanode.api.v2.GetFeesStatsForPartyResponse + (*GetCurrentVolumeDiscountProgramRequest)(nil), // 375: datanode.api.v2.GetCurrentVolumeDiscountProgramRequest + (*GetCurrentVolumeDiscountProgramResponse)(nil), // 376: datanode.api.v2.GetCurrentVolumeDiscountProgramResponse + (*GetVolumeDiscountStatsRequest)(nil), // 377: datanode.api.v2.GetVolumeDiscountStatsRequest + (*GetVolumeDiscountStatsResponse)(nil), // 378: datanode.api.v2.GetVolumeDiscountStatsResponse + (*VolumeDiscountStatsConnection)(nil), // 379: datanode.api.v2.VolumeDiscountStatsConnection + (*VolumeDiscountStatsEdge)(nil), // 380: datanode.api.v2.VolumeDiscountStatsEdge + (*VolumeDiscountStats)(nil), // 381: datanode.api.v2.VolumeDiscountStats + (*VolumeDiscountProgram)(nil), // 382: datanode.api.v2.VolumeDiscountProgram + (*FeesStatsForParty)(nil), // 383: datanode.api.v2.FeesStatsForParty + (*ObserveTransactionResultsRequest)(nil), // 384: datanode.api.v2.ObserveTransactionResultsRequest + (*ObserveTransactionResultsResponse)(nil), // 385: datanode.api.v2.ObserveTransactionResultsResponse + (*EstimateTransferFeeRequest)(nil), // 386: datanode.api.v2.EstimateTransferFeeRequest + (*EstimateTransferFeeResponse)(nil), // 387: datanode.api.v2.EstimateTransferFeeResponse + (*GetTotalTransferFeeDiscountRequest)(nil), // 388: datanode.api.v2.GetTotalTransferFeeDiscountRequest + (*GetTotalTransferFeeDiscountResponse)(nil), // 389: datanode.api.v2.GetTotalTransferFeeDiscountResponse + (*ListGamesRequest)(nil), // 390: datanode.api.v2.ListGamesRequest + (*ListGamesResponse)(nil), // 391: datanode.api.v2.ListGamesResponse + (*GamesConnection)(nil), // 392: datanode.api.v2.GamesConnection + (*GameEdge)(nil), // 393: datanode.api.v2.GameEdge + (*Game)(nil), // 394: datanode.api.v2.Game + (*TeamGameEntities)(nil), // 395: datanode.api.v2.TeamGameEntities + (*IndividualGameEntities)(nil), // 396: datanode.api.v2.IndividualGameEntities + (*TeamGameEntity)(nil), // 397: datanode.api.v2.TeamGameEntity + (*TeamGameParticipation)(nil), // 398: datanode.api.v2.TeamGameParticipation + (*IndividualGameEntity)(nil), // 399: datanode.api.v2.IndividualGameEntity + (*v1.PartyLockedBalance)(nil), // 400: vega.events.v1.PartyLockedBalance + (*v1.PartyVestingBalance)(nil), // 401: vega.events.v1.PartyVestingBalance + (vega.AccountType)(0), // 402: vega.AccountType + (*vega.Order)(nil), // 403: vega.Order + (vega.Order_Status)(0), // 404: vega.Order.Status + (vega.Order_Type)(0), // 405: vega.Order.Type + (vega.Order_TimeInForce)(0), // 406: vega.Order.TimeInForce + (*v1.StopOrderEvent)(nil), // 407: vega.events.v1.StopOrderEvent + (vega.StopOrder_Status)(0), // 408: vega.StopOrder.Status + (vega.StopOrder_ExpiryStrategy)(0), // 409: vega.StopOrder.ExpiryStrategy + (*vega.Position)(nil), // 410: vega.Position + (vega.TransferType)(0), // 411: vega.TransferType + (*vega.MarketDepth)(nil), // 412: vega.MarketDepth + (*vega.MarketDepthUpdate)(nil), // 413: vega.MarketDepthUpdate + (*vega.MarketData)(nil), // 414: vega.MarketData + (*vega.PriceLevel)(nil), // 415: vega.PriceLevel + (*vega.Trade)(nil), // 416: vega.Trade + (v1.Transfer_Status)(0), // 417: vega.events.v1.Transfer.Status + (*v1.Transfer)(nil), // 418: vega.events.v1.Transfer + (*v1.TransferFees)(nil), // 419: vega.events.v1.TransferFees + (*vega.NetworkLimits)(nil), // 420: vega.NetworkLimits + (*vega.Vote)(nil), // 421: vega.Vote + (*v1.ERC20MultiSigSignerAdded)(nil), // 422: vega.events.v1.ERC20MultiSigSignerAdded + (*v1.ERC20MultiSigSignerRemoved)(nil), // 423: vega.events.v1.ERC20MultiSigSignerRemoved + (*vega.OracleSpec)(nil), // 424: vega.OracleSpec + (*vega.OracleData)(nil), // 425: vega.OracleData + (*vega.Market)(nil), // 426: vega.Market + (*vega.GovernanceData)(nil), // 427: vega.GovernanceData + (*vega.Party)(nil), // 428: vega.Party + (*vega.MarginLevels)(nil), // 429: vega.MarginLevels + (*vega.Reward)(nil), // 430: vega.Reward + (*vega.RewardSummary)(nil), // 431: vega.RewardSummary + (*vega.EpochRewardSummary)(nil), // 432: vega.EpochRewardSummary + (*vega.Deposit)(nil), // 433: vega.Deposit + (*vega.Withdrawal)(nil), // 434: vega.Withdrawal + (*vega.Asset)(nil), // 435: vega.Asset + (*vega.LiquidityProvision)(nil), // 436: vega.LiquidityProvision + (*vega.LiquidityProviderFeeShare)(nil), // 437: vega.LiquidityProviderFeeShare + (*vega.LiquidityProviderSLA)(nil), // 438: vega.LiquidityProviderSLA + (*v1.PaidLiquidityFeesStats)(nil), // 439: vega.events.v1.PaidLiquidityFeesStats + (vega.Proposal_State)(0), // 440: vega.Proposal.State + (*vega.Delegation)(nil), // 441: vega.Delegation + (vega.NodeStatus)(0), // 442: vega.NodeStatus + (*vega.NodeData)(nil), // 443: vega.NodeData + (*vega.Node)(nil), // 444: vega.Node + (*v11.NodeSignature)(nil), // 445: vega.commands.v1.NodeSignature + (*vega.Epoch)(nil), // 446: vega.Epoch + (*vega.Fee)(nil), // 447: vega.Fee + (vega.Side)(0), // 448: vega.Side + (*vega.NetworkParameter)(nil), // 449: vega.NetworkParameter + (*v1.StakeLinking)(nil), // 450: vega.events.v1.StakeLinking + (*vega.RiskFactor)(nil), // 451: vega.RiskFactor + (v1.BusEventType)(0), // 452: vega.events.v1.BusEventType + (*v1.BusEvent)(nil), // 453: vega.events.v1.BusEvent + (*vega.LedgerMovement)(nil), // 454: vega.LedgerMovement + (*v1.KeyRotation)(nil), // 455: vega.events.v1.KeyRotation + (*v1.EthereumKeyRotation)(nil), // 456: vega.events.v1.EthereumKeyRotation + (v1.ProtocolUpgradeProposalStatus)(0), // 457: vega.events.v1.ProtocolUpgradeProposalStatus + (*v1.ProtocolUpgradeEvent)(nil), // 458: vega.events.v1.ProtocolUpgradeEvent + (*v1.CoreSnapshotData)(nil), // 459: vega.events.v1.CoreSnapshotData + (*vega.Account)(nil), // 460: vega.Account + (*vega.LedgerEntry)(nil), // 461: vega.LedgerEntry + (*vega.Proposal)(nil), // 462: vega.Proposal + (*v1.PartyActivityStreak)(nil), // 463: vega.events.v1.PartyActivityStreak + (*v1.FundingPeriod)(nil), // 464: vega.events.v1.FundingPeriod + (v1.FundingPeriodDataPoint_Source)(0), // 465: vega.events.v1.FundingPeriodDataPoint.Source + (*v1.FundingPeriodDataPoint)(nil), // 466: vega.events.v1.FundingPeriodDataPoint + (*vega.BenefitTier)(nil), // 467: vega.BenefitTier + (*vega.StakingTier)(nil), // 468: vega.StakingTier + (*v1.FeesStats)(nil), // 469: vega.events.v1.FeesStats + (*vega.VolumeBenefitTier)(nil), // 470: vega.VolumeBenefitTier + (*v1.TransactionResult)(nil), // 471: vega.events.v1.TransactionResult + (vega.EntityScope)(0), // 472: vega.EntityScope + (*httpbody.HttpBody)(nil), // 473: google.api.HttpBody } var file_data_node_api_v2_trading_data_proto_depIdxs = []int32{ - 394, // 0: datanode.api.v2.GetVestingBalancesSummaryResponse.locked_balances:type_name -> vega.events.v1.PartyLockedBalance - 395, // 1: datanode.api.v2.GetVestingBalancesSummaryResponse.vesting_balances:type_name -> vega.events.v1.PartyVestingBalance - 396, // 2: datanode.api.v2.AccountBalance.type:type_name -> vega.AccountType + 400, // 0: datanode.api.v2.GetVestingBalancesSummaryResponse.locked_balances:type_name -> vega.events.v1.PartyLockedBalance + 401, // 1: datanode.api.v2.GetVestingBalancesSummaryResponse.vesting_balances:type_name -> vega.events.v1.PartyVestingBalance + 402, // 2: datanode.api.v2.AccountBalance.type:type_name -> vega.AccountType 65, // 3: datanode.api.v2.ListAccountsRequest.filter:type_name -> datanode.api.v2.AccountFilter 6, // 4: datanode.api.v2.ListAccountsRequest.pagination:type_name -> datanode.api.v2.Pagination 15, // 5: datanode.api.v2.ListAccountsResponse.accounts:type_name -> datanode.api.v2.AccountsConnection 16, // 6: datanode.api.v2.AccountsConnection.edges:type_name -> datanode.api.v2.AccountEdge 7, // 7: datanode.api.v2.AccountsConnection.page_info:type_name -> datanode.api.v2.PageInfo 12, // 8: datanode.api.v2.AccountEdge.node:type_name -> datanode.api.v2.AccountBalance - 396, // 9: datanode.api.v2.ObserveAccountsRequest.type:type_name -> vega.AccountType + 402, // 9: datanode.api.v2.ObserveAccountsRequest.type:type_name -> vega.AccountType 19, // 10: datanode.api.v2.ObserveAccountsResponse.snapshot:type_name -> datanode.api.v2.AccountSnapshotPage 20, // 11: datanode.api.v2.ObserveAccountsResponse.updates:type_name -> datanode.api.v2.AccountUpdates 12, // 12: datanode.api.v2.AccountSnapshotPage.accounts:type_name -> datanode.api.v2.AccountBalance 12, // 13: datanode.api.v2.AccountUpdates.accounts:type_name -> datanode.api.v2.AccountBalance - 397, // 14: datanode.api.v2.GetOrderResponse.order:type_name -> vega.Order - 398, // 15: datanode.api.v2.OrderFilter.statuses:type_name -> vega.Order.Status - 399, // 16: datanode.api.v2.OrderFilter.types:type_name -> vega.Order.Type - 400, // 17: datanode.api.v2.OrderFilter.time_in_forces:type_name -> vega.Order.TimeInForce + 403, // 14: datanode.api.v2.GetOrderResponse.order:type_name -> vega.Order + 404, // 15: datanode.api.v2.OrderFilter.statuses:type_name -> vega.Order.Status + 405, // 16: datanode.api.v2.OrderFilter.types:type_name -> vega.Order.Type + 406, // 17: datanode.api.v2.OrderFilter.time_in_forces:type_name -> vega.Order.TimeInForce 284, // 18: datanode.api.v2.OrderFilter.date_range:type_name -> datanode.api.v2.DateRange 6, // 19: datanode.api.v2.ListOrdersRequest.pagination:type_name -> datanode.api.v2.Pagination 25, // 20: datanode.api.v2.ListOrdersRequest.filter:type_name -> datanode.api.v2.OrderFilter @@ -28773,15 +29236,15 @@ var file_data_node_api_v2_trading_data_proto_depIdxs = []int32{ 166, // 23: datanode.api.v2.ListOrderVersionsResponse.orders:type_name -> datanode.api.v2.OrderConnection 32, // 24: datanode.api.v2.ObserveOrdersResponse.snapshot:type_name -> datanode.api.v2.OrderSnapshotPage 33, // 25: datanode.api.v2.ObserveOrdersResponse.updates:type_name -> datanode.api.v2.OrderUpdates - 397, // 26: datanode.api.v2.OrderSnapshotPage.orders:type_name -> vega.Order - 397, // 27: datanode.api.v2.OrderUpdates.orders:type_name -> vega.Order - 401, // 28: datanode.api.v2.GetStopOrderResponse.order:type_name -> vega.events.v1.StopOrderEvent + 403, // 26: datanode.api.v2.OrderSnapshotPage.orders:type_name -> vega.Order + 403, // 27: datanode.api.v2.OrderUpdates.orders:type_name -> vega.Order + 407, // 28: datanode.api.v2.GetStopOrderResponse.order:type_name -> vega.events.v1.StopOrderEvent 6, // 29: datanode.api.v2.ListStopOrdersRequest.pagination:type_name -> datanode.api.v2.Pagination 37, // 30: datanode.api.v2.ListStopOrdersRequest.filter:type_name -> datanode.api.v2.StopOrderFilter - 402, // 31: datanode.api.v2.StopOrderFilter.statuses:type_name -> vega.StopOrder.Status - 403, // 32: datanode.api.v2.StopOrderFilter.expiry_strategies:type_name -> vega.StopOrder.ExpiryStrategy + 408, // 31: datanode.api.v2.StopOrderFilter.statuses:type_name -> vega.StopOrder.Status + 409, // 32: datanode.api.v2.StopOrderFilter.expiry_strategies:type_name -> vega.StopOrder.ExpiryStrategy 284, // 33: datanode.api.v2.StopOrderFilter.date_range:type_name -> datanode.api.v2.DateRange - 401, // 34: datanode.api.v2.StopOrderEdge.node:type_name -> vega.events.v1.StopOrderEvent + 407, // 34: datanode.api.v2.StopOrderEdge.node:type_name -> vega.events.v1.StopOrderEvent 38, // 35: datanode.api.v2.StopOrderConnection.edges:type_name -> datanode.api.v2.StopOrderEdge 7, // 36: datanode.api.v2.StopOrderConnection.page_info:type_name -> datanode.api.v2.PageInfo 39, // 37: datanode.api.v2.ListStopOrdersResponse.orders:type_name -> datanode.api.v2.StopOrderConnection @@ -28790,19 +29253,19 @@ var file_data_node_api_v2_trading_data_proto_depIdxs = []int32{ 43, // 40: datanode.api.v2.ListAllPositionsRequest.filter:type_name -> datanode.api.v2.PositionsFilter 6, // 41: datanode.api.v2.ListAllPositionsRequest.pagination:type_name -> datanode.api.v2.Pagination 47, // 42: datanode.api.v2.ListAllPositionsResponse.positions:type_name -> datanode.api.v2.PositionConnection - 404, // 43: datanode.api.v2.PositionEdge.node:type_name -> vega.Position + 410, // 43: datanode.api.v2.PositionEdge.node:type_name -> vega.Position 46, // 44: datanode.api.v2.PositionConnection.edges:type_name -> datanode.api.v2.PositionEdge 7, // 45: datanode.api.v2.PositionConnection.page_info:type_name -> datanode.api.v2.PageInfo 50, // 46: datanode.api.v2.ObservePositionsResponse.snapshot:type_name -> datanode.api.v2.PositionSnapshotPage 51, // 47: datanode.api.v2.ObservePositionsResponse.updates:type_name -> datanode.api.v2.PositionUpdates - 404, // 48: datanode.api.v2.PositionSnapshotPage.positions:type_name -> vega.Position - 404, // 49: datanode.api.v2.PositionUpdates.positions:type_name -> vega.Position + 410, // 48: datanode.api.v2.PositionSnapshotPage.positions:type_name -> vega.Position + 410, // 49: datanode.api.v2.PositionUpdates.positions:type_name -> vega.Position 65, // 50: datanode.api.v2.LedgerEntryFilter.from_account_filter:type_name -> datanode.api.v2.AccountFilter 65, // 51: datanode.api.v2.LedgerEntryFilter.to_account_filter:type_name -> datanode.api.v2.AccountFilter - 405, // 52: datanode.api.v2.LedgerEntryFilter.transfer_types:type_name -> vega.TransferType - 405, // 53: datanode.api.v2.AggregatedLedgerEntry.transfer_type:type_name -> vega.TransferType - 396, // 54: datanode.api.v2.AggregatedLedgerEntry.from_account_type:type_name -> vega.AccountType - 396, // 55: datanode.api.v2.AggregatedLedgerEntry.to_account_type:type_name -> vega.AccountType + 411, // 52: datanode.api.v2.LedgerEntryFilter.transfer_types:type_name -> vega.TransferType + 411, // 53: datanode.api.v2.AggregatedLedgerEntry.transfer_type:type_name -> vega.TransferType + 402, // 54: datanode.api.v2.AggregatedLedgerEntry.from_account_type:type_name -> vega.AccountType + 402, // 55: datanode.api.v2.AggregatedLedgerEntry.to_account_type:type_name -> vega.AccountType 52, // 56: datanode.api.v2.ListLedgerEntriesRequest.filter:type_name -> datanode.api.v2.LedgerEntryFilter 6, // 57: datanode.api.v2.ListLedgerEntriesRequest.pagination:type_name -> datanode.api.v2.Pagination 284, // 58: datanode.api.v2.ListLedgerEntriesRequest.date_range:type_name -> datanode.api.v2.DateRange @@ -28823,34 +29286,34 @@ var file_data_node_api_v2_trading_data_proto_depIdxs = []int32{ 66, // 73: datanode.api.v2.AggregatedBalanceEdge.node:type_name -> datanode.api.v2.AggregatedBalance 63, // 74: datanode.api.v2.AggregatedBalanceConnection.edges:type_name -> datanode.api.v2.AggregatedBalanceEdge 7, // 75: datanode.api.v2.AggregatedBalanceConnection.page_info:type_name -> datanode.api.v2.PageInfo - 396, // 76: datanode.api.v2.AccountFilter.account_types:type_name -> vega.AccountType - 396, // 77: datanode.api.v2.AggregatedBalance.account_type:type_name -> vega.AccountType - 406, // 78: datanode.api.v2.ObserveMarketsDepthResponse.market_depth:type_name -> vega.MarketDepth - 407, // 79: datanode.api.v2.ObserveMarketsDepthUpdatesResponse.update:type_name -> vega.MarketDepthUpdate - 408, // 80: datanode.api.v2.ObserveMarketsDataResponse.market_data:type_name -> vega.MarketData - 409, // 81: datanode.api.v2.GetLatestMarketDepthResponse.buy:type_name -> vega.PriceLevel - 409, // 82: datanode.api.v2.GetLatestMarketDepthResponse.sell:type_name -> vega.PriceLevel - 410, // 83: datanode.api.v2.GetLatestMarketDepthResponse.last_trade:type_name -> vega.Trade - 408, // 84: datanode.api.v2.ListLatestMarketDataResponse.markets_data:type_name -> vega.MarketData - 408, // 85: datanode.api.v2.GetLatestMarketDataResponse.market_data:type_name -> vega.MarketData + 402, // 76: datanode.api.v2.AccountFilter.account_types:type_name -> vega.AccountType + 402, // 77: datanode.api.v2.AggregatedBalance.account_type:type_name -> vega.AccountType + 412, // 78: datanode.api.v2.ObserveMarketsDepthResponse.market_depth:type_name -> vega.MarketDepth + 413, // 79: datanode.api.v2.ObserveMarketsDepthUpdatesResponse.update:type_name -> vega.MarketDepthUpdate + 414, // 80: datanode.api.v2.ObserveMarketsDataResponse.market_data:type_name -> vega.MarketData + 415, // 81: datanode.api.v2.GetLatestMarketDepthResponse.buy:type_name -> vega.PriceLevel + 415, // 82: datanode.api.v2.GetLatestMarketDepthResponse.sell:type_name -> vega.PriceLevel + 416, // 83: datanode.api.v2.GetLatestMarketDepthResponse.last_trade:type_name -> vega.Trade + 414, // 84: datanode.api.v2.ListLatestMarketDataResponse.markets_data:type_name -> vega.MarketData + 414, // 85: datanode.api.v2.GetLatestMarketDataResponse.market_data:type_name -> vega.MarketData 6, // 86: datanode.api.v2.GetMarketDataHistoryByIDRequest.pagination:type_name -> datanode.api.v2.Pagination 82, // 87: datanode.api.v2.GetMarketDataHistoryByIDResponse.market_data:type_name -> datanode.api.v2.MarketDataConnection - 408, // 88: datanode.api.v2.MarketDataEdge.node:type_name -> vega.MarketData + 414, // 88: datanode.api.v2.MarketDataEdge.node:type_name -> vega.MarketData 81, // 89: datanode.api.v2.MarketDataConnection.edges:type_name -> datanode.api.v2.MarketDataEdge 7, // 90: datanode.api.v2.MarketDataConnection.page_info:type_name -> datanode.api.v2.PageInfo 2, // 91: datanode.api.v2.ListTransfersRequest.direction:type_name -> datanode.api.v2.TransferDirection 6, // 92: datanode.api.v2.ListTransfersRequest.pagination:type_name -> datanode.api.v2.Pagination - 411, // 93: datanode.api.v2.ListTransfersRequest.status:type_name -> vega.events.v1.Transfer.Status + 417, // 93: datanode.api.v2.ListTransfersRequest.status:type_name -> vega.events.v1.Transfer.Status 4, // 94: datanode.api.v2.ListTransfersRequest.scope:type_name -> datanode.api.v2.ListTransfersRequest.Scope 87, // 95: datanode.api.v2.ListTransfersResponse.transfers:type_name -> datanode.api.v2.TransferConnection - 412, // 96: datanode.api.v2.TransferNode.transfer:type_name -> vega.events.v1.Transfer - 413, // 97: datanode.api.v2.TransferNode.fees:type_name -> vega.events.v1.TransferFees + 418, // 96: datanode.api.v2.TransferNode.transfer:type_name -> vega.events.v1.Transfer + 419, // 97: datanode.api.v2.TransferNode.fees:type_name -> vega.events.v1.TransferFees 85, // 98: datanode.api.v2.TransferEdge.node:type_name -> datanode.api.v2.TransferNode 86, // 99: datanode.api.v2.TransferConnection.edges:type_name -> datanode.api.v2.TransferEdge 7, // 100: datanode.api.v2.TransferConnection.page_info:type_name -> datanode.api.v2.PageInfo - 412, // 101: datanode.api.v2.GetTransferResponse.transfer:type_name -> vega.events.v1.Transfer - 413, // 102: datanode.api.v2.GetTransferResponse.fees:type_name -> vega.events.v1.TransferFees - 414, // 103: datanode.api.v2.GetNetworkLimitsResponse.limits:type_name -> vega.NetworkLimits + 418, // 101: datanode.api.v2.GetTransferResponse.transfer:type_name -> vega.events.v1.Transfer + 419, // 102: datanode.api.v2.GetTransferResponse.fees:type_name -> vega.events.v1.TransferFees + 420, // 103: datanode.api.v2.GetNetworkLimitsResponse.limits:type_name -> vega.NetworkLimits 93, // 104: datanode.api.v2.ListCandleIntervalsResponse.interval_to_candle_id:type_name -> datanode.api.v2.IntervalToCandleId 95, // 105: datanode.api.v2.ObserveCandleDataResponse.candle:type_name -> datanode.api.v2.Candle 6, // 106: datanode.api.v2.ListCandleDataRequest.pagination:type_name -> datanode.api.v2.Pagination @@ -28860,165 +29323,165 @@ var file_data_node_api_v2_trading_data_proto_depIdxs = []int32{ 7, // 110: datanode.api.v2.CandleDataConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 111: datanode.api.v2.ListVotesRequest.pagination:type_name -> datanode.api.v2.Pagination 105, // 112: datanode.api.v2.ListVotesResponse.votes:type_name -> datanode.api.v2.VoteConnection - 415, // 113: datanode.api.v2.VoteEdge.node:type_name -> vega.Vote + 421, // 113: datanode.api.v2.VoteEdge.node:type_name -> vega.Vote 104, // 114: datanode.api.v2.VoteConnection.edges:type_name -> datanode.api.v2.VoteEdge 7, // 115: datanode.api.v2.VoteConnection.page_info:type_name -> datanode.api.v2.PageInfo - 415, // 116: datanode.api.v2.ObserveVotesResponse.vote:type_name -> vega.Vote + 421, // 116: datanode.api.v2.ObserveVotesResponse.vote:type_name -> vega.Vote 6, // 117: datanode.api.v2.ListERC20MultiSigSignerAddedBundlesRequest.pagination:type_name -> datanode.api.v2.Pagination 112, // 118: datanode.api.v2.ListERC20MultiSigSignerAddedBundlesResponse.bundles:type_name -> datanode.api.v2.ERC20MultiSigSignerAddedConnection - 416, // 119: datanode.api.v2.ERC20MultiSigSignerAddedEdge.node:type_name -> vega.events.v1.ERC20MultiSigSignerAdded + 422, // 119: datanode.api.v2.ERC20MultiSigSignerAddedEdge.node:type_name -> vega.events.v1.ERC20MultiSigSignerAdded 113, // 120: datanode.api.v2.ERC20MultiSigSignerAddedBundleEdge.node:type_name -> datanode.api.v2.ERC20MultiSigSignerAddedBundle 111, // 121: datanode.api.v2.ERC20MultiSigSignerAddedConnection.edges:type_name -> datanode.api.v2.ERC20MultiSigSignerAddedBundleEdge 7, // 122: datanode.api.v2.ERC20MultiSigSignerAddedConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 123: datanode.api.v2.ListERC20MultiSigSignerRemovedBundlesRequest.pagination:type_name -> datanode.api.v2.Pagination 118, // 124: datanode.api.v2.ListERC20MultiSigSignerRemovedBundlesResponse.bundles:type_name -> datanode.api.v2.ERC20MultiSigSignerRemovedConnection - 417, // 125: datanode.api.v2.ERC20MultiSigSignerRemovedEdge.node:type_name -> vega.events.v1.ERC20MultiSigSignerRemoved + 423, // 125: datanode.api.v2.ERC20MultiSigSignerRemovedEdge.node:type_name -> vega.events.v1.ERC20MultiSigSignerRemoved 119, // 126: datanode.api.v2.ERC20MultiSigSignerRemovedBundleEdge.node:type_name -> datanode.api.v2.ERC20MultiSigSignerRemovedBundle 117, // 127: datanode.api.v2.ERC20MultiSigSignerRemovedConnection.edges:type_name -> datanode.api.v2.ERC20MultiSigSignerRemovedBundleEdge 7, // 128: datanode.api.v2.ERC20MultiSigSignerRemovedConnection.page_info:type_name -> datanode.api.v2.PageInfo - 410, // 129: datanode.api.v2.GetLastTradeResponse.trade:type_name -> vega.Trade + 416, // 129: datanode.api.v2.GetLastTradeResponse.trade:type_name -> vega.Trade 6, // 130: datanode.api.v2.ListTradesRequest.pagination:type_name -> datanode.api.v2.Pagination 284, // 131: datanode.api.v2.ListTradesRequest.date_range:type_name -> datanode.api.v2.DateRange 130, // 132: datanode.api.v2.ListTradesResponse.trades:type_name -> datanode.api.v2.TradeConnection 131, // 133: datanode.api.v2.TradeConnection.edges:type_name -> datanode.api.v2.TradeEdge 7, // 134: datanode.api.v2.TradeConnection.page_info:type_name -> datanode.api.v2.PageInfo - 410, // 135: datanode.api.v2.TradeEdge.node:type_name -> vega.Trade - 410, // 136: datanode.api.v2.ObserveTradesResponse.trades:type_name -> vega.Trade - 418, // 137: datanode.api.v2.GetOracleSpecResponse.oracle_spec:type_name -> vega.OracleSpec + 416, // 135: datanode.api.v2.TradeEdge.node:type_name -> vega.Trade + 416, // 136: datanode.api.v2.ObserveTradesResponse.trades:type_name -> vega.Trade + 424, // 137: datanode.api.v2.GetOracleSpecResponse.oracle_spec:type_name -> vega.OracleSpec 6, // 138: datanode.api.v2.ListOracleSpecsRequest.pagination:type_name -> datanode.api.v2.Pagination 141, // 139: datanode.api.v2.ListOracleSpecsResponse.oracle_specs:type_name -> datanode.api.v2.OracleSpecsConnection 6, // 140: datanode.api.v2.ListOracleDataRequest.pagination:type_name -> datanode.api.v2.Pagination 143, // 141: datanode.api.v2.ListOracleDataResponse.oracle_data:type_name -> datanode.api.v2.OracleDataConnection - 418, // 142: datanode.api.v2.OracleSpecEdge.node:type_name -> vega.OracleSpec + 424, // 142: datanode.api.v2.OracleSpecEdge.node:type_name -> vega.OracleSpec 140, // 143: datanode.api.v2.OracleSpecsConnection.edges:type_name -> datanode.api.v2.OracleSpecEdge 7, // 144: datanode.api.v2.OracleSpecsConnection.page_info:type_name -> datanode.api.v2.PageInfo - 419, // 145: datanode.api.v2.OracleDataEdge.node:type_name -> vega.OracleData + 425, // 145: datanode.api.v2.OracleDataEdge.node:type_name -> vega.OracleData 142, // 146: datanode.api.v2.OracleDataConnection.edges:type_name -> datanode.api.v2.OracleDataEdge 7, // 147: datanode.api.v2.OracleDataConnection.page_info:type_name -> datanode.api.v2.PageInfo - 420, // 148: datanode.api.v2.GetMarketResponse.market:type_name -> vega.Market + 426, // 148: datanode.api.v2.GetMarketResponse.market:type_name -> vega.Market 6, // 149: datanode.api.v2.ListMarketsRequest.pagination:type_name -> datanode.api.v2.Pagination 149, // 150: datanode.api.v2.ListMarketsResponse.markets:type_name -> datanode.api.v2.MarketConnection - 420, // 151: datanode.api.v2.MarketEdge.node:type_name -> vega.Market + 426, // 151: datanode.api.v2.MarketEdge.node:type_name -> vega.Market 148, // 152: datanode.api.v2.MarketConnection.edges:type_name -> datanode.api.v2.MarketEdge 7, // 153: datanode.api.v2.MarketConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 154: datanode.api.v2.ListSuccessorMarketsRequest.pagination:type_name -> datanode.api.v2.Pagination - 420, // 155: datanode.api.v2.SuccessorMarket.market:type_name -> vega.Market - 421, // 156: datanode.api.v2.SuccessorMarket.proposals:type_name -> vega.GovernanceData + 426, // 155: datanode.api.v2.SuccessorMarket.market:type_name -> vega.Market + 427, // 156: datanode.api.v2.SuccessorMarket.proposals:type_name -> vega.GovernanceData 151, // 157: datanode.api.v2.SuccessorMarketEdge.node:type_name -> datanode.api.v2.SuccessorMarket 152, // 158: datanode.api.v2.SuccessorMarketConnection.edges:type_name -> datanode.api.v2.SuccessorMarketEdge 7, // 159: datanode.api.v2.SuccessorMarketConnection.page_info:type_name -> datanode.api.v2.PageInfo 153, // 160: datanode.api.v2.ListSuccessorMarketsResponse.successor_markets:type_name -> datanode.api.v2.SuccessorMarketConnection - 422, // 161: datanode.api.v2.GetPartyResponse.party:type_name -> vega.Party + 428, // 161: datanode.api.v2.GetPartyResponse.party:type_name -> vega.Party 6, // 162: datanode.api.v2.ListPartiesRequest.pagination:type_name -> datanode.api.v2.Pagination 160, // 163: datanode.api.v2.ListPartiesResponse.parties:type_name -> datanode.api.v2.PartyConnection - 422, // 164: datanode.api.v2.PartyEdge.node:type_name -> vega.Party + 428, // 164: datanode.api.v2.PartyEdge.node:type_name -> vega.Party 159, // 165: datanode.api.v2.PartyConnection.edges:type_name -> datanode.api.v2.PartyEdge 7, // 166: datanode.api.v2.PartyConnection.page_info:type_name -> datanode.api.v2.PageInfo - 397, // 167: datanode.api.v2.OrderEdge.node:type_name -> vega.Order + 403, // 167: datanode.api.v2.OrderEdge.node:type_name -> vega.Order 6, // 168: datanode.api.v2.ListMarginLevelsRequest.pagination:type_name -> datanode.api.v2.Pagination 168, // 169: datanode.api.v2.ListMarginLevelsResponse.margin_levels:type_name -> datanode.api.v2.MarginConnection - 423, // 170: datanode.api.v2.ObserveMarginLevelsResponse.margin_levels:type_name -> vega.MarginLevels + 429, // 170: datanode.api.v2.ObserveMarginLevelsResponse.margin_levels:type_name -> vega.MarginLevels 161, // 171: datanode.api.v2.OrderConnection.edges:type_name -> datanode.api.v2.OrderEdge 7, // 172: datanode.api.v2.OrderConnection.page_info:type_name -> datanode.api.v2.PageInfo - 423, // 173: datanode.api.v2.MarginEdge.node:type_name -> vega.MarginLevels + 429, // 173: datanode.api.v2.MarginEdge.node:type_name -> vega.MarginLevels 167, // 174: datanode.api.v2.MarginConnection.edges:type_name -> datanode.api.v2.MarginEdge 7, // 175: datanode.api.v2.MarginConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 176: datanode.api.v2.ListRewardsRequest.pagination:type_name -> datanode.api.v2.Pagination 172, // 177: datanode.api.v2.ListRewardsResponse.rewards:type_name -> datanode.api.v2.RewardsConnection - 424, // 178: datanode.api.v2.RewardEdge.node:type_name -> vega.Reward + 430, // 178: datanode.api.v2.RewardEdge.node:type_name -> vega.Reward 171, // 179: datanode.api.v2.RewardsConnection.edges:type_name -> datanode.api.v2.RewardEdge 7, // 180: datanode.api.v2.RewardsConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 181: datanode.api.v2.ListRewardSummariesRequest.pagination:type_name -> datanode.api.v2.Pagination - 425, // 182: datanode.api.v2.ListRewardSummariesResponse.summaries:type_name -> vega.RewardSummary + 431, // 182: datanode.api.v2.ListRewardSummariesResponse.summaries:type_name -> vega.RewardSummary 175, // 183: datanode.api.v2.ListEpochRewardSummariesRequest.filter:type_name -> datanode.api.v2.RewardSummaryFilter 6, // 184: datanode.api.v2.ListEpochRewardSummariesRequest.pagination:type_name -> datanode.api.v2.Pagination 178, // 185: datanode.api.v2.ListEpochRewardSummariesResponse.summaries:type_name -> datanode.api.v2.EpochRewardSummaryConnection 179, // 186: datanode.api.v2.EpochRewardSummaryConnection.edges:type_name -> datanode.api.v2.EpochRewardSummaryEdge 7, // 187: datanode.api.v2.EpochRewardSummaryConnection.page_info:type_name -> datanode.api.v2.PageInfo - 426, // 188: datanode.api.v2.EpochRewardSummaryEdge.node:type_name -> vega.EpochRewardSummary - 424, // 189: datanode.api.v2.ObserveRewardsResponse.reward:type_name -> vega.Reward - 427, // 190: datanode.api.v2.GetDepositResponse.deposit:type_name -> vega.Deposit + 432, // 188: datanode.api.v2.EpochRewardSummaryEdge.node:type_name -> vega.EpochRewardSummary + 430, // 189: datanode.api.v2.ObserveRewardsResponse.reward:type_name -> vega.Reward + 433, // 190: datanode.api.v2.GetDepositResponse.deposit:type_name -> vega.Deposit 6, // 191: datanode.api.v2.ListDepositsRequest.pagination:type_name -> datanode.api.v2.Pagination 284, // 192: datanode.api.v2.ListDepositsRequest.date_range:type_name -> datanode.api.v2.DateRange 187, // 193: datanode.api.v2.ListDepositsResponse.deposits:type_name -> datanode.api.v2.DepositsConnection - 427, // 194: datanode.api.v2.DepositEdge.node:type_name -> vega.Deposit + 433, // 194: datanode.api.v2.DepositEdge.node:type_name -> vega.Deposit 186, // 195: datanode.api.v2.DepositsConnection.edges:type_name -> datanode.api.v2.DepositEdge 7, // 196: datanode.api.v2.DepositsConnection.page_info:type_name -> datanode.api.v2.PageInfo - 428, // 197: datanode.api.v2.GetWithdrawalResponse.withdrawal:type_name -> vega.Withdrawal + 434, // 197: datanode.api.v2.GetWithdrawalResponse.withdrawal:type_name -> vega.Withdrawal 6, // 198: datanode.api.v2.ListWithdrawalsRequest.pagination:type_name -> datanode.api.v2.Pagination 284, // 199: datanode.api.v2.ListWithdrawalsRequest.date_range:type_name -> datanode.api.v2.DateRange 193, // 200: datanode.api.v2.ListWithdrawalsResponse.withdrawals:type_name -> datanode.api.v2.WithdrawalsConnection - 428, // 201: datanode.api.v2.WithdrawalEdge.node:type_name -> vega.Withdrawal + 434, // 201: datanode.api.v2.WithdrawalEdge.node:type_name -> vega.Withdrawal 192, // 202: datanode.api.v2.WithdrawalsConnection.edges:type_name -> datanode.api.v2.WithdrawalEdge 7, // 203: datanode.api.v2.WithdrawalsConnection.page_info:type_name -> datanode.api.v2.PageInfo - 429, // 204: datanode.api.v2.GetAssetResponse.asset:type_name -> vega.Asset + 435, // 204: datanode.api.v2.GetAssetResponse.asset:type_name -> vega.Asset 6, // 205: datanode.api.v2.ListAssetsRequest.pagination:type_name -> datanode.api.v2.Pagination 199, // 206: datanode.api.v2.ListAssetsResponse.assets:type_name -> datanode.api.v2.AssetsConnection - 429, // 207: datanode.api.v2.AssetEdge.node:type_name -> vega.Asset + 435, // 207: datanode.api.v2.AssetEdge.node:type_name -> vega.Asset 198, // 208: datanode.api.v2.AssetsConnection.edges:type_name -> datanode.api.v2.AssetEdge 7, // 209: datanode.api.v2.AssetsConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 210: datanode.api.v2.ListLiquidityProvisionsRequest.pagination:type_name -> datanode.api.v2.Pagination 6, // 211: datanode.api.v2.ListAllLiquidityProvisionsRequest.pagination:type_name -> datanode.api.v2.Pagination 207, // 212: datanode.api.v2.ListLiquidityProvisionsResponse.liquidity_provisions:type_name -> datanode.api.v2.LiquidityProvisionsConnection 208, // 213: datanode.api.v2.ListAllLiquidityProvisionsResponse.liquidity_provisions:type_name -> datanode.api.v2.LiquidityProvisionsWithPendingConnection - 430, // 214: datanode.api.v2.LiquidityProvision.current:type_name -> vega.LiquidityProvision - 430, // 215: datanode.api.v2.LiquidityProvision.pending:type_name -> vega.LiquidityProvision - 430, // 216: datanode.api.v2.LiquidityProvisionsEdge.node:type_name -> vega.LiquidityProvision + 436, // 214: datanode.api.v2.LiquidityProvision.current:type_name -> vega.LiquidityProvision + 436, // 215: datanode.api.v2.LiquidityProvision.pending:type_name -> vega.LiquidityProvision + 436, // 216: datanode.api.v2.LiquidityProvisionsEdge.node:type_name -> vega.LiquidityProvision 204, // 217: datanode.api.v2.LiquidityProvisionWithPendingEdge.node:type_name -> datanode.api.v2.LiquidityProvision 205, // 218: datanode.api.v2.LiquidityProvisionsConnection.edges:type_name -> datanode.api.v2.LiquidityProvisionsEdge 7, // 219: datanode.api.v2.LiquidityProvisionsConnection.page_info:type_name -> datanode.api.v2.PageInfo 206, // 220: datanode.api.v2.LiquidityProvisionsWithPendingConnection.edges:type_name -> datanode.api.v2.LiquidityProvisionWithPendingEdge 7, // 221: datanode.api.v2.LiquidityProvisionsWithPendingConnection.page_info:type_name -> datanode.api.v2.PageInfo - 430, // 222: datanode.api.v2.ObserveLiquidityProvisionsResponse.liquidity_provisions:type_name -> vega.LiquidityProvision + 436, // 222: datanode.api.v2.ObserveLiquidityProvisionsResponse.liquidity_provisions:type_name -> vega.LiquidityProvision 6, // 223: datanode.api.v2.ListLiquidityProvidersRequest.pagination:type_name -> datanode.api.v2.Pagination - 431, // 224: datanode.api.v2.LiquidityProvider.fee_share:type_name -> vega.LiquidityProviderFeeShare - 432, // 225: datanode.api.v2.LiquidityProvider.sla:type_name -> vega.LiquidityProviderSLA + 437, // 224: datanode.api.v2.LiquidityProvider.fee_share:type_name -> vega.LiquidityProviderFeeShare + 438, // 225: datanode.api.v2.LiquidityProvider.sla:type_name -> vega.LiquidityProviderSLA 212, // 226: datanode.api.v2.LiquidityProviderEdge.node:type_name -> datanode.api.v2.LiquidityProvider 213, // 227: datanode.api.v2.LiquidityProviderConnection.edges:type_name -> datanode.api.v2.LiquidityProviderEdge 7, // 228: datanode.api.v2.LiquidityProviderConnection.page_info:type_name -> datanode.api.v2.PageInfo 214, // 229: datanode.api.v2.ListLiquidityProvidersResponse.liquidity_providers:type_name -> datanode.api.v2.LiquidityProviderConnection 6, // 230: datanode.api.v2.ListPaidLiquidityFeesRequest.pagination:type_name -> datanode.api.v2.Pagination 219, // 231: datanode.api.v2.ListPaidLiquidityFeesResponse.paid_liquidity_fees:type_name -> datanode.api.v2.PaidLiquidityFeesConnection - 433, // 232: datanode.api.v2.PaidLiquidityFeesEdge.node:type_name -> vega.events.v1.PaidLiquidityFeesStats + 439, // 232: datanode.api.v2.PaidLiquidityFeesEdge.node:type_name -> vega.events.v1.PaidLiquidityFeesStats 218, // 233: datanode.api.v2.PaidLiquidityFeesConnection.edges:type_name -> datanode.api.v2.PaidLiquidityFeesEdge 7, // 234: datanode.api.v2.PaidLiquidityFeesConnection.page_info:type_name -> datanode.api.v2.PageInfo - 421, // 235: datanode.api.v2.GetGovernanceDataResponse.data:type_name -> vega.GovernanceData - 434, // 236: datanode.api.v2.ListGovernanceDataRequest.proposal_state:type_name -> vega.Proposal.State + 427, // 235: datanode.api.v2.GetGovernanceDataResponse.data:type_name -> vega.GovernanceData + 440, // 236: datanode.api.v2.ListGovernanceDataRequest.proposal_state:type_name -> vega.Proposal.State 5, // 237: datanode.api.v2.ListGovernanceDataRequest.proposal_type:type_name -> datanode.api.v2.ListGovernanceDataRequest.Type 6, // 238: datanode.api.v2.ListGovernanceDataRequest.pagination:type_name -> datanode.api.v2.Pagination 225, // 239: datanode.api.v2.ListGovernanceDataResponse.connection:type_name -> datanode.api.v2.GovernanceDataConnection - 421, // 240: datanode.api.v2.GovernanceDataEdge.node:type_name -> vega.GovernanceData + 427, // 240: datanode.api.v2.GovernanceDataEdge.node:type_name -> vega.GovernanceData 224, // 241: datanode.api.v2.GovernanceDataConnection.edges:type_name -> datanode.api.v2.GovernanceDataEdge 7, // 242: datanode.api.v2.GovernanceDataConnection.page_info:type_name -> datanode.api.v2.PageInfo - 421, // 243: datanode.api.v2.ObserveGovernanceResponse.data:type_name -> vega.GovernanceData + 427, // 243: datanode.api.v2.ObserveGovernanceResponse.data:type_name -> vega.GovernanceData 6, // 244: datanode.api.v2.ListDelegationsRequest.pagination:type_name -> datanode.api.v2.Pagination 231, // 245: datanode.api.v2.ListDelegationsResponse.delegations:type_name -> datanode.api.v2.DelegationsConnection - 435, // 246: datanode.api.v2.DelegationEdge.node:type_name -> vega.Delegation + 441, // 246: datanode.api.v2.DelegationEdge.node:type_name -> vega.Delegation 230, // 247: datanode.api.v2.DelegationsConnection.edges:type_name -> datanode.api.v2.DelegationEdge 7, // 248: datanode.api.v2.DelegationsConnection.page_info:type_name -> datanode.api.v2.PageInfo - 435, // 249: datanode.api.v2.ObserveDelegationsResponse.delegation:type_name -> vega.Delegation - 436, // 250: datanode.api.v2.NodeBasic.status:type_name -> vega.NodeStatus - 437, // 251: datanode.api.v2.GetNetworkDataResponse.node_data:type_name -> vega.NodeData - 438, // 252: datanode.api.v2.GetNodeResponse.node:type_name -> vega.Node + 441, // 249: datanode.api.v2.ObserveDelegationsResponse.delegation:type_name -> vega.Delegation + 442, // 250: datanode.api.v2.NodeBasic.status:type_name -> vega.NodeStatus + 443, // 251: datanode.api.v2.GetNetworkDataResponse.node_data:type_name -> vega.NodeData + 444, // 252: datanode.api.v2.GetNodeResponse.node:type_name -> vega.Node 6, // 253: datanode.api.v2.ListNodesRequest.pagination:type_name -> datanode.api.v2.Pagination 242, // 254: datanode.api.v2.ListNodesResponse.nodes:type_name -> datanode.api.v2.NodesConnection - 438, // 255: datanode.api.v2.NodeEdge.node:type_name -> vega.Node + 444, // 255: datanode.api.v2.NodeEdge.node:type_name -> vega.Node 241, // 256: datanode.api.v2.NodesConnection.edges:type_name -> datanode.api.v2.NodeEdge 7, // 257: datanode.api.v2.NodesConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 258: datanode.api.v2.ListNodeSignaturesRequest.pagination:type_name -> datanode.api.v2.Pagination 246, // 259: datanode.api.v2.ListNodeSignaturesResponse.signatures:type_name -> datanode.api.v2.NodeSignaturesConnection - 439, // 260: datanode.api.v2.NodeSignatureEdge.node:type_name -> vega.commands.v1.NodeSignature + 445, // 260: datanode.api.v2.NodeSignatureEdge.node:type_name -> vega.commands.v1.NodeSignature 245, // 261: datanode.api.v2.NodeSignaturesConnection.edges:type_name -> datanode.api.v2.NodeSignatureEdge 7, // 262: datanode.api.v2.NodeSignaturesConnection.page_info:type_name -> datanode.api.v2.PageInfo - 440, // 263: datanode.api.v2.GetEpochResponse.epoch:type_name -> vega.Epoch - 441, // 264: datanode.api.v2.EstimateFeeResponse.fee:type_name -> vega.Fee - 442, // 265: datanode.api.v2.EstimateMarginRequest.side:type_name -> vega.Side - 399, // 266: datanode.api.v2.EstimateMarginRequest.type:type_name -> vega.Order.Type - 423, // 267: datanode.api.v2.EstimateMarginResponse.margin_levels:type_name -> vega.MarginLevels + 446, // 263: datanode.api.v2.GetEpochResponse.epoch:type_name -> vega.Epoch + 447, // 264: datanode.api.v2.EstimateFeeResponse.fee:type_name -> vega.Fee + 448, // 265: datanode.api.v2.EstimateMarginRequest.side:type_name -> vega.Side + 405, // 266: datanode.api.v2.EstimateMarginRequest.type:type_name -> vega.Order.Type + 429, // 267: datanode.api.v2.EstimateMarginResponse.margin_levels:type_name -> vega.MarginLevels 6, // 268: datanode.api.v2.ListNetworkParametersRequest.pagination:type_name -> datanode.api.v2.Pagination 258, // 269: datanode.api.v2.ListNetworkParametersResponse.network_parameters:type_name -> datanode.api.v2.NetworkParameterConnection - 443, // 270: datanode.api.v2.GetNetworkParameterResponse.network_parameter:type_name -> vega.NetworkParameter - 443, // 271: datanode.api.v2.NetworkParameterEdge.node:type_name -> vega.NetworkParameter + 449, // 270: datanode.api.v2.GetNetworkParameterResponse.network_parameter:type_name -> vega.NetworkParameter + 449, // 271: datanode.api.v2.NetworkParameterEdge.node:type_name -> vega.NetworkParameter 257, // 272: datanode.api.v2.NetworkParameterConnection.edges:type_name -> datanode.api.v2.NetworkParameterEdge 7, // 273: datanode.api.v2.NetworkParameterConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 274: datanode.api.v2.ListCheckpointsRequest.pagination:type_name -> datanode.api.v2.Pagination @@ -29028,66 +29491,66 @@ var file_data_node_api_v2_trading_data_proto_depIdxs = []int32{ 7, // 278: datanode.api.v2.CheckpointsConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 279: datanode.api.v2.GetStakeRequest.pagination:type_name -> datanode.api.v2.Pagination 267, // 280: datanode.api.v2.GetStakeResponse.stake_linkings:type_name -> datanode.api.v2.StakesConnection - 444, // 281: datanode.api.v2.StakeLinkingEdge.node:type_name -> vega.events.v1.StakeLinking + 450, // 281: datanode.api.v2.StakeLinkingEdge.node:type_name -> vega.events.v1.StakeLinking 266, // 282: datanode.api.v2.StakesConnection.edges:type_name -> datanode.api.v2.StakeLinkingEdge 7, // 283: datanode.api.v2.StakesConnection.page_info:type_name -> datanode.api.v2.PageInfo - 445, // 284: datanode.api.v2.GetRiskFactorsResponse.risk_factor:type_name -> vega.RiskFactor - 446, // 285: datanode.api.v2.ObserveEventBusRequest.type:type_name -> vega.events.v1.BusEventType - 447, // 286: datanode.api.v2.ObserveEventBusResponse.events:type_name -> vega.events.v1.BusEvent - 448, // 287: datanode.api.v2.ObserveLedgerMovementsResponse.ledger_movement:type_name -> vega.LedgerMovement + 451, // 284: datanode.api.v2.GetRiskFactorsResponse.risk_factor:type_name -> vega.RiskFactor + 452, // 285: datanode.api.v2.ObserveEventBusRequest.type:type_name -> vega.events.v1.BusEventType + 453, // 286: datanode.api.v2.ObserveEventBusResponse.events:type_name -> vega.events.v1.BusEvent + 454, // 287: datanode.api.v2.ObserveLedgerMovementsResponse.ledger_movement:type_name -> vega.LedgerMovement 6, // 288: datanode.api.v2.ListKeyRotationsRequest.pagination:type_name -> datanode.api.v2.Pagination 277, // 289: datanode.api.v2.ListKeyRotationsResponse.rotations:type_name -> datanode.api.v2.KeyRotationConnection - 449, // 290: datanode.api.v2.KeyRotationEdge.node:type_name -> vega.events.v1.KeyRotation + 455, // 290: datanode.api.v2.KeyRotationEdge.node:type_name -> vega.events.v1.KeyRotation 276, // 291: datanode.api.v2.KeyRotationConnection.edges:type_name -> datanode.api.v2.KeyRotationEdge 7, // 292: datanode.api.v2.KeyRotationConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 293: datanode.api.v2.ListEthereumKeyRotationsRequest.pagination:type_name -> datanode.api.v2.Pagination 280, // 294: datanode.api.v2.ListEthereumKeyRotationsResponse.key_rotations:type_name -> datanode.api.v2.EthereumKeyRotationsConnection 281, // 295: datanode.api.v2.EthereumKeyRotationsConnection.edges:type_name -> datanode.api.v2.EthereumKeyRotationEdge 7, // 296: datanode.api.v2.EthereumKeyRotationsConnection.page_info:type_name -> datanode.api.v2.PageInfo - 450, // 297: datanode.api.v2.EthereumKeyRotationEdge.node:type_name -> vega.events.v1.EthereumKeyRotation - 451, // 298: datanode.api.v2.ListProtocolUpgradeProposalsRequest.status:type_name -> vega.events.v1.ProtocolUpgradeProposalStatus + 456, // 297: datanode.api.v2.EthereumKeyRotationEdge.node:type_name -> vega.events.v1.EthereumKeyRotation + 457, // 298: datanode.api.v2.ListProtocolUpgradeProposalsRequest.status:type_name -> vega.events.v1.ProtocolUpgradeProposalStatus 6, // 299: datanode.api.v2.ListProtocolUpgradeProposalsRequest.pagination:type_name -> datanode.api.v2.Pagination 289, // 300: datanode.api.v2.ListProtocolUpgradeProposalsResponse.protocol_upgrade_proposals:type_name -> datanode.api.v2.ProtocolUpgradeProposalConnection 290, // 301: datanode.api.v2.ProtocolUpgradeProposalConnection.edges:type_name -> datanode.api.v2.ProtocolUpgradeProposalEdge 7, // 302: datanode.api.v2.ProtocolUpgradeProposalConnection.page_info:type_name -> datanode.api.v2.PageInfo - 452, // 303: datanode.api.v2.ProtocolUpgradeProposalEdge.node:type_name -> vega.events.v1.ProtocolUpgradeEvent + 458, // 303: datanode.api.v2.ProtocolUpgradeProposalEdge.node:type_name -> vega.events.v1.ProtocolUpgradeEvent 6, // 304: datanode.api.v2.ListCoreSnapshotsRequest.pagination:type_name -> datanode.api.v2.Pagination 293, // 305: datanode.api.v2.ListCoreSnapshotsResponse.core_snapshots:type_name -> datanode.api.v2.CoreSnapshotConnection 294, // 306: datanode.api.v2.CoreSnapshotConnection.edges:type_name -> datanode.api.v2.CoreSnapshotEdge 7, // 307: datanode.api.v2.CoreSnapshotConnection.page_info:type_name -> datanode.api.v2.PageInfo - 453, // 308: datanode.api.v2.CoreSnapshotEdge.node:type_name -> vega.events.v1.CoreSnapshotData + 459, // 308: datanode.api.v2.CoreSnapshotEdge.node:type_name -> vega.events.v1.CoreSnapshotData 295, // 309: datanode.api.v2.GetMostRecentNetworkHistorySegmentResponse.segment:type_name -> datanode.api.v2.HistorySegment 295, // 310: datanode.api.v2.ListAllNetworkHistorySegmentsResponse.segments:type_name -> datanode.api.v2.HistorySegment 3, // 311: datanode.api.v2.ExportNetworkHistoryRequest.table:type_name -> datanode.api.v2.Table - 454, // 312: datanode.api.v2.ListEntitiesResponse.accounts:type_name -> vega.Account - 397, // 313: datanode.api.v2.ListEntitiesResponse.orders:type_name -> vega.Order - 404, // 314: datanode.api.v2.ListEntitiesResponse.positions:type_name -> vega.Position - 455, // 315: datanode.api.v2.ListEntitiesResponse.ledger_entries:type_name -> vega.LedgerEntry + 460, // 312: datanode.api.v2.ListEntitiesResponse.accounts:type_name -> vega.Account + 403, // 313: datanode.api.v2.ListEntitiesResponse.orders:type_name -> vega.Order + 410, // 314: datanode.api.v2.ListEntitiesResponse.positions:type_name -> vega.Position + 461, // 315: datanode.api.v2.ListEntitiesResponse.ledger_entries:type_name -> vega.LedgerEntry 12, // 316: datanode.api.v2.ListEntitiesResponse.balance_changes:type_name -> datanode.api.v2.AccountBalance - 412, // 317: datanode.api.v2.ListEntitiesResponse.transfers:type_name -> vega.events.v1.Transfer - 415, // 318: datanode.api.v2.ListEntitiesResponse.votes:type_name -> vega.Vote + 418, // 317: datanode.api.v2.ListEntitiesResponse.transfers:type_name -> vega.events.v1.Transfer + 421, // 318: datanode.api.v2.ListEntitiesResponse.votes:type_name -> vega.Vote 113, // 319: datanode.api.v2.ListEntitiesResponse.erc20_multi_sig_signer_added_bundles:type_name -> datanode.api.v2.ERC20MultiSigSignerAddedBundle 119, // 320: datanode.api.v2.ListEntitiesResponse.erc20_multi_sig_signer_removed_bundles:type_name -> datanode.api.v2.ERC20MultiSigSignerRemovedBundle - 410, // 321: datanode.api.v2.ListEntitiesResponse.trades:type_name -> vega.Trade - 418, // 322: datanode.api.v2.ListEntitiesResponse.oracle_specs:type_name -> vega.OracleSpec - 419, // 323: datanode.api.v2.ListEntitiesResponse.oracle_data:type_name -> vega.OracleData - 420, // 324: datanode.api.v2.ListEntitiesResponse.markets:type_name -> vega.Market - 422, // 325: datanode.api.v2.ListEntitiesResponse.parties:type_name -> vega.Party - 423, // 326: datanode.api.v2.ListEntitiesResponse.margin_levels:type_name -> vega.MarginLevels - 424, // 327: datanode.api.v2.ListEntitiesResponse.rewards:type_name -> vega.Reward - 427, // 328: datanode.api.v2.ListEntitiesResponse.deposits:type_name -> vega.Deposit - 428, // 329: datanode.api.v2.ListEntitiesResponse.withdrawals:type_name -> vega.Withdrawal - 429, // 330: datanode.api.v2.ListEntitiesResponse.assets:type_name -> vega.Asset - 430, // 331: datanode.api.v2.ListEntitiesResponse.liquidity_provisions:type_name -> vega.LiquidityProvision - 456, // 332: datanode.api.v2.ListEntitiesResponse.proposals:type_name -> vega.Proposal - 435, // 333: datanode.api.v2.ListEntitiesResponse.delegations:type_name -> vega.Delegation + 416, // 321: datanode.api.v2.ListEntitiesResponse.trades:type_name -> vega.Trade + 424, // 322: datanode.api.v2.ListEntitiesResponse.oracle_specs:type_name -> vega.OracleSpec + 425, // 323: datanode.api.v2.ListEntitiesResponse.oracle_data:type_name -> vega.OracleData + 426, // 324: datanode.api.v2.ListEntitiesResponse.markets:type_name -> vega.Market + 428, // 325: datanode.api.v2.ListEntitiesResponse.parties:type_name -> vega.Party + 429, // 326: datanode.api.v2.ListEntitiesResponse.margin_levels:type_name -> vega.MarginLevels + 430, // 327: datanode.api.v2.ListEntitiesResponse.rewards:type_name -> vega.Reward + 433, // 328: datanode.api.v2.ListEntitiesResponse.deposits:type_name -> vega.Deposit + 434, // 329: datanode.api.v2.ListEntitiesResponse.withdrawals:type_name -> vega.Withdrawal + 435, // 330: datanode.api.v2.ListEntitiesResponse.assets:type_name -> vega.Asset + 436, // 331: datanode.api.v2.ListEntitiesResponse.liquidity_provisions:type_name -> vega.LiquidityProvision + 462, // 332: datanode.api.v2.ListEntitiesResponse.proposals:type_name -> vega.Proposal + 441, // 333: datanode.api.v2.ListEntitiesResponse.delegations:type_name -> vega.Delegation 234, // 334: datanode.api.v2.ListEntitiesResponse.nodes:type_name -> datanode.api.v2.NodeBasic - 439, // 335: datanode.api.v2.ListEntitiesResponse.node_signatures:type_name -> vega.commands.v1.NodeSignature - 443, // 336: datanode.api.v2.ListEntitiesResponse.network_parameters:type_name -> vega.NetworkParameter - 449, // 337: datanode.api.v2.ListEntitiesResponse.key_rotations:type_name -> vega.events.v1.KeyRotation - 450, // 338: datanode.api.v2.ListEntitiesResponse.ethereum_key_rotations:type_name -> vega.events.v1.EthereumKeyRotation - 452, // 339: datanode.api.v2.ListEntitiesResponse.protocol_upgrade_proposals:type_name -> vega.events.v1.ProtocolUpgradeEvent - 457, // 340: datanode.api.v2.GetPartyActivityStreakResponse.activity_streak:type_name -> vega.events.v1.PartyActivityStreak + 445, // 335: datanode.api.v2.ListEntitiesResponse.node_signatures:type_name -> vega.commands.v1.NodeSignature + 449, // 336: datanode.api.v2.ListEntitiesResponse.network_parameters:type_name -> vega.NetworkParameter + 455, // 337: datanode.api.v2.ListEntitiesResponse.key_rotations:type_name -> vega.events.v1.KeyRotation + 456, // 338: datanode.api.v2.ListEntitiesResponse.ethereum_key_rotations:type_name -> vega.events.v1.EthereumKeyRotation + 458, // 339: datanode.api.v2.ListEntitiesResponse.protocol_upgrade_proposals:type_name -> vega.events.v1.ProtocolUpgradeEvent + 463, // 340: datanode.api.v2.GetPartyActivityStreakResponse.activity_streak:type_name -> vega.events.v1.PartyActivityStreak 6, // 341: datanode.api.v2.ListFundingPaymentsRequest.pagination:type_name -> datanode.api.v2.Pagination 311, // 342: datanode.api.v2.FundingPaymentEdge.node:type_name -> datanode.api.v2.FundingPayment 313, // 343: datanode.api.v2.FundingPaymentConnection.edges:type_name -> datanode.api.v2.FundingPaymentEdge @@ -29095,28 +29558,28 @@ var file_data_node_api_v2_trading_data_proto_depIdxs = []int32{ 314, // 345: datanode.api.v2.ListFundingPaymentsResponse.funding_payments:type_name -> datanode.api.v2.FundingPaymentConnection 284, // 346: datanode.api.v2.ListFundingPeriodsRequest.date_range:type_name -> datanode.api.v2.DateRange 6, // 347: datanode.api.v2.ListFundingPeriodsRequest.pagination:type_name -> datanode.api.v2.Pagination - 458, // 348: datanode.api.v2.FundingPeriodEdge.node:type_name -> vega.events.v1.FundingPeriod + 464, // 348: datanode.api.v2.FundingPeriodEdge.node:type_name -> vega.events.v1.FundingPeriod 317, // 349: datanode.api.v2.FundingPeriodConnection.edges:type_name -> datanode.api.v2.FundingPeriodEdge 7, // 350: datanode.api.v2.FundingPeriodConnection.page_info:type_name -> datanode.api.v2.PageInfo 318, // 351: datanode.api.v2.ListFundingPeriodsResponse.funding_periods:type_name -> datanode.api.v2.FundingPeriodConnection 284, // 352: datanode.api.v2.ListFundingPeriodDataPointsRequest.date_range:type_name -> datanode.api.v2.DateRange - 459, // 353: datanode.api.v2.ListFundingPeriodDataPointsRequest.source:type_name -> vega.events.v1.FundingPeriodDataPoint.Source + 465, // 353: datanode.api.v2.ListFundingPeriodDataPointsRequest.source:type_name -> vega.events.v1.FundingPeriodDataPoint.Source 6, // 354: datanode.api.v2.ListFundingPeriodDataPointsRequest.pagination:type_name -> datanode.api.v2.Pagination - 460, // 355: datanode.api.v2.FundingPeriodDataPointEdge.node:type_name -> vega.events.v1.FundingPeriodDataPoint + 466, // 355: datanode.api.v2.FundingPeriodDataPointEdge.node:type_name -> vega.events.v1.FundingPeriodDataPoint 321, // 356: datanode.api.v2.FundingPeriodDataPointConnection.edges:type_name -> datanode.api.v2.FundingPeriodDataPointEdge 7, // 357: datanode.api.v2.FundingPeriodDataPointConnection.page_info:type_name -> datanode.api.v2.PageInfo 322, // 358: datanode.api.v2.ListFundingPeriodDataPointsResponse.funding_period_data_points:type_name -> datanode.api.v2.FundingPeriodDataPointConnection - 442, // 359: datanode.api.v2.OrderInfo.side:type_name -> vega.Side + 448, // 359: datanode.api.v2.OrderInfo.side:type_name -> vega.Side 326, // 360: datanode.api.v2.EstimatePositionRequest.orders:type_name -> datanode.api.v2.OrderInfo 329, // 361: datanode.api.v2.EstimatePositionResponse.margin:type_name -> datanode.api.v2.MarginEstimate 330, // 362: datanode.api.v2.EstimatePositionResponse.liquidation:type_name -> datanode.api.v2.LiquidationEstimate - 423, // 363: datanode.api.v2.MarginEstimate.worst_case:type_name -> vega.MarginLevels - 423, // 364: datanode.api.v2.MarginEstimate.best_case:type_name -> vega.MarginLevels + 429, // 363: datanode.api.v2.MarginEstimate.worst_case:type_name -> vega.MarginLevels + 429, // 364: datanode.api.v2.MarginEstimate.best_case:type_name -> vega.MarginLevels 331, // 365: datanode.api.v2.LiquidationEstimate.worst_case:type_name -> datanode.api.v2.LiquidationPrice 331, // 366: datanode.api.v2.LiquidationEstimate.best_case:type_name -> datanode.api.v2.LiquidationPrice 334, // 367: datanode.api.v2.GetCurrentReferralProgramResponse.current_referral_program:type_name -> datanode.api.v2.ReferralProgram - 461, // 368: datanode.api.v2.ReferralProgram.benefit_tiers:type_name -> vega.BenefitTier - 462, // 369: datanode.api.v2.ReferralProgram.staking_tiers:type_name -> vega.StakingTier + 467, // 368: datanode.api.v2.ReferralProgram.benefit_tiers:type_name -> vega.BenefitTier + 468, // 369: datanode.api.v2.ReferralProgram.staking_tiers:type_name -> vega.StakingTier 335, // 370: datanode.api.v2.ReferralSetEdge.node:type_name -> datanode.api.v2.ReferralSet 336, // 371: datanode.api.v2.ReferralSetConnection.edges:type_name -> datanode.api.v2.ReferralSetEdge 7, // 372: datanode.api.v2.ReferralSetConnection.page_info:type_name -> datanode.api.v2.PageInfo @@ -29137,276 +29600,284 @@ var file_data_node_api_v2_trading_data_proto_depIdxs = []int32{ 7, // 387: datanode.api.v2.TeamConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 388: datanode.api.v2.ListTeamsRequest.pagination:type_name -> datanode.api.v2.Pagination 352, // 389: datanode.api.v2.ListTeamsResponse.teams:type_name -> datanode.api.v2.TeamConnection - 6, // 390: datanode.api.v2.ListTeamRefereesRequest.pagination:type_name -> datanode.api.v2.Pagination - 356, // 391: datanode.api.v2.TeamRefereeEdge.node:type_name -> datanode.api.v2.TeamReferee - 357, // 392: datanode.api.v2.TeamRefereeConnection.edges:type_name -> datanode.api.v2.TeamRefereeEdge - 7, // 393: datanode.api.v2.TeamRefereeConnection.page_info:type_name -> datanode.api.v2.PageInfo - 358, // 394: datanode.api.v2.ListTeamRefereesResponse.team_referees:type_name -> datanode.api.v2.TeamRefereeConnection - 360, // 395: datanode.api.v2.TeamRefereeHistoryEdge.node:type_name -> datanode.api.v2.TeamRefereeHistory - 361, // 396: datanode.api.v2.TeamRefereeHistoryConnection.edges:type_name -> datanode.api.v2.TeamRefereeHistoryEdge - 7, // 397: datanode.api.v2.TeamRefereeHistoryConnection.page_info:type_name -> datanode.api.v2.PageInfo - 6, // 398: datanode.api.v2.ListTeamRefereeHistoryRequest.pagination:type_name -> datanode.api.v2.Pagination - 362, // 399: datanode.api.v2.ListTeamRefereeHistoryResponse.team_referee_history:type_name -> datanode.api.v2.TeamRefereeHistoryConnection - 463, // 400: datanode.api.v2.GetFeesStatsResponse.fees_stats:type_name -> vega.events.v1.FeesStats - 377, // 401: datanode.api.v2.GetFeesStatsForPartyResponse.fees_stats_for_party:type_name -> datanode.api.v2.FeesStatsForParty - 376, // 402: datanode.api.v2.GetCurrentVolumeDiscountProgramResponse.current_volume_discount_program:type_name -> datanode.api.v2.VolumeDiscountProgram - 6, // 403: datanode.api.v2.GetVolumeDiscountStatsRequest.pagination:type_name -> datanode.api.v2.Pagination - 373, // 404: datanode.api.v2.GetVolumeDiscountStatsResponse.stats:type_name -> datanode.api.v2.VolumeDiscountStatsConnection - 374, // 405: datanode.api.v2.VolumeDiscountStatsConnection.edges:type_name -> datanode.api.v2.VolumeDiscountStatsEdge - 7, // 406: datanode.api.v2.VolumeDiscountStatsConnection.page_info:type_name -> datanode.api.v2.PageInfo - 375, // 407: datanode.api.v2.VolumeDiscountStatsEdge.node:type_name -> datanode.api.v2.VolumeDiscountStats - 464, // 408: datanode.api.v2.VolumeDiscountProgram.benefit_tiers:type_name -> vega.VolumeBenefitTier - 465, // 409: datanode.api.v2.ObserveTransactionResultsResponse.transaction_results:type_name -> vega.events.v1.TransactionResult - 396, // 410: datanode.api.v2.EstimateTransferFeeRequest.from_account_type:type_name -> vega.AccountType - 466, // 411: datanode.api.v2.ListGamesRequest.entity_scope:type_name -> vega.EntityScope - 6, // 412: datanode.api.v2.ListGamesRequest.pagination:type_name -> datanode.api.v2.Pagination - 386, // 413: datanode.api.v2.ListGamesResponse.games:type_name -> datanode.api.v2.GamesConnection - 387, // 414: datanode.api.v2.GamesConnection.edges:type_name -> datanode.api.v2.GameEdge - 7, // 415: datanode.api.v2.GamesConnection.page_info:type_name -> datanode.api.v2.PageInfo - 388, // 416: datanode.api.v2.GameEdge.node:type_name -> datanode.api.v2.Game - 389, // 417: datanode.api.v2.Game.team:type_name -> datanode.api.v2.TeamGameEntities - 390, // 418: datanode.api.v2.Game.individual:type_name -> datanode.api.v2.IndividualGameEntities - 391, // 419: datanode.api.v2.TeamGameEntities.team:type_name -> datanode.api.v2.TeamGameEntity - 393, // 420: datanode.api.v2.IndividualGameEntities.individual:type_name -> datanode.api.v2.IndividualGameEntity - 392, // 421: datanode.api.v2.TeamGameEntity.team:type_name -> datanode.api.v2.TeamGameParticipation - 393, // 422: datanode.api.v2.TeamGameParticipation.members_participating:type_name -> datanode.api.v2.IndividualGameEntity - 13, // 423: datanode.api.v2.TradingDataService.ListAccounts:input_type -> datanode.api.v2.ListAccountsRequest - 17, // 424: datanode.api.v2.TradingDataService.ObserveAccounts:input_type -> datanode.api.v2.ObserveAccountsRequest - 21, // 425: datanode.api.v2.TradingDataService.Info:input_type -> datanode.api.v2.InfoRequest - 23, // 426: datanode.api.v2.TradingDataService.GetOrder:input_type -> datanode.api.v2.GetOrderRequest - 26, // 427: datanode.api.v2.TradingDataService.ListOrders:input_type -> datanode.api.v2.ListOrdersRequest - 28, // 428: datanode.api.v2.TradingDataService.ListOrderVersions:input_type -> datanode.api.v2.ListOrderVersionsRequest - 30, // 429: datanode.api.v2.TradingDataService.ObserveOrders:input_type -> datanode.api.v2.ObserveOrdersRequest - 34, // 430: datanode.api.v2.TradingDataService.GetStopOrder:input_type -> datanode.api.v2.GetStopOrderRequest - 36, // 431: datanode.api.v2.TradingDataService.ListStopOrders:input_type -> datanode.api.v2.ListStopOrdersRequest - 41, // 432: datanode.api.v2.TradingDataService.ListPositions:input_type -> datanode.api.v2.ListPositionsRequest - 44, // 433: datanode.api.v2.TradingDataService.ListAllPositions:input_type -> datanode.api.v2.ListAllPositionsRequest - 48, // 434: datanode.api.v2.TradingDataService.ObservePositions:input_type -> datanode.api.v2.ObservePositionsRequest - 54, // 435: datanode.api.v2.TradingDataService.ListLedgerEntries:input_type -> datanode.api.v2.ListLedgerEntriesRequest - 55, // 436: datanode.api.v2.TradingDataService.ExportLedgerEntries:input_type -> datanode.api.v2.ExportLedgerEntriesRequest - 59, // 437: datanode.api.v2.TradingDataService.ListBalanceChanges:input_type -> datanode.api.v2.ListBalanceChangesRequest - 77, // 438: datanode.api.v2.TradingDataService.GetLatestMarketData:input_type -> datanode.api.v2.GetLatestMarketDataRequest - 75, // 439: datanode.api.v2.TradingDataService.ListLatestMarketData:input_type -> datanode.api.v2.ListLatestMarketDataRequest - 73, // 440: datanode.api.v2.TradingDataService.GetLatestMarketDepth:input_type -> datanode.api.v2.GetLatestMarketDepthRequest - 67, // 441: datanode.api.v2.TradingDataService.ObserveMarketsDepth:input_type -> datanode.api.v2.ObserveMarketsDepthRequest - 69, // 442: datanode.api.v2.TradingDataService.ObserveMarketsDepthUpdates:input_type -> datanode.api.v2.ObserveMarketsDepthUpdatesRequest - 71, // 443: datanode.api.v2.TradingDataService.ObserveMarketsData:input_type -> datanode.api.v2.ObserveMarketsDataRequest - 79, // 444: datanode.api.v2.TradingDataService.GetMarketDataHistoryByID:input_type -> datanode.api.v2.GetMarketDataHistoryByIDRequest - 83, // 445: datanode.api.v2.TradingDataService.ListTransfers:input_type -> datanode.api.v2.ListTransfersRequest - 88, // 446: datanode.api.v2.TradingDataService.GetTransfer:input_type -> datanode.api.v2.GetTransferRequest - 90, // 447: datanode.api.v2.TradingDataService.GetNetworkLimits:input_type -> datanode.api.v2.GetNetworkLimitsRequest - 98, // 448: datanode.api.v2.TradingDataService.ListCandleData:input_type -> datanode.api.v2.ListCandleDataRequest - 96, // 449: datanode.api.v2.TradingDataService.ObserveCandleData:input_type -> datanode.api.v2.ObserveCandleDataRequest - 92, // 450: datanode.api.v2.TradingDataService.ListCandleIntervals:input_type -> datanode.api.v2.ListCandleIntervalsRequest - 102, // 451: datanode.api.v2.TradingDataService.ListVotes:input_type -> datanode.api.v2.ListVotesRequest - 106, // 452: datanode.api.v2.TradingDataService.ObserveVotes:input_type -> datanode.api.v2.ObserveVotesRequest - 108, // 453: datanode.api.v2.TradingDataService.ListERC20MultiSigSignerAddedBundles:input_type -> datanode.api.v2.ListERC20MultiSigSignerAddedBundlesRequest - 114, // 454: datanode.api.v2.TradingDataService.ListERC20MultiSigSignerRemovedBundles:input_type -> datanode.api.v2.ListERC20MultiSigSignerRemovedBundlesRequest - 120, // 455: datanode.api.v2.TradingDataService.GetERC20ListAssetBundle:input_type -> datanode.api.v2.GetERC20ListAssetBundleRequest - 122, // 456: datanode.api.v2.TradingDataService.GetERC20SetAssetLimitsBundle:input_type -> datanode.api.v2.GetERC20SetAssetLimitsBundleRequest - 124, // 457: datanode.api.v2.TradingDataService.GetERC20WithdrawalApproval:input_type -> datanode.api.v2.GetERC20WithdrawalApprovalRequest - 126, // 458: datanode.api.v2.TradingDataService.GetLastTrade:input_type -> datanode.api.v2.GetLastTradeRequest - 128, // 459: datanode.api.v2.TradingDataService.ListTrades:input_type -> datanode.api.v2.ListTradesRequest - 132, // 460: datanode.api.v2.TradingDataService.ObserveTrades:input_type -> datanode.api.v2.ObserveTradesRequest - 134, // 461: datanode.api.v2.TradingDataService.GetOracleSpec:input_type -> datanode.api.v2.GetOracleSpecRequest - 136, // 462: datanode.api.v2.TradingDataService.ListOracleSpecs:input_type -> datanode.api.v2.ListOracleSpecsRequest - 138, // 463: datanode.api.v2.TradingDataService.ListOracleData:input_type -> datanode.api.v2.ListOracleDataRequest - 144, // 464: datanode.api.v2.TradingDataService.GetMarket:input_type -> datanode.api.v2.GetMarketRequest - 146, // 465: datanode.api.v2.TradingDataService.ListMarkets:input_type -> datanode.api.v2.ListMarketsRequest - 150, // 466: datanode.api.v2.TradingDataService.ListSuccessorMarkets:input_type -> datanode.api.v2.ListSuccessorMarketsRequest - 155, // 467: datanode.api.v2.TradingDataService.GetParty:input_type -> datanode.api.v2.GetPartyRequest - 157, // 468: datanode.api.v2.TradingDataService.ListParties:input_type -> datanode.api.v2.ListPartiesRequest - 162, // 469: datanode.api.v2.TradingDataService.ListMarginLevels:input_type -> datanode.api.v2.ListMarginLevelsRequest - 164, // 470: datanode.api.v2.TradingDataService.ObserveMarginLevels:input_type -> datanode.api.v2.ObserveMarginLevelsRequest - 169, // 471: datanode.api.v2.TradingDataService.ListRewards:input_type -> datanode.api.v2.ListRewardsRequest - 173, // 472: datanode.api.v2.TradingDataService.ListRewardSummaries:input_type -> datanode.api.v2.ListRewardSummariesRequest - 176, // 473: datanode.api.v2.TradingDataService.ListEpochRewardSummaries:input_type -> datanode.api.v2.ListEpochRewardSummariesRequest - 182, // 474: datanode.api.v2.TradingDataService.GetDeposit:input_type -> datanode.api.v2.GetDepositRequest - 184, // 475: datanode.api.v2.TradingDataService.ListDeposits:input_type -> datanode.api.v2.ListDepositsRequest - 188, // 476: datanode.api.v2.TradingDataService.GetWithdrawal:input_type -> datanode.api.v2.GetWithdrawalRequest - 190, // 477: datanode.api.v2.TradingDataService.ListWithdrawals:input_type -> datanode.api.v2.ListWithdrawalsRequest - 194, // 478: datanode.api.v2.TradingDataService.GetAsset:input_type -> datanode.api.v2.GetAssetRequest - 196, // 479: datanode.api.v2.TradingDataService.ListAssets:input_type -> datanode.api.v2.ListAssetsRequest - 200, // 480: datanode.api.v2.TradingDataService.ListLiquidityProvisions:input_type -> datanode.api.v2.ListLiquidityProvisionsRequest - 201, // 481: datanode.api.v2.TradingDataService.ListAllLiquidityProvisions:input_type -> datanode.api.v2.ListAllLiquidityProvisionsRequest - 209, // 482: datanode.api.v2.TradingDataService.ObserveLiquidityProvisions:input_type -> datanode.api.v2.ObserveLiquidityProvisionsRequest - 211, // 483: datanode.api.v2.TradingDataService.ListLiquidityProviders:input_type -> datanode.api.v2.ListLiquidityProvidersRequest - 216, // 484: datanode.api.v2.TradingDataService.ListPaidLiquidityFees:input_type -> datanode.api.v2.ListPaidLiquidityFeesRequest - 220, // 485: datanode.api.v2.TradingDataService.GetGovernanceData:input_type -> datanode.api.v2.GetGovernanceDataRequest - 222, // 486: datanode.api.v2.TradingDataService.ListGovernanceData:input_type -> datanode.api.v2.ListGovernanceDataRequest - 226, // 487: datanode.api.v2.TradingDataService.ObserveGovernance:input_type -> datanode.api.v2.ObserveGovernanceRequest - 228, // 488: datanode.api.v2.TradingDataService.ListDelegations:input_type -> datanode.api.v2.ListDelegationsRequest - 235, // 489: datanode.api.v2.TradingDataService.GetNetworkData:input_type -> datanode.api.v2.GetNetworkDataRequest - 237, // 490: datanode.api.v2.TradingDataService.GetNode:input_type -> datanode.api.v2.GetNodeRequest - 239, // 491: datanode.api.v2.TradingDataService.ListNodes:input_type -> datanode.api.v2.ListNodesRequest - 243, // 492: datanode.api.v2.TradingDataService.ListNodeSignatures:input_type -> datanode.api.v2.ListNodeSignaturesRequest - 247, // 493: datanode.api.v2.TradingDataService.GetEpoch:input_type -> datanode.api.v2.GetEpochRequest - 249, // 494: datanode.api.v2.TradingDataService.EstimateFee:input_type -> datanode.api.v2.EstimateFeeRequest - 251, // 495: datanode.api.v2.TradingDataService.EstimateMargin:input_type -> datanode.api.v2.EstimateMarginRequest - 327, // 496: datanode.api.v2.TradingDataService.EstimatePosition:input_type -> datanode.api.v2.EstimatePositionRequest - 253, // 497: datanode.api.v2.TradingDataService.ListNetworkParameters:input_type -> datanode.api.v2.ListNetworkParametersRequest - 255, // 498: datanode.api.v2.TradingDataService.GetNetworkParameter:input_type -> datanode.api.v2.GetNetworkParameterRequest - 260, // 499: datanode.api.v2.TradingDataService.ListCheckpoints:input_type -> datanode.api.v2.ListCheckpointsRequest - 264, // 500: datanode.api.v2.TradingDataService.GetStake:input_type -> datanode.api.v2.GetStakeRequest - 268, // 501: datanode.api.v2.TradingDataService.GetRiskFactors:input_type -> datanode.api.v2.GetRiskFactorsRequest - 270, // 502: datanode.api.v2.TradingDataService.ObserveEventBus:input_type -> datanode.api.v2.ObserveEventBusRequest - 272, // 503: datanode.api.v2.TradingDataService.ObserveLedgerMovements:input_type -> datanode.api.v2.ObserveLedgerMovementsRequest - 274, // 504: datanode.api.v2.TradingDataService.ListKeyRotations:input_type -> datanode.api.v2.ListKeyRotationsRequest - 278, // 505: datanode.api.v2.TradingDataService.ListEthereumKeyRotations:input_type -> datanode.api.v2.ListEthereumKeyRotationsRequest - 282, // 506: datanode.api.v2.TradingDataService.GetVegaTime:input_type -> datanode.api.v2.GetVegaTimeRequest - 285, // 507: datanode.api.v2.TradingDataService.GetProtocolUpgradeStatus:input_type -> datanode.api.v2.GetProtocolUpgradeStatusRequest - 287, // 508: datanode.api.v2.TradingDataService.ListProtocolUpgradeProposals:input_type -> datanode.api.v2.ListProtocolUpgradeProposalsRequest - 291, // 509: datanode.api.v2.TradingDataService.ListCoreSnapshots:input_type -> datanode.api.v2.ListCoreSnapshotsRequest - 296, // 510: datanode.api.v2.TradingDataService.GetMostRecentNetworkHistorySegment:input_type -> datanode.api.v2.GetMostRecentNetworkHistorySegmentRequest - 298, // 511: datanode.api.v2.TradingDataService.ListAllNetworkHistorySegments:input_type -> datanode.api.v2.ListAllNetworkHistorySegmentsRequest - 300, // 512: datanode.api.v2.TradingDataService.GetActiveNetworkHistoryPeerAddresses:input_type -> datanode.api.v2.GetActiveNetworkHistoryPeerAddressesRequest - 302, // 513: datanode.api.v2.TradingDataService.GetNetworkHistoryStatus:input_type -> datanode.api.v2.GetNetworkHistoryStatusRequest - 304, // 514: datanode.api.v2.TradingDataService.GetNetworkHistoryBootstrapPeers:input_type -> datanode.api.v2.GetNetworkHistoryBootstrapPeersRequest - 307, // 515: datanode.api.v2.TradingDataService.ListEntities:input_type -> datanode.api.v2.ListEntitiesRequest - 316, // 516: datanode.api.v2.TradingDataService.ListFundingPeriods:input_type -> datanode.api.v2.ListFundingPeriodsRequest - 320, // 517: datanode.api.v2.TradingDataService.ListFundingPeriodDataPoints:input_type -> datanode.api.v2.ListFundingPeriodDataPointsRequest - 312, // 518: datanode.api.v2.TradingDataService.ListFundingPayments:input_type -> datanode.api.v2.ListFundingPaymentsRequest - 309, // 519: datanode.api.v2.TradingDataService.GetPartyActivityStreak:input_type -> datanode.api.v2.GetPartyActivityStreakRequest - 332, // 520: datanode.api.v2.TradingDataService.GetCurrentReferralProgram:input_type -> datanode.api.v2.GetCurrentReferralProgramRequest - 338, // 521: datanode.api.v2.TradingDataService.ListReferralSets:input_type -> datanode.api.v2.ListReferralSetsRequest - 343, // 522: datanode.api.v2.TradingDataService.ListReferralSetReferees:input_type -> datanode.api.v2.ListReferralSetRefereesRequest - 345, // 523: datanode.api.v2.TradingDataService.GetReferralSetStats:input_type -> datanode.api.v2.GetReferralSetStatsRequest - 353, // 524: datanode.api.v2.TradingDataService.ListTeams:input_type -> datanode.api.v2.ListTeamsRequest - 355, // 525: datanode.api.v2.TradingDataService.ListTeamReferees:input_type -> datanode.api.v2.ListTeamRefereesRequest - 363, // 526: datanode.api.v2.TradingDataService.ListTeamRefereeHistory:input_type -> datanode.api.v2.ListTeamRefereeHistoryRequest - 365, // 527: datanode.api.v2.TradingDataService.GetFeesStats:input_type -> datanode.api.v2.GetFeesStatsRequest - 367, // 528: datanode.api.v2.TradingDataService.GetFeesStatsForParty:input_type -> datanode.api.v2.GetFeesStatsForPartyRequest - 369, // 529: datanode.api.v2.TradingDataService.GetCurrentVolumeDiscountProgram:input_type -> datanode.api.v2.GetCurrentVolumeDiscountProgramRequest - 371, // 530: datanode.api.v2.TradingDataService.GetVolumeDiscountStats:input_type -> datanode.api.v2.GetVolumeDiscountStatsRequest - 10, // 531: datanode.api.v2.TradingDataService.GetVestingBalancesSummary:input_type -> datanode.api.v2.GetVestingBalancesSummaryRequest - 8, // 532: datanode.api.v2.TradingDataService.GetPartyVestingStats:input_type -> datanode.api.v2.GetPartyVestingStatsRequest - 378, // 533: datanode.api.v2.TradingDataService.ObserveTransactionResults:input_type -> datanode.api.v2.ObserveTransactionResultsRequest - 380, // 534: datanode.api.v2.TradingDataService.EstimateTransferFee:input_type -> datanode.api.v2.EstimateTransferFeeRequest - 382, // 535: datanode.api.v2.TradingDataService.GetTotalTransferFeeDiscount:input_type -> datanode.api.v2.GetTotalTransferFeeDiscountRequest - 384, // 536: datanode.api.v2.TradingDataService.ListGames:input_type -> datanode.api.v2.ListGamesRequest - 306, // 537: datanode.api.v2.TradingDataService.ExportNetworkHistory:input_type -> datanode.api.v2.ExportNetworkHistoryRequest - 324, // 538: datanode.api.v2.TradingDataService.Ping:input_type -> datanode.api.v2.PingRequest - 14, // 539: datanode.api.v2.TradingDataService.ListAccounts:output_type -> datanode.api.v2.ListAccountsResponse - 18, // 540: datanode.api.v2.TradingDataService.ObserveAccounts:output_type -> datanode.api.v2.ObserveAccountsResponse - 22, // 541: datanode.api.v2.TradingDataService.Info:output_type -> datanode.api.v2.InfoResponse - 24, // 542: datanode.api.v2.TradingDataService.GetOrder:output_type -> datanode.api.v2.GetOrderResponse - 27, // 543: datanode.api.v2.TradingDataService.ListOrders:output_type -> datanode.api.v2.ListOrdersResponse - 29, // 544: datanode.api.v2.TradingDataService.ListOrderVersions:output_type -> datanode.api.v2.ListOrderVersionsResponse - 31, // 545: datanode.api.v2.TradingDataService.ObserveOrders:output_type -> datanode.api.v2.ObserveOrdersResponse - 35, // 546: datanode.api.v2.TradingDataService.GetStopOrder:output_type -> datanode.api.v2.GetStopOrderResponse - 40, // 547: datanode.api.v2.TradingDataService.ListStopOrders:output_type -> datanode.api.v2.ListStopOrdersResponse - 42, // 548: datanode.api.v2.TradingDataService.ListPositions:output_type -> datanode.api.v2.ListPositionsResponse - 45, // 549: datanode.api.v2.TradingDataService.ListAllPositions:output_type -> datanode.api.v2.ListAllPositionsResponse - 49, // 550: datanode.api.v2.TradingDataService.ObservePositions:output_type -> datanode.api.v2.ObservePositionsResponse - 56, // 551: datanode.api.v2.TradingDataService.ListLedgerEntries:output_type -> datanode.api.v2.ListLedgerEntriesResponse - 467, // 552: datanode.api.v2.TradingDataService.ExportLedgerEntries:output_type -> google.api.HttpBody - 60, // 553: datanode.api.v2.TradingDataService.ListBalanceChanges:output_type -> datanode.api.v2.ListBalanceChangesResponse - 78, // 554: datanode.api.v2.TradingDataService.GetLatestMarketData:output_type -> datanode.api.v2.GetLatestMarketDataResponse - 76, // 555: datanode.api.v2.TradingDataService.ListLatestMarketData:output_type -> datanode.api.v2.ListLatestMarketDataResponse - 74, // 556: datanode.api.v2.TradingDataService.GetLatestMarketDepth:output_type -> datanode.api.v2.GetLatestMarketDepthResponse - 68, // 557: datanode.api.v2.TradingDataService.ObserveMarketsDepth:output_type -> datanode.api.v2.ObserveMarketsDepthResponse - 70, // 558: datanode.api.v2.TradingDataService.ObserveMarketsDepthUpdates:output_type -> datanode.api.v2.ObserveMarketsDepthUpdatesResponse - 72, // 559: datanode.api.v2.TradingDataService.ObserveMarketsData:output_type -> datanode.api.v2.ObserveMarketsDataResponse - 80, // 560: datanode.api.v2.TradingDataService.GetMarketDataHistoryByID:output_type -> datanode.api.v2.GetMarketDataHistoryByIDResponse - 84, // 561: datanode.api.v2.TradingDataService.ListTransfers:output_type -> datanode.api.v2.ListTransfersResponse - 89, // 562: datanode.api.v2.TradingDataService.GetTransfer:output_type -> datanode.api.v2.GetTransferResponse - 91, // 563: datanode.api.v2.TradingDataService.GetNetworkLimits:output_type -> datanode.api.v2.GetNetworkLimitsResponse - 99, // 564: datanode.api.v2.TradingDataService.ListCandleData:output_type -> datanode.api.v2.ListCandleDataResponse - 97, // 565: datanode.api.v2.TradingDataService.ObserveCandleData:output_type -> datanode.api.v2.ObserveCandleDataResponse - 94, // 566: datanode.api.v2.TradingDataService.ListCandleIntervals:output_type -> datanode.api.v2.ListCandleIntervalsResponse - 103, // 567: datanode.api.v2.TradingDataService.ListVotes:output_type -> datanode.api.v2.ListVotesResponse - 107, // 568: datanode.api.v2.TradingDataService.ObserveVotes:output_type -> datanode.api.v2.ObserveVotesResponse - 109, // 569: datanode.api.v2.TradingDataService.ListERC20MultiSigSignerAddedBundles:output_type -> datanode.api.v2.ListERC20MultiSigSignerAddedBundlesResponse - 115, // 570: datanode.api.v2.TradingDataService.ListERC20MultiSigSignerRemovedBundles:output_type -> datanode.api.v2.ListERC20MultiSigSignerRemovedBundlesResponse - 121, // 571: datanode.api.v2.TradingDataService.GetERC20ListAssetBundle:output_type -> datanode.api.v2.GetERC20ListAssetBundleResponse - 123, // 572: datanode.api.v2.TradingDataService.GetERC20SetAssetLimitsBundle:output_type -> datanode.api.v2.GetERC20SetAssetLimitsBundleResponse - 125, // 573: datanode.api.v2.TradingDataService.GetERC20WithdrawalApproval:output_type -> datanode.api.v2.GetERC20WithdrawalApprovalResponse - 127, // 574: datanode.api.v2.TradingDataService.GetLastTrade:output_type -> datanode.api.v2.GetLastTradeResponse - 129, // 575: datanode.api.v2.TradingDataService.ListTrades:output_type -> datanode.api.v2.ListTradesResponse - 133, // 576: datanode.api.v2.TradingDataService.ObserveTrades:output_type -> datanode.api.v2.ObserveTradesResponse - 135, // 577: datanode.api.v2.TradingDataService.GetOracleSpec:output_type -> datanode.api.v2.GetOracleSpecResponse - 137, // 578: datanode.api.v2.TradingDataService.ListOracleSpecs:output_type -> datanode.api.v2.ListOracleSpecsResponse - 139, // 579: datanode.api.v2.TradingDataService.ListOracleData:output_type -> datanode.api.v2.ListOracleDataResponse - 145, // 580: datanode.api.v2.TradingDataService.GetMarket:output_type -> datanode.api.v2.GetMarketResponse - 147, // 581: datanode.api.v2.TradingDataService.ListMarkets:output_type -> datanode.api.v2.ListMarketsResponse - 154, // 582: datanode.api.v2.TradingDataService.ListSuccessorMarkets:output_type -> datanode.api.v2.ListSuccessorMarketsResponse - 156, // 583: datanode.api.v2.TradingDataService.GetParty:output_type -> datanode.api.v2.GetPartyResponse - 158, // 584: datanode.api.v2.TradingDataService.ListParties:output_type -> datanode.api.v2.ListPartiesResponse - 163, // 585: datanode.api.v2.TradingDataService.ListMarginLevels:output_type -> datanode.api.v2.ListMarginLevelsResponse - 165, // 586: datanode.api.v2.TradingDataService.ObserveMarginLevels:output_type -> datanode.api.v2.ObserveMarginLevelsResponse - 170, // 587: datanode.api.v2.TradingDataService.ListRewards:output_type -> datanode.api.v2.ListRewardsResponse - 174, // 588: datanode.api.v2.TradingDataService.ListRewardSummaries:output_type -> datanode.api.v2.ListRewardSummariesResponse - 177, // 589: datanode.api.v2.TradingDataService.ListEpochRewardSummaries:output_type -> datanode.api.v2.ListEpochRewardSummariesResponse - 183, // 590: datanode.api.v2.TradingDataService.GetDeposit:output_type -> datanode.api.v2.GetDepositResponse - 185, // 591: datanode.api.v2.TradingDataService.ListDeposits:output_type -> datanode.api.v2.ListDepositsResponse - 189, // 592: datanode.api.v2.TradingDataService.GetWithdrawal:output_type -> datanode.api.v2.GetWithdrawalResponse - 191, // 593: datanode.api.v2.TradingDataService.ListWithdrawals:output_type -> datanode.api.v2.ListWithdrawalsResponse - 195, // 594: datanode.api.v2.TradingDataService.GetAsset:output_type -> datanode.api.v2.GetAssetResponse - 197, // 595: datanode.api.v2.TradingDataService.ListAssets:output_type -> datanode.api.v2.ListAssetsResponse - 202, // 596: datanode.api.v2.TradingDataService.ListLiquidityProvisions:output_type -> datanode.api.v2.ListLiquidityProvisionsResponse - 203, // 597: datanode.api.v2.TradingDataService.ListAllLiquidityProvisions:output_type -> datanode.api.v2.ListAllLiquidityProvisionsResponse - 210, // 598: datanode.api.v2.TradingDataService.ObserveLiquidityProvisions:output_type -> datanode.api.v2.ObserveLiquidityProvisionsResponse - 215, // 599: datanode.api.v2.TradingDataService.ListLiquidityProviders:output_type -> datanode.api.v2.ListLiquidityProvidersResponse - 217, // 600: datanode.api.v2.TradingDataService.ListPaidLiquidityFees:output_type -> datanode.api.v2.ListPaidLiquidityFeesResponse - 221, // 601: datanode.api.v2.TradingDataService.GetGovernanceData:output_type -> datanode.api.v2.GetGovernanceDataResponse - 223, // 602: datanode.api.v2.TradingDataService.ListGovernanceData:output_type -> datanode.api.v2.ListGovernanceDataResponse - 227, // 603: datanode.api.v2.TradingDataService.ObserveGovernance:output_type -> datanode.api.v2.ObserveGovernanceResponse - 229, // 604: datanode.api.v2.TradingDataService.ListDelegations:output_type -> datanode.api.v2.ListDelegationsResponse - 236, // 605: datanode.api.v2.TradingDataService.GetNetworkData:output_type -> datanode.api.v2.GetNetworkDataResponse - 238, // 606: datanode.api.v2.TradingDataService.GetNode:output_type -> datanode.api.v2.GetNodeResponse - 240, // 607: datanode.api.v2.TradingDataService.ListNodes:output_type -> datanode.api.v2.ListNodesResponse - 244, // 608: datanode.api.v2.TradingDataService.ListNodeSignatures:output_type -> datanode.api.v2.ListNodeSignaturesResponse - 248, // 609: datanode.api.v2.TradingDataService.GetEpoch:output_type -> datanode.api.v2.GetEpochResponse - 250, // 610: datanode.api.v2.TradingDataService.EstimateFee:output_type -> datanode.api.v2.EstimateFeeResponse - 252, // 611: datanode.api.v2.TradingDataService.EstimateMargin:output_type -> datanode.api.v2.EstimateMarginResponse - 328, // 612: datanode.api.v2.TradingDataService.EstimatePosition:output_type -> datanode.api.v2.EstimatePositionResponse - 254, // 613: datanode.api.v2.TradingDataService.ListNetworkParameters:output_type -> datanode.api.v2.ListNetworkParametersResponse - 256, // 614: datanode.api.v2.TradingDataService.GetNetworkParameter:output_type -> datanode.api.v2.GetNetworkParameterResponse - 261, // 615: datanode.api.v2.TradingDataService.ListCheckpoints:output_type -> datanode.api.v2.ListCheckpointsResponse - 265, // 616: datanode.api.v2.TradingDataService.GetStake:output_type -> datanode.api.v2.GetStakeResponse - 269, // 617: datanode.api.v2.TradingDataService.GetRiskFactors:output_type -> datanode.api.v2.GetRiskFactorsResponse - 271, // 618: datanode.api.v2.TradingDataService.ObserveEventBus:output_type -> datanode.api.v2.ObserveEventBusResponse - 273, // 619: datanode.api.v2.TradingDataService.ObserveLedgerMovements:output_type -> datanode.api.v2.ObserveLedgerMovementsResponse - 275, // 620: datanode.api.v2.TradingDataService.ListKeyRotations:output_type -> datanode.api.v2.ListKeyRotationsResponse - 279, // 621: datanode.api.v2.TradingDataService.ListEthereumKeyRotations:output_type -> datanode.api.v2.ListEthereumKeyRotationsResponse - 283, // 622: datanode.api.v2.TradingDataService.GetVegaTime:output_type -> datanode.api.v2.GetVegaTimeResponse - 286, // 623: datanode.api.v2.TradingDataService.GetProtocolUpgradeStatus:output_type -> datanode.api.v2.GetProtocolUpgradeStatusResponse - 288, // 624: datanode.api.v2.TradingDataService.ListProtocolUpgradeProposals:output_type -> datanode.api.v2.ListProtocolUpgradeProposalsResponse - 292, // 625: datanode.api.v2.TradingDataService.ListCoreSnapshots:output_type -> datanode.api.v2.ListCoreSnapshotsResponse - 297, // 626: datanode.api.v2.TradingDataService.GetMostRecentNetworkHistorySegment:output_type -> datanode.api.v2.GetMostRecentNetworkHistorySegmentResponse - 299, // 627: datanode.api.v2.TradingDataService.ListAllNetworkHistorySegments:output_type -> datanode.api.v2.ListAllNetworkHistorySegmentsResponse - 301, // 628: datanode.api.v2.TradingDataService.GetActiveNetworkHistoryPeerAddresses:output_type -> datanode.api.v2.GetActiveNetworkHistoryPeerAddressesResponse - 303, // 629: datanode.api.v2.TradingDataService.GetNetworkHistoryStatus:output_type -> datanode.api.v2.GetNetworkHistoryStatusResponse - 305, // 630: datanode.api.v2.TradingDataService.GetNetworkHistoryBootstrapPeers:output_type -> datanode.api.v2.GetNetworkHistoryBootstrapPeersResponse - 308, // 631: datanode.api.v2.TradingDataService.ListEntities:output_type -> datanode.api.v2.ListEntitiesResponse - 319, // 632: datanode.api.v2.TradingDataService.ListFundingPeriods:output_type -> datanode.api.v2.ListFundingPeriodsResponse - 323, // 633: datanode.api.v2.TradingDataService.ListFundingPeriodDataPoints:output_type -> datanode.api.v2.ListFundingPeriodDataPointsResponse - 315, // 634: datanode.api.v2.TradingDataService.ListFundingPayments:output_type -> datanode.api.v2.ListFundingPaymentsResponse - 310, // 635: datanode.api.v2.TradingDataService.GetPartyActivityStreak:output_type -> datanode.api.v2.GetPartyActivityStreakResponse - 333, // 636: datanode.api.v2.TradingDataService.GetCurrentReferralProgram:output_type -> datanode.api.v2.GetCurrentReferralProgramResponse - 339, // 637: datanode.api.v2.TradingDataService.ListReferralSets:output_type -> datanode.api.v2.ListReferralSetsResponse - 344, // 638: datanode.api.v2.TradingDataService.ListReferralSetReferees:output_type -> datanode.api.v2.ListReferralSetRefereesResponse - 346, // 639: datanode.api.v2.TradingDataService.GetReferralSetStats:output_type -> datanode.api.v2.GetReferralSetStatsResponse - 354, // 640: datanode.api.v2.TradingDataService.ListTeams:output_type -> datanode.api.v2.ListTeamsResponse - 359, // 641: datanode.api.v2.TradingDataService.ListTeamReferees:output_type -> datanode.api.v2.ListTeamRefereesResponse - 364, // 642: datanode.api.v2.TradingDataService.ListTeamRefereeHistory:output_type -> datanode.api.v2.ListTeamRefereeHistoryResponse - 366, // 643: datanode.api.v2.TradingDataService.GetFeesStats:output_type -> datanode.api.v2.GetFeesStatsResponse - 368, // 644: datanode.api.v2.TradingDataService.GetFeesStatsForParty:output_type -> datanode.api.v2.GetFeesStatsForPartyResponse - 370, // 645: datanode.api.v2.TradingDataService.GetCurrentVolumeDiscountProgram:output_type -> datanode.api.v2.GetCurrentVolumeDiscountProgramResponse - 372, // 646: datanode.api.v2.TradingDataService.GetVolumeDiscountStats:output_type -> datanode.api.v2.GetVolumeDiscountStatsResponse - 11, // 647: datanode.api.v2.TradingDataService.GetVestingBalancesSummary:output_type -> datanode.api.v2.GetVestingBalancesSummaryResponse - 9, // 648: datanode.api.v2.TradingDataService.GetPartyVestingStats:output_type -> datanode.api.v2.GetPartyVestingStatsResponse - 379, // 649: datanode.api.v2.TradingDataService.ObserveTransactionResults:output_type -> datanode.api.v2.ObserveTransactionResultsResponse - 381, // 650: datanode.api.v2.TradingDataService.EstimateTransferFee:output_type -> datanode.api.v2.EstimateTransferFeeResponse - 383, // 651: datanode.api.v2.TradingDataService.GetTotalTransferFeeDiscount:output_type -> datanode.api.v2.GetTotalTransferFeeDiscountResponse - 385, // 652: datanode.api.v2.TradingDataService.ListGames:output_type -> datanode.api.v2.ListGamesResponse - 467, // 653: datanode.api.v2.TradingDataService.ExportNetworkHistory:output_type -> google.api.HttpBody - 325, // 654: datanode.api.v2.TradingDataService.Ping:output_type -> datanode.api.v2.PingResponse - 539, // [539:655] is the sub-list for method output_type - 423, // [423:539] is the sub-list for method input_type - 423, // [423:423] is the sub-list for extension type_name - 423, // [423:423] is the sub-list for extension extendee - 0, // [0:423] is the sub-list for field type_name + 6, // 390: datanode.api.v2.ListTeamsStatisticsRequest.pagination:type_name -> datanode.api.v2.Pagination + 357, // 391: datanode.api.v2.ListTeamsStatisticsResponse.statistics:type_name -> datanode.api.v2.TeamsStatisticsConnection + 358, // 392: datanode.api.v2.TeamsStatisticsConnection.edges:type_name -> datanode.api.v2.TeamStatisticsEdge + 7, // 393: datanode.api.v2.TeamsStatisticsConnection.page_info:type_name -> datanode.api.v2.PageInfo + 359, // 394: datanode.api.v2.TeamStatisticsEdge.node:type_name -> datanode.api.v2.TeamStatistics + 360, // 395: datanode.api.v2.TeamStatistics.quantum_rewards:type_name -> datanode.api.v2.QuantumRewardsPerEpoch + 6, // 396: datanode.api.v2.ListTeamRefereesRequest.pagination:type_name -> datanode.api.v2.Pagination + 362, // 397: datanode.api.v2.TeamRefereeEdge.node:type_name -> datanode.api.v2.TeamReferee + 363, // 398: datanode.api.v2.TeamRefereeConnection.edges:type_name -> datanode.api.v2.TeamRefereeEdge + 7, // 399: datanode.api.v2.TeamRefereeConnection.page_info:type_name -> datanode.api.v2.PageInfo + 364, // 400: datanode.api.v2.ListTeamRefereesResponse.team_referees:type_name -> datanode.api.v2.TeamRefereeConnection + 366, // 401: datanode.api.v2.TeamRefereeHistoryEdge.node:type_name -> datanode.api.v2.TeamRefereeHistory + 367, // 402: datanode.api.v2.TeamRefereeHistoryConnection.edges:type_name -> datanode.api.v2.TeamRefereeHistoryEdge + 7, // 403: datanode.api.v2.TeamRefereeHistoryConnection.page_info:type_name -> datanode.api.v2.PageInfo + 6, // 404: datanode.api.v2.ListTeamRefereeHistoryRequest.pagination:type_name -> datanode.api.v2.Pagination + 368, // 405: datanode.api.v2.ListTeamRefereeHistoryResponse.team_referee_history:type_name -> datanode.api.v2.TeamRefereeHistoryConnection + 469, // 406: datanode.api.v2.GetFeesStatsResponse.fees_stats:type_name -> vega.events.v1.FeesStats + 383, // 407: datanode.api.v2.GetFeesStatsForPartyResponse.fees_stats_for_party:type_name -> datanode.api.v2.FeesStatsForParty + 382, // 408: datanode.api.v2.GetCurrentVolumeDiscountProgramResponse.current_volume_discount_program:type_name -> datanode.api.v2.VolumeDiscountProgram + 6, // 409: datanode.api.v2.GetVolumeDiscountStatsRequest.pagination:type_name -> datanode.api.v2.Pagination + 379, // 410: datanode.api.v2.GetVolumeDiscountStatsResponse.stats:type_name -> datanode.api.v2.VolumeDiscountStatsConnection + 380, // 411: datanode.api.v2.VolumeDiscountStatsConnection.edges:type_name -> datanode.api.v2.VolumeDiscountStatsEdge + 7, // 412: datanode.api.v2.VolumeDiscountStatsConnection.page_info:type_name -> datanode.api.v2.PageInfo + 381, // 413: datanode.api.v2.VolumeDiscountStatsEdge.node:type_name -> datanode.api.v2.VolumeDiscountStats + 470, // 414: datanode.api.v2.VolumeDiscountProgram.benefit_tiers:type_name -> vega.VolumeBenefitTier + 471, // 415: datanode.api.v2.ObserveTransactionResultsResponse.transaction_results:type_name -> vega.events.v1.TransactionResult + 402, // 416: datanode.api.v2.EstimateTransferFeeRequest.from_account_type:type_name -> vega.AccountType + 472, // 417: datanode.api.v2.ListGamesRequest.entity_scope:type_name -> vega.EntityScope + 6, // 418: datanode.api.v2.ListGamesRequest.pagination:type_name -> datanode.api.v2.Pagination + 392, // 419: datanode.api.v2.ListGamesResponse.games:type_name -> datanode.api.v2.GamesConnection + 393, // 420: datanode.api.v2.GamesConnection.edges:type_name -> datanode.api.v2.GameEdge + 7, // 421: datanode.api.v2.GamesConnection.page_info:type_name -> datanode.api.v2.PageInfo + 394, // 422: datanode.api.v2.GameEdge.node:type_name -> datanode.api.v2.Game + 395, // 423: datanode.api.v2.Game.team:type_name -> datanode.api.v2.TeamGameEntities + 396, // 424: datanode.api.v2.Game.individual:type_name -> datanode.api.v2.IndividualGameEntities + 397, // 425: datanode.api.v2.TeamGameEntities.team:type_name -> datanode.api.v2.TeamGameEntity + 399, // 426: datanode.api.v2.IndividualGameEntities.individual:type_name -> datanode.api.v2.IndividualGameEntity + 398, // 427: datanode.api.v2.TeamGameEntity.team:type_name -> datanode.api.v2.TeamGameParticipation + 399, // 428: datanode.api.v2.TeamGameParticipation.members_participating:type_name -> datanode.api.v2.IndividualGameEntity + 13, // 429: datanode.api.v2.TradingDataService.ListAccounts:input_type -> datanode.api.v2.ListAccountsRequest + 17, // 430: datanode.api.v2.TradingDataService.ObserveAccounts:input_type -> datanode.api.v2.ObserveAccountsRequest + 21, // 431: datanode.api.v2.TradingDataService.Info:input_type -> datanode.api.v2.InfoRequest + 23, // 432: datanode.api.v2.TradingDataService.GetOrder:input_type -> datanode.api.v2.GetOrderRequest + 26, // 433: datanode.api.v2.TradingDataService.ListOrders:input_type -> datanode.api.v2.ListOrdersRequest + 28, // 434: datanode.api.v2.TradingDataService.ListOrderVersions:input_type -> datanode.api.v2.ListOrderVersionsRequest + 30, // 435: datanode.api.v2.TradingDataService.ObserveOrders:input_type -> datanode.api.v2.ObserveOrdersRequest + 34, // 436: datanode.api.v2.TradingDataService.GetStopOrder:input_type -> datanode.api.v2.GetStopOrderRequest + 36, // 437: datanode.api.v2.TradingDataService.ListStopOrders:input_type -> datanode.api.v2.ListStopOrdersRequest + 41, // 438: datanode.api.v2.TradingDataService.ListPositions:input_type -> datanode.api.v2.ListPositionsRequest + 44, // 439: datanode.api.v2.TradingDataService.ListAllPositions:input_type -> datanode.api.v2.ListAllPositionsRequest + 48, // 440: datanode.api.v2.TradingDataService.ObservePositions:input_type -> datanode.api.v2.ObservePositionsRequest + 54, // 441: datanode.api.v2.TradingDataService.ListLedgerEntries:input_type -> datanode.api.v2.ListLedgerEntriesRequest + 55, // 442: datanode.api.v2.TradingDataService.ExportLedgerEntries:input_type -> datanode.api.v2.ExportLedgerEntriesRequest + 59, // 443: datanode.api.v2.TradingDataService.ListBalanceChanges:input_type -> datanode.api.v2.ListBalanceChangesRequest + 77, // 444: datanode.api.v2.TradingDataService.GetLatestMarketData:input_type -> datanode.api.v2.GetLatestMarketDataRequest + 75, // 445: datanode.api.v2.TradingDataService.ListLatestMarketData:input_type -> datanode.api.v2.ListLatestMarketDataRequest + 73, // 446: datanode.api.v2.TradingDataService.GetLatestMarketDepth:input_type -> datanode.api.v2.GetLatestMarketDepthRequest + 67, // 447: datanode.api.v2.TradingDataService.ObserveMarketsDepth:input_type -> datanode.api.v2.ObserveMarketsDepthRequest + 69, // 448: datanode.api.v2.TradingDataService.ObserveMarketsDepthUpdates:input_type -> datanode.api.v2.ObserveMarketsDepthUpdatesRequest + 71, // 449: datanode.api.v2.TradingDataService.ObserveMarketsData:input_type -> datanode.api.v2.ObserveMarketsDataRequest + 79, // 450: datanode.api.v2.TradingDataService.GetMarketDataHistoryByID:input_type -> datanode.api.v2.GetMarketDataHistoryByIDRequest + 83, // 451: datanode.api.v2.TradingDataService.ListTransfers:input_type -> datanode.api.v2.ListTransfersRequest + 88, // 452: datanode.api.v2.TradingDataService.GetTransfer:input_type -> datanode.api.v2.GetTransferRequest + 90, // 453: datanode.api.v2.TradingDataService.GetNetworkLimits:input_type -> datanode.api.v2.GetNetworkLimitsRequest + 98, // 454: datanode.api.v2.TradingDataService.ListCandleData:input_type -> datanode.api.v2.ListCandleDataRequest + 96, // 455: datanode.api.v2.TradingDataService.ObserveCandleData:input_type -> datanode.api.v2.ObserveCandleDataRequest + 92, // 456: datanode.api.v2.TradingDataService.ListCandleIntervals:input_type -> datanode.api.v2.ListCandleIntervalsRequest + 102, // 457: datanode.api.v2.TradingDataService.ListVotes:input_type -> datanode.api.v2.ListVotesRequest + 106, // 458: datanode.api.v2.TradingDataService.ObserveVotes:input_type -> datanode.api.v2.ObserveVotesRequest + 108, // 459: datanode.api.v2.TradingDataService.ListERC20MultiSigSignerAddedBundles:input_type -> datanode.api.v2.ListERC20MultiSigSignerAddedBundlesRequest + 114, // 460: datanode.api.v2.TradingDataService.ListERC20MultiSigSignerRemovedBundles:input_type -> datanode.api.v2.ListERC20MultiSigSignerRemovedBundlesRequest + 120, // 461: datanode.api.v2.TradingDataService.GetERC20ListAssetBundle:input_type -> datanode.api.v2.GetERC20ListAssetBundleRequest + 122, // 462: datanode.api.v2.TradingDataService.GetERC20SetAssetLimitsBundle:input_type -> datanode.api.v2.GetERC20SetAssetLimitsBundleRequest + 124, // 463: datanode.api.v2.TradingDataService.GetERC20WithdrawalApproval:input_type -> datanode.api.v2.GetERC20WithdrawalApprovalRequest + 126, // 464: datanode.api.v2.TradingDataService.GetLastTrade:input_type -> datanode.api.v2.GetLastTradeRequest + 128, // 465: datanode.api.v2.TradingDataService.ListTrades:input_type -> datanode.api.v2.ListTradesRequest + 132, // 466: datanode.api.v2.TradingDataService.ObserveTrades:input_type -> datanode.api.v2.ObserveTradesRequest + 134, // 467: datanode.api.v2.TradingDataService.GetOracleSpec:input_type -> datanode.api.v2.GetOracleSpecRequest + 136, // 468: datanode.api.v2.TradingDataService.ListOracleSpecs:input_type -> datanode.api.v2.ListOracleSpecsRequest + 138, // 469: datanode.api.v2.TradingDataService.ListOracleData:input_type -> datanode.api.v2.ListOracleDataRequest + 144, // 470: datanode.api.v2.TradingDataService.GetMarket:input_type -> datanode.api.v2.GetMarketRequest + 146, // 471: datanode.api.v2.TradingDataService.ListMarkets:input_type -> datanode.api.v2.ListMarketsRequest + 150, // 472: datanode.api.v2.TradingDataService.ListSuccessorMarkets:input_type -> datanode.api.v2.ListSuccessorMarketsRequest + 155, // 473: datanode.api.v2.TradingDataService.GetParty:input_type -> datanode.api.v2.GetPartyRequest + 157, // 474: datanode.api.v2.TradingDataService.ListParties:input_type -> datanode.api.v2.ListPartiesRequest + 162, // 475: datanode.api.v2.TradingDataService.ListMarginLevels:input_type -> datanode.api.v2.ListMarginLevelsRequest + 164, // 476: datanode.api.v2.TradingDataService.ObserveMarginLevels:input_type -> datanode.api.v2.ObserveMarginLevelsRequest + 169, // 477: datanode.api.v2.TradingDataService.ListRewards:input_type -> datanode.api.v2.ListRewardsRequest + 173, // 478: datanode.api.v2.TradingDataService.ListRewardSummaries:input_type -> datanode.api.v2.ListRewardSummariesRequest + 176, // 479: datanode.api.v2.TradingDataService.ListEpochRewardSummaries:input_type -> datanode.api.v2.ListEpochRewardSummariesRequest + 182, // 480: datanode.api.v2.TradingDataService.GetDeposit:input_type -> datanode.api.v2.GetDepositRequest + 184, // 481: datanode.api.v2.TradingDataService.ListDeposits:input_type -> datanode.api.v2.ListDepositsRequest + 188, // 482: datanode.api.v2.TradingDataService.GetWithdrawal:input_type -> datanode.api.v2.GetWithdrawalRequest + 190, // 483: datanode.api.v2.TradingDataService.ListWithdrawals:input_type -> datanode.api.v2.ListWithdrawalsRequest + 194, // 484: datanode.api.v2.TradingDataService.GetAsset:input_type -> datanode.api.v2.GetAssetRequest + 196, // 485: datanode.api.v2.TradingDataService.ListAssets:input_type -> datanode.api.v2.ListAssetsRequest + 200, // 486: datanode.api.v2.TradingDataService.ListLiquidityProvisions:input_type -> datanode.api.v2.ListLiquidityProvisionsRequest + 201, // 487: datanode.api.v2.TradingDataService.ListAllLiquidityProvisions:input_type -> datanode.api.v2.ListAllLiquidityProvisionsRequest + 209, // 488: datanode.api.v2.TradingDataService.ObserveLiquidityProvisions:input_type -> datanode.api.v2.ObserveLiquidityProvisionsRequest + 211, // 489: datanode.api.v2.TradingDataService.ListLiquidityProviders:input_type -> datanode.api.v2.ListLiquidityProvidersRequest + 216, // 490: datanode.api.v2.TradingDataService.ListPaidLiquidityFees:input_type -> datanode.api.v2.ListPaidLiquidityFeesRequest + 220, // 491: datanode.api.v2.TradingDataService.GetGovernanceData:input_type -> datanode.api.v2.GetGovernanceDataRequest + 222, // 492: datanode.api.v2.TradingDataService.ListGovernanceData:input_type -> datanode.api.v2.ListGovernanceDataRequest + 226, // 493: datanode.api.v2.TradingDataService.ObserveGovernance:input_type -> datanode.api.v2.ObserveGovernanceRequest + 228, // 494: datanode.api.v2.TradingDataService.ListDelegations:input_type -> datanode.api.v2.ListDelegationsRequest + 235, // 495: datanode.api.v2.TradingDataService.GetNetworkData:input_type -> datanode.api.v2.GetNetworkDataRequest + 237, // 496: datanode.api.v2.TradingDataService.GetNode:input_type -> datanode.api.v2.GetNodeRequest + 239, // 497: datanode.api.v2.TradingDataService.ListNodes:input_type -> datanode.api.v2.ListNodesRequest + 243, // 498: datanode.api.v2.TradingDataService.ListNodeSignatures:input_type -> datanode.api.v2.ListNodeSignaturesRequest + 247, // 499: datanode.api.v2.TradingDataService.GetEpoch:input_type -> datanode.api.v2.GetEpochRequest + 249, // 500: datanode.api.v2.TradingDataService.EstimateFee:input_type -> datanode.api.v2.EstimateFeeRequest + 251, // 501: datanode.api.v2.TradingDataService.EstimateMargin:input_type -> datanode.api.v2.EstimateMarginRequest + 327, // 502: datanode.api.v2.TradingDataService.EstimatePosition:input_type -> datanode.api.v2.EstimatePositionRequest + 253, // 503: datanode.api.v2.TradingDataService.ListNetworkParameters:input_type -> datanode.api.v2.ListNetworkParametersRequest + 255, // 504: datanode.api.v2.TradingDataService.GetNetworkParameter:input_type -> datanode.api.v2.GetNetworkParameterRequest + 260, // 505: datanode.api.v2.TradingDataService.ListCheckpoints:input_type -> datanode.api.v2.ListCheckpointsRequest + 264, // 506: datanode.api.v2.TradingDataService.GetStake:input_type -> datanode.api.v2.GetStakeRequest + 268, // 507: datanode.api.v2.TradingDataService.GetRiskFactors:input_type -> datanode.api.v2.GetRiskFactorsRequest + 270, // 508: datanode.api.v2.TradingDataService.ObserveEventBus:input_type -> datanode.api.v2.ObserveEventBusRequest + 272, // 509: datanode.api.v2.TradingDataService.ObserveLedgerMovements:input_type -> datanode.api.v2.ObserveLedgerMovementsRequest + 274, // 510: datanode.api.v2.TradingDataService.ListKeyRotations:input_type -> datanode.api.v2.ListKeyRotationsRequest + 278, // 511: datanode.api.v2.TradingDataService.ListEthereumKeyRotations:input_type -> datanode.api.v2.ListEthereumKeyRotationsRequest + 282, // 512: datanode.api.v2.TradingDataService.GetVegaTime:input_type -> datanode.api.v2.GetVegaTimeRequest + 285, // 513: datanode.api.v2.TradingDataService.GetProtocolUpgradeStatus:input_type -> datanode.api.v2.GetProtocolUpgradeStatusRequest + 287, // 514: datanode.api.v2.TradingDataService.ListProtocolUpgradeProposals:input_type -> datanode.api.v2.ListProtocolUpgradeProposalsRequest + 291, // 515: datanode.api.v2.TradingDataService.ListCoreSnapshots:input_type -> datanode.api.v2.ListCoreSnapshotsRequest + 296, // 516: datanode.api.v2.TradingDataService.GetMostRecentNetworkHistorySegment:input_type -> datanode.api.v2.GetMostRecentNetworkHistorySegmentRequest + 298, // 517: datanode.api.v2.TradingDataService.ListAllNetworkHistorySegments:input_type -> datanode.api.v2.ListAllNetworkHistorySegmentsRequest + 300, // 518: datanode.api.v2.TradingDataService.GetActiveNetworkHistoryPeerAddresses:input_type -> datanode.api.v2.GetActiveNetworkHistoryPeerAddressesRequest + 302, // 519: datanode.api.v2.TradingDataService.GetNetworkHistoryStatus:input_type -> datanode.api.v2.GetNetworkHistoryStatusRequest + 304, // 520: datanode.api.v2.TradingDataService.GetNetworkHistoryBootstrapPeers:input_type -> datanode.api.v2.GetNetworkHistoryBootstrapPeersRequest + 307, // 521: datanode.api.v2.TradingDataService.ListEntities:input_type -> datanode.api.v2.ListEntitiesRequest + 316, // 522: datanode.api.v2.TradingDataService.ListFundingPeriods:input_type -> datanode.api.v2.ListFundingPeriodsRequest + 320, // 523: datanode.api.v2.TradingDataService.ListFundingPeriodDataPoints:input_type -> datanode.api.v2.ListFundingPeriodDataPointsRequest + 312, // 524: datanode.api.v2.TradingDataService.ListFundingPayments:input_type -> datanode.api.v2.ListFundingPaymentsRequest + 309, // 525: datanode.api.v2.TradingDataService.GetPartyActivityStreak:input_type -> datanode.api.v2.GetPartyActivityStreakRequest + 332, // 526: datanode.api.v2.TradingDataService.GetCurrentReferralProgram:input_type -> datanode.api.v2.GetCurrentReferralProgramRequest + 338, // 527: datanode.api.v2.TradingDataService.ListReferralSets:input_type -> datanode.api.v2.ListReferralSetsRequest + 343, // 528: datanode.api.v2.TradingDataService.ListReferralSetReferees:input_type -> datanode.api.v2.ListReferralSetRefereesRequest + 345, // 529: datanode.api.v2.TradingDataService.GetReferralSetStats:input_type -> datanode.api.v2.GetReferralSetStatsRequest + 353, // 530: datanode.api.v2.TradingDataService.ListTeams:input_type -> datanode.api.v2.ListTeamsRequest + 355, // 531: datanode.api.v2.TradingDataService.ListTeamsStatistics:input_type -> datanode.api.v2.ListTeamsStatisticsRequest + 361, // 532: datanode.api.v2.TradingDataService.ListTeamReferees:input_type -> datanode.api.v2.ListTeamRefereesRequest + 369, // 533: datanode.api.v2.TradingDataService.ListTeamRefereeHistory:input_type -> datanode.api.v2.ListTeamRefereeHistoryRequest + 371, // 534: datanode.api.v2.TradingDataService.GetFeesStats:input_type -> datanode.api.v2.GetFeesStatsRequest + 373, // 535: datanode.api.v2.TradingDataService.GetFeesStatsForParty:input_type -> datanode.api.v2.GetFeesStatsForPartyRequest + 375, // 536: datanode.api.v2.TradingDataService.GetCurrentVolumeDiscountProgram:input_type -> datanode.api.v2.GetCurrentVolumeDiscountProgramRequest + 377, // 537: datanode.api.v2.TradingDataService.GetVolumeDiscountStats:input_type -> datanode.api.v2.GetVolumeDiscountStatsRequest + 10, // 538: datanode.api.v2.TradingDataService.GetVestingBalancesSummary:input_type -> datanode.api.v2.GetVestingBalancesSummaryRequest + 8, // 539: datanode.api.v2.TradingDataService.GetPartyVestingStats:input_type -> datanode.api.v2.GetPartyVestingStatsRequest + 384, // 540: datanode.api.v2.TradingDataService.ObserveTransactionResults:input_type -> datanode.api.v2.ObserveTransactionResultsRequest + 386, // 541: datanode.api.v2.TradingDataService.EstimateTransferFee:input_type -> datanode.api.v2.EstimateTransferFeeRequest + 388, // 542: datanode.api.v2.TradingDataService.GetTotalTransferFeeDiscount:input_type -> datanode.api.v2.GetTotalTransferFeeDiscountRequest + 390, // 543: datanode.api.v2.TradingDataService.ListGames:input_type -> datanode.api.v2.ListGamesRequest + 306, // 544: datanode.api.v2.TradingDataService.ExportNetworkHistory:input_type -> datanode.api.v2.ExportNetworkHistoryRequest + 324, // 545: datanode.api.v2.TradingDataService.Ping:input_type -> datanode.api.v2.PingRequest + 14, // 546: datanode.api.v2.TradingDataService.ListAccounts:output_type -> datanode.api.v2.ListAccountsResponse + 18, // 547: datanode.api.v2.TradingDataService.ObserveAccounts:output_type -> datanode.api.v2.ObserveAccountsResponse + 22, // 548: datanode.api.v2.TradingDataService.Info:output_type -> datanode.api.v2.InfoResponse + 24, // 549: datanode.api.v2.TradingDataService.GetOrder:output_type -> datanode.api.v2.GetOrderResponse + 27, // 550: datanode.api.v2.TradingDataService.ListOrders:output_type -> datanode.api.v2.ListOrdersResponse + 29, // 551: datanode.api.v2.TradingDataService.ListOrderVersions:output_type -> datanode.api.v2.ListOrderVersionsResponse + 31, // 552: datanode.api.v2.TradingDataService.ObserveOrders:output_type -> datanode.api.v2.ObserveOrdersResponse + 35, // 553: datanode.api.v2.TradingDataService.GetStopOrder:output_type -> datanode.api.v2.GetStopOrderResponse + 40, // 554: datanode.api.v2.TradingDataService.ListStopOrders:output_type -> datanode.api.v2.ListStopOrdersResponse + 42, // 555: datanode.api.v2.TradingDataService.ListPositions:output_type -> datanode.api.v2.ListPositionsResponse + 45, // 556: datanode.api.v2.TradingDataService.ListAllPositions:output_type -> datanode.api.v2.ListAllPositionsResponse + 49, // 557: datanode.api.v2.TradingDataService.ObservePositions:output_type -> datanode.api.v2.ObservePositionsResponse + 56, // 558: datanode.api.v2.TradingDataService.ListLedgerEntries:output_type -> datanode.api.v2.ListLedgerEntriesResponse + 473, // 559: datanode.api.v2.TradingDataService.ExportLedgerEntries:output_type -> google.api.HttpBody + 60, // 560: datanode.api.v2.TradingDataService.ListBalanceChanges:output_type -> datanode.api.v2.ListBalanceChangesResponse + 78, // 561: datanode.api.v2.TradingDataService.GetLatestMarketData:output_type -> datanode.api.v2.GetLatestMarketDataResponse + 76, // 562: datanode.api.v2.TradingDataService.ListLatestMarketData:output_type -> datanode.api.v2.ListLatestMarketDataResponse + 74, // 563: datanode.api.v2.TradingDataService.GetLatestMarketDepth:output_type -> datanode.api.v2.GetLatestMarketDepthResponse + 68, // 564: datanode.api.v2.TradingDataService.ObserveMarketsDepth:output_type -> datanode.api.v2.ObserveMarketsDepthResponse + 70, // 565: datanode.api.v2.TradingDataService.ObserveMarketsDepthUpdates:output_type -> datanode.api.v2.ObserveMarketsDepthUpdatesResponse + 72, // 566: datanode.api.v2.TradingDataService.ObserveMarketsData:output_type -> datanode.api.v2.ObserveMarketsDataResponse + 80, // 567: datanode.api.v2.TradingDataService.GetMarketDataHistoryByID:output_type -> datanode.api.v2.GetMarketDataHistoryByIDResponse + 84, // 568: datanode.api.v2.TradingDataService.ListTransfers:output_type -> datanode.api.v2.ListTransfersResponse + 89, // 569: datanode.api.v2.TradingDataService.GetTransfer:output_type -> datanode.api.v2.GetTransferResponse + 91, // 570: datanode.api.v2.TradingDataService.GetNetworkLimits:output_type -> datanode.api.v2.GetNetworkLimitsResponse + 99, // 571: datanode.api.v2.TradingDataService.ListCandleData:output_type -> datanode.api.v2.ListCandleDataResponse + 97, // 572: datanode.api.v2.TradingDataService.ObserveCandleData:output_type -> datanode.api.v2.ObserveCandleDataResponse + 94, // 573: datanode.api.v2.TradingDataService.ListCandleIntervals:output_type -> datanode.api.v2.ListCandleIntervalsResponse + 103, // 574: datanode.api.v2.TradingDataService.ListVotes:output_type -> datanode.api.v2.ListVotesResponse + 107, // 575: datanode.api.v2.TradingDataService.ObserveVotes:output_type -> datanode.api.v2.ObserveVotesResponse + 109, // 576: datanode.api.v2.TradingDataService.ListERC20MultiSigSignerAddedBundles:output_type -> datanode.api.v2.ListERC20MultiSigSignerAddedBundlesResponse + 115, // 577: datanode.api.v2.TradingDataService.ListERC20MultiSigSignerRemovedBundles:output_type -> datanode.api.v2.ListERC20MultiSigSignerRemovedBundlesResponse + 121, // 578: datanode.api.v2.TradingDataService.GetERC20ListAssetBundle:output_type -> datanode.api.v2.GetERC20ListAssetBundleResponse + 123, // 579: datanode.api.v2.TradingDataService.GetERC20SetAssetLimitsBundle:output_type -> datanode.api.v2.GetERC20SetAssetLimitsBundleResponse + 125, // 580: datanode.api.v2.TradingDataService.GetERC20WithdrawalApproval:output_type -> datanode.api.v2.GetERC20WithdrawalApprovalResponse + 127, // 581: datanode.api.v2.TradingDataService.GetLastTrade:output_type -> datanode.api.v2.GetLastTradeResponse + 129, // 582: datanode.api.v2.TradingDataService.ListTrades:output_type -> datanode.api.v2.ListTradesResponse + 133, // 583: datanode.api.v2.TradingDataService.ObserveTrades:output_type -> datanode.api.v2.ObserveTradesResponse + 135, // 584: datanode.api.v2.TradingDataService.GetOracleSpec:output_type -> datanode.api.v2.GetOracleSpecResponse + 137, // 585: datanode.api.v2.TradingDataService.ListOracleSpecs:output_type -> datanode.api.v2.ListOracleSpecsResponse + 139, // 586: datanode.api.v2.TradingDataService.ListOracleData:output_type -> datanode.api.v2.ListOracleDataResponse + 145, // 587: datanode.api.v2.TradingDataService.GetMarket:output_type -> datanode.api.v2.GetMarketResponse + 147, // 588: datanode.api.v2.TradingDataService.ListMarkets:output_type -> datanode.api.v2.ListMarketsResponse + 154, // 589: datanode.api.v2.TradingDataService.ListSuccessorMarkets:output_type -> datanode.api.v2.ListSuccessorMarketsResponse + 156, // 590: datanode.api.v2.TradingDataService.GetParty:output_type -> datanode.api.v2.GetPartyResponse + 158, // 591: datanode.api.v2.TradingDataService.ListParties:output_type -> datanode.api.v2.ListPartiesResponse + 163, // 592: datanode.api.v2.TradingDataService.ListMarginLevels:output_type -> datanode.api.v2.ListMarginLevelsResponse + 165, // 593: datanode.api.v2.TradingDataService.ObserveMarginLevels:output_type -> datanode.api.v2.ObserveMarginLevelsResponse + 170, // 594: datanode.api.v2.TradingDataService.ListRewards:output_type -> datanode.api.v2.ListRewardsResponse + 174, // 595: datanode.api.v2.TradingDataService.ListRewardSummaries:output_type -> datanode.api.v2.ListRewardSummariesResponse + 177, // 596: datanode.api.v2.TradingDataService.ListEpochRewardSummaries:output_type -> datanode.api.v2.ListEpochRewardSummariesResponse + 183, // 597: datanode.api.v2.TradingDataService.GetDeposit:output_type -> datanode.api.v2.GetDepositResponse + 185, // 598: datanode.api.v2.TradingDataService.ListDeposits:output_type -> datanode.api.v2.ListDepositsResponse + 189, // 599: datanode.api.v2.TradingDataService.GetWithdrawal:output_type -> datanode.api.v2.GetWithdrawalResponse + 191, // 600: datanode.api.v2.TradingDataService.ListWithdrawals:output_type -> datanode.api.v2.ListWithdrawalsResponse + 195, // 601: datanode.api.v2.TradingDataService.GetAsset:output_type -> datanode.api.v2.GetAssetResponse + 197, // 602: datanode.api.v2.TradingDataService.ListAssets:output_type -> datanode.api.v2.ListAssetsResponse + 202, // 603: datanode.api.v2.TradingDataService.ListLiquidityProvisions:output_type -> datanode.api.v2.ListLiquidityProvisionsResponse + 203, // 604: datanode.api.v2.TradingDataService.ListAllLiquidityProvisions:output_type -> datanode.api.v2.ListAllLiquidityProvisionsResponse + 210, // 605: datanode.api.v2.TradingDataService.ObserveLiquidityProvisions:output_type -> datanode.api.v2.ObserveLiquidityProvisionsResponse + 215, // 606: datanode.api.v2.TradingDataService.ListLiquidityProviders:output_type -> datanode.api.v2.ListLiquidityProvidersResponse + 217, // 607: datanode.api.v2.TradingDataService.ListPaidLiquidityFees:output_type -> datanode.api.v2.ListPaidLiquidityFeesResponse + 221, // 608: datanode.api.v2.TradingDataService.GetGovernanceData:output_type -> datanode.api.v2.GetGovernanceDataResponse + 223, // 609: datanode.api.v2.TradingDataService.ListGovernanceData:output_type -> datanode.api.v2.ListGovernanceDataResponse + 227, // 610: datanode.api.v2.TradingDataService.ObserveGovernance:output_type -> datanode.api.v2.ObserveGovernanceResponse + 229, // 611: datanode.api.v2.TradingDataService.ListDelegations:output_type -> datanode.api.v2.ListDelegationsResponse + 236, // 612: datanode.api.v2.TradingDataService.GetNetworkData:output_type -> datanode.api.v2.GetNetworkDataResponse + 238, // 613: datanode.api.v2.TradingDataService.GetNode:output_type -> datanode.api.v2.GetNodeResponse + 240, // 614: datanode.api.v2.TradingDataService.ListNodes:output_type -> datanode.api.v2.ListNodesResponse + 244, // 615: datanode.api.v2.TradingDataService.ListNodeSignatures:output_type -> datanode.api.v2.ListNodeSignaturesResponse + 248, // 616: datanode.api.v2.TradingDataService.GetEpoch:output_type -> datanode.api.v2.GetEpochResponse + 250, // 617: datanode.api.v2.TradingDataService.EstimateFee:output_type -> datanode.api.v2.EstimateFeeResponse + 252, // 618: datanode.api.v2.TradingDataService.EstimateMargin:output_type -> datanode.api.v2.EstimateMarginResponse + 328, // 619: datanode.api.v2.TradingDataService.EstimatePosition:output_type -> datanode.api.v2.EstimatePositionResponse + 254, // 620: datanode.api.v2.TradingDataService.ListNetworkParameters:output_type -> datanode.api.v2.ListNetworkParametersResponse + 256, // 621: datanode.api.v2.TradingDataService.GetNetworkParameter:output_type -> datanode.api.v2.GetNetworkParameterResponse + 261, // 622: datanode.api.v2.TradingDataService.ListCheckpoints:output_type -> datanode.api.v2.ListCheckpointsResponse + 265, // 623: datanode.api.v2.TradingDataService.GetStake:output_type -> datanode.api.v2.GetStakeResponse + 269, // 624: datanode.api.v2.TradingDataService.GetRiskFactors:output_type -> datanode.api.v2.GetRiskFactorsResponse + 271, // 625: datanode.api.v2.TradingDataService.ObserveEventBus:output_type -> datanode.api.v2.ObserveEventBusResponse + 273, // 626: datanode.api.v2.TradingDataService.ObserveLedgerMovements:output_type -> datanode.api.v2.ObserveLedgerMovementsResponse + 275, // 627: datanode.api.v2.TradingDataService.ListKeyRotations:output_type -> datanode.api.v2.ListKeyRotationsResponse + 279, // 628: datanode.api.v2.TradingDataService.ListEthereumKeyRotations:output_type -> datanode.api.v2.ListEthereumKeyRotationsResponse + 283, // 629: datanode.api.v2.TradingDataService.GetVegaTime:output_type -> datanode.api.v2.GetVegaTimeResponse + 286, // 630: datanode.api.v2.TradingDataService.GetProtocolUpgradeStatus:output_type -> datanode.api.v2.GetProtocolUpgradeStatusResponse + 288, // 631: datanode.api.v2.TradingDataService.ListProtocolUpgradeProposals:output_type -> datanode.api.v2.ListProtocolUpgradeProposalsResponse + 292, // 632: datanode.api.v2.TradingDataService.ListCoreSnapshots:output_type -> datanode.api.v2.ListCoreSnapshotsResponse + 297, // 633: datanode.api.v2.TradingDataService.GetMostRecentNetworkHistorySegment:output_type -> datanode.api.v2.GetMostRecentNetworkHistorySegmentResponse + 299, // 634: datanode.api.v2.TradingDataService.ListAllNetworkHistorySegments:output_type -> datanode.api.v2.ListAllNetworkHistorySegmentsResponse + 301, // 635: datanode.api.v2.TradingDataService.GetActiveNetworkHistoryPeerAddresses:output_type -> datanode.api.v2.GetActiveNetworkHistoryPeerAddressesResponse + 303, // 636: datanode.api.v2.TradingDataService.GetNetworkHistoryStatus:output_type -> datanode.api.v2.GetNetworkHistoryStatusResponse + 305, // 637: datanode.api.v2.TradingDataService.GetNetworkHistoryBootstrapPeers:output_type -> datanode.api.v2.GetNetworkHistoryBootstrapPeersResponse + 308, // 638: datanode.api.v2.TradingDataService.ListEntities:output_type -> datanode.api.v2.ListEntitiesResponse + 319, // 639: datanode.api.v2.TradingDataService.ListFundingPeriods:output_type -> datanode.api.v2.ListFundingPeriodsResponse + 323, // 640: datanode.api.v2.TradingDataService.ListFundingPeriodDataPoints:output_type -> datanode.api.v2.ListFundingPeriodDataPointsResponse + 315, // 641: datanode.api.v2.TradingDataService.ListFundingPayments:output_type -> datanode.api.v2.ListFundingPaymentsResponse + 310, // 642: datanode.api.v2.TradingDataService.GetPartyActivityStreak:output_type -> datanode.api.v2.GetPartyActivityStreakResponse + 333, // 643: datanode.api.v2.TradingDataService.GetCurrentReferralProgram:output_type -> datanode.api.v2.GetCurrentReferralProgramResponse + 339, // 644: datanode.api.v2.TradingDataService.ListReferralSets:output_type -> datanode.api.v2.ListReferralSetsResponse + 344, // 645: datanode.api.v2.TradingDataService.ListReferralSetReferees:output_type -> datanode.api.v2.ListReferralSetRefereesResponse + 346, // 646: datanode.api.v2.TradingDataService.GetReferralSetStats:output_type -> datanode.api.v2.GetReferralSetStatsResponse + 354, // 647: datanode.api.v2.TradingDataService.ListTeams:output_type -> datanode.api.v2.ListTeamsResponse + 356, // 648: datanode.api.v2.TradingDataService.ListTeamsStatistics:output_type -> datanode.api.v2.ListTeamsStatisticsResponse + 365, // 649: datanode.api.v2.TradingDataService.ListTeamReferees:output_type -> datanode.api.v2.ListTeamRefereesResponse + 370, // 650: datanode.api.v2.TradingDataService.ListTeamRefereeHistory:output_type -> datanode.api.v2.ListTeamRefereeHistoryResponse + 372, // 651: datanode.api.v2.TradingDataService.GetFeesStats:output_type -> datanode.api.v2.GetFeesStatsResponse + 374, // 652: datanode.api.v2.TradingDataService.GetFeesStatsForParty:output_type -> datanode.api.v2.GetFeesStatsForPartyResponse + 376, // 653: datanode.api.v2.TradingDataService.GetCurrentVolumeDiscountProgram:output_type -> datanode.api.v2.GetCurrentVolumeDiscountProgramResponse + 378, // 654: datanode.api.v2.TradingDataService.GetVolumeDiscountStats:output_type -> datanode.api.v2.GetVolumeDiscountStatsResponse + 11, // 655: datanode.api.v2.TradingDataService.GetVestingBalancesSummary:output_type -> datanode.api.v2.GetVestingBalancesSummaryResponse + 9, // 656: datanode.api.v2.TradingDataService.GetPartyVestingStats:output_type -> datanode.api.v2.GetPartyVestingStatsResponse + 385, // 657: datanode.api.v2.TradingDataService.ObserveTransactionResults:output_type -> datanode.api.v2.ObserveTransactionResultsResponse + 387, // 658: datanode.api.v2.TradingDataService.EstimateTransferFee:output_type -> datanode.api.v2.EstimateTransferFeeResponse + 389, // 659: datanode.api.v2.TradingDataService.GetTotalTransferFeeDiscount:output_type -> datanode.api.v2.GetTotalTransferFeeDiscountResponse + 391, // 660: datanode.api.v2.TradingDataService.ListGames:output_type -> datanode.api.v2.ListGamesResponse + 473, // 661: datanode.api.v2.TradingDataService.ExportNetworkHistory:output_type -> google.api.HttpBody + 325, // 662: datanode.api.v2.TradingDataService.Ping:output_type -> datanode.api.v2.PingResponse + 546, // [546:663] is the sub-list for method output_type + 429, // [429:546] is the sub-list for method input_type + 429, // [429:429] is the sub-list for extension type_name + 429, // [429:429] is the sub-list for extension extendee + 0, // [0:429] is the sub-list for field type_name } func init() { file_data_node_api_v2_trading_data_proto_init() } @@ -33604,7 +34075,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[349].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTeamRefereesRequest); i { + switch v := v.(*ListTeamsStatisticsRequest); i { case 0: return &v.state case 1: @@ -33616,7 +34087,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[350].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeamReferee); i { + switch v := v.(*ListTeamsStatisticsResponse); i { case 0: return &v.state case 1: @@ -33628,7 +34099,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[351].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeamRefereeEdge); i { + switch v := v.(*TeamsStatisticsConnection); i { case 0: return &v.state case 1: @@ -33640,7 +34111,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[352].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeamRefereeConnection); i { + switch v := v.(*TeamStatisticsEdge); i { case 0: return &v.state case 1: @@ -33652,7 +34123,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[353].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTeamRefereesResponse); i { + switch v := v.(*TeamStatistics); i { case 0: return &v.state case 1: @@ -33664,7 +34135,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[354].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeamRefereeHistory); i { + switch v := v.(*QuantumRewardsPerEpoch); i { case 0: return &v.state case 1: @@ -33676,7 +34147,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[355].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeamRefereeHistoryEdge); i { + switch v := v.(*ListTeamRefereesRequest); i { case 0: return &v.state case 1: @@ -33688,7 +34159,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[356].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeamRefereeHistoryConnection); i { + switch v := v.(*TeamReferee); i { case 0: return &v.state case 1: @@ -33700,7 +34171,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[357].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTeamRefereeHistoryRequest); i { + switch v := v.(*TeamRefereeEdge); i { case 0: return &v.state case 1: @@ -33712,7 +34183,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[358].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTeamRefereeHistoryResponse); i { + switch v := v.(*TeamRefereeConnection); i { case 0: return &v.state case 1: @@ -33724,7 +34195,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[359].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetFeesStatsRequest); i { + switch v := v.(*ListTeamRefereesResponse); i { case 0: return &v.state case 1: @@ -33736,7 +34207,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[360].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetFeesStatsResponse); i { + switch v := v.(*TeamRefereeHistory); i { case 0: return &v.state case 1: @@ -33748,7 +34219,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[361].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetFeesStatsForPartyRequest); i { + switch v := v.(*TeamRefereeHistoryEdge); i { case 0: return &v.state case 1: @@ -33760,7 +34231,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[362].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetFeesStatsForPartyResponse); i { + switch v := v.(*TeamRefereeHistoryConnection); i { case 0: return &v.state case 1: @@ -33772,7 +34243,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[363].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetCurrentVolumeDiscountProgramRequest); i { + switch v := v.(*ListTeamRefereeHistoryRequest); i { case 0: return &v.state case 1: @@ -33784,7 +34255,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[364].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetCurrentVolumeDiscountProgramResponse); i { + switch v := v.(*ListTeamRefereeHistoryResponse); i { case 0: return &v.state case 1: @@ -33796,7 +34267,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[365].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetVolumeDiscountStatsRequest); i { + switch v := v.(*GetFeesStatsRequest); i { case 0: return &v.state case 1: @@ -33808,7 +34279,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[366].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetVolumeDiscountStatsResponse); i { + switch v := v.(*GetFeesStatsResponse); i { case 0: return &v.state case 1: @@ -33820,7 +34291,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[367].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeDiscountStatsConnection); i { + switch v := v.(*GetFeesStatsForPartyRequest); i { case 0: return &v.state case 1: @@ -33832,7 +34303,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[368].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeDiscountStatsEdge); i { + switch v := v.(*GetFeesStatsForPartyResponse); i { case 0: return &v.state case 1: @@ -33844,7 +34315,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[369].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeDiscountStats); i { + switch v := v.(*GetCurrentVolumeDiscountProgramRequest); i { case 0: return &v.state case 1: @@ -33856,7 +34327,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[370].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeDiscountProgram); i { + switch v := v.(*GetCurrentVolumeDiscountProgramResponse); i { case 0: return &v.state case 1: @@ -33868,7 +34339,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[371].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FeesStatsForParty); i { + switch v := v.(*GetVolumeDiscountStatsRequest); i { case 0: return &v.state case 1: @@ -33880,7 +34351,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[372].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObserveTransactionResultsRequest); i { + switch v := v.(*GetVolumeDiscountStatsResponse); i { case 0: return &v.state case 1: @@ -33892,7 +34363,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[373].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObserveTransactionResultsResponse); i { + switch v := v.(*VolumeDiscountStatsConnection); i { case 0: return &v.state case 1: @@ -33904,7 +34375,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[374].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EstimateTransferFeeRequest); i { + switch v := v.(*VolumeDiscountStatsEdge); i { case 0: return &v.state case 1: @@ -33916,7 +34387,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[375].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EstimateTransferFeeResponse); i { + switch v := v.(*VolumeDiscountStats); i { case 0: return &v.state case 1: @@ -33928,7 +34399,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[376].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTotalTransferFeeDiscountRequest); i { + switch v := v.(*VolumeDiscountProgram); i { case 0: return &v.state case 1: @@ -33940,7 +34411,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[377].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTotalTransferFeeDiscountResponse); i { + switch v := v.(*FeesStatsForParty); i { case 0: return &v.state case 1: @@ -33952,7 +34423,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[378].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListGamesRequest); i { + switch v := v.(*ObserveTransactionResultsRequest); i { case 0: return &v.state case 1: @@ -33964,7 +34435,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[379].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListGamesResponse); i { + switch v := v.(*ObserveTransactionResultsResponse); i { case 0: return &v.state case 1: @@ -33976,7 +34447,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[380].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GamesConnection); i { + switch v := v.(*EstimateTransferFeeRequest); i { case 0: return &v.state case 1: @@ -33988,7 +34459,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[381].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GameEdge); i { + switch v := v.(*EstimateTransferFeeResponse); i { case 0: return &v.state case 1: @@ -34000,7 +34471,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[382].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Game); i { + switch v := v.(*GetTotalTransferFeeDiscountRequest); i { case 0: return &v.state case 1: @@ -34012,7 +34483,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[383].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeamGameEntities); i { + switch v := v.(*GetTotalTransferFeeDiscountResponse); i { case 0: return &v.state case 1: @@ -34024,7 +34495,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[384].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IndividualGameEntities); i { + switch v := v.(*ListGamesRequest); i { case 0: return &v.state case 1: @@ -34036,7 +34507,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[385].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeamGameEntity); i { + switch v := v.(*ListGamesResponse); i { case 0: return &v.state case 1: @@ -34048,7 +34519,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[386].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeamGameParticipation); i { + switch v := v.(*GamesConnection); i { case 0: return &v.state case 1: @@ -34060,6 +34531,78 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[387].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEdge); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_node_api_v2_trading_data_proto_msgTypes[388].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Game); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_node_api_v2_trading_data_proto_msgTypes[389].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TeamGameEntities); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_node_api_v2_trading_data_proto_msgTypes[390].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IndividualGameEntities); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_node_api_v2_trading_data_proto_msgTypes[391].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TeamGameEntity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_node_api_v2_trading_data_proto_msgTypes[392].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TeamGameParticipation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_node_api_v2_trading_data_proto_msgTypes[393].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IndividualGameEntity); i { case 0: return &v.state @@ -34158,14 +34701,15 @@ func file_data_node_api_v2_trading_data_proto_init() { file_data_node_api_v2_trading_data_proto_msgTypes[344].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[347].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[349].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[357].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[359].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[361].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[355].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[363].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[365].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[370].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[372].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[367].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[371].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[376].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[378].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[382].OneofWrappers = []interface{}{ + file_data_node_api_v2_trading_data_proto_msgTypes[384].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[388].OneofWrappers = []interface{}{ (*Game_Team)(nil), (*Game_Individual)(nil), } @@ -34175,7 +34719,7 @@ func file_data_node_api_v2_trading_data_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_data_node_api_v2_trading_data_proto_rawDesc, NumEnums: 6, - NumMessages: 388, + NumMessages: 394, NumExtensions: 0, NumServices: 1, }, diff --git a/protos/data-node/api/v2/trading_data.pb.gw.go b/protos/data-node/api/v2/trading_data.pb.gw.go index 87fc724db8f..5248b76b922 100644 --- a/protos/data-node/api/v2/trading_data.pb.gw.go +++ b/protos/data-node/api/v2/trading_data.pb.gw.go @@ -3777,6 +3777,42 @@ func local_request_TradingDataService_ListTeams_0(ctx context.Context, marshaler } +var ( + filter_TradingDataService_ListTeamsStatistics_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_TradingDataService_ListTeamsStatistics_0(ctx context.Context, marshaler runtime.Marshaler, client TradingDataServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListTeamsStatisticsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_TradingDataService_ListTeamsStatistics_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ListTeamsStatistics(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_TradingDataService_ListTeamsStatistics_0(ctx context.Context, marshaler runtime.Marshaler, server TradingDataServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListTeamsStatisticsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_TradingDataService_ListTeamsStatistics_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListTeamsStatistics(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_TradingDataService_ListTeamReferees_0 = &utilities.DoubleArray{Encoding: map[string]int{"team_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -6261,6 +6297,29 @@ func RegisterTradingDataServiceHandlerServer(ctx context.Context, mux *runtime.S }) + mux.Handle("GET", pattern_TradingDataService_ListTeamsStatistics_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/datanode.api.v2.TradingDataService/ListTeamsStatistics", runtime.WithHTTPPathPattern("/api/v2/teams/stats")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_TradingDataService_ListTeamsStatistics_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_TradingDataService_ListTeamsStatistics_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_TradingDataService_ListTeamReferees_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -8483,6 +8542,26 @@ func RegisterTradingDataServiceHandlerClient(ctx context.Context, mux *runtime.S }) + mux.Handle("GET", pattern_TradingDataService_ListTeamsStatistics_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/datanode.api.v2.TradingDataService/ListTeamsStatistics", runtime.WithHTTPPathPattern("/api/v2/teams/stats")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_TradingDataService_ListTeamsStatistics_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_TradingDataService_ListTeamsStatistics_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_TradingDataService_ListTeamReferees_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -8903,6 +8982,8 @@ var ( pattern_TradingDataService_ListTeams_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v2", "teams"}, "")) + pattern_TradingDataService_ListTeamsStatistics_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "teams", "stats"}, "")) + pattern_TradingDataService_ListTeamReferees_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"api", "v2", "teams", "referees", "team_id"}, "")) pattern_TradingDataService_ListTeamRefereeHistory_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"api", "v2", "teams", "referees", "history", "referee"}, "")) @@ -9123,6 +9204,8 @@ var ( forward_TradingDataService_ListTeams_0 = runtime.ForwardResponseMessage + forward_TradingDataService_ListTeamsStatistics_0 = runtime.ForwardResponseMessage + forward_TradingDataService_ListTeamReferees_0 = runtime.ForwardResponseMessage forward_TradingDataService_ListTeamRefereeHistory_0 = runtime.ForwardResponseMessage diff --git a/protos/data-node/api/v2/trading_data_grpc.pb.go b/protos/data-node/api/v2/trading_data_grpc.pb.go index 331dd2ce8dc..f1ace274a9f 100644 --- a/protos/data-node/api/v2/trading_data_grpc.pb.go +++ b/protos/data-node/api/v2/trading_data_grpc.pb.go @@ -487,6 +487,11 @@ type TradingDataServiceClient interface { // // Get a list of all teams, or for a specific team by using team ID, or party ID of a referrer or referee ListTeams(ctx context.Context, in *ListTeamsRequest, opts ...grpc.CallOption) (*ListTeamsResponse, error) + // List teams statistics + // + // Get the statistics of all teams, or for a specific team by using team ID, over a number of epochs. + // If a team does not have at least the number of epochs' worth of data, it is ignored. + ListTeamsStatistics(ctx context.Context, in *ListTeamsStatisticsRequest, opts ...grpc.CallOption) (*ListTeamsStatisticsResponse, error) // List team referees // // Get a list of all referees for a given team ID @@ -1876,6 +1881,15 @@ func (c *tradingDataServiceClient) ListTeams(ctx context.Context, in *ListTeamsR return out, nil } +func (c *tradingDataServiceClient) ListTeamsStatistics(ctx context.Context, in *ListTeamsStatisticsRequest, opts ...grpc.CallOption) (*ListTeamsStatisticsResponse, error) { + out := new(ListTeamsStatisticsResponse) + err := c.cc.Invoke(ctx, "/datanode.api.v2.TradingDataService/ListTeamsStatistics", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *tradingDataServiceClient) ListTeamReferees(ctx context.Context, in *ListTeamRefereesRequest, opts ...grpc.CallOption) (*ListTeamRefereesResponse, error) { out := new(ListTeamRefereesResponse) err := c.cc.Invoke(ctx, "/datanode.api.v2.TradingDataService/ListTeamReferees", in, out, opts...) @@ -2516,6 +2530,11 @@ type TradingDataServiceServer interface { // // Get a list of all teams, or for a specific team by using team ID, or party ID of a referrer or referee ListTeams(context.Context, *ListTeamsRequest) (*ListTeamsResponse, error) + // List teams statistics + // + // Get the statistics of all teams, or for a specific team by using team ID, over a number of epochs. + // If a team does not have at least the number of epochs' worth of data, it is ignored. + ListTeamsStatistics(context.Context, *ListTeamsStatisticsRequest) (*ListTeamsStatisticsResponse, error) // List team referees // // Get a list of all referees for a given team ID @@ -2944,6 +2963,9 @@ func (UnimplementedTradingDataServiceServer) GetReferralSetStats(context.Context func (UnimplementedTradingDataServiceServer) ListTeams(context.Context, *ListTeamsRequest) (*ListTeamsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListTeams not implemented") } +func (UnimplementedTradingDataServiceServer) ListTeamsStatistics(context.Context, *ListTeamsStatisticsRequest) (*ListTeamsStatisticsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListTeamsStatistics not implemented") +} func (UnimplementedTradingDataServiceServer) ListTeamReferees(context.Context, *ListTeamRefereesRequest) (*ListTeamRefereesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListTeamReferees not implemented") } @@ -4885,6 +4907,24 @@ func _TradingDataService_ListTeams_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _TradingDataService_ListTeamsStatistics_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListTeamsStatisticsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TradingDataServiceServer).ListTeamsStatistics(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/datanode.api.v2.TradingDataService/ListTeamsStatistics", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TradingDataServiceServer).ListTeamsStatistics(ctx, req.(*ListTeamsStatisticsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _TradingDataService_ListTeamReferees_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListTeamRefereesRequest) if err := dec(in); err != nil { @@ -5498,6 +5538,10 @@ var TradingDataService_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListTeams", Handler: _TradingDataService_ListTeams_Handler, }, + { + MethodName: "ListTeamsStatistics", + Handler: _TradingDataService_ListTeamsStatistics_Handler, + }, { MethodName: "ListTeamReferees", Handler: _TradingDataService_ListTeamReferees_Handler, diff --git a/protos/embed_test.go b/protos/embed_test.go index a2cedf34e4f..fb1de0ebbde 100644 --- a/protos/embed_test.go +++ b/protos/embed_test.go @@ -45,7 +45,7 @@ func Test_DataNodeBindings(t *testing.T) { t.Run("CoreBindings should return the core http bindings", func(t *testing.T) { bindings, err := protos.DataNodeBindings() require.NoError(t, err) - wantCount := 109 + wantCount := 110 assert.Len(t, bindings.HTTP.Rules, wantCount) diff --git a/protos/sources/data-node/api/v2/trading_data.proto b/protos/sources/data-node/api/v2/trading_data.proto index 7a3d03de684..3f61b6b467f 100644 --- a/protos/sources/data-node/api/v2/trading_data.proto +++ b/protos/sources/data-node/api/v2/trading_data.proto @@ -811,6 +811,14 @@ service TradingDataService { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {tags: "Teams"}; } + // List teams statistics + // + // Get the statistics of all teams, or for a specific team by using team ID, over a number of epochs. + // If a team does not have at least the number of epochs' worth of data, it is ignored. + rpc ListTeamsStatistics(ListTeamsStatisticsRequest) returns (ListTeamsStatisticsResponse) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {tags: "Teams"}; + } + // List team referees // // Get a list of all referees for a given team ID @@ -4121,6 +4129,65 @@ message ListTeamsResponse { TeamConnection teams = 1; } +// Request to list all teams' statistics. +message ListTeamsStatisticsRequest { + // Restrict team statistics to those with the given team ID. + optional string team_id = 1; + // Defines the number of past epochs to aggregate data from. By default, it takes + // the last 10 epochs. + optional uint64 aggregation_epochs = 2; + // Pagination controls. + optional Pagination pagination = 3; +} + +// Response for the list teams' statistics request containing the statistics. +message ListTeamsStatisticsResponse { + // Page of teams' statistics data and corresponding page information. + TeamsStatisticsConnection statistics = 1; +} + +// Page of teams' statistics and corresponding page information. +message TeamsStatisticsConnection { + // Page of team data and their corresponding cursors. + repeated TeamStatisticsEdge edges = 1; + // Page information that is used for fetching further pages. + PageInfo page_info = 2; +} + +// Team data item with the corresponding cursor. +message TeamStatisticsEdge { + // Team's statistics data. + TeamStatistics node = 1; + // Cursor that can be used to fetch further pages. + string cursor = 2; +} + +// Team's statistics record containing the team information. +message TeamStatistics { + // Team ID the statistics are related to. + string team_id = 1; + // Total of volume accumulated over the requested epoch period, expressed in + // quantum value. + string total_quantum_volume = 2; + // Total of rewards accumulated over the requested epoch period, expressed in + // quantum value. + string total_quantum_rewards = 3; + // List of rewards over the requested epoch period, expressed in quantum + // value for each epoch. + repeated QuantumRewardsPerEpoch quantum_rewards = 4; + // Total of games played. + uint64 total_game_played = 5; + // List of games played over the requested epoch period. + repeated string games_played = 6; +} + +message QuantumRewardsPerEpoch { + // Epoch for which this information is valid. + uint64 epoch = 1; + // Total rewards accumulated over the epoch period, expressed in quantum value. + string total_quantum_rewards = 2; +} + // Request that is sent when listing the referees for a given team. message ListTeamRefereesRequest { // Team ID to list referees for. diff --git a/protos/sources/data-node/grpc-rest-bindings.yml b/protos/sources/data-node/grpc-rest-bindings.yml index 5059b1c1793..d5e50351b9f 100644 --- a/protos/sources/data-node/grpc-rest-bindings.yml +++ b/protos/sources/data-node/grpc-rest-bindings.yml @@ -181,6 +181,8 @@ http: get: "/api/v2/referral-sets/stats" - selector: datanode.api.v2.TradingDataService.ListTeams get: "/api/v2/teams" + - selector: datanode.api.v2.TradingDataService.ListTeamsStatistics + get: "/api/v2/teams/stats" - selector: datanode.api.v2.TradingDataService.ListTeamReferees get: "/api/v2/teams/referees/{team_id}" - selector: datanode.api.v2.TradingDataService.ListTeamRefereeHistory From a2e5bc37fbd4bd8636f3335e5a0d085cca760430 Mon Sep 17 00:00:00 2001 From: Valentin Trinque Date: Tue, 5 Dec 2023 18:03:19 +0100 Subject: [PATCH 10/10] fix: Ensure the block explorer paginate is the right order --- CHANGELOG.md | 2 + blockexplorer/api/grpc/implementation.go | 56 +++-- blockexplorer/entities/transaction.go | 10 + blockexplorer/store/transactions.go | 52 +++-- blockexplorer/store/transactions_test.go | 27 ++- .../blockexplorer/api/v1/blockexplorer.pb.go | 206 +++++++++--------- .../api/v1/blockexplorer_grpc.pb.go | 4 +- .../blockexplorer/api/v1/blockexplorer.proto | 24 +- 8 files changed, 217 insertions(+), 164 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fce6cc48d41..47d593b737d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### 🚨 Breaking changes - [9945](https://github.com/vegaprotocol/vega/issues/9945) - Add liquidation strategy. +- [10215](https://github.com/vegaprotocol/vega/issues/10215) - Listing transactions on block explorer does not support the field `limit` any more. ### 🗑️ Deprecation @@ -71,6 +72,7 @@ - [10227](https://github.com/vegaprotocol/vega/issues/10227) - Make the wallet errors on spam stats meaningful. - [10193](https://github.com/vegaprotocol/vega/issues/10193) - Denormalize `tx_results` to avoid joins with blocks when queried. - [10233](https://github.com/vegaprotocol/vega/issues/10233) - Fix expiring stop orders panic. +- [10215](https://github.com/vegaprotocol/vega/issues/10215) - Rework pagination to align with the natural reverse-chronological order of the block explorer. ## 0.73.0 diff --git a/blockexplorer/api/grpc/implementation.go b/blockexplorer/api/grpc/implementation.go index 812d0db190b..deef9753aa3 100644 --- a/blockexplorer/api/grpc/implementation.go +++ b/blockexplorer/api/grpc/implementation.go @@ -81,28 +81,12 @@ func (b *blockExplorerAPI) ListTransactions(ctx context.Context, req *pb.ListTra var before, after *entities.TxCursor var first, last uint32 - if req.First > 0 && req.Last > 0 { - return nil, apiError(codes.InvalidArgument, errors.New("cannot specify both first and last")) - } - - first = b.MaxPageSizeDefault - if req.First > 0 { - first = req.First - if req.After == nil && req.Before != nil { - return nil, apiError(codes.InvalidArgument, errors.New("cannot specify before when using first")) - } + if req.Before != nil && req.After != nil && (req.First > 0 || req.Last > 0) { + return nil, apiError(codes.InvalidArgument, errors.New("cannot use neither limits `first`, nor `last` when both cursors `before` and `after` are set")) } - if req.Last > 0 { - last = req.Last - if req.Before == nil && req.After != nil { - return nil, apiError(codes.InvalidArgument, errors.New("cannot specify after when using last")) - } - } - - // Temporary for now, until we have fully deprecated the limit field in the request. - if req.Limit > 0 && req.First == 0 && req.Last == 0 { - first = req.Limit + if req.First > 0 && req.Last > 0 { + return nil, apiError(codes.InvalidArgument, errors.New("cannot use both limits `first` and `last` within the same query")) } if req.Before != nil { @@ -111,6 +95,7 @@ func (b *blockExplorerAPI) ListTransactions(ctx context.Context, req *pb.ListTra return nil, apiError(codes.InvalidArgument, err) } before = &cursor + last = b.MaxPageSizeDefault } if req.After != nil { @@ -119,6 +104,37 @@ func (b *blockExplorerAPI) ListTransactions(ctx context.Context, req *pb.ListTra return nil, apiError(codes.InvalidArgument, err) } after = &cursor + first = b.MaxPageSizeDefault + } + + if before != nil && after != nil { + // The order of the parameters may seem odd, but this is expected as we have + // to keep in mind the natural order of the block-explorer is reverse-chronological. + // so, given transactions 4.2, 4.1, 3.2, 3.1, 2.2, when applying the window between + // 3.1 and 4.2, then we have to set after to 3.1 and before to 4.2. + // So effectively, after is the start and before is the end of the set. + if entities.AreValidCursorBoundaries(after, before) { + return nil, apiError(codes.InvalidArgument, errors.New("cursors `before` and `after` do not create a valid window")) + } + } + + if req.First > 0 { + if req.Before != nil { + return nil, apiError(codes.InvalidArgument, errors.New("cannot use cursor `before` when using limit `first`")) + } + first = req.First + } else if req.Last > 0 { + if req.After != nil { + return nil, apiError(codes.InvalidArgument, errors.New("cannot use cursor `after` when using limit `last`")) + } + last = req.Last + } + + // Entering this condition means there is no pagination set, so it defaults + // to listing the MaxPageSizeDefault newest transactions. + // Note, setting limits on a cursor window is not supported. + if !(before != nil && after != nil) && first == 0 && last == 0 { + first = b.MaxPageSizeDefault } transactions, err := b.store.ListTransactions(ctx, diff --git a/blockexplorer/entities/transaction.go b/blockexplorer/entities/transaction.go index 4979eb41d34..429ea088ba1 100644 --- a/blockexplorer/entities/transaction.go +++ b/blockexplorer/entities/transaction.go @@ -131,3 +131,13 @@ func TxCursorFromString(s string) (TxCursor, error) { func (c *TxCursor) String() string { return fmt.Sprintf("%d.%d", c.BlockNumber, c.TxIndex) } + +// AreValidCursorBoundaries checks if the start and end cursors creates valid +// set boundaries for cursors, as: [start, end]. +func AreValidCursorBoundaries(start, end *TxCursor) bool { + if start.BlockNumber == end.BlockNumber { + return start.TxIndex < end.TxIndex + } + + return start.BlockNumber < end.BlockNumber +} diff --git a/blockexplorer/store/transactions.go b/blockexplorer/store/transactions.go index c4f88341024..9093f459409 100644 --- a/blockexplorer/store/transactions.go +++ b/blockexplorer/store/transactions.go @@ -71,33 +71,43 @@ func (s *Store) ListTransactions(ctx context.Context, args := []interface{}{} predicates := []string{} - // by default we want the most recent transactions so we'll set the limit to first - // and sort order to desc - limit := first + limit := uint32(0) + sortOrder := "desc" - // if we have a before cursor we want the results ordered earliest to latest - // so the limit will be set to last and sort order to asc + if first > 0 { + // We want the N most recent transactions, descending on block height and block + // index: 4.1, 3.2, 3.1, 2.2... + // The resulting query should already sort the rows in the right order. + limit = first + sortOrder = "desc" + } else if last > 0 { + // We want the N oldest transactions, ascending on block height and block + // index: 1.1, 1.2, 2.1, 2.2... + // The resulting query should sort the rows in the chronological order. But + // that's necessary to apply the LIMIT clause. It will be sorted in the + // reverse chronological order later on. + limit = last + sortOrder = "asc" + } + if before != nil { block := nextBindVar(&args, before.BlockNumber) index := nextBindVar(&args, before.TxIndex) - predicate := fmt.Sprintf("(t.block_height, t.index) > (%s, %s)", block, index) + predicate := fmt.Sprintf("(t.block_height, t.index) < (%s, %s)", block, index) predicates = append(predicates, predicate) - limit = last - sortOrder = "asc" + // We change the sorting order because we want the transactions right before + // the cursor, meaning older transactions. + sortOrder = "desc" } - if after != nil { block := nextBindVar(&args, after.BlockNumber) index := nextBindVar(&args, after.TxIndex) - predicate := fmt.Sprintf("(t.block_height, t.index) < (%s, %s)", block, index) + predicate := fmt.Sprintf("(t.block_height, t.index) > (%s, %s)", block, index) predicates = append(predicates, predicate) - } - - // just in case we have no before cursor, but we want to have the last N transactions in the data set - // i.e. the earliest transactions, sorting ascending - if last > 0 && first == 0 && after == nil && before == nil { - limit = last + // We change the sorting order because we want the transactions right after + // the cursor, meaning newer transaction. That's necessary to apply the + // LIMIT clause. sortOrder = "asc" } @@ -143,7 +153,9 @@ func (s *Store) ListTransactions(ctx context.Context, } query = fmt.Sprintf("%s ORDER BY t.block_height %s, t.index %s", query, sortOrder, sortOrder) - query = fmt.Sprintf("%s LIMIT %d", query, limit) + if limit != 0 { + query = fmt.Sprintf("%s LIMIT %d", query, limit) + } var rows []entities.TxResultRow if err := pgxscan.Select(ctx, s.pool, &rows, query, args...); err != nil { @@ -160,8 +172,10 @@ func (s *Store) ListTransactions(ctx context.Context, txs = append(txs, tx) } - // make sure the results are always order in the same direction, i.e. newest first, regardless of the order of the - // results from the database. + // Make sure the results are always order in the reverse chronological order, + // as required. + // This cannot be replaced by the `order by` in the request as it's used by the + // pagination system. sort.Slice(txs, func(i, j int) bool { if txs[i].Block == txs[j].Block { return txs[i].Index > txs[j].Index diff --git a/blockexplorer/store/transactions_test.go b/blockexplorer/store/transactions_test.go index 094ebe6a805..3ad801ce779 100644 --- a/blockexplorer/store/transactions_test.go +++ b/blockexplorer/store/transactions_test.go @@ -295,24 +295,39 @@ func TestStore_ListTransactions(t *testing.T) { }) t.Run("should return the transactions after the cursor when first is set", func(t *testing.T) { - first := entities.TxCursor{ - BlockNumber: 5, + after := entities.TxCursor{ + BlockNumber: 2, TxIndex: 1, } - got, err := s.ListTransactions(ctx, nil, nil, nil, nil, 2, &first, 0, nil) + got, err := s.ListTransactions(ctx, nil, nil, nil, nil, 2, &after, 0, nil) require.NoError(t, err) - want := []*pb.Transaction{inserted[7], inserted[6]} + want := []*pb.Transaction{inserted[5], inserted[4]} assert.Equal(t, want, got) }) t.Run("should return the transactions before the cursor when last is set", func(t *testing.T) { - first := entities.TxCursor{ + before := entities.TxCursor{ BlockNumber: 2, TxIndex: 1, } - got, err := s.ListTransactions(ctx, nil, nil, nil, nil, 2, &first, 0, nil) + got, err := s.ListTransactions(ctx, nil, nil, nil, nil, 0, nil, 2, &before) require.NoError(t, err) want := []*pb.Transaction{inserted[2], inserted[1]} assert.Equal(t, want, got) }) + + t.Run("should return the transactions before the cursor when last is set", func(t *testing.T) { + before := entities.TxCursor{ + BlockNumber: 5, + TxIndex: 1, + } + after := entities.TxCursor{ + BlockNumber: 2, + TxIndex: 2, + } + got, err := s.ListTransactions(ctx, nil, nil, nil, nil, 0, &after, 0, &before) + require.NoError(t, err) + want := []*pb.Transaction{inserted[7], inserted[6], inserted[5]} + assert.Equal(t, want, got) + }) } diff --git a/protos/blockexplorer/api/v1/blockexplorer.pb.go b/protos/blockexplorer/api/v1/blockexplorer.pb.go index c155bde9478..56fe26d1e31 100644 --- a/protos/blockexplorer/api/v1/blockexplorer.pb.go +++ b/protos/blockexplorer/api/v1/blockexplorer.pb.go @@ -220,14 +220,9 @@ type ListTransactionsRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Number of transactions to be returned from the blockchain. - // This is deprecated, use first and last instead. - // - // Deprecated: Do not use. - Limit uint32 `protobuf:"varint,1,opt,name=limit,proto3" json:"limit,omitempty"` - // Optional cursor to paginate the request + // Cursor to paginate the request. It can be used in conjunction with the `after` cursor. Before *string `protobuf:"bytes,2,opt,name=before,proto3,oneof" json:"before,omitempty"` - // Optional cursor to paginate the request + // Cursor to paginate the request. It can be used in conjunction with the `before` cursor. After *string `protobuf:"bytes,3,opt,name=after,proto3,oneof" json:"after,omitempty"` // Filters to apply to the request Filters map[string]string `protobuf:"bytes,4,rep,name=filters,proto3" json:"filters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` @@ -237,11 +232,17 @@ type ListTransactionsRequest struct { ExcludeCmdTypes []string `protobuf:"bytes,6,rep,name=exclude_cmd_types,json=excludeCmdTypes,proto3" json:"exclude_cmd_types,omitempty"` // Party IDs filter, can be sender or receiver Parties []string `protobuf:"bytes,7,rep,name=parties,proto3" json:"parties,omitempty"` - // Number of transactions to be returned from the blockchain. Use in conjunction with the `after` cursor to paginate forwards. - // On its own, this will return the first `first` transactions. + // Number of transactions to be returned from the blockchain. + // Use in conjunction with the `after` cursor to paginate forwards. Paginating forwards means toward the most recent + // transactions. + // It cannot be used in conjunction with the `before` cursor. + // On its own, this will return the `first` most recent transactions. First uint32 `protobuf:"varint,8,opt,name=first,proto3" json:"first,omitempty"` - // Number of transactions to be returned from the blockchain. Use in conjunction with the `before` cursor to paginate backwards. - // On its own, this will return the last `last` transactions. + // Number of transactions to be returned from the blockchain. + // Use in conjunction with the `before` cursor to paginate backwards. Paginating forwards means toward the least recent + // transactions. + // It cannot be used in conjunction with the `after` cursor. + // On its own, this will return the `last` oldest transactions. Last uint32 `protobuf:"varint,9,opt,name=last,proto3" json:"last,omitempty"` } @@ -277,14 +278,6 @@ func (*ListTransactionsRequest) Descriptor() ([]byte, []int) { return file_blockexplorer_api_v1_blockexplorer_proto_rawDescGZIP(), []int{4} } -// Deprecated: Do not use. -func (x *ListTransactionsRequest) GetLimit() uint32 { - if x != nil { - return x.Limit - } - return 0 -} - func (x *ListTransactionsRequest) GetBefore() string { if x != nil && x.Before != nil { return *x.Before @@ -577,97 +570,96 @@ var file_blockexplorer_api_v1_blockexplorer_proto_rawDesc = []byte{ 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x9f, 0x03, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, + 0x69, 0x6f, 0x6e, 0x22, 0x8b, 0x03, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x18, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x02, - 0x18, 0x01, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x62, 0x65, 0x66, - 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x62, 0x65, 0x66, - 0x6f, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x88, 0x01, - 0x01, 0x12, 0x54, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, - 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6d, 0x64, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6d, 0x64, 0x54, - 0x79, 0x70, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, - 0x63, 0x6d, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6d, 0x64, 0x54, 0x79, 0x70, 0x65, 0x73, - 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, - 0x72, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x66, 0x69, 0x72, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, - 0x6c, 0x61, 0x73, 0x74, 0x1a, 0x3a, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, - 0x61, 0x66, 0x74, 0x65, 0x72, 0x22, 0x61, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x45, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, - 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xc9, 0x03, 0x0a, 0x0b, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x75, 0x62, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, - 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x35, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x03, 0x70, 0x6f, 0x77, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x4f, - 0x66, 0x57, 0x6f, 0x72, 0x6b, 0x52, 0x03, 0x70, 0x6f, 0x77, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x32, 0xc9, 0x02, 0x0a, 0x14, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x45, 0x78, - 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6d, 0x0a, - 0x0e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x2b, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x73, 0x0a, 0x10, + 0x1b, 0x0a, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, + 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x05, 0x61, + 0x66, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x2d, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2e, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x4d, 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x2e, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x62, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x0a, + 0x09, 0x63, 0x6d, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x08, 0x63, 0x6d, 0x64, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6d, + 0x64, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x72, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x66, 0x69, 0x72, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x1a, 0x3a, 0x0a, 0x0c, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x4a, 0x04, 0x08, 0x01, 0x10, + 0x02, 0x22, 0x61, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, + 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x78, 0x70, 0x6c, 0x6f, + 0x72, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xc9, 0x03, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x68, 0x61, 0x73, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, + 0x72, 0x73, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, + 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x09, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, + 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x35, + 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x03, 0x70, 0x6f, 0x77, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x57, 0x6f, 0x72, + 0x6b, 0x52, 0x03, 0x70, 0x6f, 0x77, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x32, 0xc9, 0x02, 0x0a, 0x14, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x45, 0x78, 0x70, 0x6c, 0x6f, 0x72, + 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6d, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x73, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x42, 0x7c, 0x5a, 0x35, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, - 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x92, 0x41, 0x42, 0x12, 0x27, 0x0a, 0x18, - 0x56, 0x65, 0x67, 0x61, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x6f, - 0x72, 0x65, 0x72, 0x20, 0x41, 0x50, 0x49, 0x73, 0x32, 0x0b, 0x76, 0x30, 0x2e, 0x37, 0x34, 0x2e, - 0x30, 0x2d, 0x64, 0x65, 0x76, 0x1a, 0x13, 0x6c, 0x62, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x6e, 0x65, - 0x74, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x78, 0x79, 0x7a, 0x2a, 0x02, 0x01, 0x02, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4d, 0x0a, + 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x78, 0x70, + 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x7c, 0x5a, 0x35, + 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x31, 0x92, 0x41, 0x42, 0x12, 0x27, 0x0a, 0x18, 0x56, 0x65, 0x67, 0x61, + 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x20, + 0x41, 0x50, 0x49, 0x73, 0x32, 0x0b, 0x76, 0x30, 0x2e, 0x37, 0x34, 0x2e, 0x30, 0x2d, 0x64, 0x65, + 0x76, 0x1a, 0x13, 0x6c, 0x62, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x78, 0x79, 0x7a, 0x2a, 0x02, 0x01, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( diff --git a/protos/blockexplorer/api/v1/blockexplorer_grpc.pb.go b/protos/blockexplorer/api/v1/blockexplorer_grpc.pb.go index 59b33c493c6..734a6b45219 100644 --- a/protos/blockexplorer/api/v1/blockexplorer_grpc.pb.go +++ b/protos/blockexplorer/api/v1/blockexplorer_grpc.pb.go @@ -28,7 +28,7 @@ type BlockExplorerServiceClient interface { GetTransaction(ctx context.Context, in *GetTransactionRequest, opts ...grpc.CallOption) (*GetTransactionResponse, error) // List transactions // - // List transactions from the Vega blockchain + // List transactions from the Vega blockchain from the newest to the oldest transactions. ListTransactions(ctx context.Context, in *ListTransactionsRequest, opts ...grpc.CallOption) (*ListTransactionsResponse, error) // Info // @@ -82,7 +82,7 @@ type BlockExplorerServiceServer interface { GetTransaction(context.Context, *GetTransactionRequest) (*GetTransactionResponse, error) // List transactions // - // List transactions from the Vega blockchain + // List transactions from the Vega blockchain from the newest to the oldest transactions. ListTransactions(context.Context, *ListTransactionsRequest) (*ListTransactionsResponse, error) // Info // diff --git a/protos/sources/blockexplorer/api/v1/blockexplorer.proto b/protos/sources/blockexplorer/api/v1/blockexplorer.proto index 88d8fe614e8..4d4cb369451 100644 --- a/protos/sources/blockexplorer/api/v1/blockexplorer.proto +++ b/protos/sources/blockexplorer/api/v1/blockexplorer.proto @@ -28,7 +28,7 @@ service BlockExplorerService { // List transactions // - // List transactions from the Vega blockchain + // List transactions from the Vega blockchain from the newest to the oldest transactions. rpc ListTransactions(ListTransactionsRequest) returns (ListTransactionsResponse) {} // Info @@ -59,12 +59,10 @@ message GetTransactionResponse { } message ListTransactionsRequest { - // Number of transactions to be returned from the blockchain. - // This is deprecated, use first and last instead. - uint32 limit = 1 [deprecated = true]; - // Optional cursor to paginate the request + reserved 1; + // Cursor to paginate the request. It can be used in conjunction with the `after` cursor. optional string before = 2; - // Optional cursor to paginate the request + // Cursor to paginate the request. It can be used in conjunction with the `before` cursor. optional string after = 3; // Filters to apply to the request map filters = 4; @@ -74,11 +72,17 @@ message ListTransactionsRequest { repeated string exclude_cmd_types = 6; // Party IDs filter, can be sender or receiver repeated string parties = 7; - // Number of transactions to be returned from the blockchain. Use in conjunction with the `after` cursor to paginate forwards. - // On its own, this will return the first `first` transactions. + // Number of transactions to be returned from the blockchain. + // Use in conjunction with the `after` cursor to paginate forwards. Paginating forwards means toward the most recent + // transactions. + // It cannot be used in conjunction with the `before` cursor. + // On its own, this will return the `first` most recent transactions. uint32 first = 8; - // Number of transactions to be returned from the blockchain. Use in conjunction with the `before` cursor to paginate backwards. - // On its own, this will return the last `last` transactions. + // Number of transactions to be returned from the blockchain. + // Use in conjunction with the `before` cursor to paginate backwards. Paginating forwards means toward the least recent + // transactions. + // It cannot be used in conjunction with the `after` cursor. + // On its own, this will return the `last` oldest transactions. uint32 last = 9; }