diff --git a/app/appmessage/message.go b/app/appmessage/message.go index f4f66016d..7b12147d6 100644 --- a/app/appmessage/message.go +++ b/app/appmessage/message.go @@ -41,8 +41,6 @@ const ( CmdPong CmdRequestBlockLocator CmdBlockLocator - CmdSelectedTip - CmdRequestSelectedTip CmdInvRelayBlock CmdRequestRelayBlocks CmdInvTransaction @@ -123,8 +121,6 @@ var ProtocolMessageCommandToString = map[MessageCommand]string{ CmdPong: "Pong", CmdRequestBlockLocator: "RequestBlockLocator", CmdBlockLocator: "BlockLocator", - CmdSelectedTip: "SelectedTip", - CmdRequestSelectedTip: "RequestSelectedTip", CmdInvRelayBlock: "InvRelayBlock", CmdRequestRelayBlocks: "RequestRelayBlocks", CmdInvTransaction: "InvTransaction", diff --git a/app/appmessage/p2p_msgibdblock_test.go b/app/appmessage/p2p_msgibdblock_test.go index 5998aa737..c72e1de09 100644 --- a/app/appmessage/p2p_msgibdblock_test.go +++ b/app/appmessage/p2p_msgibdblock_test.go @@ -25,7 +25,7 @@ func TestIBDBlock(t *testing.T) { bh := NewBlockHeader(1, parentHashes, hashMerkleRoot, acceptedIDMerkleRoot, utxoCommitment, bits, nonce) // Ensure the command is expected value. - wantCmd := MessageCommand(17) + wantCmd := MessageCommand(15) msg := NewMsgIBDBlock(NewMsgBlock(bh)) if cmd := msg.Command(); cmd != wantCmd { t.Errorf("NewMsgIBDBlock: wrong command - got %v want %v", diff --git a/app/appmessage/p2p_msgrequestblocklocator.go b/app/appmessage/p2p_msgrequestblocklocator.go index d1cd2f702..5956bf3ac 100644 --- a/app/appmessage/p2p_msgrequestblocklocator.go +++ b/app/appmessage/p2p_msgrequestblocklocator.go @@ -5,13 +5,14 @@ import ( ) // MsgRequestBlockLocator implements the Message interface and represents a kaspa -// RequestBlockLocator message. It is used to request a block locator between high -// and low hash. +// RequestBlockLocator message. It is used to request a block locator between low +// and high hash. // The locator is returned via a locator message (MsgBlockLocator). type MsgRequestBlockLocator struct { baseMessage - HighHash *externalapi.DomainHash LowHash *externalapi.DomainHash + HighHash *externalapi.DomainHash + Limit uint32 } // Command returns the protocol command string for the message. This is part @@ -23,9 +24,10 @@ func (msg *MsgRequestBlockLocator) Command() MessageCommand { // NewMsgRequestBlockLocator returns a new RequestBlockLocator message that conforms to the // Message interface using the passed parameters and defaults for the remaining // fields. -func NewMsgRequestBlockLocator(highHash, lowHash *externalapi.DomainHash) *MsgRequestBlockLocator { +func NewMsgRequestBlockLocator(lowHash, highHash *externalapi.DomainHash, limit uint32) *MsgRequestBlockLocator { return &MsgRequestBlockLocator{ - HighHash: highHash, LowHash: lowHash, + HighHash: highHash, + Limit: limit, } } diff --git a/app/appmessage/p2p_msgrequestblocklocator_test.go b/app/appmessage/p2p_msgrequestblocklocator_test.go index 9498d7d62..925f3922b 100644 --- a/app/appmessage/p2p_msgrequestblocklocator_test.go +++ b/app/appmessage/p2p_msgrequestblocklocator_test.go @@ -18,7 +18,7 @@ func TestRequestBlockLocator(t *testing.T) { // Ensure the command is expected value. wantCmd := MessageCommand(9) - msg := NewMsgRequestBlockLocator(highHash, &externalapi.DomainHash{}) + msg := NewMsgRequestBlockLocator(highHash, &externalapi.DomainHash{}, 0) if cmd := msg.Command(); cmd != wantCmd { t.Errorf("NewMsgRequestBlockLocator: wrong command - got %v want %v", cmd, wantCmd) diff --git a/app/appmessage/p2p_msgrequestibdblocks.go b/app/appmessage/p2p_msgrequestibdblocks.go index 848490716..078a00dde 100644 --- a/app/appmessage/p2p_msgrequestibdblocks.go +++ b/app/appmessage/p2p_msgrequestibdblocks.go @@ -4,10 +4,6 @@ import ( "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" ) -// MaxRequestIBDBlocksHashes is the maximum number of hashes that can -// be in a single RequestIBDBlocks message. -const MaxRequestIBDBlocksHashes = MaxInvPerMsg - // MsgRequestIBDBlocks implements the Message interface and represents a kaspa // RequestIBDBlocks message. It is used to request blocks as part of the IBD // protocol. diff --git a/app/appmessage/p2p_msgrequestselectedtip.go b/app/appmessage/p2p_msgrequestselectedtip.go deleted file mode 100644 index e52a28e6d..000000000 --- a/app/appmessage/p2p_msgrequestselectedtip.go +++ /dev/null @@ -1,21 +0,0 @@ -package appmessage - -// MsgRequestSelectedTip implements the Message interface and represents a kaspa -// RequestSelectedTip message. It is used to request the selected tip of another peer. -// -// This message has no payload. -type MsgRequestSelectedTip struct { - baseMessage -} - -// Command returns the protocol command string for the message. This is part -// of the Message interface implementation. -func (msg *MsgRequestSelectedTip) Command() MessageCommand { - return CmdRequestSelectedTip -} - -// NewMsgRequestSelectedTip returns a new kaspa RequestSelectedTip message that conforms to the -// Message interface. -func NewMsgRequestSelectedTip() *MsgRequestSelectedTip { - return &MsgRequestSelectedTip{} -} diff --git a/app/appmessage/p2p_msgrequestselectedtip_test.go b/app/appmessage/p2p_msgrequestselectedtip_test.go deleted file mode 100644 index 1191cdf50..000000000 --- a/app/appmessage/p2p_msgrequestselectedtip_test.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) 2013-2016 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -package appmessage - -import ( - "testing" -) - -// TestRequestSelectedTip tests the MsgRequestSelectedTip API. -func TestRequestSelectedTip(t *testing.T) { - // Ensure the command is expected value. - wantCmd := MessageCommand(12) - msg := NewMsgRequestSelectedTip() - if cmd := msg.Command(); cmd != wantCmd { - t.Errorf("NewMsgRequestSelectedTip: wrong command - got %v want %v", - cmd, wantCmd) - } -} diff --git a/app/appmessage/p2p_msgselectedtip.go b/app/appmessage/p2p_msgselectedtip.go deleted file mode 100644 index db0cd4213..000000000 --- a/app/appmessage/p2p_msgselectedtip.go +++ /dev/null @@ -1,28 +0,0 @@ -package appmessage - -import ( - "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" -) - -// MsgSelectedTip implements the Message interface and represents a kaspa -// selectedtip message. It is used to answer getseltip messages and tell -// the asking peer what is the selected tip of this peer. -type MsgSelectedTip struct { - baseMessage - // The selected tip hash of the generator of the message. - SelectedTipHash *externalapi.DomainHash -} - -// Command returns the protocol command string for the message. This is part -// of the Message interface implementation. -func (msg *MsgSelectedTip) Command() MessageCommand { - return CmdSelectedTip -} - -// NewMsgSelectedTip returns a new kaspa selectedtip message that conforms to the -// Message interface. -func NewMsgSelectedTip(selectedTipHash *externalapi.DomainHash) *MsgSelectedTip { - return &MsgSelectedTip{ - SelectedTipHash: selectedTipHash, - } -} diff --git a/app/appmessage/p2p_msgselectedtip_test.go b/app/appmessage/p2p_msgselectedtip_test.go deleted file mode 100644 index 35ca71498..000000000 --- a/app/appmessage/p2p_msgselectedtip_test.go +++ /dev/null @@ -1,18 +0,0 @@ -package appmessage - -import ( - "testing" - - "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" -) - -// TestSelectedTip tests the MsgSelectedTip API. -func TestSelectedTip(t *testing.T) { - // Ensure the command is expected value. - wantCmd := MessageCommand(11) - msg := NewMsgSelectedTip(&externalapi.DomainHash{}) - if cmd := msg.Command(); cmd != wantCmd { - t.Errorf("NewMsgSelectedTip: wrong command - got %v want %v", - cmd, wantCmd) - } -} diff --git a/app/appmessage/p2p_msgversion.go b/app/appmessage/p2p_msgversion.go index fc1fee48c..56f899497 100644 --- a/app/appmessage/p2p_msgversion.go +++ b/app/appmessage/p2p_msgversion.go @@ -53,9 +53,6 @@ type MsgVersion struct { // on the appmessage. This has a max length of MaxUserAgentLen. UserAgent string - // The selected tip hash of the generator of the version message. - SelectedTipHash *externalapi.DomainHash - // Don't announce transactions to peer. DisableRelayTx bool @@ -85,7 +82,7 @@ func (msg *MsgVersion) Command() MessageCommand { // Message interface using the passed parameters and defaults for the remaining // fields. func NewMsgVersion(addr *NetAddress, id *id.ID, network string, - selectedTipHash *externalapi.DomainHash, subnetworkID *externalapi.DomainSubnetworkID) *MsgVersion { + subnetworkID *externalapi.DomainSubnetworkID) *MsgVersion { // Limit the timestamp to one millisecond precision since the protocol // doesn't support better. @@ -97,7 +94,6 @@ func NewMsgVersion(addr *NetAddress, id *id.ID, network string, Address: addr, ID: id, UserAgent: DefaultUserAgent, - SelectedTipHash: selectedTipHash, DisableRelayTx: false, SubnetworkID: subnetworkID, } diff --git a/app/appmessage/p2p_msgversion_test.go b/app/appmessage/p2p_msgversion_test.go index 936f911e7..f03e61e8d 100644 --- a/app/appmessage/p2p_msgversion_test.go +++ b/app/appmessage/p2p_msgversion_test.go @@ -10,7 +10,6 @@ import ( "testing" "github.com/davecgh/go-spew/spew" - "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" "github.com/kaspanet/kaspad/infrastructure/network/netadapter/id" ) @@ -19,7 +18,6 @@ func TestVersion(t *testing.T) { pver := ProtocolVersion // Create version message data. - selectedTipHash := &externalapi.DomainHash{12, 34} tcpAddrMe := &net.TCPAddr{IP: net.ParseIP("127.0.0.1"), Port: 16111} me := NewNetAddress(tcpAddrMe, SFNodeNetwork) generatedID, err := id.GenerateID() @@ -28,7 +26,7 @@ func TestVersion(t *testing.T) { } // Ensure we get the correct data back out. - msg := NewMsgVersion(me, generatedID, "mainnet", selectedTipHash, nil) + msg := NewMsgVersion(me, generatedID, "mainnet", nil) if msg.ProtocolVersion != pver { t.Errorf("NewMsgVersion: wrong protocol version - got %v, want %v", msg.ProtocolVersion, pver) @@ -45,10 +43,6 @@ func TestVersion(t *testing.T) { t.Errorf("NewMsgVersion: wrong user agent - got %v, want %v", msg.UserAgent, DefaultUserAgent) } - if *msg.SelectedTipHash != *selectedTipHash { - t.Errorf("NewMsgVersion: wrong selected tip hash - got %s, want %s", - msg.SelectedTipHash, selectedTipHash) - } if msg.DisableRelayTx { t.Errorf("NewMsgVersion: disable relay tx is not false by "+ "default - got %v, want %v", msg.DisableRelayTx, false) diff --git a/app/appmessage/rpc_get_connected_peer_info.go b/app/appmessage/rpc_get_connected_peer_info.go index c6d937029..3bb4cbc38 100644 --- a/app/appmessage/rpc_get_connected_peer_info.go +++ b/app/appmessage/rpc_get_connected_peer_info.go @@ -41,8 +41,6 @@ type GetConnectedPeerInfoMessage struct { ID string Address string LastPingDuration int64 - SelectedTipHash string - IsSyncNode bool IsOutbound bool TimeOffset int64 UserAgent string diff --git a/app/protocol/flowcontext/blocks.go b/app/protocol/flowcontext/blocks.go index 592c1b53c..78d4ef6eb 100644 --- a/app/protocol/flowcontext/blocks.go +++ b/app/protocol/flowcontext/blocks.go @@ -53,7 +53,7 @@ func (f *FlowContext) broadcastTransactionsAfterBlockAdded( f.updateTransactionsToRebroadcast(block) // Don't relay transactions when in IBD. - if atomic.LoadUint32(&f.isInIBD) != 0 { + if f.IsIBDRunning() { return nil } @@ -103,3 +103,27 @@ func (f *FlowContext) AddBlock(block *externalapi.DomainBlock) error { } return f.Broadcast(appmessage.NewMsgInvBlock(consensushashing.BlockHash(block))) } + +// IsIBDRunning returns true if IBD is currently marked as running +func (f *FlowContext) IsIBDRunning() bool { + return atomic.LoadUint32(&f.isInIBD) != 0 +} + +// TrySetIBDRunning attempts to set `isInIBD`. Returns false +// if it is already set +func (f *FlowContext) TrySetIBDRunning() bool { + succeeded := atomic.CompareAndSwapUint32(&f.isInIBD, 0, 1) + if succeeded { + log.Infof("IBD started") + } + return succeeded +} + +// UnsetIBDRunning unsets isInIBD +func (f *FlowContext) UnsetIBDRunning() { + succeeded := atomic.CompareAndSwapUint32(&f.isInIBD, 1, 0) + if !succeeded { + panic("attempted to unset isInIBD when it was not set to begin with") + } + log.Infof("IBD finished") +} diff --git a/app/protocol/flowcontext/flow_context.go b/app/protocol/flowcontext/flow_context.go index c88906a02..0394e9a87 100644 --- a/app/protocol/flowcontext/flow_context.go +++ b/app/protocol/flowcontext/flow_context.go @@ -9,7 +9,7 @@ import ( "github.com/kaspanet/kaspad/domain" "github.com/kaspanet/kaspad/app/protocol/flows/blockrelay" - "github.com/kaspanet/kaspad/app/protocol/flows/relaytransactions" + "github.com/kaspanet/kaspad/app/protocol/flows/transactionrelay" peerpkg "github.com/kaspanet/kaspad/app/protocol/peer" "github.com/kaspanet/kaspad/infrastructure/config" "github.com/kaspanet/kaspad/infrastructure/network/addressmanager" @@ -41,13 +41,11 @@ type FlowContext struct { transactionsToRebroadcastLock sync.Mutex transactionsToRebroadcast map[externalapi.DomainTransactionID]*externalapi.DomainTransaction lastRebroadcastTime time.Time - sharedRequestedTransactions *relaytransactions.SharedRequestedTransactions + sharedRequestedTransactions *transactionrelay.SharedRequestedTransactions sharedRequestedBlocks *blockrelay.SharedRequestedBlocks - isInIBD uint32 - startIBDMutex sync.Mutex - ibdPeer *peerpkg.Peer + isInIBD uint32 peers map[id.ID]*peerpkg.Peer peersMutex sync.RWMutex @@ -66,7 +64,7 @@ func New(cfg *config.Config, domain domain.Domain, addressManager *addressmanage domain: domain, addressManager: addressManager, connectionManager: connectionManager, - sharedRequestedTransactions: relaytransactions.NewSharedRequestedTransactions(), + sharedRequestedTransactions: transactionrelay.NewSharedRequestedTransactions(), sharedRequestedBlocks: blockrelay.NewSharedRequestedBlocks(), peers: make(map[id.ID]*peerpkg.Peer), transactionsToRebroadcast: make(map[externalapi.DomainTransactionID]*externalapi.DomainTransaction), diff --git a/app/protocol/flowcontext/ibd.go b/app/protocol/flowcontext/ibd.go deleted file mode 100644 index e7d8a7b92..000000000 --- a/app/protocol/flowcontext/ibd.go +++ /dev/null @@ -1,130 +0,0 @@ -package flowcontext - -import ( - "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" - "sync/atomic" - "time" - - "github.com/kaspanet/kaspad/util/mstime" - - peerpkg "github.com/kaspanet/kaspad/app/protocol/peer" -) - -// StartIBDIfRequired selects a peer and starts IBD against it -// if required -func (f *FlowContext) StartIBDIfRequired() error { - f.startIBDMutex.Lock() - defer f.startIBDMutex.Unlock() - - if f.IsInIBD() { - return nil - } - - syncInfo, err := f.domain.Consensus().GetSyncInfo() - if err != nil { - return err - } - - if syncInfo.State == externalapi.SyncStateRelay { - return nil - } - - peer, err := f.selectPeerForIBD(syncInfo) - if err != nil { - return err - } - if peer == nil { - spawn("StartIBDIfRequired-requestSelectedTipsIfRequired", f.requestSelectedTipsIfRequired) - return nil - } - - atomic.StoreUint32(&f.isInIBD, 1) - f.ibdPeer = peer - spawn("StartIBDIfRequired-peer.StartIBD", peer.StartIBD) - - return nil -} - -// IsInIBD is true if IBD is currently running -func (f *FlowContext) IsInIBD() bool { - return atomic.LoadUint32(&f.isInIBD) != 0 -} - -// selectPeerForIBD returns the first peer whose selected tip -// hash is not in our DAG -func (f *FlowContext) selectPeerForIBD(syncInfo *externalapi.SyncInfo) (*peerpkg.Peer, error) { - f.peersMutex.RLock() - defer f.peersMutex.RUnlock() - - for _, peer := range f.peers { - peerSelectedTipHash := peer.SelectedTipHash() - - if f.IsOrphan(peerSelectedTipHash) { - continue - } - - blockInfo, err := f.domain.Consensus().GetBlockInfo(peerSelectedTipHash) - if err != nil { - return nil, err - } - if syncInfo.State == externalapi.SyncStateHeadersFirst { - if !blockInfo.Exists { - return peer, nil - } - } else { - if blockInfo.Exists && blockInfo.BlockStatus == externalapi.StatusHeaderOnly && - blockInfo.IsBlockInHeaderPruningPointFuture { - return peer, nil - } - } - } - return nil, nil -} - -func (f *FlowContext) requestSelectedTipsIfRequired() { - dagTimeCurrent, err := f.shouldRequestSelectedTips() - if err != nil { - panic(err) - } - if dagTimeCurrent { - return - } - f.requestSelectedTips() -} - -func (f *FlowContext) shouldRequestSelectedTips() (bool, error) { - const minDurationToRequestSelectedTips = time.Minute - virtualSelectedParent, err := f.domain.Consensus().GetVirtualSelectedParent() - if err != nil { - return false, err - } - virtualSelectedParentTime := mstime.UnixMilliseconds(virtualSelectedParent.Header.TimeInMilliseconds) - return mstime.Now().Sub(virtualSelectedParentTime) > minDurationToRequestSelectedTips, nil -} - -func (f *FlowContext) requestSelectedTips() { - f.peersMutex.RLock() - defer f.peersMutex.RUnlock() - - for _, peer := range f.peers { - peer.RequestSelectedTipIfRequired() - } -} - -// FinishIBD finishes the current IBD flow and starts a new one if required. -func (f *FlowContext) FinishIBD() error { - f.ibdPeer = nil - - atomic.StoreUint32(&f.isInIBD, 0) - - return f.StartIBDIfRequired() -} - -// IBDPeer returns the currently active IBD peer. -// Returns nil if we aren't currently in IBD -func (f *FlowContext) IBDPeer() *peerpkg.Peer { - if !f.IsInIBD() { - return nil - } - return f.ibdPeer -} diff --git a/app/protocol/flowcontext/orphans.go b/app/protocol/flowcontext/orphans.go index 6e70c68be..8200bbefe 100644 --- a/app/protocol/flowcontext/orphans.go +++ b/app/protocol/flowcontext/orphans.go @@ -52,7 +52,7 @@ func (f *FlowContext) UnorphanBlocks(rootBlock *externalapi.DomainBlock) ([]*ext if err != nil { return nil, err } - if !orphanBlockParentInfo.Exists { + if !orphanBlockParentInfo.Exists || orphanBlockParentInfo.BlockStatus == externalapi.StatusHeaderOnly { log.Tracef("Cannot unorphan block %s. It's missing at "+ "least the following parent: %s", orphanHash, orphanBlockParentHash) diff --git a/app/protocol/flowcontext/transactions.go b/app/protocol/flowcontext/transactions.go index 491248a55..3e891773f 100644 --- a/app/protocol/flowcontext/transactions.go +++ b/app/protocol/flowcontext/transactions.go @@ -4,7 +4,7 @@ import ( "time" "github.com/kaspanet/kaspad/app/appmessage" - "github.com/kaspanet/kaspad/app/protocol/flows/relaytransactions" + "github.com/kaspanet/kaspad/app/protocol/flows/transactionrelay" "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" "github.com/kaspanet/kaspad/domain/consensus/utils/consensushashing" ) @@ -54,9 +54,9 @@ func (f *FlowContext) txIDsToRebroadcast() []*externalapi.DomainTransactionID { return txIDs } -// SharedRequestedTransactions returns a *relaytransactions.SharedRequestedTransactions for sharing +// SharedRequestedTransactions returns a *transactionrelay.SharedRequestedTransactions for sharing // data about requested transactions between different peers. -func (f *FlowContext) SharedRequestedTransactions() *relaytransactions.SharedRequestedTransactions { +func (f *FlowContext) SharedRequestedTransactions() *transactionrelay.SharedRequestedTransactions { return f.sharedRequestedTransactions } diff --git a/app/protocol/flows/blockrelay/block_locator.go b/app/protocol/flows/blockrelay/block_locator.go new file mode 100644 index 000000000..1a03fe5b2 --- /dev/null +++ b/app/protocol/flows/blockrelay/block_locator.go @@ -0,0 +1,29 @@ +package blockrelay + +import ( + "github.com/kaspanet/kaspad/app/appmessage" + "github.com/kaspanet/kaspad/app/protocol/common" + "github.com/kaspanet/kaspad/app/protocol/protocolerrors" + "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" +) + +func (flow *handleRelayInvsFlow) sendGetBlockLocator(lowHash *externalapi.DomainHash, + highHash *externalapi.DomainHash, limit uint32) error { + + msgGetBlockLocator := appmessage.NewMsgRequestBlockLocator(lowHash, highHash, limit) + return flow.outgoingRoute.Enqueue(msgGetBlockLocator) +} + +func (flow *handleRelayInvsFlow) receiveBlockLocator() (blockLocatorHashes []*externalapi.DomainHash, err error) { + message, err := flow.dequeueIncomingMessageAndSkipInvs(common.DefaultTimeout) + if err != nil { + return nil, err + } + msgBlockLocator, ok := message.(*appmessage.MsgBlockLocator) + if !ok { + return nil, + protocolerrors.Errorf(true, "received unexpected message type. "+ + "expected: %s, got: %s", appmessage.CmdBlockLocator, message.Command()) + } + return msgBlockLocator.BlockLocatorHashes, nil +} diff --git a/app/protocol/flows/ibd/handle_ibd_block_requests.go b/app/protocol/flows/blockrelay/handle_ibd_block_requests.go similarity index 90% rename from app/protocol/flows/ibd/handle_ibd_block_requests.go rename to app/protocol/flows/blockrelay/handle_ibd_block_requests.go index 794b66a5f..e70e49eee 100644 --- a/app/protocol/flows/ibd/handle_ibd_block_requests.go +++ b/app/protocol/flows/blockrelay/handle_ibd_block_requests.go @@ -1,9 +1,10 @@ -package ibd +package blockrelay import ( "github.com/kaspanet/kaspad/app/appmessage" "github.com/kaspanet/kaspad/app/protocol/protocolerrors" "github.com/kaspanet/kaspad/domain" + "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" "github.com/kaspanet/kaspad/infrastructure/network/netadapter/router" "github.com/pkg/errors" ) @@ -30,7 +31,7 @@ func HandleIBDBlockRequests(context HandleIBDBlockRequestsContext, incomingRoute if err != nil { return err } - if !blockInfo.Exists { + if !blockInfo.Exists || blockInfo.BlockStatus == externalapi.StatusHeaderOnly { return protocolerrors.Errorf(true, "block %s not found", hash) } block, err := context.Domain().Consensus().GetBlock(hash) diff --git a/app/protocol/flows/blockrelay/handle_relay_block_requests.go b/app/protocol/flows/blockrelay/handle_relay_block_requests.go index 910a2ff0b..d64cf47cc 100644 --- a/app/protocol/flows/blockrelay/handle_relay_block_requests.go +++ b/app/protocol/flows/blockrelay/handle_relay_block_requests.go @@ -5,6 +5,7 @@ import ( peerpkg "github.com/kaspanet/kaspad/app/protocol/peer" "github.com/kaspanet/kaspad/app/protocol/protocolerrors" "github.com/kaspanet/kaspad/domain" + "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" "github.com/kaspanet/kaspad/infrastructure/network/netadapter/router" "github.com/pkg/errors" ) @@ -31,7 +32,7 @@ func HandleRelayBlockRequests(context RelayBlockRequestsContext, incomingRoute * if err != nil { return err } - if !blockInfo.Exists { + if !blockInfo.Exists || blockInfo.BlockStatus == externalapi.StatusHeaderOnly { return protocolerrors.Errorf(true, "block %s not found", hash) } block, err := context.Domain().Consensus().GetBlock(hash) diff --git a/app/protocol/flows/blockrelay/handle_relay_invs.go b/app/protocol/flows/blockrelay/handle_relay_invs.go index ce27f9660..3d0546d02 100644 --- a/app/protocol/flows/blockrelay/handle_relay_invs.go +++ b/app/protocol/flows/blockrelay/handle_relay_invs.go @@ -9,24 +9,30 @@ import ( "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" "github.com/kaspanet/kaspad/domain/consensus/ruleerrors" "github.com/kaspanet/kaspad/domain/consensus/utils/consensushashing" - "github.com/kaspanet/kaspad/infrastructure/logger" + "github.com/kaspanet/kaspad/infrastructure/config" "github.com/kaspanet/kaspad/infrastructure/network/netadapter" "github.com/kaspanet/kaspad/infrastructure/network/netadapter/router" - mathUtil "github.com/kaspanet/kaspad/util/math" "github.com/pkg/errors" ) +// orphanResolutionRange is the maximum amount of blockLocator hashes +// to search for known blocks. See isBlockInOrphanResolutionRange for +// further details +var orphanResolutionRange uint32 = 5 + // RelayInvsContext is the interface for the context needed for the HandleRelayInvs flow. type RelayInvsContext interface { Domain() domain.Domain + Config() *config.Config NetAdapter() *netadapter.NetAdapter OnNewBlock(block *externalapi.DomainBlock) error SharedRequestedBlocks() *SharedRequestedBlocks - StartIBDIfRequired() error - IsInIBD() bool Broadcast(message appmessage.Message) error AddOrphan(orphanBlock *externalapi.DomainBlock) IsOrphan(blockHash *externalapi.DomainHash) bool + IsIBDRunning() bool + TrySetIBDRunning() bool + UnsetIBDRunning() } type handleRelayInvsFlow struct { @@ -79,24 +85,45 @@ func (flow *handleRelayInvsFlow) start() error { continue } - err = flow.StartIBDIfRequired() - if err != nil { - return err - } - if flow.IsInIBD() { + // Block relay is disabled during IBD + if flow.IsIBDRunning() { log.Debugf("Got block %s while in IBD. continuing...", inv.Hash) - // Block relay is disabled during IBD continue } - requestQueue := newHashesQueueSet() - requestQueue.enqueueIfNotExists(inv.Hash) + log.Debugf("Requesting block %s", inv.Hash) + block, exists, err := flow.requestBlock(inv.Hash) + if err != nil { + return err + } + if exists { + log.Debugf("Aborting requesting block %s because it already exists", inv.Hash) + continue + } - for requestQueue.len() > 0 { - err := flow.requestBlocks(requestQueue) + log.Debugf("Processing block %s", inv.Hash) + missingParents, err := flow.processBlock(block) + if err != nil { + return err + } + if len(missingParents) > 0 { + log.Debugf("Block %s contains orphans: %s", inv.Hash, missingParents) + err := flow.processOrphan(block, missingParents) if err != nil { return err } + continue + } + + log.Debugf("Relaying block %s", inv.Hash) + err = flow.relayBlock(block) + if err != nil { + return err + } + log.Infof("Accepted block %s via relay", inv.Hash) + err = flow.OnNewBlock(block) + if err != nil { + return err } } } @@ -121,73 +148,34 @@ func (flow *handleRelayInvsFlow) readInv() (*appmessage.MsgInvRelayBlock, error) return inv, nil } -func (flow *handleRelayInvsFlow) requestBlocks(requestQueue *hashesQueueSet) error { - onEnd := logger.LogAndMeasureExecutionTime(log, "handleRelayInvsFlow.requestBlocks") - defer onEnd() - - numHashesToRequest := mathUtil.MinInt(appmessage.MaxRequestRelayBlocksHashes, requestQueue.len()) - hashesToRequest := requestQueue.dequeue(numHashesToRequest) - - requestedBlocksSet := map[externalapi.DomainHash]struct{}{} - var filteredHashesToRequest []*externalapi.DomainHash - for _, hash := range hashesToRequest { - exists := flow.SharedRequestedBlocks().addIfNotExists(hash) - if exists { - continue - } - - // The block can become known from another peer in the process of orphan resolution - blockInfo, err := flow.Domain().Consensus().GetBlockInfo(hash) - if err != nil { - return err - } - if blockInfo.Exists { - continue - } - - requestedBlocksSet[*hash] = struct{}{} - filteredHashesToRequest = append(filteredHashesToRequest, hash) - } - - // Exit early if we've filtered out all the hashes - if len(filteredHashesToRequest) == 0 { - log.Debugf("requestBlocks - no hashes to request. Returning..") - return nil +func (flow *handleRelayInvsFlow) requestBlock(requestHash *externalapi.DomainHash) (*externalapi.DomainBlock, bool, error) { + exists := flow.SharedRequestedBlocks().addIfNotExists(requestHash) + if exists { + return nil, true, nil } // In case the function returns earlier than expected, we want to make sure flow.SharedRequestedBlocks() is // clean from any pending blocks. - defer flow.SharedRequestedBlocks().removeSet(requestedBlocksSet) + defer flow.SharedRequestedBlocks().remove(requestHash) - getRelayBlocksMsg := appmessage.NewMsgRequestRelayBlocks(filteredHashesToRequest) + getRelayBlocksMsg := appmessage.NewMsgRequestRelayBlocks([]*externalapi.DomainHash{requestHash}) err := flow.outgoingRoute.Enqueue(getRelayBlocksMsg) if err != nil { - return err + return nil, false, err } - for _, expectedHash := range filteredHashesToRequest { - log.Debugf("Waiting for block %s", expectedHash) - msgBlock, err := flow.readMsgBlock() - if err != nil { - return err - } - - block := appmessage.MsgBlockToDomainBlock(msgBlock) - blockHash := consensushashing.BlockHash(block) - log.Criticalf("got block %s", blockHash) - - if *blockHash != *expectedHash { - return protocolerrors.Errorf(true, "expected block %s but got %s", expectedHash, blockHash) - } - - err = flow.processAndRelayBlock(requestQueue, requestedBlocksSet, block) - if err != nil { - return err - } - - flow.SharedRequestedBlocks().remove(blockHash) + msgBlock, err := flow.readMsgBlock() + if err != nil { + return nil, false, err } - return nil + + block := appmessage.MsgBlockToDomainBlock(msgBlock) + blockHash := consensushashing.BlockHash(block) + if *blockHash != *requestHash { + return nil, false, protocolerrors.Errorf(true, "got unrequested block %s", blockHash) + } + + return block, false, nil } // readMsgBlock returns the next msgBlock in msgChan, and populates invsQueue with any inv messages that meanwhile arrive. @@ -211,52 +199,92 @@ func (flow *handleRelayInvsFlow) readMsgBlock() (msgBlock *appmessage.MsgBlock, } } -func (flow *handleRelayInvsFlow) processAndRelayBlock(requestQueue *hashesQueueSet, requestedBlocksSet map[externalapi.DomainHash]struct{}, block *externalapi.DomainBlock) error { +func (flow *handleRelayInvsFlow) processBlock(block *externalapi.DomainBlock) ([]*externalapi.DomainHash, error) { blockHash := consensushashing.BlockHash(block) - log.Debugf("processAndRelayBlock start for block %s", blockHash) - defer log.Debugf("processAndRelayBlock end for block %s", blockHash) - err := flow.Domain().Consensus().ValidateAndInsertBlock(block) if err != nil { if !errors.As(err, &ruleerrors.RuleError{}) { - return errors.Wrapf(err, "failed to process block %s", blockHash) + return nil, errors.Wrapf(err, "failed to process block %s", blockHash) } missingParentsError := &ruleerrors.ErrMissingParents{} if errors.As(err, missingParentsError) { - // Add the orphan to the orphan pool - flow.AddOrphan(block) - - // Request the parents for the orphan block from the peer that sent it. - for _, missingAncestor := range missingParentsError.MissingParentHashes { - if _, ok := requestedBlocksSet[*missingAncestor]; ok { - log.Debugf("ancestor %s already exists in requestedBlocksSet", missingAncestor) - continue - } - requestQueue.enqueueIfNotExists(missingAncestor) - } - return nil + return missingParentsError.MissingParentHashes, nil } - log.Infof("Rejected block %s from %s: %s", blockHash, flow.peer, err) + log.Warnf("Rejected block %s from %s: %s", blockHash, flow.peer, err) - return protocolerrors.Wrapf(true, err, "got invalid block %s from relay", blockHash) + return nil, protocolerrors.Wrapf(true, err, "got invalid block %s from relay", blockHash) } - - err = flow.Broadcast(appmessage.NewMsgInvBlock(blockHash)) - if err != nil { - return err - } - - log.Debugf("Accepted block %s via relay", blockHash) - - err = flow.StartIBDIfRequired() - if err != nil { - return err - } - err = flow.OnNewBlock(block) - if err != nil { - return err - } - - return nil + return nil, nil +} + +func (flow *handleRelayInvsFlow) relayBlock(block *externalapi.DomainBlock) error { + blockHash := consensushashing.BlockHash(block) + return flow.Broadcast(appmessage.NewMsgInvBlock(blockHash)) +} + +func (flow *handleRelayInvsFlow) processOrphan(block *externalapi.DomainBlock, missingParents []*externalapi.DomainHash) error { + blockHash := consensushashing.BlockHash(block) + + // Return if the block has been orphaned from elsewhere already + if flow.IsOrphan(blockHash) { + log.Debugf("Skipping orphan processing for block %s because it is already an orphan", blockHash) + return nil + } + + // Add the block to the orphan set if it's within orphan resolution range + isBlockInOrphanResolutionRange, err := flow.isBlockInOrphanResolutionRange(blockHash) + if err != nil { + return err + } + if isBlockInOrphanResolutionRange { + log.Debugf("Block %s is within orphan resolution range. "+ + "Adding it to the orphan set and requesting its missing parents", blockHash) + flow.addToOrphanSetAndRequestMissingParents(block, missingParents) + return nil + } + + // Start IBD unless we already are in IBD + log.Debugf("Block %s is out of orphan resolution range. "+ + "Attempting to start IBD against it.", blockHash) + return flow.runIBDIfNotRunning(blockHash) +} + +// isBlockInOrphanResolutionRange finds out whether the given blockHash should be +// retrieved via the unorphaning mechanism or via IBD. This method sends a +// getBlockLocator request to the peer with a limit of orphanResolutionRange. +// In the response, if we know none of the hashes, we should retrieve the given +// blockHash via IBD. Otherwise, via unorphaning. +func (flow *handleRelayInvsFlow) isBlockInOrphanResolutionRange(blockHash *externalapi.DomainHash) (bool, error) { + lowHash := flow.Config().ActiveNetParams.GenesisHash + err := flow.sendGetBlockLocator(lowHash, blockHash, orphanResolutionRange) + if err != nil { + return false, err + } + + blockLocatorHashes, err := flow.receiveBlockLocator() + if err != nil { + return false, err + } + for _, blockLocatorHash := range blockLocatorHashes { + blockInfo, err := flow.Domain().Consensus().GetBlockInfo(blockLocatorHash) + if err != nil { + return false, err + } + if blockInfo.Exists && blockInfo.BlockStatus != externalapi.StatusHeaderOnly { + return true, nil + } + } + return false, nil +} + +func (flow *handleRelayInvsFlow) addToOrphanSetAndRequestMissingParents( + block *externalapi.DomainBlock, missingParents []*externalapi.DomainHash) { + + flow.AddOrphan(block) + invMessages := make([]*appmessage.MsgInvRelayBlock, len(missingParents)) + for i, missingParent := range missingParents { + invMessages[i] = appmessage.NewMsgInvBlock(missingParent) + } + flow.invsQueue = append(invMessages, flow.invsQueue...) } diff --git a/app/protocol/flows/ibd/handle_request_block_locator.go b/app/protocol/flows/blockrelay/handle_request_block_locator.go similarity index 86% rename from app/protocol/flows/ibd/handle_request_block_locator.go rename to app/protocol/flows/blockrelay/handle_request_block_locator.go index acfccf4f5..9fe8970aa 100644 --- a/app/protocol/flows/ibd/handle_request_block_locator.go +++ b/app/protocol/flows/blockrelay/handle_request_block_locator.go @@ -1,4 +1,4 @@ -package ibd +package blockrelay import ( "github.com/kaspanet/kaspad/app/appmessage" @@ -32,13 +32,16 @@ func HandleRequestBlockLocator(context RequestBlockLocatorContext, incomingRoute func (flow *handleRequestBlockLocatorFlow) start() error { for { - lowHash, highHash, err := flow.receiveGetBlockLocator() + lowHash, highHash, limit, err := flow.receiveGetBlockLocator() if err != nil { return err } - locator, err := flow.Domain().Consensus().CreateBlockLocator(lowHash, highHash) + locator, err := flow.Domain().Consensus().CreateBlockLocator(lowHash, highHash, limit) if err != nil || len(locator) == 0 { + if err != nil { + log.Debugf("Received error from CreateBlockLocator: %s", err) + } return protocolerrors.Errorf(true, "couldn't build a block "+ "locator between blocks %s and %s", lowHash, highHash) } @@ -51,15 +54,15 @@ func (flow *handleRequestBlockLocatorFlow) start() error { } func (flow *handleRequestBlockLocatorFlow) receiveGetBlockLocator() (lowHash *externalapi.DomainHash, - highHash *externalapi.DomainHash, err error) { + highHash *externalapi.DomainHash, limit uint32, err error) { message, err := flow.incomingRoute.Dequeue() if err != nil { - return nil, nil, err + return nil, nil, 0, err } msgGetBlockLocator := message.(*appmessage.MsgRequestBlockLocator) - return msgGetBlockLocator.LowHash, msgGetBlockLocator.HighHash, nil + return msgGetBlockLocator.LowHash, msgGetBlockLocator.HighHash, msgGetBlockLocator.Limit, nil } func (flow *handleRequestBlockLocatorFlow) sendBlockLocator(locator externalapi.BlockLocator) error { diff --git a/app/protocol/flows/ibd/handle_request_headers.go b/app/protocol/flows/blockrelay/handle_request_headers.go similarity index 99% rename from app/protocol/flows/ibd/handle_request_headers.go rename to app/protocol/flows/blockrelay/handle_request_headers.go index d8b6d29e3..6600461d8 100644 --- a/app/protocol/flows/ibd/handle_request_headers.go +++ b/app/protocol/flows/blockrelay/handle_request_headers.go @@ -1,4 +1,4 @@ -package ibd +package blockrelay import ( "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" diff --git a/app/protocol/flows/ibd/handle_request_headers_test.go b/app/protocol/flows/blockrelay/handle_request_headers_test.go similarity index 95% rename from app/protocol/flows/ibd/handle_request_headers_test.go rename to app/protocol/flows/blockrelay/handle_request_headers_test.go index 63573cdc3..704cad76b 100644 --- a/app/protocol/flows/ibd/handle_request_headers_test.go +++ b/app/protocol/flows/blockrelay/handle_request_headers_test.go @@ -1,4 +1,4 @@ -package ibd +package blockrelay import ( "github.com/kaspanet/kaspad/domain/consensus/utils/testutils" diff --git a/app/protocol/flows/ibd/handle_request_ibd_root_utxo_set_and_block.go b/app/protocol/flows/blockrelay/handle_request_ibd_root_utxo_set_and_block.go similarity index 99% rename from app/protocol/flows/ibd/handle_request_ibd_root_utxo_set_and_block.go rename to app/protocol/flows/blockrelay/handle_request_ibd_root_utxo_set_and_block.go index 8298e7e52..659272e85 100644 --- a/app/protocol/flows/ibd/handle_request_ibd_root_utxo_set_and_block.go +++ b/app/protocol/flows/blockrelay/handle_request_ibd_root_utxo_set_and_block.go @@ -1,4 +1,4 @@ -package ibd +package blockrelay import ( "errors" diff --git a/app/protocol/flows/ibd/ibd.go b/app/protocol/flows/blockrelay/ibd.go similarity index 56% rename from app/protocol/flows/ibd/ibd.go rename to app/protocol/flows/blockrelay/ibd.go index 912698ac3..e5fc983c8 100644 --- a/app/protocol/flows/ibd/ibd.go +++ b/app/protocol/flows/blockrelay/ibd.go @@ -1,126 +1,255 @@ -package ibd +package blockrelay import ( "github.com/kaspanet/kaspad/app/appmessage" "github.com/kaspanet/kaspad/app/protocol/common" - peerpkg "github.com/kaspanet/kaspad/app/protocol/peer" "github.com/kaspanet/kaspad/app/protocol/protocolerrors" - "github.com/kaspanet/kaspad/domain" "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" "github.com/kaspanet/kaspad/domain/consensus/ruleerrors" "github.com/kaspanet/kaspad/domain/consensus/utils/consensushashing" - "github.com/kaspanet/kaspad/infrastructure/config" - "github.com/kaspanet/kaspad/infrastructure/network/netadapter/router" "github.com/pkg/errors" + "time" ) -// HandleIBDContext is the interface for the context needed for the HandleIBD flow. -type HandleIBDContext interface { - Domain() domain.Domain - Config() *config.Config - OnNewBlock(block *externalapi.DomainBlock) error - FinishIBD() error -} - -type handleIBDFlow struct { - HandleIBDContext - incomingRoute, outgoingRoute *router.Route - peer *peerpkg.Peer -} - -// HandleIBD waits for IBD start and handles it when IBD is triggered for this peer -func HandleIBD(context HandleIBDContext, incomingRoute *router.Route, outgoingRoute *router.Route, - peer *peerpkg.Peer) error { - - flow := &handleIBDFlow{ - HandleIBDContext: context, - incomingRoute: incomingRoute, - outgoingRoute: outgoingRoute, - peer: peer, +func (flow *handleRelayInvsFlow) runIBDIfNotRunning(highHash *externalapi.DomainHash) error { + wasIBDNotRunning := flow.TrySetIBDRunning() + if !wasIBDNotRunning { + log.Debugf("IBD is already running") + return nil } - return flow.start() -} + defer flow.UnsetIBDRunning() -func (flow *handleIBDFlow) start() error { - for { - err := flow.runIBD() - if err != nil { - return err - } - } -} + log.Debugf("IBD started with peer %s and highHash %s", flow.peer, highHash) -func (flow *handleIBDFlow) runIBD() error { - flow.peer.WaitForIBDStart() - err := flow.ibdLoop() + // Fetch all the headers if we don't already have them + log.Debugf("Downloading headers up to %s", highHash) + err := flow.syncHeaders(highHash) if err != nil { - finishIBDErr := flow.FinishIBD() - if finishIBDErr != nil { - return finishIBDErr - } return err } - return flow.FinishIBD() -} + log.Debugf("Finished downloading headers up to %s", highHash) -func (flow *handleIBDFlow) ibdLoop() error { - for { - syncInfo, err := flow.Domain().Consensus().GetSyncInfo() + // Fetch the UTXO set if we don't already have it + log.Debugf("Downloading the IBD root UTXO set under highHash %s", highHash) + syncInfo, err := flow.Domain().Consensus().GetSyncInfo() + if err != nil { + return err + } + if syncInfo.State == externalapi.SyncStateAwaitingUTXOSet { + found, err := flow.fetchMissingUTXOSet(syncInfo.IBDRootUTXOBlockHash) if err != nil { return err } - - switch syncInfo.State { - case externalapi.SyncStateHeadersFirst: - err := flow.syncHeaders() - if err != nil { - return err - } - case externalapi.SyncStateMissingUTXOSet: - found, err := flow.fetchMissingUTXOSet(syncInfo.IBDRootUTXOBlockHash) - if err != nil { - return err - } - - if !found { - return nil - } - case externalapi.SyncStateMissingBlockBodies: - err := flow.syncMissingBlockBodies() - if err != nil { - return err - } - case externalapi.SyncStateRelay: + if !found { + log.Infof("Cannot download the IBD root UTXO set under highHash %s", highHash) return nil - default: - return errors.Errorf("unexpected state %s", syncInfo.State) } } -} + log.Debugf("Finished downloading the IBD root UTXO set under highHash %s", highHash) -func (flow *handleIBDFlow) syncHeaders() error { - peerSelectedTipHash := flow.peer.SelectedTipHash() - log.Debugf("Trying to find highest shared chain block with peer %s with selected tip %s", flow.peer, peerSelectedTipHash) - highestSharedBlockHash, err := flow.findHighestSharedBlockHash(peerSelectedTipHash) + // Fetch the block bodies + log.Debugf("Downloading block bodies up to %s", highHash) + err = flow.syncMissingBlockBodies(highHash) if err != nil { return err } + log.Debugf("Finished downloading block bodies up to %s", highHash) + return nil +} + +func (flow *handleRelayInvsFlow) syncHeaders(highHash *externalapi.DomainHash) error { + log.Debugf("Trying to find highest shared chain block with peer %s with high hash %s", flow.peer, highHash) + highestSharedBlockHash, err := flow.findHighestSharedBlockHash(highHash) + if err != nil { + return err + } log.Debugf("Found highest shared chain block %s with peer %s", highestSharedBlockHash, flow.peer) - return flow.downloadHeaders(highestSharedBlockHash, peerSelectedTipHash) + return flow.downloadHeaders(highestSharedBlockHash, highHash) } -func (flow *handleIBDFlow) syncMissingBlockBodies() error { - hashes, err := flow.Domain().Consensus().GetMissingBlockBodyHashes(flow.peer.SelectedTipHash()) +func (flow *handleRelayInvsFlow) findHighestSharedBlockHash(highHash *externalapi.DomainHash) ( + lowHash *externalapi.DomainHash, err error) { + + lowHash = flow.Config().ActiveNetParams.GenesisHash + currentHighHash := highHash + + for { + err := flow.sendGetBlockLocator(lowHash, currentHighHash, 0) + if err != nil { + return nil, err + } + + blockLocatorHashes, err := flow.receiveBlockLocator() + if err != nil { + return nil, err + } + + // We check whether the locator's highest hash is in the local DAG. + // If it is, return it. If it isn't, we need to narrow our + // getBlockLocator request and try again. + locatorHighHash := blockLocatorHashes[0] + locatorHighHashInfo, err := flow.Domain().Consensus().GetBlockInfo(locatorHighHash) + if err != nil { + return nil, err + } + if locatorHighHashInfo.Exists { + return locatorHighHash, nil + } + + lowHash, currentHighHash, err = flow.Domain().Consensus().FindNextBlockLocatorBoundaries(blockLocatorHashes) + if err != nil { + return nil, err + } + } +} + +func (flow *handleRelayInvsFlow) downloadHeaders(highestSharedBlockHash *externalapi.DomainHash, + highHash *externalapi.DomainHash) error { + + err := flow.sendRequestHeaders(highestSharedBlockHash, highHash) if err != nil { return err } - for offset := 0; offset < len(hashes); offset += appmessage.MaxRequestIBDBlocksHashes { + blocksReceived := 0 + for { + msgBlockHeader, doneIBD, err := flow.receiveHeader() + if err != nil { + return err + } + if doneIBD { + return nil + } + + err = flow.processHeader(msgBlockHeader) + if err != nil { + return err + } + + blocksReceived++ + if blocksReceived%ibdBatchSize == 0 { + err = flow.outgoingRoute.Enqueue(appmessage.NewMsgRequestNextHeaders()) + if err != nil { + return err + } + } + } +} + +func (flow *handleRelayInvsFlow) sendRequestHeaders(highestSharedBlockHash *externalapi.DomainHash, + peerSelectedTipHash *externalapi.DomainHash) error { + + msgGetBlockInvs := appmessage.NewMsgRequstHeaders(highestSharedBlockHash, peerSelectedTipHash) + return flow.outgoingRoute.Enqueue(msgGetBlockInvs) +} + +func (flow *handleRelayInvsFlow) receiveHeader() (msgIBDBlock *appmessage.MsgBlockHeader, doneIBD bool, err error) { + message, err := flow.dequeueIncomingMessageAndSkipInvs(common.DefaultTimeout) + if err != nil { + return nil, false, err + } + switch message := message.(type) { + case *appmessage.MsgBlockHeader: + return message, false, nil + case *appmessage.MsgDoneHeaders: + return nil, true, nil + default: + return nil, false, + protocolerrors.Errorf(true, "received unexpected message type. "+ + "expected: %s or %s, got: %s", appmessage.CmdHeader, appmessage.CmdDoneHeaders, message.Command()) + } +} + +func (flow *handleRelayInvsFlow) processHeader(msgBlockHeader *appmessage.MsgBlockHeader) error { + header := appmessage.BlockHeaderToDomainBlockHeader(msgBlockHeader) + block := &externalapi.DomainBlock{ + Header: header, + Transactions: nil, + } + + blockHash := consensushashing.BlockHash(block) + blockInfo, err := flow.Domain().Consensus().GetBlockInfo(blockHash) + if err != nil { + return err + } + if blockInfo.Exists { + log.Debugf("Block header %s is already in the DAG. Skipping...", blockHash) + return nil + } + err = flow.Domain().Consensus().ValidateAndInsertBlock(block) + if err != nil { + if !errors.As(err, &ruleerrors.RuleError{}) { + return errors.Wrapf(err, "failed to process header %s during IBD", blockHash) + } + log.Infof("Rejected block header %s from %s during IBD: %s", blockHash, flow.peer, err) + + return protocolerrors.Wrapf(true, err, "got invalid block %s during IBD", blockHash) + } + return nil +} + +func (flow *handleRelayInvsFlow) fetchMissingUTXOSet(ibdRootHash *externalapi.DomainHash) (bool, error) { + err := flow.outgoingRoute.Enqueue(appmessage.NewMsgRequestIBDRootUTXOSetAndBlock(ibdRootHash)) + if err != nil { + return false, err + } + + utxoSet, block, found, err := flow.receiveIBDRootUTXOSetAndBlock() + if err != nil { + return false, err + } + + if !found { + return false, nil + } + + err = flow.Domain().Consensus().ValidateAndInsertBlock(block) + if err != nil { + blockHash := consensushashing.BlockHash(block) + return false, protocolerrors.ConvertToBanningProtocolErrorIfRuleError(err, "got invalid block %s during IBD", blockHash) + } + + err = flow.Domain().Consensus().SetPruningPointUTXOSet(utxoSet) + if err != nil { + return false, protocolerrors.ConvertToBanningProtocolErrorIfRuleError(err, "error with IBD root UTXO set") + } + + return true, nil +} + +func (flow *handleRelayInvsFlow) receiveIBDRootUTXOSetAndBlock() ([]byte, *externalapi.DomainBlock, bool, error) { + message, err := flow.dequeueIncomingMessageAndSkipInvs(common.DefaultTimeout) + if err != nil { + return nil, nil, false, err + } + + switch message := message.(type) { + case *appmessage.MsgIBDRootUTXOSetAndBlock: + return message.UTXOSet, + appmessage.MsgBlockToDomainBlock(message.Block), true, nil + case *appmessage.MsgIBDRootNotFound: + return nil, nil, false, nil + default: + return nil, nil, false, + protocolerrors.Errorf(true, "received unexpected message type. "+ + "expected: %s or %s, got: %s", + appmessage.CmdIBDRootUTXOSetAndBlock, appmessage.CmdIBDRootNotFound, message.Command(), + ) + } +} + +func (flow *handleRelayInvsFlow) syncMissingBlockBodies(highHash *externalapi.DomainHash) error { + hashes, err := flow.Domain().Consensus().GetMissingBlockBodyHashes(highHash) + if err != nil { + return err + } + + for offset := 0; offset < len(hashes); offset += ibdBatchSize { var hashesToRequest []*externalapi.DomainHash - if offset+appmessage.MaxRequestIBDBlocksHashes < len(hashes) { - hashesToRequest = hashes[offset : offset+appmessage.MaxRequestIBDBlocksHashes] + if offset+ibdBatchSize < len(hashes) { + hashesToRequest = hashes[offset : offset+ibdBatchSize] } else { hashesToRequest = hashes[offset:] } @@ -131,7 +260,7 @@ func (flow *handleIBDFlow) syncMissingBlockBodies() error { } for _, expectedHash := range hashesToRequest { - message, err := flow.incomingRoute.DequeueWithTimeout(common.DefaultTimeout) + message, err := flow.dequeueIncomingMessageAndSkipInvs(common.DefaultTimeout) if err != nil { return err } @@ -162,194 +291,17 @@ func (flow *handleIBDFlow) syncMissingBlockBodies() error { return nil } -func (flow *handleIBDFlow) fetchMissingUTXOSet(ibdRootHash *externalapi.DomainHash) (bool, error) { - err := flow.outgoingRoute.Enqueue(appmessage.NewMsgRequestIBDRootUTXOSetAndBlock(ibdRootHash)) - if err != nil { - return false, err - } - - utxoSet, block, found, err := flow.receiveIBDRootUTXOSetAndBlock() - if err != nil { - return false, err - } - - if !found { - return false, nil - } - - err = flow.Domain().Consensus().ValidateAndInsertBlock(block) - if err != nil { - blockHash := consensushashing.BlockHash(block) - return false, protocolerrors.ConvertToBanningProtocolErrorIfRuleError(err, "got invalid block %s during IBD", blockHash) - } - - err = flow.Domain().Consensus().SetPruningPointUTXOSet(utxoSet) - if err != nil { - return false, protocolerrors.ConvertToBanningProtocolErrorIfRuleError(err, "error with IBD root UTXO set") - } - - return true, nil -} - -func (flow *handleIBDFlow) receiveIBDRootUTXOSetAndBlock() ([]byte, *externalapi.DomainBlock, bool, error) { - message, err := flow.incomingRoute.DequeueWithTimeout(common.DefaultTimeout) - if err != nil { - return nil, nil, false, err - } - - switch message := message.(type) { - case *appmessage.MsgIBDRootUTXOSetAndBlock: - return message.UTXOSet, - appmessage.MsgBlockToDomainBlock(message.Block), true, nil - case *appmessage.MsgIBDRootNotFound: - return nil, nil, false, nil - default: - return nil, nil, false, - protocolerrors.Errorf(true, "received unexpected message type. "+ - "expected: %s or %s, got: %s", - appmessage.CmdIBDRootUTXOSetAndBlock, appmessage.CmdIBDRootNotFound, message.Command(), - ) - } -} - -func (flow *handleIBDFlow) findHighestSharedBlockHash(peerSelectedTipHash *externalapi.DomainHash) (lowHash *externalapi.DomainHash, - err error) { - - lowHash = flow.Config().ActiveNetParams.GenesisHash - highHash := peerSelectedTipHash - +// dequeueIncomingMessageAndSkipInvs is a convenience method to be used during +// IBD. Inv messages are expected to arrive at any given moment, but should be +// ignored while we're in IBD +func (flow *handleRelayInvsFlow) dequeueIncomingMessageAndSkipInvs(timeout time.Duration) (appmessage.Message, error) { for { - err := flow.sendGetBlockLocator(lowHash, highHash) + message, err := flow.incomingRoute.DequeueWithTimeout(timeout) if err != nil { return nil, err } - - blockLocatorHashes, err := flow.receiveBlockLocator() - if err != nil { - return nil, err - } - - // We check whether the locator's highest hash is in the local DAG. - // If it is, return it. If it isn't, we need to narrow our - // getBlockLocator request and try again. - locatorHighHash := blockLocatorHashes[0] - locatorHighHashInfo, err := flow.Domain().Consensus().GetBlockInfo(locatorHighHash) - if err != nil { - return nil, err - } - if locatorHighHashInfo.Exists { - return locatorHighHash, nil - } - - highHash, lowHash, err = flow.Domain().Consensus().FindNextBlockLocatorBoundaries(blockLocatorHashes) - if err != nil { - return nil, err + if _, ok := message.(*appmessage.MsgInvRelayBlock); !ok { + return message, nil } } } - -func (flow *handleIBDFlow) sendGetBlockLocator(lowHash *externalapi.DomainHash, highHash *externalapi.DomainHash) error { - - msgGetBlockLocator := appmessage.NewMsgRequestBlockLocator(highHash, lowHash) - return flow.outgoingRoute.Enqueue(msgGetBlockLocator) -} - -func (flow *handleIBDFlow) receiveBlockLocator() (blockLocatorHashes []*externalapi.DomainHash, err error) { - message, err := flow.incomingRoute.DequeueWithTimeout(common.DefaultTimeout) - if err != nil { - return nil, err - } - msgBlockLocator, ok := message.(*appmessage.MsgBlockLocator) - if !ok { - return nil, - protocolerrors.Errorf(true, "received unexpected message type. "+ - "expected: %s, got: %s", appmessage.CmdBlockLocator, message.Command()) - } - return msgBlockLocator.BlockLocatorHashes, nil -} - -func (flow *handleIBDFlow) downloadHeaders(highestSharedBlockHash *externalapi.DomainHash, - peerSelectedTipHash *externalapi.DomainHash) error { - - err := flow.sendRequestHeaders(highestSharedBlockHash, peerSelectedTipHash) - if err != nil { - return err - } - - blocksReceived := 0 - for { - msgBlockHeader, doneIBD, err := flow.receiveHeader() - if err != nil { - return err - } - - if doneIBD { - return nil - } - - err = flow.processHeader(msgBlockHeader) - if err != nil { - return err - } - - blocksReceived++ - if blocksReceived%ibdBatchSize == 0 { - err = flow.outgoingRoute.Enqueue(appmessage.NewMsgRequestNextHeaders()) - if err != nil { - return err - } - } - } -} - -func (flow *handleIBDFlow) sendRequestHeaders(highestSharedBlockHash *externalapi.DomainHash, - peerSelectedTipHash *externalapi.DomainHash) error { - - msgGetBlockInvs := appmessage.NewMsgRequstHeaders(highestSharedBlockHash, peerSelectedTipHash) - return flow.outgoingRoute.Enqueue(msgGetBlockInvs) -} - -func (flow *handleIBDFlow) receiveHeader() (msgIBDBlock *appmessage.MsgBlockHeader, doneIBD bool, err error) { - message, err := flow.incomingRoute.DequeueWithTimeout(common.DefaultTimeout) - if err != nil { - return nil, false, err - } - switch message := message.(type) { - case *appmessage.MsgBlockHeader: - return message, false, nil - case *appmessage.MsgDoneHeaders: - return nil, true, nil - default: - return nil, false, - protocolerrors.Errorf(true, "received unexpected message type. "+ - "expected: %s or %s, got: %s", appmessage.CmdHeader, appmessage.CmdDoneHeaders, message.Command()) - } -} - -func (flow *handleIBDFlow) processHeader(msgBlockHeader *appmessage.MsgBlockHeader) error { - header := appmessage.BlockHeaderToDomainBlockHeader(msgBlockHeader) - block := &externalapi.DomainBlock{ - Header: header, - Transactions: nil, - } - - blockHash := consensushashing.BlockHash(block) - blockInfo, err := flow.Domain().Consensus().GetBlockInfo(blockHash) - if err != nil { - return err - } - if blockInfo.Exists { - log.Debugf("Block header %s is already in the DAG. Skipping...", blockHash) - return nil - } - err = flow.Domain().Consensus().ValidateAndInsertBlock(block) - if err != nil { - if !errors.As(err, &ruleerrors.RuleError{}) { - return errors.Wrapf(err, "failed to process header %s during IBD", blockHash) - } - log.Infof("Rejected block header %s from %s during IBD: %s", blockHash, flow.peer, err) - - return protocolerrors.Wrapf(true, err, "got invalid block %s during IBD", blockHash) - } - return nil -} diff --git a/app/protocol/flows/handshake/handshake.go b/app/protocol/flows/handshake/handshake.go index 8f305d859..ff2ce6d3b 100644 --- a/app/protocol/flows/handshake/handshake.go +++ b/app/protocol/flows/handshake/handshake.go @@ -24,7 +24,6 @@ type HandleHandshakeContext interface { NetAdapter() *netadapter.NetAdapter Domain() domain.Domain AddressManager() *addressmanager.AddressManager - StartIBDIfRequired() error AddToPeers(peer *peerpkg.Peer) error HandleError(err error, flowName string, isStopping *uint32, errChan chan<- error) } @@ -92,12 +91,6 @@ func HandleHandshake(context HandleHandshakeContext, netConnection *netadapter.N if peerAddress != nil { context.AddressManager().AddAddresses(peerAddress) } - - err = context.StartIBDIfRequired() - if err != nil { - return nil, err - } - return peer, nil } diff --git a/app/protocol/flows/handshake/sendversion.go b/app/protocol/flows/handshake/sendversion.go index a7633fa8c..a98c8568d 100644 --- a/app/protocol/flows/handshake/sendversion.go +++ b/app/protocol/flows/handshake/sendversion.go @@ -4,7 +4,6 @@ import ( "github.com/kaspanet/kaspad/app/appmessage" "github.com/kaspanet/kaspad/app/protocol/common" peerpkg "github.com/kaspanet/kaspad/app/protocol/peer" - "github.com/kaspanet/kaspad/domain/consensus/utils/consensushashing" "github.com/kaspanet/kaspad/infrastructure/logger" "github.com/kaspanet/kaspad/infrastructure/network/netadapter/router" "github.com/kaspanet/kaspad/version" @@ -52,17 +51,11 @@ func (flow *sendVersionFlow) start() error { onEnd := logger.LogAndMeasureExecutionTime(log, "sendVersionFlow.start") defer onEnd() - virtualSelectedParent, err := flow.Domain().Consensus().GetVirtualSelectedParent() - if err != nil { - return err - } - selectedTipHash := consensushashing.BlockHash(virtualSelectedParent) - subnetworkID := flow.Config().SubnetworkID - // Version message. localAddress := flow.AddressManager().BestLocalAddress(flow.peer.Connection().NetAddress()) + subnetworkID := flow.Config().SubnetworkID msg := appmessage.NewMsgVersion(localAddress, flow.NetAdapter().ID(), - flow.Config().ActiveNetParams.Name, selectedTipHash, subnetworkID) + flow.Config().ActiveNetParams.Name, subnetworkID) msg.AddUserAgent(userAgentName, userAgentVersion, flow.Config().UserAgentComments...) // Advertise the services flag @@ -74,7 +67,7 @@ func (flow *sendVersionFlow) start() error { // Advertise if inv messages for transactions are desired. msg.DisableRelayTx = flow.Config().BlocksOnly - err = flow.outgoingRoute.Enqueue(msg) + err := flow.outgoingRoute.Enqueue(msg) if err != nil { return err } diff --git a/app/protocol/flows/ibd/log.go b/app/protocol/flows/ibd/log.go deleted file mode 100644 index 99d53c983..000000000 --- a/app/protocol/flows/ibd/log.go +++ /dev/null @@ -1,9 +0,0 @@ -package ibd - -import ( - "github.com/kaspanet/kaspad/infrastructure/logger" - "github.com/kaspanet/kaspad/util/panics" -) - -var log, _ = logger.Get(logger.SubsystemTags.IBDS) -var spawn = panics.GoroutineWrapperFunc(log) diff --git a/app/protocol/flows/ibd/selectedtip/handle_request_selected_tip.go b/app/protocol/flows/ibd/selectedtip/handle_request_selected_tip.go deleted file mode 100644 index 2477b995f..000000000 --- a/app/protocol/flows/ibd/selectedtip/handle_request_selected_tip.go +++ /dev/null @@ -1,66 +0,0 @@ -package selectedtip - -import ( - "github.com/kaspanet/kaspad/app/appmessage" - "github.com/kaspanet/kaspad/domain" - "github.com/kaspanet/kaspad/domain/consensus/utils/consensushashing" - "github.com/kaspanet/kaspad/infrastructure/network/netadapter/router" - "github.com/pkg/errors" -) - -// HandleRequestSelectedTipContext is the interface for the context needed for the HandleRequestSelectedTip flow. -type HandleRequestSelectedTipContext interface { - Domain() domain.Domain -} - -type handleRequestSelectedTipFlow struct { - HandleRequestSelectedTipContext - incomingRoute, outgoingRoute *router.Route -} - -// HandleRequestSelectedTip handles getSelectedTip messages -func HandleRequestSelectedTip(context HandleRequestSelectedTipContext, incomingRoute *router.Route, outgoingRoute *router.Route) error { - flow := &handleRequestSelectedTipFlow{ - HandleRequestSelectedTipContext: context, - incomingRoute: incomingRoute, - outgoingRoute: outgoingRoute, - } - return flow.start() -} - -func (flow *handleRequestSelectedTipFlow) start() error { - for { - err := flow.receiveGetSelectedTip() - if err != nil { - return err - } - - err = flow.sendSelectedTipHash() - if err != nil { - return err - } - } -} - -func (flow *handleRequestSelectedTipFlow) receiveGetSelectedTip() error { - message, err := flow.incomingRoute.Dequeue() - if err != nil { - return err - } - _, ok := message.(*appmessage.MsgRequestSelectedTip) - if !ok { - return errors.Errorf("received unexpected message type. "+ - "expected: %s, got: %s", appmessage.CmdRequestSelectedTip, message.Command()) - } - - return nil -} - -func (flow *handleRequestSelectedTipFlow) sendSelectedTipHash() error { - virtualSelectedParent, err := flow.Domain().Consensus().GetVirtualSelectedParent() - if err != nil { - return err - } - msgSelectedTip := appmessage.NewMsgSelectedTip(consensushashing.BlockHash(virtualSelectedParent)) - return flow.outgoingRoute.Enqueue(msgSelectedTip) -} diff --git a/app/protocol/flows/ibd/selectedtip/request_selected_tip.go b/app/protocol/flows/ibd/selectedtip/request_selected_tip.go deleted file mode 100644 index df79b8445..000000000 --- a/app/protocol/flows/ibd/selectedtip/request_selected_tip.go +++ /dev/null @@ -1,78 +0,0 @@ -package selectedtip - -import ( - "github.com/kaspanet/kaspad/app/appmessage" - "github.com/kaspanet/kaspad/app/protocol/common" - peerpkg "github.com/kaspanet/kaspad/app/protocol/peer" - "github.com/kaspanet/kaspad/domain" - "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" - "github.com/kaspanet/kaspad/infrastructure/network/netadapter/router" -) - -// RequestSelectedTipContext is the interface for the context needed for the RequestSelectedTip flow. -type RequestSelectedTipContext interface { - Domain() domain.Domain - StartIBDIfRequired() error -} - -type requestSelectedTipFlow struct { - RequestSelectedTipContext - incomingRoute, outgoingRoute *router.Route - peer *peerpkg.Peer -} - -// RequestSelectedTip waits for selected tip requests and handles them -func RequestSelectedTip(context RequestSelectedTipContext, incomingRoute *router.Route, - outgoingRoute *router.Route, peer *peerpkg.Peer) error { - - flow := &requestSelectedTipFlow{ - RequestSelectedTipContext: context, - incomingRoute: incomingRoute, - outgoingRoute: outgoingRoute, - peer: peer, - } - return flow.start() -} - -func (flow *requestSelectedTipFlow) start() error { - for { - err := flow.runSelectedTipRequest() - if err != nil { - return err - } - } -} - -func (flow *requestSelectedTipFlow) runSelectedTipRequest() error { - - flow.peer.WaitForSelectedTipRequests() - defer flow.peer.FinishRequestingSelectedTip() - - err := flow.requestSelectedTip() - if err != nil { - return err - } - - peerSelectedTipHash, err := flow.receiveSelectedTip() - if err != nil { - return err - } - - flow.peer.SetSelectedTipHash(peerSelectedTipHash) - return flow.StartIBDIfRequired() -} - -func (flow *requestSelectedTipFlow) requestSelectedTip() error { - msgGetSelectedTip := appmessage.NewMsgRequestSelectedTip() - return flow.outgoingRoute.Enqueue(msgGetSelectedTip) -} - -func (flow *requestSelectedTipFlow) receiveSelectedTip() (selectedTipHash *externalapi.DomainHash, err error) { - message, err := flow.incomingRoute.DequeueWithTimeout(common.DefaultTimeout) - if err != nil { - return nil, err - } - msgSelectedTip := message.(*appmessage.MsgSelectedTip) - - return msgSelectedTip.SelectedTipHash, nil -} diff --git a/app/protocol/flows/relaytransactions/handle_relayed_transactions.go b/app/protocol/flows/transactionrelay/handle_relayed_transactions.go similarity index 99% rename from app/protocol/flows/relaytransactions/handle_relayed_transactions.go rename to app/protocol/flows/transactionrelay/handle_relayed_transactions.go index 9fc42aec3..26f9d6d2c 100644 --- a/app/protocol/flows/relaytransactions/handle_relayed_transactions.go +++ b/app/protocol/flows/transactionrelay/handle_relayed_transactions.go @@ -1,4 +1,4 @@ -package relaytransactions +package transactionrelay import ( "github.com/kaspanet/kaspad/app/appmessage" diff --git a/app/protocol/flows/relaytransactions/handle_requested_transactions.go b/app/protocol/flows/transactionrelay/handle_requested_transactions.go similarity index 98% rename from app/protocol/flows/relaytransactions/handle_requested_transactions.go rename to app/protocol/flows/transactionrelay/handle_requested_transactions.go index f006ecb67..3dd8b294b 100644 --- a/app/protocol/flows/relaytransactions/handle_requested_transactions.go +++ b/app/protocol/flows/transactionrelay/handle_requested_transactions.go @@ -1,4 +1,4 @@ -package relaytransactions +package transactionrelay import ( "github.com/kaspanet/kaspad/app/appmessage" diff --git a/app/protocol/flows/relaytransactions/shared_requested_transactions.go b/app/protocol/flows/transactionrelay/shared_requested_transactions.go similarity index 97% rename from app/protocol/flows/relaytransactions/shared_requested_transactions.go rename to app/protocol/flows/transactionrelay/shared_requested_transactions.go index 4831d2841..fd1d3b0f6 100644 --- a/app/protocol/flows/relaytransactions/shared_requested_transactions.go +++ b/app/protocol/flows/transactionrelay/shared_requested_transactions.go @@ -1,4 +1,4 @@ -package relaytransactions +package transactionrelay import ( "sync" diff --git a/app/protocol/manager.go b/app/protocol/manager.go index 17027f5b9..7ea7d0ceb 100644 --- a/app/protocol/manager.go +++ b/app/protocol/manager.go @@ -37,12 +37,6 @@ func (m *Manager) Peers() []*peerpkg.Peer { return m.context.Peers() } -// IBDPeer returns the currently active IBD peer. -// Returns nil if we aren't currently in IBD -func (m *Manager) IBDPeer() *peerpkg.Peer { - return m.context.IBDPeer() -} - // AddTransaction adds transaction to the mempool and propagates it. func (m *Manager) AddTransaction(tx *externalapi.DomainTransaction) error { return m.context.AddTransaction(tx) diff --git a/app/protocol/peer/peer.go b/app/protocol/peer/peer.go index 9438beac9..f27f20ace 100644 --- a/app/protocol/peer/peer.go +++ b/app/protocol/peer/peer.go @@ -2,7 +2,6 @@ package peer import ( "sync" - "sync/atomic" "time" "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" @@ -22,9 +21,6 @@ const maxProtocolVersion = 1 type Peer struct { connection *netadapter.NetConnection - selectedTipHashMtx sync.RWMutex - selectedTipHash *externalapi.DomainHash - userAgent string services appmessage.ServiceFlag advertisedProtocolVerion uint32 // protocol version advertised by remote @@ -39,21 +35,13 @@ type Peer struct { lastPingNonce uint64 // The nonce of the last ping we sent lastPingTime time.Time // Time we sent last ping lastPingDuration time.Duration // Time for last ping to return - - isSelectedTipRequested uint32 - selectedTipRequestChan chan struct{} - lastSelectedTipRequest mstime.Time - - ibdStartChan chan struct{} } // New returns a new Peer func New(connection *netadapter.NetConnection) *Peer { return &Peer{ - connection: connection, - selectedTipRequestChan: make(chan struct{}), - ibdStartChan: make(chan struct{}), - connectionStarted: time.Now(), + connection: connection, + connectionStarted: time.Now(), } } @@ -62,20 +50,6 @@ func (p *Peer) Connection() *netadapter.NetConnection { return p.connection } -// SelectedTipHash returns the selected tip of the peer. -func (p *Peer) SelectedTipHash() *externalapi.DomainHash { - p.selectedTipHashMtx.RLock() - defer p.selectedTipHashMtx.RUnlock() - return p.selectedTipHash -} - -// SetSelectedTipHash sets the selected tip of the peer. -func (p *Peer) SetSelectedTipHash(hash *externalapi.DomainHash) { - p.selectedTipHashMtx.Lock() - defer p.selectedTipHashMtx.Unlock() - p.selectedTipHash = hash -} - // SubnetworkID returns the subnetwork the peer is associated with. // It is nil in full nodes. func (p *Peer) SubnetworkID() *externalapi.DomainSubnetworkID { @@ -128,7 +102,6 @@ func (p *Peer) UpdateFieldsFromMsgVersion(msg *appmessage.MsgVersion) { p.userAgent = msg.UserAgent p.disableRelayTx = msg.DisableRelayTx - p.selectedTipHash = msg.SelectedTipHash p.subnetworkID = msg.SubnetworkID p.timeOffset = mstime.Since(msg.Timestamp) @@ -156,46 +129,6 @@ func (p *Peer) String() string { return p.connection.String() } -// RequestSelectedTipIfRequired notifies the peer that requesting -// a selected tip is required. This triggers the selected tip -// request flow. -func (p *Peer) RequestSelectedTipIfRequired() { - if atomic.SwapUint32(&p.isSelectedTipRequested, 1) != 0 { - return - } - - const minGetSelectedTipInterval = time.Minute - if mstime.Since(p.lastSelectedTipRequest) < minGetSelectedTipInterval { - return - } - - p.lastSelectedTipRequest = mstime.Now() - p.selectedTipRequestChan <- struct{}{} -} - -// WaitForSelectedTipRequests blocks the current thread until -// a selected tip is requested from this peer -func (p *Peer) WaitForSelectedTipRequests() { - <-p.selectedTipRequestChan -} - -// FinishRequestingSelectedTip finishes requesting the selected -// tip from this peer -func (p *Peer) FinishRequestingSelectedTip() { - atomic.StoreUint32(&p.isSelectedTipRequested, 0) -} - -// StartIBD starts the IBD process for this peer -func (p *Peer) StartIBD() { - p.ibdStartChan <- struct{}{} -} - -// WaitForIBDStart blocks the current thread until -// IBD start is requested from this peer -func (p *Peer) WaitForIBDStart() { - <-p.ibdStartChan -} - // Address returns the address associated with this connection func (p *Peer) Address() string { return p.connection.Address() diff --git a/app/protocol/protocol.go b/app/protocol/protocol.go index 28c0ee772..6d7527744 100644 --- a/app/protocol/protocol.go +++ b/app/protocol/protocol.go @@ -8,10 +8,8 @@ import ( "github.com/kaspanet/kaspad/app/protocol/flows/addressexchange" "github.com/kaspanet/kaspad/app/protocol/flows/blockrelay" "github.com/kaspanet/kaspad/app/protocol/flows/handshake" - "github.com/kaspanet/kaspad/app/protocol/flows/ibd" - "github.com/kaspanet/kaspad/app/protocol/flows/ibd/selectedtip" "github.com/kaspanet/kaspad/app/protocol/flows/ping" - "github.com/kaspanet/kaspad/app/protocol/flows/relaytransactions" + "github.com/kaspanet/kaspad/app/protocol/flows/transactionrelay" peerpkg "github.com/kaspanet/kaspad/app/protocol/peer" "github.com/kaspanet/kaspad/app/protocol/protocolerrors" "github.com/kaspanet/kaspad/infrastructure/network/addressmanager" @@ -107,7 +105,6 @@ func (m *Manager) registerFlows(router *routerpkg.Router, errChan chan error, is flows = m.registerAddressFlows(router, isStopping, errChan) flows = append(flows, m.registerBlockRelayFlows(router, isStopping, errChan)...) flows = append(flows, m.registerPingFlows(router, isStopping, errChan)...) - flows = append(flows, m.registerIBDFlows(router, isStopping, errChan)...) flows = append(flows, m.registerTransactionRelayFlow(router, isStopping, errChan)...) flows = append(flows, m.registerRejectsFlow(router, isStopping, errChan)...) @@ -136,7 +133,10 @@ func (m *Manager) registerBlockRelayFlows(router *routerpkg.Router, isStopping * outgoingRoute := router.OutgoingRoute() return []*flow{ - m.registerFlow("HandleRelayInvs", router, []appmessage.MessageCommand{appmessage.CmdInvRelayBlock, appmessage.CmdBlock}, isStopping, errChan, + m.registerFlow("HandleRelayInvs", router, []appmessage.MessageCommand{ + appmessage.CmdInvRelayBlock, appmessage.CmdBlock, appmessage.CmdBlockLocator, appmessage.CmdIBDBlock, + appmessage.CmdDoneHeaders, appmessage.CmdIBDRootNotFound, appmessage.CmdIBDRootUTXOSetAndBlock, + appmessage.CmdHeader}, isStopping, errChan, func(incomingRoute *routerpkg.Route, peer *peerpkg.Peer) error { return blockrelay.HandleRelayInvs(m.context, incomingRoute, outgoingRoute, peer) @@ -148,6 +148,34 @@ func (m *Manager) registerBlockRelayFlows(router *routerpkg.Router, isStopping * return blockrelay.HandleRelayBlockRequests(m.context, incomingRoute, outgoingRoute, peer) }, ), + + m.registerFlow("HandleRequestBlockLocator", router, + []appmessage.MessageCommand{appmessage.CmdRequestBlockLocator}, isStopping, errChan, + func(incomingRoute *routerpkg.Route, peer *peerpkg.Peer) error { + return blockrelay.HandleRequestBlockLocator(m.context, incomingRoute, outgoingRoute) + }, + ), + + m.registerFlow("HandleRequestHeaders", router, + []appmessage.MessageCommand{appmessage.CmdRequestHeaders, appmessage.CmdRequestNextHeaders}, isStopping, errChan, + func(incomingRoute *routerpkg.Route, peer *peerpkg.Peer) error { + return blockrelay.HandleRequestHeaders(m.context, incomingRoute, outgoingRoute) + }, + ), + + m.registerFlow("HandleRequestIBDRootUTXOSetAndBlock", router, + []appmessage.MessageCommand{appmessage.CmdRequestIBDRootUTXOSetAndBlock}, isStopping, errChan, + func(incomingRoute *routerpkg.Route, peer *peerpkg.Peer) error { + return blockrelay.HandleRequestIBDRootUTXOSetAndBlock(m.context, incomingRoute, outgoingRoute) + }, + ), + + m.registerFlow("HandleIBDBlockRequests", router, + []appmessage.MessageCommand{appmessage.CmdRequestIBDBlocks}, isStopping, errChan, + func(incomingRoute *routerpkg.Route, peer *peerpkg.Peer) error { + return blockrelay.HandleIBDBlockRequests(m.context, incomingRoute, outgoingRoute) + }, + ), } } @@ -169,62 +197,6 @@ func (m *Manager) registerPingFlows(router *routerpkg.Router, isStopping *uint32 } } -func (m *Manager) registerIBDFlows(router *routerpkg.Router, isStopping *uint32, errChan chan error) []*flow { - outgoingRoute := router.OutgoingRoute() - - return []*flow{ - m.registerFlow("HandleIBD", router, []appmessage.MessageCommand{appmessage.CmdBlockLocator, appmessage.CmdIBDBlock, - appmessage.CmdDoneHeaders, appmessage.CmdIBDRootNotFound, appmessage.CmdIBDRootUTXOSetAndBlock, appmessage.CmdHeader}, - isStopping, errChan, - func(incomingRoute *routerpkg.Route, peer *peerpkg.Peer) error { - return ibd.HandleIBD(m.context, incomingRoute, outgoingRoute, peer) - }, - ), - - m.registerFlow("RequestSelectedTip", router, - []appmessage.MessageCommand{appmessage.CmdSelectedTip}, isStopping, errChan, - func(incomingRoute *routerpkg.Route, peer *peerpkg.Peer) error { - return selectedtip.RequestSelectedTip(m.context, incomingRoute, outgoingRoute, peer) - }, - ), - - m.registerFlow("HandleRequestSelectedTip", router, - []appmessage.MessageCommand{appmessage.CmdRequestSelectedTip}, isStopping, errChan, - func(incomingRoute *routerpkg.Route, peer *peerpkg.Peer) error { - return selectedtip.HandleRequestSelectedTip(m.context, incomingRoute, outgoingRoute) - }, - ), - - m.registerFlow("HandleRequestBlockLocator", router, - []appmessage.MessageCommand{appmessage.CmdRequestBlockLocator}, isStopping, errChan, - func(incomingRoute *routerpkg.Route, peer *peerpkg.Peer) error { - return ibd.HandleRequestBlockLocator(m.context, incomingRoute, outgoingRoute) - }, - ), - - m.registerFlow("HandleRequestHeaders", router, - []appmessage.MessageCommand{appmessage.CmdRequestHeaders, appmessage.CmdRequestNextHeaders}, isStopping, errChan, - func(incomingRoute *routerpkg.Route, peer *peerpkg.Peer) error { - return ibd.HandleRequestHeaders(m.context, incomingRoute, outgoingRoute) - }, - ), - - m.registerFlow("HandleRequestIBDRootUTXOSetAndBlock", router, - []appmessage.MessageCommand{appmessage.CmdRequestIBDRootUTXOSetAndBlock}, isStopping, errChan, - func(incomingRoute *routerpkg.Route, peer *peerpkg.Peer) error { - return ibd.HandleRequestIBDRootUTXOSetAndBlock(m.context, incomingRoute, outgoingRoute) - }, - ), - - m.registerFlow("HandleIBDBlockRequests", router, - []appmessage.MessageCommand{appmessage.CmdRequestIBDBlocks}, isStopping, errChan, - func(incomingRoute *routerpkg.Route, peer *peerpkg.Peer) error { - return ibd.HandleIBDBlockRequests(m.context, incomingRoute, outgoingRoute) - }, - ), - } -} - func (m *Manager) registerTransactionRelayFlow(router *routerpkg.Router, isStopping *uint32, errChan chan error) []*flow { outgoingRoute := router.OutgoingRoute() @@ -232,13 +204,13 @@ func (m *Manager) registerTransactionRelayFlow(router *routerpkg.Router, isStopp m.registerFlow("HandleRelayedTransactions", router, []appmessage.MessageCommand{appmessage.CmdInvTransaction, appmessage.CmdTx, appmessage.CmdTransactionNotFound}, isStopping, errChan, func(incomingRoute *routerpkg.Route, peer *peerpkg.Peer) error { - return relaytransactions.HandleRelayedTransactions(m.context, incomingRoute, outgoingRoute) + return transactionrelay.HandleRelayedTransactions(m.context, incomingRoute, outgoingRoute) }, ), m.registerFlow("HandleRequestTransactions", router, []appmessage.MessageCommand{appmessage.CmdRequestTransactions}, isStopping, errChan, func(incomingRoute *routerpkg.Route, peer *peerpkg.Peer) error { - return relaytransactions.HandleRequestedTransactions(m.context, incomingRoute, outgoingRoute) + return transactionrelay.HandleRequestedTransactions(m.context, incomingRoute, outgoingRoute) }, ), } diff --git a/app/rpc/rpchandlers/get_connected_peer_info.go b/app/rpc/rpchandlers/get_connected_peer_info.go index 130a4a7d7..e16696e00 100644 --- a/app/rpc/rpchandlers/get_connected_peer_info.go +++ b/app/rpc/rpchandlers/get_connected_peer_info.go @@ -9,15 +9,12 @@ import ( // HandleGetConnectedPeerInfo handles the respectively named RPC command func HandleGetConnectedPeerInfo(context *rpccontext.Context, _ *router.Router, _ appmessage.Message) (appmessage.Message, error) { peers := context.ProtocolManager.Peers() - ibdPeer := context.ProtocolManager.IBDPeer() infos := make([]*appmessage.GetConnectedPeerInfoMessage, 0, len(peers)) for _, peer := range peers { info := &appmessage.GetConnectedPeerInfoMessage{ ID: peer.ID().String(), Address: peer.Address(), LastPingDuration: peer.LastPingDuration().Milliseconds(), - SelectedTipHash: peer.SelectedTipHash().String(), - IsSyncNode: peer == ibdPeer, IsOutbound: peer.IsOutbound(), TimeOffset: peer.TimeOffset().Milliseconds(), UserAgent: peer.UserAgent(), diff --git a/domain/consensus/consensus.go b/domain/consensus/consensus.go index 6db33d9df..4d16e5a37 100644 --- a/domain/consensus/consensus.go +++ b/domain/consensus/consensus.go @@ -199,11 +199,11 @@ func (s *consensus) GetVirtualSelectedParent() (*externalapi.DomainBlock, error) return s.blockStore.Block(s.databaseContext, virtualGHOSTDAGData.SelectedParent()) } -func (s *consensus) CreateBlockLocator(lowHash, highHash *externalapi.DomainHash) (externalapi.BlockLocator, error) { +func (s *consensus) CreateBlockLocator(lowHash, highHash *externalapi.DomainHash, limit uint32) (externalapi.BlockLocator, error) { s.lock.Lock() defer s.lock.Unlock() - return s.syncManager.CreateBlockLocator(lowHash, highHash) + return s.syncManager.CreateBlockLocator(lowHash, highHash, limit) } func (s *consensus) FindNextBlockLocatorBoundaries(blockLocator externalapi.BlockLocator) (lowHash, highHash *externalapi.DomainHash, err error) { diff --git a/domain/consensus/factory.go b/domain/consensus/factory.go index c37db65f0..4462d3974 100644 --- a/domain/consensus/factory.go +++ b/domain/consensus/factory.go @@ -248,7 +248,7 @@ func (f *factory) NewConsensus(dagParams *dagconfig.Params, db infrastructuredat ) blockProcessor := blockprocessor.New( - dagParams, + genesisHash, dbManager, consensusStateManager, pruningManager, diff --git a/domain/consensus/model/externalapi/consensus.go b/domain/consensus/model/externalapi/consensus.go index 598316ac4..197878b14 100644 --- a/domain/consensus/model/externalapi/consensus.go +++ b/domain/consensus/model/externalapi/consensus.go @@ -15,7 +15,7 @@ type Consensus interface { GetPruningPointUTXOSet(expectedPruningPointHash *DomainHash) ([]byte, error) SetPruningPointUTXOSet(serializedUTXOSet []byte) error GetVirtualSelectedParent() (*DomainBlock, error) - CreateBlockLocator(lowHash, highHash *DomainHash) (BlockLocator, error) + CreateBlockLocator(lowHash, highHash *DomainHash, limit uint32) (BlockLocator, error) FindNextBlockLocatorBoundaries(blockLocator BlockLocator) (lowHash, highHash *DomainHash, err error) GetSyncInfo() (*SyncInfo, error) } diff --git a/domain/consensus/model/externalapi/sync.go b/domain/consensus/model/externalapi/sync.go index 4bf942fa2..758581dc4 100644 --- a/domain/consensus/model/externalapi/sync.go +++ b/domain/consensus/model/externalapi/sync.go @@ -5,11 +5,10 @@ import "fmt" // Each of the following represent one of the possible sync // states of the consensus const ( - SyncStateRelay SyncState = iota - SyncStateMissingGenesis - SyncStateHeadersFirst - SyncStateMissingUTXOSet - SyncStateMissingBlockBodies + SyncStateSynced SyncState = iota + SyncStateAwaitingGenesis + SyncStateAwaitingUTXOSet + SyncStateAwaitingBlockBodies ) // SyncState represents the current sync state of the consensus @@ -17,16 +16,14 @@ type SyncState uint8 func (s SyncState) String() string { switch s { - case SyncStateRelay: - return "SyncStateRelay" - case SyncStateMissingGenesis: - return "SyncStateMissingGenesis" - case SyncStateHeadersFirst: - return "SyncStateHeadersFirst" - case SyncStateMissingUTXOSet: - return "SyncStateMissingUTXOSet" - case SyncStateMissingBlockBodies: - return "SyncStateMissingBlockBodies" + case SyncStateSynced: + return "SyncStateSynced" + case SyncStateAwaitingGenesis: + return "SyncStateAwaitingGenesis" + case SyncStateAwaitingUTXOSet: + return "SyncStateAwaitingUTXOSet" + case SyncStateAwaitingBlockBodies: + return "SyncStateAwaitingBlockBodies" } return fmt.Sprintf("", s) diff --git a/domain/consensus/model/interface_processes_syncmanager.go b/domain/consensus/model/interface_processes_syncmanager.go index f4a4a6ae1..cc0a32567 100644 --- a/domain/consensus/model/interface_processes_syncmanager.go +++ b/domain/consensus/model/interface_processes_syncmanager.go @@ -6,7 +6,7 @@ import "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" type SyncManager interface { GetHashesBetween(lowHash, highHash *externalapi.DomainHash) ([]*externalapi.DomainHash, error) GetMissingBlockBodyHashes(highHash *externalapi.DomainHash) ([]*externalapi.DomainHash, error) - CreateBlockLocator(lowHash, highHash *externalapi.DomainHash) (externalapi.BlockLocator, error) + CreateBlockLocator(lowHash, highHash *externalapi.DomainHash, limit uint32) (externalapi.BlockLocator, error) FindNextBlockLocatorBoundaries(blockLocator externalapi.BlockLocator) (lowHash, highHash *externalapi.DomainHash, err error) IsBlockInHeaderPruningPointFuture(blockHash *externalapi.DomainHash) (bool, error) GetSyncInfo() (*externalapi.SyncInfo, error) diff --git a/domain/consensus/processes/blockprocessor/blockprocessor.go b/domain/consensus/processes/blockprocessor/blockprocessor.go index 805892a28..3acb04cf8 100644 --- a/domain/consensus/processes/blockprocessor/blockprocessor.go +++ b/domain/consensus/processes/blockprocessor/blockprocessor.go @@ -3,14 +3,13 @@ package blockprocessor import ( "github.com/kaspanet/kaspad/domain/consensus/model" "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" - "github.com/kaspanet/kaspad/domain/dagconfig" "github.com/kaspanet/kaspad/infrastructure/logger" ) // blockProcessor is responsible for processing incoming blocks // and creating blocks from the current state type blockProcessor struct { - dagParams *dagconfig.Params + genesisHash *externalapi.DomainHash databaseContext model.DBManager consensusStateManager model.ConsensusStateManager @@ -43,7 +42,7 @@ type blockProcessor struct { // New instantiates a new BlockProcessor func New( - dagParams *dagconfig.Params, + genesisHash *externalapi.DomainHash, databaseContext model.DBManager, consensusStateManager model.ConsensusStateManager, pruningManager model.PruningManager, @@ -71,7 +70,7 @@ func New( headerTipsStore model.HeaderTipsStore) model.BlockProcessor { return &blockProcessor{ - dagParams: dagParams, + genesisHash: genesisHash, databaseContext: databaseContext, pruningManager: pruningManager, blockValidator: blockValidator, diff --git a/domain/consensus/processes/blockprocessor/validateandinsertblock.go b/domain/consensus/processes/blockprocessor/validateandinsertblock.go index b8d8603ec..35f845469 100644 --- a/domain/consensus/processes/blockprocessor/validateandinsertblock.go +++ b/domain/consensus/processes/blockprocessor/validateandinsertblock.go @@ -11,88 +11,51 @@ import ( "github.com/pkg/errors" ) +type insertMode uint8 + +const ( + insertModeGenesis insertMode = iota + insertModeHeader + insertModeBlockBody + insertModeBlock +) + func (bp *blockProcessor) validateAndInsertBlock(block *externalapi.DomainBlock) error { - hash := consensushashing.HeaderHash(block.Header) - log.Debugf("Validating block %s", hash) + blockHash := consensushashing.HeaderHash(block.Header) + log.Debugf("Validating block %s", blockHash) - syncInfo, err := bp.syncManager.GetSyncInfo() + insertMode, err := bp.validateAgainstSyncStateAndResolveInsertMode(block) if err != nil { return err } - if isHeaderOnlyBlock(block) && syncInfo.State != externalapi.SyncStateRelay { - syncInfo.State = externalapi.SyncStateHeadersFirst - } - - if syncInfo.State == externalapi.SyncStateMissingUTXOSet { - if isHeaderOnlyBlock(block) { - // Allow processing headers while in state SyncStateMissingUTXOSet - syncInfo.State = externalapi.SyncStateHeadersFirst - } else { - headerTipsPruningPoint, err := bp.consensusStateManager.HeaderTipsPruningPoint() - if err != nil { - return err - } - - if *hash != *headerTipsPruningPoint { - return errors.Errorf("cannot insert blocks other than the header pruning point "+ - "while in %s mode", syncInfo.State) - } - - syncInfo.State = externalapi.SyncStateMissingBlockBodies - } - } - - if syncInfo.State == externalapi.SyncStateHeadersFirst && !isHeaderOnlyBlock(block) { - syncInfo.State = externalapi.SyncStateRelay - log.Warnf("block %s contains transactions while validating in header only mode", hash) - } - - if syncInfo.State == externalapi.SyncStateMissingBlockBodies { - headerTips, err := bp.headerTipsStore.Tips(bp.databaseContext) - if err != nil { - return err - } - selectedHeaderTip, err := bp.ghostdagManager.ChooseSelectedParent(headerTips...) - if err != nil { - return err - } - if *selectedHeaderTip == *hash { - syncInfo.State = externalapi.SyncStateRelay - } - } - - err = bp.checkBlockStatus(hash, syncInfo) + err = bp.checkBlockStatus(blockHash, insertMode) if err != nil { return err } - err = bp.validateBlock(block, syncInfo) + err = bp.validateBlock(block, insertMode) if err != nil { bp.discardAllChanges() return err } - hasHeader, err := bp.hasHeader(hash) + hasHeader, err := bp.hasHeader(blockHash) if err != nil { return err } if !hasHeader { - if syncInfo.State == externalapi.SyncStateMissingBlockBodies { - return errors.Wrapf(ruleerrors.ErrMissingBlockHeaderInIBD, "no block header is stored for block %s. "+ - "Every block we get during %s mode should have a pre-stored header", syncInfo.State, hash) - } - err = bp.reachabilityManager.AddBlock(hash) + err = bp.reachabilityManager.AddBlock(blockHash) if err != nil { return err } } - if syncInfo.State == externalapi.SyncStateHeadersFirst { - bp.blockStatusStore.Stage(hash, externalapi.StatusHeaderOnly) + if insertMode == insertModeHeader { + bp.blockStatusStore.Stage(blockHash, externalapi.StatusHeaderOnly) } else { - bp.blockStatusStore.Stage(hash, externalapi.StatusUTXOPendingVerification) + bp.blockStatusStore.Stage(blockHash, externalapi.StatusUTXOPendingVerification) } // Block validations passed, save whatever DAG data was @@ -102,13 +65,8 @@ func (bp *blockProcessor) validateAndInsertBlock(block *externalapi.DomainBlock) return err } - hasTips, err := bp.headerTipsStore.HasTips(bp.databaseContext) - if err != nil { - return err - } - var oldHeadersSelectedTip *externalapi.DomainHash - if hasTips { + if insertMode != insertModeGenesis { var err error oldHeadersSelectedTip, err = bp.headerTipsManager.SelectedTip() if err != nil { @@ -116,14 +74,14 @@ func (bp *blockProcessor) validateAndInsertBlock(block *externalapi.DomainBlock) } } - if syncInfo.State == externalapi.SyncStateHeadersFirst { - err = bp.headerTipsManager.AddHeaderTip(hash) + if insertMode == insertModeHeader { + err = bp.headerTipsManager.AddHeaderTip(blockHash) if err != nil { return err } - } else if syncInfo.State == externalapi.SyncStateRelay || syncInfo.State == externalapi.SyncStateMissingGenesis { + } else if insertMode == insertModeBlock || insertMode == insertModeGenesis { // Attempt to add the block to the virtual - err = bp.consensusStateManager.AddBlockToVirtual(hash) + err = bp.consensusStateManager.AddBlockToVirtual(blockHash) if err != nil { return err } @@ -135,14 +93,14 @@ func (bp *blockProcessor) validateAndInsertBlock(block *externalapi.DomainBlock) bp.headerTipsStore.Stage(tips) } - if syncInfo.State != externalapi.SyncStateMissingGenesis { - err = bp.updateReachabilityReindexRoot(oldHeadersSelectedTip) + if insertMode != insertModeGenesis { + err := bp.updateReachabilityReindexRoot(oldHeadersSelectedTip) if err != nil { return err } } - if syncInfo.State == externalapi.SyncStateRelay { + if insertMode == insertModeBlock { // Trigger pruning, which will check if the pruning point changed and delete the data if it did. err = bp.pruningManager.FindNextPruningPoint() if err != nil { @@ -155,7 +113,7 @@ func (bp *blockProcessor) validateAndInsertBlock(block *externalapi.DomainBlock) return err } - log.Debugf("Block %s validated and inserted", hash) + log.Debugf("Block %s validated and inserted", blockHash) var logClosureErr error log.Debugf("%s", logger.NewLogClosure(func() string { @@ -179,6 +137,62 @@ func (bp *blockProcessor) validateAndInsertBlock(block *externalapi.DomainBlock) return nil } +func (bp *blockProcessor) validateAgainstSyncStateAndResolveInsertMode(block *externalapi.DomainBlock) (insertMode, error) { + syncInfo, err := bp.syncManager.GetSyncInfo() + if err != nil { + return 0, err + } + syncState := syncInfo.State + + isHeaderOnlyBlock := isHeaderOnlyBlock(block) + blockHash := consensushashing.HeaderHash(block.Header) + if syncState == externalapi.SyncStateAwaitingGenesis { + if isHeaderOnlyBlock { + return 0, errors.Errorf("Got a header-only block while awaiting genesis") + } + if *blockHash != *bp.genesisHash { + return 0, errors.Errorf("Received a non-genesis block while awaiting genesis") + } + return insertModeGenesis, nil + } + + if isHeaderOnlyBlock { + return insertModeHeader, nil + } + + if syncState == externalapi.SyncStateAwaitingUTXOSet { + headerTipsPruningPoint, err := bp.consensusStateManager.HeaderTipsPruningPoint() + if err != nil { + return 0, err + } + if *blockHash != *headerTipsPruningPoint { + return 0, errors.Errorf("cannot insert blocks other than the header pruning point " + + "while awaiting the UTXO set") + } + return insertModeBlock, nil + } + + if syncState == externalapi.SyncStateAwaitingBlockBodies { + headerTips, err := bp.headerTipsStore.Tips(bp.databaseContext) + if err != nil { + return 0, err + } + selectedHeaderTip, err := bp.ghostdagManager.ChooseSelectedParent(headerTips...) + if err != nil { + return 0, err + } + if *selectedHeaderTip != *blockHash { + return insertModeBlockBody, nil + } + } + + return insertModeBlock, nil +} + +func isHeaderOnlyBlock(block *externalapi.DomainBlock) bool { + return len(block.Transactions) == 0 +} + func (bp *blockProcessor) updateReachabilityReindexRoot(oldHeadersSelectedTip *externalapi.DomainHash) error { headersSelectedTip, err := bp.headerTipsManager.SelectedTip() if err != nil { @@ -192,16 +206,11 @@ func (bp *blockProcessor) updateReachabilityReindexRoot(oldHeadersSelectedTip *e return bp.reachabilityManager.UpdateReindexRoot(headersSelectedTip) } -func isHeaderOnlyBlock(block *externalapi.DomainBlock) bool { - return len(block.Transactions) == 0 -} - -func (bp *blockProcessor) checkBlockStatus(hash *externalapi.DomainHash, mode *externalapi.SyncInfo) error { +func (bp *blockProcessor) checkBlockStatus(hash *externalapi.DomainHash, mode insertMode) error { exists, err := bp.blockStatusStore.Exists(bp.databaseContext, hash) if err != nil { return err } - if !exists { return nil } @@ -215,14 +224,20 @@ func (bp *blockProcessor) checkBlockStatus(hash *externalapi.DomainHash, mode *e return errors.Wrapf(ruleerrors.ErrKnownInvalid, "block %s is a known invalid block", hash) } - if mode.State == externalapi.SyncStateHeadersFirst || status != externalapi.StatusHeaderOnly { + isBlockBodyAfterBlockHeader := mode != insertModeHeader && status == externalapi.StatusHeaderOnly + if !isBlockBodyAfterBlockHeader { + return errors.Wrapf(ruleerrors.ErrDuplicateBlock, "block %s already exists", hash) + } + + isDuplicateHeader := mode == insertModeHeader && status == externalapi.StatusHeaderOnly + if isDuplicateHeader { return errors.Wrapf(ruleerrors.ErrDuplicateBlock, "block %s already exists", hash) } return nil } -func (bp *blockProcessor) validateBlock(block *externalapi.DomainBlock, mode *externalapi.SyncInfo) error { +func (bp *blockProcessor) validateBlock(block *externalapi.DomainBlock, mode insertMode) error { blockHash := consensushashing.HeaderHash(block.Header) hasHeader, err := bp.hasHeader(blockHash) if err != nil { @@ -241,7 +256,7 @@ func (bp *blockProcessor) validateBlock(block *externalapi.DomainBlock, mode *ex return err } - err = bp.blockValidator.ValidatePruningPointViolationAndProofOfWorkAndDifficulty(blockHash) + err = bp.validatePruningPointViolationAndProofOfWorkAndDifficulty(block, mode) if err != nil { return err } @@ -283,12 +298,19 @@ func (bp *blockProcessor) validatePreProofOfWork(block *externalapi.DomainBlock) return nil } -func (bp *blockProcessor) validatePostProofOfWork(block *externalapi.DomainBlock, mode *externalapi.SyncInfo) error { +func (bp *blockProcessor) validatePruningPointViolationAndProofOfWorkAndDifficulty(block *externalapi.DomainBlock, mode insertMode) error { + blockHash := consensushashing.HeaderHash(block.Header) + if mode != insertModeHeader { + // We stage the block here since we need it for parent validation + bp.blockStore.Stage(blockHash, block) + } + return bp.blockValidator.ValidatePruningPointViolationAndProofOfWorkAndDifficulty(blockHash) +} + +func (bp *blockProcessor) validatePostProofOfWork(block *externalapi.DomainBlock, mode insertMode) error { blockHash := consensushashing.BlockHash(block) - if mode.State != externalapi.SyncStateHeadersFirst { - bp.blockStore.Stage(blockHash, block) - + if mode != insertModeHeader { err := bp.blockValidator.ValidateBodyInIsolation(blockHash) if err != nil { return err diff --git a/domain/consensus/processes/blockvalidator/proof_of_work.go b/domain/consensus/processes/blockvalidator/proof_of_work.go index a63b70f93..896818159 100644 --- a/domain/consensus/processes/blockvalidator/proof_of_work.go +++ b/domain/consensus/processes/blockvalidator/proof_of_work.go @@ -15,7 +15,7 @@ func (v *blockValidator) ValidatePruningPointViolationAndProofOfWorkAndDifficult return err } - err = v.checkParentsExist(header) + err = v.checkParentsExist(blockHash, header) if err != nil { return err } @@ -104,17 +104,32 @@ func (v *blockValidator) checkProofOfWork(header *externalapi.DomainBlockHeader) return nil } -func (v *blockValidator) checkParentsExist(header *externalapi.DomainBlockHeader) error { +func (v *blockValidator) checkParentsExist(blockHash *externalapi.DomainHash, header *externalapi.DomainBlockHeader) error { missingParentHashes := []*externalapi.DomainHash{} + isFullBlock, err := v.blockStore.HasBlock(v.databaseContext, blockHash) + if err != nil { + return err + } + for _, parent := range header.ParentHashes { - exists, err := v.blockHeaderStore.HasBlockHeader(v.databaseContext, parent) + parentHeaderExists, err := v.blockHeaderStore.HasBlockHeader(v.databaseContext, parent) if err != nil { return err } - - if !exists { + if !parentHeaderExists { missingParentHashes = append(missingParentHashes, parent) + continue + } + + if isFullBlock { + parentStatus, err := v.blockStatusStore.Get(v.databaseContext, parent) + if err != nil { + return err + } + if parentStatus == externalapi.StatusHeaderOnly { + missingParentHashes = append(missingParentHashes, parent) + } } } diff --git a/domain/consensus/processes/dagtopologymanager/dagtopologymanager.go b/domain/consensus/processes/dagtopologymanager/dagtopologymanager.go index 1c430c8af..f939a7ec3 100644 --- a/domain/consensus/processes/dagtopologymanager/dagtopologymanager.go +++ b/domain/consensus/processes/dagtopologymanager/dagtopologymanager.go @@ -103,7 +103,6 @@ func isHashInSlice(hash *externalapi.DomainHash, hashes []*externalapi.DomainHas } func (dtm *dagTopologyManager) SetParents(blockHash *externalapi.DomainHash, parentHashes []*externalapi.DomainHash) error { - hasRelations, err := dtm.blockRelationStore.Has(dtm.databaseContext, blockHash) if err != nil { return err @@ -128,7 +127,6 @@ func (dtm *dagTopologyManager) SetParents(blockHash *externalapi.DomainHash, par if *parentChild == *blockHash { parentRelations.Children = append(parentRelations.Children[:i], parentRelations.Children[i+1:]...) dtm.blockRelationStore.StageBlockRelation(currentParent, parentRelations) - break } } diff --git a/domain/consensus/processes/dagtraversalmanager/selected_child_iterator.go b/domain/consensus/processes/dagtraversalmanager/selected_child_iterator.go index 5561a4d4a..10d3023cc 100644 --- a/domain/consensus/processes/dagtraversalmanager/selected_child_iterator.go +++ b/domain/consensus/processes/dagtraversalmanager/selected_child_iterator.go @@ -13,7 +13,7 @@ type selectedChildIterator struct { current *externalapi.DomainHash } -func (s selectedChildIterator) Next() bool { +func (s *selectedChildIterator) Next() bool { children, err := s.dagTopologyManager.Children(s.current) if err != nil { panic(err) @@ -21,7 +21,7 @@ func (s selectedChildIterator) Next() bool { for _, child := range children { if *child == *model.VirtualBlockHash { - break + continue } isChildInSelectedParentChainOfHighHash, err := s.dagTopologyManager.IsInSelectedParentChainOf(child, s.highHash) diff --git a/domain/consensus/processes/syncmanager/antipast.go b/domain/consensus/processes/syncmanager/antipast.go index 7cdf339c1..c0e1908ec 100644 --- a/domain/consensus/processes/syncmanager/antipast.go +++ b/domain/consensus/processes/syncmanager/antipast.go @@ -110,6 +110,7 @@ func (sm *syncManager) missingBlockBodyHashes(highHash *externalapi.DomainHash) } lowHash := headerTipsPruningPoint + foundHeaderOnlyBlock := false for selectedChildIterator.Next() { selectedChild := selectedChildIterator.Get() selectedChildStatus, err := sm.blockStatusStore.Get(sm.databaseContext, selectedChild) @@ -117,10 +118,17 @@ func (sm *syncManager) missingBlockBodyHashes(highHash *externalapi.DomainHash) return nil, err } - if selectedChildStatus != externalapi.StatusHeaderOnly { - lowHash = selectedChild + if selectedChildStatus == externalapi.StatusHeaderOnly { + foundHeaderOnlyBlock = true break } + lowHash = selectedChild + } + if !foundHeaderOnlyBlock { + // TODO: Once block children are fixed, this error + // should be returned instead of simply logged + log.Errorf("no header-only blocks between %s and %s", + lowHash, highHash) } hashesBetween, err := sm.antiPastHashesBetween(lowHash, highHash) @@ -128,44 +136,17 @@ func (sm *syncManager) missingBlockBodyHashes(highHash *externalapi.DomainHash) return nil, err } - lowHashAnticone, err := sm.dagTraversalManager.AnticoneFromContext(highHash, lowHash) - if err != nil { - return nil, err - } - - blockToRemoveFromHashesBetween := hashset.New() - for _, blockHash := range lowHashAnticone { - isHeaderOnlyBlock, err := sm.isHeaderOnlyBlock(blockHash) + missingBlocks := make([]*externalapi.DomainHash, 0, len(hashesBetween)) + for _, blockHash := range hashesBetween { + blockStatus, err := sm.blockStatusStore.Get(sm.databaseContext, blockHash) if err != nil { return nil, err } - - if !isHeaderOnlyBlock { - blockToRemoveFromHashesBetween.Add(blockHash) + if blockStatus == externalapi.StatusHeaderOnly { + missingBlocks = append(missingBlocks, blockHash) } } - missingBlocks := make([]*externalapi.DomainHash, 0, len(hashesBetween)-len(lowHashAnticone)) - for i, blockHash := range hashesBetween { - // If blockToRemoveFromHashesBetween is empty, no more blocks should be - // filtered, so we can copy the rest of hashesBetween into missingBlocks - if blockToRemoveFromHashesBetween.Length() == 0 { - missingBlocks = append(missingBlocks, hashesBetween[i:]...) - break - } - - if blockToRemoveFromHashesBetween.Contains(blockHash) { - blockToRemoveFromHashesBetween.Remove(blockHash) - continue - } - - missingBlocks = append(missingBlocks, blockHash) - } - - if blockToRemoveFromHashesBetween.Length() != 0 { - return nil, errors.Errorf("blockToRemoveFromHashesBetween.Length() is expected to be 0") - } - return missingBlocks, nil } diff --git a/domain/consensus/processes/syncmanager/blocklocator.go b/domain/consensus/processes/syncmanager/blocklocator.go index 770b22ee6..7bcc80e5a 100644 --- a/domain/consensus/processes/syncmanager/blocklocator.go +++ b/domain/consensus/processes/syncmanager/blocklocator.go @@ -7,7 +7,7 @@ import ( // createBlockLocator creates a block locator for the passed high and low hashes. // See the BlockLocator type comments for more details. -func (sm *syncManager) createBlockLocator(lowHash, highHash *externalapi.DomainHash) (externalapi.BlockLocator, error) { +func (sm *syncManager) createBlockLocator(lowHash, highHash *externalapi.DomainHash, limit uint32) (externalapi.BlockLocator, error) { // We use the selected parent of the high block, so that the // block locator won't contain it. highBlockGHOSTDAGData, err := sm.ghostdagDataStore.Get(sm.databaseContext, highHash) @@ -28,6 +28,11 @@ func (sm *syncManager) createBlockLocator(lowHash, highHash *externalapi.DomainH for currentHash != nil { locator = append(locator, currentHash) + // Stop if we've reached the limit (if it's set) + if limit > 0 && uint32(len(locator)) == limit { + break + } + currentBlockGHOSTDAGData, err := sm.ghostdagDataStore.Get(sm.databaseContext, currentHash) if err != nil { return nil, err @@ -36,7 +41,11 @@ func (sm *syncManager) createBlockLocator(lowHash, highHash *externalapi.DomainH // Nothing more to add once the low node has been added. if currentBlockBlueScore <= lowBlockBlueScore { - if *currentHash != *lowHash { + isCurrentHashInSelectedParentChainOfLowHash, err := sm.dagTopologyManager.IsInSelectedParentChainOf(currentHash, lowHash) + if err != nil { + return nil, err + } + if !isCurrentHashInSelectedParentChainOfLowHash { return nil, errors.Errorf("highHash and lowHash are " + "not in the same selected parent chain.") } @@ -67,24 +76,24 @@ func (sm *syncManager) createBlockLocator(lowHash, highHash *externalapi.DomainH // hash and the highest known block locator hash. This is used to create the // next block locator to find the highest shared known chain block with a // remote kaspad. -func (sm *syncManager) findNextBlockLocatorBoundaries(blockLocator externalapi.BlockLocator) (lowHash, highHash *externalapi.DomainHash, err error) { +func (sm *syncManager) findNextBlockLocatorBoundaries(blockLocator externalapi.BlockLocator) ( + lowHash, highHash *externalapi.DomainHash, err error) { + // Find the most recent locator block hash in the DAG. In case none of // the hashes in the locator are in the DAG, fall back to the genesis block. - lowHash = sm.genesisBlockHash - nextBlockLocatorIndex := int64(len(blockLocator) - 1) - for i, hash := range blockLocator { + highestKnownHash := sm.genesisBlockHash + lowestUnknownHash := blockLocator[len(blockLocator)-1] + for _, hash := range blockLocator { exists, err := sm.blockStatusStore.Exists(sm.databaseContext, hash) if err != nil { return nil, nil, err } - if exists { - lowHash = hash - nextBlockLocatorIndex = int64(i) - 1 + if !exists { + lowestUnknownHash = hash + } else { + highestKnownHash = hash break } } - if nextBlockLocatorIndex < 0 { - return nil, lowHash, nil - } - return blockLocator[nextBlockLocatorIndex], lowHash, nil + return highestKnownHash, lowestUnknownHash, nil } diff --git a/domain/consensus/processes/syncmanager/syncinfo.go b/domain/consensus/processes/syncmanager/syncinfo.go index 62a3f2a7b..2738f8e11 100644 --- a/domain/consensus/processes/syncmanager/syncinfo.go +++ b/domain/consensus/processes/syncmanager/syncinfo.go @@ -1,9 +1,7 @@ package syncmanager import ( - "github.com/kaspanet/kaspad/domain/consensus/model" "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" - "github.com/kaspanet/kaspad/util/mstime" ) // areHeaderTipsSyncedMaxTimeDifference is the number of blocks from @@ -18,7 +16,7 @@ func (sm *syncManager) syncInfo() (*externalapi.SyncInfo, error) { } var ibdRootUTXOBlockHash *externalapi.DomainHash - if syncState == externalapi.SyncStateMissingUTXOSet { + if syncState == externalapi.SyncStateAwaitingUTXOSet { ibdRootUTXOBlockHash, err = sm.consensusStateManager.HeaderTipsPruningPoint() if err != nil { return nil, err @@ -42,27 +40,19 @@ func (sm *syncManager) resolveSyncState() (externalapi.SyncState, error) { return 0, err } if !hasTips { - return externalapi.SyncStateMissingGenesis, nil + return externalapi.SyncStateAwaitingGenesis, nil } headerVirtualSelectedParentHash, err := sm.headerVirtualSelectedParentHash() if err != nil { return 0, err } - isSynced, err := sm.areHeaderTipsSynced(headerVirtualSelectedParentHash) + headerVirtualSelectedParentStatus, err := sm.blockStatusStore.Get(sm.databaseContext, headerVirtualSelectedParentHash) if err != nil { return 0, err } - if !isSynced { - return externalapi.SyncStateHeadersFirst, nil - } - - virtualSelectedParentHash, err := sm.virtualSelectedParentHash() - if err != nil { - return 0, err - } - if *virtualSelectedParentHash == *headerVirtualSelectedParentHash { - return externalapi.SyncStateRelay, nil + if headerVirtualSelectedParentStatus != externalapi.StatusHeaderOnly { + return externalapi.SyncStateSynced, nil } // Once the header tips are synced, check the status of @@ -80,18 +70,10 @@ func (sm *syncManager) resolveSyncState() (externalapi.SyncState, error) { return 0, err } if headerTipsPruningPointStatus != externalapi.StatusValid { - return externalapi.SyncStateMissingUTXOSet, nil + return externalapi.SyncStateAwaitingUTXOSet, nil } - return externalapi.SyncStateMissingBlockBodies, nil -} - -func (sm *syncManager) virtualSelectedParentHash() (*externalapi.DomainHash, error) { - virtualGHOSTDAGData, err := sm.ghostdagDataStore.Get(sm.databaseContext, model.VirtualBlockHash) - if err != nil { - return nil, err - } - return virtualGHOSTDAGData.SelectedParent(), nil + return externalapi.SyncStateAwaitingBlockBodies, nil } func (sm *syncManager) headerVirtualSelectedParentHash() (*externalapi.DomainHash, error) { @@ -102,21 +84,6 @@ func (sm *syncManager) headerVirtualSelectedParentHash() (*externalapi.DomainHas return sm.ghostdagManager.ChooseSelectedParent(headerTips...) } -func (sm *syncManager) areHeaderTipsSynced(headerVirtualSelectedParentHash *externalapi.DomainHash) (bool, error) { - virtualSelectedParentHeader, err := sm.blockHeaderStore.BlockHeader(sm.databaseContext, headerVirtualSelectedParentHash) - if err != nil { - return false, err - } - virtualSelectedParentTimeInMilliseconds := virtualSelectedParentHeader.TimeInMilliseconds - - nowInMilliseconds := mstime.Now().UnixMilliseconds() - timeDifference := nowInMilliseconds - virtualSelectedParentTimeInMilliseconds - - maxTimeDifference := areHeaderTipsSyncedMaxTimeDifference * sm.targetTimePerBlock - - return timeDifference <= maxTimeDifference, nil -} - func (sm *syncManager) getHeaderCount() uint64 { return sm.blockHeaderStore.Count() } diff --git a/domain/consensus/processes/syncmanager/syncmanager.go b/domain/consensus/processes/syncmanager/syncmanager.go index 5c206c408..c3edba5d6 100644 --- a/domain/consensus/processes/syncmanager/syncmanager.go +++ b/domain/consensus/processes/syncmanager/syncmanager.go @@ -78,11 +78,11 @@ func (sm *syncManager) IsBlockInHeaderPruningPointFuture(blockHash *externalapi. return sm.isBlockInHeaderPruningPointFuture(blockHash) } -func (sm *syncManager) CreateBlockLocator(lowHash, highHash *externalapi.DomainHash) (externalapi.BlockLocator, error) { +func (sm *syncManager) CreateBlockLocator(lowHash, highHash *externalapi.DomainHash, limit uint32) (externalapi.BlockLocator, error) { onEnd := logger.LogAndMeasureExecutionTime(log, "CreateBlockLocator") defer onEnd() - return sm.createBlockLocator(lowHash, highHash) + return sm.createBlockLocator(lowHash, highHash, limit) } func (sm *syncManager) FindNextBlockLocatorBoundaries(blockLocator externalapi.BlockLocator) (lowHash, highHash *externalapi.DomainHash, err error) { diff --git a/domain/consensus/ruleerrors/rule_error.go b/domain/consensus/ruleerrors/rule_error.go index 720aef602..cf0c21798 100644 --- a/domain/consensus/ruleerrors/rule_error.go +++ b/domain/consensus/ruleerrors/rule_error.go @@ -228,8 +228,6 @@ var ( ErrSubnetworksDisabled = newRuleError("ErrSubnetworksDisabled") ErrBadPruningPointUTXOSet = newRuleError("ErrBadPruningPointUTXOSet") - ErrMissingBlockHeaderInIBD = newRuleError("ErrMissingBlockHeaderInIBD") - ErrMalformedUTXO = newRuleError("ErrMalformedUTXO") ErrWrongPruningPointHash = newRuleError("ErrWrongPruningPointHash") diff --git a/infrastructure/logger/logger.go b/infrastructure/logger/logger.go index 58ae577d7..8e2d952b3 100644 --- a/infrastructure/logger/logger.go +++ b/infrastructure/logger/logger.go @@ -52,7 +52,6 @@ var ( ntarLog = BackendLog.Logger("NTAR") dnssLog = BackendLog.Logger("DNSS") snvrLog = BackendLog.Logger("SNVR") - ibdsLog = BackendLog.Logger("IBDS") wsvcLog = BackendLog.Logger("WSVC") reacLog = BackendLog.Logger("REAC") ) @@ -85,7 +84,6 @@ var SubsystemTags = struct { NTAR, DNSS, SNVR, - IBDS, WSVC, REAC string }{ @@ -115,7 +113,6 @@ var SubsystemTags = struct { NTAR: "NTAR", DNSS: "DNSS", SNVR: "SNVR", - IBDS: "IBDS", WSVC: "WSVC", REAC: "REAC", } @@ -148,7 +145,6 @@ var subsystemLoggers = map[string]*Logger{ SubsystemTags.NTAR: ntarLog, SubsystemTags.DNSS: dnssLog, SubsystemTags.SNVR: snvrLog, - SubsystemTags.IBDS: ibdsLog, SubsystemTags.WSVC: wsvcLog, SubsystemTags.REAC: reacLog, } diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/messages.pb.go b/infrastructure/network/netadapter/server/grpcserver/protowire/messages.pb.go index 119e90c62..6f72f7a20 100644 --- a/infrastructure/network/netadapter/server/grpcserver/protowire/messages.pb.go +++ b/infrastructure/network/netadapter/server/grpcserver/protowire/messages.pb.go @@ -41,14 +41,12 @@ type KaspadMessage struct { // *KaspadMessage_RequestNextHeaders // *KaspadMessage_DoneHeaders // *KaspadMessage_RequestRelayBlocks - // *KaspadMessage_RequestSelectedTip // *KaspadMessage_RequestTransactions // *KaspadMessage_IbdBlock // *KaspadMessage_InvRelayBlock // *KaspadMessage_InvTransactions // *KaspadMessage_Ping // *KaspadMessage_Pong - // *KaspadMessage_SelectedTip // *KaspadMessage_Verack // *KaspadMessage_Version // *KaspadMessage_TransactionNotFound @@ -218,13 +216,6 @@ func (x *KaspadMessage) GetRequestRelayBlocks() *RequestRelayBlocksMessage { return nil } -func (x *KaspadMessage) GetRequestSelectedTip() *RequestSelectedTipMessage { - if x, ok := x.GetPayload().(*KaspadMessage_RequestSelectedTip); ok { - return x.RequestSelectedTip - } - return nil -} - func (x *KaspadMessage) GetRequestTransactions() *RequestTransactionsMessage { if x, ok := x.GetPayload().(*KaspadMessage_RequestTransactions); ok { return x.RequestTransactions @@ -267,13 +258,6 @@ func (x *KaspadMessage) GetPong() *PongMessage { return nil } -func (x *KaspadMessage) GetSelectedTip() *SelectedTipMessage { - if x, ok := x.GetPayload().(*KaspadMessage_SelectedTip); ok { - return x.SelectedTip - } - return nil -} - func (x *KaspadMessage) GetVerack() *VerackMessage { if x, ok := x.GetPayload().(*KaspadMessage_Verack); ok { return x.Verack @@ -717,10 +701,6 @@ type KaspadMessage_RequestRelayBlocks struct { RequestRelayBlocks *RequestRelayBlocksMessage `protobuf:"bytes,10,opt,name=requestRelayBlocks,proto3,oneof"` } -type KaspadMessage_RequestSelectedTip struct { - RequestSelectedTip *RequestSelectedTipMessage `protobuf:"bytes,11,opt,name=requestSelectedTip,proto3,oneof"` -} - type KaspadMessage_RequestTransactions struct { RequestTransactions *RequestTransactionsMessage `protobuf:"bytes,12,opt,name=requestTransactions,proto3,oneof"` } @@ -745,10 +725,6 @@ type KaspadMessage_Pong struct { Pong *PongMessage `protobuf:"bytes,17,opt,name=pong,proto3,oneof"` } -type KaspadMessage_SelectedTip struct { - SelectedTip *SelectedTipMessage `protobuf:"bytes,18,opt,name=selectedTip,proto3,oneof"` -} - type KaspadMessage_Verack struct { Verack *VerackMessage `protobuf:"bytes,19,opt,name=verack,proto3,oneof"` } @@ -997,8 +973,6 @@ func (*KaspadMessage_DoneHeaders) isKaspadMessage_Payload() {} func (*KaspadMessage_RequestRelayBlocks) isKaspadMessage_Payload() {} -func (*KaspadMessage_RequestSelectedTip) isKaspadMessage_Payload() {} - func (*KaspadMessage_RequestTransactions) isKaspadMessage_Payload() {} func (*KaspadMessage_IbdBlock) isKaspadMessage_Payload() {} @@ -1011,8 +985,6 @@ func (*KaspadMessage_Ping) isKaspadMessage_Payload() {} func (*KaspadMessage_Pong) isKaspadMessage_Payload() {} -func (*KaspadMessage_SelectedTip) isKaspadMessage_Payload() {} - func (*KaspadMessage_Verack) isKaspadMessage_Payload() {} func (*KaspadMessage_Version) isKaspadMessage_Payload() {} @@ -1885,8 +1857,9 @@ type RequestBlockLocatorMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - LowHash *Hash `protobuf:"bytes,1,opt,name=lowHash,proto3" json:"lowHash,omitempty"` - HighHash *Hash `protobuf:"bytes,2,opt,name=highHash,proto3" json:"highHash,omitempty"` + LowHash *Hash `protobuf:"bytes,1,opt,name=lowHash,proto3" json:"lowHash,omitempty"` + HighHash *Hash `protobuf:"bytes,2,opt,name=highHash,proto3" json:"highHash,omitempty"` + Limit uint32 `protobuf:"varint,3,opt,name=limit,proto3" json:"limit,omitempty"` } func (x *RequestBlockLocatorMessage) Reset() { @@ -1935,6 +1908,13 @@ func (x *RequestBlockLocatorMessage) GetHighHash() *Hash { return nil } +func (x *RequestBlockLocatorMessage) GetLimit() uint32 { + if x != nil { + return x.Limit + } + return 0 +} + // BlockLocatorMessage start type BlockLocatorMessage struct { state protoimpl.MessageState @@ -2165,45 +2145,6 @@ func (x *RequestRelayBlocksMessage) GetHashes() []*Hash { return nil } -// GetSelectedTipMessage start -type RequestSelectedTipMessage struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *RequestSelectedTipMessage) Reset() { - *x = RequestSelectedTipMessage{} - if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RequestSelectedTipMessage) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RequestSelectedTipMessage) ProtoMessage() {} - -func (x *RequestSelectedTipMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[19] - 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 RequestSelectedTipMessage.ProtoReflect.Descriptor instead. -func (*RequestSelectedTipMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{19} -} - // RequestTransactionsMessage start type RequestTransactionsMessage struct { state protoimpl.MessageState @@ -2216,7 +2157,7 @@ type RequestTransactionsMessage struct { func (x *RequestTransactionsMessage) Reset() { *x = RequestTransactionsMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[20] + mi := &file_messages_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2229,7 +2170,7 @@ func (x *RequestTransactionsMessage) String() string { func (*RequestTransactionsMessage) ProtoMessage() {} func (x *RequestTransactionsMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[20] + mi := &file_messages_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2242,7 +2183,7 @@ func (x *RequestTransactionsMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestTransactionsMessage.ProtoReflect.Descriptor instead. func (*RequestTransactionsMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{20} + return file_messages_proto_rawDescGZIP(), []int{19} } func (x *RequestTransactionsMessage) GetIds() []*TransactionId { @@ -2264,7 +2205,7 @@ type TransactionNotFoundMessage struct { func (x *TransactionNotFoundMessage) Reset() { *x = TransactionNotFoundMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[21] + mi := &file_messages_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2277,7 +2218,7 @@ func (x *TransactionNotFoundMessage) String() string { func (*TransactionNotFoundMessage) ProtoMessage() {} func (x *TransactionNotFoundMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[21] + mi := &file_messages_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2290,7 +2231,7 @@ func (x *TransactionNotFoundMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionNotFoundMessage.ProtoReflect.Descriptor instead. func (*TransactionNotFoundMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{21} + return file_messages_proto_rawDescGZIP(), []int{20} } func (x *TransactionNotFoundMessage) GetId() *TransactionId { @@ -2312,7 +2253,7 @@ type InvRelayBlockMessage struct { func (x *InvRelayBlockMessage) Reset() { *x = InvRelayBlockMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[22] + mi := &file_messages_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2325,7 +2266,7 @@ func (x *InvRelayBlockMessage) String() string { func (*InvRelayBlockMessage) ProtoMessage() {} func (x *InvRelayBlockMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[22] + mi := &file_messages_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2338,7 +2279,7 @@ func (x *InvRelayBlockMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use InvRelayBlockMessage.ProtoReflect.Descriptor instead. func (*InvRelayBlockMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{22} + return file_messages_proto_rawDescGZIP(), []int{21} } func (x *InvRelayBlockMessage) GetHash() *Hash { @@ -2360,7 +2301,7 @@ type InvTransactionsMessage struct { func (x *InvTransactionsMessage) Reset() { *x = InvTransactionsMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[23] + mi := &file_messages_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2373,7 +2314,7 @@ func (x *InvTransactionsMessage) String() string { func (*InvTransactionsMessage) ProtoMessage() {} func (x *InvTransactionsMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[23] + mi := &file_messages_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2386,7 +2327,7 @@ func (x *InvTransactionsMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use InvTransactionsMessage.ProtoReflect.Descriptor instead. func (*InvTransactionsMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{23} + return file_messages_proto_rawDescGZIP(), []int{22} } func (x *InvTransactionsMessage) GetIds() []*TransactionId { @@ -2408,7 +2349,7 @@ type PingMessage struct { func (x *PingMessage) Reset() { *x = PingMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[24] + mi := &file_messages_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2421,7 +2362,7 @@ func (x *PingMessage) String() string { func (*PingMessage) ProtoMessage() {} func (x *PingMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[24] + mi := &file_messages_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2434,7 +2375,7 @@ func (x *PingMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use PingMessage.ProtoReflect.Descriptor instead. func (*PingMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{24} + return file_messages_proto_rawDescGZIP(), []int{23} } func (x *PingMessage) GetNonce() uint64 { @@ -2456,7 +2397,7 @@ type PongMessage struct { func (x *PongMessage) Reset() { *x = PongMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[25] + mi := &file_messages_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2469,7 +2410,7 @@ func (x *PongMessage) String() string { func (*PongMessage) ProtoMessage() {} func (x *PongMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[25] + mi := &file_messages_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2482,7 +2423,7 @@ func (x *PongMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use PongMessage.ProtoReflect.Descriptor instead. func (*PongMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{25} + return file_messages_proto_rawDescGZIP(), []int{24} } func (x *PongMessage) GetNonce() uint64 { @@ -2492,54 +2433,6 @@ func (x *PongMessage) GetNonce() uint64 { return 0 } -// SelectedTipMessage start -type SelectedTipMessage struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - SelectedTipHash *Hash `protobuf:"bytes,1,opt,name=selectedTipHash,proto3" json:"selectedTipHash,omitempty"` -} - -func (x *SelectedTipMessage) Reset() { - *x = SelectedTipMessage{} - if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SelectedTipMessage) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SelectedTipMessage) ProtoMessage() {} - -func (x *SelectedTipMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[26] - 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 SelectedTipMessage.ProtoReflect.Descriptor instead. -func (*SelectedTipMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{26} -} - -func (x *SelectedTipMessage) GetSelectedTipHash() *Hash { - if x != nil { - return x.SelectedTipHash - } - return nil -} - // VerackMessage start type VerackMessage struct { state protoimpl.MessageState @@ -2550,7 +2443,7 @@ type VerackMessage struct { func (x *VerackMessage) Reset() { *x = VerackMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[27] + mi := &file_messages_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2563,7 +2456,7 @@ func (x *VerackMessage) String() string { func (*VerackMessage) ProtoMessage() {} func (x *VerackMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[27] + mi := &file_messages_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2576,7 +2469,7 @@ func (x *VerackMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use VerackMessage.ProtoReflect.Descriptor instead. func (*VerackMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{27} + return file_messages_proto_rawDescGZIP(), []int{25} } // VersionMessage start @@ -2591,7 +2484,6 @@ type VersionMessage struct { Address *NetAddress `protobuf:"bytes,4,opt,name=address,proto3" json:"address,omitempty"` Id []byte `protobuf:"bytes,5,opt,name=id,proto3" json:"id,omitempty"` UserAgent string `protobuf:"bytes,6,opt,name=userAgent,proto3" json:"userAgent,omitempty"` - SelectedTipHash *Hash `protobuf:"bytes,7,opt,name=selectedTipHash,proto3" json:"selectedTipHash,omitempty"` DisableRelayTx bool `protobuf:"varint,8,opt,name=disableRelayTx,proto3" json:"disableRelayTx,omitempty"` SubnetworkId *SubnetworkId `protobuf:"bytes,9,opt,name=subnetworkId,proto3" json:"subnetworkId,omitempty"` Network string `protobuf:"bytes,10,opt,name=network,proto3" json:"network,omitempty"` @@ -2600,7 +2492,7 @@ type VersionMessage struct { func (x *VersionMessage) Reset() { *x = VersionMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[28] + mi := &file_messages_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2613,7 +2505,7 @@ func (x *VersionMessage) String() string { func (*VersionMessage) ProtoMessage() {} func (x *VersionMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[28] + mi := &file_messages_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2626,7 +2518,7 @@ func (x *VersionMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use VersionMessage.ProtoReflect.Descriptor instead. func (*VersionMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{28} + return file_messages_proto_rawDescGZIP(), []int{26} } func (x *VersionMessage) GetProtocolVersion() uint32 { @@ -2671,13 +2563,6 @@ func (x *VersionMessage) GetUserAgent() string { return "" } -func (x *VersionMessage) GetSelectedTipHash() *Hash { - if x != nil { - return x.SelectedTipHash - } - return nil -} - func (x *VersionMessage) GetDisableRelayTx() bool { if x != nil { return x.DisableRelayTx @@ -2711,7 +2596,7 @@ type RejectMessage struct { func (x *RejectMessage) Reset() { *x = RejectMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[29] + mi := &file_messages_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2724,7 +2609,7 @@ func (x *RejectMessage) String() string { func (*RejectMessage) ProtoMessage() {} func (x *RejectMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[29] + mi := &file_messages_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2737,7 +2622,7 @@ func (x *RejectMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use RejectMessage.ProtoReflect.Descriptor instead. func (*RejectMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{29} + return file_messages_proto_rawDescGZIP(), []int{27} } func (x *RejectMessage) GetReason() string { @@ -2759,7 +2644,7 @@ type RequestIBDRootUTXOSetAndBlockMessage struct { func (x *RequestIBDRootUTXOSetAndBlockMessage) Reset() { *x = RequestIBDRootUTXOSetAndBlockMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[30] + mi := &file_messages_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2772,7 +2657,7 @@ func (x *RequestIBDRootUTXOSetAndBlockMessage) String() string { func (*RequestIBDRootUTXOSetAndBlockMessage) ProtoMessage() {} func (x *RequestIBDRootUTXOSetAndBlockMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[30] + mi := &file_messages_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2785,7 +2670,7 @@ func (x *RequestIBDRootUTXOSetAndBlockMessage) ProtoReflect() protoreflect.Messa // Deprecated: Use RequestIBDRootUTXOSetAndBlockMessage.ProtoReflect.Descriptor instead. func (*RequestIBDRootUTXOSetAndBlockMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{30} + return file_messages_proto_rawDescGZIP(), []int{28} } func (x *RequestIBDRootUTXOSetAndBlockMessage) GetIbdRoot() *Hash { @@ -2808,7 +2693,7 @@ type IBDRootUTXOSetAndBlockMessage struct { func (x *IBDRootUTXOSetAndBlockMessage) Reset() { *x = IBDRootUTXOSetAndBlockMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[31] + mi := &file_messages_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2821,7 +2706,7 @@ func (x *IBDRootUTXOSetAndBlockMessage) String() string { func (*IBDRootUTXOSetAndBlockMessage) ProtoMessage() {} func (x *IBDRootUTXOSetAndBlockMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[31] + mi := &file_messages_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2834,7 +2719,7 @@ func (x *IBDRootUTXOSetAndBlockMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use IBDRootUTXOSetAndBlockMessage.ProtoReflect.Descriptor instead. func (*IBDRootUTXOSetAndBlockMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{31} + return file_messages_proto_rawDescGZIP(), []int{29} } func (x *IBDRootUTXOSetAndBlockMessage) GetUtxoSet() []byte { @@ -2863,7 +2748,7 @@ type RequestIBDBlocksMessage struct { func (x *RequestIBDBlocksMessage) Reset() { *x = RequestIBDBlocksMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[32] + mi := &file_messages_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2876,7 +2761,7 @@ func (x *RequestIBDBlocksMessage) String() string { func (*RequestIBDBlocksMessage) ProtoMessage() {} func (x *RequestIBDBlocksMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[32] + mi := &file_messages_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2889,7 +2774,7 @@ func (x *RequestIBDBlocksMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestIBDBlocksMessage.ProtoReflect.Descriptor instead. func (*RequestIBDBlocksMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{32} + return file_messages_proto_rawDescGZIP(), []int{30} } func (x *RequestIBDBlocksMessage) GetHashes() []*Hash { @@ -2909,7 +2794,7 @@ type IBDRootNotFoundMessage struct { func (x *IBDRootNotFoundMessage) Reset() { *x = IBDRootNotFoundMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[33] + mi := &file_messages_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2922,7 +2807,7 @@ func (x *IBDRootNotFoundMessage) String() string { func (*IBDRootNotFoundMessage) ProtoMessage() {} func (x *IBDRootNotFoundMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[33] + mi := &file_messages_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2935,7 +2820,7 @@ func (x *IBDRootNotFoundMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use IBDRootNotFoundMessage.ProtoReflect.Descriptor instead. func (*IBDRootNotFoundMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{33} + return file_messages_proto_rawDescGZIP(), []int{31} } type RPCError struct { @@ -2949,7 +2834,7 @@ type RPCError struct { func (x *RPCError) Reset() { *x = RPCError{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[34] + mi := &file_messages_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2962,7 +2847,7 @@ func (x *RPCError) String() string { func (*RPCError) ProtoMessage() {} func (x *RPCError) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[34] + mi := &file_messages_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2975,7 +2860,7 @@ func (x *RPCError) ProtoReflect() protoreflect.Message { // Deprecated: Use RPCError.ProtoReflect.Descriptor instead. func (*RPCError) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{34} + return file_messages_proto_rawDescGZIP(), []int{32} } func (x *RPCError) GetMessage() string { @@ -2994,7 +2879,7 @@ type GetCurrentNetworkRequestMessage struct { func (x *GetCurrentNetworkRequestMessage) Reset() { *x = GetCurrentNetworkRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[35] + mi := &file_messages_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3007,7 +2892,7 @@ func (x *GetCurrentNetworkRequestMessage) String() string { func (*GetCurrentNetworkRequestMessage) ProtoMessage() {} func (x *GetCurrentNetworkRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[35] + mi := &file_messages_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3020,7 +2905,7 @@ func (x *GetCurrentNetworkRequestMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCurrentNetworkRequestMessage.ProtoReflect.Descriptor instead. func (*GetCurrentNetworkRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{35} + return file_messages_proto_rawDescGZIP(), []int{33} } type GetCurrentNetworkResponseMessage struct { @@ -3035,7 +2920,7 @@ type GetCurrentNetworkResponseMessage struct { func (x *GetCurrentNetworkResponseMessage) Reset() { *x = GetCurrentNetworkResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[36] + mi := &file_messages_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3048,7 +2933,7 @@ func (x *GetCurrentNetworkResponseMessage) String() string { func (*GetCurrentNetworkResponseMessage) ProtoMessage() {} func (x *GetCurrentNetworkResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[36] + mi := &file_messages_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3061,7 +2946,7 @@ func (x *GetCurrentNetworkResponseMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCurrentNetworkResponseMessage.ProtoReflect.Descriptor instead. func (*GetCurrentNetworkResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{36} + return file_messages_proto_rawDescGZIP(), []int{34} } func (x *GetCurrentNetworkResponseMessage) GetCurrentNetwork() string { @@ -3089,7 +2974,7 @@ type SubmitBlockRequestMessage struct { func (x *SubmitBlockRequestMessage) Reset() { *x = SubmitBlockRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[37] + mi := &file_messages_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3102,7 +2987,7 @@ func (x *SubmitBlockRequestMessage) String() string { func (*SubmitBlockRequestMessage) ProtoMessage() {} func (x *SubmitBlockRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[37] + mi := &file_messages_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3115,7 +3000,7 @@ func (x *SubmitBlockRequestMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use SubmitBlockRequestMessage.ProtoReflect.Descriptor instead. func (*SubmitBlockRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{37} + return file_messages_proto_rawDescGZIP(), []int{35} } func (x *SubmitBlockRequestMessage) GetBlock() *BlockMessage { @@ -3136,7 +3021,7 @@ type SubmitBlockResponseMessage struct { func (x *SubmitBlockResponseMessage) Reset() { *x = SubmitBlockResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[38] + mi := &file_messages_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3149,7 +3034,7 @@ func (x *SubmitBlockResponseMessage) String() string { func (*SubmitBlockResponseMessage) ProtoMessage() {} func (x *SubmitBlockResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[38] + mi := &file_messages_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3162,7 +3047,7 @@ func (x *SubmitBlockResponseMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use SubmitBlockResponseMessage.ProtoReflect.Descriptor instead. func (*SubmitBlockResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{38} + return file_messages_proto_rawDescGZIP(), []int{36} } func (x *SubmitBlockResponseMessage) GetError() *RPCError { @@ -3183,7 +3068,7 @@ type GetBlockTemplateRequestMessage struct { func (x *GetBlockTemplateRequestMessage) Reset() { *x = GetBlockTemplateRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[39] + mi := &file_messages_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3196,7 +3081,7 @@ func (x *GetBlockTemplateRequestMessage) String() string { func (*GetBlockTemplateRequestMessage) ProtoMessage() {} func (x *GetBlockTemplateRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[39] + mi := &file_messages_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3209,7 +3094,7 @@ func (x *GetBlockTemplateRequestMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBlockTemplateRequestMessage.ProtoReflect.Descriptor instead. func (*GetBlockTemplateRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{39} + return file_messages_proto_rawDescGZIP(), []int{37} } func (x *GetBlockTemplateRequestMessage) GetPayAddress() string { @@ -3231,7 +3116,7 @@ type GetBlockTemplateResponseMessage struct { func (x *GetBlockTemplateResponseMessage) Reset() { *x = GetBlockTemplateResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[40] + mi := &file_messages_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3244,7 +3129,7 @@ func (x *GetBlockTemplateResponseMessage) String() string { func (*GetBlockTemplateResponseMessage) ProtoMessage() {} func (x *GetBlockTemplateResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[40] + mi := &file_messages_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3257,7 +3142,7 @@ func (x *GetBlockTemplateResponseMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBlockTemplateResponseMessage.ProtoReflect.Descriptor instead. func (*GetBlockTemplateResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{40} + return file_messages_proto_rawDescGZIP(), []int{38} } func (x *GetBlockTemplateResponseMessage) GetBlockMessage() *BlockMessage { @@ -3283,7 +3168,7 @@ type NotifyBlockAddedRequestMessage struct { func (x *NotifyBlockAddedRequestMessage) Reset() { *x = NotifyBlockAddedRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[41] + mi := &file_messages_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3296,7 +3181,7 @@ func (x *NotifyBlockAddedRequestMessage) String() string { func (*NotifyBlockAddedRequestMessage) ProtoMessage() {} func (x *NotifyBlockAddedRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[41] + mi := &file_messages_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3309,7 +3194,7 @@ func (x *NotifyBlockAddedRequestMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use NotifyBlockAddedRequestMessage.ProtoReflect.Descriptor instead. func (*NotifyBlockAddedRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{41} + return file_messages_proto_rawDescGZIP(), []int{39} } type NotifyBlockAddedResponseMessage struct { @@ -3323,7 +3208,7 @@ type NotifyBlockAddedResponseMessage struct { func (x *NotifyBlockAddedResponseMessage) Reset() { *x = NotifyBlockAddedResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[42] + mi := &file_messages_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3336,7 +3221,7 @@ func (x *NotifyBlockAddedResponseMessage) String() string { func (*NotifyBlockAddedResponseMessage) ProtoMessage() {} func (x *NotifyBlockAddedResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[42] + mi := &file_messages_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3349,7 +3234,7 @@ func (x *NotifyBlockAddedResponseMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use NotifyBlockAddedResponseMessage.ProtoReflect.Descriptor instead. func (*NotifyBlockAddedResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{42} + return file_messages_proto_rawDescGZIP(), []int{40} } func (x *NotifyBlockAddedResponseMessage) GetError() *RPCError { @@ -3370,7 +3255,7 @@ type BlockAddedNotificationMessage struct { func (x *BlockAddedNotificationMessage) Reset() { *x = BlockAddedNotificationMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[43] + mi := &file_messages_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3383,7 +3268,7 @@ func (x *BlockAddedNotificationMessage) String() string { func (*BlockAddedNotificationMessage) ProtoMessage() {} func (x *BlockAddedNotificationMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[43] + mi := &file_messages_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3396,7 +3281,7 @@ func (x *BlockAddedNotificationMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use BlockAddedNotificationMessage.ProtoReflect.Descriptor instead. func (*BlockAddedNotificationMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{43} + return file_messages_proto_rawDescGZIP(), []int{41} } func (x *BlockAddedNotificationMessage) GetBlock() *BlockMessage { @@ -3415,7 +3300,7 @@ type GetPeerAddressesRequestMessage struct { func (x *GetPeerAddressesRequestMessage) Reset() { *x = GetPeerAddressesRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[44] + mi := &file_messages_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3428,7 +3313,7 @@ func (x *GetPeerAddressesRequestMessage) String() string { func (*GetPeerAddressesRequestMessage) ProtoMessage() {} func (x *GetPeerAddressesRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[44] + mi := &file_messages_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3441,7 +3326,7 @@ func (x *GetPeerAddressesRequestMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPeerAddressesRequestMessage.ProtoReflect.Descriptor instead. func (*GetPeerAddressesRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{44} + return file_messages_proto_rawDescGZIP(), []int{42} } type GetPeerAddressesResponseMessage struct { @@ -3457,7 +3342,7 @@ type GetPeerAddressesResponseMessage struct { func (x *GetPeerAddressesResponseMessage) Reset() { *x = GetPeerAddressesResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[45] + mi := &file_messages_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3470,7 +3355,7 @@ func (x *GetPeerAddressesResponseMessage) String() string { func (*GetPeerAddressesResponseMessage) ProtoMessage() {} func (x *GetPeerAddressesResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[45] + mi := &file_messages_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3483,7 +3368,7 @@ func (x *GetPeerAddressesResponseMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPeerAddressesResponseMessage.ProtoReflect.Descriptor instead. func (*GetPeerAddressesResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{45} + return file_messages_proto_rawDescGZIP(), []int{43} } func (x *GetPeerAddressesResponseMessage) GetAddresses() []*GetPeerAddressesKnownAddressMessage { @@ -3518,7 +3403,7 @@ type GetPeerAddressesKnownAddressMessage struct { func (x *GetPeerAddressesKnownAddressMessage) Reset() { *x = GetPeerAddressesKnownAddressMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[46] + mi := &file_messages_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3531,7 +3416,7 @@ func (x *GetPeerAddressesKnownAddressMessage) String() string { func (*GetPeerAddressesKnownAddressMessage) ProtoMessage() {} func (x *GetPeerAddressesKnownAddressMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[46] + mi := &file_messages_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3544,7 +3429,7 @@ func (x *GetPeerAddressesKnownAddressMessage) ProtoReflect() protoreflect.Messag // Deprecated: Use GetPeerAddressesKnownAddressMessage.ProtoReflect.Descriptor instead. func (*GetPeerAddressesKnownAddressMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{46} + return file_messages_proto_rawDescGZIP(), []int{44} } func (x *GetPeerAddressesKnownAddressMessage) GetAddr() string { @@ -3563,7 +3448,7 @@ type GetSelectedTipHashRequestMessage struct { func (x *GetSelectedTipHashRequestMessage) Reset() { *x = GetSelectedTipHashRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[47] + mi := &file_messages_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3576,7 +3461,7 @@ func (x *GetSelectedTipHashRequestMessage) String() string { func (*GetSelectedTipHashRequestMessage) ProtoMessage() {} func (x *GetSelectedTipHashRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[47] + mi := &file_messages_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3589,7 +3474,7 @@ func (x *GetSelectedTipHashRequestMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSelectedTipHashRequestMessage.ProtoReflect.Descriptor instead. func (*GetSelectedTipHashRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{47} + return file_messages_proto_rawDescGZIP(), []int{45} } type GetSelectedTipHashResponseMessage struct { @@ -3604,7 +3489,7 @@ type GetSelectedTipHashResponseMessage struct { func (x *GetSelectedTipHashResponseMessage) Reset() { *x = GetSelectedTipHashResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[48] + mi := &file_messages_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3617,7 +3502,7 @@ func (x *GetSelectedTipHashResponseMessage) String() string { func (*GetSelectedTipHashResponseMessage) ProtoMessage() {} func (x *GetSelectedTipHashResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[48] + mi := &file_messages_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3630,7 +3515,7 @@ func (x *GetSelectedTipHashResponseMessage) ProtoReflect() protoreflect.Message // Deprecated: Use GetSelectedTipHashResponseMessage.ProtoReflect.Descriptor instead. func (*GetSelectedTipHashResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{48} + return file_messages_proto_rawDescGZIP(), []int{46} } func (x *GetSelectedTipHashResponseMessage) GetSelectedTipHash() string { @@ -3660,7 +3545,7 @@ type MempoolEntry struct { func (x *MempoolEntry) Reset() { *x = MempoolEntry{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[49] + mi := &file_messages_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3673,7 +3558,7 @@ func (x *MempoolEntry) String() string { func (*MempoolEntry) ProtoMessage() {} func (x *MempoolEntry) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[49] + mi := &file_messages_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3686,7 +3571,7 @@ func (x *MempoolEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use MempoolEntry.ProtoReflect.Descriptor instead. func (*MempoolEntry) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{49} + return file_messages_proto_rawDescGZIP(), []int{47} } func (x *MempoolEntry) GetFee() uint64 { @@ -3714,7 +3599,7 @@ type GetMempoolEntryRequestMessage struct { func (x *GetMempoolEntryRequestMessage) Reset() { *x = GetMempoolEntryRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[50] + mi := &file_messages_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3727,7 +3612,7 @@ func (x *GetMempoolEntryRequestMessage) String() string { func (*GetMempoolEntryRequestMessage) ProtoMessage() {} func (x *GetMempoolEntryRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[50] + mi := &file_messages_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3740,7 +3625,7 @@ func (x *GetMempoolEntryRequestMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMempoolEntryRequestMessage.ProtoReflect.Descriptor instead. func (*GetMempoolEntryRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{50} + return file_messages_proto_rawDescGZIP(), []int{48} } func (x *GetMempoolEntryRequestMessage) GetTxId() string { @@ -3762,7 +3647,7 @@ type GetMempoolEntryResponseMessage struct { func (x *GetMempoolEntryResponseMessage) Reset() { *x = GetMempoolEntryResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[51] + mi := &file_messages_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3775,7 +3660,7 @@ func (x *GetMempoolEntryResponseMessage) String() string { func (*GetMempoolEntryResponseMessage) ProtoMessage() {} func (x *GetMempoolEntryResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[51] + mi := &file_messages_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3788,7 +3673,7 @@ func (x *GetMempoolEntryResponseMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMempoolEntryResponseMessage.ProtoReflect.Descriptor instead. func (*GetMempoolEntryResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{51} + return file_messages_proto_rawDescGZIP(), []int{49} } func (x *GetMempoolEntryResponseMessage) GetEntry() *MempoolEntry { @@ -3814,7 +3699,7 @@ type GetMempoolEntriesRequestMessage struct { func (x *GetMempoolEntriesRequestMessage) Reset() { *x = GetMempoolEntriesRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[52] + mi := &file_messages_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3827,7 +3712,7 @@ func (x *GetMempoolEntriesRequestMessage) String() string { func (*GetMempoolEntriesRequestMessage) ProtoMessage() {} func (x *GetMempoolEntriesRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[52] + mi := &file_messages_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3840,7 +3725,7 @@ func (x *GetMempoolEntriesRequestMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMempoolEntriesRequestMessage.ProtoReflect.Descriptor instead. func (*GetMempoolEntriesRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{52} + return file_messages_proto_rawDescGZIP(), []int{50} } type GetMempoolEntriesResponseMessage struct { @@ -3855,7 +3740,7 @@ type GetMempoolEntriesResponseMessage struct { func (x *GetMempoolEntriesResponseMessage) Reset() { *x = GetMempoolEntriesResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[53] + mi := &file_messages_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3868,7 +3753,7 @@ func (x *GetMempoolEntriesResponseMessage) String() string { func (*GetMempoolEntriesResponseMessage) ProtoMessage() {} func (x *GetMempoolEntriesResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[53] + mi := &file_messages_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3881,7 +3766,7 @@ func (x *GetMempoolEntriesResponseMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMempoolEntriesResponseMessage.ProtoReflect.Descriptor instead. func (*GetMempoolEntriesResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{53} + return file_messages_proto_rawDescGZIP(), []int{51} } func (x *GetMempoolEntriesResponseMessage) GetEntries() []*MempoolEntry { @@ -3907,7 +3792,7 @@ type GetConnectedPeerInfoRequestMessage struct { func (x *GetConnectedPeerInfoRequestMessage) Reset() { *x = GetConnectedPeerInfoRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[54] + mi := &file_messages_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3920,7 +3805,7 @@ func (x *GetConnectedPeerInfoRequestMessage) String() string { func (*GetConnectedPeerInfoRequestMessage) ProtoMessage() {} func (x *GetConnectedPeerInfoRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[54] + mi := &file_messages_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3933,7 +3818,7 @@ func (x *GetConnectedPeerInfoRequestMessage) ProtoReflect() protoreflect.Message // Deprecated: Use GetConnectedPeerInfoRequestMessage.ProtoReflect.Descriptor instead. func (*GetConnectedPeerInfoRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{54} + return file_messages_proto_rawDescGZIP(), []int{52} } type GetConnectedPeerInfoResponseMessage struct { @@ -3948,7 +3833,7 @@ type GetConnectedPeerInfoResponseMessage struct { func (x *GetConnectedPeerInfoResponseMessage) Reset() { *x = GetConnectedPeerInfoResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[55] + mi := &file_messages_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3961,7 +3846,7 @@ func (x *GetConnectedPeerInfoResponseMessage) String() string { func (*GetConnectedPeerInfoResponseMessage) ProtoMessage() {} func (x *GetConnectedPeerInfoResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[55] + mi := &file_messages_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3974,7 +3859,7 @@ func (x *GetConnectedPeerInfoResponseMessage) ProtoReflect() protoreflect.Messag // Deprecated: Use GetConnectedPeerInfoResponseMessage.ProtoReflect.Descriptor instead. func (*GetConnectedPeerInfoResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{55} + return file_messages_proto_rawDescGZIP(), []int{53} } func (x *GetConnectedPeerInfoResponseMessage) GetInfos() []*GetConnectedPeerInfoMessage { @@ -3999,8 +3884,6 @@ type GetConnectedPeerInfoMessage struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` LastPingDuration int64 `protobuf:"varint,3,opt,name=lastPingDuration,proto3" json:"lastPingDuration,omitempty"` - SelectedTipHash string `protobuf:"bytes,4,opt,name=selectedTipHash,proto3" json:"selectedTipHash,omitempty"` - IsSyncNode bool `protobuf:"varint,5,opt,name=isSyncNode,proto3" json:"isSyncNode,omitempty"` IsOutbound bool `protobuf:"varint,6,opt,name=isOutbound,proto3" json:"isOutbound,omitempty"` TimeOffset int64 `protobuf:"varint,7,opt,name=timeOffset,proto3" json:"timeOffset,omitempty"` UserAgent string `protobuf:"bytes,8,opt,name=userAgent,proto3" json:"userAgent,omitempty"` @@ -4011,7 +3894,7 @@ type GetConnectedPeerInfoMessage struct { func (x *GetConnectedPeerInfoMessage) Reset() { *x = GetConnectedPeerInfoMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[56] + mi := &file_messages_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4024,7 +3907,7 @@ func (x *GetConnectedPeerInfoMessage) String() string { func (*GetConnectedPeerInfoMessage) ProtoMessage() {} func (x *GetConnectedPeerInfoMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[56] + mi := &file_messages_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4037,7 +3920,7 @@ func (x *GetConnectedPeerInfoMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetConnectedPeerInfoMessage.ProtoReflect.Descriptor instead. func (*GetConnectedPeerInfoMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{56} + return file_messages_proto_rawDescGZIP(), []int{54} } func (x *GetConnectedPeerInfoMessage) GetId() string { @@ -4061,20 +3944,6 @@ func (x *GetConnectedPeerInfoMessage) GetLastPingDuration() int64 { return 0 } -func (x *GetConnectedPeerInfoMessage) GetSelectedTipHash() string { - if x != nil { - return x.SelectedTipHash - } - return "" -} - -func (x *GetConnectedPeerInfoMessage) GetIsSyncNode() bool { - if x != nil { - return x.IsSyncNode - } - return false -} - func (x *GetConnectedPeerInfoMessage) GetIsOutbound() bool { if x != nil { return x.IsOutbound @@ -4122,7 +3991,7 @@ type AddPeerRequestMessage struct { func (x *AddPeerRequestMessage) Reset() { *x = AddPeerRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[57] + mi := &file_messages_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4135,7 +4004,7 @@ func (x *AddPeerRequestMessage) String() string { func (*AddPeerRequestMessage) ProtoMessage() {} func (x *AddPeerRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[57] + mi := &file_messages_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4148,7 +4017,7 @@ func (x *AddPeerRequestMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use AddPeerRequestMessage.ProtoReflect.Descriptor instead. func (*AddPeerRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{57} + return file_messages_proto_rawDescGZIP(), []int{55} } func (x *AddPeerRequestMessage) GetAddress() string { @@ -4176,7 +4045,7 @@ type AddPeerResponseMessage struct { func (x *AddPeerResponseMessage) Reset() { *x = AddPeerResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[58] + mi := &file_messages_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4189,7 +4058,7 @@ func (x *AddPeerResponseMessage) String() string { func (*AddPeerResponseMessage) ProtoMessage() {} func (x *AddPeerResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[58] + mi := &file_messages_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4202,7 +4071,7 @@ func (x *AddPeerResponseMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use AddPeerResponseMessage.ProtoReflect.Descriptor instead. func (*AddPeerResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{58} + return file_messages_proto_rawDescGZIP(), []int{56} } func (x *AddPeerResponseMessage) GetError() *RPCError { @@ -4223,7 +4092,7 @@ type SubmitTransactionRequestMessage struct { func (x *SubmitTransactionRequestMessage) Reset() { *x = SubmitTransactionRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[59] + mi := &file_messages_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4236,7 +4105,7 @@ func (x *SubmitTransactionRequestMessage) String() string { func (*SubmitTransactionRequestMessage) ProtoMessage() {} func (x *SubmitTransactionRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[59] + mi := &file_messages_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4249,7 +4118,7 @@ func (x *SubmitTransactionRequestMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use SubmitTransactionRequestMessage.ProtoReflect.Descriptor instead. func (*SubmitTransactionRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{59} + return file_messages_proto_rawDescGZIP(), []int{57} } func (x *SubmitTransactionRequestMessage) GetTransaction() *TransactionMessage { @@ -4271,7 +4140,7 @@ type SubmitTransactionResponseMessage struct { func (x *SubmitTransactionResponseMessage) Reset() { *x = SubmitTransactionResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[60] + mi := &file_messages_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4284,7 +4153,7 @@ func (x *SubmitTransactionResponseMessage) String() string { func (*SubmitTransactionResponseMessage) ProtoMessage() {} func (x *SubmitTransactionResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[60] + mi := &file_messages_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4297,7 +4166,7 @@ func (x *SubmitTransactionResponseMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use SubmitTransactionResponseMessage.ProtoReflect.Descriptor instead. func (*SubmitTransactionResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{60} + return file_messages_proto_rawDescGZIP(), []int{58} } func (x *SubmitTransactionResponseMessage) GetTxId() string { @@ -4323,7 +4192,7 @@ type NotifyChainChangedRequestMessage struct { func (x *NotifyChainChangedRequestMessage) Reset() { *x = NotifyChainChangedRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[61] + mi := &file_messages_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4336,7 +4205,7 @@ func (x *NotifyChainChangedRequestMessage) String() string { func (*NotifyChainChangedRequestMessage) ProtoMessage() {} func (x *NotifyChainChangedRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[61] + mi := &file_messages_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4349,7 +4218,7 @@ func (x *NotifyChainChangedRequestMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use NotifyChainChangedRequestMessage.ProtoReflect.Descriptor instead. func (*NotifyChainChangedRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{61} + return file_messages_proto_rawDescGZIP(), []int{59} } type NotifyChainChangedResponseMessage struct { @@ -4363,7 +4232,7 @@ type NotifyChainChangedResponseMessage struct { func (x *NotifyChainChangedResponseMessage) Reset() { *x = NotifyChainChangedResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[62] + mi := &file_messages_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4376,7 +4245,7 @@ func (x *NotifyChainChangedResponseMessage) String() string { func (*NotifyChainChangedResponseMessage) ProtoMessage() {} func (x *NotifyChainChangedResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[62] + mi := &file_messages_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4389,7 +4258,7 @@ func (x *NotifyChainChangedResponseMessage) ProtoReflect() protoreflect.Message // Deprecated: Use NotifyChainChangedResponseMessage.ProtoReflect.Descriptor instead. func (*NotifyChainChangedResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{62} + return file_messages_proto_rawDescGZIP(), []int{60} } func (x *NotifyChainChangedResponseMessage) GetError() *RPCError { @@ -4411,7 +4280,7 @@ type ChainChangedNotificationMessage struct { func (x *ChainChangedNotificationMessage) Reset() { *x = ChainChangedNotificationMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[63] + mi := &file_messages_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4424,7 +4293,7 @@ func (x *ChainChangedNotificationMessage) String() string { func (*ChainChangedNotificationMessage) ProtoMessage() {} func (x *ChainChangedNotificationMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[63] + mi := &file_messages_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4437,7 +4306,7 @@ func (x *ChainChangedNotificationMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use ChainChangedNotificationMessage.ProtoReflect.Descriptor instead. func (*ChainChangedNotificationMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{63} + return file_messages_proto_rawDescGZIP(), []int{61} } func (x *ChainChangedNotificationMessage) GetRemovedChainBlockHashes() []string { @@ -4466,7 +4335,7 @@ type ChainBlock struct { func (x *ChainBlock) Reset() { *x = ChainBlock{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[64] + mi := &file_messages_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4479,7 +4348,7 @@ func (x *ChainBlock) String() string { func (*ChainBlock) ProtoMessage() {} func (x *ChainBlock) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[64] + mi := &file_messages_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4492,7 +4361,7 @@ func (x *ChainBlock) ProtoReflect() protoreflect.Message { // Deprecated: Use ChainBlock.ProtoReflect.Descriptor instead. func (*ChainBlock) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{64} + return file_messages_proto_rawDescGZIP(), []int{62} } func (x *ChainBlock) GetHash() string { @@ -4521,7 +4390,7 @@ type AcceptedBlock struct { func (x *AcceptedBlock) Reset() { *x = AcceptedBlock{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[65] + mi := &file_messages_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4534,7 +4403,7 @@ func (x *AcceptedBlock) String() string { func (*AcceptedBlock) ProtoMessage() {} func (x *AcceptedBlock) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[65] + mi := &file_messages_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4547,7 +4416,7 @@ func (x *AcceptedBlock) ProtoReflect() protoreflect.Message { // Deprecated: Use AcceptedBlock.ProtoReflect.Descriptor instead. func (*AcceptedBlock) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{65} + return file_messages_proto_rawDescGZIP(), []int{63} } func (x *AcceptedBlock) GetHash() string { @@ -4577,7 +4446,7 @@ type GetBlockRequestMessage struct { func (x *GetBlockRequestMessage) Reset() { *x = GetBlockRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[66] + mi := &file_messages_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4590,7 +4459,7 @@ func (x *GetBlockRequestMessage) String() string { func (*GetBlockRequestMessage) ProtoMessage() {} func (x *GetBlockRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[66] + mi := &file_messages_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4603,7 +4472,7 @@ func (x *GetBlockRequestMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBlockRequestMessage.ProtoReflect.Descriptor instead. func (*GetBlockRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{66} + return file_messages_proto_rawDescGZIP(), []int{64} } func (x *GetBlockRequestMessage) GetHash() string { @@ -4640,7 +4509,7 @@ type GetBlockResponseMessage struct { func (x *GetBlockResponseMessage) Reset() { *x = GetBlockResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[67] + mi := &file_messages_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4653,7 +4522,7 @@ func (x *GetBlockResponseMessage) String() string { func (*GetBlockResponseMessage) ProtoMessage() {} func (x *GetBlockResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[67] + mi := &file_messages_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4666,7 +4535,7 @@ func (x *GetBlockResponseMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBlockResponseMessage.ProtoReflect.Descriptor instead. func (*GetBlockResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{67} + return file_messages_proto_rawDescGZIP(), []int{65} } func (x *GetBlockResponseMessage) GetBlockHash() string { @@ -4714,7 +4583,7 @@ type BlockVerboseData struct { func (x *BlockVerboseData) Reset() { *x = BlockVerboseData{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[68] + mi := &file_messages_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4727,7 +4596,7 @@ func (x *BlockVerboseData) String() string { func (*BlockVerboseData) ProtoMessage() {} func (x *BlockVerboseData) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[68] + mi := &file_messages_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4740,7 +4609,7 @@ func (x *BlockVerboseData) ProtoReflect() protoreflect.Message { // Deprecated: Use BlockVerboseData.ProtoReflect.Descriptor instead. func (*BlockVerboseData) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{68} + return file_messages_proto_rawDescGZIP(), []int{66} } func (x *BlockVerboseData) GetHash() string { @@ -4865,7 +4734,7 @@ type TransactionVerboseData struct { func (x *TransactionVerboseData) Reset() { *x = TransactionVerboseData{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[69] + mi := &file_messages_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4878,7 +4747,7 @@ func (x *TransactionVerboseData) String() string { func (*TransactionVerboseData) ProtoMessage() {} func (x *TransactionVerboseData) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[69] + mi := &file_messages_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4891,7 +4760,7 @@ func (x *TransactionVerboseData) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionVerboseData.ProtoReflect.Descriptor instead. func (*TransactionVerboseData) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{69} + return file_messages_proto_rawDescGZIP(), []int{67} } func (x *TransactionVerboseData) GetTxId() string { @@ -5006,7 +4875,7 @@ type TransactionVerboseInput struct { func (x *TransactionVerboseInput) Reset() { *x = TransactionVerboseInput{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[70] + mi := &file_messages_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5019,7 +4888,7 @@ func (x *TransactionVerboseInput) String() string { func (*TransactionVerboseInput) ProtoMessage() {} func (x *TransactionVerboseInput) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[70] + mi := &file_messages_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5032,7 +4901,7 @@ func (x *TransactionVerboseInput) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionVerboseInput.ProtoReflect.Descriptor instead. func (*TransactionVerboseInput) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{70} + return file_messages_proto_rawDescGZIP(), []int{68} } func (x *TransactionVerboseInput) GetTxId() string { @@ -5075,7 +4944,7 @@ type ScriptSig struct { func (x *ScriptSig) Reset() { *x = ScriptSig{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[71] + mi := &file_messages_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5088,7 +4957,7 @@ func (x *ScriptSig) String() string { func (*ScriptSig) ProtoMessage() {} func (x *ScriptSig) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[71] + mi := &file_messages_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5101,7 +4970,7 @@ func (x *ScriptSig) ProtoReflect() protoreflect.Message { // Deprecated: Use ScriptSig.ProtoReflect.Descriptor instead. func (*ScriptSig) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{71} + return file_messages_proto_rawDescGZIP(), []int{69} } func (x *ScriptSig) GetAsm() string { @@ -5131,7 +5000,7 @@ type TransactionVerboseOutput struct { func (x *TransactionVerboseOutput) Reset() { *x = TransactionVerboseOutput{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[72] + mi := &file_messages_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5144,7 +5013,7 @@ func (x *TransactionVerboseOutput) String() string { func (*TransactionVerboseOutput) ProtoMessage() {} func (x *TransactionVerboseOutput) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[72] + mi := &file_messages_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5157,7 +5026,7 @@ func (x *TransactionVerboseOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionVerboseOutput.ProtoReflect.Descriptor instead. func (*TransactionVerboseOutput) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{72} + return file_messages_proto_rawDescGZIP(), []int{70} } func (x *TransactionVerboseOutput) GetValue() uint64 { @@ -5195,7 +5064,7 @@ type ScriptPubKeyResult struct { func (x *ScriptPubKeyResult) Reset() { *x = ScriptPubKeyResult{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[73] + mi := &file_messages_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5208,7 +5077,7 @@ func (x *ScriptPubKeyResult) String() string { func (*ScriptPubKeyResult) ProtoMessage() {} func (x *ScriptPubKeyResult) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[73] + mi := &file_messages_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5221,7 +5090,7 @@ func (x *ScriptPubKeyResult) ProtoReflect() protoreflect.Message { // Deprecated: Use ScriptPubKeyResult.ProtoReflect.Descriptor instead. func (*ScriptPubKeyResult) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{73} + return file_messages_proto_rawDescGZIP(), []int{71} } func (x *ScriptPubKeyResult) GetAsm() string { @@ -5263,7 +5132,7 @@ type GetSubnetworkRequestMessage struct { func (x *GetSubnetworkRequestMessage) Reset() { *x = GetSubnetworkRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[74] + mi := &file_messages_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5276,7 +5145,7 @@ func (x *GetSubnetworkRequestMessage) String() string { func (*GetSubnetworkRequestMessage) ProtoMessage() {} func (x *GetSubnetworkRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[74] + mi := &file_messages_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5289,7 +5158,7 @@ func (x *GetSubnetworkRequestMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSubnetworkRequestMessage.ProtoReflect.Descriptor instead. func (*GetSubnetworkRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{74} + return file_messages_proto_rawDescGZIP(), []int{72} } func (x *GetSubnetworkRequestMessage) GetSubnetworkId() string { @@ -5311,7 +5180,7 @@ type GetSubnetworkResponseMessage struct { func (x *GetSubnetworkResponseMessage) Reset() { *x = GetSubnetworkResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[75] + mi := &file_messages_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5324,7 +5193,7 @@ func (x *GetSubnetworkResponseMessage) String() string { func (*GetSubnetworkResponseMessage) ProtoMessage() {} func (x *GetSubnetworkResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[75] + mi := &file_messages_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5337,7 +5206,7 @@ func (x *GetSubnetworkResponseMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSubnetworkResponseMessage.ProtoReflect.Descriptor instead. func (*GetSubnetworkResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{75} + return file_messages_proto_rawDescGZIP(), []int{73} } func (x *GetSubnetworkResponseMessage) GetGasLimit() uint64 { @@ -5366,7 +5235,7 @@ type GetChainFromBlockRequestMessage struct { func (x *GetChainFromBlockRequestMessage) Reset() { *x = GetChainFromBlockRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[76] + mi := &file_messages_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5379,7 +5248,7 @@ func (x *GetChainFromBlockRequestMessage) String() string { func (*GetChainFromBlockRequestMessage) ProtoMessage() {} func (x *GetChainFromBlockRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[76] + mi := &file_messages_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5392,7 +5261,7 @@ func (x *GetChainFromBlockRequestMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetChainFromBlockRequestMessage.ProtoReflect.Descriptor instead. func (*GetChainFromBlockRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{76} + return file_messages_proto_rawDescGZIP(), []int{74} } func (x *GetChainFromBlockRequestMessage) GetStartHash() string { @@ -5423,7 +5292,7 @@ type GetChainFromBlockResponseMessage struct { func (x *GetChainFromBlockResponseMessage) Reset() { *x = GetChainFromBlockResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[77] + mi := &file_messages_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5436,7 +5305,7 @@ func (x *GetChainFromBlockResponseMessage) String() string { func (*GetChainFromBlockResponseMessage) ProtoMessage() {} func (x *GetChainFromBlockResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[77] + mi := &file_messages_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5449,7 +5318,7 @@ func (x *GetChainFromBlockResponseMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetChainFromBlockResponseMessage.ProtoReflect.Descriptor instead. func (*GetChainFromBlockResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{77} + return file_messages_proto_rawDescGZIP(), []int{75} } func (x *GetChainFromBlockResponseMessage) GetRemovedChainBlockHashes() []string { @@ -5494,7 +5363,7 @@ type GetBlocksRequestMessage struct { func (x *GetBlocksRequestMessage) Reset() { *x = GetBlocksRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[78] + mi := &file_messages_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5507,7 +5376,7 @@ func (x *GetBlocksRequestMessage) String() string { func (*GetBlocksRequestMessage) ProtoMessage() {} func (x *GetBlocksRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[78] + mi := &file_messages_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5520,7 +5389,7 @@ func (x *GetBlocksRequestMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBlocksRequestMessage.ProtoReflect.Descriptor instead. func (*GetBlocksRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{78} + return file_messages_proto_rawDescGZIP(), []int{76} } func (x *GetBlocksRequestMessage) GetLowHash() string { @@ -5565,7 +5434,7 @@ type GetBlocksResponseMessage struct { func (x *GetBlocksResponseMessage) Reset() { *x = GetBlocksResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[79] + mi := &file_messages_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5578,7 +5447,7 @@ func (x *GetBlocksResponseMessage) String() string { func (*GetBlocksResponseMessage) ProtoMessage() {} func (x *GetBlocksResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[79] + mi := &file_messages_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5591,7 +5460,7 @@ func (x *GetBlocksResponseMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBlocksResponseMessage.ProtoReflect.Descriptor instead. func (*GetBlocksResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{79} + return file_messages_proto_rawDescGZIP(), []int{77} } func (x *GetBlocksResponseMessage) GetBlockHashes() []string { @@ -5631,7 +5500,7 @@ type GetBlockCountRequestMessage struct { func (x *GetBlockCountRequestMessage) Reset() { *x = GetBlockCountRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[80] + mi := &file_messages_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5644,7 +5513,7 @@ func (x *GetBlockCountRequestMessage) String() string { func (*GetBlockCountRequestMessage) ProtoMessage() {} func (x *GetBlockCountRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[80] + mi := &file_messages_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5657,7 +5526,7 @@ func (x *GetBlockCountRequestMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBlockCountRequestMessage.ProtoReflect.Descriptor instead. func (*GetBlockCountRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{80} + return file_messages_proto_rawDescGZIP(), []int{78} } type GetBlockCountResponseMessage struct { @@ -5672,7 +5541,7 @@ type GetBlockCountResponseMessage struct { func (x *GetBlockCountResponseMessage) Reset() { *x = GetBlockCountResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[81] + mi := &file_messages_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5685,7 +5554,7 @@ func (x *GetBlockCountResponseMessage) String() string { func (*GetBlockCountResponseMessage) ProtoMessage() {} func (x *GetBlockCountResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[81] + mi := &file_messages_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5698,7 +5567,7 @@ func (x *GetBlockCountResponseMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBlockCountResponseMessage.ProtoReflect.Descriptor instead. func (*GetBlockCountResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{81} + return file_messages_proto_rawDescGZIP(), []int{79} } func (x *GetBlockCountResponseMessage) GetBlockCount() uint64 { @@ -5724,7 +5593,7 @@ type GetBlockDagInfoRequestMessage struct { func (x *GetBlockDagInfoRequestMessage) Reset() { *x = GetBlockDagInfoRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[82] + mi := &file_messages_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5737,7 +5606,7 @@ func (x *GetBlockDagInfoRequestMessage) String() string { func (*GetBlockDagInfoRequestMessage) ProtoMessage() {} func (x *GetBlockDagInfoRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[82] + mi := &file_messages_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5750,7 +5619,7 @@ func (x *GetBlockDagInfoRequestMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBlockDagInfoRequestMessage.ProtoReflect.Descriptor instead. func (*GetBlockDagInfoRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{82} + return file_messages_proto_rawDescGZIP(), []int{80} } type GetBlockDagInfoResponseMessage struct { @@ -5770,7 +5639,7 @@ type GetBlockDagInfoResponseMessage struct { func (x *GetBlockDagInfoResponseMessage) Reset() { *x = GetBlockDagInfoResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[83] + mi := &file_messages_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5783,7 +5652,7 @@ func (x *GetBlockDagInfoResponseMessage) String() string { func (*GetBlockDagInfoResponseMessage) ProtoMessage() {} func (x *GetBlockDagInfoResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[83] + mi := &file_messages_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5796,7 +5665,7 @@ func (x *GetBlockDagInfoResponseMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBlockDagInfoResponseMessage.ProtoReflect.Descriptor instead. func (*GetBlockDagInfoResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{83} + return file_messages_proto_rawDescGZIP(), []int{81} } func (x *GetBlockDagInfoResponseMessage) GetNetworkName() string { @@ -5859,7 +5728,7 @@ type ResolveFinalityConflictRequestMessage struct { func (x *ResolveFinalityConflictRequestMessage) Reset() { *x = ResolveFinalityConflictRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[84] + mi := &file_messages_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5872,7 +5741,7 @@ func (x *ResolveFinalityConflictRequestMessage) String() string { func (*ResolveFinalityConflictRequestMessage) ProtoMessage() {} func (x *ResolveFinalityConflictRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[84] + mi := &file_messages_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5885,7 +5754,7 @@ func (x *ResolveFinalityConflictRequestMessage) ProtoReflect() protoreflect.Mess // Deprecated: Use ResolveFinalityConflictRequestMessage.ProtoReflect.Descriptor instead. func (*ResolveFinalityConflictRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{84} + return file_messages_proto_rawDescGZIP(), []int{82} } func (x *ResolveFinalityConflictRequestMessage) GetFinalityBlockHash() string { @@ -5906,7 +5775,7 @@ type ResolveFinalityConflictResponseMessage struct { func (x *ResolveFinalityConflictResponseMessage) Reset() { *x = ResolveFinalityConflictResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[85] + mi := &file_messages_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5919,7 +5788,7 @@ func (x *ResolveFinalityConflictResponseMessage) String() string { func (*ResolveFinalityConflictResponseMessage) ProtoMessage() {} func (x *ResolveFinalityConflictResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[85] + mi := &file_messages_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5932,7 +5801,7 @@ func (x *ResolveFinalityConflictResponseMessage) ProtoReflect() protoreflect.Mes // Deprecated: Use ResolveFinalityConflictResponseMessage.ProtoReflect.Descriptor instead. func (*ResolveFinalityConflictResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{85} + return file_messages_proto_rawDescGZIP(), []int{83} } func (x *ResolveFinalityConflictResponseMessage) GetError() *RPCError { @@ -5951,7 +5820,7 @@ type NotifyFinalityConflictsRequestMessage struct { func (x *NotifyFinalityConflictsRequestMessage) Reset() { *x = NotifyFinalityConflictsRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[86] + mi := &file_messages_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5964,7 +5833,7 @@ func (x *NotifyFinalityConflictsRequestMessage) String() string { func (*NotifyFinalityConflictsRequestMessage) ProtoMessage() {} func (x *NotifyFinalityConflictsRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[86] + mi := &file_messages_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5977,7 +5846,7 @@ func (x *NotifyFinalityConflictsRequestMessage) ProtoReflect() protoreflect.Mess // Deprecated: Use NotifyFinalityConflictsRequestMessage.ProtoReflect.Descriptor instead. func (*NotifyFinalityConflictsRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{86} + return file_messages_proto_rawDescGZIP(), []int{84} } type NotifyFinalityConflictsResponseMessage struct { @@ -5991,7 +5860,7 @@ type NotifyFinalityConflictsResponseMessage struct { func (x *NotifyFinalityConflictsResponseMessage) Reset() { *x = NotifyFinalityConflictsResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[87] + mi := &file_messages_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6004,7 +5873,7 @@ func (x *NotifyFinalityConflictsResponseMessage) String() string { func (*NotifyFinalityConflictsResponseMessage) ProtoMessage() {} func (x *NotifyFinalityConflictsResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[87] + mi := &file_messages_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6017,7 +5886,7 @@ func (x *NotifyFinalityConflictsResponseMessage) ProtoReflect() protoreflect.Mes // Deprecated: Use NotifyFinalityConflictsResponseMessage.ProtoReflect.Descriptor instead. func (*NotifyFinalityConflictsResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{87} + return file_messages_proto_rawDescGZIP(), []int{85} } func (x *NotifyFinalityConflictsResponseMessage) GetError() *RPCError { @@ -6038,7 +5907,7 @@ type FinalityConflictNotificationMessage struct { func (x *FinalityConflictNotificationMessage) Reset() { *x = FinalityConflictNotificationMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[88] + mi := &file_messages_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6051,7 +5920,7 @@ func (x *FinalityConflictNotificationMessage) String() string { func (*FinalityConflictNotificationMessage) ProtoMessage() {} func (x *FinalityConflictNotificationMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[88] + mi := &file_messages_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6064,7 +5933,7 @@ func (x *FinalityConflictNotificationMessage) ProtoReflect() protoreflect.Messag // Deprecated: Use FinalityConflictNotificationMessage.ProtoReflect.Descriptor instead. func (*FinalityConflictNotificationMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{88} + return file_messages_proto_rawDescGZIP(), []int{86} } func (x *FinalityConflictNotificationMessage) GetViolatingBlockHash() string { @@ -6085,7 +5954,7 @@ type FinalityConflictResolvedNotificationMessage struct { func (x *FinalityConflictResolvedNotificationMessage) Reset() { *x = FinalityConflictResolvedNotificationMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[89] + mi := &file_messages_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6098,7 +5967,7 @@ func (x *FinalityConflictResolvedNotificationMessage) String() string { func (*FinalityConflictResolvedNotificationMessage) ProtoMessage() {} func (x *FinalityConflictResolvedNotificationMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[89] + mi := &file_messages_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6111,7 +5980,7 @@ func (x *FinalityConflictResolvedNotificationMessage) ProtoReflect() protoreflec // Deprecated: Use FinalityConflictResolvedNotificationMessage.ProtoReflect.Descriptor instead. func (*FinalityConflictResolvedNotificationMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{89} + return file_messages_proto_rawDescGZIP(), []int{87} } func (x *FinalityConflictResolvedNotificationMessage) GetFinalityBlockHash() string { @@ -6130,7 +5999,7 @@ type ShutDownRequestMessage struct { func (x *ShutDownRequestMessage) Reset() { *x = ShutDownRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[90] + mi := &file_messages_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6143,7 +6012,7 @@ func (x *ShutDownRequestMessage) String() string { func (*ShutDownRequestMessage) ProtoMessage() {} func (x *ShutDownRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[90] + mi := &file_messages_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6156,7 +6025,7 @@ func (x *ShutDownRequestMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use ShutDownRequestMessage.ProtoReflect.Descriptor instead. func (*ShutDownRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{90} + return file_messages_proto_rawDescGZIP(), []int{88} } type ShutDownResponseMessage struct { @@ -6170,7 +6039,7 @@ type ShutDownResponseMessage struct { func (x *ShutDownResponseMessage) Reset() { *x = ShutDownResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[91] + mi := &file_messages_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6183,7 +6052,7 @@ func (x *ShutDownResponseMessage) String() string { func (*ShutDownResponseMessage) ProtoMessage() {} func (x *ShutDownResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[91] + mi := &file_messages_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6196,7 +6065,7 @@ func (x *ShutDownResponseMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use ShutDownResponseMessage.ProtoReflect.Descriptor instead. func (*ShutDownResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{91} + return file_messages_proto_rawDescGZIP(), []int{89} } func (x *ShutDownResponseMessage) GetError() *RPCError { @@ -6219,7 +6088,7 @@ type GetHeadersRequestMessage struct { func (x *GetHeadersRequestMessage) Reset() { *x = GetHeadersRequestMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[92] + mi := &file_messages_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6232,7 +6101,7 @@ func (x *GetHeadersRequestMessage) String() string { func (*GetHeadersRequestMessage) ProtoMessage() {} func (x *GetHeadersRequestMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[92] + mi := &file_messages_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6245,7 +6114,7 @@ func (x *GetHeadersRequestMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetHeadersRequestMessage.ProtoReflect.Descriptor instead. func (*GetHeadersRequestMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{92} + return file_messages_proto_rawDescGZIP(), []int{90} } func (x *GetHeadersRequestMessage) GetStartHash() string { @@ -6281,7 +6150,7 @@ type GetHeadersResponseMessage struct { func (x *GetHeadersResponseMessage) Reset() { *x = GetHeadersResponseMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messages_proto_msgTypes[93] + mi := &file_messages_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6294,7 +6163,7 @@ func (x *GetHeadersResponseMessage) String() string { func (*GetHeadersResponseMessage) ProtoMessage() {} func (x *GetHeadersResponseMessage) ProtoReflect() protoreflect.Message { - mi := &file_messages_proto_msgTypes[93] + mi := &file_messages_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6307,7 +6176,7 @@ func (x *GetHeadersResponseMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use GetHeadersResponseMessage.ProtoReflect.Descriptor instead. func (*GetHeadersResponseMessage) Descriptor() ([]byte, []int) { - return file_messages_proto_rawDescGZIP(), []int{93} + return file_messages_proto_rawDescGZIP(), []int{91} } func (x *GetHeadersResponseMessage) GetHeaders() []string { @@ -6328,7 +6197,7 @@ var File_messages_proto protoreflect.FileDescriptor var file_messages_proto_rawDesc = []byte{ 0x0a, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x12, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x22, 0xbc, 0x36, 0x0a, 0x0d, + 0x12, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x22, 0xa1, 0x35, 0x0a, 0x0d, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x41, 0x64, 0x64, @@ -6376,1061 +6245,1037 @@ var file_messages_proto_rawDesc = []byte{ 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x12, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, - 0x12, 0x56, 0x0a, 0x12, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x48, 0x00, 0x52, 0x12, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x12, 0x59, 0x0a, 0x13, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, - 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x13, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x69, 0x62, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, - 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, - 0x52, 0x08, 0x69, 0x62, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x47, 0x0a, 0x0d, 0x69, 0x6e, - 0x76, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x49, 0x6e, - 0x76, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x69, 0x6e, 0x76, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x12, 0x4d, 0x0a, 0x0f, 0x69, 0x6e, 0x76, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x49, 0x6e, 0x76, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, - 0x00, 0x52, 0x0f, 0x69, 0x6e, 0x76, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x2c, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x50, 0x69, 0x6e, - 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x04, 0x70, 0x69, 0x6e, 0x67, - 0x12, 0x2c, 0x0a, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x41, - 0x0a, 0x0b, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x18, 0x12, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, - 0x70, 0x12, 0x32, 0x0a, 0x06, 0x76, 0x65, 0x72, 0x61, 0x63, 0x6b, 0x18, 0x13, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x56, 0x65, - 0x72, 0x61, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x06, 0x76, - 0x65, 0x72, 0x61, 0x63, 0x6b, 0x12, 0x35, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, - 0x72, 0x65, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x48, 0x00, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, 0x13, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x46, 0x6f, - 0x75, 0x6e, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x48, 0x00, 0x52, 0x13, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, - 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x32, 0x0a, 0x06, 0x72, 0x65, 0x6a, 0x65, 0x63, - 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, - 0x69, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x41, 0x0a, 0x0b, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, - 0x00, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x77, - 0x0a, 0x1d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x42, 0x44, 0x52, 0x6f, 0x6f, 0x74, - 0x55, 0x54, 0x58, 0x4f, 0x53, 0x65, 0x74, 0x41, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, - 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, - 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x42, 0x44, 0x52, 0x6f, 0x6f, 0x74, + 0x12, 0x59, 0x0a, 0x13, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x13, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x69, + 0x62, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x08, 0x69, 0x62, 0x64, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x12, 0x47, 0x0a, 0x0d, 0x69, 0x6e, 0x76, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x49, 0x6e, 0x76, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x69, 0x6e, + 0x76, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x4d, 0x0a, 0x0f, 0x69, + 0x6e, 0x76, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, + 0x2e, 0x49, 0x6e, 0x76, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x69, 0x6e, 0x76, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2c, 0x0a, 0x04, 0x70, 0x69, + 0x6e, 0x67, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x77, 0x69, 0x72, 0x65, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x48, 0x00, 0x52, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x04, 0x70, 0x6f, 0x6e, 0x67, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, + 0x72, 0x65, 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, + 0x52, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x32, 0x0a, 0x06, 0x76, 0x65, 0x72, 0x61, 0x63, 0x6b, + 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, + 0x72, 0x65, 0x2e, 0x56, 0x65, 0x72, 0x61, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x48, 0x00, 0x52, 0x06, 0x76, 0x65, 0x72, 0x61, 0x63, 0x6b, 0x12, 0x35, 0x0a, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x59, 0x0a, 0x13, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x13, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x32, 0x0a, 0x06, + 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, + 0x12, 0x41, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, + 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, + 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x12, 0x77, 0x0a, 0x1d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x42, + 0x44, 0x52, 0x6f, 0x6f, 0x74, 0x55, 0x54, 0x58, 0x4f, 0x53, 0x65, 0x74, 0x41, 0x6e, 0x64, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x42, + 0x44, 0x52, 0x6f, 0x6f, 0x74, 0x55, 0x54, 0x58, 0x4f, 0x53, 0x65, 0x74, 0x41, 0x6e, 0x64, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1d, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x42, 0x44, 0x52, 0x6f, 0x6f, 0x74, 0x55, 0x54, 0x58, + 0x4f, 0x53, 0x65, 0x74, 0x41, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x62, 0x0a, 0x16, + 0x69, 0x62, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x55, 0x54, 0x58, 0x4f, 0x53, 0x65, 0x74, 0x41, 0x6e, + 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x49, 0x42, 0x44, 0x52, 0x6f, 0x6f, 0x74, 0x55, 0x54, 0x58, 0x4f, 0x53, 0x65, 0x74, 0x41, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x49, 0x42, 0x44, 0x52, 0x6f, 0x6f, 0x74, 0x55, 0x54, 0x58, 0x4f, 0x53, 0x65, 0x74, 0x41, - 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x62, 0x0a, 0x16, 0x69, 0x62, 0x64, 0x52, 0x6f, - 0x6f, 0x74, 0x55, 0x54, 0x58, 0x4f, 0x53, 0x65, 0x74, 0x41, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, - 0x69, 0x72, 0x65, 0x2e, 0x49, 0x42, 0x44, 0x52, 0x6f, 0x6f, 0x74, 0x55, 0x54, 0x58, 0x4f, 0x53, - 0x65, 0x74, 0x41, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x48, 0x00, 0x52, 0x16, 0x69, 0x62, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x55, 0x54, 0x58, 0x4f, - 0x53, 0x65, 0x74, 0x41, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x50, 0x0a, 0x10, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x42, 0x44, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, - 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, - 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x42, 0x44, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x10, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x49, 0x42, 0x44, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x4d, 0x0a, - 0x0f, 0x69, 0x62, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, - 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, - 0x72, 0x65, 0x2e, 0x49, 0x42, 0x44, 0x52, 0x6f, 0x6f, 0x74, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, - 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x69, 0x62, 0x64, - 0x52, 0x6f, 0x6f, 0x74, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x69, 0x0a, 0x18, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x16, 0x69, 0x62, 0x64, 0x52, 0x6f, 0x6f, + 0x74, 0x55, 0x54, 0x58, 0x4f, 0x53, 0x65, 0x74, 0x41, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x12, 0x50, 0x0a, 0x10, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x42, 0x44, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x42, + 0x44, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, + 0x52, 0x10, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x42, 0x44, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x69, 0x62, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x4e, 0x6f, 0x74, + 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x49, 0x42, 0x44, 0x52, 0x6f, 0x6f, 0x74, 0x4e, + 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, + 0x52, 0x0f, 0x69, 0x62, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, + 0x64, 0x12, 0x69, 0x0a, 0x18, 0x67, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xe9, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, + 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x48, 0x00, 0x52, 0x18, 0x67, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6c, 0x0a, 0x19, 0x67, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x18, 0x67, - 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6c, 0x0a, 0x19, 0x67, 0x65, 0x74, 0x43, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x19, 0x67, 0x65, 0x74, 0x43, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x12, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xeb, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x53, - 0x75, 0x62, 0x6d, 0x69, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x12, 0x73, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5a, - 0x0a, 0x13, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x13, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x17, 0x67, 0x65, + 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, + 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, + 0x19, 0x67, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x12, 0x73, 0x75, + 0x62, 0x6d, 0x69, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, + 0x69, 0x72, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, + 0x12, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x5a, 0x0a, 0x13, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x53, 0x75, + 0x62, 0x6d, 0x69, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x13, 0x73, 0x75, 0x62, 0x6d, + 0x69, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x66, 0x0a, 0x17, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x17, 0x67, 0x65, 0x74, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x69, 0x0a, 0x18, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xee, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, - 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x48, 0x00, 0x52, 0x18, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, - 0x17, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xef, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x17, 0x6e, 0x6f, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x17, + 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x69, 0x0a, 0x18, 0x67, 0x65, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x18, 0xee, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x18, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x66, 0x0a, 0x17, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xef, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, + 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, + 0x00, 0x52, 0x17, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, + 0x64, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x69, 0x0a, 0x18, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x69, 0x0a, 0x18, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x18, 0xf0, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x41, 0x64, 0x64, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x18, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x63, 0x0a, 0x16, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x4e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xf1, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x16, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x66, 0x0a, 0x17, 0x67, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xf0, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x18, 0x6e, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x16, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, + 0x64, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0xf1, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, + 0x72, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x4e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x48, 0x00, 0x52, 0x16, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x4e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x66, 0x0a, 0x17, 0x67, 0x65, + 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xf2, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0xf2, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, - 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x48, 0x00, 0x52, 0x17, 0x67, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x69, 0x0a, - 0x18, 0x67, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xf3, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, - 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x18, - 0x67, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, 0x19, 0x67, 0x65, 0x74, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xf4, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x19, 0x67, 0x65, 0x74, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6f, 0x0a, 0x1a, 0x67, 0x65, 0x74, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xf5, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1a, 0x67, 0x65, 0x74, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x16, 0x67, 0x65, 0x74, 0x4d, 0x65, - 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0xf6, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x48, 0x00, 0x52, 0x16, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x66, 0x0a, 0x17, - 0x67, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xf7, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, - 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x17, 0x67, 0x65, 0x74, - 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x1b, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0xf8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1b, 0x67, 0x65, 0x74, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x75, 0x0a, 0x1c, 0x67, 0x65, 0x74, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xf9, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, - 0x00, 0x52, 0x1c, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, - 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x4b, 0x0a, 0x0e, 0x61, 0x64, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0xfa, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x77, 0x69, 0x72, 0x65, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x61, 0x64, - 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4e, 0x0a, 0x0f, - 0x61, 0x64, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, - 0xfb, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, - 0x72, 0x65, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x61, 0x64, 0x64, - 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x18, - 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xfc, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x18, 0x73, - 0x75, 0x62, 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6c, 0x0a, 0x19, 0x73, 0x75, 0x62, 0x6d, 0x69, - 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xfd, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x19, 0x73, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, 0x19, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x43, - 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x18, 0xfe, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x43, 0x68, 0x61, 0x69, - 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x19, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, - 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x6f, 0x0a, 0x1a, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x43, 0x68, 0x61, - 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x18, 0xff, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1a, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, - 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x18, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x80, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, - 0x69, 0x72, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, - 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x18, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x4e, 0x0a, 0x0f, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x18, 0x81, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0f, - 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x51, 0x0a, 0x10, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x18, 0x82, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, - 0x52, 0x10, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x5d, 0x0a, 0x14, 0x67, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x83, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, - 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x14, 0x67, 0x65, 0x74, - 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x60, 0x0a, 0x15, 0x67, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x84, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, - 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x15, 0x67, 0x65, - 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x18, 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x46, - 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, - 0x85, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, - 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x48, 0x00, 0x52, 0x18, 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x72, - 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6c, - 0x0a, 0x19, 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x86, 0x08, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, - 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, - 0x00, 0x52, 0x19, 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x10, - 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x87, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, - 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x10, 0x67, - 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x54, 0x0a, 0x11, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x88, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x48, 0x00, 0x52, 0x11, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, 0x0a, 0x14, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x89, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, - 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x14, - 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x60, 0x0a, 0x15, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x8a, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, - 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, - 0x15, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x16, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x44, 0x61, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x8b, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, - 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x67, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x48, 0x00, 0x52, 0x16, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x67, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x66, 0x0a, 0x17, 0x67, - 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x8c, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x44, 0x61, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x17, 0x67, 0x65, 0x74, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x7b, 0x0a, 0x1e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x46, 0x69, - 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x8d, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, - 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x17, 0x67, 0x65, 0x74, 0x50, 0x65, + 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x69, 0x0a, 0x18, 0x67, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xf3, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, + 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x48, 0x00, 0x52, 0x18, 0x67, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, + 0x19, 0x67, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, + 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xf4, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, + 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, - 0x52, 0x1e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, - 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x7e, 0x0a, 0x1f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x46, 0x69, 0x6e, 0x61, 0x6c, - 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x18, 0x8e, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x46, 0x69, - 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, - 0x1f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, - 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x7b, 0x0a, 0x1e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, - 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x18, 0x8f, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x46, 0x69, 0x6e, 0x61, - 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1e, 0x6e, - 0x6f, 0x74, 0x69, 0x66, 0x79, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, - 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x7e, 0x0a, - 0x1f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, - 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x18, 0x90, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, - 0x69, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, - 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1f, 0x6e, 0x6f, - 0x74, 0x69, 0x66, 0x79, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, - 0x6c, 0x69, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, - 0x1c, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, - 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x91, 0x08, + 0x52, 0x19, 0x67, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, + 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6f, 0x0a, 0x1a, 0x67, + 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xf5, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, + 0x52, 0x1a, 0x67, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, + 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x16, + 0x67, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xf6, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, + 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x16, 0x67, 0x65, 0x74, 0x4d, 0x65, + 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x66, 0x0a, 0x17, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xf7, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, + 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, + 0x52, 0x17, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x1b, 0x67, 0x65, 0x74, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xf8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, + 0x52, 0x1b, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, + 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x75, 0x0a, + 0x1c, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xf9, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, - 0x2e, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, - 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1c, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, - 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x8d, 0x01, 0x0a, 0x24, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, - 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, - 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x92, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, - 0x2e, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, - 0x74, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x24, - 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, - 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x69, 0x0a, 0x18, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, - 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x93, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, - 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x18, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, - 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x6c, 0x0a, 0x19, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x94, 0x08, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, - 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x48, 0x00, 0x52, 0x19, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, - 0x0f, 0x73, 0x68, 0x75, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x95, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, - 0x69, 0x72, 0x65, 0x2e, 0x53, 0x68, 0x75, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x68, - 0x75, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, - 0x10, 0x73, 0x68, 0x75, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x18, 0x96, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x77, 0x69, 0x72, 0x65, 0x2e, 0x53, 0x68, 0x75, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x10, - 0x73, 0x68, 0x75, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x54, 0x0a, 0x11, 0x67, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xeb, 0x50, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x48, 0x00, 0x52, 0x11, 0x67, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x57, 0x0a, 0x12, 0x67, 0x65, 0x74, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x98, 0x08, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, - 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x12, 0x67, 0x65, 0x74, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, - 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x8c, 0x01, 0x0a, 0x17, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x41, 0x6c, 0x6c, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x41, 0x6c, - 0x6c, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x3b, 0x0a, 0x0c, - 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x53, - 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x52, 0x0c, 0x73, 0x75, 0x62, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x22, 0x4b, 0x0a, 0x10, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x37, 0x0a, - 0x0b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4e, - 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0b, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x6a, 0x0a, 0x0a, 0x4e, 0x65, 0x74, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x70, 0x12, 0x12, - 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, - 0x72, 0x74, 0x22, 0x24, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x22, 0xd3, 0x02, 0x0a, 0x12, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x06, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x36, - 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x07, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x77, 0x69, 0x72, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, - 0x64, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, - 0x10, 0x0a, 0x03, 0x67, 0x61, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x67, 0x61, - 0x73, 0x12, 0x31, 0x0a, 0x0b, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x61, 0x73, 0x68, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, - 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x0b, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x48, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x99, - 0x01, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x12, 0x3f, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x4f, - 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x52, 0x10, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x4f, 0x75, 0x74, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x60, 0x0a, 0x08, 0x4f, 0x75, - 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x25, 0x0a, 0x0d, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x22, 0x4d, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x22, - 0x0a, 0x0c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x75, 0x62, 0x4b, - 0x65, 0x79, 0x22, 0x88, 0x01, 0x0a, 0x0c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, - 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe2, 0x02, - 0x0a, 0x12, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x73, + 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1c, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0e, 0x61, 0x64, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xfa, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x65, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, + 0x00, 0x52, 0x0e, 0x61, 0x64, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x4e, 0x0a, 0x0f, 0x61, 0x64, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xfb, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, + 0x52, 0x0f, 0x61, 0x64, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x69, 0x0a, 0x18, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xfc, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, + 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x48, 0x00, 0x52, 0x18, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6c, 0x0a, 0x19, + 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xfd, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x53, 0x75, 0x62, + 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, + 0x19, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, 0x19, 0x6e, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xfe, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, + 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x19, 0x6e, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6f, 0x0a, 0x1a, 0x6e, 0x6f, 0x74, 0x69, + 0x66, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xff, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1a, 0x6e, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x18, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x80, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x18, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x0f, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x81, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x48, 0x00, 0x52, 0x0f, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x10, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x82, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x10, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, 0x0a, 0x14, 0x67, 0x65, 0x74, 0x53, 0x75, + 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x83, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, + 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, + 0x52, 0x14, 0x67, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x60, 0x0a, 0x15, 0x67, 0x65, 0x74, 0x53, 0x75, 0x62, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, + 0x84, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, + 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, + 0x00, 0x52, 0x15, 0x67, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x18, 0x67, 0x65, 0x74, 0x43, + 0x68, 0x61, 0x69, 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x85, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, + 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x18, 0x67, 0x65, 0x74, 0x43, 0x68, + 0x61, 0x69, 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x6c, 0x0a, 0x19, 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x46, + 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x18, 0x86, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, + 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x72, 0x6f, 0x6d, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x19, 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, + 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x51, 0x0a, 0x10, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x87, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x48, 0x00, 0x52, 0x10, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x11, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x88, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x11, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, 0x0a, 0x14, 0x67, 0x65, + 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x18, 0x89, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x48, 0x00, 0x52, 0x14, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x60, 0x0a, 0x15, 0x67, 0x65, 0x74, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x18, 0x8a, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x48, 0x00, 0x52, 0x15, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x16, 0x67, + 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x8b, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x44, 0x61, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x16, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x44, 0x61, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x66, 0x0a, 0x17, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x67, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x8c, 0x08, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, + 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, + 0x17, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x67, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7b, 0x0a, 0x1e, 0x72, 0x65, 0x73, 0x6f, + 0x6c, 0x76, 0x65, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, + 0x69, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x8d, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, + 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x46, 0x69, + 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x7e, 0x0a, 0x1f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, + 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x8e, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x31, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, + 0x6c, 0x76, 0x65, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, + 0x69, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x48, 0x00, 0x52, 0x1f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x46, 0x69, 0x6e, + 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7b, 0x0a, 0x1e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x46, + 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x8f, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, + 0x79, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x48, 0x00, 0x52, 0x1e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, + 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x7e, 0x0a, 0x1f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x46, 0x69, 0x6e, 0x61, + 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x90, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x46, + 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, + 0x00, 0x52, 0x1f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, + 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x75, 0x0a, 0x1c, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, + 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x91, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, + 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1c, 0x66, 0x69, 0x6e, + 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x4e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x8d, 0x01, 0x0a, 0x24, 0x66, 0x69, + 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, + 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, + 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x48, 0x00, 0x52, 0x24, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, + 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x69, 0x0a, 0x18, 0x67, 0x65, 0x74, + 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x93, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, + 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x18, 0x67, 0x65, 0x74, 0x4d, + 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x6c, 0x0a, 0x19, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, + 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x18, 0x94, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x19, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, + 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0f, 0x73, 0x68, 0x75, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x95, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x53, 0x68, 0x75, 0x74, 0x44, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, + 0x00, 0x52, 0x0f, 0x73, 0x68, 0x75, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x51, 0x0a, 0x10, 0x73, 0x68, 0x75, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x96, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x53, 0x68, 0x75, 0x74, 0x44, 0x6f, + 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x48, 0x00, 0x52, 0x10, 0x73, 0x68, 0x75, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x11, 0x67, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xeb, 0x50, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, + 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x11, 0x67, 0x65, 0x74, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x57, 0x0a, 0x12, 0x67, + 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x18, 0x98, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, + 0x52, 0x12, 0x67, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, + 0x8c, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x41, 0x6c, 0x6c, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x41, 0x6c, 0x6c, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x73, 0x12, 0x3b, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, + 0x69, 0x72, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, + 0x52, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x22, 0x4b, + 0x0a, 0x10, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, + 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, + 0x69, 0x72, 0x65, 0x2e, 0x4e, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0b, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x6a, 0x0a, 0x0a, 0x4e, + 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x02, 0x69, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x24, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x22, 0xd3, 0x02, + 0x0a, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, - 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, - 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, - 0x68, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0e, 0x68, 0x61, 0x73, 0x68, 0x4d, 0x65, 0x72, 0x6b, 0x6c, - 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x0e, 0x68, 0x61, - 0x73, 0x68, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x43, 0x0a, 0x14, - 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x49, 0x64, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, - 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x14, 0x61, 0x63, 0x63, - 0x65, 0x70, 0x74, 0x65, 0x64, 0x49, 0x64, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, - 0x74, 0x12, 0x37, 0x0a, 0x0e, 0x75, 0x74, 0x78, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x0e, 0x75, 0x74, 0x78, 0x6f, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x69, 0x74, 0x73, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x62, 0x69, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, - 0x63, 0x65, 0x22, 0x1c, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x22, 0x74, 0x0a, 0x1a, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, - 0x0a, 0x07, 0x6c, 0x6f, 0x77, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, - 0x52, 0x07, 0x6c, 0x6f, 0x77, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2b, 0x0a, 0x08, 0x68, 0x69, 0x67, - 0x68, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x08, 0x68, 0x69, - 0x67, 0x68, 0x48, 0x61, 0x73, 0x68, 0x22, 0x3e, 0x0a, 0x13, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x27, 0x0a, - 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x06, - 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x6f, 0x0a, 0x15, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x29, 0x0a, 0x07, 0x6c, 0x6f, 0x77, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, - 0x68, 0x52, 0x07, 0x6c, 0x6f, 0x77, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2b, 0x0a, 0x08, 0x68, 0x69, - 0x67, 0x68, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x08, 0x68, - 0x69, 0x67, 0x68, 0x48, 0x61, 0x73, 0x68, 0x22, 0x1b, 0x0a, 0x19, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x6f, 0x6e, 0x65, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x44, 0x0a, 0x19, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x27, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, - 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, - 0x22, 0x1b, 0x0a, 0x19, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x48, 0x0a, - 0x1a, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x69, - 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x46, 0x0a, 0x1a, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, 0x22, - 0x3b, 0x0a, 0x14, 0x49, 0x6e, 0x76, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, - 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x22, 0x44, 0x0a, 0x16, - 0x49, 0x6e, 0x76, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x52, 0x03, 0x69, - 0x64, 0x73, 0x22, 0x23, 0x0a, 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0x23, 0x0a, 0x0b, 0x50, 0x6f, 0x6e, 0x67, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0x4f, 0x0a, 0x12, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x39, 0x0a, 0x0f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, - 0x70, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x0f, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x22, 0x0f, 0x0a, - 0x0d, 0x56, 0x65, 0x72, 0x61, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x8d, - 0x03, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2f, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, - 0x72, 0x65, 0x2e, 0x4e, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x0f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x0f, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x12, - 0x26, 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x54, - 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x52, 0x65, 0x6c, 0x61, 0x79, 0x54, 0x78, 0x12, 0x3b, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x06, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, + 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6c, + 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, + 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x27, - 0x0a, 0x0d, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x24, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x49, 0x42, 0x44, 0x52, 0x6f, 0x6f, 0x74, 0x55, 0x54, 0x58, 0x4f, 0x53, 0x65, 0x74, - 0x41, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x29, 0x0a, 0x07, 0x69, 0x62, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x72, 0x6b, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x61, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x03, 0x67, 0x61, 0x73, 0x12, 0x31, 0x0a, 0x0b, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x48, 0x61, 0x73, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x0b, 0x70, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x22, 0x99, 0x01, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x3f, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x6f, 0x75, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4f, + 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x10, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, + 0x73, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, + 0x60, 0x0a, 0x08, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x52, 0x0d, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x22, 0x25, 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x22, 0x4d, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x75, 0x62, + 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x22, 0x88, 0x01, 0x0a, 0x0c, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x77, 0x69, 0x72, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, + 0x41, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, + 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0xe2, 0x02, 0x0a, 0x12, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0e, 0x68, 0x61, 0x73, 0x68, + 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, - 0x68, 0x52, 0x07, 0x69, 0x62, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x68, 0x0a, 0x1d, 0x49, 0x42, - 0x44, 0x52, 0x6f, 0x6f, 0x74, 0x55, 0x54, 0x58, 0x4f, 0x53, 0x65, 0x74, 0x41, 0x6e, 0x64, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x75, - 0x74, 0x78, 0x6f, 0x53, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x75, 0x74, - 0x78, 0x6f, 0x53, 0x65, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, - 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x42, 0x0a, 0x17, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, - 0x42, 0x44, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x27, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x68, 0x52, 0x0e, 0x68, 0x61, 0x73, 0x68, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, + 0x74, 0x12, 0x43, 0x0a, 0x14, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x49, 0x64, 0x4d, + 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, - 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x49, 0x42, 0x44, 0x52, - 0x6f, 0x6f, 0x74, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x21, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x43, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x76, 0x0a, 0x20, 0x47, + 0x52, 0x14, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x49, 0x64, 0x4d, 0x65, 0x72, 0x6b, + 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x37, 0x0a, 0x0e, 0x75, 0x74, 0x78, 0x6f, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, + 0x0e, 0x75, 0x74, 0x78, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x12, 0x0a, + 0x04, 0x62, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x62, 0x69, 0x74, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0x1c, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, + 0x14, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x22, 0x8a, 0x01, 0x0a, 0x1a, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x6c, 0x6f, 0x77, 0x48, 0x61, 0x73, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, + 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x07, 0x6c, 0x6f, 0x77, 0x48, 0x61, 0x73, 0x68, 0x12, + 0x2b, 0x0a, 0x08, 0x68, 0x69, 0x67, 0x68, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, + 0x73, 0x68, 0x52, 0x08, 0x68, 0x69, 0x67, 0x68, 0x48, 0x61, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x22, 0x3e, 0x0a, 0x13, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x6f, 0x63, 0x61, 0x74, + 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x27, 0x0a, 0x06, 0x68, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, + 0x65, 0x73, 0x22, 0x6f, 0x0a, 0x15, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x6c, + 0x6f, 0x77, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x07, 0x6c, + 0x6f, 0x77, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2b, 0x0a, 0x08, 0x68, 0x69, 0x67, 0x68, 0x48, 0x61, + 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x08, 0x68, 0x69, 0x67, 0x68, 0x48, + 0x61, 0x73, 0x68, 0x22, 0x1b, 0x0a, 0x19, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4e, 0x65, + 0x78, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x22, 0x14, 0x0a, 0x12, 0x44, 0x6f, 0x6e, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x44, 0x0a, 0x19, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x27, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, + 0x48, 0x61, 0x73, 0x68, 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x48, 0x0a, 0x1a, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x69, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, + 0x69, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x46, 0x0a, 0x1a, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, 0x22, 0x3b, + 0x0a, 0x14, 0x49, 0x6e, 0x76, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, + 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x22, 0x44, 0x0a, 0x16, 0x49, + 0x6e, 0x76, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x52, 0x03, 0x69, 0x64, + 0x73, 0x22, 0x23, 0x0a, 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0x23, 0x0a, 0x0b, 0x50, 0x6f, 0x6e, 0x67, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0x0f, 0x0a, 0x0d, 0x56, + 0x65, 0x72, 0x61, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xd2, 0x02, 0x0a, + 0x0e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x2f, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, + 0x2e, 0x4e, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x6c, + 0x61, 0x79, 0x54, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x54, 0x78, 0x12, 0x3b, 0x0a, 0x0c, 0x73, 0x75, + 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x53, 0x75, 0x62, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x22, 0x27, 0x0a, 0x0d, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x24, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x42, 0x44, 0x52, 0x6f, 0x6f, 0x74, 0x55, 0x54, 0x58, 0x4f, + 0x53, 0x65, 0x74, 0x41, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x69, 0x62, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, + 0x48, 0x61, 0x73, 0x68, 0x52, 0x07, 0x69, 0x62, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x68, 0x0a, + 0x1d, 0x49, 0x42, 0x44, 0x52, 0x6f, 0x6f, 0x74, 0x55, 0x54, 0x58, 0x4f, 0x53, 0x65, 0x74, 0x41, + 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x75, 0x74, 0x78, 0x6f, 0x53, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x07, 0x75, 0x74, 0x78, 0x6f, 0x53, 0x65, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, + 0x69, 0x72, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x42, 0x0a, 0x17, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x49, 0x42, 0x44, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x27, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, + 0x61, 0x73, 0x68, 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x49, + 0x42, 0x44, 0x52, 0x6f, 0x6f, 0x74, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x21, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x26, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, - 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x22, 0x4a, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x2d, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, - 0x48, 0x0a, 0x1a, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x40, 0x0a, 0x1e, 0x47, 0x65, 0x74, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, - 0x61, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x70, 0x61, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x8a, 0x01, 0x0a, 0x1f, - 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x3b, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, - 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0c, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x20, 0x0a, 0x1e, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x4d, 0x0a, 0x1f, 0x4e, 0x6f, - 0x74, 0x69, 0x66, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x4e, 0x0a, 0x1d, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x20, 0x0a, 0x1e, 0x47, 0x65, 0x74, - 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xf5, 0x01, 0x0a, 0x1f, - 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x4c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, - 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x4b, - 0x6e, 0x6f, 0x77, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x58, 0x0a, - 0x0f, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, - 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x73, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0f, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, - 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x22, 0x39, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x64, - 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x64, 0x64, 0x72, 0x22, 0x22, - 0x0a, 0x20, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, - 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x22, 0x79, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, - 0x68, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, - 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x7b, 0x0a, - 0x0c, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x66, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x66, 0x65, 0x65, 0x12, - 0x59, 0x0a, 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, - 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x52, 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, - 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x22, 0x33, 0x0a, 0x1d, 0x47, 0x65, - 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x78, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x22, - 0x7b, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4d, 0x65, 0x6d, - 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x76, + 0x0a, 0x20, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x4a, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x22, 0x48, 0x0a, 0x1a, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x21, 0x0a, 0x1f, - 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, - 0x81, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, - 0x65, 0x2e, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, - 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, - 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x22, 0x24, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x23, 0x47, 0x65, - 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x3c, 0x0a, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, - 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x12, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x40, 0x0a, 0x1e, + 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1e, + 0x0a, 0x0a, 0x70, 0x61, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x8a, + 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x77, 0x69, 0x72, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x52, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xff, 0x02, 0x0a, 0x1b, - 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, - 0x49, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x69, 0x6e, - 0x67, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x10, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x69, 0x6e, 0x67, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, - 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x69, - 0x73, 0x53, 0x79, 0x6e, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0a, 0x69, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x69, - 0x73, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0a, 0x69, 0x73, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x74, - 0x69, 0x6d, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, - 0x73, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x75, 0x73, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x19, 0x61, 0x64, 0x76, - 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x19, 0x61, 0x64, - 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, - 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x53, 0x0a, - 0x15, 0x41, 0x64, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x50, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x50, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x65, - 0x6e, 0x74, 0x22, 0x44, 0x0a, 0x16, 0x41, 0x64, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x62, 0x0a, 0x1f, 0x53, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, - 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x62, 0x0a, 0x20, - 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x78, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, - 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x22, 0x22, 0x0a, 0x20, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x22, 0x4f, 0x0a, 0x21, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x43, 0x68, - 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x9e, 0x01, 0x0a, 0x1f, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x72, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, - 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, - 0x68, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x10, 0x61, 0x64, 0x64, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, - 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x10, 0x61, 0x64, 0x64, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x22, 0x62, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x40, 0x0a, 0x0e, 0x61, 0x63, 0x63, 0x65, - 0x70, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x41, 0x63, 0x63, - 0x65, 0x70, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x0e, 0x61, 0x63, 0x63, 0x65, - 0x70, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x22, 0x49, 0x0a, 0x0d, 0x41, 0x63, - 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x68, - 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, - 0x24, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, - 0x54, 0x78, 0x49, 0x64, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x68, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x44, 0x0a, 0x1d, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, - 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x1d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x22, 0xac, - 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x47, 0x0a, 0x10, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x10, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, - 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x99, 0x04, - 0x0a, 0x10, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x78, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x78, - 0x12, 0x26, 0x0a, 0x0e, 0x68, 0x61, 0x73, 0x68, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, - 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x68, 0x61, 0x73, 0x68, 0x4d, 0x65, - 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x32, 0x0a, 0x14, 0x61, 0x63, 0x63, 0x65, - 0x70, 0x74, 0x65, 0x64, 0x49, 0x44, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, - 0x49, 0x44, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x26, 0x0a, 0x0e, - 0x75, 0x74, 0x78, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x75, 0x74, 0x78, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x59, 0x0a, 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, - 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, - 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, - 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x69, 0x74, - 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x69, 0x74, 0x73, 0x12, 0x1e, 0x0a, - 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x22, 0x0a, - 0x0c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x0c, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x65, - 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, - 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x44, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x22, 0x8f, 0x04, 0x0a, 0x16, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, - 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x6f, - 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, - 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x61, - 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x67, 0x61, 0x73, 0x12, 0x20, 0x0a, 0x0b, - 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x61, 0x73, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x61, 0x73, 0x68, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x5e, 0x0a, 0x18, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x18, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, - 0x73, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x61, 0x0a, 0x19, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x52, 0x19, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, - 0x62, 0x6f, 0x73, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x9f, 0x01, 0x0a, 0x17, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, - 0x73, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x32, 0x0a, - 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x53, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x53, 0x69, 0x67, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, - 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x2f, 0x0a, - 0x09, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x73, - 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x73, 0x6d, 0x12, 0x10, 0x0a, 0x03, - 0x68, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x68, 0x65, 0x78, 0x22, 0x89, - 0x01, 0x0a, 0x18, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, - 0x72, 0x62, 0x6f, 0x73, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x41, 0x0a, 0x0c, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0c, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x22, 0x66, 0x0a, 0x12, 0x53, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x61, 0x73, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, - 0x73, 0x6d, 0x12, 0x10, 0x0a, 0x03, 0x68, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x68, 0x65, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x22, 0x41, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x22, 0x66, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x67, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x67, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, - 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x79, 0x0a, - 0x1f, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x38, - 0x0a, 0x17, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, - 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x17, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, - 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x22, 0x94, 0x02, 0x0a, 0x20, 0x47, 0x65, 0x74, - 0x43, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x38, 0x0a, - 0x17, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, - 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x10, 0x61, 0x64, 0x64, 0x65, 0x64, - 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x43, 0x68, - 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x10, 0x61, 0x64, 0x64, 0x65, 0x64, 0x43, - 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x47, 0x0a, 0x10, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, - 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x10, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, - 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, - 0xe1, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6c, - 0x6f, 0x77, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x6f, - 0x77, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, - 0x78, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x17, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x44, 0x0a, - 0x1d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x1d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x22, 0xd1, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, - 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x78, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x78, - 0x65, 0x73, 0x12, 0x47, 0x0a, 0x10, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, - 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, - 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x10, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x1d, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x6a, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, - 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x22, 0x1f, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, - 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x22, 0xa6, 0x02, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x44, 0x61, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x70, 0x48, - 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x70, - 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, - 0x75, 0x6c, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x64, 0x69, 0x66, 0x66, - 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x70, 0x61, 0x73, 0x74, 0x4d, 0x65, - 0x64, 0x69, 0x61, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, - 0x70, 0x61, 0x73, 0x74, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x30, - 0x0a, 0x13, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, - 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x76, 0x69, 0x72, - 0x74, 0x75, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, + 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x20, 0x0a, 0x1e, 0x4e, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x4d, 0x0a, + 0x1f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x55, 0x0a, 0x25, - 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, - 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, - 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x11, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, - 0x61, 0x73, 0x68, 0x22, 0x54, 0x0a, 0x26, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x46, 0x69, - 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x4e, 0x0a, 0x1d, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, + 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x20, 0x0a, 0x1e, + 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xf5, + 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x4c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, + 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x65, 0x73, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x12, 0x58, 0x0a, 0x0f, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0f, 0x62, 0x61, 0x6e, 0x6e, 0x65, + 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x39, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, + 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x41, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x64, 0x64, + 0x72, 0x22, 0x22, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x79, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, + 0x48, 0x61, 0x73, 0x68, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, + 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0x7b, 0x0a, 0x0c, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x66, + 0x65, 0x65, 0x12, 0x59, 0x0a, 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x22, 0x33, 0x0a, + 0x1d, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x78, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, + 0x49, 0x64, 0x22, 0x7b, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, + 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, + 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0x21, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, + 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x24, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x8f, 0x01, 0x0a, + 0x23, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, + 0x49, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x69, 0x6e, 0x66, + 0x6f, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, + 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xb5, + 0x02, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, + 0x65, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, + 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, + 0x50, 0x69, 0x6e, 0x67, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x69, 0x6e, 0x67, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x4f, 0x75, 0x74, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x19, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x64, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x19, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, + 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x53, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x50, 0x65, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x50, + 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x69, 0x73, 0x50, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x44, 0x0a, 0x16, 0x41, + 0x64, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, + 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x62, 0x0a, 0x1f, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x62, 0x0a, 0x20, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x27, 0x0a, 0x25, 0x4e, 0x6f, 0x74, - 0x69, 0x66, 0x79, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, - 0x69, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x22, 0x54, 0x0a, 0x26, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x46, 0x69, 0x6e, 0x61, - 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x55, 0x0a, 0x23, 0x46, 0x69, 0x6e, 0x61, - 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x2e, 0x0a, 0x12, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x76, 0x69, 0x6f, - 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x22, - 0x5b, 0x0a, 0x2b, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, - 0x69, 0x63, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2c, - 0x0a, 0x11, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, - 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x69, 0x6e, 0x61, 0x6c, - 0x69, 0x74, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x22, 0x18, 0x0a, 0x16, - 0x53, 0x68, 0x75, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x45, 0x0a, 0x17, 0x53, 0x68, 0x75, 0x74, 0x44, 0x6f, - 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, - 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x70, 0x0a, - 0x18, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x22, 0x0a, 0x20, 0x4e, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x4f, 0x0a, + 0x21, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, + 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x9e, + 0x01, 0x0a, 0x1f, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x4e, + 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, + 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x10, + 0x61, 0x64, 0x64, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, + 0x72, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x10, 0x61, + 0x64, 0x64, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x22, + 0x62, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x12, 0x0a, + 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, + 0x68, 0x12, 0x40, 0x0a, 0x0e, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x52, 0x0e, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x73, 0x22, 0x49, 0x0a, 0x0d, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, + 0x70, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0d, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x73, 0x22, 0x96, + 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, + 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, + 0x64, 0x12, 0x44, 0x0a, 0x1d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, + 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x22, 0xac, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, + 0x68, 0x12, 0x47, 0x0a, 0x10, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, + 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x10, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x56, + 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x99, 0x04, 0x0a, 0x10, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x68, 0x61, 0x73, + 0x68, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x68, 0x61, 0x73, 0x68, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, + 0x74, 0x12, 0x32, 0x0a, 0x14, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x49, 0x44, 0x4d, + 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x14, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x49, 0x44, 0x4d, 0x65, 0x72, 0x6b, 0x6c, + 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x75, 0x74, 0x78, 0x6f, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x75, + 0x74, 0x78, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x59, 0x0a, + 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, + 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, + 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, + 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x69, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x62, 0x69, 0x74, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, + 0x75, 0x6c, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x64, 0x69, 0x66, 0x66, + 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x18, 0x0e, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x44, 0x73, 0x22, 0x8f, 0x04, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x78, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x22, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x61, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x03, 0x67, 0x61, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x48, 0x61, 0x73, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x48, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x12, 0x5e, 0x0a, 0x18, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x0a, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, + 0x73, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x18, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x73, 0x12, 0x61, 0x0a, 0x19, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x0b, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, + 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, + 0x6f, 0x73, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x19, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, + 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, + 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, + 0x69, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x54, 0x69, 0x6d, 0x65, 0x22, 0x9f, 0x01, 0x0a, 0x17, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x78, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x32, 0x0a, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x53, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, 0x67, 0x52, + 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x2f, 0x0a, 0x09, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x53, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x73, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x61, 0x73, 0x6d, 0x12, 0x10, 0x0a, 0x03, 0x68, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x68, 0x65, 0x78, 0x22, 0x89, 0x01, 0x0a, 0x18, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x41, 0x0a, 0x0c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, + 0x72, 0x65, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x75, 0x62, + 0x4b, 0x65, 0x79, 0x22, 0x66, 0x0a, 0x12, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x75, 0x62, + 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x73, 0x6d, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x73, 0x6d, 0x12, 0x10, 0x0a, 0x03, 0x68, + 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x68, 0x65, 0x78, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x41, 0x0a, 0x1b, 0x47, + 0x65, 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x75, + 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x22, 0x66, + 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x67, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x08, 0x67, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x79, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x20, 0x0a, - 0x0b, 0x69, 0x73, 0x41, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x41, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, - 0x61, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x61, 0x72, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x38, 0x0a, 0x17, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x22, 0x94, 0x02, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x72, + 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, + 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, + 0x12, 0x41, 0x0a, 0x10, 0x61, 0x64, 0x64, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x52, 0x10, 0x61, 0x64, 0x64, 0x65, 0x64, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x73, 0x12, 0x47, 0x0a, 0x10, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, + 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, + 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x10, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xe1, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6c, 0x6f, 0x77, 0x48, 0x61, 0x73, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x6f, 0x77, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2c, + 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, + 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x78, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x17, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, + 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, + 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x44, 0x0a, 0x1d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x62, + 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1d, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x22, 0xd1, 0x01, 0x0a, + 0x18, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x78, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x10, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, + 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x10, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, + 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0x1d, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, + 0x6a, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x1f, 0x0a, 0x1d, 0x47, + 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xa6, 0x02, 0x0a, + 0x1e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x67, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, + 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, + 0x26, 0x0a, 0x0e, 0x70, 0x61, 0x73, 0x74, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x54, 0x69, 0x6d, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x70, 0x61, 0x73, 0x74, 0x4d, 0x65, 0x64, + 0x69, 0x61, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x76, 0x69, 0x72, 0x74, 0x75, + 0x61, 0x6c, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x55, 0x0a, 0x25, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, + 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2c, + 0x0a, 0x11, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, + 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x69, 0x6e, 0x61, 0x6c, + 0x69, 0x74, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x22, 0x54, 0x0a, 0x26, + 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, + 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x32, 0x50, 0x0a, 0x03, 0x50, 0x32, 0x50, 0x12, 0x49, 0x0a, 0x0d, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, - 0x2e, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, - 0x28, 0x01, 0x30, 0x01, 0x32, 0x50, 0x0a, 0x03, 0x52, 0x50, 0x43, 0x12, 0x49, 0x0a, 0x0d, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x18, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, - 0x72, 0x65, 0x2e, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x6b, 0x61, - 0x73, 0x70, 0x61, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x72, 0x22, 0x27, 0x0a, 0x25, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x46, 0x69, 0x6e, 0x61, + 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x54, 0x0a, 0x26, 0x4e, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, + 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, + 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x55, 0x0a, 0x23, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, + 0x66, 0x6c, 0x69, 0x63, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x76, 0x69, 0x6f, 0x6c, + 0x61, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x22, 0x5b, 0x0a, 0x2b, 0x46, 0x69, 0x6e, 0x61, + 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, 0x73, 0x6f, + 0x6c, 0x76, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x66, 0x69, 0x6e, 0x61, 0x6c, + 0x69, 0x74, 0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x11, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x48, 0x61, 0x73, 0x68, 0x22, 0x18, 0x0a, 0x16, 0x53, 0x68, 0x75, 0x74, 0x44, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, + 0x45, 0x0a, 0x17, 0x53, 0x68, 0x75, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x70, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, 0x61, 0x73, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, 0x61, 0x73, 0x68, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x41, 0x73, 0x63, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x41, + 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x61, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, + 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x32, 0x50, 0x0a, 0x03, 0x50, + 0x32, 0x50, 0x12, 0x49, 0x0a, 0x0d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, + 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x18, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x32, 0x50, 0x0a, + 0x03, 0x52, 0x50, 0x43, 0x12, 0x49, 0x0a, 0x0d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, + 0x65, 0x2e, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, + 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4b, 0x61, 0x73, 0x70, + 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, + 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x61, + 0x73, 0x70, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -7445,7 +7290,7 @@ func file_messages_proto_rawDescGZIP() []byte { return file_messages_proto_rawDescData } -var file_messages_proto_msgTypes = make([]protoimpl.MessageInfo, 94) +var file_messages_proto_msgTypes = make([]protoimpl.MessageInfo, 92) var file_messages_proto_goTypes = []interface{}{ (*KaspadMessage)(nil), // 0: protowire.KaspadMessage (*RequestAddressesMessage)(nil), // 1: protowire.RequestAddressesMessage @@ -7466,81 +7311,79 @@ var file_messages_proto_goTypes = []interface{}{ (*RequestNextHeadersMessage)(nil), // 16: protowire.RequestNextHeadersMessage (*DoneHeadersMessage)(nil), // 17: protowire.DoneHeadersMessage (*RequestRelayBlocksMessage)(nil), // 18: protowire.RequestRelayBlocksMessage - (*RequestSelectedTipMessage)(nil), // 19: protowire.RequestSelectedTipMessage - (*RequestTransactionsMessage)(nil), // 20: protowire.RequestTransactionsMessage - (*TransactionNotFoundMessage)(nil), // 21: protowire.TransactionNotFoundMessage - (*InvRelayBlockMessage)(nil), // 22: protowire.InvRelayBlockMessage - (*InvTransactionsMessage)(nil), // 23: protowire.InvTransactionsMessage - (*PingMessage)(nil), // 24: protowire.PingMessage - (*PongMessage)(nil), // 25: protowire.PongMessage - (*SelectedTipMessage)(nil), // 26: protowire.SelectedTipMessage - (*VerackMessage)(nil), // 27: protowire.VerackMessage - (*VersionMessage)(nil), // 28: protowire.VersionMessage - (*RejectMessage)(nil), // 29: protowire.RejectMessage - (*RequestIBDRootUTXOSetAndBlockMessage)(nil), // 30: protowire.RequestIBDRootUTXOSetAndBlockMessage - (*IBDRootUTXOSetAndBlockMessage)(nil), // 31: protowire.IBDRootUTXOSetAndBlockMessage - (*RequestIBDBlocksMessage)(nil), // 32: protowire.RequestIBDBlocksMessage - (*IBDRootNotFoundMessage)(nil), // 33: protowire.IBDRootNotFoundMessage - (*RPCError)(nil), // 34: protowire.RPCError - (*GetCurrentNetworkRequestMessage)(nil), // 35: protowire.GetCurrentNetworkRequestMessage - (*GetCurrentNetworkResponseMessage)(nil), // 36: protowire.GetCurrentNetworkResponseMessage - (*SubmitBlockRequestMessage)(nil), // 37: protowire.SubmitBlockRequestMessage - (*SubmitBlockResponseMessage)(nil), // 38: protowire.SubmitBlockResponseMessage - (*GetBlockTemplateRequestMessage)(nil), // 39: protowire.GetBlockTemplateRequestMessage - (*GetBlockTemplateResponseMessage)(nil), // 40: protowire.GetBlockTemplateResponseMessage - (*NotifyBlockAddedRequestMessage)(nil), // 41: protowire.NotifyBlockAddedRequestMessage - (*NotifyBlockAddedResponseMessage)(nil), // 42: protowire.NotifyBlockAddedResponseMessage - (*BlockAddedNotificationMessage)(nil), // 43: protowire.BlockAddedNotificationMessage - (*GetPeerAddressesRequestMessage)(nil), // 44: protowire.GetPeerAddressesRequestMessage - (*GetPeerAddressesResponseMessage)(nil), // 45: protowire.GetPeerAddressesResponseMessage - (*GetPeerAddressesKnownAddressMessage)(nil), // 46: protowire.GetPeerAddressesKnownAddressMessage - (*GetSelectedTipHashRequestMessage)(nil), // 47: protowire.GetSelectedTipHashRequestMessage - (*GetSelectedTipHashResponseMessage)(nil), // 48: protowire.GetSelectedTipHashResponseMessage - (*MempoolEntry)(nil), // 49: protowire.MempoolEntry - (*GetMempoolEntryRequestMessage)(nil), // 50: protowire.GetMempoolEntryRequestMessage - (*GetMempoolEntryResponseMessage)(nil), // 51: protowire.GetMempoolEntryResponseMessage - (*GetMempoolEntriesRequestMessage)(nil), // 52: protowire.GetMempoolEntriesRequestMessage - (*GetMempoolEntriesResponseMessage)(nil), // 53: protowire.GetMempoolEntriesResponseMessage - (*GetConnectedPeerInfoRequestMessage)(nil), // 54: protowire.GetConnectedPeerInfoRequestMessage - (*GetConnectedPeerInfoResponseMessage)(nil), // 55: protowire.GetConnectedPeerInfoResponseMessage - (*GetConnectedPeerInfoMessage)(nil), // 56: protowire.GetConnectedPeerInfoMessage - (*AddPeerRequestMessage)(nil), // 57: protowire.AddPeerRequestMessage - (*AddPeerResponseMessage)(nil), // 58: protowire.AddPeerResponseMessage - (*SubmitTransactionRequestMessage)(nil), // 59: protowire.SubmitTransactionRequestMessage - (*SubmitTransactionResponseMessage)(nil), // 60: protowire.SubmitTransactionResponseMessage - (*NotifyChainChangedRequestMessage)(nil), // 61: protowire.NotifyChainChangedRequestMessage - (*NotifyChainChangedResponseMessage)(nil), // 62: protowire.NotifyChainChangedResponseMessage - (*ChainChangedNotificationMessage)(nil), // 63: protowire.ChainChangedNotificationMessage - (*ChainBlock)(nil), // 64: protowire.ChainBlock - (*AcceptedBlock)(nil), // 65: protowire.AcceptedBlock - (*GetBlockRequestMessage)(nil), // 66: protowire.GetBlockRequestMessage - (*GetBlockResponseMessage)(nil), // 67: protowire.GetBlockResponseMessage - (*BlockVerboseData)(nil), // 68: protowire.BlockVerboseData - (*TransactionVerboseData)(nil), // 69: protowire.TransactionVerboseData - (*TransactionVerboseInput)(nil), // 70: protowire.TransactionVerboseInput - (*ScriptSig)(nil), // 71: protowire.ScriptSig - (*TransactionVerboseOutput)(nil), // 72: protowire.TransactionVerboseOutput - (*ScriptPubKeyResult)(nil), // 73: protowire.ScriptPubKeyResult - (*GetSubnetworkRequestMessage)(nil), // 74: protowire.GetSubnetworkRequestMessage - (*GetSubnetworkResponseMessage)(nil), // 75: protowire.GetSubnetworkResponseMessage - (*GetChainFromBlockRequestMessage)(nil), // 76: protowire.GetChainFromBlockRequestMessage - (*GetChainFromBlockResponseMessage)(nil), // 77: protowire.GetChainFromBlockResponseMessage - (*GetBlocksRequestMessage)(nil), // 78: protowire.GetBlocksRequestMessage - (*GetBlocksResponseMessage)(nil), // 79: protowire.GetBlocksResponseMessage - (*GetBlockCountRequestMessage)(nil), // 80: protowire.GetBlockCountRequestMessage - (*GetBlockCountResponseMessage)(nil), // 81: protowire.GetBlockCountResponseMessage - (*GetBlockDagInfoRequestMessage)(nil), // 82: protowire.GetBlockDagInfoRequestMessage - (*GetBlockDagInfoResponseMessage)(nil), // 83: protowire.GetBlockDagInfoResponseMessage - (*ResolveFinalityConflictRequestMessage)(nil), // 84: protowire.ResolveFinalityConflictRequestMessage - (*ResolveFinalityConflictResponseMessage)(nil), // 85: protowire.ResolveFinalityConflictResponseMessage - (*NotifyFinalityConflictsRequestMessage)(nil), // 86: protowire.NotifyFinalityConflictsRequestMessage - (*NotifyFinalityConflictsResponseMessage)(nil), // 87: protowire.NotifyFinalityConflictsResponseMessage - (*FinalityConflictNotificationMessage)(nil), // 88: protowire.FinalityConflictNotificationMessage - (*FinalityConflictResolvedNotificationMessage)(nil), // 89: protowire.FinalityConflictResolvedNotificationMessage - (*ShutDownRequestMessage)(nil), // 90: protowire.ShutDownRequestMessage - (*ShutDownResponseMessage)(nil), // 91: protowire.ShutDownResponseMessage - (*GetHeadersRequestMessage)(nil), // 92: protowire.GetHeadersRequestMessage - (*GetHeadersResponseMessage)(nil), // 93: protowire.GetHeadersResponseMessage + (*RequestTransactionsMessage)(nil), // 19: protowire.RequestTransactionsMessage + (*TransactionNotFoundMessage)(nil), // 20: protowire.TransactionNotFoundMessage + (*InvRelayBlockMessage)(nil), // 21: protowire.InvRelayBlockMessage + (*InvTransactionsMessage)(nil), // 22: protowire.InvTransactionsMessage + (*PingMessage)(nil), // 23: protowire.PingMessage + (*PongMessage)(nil), // 24: protowire.PongMessage + (*VerackMessage)(nil), // 25: protowire.VerackMessage + (*VersionMessage)(nil), // 26: protowire.VersionMessage + (*RejectMessage)(nil), // 27: protowire.RejectMessage + (*RequestIBDRootUTXOSetAndBlockMessage)(nil), // 28: protowire.RequestIBDRootUTXOSetAndBlockMessage + (*IBDRootUTXOSetAndBlockMessage)(nil), // 29: protowire.IBDRootUTXOSetAndBlockMessage + (*RequestIBDBlocksMessage)(nil), // 30: protowire.RequestIBDBlocksMessage + (*IBDRootNotFoundMessage)(nil), // 31: protowire.IBDRootNotFoundMessage + (*RPCError)(nil), // 32: protowire.RPCError + (*GetCurrentNetworkRequestMessage)(nil), // 33: protowire.GetCurrentNetworkRequestMessage + (*GetCurrentNetworkResponseMessage)(nil), // 34: protowire.GetCurrentNetworkResponseMessage + (*SubmitBlockRequestMessage)(nil), // 35: protowire.SubmitBlockRequestMessage + (*SubmitBlockResponseMessage)(nil), // 36: protowire.SubmitBlockResponseMessage + (*GetBlockTemplateRequestMessage)(nil), // 37: protowire.GetBlockTemplateRequestMessage + (*GetBlockTemplateResponseMessage)(nil), // 38: protowire.GetBlockTemplateResponseMessage + (*NotifyBlockAddedRequestMessage)(nil), // 39: protowire.NotifyBlockAddedRequestMessage + (*NotifyBlockAddedResponseMessage)(nil), // 40: protowire.NotifyBlockAddedResponseMessage + (*BlockAddedNotificationMessage)(nil), // 41: protowire.BlockAddedNotificationMessage + (*GetPeerAddressesRequestMessage)(nil), // 42: protowire.GetPeerAddressesRequestMessage + (*GetPeerAddressesResponseMessage)(nil), // 43: protowire.GetPeerAddressesResponseMessage + (*GetPeerAddressesKnownAddressMessage)(nil), // 44: protowire.GetPeerAddressesKnownAddressMessage + (*GetSelectedTipHashRequestMessage)(nil), // 45: protowire.GetSelectedTipHashRequestMessage + (*GetSelectedTipHashResponseMessage)(nil), // 46: protowire.GetSelectedTipHashResponseMessage + (*MempoolEntry)(nil), // 47: protowire.MempoolEntry + (*GetMempoolEntryRequestMessage)(nil), // 48: protowire.GetMempoolEntryRequestMessage + (*GetMempoolEntryResponseMessage)(nil), // 49: protowire.GetMempoolEntryResponseMessage + (*GetMempoolEntriesRequestMessage)(nil), // 50: protowire.GetMempoolEntriesRequestMessage + (*GetMempoolEntriesResponseMessage)(nil), // 51: protowire.GetMempoolEntriesResponseMessage + (*GetConnectedPeerInfoRequestMessage)(nil), // 52: protowire.GetConnectedPeerInfoRequestMessage + (*GetConnectedPeerInfoResponseMessage)(nil), // 53: protowire.GetConnectedPeerInfoResponseMessage + (*GetConnectedPeerInfoMessage)(nil), // 54: protowire.GetConnectedPeerInfoMessage + (*AddPeerRequestMessage)(nil), // 55: protowire.AddPeerRequestMessage + (*AddPeerResponseMessage)(nil), // 56: protowire.AddPeerResponseMessage + (*SubmitTransactionRequestMessage)(nil), // 57: protowire.SubmitTransactionRequestMessage + (*SubmitTransactionResponseMessage)(nil), // 58: protowire.SubmitTransactionResponseMessage + (*NotifyChainChangedRequestMessage)(nil), // 59: protowire.NotifyChainChangedRequestMessage + (*NotifyChainChangedResponseMessage)(nil), // 60: protowire.NotifyChainChangedResponseMessage + (*ChainChangedNotificationMessage)(nil), // 61: protowire.ChainChangedNotificationMessage + (*ChainBlock)(nil), // 62: protowire.ChainBlock + (*AcceptedBlock)(nil), // 63: protowire.AcceptedBlock + (*GetBlockRequestMessage)(nil), // 64: protowire.GetBlockRequestMessage + (*GetBlockResponseMessage)(nil), // 65: protowire.GetBlockResponseMessage + (*BlockVerboseData)(nil), // 66: protowire.BlockVerboseData + (*TransactionVerboseData)(nil), // 67: protowire.TransactionVerboseData + (*TransactionVerboseInput)(nil), // 68: protowire.TransactionVerboseInput + (*ScriptSig)(nil), // 69: protowire.ScriptSig + (*TransactionVerboseOutput)(nil), // 70: protowire.TransactionVerboseOutput + (*ScriptPubKeyResult)(nil), // 71: protowire.ScriptPubKeyResult + (*GetSubnetworkRequestMessage)(nil), // 72: protowire.GetSubnetworkRequestMessage + (*GetSubnetworkResponseMessage)(nil), // 73: protowire.GetSubnetworkResponseMessage + (*GetChainFromBlockRequestMessage)(nil), // 74: protowire.GetChainFromBlockRequestMessage + (*GetChainFromBlockResponseMessage)(nil), // 75: protowire.GetChainFromBlockResponseMessage + (*GetBlocksRequestMessage)(nil), // 76: protowire.GetBlocksRequestMessage + (*GetBlocksResponseMessage)(nil), // 77: protowire.GetBlocksResponseMessage + (*GetBlockCountRequestMessage)(nil), // 78: protowire.GetBlockCountRequestMessage + (*GetBlockCountResponseMessage)(nil), // 79: protowire.GetBlockCountResponseMessage + (*GetBlockDagInfoRequestMessage)(nil), // 80: protowire.GetBlockDagInfoRequestMessage + (*GetBlockDagInfoResponseMessage)(nil), // 81: protowire.GetBlockDagInfoResponseMessage + (*ResolveFinalityConflictRequestMessage)(nil), // 82: protowire.ResolveFinalityConflictRequestMessage + (*ResolveFinalityConflictResponseMessage)(nil), // 83: protowire.ResolveFinalityConflictResponseMessage + (*NotifyFinalityConflictsRequestMessage)(nil), // 84: protowire.NotifyFinalityConflictsRequestMessage + (*NotifyFinalityConflictsResponseMessage)(nil), // 85: protowire.NotifyFinalityConflictsResponseMessage + (*FinalityConflictNotificationMessage)(nil), // 86: protowire.FinalityConflictNotificationMessage + (*FinalityConflictResolvedNotificationMessage)(nil), // 87: protowire.FinalityConflictResolvedNotificationMessage + (*ShutDownRequestMessage)(nil), // 88: protowire.ShutDownRequestMessage + (*ShutDownResponseMessage)(nil), // 89: protowire.ShutDownResponseMessage + (*GetHeadersRequestMessage)(nil), // 90: protowire.GetHeadersRequestMessage + (*GetHeadersResponseMessage)(nil), // 91: protowire.GetHeadersResponseMessage } var file_messages_proto_depIdxs = []int32{ 2, // 0: protowire.KaspadMessage.addresses:type_name -> protowire.AddressesMessage @@ -7553,154 +7396,150 @@ var file_messages_proto_depIdxs = []int32{ 16, // 7: protowire.KaspadMessage.requestNextHeaders:type_name -> protowire.RequestNextHeadersMessage 17, // 8: protowire.KaspadMessage.DoneHeaders:type_name -> protowire.DoneHeadersMessage 18, // 9: protowire.KaspadMessage.requestRelayBlocks:type_name -> protowire.RequestRelayBlocksMessage - 19, // 10: protowire.KaspadMessage.requestSelectedTip:type_name -> protowire.RequestSelectedTipMessage - 20, // 11: protowire.KaspadMessage.requestTransactions:type_name -> protowire.RequestTransactionsMessage - 10, // 12: protowire.KaspadMessage.ibdBlock:type_name -> protowire.BlockMessage - 22, // 13: protowire.KaspadMessage.invRelayBlock:type_name -> protowire.InvRelayBlockMessage - 23, // 14: protowire.KaspadMessage.invTransactions:type_name -> protowire.InvTransactionsMessage - 24, // 15: protowire.KaspadMessage.ping:type_name -> protowire.PingMessage - 25, // 16: protowire.KaspadMessage.pong:type_name -> protowire.PongMessage - 26, // 17: protowire.KaspadMessage.selectedTip:type_name -> protowire.SelectedTipMessage - 27, // 18: protowire.KaspadMessage.verack:type_name -> protowire.VerackMessage - 28, // 19: protowire.KaspadMessage.version:type_name -> protowire.VersionMessage - 21, // 20: protowire.KaspadMessage.transactionNotFound:type_name -> protowire.TransactionNotFoundMessage - 29, // 21: protowire.KaspadMessage.reject:type_name -> protowire.RejectMessage - 11, // 22: protowire.KaspadMessage.blockHeader:type_name -> protowire.BlockHeaderMessage - 30, // 23: protowire.KaspadMessage.requestIBDRootUTXOSetAndBlock:type_name -> protowire.RequestIBDRootUTXOSetAndBlockMessage - 31, // 24: protowire.KaspadMessage.ibdRootUTXOSetAndBlock:type_name -> protowire.IBDRootUTXOSetAndBlockMessage - 32, // 25: protowire.KaspadMessage.requestIBDBlocks:type_name -> protowire.RequestIBDBlocksMessage - 33, // 26: protowire.KaspadMessage.ibdRootNotFound:type_name -> protowire.IBDRootNotFoundMessage - 35, // 27: protowire.KaspadMessage.getCurrentNetworkRequest:type_name -> protowire.GetCurrentNetworkRequestMessage - 36, // 28: protowire.KaspadMessage.getCurrentNetworkResponse:type_name -> protowire.GetCurrentNetworkResponseMessage - 37, // 29: protowire.KaspadMessage.submitBlockRequest:type_name -> protowire.SubmitBlockRequestMessage - 38, // 30: protowire.KaspadMessage.submitBlockResponse:type_name -> protowire.SubmitBlockResponseMessage - 39, // 31: protowire.KaspadMessage.getBlockTemplateRequest:type_name -> protowire.GetBlockTemplateRequestMessage - 40, // 32: protowire.KaspadMessage.getBlockTemplateResponse:type_name -> protowire.GetBlockTemplateResponseMessage - 41, // 33: protowire.KaspadMessage.notifyBlockAddedRequest:type_name -> protowire.NotifyBlockAddedRequestMessage - 42, // 34: protowire.KaspadMessage.notifyBlockAddedResponse:type_name -> protowire.NotifyBlockAddedResponseMessage - 43, // 35: protowire.KaspadMessage.blockAddedNotification:type_name -> protowire.BlockAddedNotificationMessage - 44, // 36: protowire.KaspadMessage.getPeerAddressesRequest:type_name -> protowire.GetPeerAddressesRequestMessage - 45, // 37: protowire.KaspadMessage.getPeerAddressesResponse:type_name -> protowire.GetPeerAddressesResponseMessage - 47, // 38: protowire.KaspadMessage.getSelectedTipHashRequest:type_name -> protowire.GetSelectedTipHashRequestMessage - 48, // 39: protowire.KaspadMessage.getSelectedTipHashResponse:type_name -> protowire.GetSelectedTipHashResponseMessage - 50, // 40: protowire.KaspadMessage.getMempoolEntryRequest:type_name -> protowire.GetMempoolEntryRequestMessage - 51, // 41: protowire.KaspadMessage.getMempoolEntryResponse:type_name -> protowire.GetMempoolEntryResponseMessage - 54, // 42: protowire.KaspadMessage.getConnectedPeerInfoRequest:type_name -> protowire.GetConnectedPeerInfoRequestMessage - 55, // 43: protowire.KaspadMessage.getConnectedPeerInfoResponse:type_name -> protowire.GetConnectedPeerInfoResponseMessage - 57, // 44: protowire.KaspadMessage.addPeerRequest:type_name -> protowire.AddPeerRequestMessage - 58, // 45: protowire.KaspadMessage.addPeerResponse:type_name -> protowire.AddPeerResponseMessage - 59, // 46: protowire.KaspadMessage.submitTransactionRequest:type_name -> protowire.SubmitTransactionRequestMessage - 60, // 47: protowire.KaspadMessage.submitTransactionResponse:type_name -> protowire.SubmitTransactionResponseMessage - 61, // 48: protowire.KaspadMessage.notifyChainChangedRequest:type_name -> protowire.NotifyChainChangedRequestMessage - 62, // 49: protowire.KaspadMessage.notifyChainChangedResponse:type_name -> protowire.NotifyChainChangedResponseMessage - 63, // 50: protowire.KaspadMessage.chainChangedNotification:type_name -> protowire.ChainChangedNotificationMessage - 66, // 51: protowire.KaspadMessage.getBlockRequest:type_name -> protowire.GetBlockRequestMessage - 67, // 52: protowire.KaspadMessage.getBlockResponse:type_name -> protowire.GetBlockResponseMessage - 74, // 53: protowire.KaspadMessage.getSubnetworkRequest:type_name -> protowire.GetSubnetworkRequestMessage - 75, // 54: protowire.KaspadMessage.getSubnetworkResponse:type_name -> protowire.GetSubnetworkResponseMessage - 76, // 55: protowire.KaspadMessage.getChainFromBlockRequest:type_name -> protowire.GetChainFromBlockRequestMessage - 77, // 56: protowire.KaspadMessage.getChainFromBlockResponse:type_name -> protowire.GetChainFromBlockResponseMessage - 78, // 57: protowire.KaspadMessage.getBlocksRequest:type_name -> protowire.GetBlocksRequestMessage - 79, // 58: protowire.KaspadMessage.getBlocksResponse:type_name -> protowire.GetBlocksResponseMessage - 80, // 59: protowire.KaspadMessage.getBlockCountRequest:type_name -> protowire.GetBlockCountRequestMessage - 81, // 60: protowire.KaspadMessage.getBlockCountResponse:type_name -> protowire.GetBlockCountResponseMessage - 82, // 61: protowire.KaspadMessage.getBlockDagInfoRequest:type_name -> protowire.GetBlockDagInfoRequestMessage - 83, // 62: protowire.KaspadMessage.getBlockDagInfoResponse:type_name -> protowire.GetBlockDagInfoResponseMessage - 84, // 63: protowire.KaspadMessage.resolveFinalityConflictRequest:type_name -> protowire.ResolveFinalityConflictRequestMessage - 85, // 64: protowire.KaspadMessage.resolveFinalityConflictResponse:type_name -> protowire.ResolveFinalityConflictResponseMessage - 86, // 65: protowire.KaspadMessage.notifyFinalityConflictsRequest:type_name -> protowire.NotifyFinalityConflictsRequestMessage - 87, // 66: protowire.KaspadMessage.notifyFinalityConflictsResponse:type_name -> protowire.NotifyFinalityConflictsResponseMessage - 88, // 67: protowire.KaspadMessage.finalityConflictNotification:type_name -> protowire.FinalityConflictNotificationMessage - 89, // 68: protowire.KaspadMessage.finalityConflictResolvedNotification:type_name -> protowire.FinalityConflictResolvedNotificationMessage - 52, // 69: protowire.KaspadMessage.getMempoolEntriesRequest:type_name -> protowire.GetMempoolEntriesRequestMessage - 53, // 70: protowire.KaspadMessage.getMempoolEntriesResponse:type_name -> protowire.GetMempoolEntriesResponseMessage - 90, // 71: protowire.KaspadMessage.shutDownRequest:type_name -> protowire.ShutDownRequestMessage - 91, // 72: protowire.KaspadMessage.shutDownResponse:type_name -> protowire.ShutDownResponseMessage - 92, // 73: protowire.KaspadMessage.getHeadersRequest:type_name -> protowire.GetHeadersRequestMessage - 93, // 74: protowire.KaspadMessage.getHeadersResponse:type_name -> protowire.GetHeadersResponseMessage - 4, // 75: protowire.RequestAddressesMessage.subnetworkId:type_name -> protowire.SubnetworkId - 3, // 76: protowire.AddressesMessage.addressList:type_name -> protowire.NetAddress - 6, // 77: protowire.TransactionMessage.inputs:type_name -> protowire.TransactionInput - 9, // 78: protowire.TransactionMessage.outputs:type_name -> protowire.TransactionOutput - 4, // 79: protowire.TransactionMessage.subnetworkId:type_name -> protowire.SubnetworkId - 12, // 80: protowire.TransactionMessage.payloadHash:type_name -> protowire.Hash - 7, // 81: protowire.TransactionInput.previousOutpoint:type_name -> protowire.Outpoint - 8, // 82: protowire.Outpoint.transactionId:type_name -> protowire.TransactionId - 11, // 83: protowire.BlockMessage.header:type_name -> protowire.BlockHeaderMessage - 5, // 84: protowire.BlockMessage.transactions:type_name -> protowire.TransactionMessage - 12, // 85: protowire.BlockHeaderMessage.parentHashes:type_name -> protowire.Hash - 12, // 86: protowire.BlockHeaderMessage.hashMerkleRoot:type_name -> protowire.Hash - 12, // 87: protowire.BlockHeaderMessage.acceptedIdMerkleRoot:type_name -> protowire.Hash - 12, // 88: protowire.BlockHeaderMessage.utxoCommitment:type_name -> protowire.Hash - 12, // 89: protowire.RequestBlockLocatorMessage.lowHash:type_name -> protowire.Hash - 12, // 90: protowire.RequestBlockLocatorMessage.highHash:type_name -> protowire.Hash - 12, // 91: protowire.BlockLocatorMessage.hashes:type_name -> protowire.Hash - 12, // 92: protowire.RequestHeadersMessage.lowHash:type_name -> protowire.Hash - 12, // 93: protowire.RequestHeadersMessage.highHash:type_name -> protowire.Hash - 12, // 94: protowire.RequestRelayBlocksMessage.hashes:type_name -> protowire.Hash - 8, // 95: protowire.RequestTransactionsMessage.ids:type_name -> protowire.TransactionId - 8, // 96: protowire.TransactionNotFoundMessage.id:type_name -> protowire.TransactionId - 12, // 97: protowire.InvRelayBlockMessage.hash:type_name -> protowire.Hash - 8, // 98: protowire.InvTransactionsMessage.ids:type_name -> protowire.TransactionId - 12, // 99: protowire.SelectedTipMessage.selectedTipHash:type_name -> protowire.Hash - 3, // 100: protowire.VersionMessage.address:type_name -> protowire.NetAddress - 12, // 101: protowire.VersionMessage.selectedTipHash:type_name -> protowire.Hash - 4, // 102: protowire.VersionMessage.subnetworkId:type_name -> protowire.SubnetworkId - 12, // 103: protowire.RequestIBDRootUTXOSetAndBlockMessage.ibdRoot:type_name -> protowire.Hash - 10, // 104: protowire.IBDRootUTXOSetAndBlockMessage.block:type_name -> protowire.BlockMessage - 12, // 105: protowire.RequestIBDBlocksMessage.hashes:type_name -> protowire.Hash - 34, // 106: protowire.GetCurrentNetworkResponseMessage.error:type_name -> protowire.RPCError - 10, // 107: protowire.SubmitBlockRequestMessage.block:type_name -> protowire.BlockMessage - 34, // 108: protowire.SubmitBlockResponseMessage.error:type_name -> protowire.RPCError - 10, // 109: protowire.GetBlockTemplateResponseMessage.blockMessage:type_name -> protowire.BlockMessage - 34, // 110: protowire.GetBlockTemplateResponseMessage.error:type_name -> protowire.RPCError - 34, // 111: protowire.NotifyBlockAddedResponseMessage.error:type_name -> protowire.RPCError - 10, // 112: protowire.BlockAddedNotificationMessage.block:type_name -> protowire.BlockMessage - 46, // 113: protowire.GetPeerAddressesResponseMessage.addresses:type_name -> protowire.GetPeerAddressesKnownAddressMessage - 46, // 114: protowire.GetPeerAddressesResponseMessage.bannedAddresses:type_name -> protowire.GetPeerAddressesKnownAddressMessage - 34, // 115: protowire.GetPeerAddressesResponseMessage.error:type_name -> protowire.RPCError - 34, // 116: protowire.GetSelectedTipHashResponseMessage.error:type_name -> protowire.RPCError - 69, // 117: protowire.MempoolEntry.transactionVerboseData:type_name -> protowire.TransactionVerboseData - 49, // 118: protowire.GetMempoolEntryResponseMessage.entry:type_name -> protowire.MempoolEntry - 34, // 119: protowire.GetMempoolEntryResponseMessage.error:type_name -> protowire.RPCError - 49, // 120: protowire.GetMempoolEntriesResponseMessage.entries:type_name -> protowire.MempoolEntry - 34, // 121: protowire.GetMempoolEntriesResponseMessage.error:type_name -> protowire.RPCError - 56, // 122: protowire.GetConnectedPeerInfoResponseMessage.infos:type_name -> protowire.GetConnectedPeerInfoMessage - 34, // 123: protowire.GetConnectedPeerInfoResponseMessage.error:type_name -> protowire.RPCError - 34, // 124: protowire.AddPeerResponseMessage.error:type_name -> protowire.RPCError - 5, // 125: protowire.SubmitTransactionRequestMessage.transaction:type_name -> protowire.TransactionMessage - 34, // 126: protowire.SubmitTransactionResponseMessage.error:type_name -> protowire.RPCError - 34, // 127: protowire.NotifyChainChangedResponseMessage.error:type_name -> protowire.RPCError - 64, // 128: protowire.ChainChangedNotificationMessage.addedChainBlocks:type_name -> protowire.ChainBlock - 65, // 129: protowire.ChainBlock.acceptedBlocks:type_name -> protowire.AcceptedBlock - 68, // 130: protowire.GetBlockResponseMessage.blockVerboseData:type_name -> protowire.BlockVerboseData - 34, // 131: protowire.GetBlockResponseMessage.error:type_name -> protowire.RPCError - 69, // 132: protowire.BlockVerboseData.transactionVerboseData:type_name -> protowire.TransactionVerboseData - 70, // 133: protowire.TransactionVerboseData.transactionVerboseInputs:type_name -> protowire.TransactionVerboseInput - 72, // 134: protowire.TransactionVerboseData.transactionVerboseOutputs:type_name -> protowire.TransactionVerboseOutput - 71, // 135: protowire.TransactionVerboseInput.scriptSig:type_name -> protowire.ScriptSig - 73, // 136: protowire.TransactionVerboseOutput.scriptPubKey:type_name -> protowire.ScriptPubKeyResult - 34, // 137: protowire.GetSubnetworkResponseMessage.error:type_name -> protowire.RPCError - 64, // 138: protowire.GetChainFromBlockResponseMessage.addedChainBlocks:type_name -> protowire.ChainBlock - 68, // 139: protowire.GetChainFromBlockResponseMessage.blockVerboseData:type_name -> protowire.BlockVerboseData - 34, // 140: protowire.GetChainFromBlockResponseMessage.error:type_name -> protowire.RPCError - 68, // 141: protowire.GetBlocksResponseMessage.blockVerboseData:type_name -> protowire.BlockVerboseData - 34, // 142: protowire.GetBlocksResponseMessage.error:type_name -> protowire.RPCError - 34, // 143: protowire.GetBlockCountResponseMessage.error:type_name -> protowire.RPCError - 34, // 144: protowire.GetBlockDagInfoResponseMessage.error:type_name -> protowire.RPCError - 34, // 145: protowire.ResolveFinalityConflictResponseMessage.error:type_name -> protowire.RPCError - 34, // 146: protowire.NotifyFinalityConflictsResponseMessage.error:type_name -> protowire.RPCError - 34, // 147: protowire.ShutDownResponseMessage.error:type_name -> protowire.RPCError - 34, // 148: protowire.GetHeadersResponseMessage.error:type_name -> protowire.RPCError - 0, // 149: protowire.P2P.MessageStream:input_type -> protowire.KaspadMessage - 0, // 150: protowire.RPC.MessageStream:input_type -> protowire.KaspadMessage - 0, // 151: protowire.P2P.MessageStream:output_type -> protowire.KaspadMessage - 0, // 152: protowire.RPC.MessageStream:output_type -> protowire.KaspadMessage - 151, // [151:153] is the sub-list for method output_type - 149, // [149:151] is the sub-list for method input_type - 149, // [149:149] is the sub-list for extension type_name - 149, // [149:149] is the sub-list for extension extendee - 0, // [0:149] is the sub-list for field type_name + 19, // 10: protowire.KaspadMessage.requestTransactions:type_name -> protowire.RequestTransactionsMessage + 10, // 11: protowire.KaspadMessage.ibdBlock:type_name -> protowire.BlockMessage + 21, // 12: protowire.KaspadMessage.invRelayBlock:type_name -> protowire.InvRelayBlockMessage + 22, // 13: protowire.KaspadMessage.invTransactions:type_name -> protowire.InvTransactionsMessage + 23, // 14: protowire.KaspadMessage.ping:type_name -> protowire.PingMessage + 24, // 15: protowire.KaspadMessage.pong:type_name -> protowire.PongMessage + 25, // 16: protowire.KaspadMessage.verack:type_name -> protowire.VerackMessage + 26, // 17: protowire.KaspadMessage.version:type_name -> protowire.VersionMessage + 20, // 18: protowire.KaspadMessage.transactionNotFound:type_name -> protowire.TransactionNotFoundMessage + 27, // 19: protowire.KaspadMessage.reject:type_name -> protowire.RejectMessage + 11, // 20: protowire.KaspadMessage.blockHeader:type_name -> protowire.BlockHeaderMessage + 28, // 21: protowire.KaspadMessage.requestIBDRootUTXOSetAndBlock:type_name -> protowire.RequestIBDRootUTXOSetAndBlockMessage + 29, // 22: protowire.KaspadMessage.ibdRootUTXOSetAndBlock:type_name -> protowire.IBDRootUTXOSetAndBlockMessage + 30, // 23: protowire.KaspadMessage.requestIBDBlocks:type_name -> protowire.RequestIBDBlocksMessage + 31, // 24: protowire.KaspadMessage.ibdRootNotFound:type_name -> protowire.IBDRootNotFoundMessage + 33, // 25: protowire.KaspadMessage.getCurrentNetworkRequest:type_name -> protowire.GetCurrentNetworkRequestMessage + 34, // 26: protowire.KaspadMessage.getCurrentNetworkResponse:type_name -> protowire.GetCurrentNetworkResponseMessage + 35, // 27: protowire.KaspadMessage.submitBlockRequest:type_name -> protowire.SubmitBlockRequestMessage + 36, // 28: protowire.KaspadMessage.submitBlockResponse:type_name -> protowire.SubmitBlockResponseMessage + 37, // 29: protowire.KaspadMessage.getBlockTemplateRequest:type_name -> protowire.GetBlockTemplateRequestMessage + 38, // 30: protowire.KaspadMessage.getBlockTemplateResponse:type_name -> protowire.GetBlockTemplateResponseMessage + 39, // 31: protowire.KaspadMessage.notifyBlockAddedRequest:type_name -> protowire.NotifyBlockAddedRequestMessage + 40, // 32: protowire.KaspadMessage.notifyBlockAddedResponse:type_name -> protowire.NotifyBlockAddedResponseMessage + 41, // 33: protowire.KaspadMessage.blockAddedNotification:type_name -> protowire.BlockAddedNotificationMessage + 42, // 34: protowire.KaspadMessage.getPeerAddressesRequest:type_name -> protowire.GetPeerAddressesRequestMessage + 43, // 35: protowire.KaspadMessage.getPeerAddressesResponse:type_name -> protowire.GetPeerAddressesResponseMessage + 45, // 36: protowire.KaspadMessage.getSelectedTipHashRequest:type_name -> protowire.GetSelectedTipHashRequestMessage + 46, // 37: protowire.KaspadMessage.getSelectedTipHashResponse:type_name -> protowire.GetSelectedTipHashResponseMessage + 48, // 38: protowire.KaspadMessage.getMempoolEntryRequest:type_name -> protowire.GetMempoolEntryRequestMessage + 49, // 39: protowire.KaspadMessage.getMempoolEntryResponse:type_name -> protowire.GetMempoolEntryResponseMessage + 52, // 40: protowire.KaspadMessage.getConnectedPeerInfoRequest:type_name -> protowire.GetConnectedPeerInfoRequestMessage + 53, // 41: protowire.KaspadMessage.getConnectedPeerInfoResponse:type_name -> protowire.GetConnectedPeerInfoResponseMessage + 55, // 42: protowire.KaspadMessage.addPeerRequest:type_name -> protowire.AddPeerRequestMessage + 56, // 43: protowire.KaspadMessage.addPeerResponse:type_name -> protowire.AddPeerResponseMessage + 57, // 44: protowire.KaspadMessage.submitTransactionRequest:type_name -> protowire.SubmitTransactionRequestMessage + 58, // 45: protowire.KaspadMessage.submitTransactionResponse:type_name -> protowire.SubmitTransactionResponseMessage + 59, // 46: protowire.KaspadMessage.notifyChainChangedRequest:type_name -> protowire.NotifyChainChangedRequestMessage + 60, // 47: protowire.KaspadMessage.notifyChainChangedResponse:type_name -> protowire.NotifyChainChangedResponseMessage + 61, // 48: protowire.KaspadMessage.chainChangedNotification:type_name -> protowire.ChainChangedNotificationMessage + 64, // 49: protowire.KaspadMessage.getBlockRequest:type_name -> protowire.GetBlockRequestMessage + 65, // 50: protowire.KaspadMessage.getBlockResponse:type_name -> protowire.GetBlockResponseMessage + 72, // 51: protowire.KaspadMessage.getSubnetworkRequest:type_name -> protowire.GetSubnetworkRequestMessage + 73, // 52: protowire.KaspadMessage.getSubnetworkResponse:type_name -> protowire.GetSubnetworkResponseMessage + 74, // 53: protowire.KaspadMessage.getChainFromBlockRequest:type_name -> protowire.GetChainFromBlockRequestMessage + 75, // 54: protowire.KaspadMessage.getChainFromBlockResponse:type_name -> protowire.GetChainFromBlockResponseMessage + 76, // 55: protowire.KaspadMessage.getBlocksRequest:type_name -> protowire.GetBlocksRequestMessage + 77, // 56: protowire.KaspadMessage.getBlocksResponse:type_name -> protowire.GetBlocksResponseMessage + 78, // 57: protowire.KaspadMessage.getBlockCountRequest:type_name -> protowire.GetBlockCountRequestMessage + 79, // 58: protowire.KaspadMessage.getBlockCountResponse:type_name -> protowire.GetBlockCountResponseMessage + 80, // 59: protowire.KaspadMessage.getBlockDagInfoRequest:type_name -> protowire.GetBlockDagInfoRequestMessage + 81, // 60: protowire.KaspadMessage.getBlockDagInfoResponse:type_name -> protowire.GetBlockDagInfoResponseMessage + 82, // 61: protowire.KaspadMessage.resolveFinalityConflictRequest:type_name -> protowire.ResolveFinalityConflictRequestMessage + 83, // 62: protowire.KaspadMessage.resolveFinalityConflictResponse:type_name -> protowire.ResolveFinalityConflictResponseMessage + 84, // 63: protowire.KaspadMessage.notifyFinalityConflictsRequest:type_name -> protowire.NotifyFinalityConflictsRequestMessage + 85, // 64: protowire.KaspadMessage.notifyFinalityConflictsResponse:type_name -> protowire.NotifyFinalityConflictsResponseMessage + 86, // 65: protowire.KaspadMessage.finalityConflictNotification:type_name -> protowire.FinalityConflictNotificationMessage + 87, // 66: protowire.KaspadMessage.finalityConflictResolvedNotification:type_name -> protowire.FinalityConflictResolvedNotificationMessage + 50, // 67: protowire.KaspadMessage.getMempoolEntriesRequest:type_name -> protowire.GetMempoolEntriesRequestMessage + 51, // 68: protowire.KaspadMessage.getMempoolEntriesResponse:type_name -> protowire.GetMempoolEntriesResponseMessage + 88, // 69: protowire.KaspadMessage.shutDownRequest:type_name -> protowire.ShutDownRequestMessage + 89, // 70: protowire.KaspadMessage.shutDownResponse:type_name -> protowire.ShutDownResponseMessage + 90, // 71: protowire.KaspadMessage.getHeadersRequest:type_name -> protowire.GetHeadersRequestMessage + 91, // 72: protowire.KaspadMessage.getHeadersResponse:type_name -> protowire.GetHeadersResponseMessage + 4, // 73: protowire.RequestAddressesMessage.subnetworkId:type_name -> protowire.SubnetworkId + 3, // 74: protowire.AddressesMessage.addressList:type_name -> protowire.NetAddress + 6, // 75: protowire.TransactionMessage.inputs:type_name -> protowire.TransactionInput + 9, // 76: protowire.TransactionMessage.outputs:type_name -> protowire.TransactionOutput + 4, // 77: protowire.TransactionMessage.subnetworkId:type_name -> protowire.SubnetworkId + 12, // 78: protowire.TransactionMessage.payloadHash:type_name -> protowire.Hash + 7, // 79: protowire.TransactionInput.previousOutpoint:type_name -> protowire.Outpoint + 8, // 80: protowire.Outpoint.transactionId:type_name -> protowire.TransactionId + 11, // 81: protowire.BlockMessage.header:type_name -> protowire.BlockHeaderMessage + 5, // 82: protowire.BlockMessage.transactions:type_name -> protowire.TransactionMessage + 12, // 83: protowire.BlockHeaderMessage.parentHashes:type_name -> protowire.Hash + 12, // 84: protowire.BlockHeaderMessage.hashMerkleRoot:type_name -> protowire.Hash + 12, // 85: protowire.BlockHeaderMessage.acceptedIdMerkleRoot:type_name -> protowire.Hash + 12, // 86: protowire.BlockHeaderMessage.utxoCommitment:type_name -> protowire.Hash + 12, // 87: protowire.RequestBlockLocatorMessage.lowHash:type_name -> protowire.Hash + 12, // 88: protowire.RequestBlockLocatorMessage.highHash:type_name -> protowire.Hash + 12, // 89: protowire.BlockLocatorMessage.hashes:type_name -> protowire.Hash + 12, // 90: protowire.RequestHeadersMessage.lowHash:type_name -> protowire.Hash + 12, // 91: protowire.RequestHeadersMessage.highHash:type_name -> protowire.Hash + 12, // 92: protowire.RequestRelayBlocksMessage.hashes:type_name -> protowire.Hash + 8, // 93: protowire.RequestTransactionsMessage.ids:type_name -> protowire.TransactionId + 8, // 94: protowire.TransactionNotFoundMessage.id:type_name -> protowire.TransactionId + 12, // 95: protowire.InvRelayBlockMessage.hash:type_name -> protowire.Hash + 8, // 96: protowire.InvTransactionsMessage.ids:type_name -> protowire.TransactionId + 3, // 97: protowire.VersionMessage.address:type_name -> protowire.NetAddress + 4, // 98: protowire.VersionMessage.subnetworkId:type_name -> protowire.SubnetworkId + 12, // 99: protowire.RequestIBDRootUTXOSetAndBlockMessage.ibdRoot:type_name -> protowire.Hash + 10, // 100: protowire.IBDRootUTXOSetAndBlockMessage.block:type_name -> protowire.BlockMessage + 12, // 101: protowire.RequestIBDBlocksMessage.hashes:type_name -> protowire.Hash + 32, // 102: protowire.GetCurrentNetworkResponseMessage.error:type_name -> protowire.RPCError + 10, // 103: protowire.SubmitBlockRequestMessage.block:type_name -> protowire.BlockMessage + 32, // 104: protowire.SubmitBlockResponseMessage.error:type_name -> protowire.RPCError + 10, // 105: protowire.GetBlockTemplateResponseMessage.blockMessage:type_name -> protowire.BlockMessage + 32, // 106: protowire.GetBlockTemplateResponseMessage.error:type_name -> protowire.RPCError + 32, // 107: protowire.NotifyBlockAddedResponseMessage.error:type_name -> protowire.RPCError + 10, // 108: protowire.BlockAddedNotificationMessage.block:type_name -> protowire.BlockMessage + 44, // 109: protowire.GetPeerAddressesResponseMessage.addresses:type_name -> protowire.GetPeerAddressesKnownAddressMessage + 44, // 110: protowire.GetPeerAddressesResponseMessage.bannedAddresses:type_name -> protowire.GetPeerAddressesKnownAddressMessage + 32, // 111: protowire.GetPeerAddressesResponseMessage.error:type_name -> protowire.RPCError + 32, // 112: protowire.GetSelectedTipHashResponseMessage.error:type_name -> protowire.RPCError + 67, // 113: protowire.MempoolEntry.transactionVerboseData:type_name -> protowire.TransactionVerboseData + 47, // 114: protowire.GetMempoolEntryResponseMessage.entry:type_name -> protowire.MempoolEntry + 32, // 115: protowire.GetMempoolEntryResponseMessage.error:type_name -> protowire.RPCError + 47, // 116: protowire.GetMempoolEntriesResponseMessage.entries:type_name -> protowire.MempoolEntry + 32, // 117: protowire.GetMempoolEntriesResponseMessage.error:type_name -> protowire.RPCError + 54, // 118: protowire.GetConnectedPeerInfoResponseMessage.infos:type_name -> protowire.GetConnectedPeerInfoMessage + 32, // 119: protowire.GetConnectedPeerInfoResponseMessage.error:type_name -> protowire.RPCError + 32, // 120: protowire.AddPeerResponseMessage.error:type_name -> protowire.RPCError + 5, // 121: protowire.SubmitTransactionRequestMessage.transaction:type_name -> protowire.TransactionMessage + 32, // 122: protowire.SubmitTransactionResponseMessage.error:type_name -> protowire.RPCError + 32, // 123: protowire.NotifyChainChangedResponseMessage.error:type_name -> protowire.RPCError + 62, // 124: protowire.ChainChangedNotificationMessage.addedChainBlocks:type_name -> protowire.ChainBlock + 63, // 125: protowire.ChainBlock.acceptedBlocks:type_name -> protowire.AcceptedBlock + 66, // 126: protowire.GetBlockResponseMessage.blockVerboseData:type_name -> protowire.BlockVerboseData + 32, // 127: protowire.GetBlockResponseMessage.error:type_name -> protowire.RPCError + 67, // 128: protowire.BlockVerboseData.transactionVerboseData:type_name -> protowire.TransactionVerboseData + 68, // 129: protowire.TransactionVerboseData.transactionVerboseInputs:type_name -> protowire.TransactionVerboseInput + 70, // 130: protowire.TransactionVerboseData.transactionVerboseOutputs:type_name -> protowire.TransactionVerboseOutput + 69, // 131: protowire.TransactionVerboseInput.scriptSig:type_name -> protowire.ScriptSig + 71, // 132: protowire.TransactionVerboseOutput.scriptPubKey:type_name -> protowire.ScriptPubKeyResult + 32, // 133: protowire.GetSubnetworkResponseMessage.error:type_name -> protowire.RPCError + 62, // 134: protowire.GetChainFromBlockResponseMessage.addedChainBlocks:type_name -> protowire.ChainBlock + 66, // 135: protowire.GetChainFromBlockResponseMessage.blockVerboseData:type_name -> protowire.BlockVerboseData + 32, // 136: protowire.GetChainFromBlockResponseMessage.error:type_name -> protowire.RPCError + 66, // 137: protowire.GetBlocksResponseMessage.blockVerboseData:type_name -> protowire.BlockVerboseData + 32, // 138: protowire.GetBlocksResponseMessage.error:type_name -> protowire.RPCError + 32, // 139: protowire.GetBlockCountResponseMessage.error:type_name -> protowire.RPCError + 32, // 140: protowire.GetBlockDagInfoResponseMessage.error:type_name -> protowire.RPCError + 32, // 141: protowire.ResolveFinalityConflictResponseMessage.error:type_name -> protowire.RPCError + 32, // 142: protowire.NotifyFinalityConflictsResponseMessage.error:type_name -> protowire.RPCError + 32, // 143: protowire.ShutDownResponseMessage.error:type_name -> protowire.RPCError + 32, // 144: protowire.GetHeadersResponseMessage.error:type_name -> protowire.RPCError + 0, // 145: protowire.P2P.MessageStream:input_type -> protowire.KaspadMessage + 0, // 146: protowire.RPC.MessageStream:input_type -> protowire.KaspadMessage + 0, // 147: protowire.P2P.MessageStream:output_type -> protowire.KaspadMessage + 0, // 148: protowire.RPC.MessageStream:output_type -> protowire.KaspadMessage + 147, // [147:149] is the sub-list for method output_type + 145, // [145:147] is the sub-list for method input_type + 145, // [145:145] is the sub-list for extension type_name + 145, // [145:145] is the sub-list for extension extendee + 0, // [0:145] is the sub-list for field type_name } func init() { file_messages_proto_init() } @@ -7938,18 +7777,6 @@ func file_messages_proto_init() { } } file_messages_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RequestSelectedTipMessage); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_messages_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RequestTransactionsMessage); i { case 0: return &v.state @@ -7961,7 +7788,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionNotFoundMessage); i { case 0: return &v.state @@ -7973,7 +7800,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InvRelayBlockMessage); i { case 0: return &v.state @@ -7985,7 +7812,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InvTransactionsMessage); i { case 0: return &v.state @@ -7997,7 +7824,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PingMessage); i { case 0: return &v.state @@ -8009,7 +7836,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PongMessage); i { case 0: return &v.state @@ -8021,19 +7848,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SelectedTipMessage); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_messages_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VerackMessage); i { case 0: return &v.state @@ -8045,7 +7860,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VersionMessage); i { case 0: return &v.state @@ -8057,7 +7872,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RejectMessage); i { case 0: return &v.state @@ -8069,7 +7884,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RequestIBDRootUTXOSetAndBlockMessage); i { case 0: return &v.state @@ -8081,7 +7896,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IBDRootUTXOSetAndBlockMessage); i { case 0: return &v.state @@ -8093,7 +7908,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RequestIBDBlocksMessage); i { case 0: return &v.state @@ -8105,7 +7920,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IBDRootNotFoundMessage); i { case 0: return &v.state @@ -8117,7 +7932,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RPCError); i { case 0: return &v.state @@ -8129,7 +7944,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetCurrentNetworkRequestMessage); i { case 0: return &v.state @@ -8141,7 +7956,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetCurrentNetworkResponseMessage); i { case 0: return &v.state @@ -8153,7 +7968,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SubmitBlockRequestMessage); i { case 0: return &v.state @@ -8165,7 +7980,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SubmitBlockResponseMessage); i { case 0: return &v.state @@ -8177,7 +7992,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBlockTemplateRequestMessage); i { case 0: return &v.state @@ -8189,7 +8004,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBlockTemplateResponseMessage); i { case 0: return &v.state @@ -8201,7 +8016,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NotifyBlockAddedRequestMessage); i { case 0: return &v.state @@ -8213,7 +8028,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NotifyBlockAddedResponseMessage); i { case 0: return &v.state @@ -8225,7 +8040,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BlockAddedNotificationMessage); i { case 0: return &v.state @@ -8237,7 +8052,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetPeerAddressesRequestMessage); i { case 0: return &v.state @@ -8249,7 +8064,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetPeerAddressesResponseMessage); i { case 0: return &v.state @@ -8261,7 +8076,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetPeerAddressesKnownAddressMessage); i { case 0: return &v.state @@ -8273,7 +8088,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetSelectedTipHashRequestMessage); i { case 0: return &v.state @@ -8285,7 +8100,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetSelectedTipHashResponseMessage); i { case 0: return &v.state @@ -8297,7 +8112,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MempoolEntry); i { case 0: return &v.state @@ -8309,7 +8124,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetMempoolEntryRequestMessage); i { case 0: return &v.state @@ -8321,7 +8136,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetMempoolEntryResponseMessage); i { case 0: return &v.state @@ -8333,7 +8148,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetMempoolEntriesRequestMessage); i { case 0: return &v.state @@ -8345,7 +8160,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetMempoolEntriesResponseMessage); i { case 0: return &v.state @@ -8357,7 +8172,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetConnectedPeerInfoRequestMessage); i { case 0: return &v.state @@ -8369,7 +8184,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetConnectedPeerInfoResponseMessage); i { case 0: return &v.state @@ -8381,7 +8196,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetConnectedPeerInfoMessage); i { case 0: return &v.state @@ -8393,7 +8208,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddPeerRequestMessage); i { case 0: return &v.state @@ -8405,7 +8220,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddPeerResponseMessage); i { case 0: return &v.state @@ -8417,7 +8232,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SubmitTransactionRequestMessage); i { case 0: return &v.state @@ -8429,7 +8244,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SubmitTransactionResponseMessage); i { case 0: return &v.state @@ -8441,7 +8256,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NotifyChainChangedRequestMessage); i { case 0: return &v.state @@ -8453,7 +8268,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NotifyChainChangedResponseMessage); i { case 0: return &v.state @@ -8465,7 +8280,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChainChangedNotificationMessage); i { case 0: return &v.state @@ -8477,7 +8292,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChainBlock); i { case 0: return &v.state @@ -8489,7 +8304,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AcceptedBlock); i { case 0: return &v.state @@ -8501,7 +8316,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBlockRequestMessage); i { case 0: return &v.state @@ -8513,7 +8328,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBlockResponseMessage); i { case 0: return &v.state @@ -8525,7 +8340,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BlockVerboseData); i { case 0: return &v.state @@ -8537,7 +8352,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionVerboseData); i { case 0: return &v.state @@ -8549,7 +8364,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionVerboseInput); i { case 0: return &v.state @@ -8561,7 +8376,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ScriptSig); i { case 0: return &v.state @@ -8573,7 +8388,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionVerboseOutput); i { case 0: return &v.state @@ -8585,7 +8400,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ScriptPubKeyResult); i { case 0: return &v.state @@ -8597,7 +8412,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetSubnetworkRequestMessage); i { case 0: return &v.state @@ -8609,7 +8424,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetSubnetworkResponseMessage); i { case 0: return &v.state @@ -8621,7 +8436,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetChainFromBlockRequestMessage); i { case 0: return &v.state @@ -8633,7 +8448,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetChainFromBlockResponseMessage); i { case 0: return &v.state @@ -8645,7 +8460,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBlocksRequestMessage); i { case 0: return &v.state @@ -8657,7 +8472,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBlocksResponseMessage); i { case 0: return &v.state @@ -8669,7 +8484,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBlockCountRequestMessage); i { case 0: return &v.state @@ -8681,7 +8496,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBlockCountResponseMessage); i { case 0: return &v.state @@ -8693,7 +8508,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBlockDagInfoRequestMessage); i { case 0: return &v.state @@ -8705,7 +8520,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBlockDagInfoResponseMessage); i { case 0: return &v.state @@ -8717,7 +8532,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ResolveFinalityConflictRequestMessage); i { case 0: return &v.state @@ -8729,7 +8544,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ResolveFinalityConflictResponseMessage); i { case 0: return &v.state @@ -8741,7 +8556,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NotifyFinalityConflictsRequestMessage); i { case 0: return &v.state @@ -8753,7 +8568,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NotifyFinalityConflictsResponseMessage); i { case 0: return &v.state @@ -8765,7 +8580,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FinalityConflictNotificationMessage); i { case 0: return &v.state @@ -8777,7 +8592,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FinalityConflictResolvedNotificationMessage); i { case 0: return &v.state @@ -8789,7 +8604,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShutDownRequestMessage); i { case 0: return &v.state @@ -8801,7 +8616,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShutDownResponseMessage); i { case 0: return &v.state @@ -8813,7 +8628,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetHeadersRequestMessage); i { case 0: return &v.state @@ -8825,7 +8640,7 @@ func file_messages_proto_init() { return nil } } - file_messages_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { + file_messages_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetHeadersResponseMessage); i { case 0: return &v.state @@ -8849,14 +8664,12 @@ func file_messages_proto_init() { (*KaspadMessage_RequestNextHeaders)(nil), (*KaspadMessage_DoneHeaders)(nil), (*KaspadMessage_RequestRelayBlocks)(nil), - (*KaspadMessage_RequestSelectedTip)(nil), (*KaspadMessage_RequestTransactions)(nil), (*KaspadMessage_IbdBlock)(nil), (*KaspadMessage_InvRelayBlock)(nil), (*KaspadMessage_InvTransactions)(nil), (*KaspadMessage_Ping)(nil), (*KaspadMessage_Pong)(nil), - (*KaspadMessage_SelectedTip)(nil), (*KaspadMessage_Verack)(nil), (*KaspadMessage_Version)(nil), (*KaspadMessage_TransactionNotFound)(nil), @@ -8921,7 +8734,7 @@ func file_messages_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_messages_proto_rawDesc, NumEnums: 0, - NumMessages: 94, + NumMessages: 92, NumExtensions: 0, NumServices: 2, }, diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/messages.proto b/infrastructure/network/netadapter/server/grpcserver/protowire/messages.proto index ed296bfa0..243f39278 100644 --- a/infrastructure/network/netadapter/server/grpcserver/protowire/messages.proto +++ b/infrastructure/network/netadapter/server/grpcserver/protowire/messages.proto @@ -15,14 +15,12 @@ message KaspadMessage { RequestNextHeadersMessage requestNextHeaders = 8; DoneHeadersMessage DoneHeaders = 9; RequestRelayBlocksMessage requestRelayBlocks = 10; - RequestSelectedTipMessage requestSelectedTip = 11; RequestTransactionsMessage requestTransactions = 12; BlockMessage ibdBlock = 13; InvRelayBlockMessage invRelayBlock = 14; InvTransactionsMessage invTransactions = 15; PingMessage ping = 16; PongMessage pong = 17; - SelectedTipMessage selectedTip = 18; VerackMessage verack = 19; VersionMessage version = 20; TransactionNotFoundMessage transactionNotFound = 21; @@ -171,6 +169,7 @@ message Hash{ message RequestBlockLocatorMessage{ Hash lowHash = 1; Hash highHash = 2; + uint32 limit = 3; } // GetBlockLocatorMessage end @@ -203,11 +202,6 @@ message RequestRelayBlocksMessage{ } // RequestRelayBlocksMessage end -// GetSelectedTipMessage start -message RequestSelectedTipMessage{ -} -// GetSelectedTipMessage end - // RequestTransactionsMessage start message RequestTransactionsMessage { repeated TransactionId ids = 1; @@ -244,12 +238,6 @@ message PongMessage{ } // PongMessage end -// SelectedTipMessage start -message SelectedTipMessage{ - Hash selectedTipHash = 1; -} -// SelectedTipMessage end - // VerackMessage start message VerackMessage{ } @@ -263,7 +251,6 @@ message VersionMessage{ NetAddress address = 4; bytes id = 5; string userAgent = 6; - Hash selectedTipHash = 7; bool disableRelayTx = 8; SubnetworkId subnetworkId = 9; string network = 10; @@ -408,8 +395,6 @@ message GetConnectedPeerInfoMessage{ string id = 1; string address = 2; int64 lastPingDuration = 3; - string selectedTipHash = 4; - bool isSyncNode = 5; bool isOutbound = 6; int64 timeOffset = 7; string userAgent = 8; diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/p2p_request_block_locator.go b/infrastructure/network/netadapter/server/grpcserver/protowire/p2p_request_block_locator.go index 87276059d..06824a0de 100644 --- a/infrastructure/network/netadapter/server/grpcserver/protowire/p2p_request_block_locator.go +++ b/infrastructure/network/netadapter/server/grpcserver/protowire/p2p_request_block_locator.go @@ -16,6 +16,7 @@ func (x *KaspadMessage_RequestBlockLocator) toAppMessage() (appmessage.Message, return &appmessage.MsgRequestBlockLocator{ LowHash: lowHash, HighHash: highHash, + Limit: x.RequestBlockLocator.Limit, }, nil } @@ -23,6 +24,7 @@ func (x *KaspadMessage_RequestBlockLocator) fromAppMessage(msgGetBlockLocator *a x.RequestBlockLocator = &RequestBlockLocatorMessage{ LowHash: domainHashToProto(msgGetBlockLocator.LowHash), HighHash: domainHashToProto(msgGetBlockLocator.HighHash), + Limit: msgGetBlockLocator.Limit, } return nil } diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/p2p_request_ibd_blocks.go b/infrastructure/network/netadapter/server/grpcserver/protowire/p2p_request_ibd_blocks.go index 20c0247f5..167455540 100644 --- a/infrastructure/network/netadapter/server/grpcserver/protowire/p2p_request_ibd_blocks.go +++ b/infrastructure/network/netadapter/server/grpcserver/protowire/p2p_request_ibd_blocks.go @@ -2,14 +2,9 @@ package protowire import ( "github.com/kaspanet/kaspad/app/appmessage" - "github.com/pkg/errors" ) func (x *KaspadMessage_RequestIBDBlocks) toAppMessage() (appmessage.Message, error) { - if len(x.RequestIBDBlocks.Hashes) > appmessage.MaxRequestIBDBlocksHashes { - return nil, errors.Errorf("too many hashes for message "+ - "[count %d, max %d]", len(x.RequestIBDBlocks.Hashes), appmessage.MaxRequestIBDBlocksHashes) - } hashes, err := protoHashesToDomain(x.RequestIBDBlocks.Hashes) if err != nil { return nil, err @@ -18,11 +13,6 @@ func (x *KaspadMessage_RequestIBDBlocks) toAppMessage() (appmessage.Message, err } func (x *KaspadMessage_RequestIBDBlocks) fromAppMessage(msgRequestIBDBlocks *appmessage.MsgRequestIBDBlocks) error { - if len(msgRequestIBDBlocks.Hashes) > appmessage.MaxRequestIBDBlocksHashes { - return errors.Errorf("too many hashes for message "+ - "[count %d, max %d]", len(msgRequestIBDBlocks.Hashes), appmessage.MaxRequestIBDBlocksHashes) - } - x.RequestIBDBlocks = &RequestIBDBlocksMessage{ Hashes: domainHashesToProto(msgRequestIBDBlocks.Hashes), } diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/p2p_request_selected_tip.go b/infrastructure/network/netadapter/server/grpcserver/protowire/p2p_request_selected_tip.go deleted file mode 100644 index 0e99ae70e..000000000 --- a/infrastructure/network/netadapter/server/grpcserver/protowire/p2p_request_selected_tip.go +++ /dev/null @@ -1,11 +0,0 @@ -package protowire - -import "github.com/kaspanet/kaspad/app/appmessage" - -func (x *KaspadMessage_RequestSelectedTip) toAppMessage() (appmessage.Message, error) { - return &appmessage.MsgRequestSelectedTip{}, nil -} - -func (x *KaspadMessage_RequestSelectedTip) fromAppMessage(_ *appmessage.MsgRequestSelectedTip) error { - return nil -} diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/p2p_selected_tip.go b/infrastructure/network/netadapter/server/grpcserver/protowire/p2p_selected_tip.go deleted file mode 100644 index fa7eabdfe..000000000 --- a/infrastructure/network/netadapter/server/grpcserver/protowire/p2p_selected_tip.go +++ /dev/null @@ -1,19 +0,0 @@ -package protowire - -import "github.com/kaspanet/kaspad/app/appmessage" - -func (x *KaspadMessage_SelectedTip) toAppMessage() (appmessage.Message, error) { - hash, err := x.SelectedTip.SelectedTipHash.toDomain() - if err != nil { - return nil, err - } - - return &appmessage.MsgSelectedTip{SelectedTipHash: hash}, nil -} - -func (x *KaspadMessage_SelectedTip) fromAppMessage(msgSelectedTip *appmessage.MsgSelectedTip) error { - x.SelectedTip = &SelectedTipMessage{ - SelectedTipHash: domainHashToProto(msgSelectedTip.SelectedTipHash), - } - return nil -} diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/p2p_version.go b/infrastructure/network/netadapter/server/grpcserver/protowire/p2p_version.go index 2cffe5465..f1dfa7401 100644 --- a/infrastructure/network/netadapter/server/grpcserver/protowire/p2p_version.go +++ b/infrastructure/network/netadapter/server/grpcserver/protowire/p2p_version.go @@ -17,11 +17,6 @@ func (x *KaspadMessage_Version) toAppMessage() (appmessage.Message, error) { } } - selectedTipHash, err := x.Version.SelectedTipHash.toDomain() - if err != nil { - return nil, err - } - subnetworkID, err := x.Version.SubnetworkId.toDomain() if err != nil { return nil, err @@ -40,7 +35,6 @@ func (x *KaspadMessage_Version) toAppMessage() (appmessage.Message, error) { Address: address, ID: id.FromBytes(x.Version.Id), UserAgent: x.Version.UserAgent, - SelectedTipHash: selectedTipHash, DisableRelayTx: x.Version.DisableRelayTx, SubnetworkID: subnetworkID, }, nil @@ -71,7 +65,6 @@ func (x *KaspadMessage_Version) fromAppMessage(msgVersion *appmessage.MsgVersion Address: address, Id: versionID, UserAgent: msgVersion.UserAgent, - SelectedTipHash: domainHashToProto(msgVersion.SelectedTipHash), DisableRelayTx: msgVersion.DisableRelayTx, SubnetworkId: domainSubnetworkIDToProto(msgVersion.SubnetworkID), } diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_connected_peer_info.go b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_connected_peer_info.go index 32ed3109d..17f9621d2 100644 --- a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_connected_peer_info.go +++ b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_connected_peer_info.go @@ -23,8 +23,6 @@ func (x *KaspadMessage_GetConnectedPeerInfoResponse) toAppMessage() (appmessage. ID: info.Id, Address: info.Address, LastPingDuration: info.LastPingDuration, - SelectedTipHash: info.SelectedTipHash, - IsSyncNode: info.IsSyncNode, IsOutbound: info.IsOutbound, TimeOffset: info.TimeOffset, UserAgent: info.UserAgent, @@ -49,8 +47,6 @@ func (x *KaspadMessage_GetConnectedPeerInfoResponse) fromAppMessage(message *app Id: info.ID, Address: info.Address, LastPingDuration: info.LastPingDuration, - SelectedTipHash: info.SelectedTipHash, - IsSyncNode: info.IsSyncNode, IsOutbound: info.IsOutbound, TimeOffset: info.TimeOffset, UserAgent: info.UserAgent, diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/wire.go b/infrastructure/network/netadapter/server/grpcserver/protowire/wire.go index c690ac9a3..83e6623f7 100644 --- a/infrastructure/network/netadapter/server/grpcserver/protowire/wire.go +++ b/infrastructure/network/netadapter/server/grpcserver/protowire/wire.go @@ -114,13 +114,6 @@ func toP2PPayload(message appmessage.Message) (isKaspadMessage_Payload, error) { return nil, err } return payload, nil - case *appmessage.MsgRequestSelectedTip: - payload := new(KaspadMessage_RequestSelectedTip) - err := payload.fromAppMessage(message) - if err != nil { - return nil, err - } - return payload, nil case *appmessage.MsgRequestTransactions: payload := new(KaspadMessage_RequestTransactions) err := payload.fromAppMessage(message) @@ -170,13 +163,6 @@ func toP2PPayload(message appmessage.Message) (isKaspadMessage_Payload, error) { return nil, err } return payload, nil - case *appmessage.MsgSelectedTip: - payload := new(KaspadMessage_SelectedTip) - err := payload.fromAppMessage(message) - if err != nil { - return nil, err - } - return payload, nil case *appmessage.MsgTx: payload := new(KaspadMessage_Transaction) err := payload.fromAppMessage(message) diff --git a/infrastructure/network/netadapter/standalone/minimal_net_adapter.go b/infrastructure/network/netadapter/standalone/minimal_net_adapter.go index 255780fe0..e69f2f620 100644 --- a/infrastructure/network/netadapter/standalone/minimal_net_adapter.go +++ b/infrastructure/network/netadapter/standalone/minimal_net_adapter.go @@ -120,7 +120,6 @@ func (mna *MinimalNetAdapter) handleHandshake(routes *Routes, ourID *id.ID) erro Address: nil, ID: ourID, UserAgent: "/net-adapter-mock/", - SelectedTipHash: versionMessage.SelectedTipHash, DisableRelayTx: true, SubnetworkID: nil, }) diff --git a/testing/integration/ibd_test.go b/testing/integration/ibd_test.go index 78b39fc8a..1a3b97803 100644 --- a/testing/integration/ibd_test.go +++ b/testing/integration/ibd_test.go @@ -14,7 +14,7 @@ func TestIBD(t *testing.T) { syncer, syncee, _, teardown := standardSetup(t) defer teardown() - for i := 0; i < numBlocks; i++ { + for i := 0; i < numBlocks-1; i++ { mineNextBlock(t, syncer) } @@ -28,6 +28,9 @@ func TestIBD(t *testing.T) { connect(t, syncer, syncee) + // We expect this to trigger IBD + mineNextBlock(t, syncer) + select { case <-time.After(defaultTimeout): t.Fatalf("Timeout waiting for IBD to finish. Received %d blocks out of %d", receivedBlocks, numBlocks)