From dbddf380a7f4b7c75725d131bfe47868d1fa94ff Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 3 Apr 2025 14:51:29 +0200 Subject: [PATCH 01/17] tapdb: fix comments and args --- tapdb/asset_minting.go | 2 +- tapdb/assets_common.go | 2 +- tapdb/assets_store.go | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tapdb/asset_minting.go b/tapdb/asset_minting.go index 075ebc0c7..9bb3a305a 100644 --- a/tapdb/asset_minting.go +++ b/tapdb/asset_minting.go @@ -268,7 +268,7 @@ var ( // fails. ErrBindBatchTx = errors.New("unable to bind batch tx") - // ErrEcodePsbt is returned when serializing a PSBT fails. + // ErrEncodePsbt is returned when serializing a PSBT fails. ErrEncodePsbt = errors.New("unable to encode psbt") ) diff --git a/tapdb/assets_common.go b/tapdb/assets_common.go index e8b4d2239..9053de817 100644 --- a/tapdb/assets_common.go +++ b/tapdb/assets_common.go @@ -134,7 +134,7 @@ var ( // exactly 32 bytes. ErrTapscriptRootSize = errors.New("tapscript root invalid: wrong size") - // ErrFetchGenesisAsset is returned when fetching the database ID for an + // ErrFetchGenesisID is returned when fetching the database ID for an // asset genesis fails. ErrFetchGenesisID = errors.New("unable to fetch genesis asset") ) diff --git a/tapdb/assets_store.go b/tapdb/assets_store.go index b566c674d..2d00cb4c0 100644 --- a/tapdb/assets_store.go +++ b/tapdb/assets_store.go @@ -1519,8 +1519,8 @@ func locatorToProofQuery(locator proof.Locator) (FetchAssetProof, error) { // the FileArchiver. // // NOTE: This implements the proof.Archiver interface. -func (a *AssetStore) FetchIssuanceProof(ctx context.Context, id asset.ID, - anchorOutpoint wire.OutPoint) (proof.Blob, error) { +func (a *AssetStore) FetchIssuanceProof(_ context.Context, _ asset.ID, + _ wire.OutPoint) (proof.Blob, error) { return nil, proof.ErrProofNotFound } From ec4fea70da11658665e82d90aee513ebc94c2b98 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 3 Apr 2025 14:51:30 +0200 Subject: [PATCH 02/17] tapdb: use embeddings for script key --- tapdb/addrs.go | 64 +++------------- tapdb/asset_minting.go | 31 +------- tapdb/assets_common.go | 64 ++++++++++++---- tapdb/assets_store.go | 81 +++++--------------- tapdb/sqlc/addrs.sql.go | 118 ++++++++++++++--------------- tapdb/sqlc/assets.sql.go | 124 +++++++++++++++---------------- tapdb/sqlc/queries/addrs.sql | 16 +--- tapdb/sqlc/queries/assets.sql | 21 +++--- tapdb/sqlc/queries/transfers.sql | 9 +-- tapdb/sqlc/transfers.sql.go | 34 ++++----- 10 files changed, 226 insertions(+), 336 deletions(-) diff --git a/tapdb/addrs.go b/tapdb/addrs.go index 2db2af5f2..3bebe4adc 100644 --- a/tapdb/addrs.go +++ b/tapdb/addrs.go @@ -404,22 +404,13 @@ func (t *TapAddressBook) QueryAddrs(ctx context.Context, } } - rawScriptKey, err := btcec.ParsePubKey( - addr.RawScriptKey, + scriptKey, err := parseScriptKey( + addr.InternalKey, addr.ScriptKey, ) if err != nil { return fmt.Errorf("unable to decode "+ "script key: %w", err) } - rawScriptKeyDesc := keychain.KeyDescriptor{ - KeyLocator: keychain.KeyLocator{ - Family: keychain.KeyFamily( - addr.ScriptKeyFamily, - ), - Index: uint32(addr.ScriptKeyIndex), - }, - PubKey: rawScriptKey, - } internalKey, err := btcec.ParsePubKey(addr.RawTaprootKey) if err != nil { @@ -436,11 +427,6 @@ func (t *TapAddressBook) QueryAddrs(ctx context.Context, PubKey: internalKey, } - scriptKey, err := btcec.ParsePubKey(addr.TweakedScriptKey) - if err != nil { - return err - } - taprootOutputKey, err := schnorr.ParsePubKey( addr.TaprootOutputKey, ) @@ -467,8 +453,8 @@ func (t *TapAddressBook) QueryAddrs(ctx context.Context, tapAddr, err := address.New( address.Version(addr.Version), assetGenesis, - groupKey, groupWitness, - *scriptKey, *internalKey, uint64(addr.Amount), + groupKey, groupWitness, *scriptKey.PubKey, + *internalKey, uint64(addr.Amount), tapscriptSibling, t.params, *proofCourierAddr, address.WithAssetVersion( asset.Version(addr.AssetVersion), @@ -478,16 +464,9 @@ func (t *TapAddressBook) QueryAddrs(ctx context.Context, return fmt.Errorf("unable to make addr: %w", err) } - declaredKnown := extractBool( - addr.ScriptKeyDeclaredKnown, - ) addrs = append(addrs, address.AddrWithKeyInfo{ - Tap: tapAddr, - ScriptKeyTweak: asset.TweakedScriptKey{ - RawKey: rawScriptKeyDesc, - Tweak: addr.ScriptKeyTweak, - DeclaredKnown: declaredKnown, - }, + Tap: tapAddr, + ScriptKeyTweak: *scriptKey.TweakedScriptKey, InternalKeyDesc: internalKeyDesc, TaprootOutputKey: *taprootOutputKey, CreationTime: addr.CreationTime.UTC(), @@ -571,21 +550,7 @@ func fetchAddr(ctx context.Context, db AddrBook, params *address.ChainParams, } } - rawScriptKey, err := btcec.ParsePubKey(dbAddr.RawScriptKey) - if err != nil { - return nil, fmt.Errorf("unable to decode script key: %w", err) - } - scriptKeyDesc := keychain.KeyDescriptor{ - KeyLocator: keychain.KeyLocator{ - Family: keychain.KeyFamily( - dbAddr.ScriptKeyFamily, - ), - Index: uint32(dbAddr.ScriptKeyIndex), - }, - PubKey: rawScriptKey, - } - - scriptKey, err := btcec.ParsePubKey(dbAddr.TweakedScriptKey) + scriptKey, err := parseScriptKey(dbAddr.InternalKey, dbAddr.ScriptKey) if err != nil { return nil, fmt.Errorf("unable to decode script key: %w", err) } @@ -622,8 +587,9 @@ func fetchAddr(ctx context.Context, db AddrBook, params *address.ChainParams, tapAddr, err := address.New( address.Version(dbAddr.Version), genesis, groupKey, - groupWitness, *scriptKey, *internalKey, uint64(dbAddr.Amount), - tapscriptSibling, params, *proofCourierAddr, + groupWitness, *scriptKey.PubKey, *internalKey, + uint64(dbAddr.Amount), tapscriptSibling, params, + *proofCourierAddr, address.WithAssetVersion(asset.Version(dbAddr.AssetVersion)), ) if err != nil { @@ -631,14 +597,8 @@ func fetchAddr(ctx context.Context, db AddrBook, params *address.ChainParams, } return &address.AddrWithKeyInfo{ - Tap: tapAddr, - ScriptKeyTweak: asset.TweakedScriptKey{ - RawKey: scriptKeyDesc, - Tweak: dbAddr.ScriptKeyTweak, - DeclaredKnown: extractBool( - dbAddr.ScriptKeyDeclaredKnown, - ), - }, + Tap: tapAddr, + ScriptKeyTweak: *scriptKey.TweakedScriptKey, InternalKeyDesc: internalKeyDesc, TaprootOutputKey: *taprootOutputKey, CreationTime: dbAddr.CreationTime.UTC(), diff --git a/tapdb/asset_minting.go b/tapdb/asset_minting.go index 9bb3a305a..2e5b3a93d 100644 --- a/tapdb/asset_minting.go +++ b/tapdb/asset_minting.go @@ -853,35 +853,12 @@ func fetchAssetSprouts(ctx context.Context, q PendingAssetStore, for i, sprout := range dbSprout { // First, we'll decode the script key which very asset must // specify, and populate the key locator information - tweakedScriptKey, err := btcec.ParsePubKey( - sprout.TweakedScriptKey, + scriptKey, err := parseScriptKey( + sprout.InternalKey, sprout.ScriptKey, ) if err != nil { - return nil, err - } - - internalScriptKey, err := btcec.ParsePubKey( - sprout.ScriptKeyRaw, - ) - if err != nil { - return nil, err - } - - scriptKeyDesc := keychain.KeyDescriptor{ - PubKey: internalScriptKey, - KeyLocator: keychain.KeyLocator{ - Index: uint32(sprout.ScriptKeyIndex), - Family: keychain.KeyFamily(sprout.ScriptKeyFam), - }, - } - declaredKnown := extractBool(sprout.ScriptKeyDeclaredKnown) - scriptKey := asset.ScriptKey{ - PubKey: tweakedScriptKey, - TweakedScriptKey: &asset.TweakedScriptKey{ - RawKey: scriptKeyDesc, - Tweak: sprout.Tweak, - DeclaredKnown: declaredKnown, - }, + return nil, fmt.Errorf("unable to decode script key: "+ + "%w", err) } // Not all assets have a key group, so we only need to diff --git a/tapdb/assets_common.go b/tapdb/assets_common.go index 9053de817..3dbff6d08 100644 --- a/tapdb/assets_common.go +++ b/tapdb/assets_common.go @@ -485,26 +485,58 @@ func fetchScriptKey(ctx context.Context, q FetchScriptKeyStore, return nil, err } - rawKey, err := btcec.ParsePubKey(dbKey.RawKey) + scriptKey, err := parseScriptKey(dbKey.InternalKey, dbKey.ScriptKey) if err != nil { - return nil, fmt.Errorf("unable to parse raw key: %w", err) - } - - scriptKey := &asset.TweakedScriptKey{ - Tweak: dbKey.Tweak, - RawKey: keychain.KeyDescriptor{ - PubKey: rawKey, - KeyLocator: keychain.KeyLocator{ - Family: keychain.KeyFamily( - dbKey.KeyFamily, - ), - Index: uint32(dbKey.KeyIndex), + return nil, err + } + + return scriptKey.TweakedScriptKey, nil +} + +// parseScriptKey maps a script key and internal key from the database into a +// ScriptKey struct. Both the internal raw public key and the tweaked public key +// must be set and valid. +func parseScriptKey(ik sqlc.InternalKey, sk sqlc.ScriptKey) (asset.ScriptKey, + error) { + + var ( + locator = keychain.KeyLocator{ + Index: uint32(ik.KeyIndex), + Family: keychain.KeyFamily(ik.KeyFamily), + } + result = asset.ScriptKey{ + TweakedScriptKey: &asset.TweakedScriptKey{ + RawKey: keychain.KeyDescriptor{ + KeyLocator: locator, + }, + Tweak: sk.Tweak, + DeclaredKnown: extractBool(sk.DeclaredKnown), }, - }, - DeclaredKnown: extractBool(dbKey.DeclaredKnown), + } + err error + ) + + if len(sk.TweakedScriptKey) == 0 { + return result, fmt.Errorf("tweaked script key is empty") + } + + if len(ik.RawKey) == 0 { + return result, fmt.Errorf("internal raw key is empty") + } + + result.PubKey, err = btcec.ParsePubKey(sk.TweakedScriptKey) + if err != nil { + return result, fmt.Errorf("error parsing tweaked "+ + "script key: %w", err) + } + + result.RawKey.PubKey, err = btcec.ParsePubKey(ik.RawKey) + if err != nil { + return result, fmt.Errorf("error parsing internal "+ + "raw key: %w", err) } - return scriptKey, nil + return result, nil } // FetchGenesisStore houses the methods related to fetching genesis assets. diff --git a/tapdb/assets_store.go b/tapdb/assets_store.go index 2d00cb4c0..8ad11e63d 100644 --- a/tapdb/assets_store.go +++ b/tapdb/assets_store.go @@ -633,16 +633,12 @@ func (a *AssetStore) dbAssetsToChainAssets(dbAssets []ConfirmedAsset, // First, we'll decode the script key which every asset must // specify, and populate the key locator information. - rawScriptKeyPub, err := btcec.ParsePubKey(sprout.ScriptKeyRaw) + scriptKey, err := parseScriptKey( + sprout.InternalKey, sprout.ScriptKey, + ) if err != nil { - return nil, err - } - rawScriptKeyDesc := keychain.KeyDescriptor{ - PubKey: rawScriptKeyPub, - KeyLocator: keychain.KeyLocator{ - Index: uint32(sprout.ScriptKeyIndex), - Family: keychain.KeyFamily(sprout.ScriptKeyFam), - }, + return nil, fmt.Errorf("unable to decode script key: "+ + "%w", err) } // Not all assets have a key group, so we only need to @@ -726,20 +722,6 @@ func (a *AssetStore) dbAssetsToChainAssets(dbAssets []ConfirmedAsset, amount = 1 } - scriptKeyPub, err := btcec.ParsePubKey(sprout.TweakedScriptKey) - if err != nil { - return nil, err - } - declaredKnown := extractBool(sprout.ScriptKeyDeclaredKnown) - scriptKey := asset.ScriptKey{ - PubKey: scriptKeyPub, - TweakedScriptKey: &asset.TweakedScriptKey{ - RawKey: rawScriptKeyDesc, - Tweak: sprout.ScriptKeyTweak, - DeclaredKnown: declaredKnown, - }, - } - assetSprout, err := asset.New( assetGenesis, amount, lockTime, relativeLocktime, scriptKey, groupKey, @@ -753,7 +735,9 @@ func (a *AssetStore) dbAssetsToChainAssets(dbAssets []ConfirmedAsset, // We cannot use 0 as the amount when creating a new asset with // the New function above. But if this is a tombstone asset, we // actually have to set the amount to 0. - if scriptKeyPub.IsEqual(asset.NUMSPubKey) && sprout.Amount == 0 { + if scriptKey.PubKey.IsEqual(asset.NUMSPubKey) && + sprout.Amount == 0 { + assetSprout.Amount = 0 } @@ -2788,29 +2772,14 @@ func fetchAssetTransferOutputs(ctx context.Context, q ActiveAssetsStore, "key: %w", err) } - scriptKey, err := btcec.ParsePubKey(dbOut.ScriptKeyBytes) + scriptKey, err := parseScriptKey( + dbOut.InternalKey, dbOut.ScriptKey, + ) if err != nil { return nil, fmt.Errorf("unable to decode script key: "+ "%w", err) } - rawScriptKey, err := btcec.ParsePubKey( - dbOut.ScriptKeyRawKeyBytes, - ) - if err != nil { - return nil, fmt.Errorf("unable to decode raw script "+ - "key: %w", err) - } - - scriptKeyLocator := keychain.KeyLocator{ - Family: keychain.KeyFamily( - dbOut.ScriptKeyFamily, - ), - Index: uint32( - dbOut.ScriptKeyIndex, - ), - } - var splitRootHash mssmt.NodeHash copy(splitRootHash[:], dbOut.SplitCommitmentRootHash) @@ -2825,7 +2794,6 @@ func fetchAssetTransferOutputs(ctx context.Context, q ActiveAssetsStore, err) } - declaredKnown := extractBool(dbOut.ScriptKeyDeclaredKnown) outputAnchor := tapfreighter.Anchor{ Value: btcutil.Amount( dbOut.AnchorValue, @@ -2877,19 +2845,9 @@ func fetchAssetTransferOutputs(ctx context.Context, q ActiveAssetsStore, LockTime: uint64(dbOut.LockTime.Int32), RelativeLockTime: uint64(dbOut.RelativeLockTime.Int32), AssetVersion: asset.Version(dbOut.AssetVersion), - ScriptKey: asset.ScriptKey{ - PubKey: scriptKey, - TweakedScriptKey: &asset.TweakedScriptKey{ - RawKey: keychain.KeyDescriptor{ - PubKey: rawScriptKey, - KeyLocator: scriptKeyLocator, - }, - Tweak: dbOut.ScriptKeyTweak, - DeclaredKnown: declaredKnown, - }, - }, - ScriptKeyLocal: dbOut.ScriptKeyLocal, - WitnessData: witnessData, + ScriptKey: scriptKey, + ScriptKeyLocal: dbOut.ScriptKeyLocal, + WitnessData: witnessData, SplitCommitmentRoot: mssmt.NewComputedNode( splitRootHash, uint64(dbOut.SplitCommitmentRootValue.Int64), @@ -3168,13 +3126,14 @@ func (a *AssetStore) LogAnchorTxConfirm(ctx context.Context, "witness: %w", err) } - scriptPubKey, err := btcec.ParsePubKey( - out.ScriptKeyBytes, + fullScriptKey, err := parseScriptKey( + out.InternalKey, out.ScriptKey, ) if err != nil { return fmt.Errorf("unable to decode script "+ "key: %w", err) } + scriptPubKey := fullScriptKey.PubKey isNumsKey := scriptPubKey.IsEqual(asset.NUMSPubKey) isTombstone := isNumsKey && @@ -3182,7 +3141,7 @@ func (a *AssetStore) LogAnchorTxConfirm(ctx context.Context, out.OutputType == int16(tappsbt.TypeSplitRoot) isBurn := !isNumsKey && len(witnessData) > 0 && asset.IsBurnKey(scriptPubKey, witnessData[0]) - isKnown := extractBool(out.ScriptKeyDeclaredKnown) + isKnown := fullScriptKey.DeclaredKnown skipAssetCreation := !isTombstone && !isBurn && !out.ScriptKeyLocal && !isKnown @@ -3236,7 +3195,7 @@ func (a *AssetStore) LogAnchorTxConfirm(ctx context.Context, } params := ApplyPendingOutput{ - ScriptKeyID: out.ScriptKeyID, + ScriptKeyID: out.ScriptKey.ScriptKeyID, AnchorUtxoID: sqlInt64( out.AnchorUtxoID, ), @@ -3278,7 +3237,7 @@ func (a *AssetStore) LogAnchorTxConfirm(ctx context.Context, if !ok { return fmt.Errorf("no proof found for output "+ "with script key %x", - out.ScriptKeyBytes) + scriptPubKey.SerializeCompressed()) } localProofKeys = append(localProofKeys, outKey) diff --git a/tapdb/sqlc/addrs.sql.go b/tapdb/sqlc/addrs.sql.go index bb595af29..0dabe241f 100644 --- a/tapdb/sqlc/addrs.sql.go +++ b/tapdb/sqlc/addrs.sql.go @@ -16,12 +16,8 @@ SELECT version, asset_version, genesis_asset_id, group_key, tapscript_sibling, taproot_output_key, amount, asset_type, creation_time, managed_from, proof_courier_addr, - script_keys.tweaked_script_key, - script_keys.tweak AS script_key_tweak, - script_keys.declared_known AS script_key_declared_known, - raw_script_keys.raw_key as raw_script_key, - raw_script_keys.key_family AS script_key_family, - raw_script_keys.key_index AS script_key_index, + script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, + raw_script_keys.key_id, raw_script_keys.raw_key, raw_script_keys.key_family, raw_script_keys.key_index, taproot_keys.raw_key AS raw_taproot_key, taproot_keys.key_family AS taproot_key_family, taproot_keys.key_index AS taproot_key_index @@ -36,26 +32,22 @@ WHERE taproot_output_key = $1 ` type FetchAddrByTaprootOutputKeyRow struct { - Version int16 - AssetVersion int16 - GenesisAssetID int64 - GroupKey []byte - TapscriptSibling []byte - TaprootOutputKey []byte - Amount int64 - AssetType int16 - CreationTime time.Time - ManagedFrom sql.NullTime - ProofCourierAddr []byte - TweakedScriptKey []byte - ScriptKeyTweak []byte - ScriptKeyDeclaredKnown sql.NullBool - RawScriptKey []byte - ScriptKeyFamily int32 - ScriptKeyIndex int32 - RawTaprootKey []byte - TaprootKeyFamily int32 - TaprootKeyIndex int32 + Version int16 + AssetVersion int16 + GenesisAssetID int64 + GroupKey []byte + TapscriptSibling []byte + TaprootOutputKey []byte + Amount int64 + AssetType int16 + CreationTime time.Time + ManagedFrom sql.NullTime + ProofCourierAddr []byte + ScriptKey ScriptKey + InternalKey InternalKey + RawTaprootKey []byte + TaprootKeyFamily int32 + TaprootKeyIndex int32 } func (q *Queries) FetchAddrByTaprootOutputKey(ctx context.Context, taprootOutputKey []byte) (FetchAddrByTaprootOutputKeyRow, error) { @@ -73,12 +65,15 @@ func (q *Queries) FetchAddrByTaprootOutputKey(ctx context.Context, taprootOutput &i.CreationTime, &i.ManagedFrom, &i.ProofCourierAddr, - &i.TweakedScriptKey, - &i.ScriptKeyTweak, - &i.ScriptKeyDeclaredKnown, - &i.RawScriptKey, - &i.ScriptKeyFamily, - &i.ScriptKeyIndex, + &i.ScriptKey.ScriptKeyID, + &i.ScriptKey.InternalKeyID, + &i.ScriptKey.TweakedScriptKey, + &i.ScriptKey.Tweak, + &i.ScriptKey.DeclaredKnown, + &i.InternalKey.KeyID, + &i.InternalKey.RawKey, + &i.InternalKey.KeyFamily, + &i.InternalKey.KeyIndex, &i.RawTaprootKey, &i.TaprootKeyFamily, &i.TaprootKeyIndex, @@ -207,12 +202,8 @@ SELECT version, asset_version, genesis_asset_id, group_key, tapscript_sibling, taproot_output_key, amount, asset_type, creation_time, managed_from, proof_courier_addr, - script_keys.tweaked_script_key, - script_keys.tweak AS script_key_tweak, - script_keys.declared_known AS script_key_declared_known, - raw_script_keys.raw_key AS raw_script_key, - raw_script_keys.key_family AS script_key_family, - raw_script_keys.key_index AS script_key_index, + script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, + raw_script_keys.key_id, raw_script_keys.raw_key, raw_script_keys.key_family, raw_script_keys.key_index, taproot_keys.raw_key AS raw_taproot_key, taproot_keys.key_family AS taproot_key_family, taproot_keys.key_index AS taproot_key_index @@ -240,26 +231,22 @@ type FetchAddrsParams struct { } type FetchAddrsRow struct { - Version int16 - AssetVersion int16 - GenesisAssetID int64 - GroupKey []byte - TapscriptSibling []byte - TaprootOutputKey []byte - Amount int64 - AssetType int16 - CreationTime time.Time - ManagedFrom sql.NullTime - ProofCourierAddr []byte - TweakedScriptKey []byte - ScriptKeyTweak []byte - ScriptKeyDeclaredKnown sql.NullBool - RawScriptKey []byte - ScriptKeyFamily int32 - ScriptKeyIndex int32 - RawTaprootKey []byte - TaprootKeyFamily int32 - TaprootKeyIndex int32 + Version int16 + AssetVersion int16 + GenesisAssetID int64 + GroupKey []byte + TapscriptSibling []byte + TaprootOutputKey []byte + Amount int64 + AssetType int16 + CreationTime time.Time + ManagedFrom sql.NullTime + ProofCourierAddr []byte + ScriptKey ScriptKey + InternalKey InternalKey + RawTaprootKey []byte + TaprootKeyFamily int32 + TaprootKeyIndex int32 } func (q *Queries) FetchAddrs(ctx context.Context, arg FetchAddrsParams) ([]FetchAddrsRow, error) { @@ -289,12 +276,15 @@ func (q *Queries) FetchAddrs(ctx context.Context, arg FetchAddrsParams) ([]Fetch &i.CreationTime, &i.ManagedFrom, &i.ProofCourierAddr, - &i.TweakedScriptKey, - &i.ScriptKeyTweak, - &i.ScriptKeyDeclaredKnown, - &i.RawScriptKey, - &i.ScriptKeyFamily, - &i.ScriptKeyIndex, + &i.ScriptKey.ScriptKeyID, + &i.ScriptKey.InternalKeyID, + &i.ScriptKey.TweakedScriptKey, + &i.ScriptKey.Tweak, + &i.ScriptKey.DeclaredKnown, + &i.InternalKey.KeyID, + &i.InternalKey.RawKey, + &i.InternalKey.KeyFamily, + &i.InternalKey.KeyIndex, &i.RawTaprootKey, &i.TaprootKeyFamily, &i.TaprootKeyIndex, diff --git a/tapdb/sqlc/assets.sql.go b/tapdb/sqlc/assets.sql.go index cc6a6cd84..7534daa0a 100644 --- a/tapdb/sqlc/assets.sql.go +++ b/tapdb/sqlc/assets.sql.go @@ -972,11 +972,9 @@ WITH genesis_info AS ( WHERE wit.gen_asset_id IN (SELECT gen_asset_id FROM genesis_info) ) SELECT - version, script_keys.tweak, script_keys.tweaked_script_key, - script_keys.declared_known AS script_key_declared_known, - internal_keys.raw_key AS script_key_raw, - internal_keys.key_family AS script_key_fam, - internal_keys.key_index AS script_key_index, + version, + script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, + internal_keys.key_id, internal_keys.raw_key, internal_keys.key_family, internal_keys.key_index, key_group_info.tapscript_root, key_group_info.witness_stack, key_group_info.tweaked_group_key, @@ -1002,30 +1000,26 @@ JOIN internal_keys ` type FetchAssetsForBatchRow struct { - Version int32 - Tweak []byte - TweakedScriptKey []byte - ScriptKeyDeclaredKnown sql.NullBool - ScriptKeyRaw []byte - ScriptKeyFam int32 - ScriptKeyIndex int32 - TapscriptRoot []byte - WitnessStack []byte - TweakedGroupKey []byte - GroupKeyRaw []byte - GroupKeyFamily sql.NullInt32 - GroupKeyIndex sql.NullInt32 - ScriptVersion int32 - Amount int64 - LockTime sql.NullInt32 - RelativeLockTime sql.NullInt32 - Spent bool - AssetID []byte - AssetTag string - AssetsMetum AssetsMetum - GenesisOutputIndex int32 - AssetType int16 - GenesisPrevOut []byte + Version int32 + ScriptKey ScriptKey + InternalKey InternalKey + TapscriptRoot []byte + WitnessStack []byte + TweakedGroupKey []byte + GroupKeyRaw []byte + GroupKeyFamily sql.NullInt32 + GroupKeyIndex sql.NullInt32 + ScriptVersion int32 + Amount int64 + LockTime sql.NullInt32 + RelativeLockTime sql.NullInt32 + Spent bool + AssetID []byte + AssetTag string + AssetsMetum AssetsMetum + GenesisOutputIndex int32 + AssetType int16 + GenesisPrevOut []byte } // We use a LEFT JOIN here as not every asset has a meta data entry. @@ -1044,12 +1038,15 @@ func (q *Queries) FetchAssetsForBatch(ctx context.Context, rawKey []byte) ([]Fet var i FetchAssetsForBatchRow if err := rows.Scan( &i.Version, - &i.Tweak, - &i.TweakedScriptKey, - &i.ScriptKeyDeclaredKnown, - &i.ScriptKeyRaw, - &i.ScriptKeyFam, - &i.ScriptKeyIndex, + &i.ScriptKey.ScriptKeyID, + &i.ScriptKey.InternalKeyID, + &i.ScriptKey.TweakedScriptKey, + &i.ScriptKey.Tweak, + &i.ScriptKey.DeclaredKnown, + &i.InternalKey.KeyID, + &i.InternalKey.RawKey, + &i.InternalKey.KeyFamily, + &i.InternalKey.KeyIndex, &i.TapscriptRoot, &i.WitnessStack, &i.TweakedGroupKey, @@ -1673,7 +1670,7 @@ func (q *Queries) FetchMintingBatchesByInverseState(ctx context.Context, batchSt } const FetchScriptKeyByTweakedKey = `-- name: FetchScriptKeyByTweakedKey :one -SELECT tweak, raw_key, key_family, key_index, declared_known +SELECT script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, internal_keys.key_id, internal_keys.raw_key, internal_keys.key_family, internal_keys.key_index FROM script_keys JOIN internal_keys ON script_keys.internal_key_id = internal_keys.key_id @@ -1681,22 +1678,23 @@ WHERE script_keys.tweaked_script_key = $1 ` type FetchScriptKeyByTweakedKeyRow struct { - Tweak []byte - RawKey []byte - KeyFamily int32 - KeyIndex int32 - DeclaredKnown sql.NullBool + ScriptKey ScriptKey + InternalKey InternalKey } func (q *Queries) FetchScriptKeyByTweakedKey(ctx context.Context, tweakedScriptKey []byte) (FetchScriptKeyByTweakedKeyRow, error) { row := q.db.QueryRowContext(ctx, FetchScriptKeyByTweakedKey, tweakedScriptKey) var i FetchScriptKeyByTweakedKeyRow err := row.Scan( - &i.Tweak, - &i.RawKey, - &i.KeyFamily, - &i.KeyIndex, - &i.DeclaredKnown, + &i.ScriptKey.ScriptKeyID, + &i.ScriptKey.InternalKeyID, + &i.ScriptKey.TweakedScriptKey, + &i.ScriptKey.Tweak, + &i.ScriptKey.DeclaredKnown, + &i.InternalKey.KeyID, + &i.InternalKey.RawKey, + &i.InternalKey.KeyFamily, + &i.InternalKey.KeyIndex, ) return i, err } @@ -1783,6 +1781,9 @@ SELECT seedling_id, asset_name, asset_type, asset_version, asset_supply, assets_meta.meta_id, assets_meta.meta_data_hash, assets_meta.meta_data_blob, assets_meta.meta_data_type, assets_meta.meta_decimal_display, assets_meta.meta_universe_commitments, assets_meta.meta_canonical_universes, assets_meta.meta_delegation_key, emission_enabled, batch_id, group_genesis_id, group_anchor_id, group_tapscript_root, + -- TODO(guggero): We should use sqlc.embed() for the script key and internal + -- key fields, but we can't because it's a LEFT JOIN. We should check if the + -- LEFT JOIN is actually necessary or if we always have keys for seedlings. script_keys.tweak AS script_key_tweak, script_keys.tweaked_script_key, script_keys.declared_known AS script_key_declared_known, @@ -2296,12 +2297,8 @@ const QueryAssets = `-- name: QueryAssets :many SELECT assets.asset_id AS asset_primary_key, assets.genesis_id, assets.version, spent, - script_keys.tweak AS script_key_tweak, - script_keys.tweaked_script_key, - script_keys.declared_known AS script_key_declared_known, - internal_keys.raw_key AS script_key_raw, - internal_keys.key_family AS script_key_fam, - internal_keys.key_index AS script_key_index, + script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, + internal_keys.key_id, internal_keys.raw_key, internal_keys.key_family, internal_keys.key_index, key_group_info_view.tapscript_root, key_group_info_view.witness_stack, key_group_info_view.tweaked_group_key, @@ -2398,12 +2395,8 @@ type QueryAssetsRow struct { GenesisID int64 Version int32 Spent bool - ScriptKeyTweak []byte - TweakedScriptKey []byte - ScriptKeyDeclaredKnown sql.NullBool - ScriptKeyRaw []byte - ScriptKeyFam int32 - ScriptKeyIndex int32 + ScriptKey ScriptKey + InternalKey InternalKey TapscriptRoot []byte WitnessStack []byte TweakedGroupKey []byte @@ -2473,12 +2466,15 @@ func (q *Queries) QueryAssets(ctx context.Context, arg QueryAssetsParams) ([]Que &i.GenesisID, &i.Version, &i.Spent, - &i.ScriptKeyTweak, - &i.TweakedScriptKey, - &i.ScriptKeyDeclaredKnown, - &i.ScriptKeyRaw, - &i.ScriptKeyFam, - &i.ScriptKeyIndex, + &i.ScriptKey.ScriptKeyID, + &i.ScriptKey.InternalKeyID, + &i.ScriptKey.TweakedScriptKey, + &i.ScriptKey.Tweak, + &i.ScriptKey.DeclaredKnown, + &i.InternalKey.KeyID, + &i.InternalKey.RawKey, + &i.InternalKey.KeyFamily, + &i.InternalKey.KeyIndex, &i.TapscriptRoot, &i.WitnessStack, &i.TweakedGroupKey, diff --git a/tapdb/sqlc/queries/addrs.sql b/tapdb/sqlc/queries/addrs.sql index ece4b3cbb..a7764347a 100644 --- a/tapdb/sqlc/queries/addrs.sql +++ b/tapdb/sqlc/queries/addrs.sql @@ -10,12 +10,8 @@ SELECT version, asset_version, genesis_asset_id, group_key, tapscript_sibling, taproot_output_key, amount, asset_type, creation_time, managed_from, proof_courier_addr, - script_keys.tweaked_script_key, - script_keys.tweak AS script_key_tweak, - script_keys.declared_known AS script_key_declared_known, - raw_script_keys.raw_key AS raw_script_key, - raw_script_keys.key_family AS script_key_family, - raw_script_keys.key_index AS script_key_index, + sqlc.embed(script_keys), + sqlc.embed(raw_script_keys), taproot_keys.raw_key AS raw_taproot_key, taproot_keys.key_family AS taproot_key_family, taproot_keys.key_index AS taproot_key_index @@ -38,12 +34,8 @@ SELECT version, asset_version, genesis_asset_id, group_key, tapscript_sibling, taproot_output_key, amount, asset_type, creation_time, managed_from, proof_courier_addr, - script_keys.tweaked_script_key, - script_keys.tweak AS script_key_tweak, - script_keys.declared_known AS script_key_declared_known, - raw_script_keys.raw_key as raw_script_key, - raw_script_keys.key_family AS script_key_family, - raw_script_keys.key_index AS script_key_index, + sqlc.embed(script_keys), + sqlc.embed(raw_script_keys), taproot_keys.raw_key AS raw_taproot_key, taproot_keys.key_family AS taproot_key_family, taproot_keys.key_index AS taproot_key_index diff --git a/tapdb/sqlc/queries/assets.sql b/tapdb/sqlc/queries/assets.sql index 9ed18b79e..2e87f48d4 100644 --- a/tapdb/sqlc/queries/assets.sql +++ b/tapdb/sqlc/queries/assets.sql @@ -135,6 +135,9 @@ SELECT seedling_id, asset_name, asset_type, asset_version, asset_supply, sqlc.embed(assets_meta), emission_enabled, batch_id, group_genesis_id, group_anchor_id, group_tapscript_root, + -- TODO(guggero): We should use sqlc.embed() for the script key and internal + -- key fields, but we can't because it's a LEFT JOIN. We should check if the + -- LEFT JOIN is actually necessary or if we always have keys for seedlings. script_keys.tweak AS script_key_tweak, script_keys.tweaked_script_key, script_keys.declared_known AS script_key_declared_known, @@ -254,11 +257,9 @@ WITH genesis_info AS ( WHERE wit.gen_asset_id IN (SELECT gen_asset_id FROM genesis_info) ) SELECT - version, script_keys.tweak, script_keys.tweaked_script_key, - script_keys.declared_known AS script_key_declared_known, - internal_keys.raw_key AS script_key_raw, - internal_keys.key_family AS script_key_fam, - internal_keys.key_index AS script_key_index, + version, + sqlc.embed(script_keys), + sqlc.embed(internal_keys), key_group_info.tapscript_root, key_group_info.witness_stack, key_group_info.tweaked_group_key, @@ -425,12 +426,8 @@ WHERE ( SELECT assets.asset_id AS asset_primary_key, assets.genesis_id, assets.version, spent, - script_keys.tweak AS script_key_tweak, - script_keys.tweaked_script_key, - script_keys.declared_known AS script_key_declared_known, - internal_keys.raw_key AS script_key_raw, - internal_keys.key_family AS script_key_fam, - internal_keys.key_index AS script_key_index, + sqlc.embed(script_keys), + sqlc.embed(internal_keys), key_group_info_view.tapscript_root, key_group_info_view.witness_stack, key_group_info_view.tweaked_group_key, @@ -896,7 +893,7 @@ FROM script_keys WHERE tweaked_script_key = $1; -- name: FetchScriptKeyByTweakedKey :one -SELECT tweak, raw_key, key_family, key_index, declared_known +SELECT sqlc.embed(script_keys), sqlc.embed(internal_keys) FROM script_keys JOIN internal_keys ON script_keys.internal_key_id = internal_keys.key_id diff --git a/tapdb/sqlc/queries/transfers.sql b/tapdb/sqlc/queries/transfers.sql index ad350f6bd..9b2c1bd88 100644 --- a/tapdb/sqlc/queries/transfers.sql +++ b/tapdb/sqlc/queries/transfers.sql @@ -91,13 +91,8 @@ SELECT utxo_internal_keys.raw_key AS internal_key_raw_key_bytes, utxo_internal_keys.key_family AS internal_key_family, utxo_internal_keys.key_index AS internal_key_index, - script_keys.tweaked_script_key AS script_key_bytes, - script_keys.tweak AS script_key_tweak, - script_keys.declared_known AS script_key_declared_known, - script_key AS script_key_id, - script_internal_keys.raw_key AS script_key_raw_key_bytes, - script_internal_keys.key_family AS script_key_family, - script_internal_keys.key_index AS script_key_index + sqlc.embed(script_keys), + sqlc.embed(script_internal_keys) FROM asset_transfer_outputs outputs JOIN managed_utxos utxos ON outputs.anchor_utxo = utxos.utxo_id diff --git a/tapdb/sqlc/transfers.sql.go b/tapdb/sqlc/transfers.sql.go index c71a00c94..04c736389 100644 --- a/tapdb/sqlc/transfers.sql.go +++ b/tapdb/sqlc/transfers.sql.go @@ -137,13 +137,8 @@ SELECT utxo_internal_keys.raw_key AS internal_key_raw_key_bytes, utxo_internal_keys.key_family AS internal_key_family, utxo_internal_keys.key_index AS internal_key_index, - script_keys.tweaked_script_key AS script_key_bytes, - script_keys.tweak AS script_key_tweak, - script_keys.declared_known AS script_key_declared_known, - script_key AS script_key_id, - script_internal_keys.raw_key AS script_key_raw_key_bytes, - script_internal_keys.key_family AS script_key_family, - script_internal_keys.key_index AS script_key_index + script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, + script_internal_keys.key_id, script_internal_keys.raw_key, script_internal_keys.key_family, script_internal_keys.key_index FROM asset_transfer_outputs outputs JOIN managed_utxos utxos ON outputs.anchor_utxo = utxos.utxo_id @@ -183,13 +178,8 @@ type FetchTransferOutputsRow struct { InternalKeyRawKeyBytes []byte InternalKeyFamily int32 InternalKeyIndex int32 - ScriptKeyBytes []byte - ScriptKeyTweak []byte - ScriptKeyDeclaredKnown sql.NullBool - ScriptKeyID int64 - ScriptKeyRawKeyBytes []byte - ScriptKeyFamily int32 - ScriptKeyIndex int32 + ScriptKey ScriptKey + InternalKey InternalKey } func (q *Queries) FetchTransferOutputs(ctx context.Context, transferID int64) ([]FetchTransferOutputsRow, error) { @@ -227,13 +217,15 @@ func (q *Queries) FetchTransferOutputs(ctx context.Context, transferID int64) ([ &i.InternalKeyRawKeyBytes, &i.InternalKeyFamily, &i.InternalKeyIndex, - &i.ScriptKeyBytes, - &i.ScriptKeyTweak, - &i.ScriptKeyDeclaredKnown, - &i.ScriptKeyID, - &i.ScriptKeyRawKeyBytes, - &i.ScriptKeyFamily, - &i.ScriptKeyIndex, + &i.ScriptKey.ScriptKeyID, + &i.ScriptKey.InternalKeyID, + &i.ScriptKey.TweakedScriptKey, + &i.ScriptKey.Tweak, + &i.ScriptKey.DeclaredKnown, + &i.InternalKey.KeyID, + &i.InternalKey.RawKey, + &i.InternalKey.KeyFamily, + &i.InternalKey.KeyIndex, ); err != nil { return nil, err } From 72bfde5114e91fc796ea2769c12b013e350c9f5b Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 3 Apr 2025 14:51:31 +0200 Subject: [PATCH 03/17] tapdb: add script_keys.key_type column With this commit we add a new numeric type for the type of a script key. This will be a Golang enum/const that's going to be assigned manually when declaring a key as known. For existing keys, we'll add a new mechanism in the following commits that runs on startup after we detect a SQL migration was applied that will attempt the detection of the type of those keys. --- tapdb/migrations.go | 2 +- tapdb/sqlc/addrs.sql.go | 6 +- tapdb/sqlc/assets.sql.go | 101 ++++++++++++++---- .../000033_script_key_type.down.sql | 1 + .../migrations/000033_script_key_type.up.sql | 7 ++ tapdb/sqlc/models.go | 1 + tapdb/sqlc/querier.go | 1 + tapdb/sqlc/queries/assets.sql | 48 ++++++--- tapdb/sqlc/schemas/generated_schema.sql | 2 +- tapdb/sqlc/transfers.sql.go | 3 +- 10 files changed, 134 insertions(+), 38 deletions(-) create mode 100644 tapdb/sqlc/migrations/000033_script_key_type.down.sql create mode 100644 tapdb/sqlc/migrations/000033_script_key_type.up.sql diff --git a/tapdb/migrations.go b/tapdb/migrations.go index b9e9c588f..38ef327cc 100644 --- a/tapdb/migrations.go +++ b/tapdb/migrations.go @@ -22,7 +22,7 @@ const ( // daemon. // // NOTE: This MUST be updated when a new migration is added. - LatestMigrationVersion = 32 + LatestMigrationVersion = 33 ) // MigrationTarget is a functional option that can be passed to applyMigrations diff --git a/tapdb/sqlc/addrs.sql.go b/tapdb/sqlc/addrs.sql.go index 0dabe241f..1123a2b73 100644 --- a/tapdb/sqlc/addrs.sql.go +++ b/tapdb/sqlc/addrs.sql.go @@ -16,7 +16,7 @@ SELECT version, asset_version, genesis_asset_id, group_key, tapscript_sibling, taproot_output_key, amount, asset_type, creation_time, managed_from, proof_courier_addr, - script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, + script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, script_keys.key_type, raw_script_keys.key_id, raw_script_keys.raw_key, raw_script_keys.key_family, raw_script_keys.key_index, taproot_keys.raw_key AS raw_taproot_key, taproot_keys.key_family AS taproot_key_family, @@ -70,6 +70,7 @@ func (q *Queries) FetchAddrByTaprootOutputKey(ctx context.Context, taprootOutput &i.ScriptKey.TweakedScriptKey, &i.ScriptKey.Tweak, &i.ScriptKey.DeclaredKnown, + &i.ScriptKey.KeyType, &i.InternalKey.KeyID, &i.InternalKey.RawKey, &i.InternalKey.KeyFamily, @@ -202,7 +203,7 @@ SELECT version, asset_version, genesis_asset_id, group_key, tapscript_sibling, taproot_output_key, amount, asset_type, creation_time, managed_from, proof_courier_addr, - script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, + script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, script_keys.key_type, raw_script_keys.key_id, raw_script_keys.raw_key, raw_script_keys.key_family, raw_script_keys.key_index, taproot_keys.raw_key AS raw_taproot_key, taproot_keys.key_family AS taproot_key_family, @@ -281,6 +282,7 @@ func (q *Queries) FetchAddrs(ctx context.Context, arg FetchAddrsParams) ([]Fetch &i.ScriptKey.TweakedScriptKey, &i.ScriptKey.Tweak, &i.ScriptKey.DeclaredKnown, + &i.ScriptKey.KeyType, &i.InternalKey.KeyID, &i.InternalKey.RawKey, &i.InternalKey.KeyFamily, diff --git a/tapdb/sqlc/assets.sql.go b/tapdb/sqlc/assets.sql.go index 7534daa0a..837dc0e51 100644 --- a/tapdb/sqlc/assets.sql.go +++ b/tapdb/sqlc/assets.sql.go @@ -973,7 +973,7 @@ WITH genesis_info AS ( ) SELECT version, - script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, + script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, script_keys.key_type, internal_keys.key_id, internal_keys.raw_key, internal_keys.key_family, internal_keys.key_index, key_group_info.tapscript_root, key_group_info.witness_stack, @@ -1043,6 +1043,7 @@ func (q *Queries) FetchAssetsForBatch(ctx context.Context, rawKey []byte) ([]Fet &i.ScriptKey.TweakedScriptKey, &i.ScriptKey.Tweak, &i.ScriptKey.DeclaredKnown, + &i.ScriptKey.KeyType, &i.InternalKey.KeyID, &i.InternalKey.RawKey, &i.InternalKey.KeyFamily, @@ -1670,7 +1671,7 @@ func (q *Queries) FetchMintingBatchesByInverseState(ctx context.Context, batchSt } const FetchScriptKeyByTweakedKey = `-- name: FetchScriptKeyByTweakedKey :one -SELECT script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, internal_keys.key_id, internal_keys.raw_key, internal_keys.key_family, internal_keys.key_index +SELECT script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, script_keys.key_type, internal_keys.key_id, internal_keys.raw_key, internal_keys.key_family, internal_keys.key_index FROM script_keys JOIN internal_keys ON script_keys.internal_key_id = internal_keys.key_id @@ -1691,6 +1692,7 @@ func (q *Queries) FetchScriptKeyByTweakedKey(ctx context.Context, tweakedScriptK &i.ScriptKey.TweakedScriptKey, &i.ScriptKey.Tweak, &i.ScriptKey.DeclaredKnown, + &i.ScriptKey.KeyType, &i.InternalKey.KeyID, &i.InternalKey.RawKey, &i.InternalKey.KeyFamily, @@ -1787,6 +1789,7 @@ SELECT seedling_id, asset_name, asset_type, asset_version, asset_supply, script_keys.tweak AS script_key_tweak, script_keys.tweaked_script_key, script_keys.declared_known AS script_key_declared_known, + script_keys.key_type AS script_key_type, internal_keys.raw_key AS script_key_raw, internal_keys.key_family AS script_key_fam, internal_keys.key_index AS script_key_index, @@ -1820,6 +1823,7 @@ type FetchSeedlingsForBatchRow struct { ScriptKeyTweak []byte TweakedScriptKey []byte ScriptKeyDeclaredKnown sql.NullBool + ScriptKeyType sql.NullInt16 ScriptKeyRaw []byte ScriptKeyFam sql.NullInt32 ScriptKeyIndex sql.NullInt32 @@ -1859,6 +1863,7 @@ func (q *Queries) FetchSeedlingsForBatch(ctx context.Context, rawKey []byte) ([] &i.ScriptKeyTweak, &i.TweakedScriptKey, &i.ScriptKeyDeclaredKnown, + &i.ScriptKeyType, &i.ScriptKeyRaw, &i.ScriptKeyFam, &i.ScriptKeyIndex, @@ -1927,6 +1932,53 @@ func (q *Queries) FetchTapscriptTree(ctx context.Context, rootHash []byte) ([]Fe return items, nil } +const FetchUnknownTypeScriptKeys = `-- name: FetchUnknownTypeScriptKeys :many +SELECT script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, script_keys.key_type, internal_keys.key_id, internal_keys.raw_key, internal_keys.key_family, internal_keys.key_index +FROM script_keys +JOIN internal_keys + ON script_keys.internal_key_id = internal_keys.key_id +WHERE script_keys.key_type IS NULL +` + +type FetchUnknownTypeScriptKeysRow struct { + ScriptKey ScriptKey + InternalKey InternalKey +} + +func (q *Queries) FetchUnknownTypeScriptKeys(ctx context.Context) ([]FetchUnknownTypeScriptKeysRow, error) { + rows, err := q.db.QueryContext(ctx, FetchUnknownTypeScriptKeys) + if err != nil { + return nil, err + } + defer rows.Close() + var items []FetchUnknownTypeScriptKeysRow + for rows.Next() { + var i FetchUnknownTypeScriptKeysRow + if err := rows.Scan( + &i.ScriptKey.ScriptKeyID, + &i.ScriptKey.InternalKeyID, + &i.ScriptKey.TweakedScriptKey, + &i.ScriptKey.Tweak, + &i.ScriptKey.DeclaredKnown, + &i.ScriptKey.KeyType, + &i.InternalKey.KeyID, + &i.InternalKey.RawKey, + &i.InternalKey.KeyFamily, + &i.InternalKey.KeyIndex, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const GenesisAssets = `-- name: GenesisAssets :many SELECT gen_asset_id, asset_id, asset_tag, meta_data_id, output_index, asset_type, genesis_point_id FROM genesis_assets @@ -2297,7 +2349,7 @@ const QueryAssets = `-- name: QueryAssets :many SELECT assets.asset_id AS asset_primary_key, assets.genesis_id, assets.version, spent, - script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, + script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, script_keys.key_type, internal_keys.key_id, internal_keys.raw_key, internal_keys.key_family, internal_keys.key_index, key_group_info_view.tapscript_root, key_group_info_view.witness_stack, @@ -2471,6 +2523,7 @@ func (q *Queries) QueryAssets(ctx context.Context, arg QueryAssetsParams) ([]Que &i.ScriptKey.TweakedScriptKey, &i.ScriptKey.Tweak, &i.ScriptKey.DeclaredKnown, + &i.ScriptKey.KeyType, &i.InternalKey.KeyID, &i.InternalKey.RawKey, &i.InternalKey.KeyFamily, @@ -3030,27 +3083,37 @@ func (q *Queries) UpsertMintAnchorUniCommitment(ctx context.Context, arg UpsertM const UpsertScriptKey = `-- name: UpsertScriptKey :one INSERT INTO script_keys ( - internal_key_id, tweaked_script_key, tweak, declared_known + internal_key_id, tweaked_script_key, tweak, declared_known, key_type ) VALUES ( - $1, $2, $3, $4 + $1, $2, $3, $4, $5 ) ON CONFLICT (tweaked_script_key) - -- Overwrite the declared_known and tweak fields if they were previously - -- unknown. + -- Overwrite the declared_known, key_type and tweak fields if they were + -- previously unknown. DO UPDATE SET tweaked_script_key = EXCLUDED.tweaked_script_key, -- If the script key was previously unknown, we'll update to the new - -- value. - declared_known = CASE - WHEN script_keys.declared_known IS NULL OR script_keys.declared_known = FALSE - THEN COALESCE(EXCLUDED.declared_known, script_keys.declared_known) - ELSE script_keys.declared_known - END, + -- value, if that is non-NULL. + declared_known = + CASE + WHEN COALESCE(script_keys.declared_known, FALSE) = FALSE + THEN COALESCE(EXCLUDED.declared_known, script_keys.declared_known) + ELSE script_keys.declared_known + END, -- If the tweak was previously unknown, we'll update to the new value. - tweak = CASE - WHEN script_keys.tweak IS NULL - THEN COALESCE(EXCLUDED.tweak, script_keys.tweak) - ELSE script_keys.tweak - END + tweak = + CASE + WHEN script_keys.tweak IS NULL + THEN COALESCE(EXCLUDED.tweak, script_keys.tweak) + ELSE script_keys.tweak + END, + -- We only overwrite the key type with a value that does not mean + -- "unknown" (0 or NULL). + key_type = + CASE + WHEN COALESCE(EXCLUDED.key_type, 0) != 0 + THEN EXCLUDED.key_type + ELSE script_keys.key_type + END RETURNING script_key_id ` @@ -3059,6 +3122,7 @@ type UpsertScriptKeyParams struct { TweakedScriptKey []byte Tweak []byte DeclaredKnown sql.NullBool + KeyType sql.NullInt16 } func (q *Queries) UpsertScriptKey(ctx context.Context, arg UpsertScriptKeyParams) (int64, error) { @@ -3067,6 +3131,7 @@ func (q *Queries) UpsertScriptKey(ctx context.Context, arg UpsertScriptKeyParams arg.TweakedScriptKey, arg.Tweak, arg.DeclaredKnown, + arg.KeyType, ) var script_key_id int64 err := row.Scan(&script_key_id) diff --git a/tapdb/sqlc/migrations/000033_script_key_type.down.sql b/tapdb/sqlc/migrations/000033_script_key_type.down.sql new file mode 100644 index 000000000..1414c9cad --- /dev/null +++ b/tapdb/sqlc/migrations/000033_script_key_type.down.sql @@ -0,0 +1 @@ +ALTER TABLE script_keys DROP COLUMN key_type; diff --git a/tapdb/sqlc/migrations/000033_script_key_type.up.sql b/tapdb/sqlc/migrations/000033_script_key_type.up.sql new file mode 100644 index 000000000..6166205c5 --- /dev/null +++ b/tapdb/sqlc/migrations/000033_script_key_type.up.sql @@ -0,0 +1,7 @@ +-- The key_type column is used to store the type of key that is stored in the +-- script_keys table. The type is a Golang numeric type that will have values +-- such as BIP-0086, script path with custom (externally defined) script, script +-- path with Taproot Asset Channel related script, etc. The NULL value +-- will mean the type is not known. Existing script keys at the time of this +-- migration will be updated at startup after the migration is applied. +ALTER TABLE script_keys ADD COLUMN key_type SMALLINT; diff --git a/tapdb/sqlc/models.go b/tapdb/sqlc/models.go index d75129bdf..dfc401ba6 100644 --- a/tapdb/sqlc/models.go +++ b/tapdb/sqlc/models.go @@ -344,6 +344,7 @@ type ScriptKey struct { TweakedScriptKey []byte Tweak []byte DeclaredKnown sql.NullBool + KeyType sql.NullInt16 } type TapscriptEdge struct { diff --git a/tapdb/sqlc/querier.go b/tapdb/sqlc/querier.go index 621acae6e..374a4b27a 100644 --- a/tapdb/sqlc/querier.go +++ b/tapdb/sqlc/querier.go @@ -94,6 +94,7 @@ type Querier interface { FetchTransferOutputs(ctx context.Context, transferID int64) ([]FetchTransferOutputsRow, error) FetchUniverseKeys(ctx context.Context, arg FetchUniverseKeysParams) ([]FetchUniverseKeysRow, error) FetchUniverseRoot(ctx context.Context, namespace string) (FetchUniverseRootRow, error) + FetchUnknownTypeScriptKeys(ctx context.Context) ([]FetchUnknownTypeScriptKeysRow, error) GenesisAssets(ctx context.Context) ([]GenesisAsset, error) GenesisPoints(ctx context.Context) ([]GenesisPoint, error) GetRootKey(ctx context.Context, id []byte) (Macaroon, error) diff --git a/tapdb/sqlc/queries/assets.sql b/tapdb/sqlc/queries/assets.sql index 2e87f48d4..0b4fef04f 100644 --- a/tapdb/sqlc/queries/assets.sql +++ b/tapdb/sqlc/queries/assets.sql @@ -141,6 +141,7 @@ SELECT seedling_id, asset_name, asset_type, asset_version, asset_supply, script_keys.tweak AS script_key_tweak, script_keys.tweaked_script_key, script_keys.declared_known AS script_key_declared_known, + script_keys.key_type AS script_key_type, internal_keys.raw_key AS script_key_raw, internal_keys.key_family AS script_key_fam, internal_keys.key_index AS script_key_index, @@ -864,27 +865,37 @@ WHERE txid = $1; -- name: UpsertScriptKey :one INSERT INTO script_keys ( - internal_key_id, tweaked_script_key, tweak, declared_known + internal_key_id, tweaked_script_key, tweak, declared_known, key_type ) VALUES ( - $1, $2, $3, $4 + $1, $2, $3, $4, $5 ) ON CONFLICT (tweaked_script_key) - -- Overwrite the declared_known and tweak fields if they were previously - -- unknown. + -- Overwrite the declared_known, key_type and tweak fields if they were + -- previously unknown. DO UPDATE SET tweaked_script_key = EXCLUDED.tweaked_script_key, -- If the script key was previously unknown, we'll update to the new - -- value. - declared_known = CASE - WHEN script_keys.declared_known IS NULL OR script_keys.declared_known = FALSE - THEN COALESCE(EXCLUDED.declared_known, script_keys.declared_known) - ELSE script_keys.declared_known - END, + -- value, if that is non-NULL. + declared_known = + CASE + WHEN COALESCE(script_keys.declared_known, FALSE) = FALSE + THEN COALESCE(EXCLUDED.declared_known, script_keys.declared_known) + ELSE script_keys.declared_known + END, -- If the tweak was previously unknown, we'll update to the new value. - tweak = CASE - WHEN script_keys.tweak IS NULL - THEN COALESCE(EXCLUDED.tweak, script_keys.tweak) - ELSE script_keys.tweak - END + tweak = + CASE + WHEN script_keys.tweak IS NULL + THEN COALESCE(EXCLUDED.tweak, script_keys.tweak) + ELSE script_keys.tweak + END, + -- We only overwrite the key type with a value that does not mean + -- "unknown" (0 or NULL). + key_type = + CASE + WHEN COALESCE(EXCLUDED.key_type, 0) != 0 + THEN EXCLUDED.key_type + ELSE script_keys.key_type + END RETURNING script_key_id; -- name: FetchScriptKeyIDByTweakedKey :one @@ -899,6 +910,13 @@ JOIN internal_keys ON script_keys.internal_key_id = internal_keys.key_id WHERE script_keys.tweaked_script_key = $1; +-- name: FetchUnknownTypeScriptKeys :many +SELECT sqlc.embed(script_keys), sqlc.embed(internal_keys) +FROM script_keys +JOIN internal_keys + ON script_keys.internal_key_id = internal_keys.key_id +WHERE script_keys.key_type IS NULL; + -- name: FetchInternalKeyLocator :one SELECT key_family, key_index FROM internal_keys diff --git a/tapdb/sqlc/schemas/generated_schema.sql b/tapdb/sqlc/schemas/generated_schema.sql index 2130d3c8e..05552cce2 100644 --- a/tapdb/sqlc/schemas/generated_schema.sql +++ b/tapdb/sqlc/schemas/generated_schema.sql @@ -716,7 +716,7 @@ CREATE TABLE script_keys ( -- An optional tweak for the script_key. If NULL, the raw_key may be -- tweaked BIP-0086 style. tweak BLOB -, declared_known BOOLEAN); +, declared_known BOOLEAN, key_type SMALLINT); CREATE INDEX status_idx ON addr_events(status); diff --git a/tapdb/sqlc/transfers.sql.go b/tapdb/sqlc/transfers.sql.go index 04c736389..75a88ceb0 100644 --- a/tapdb/sqlc/transfers.sql.go +++ b/tapdb/sqlc/transfers.sql.go @@ -137,7 +137,7 @@ SELECT utxo_internal_keys.raw_key AS internal_key_raw_key_bytes, utxo_internal_keys.key_family AS internal_key_family, utxo_internal_keys.key_index AS internal_key_index, - script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, + script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, script_keys.key_type, script_internal_keys.key_id, script_internal_keys.raw_key, script_internal_keys.key_family, script_internal_keys.key_index FROM asset_transfer_outputs outputs JOIN managed_utxos utxos @@ -222,6 +222,7 @@ func (q *Queries) FetchTransferOutputs(ctx context.Context, transferID int64) ([ &i.ScriptKey.TweakedScriptKey, &i.ScriptKey.Tweak, &i.ScriptKey.DeclaredKnown, + &i.ScriptKey.KeyType, &i.InternalKey.KeyID, &i.InternalKey.RawKey, &i.InternalKey.KeyFamily, From 6888d9a20b8c69053ed2b48197f733a3a968afc7 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 3 Apr 2025 14:51:33 +0200 Subject: [PATCH 04/17] multi: add type to script key With this commit we add a type enum to the script key. This will mostly be used on the database level to filter assets when listing or calculating balances. We can only be 100% certain about the type of a key in the case of BIP-0086 or where we explicitly create them in the tapchannel package. Anything else is a bit of a guess, since the keys are coming over the RPC interface. So we just assume any key that has a non-empty script path is an externally-defined (external app) script spend. This heuristic should be good enough to filter out channel related assets or assets that can't be spent without external instructions in balance RPC calls. --- address/book.go | 19 +++++-- asset/asset.go | 93 ++++++++++++++++++++++++++++++--- asset/generators.go | 3 ++ rpcserver.go | 7 ++- tapchannel/aux_closer.go | 6 --- tapchannel/aux_sweeper.go | 12 +++-- tapchannel/commitment.go | 4 +- tapdb/addrs.go | 7 ++- tapdb/addrs_test.go | 107 +++++++++++++++++++++++++++++++++----- tapdb/asset_minting.go | 4 ++ tapdb/assets_common.go | 5 ++ tapdb/assets_store.go | 7 ++- 12 files changed, 236 insertions(+), 38 deletions(-) diff --git a/address/book.go b/address/book.go index 10cc88ec3..de7d02a27 100644 --- a/address/book.go +++ b/address/book.go @@ -140,7 +140,7 @@ type Storage interface { // being relevant for the local wallet (e.g. show assets received on // this key in the asset list and balances). InsertScriptKey(ctx context.Context, scriptKey asset.ScriptKey, - declareAsKnown bool) error + declareAsKnown bool, keyType asset.ScriptKeyType) error } // KeyRing is used to create script and internal keys for Taproot Asset @@ -401,7 +401,12 @@ func (b *Book) NewAddressWithKeys(ctx context.Context, addrVersion Version, if err != nil { return nil, fmt.Errorf("unable to insert internal key: %w", err) } - err = b.cfg.Store.InsertScriptKey(ctx, scriptKey, true) + + // We might not know the type of script key, if it was given to us + // through an RPC call. So we make a guess here. + keyType := scriptKey.GuessType() + + err = b.cfg.Store.InsertScriptKey(ctx, scriptKey, true, keyType) if err != nil { return nil, fmt.Errorf("unable to insert script key: %w", err) } @@ -438,9 +443,11 @@ func (b *Book) IsLocalKey(ctx context.Context, // InsertScriptKey inserts an address related script key into the database. func (b *Book) InsertScriptKey(ctx context.Context, scriptKey asset.ScriptKey, - declareAsKnown bool) error { + declareAsKnown bool, keyType asset.ScriptKeyType) error { - return b.cfg.Store.InsertScriptKey(ctx, scriptKey, declareAsKnown) + return b.cfg.Store.InsertScriptKey( + ctx, scriptKey, declareAsKnown, keyType, + ) } // NextInternalKey derives then inserts an internal key into the database to @@ -475,7 +482,9 @@ func (b *Book) NextScriptKey(ctx context.Context, } scriptKey := asset.NewScriptKeyBip86(keyDesc) - err = b.cfg.Store.InsertScriptKey(ctx, scriptKey, true) + err = b.cfg.Store.InsertScriptKey( + ctx, scriptKey, true, asset.ScriptKeyBip86, + ) if err != nil { return asset.ScriptKey{}, err } diff --git a/asset/asset.go b/asset/asset.go index d6041ba14..9a8a63c6e 100644 --- a/asset/asset.go +++ b/asset/asset.go @@ -108,6 +108,50 @@ const ( EncodeSegwit ) +// ScriptKeyType denotes the type of script key used for an asset. This type is +// serialized to the database, so we don't use iota for the values to ensure +// they don't change by accident. +type ScriptKeyType uint8 + +const ( + // ScriptKeyUnknown is the default script key type used for assets that + // we don't know the type of. This should only be stored for assets + // where we don't know the internal key of the script key (e.g. for + // imported proofs). + ScriptKeyUnknown ScriptKeyType = 0 + + // ScriptKeyBip86 is the script key type used for assets that use the + // BIP86 style tweak (e.g. an empty tweak). + ScriptKeyBip86 ScriptKeyType = 1 + + // ScriptKeyScriptPathExternal is the script key type used for assets + // that use a script path that is defined by an external application. + // Keys with script paths are normally not shown in asset balances and + // by default aren't used for coin selection unless specifically + // requested. + ScriptKeyScriptPathExternal ScriptKeyType = 2 + + // ScriptKeyBurn is the script key type used for assets that are burned + // and not spendable. + ScriptKeyBurn ScriptKeyType = 3 + + // ScriptKeyTombstone is the script key type used for assets that are + // not spendable and have been marked as tombstones. This is only the + // case for zero-value assets that result from a non-interactive (TAP + // address) send where no change was left over. The script key used for + // this is a NUMS key that is not spendable. + ScriptKeyTombstone ScriptKeyType = 4 + + // ScriptKeyScriptPathChannel is the script key type used for assets + // that use a script path that is somehow related to Taproot Asset + // Channels. That means the script key is either a funding key + // (OP_TRUE), a commitment output key (to_local, to_remote, htlc), or a + // HTLC second-level transaction output key. + // Keys related to channels are not shown in asset balances (unless + // specifically requested) and are _never_ used for coin selection. + ScriptKeyScriptPathChannel ScriptKeyType = 5 +) + var ( // ZeroPrevID is the blank prev ID used for genesis assets and also // asset split leaves. @@ -1013,6 +1057,9 @@ type TweakedScriptKey struct { // flag has is that assets with a declared key are shown in the asset // list/balance. DeclaredKnown bool + + // Type is the type of script key that is being used. + Type ScriptKeyType } // IsEqual returns true is this tweaked script key is exactly equivalent to the @@ -1098,15 +1145,49 @@ func (s *ScriptKey) HasScriptPath() bool { return s.TweakedScriptKey != nil && len(s.TweakedScriptKey.Tweak) > 0 } +// GuessType tries to guess the type of the script key based on the information +// available. +func (s *ScriptKey) GuessType() ScriptKeyType { + // If we have an explicit script key type set, we can return that. + if s.TweakedScriptKey != nil && + s.TweakedScriptKey.Type != ScriptKeyUnknown { + + return s.TweakedScriptKey.Type + } + + // If there is a known tweak, then we know that this is a script path + // key. We never return the channel type, since those keys should always + // be declared properly, and we never should need to guess their type. + if s.HasScriptPath() { + return ScriptKeyScriptPathExternal + } + + // Is it the known NUMS key? Then this is a tombstone output. + if s.PubKey != nil && s.PubKey.IsEqual(NUMSPubKey) { + return ScriptKeyTombstone + } + + // Do we know the internal key? Then we can check whether it is a + // BIP-0086 key. + if s.PubKey != nil && s.TweakedScriptKey != nil && + s.TweakedScriptKey.RawKey.PubKey != nil { + + bip86 := NewScriptKeyBip86(s.TweakedScriptKey.RawKey) + if bip86.PubKey.IsEqual(s.PubKey) { + return ScriptKeyBip86 + } + } + + return ScriptKeyUnknown +} + // NewScriptKey constructs a ScriptKey with only the publicly available // information. This resulting key may or may not have a tweak applied to it. func NewScriptKey(key *btcec.PublicKey) ScriptKey { // Since we'll never query lnd for a tweaked key, it doesn't matter if // we lose the parity information here. And this will only ever be // serialized on chain in a 32-bit representation as well. - key, _ = schnorr.ParsePubKey( - schnorr.SerializePubKey(key), - ) + key, _ = schnorr.ParsePubKey(schnorr.SerializePubKey(key)) return ScriptKey{ PubKey: key, } @@ -1118,9 +1199,7 @@ func NewScriptKey(key *btcec.PublicKey) ScriptKey { func NewScriptKeyBip86(rawKey keychain.KeyDescriptor) ScriptKey { // Tweak the script key BIP-0086 style (such that we only commit to the // internal key when signing). - tweakedPubKey := txscript.ComputeTaprootKeyNoScript( - rawKey.PubKey, - ) + tweakedPubKey := txscript.ComputeTaprootKeyNoScript(rawKey.PubKey) // Since we'll never query lnd for a tweaked key, it doesn't matter if // we lose the parity information here. And this will only ever be @@ -1133,6 +1212,7 @@ func NewScriptKeyBip86(rawKey keychain.KeyDescriptor) ScriptKey { PubKey: tweakedPubKey, TweakedScriptKey: &TweakedScriptKey{ RawKey: rawKey, + Type: ScriptKeyBip86, }, } } @@ -1527,6 +1607,7 @@ func (a *Asset) Copy() *Asset { if a.ScriptKey.TweakedScriptKey != nil { assetCopy.ScriptKey.TweakedScriptKey = &TweakedScriptKey{ DeclaredKnown: a.ScriptKey.DeclaredKnown, + Type: a.ScriptKey.Type, } assetCopy.ScriptKey.RawKey = a.ScriptKey.RawKey diff --git a/asset/generators.go b/asset/generators.go index 2af47d0a1..d2ea1bd4c 100644 --- a/asset/generators.go +++ b/asset/generators.go @@ -74,6 +74,9 @@ var ( RawKey: KeyDescGen.Draw(t, "raw_key"), Tweak: HashBytesGen.Draw(t, "tweak"), DeclaredKnown: rapid.Bool().Draw(t, "declared_known"), + Type: ScriptKeyType( + rapid.Int16().Draw(t, "script_key_type"), + ), } }) ScriptKeyGen = rapid.Custom(func(t *rapid.T) ScriptKey { diff --git a/rpcserver.go b/rpcserver.go index ecfe8f051..cbe52a41b 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -7995,7 +7995,12 @@ func (r *rpcServer) DeclareScriptKey(ctx context.Context, err) } - err = r.cfg.TapAddrBook.InsertScriptKey(ctx, *scriptKey, true) + // Because we've been given the key over the RPC interface, we can't be + // 100% sure of the type. But we can make a best effort guess based on + // the fields the user has set. + keyType := scriptKey.GuessType() + + err = r.cfg.TapAddrBook.InsertScriptKey(ctx, *scriptKey, true, keyType) if err != nil { return nil, fmt.Errorf("error inserting script key: %w", err) } diff --git a/tapchannel/aux_closer.go b/tapchannel/aux_closer.go index f474e1b0d..20f633fae 100644 --- a/tapchannel/aux_closer.go +++ b/tapchannel/aux_closer.go @@ -560,12 +560,6 @@ func (a *AuxChanCloser) ShutdownBlob( return none, err } - err = a.cfg.AddrBook.InsertScriptKey(ctx, newKey, true) - if err != nil { - return none, fmt.Errorf("error declaring script key: "+ - "%w", err) - } - scriptKeys[assetID] = *newKey.PubKey } diff --git a/tapchannel/aux_sweeper.go b/tapchannel/aux_sweeper.go index 6460719d7..d32e1bb2e 100644 --- a/tapchannel/aux_sweeper.go +++ b/tapchannel/aux_sweeper.go @@ -1264,7 +1264,9 @@ func (a *AuxSweeper) importCommitScriptKeys(req lnwallet.ResolutionReq) error { ctxb := context.Background() for _, key := range keysToImport { - err := a.cfg.AddrBook.InsertScriptKey(ctxb, key, true) + err := a.cfg.AddrBook.InsertScriptKey( + ctxb, key, true, asset.ScriptKeyScriptPathChannel, + ) if err != nil { return fmt.Errorf("unable to insert script "+ "key: %w", err) @@ -1296,7 +1298,9 @@ func (a *AuxSweeper) importOutputScriptKeys(desc tapscriptSweepDescs) error { log.Debugf("Importing script_keys=%v", limitSpewer.Sdump(scriptKey)) - return a.cfg.AddrBook.InsertScriptKey(ctxb, scriptKey, true) + return a.cfg.AddrBook.InsertScriptKey( + ctxb, scriptKey, true, asset.ScriptKeyScriptPathChannel, + ) } if err := importScriptKey(desc.firstLevel); err != nil { @@ -1489,7 +1493,9 @@ func (a *AuxSweeper) importCommitTx(req lnwallet.ResolutionReq, // the asset will be materialized in the asset table and show up in the // balance correctly. ctxb := context.Background() - err := a.cfg.AddrBook.InsertScriptKey(ctxb, fundingScriptKey, true) + err := a.cfg.AddrBook.InsertScriptKey( + ctxb, fundingScriptKey, true, asset.ScriptKeyScriptPathChannel, + ) if err != nil { return fmt.Errorf("unable to insert script key: %w", err) } diff --git a/tapchannel/commitment.go b/tapchannel/commitment.go index 9f23b7b2f..09d52a466 100644 --- a/tapchannel/commitment.go +++ b/tapchannel/commitment.go @@ -1494,7 +1494,9 @@ func deriveFundingScriptKey(ctx context.Context, addrBook address.Storage, // We'll also need to import the funding script key into the wallet so // the asset will be materialized in the asset table and show up in the // balance correctly. - err := addrBook.InsertScriptKey(ctx, fundingScriptKey, true) + err := addrBook.InsertScriptKey( + ctx, fundingScriptKey, true, asset.ScriptKeyScriptPathChannel, + ) if err != nil { return asset.ScriptKey{}, fmt.Errorf("unable to insert script "+ "key: %w", err) diff --git a/tapdb/addrs.go b/tapdb/addrs.go index 3bebe4adc..17ff56590 100644 --- a/tapdb/addrs.go +++ b/tapdb/addrs.go @@ -268,6 +268,9 @@ func (t *TapAddressBook) InsertAddrs(ctx context.Context, InternalKeyID: rawScriptKeyID, TweakedScriptKey: addr.ScriptKey.SerializeCompressed(), Tweak: addr.ScriptKeyTweak.Tweak, + KeyType: sqlInt16( + addr.ScriptKeyTweak.Type, + ), }) if err != nil { return fmt.Errorf("unable to insert script "+ @@ -649,7 +652,8 @@ func (t *TapAddressBook) InsertInternalKey(ctx context.Context, // it can be recognized as belonging to the wallet when a transfer comes in // later on. func (t *TapAddressBook) InsertScriptKey(ctx context.Context, - scriptKey asset.ScriptKey, declaredKnown bool) error { + scriptKey asset.ScriptKey, declaredKnown bool, + keyType asset.ScriptKeyType) error { var writeTxOpts AddrBookTxOptions return t.db.ExecTx(ctx, &writeTxOpts, func(q AddrBook) error { @@ -666,6 +670,7 @@ func (t *TapAddressBook) InsertScriptKey(ctx context.Context, TweakedScriptKey: scriptKey.PubKey.SerializeCompressed(), Tweak: scriptKey.Tweak, DeclaredKnown: sqlBool(declaredKnown), + KeyType: sqlInt16(keyType), }) return err }) diff --git a/tapdb/addrs_test.go b/tapdb/addrs_test.go index c3e306ace..358a11f1c 100644 --- a/tapdb/addrs_test.go +++ b/tapdb/addrs_test.go @@ -663,8 +663,8 @@ func randScriptKey(t *testing.T) asset.ScriptKey { // insertScriptKeyWithNull is a helper function that inserts a script key with a // a NULL value for declared known. We use this so we can insert a NULL vs an // actual value. It is identical to the InsertScriptKey. -func insertScriptKeyWithNull(ctx context.Context, key asset.ScriptKey, -) func(AddrBook) error { +func insertScriptKeyWithNull(ctx context.Context, + key asset.ScriptKey) func(AddrBook) error { return func(q AddrBook) error { internalKeyID, err := insertInternalKey( @@ -688,11 +688,13 @@ func insertScriptKeyWithNull(ctx context.Context, key asset.ScriptKey, } func assertKeyKnowledge(t *testing.T, ctx context.Context, - addrBook *TapAddressBook, scriptKey asset.ScriptKey, known bool) { + addrBook *TapAddressBook, scriptKey asset.ScriptKey, known bool, + keyType asset.ScriptKeyType) { dbScriptKey, err := addrBook.FetchScriptKey(ctx, scriptKey.PubKey) require.NoError(t, err) require.Equal(t, known, dbScriptKey.DeclaredKnown) + require.Equal(t, keyType, dbScriptKey.Type) } func assertTweak(t *testing.T, ctx context.Context, addrBook *TapAddressBook, @@ -722,20 +724,30 @@ func TestScriptKeyKnownUpsert(t *testing.T) { // We'll insert a random script key into the database. We won't // declare it as known though. - err := addrBook.InsertScriptKey(ctx, scriptKey, known) + err := addrBook.InsertScriptKey( + ctx, scriptKey, known, asset.ScriptKeyBip86, + ) require.NoError(t, err) // We'll fetch the script key and confirm that it's not known. - assertKeyKnowledge(t, ctx, addrBook, scriptKey, known) + assertKeyKnowledge( + t, ctx, addrBook, scriptKey, known, + asset.ScriptKeyBip86, + ) known = true // We'll now insert it again, but this time declare it as known. - err = addrBook.InsertScriptKey(ctx, scriptKey, known) + err = addrBook.InsertScriptKey( + ctx, scriptKey, known, asset.ScriptKeyBip86, + ) require.NoError(t, err) // We'll fetch the script key and confirm that it's known. - assertKeyKnowledge(t, ctx, addrBook, scriptKey, known) + assertKeyKnowledge( + t, ctx, addrBook, scriptKey, known, + asset.ScriptKeyBip86, + ) }) // In this test, we insert a NULL value, and make sure that it can still @@ -753,16 +765,24 @@ func TestScriptKeyKnownUpsert(t *testing.T) { require.NoError(t, err) // We'll fetch the script key and confirm that it's not known. - assertKeyKnowledge(t, ctx, addrBook, scriptKey, known) + assertKeyKnowledge( + t, ctx, addrBook, scriptKey, known, + asset.ScriptKeyUnknown, + ) known = true // We'll now insert it again, but this time declare it as known. - err = addrBook.InsertScriptKey(ctx, scriptKey, known) + err = addrBook.InsertScriptKey( + ctx, scriptKey, known, asset.ScriptKeyBip86, + ) require.NoError(t, err) // We'll fetch the script key and confirm that it's known. - assertKeyKnowledge(t, ctx, addrBook, scriptKey, known) + assertKeyKnowledge( + t, ctx, addrBook, scriptKey, known, + asset.ScriptKeyBip86, + ) }) } @@ -786,11 +806,17 @@ func TestScriptKeyTweakUpsert(t *testing.T) { // We'll insert a random script key into the database. We won't // declare it as known though, and it doesn't have the tweak. - err := addrBook.InsertScriptKey(ctx, scriptKey, known) + err := addrBook.InsertScriptKey( + ctx, scriptKey, known, + asset.ScriptKeyScriptPathExternal, + ) require.NoError(t, err) // We'll fetch the script key and confirm that it's not known. - assertKeyKnowledge(t, ctx, addrBook, scriptKey, known) + assertKeyKnowledge( + t, ctx, addrBook, scriptKey, known, + asset.ScriptKeyScriptPathExternal, + ) assertTweak(t, ctx, addrBook, scriptKey, nil) known = true @@ -799,11 +825,64 @@ func TestScriptKeyTweakUpsert(t *testing.T) { // We'll now insert it again, but this time declare it as known // and also know the tweak. - err = addrBook.InsertScriptKey(ctx, scriptKey, known) + err = addrBook.InsertScriptKey( + ctx, scriptKey, known, + asset.ScriptKeyScriptPathExternal, + ) require.NoError(t, err) // We'll fetch the script key and confirm that it's known. - assertKeyKnowledge(t, ctx, addrBook, scriptKey, known) + assertKeyKnowledge( + t, ctx, addrBook, scriptKey, known, + asset.ScriptKeyScriptPathExternal, + ) assertTweak(t, ctx, addrBook, scriptKey, randTweak) }) } + +// TestScriptKeyTypeUpsert tests that we can insert a script key, then insert +// it again when we know the type for it. +func TestScriptKeyTypeUpsert(t *testing.T) { + t.Parallel() + + // First, make a new addr book instance we'll use in the test below. + testClock := clock.NewTestClock(time.Now()) + addrBook, _ := newAddrBook(t, testClock) + + ctx := context.Background() + + // In this test, we insert the type as unknown, and make sure we + // overwrite it with an actual value again later. + t.Run("null_to_value", func(t *testing.T) { + known := true + scriptKey := randScriptKey(t) + scriptKey.Tweak = nil + + // We'll insert a random script key into the database. It is + // declared as known, but doesn't have a known type. + err := addrBook.InsertScriptKey( + ctx, scriptKey, known, asset.ScriptKeyUnknown, + ) + require.NoError(t, err) + + // We'll fetch the script key and confirm that it's not known. + assertKeyKnowledge( + t, ctx, addrBook, scriptKey, known, + asset.ScriptKeyUnknown, + ) + assertTweak(t, ctx, addrBook, scriptKey, nil) + + // We'll now insert it again, but this time declare it as known + // and also know the tweak. + err = addrBook.InsertScriptKey( + ctx, scriptKey, known, asset.ScriptKeyBip86, + ) + require.NoError(t, err) + + // We'll fetch the script key and confirm that it's known. + assertKeyKnowledge( + t, ctx, addrBook, scriptKey, known, + asset.ScriptKeyBip86, + ) + }) +} diff --git a/tapdb/asset_minting.go b/tapdb/asset_minting.go index 2e5b3a93d..f6acb3479 100644 --- a/tapdb/asset_minting.go +++ b/tapdb/asset_minting.go @@ -740,12 +740,16 @@ func fetchAssetSeedlings(ctx context.Context, q PendingAssetStore, declaredKnown := extractBool( dbSeedling.ScriptKeyDeclaredKnown, ) + scriptType := extractSqlInt16[asset.ScriptKeyType]( + dbSeedling.ScriptKeyType, + ) seedling.ScriptKey = asset.ScriptKey{ PubKey: tweakedScriptKey, TweakedScriptKey: &asset.TweakedScriptKey{ RawKey: scriptKeyRawKey, Tweak: scriptKeyTweak, DeclaredKnown: declaredKnown, + Type: scriptType, }, } } diff --git a/tapdb/assets_common.go b/tapdb/assets_common.go index 3dbff6d08..9b5d0444e 100644 --- a/tapdb/assets_common.go +++ b/tapdb/assets_common.go @@ -424,6 +424,7 @@ func upsertScriptKey(ctx context.Context, scriptKey asset.ScriptKey, InternalKeyID: rawScriptKeyID, TweakedScriptKey: scriptKey.PubKey.SerializeCompressed(), Tweak: scriptKey.Tweak, + KeyType: sqlInt16(scriptKey.Type), }) if err != nil { return 0, fmt.Errorf("%w: %w", ErrUpsertScriptKey, err) @@ -455,6 +456,7 @@ func upsertScriptKey(ctx context.Context, scriptKey asset.ScriptKey, scriptKeyID, err = q.UpsertScriptKey(ctx, NewScriptKey{ InternalKeyID: rawScriptKeyID, TweakedScriptKey: scriptKey.PubKey.SerializeCompressed(), + KeyType: sqlInt16(asset.ScriptKeyUnknown), }) if err != nil { return 0, fmt.Errorf("%w: %w", ErrUpsertScriptKey, err) @@ -511,6 +513,9 @@ func parseScriptKey(ik sqlc.InternalKey, sk sqlc.ScriptKey) (asset.ScriptKey, }, Tweak: sk.Tweak, DeclaredKnown: extractBool(sk.DeclaredKnown), + Type: extractSqlInt16[asset.ScriptKeyType]( + sk.KeyType, + ), }, } err error diff --git a/tapdb/assets_store.go b/tapdb/assets_store.go index 8ad11e63d..2f455e2ee 100644 --- a/tapdb/assets_store.go +++ b/tapdb/assets_store.go @@ -2672,10 +2672,14 @@ func insertAssetTransferOutput(ctx context.Context, q ActiveAssetsStore, scriptInternalKey := keychain.KeyDescriptor{ PubKey: output.ScriptKey.PubKey, } - var tweak []byte + var ( + tweak []byte + scriptKeyType sql.NullInt16 + ) if output.ScriptKey.TweakedScriptKey != nil { scriptInternalKey = output.ScriptKey.RawKey tweak = output.ScriptKey.Tweak + scriptKeyType = sqlInt16(output.ScriptKey.Type) } scriptInternalKeyID, err := q.UpsertInternalKey(ctx, InternalKey{ RawKey: scriptInternalKey.PubKey.SerializeCompressed(), @@ -2690,6 +2694,7 @@ func insertAssetTransferOutput(ctx context.Context, q ActiveAssetsStore, InternalKeyID: scriptInternalKeyID, TweakedScriptKey: output.ScriptKey.PubKey.SerializeCompressed(), Tweak: tweak, + KeyType: scriptKeyType, }) if err != nil { return fmt.Errorf("unable to insert script key: %w", err) From f5f48dc2e6780a45111fd3289878fa9d0183cc57 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 3 Apr 2025 14:51:34 +0200 Subject: [PATCH 05/17] tapfreighter: set type for burn/tombstone keys correctly In order for burn/tombstone keys to be stored with the correct type, we need to detect them before storing the transfer outputs to the database. We can't set the script key type before, because we're carrying around the script key in a virtual packet, where that information isn't available. --- tapfreighter/chain_porter.go | 53 ++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/tapfreighter/chain_porter.go b/tapfreighter/chain_porter.go index 7c9dea813..71dd1c6ed 100644 --- a/tapfreighter/chain_porter.go +++ b/tapfreighter/chain_porter.go @@ -1326,6 +1326,12 @@ func (p *ChainPorter) stateStep(currentPkg sendPackage) (*sendPackage, error) { "%w", err) } + // Burn and tombstone keys are the only keys that we don't + // explicitly store in the DB before this point. But we'll want + // them to have the correct type when creating the transfer, so + // we'll set that now. + detectUnSpendableKeys(currentPkg.VirtualPackets) + // We now need to find out if this is a transfer to ourselves // (e.g. a change output) or an outbound transfer. A key being // local means the lnd node connected to this daemon knows how @@ -1597,6 +1603,53 @@ func (p *ChainPorter) publishSubscriberEvent(event fn.Event) { } } +// detectUnSpendableKeys checks if any of the outputs in the virtual packets are +// burn or tombstone keys and sets the appropriate type on the output script +// key. +func detectUnSpendableKeys(activeTransfers []*tappsbt.VPacket) { + setScriptKeyType := func(vOut *tappsbt.VOutput, + scriptKeyType asset.ScriptKeyType) { + + if vOut.Asset.ScriptKey.TweakedScriptKey == nil { + vOut.Asset.ScriptKey.TweakedScriptKey = new( + asset.TweakedScriptKey, + ) + vOut.Asset.ScriptKey.RawKey.PubKey = + vOut.Asset.ScriptKey.PubKey + } + if vOut.ScriptKey.TweakedScriptKey == nil { + vOut.ScriptKey.TweakedScriptKey = new( + asset.TweakedScriptKey, + ) + vOut.ScriptKey.RawKey.PubKey = vOut.ScriptKey.PubKey + } + + vOut.Asset.ScriptKey.Type = scriptKeyType + vOut.ScriptKey.Type = scriptKeyType + } + + for _, vPkt := range activeTransfers { + for _, vOut := range vPkt.Outputs { + if vOut.Asset == nil { + continue + } + + witness := vOut.Asset.PrevWitnesses + if len(witness) > 0 && asset.IsBurnKey( + vOut.ScriptKey.PubKey, witness[0], + ) { + + setScriptKeyType(vOut, asset.ScriptKeyBurn) + } + + unSpendable, _ := vOut.ScriptKey.IsUnSpendable() + if unSpendable { + setScriptKeyType(vOut, asset.ScriptKeyTombstone) + } + } + } +} + // A compile-time assertion to make sure ChainPorter satisfies the // fn.EventPublisher interface. var _ fn.EventPublisher[fn.Event, bool] = (*ChainPorter)(nil) From 9d53b172420f69be297294b821746b410543bef3 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 3 Apr 2025 14:51:35 +0200 Subject: [PATCH 06/17] tapcfg+tapdb: move and export DatabaseBackend --- tapcfg/server.go | 9 +-------- tapdb/migrations.go | 9 +++++++++ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/tapcfg/server.go b/tapcfg/server.go index ddbc753c0..7ccef2490 100644 --- a/tapcfg/server.go +++ b/tapcfg/server.go @@ -27,13 +27,6 @@ import ( "github.com/lightningnetwork/lnd/signal" ) -// databaseBackend is an interface that contains all methods our different -// database backends implement. -type databaseBackend interface { - tapdb.BatchedQuerier - WithTx(tx *sql.Tx) *sqlc.Queries -} - // genServerConfig generates a server config from the given tapd config. // // NOTE: The RPCConfig and SignalInterceptor fields must be set by the caller @@ -44,7 +37,7 @@ func genServerConfig(cfg *Config, cfgLogger btclog.Logger, var ( err error - db databaseBackend + db tapdb.DatabaseBackend dbType sqlc.BackendType ) diff --git a/tapdb/migrations.go b/tapdb/migrations.go index 38ef327cc..671ac761a 100644 --- a/tapdb/migrations.go +++ b/tapdb/migrations.go @@ -2,6 +2,7 @@ package tapdb import ( "bytes" + "database/sql" "errors" "fmt" "io" @@ -14,6 +15,7 @@ import ( "github.com/golang-migrate/migrate/v4/database" "github.com/golang-migrate/migrate/v4/source/httpfs" "github.com/lightninglabs/taproot-assets/fn" + "github.com/lightninglabs/taproot-assets/tapdb/sqlc" ) const ( @@ -25,6 +27,13 @@ const ( LatestMigrationVersion = 33 ) +// DatabaseBackend is an interface that contains all methods our different +// Database backends implement. +type DatabaseBackend interface { + BatchedQuerier + WithTx(tx *sql.Tx) *sqlc.Queries +} + // MigrationTarget is a functional option that can be passed to applyMigrations // to specify a target version to migrate to. `currentDbVersion` is the current // (migration) version of the database, or None if unknown. From 0ab2cdd354808b3c6d5894185144056b5f1f5f1d Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 3 Apr 2025 14:51:36 +0200 Subject: [PATCH 07/17] tapdb: turn dbAssetsToChainAssets into function We'll want to re-use that function in an upcoming commit, without needing to instantiate a full asset store. --- tapdb/assets_store.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tapdb/assets_store.go b/tapdb/assets_store.go index 2f455e2ee..574cf2e3d 100644 --- a/tapdb/assets_store.go +++ b/tapdb/assets_store.go @@ -624,8 +624,8 @@ func parseAssetWitness(input AssetWitness) (asset.Witness, error) { // dbAssetsToChainAssets maps a set of confirmed assets in the database, and // the witnesses of those assets to a set of normal ChainAsset structs needed // by a higher level application. -func (a *AssetStore) dbAssetsToChainAssets(dbAssets []ConfirmedAsset, - witnesses assetWitnesses) ([]*asset.ChainAsset, error) { +func dbAssetsToChainAssets(dbAssets []ConfirmedAsset, witnesses assetWitnesses, + dbClock clock.Clock) ([]*asset.ChainAsset, error) { chainAssets := make([]*asset.ChainAsset, len(dbAssets)) for i := range dbAssets { @@ -829,7 +829,7 @@ func (a *AssetStore) dbAssetsToChainAssets(dbAssets []ConfirmedAsset, owner := sprout.AnchorLeaseOwner expiry := sprout.AnchorLeaseExpiry if len(owner) > 0 && expiry.Valid && - expiry.Time.UTC().After(a.clock.Now().UTC()) { + expiry.Time.UTC().After(dbClock.Now().UTC()) { copy(chainAssets[i].AnchorLeaseOwner[:], owner) chainAssets[i].AnchorLeaseExpiry = &expiry.Time @@ -1235,7 +1235,7 @@ func (a *AssetStore) FetchAllAssets(ctx context.Context, includeSpent, return nil, dbErr } - return a.dbAssetsToChainAssets(dbAssets, assetWitnesses) + return dbAssetsToChainAssets(dbAssets, assetWitnesses, a.clock) } // FetchManagedUTXOs fetches all UTXOs we manage. @@ -1947,7 +1947,9 @@ func (a *AssetStore) queryChainAssets(ctx context.Context, q ActiveAssetsStore, if err != nil { return nil, err } - matchingAssets, err := a.dbAssetsToChainAssets(dbAssets, assetWitnesses) + matchingAssets, err := dbAssetsToChainAssets( + dbAssets, assetWitnesses, a.clock, + ) if err != nil { return nil, err } From 2b06e9b0d9056f6ceff48bfe4b45bc7e08e56e0a Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 3 Apr 2025 14:51:37 +0200 Subject: [PATCH 08/17] tapdb: add postmigration checks --- docs/examples/basic-price-oracle/go.mod | 31 +-- docs/examples/basic-price-oracle/go.sum | 71 +++--- go.mod | 37 ++-- go.sum | 83 +++---- tapdb/migrations.go | 23 +- tapdb/migrations_test.go | 115 ++++++++++ tapdb/post_migration_checks.go | 202 ++++++++++++++++++ tapdb/postgres.go | 7 +- tapdb/sqlite.go | 13 +- .../migrations_test_00033_dummy_data.sql | 32 +++ 10 files changed, 485 insertions(+), 129 deletions(-) create mode 100644 tapdb/post_migration_checks.go create mode 100644 tapdb/testdata/migrations_test_00033_dummy_data.sql diff --git a/docs/examples/basic-price-oracle/go.mod b/docs/examples/basic-price-oracle/go.mod index 04bd25836..cf59ed31a 100644 --- a/docs/examples/basic-price-oracle/go.mod +++ b/docs/examples/basic-price-oracle/go.mod @@ -13,13 +13,13 @@ replace ( require ( github.com/lightninglabs/taproot-assets v0.5.0-rc1 github.com/sirupsen/logrus v1.9.3 - google.golang.org/grpc v1.59.0 + google.golang.org/grpc v1.64.1 ) require ( dario.cat/mergo v1.0.1 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect github.com/aead/siphash v1.0.1 // indirect @@ -51,9 +51,10 @@ require ( github.com/decred/dcrd/lru v1.1.2 // indirect github.com/docker/cli v28.0.1+incompatible // indirect github.com/docker/docker v28.0.1+incompatible // indirect - github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fergusstrange/embedded-postgres v1.25.0 // indirect github.com/go-errors/errors v1.0.1 // indirect github.com/go-logr/logr v1.4.2 // indirect @@ -71,7 +72,7 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect @@ -120,7 +121,7 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.2 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opencontainers/runc v1.2.0 // indirect github.com/ory/dockertest/v3 v3.10.0 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -151,31 +152,31 @@ require ( go.etcd.io/etcd/raft/v3 v3.5.12 // indirect go.etcd.io/etcd/server/v3 v3.5.12 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect go.opentelemetry.io/otel v1.35.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 // indirect go.opentelemetry.io/otel/metric v1.35.0 // indirect go.opentelemetry.io/otel/sdk v1.35.0 // indirect go.opentelemetry.io/otel/trace v1.35.0 // indirect - go.opentelemetry.io/proto/otlp v1.0.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.23.0 // indirect golang.org/x/crypto v0.36.0 // indirect golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect - golang.org/x/mod v0.17.0 // indirect + golang.org/x/mod v0.21.0 // indirect golang.org/x/net v0.38.0 // indirect golang.org/x/sync v0.12.0 // indirect golang.org/x/sys v0.31.0 // indirect golang.org/x/term v0.30.0 // indirect golang.org/x/text v0.23.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect - google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect - google.golang.org/protobuf v1.33.0 // indirect + golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.24.0 // indirect + google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 // indirect + google.golang.org/protobuf v1.34.2 // indirect gopkg.in/errgo.v1 v1.0.1 // indirect gopkg.in/macaroon-bakery.v2 v2.1.0 // indirect gopkg.in/macaroon.v2 v2.1.0 // indirect diff --git a/docs/examples/basic-price-oracle/go.sum b/docs/examples/basic-price-oracle/go.sum index 330d3395f..480b5fd34 100644 --- a/docs/examples/basic-price-oracle/go.sum +++ b/docs/examples/basic-price-oracle/go.sum @@ -13,17 +13,12 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= -cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -45,8 +40,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NebulousLabs/fastrand v0.0.0-20181203155948-6fb6489aac4e h1:n+DcnTNkQnHlwpsrHoQtkrJIO7CBx029fw6oR4vIob4= github.com/NebulousLabs/fastrand v0.0.0-20181203155948-6fb6489aac4e/go.mod h1:Bdzq+51GR4/0DIhaICZEOm+OHvXGwwB2trKZ8B4Y6eQ= github.com/NebulousLabs/go-upnp v0.0.0-20180202185039-29b680b06c82 h1:MG93+PZYs9PyEsj/n5/haQu2gK0h4tUtSy9ejtMwWa0= @@ -131,8 +126,6 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101 h1:7To3pQ+pZo0i3dsWEbinPNFs5gPSBOsJtx3wTT94VBY= -github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= @@ -171,8 +164,8 @@ github.com/docker/cli v28.0.1+incompatible h1:g0h5NQNda3/CxIsaZfH4Tyf6vpxFth7PYl github.com/docker/cli v28.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/docker v28.0.1+incompatible h1:FCHjSRdXhNRFjlHMTv4jUNlIBbTeRjrWfeFuJp7jpo0= github.com/docker/docker v28.0.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= @@ -181,8 +174,6 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= -github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fergusstrange/embedded-postgres v1.25.0 h1:sa+k2Ycrtz40eCRPOzI7Ry7TtkWXXJ+YRsxpKMDhxK0= @@ -230,8 +221,6 @@ github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w github.com/golang-migrate/migrate/v4 v4.17.0 h1:rd40H3QXU0AA4IoLllFcEAEo9dYKRHYND2gB4p7xcaU= github.com/golang-migrate/migrate/v4 v4.17.0/go.mod h1:+Cp2mtLP4/aXDTKb9wmXYitdrNx2HGs45rbWAo6OsKM= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -301,8 +290,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92Bcuy github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -524,8 +513,8 @@ github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q= github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opencontainers/runc v1.2.0 h1:qke7ZVCmJcKrJVY2iHJVC+0kql9uYdkusOPsQOOeBw4= github.com/opencontainers/runc v1.2.0/go.mod h1:/PXzF0h531HTMsYQnmxXkBD7YaGShm/2zcRB79dksUc= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -648,14 +637,14 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 h1:DeFD0VgTZ+Cj6hxravYYZE2W4GlneVH81iAOPjZkzk8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0/go.mod h1:GijYcYmNpX1KazD5JmWGsi4P7dDTTTnfv1UbGn84MnU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 h1:gvmNvqrPYovvyRmCSygkUDyL8lC5Tl845MLEwqpxhEU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0/go.mod h1:vNUq47TGFioo+ffTSnKNdob241vePmtNZnAODKapKd0= go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= @@ -664,8 +653,8 @@ go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0Qe go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= -go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -736,8 +725,8 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= +golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -788,8 +777,6 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= -golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -880,8 +867,8 @@ golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -931,8 +918,8 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -961,8 +948,6 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -993,12 +978,12 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b h1:+YaDE2r2OG8t/z5qmsh7Y+XXwCbvadxxZ0YY6mTdrVA= -google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:CIC2YMXmIhYw6evmhPxBKJ4fmLbOFtXQN/GV3XOZR8k= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= +google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 h1:9+tzLLstTlPTRyJTh+ah5wIMsBW5c4tQwGTN3thOW9Y= +google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= +google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8 h1:W5Xj/70xIA4x60O/IFyXivR5MGqblAb8R3w26pnD6No= +google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8/go.mod h1:vPrPUTsDCYxXWjP7clS81mZ6/803D8K4iM9Ma27VKas= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 h1:mxSlqyb8ZAHsYDCfiXN1EDdNTdvjUJSLY+OnAUtYNYA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8/go.mod h1:I7Y+G38R2bu5j1aLzfFmQfTcU/WnFuqDwLZAbvKTKpM= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1012,8 +997,8 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA= +google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20160105164936-4f90aeace3a2/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/go.mod b/go.mod index 61d6821cf..54459b7cd 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/golang-migrate/migrate/v4 v4.17.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.0-rc.0 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 github.com/jackc/pgconn v1.14.3 github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438 github.com/jessevdk/go-flags v1.4.0 @@ -43,9 +43,9 @@ require ( golang.org/x/net v0.38.0 golang.org/x/sync v0.12.0 golang.org/x/term v0.30.0 - golang.org/x/time v0.3.0 - google.golang.org/grpc v1.59.0 - google.golang.org/protobuf v1.33.0 + golang.org/x/time v0.5.0 + google.golang.org/grpc v1.64.1 + google.golang.org/protobuf v1.34.2 gopkg.in/macaroon-bakery.v2 v2.1.0 gopkg.in/macaroon.v2 v2.1.0 modernc.org/sqlite v1.34.5 @@ -55,7 +55,7 @@ require ( require ( dario.cat/mergo v1.0.1 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/NebulousLabs/fastrand v0.0.0-20181203155948-6fb6489aac4e // indirect github.com/NebulousLabs/go-upnp v0.0.0-20180202185039-29b680b06c82 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect @@ -80,10 +80,9 @@ require ( github.com/decred/dcrd/lru v1.1.2 // indirect github.com/docker/cli v28.0.1+incompatible // indirect github.com/docker/docker v28.0.1+incompatible // indirect - github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fergusstrange/embedded-postgres v1.25.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect @@ -144,7 +143,7 @@ require ( github.com/mwitkow/grpc-proxy v0.0.0-20230212185441-f345521cb9c9 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.2 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opencontainers/runc v1.2.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect @@ -176,25 +175,25 @@ require ( go.etcd.io/etcd/raft/v3 v3.5.12 // indirect go.etcd.io/etcd/server/v3 v3.5.12 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect go.opentelemetry.io/otel v1.35.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 // indirect go.opentelemetry.io/otel/metric v1.35.0 // indirect go.opentelemetry.io/otel/sdk v1.35.0 // indirect go.opentelemetry.io/otel/trace v1.35.0 // indirect - go.opentelemetry.io/proto/otlp v1.0.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.23.0 // indirect golang.org/x/crypto v0.36.0 // indirect - golang.org/x/mod v0.17.0 // indirect + golang.org/x/mod v0.21.0 // indirect golang.org/x/sys v0.31.0 // indirect golang.org/x/text v0.23.0 // indirect - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect - google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect + golang.org/x/tools v0.24.0 // indirect + google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 // indirect gopkg.in/errgo.v1 v1.0.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect @@ -208,4 +207,8 @@ require ( // We want to format raw bytes as hex instead of base64. The forked version // allows us to specify that as an option. -replace google.golang.org/protobuf => github.com/lightninglabs/protobuf-go-hex-display v1.33.0-hex-display +replace google.golang.org/protobuf => github.com/lightninglabs/protobuf-go-hex-display v1.34.2-hex-display + +// We are using a fork of the migration library with custom functionality that +// did not yet make it into the upstream repository. +replace github.com/golang-migrate/migrate/v4 => github.com/lightninglabs/migrate/v4 v4.18.2-9023d66a-fork-pr-2 diff --git a/go.sum b/go.sum index 488a66f8a..4cc7ea6f1 100644 --- a/go.sum +++ b/go.sum @@ -13,17 +13,12 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= -cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -47,8 +42,8 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NebulousLabs/fastrand v0.0.0-20181203155948-6fb6489aac4e h1:n+DcnTNkQnHlwpsrHoQtkrJIO7CBx029fw6oR4vIob4= github.com/NebulousLabs/fastrand v0.0.0-20181203155948-6fb6489aac4e/go.mod h1:Bdzq+51GR4/0DIhaICZEOm+OHvXGwwB2trKZ8B4Y6eQ= github.com/NebulousLabs/go-upnp v0.0.0-20180202185039-29b680b06c82 h1:MG93+PZYs9PyEsj/n5/haQu2gK0h4tUtSy9ejtMwWa0= @@ -137,8 +132,6 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101 h1:7To3pQ+pZo0i3dsWEbinPNFs5gPSBOsJtx3wTT94VBY= -github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= @@ -171,16 +164,16 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3 github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/decred/dcrd/lru v1.1.2 h1:KdCzlkxppuoIDGEvCGah1fZRicrDH36IipvlB1ROkFY= github.com/decred/dcrd/lru v1.1.2/go.mod h1:gEdCVgXs1/YoBvFWt7Scgknbhwik3FgVSzlnCcXL2N8= -github.com/dhui/dktest v0.4.0 h1:z05UmuXZHO/bgj/ds2bGMBu8FI4WA+Ag/m3ghL+om7M= -github.com/dhui/dktest v0.4.0/go.mod h1:v/Dbz1LgCBOi2Uki2nUqLBGa83hWBGFMu5MrgMDCc78= +github.com/dhui/dktest v0.4.5 h1:uUfYBIVREmj/Rw6MvgmqNAYzTiKOHJak+enB5Di73MM= +github.com/dhui/dktest v0.4.5/go.mod h1:tmcyeHDKagvlDrz7gDKq4UAJOLIfVZYkfD5OnHDwcCo= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/docker/cli v28.0.1+incompatible h1:g0h5NQNda3/CxIsaZfH4Tyf6vpxFth7PYl3hgCPOKzs= github.com/docker/cli v28.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/docker v28.0.1+incompatible h1:FCHjSRdXhNRFjlHMTv4jUNlIBbTeRjrWfeFuJp7jpo0= github.com/docker/docker v28.0.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= @@ -192,8 +185,6 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= -github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fergusstrange/embedded-postgres v1.25.0 h1:sa+k2Ycrtz40eCRPOzI7Ry7TtkWXXJ+YRsxpKMDhxK0= @@ -260,12 +251,8 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-migrate/migrate/v4 v4.17.0 h1:rd40H3QXU0AA4IoLllFcEAEo9dYKRHYND2gB4p7xcaU= -github.com/golang-migrate/migrate/v4 v4.17.0/go.mod h1:+Cp2mtLP4/aXDTKb9wmXYitdrNx2HGs45rbWAo6OsKM= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v0.0.0-20210429001901-424d2337a529/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -344,8 +331,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.5.0/go.mod h1:r1hZAcvfFXuYmcKyCJI9wlyOPIZUJl6FCB8Cpca/NLE= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -494,12 +481,14 @@ github.com/lightninglabs/lightning-node-connect/hashmailrpc v1.0.2 h1:Er1miPZD2X github.com/lightninglabs/lightning-node-connect/hashmailrpc v1.0.2/go.mod h1:antQGRDRJiuyQF6l+k6NECCSImgCpwaZapATth2Chv4= github.com/lightninglabs/lndclient v0.19.0-3 h1:PGGlDaz8x1dXGowDfAWhbuDqXTKNaJyb7SOTrRdG1es= github.com/lightninglabs/lndclient v0.19.0-3/go.mod h1:5YMrFx00NvcmUHGZRxT4Qw/gOfR5x50/ReJmJ6w0yVk= +github.com/lightninglabs/migrate/v4 v4.18.2-9023d66a-fork-pr-2 h1:eFjp1dIB2BhhQp/THKrjLdlYuPugO9UU4kDqu91OX/Q= +github.com/lightninglabs/migrate/v4 v4.18.2-9023d66a-fork-pr-2/go.mod h1:99BKpIi6ruaaXRM1A77eqZ+FWPQ3cfRa+ZVy5bmWMaY= github.com/lightninglabs/neutrino v0.16.1 h1:5Kz4ToxncEVkpKC6fwUjXKtFKJhuxlG3sBB3MdJTJjs= github.com/lightninglabs/neutrino v0.16.1/go.mod h1:L+5UAccpUdyM7yDgmQySgixf7xmwBgJtOfs/IP26jCs= github.com/lightninglabs/neutrino/cache v1.1.2 h1:C9DY/DAPaPxbFC+xNNEI/z1SJY9GS3shmlu5hIQ798g= github.com/lightninglabs/neutrino/cache v1.1.2/go.mod h1:XJNcgdOw1LQnanGjw8Vj44CvguYA25IMKjWFZczwZuo= -github.com/lightninglabs/protobuf-go-hex-display v1.33.0-hex-display h1:Y2WiPkBS/00EiEg0qp0FhehxnQfk3vv8U6Xt3nN+rTY= -github.com/lightninglabs/protobuf-go-hex-display v1.33.0-hex-display/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +github.com/lightninglabs/protobuf-go-hex-display v1.34.2-hex-display h1:w7FM5LH9Z6CpKxl13mS48idsu6F+cEZf0lkyiV+Dq9g= +github.com/lightninglabs/protobuf-go-hex-display v1.34.2-hex-display/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= github.com/lightningnetwork/lightning-onion v1.2.1-0.20240712235311-98bd56499dfb h1:yfM05S8DXKhuCBp5qSMZdtSwvJ+GFzl94KbXMNB1JDY= github.com/lightningnetwork/lightning-onion v1.2.1-0.20240712235311-98bd56499dfb/go.mod h1:c0kvRShutpj3l6B9WtTsNTBUtjSmjZXbJd9ZBRQOSKI= github.com/lightningnetwork/lnd v0.19.0-beta.rc2.0.20250417120008-a304be6bad91 h1:LzLA7+J/fP1VrK4BcyAt86cg4/bkfY38gYRBJoy109o= @@ -582,8 +571,8 @@ github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q= github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opencontainers/runc v1.2.0 h1:qke7ZVCmJcKrJVY2iHJVC+0kql9uYdkusOPsQOOeBw4= github.com/opencontainers/runc v1.2.0/go.mod h1:/PXzF0h531HTMsYQnmxXkBD7YaGShm/2zcRB79dksUc= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -720,14 +709,14 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 h1:DeFD0VgTZ+Cj6hxravYYZE2W4GlneVH81iAOPjZkzk8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0/go.mod h1:GijYcYmNpX1KazD5JmWGsi4P7dDTTTnfv1UbGn84MnU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 h1:gvmNvqrPYovvyRmCSygkUDyL8lC5Tl845MLEwqpxhEU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0/go.mod h1:vNUq47TGFioo+ffTSnKNdob241vePmtNZnAODKapKd0= go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= @@ -737,8 +726,8 @@ go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOg go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -813,8 +802,8 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= +golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -871,8 +860,6 @@ golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210615190721-d04028783cf1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= -golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -971,8 +958,8 @@ golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -1025,8 +1012,8 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1055,8 +1042,6 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1091,12 +1076,12 @@ google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210617175327-b9e0b3197ced/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b h1:+YaDE2r2OG8t/z5qmsh7Y+XXwCbvadxxZ0YY6mTdrVA= -google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:CIC2YMXmIhYw6evmhPxBKJ4fmLbOFtXQN/GV3XOZR8k= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= +google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 h1:9+tzLLstTlPTRyJTh+ah5wIMsBW5c4tQwGTN3thOW9Y= +google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= +google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8 h1:W5Xj/70xIA4x60O/IFyXivR5MGqblAb8R3w26pnD6No= +google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8/go.mod h1:vPrPUTsDCYxXWjP7clS81mZ6/803D8K4iM9Ma27VKas= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 h1:mxSlqyb8ZAHsYDCfiXN1EDdNTdvjUJSLY+OnAUtYNYA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8/go.mod h1:I7Y+G38R2bu5j1aLzfFmQfTcU/WnFuqDwLZAbvKTKpM= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1115,8 +1100,8 @@ google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA= +google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0= google.golang.org/grpc/examples v0.0.0-20210424002626-9572fd6faeae/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/tapdb/migrations.go b/tapdb/migrations.go index 671ac761a..763211aaf 100644 --- a/tapdb/migrations.go +++ b/tapdb/migrations.go @@ -67,13 +67,16 @@ var ( // migrationOption is a functional option that can be passed to migrate related // methods to modify their behavior. type migrateOptions struct { - latestVersion fn.Option[uint] + latestVersion fn.Option[uint] + postStepCallbacks map[uint]migrate.PostStepCallback } // defaultMigrateOptions returns a new migrateOptions instance with default // settings. func defaultMigrateOptions() *migrateOptions { - return &migrateOptions{} + return &migrateOptions{ + postStepCallbacks: make(map[uint]migrate.PostStepCallback), + } } // MigrateOpt is a functional option that can be passed to migrate related @@ -88,6 +91,21 @@ func WithLatestVersion(version uint) MigrateOpt { } } +// WithPostStepCallbacks is an option that can be used to set a map of +// PostStepCallback functions that can be used to execute a Golang based +// migration step after a SQL based migration step has been executed. The key is +// the migration version and the value is the callback function that should be +// run _after_ the step was executed (but before the version is marked as +// cleanly executed). An error returned from the callback will cause the +// migration to fail and the step to be marked as dirty. +func WithPostStepCallbacks( + postStepCallbacks map[uint]migrate.PostStepCallback) MigrateOpt { + + return func(o *migrateOptions) { + o.postStepCallbacks = postStepCallbacks + } +} + // migrationLogger is a logger that wraps the passed btclog.Logger so it can be // used to log migrations. type migrationLogger struct { @@ -142,6 +160,7 @@ func applyMigrations(fs fs.FS, driver database.Driver, path, dbName string, // above. sqlMigrate, err := migrate.NewWithInstance( "migrations", migrateFileServer, dbName, driver, + migrate.WithPostStepCallbacks(opts.postStepCallbacks), ) if err != nil { return err diff --git a/tapdb/migrations_test.go b/tapdb/migrations_test.go index bb0eba0d0..0696b3c5e 100644 --- a/tapdb/migrations_test.go +++ b/tapdb/migrations_test.go @@ -2,6 +2,7 @@ package tapdb import ( "context" + "encoding/hex" "fmt" "os" "path/filepath" @@ -555,3 +556,117 @@ func TestMigration31(t *testing.T) { "constraint", ) } + +// TestMigration33 tests that the Golang based post migration check for the +// script key type detection works as expected. It verifies that the script key +// types are detected correctly and that the migration to version 31 works as +// expected. +func TestMigration33(t *testing.T) { + ctx := context.Background() + + db := NewTestDBWithVersion(t, 32) + + // We need to insert some test data that will be affected by the + // migration number 31. + InsertTestdata(t, db.BaseDB, "migrations_test_00033_dummy_data.sql") + + // And now that we have test data inserted, we can migrate to the latest + // version. + err := db.ExecuteMigrations(TargetLatest, WithPostStepCallbacks( + makePostStepCallbacks(db, postMigrationChecks), + )) + require.NoError(t, err) + + // The migration should have de-duplicated the assets, so we should now + // only have two valid/distinct assets with two witnesses and one proof + // each. So we're just asserting the expected state _after_ the + // migration has run. + unknownKey, _ := hex.DecodeString( + "039c571fffcac1a1a7cd3372bd202ad8562f28e48b90f8a4eb714eca062f" + + "576ee6", + ) + unknownScriptKey, err := db.BaseDB.FetchScriptKeyByTweakedKey( + ctx, unknownKey, + ) + require.NoError(t, err) + require.Equal( + t, asset.ScriptKeyUnknown, extractSqlInt16[asset.ScriptKeyType]( + unknownScriptKey.ScriptKey.KeyType, + ), + ) + + bip86Key, _ := hex.DecodeString( + "029c571fffcac1a1a7cd3372bd202ad8562f28e48b90f8a4eb714eca062f" + + "576ee6", + ) + bip86ScriptKey, err := db.BaseDB.FetchScriptKeyByTweakedKey( + ctx, bip86Key, + ) + require.NoError(t, err) + require.EqualValues( + t, asset.ScriptKeyBip86, + extractSqlInt16[asset.ScriptKeyType]( + bip86ScriptKey.ScriptKey.KeyType, + ), + ) + + scriptedKey, _ := hex.DecodeString( + "03f9cdf1ff7c9fbb0ea3c8533cd7048994f41ea20a79764469c22aa18aa6" + + "696169", + ) + scriptedScriptKey, err := db.BaseDB.FetchScriptKeyByTweakedKey( + ctx, scriptedKey, + ) + require.NoError(t, err) + require.EqualValues( + t, asset.ScriptKeyScriptPathExternal, + extractSqlInt16[asset.ScriptKeyType]( + scriptedScriptKey.ScriptKey.KeyType, + ), + ) + + tombstoneKey, _ := hex.DecodeString( + "027c79b9b26e463895eef5679d8558942c86c4ad2233adef01bc3e6d540b" + + "3653fe", + ) + tombstoneScriptKey, err := db.BaseDB.FetchScriptKeyByTweakedKey( + ctx, tombstoneKey, + ) + require.NoError(t, err) + require.EqualValues( + t, asset.ScriptKeyTombstone, + extractSqlInt16[asset.ScriptKeyType]( + tombstoneScriptKey.ScriptKey.KeyType, + ), + ) + + channelKey, _ := hex.DecodeString( + "0350aaeb166f4234650d84a2d8a130987aeaf6950206e0905401ee74ff3f" + + "8d18e6", + ) + channelScriptKey, err := db.BaseDB.FetchScriptKeyByTweakedKey( + ctx, channelKey, + ) + require.NoError(t, err) + require.EqualValues( + t, asset.ScriptKeyScriptPathChannel, + extractSqlInt16[asset.ScriptKeyType]( + channelScriptKey.ScriptKey.KeyType, + ), + ) + + burnKey, _ := hex.DecodeString( + "02248bca7dbb12dcf0b490263a1d521691691aa2541842b7472c83acac0e" + + "88443b", + ) + burnScriptKey, err := db.BaseDB.FetchScriptKeyByTweakedKey( + ctx, burnKey, + ) + require.NoError(t, err) + require.EqualValues( + t, asset.ScriptKeyBurn, + extractSqlInt16[asset.ScriptKeyType]( + burnScriptKey.ScriptKey.KeyType, + ), + ) +} diff --git a/tapdb/post_migration_checks.go b/tapdb/post_migration_checks.go new file mode 100644 index 000000000..c9a48956e --- /dev/null +++ b/tapdb/post_migration_checks.go @@ -0,0 +1,202 @@ +package tapdb + +import ( + "context" + "database/sql" + "fmt" + "time" + + "github.com/btcsuite/btcd/btcec/v2/schnorr" + "github.com/golang-migrate/migrate/v4" + "github.com/golang-migrate/migrate/v4/database" + "github.com/lightninglabs/taproot-assets/asset" + "github.com/lightninglabs/taproot-assets/fn" + "github.com/lightninglabs/taproot-assets/tapdb/sqlc" + "github.com/lightninglabs/taproot-assets/tapscript" + "github.com/lightningnetwork/lnd/clock" +) + +// postMigrationCheck is a function type for a function that performs a +// post-migration check on the database. +type postMigrationCheck func(context.Context, sqlc.Querier) error + +var ( + // postMigrationChecks is a map of functions that are run after the + // database migration with the version specified in the key has been + // applied. These functions are used to perform additional checks on the + // database state that are not fully expressible in SQL. + postMigrationChecks = map[uint]postMigrationCheck{ + 33: detectScriptKeyType, + } +) + +// makePostStepCallbacks turns the post migration checks into a map of post +// step callbacks that can be used with the migrate package. The keys of the map +// are the migration versions, and the values are the callbacks that will be +// executed after the migration with the corresponding version is applied. +func makePostStepCallbacks(db DatabaseBackend, + checks map[uint]postMigrationCheck) map[uint]migrate.PostStepCallback { + + var ( + ctx = context.Background() + txDb = NewTransactionExecutor( + db, func(tx *sql.Tx) sqlc.Querier { + return db.WithTx(tx) + }, + ) + writeTxOpts AssetStoreTxOptions + ) + + postStepCallbacks := make(map[uint]migrate.PostStepCallback) + for version, check := range checks { + runCheck := func(m *migrate.Migration, q sqlc.Querier) error { + log.Infof("Running post-migration check for version %d", + version) + start := time.Now() + + err := check(ctx, q) + if err != nil { + return fmt.Errorf("post-migration "+ + "check failed for version %d: "+ + "%w", version, err) + } + + log.Infof("Post-migration check for version %d "+ + "completed in %v", version, time.Since(start)) + + return nil + } + + // We ignore the actual driver that's being returned here, since + // we use migrate.NewWithInstance() to create the migration + // instance from our already instantiated database backend that + // is also passed into this function. + postStepCallbacks[version] = func(m *migrate.Migration, + _ database.Driver) error { + + return txDb.ExecTx( + ctx, &writeTxOpts, func(q sqlc.Querier) error { + return runCheck(m, q) + }, + ) + } + } + + return postStepCallbacks +} + +// detectScriptKeyType attempts to detect the type of the script keys that don't +// have a type set yet. +func detectScriptKeyType(ctx context.Context, q sqlc.Querier) error { + defaultClock := clock.NewDefaultClock() + + log.Debugf("Detecting script key types") + + // We start by fetching all assets, even the spent ones. We then collect + // a list of the burn keys from the assets (because burn keys can only + // be calculated from the asset's witness). + assetFilter := QueryAssetFilters{ + Now: sql.NullTime{ + Time: defaultClock.Now().UTC(), + Valid: true, + }, + } + dbAssets, assetWitnesses, err := fetchAssetsWithWitness( + ctx, q, assetFilter, + ) + if err != nil { + return fmt.Errorf("error fetching assets: %w", err) + } + + chainAssets, err := dbAssetsToChainAssets( + dbAssets, assetWitnesses, defaultClock, + ) + if err != nil { + return fmt.Errorf("error converting assets: %w", err) + } + + burnAssets := fn.Filter(chainAssets, func(a *asset.ChainAsset) bool { + return a.IsBurn() + }) + burnKeys := make(map[asset.SerializedKey]struct{}) + for _, a := range burnAssets { + serializedKey := asset.ToSerialized(a.ScriptKey.PubKey) + burnKeys[serializedKey] = struct{}{} + } + + untypedKeys, err := q.FetchUnknownTypeScriptKeys(ctx) + if err != nil { + return fmt.Errorf("error fetching script keys: %w", err) + } + + channelFundingKey := asset.NewScriptKey( + tapscript.NewChannelFundingScriptTree().TaprootKey, + ).PubKey + + for _, k := range untypedKeys { + scriptKey, err := parseScriptKey(k.InternalKey, k.ScriptKey) + if err != nil { + return fmt.Errorf("error parsing script key: %w", err) + } + + // We ignore the parity bit when comparing it to other keys, as + // we generally don't know how it might be stored in the DB. + schnorrScriptKey, _ := schnorr.ParsePubKey( + schnorr.SerializePubKey(scriptKey.PubKey), + ) + + serializedKey := asset.ToSerialized(scriptKey.PubKey) + newType := asset.ScriptKeyUnknown + + if _, ok := burnKeys[serializedKey]; ok { + newType = asset.ScriptKeyBurn + } else { + guessedType := scriptKey.GuessType() + + switch { + // If we're sure that a key is BIP-86 or the well-known + // NUMS (tombstone) key, we mark it as such. + case guessedType == asset.ScriptKeyBip86 || + guessedType == asset.ScriptKeyTombstone: + + newType = guessedType + + // Previous channel funding script keys (OP_TRUE) can + // be detected, since they are the same key. New, unique + // script keys for grouped asset channels are only + // introduced with the same version as this migration + // ships in, so they should be stored with the correct + // type already. + case guessedType == asset.ScriptKeyScriptPathExternal && + schnorrScriptKey.IsEqual(channelFundingKey): + + newType = asset.ScriptKeyScriptPathChannel + + // We'll want to not show scripted keys by default in + // the balances. So any key that is not a burn key and + // not a channel funding key, but has a script path, we + // mark as external script path. + case guessedType == asset.ScriptKeyScriptPathExternal: + newType = asset.ScriptKeyScriptPathExternal + } + } + + // If we were able to identify the key type, we update the key + // in the database. + if newType != asset.ScriptKeyUnknown { + _, err := q.UpsertScriptKey(ctx, NewScriptKey{ + InternalKeyID: k.InternalKey.KeyID, + TweakedScriptKey: k.ScriptKey.TweakedScriptKey, + Tweak: k.ScriptKey.Tweak, + DeclaredKnown: k.ScriptKey.DeclaredKnown, + KeyType: sqlInt16(newType), + }) + if err != nil { + return fmt.Errorf("error updating script key "+ + "type: %w", err) + } + } + } + + return nil +} diff --git a/tapdb/postgres.go b/tapdb/postgres.go index 12f91ad8f..a069a9cbc 100644 --- a/tapdb/postgres.go +++ b/tapdb/postgres.go @@ -131,7 +131,12 @@ func NewPostgresStore(cfg *PostgresConfig) (*PostgresStore, error) { // Now that the database is open, populate the database with our set of // schemas based on our embedded in-memory file system. if !cfg.SkipMigrations { - if err := s.ExecuteMigrations(TargetLatest); err != nil { + err := s.ExecuteMigrations( + TargetLatest, WithPostStepCallbacks( + makePostStepCallbacks(s, postMigrationChecks), + ), + ) + if err != nil { return nil, fmt.Errorf("error executing migrations: "+ "%w", err) } diff --git a/tapdb/sqlite.go b/tapdb/sqlite.go index 9e3cb4ed8..b5ac730cc 100644 --- a/tapdb/sqlite.go +++ b/tapdb/sqlite.go @@ -144,7 +144,12 @@ func NewSqliteStore(cfg *SqliteConfig) (*SqliteStore, error) { // Now that the database is open, populate the database with our set of // schemas based on our embedded in-memory file system. if !cfg.SkipMigrations { - if err := s.ExecuteMigrations(s.backupAndMigrate); err != nil { + err := s.ExecuteMigrations( + s.backupAndMigrate, WithPostStepCallbacks( + makePostStepCallbacks(s, postMigrationChecks), + ), + ) + if err != nil { return nil, fmt.Errorf("error executing migrations: "+ "%w", err) } @@ -297,7 +302,11 @@ func NewTestSqliteDBWithVersion(t *testing.T, version uint) *SqliteStore { }) require.NoError(t, err) - err = sqlDB.ExecuteMigrations(TargetVersion(version)) + err = sqlDB.ExecuteMigrations( + TargetVersion(version), WithPostStepCallbacks( + makePostStepCallbacks(sqlDB, postMigrationChecks), + ), + ) require.NoError(t, err) t.Cleanup(func() { diff --git a/tapdb/testdata/migrations_test_00033_dummy_data.sql b/tapdb/testdata/migrations_test_00033_dummy_data.sql new file mode 100644 index 000000000..7b6a6e00d --- /dev/null +++ b/tapdb/testdata/migrations_test_00033_dummy_data.sql @@ -0,0 +1,32 @@ +-- Just a random internal key. +INSERT INTO internal_keys VALUES(1,X'03efbcf2878876bae81ca9a7f6476764d2da38d565b9fb2b691e7bb22fd99f9e5e',212,2); + +-- The NUMS key as an internal key. +INSERT INTO internal_keys VALUES(2, X'02dca094751109d0bd055d03565874e8276dd53e926b44e3bd1bb6bf4bc130a279', 212, 0); + +-- This is a correct BIP-86 key. +INSERT INTO script_keys VALUES(1,1,X'029c571fffcac1a1a7cd3372bd202ad8562f28e48b90f8a4eb714eca062f576ee6',NULL,true); + +-- This is not a correct BIP-86 key, it should be detected as unknown. +INSERT INTO script_keys VALUES(2,1,X'039c571fffcac1a1a7cd3372bd202ad8562f28e48b90f8a4eb714eca062f576ee6',NULL,true); + +-- This should be detected as script path key. +INSERT INTO script_keys VALUES(3,1,X'03f9cdf1ff7c9fbb0ea3c8533cd7048994f41ea20a79764469c22aa18aa6696169',X'b2f0cd8ecb23c1710903f872c31b0fd37e15224af457722a87c5e0c7f50fffb3',true); + +-- This should be detected as the NUMS/tombstone key. +INSERT INTO script_keys VALUES(4,1,X'027c79b9b26e463895eef5679d8558942c86c4ad2233adef01bc3e6d540b3653fe',NULL,true); + +-- This should be detected as a channel key. +INSERT INTO script_keys VALUES(5,2,X'0350aaeb166f4234650d84a2d8a130987aeaf6950206e0905401ee74ff3f8d18e6',X'a85b2107f791b26a84e7586c28cec7cb61202ed3d01944d832500f363782d675',true); + + +-- Testdata for a burn asset. +INSERT INTO chain_txns VALUES(1,X'a1594fc379308b2a209f6d0bdb8602e9f87cf71fc232c69032b9a5fed28f9331',1980,X'02000000000101022cd51ca4d850c5f71ceedf7c50a08ff82d66612b22f631eac95e6b52cbbd2d0000000000ffffffff02e80300000000000022512018ac5a65a0d12e7846c89d24705e2697b1da14627978ba8db24bdbce21fc2aa85cd5f5050000000022512030263d67b4275144b2b00921d220a1311b9a4465fa656ba7d5754b421cb4308402483045022100fa32af97cab8a765dc347c3ff57b14f9810b6dbfc4d02727fb099d1ed875660602204cb66f3bbd92925707158b4aa67338c50a9ffddceb023875eb82b78b3967e007012102eb9cd2a22fd11c40823cb7b0f0fba4156138af69cf73c0644be54f4d46ba480700000000',441,X'4295613d85ccbc455159eb4ddd1e266ca10041d3c75726286b7dfeb3132c9c4f',1); +INSERT INTO managed_utxos VALUES(1,X'a1594fc379308b2a209f6d0bdb8602e9f87cf71fc232c69032b9a5fed28f933100000000',1000,1,X'1dd3e2cf0bbbee32832c4deb57bbae58779fa599be0b8eb1f61e8c624157e2fa',NULL,X'1dd3e2cf0bbbee32832c4deb57bbae58779fa599be0b8eb1f61e8c624157e2fa',1,NULL,NULL,0); +INSERT INTO genesis_points VALUES(1,X'49b23992e063da8aac64d9c92035603636d0deb241b64978030b46642137052566b83958',NULL); +INSERT INTO genesis_assets VALUES(1,X'f28be4e6247a7630019ea8aa5e68397202407fd398196656add582d8b8569ca8','86d9ea529153575487671558c93e54682ca300fd68a9794735f774929c33a267',NULL,-699369396,0,1); +INSERT INTO internal_keys VALUES(3,X'02843663d232db2559213ec7aa7538fdbbf5161fc080b1c108f6a6ada5cd2ee602',0,0); +INSERT INTO internal_keys VALUES(4,X'02248bca7dbb12dcf0b490263a1d521691691aa2541842b7472c83acac0e88443b',0,0); +INSERT INTO script_keys VALUES(6,4,X'02248bca7dbb12dcf0b490263a1d521691691aa2541842b7472c83acac0e88443b',NULL,NULL); +INSERT INTO assets VALUES(1,1,1,6,NULL,0,1782902116,0,0,NULL,NULL,1,0); +INSERT INTO asset_witnesses VALUES(1,1,X'49b23992e063da8aac64d9c92035603636d0deb241b64978030b46642137052566b83958',X'f28be4e6247a7630019ea8aa5e68397202407fd398196656add582d8b8569ca8',X'0201b56f6f7a1f3c5d3443504659849a2ae0bb375549c182c5c2352a7ef36c05c0',NULL,NULL,0); From 68aca2874f1a1cf4aa12ff557a6a48d9adb96cff Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 3 Apr 2025 14:51:38 +0200 Subject: [PATCH 09/17] taprpc: re-compile after update of protobuf library The previous commit forced us to update some gRPC/REST related libraries, which cause a diff in the generated RPC stubs. --- taprpc/assetwalletrpc/assetwallet.pb.go | 60 +-- taprpc/assetwalletrpc/assetwallet.pb.gw.go | 138 +----- taprpc/mintrpc/mint.pb.go | 48 +- taprpc/mintrpc/mint.pb.gw.go | 74 +-- taprpc/priceoraclerpc/price_oracle.pb.go | 22 +- taprpc/priceoraclerpc/price_oracle.pb.gw.go | 6 +- taprpc/rfqrpc/rfq.pb.go | 54 +-- taprpc/rfqrpc/rfq.pb.gw.go | 108 +---- taprpc/rfqrpc/rfq.swagger.json | 478 +++++++------------- taprpc/tapchannelrpc/tapchannel.pb.go | 32 +- taprpc/tapchannelrpc/tapchannel.pb.gw.go | 60 +-- taprpc/tapdevrpc/tapdev.pb.go | 26 +- taprpc/taprootassets.pb.go | 170 +++---- taprpc/taprootassets.pb.gw.go | 166 ++----- taprpc/universerpc/universe.pb.go | 108 ++--- taprpc/universerpc/universe.pb.gw.go | 118 ++--- taprpc/universerpc/universe.swagger.json | 338 +++++--------- 17 files changed, 681 insertions(+), 1325 deletions(-) diff --git a/taprpc/assetwalletrpc/assetwallet.pb.go b/taprpc/assetwalletrpc/assetwallet.pb.go index 24e0074dc..007fffce1 100644 --- a/taprpc/assetwalletrpc/assetwallet.pb.go +++ b/taprpc/assetwalletrpc/assetwallet.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 +// protoc-gen-go v1.34.2 // protoc v3.21.12 // source: assetwalletrpc/assetwallet.proto @@ -2040,7 +2040,7 @@ func file_assetwalletrpc_assetwallet_proto_rawDescGZIP() []byte { var file_assetwalletrpc_assetwallet_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_assetwalletrpc_assetwallet_proto_msgTypes = make([]protoimpl.MessageInfo, 27) -var file_assetwalletrpc_assetwallet_proto_goTypes = []interface{}{ +var file_assetwalletrpc_assetwallet_proto_goTypes = []any{ (CoinSelectType)(0), // 0: assetwalletrpc.CoinSelectType (*FundVirtualPsbtRequest)(nil), // 1: assetwalletrpc.FundVirtualPsbtRequest (*FundVirtualPsbtResponse)(nil), // 2: assetwalletrpc.FundVirtualPsbtResponse @@ -2130,7 +2130,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_assetwalletrpc_assetwallet_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*FundVirtualPsbtRequest); i { case 0: return &v.state @@ -2142,7 +2142,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*FundVirtualPsbtResponse); i { case 0: return &v.state @@ -2154,7 +2154,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*TxTemplate); i { case 0: return &v.state @@ -2166,7 +2166,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*PrevId); i { case 0: return &v.state @@ -2178,7 +2178,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*SignVirtualPsbtRequest); i { case 0: return &v.state @@ -2190,7 +2190,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*SignVirtualPsbtResponse); i { case 0: return &v.state @@ -2202,7 +2202,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*AnchorVirtualPsbtsRequest); i { case 0: return &v.state @@ -2214,7 +2214,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*CommitVirtualPsbtsRequest); i { case 0: return &v.state @@ -2226,7 +2226,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[8].Exporter = func(v any, i int) any { switch v := v.(*CommitVirtualPsbtsResponse); i { case 0: return &v.state @@ -2238,7 +2238,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[9].Exporter = func(v any, i int) any { switch v := v.(*PublishAndLogRequest); i { case 0: return &v.state @@ -2250,7 +2250,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*NextInternalKeyRequest); i { case 0: return &v.state @@ -2262,7 +2262,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[11].Exporter = func(v any, i int) any { switch v := v.(*NextInternalKeyResponse); i { case 0: return &v.state @@ -2274,7 +2274,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[12].Exporter = func(v any, i int) any { switch v := v.(*NextScriptKeyRequest); i { case 0: return &v.state @@ -2286,7 +2286,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[13].Exporter = func(v any, i int) any { switch v := v.(*NextScriptKeyResponse); i { case 0: return &v.state @@ -2298,7 +2298,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[14].Exporter = func(v any, i int) any { switch v := v.(*QueryInternalKeyRequest); i { case 0: return &v.state @@ -2310,7 +2310,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[15].Exporter = func(v any, i int) any { switch v := v.(*QueryInternalKeyResponse); i { case 0: return &v.state @@ -2322,7 +2322,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[16].Exporter = func(v any, i int) any { switch v := v.(*QueryScriptKeyRequest); i { case 0: return &v.state @@ -2334,7 +2334,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[17].Exporter = func(v any, i int) any { switch v := v.(*QueryScriptKeyResponse); i { case 0: return &v.state @@ -2346,7 +2346,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[18].Exporter = func(v any, i int) any { switch v := v.(*ProveAssetOwnershipRequest); i { case 0: return &v.state @@ -2358,7 +2358,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[19].Exporter = func(v any, i int) any { switch v := v.(*ProveAssetOwnershipResponse); i { case 0: return &v.state @@ -2370,7 +2370,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[20].Exporter = func(v any, i int) any { switch v := v.(*VerifyAssetOwnershipRequest); i { case 0: return &v.state @@ -2382,7 +2382,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[21].Exporter = func(v any, i int) any { switch v := v.(*VerifyAssetOwnershipResponse); i { case 0: return &v.state @@ -2394,7 +2394,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[22].Exporter = func(v any, i int) any { switch v := v.(*RemoveUTXOLeaseRequest); i { case 0: return &v.state @@ -2406,7 +2406,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[23].Exporter = func(v any, i int) any { switch v := v.(*RemoveUTXOLeaseResponse); i { case 0: return &v.state @@ -2418,7 +2418,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[24].Exporter = func(v any, i int) any { switch v := v.(*DeclareScriptKeyRequest); i { case 0: return &v.state @@ -2430,7 +2430,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[25].Exporter = func(v any, i int) any { switch v := v.(*DeclareScriptKeyResponse); i { case 0: return &v.state @@ -2443,11 +2443,11 @@ func file_assetwalletrpc_assetwallet_proto_init() { } } } - file_assetwalletrpc_assetwallet_proto_msgTypes[0].OneofWrappers = []interface{}{ + file_assetwalletrpc_assetwallet_proto_msgTypes[0].OneofWrappers = []any{ (*FundVirtualPsbtRequest_Psbt)(nil), (*FundVirtualPsbtRequest_Raw)(nil), } - file_assetwalletrpc_assetwallet_proto_msgTypes[7].OneofWrappers = []interface{}{ + file_assetwalletrpc_assetwallet_proto_msgTypes[7].OneofWrappers = []any{ (*CommitVirtualPsbtsRequest_ExistingOutputIndex)(nil), (*CommitVirtualPsbtsRequest_Add)(nil), (*CommitVirtualPsbtsRequest_TargetConf)(nil), diff --git a/taprpc/assetwalletrpc/assetwallet.pb.gw.go b/taprpc/assetwalletrpc/assetwallet.pb.gw.go index ddf85ea42..9f3ce0722 100644 --- a/taprpc/assetwalletrpc/assetwallet.pb.gw.go +++ b/taprpc/assetwalletrpc/assetwallet.pb.gw.go @@ -35,11 +35,7 @@ func request_AssetWallet_FundVirtualPsbt_0(ctx context.Context, marshaler runtim var protoReq FundVirtualPsbtRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -52,11 +48,7 @@ func local_request_AssetWallet_FundVirtualPsbt_0(ctx context.Context, marshaler var protoReq FundVirtualPsbtRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -69,11 +61,7 @@ func request_AssetWallet_SignVirtualPsbt_0(ctx context.Context, marshaler runtim var protoReq SignVirtualPsbtRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -86,11 +74,7 @@ func local_request_AssetWallet_SignVirtualPsbt_0(ctx context.Context, marshaler var protoReq SignVirtualPsbtRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -103,11 +87,7 @@ func request_AssetWallet_AnchorVirtualPsbts_0(ctx context.Context, marshaler run var protoReq AnchorVirtualPsbtsRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -120,11 +100,7 @@ func local_request_AssetWallet_AnchorVirtualPsbts_0(ctx context.Context, marshal var protoReq AnchorVirtualPsbtsRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -137,11 +113,7 @@ func request_AssetWallet_CommitVirtualPsbts_0(ctx context.Context, marshaler run var protoReq CommitVirtualPsbtsRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -154,11 +126,7 @@ func local_request_AssetWallet_CommitVirtualPsbts_0(ctx context.Context, marshal var protoReq CommitVirtualPsbtsRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -171,11 +139,7 @@ func request_AssetWallet_PublishAndLogTransfer_0(ctx context.Context, marshaler var protoReq PublishAndLogRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -188,11 +152,7 @@ func local_request_AssetWallet_PublishAndLogTransfer_0(ctx context.Context, mars var protoReq PublishAndLogRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -205,11 +165,7 @@ func request_AssetWallet_NextInternalKey_0(ctx context.Context, marshaler runtim var protoReq NextInternalKeyRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -222,11 +178,7 @@ func local_request_AssetWallet_NextInternalKey_0(ctx context.Context, marshaler var protoReq NextInternalKeyRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -239,11 +191,7 @@ func request_AssetWallet_NextScriptKey_0(ctx context.Context, marshaler runtime. var protoReq NextScriptKeyRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -256,11 +204,7 @@ func local_request_AssetWallet_NextScriptKey_0(ctx context.Context, marshaler ru var protoReq NextScriptKeyRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -377,11 +321,7 @@ func request_AssetWallet_ProveAssetOwnership_0(ctx context.Context, marshaler ru var protoReq ProveAssetOwnershipRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -394,11 +334,7 @@ func local_request_AssetWallet_ProveAssetOwnership_0(ctx context.Context, marsha var protoReq ProveAssetOwnershipRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -411,11 +347,7 @@ func request_AssetWallet_VerifyAssetOwnership_0(ctx context.Context, marshaler r var protoReq VerifyAssetOwnershipRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -428,11 +360,7 @@ func local_request_AssetWallet_VerifyAssetOwnership_0(ctx context.Context, marsh var protoReq VerifyAssetOwnershipRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -445,11 +373,7 @@ func request_AssetWallet_RemoveUTXOLease_0(ctx context.Context, marshaler runtim var protoReq RemoveUTXOLeaseRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -462,11 +386,7 @@ func local_request_AssetWallet_RemoveUTXOLease_0(ctx context.Context, marshaler var protoReq RemoveUTXOLeaseRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -479,11 +399,7 @@ func request_AssetWallet_DeclareScriptKey_0(ctx context.Context, marshaler runti var protoReq DeclareScriptKeyRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -496,11 +412,7 @@ func local_request_AssetWallet_DeclareScriptKey_0(ctx context.Context, marshaler var protoReq DeclareScriptKeyRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -846,21 +758,21 @@ func RegisterAssetWalletHandlerServer(ctx context.Context, mux *runtime.ServeMux // RegisterAssetWalletHandlerFromEndpoint is same as RegisterAssetWalletHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterAssetWalletHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.DialContext(ctx, endpoint, opts...) + conn, err := grpc.NewClient(endpoint, opts...) if err != nil { return err } defer func() { if err != nil { if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } return } go func() { <-ctx.Done() if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } }() }() diff --git a/taprpc/mintrpc/mint.pb.go b/taprpc/mintrpc/mint.pb.go index ac272dd82..3e481ce38 100644 --- a/taprpc/mintrpc/mint.pb.go +++ b/taprpc/mintrpc/mint.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 +// protoc-gen-go v1.34.2 // protoc v3.21.12 // source: mintrpc/mint.proto @@ -1867,7 +1867,7 @@ func file_mintrpc_mint_proto_rawDescGZIP() []byte { var file_mintrpc_mint_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_mintrpc_mint_proto_msgTypes = make([]protoimpl.MessageInfo, 19) -var file_mintrpc_mint_proto_goTypes = []interface{}{ +var file_mintrpc_mint_proto_goTypes = []any{ (BatchState)(0), // 0: mintrpc.BatchState (*PendingAsset)(nil), // 1: mintrpc.PendingAsset (*UnsealedAsset)(nil), // 2: mintrpc.UnsealedAsset @@ -1959,7 +1959,7 @@ func file_mintrpc_mint_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_mintrpc_mint_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*PendingAsset); i { case 0: return &v.state @@ -1971,7 +1971,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*UnsealedAsset); i { case 0: return &v.state @@ -1983,7 +1983,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*MintAsset); i { case 0: return &v.state @@ -1995,7 +1995,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*MintAssetRequest); i { case 0: return &v.state @@ -2007,7 +2007,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*MintAssetResponse); i { case 0: return &v.state @@ -2019,7 +2019,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*MintingBatch); i { case 0: return &v.state @@ -2031,7 +2031,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*VerboseBatch); i { case 0: return &v.state @@ -2043,7 +2043,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*FundBatchRequest); i { case 0: return &v.state @@ -2055,7 +2055,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[8].Exporter = func(v any, i int) any { switch v := v.(*FundBatchResponse); i { case 0: return &v.state @@ -2067,7 +2067,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[9].Exporter = func(v any, i int) any { switch v := v.(*SealBatchRequest); i { case 0: return &v.state @@ -2079,7 +2079,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*SealBatchResponse); i { case 0: return &v.state @@ -2091,7 +2091,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[11].Exporter = func(v any, i int) any { switch v := v.(*FinalizeBatchRequest); i { case 0: return &v.state @@ -2103,7 +2103,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[12].Exporter = func(v any, i int) any { switch v := v.(*FinalizeBatchResponse); i { case 0: return &v.state @@ -2115,7 +2115,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[13].Exporter = func(v any, i int) any { switch v := v.(*CancelBatchRequest); i { case 0: return &v.state @@ -2127,7 +2127,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[14].Exporter = func(v any, i int) any { switch v := v.(*CancelBatchResponse); i { case 0: return &v.state @@ -2139,7 +2139,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[15].Exporter = func(v any, i int) any { switch v := v.(*ListBatchRequest); i { case 0: return &v.state @@ -2151,7 +2151,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[16].Exporter = func(v any, i int) any { switch v := v.(*ListBatchResponse); i { case 0: return &v.state @@ -2163,7 +2163,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[17].Exporter = func(v any, i int) any { switch v := v.(*SubscribeMintEventsRequest); i { case 0: return &v.state @@ -2175,7 +2175,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[18].Exporter = func(v any, i int) any { switch v := v.(*MintEvent); i { case 0: return &v.state @@ -2188,15 +2188,15 @@ func file_mintrpc_mint_proto_init() { } } } - file_mintrpc_mint_proto_msgTypes[7].OneofWrappers = []interface{}{ + file_mintrpc_mint_proto_msgTypes[7].OneofWrappers = []any{ (*FundBatchRequest_FullTree)(nil), (*FundBatchRequest_Branch)(nil), } - file_mintrpc_mint_proto_msgTypes[11].OneofWrappers = []interface{}{ + file_mintrpc_mint_proto_msgTypes[11].OneofWrappers = []any{ (*FinalizeBatchRequest_FullTree)(nil), (*FinalizeBatchRequest_Branch)(nil), } - file_mintrpc_mint_proto_msgTypes[15].OneofWrappers = []interface{}{ + file_mintrpc_mint_proto_msgTypes[15].OneofWrappers = []any{ (*ListBatchRequest_BatchKey)(nil), (*ListBatchRequest_BatchKeyStr)(nil), } diff --git a/taprpc/mintrpc/mint.pb.gw.go b/taprpc/mintrpc/mint.pb.gw.go index 616eefd2b..9cca70af2 100644 --- a/taprpc/mintrpc/mint.pb.gw.go +++ b/taprpc/mintrpc/mint.pb.gw.go @@ -35,11 +35,7 @@ func request_Mint_MintAsset_0(ctx context.Context, marshaler runtime.Marshaler, var protoReq MintAssetRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -52,11 +48,7 @@ func local_request_Mint_MintAsset_0(ctx context.Context, marshaler runtime.Marsh var protoReq MintAssetRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -69,11 +61,7 @@ func request_Mint_FundBatch_0(ctx context.Context, marshaler runtime.Marshaler, var protoReq FundBatchRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -86,11 +74,7 @@ func local_request_Mint_FundBatch_0(ctx context.Context, marshaler runtime.Marsh var protoReq FundBatchRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -103,11 +87,7 @@ func request_Mint_SealBatch_0(ctx context.Context, marshaler runtime.Marshaler, var protoReq SealBatchRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -120,11 +100,7 @@ func local_request_Mint_SealBatch_0(ctx context.Context, marshaler runtime.Marsh var protoReq SealBatchRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -137,11 +113,7 @@ func request_Mint_FinalizeBatch_0(ctx context.Context, marshaler runtime.Marshal var protoReq FinalizeBatchRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -154,11 +126,7 @@ func local_request_Mint_FinalizeBatch_0(ctx context.Context, marshaler runtime.M var protoReq FinalizeBatchRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -171,11 +139,7 @@ func request_Mint_CancelBatch_0(ctx context.Context, marshaler runtime.Marshaler var protoReq CancelBatchRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -188,11 +152,7 @@ func local_request_Mint_CancelBatch_0(ctx context.Context, marshaler runtime.Mar var protoReq CancelBatchRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -202,7 +162,7 @@ func local_request_Mint_CancelBatch_0(ctx context.Context, marshaler runtime.Mar } var ( - filter_Mint_ListBatches_0 = &utilities.DoubleArray{Encoding: map[string]int{"batch_key": 0, "batchKey": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + filter_Mint_ListBatches_0 = &utilities.DoubleArray{Encoding: map[string]int{"batch_key": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) func request_Mint_ListBatches_0(ctx context.Context, marshaler runtime.Marshaler, client MintClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -285,11 +245,7 @@ func request_Mint_SubscribeMintEvents_0(ctx context.Context, marshaler runtime.M var protoReq SubscribeMintEventsRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -475,21 +431,21 @@ func RegisterMintHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve // RegisterMintHandlerFromEndpoint is same as RegisterMintHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterMintHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.DialContext(ctx, endpoint, opts...) + conn, err := grpc.NewClient(endpoint, opts...) if err != nil { return err } defer func() { if err != nil { if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } return } go func() { <-ctx.Done() if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } }() }() diff --git a/taprpc/priceoraclerpc/price_oracle.pb.go b/taprpc/priceoraclerpc/price_oracle.pb.go index 180e51ff7..6becebda0 100644 --- a/taprpc/priceoraclerpc/price_oracle.pb.go +++ b/taprpc/priceoraclerpc/price_oracle.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 +// protoc-gen-go v1.34.2 // protoc v3.21.12 // source: priceoraclerpc/price_oracle.proto @@ -754,7 +754,7 @@ func file_priceoraclerpc_price_oracle_proto_rawDescGZIP() []byte { var file_priceoraclerpc_price_oracle_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_priceoraclerpc_price_oracle_proto_msgTypes = make([]protoimpl.MessageInfo, 7) -var file_priceoraclerpc_price_oracle_proto_goTypes = []interface{}{ +var file_priceoraclerpc_price_oracle_proto_goTypes = []any{ (TransactionType)(0), // 0: priceoraclerpc.TransactionType (*FixedPoint)(nil), // 1: priceoraclerpc.FixedPoint (*AssetRates)(nil), // 2: priceoraclerpc.AssetRates @@ -789,7 +789,7 @@ func file_priceoraclerpc_price_oracle_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_priceoraclerpc_price_oracle_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_priceoraclerpc_price_oracle_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*FixedPoint); i { case 0: return &v.state @@ -801,7 +801,7 @@ func file_priceoraclerpc_price_oracle_proto_init() { return nil } } - file_priceoraclerpc_price_oracle_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_priceoraclerpc_price_oracle_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*AssetRates); i { case 0: return &v.state @@ -813,7 +813,7 @@ func file_priceoraclerpc_price_oracle_proto_init() { return nil } } - file_priceoraclerpc_price_oracle_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_priceoraclerpc_price_oracle_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*AssetSpecifier); i { case 0: return &v.state @@ -825,7 +825,7 @@ func file_priceoraclerpc_price_oracle_proto_init() { return nil } } - file_priceoraclerpc_price_oracle_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_priceoraclerpc_price_oracle_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*QueryAssetRatesRequest); i { case 0: return &v.state @@ -837,7 +837,7 @@ func file_priceoraclerpc_price_oracle_proto_init() { return nil } } - file_priceoraclerpc_price_oracle_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_priceoraclerpc_price_oracle_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*QueryAssetRatesOkResponse); i { case 0: return &v.state @@ -849,7 +849,7 @@ func file_priceoraclerpc_price_oracle_proto_init() { return nil } } - file_priceoraclerpc_price_oracle_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_priceoraclerpc_price_oracle_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*QueryAssetRatesErrResponse); i { case 0: return &v.state @@ -861,7 +861,7 @@ func file_priceoraclerpc_price_oracle_proto_init() { return nil } } - file_priceoraclerpc_price_oracle_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_priceoraclerpc_price_oracle_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*QueryAssetRatesResponse); i { case 0: return &v.state @@ -874,13 +874,13 @@ func file_priceoraclerpc_price_oracle_proto_init() { } } } - file_priceoraclerpc_price_oracle_proto_msgTypes[2].OneofWrappers = []interface{}{ + file_priceoraclerpc_price_oracle_proto_msgTypes[2].OneofWrappers = []any{ (*AssetSpecifier_AssetId)(nil), (*AssetSpecifier_AssetIdStr)(nil), (*AssetSpecifier_GroupKey)(nil), (*AssetSpecifier_GroupKeyStr)(nil), } - file_priceoraclerpc_price_oracle_proto_msgTypes[6].OneofWrappers = []interface{}{ + file_priceoraclerpc_price_oracle_proto_msgTypes[6].OneofWrappers = []any{ (*QueryAssetRatesResponse_Ok)(nil), (*QueryAssetRatesResponse_Error)(nil), } diff --git a/taprpc/priceoraclerpc/price_oracle.pb.gw.go b/taprpc/priceoraclerpc/price_oracle.pb.gw.go index 560a9b814..2f9501573 100644 --- a/taprpc/priceoraclerpc/price_oracle.pb.gw.go +++ b/taprpc/priceoraclerpc/price_oracle.pb.gw.go @@ -104,21 +104,21 @@ func RegisterPriceOracleHandlerServer(ctx context.Context, mux *runtime.ServeMux // RegisterPriceOracleHandlerFromEndpoint is same as RegisterPriceOracleHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterPriceOracleHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.DialContext(ctx, endpoint, opts...) + conn, err := grpc.NewClient(endpoint, opts...) if err != nil { return err } defer func() { if err != nil { if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } return } go func() { <-ctx.Done() if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } }() }() diff --git a/taprpc/rfqrpc/rfq.pb.go b/taprpc/rfqrpc/rfq.pb.go index fbf0ae6a1..985a2a0bd 100644 --- a/taprpc/rfqrpc/rfq.pb.go +++ b/taprpc/rfqrpc/rfq.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 +// protoc-gen-go v1.34.2 // protoc v3.21.12 // source: rfqrpc/rfq.proto @@ -1900,7 +1900,7 @@ func file_rfqrpc_rfq_proto_rawDescGZIP() []byte { var file_rfqrpc_rfq_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_rfqrpc_rfq_proto_msgTypes = make([]protoimpl.MessageInfo, 21) -var file_rfqrpc_rfq_proto_goTypes = []interface{}{ +var file_rfqrpc_rfq_proto_goTypes = []any{ (QuoteRespStatus)(0), // 0: rfqrpc.QuoteRespStatus (*AssetSpecifier)(nil), // 1: rfqrpc.AssetSpecifier (*FixedPoint)(nil), // 2: rfqrpc.FixedPoint @@ -1970,7 +1970,7 @@ func file_rfqrpc_rfq_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_rfqrpc_rfq_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*AssetSpecifier); i { case 0: return &v.state @@ -1982,7 +1982,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*FixedPoint); i { case 0: return &v.state @@ -1994,7 +1994,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*AddAssetBuyOrderRequest); i { case 0: return &v.state @@ -2006,7 +2006,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*AddAssetBuyOrderResponse); i { case 0: return &v.state @@ -2018,7 +2018,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*AddAssetSellOrderRequest); i { case 0: return &v.state @@ -2030,7 +2030,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*AddAssetSellOrderResponse); i { case 0: return &v.state @@ -2042,7 +2042,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*AddAssetSellOfferRequest); i { case 0: return &v.state @@ -2054,7 +2054,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*AddAssetSellOfferResponse); i { case 0: return &v.state @@ -2066,7 +2066,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[8].Exporter = func(v any, i int) any { switch v := v.(*AddAssetBuyOfferRequest); i { case 0: return &v.state @@ -2078,7 +2078,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[9].Exporter = func(v any, i int) any { switch v := v.(*AddAssetBuyOfferResponse); i { case 0: return &v.state @@ -2090,7 +2090,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*QueryPeerAcceptedQuotesRequest); i { case 0: return &v.state @@ -2102,7 +2102,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[11].Exporter = func(v any, i int) any { switch v := v.(*PeerAcceptedBuyQuote); i { case 0: return &v.state @@ -2114,7 +2114,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[12].Exporter = func(v any, i int) any { switch v := v.(*PeerAcceptedSellQuote); i { case 0: return &v.state @@ -2126,7 +2126,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[13].Exporter = func(v any, i int) any { switch v := v.(*InvalidQuoteResponse); i { case 0: return &v.state @@ -2138,7 +2138,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[14].Exporter = func(v any, i int) any { switch v := v.(*RejectedQuoteResponse); i { case 0: return &v.state @@ -2150,7 +2150,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[15].Exporter = func(v any, i int) any { switch v := v.(*QueryPeerAcceptedQuotesResponse); i { case 0: return &v.state @@ -2162,7 +2162,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[16].Exporter = func(v any, i int) any { switch v := v.(*SubscribeRfqEventNtfnsRequest); i { case 0: return &v.state @@ -2174,7 +2174,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[17].Exporter = func(v any, i int) any { switch v := v.(*PeerAcceptedBuyQuoteEvent); i { case 0: return &v.state @@ -2186,7 +2186,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[18].Exporter = func(v any, i int) any { switch v := v.(*PeerAcceptedSellQuoteEvent); i { case 0: return &v.state @@ -2198,7 +2198,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[19].Exporter = func(v any, i int) any { switch v := v.(*AcceptHtlcEvent); i { case 0: return &v.state @@ -2210,7 +2210,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[20].Exporter = func(v any, i int) any { switch v := v.(*RfqEvent); i { case 0: return &v.state @@ -2223,23 +2223,23 @@ func file_rfqrpc_rfq_proto_init() { } } } - file_rfqrpc_rfq_proto_msgTypes[0].OneofWrappers = []interface{}{ + file_rfqrpc_rfq_proto_msgTypes[0].OneofWrappers = []any{ (*AssetSpecifier_AssetId)(nil), (*AssetSpecifier_AssetIdStr)(nil), (*AssetSpecifier_GroupKey)(nil), (*AssetSpecifier_GroupKeyStr)(nil), } - file_rfqrpc_rfq_proto_msgTypes[3].OneofWrappers = []interface{}{ + file_rfqrpc_rfq_proto_msgTypes[3].OneofWrappers = []any{ (*AddAssetBuyOrderResponse_AcceptedQuote)(nil), (*AddAssetBuyOrderResponse_InvalidQuote)(nil), (*AddAssetBuyOrderResponse_RejectedQuote)(nil), } - file_rfqrpc_rfq_proto_msgTypes[5].OneofWrappers = []interface{}{ + file_rfqrpc_rfq_proto_msgTypes[5].OneofWrappers = []any{ (*AddAssetSellOrderResponse_AcceptedQuote)(nil), (*AddAssetSellOrderResponse_InvalidQuote)(nil), (*AddAssetSellOrderResponse_RejectedQuote)(nil), } - file_rfqrpc_rfq_proto_msgTypes[20].OneofWrappers = []interface{}{ + file_rfqrpc_rfq_proto_msgTypes[20].OneofWrappers = []any{ (*RfqEvent_PeerAcceptedBuyQuote)(nil), (*RfqEvent_PeerAcceptedSellQuote)(nil), (*RfqEvent_AcceptHtlc)(nil), diff --git a/taprpc/rfqrpc/rfq.pb.gw.go b/taprpc/rfqrpc/rfq.pb.gw.go index d63a4307d..57abbcc24 100644 --- a/taprpc/rfqrpc/rfq.pb.gw.go +++ b/taprpc/rfqrpc/rfq.pb.gw.go @@ -35,11 +35,7 @@ func request_Rfq_AddAssetBuyOrder_0(ctx context.Context, marshaler runtime.Marsh var protoReq AddAssetBuyOrderRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -69,11 +65,7 @@ func local_request_Rfq_AddAssetBuyOrder_0(ctx context.Context, marshaler runtime var protoReq AddAssetBuyOrderRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -103,11 +95,7 @@ func request_Rfq_AddAssetBuyOrder_1(ctx context.Context, marshaler runtime.Marsh var protoReq AddAssetBuyOrderRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -137,11 +125,7 @@ func local_request_Rfq_AddAssetBuyOrder_1(ctx context.Context, marshaler runtime var protoReq AddAssetBuyOrderRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -171,11 +155,7 @@ func request_Rfq_AddAssetSellOrder_0(ctx context.Context, marshaler runtime.Mars var protoReq AddAssetSellOrderRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -205,11 +185,7 @@ func local_request_Rfq_AddAssetSellOrder_0(ctx context.Context, marshaler runtim var protoReq AddAssetSellOrderRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -239,11 +215,7 @@ func request_Rfq_AddAssetSellOrder_1(ctx context.Context, marshaler runtime.Mars var protoReq AddAssetSellOrderRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -273,11 +245,7 @@ func local_request_Rfq_AddAssetSellOrder_1(ctx context.Context, marshaler runtim var protoReq AddAssetSellOrderRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -307,11 +275,7 @@ func request_Rfq_AddAssetSellOffer_0(ctx context.Context, marshaler runtime.Mars var protoReq AddAssetSellOfferRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -341,11 +305,7 @@ func local_request_Rfq_AddAssetSellOffer_0(ctx context.Context, marshaler runtim var protoReq AddAssetSellOfferRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -375,11 +335,7 @@ func request_Rfq_AddAssetSellOffer_1(ctx context.Context, marshaler runtime.Mars var protoReq AddAssetSellOfferRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -409,11 +365,7 @@ func local_request_Rfq_AddAssetSellOffer_1(ctx context.Context, marshaler runtim var protoReq AddAssetSellOfferRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -443,11 +395,7 @@ func request_Rfq_AddAssetBuyOffer_0(ctx context.Context, marshaler runtime.Marsh var protoReq AddAssetBuyOfferRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -477,11 +425,7 @@ func local_request_Rfq_AddAssetBuyOffer_0(ctx context.Context, marshaler runtime var protoReq AddAssetBuyOfferRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -511,11 +455,7 @@ func request_Rfq_AddAssetBuyOffer_1(ctx context.Context, marshaler runtime.Marsh var protoReq AddAssetBuyOfferRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -545,11 +485,7 @@ func local_request_Rfq_AddAssetBuyOffer_1(ctx context.Context, marshaler runtime var protoReq AddAssetBuyOfferRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -597,11 +533,7 @@ func request_Rfq_SubscribeRfqEventNtfns_0(ctx context.Context, marshaler runtime var protoReq SubscribeRfqEventNtfnsRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -862,21 +794,21 @@ func RegisterRfqHandlerServer(ctx context.Context, mux *runtime.ServeMux, server // RegisterRfqHandlerFromEndpoint is same as RegisterRfqHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterRfqHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.DialContext(ctx, endpoint, opts...) + conn, err := grpc.NewClient(endpoint, opts...) if err != nil { return err } defer func() { if err != nil { if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } return } go func() { <-ctx.Done() if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } }() }() diff --git a/taprpc/rfqrpc/rfq.swagger.json b/taprpc/rfqrpc/rfq.swagger.json index 5bdff4a1a..9270b51a5 100644 --- a/taprpc/rfqrpc/rfq.swagger.json +++ b/taprpc/rfqrpc/rfq.swagger.json @@ -48,35 +48,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "asset_specifier": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - }, - "group_key_str": { - "type": "string", - "description": "The 32-byte asset group key encoded as hex string (use this for\nREST)." - } - }, - "description": "asset_specifier is the subject asset.", - "title": "asset_specifier is the subject asset." - }, - "max_units": { - "type": "string", - "format": "uint64", - "description": "max_units is the maximum amount of the asset to buy." - } - } + "$ref": "#/definitions/RfqAddAssetBuyOfferBody" } } ], @@ -117,35 +89,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "asset_specifier": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "asset_id_str": { - "type": "string", - "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - } - }, - "description": "asset_specifier is the subject asset.", - "title": "asset_specifier is the subject asset." - }, - "max_units": { - "type": "string", - "format": "uint64", - "description": "max_units is the maximum amount of the asset to buy." - } - } + "$ref": "#/definitions/RfqAddAssetBuyOfferBody" } } ], @@ -186,54 +130,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "asset_specifier": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - }, - "group_key_str": { - "type": "string", - "description": "The 32-byte asset group key encoded as hex string (use this for\nREST)." - } - }, - "description": "asset_specifier is the subject asset.", - "title": "asset_specifier is the subject asset." - }, - "asset_max_amt": { - "type": "string", - "format": "uint64", - "description": "The maximum amount of the asset that the provider must be willing to\noffer." - }, - "expiry": { - "type": "string", - "format": "uint64", - "description": "The unix timestamp in seconds after which the order is no longer valid." - }, - "peer_pub_key": { - "type": "string", - "format": "byte", - "description": "peer_pub_key is an optional field for specifying the public key of the\nintended recipient peer for the order." - }, - "timeout_seconds": { - "type": "integer", - "format": "int64", - "description": "timeout_seconds is the number of seconds to wait for the peer to respond\nwith an accepted quote (or a rejection)." - }, - "skip_asset_channel_check": { - "type": "boolean", - "description": "If set, the check if a channel with the given asset exists with the peer\nwill be skipped. An active channel with the peer is still required for\nthe RFQ negotiation to work. This flag shouldn't be set outside of test\nscenarios." - } - } + "$ref": "#/definitions/RfqAddAssetBuyOrderBody" } } ], @@ -274,54 +171,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "asset_specifier": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "asset_id_str": { - "type": "string", - "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - } - }, - "description": "asset_specifier is the subject asset.", - "title": "asset_specifier is the subject asset." - }, - "asset_max_amt": { - "type": "string", - "format": "uint64", - "description": "The maximum amount of the asset that the provider must be willing to\noffer." - }, - "expiry": { - "type": "string", - "format": "uint64", - "description": "The unix timestamp in seconds after which the order is no longer valid." - }, - "peer_pub_key": { - "type": "string", - "format": "byte", - "description": "peer_pub_key is an optional field for specifying the public key of the\nintended recipient peer for the order." - }, - "timeout_seconds": { - "type": "integer", - "format": "int64", - "description": "timeout_seconds is the number of seconds to wait for the peer to respond\nwith an accepted quote (or a rejection)." - }, - "skip_asset_channel_check": { - "type": "boolean", - "description": "If set, the check if a channel with the given asset exists with the peer\nwill be skipped. An active channel with the peer is still required for\nthe RFQ negotiation to work. This flag shouldn't be set outside of test\nscenarios." - } - } + "$ref": "#/definitions/RfqAddAssetBuyOrderBody" } } ], @@ -426,35 +276,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "asset_specifier": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - }, - "group_key_str": { - "type": "string", - "description": "The 32-byte asset group key encoded as hex string (use this for\nREST)." - } - }, - "description": "asset_specifier is the subject asset.", - "title": "asset_specifier is the subject asset." - }, - "max_units": { - "type": "string", - "format": "uint64", - "description": "max_units is the maximum amount of the asset to sell." - } - } + "$ref": "#/definitions/RfqAddAssetSellOfferBody" } } ], @@ -494,35 +316,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "asset_specifier": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "asset_id_str": { - "type": "string", - "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - } - }, - "description": "asset_specifier is the subject asset.", - "title": "asset_specifier is the subject asset." - }, - "max_units": { - "type": "string", - "format": "uint64", - "description": "max_units is the maximum amount of the asset to sell." - } - } + "$ref": "#/definitions/RfqAddAssetSellOfferBody" } } ], @@ -562,54 +356,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "asset_specifier": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - }, - "group_key_str": { - "type": "string", - "description": "The 32-byte asset group key encoded as hex string (use this for\nREST)." - } - }, - "description": "asset_specifier is the subject asset.", - "title": "asset_specifier is the subject asset." - }, - "payment_max_amt": { - "type": "string", - "format": "uint64", - "description": "The maximum msat amount that the responding peer must agree to pay\n(units: millisats)." - }, - "expiry": { - "type": "string", - "format": "uint64", - "description": "The unix timestamp in seconds after which the order is no longer valid." - }, - "peer_pub_key": { - "type": "string", - "format": "byte", - "description": "peer_pub_key is an optional field for specifying the public key of the\nintended recipient peer for the order." - }, - "timeout_seconds": { - "type": "integer", - "format": "int64", - "description": "timeout_seconds is the number of seconds to wait for the peer to respond\nwith an accepted quote (or a rejection)." - }, - "skip_asset_channel_check": { - "type": "boolean", - "description": "If set, the check if a channel with the given asset exists with the peer\nwill be skipped. An active channel with the peer is still required for\nthe RFQ negotiation to work. This flag shouldn't be set outside of test\nscenarios." - } - } + "$ref": "#/definitions/RfqAddAssetSellOrderBody" } } ], @@ -649,54 +396,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "asset_specifier": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "asset_id_str": { - "type": "string", - "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - } - }, - "description": "asset_specifier is the subject asset.", - "title": "asset_specifier is the subject asset." - }, - "payment_max_amt": { - "type": "string", - "format": "uint64", - "description": "The maximum msat amount that the responding peer must agree to pay\n(units: millisats)." - }, - "expiry": { - "type": "string", - "format": "uint64", - "description": "The unix timestamp in seconds after which the order is no longer valid." - }, - "peer_pub_key": { - "type": "string", - "format": "byte", - "description": "peer_pub_key is an optional field for specifying the public key of the\nintended recipient peer for the order." - }, - "timeout_seconds": { - "type": "integer", - "format": "int64", - "description": "timeout_seconds is the number of seconds to wait for the peer to respond\nwith an accepted quote (or a rejection)." - }, - "skip_asset_channel_check": { - "type": "boolean", - "description": "If set, the check if a channel with the given asset exists with the peer\nwill be skipped. An active channel with the peer is still required for\nthe RFQ negotiation to work. This flag shouldn't be set outside of test\nscenarios." - } - } + "$ref": "#/definitions/RfqAddAssetSellOrderBody" } } ], @@ -707,6 +407,168 @@ } }, "definitions": { + "RfqAddAssetBuyOfferBody": { + "type": "object", + "properties": { + "asset_specifier": { + "type": "object", + "properties": { + "asset_id": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." + }, + "asset_id_str": { + "type": "string", + "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." + }, + "group_key": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." + } + }, + "description": "asset_specifier is the subject asset.", + "title": "asset_specifier is the subject asset." + }, + "max_units": { + "type": "string", + "format": "uint64", + "description": "max_units is the maximum amount of the asset to buy." + } + } + }, + "RfqAddAssetBuyOrderBody": { + "type": "object", + "properties": { + "asset_specifier": { + "type": "object", + "properties": { + "asset_id": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." + }, + "asset_id_str": { + "type": "string", + "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." + }, + "group_key": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." + } + }, + "description": "asset_specifier is the subject asset.", + "title": "asset_specifier is the subject asset." + }, + "asset_max_amt": { + "type": "string", + "format": "uint64", + "description": "The maximum amount of the asset that the provider must be willing to\noffer." + }, + "expiry": { + "type": "string", + "format": "uint64", + "description": "The unix timestamp in seconds after which the order is no longer valid." + }, + "peer_pub_key": { + "type": "string", + "format": "byte", + "description": "peer_pub_key is an optional field for specifying the public key of the\nintended recipient peer for the order." + }, + "timeout_seconds": { + "type": "integer", + "format": "int64", + "description": "timeout_seconds is the number of seconds to wait for the peer to respond\nwith an accepted quote (or a rejection)." + }, + "skip_asset_channel_check": { + "type": "boolean", + "description": "If set, the check if a channel with the given asset exists with the peer\nwill be skipped. An active channel with the peer is still required for\nthe RFQ negotiation to work. This flag shouldn't be set outside of test\nscenarios." + } + } + }, + "RfqAddAssetSellOfferBody": { + "type": "object", + "properties": { + "asset_specifier": { + "type": "object", + "properties": { + "asset_id": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." + }, + "asset_id_str": { + "type": "string", + "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." + }, + "group_key": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." + } + }, + "description": "asset_specifier is the subject asset.", + "title": "asset_specifier is the subject asset." + }, + "max_units": { + "type": "string", + "format": "uint64", + "description": "max_units is the maximum amount of the asset to sell." + } + } + }, + "RfqAddAssetSellOrderBody": { + "type": "object", + "properties": { + "asset_specifier": { + "type": "object", + "properties": { + "asset_id": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." + }, + "asset_id_str": { + "type": "string", + "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." + }, + "group_key": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." + } + }, + "description": "asset_specifier is the subject asset.", + "title": "asset_specifier is the subject asset." + }, + "payment_max_amt": { + "type": "string", + "format": "uint64", + "description": "The maximum msat amount that the responding peer must agree to pay\n(units: millisats)." + }, + "expiry": { + "type": "string", + "format": "uint64", + "description": "The unix timestamp in seconds after which the order is no longer valid." + }, + "peer_pub_key": { + "type": "string", + "format": "byte", + "description": "peer_pub_key is an optional field for specifying the public key of the\nintended recipient peer for the order." + }, + "timeout_seconds": { + "type": "integer", + "format": "int64", + "description": "timeout_seconds is the number of seconds to wait for the peer to respond\nwith an accepted quote (or a rejection)." + }, + "skip_asset_channel_check": { + "type": "boolean", + "description": "If set, the check if a channel with the given asset exists with the peer\nwill be skipped. An active channel with the peer is still required for\nthe RFQ negotiation to work. This flag shouldn't be set outside of test\nscenarios." + } + } + }, "protobufAny": { "type": "object", "properties": { diff --git a/taprpc/tapchannelrpc/tapchannel.pb.go b/taprpc/tapchannelrpc/tapchannel.pb.go index 4c0d2450e..e0dcd2c8d 100644 --- a/taprpc/tapchannelrpc/tapchannel.pb.go +++ b/taprpc/tapchannelrpc/tapchannel.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 +// protoc-gen-go v1.34.2 // protoc v3.21.12 // source: tapchannelrpc/tapchannel.proto @@ -1115,7 +1115,7 @@ func file_tapchannelrpc_tapchannel_proto_rawDescGZIP() []byte { } var file_tapchannelrpc_tapchannel_proto_msgTypes = make([]protoimpl.MessageInfo, 14) -var file_tapchannelrpc_tapchannel_proto_goTypes = []interface{}{ +var file_tapchannelrpc_tapchannel_proto_goTypes = []any{ (*FundChannelRequest)(nil), // 0: tapchannelrpc.FundChannelRequest (*FundChannelResponse)(nil), // 1: tapchannelrpc.FundChannelResponse (*RouterSendPaymentData)(nil), // 2: tapchannelrpc.RouterSendPaymentData @@ -1179,7 +1179,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_tapchannelrpc_tapchannel_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*FundChannelRequest); i { case 0: return &v.state @@ -1191,7 +1191,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*FundChannelResponse); i { case 0: return &v.state @@ -1203,7 +1203,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*RouterSendPaymentData); i { case 0: return &v.state @@ -1215,7 +1215,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*EncodeCustomRecordsRequest); i { case 0: return &v.state @@ -1227,7 +1227,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*EncodeCustomRecordsResponse); i { case 0: return &v.state @@ -1239,7 +1239,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*SendPaymentRequest); i { case 0: return &v.state @@ -1251,7 +1251,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*SendPaymentResponse); i { case 0: return &v.state @@ -1263,7 +1263,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*HodlInvoice); i { case 0: return &v.state @@ -1275,7 +1275,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[8].Exporter = func(v any, i int) any { switch v := v.(*AddInvoiceRequest); i { case 0: return &v.state @@ -1287,7 +1287,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[9].Exporter = func(v any, i int) any { switch v := v.(*AddInvoiceResponse); i { case 0: return &v.state @@ -1299,7 +1299,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*AssetPayReq); i { case 0: return &v.state @@ -1311,7 +1311,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[11].Exporter = func(v any, i int) any { switch v := v.(*AssetPayReqResponse); i { case 0: return &v.state @@ -1324,10 +1324,10 @@ func file_tapchannelrpc_tapchannel_proto_init() { } } } - file_tapchannelrpc_tapchannel_proto_msgTypes[3].OneofWrappers = []interface{}{ + file_tapchannelrpc_tapchannel_proto_msgTypes[3].OneofWrappers = []any{ (*EncodeCustomRecordsRequest_RouterSendPayment)(nil), } - file_tapchannelrpc_tapchannel_proto_msgTypes[6].OneofWrappers = []interface{}{ + file_tapchannelrpc_tapchannel_proto_msgTypes[6].OneofWrappers = []any{ (*SendPaymentResponse_AcceptedSellOrder)(nil), (*SendPaymentResponse_PaymentResult)(nil), } diff --git a/taprpc/tapchannelrpc/tapchannel.pb.gw.go b/taprpc/tapchannelrpc/tapchannel.pb.gw.go index ca89998b1..620ca4ed4 100644 --- a/taprpc/tapchannelrpc/tapchannel.pb.gw.go +++ b/taprpc/tapchannelrpc/tapchannel.pb.gw.go @@ -35,11 +35,7 @@ func request_TaprootAssetChannels_FundChannel_0(ctx context.Context, marshaler r var protoReq FundChannelRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -52,11 +48,7 @@ func local_request_TaprootAssetChannels_FundChannel_0(ctx context.Context, marsh var protoReq FundChannelRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -69,11 +61,7 @@ func request_TaprootAssetChannels_EncodeCustomRecords_0(ctx context.Context, mar var protoReq EncodeCustomRecordsRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -86,11 +74,7 @@ func local_request_TaprootAssetChannels_EncodeCustomRecords_0(ctx context.Contex var protoReq EncodeCustomRecordsRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -103,11 +87,7 @@ func request_TaprootAssetChannels_SendPayment_0(ctx context.Context, marshaler r var protoReq SendPaymentRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -128,11 +108,7 @@ func request_TaprootAssetChannels_AddInvoice_0(ctx context.Context, marshaler ru var protoReq AddInvoiceRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -145,11 +121,7 @@ func local_request_TaprootAssetChannels_AddInvoice_0(ctx context.Context, marsha var protoReq AddInvoiceRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -162,11 +134,7 @@ func request_TaprootAssetChannels_DecodeAssetPayReq_0(ctx context.Context, marsh var protoReq AssetPayReq var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -179,11 +147,7 @@ func local_request_TaprootAssetChannels_DecodeAssetPayReq_0(ctx context.Context, var protoReq AssetPayReq var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -311,21 +275,21 @@ func RegisterTaprootAssetChannelsHandlerServer(ctx context.Context, mux *runtime // RegisterTaprootAssetChannelsHandlerFromEndpoint is same as RegisterTaprootAssetChannelsHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterTaprootAssetChannelsHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.DialContext(ctx, endpoint, opts...) + conn, err := grpc.NewClient(endpoint, opts...) if err != nil { return err } defer func() { if err != nil { if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } return } go func() { <-ctx.Done() if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } }() }() diff --git a/taprpc/tapdevrpc/tapdev.pb.go b/taprpc/tapdevrpc/tapdev.pb.go index e6a94278f..516a96f5e 100644 --- a/taprpc/tapdevrpc/tapdev.pb.go +++ b/taprpc/tapdevrpc/tapdev.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 +// protoc-gen-go v1.34.2 // protoc v3.21.12 // source: tapdevrpc/tapdev.proto @@ -733,7 +733,7 @@ func file_tapdevrpc_tapdev_proto_rawDescGZIP() []byte { var file_tapdevrpc_tapdev_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_tapdevrpc_tapdev_proto_msgTypes = make([]protoimpl.MessageInfo, 9) -var file_tapdevrpc_tapdev_proto_goTypes = []interface{}{ +var file_tapdevrpc_tapdev_proto_goTypes = []any{ (ProofTransferType)(0), // 0: tapdevrpc.ProofTransferType (*ImportProofRequest)(nil), // 1: tapdevrpc.ImportProofRequest (*ImportProofResponse)(nil), // 2: tapdevrpc.ImportProofResponse @@ -772,7 +772,7 @@ func file_tapdevrpc_tapdev_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_tapdevrpc_tapdev_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_tapdevrpc_tapdev_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*ImportProofRequest); i { case 0: return &v.state @@ -784,7 +784,7 @@ func file_tapdevrpc_tapdev_proto_init() { return nil } } - file_tapdevrpc_tapdev_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_tapdevrpc_tapdev_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*ImportProofResponse); i { case 0: return &v.state @@ -796,7 +796,7 @@ func file_tapdevrpc_tapdev_proto_init() { return nil } } - file_tapdevrpc_tapdev_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_tapdevrpc_tapdev_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*SubscribeSendAssetEventNtfnsRequest); i { case 0: return &v.state @@ -808,7 +808,7 @@ func file_tapdevrpc_tapdev_proto_init() { return nil } } - file_tapdevrpc_tapdev_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_tapdevrpc_tapdev_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*SendAssetEvent); i { case 0: return &v.state @@ -820,7 +820,7 @@ func file_tapdevrpc_tapdev_proto_init() { return nil } } - file_tapdevrpc_tapdev_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_tapdevrpc_tapdev_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*ExecuteSendStateEvent); i { case 0: return &v.state @@ -832,7 +832,7 @@ func file_tapdevrpc_tapdev_proto_init() { return nil } } - file_tapdevrpc_tapdev_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_tapdevrpc_tapdev_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*ProofTransferBackoffWaitEvent); i { case 0: return &v.state @@ -844,7 +844,7 @@ func file_tapdevrpc_tapdev_proto_init() { return nil } } - file_tapdevrpc_tapdev_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_tapdevrpc_tapdev_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*SubscribeReceiveAssetEventNtfnsRequest); i { case 0: return &v.state @@ -856,7 +856,7 @@ func file_tapdevrpc_tapdev_proto_init() { return nil } } - file_tapdevrpc_tapdev_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_tapdevrpc_tapdev_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*AssetReceiveCompleteEvent); i { case 0: return &v.state @@ -868,7 +868,7 @@ func file_tapdevrpc_tapdev_proto_init() { return nil } } - file_tapdevrpc_tapdev_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_tapdevrpc_tapdev_proto_msgTypes[8].Exporter = func(v any, i int) any { switch v := v.(*ReceiveAssetEvent); i { case 0: return &v.state @@ -881,11 +881,11 @@ func file_tapdevrpc_tapdev_proto_init() { } } } - file_tapdevrpc_tapdev_proto_msgTypes[3].OneofWrappers = []interface{}{ + file_tapdevrpc_tapdev_proto_msgTypes[3].OneofWrappers = []any{ (*SendAssetEvent_ExecuteSendStateEvent)(nil), (*SendAssetEvent_ProofTransferBackoffWaitEvent)(nil), } - file_tapdevrpc_tapdev_proto_msgTypes[8].OneofWrappers = []interface{}{ + file_tapdevrpc_tapdev_proto_msgTypes[8].OneofWrappers = []any{ (*ReceiveAssetEvent_ProofTransferBackoffWaitEvent)(nil), (*ReceiveAssetEvent_AssetReceiveCompleteEvent)(nil), } diff --git a/taprpc/taprootassets.pb.go b/taprpc/taprootassets.pb.go index d245b1e57..4b14a6309 100644 --- a/taprpc/taprootassets.pb.go +++ b/taprpc/taprootassets.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 +// protoc-gen-go v1.34.2 // protoc v3.21.12 // source: taprootassets.proto @@ -7505,7 +7505,7 @@ func file_taprootassets_proto_rawDescGZIP() []byte { var file_taprootassets_proto_enumTypes = make([]protoimpl.EnumInfo, 9) var file_taprootassets_proto_msgTypes = make([]protoimpl.MessageInfo, 84) -var file_taprootassets_proto_goTypes = []interface{}{ +var file_taprootassets_proto_goTypes = []any{ (AssetType)(0), // 0: taprpc.AssetType (AssetMetaType)(0), // 1: taprpc.AssetMetaType (AssetVersion)(0), // 2: taprpc.AssetVersion @@ -7735,7 +7735,7 @@ func file_taprootassets_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_taprootassets_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*AssetMeta); i { case 0: return &v.state @@ -7747,7 +7747,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*ListAssetRequest); i { case 0: return &v.state @@ -7759,7 +7759,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*AnchorInfo); i { case 0: return &v.state @@ -7771,7 +7771,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*GenesisInfo); i { case 0: return &v.state @@ -7783,7 +7783,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*ExternalKey); i { case 0: return &v.state @@ -7795,7 +7795,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*GroupKeyRequest); i { case 0: return &v.state @@ -7807,7 +7807,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*TxOut); i { case 0: return &v.state @@ -7819,7 +7819,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*GroupVirtualTx); i { case 0: return &v.state @@ -7831,7 +7831,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[8].Exporter = func(v any, i int) any { switch v := v.(*GroupWitness); i { case 0: return &v.state @@ -7843,7 +7843,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[9].Exporter = func(v any, i int) any { switch v := v.(*AssetGroup); i { case 0: return &v.state @@ -7855,7 +7855,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*GroupKeyReveal); i { case 0: return &v.state @@ -7867,7 +7867,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[11].Exporter = func(v any, i int) any { switch v := v.(*GenesisReveal); i { case 0: return &v.state @@ -7879,7 +7879,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[12].Exporter = func(v any, i int) any { switch v := v.(*DecimalDisplay); i { case 0: return &v.state @@ -7891,7 +7891,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[13].Exporter = func(v any, i int) any { switch v := v.(*Asset); i { case 0: return &v.state @@ -7903,7 +7903,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[14].Exporter = func(v any, i int) any { switch v := v.(*PrevWitness); i { case 0: return &v.state @@ -7915,7 +7915,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[15].Exporter = func(v any, i int) any { switch v := v.(*SplitCommitment); i { case 0: return &v.state @@ -7927,7 +7927,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[16].Exporter = func(v any, i int) any { switch v := v.(*ListAssetResponse); i { case 0: return &v.state @@ -7939,7 +7939,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[17].Exporter = func(v any, i int) any { switch v := v.(*ListUtxosRequest); i { case 0: return &v.state @@ -7951,7 +7951,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[18].Exporter = func(v any, i int) any { switch v := v.(*ManagedUtxo); i { case 0: return &v.state @@ -7963,7 +7963,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[19].Exporter = func(v any, i int) any { switch v := v.(*ListUtxosResponse); i { case 0: return &v.state @@ -7975,7 +7975,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[20].Exporter = func(v any, i int) any { switch v := v.(*ListGroupsRequest); i { case 0: return &v.state @@ -7987,7 +7987,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[21].Exporter = func(v any, i int) any { switch v := v.(*AssetHumanReadable); i { case 0: return &v.state @@ -7999,7 +7999,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[22].Exporter = func(v any, i int) any { switch v := v.(*GroupedAssets); i { case 0: return &v.state @@ -8011,7 +8011,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[23].Exporter = func(v any, i int) any { switch v := v.(*ListGroupsResponse); i { case 0: return &v.state @@ -8023,7 +8023,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[24].Exporter = func(v any, i int) any { switch v := v.(*ListBalancesRequest); i { case 0: return &v.state @@ -8035,7 +8035,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[25].Exporter = func(v any, i int) any { switch v := v.(*AssetBalance); i { case 0: return &v.state @@ -8047,7 +8047,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[26].Exporter = func(v any, i int) any { switch v := v.(*AssetGroupBalance); i { case 0: return &v.state @@ -8059,7 +8059,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[27].Exporter = func(v any, i int) any { switch v := v.(*ListBalancesResponse); i { case 0: return &v.state @@ -8071,7 +8071,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[28].Exporter = func(v any, i int) any { switch v := v.(*ListTransfersRequest); i { case 0: return &v.state @@ -8083,7 +8083,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[29].Exporter = func(v any, i int) any { switch v := v.(*ListTransfersResponse); i { case 0: return &v.state @@ -8095,7 +8095,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[30].Exporter = func(v any, i int) any { switch v := v.(*ChainHash); i { case 0: return &v.state @@ -8107,7 +8107,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[31].Exporter = func(v any, i int) any { switch v := v.(*AssetTransfer); i { case 0: return &v.state @@ -8119,7 +8119,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[32].Exporter = func(v any, i int) any { switch v := v.(*TransferInput); i { case 0: return &v.state @@ -8131,7 +8131,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[33].Exporter = func(v any, i int) any { switch v := v.(*TransferOutputAnchor); i { case 0: return &v.state @@ -8143,7 +8143,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[34].Exporter = func(v any, i int) any { switch v := v.(*TransferOutput); i { case 0: return &v.state @@ -8155,7 +8155,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[35].Exporter = func(v any, i int) any { switch v := v.(*StopRequest); i { case 0: return &v.state @@ -8167,7 +8167,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[36].Exporter = func(v any, i int) any { switch v := v.(*StopResponse); i { case 0: return &v.state @@ -8179,7 +8179,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[37].Exporter = func(v any, i int) any { switch v := v.(*DebugLevelRequest); i { case 0: return &v.state @@ -8191,7 +8191,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[38].Exporter = func(v any, i int) any { switch v := v.(*DebugLevelResponse); i { case 0: return &v.state @@ -8203,7 +8203,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[39].Exporter = func(v any, i int) any { switch v := v.(*Addr); i { case 0: return &v.state @@ -8215,7 +8215,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[40].Exporter = func(v any, i int) any { switch v := v.(*QueryAddrRequest); i { case 0: return &v.state @@ -8227,7 +8227,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[41].Exporter = func(v any, i int) any { switch v := v.(*QueryAddrResponse); i { case 0: return &v.state @@ -8239,7 +8239,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[42].Exporter = func(v any, i int) any { switch v := v.(*NewAddrRequest); i { case 0: return &v.state @@ -8251,7 +8251,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[43].Exporter = func(v any, i int) any { switch v := v.(*ScriptKey); i { case 0: return &v.state @@ -8263,7 +8263,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[44].Exporter = func(v any, i int) any { switch v := v.(*KeyLocator); i { case 0: return &v.state @@ -8275,7 +8275,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[45].Exporter = func(v any, i int) any { switch v := v.(*KeyDescriptor); i { case 0: return &v.state @@ -8287,7 +8287,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[46].Exporter = func(v any, i int) any { switch v := v.(*TapscriptFullTree); i { case 0: return &v.state @@ -8299,7 +8299,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[47].Exporter = func(v any, i int) any { switch v := v.(*TapLeaf); i { case 0: return &v.state @@ -8311,7 +8311,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[48].Exporter = func(v any, i int) any { switch v := v.(*TapBranch); i { case 0: return &v.state @@ -8323,7 +8323,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[49].Exporter = func(v any, i int) any { switch v := v.(*DecodeAddrRequest); i { case 0: return &v.state @@ -8335,7 +8335,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[50].Exporter = func(v any, i int) any { switch v := v.(*ProofFile); i { case 0: return &v.state @@ -8347,7 +8347,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[51].Exporter = func(v any, i int) any { switch v := v.(*DecodedProof); i { case 0: return &v.state @@ -8359,7 +8359,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[52].Exporter = func(v any, i int) any { switch v := v.(*VerifyProofResponse); i { case 0: return &v.state @@ -8371,7 +8371,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[53].Exporter = func(v any, i int) any { switch v := v.(*DecodeProofRequest); i { case 0: return &v.state @@ -8383,7 +8383,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[54].Exporter = func(v any, i int) any { switch v := v.(*DecodeProofResponse); i { case 0: return &v.state @@ -8395,7 +8395,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[55].Exporter = func(v any, i int) any { switch v := v.(*ExportProofRequest); i { case 0: return &v.state @@ -8407,7 +8407,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[56].Exporter = func(v any, i int) any { switch v := v.(*UnpackProofFileRequest); i { case 0: return &v.state @@ -8419,7 +8419,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[57].Exporter = func(v any, i int) any { switch v := v.(*UnpackProofFileResponse); i { case 0: return &v.state @@ -8431,7 +8431,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[58].Exporter = func(v any, i int) any { switch v := v.(*AddrEvent); i { case 0: return &v.state @@ -8443,7 +8443,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[59].Exporter = func(v any, i int) any { switch v := v.(*AddrReceivesRequest); i { case 0: return &v.state @@ -8455,7 +8455,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[60].Exporter = func(v any, i int) any { switch v := v.(*AddrReceivesResponse); i { case 0: return &v.state @@ -8467,7 +8467,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[61].Exporter = func(v any, i int) any { switch v := v.(*SendAssetRequest); i { case 0: return &v.state @@ -8479,7 +8479,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[62].Exporter = func(v any, i int) any { switch v := v.(*PrevInputAsset); i { case 0: return &v.state @@ -8491,7 +8491,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[63].Exporter = func(v any, i int) any { switch v := v.(*SendAssetResponse); i { case 0: return &v.state @@ -8503,7 +8503,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[64].Exporter = func(v any, i int) any { switch v := v.(*GetInfoRequest); i { case 0: return &v.state @@ -8515,7 +8515,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[65].Exporter = func(v any, i int) any { switch v := v.(*GetInfoResponse); i { case 0: return &v.state @@ -8527,7 +8527,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[66].Exporter = func(v any, i int) any { switch v := v.(*FetchAssetMetaRequest); i { case 0: return &v.state @@ -8539,7 +8539,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[67].Exporter = func(v any, i int) any { switch v := v.(*BurnAssetRequest); i { case 0: return &v.state @@ -8551,7 +8551,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[68].Exporter = func(v any, i int) any { switch v := v.(*BurnAssetResponse); i { case 0: return &v.state @@ -8563,7 +8563,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[69].Exporter = func(v any, i int) any { switch v := v.(*ListBurnsRequest); i { case 0: return &v.state @@ -8575,7 +8575,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[70].Exporter = func(v any, i int) any { switch v := v.(*AssetBurn); i { case 0: return &v.state @@ -8587,7 +8587,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[71].Exporter = func(v any, i int) any { switch v := v.(*ListBurnsResponse); i { case 0: return &v.state @@ -8599,7 +8599,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[72].Exporter = func(v any, i int) any { switch v := v.(*OutPoint); i { case 0: return &v.state @@ -8611,7 +8611,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[73].Exporter = func(v any, i int) any { switch v := v.(*SubscribeReceiveEventsRequest); i { case 0: return &v.state @@ -8623,7 +8623,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[74].Exporter = func(v any, i int) any { switch v := v.(*ReceiveEvent); i { case 0: return &v.state @@ -8635,7 +8635,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[75].Exporter = func(v any, i int) any { switch v := v.(*SubscribeSendEventsRequest); i { case 0: return &v.state @@ -8647,7 +8647,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[76].Exporter = func(v any, i int) any { switch v := v.(*SendEvent); i { case 0: return &v.state @@ -8659,7 +8659,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[77].Exporter = func(v any, i int) any { switch v := v.(*AnchorTransaction); i { case 0: return &v.state @@ -8671,7 +8671,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[78].Exporter = func(v any, i int) any { switch v := v.(*RegisterTransferRequest); i { case 0: return &v.state @@ -8683,7 +8683,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[79].Exporter = func(v any, i int) any { switch v := v.(*RegisterTransferResponse); i { case 0: return &v.state @@ -8696,17 +8696,17 @@ func file_taprootassets_proto_init() { } } } - file_taprootassets_proto_msgTypes[24].OneofWrappers = []interface{}{ + file_taprootassets_proto_msgTypes[24].OneofWrappers = []any{ (*ListBalancesRequest_AssetId)(nil), (*ListBalancesRequest_GroupKey)(nil), } - file_taprootassets_proto_msgTypes[66].OneofWrappers = []interface{}{ + file_taprootassets_proto_msgTypes[66].OneofWrappers = []any{ (*FetchAssetMetaRequest_AssetId)(nil), (*FetchAssetMetaRequest_MetaHash)(nil), (*FetchAssetMetaRequest_AssetIdStr)(nil), (*FetchAssetMetaRequest_MetaHashStr)(nil), } - file_taprootassets_proto_msgTypes[67].OneofWrappers = []interface{}{ + file_taprootassets_proto_msgTypes[67].OneofWrappers = []any{ (*BurnAssetRequest_AssetId)(nil), (*BurnAssetRequest_AssetIdStr)(nil), } diff --git a/taprpc/taprootassets.pb.gw.go b/taprpc/taprootassets.pb.gw.go index f6bfbad30..206f7c8a1 100644 --- a/taprpc/taprootassets.pb.gw.go +++ b/taprpc/taprootassets.pb.gw.go @@ -249,11 +249,7 @@ func request_TaprootAssets_StopDaemon_0(ctx context.Context, marshaler runtime.M var protoReq StopRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -266,11 +262,7 @@ func local_request_TaprootAssets_StopDaemon_0(ctx context.Context, marshaler run var protoReq StopRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -283,11 +275,7 @@ func request_TaprootAssets_DebugLevel_0(ctx context.Context, marshaler runtime.M var protoReq DebugLevelRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -300,11 +288,7 @@ func local_request_TaprootAssets_DebugLevel_0(ctx context.Context, marshaler run var protoReq DebugLevelRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -353,11 +337,7 @@ func request_TaprootAssets_NewAddr_0(ctx context.Context, marshaler runtime.Mars var protoReq NewAddrRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -370,11 +350,7 @@ func local_request_TaprootAssets_NewAddr_0(ctx context.Context, marshaler runtim var protoReq NewAddrRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -387,11 +363,7 @@ func request_TaprootAssets_DecodeAddr_0(ctx context.Context, marshaler runtime.M var protoReq DecodeAddrRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -404,11 +376,7 @@ func local_request_TaprootAssets_DecodeAddr_0(ctx context.Context, marshaler run var protoReq DecodeAddrRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -421,11 +389,7 @@ func request_TaprootAssets_AddrReceives_0(ctx context.Context, marshaler runtime var protoReq AddrReceivesRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -438,11 +402,7 @@ func local_request_TaprootAssets_AddrReceives_0(ctx context.Context, marshaler r var protoReq AddrReceivesRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -455,11 +415,7 @@ func request_TaprootAssets_VerifyProof_0(ctx context.Context, marshaler runtime. var protoReq ProofFile var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -472,11 +428,7 @@ func local_request_TaprootAssets_VerifyProof_0(ctx context.Context, marshaler ru var protoReq ProofFile var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -489,11 +441,7 @@ func request_TaprootAssets_DecodeProof_0(ctx context.Context, marshaler runtime. var protoReq DecodeProofRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -506,11 +454,7 @@ func local_request_TaprootAssets_DecodeProof_0(ctx context.Context, marshaler ru var protoReq DecodeProofRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -523,11 +467,7 @@ func request_TaprootAssets_ExportProof_0(ctx context.Context, marshaler runtime. var protoReq ExportProofRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -540,11 +480,7 @@ func local_request_TaprootAssets_ExportProof_0(ctx context.Context, marshaler ru var protoReq ExportProofRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -557,11 +493,7 @@ func request_TaprootAssets_UnpackProofFile_0(ctx context.Context, marshaler runt var protoReq UnpackProofFileRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -574,11 +506,7 @@ func local_request_TaprootAssets_UnpackProofFile_0(ctx context.Context, marshale var protoReq UnpackProofFileRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -591,11 +519,7 @@ func request_TaprootAssets_SendAsset_0(ctx context.Context, marshaler runtime.Ma var protoReq SendAssetRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -608,11 +532,7 @@ func local_request_TaprootAssets_SendAsset_0(ctx context.Context, marshaler runt var protoReq SendAssetRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -625,11 +545,7 @@ func request_TaprootAssets_BurnAsset_0(ctx context.Context, marshaler runtime.Ma var protoReq BurnAssetRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -642,11 +558,7 @@ func local_request_TaprootAssets_BurnAsset_0(ctx context.Context, marshaler runt var protoReq BurnAssetRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -710,7 +622,7 @@ func local_request_TaprootAssets_GetInfo_0(ctx context.Context, marshaler runtim } var ( - filter_TaprootAssets_FetchAssetMeta_0 = &utilities.DoubleArray{Encoding: map[string]int{"asset_id_str": 0, "assetIdStr": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + filter_TaprootAssets_FetchAssetMeta_0 = &utilities.DoubleArray{Encoding: map[string]int{"asset_id_str": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) func request_TaprootAssets_FetchAssetMeta_0(ctx context.Context, marshaler runtime.Marshaler, client TaprootAssetsClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -790,7 +702,7 @@ func local_request_TaprootAssets_FetchAssetMeta_0(ctx context.Context, marshaler } var ( - filter_TaprootAssets_FetchAssetMeta_1 = &utilities.DoubleArray{Encoding: map[string]int{"meta_hash_str": 0, "metaHashStr": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + filter_TaprootAssets_FetchAssetMeta_1 = &utilities.DoubleArray{Encoding: map[string]int{"meta_hash_str": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) func request_TaprootAssets_FetchAssetMeta_1(ctx context.Context, marshaler runtime.Marshaler, client TaprootAssetsClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -873,11 +785,7 @@ func request_TaprootAssets_SubscribeReceiveEvents_0(ctx context.Context, marshal var protoReq SubscribeReceiveEventsRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -898,11 +806,7 @@ func request_TaprootAssets_SubscribeSendEvents_0(ctx context.Context, marshaler var protoReq SubscribeSendEventsRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -923,11 +827,7 @@ func request_TaprootAssets_RegisterTransfer_0(ctx context.Context, marshaler run var protoReq RegisterTransferRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -940,11 +840,7 @@ func local_request_TaprootAssets_RegisterTransfer_0(ctx context.Context, marshal var protoReq RegisterTransferRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1554,21 +1450,21 @@ func RegisterTaprootAssetsHandlerServer(ctx context.Context, mux *runtime.ServeM // RegisterTaprootAssetsHandlerFromEndpoint is same as RegisterTaprootAssetsHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterTaprootAssetsHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.DialContext(ctx, endpoint, opts...) + conn, err := grpc.NewClient(endpoint, opts...) if err != nil { return err } defer func() { if err != nil { if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } return } go func() { <-ctx.Done() if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } }() }() diff --git a/taprpc/universerpc/universe.pb.go b/taprpc/universerpc/universe.pb.go index 27ce78663..333da8a85 100644 --- a/taprpc/universerpc/universe.pb.go +++ b/taprpc/universerpc/universe.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 +// protoc-gen-go v1.34.2 // protoc v3.21.12 // source: universerpc/universe.proto @@ -3837,7 +3837,7 @@ func file_universerpc_universe_proto_rawDescGZIP() []byte { var file_universerpc_universe_proto_enumTypes = make([]protoimpl.EnumInfo, 5) var file_universerpc_universe_proto_msgTypes = make([]protoimpl.MessageInfo, 52) -var file_universerpc_universe_proto_goTypes = []interface{}{ +var file_universerpc_universe_proto_goTypes = []any{ (ProofType)(0), // 0: universerpc.ProofType (UniverseSyncMode)(0), // 1: universerpc.UniverseSyncMode (AssetQuerySort)(0), // 2: universerpc.AssetQuerySort @@ -4006,7 +4006,7 @@ func file_universerpc_universe_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_universerpc_universe_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*MultiverseRootRequest); i { case 0: return &v.state @@ -4018,7 +4018,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*MultiverseRootResponse); i { case 0: return &v.state @@ -4030,7 +4030,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*AssetRootRequest); i { case 0: return &v.state @@ -4042,7 +4042,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*MerkleSumNode); i { case 0: return &v.state @@ -4054,7 +4054,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*ID); i { case 0: return &v.state @@ -4066,7 +4066,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*UniverseRoot); i { case 0: return &v.state @@ -4078,7 +4078,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*AssetRootResponse); i { case 0: return &v.state @@ -4090,7 +4090,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*AssetRootQuery); i { case 0: return &v.state @@ -4102,7 +4102,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[8].Exporter = func(v any, i int) any { switch v := v.(*QueryRootResponse); i { case 0: return &v.state @@ -4114,7 +4114,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[9].Exporter = func(v any, i int) any { switch v := v.(*DeleteRootQuery); i { case 0: return &v.state @@ -4126,7 +4126,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*DeleteRootResponse); i { case 0: return &v.state @@ -4138,7 +4138,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[11].Exporter = func(v any, i int) any { switch v := v.(*Outpoint); i { case 0: return &v.state @@ -4150,7 +4150,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[12].Exporter = func(v any, i int) any { switch v := v.(*AssetKey); i { case 0: return &v.state @@ -4162,7 +4162,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[13].Exporter = func(v any, i int) any { switch v := v.(*AssetLeafKeysRequest); i { case 0: return &v.state @@ -4174,7 +4174,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[14].Exporter = func(v any, i int) any { switch v := v.(*AssetLeafKeyResponse); i { case 0: return &v.state @@ -4186,7 +4186,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[15].Exporter = func(v any, i int) any { switch v := v.(*AssetLeaf); i { case 0: return &v.state @@ -4198,7 +4198,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[16].Exporter = func(v any, i int) any { switch v := v.(*AssetLeafResponse); i { case 0: return &v.state @@ -4210,7 +4210,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[17].Exporter = func(v any, i int) any { switch v := v.(*UniverseKey); i { case 0: return &v.state @@ -4222,7 +4222,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[18].Exporter = func(v any, i int) any { switch v := v.(*AssetProofResponse); i { case 0: return &v.state @@ -4234,7 +4234,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[19].Exporter = func(v any, i int) any { switch v := v.(*AssetProof); i { case 0: return &v.state @@ -4246,7 +4246,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[20].Exporter = func(v any, i int) any { switch v := v.(*PushProofRequest); i { case 0: return &v.state @@ -4258,7 +4258,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[21].Exporter = func(v any, i int) any { switch v := v.(*PushProofResponse); i { case 0: return &v.state @@ -4270,7 +4270,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[22].Exporter = func(v any, i int) any { switch v := v.(*InfoRequest); i { case 0: return &v.state @@ -4282,7 +4282,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[23].Exporter = func(v any, i int) any { switch v := v.(*InfoResponse); i { case 0: return &v.state @@ -4294,7 +4294,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[24].Exporter = func(v any, i int) any { switch v := v.(*SyncTarget); i { case 0: return &v.state @@ -4306,7 +4306,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[25].Exporter = func(v any, i int) any { switch v := v.(*SyncRequest); i { case 0: return &v.state @@ -4318,7 +4318,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[26].Exporter = func(v any, i int) any { switch v := v.(*SyncedUniverse); i { case 0: return &v.state @@ -4330,7 +4330,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[27].Exporter = func(v any, i int) any { switch v := v.(*StatsRequest); i { case 0: return &v.state @@ -4342,7 +4342,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[28].Exporter = func(v any, i int) any { switch v := v.(*SyncResponse); i { case 0: return &v.state @@ -4354,7 +4354,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[29].Exporter = func(v any, i int) any { switch v := v.(*UniverseFederationServer); i { case 0: return &v.state @@ -4366,7 +4366,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[30].Exporter = func(v any, i int) any { switch v := v.(*ListFederationServersRequest); i { case 0: return &v.state @@ -4378,7 +4378,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[31].Exporter = func(v any, i int) any { switch v := v.(*ListFederationServersResponse); i { case 0: return &v.state @@ -4390,7 +4390,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[32].Exporter = func(v any, i int) any { switch v := v.(*AddFederationServerRequest); i { case 0: return &v.state @@ -4402,7 +4402,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[33].Exporter = func(v any, i int) any { switch v := v.(*AddFederationServerResponse); i { case 0: return &v.state @@ -4414,7 +4414,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[34].Exporter = func(v any, i int) any { switch v := v.(*DeleteFederationServerRequest); i { case 0: return &v.state @@ -4426,7 +4426,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[35].Exporter = func(v any, i int) any { switch v := v.(*DeleteFederationServerResponse); i { case 0: return &v.state @@ -4438,7 +4438,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[36].Exporter = func(v any, i int) any { switch v := v.(*StatsResponse); i { case 0: return &v.state @@ -4450,7 +4450,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[37].Exporter = func(v any, i int) any { switch v := v.(*AssetStatsQuery); i { case 0: return &v.state @@ -4462,7 +4462,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[38].Exporter = func(v any, i int) any { switch v := v.(*AssetStatsSnapshot); i { case 0: return &v.state @@ -4474,7 +4474,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[39].Exporter = func(v any, i int) any { switch v := v.(*AssetStatsAsset); i { case 0: return &v.state @@ -4486,7 +4486,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[40].Exporter = func(v any, i int) any { switch v := v.(*UniverseAssetStats); i { case 0: return &v.state @@ -4498,7 +4498,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[41].Exporter = func(v any, i int) any { switch v := v.(*QueryEventsRequest); i { case 0: return &v.state @@ -4510,7 +4510,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[42].Exporter = func(v any, i int) any { switch v := v.(*QueryEventsResponse); i { case 0: return &v.state @@ -4522,7 +4522,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[43].Exporter = func(v any, i int) any { switch v := v.(*GroupedUniverseEvents); i { case 0: return &v.state @@ -4534,7 +4534,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[44].Exporter = func(v any, i int) any { switch v := v.(*SetFederationSyncConfigRequest); i { case 0: return &v.state @@ -4546,7 +4546,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[45].Exporter = func(v any, i int) any { switch v := v.(*SetFederationSyncConfigResponse); i { case 0: return &v.state @@ -4558,7 +4558,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[46].Exporter = func(v any, i int) any { switch v := v.(*GlobalFederationSyncConfig); i { case 0: return &v.state @@ -4570,7 +4570,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[47].Exporter = func(v any, i int) any { switch v := v.(*AssetFederationSyncConfig); i { case 0: return &v.state @@ -4582,7 +4582,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[48].Exporter = func(v any, i int) any { switch v := v.(*QueryFederationSyncConfigRequest); i { case 0: return &v.state @@ -4594,7 +4594,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[49].Exporter = func(v any, i int) any { switch v := v.(*QueryFederationSyncConfigResponse); i { case 0: return &v.state @@ -4607,13 +4607,13 @@ func file_universerpc_universe_proto_init() { } } } - file_universerpc_universe_proto_msgTypes[4].OneofWrappers = []interface{}{ + file_universerpc_universe_proto_msgTypes[4].OneofWrappers = []any{ (*ID_AssetId)(nil), (*ID_AssetIdStr)(nil), (*ID_GroupKey)(nil), (*ID_GroupKeyStr)(nil), } - file_universerpc_universe_proto_msgTypes[12].OneofWrappers = []interface{}{ + file_universerpc_universe_proto_msgTypes[12].OneofWrappers = []any{ (*AssetKey_OpStr)(nil), (*AssetKey_Op)(nil), (*AssetKey_ScriptKeyBytes)(nil), diff --git a/taprpc/universerpc/universe.pb.gw.go b/taprpc/universerpc/universe.pb.gw.go index 91fe7c2aa..cd8d37213 100644 --- a/taprpc/universerpc/universe.pb.gw.go +++ b/taprpc/universerpc/universe.pb.gw.go @@ -35,11 +35,7 @@ func request_Universe_MultiverseRoot_0(ctx context.Context, marshaler runtime.Ma var protoReq MultiverseRootRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -52,11 +48,7 @@ func local_request_Universe_MultiverseRoot_0(ctx context.Context, marshaler runt var protoReq MultiverseRootRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -102,7 +94,7 @@ func local_request_Universe_AssetRoots_0(ctx context.Context, marshaler runtime. } var ( - filter_Universe_QueryAssetRoots_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "asset_id_str": 1, "assetIdStr": 2}, Base: []int{1, 1, 1, 2, 0, 0}, Check: []int{0, 1, 2, 1, 3, 4}} + filter_Universe_QueryAssetRoots_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "asset_id_str": 1}, Base: []int{1, 1, 1, 0}, Check: []int{0, 1, 2, 3}} ) func request_Universe_QueryAssetRoots_0(ctx context.Context, marshaler runtime.Marshaler, client UniverseClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -172,7 +164,7 @@ func local_request_Universe_QueryAssetRoots_0(ctx context.Context, marshaler run } var ( - filter_Universe_QueryAssetRoots_1 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "group_key_str": 1, "groupKeyStr": 2}, Base: []int{1, 1, 1, 2, 0, 0}, Check: []int{0, 1, 2, 1, 3, 4}} + filter_Universe_QueryAssetRoots_1 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "group_key_str": 1}, Base: []int{1, 1, 1, 0}, Check: []int{0, 1, 2, 3}} ) func request_Universe_QueryAssetRoots_1(ctx context.Context, marshaler runtime.Marshaler, client UniverseClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -278,7 +270,7 @@ func local_request_Universe_DeleteAssetRoot_0(ctx context.Context, marshaler run } var ( - filter_Universe_AssetLeafKeys_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "asset_id_str": 1, "assetIdStr": 2}, Base: []int{1, 1, 1, 2, 0, 0}, Check: []int{0, 1, 2, 1, 3, 4}} + filter_Universe_AssetLeafKeys_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "asset_id_str": 1}, Base: []int{1, 1, 1, 0}, Check: []int{0, 1, 2, 3}} ) func request_Universe_AssetLeafKeys_0(ctx context.Context, marshaler runtime.Marshaler, client UniverseClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -348,7 +340,7 @@ func local_request_Universe_AssetLeafKeys_0(ctx context.Context, marshaler runti } var ( - filter_Universe_AssetLeafKeys_1 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "group_key_str": 1, "groupKeyStr": 2}, Base: []int{1, 1, 1, 2, 0, 0}, Check: []int{0, 1, 2, 1, 3, 4}} + filter_Universe_AssetLeafKeys_1 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "group_key_str": 1}, Base: []int{1, 1, 1, 0}, Check: []int{0, 1, 2, 3}} ) func request_Universe_AssetLeafKeys_1(ctx context.Context, marshaler runtime.Marshaler, client UniverseClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -418,7 +410,7 @@ func local_request_Universe_AssetLeafKeys_1(ctx context.Context, marshaler runti } var ( - filter_Universe_AssetLeaves_0 = &utilities.DoubleArray{Encoding: map[string]int{"asset_id_str": 0, "assetIdStr": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + filter_Universe_AssetLeaves_0 = &utilities.DoubleArray{Encoding: map[string]int{"asset_id_str": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) func request_Universe_AssetLeaves_0(ctx context.Context, marshaler runtime.Marshaler, client UniverseClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -498,7 +490,7 @@ func local_request_Universe_AssetLeaves_0(ctx context.Context, marshaler runtime } var ( - filter_Universe_AssetLeaves_1 = &utilities.DoubleArray{Encoding: map[string]int{"group_key_str": 0, "groupKeyStr": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + filter_Universe_AssetLeaves_1 = &utilities.DoubleArray{Encoding: map[string]int{"group_key_str": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) func request_Universe_AssetLeaves_1(ctx context.Context, marshaler runtime.Marshaler, client UniverseClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -578,7 +570,7 @@ func local_request_Universe_AssetLeaves_1(ctx context.Context, marshaler runtime } var ( - filter_Universe_QueryProof_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "asset_id_str": 1, "assetIdStr": 2, "leaf_key": 3, "op": 4, "hash_str": 5, "hashStr": 6, "index": 7, "script_key_str": 8, "scriptKeyStr": 9}, Base: []int{1, 1, 1, 2, 8, 1, 3, 8, 9, 7, 10, 0, 0, 0, 5, 0, 7, 0, 0, 0, 0}, Check: []int{0, 1, 2, 1, 1, 5, 6, 1, 1, 5, 1, 3, 4, 7, 10, 15, 5, 17, 8, 9, 11}} + filter_Universe_QueryProof_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "asset_id_str": 1, "leaf_key": 2, "op": 3, "hash_str": 4, "index": 5, "script_key_str": 6}, Base: []int{1, 1, 1, 5, 1, 2, 2, 3, 0, 0, 0, 5, 0}, Check: []int{0, 1, 2, 1, 4, 5, 4, 7, 3, 6, 8, 4, 12}} ) func request_Universe_QueryProof_0(ctx context.Context, marshaler runtime.Marshaler, client UniverseClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -708,7 +700,7 @@ func local_request_Universe_QueryProof_0(ctx context.Context, marshaler runtime. } var ( - filter_Universe_QueryProof_1 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "group_key_str": 1, "groupKeyStr": 2, "leaf_key": 3, "op": 4, "hash_str": 5, "hashStr": 6, "index": 7, "script_key_str": 8, "scriptKeyStr": 9}, Base: []int{1, 1, 1, 2, 8, 1, 3, 8, 9, 7, 10, 0, 0, 0, 5, 0, 7, 0, 0, 0, 0}, Check: []int{0, 1, 2, 1, 1, 5, 6, 1, 1, 5, 1, 3, 4, 7, 10, 15, 5, 17, 8, 9, 11}} + filter_Universe_QueryProof_1 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "group_key_str": 1, "leaf_key": 2, "op": 3, "hash_str": 4, "index": 5, "script_key_str": 6}, Base: []int{1, 1, 1, 5, 1, 2, 2, 3, 0, 0, 0, 5, 0}, Check: []int{0, 1, 2, 1, 4, 5, 4, 7, 3, 6, 8, 4, 12}} ) func request_Universe_QueryProof_1(ctx context.Context, marshaler runtime.Marshaler, client UniverseClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -841,11 +833,7 @@ func request_Universe_InsertProof_0(ctx context.Context, marshaler runtime.Marsh var protoReq AssetProof var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -905,11 +893,7 @@ func local_request_Universe_InsertProof_0(ctx context.Context, marshaler runtime var protoReq AssetProof var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -969,11 +953,7 @@ func request_Universe_InsertProof_1(ctx context.Context, marshaler runtime.Marsh var protoReq AssetProof var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1033,11 +1013,7 @@ func local_request_Universe_InsertProof_1(ctx context.Context, marshaler runtime var protoReq AssetProof var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1097,11 +1073,7 @@ func request_Universe_PushProof_0(ctx context.Context, marshaler runtime.Marshal var protoReq PushProofRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1161,11 +1133,7 @@ func local_request_Universe_PushProof_0(ctx context.Context, marshaler runtime.M var protoReq PushProofRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1225,11 +1193,7 @@ func request_Universe_PushProof_1(ctx context.Context, marshaler runtime.Marshal var protoReq PushProofRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1289,11 +1253,7 @@ func local_request_Universe_PushProof_1(ctx context.Context, marshaler runtime.M var protoReq PushProofRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1371,11 +1331,7 @@ func request_Universe_SyncUniverse_0(ctx context.Context, marshaler runtime.Mars var protoReq SyncRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1388,11 +1344,7 @@ func local_request_Universe_SyncUniverse_0(ctx context.Context, marshaler runtim var protoReq SyncRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1423,11 +1375,7 @@ func request_Universe_AddFederationServer_0(ctx context.Context, marshaler runti var protoReq AddFederationServerRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1440,11 +1388,7 @@ func local_request_Universe_AddFederationServer_0(ctx context.Context, marshaler var protoReq AddFederationServerRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1583,11 +1527,7 @@ func request_Universe_SetFederationSyncConfig_0(ctx context.Context, marshaler r var protoReq SetFederationSyncConfigRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1600,11 +1540,7 @@ func local_request_Universe_SetFederationSyncConfig_0(ctx context.Context, marsh var protoReq SetFederationSyncConfigRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -2286,21 +2222,21 @@ func RegisterUniverseHandlerServer(ctx context.Context, mux *runtime.ServeMux, s // RegisterUniverseHandlerFromEndpoint is same as RegisterUniverseHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterUniverseHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.DialContext(ctx, endpoint, opts...) + conn, err := grpc.NewClient(endpoint, opts...) if err != nil { return err } defer func() { if err != nil { if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } return } go func() { <-ctx.Done() if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } }() }() diff --git a/taprpc/universerpc/universe.swagger.json b/taprpc/universerpc/universe.swagger.json index f8242fad5..65bac0103 100644 --- a/taprpc/universerpc/universe.swagger.json +++ b/taprpc/universerpc/universe.swagger.json @@ -691,61 +691,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "key": { - "type": "object", - "properties": { - "id": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - }, - "group_key_str": { - "type": "string", - "description": "The 32-byte asset group key encoded as hex string (use this for\nREST)." - }, - "proof_type": { - "$ref": "#/definitions/universerpcProofType" - } - }, - "description": "The ID of the asset to query for.", - "title": "The ID of the asset to query for." - }, - "leaf_key": { - "type": "object", - "properties": { - "op_str": { - "type": "string" - }, - "op": { - "type": "object" - }, - "script_key_bytes": { - "type": "string", - "format": "byte" - } - }, - "description": "The asset key to query for.", - "title": "The asset key to query for." - } - }, - "description": "The ID of the asset to insert the proof for.", - "title": "The ID of the asset to insert the proof for." - }, - "asset_leaf": { - "$ref": "#/definitions/universerpcAssetLeaf", - "description": "The asset leaf to insert into the Universe tree." - } - } + "$ref": "#/definitions/UniverseInsertProofBody" } } ], @@ -907,61 +853,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "key": { - "type": "object", - "properties": { - "id": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "asset_id_str": { - "type": "string", - "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - }, - "proof_type": { - "$ref": "#/definitions/universerpcProofType" - } - }, - "description": "The ID of the asset to query for.", - "title": "The ID of the asset to query for." - }, - "leaf_key": { - "type": "object", - "properties": { - "op_str": { - "type": "string" - }, - "op": { - "type": "object" - }, - "script_key_bytes": { - "type": "string", - "format": "byte" - } - }, - "description": "The asset key to query for.", - "title": "The asset key to query for." - } - }, - "description": "The ID of the asset to insert the proof for.", - "title": "The ID of the asset to insert the proof for." - }, - "asset_leaf": { - "$ref": "#/definitions/universerpcAssetLeaf", - "description": "The asset leaf to insert into the Universe tree." - } - } + "$ref": "#/definitions/UniverseInsertProofBody" } } ], @@ -1022,61 +914,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "key": { - "type": "object", - "properties": { - "id": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - }, - "group_key_str": { - "type": "string", - "description": "The 32-byte asset group key encoded as hex string (use this for\nREST)." - }, - "proof_type": { - "$ref": "#/definitions/universerpcProofType" - } - }, - "description": "The ID of the asset to query for.", - "title": "The ID of the asset to query for." - }, - "leaf_key": { - "type": "object", - "properties": { - "op_str": { - "type": "string" - }, - "op": { - "type": "object" - }, - "script_key_bytes": { - "type": "string", - "format": "byte" - } - }, - "description": "The asset key to query for.", - "title": "The asset key to query for." - } - }, - "description": "The ID of the asset to push the proof for.", - "title": "The ID of the asset to push the proof for." - }, - "server": { - "$ref": "#/definitions/universerpcUniverseFederationServer", - "description": "The universe server to push the proof to." - } - } + "$ref": "#/definitions/UniversePushProofBody" } } ], @@ -1137,61 +975,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "key": { - "type": "object", - "properties": { - "id": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "asset_id_str": { - "type": "string", - "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - }, - "proof_type": { - "$ref": "#/definitions/universerpcProofType" - } - }, - "description": "The ID of the asset to query for.", - "title": "The ID of the asset to query for." - }, - "leaf_key": { - "type": "object", - "properties": { - "op_str": { - "type": "string" - }, - "op": { - "type": "object" - }, - "script_key_bytes": { - "type": "string", - "format": "byte" - } - }, - "description": "The asset key to query for.", - "title": "The asset key to query for." - } - }, - "description": "The ID of the asset to push the proof for.", - "title": "The ID of the asset to push the proof for." - }, - "server": { - "$ref": "#/definitions/universerpcUniverseFederationServer", - "description": "The universe server to push the proof to." - } - } + "$ref": "#/definitions/UniversePushProofBody" } } ], @@ -1637,6 +1421,120 @@ } }, "definitions": { + "UniverseInsertProofBody": { + "type": "object", + "properties": { + "key": { + "type": "object", + "properties": { + "id": { + "type": "object", + "properties": { + "asset_id": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." + }, + "asset_id_str": { + "type": "string", + "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." + }, + "group_key": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." + }, + "proof_type": { + "$ref": "#/definitions/universerpcProofType" + } + }, + "description": "The ID of the asset to query for.", + "title": "The ID of the asset to query for." + }, + "leaf_key": { + "type": "object", + "properties": { + "op_str": { + "type": "string" + }, + "op": { + "type": "object" + }, + "script_key_bytes": { + "type": "string", + "format": "byte" + } + }, + "description": "The asset key to query for.", + "title": "The asset key to query for." + } + }, + "description": "The ID of the asset to insert the proof for.", + "title": "The ID of the asset to insert the proof for." + }, + "asset_leaf": { + "$ref": "#/definitions/universerpcAssetLeaf", + "description": "The asset leaf to insert into the Universe tree." + } + } + }, + "UniversePushProofBody": { + "type": "object", + "properties": { + "key": { + "type": "object", + "properties": { + "id": { + "type": "object", + "properties": { + "asset_id": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." + }, + "asset_id_str": { + "type": "string", + "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." + }, + "group_key": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." + }, + "proof_type": { + "$ref": "#/definitions/universerpcProofType" + } + }, + "description": "The ID of the asset to query for.", + "title": "The ID of the asset to query for." + }, + "leaf_key": { + "type": "object", + "properties": { + "op_str": { + "type": "string" + }, + "op": { + "type": "object" + }, + "script_key_bytes": { + "type": "string", + "format": "byte" + } + }, + "description": "The asset key to query for.", + "title": "The asset key to query for." + } + }, + "description": "The ID of the asset to push the proof for.", + "title": "The ID of the asset to push the proof for." + }, + "server": { + "$ref": "#/definitions/universerpcUniverseFederationServer", + "description": "The universe server to push the proof to." + } + } + }, "protobufAny": { "type": "object", "properties": { From bd8bdf853f47729eb3413119de9f2e1b470cbb97 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 3 Apr 2025 14:51:40 +0200 Subject: [PATCH 10/17] taprpc+rpcserver: allow user to set script key type Specifying a script key as known now requires the user to set a specific type. --- rpcserver.go | 18 +- .../assetwalletrpc/assetwallet.swagger.json | 17 + taprpc/marshal.go | 74 +- taprpc/mintrpc/mint.swagger.json | 17 + taprpc/taprootassets.pb.go | 1530 +++++++++-------- taprpc/taprootassets.proto | 52 + taprpc/taprootassets.swagger.json | 33 + 7 files changed, 1015 insertions(+), 726 deletions(-) diff --git a/rpcserver.go b/rpcserver.go index cbe52a41b..4d9c5812e 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -7996,11 +7996,21 @@ func (r *rpcServer) DeclareScriptKey(ctx context.Context, } // Because we've been given the key over the RPC interface, we can't be - // 100% sure of the type. But we can make a best effort guess based on - // the fields the user has set. - keyType := scriptKey.GuessType() + // 100% sure of the type, if it wasn't declared. But we can make a + // best-effort guess based on the fields the user has set. This is a + // no-op if the type is already set. + scriptKey.Type = scriptKey.GuessType() - err = r.cfg.TapAddrBook.InsertScriptKey(ctx, *scriptKey, true, keyType) + // The user is declaring the key, so they should know what type it is. + // So if they didn't set it, and it wasn't an obvious one, we'll require + // them to set it. + if scriptKey.Type == asset.ScriptKeyUnknown { + return nil, fmt.Errorf("script key type must be set") + } + + err = r.cfg.TapAddrBook.InsertScriptKey( + ctx, *scriptKey, true, scriptKey.Type, + ) if err != nil { return nil, fmt.Errorf("error inserting script key: %w", err) } diff --git a/taprpc/assetwalletrpc/assetwallet.swagger.json b/taprpc/assetwalletrpc/assetwallet.swagger.json index 8d995c2be..3508993ae 100644 --- a/taprpc/assetwalletrpc/assetwallet.swagger.json +++ b/taprpc/assetwalletrpc/assetwallet.swagger.json @@ -1036,9 +1036,26 @@ "type": "string", "format": "byte", "description": "The optional Taproot tweak to apply to the above internal key. If this is\nempty then a BIP-86 style tweak is applied to the internal key." + }, + "type": { + "$ref": "#/definitions/taprpcScriptKeyType", + "description": "The type of the script key, as declared by the user." } } }, + "taprpcScriptKeyType": { + "type": "string", + "enum": [ + "SCRIPT_KEY_UNKNOWN", + "SCRIPT_KEY_BIP86", + "SCRIPT_KEY_SCRIPT_PATH_EXTERNAL", + "SCRIPT_KEY_BURN", + "SCRIPT_KEY_TOMBSTONE", + "SCRIPT_KEY_CHANNEL" + ], + "default": "SCRIPT_KEY_UNKNOWN", + "description": " - SCRIPT_KEY_UNKNOWN: The type of script key is not known. This should only be stored for assets\nwhere we don't know the internal key of the script key (e.g. for\nimported proofs).\n - SCRIPT_KEY_BIP86: The script key is a normal BIP-86 key. This means that the internal key is\nturned into a Taproot output key by applying a BIP-86 tweak to it.\n - SCRIPT_KEY_SCRIPT_PATH_EXTERNAL: The script key is a key that contains a script path that is defined by the\nuser and is therefore external to the tapd wallet. Spending this key\nrequires providing a specific witness and must be signed through the vPSBT\nsigning flow.\n - SCRIPT_KEY_BURN: The script key is a specific un-spendable key that indicates a burnt asset.\nAssets with this key type can never be spent again, as a burn key is a\ntweaked NUMS key that nobody knows the private key for.\n - SCRIPT_KEY_TOMBSTONE: The script key is a specific un-spendable key that indicates a tombstone\noutput. This is only the case for zero-value assets that result from a\nnon-interactive (TAP address) send where no change was left over.\n - SCRIPT_KEY_CHANNEL: The script key is used for an asset that resides within a Taproot Asset\nChannel. That means the script key is either a funding key (OP_TRUE), a\ncommitment output key (to_local, to_remote, htlc), or a HTLC second-level\ntransaction output key. Keys related to channels are not shown in asset\nbalances (unless specifically requested) and are never used for coin\nselection." + }, "taprpcSendAssetResponse": { "type": "object", "properties": { diff --git a/taprpc/marshal.go b/taprpc/marshal.go index 0bc546078..6642cd2d6 100644 --- a/taprpc/marshal.go +++ b/taprpc/marshal.go @@ -85,8 +85,14 @@ func UnmarshalKeyDescriptor(rpcDesc *KeyDescriptor) (keychain.KeyDescriptor, // UnmarshalScriptKey parses the RPC script key into the native counterpart. func UnmarshalScriptKey(rpcKey *ScriptKey) (*asset.ScriptKey, error) { var ( - scriptKey asset.ScriptKey - err error + scriptKey = asset.ScriptKey{ + TweakedScriptKey: &asset.TweakedScriptKey{ + // The tweak is optional, if it's empty it means + // the key is derived using BIP-0086. + Tweak: rpcKey.TapTweak, + }, + } + err error ) // The script public key is a Taproot key, so 32-byte x-only. @@ -98,17 +104,15 @@ func UnmarshalScriptKey(rpcKey *ScriptKey) (*asset.ScriptKey, error) { // The key descriptor is optional for script keys that are completely // independent of the backing wallet. if rpcKey.KeyDesc != nil { - keyDesc, err := UnmarshalKeyDescriptor(rpcKey.KeyDesc) + scriptKey.RawKey, err = UnmarshalKeyDescriptor(rpcKey.KeyDesc) if err != nil { return nil, err } - scriptKey.TweakedScriptKey = &asset.TweakedScriptKey{ - RawKey: keyDesc, + } - // The tweak is optional, if it's empty it means the key - // is derived using BIP-0086. - Tweak: rpcKey.TapTweak, - } + scriptKey.Type, err = UnmarshalScriptKeyType(rpcKey.Type) + if err != nil { + return nil, err } return &scriptKey, nil @@ -125,11 +129,63 @@ func MarshalScriptKey(scriptKey asset.ScriptKey) *ScriptKey { scriptKey.TweakedScriptKey.RawKey, ) rpcScriptKey.TapTweak = scriptKey.TweakedScriptKey.Tweak + rpcScriptKey.Type = MarshalScriptKeyType(scriptKey.Type) } return rpcScriptKey } +// UnmarshalScriptKeyType parses the script key type from the RPC variant. +func UnmarshalScriptKeyType(rpcType ScriptKeyType) (asset.ScriptKeyType, + error) { + + switch rpcType { + case ScriptKeyType_SCRIPT_KEY_UNKNOWN: + return asset.ScriptKeyUnknown, nil + + case ScriptKeyType_SCRIPT_KEY_BIP86: + return asset.ScriptKeyBip86, nil + + case ScriptKeyType_SCRIPT_KEY_SCRIPT_PATH_EXTERNAL: + return asset.ScriptKeyScriptPathExternal, nil + + case ScriptKeyType_SCRIPT_KEY_BURN: + return asset.ScriptKeyBurn, nil + + case ScriptKeyType_SCRIPT_KEY_TOMBSTONE: + return asset.ScriptKeyTombstone, nil + + case ScriptKeyType_SCRIPT_KEY_CHANNEL: + return asset.ScriptKeyScriptPathChannel, nil + + default: + return 0, fmt.Errorf("unknown script key type: %v", rpcType) + } +} + +// MarshalScriptKeyType marshals the script key type from the RPC variant. +func MarshalScriptKeyType(typ asset.ScriptKeyType) ScriptKeyType { + switch typ { + case asset.ScriptKeyBip86: + return ScriptKeyType_SCRIPT_KEY_BIP86 + + case asset.ScriptKeyScriptPathExternal: + return ScriptKeyType_SCRIPT_KEY_SCRIPT_PATH_EXTERNAL + + case asset.ScriptKeyBurn: + return ScriptKeyType_SCRIPT_KEY_BURN + + case asset.ScriptKeyTombstone: + return ScriptKeyType_SCRIPT_KEY_TOMBSTONE + + case asset.ScriptKeyScriptPathChannel: + return ScriptKeyType_SCRIPT_KEY_CHANNEL + + default: + return ScriptKeyType_SCRIPT_KEY_UNKNOWN + } +} + // UnmarshalAssetVersion parses an asset version from the RPC variant. func UnmarshalAssetVersion(version AssetVersion) (asset.Version, error) { // For now, we'll only support two asset versions. The ones in the diff --git a/taprpc/mintrpc/mint.swagger.json b/taprpc/mintrpc/mint.swagger.json index dd3f653e5..0c42e8cfa 100644 --- a/taprpc/mintrpc/mint.swagger.json +++ b/taprpc/mintrpc/mint.swagger.json @@ -899,9 +899,26 @@ "type": "string", "format": "byte", "description": "The optional Taproot tweak to apply to the above internal key. If this is\nempty then a BIP-86 style tweak is applied to the internal key." + }, + "type": { + "$ref": "#/definitions/taprpcScriptKeyType", + "description": "The type of the script key, as declared by the user." } } }, + "taprpcScriptKeyType": { + "type": "string", + "enum": [ + "SCRIPT_KEY_UNKNOWN", + "SCRIPT_KEY_BIP86", + "SCRIPT_KEY_SCRIPT_PATH_EXTERNAL", + "SCRIPT_KEY_BURN", + "SCRIPT_KEY_TOMBSTONE", + "SCRIPT_KEY_CHANNEL" + ], + "default": "SCRIPT_KEY_UNKNOWN", + "description": " - SCRIPT_KEY_UNKNOWN: The type of script key is not known. This should only be stored for assets\nwhere we don't know the internal key of the script key (e.g. for\nimported proofs).\n - SCRIPT_KEY_BIP86: The script key is a normal BIP-86 key. This means that the internal key is\nturned into a Taproot output key by applying a BIP-86 tweak to it.\n - SCRIPT_KEY_SCRIPT_PATH_EXTERNAL: The script key is a key that contains a script path that is defined by the\nuser and is therefore external to the tapd wallet. Spending this key\nrequires providing a specific witness and must be signed through the vPSBT\nsigning flow.\n - SCRIPT_KEY_BURN: The script key is a specific un-spendable key that indicates a burnt asset.\nAssets with this key type can never be spent again, as a burn key is a\ntweaked NUMS key that nobody knows the private key for.\n - SCRIPT_KEY_TOMBSTONE: The script key is a specific un-spendable key that indicates a tombstone\noutput. This is only the case for zero-value assets that result from a\nnon-interactive (TAP address) send where no change was left over.\n - SCRIPT_KEY_CHANNEL: The script key is used for an asset that resides within a Taproot Asset\nChannel. That means the script key is either a funding key (OP_TRUE), a\ncommitment output key (to_local, to_remote, htlc), or a HTLC second-level\ntransaction output key. Keys related to channels are not shown in asset\nbalances (unless specifically requested) and are never used for coin\nselection." + }, "taprpcTapBranch": { "type": "object", "properties": { diff --git a/taprpc/taprootassets.pb.go b/taprpc/taprootassets.pb.go index 4b14a6309..8d004af90 100644 --- a/taprpc/taprootassets.pb.go +++ b/taprpc/taprootassets.pb.go @@ -334,6 +334,85 @@ func (AddrVersion) EnumDescriptor() ([]byte, []int) { return file_taprootassets_proto_rawDescGZIP(), []int{5} } +type ScriptKeyType int32 + +const ( + // The type of script key is not known. This should only be stored for assets + // where we don't know the internal key of the script key (e.g. for + // imported proofs). + ScriptKeyType_SCRIPT_KEY_UNKNOWN ScriptKeyType = 0 + // The script key is a normal BIP-86 key. This means that the internal key is + // turned into a Taproot output key by applying a BIP-86 tweak to it. + ScriptKeyType_SCRIPT_KEY_BIP86 ScriptKeyType = 1 + // The script key is a key that contains a script path that is defined by the + // user and is therefore external to the tapd wallet. Spending this key + // requires providing a specific witness and must be signed through the vPSBT + // signing flow. + ScriptKeyType_SCRIPT_KEY_SCRIPT_PATH_EXTERNAL ScriptKeyType = 2 + // The script key is a specific un-spendable key that indicates a burnt asset. + // Assets with this key type can never be spent again, as a burn key is a + // tweaked NUMS key that nobody knows the private key for. + ScriptKeyType_SCRIPT_KEY_BURN ScriptKeyType = 3 + // The script key is a specific un-spendable key that indicates a tombstone + // output. This is only the case for zero-value assets that result from a + // non-interactive (TAP address) send where no change was left over. + ScriptKeyType_SCRIPT_KEY_TOMBSTONE ScriptKeyType = 4 + // The script key is used for an asset that resides within a Taproot Asset + // Channel. That means the script key is either a funding key (OP_TRUE), a + // commitment output key (to_local, to_remote, htlc), or a HTLC second-level + // transaction output key. Keys related to channels are not shown in asset + // balances (unless specifically requested) and are never used for coin + // selection. + ScriptKeyType_SCRIPT_KEY_CHANNEL ScriptKeyType = 5 +) + +// Enum value maps for ScriptKeyType. +var ( + ScriptKeyType_name = map[int32]string{ + 0: "SCRIPT_KEY_UNKNOWN", + 1: "SCRIPT_KEY_BIP86", + 2: "SCRIPT_KEY_SCRIPT_PATH_EXTERNAL", + 3: "SCRIPT_KEY_BURN", + 4: "SCRIPT_KEY_TOMBSTONE", + 5: "SCRIPT_KEY_CHANNEL", + } + ScriptKeyType_value = map[string]int32{ + "SCRIPT_KEY_UNKNOWN": 0, + "SCRIPT_KEY_BIP86": 1, + "SCRIPT_KEY_SCRIPT_PATH_EXTERNAL": 2, + "SCRIPT_KEY_BURN": 3, + "SCRIPT_KEY_TOMBSTONE": 4, + "SCRIPT_KEY_CHANNEL": 5, + } +) + +func (x ScriptKeyType) Enum() *ScriptKeyType { + p := new(ScriptKeyType) + *p = x + return p +} + +func (x ScriptKeyType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ScriptKeyType) Descriptor() protoreflect.EnumDescriptor { + return file_taprootassets_proto_enumTypes[6].Descriptor() +} + +func (ScriptKeyType) Type() protoreflect.EnumType { + return &file_taprootassets_proto_enumTypes[6] +} + +func (x ScriptKeyType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ScriptKeyType.Descriptor instead. +func (ScriptKeyType) EnumDescriptor() ([]byte, []int) { + return file_taprootassets_proto_rawDescGZIP(), []int{6} +} + type AddrEventStatus int32 const ( @@ -373,11 +452,11 @@ func (x AddrEventStatus) String() string { } func (AddrEventStatus) Descriptor() protoreflect.EnumDescriptor { - return file_taprootassets_proto_enumTypes[6].Descriptor() + return file_taprootassets_proto_enumTypes[7].Descriptor() } func (AddrEventStatus) Type() protoreflect.EnumType { - return &file_taprootassets_proto_enumTypes[6] + return &file_taprootassets_proto_enumTypes[7] } func (x AddrEventStatus) Number() protoreflect.EnumNumber { @@ -386,7 +465,7 @@ func (x AddrEventStatus) Number() protoreflect.EnumNumber { // Deprecated: Use AddrEventStatus.Descriptor instead. func (AddrEventStatus) EnumDescriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{6} + return file_taprootassets_proto_rawDescGZIP(), []int{7} } type SendState int32 @@ -456,11 +535,11 @@ func (x SendState) String() string { } func (SendState) Descriptor() protoreflect.EnumDescriptor { - return file_taprootassets_proto_enumTypes[7].Descriptor() + return file_taprootassets_proto_enumTypes[8].Descriptor() } func (SendState) Type() protoreflect.EnumType { - return &file_taprootassets_proto_enumTypes[7] + return &file_taprootassets_proto_enumTypes[8] } func (x SendState) Number() protoreflect.EnumNumber { @@ -469,7 +548,7 @@ func (x SendState) Number() protoreflect.EnumNumber { // Deprecated: Use SendState.Descriptor instead. func (SendState) EnumDescriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{7} + return file_taprootassets_proto_rawDescGZIP(), []int{8} } type ParcelType int32 @@ -519,11 +598,11 @@ func (x ParcelType) String() string { } func (ParcelType) Descriptor() protoreflect.EnumDescriptor { - return file_taprootassets_proto_enumTypes[8].Descriptor() + return file_taprootassets_proto_enumTypes[9].Descriptor() } func (ParcelType) Type() protoreflect.EnumType { - return &file_taprootassets_proto_enumTypes[8] + return &file_taprootassets_proto_enumTypes[9] } func (x ParcelType) Number() protoreflect.EnumNumber { @@ -532,7 +611,7 @@ func (x ParcelType) Number() protoreflect.EnumNumber { // Deprecated: Use ParcelType.Descriptor instead. func (ParcelType) EnumDescriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{8} + return file_taprootassets_proto_rawDescGZIP(), []int{9} } type AssetMeta struct { @@ -3873,6 +3952,8 @@ type ScriptKey struct { // The optional Taproot tweak to apply to the above internal key. If this is // empty then a BIP-86 style tweak is applied to the internal key. TapTweak []byte `protobuf:"bytes,3,opt,name=tap_tweak,json=tapTweak,proto3" json:"tap_tweak,omitempty"` + // The type of the script key, as declared by the user. + Type ScriptKeyType `protobuf:"varint,4,opt,name=type,proto3,enum=taprpc.ScriptKeyType" json:"type,omitempty"` } func (x *ScriptKey) Reset() { @@ -3928,6 +4009,13 @@ func (x *ScriptKey) GetTapTweak() []byte { return nil } +func (x *ScriptKey) GetType() ScriptKeyType { + if x != nil { + return x.Type + } + return ScriptKeyType_SCRIPT_KEY_UNKNOWN +} + type KeyLocator struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6982,513 +7070,527 @@ var file_taprootassets_proto_rawDesc = []byte{ 0x12, 0x3c, 0x0a, 0x0f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x73, - 0x0a, 0x09, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x70, - 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x75, - 0x62, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x64, 0x65, 0x73, 0x63, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x07, 0x6b, - 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x70, 0x5f, 0x74, 0x77, - 0x65, 0x61, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x74, 0x61, 0x70, 0x54, 0x77, - 0x65, 0x61, 0x6b, 0x22, 0x48, 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, - 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, - 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x60, 0x0a, - 0x0d, 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x22, - 0x0a, 0x0d, 0x72, 0x61, 0x77, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x72, 0x61, 0x77, 0x4b, 0x65, 0x79, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4b, 0x65, 0x79, - 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x22, - 0x43, 0x0a, 0x11, 0x54, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x46, 0x75, 0x6c, 0x6c, - 0x54, 0x72, 0x65, 0x65, 0x12, 0x2e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x6c, 0x65, 0x61, 0x76, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x54, 0x61, 0x70, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x4c, 0x65, - 0x61, 0x76, 0x65, 0x73, 0x22, 0x21, 0x0a, 0x07, 0x54, 0x61, 0x70, 0x4c, 0x65, 0x61, 0x66, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x70, 0x42, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x61, 0x70, - 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6c, 0x65, 0x66, 0x74, - 0x54, 0x61, 0x70, 0x68, 0x61, 0x73, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x69, 0x67, 0x68, 0x74, - 0x5f, 0x74, 0x61, 0x70, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, - 0x72, 0x69, 0x67, 0x68, 0x74, 0x54, 0x61, 0x70, 0x68, 0x61, 0x73, 0x68, 0x22, 0x27, 0x0a, 0x11, - 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x61, 0x64, 0x64, 0x72, 0x22, 0x56, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, - 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, - 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x61, 0x77, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, - 0x73, 0x69, 0x73, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0xf6, 0x04, - 0x0a, 0x0c, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x9e, + 0x01, 0x0a, 0x09, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, + 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, + 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x64, 0x65, 0x73, + 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x07, + 0x6b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x70, 0x5f, 0x74, + 0x77, 0x65, 0x61, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x74, 0x61, 0x70, 0x54, + 0x77, 0x65, 0x61, 0x6b, 0x12, 0x29, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x48, 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x1d, 0x0a, + 0x0a, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, + 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x6b, 0x65, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x60, 0x0a, 0x0d, 0x4b, 0x65, 0x79, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x61, + 0x77, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0b, 0x72, 0x61, 0x77, 0x4b, 0x65, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2b, + 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x22, 0x43, 0x0a, 0x11, 0x54, + 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x54, 0x72, 0x65, 0x65, + 0x12, 0x2e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, + 0x70, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, + 0x22, 0x21, 0x0a, 0x07, 0x54, 0x61, 0x70, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x22, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x70, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x61, 0x70, 0x68, 0x61, 0x73, 0x68, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6c, 0x65, 0x66, 0x74, 0x54, 0x61, 0x70, 0x68, + 0x61, 0x73, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x74, 0x61, 0x70, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x54, 0x61, 0x70, 0x68, 0x61, 0x73, 0x68, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x63, 0x6f, + 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, + 0x72, 0x22, 0x56, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, + 0x0a, 0x0e, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x46, 0x69, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x65, 0x6e, + 0x65, 0x73, 0x69, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0xf6, 0x04, 0x0a, 0x0c, 0x44, 0x65, + 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x72, + 0x6f, 0x6f, 0x66, 0x5f, 0x61, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x41, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, + 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, + 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x4f, 0x66, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x23, 0x0a, 0x05, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, + 0x32, 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0a, 0x6d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x76, + 0x65, 0x61, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x78, 0x5f, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, + 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x78, + 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x27, 0x0a, 0x0f, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, + 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0f, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, + 0x28, 0x0a, 0x10, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x70, 0x72, + 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x73, 0x70, 0x6c, 0x69, 0x74, + 0x52, 0x6f, 0x6f, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x32, 0x0a, 0x15, 0x6e, 0x75, 0x6d, + 0x5f, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x41, 0x64, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x2b, 0x0a, + 0x11, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, + 0x73, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, + 0x6e, 0x67, 0x65, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, + 0x5f, 0x62, 0x75, 0x72, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x42, + 0x75, 0x72, 0x6e, 0x12, 0x3c, 0x0a, 0x0e, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x72, + 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x52, 0x65, 0x76, 0x65, + 0x61, 0x6c, 0x52, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x52, 0x65, 0x76, 0x65, 0x61, + 0x6c, 0x12, 0x40, 0x0a, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x72, + 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x76, + 0x65, 0x61, 0x6c, 0x52, 0x0e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x76, + 0x65, 0x61, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x74, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, + 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x61, 0x6c, 0x74, 0x4c, 0x65, 0x61, 0x76, + 0x65, 0x73, 0x22, 0x66, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, + 0x39, 0x0a, 0x0d, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0c, 0x64, 0x65, + 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xb1, 0x01, 0x0a, 0x12, 0x44, + 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x61, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x41, 0x74, 0x44, - 0x65, 0x70, 0x74, 0x68, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, - 0x66, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x23, - 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x12, 0x32, 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x76, 0x65, - 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0a, 0x6d, 0x65, 0x74, - 0x61, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x78, 0x5f, 0x6d, 0x65, - 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0d, 0x74, 0x78, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, - 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x78, 0x63, 0x6c, - 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x72, 0x6f, 0x6f, - 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x73, - 0x70, 0x6c, 0x69, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x32, 0x0a, - 0x15, 0x6e, 0x75, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6e, 0x75, - 0x6d, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x5f, 0x77, - 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x68, - 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x17, - 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x62, 0x75, 0x72, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x69, 0x73, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x3c, 0x0a, 0x0e, 0x67, 0x65, 0x6e, 0x65, 0x73, - 0x69, 0x73, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, - 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x52, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x52, - 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x40, 0x0a, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, - 0x65, 0x79, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, - 0x79, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x52, 0x0e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, - 0x79, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x74, 0x5f, 0x6c, - 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x61, 0x6c, 0x74, - 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x22, 0x66, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x0d, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x5f, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x52, 0x0c, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xb1, - 0x01, 0x0a, 0x12, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x61, 0x74, 0x5f, 0x64, - 0x65, 0x70, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6f, - 0x66, 0x41, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x12, 0x2e, 0x0a, 0x13, 0x77, 0x69, 0x74, 0x68, - 0x5f, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x77, 0x69, 0x74, 0x68, 0x50, 0x72, 0x65, 0x76, 0x57, - 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x77, 0x69, 0x74, 0x68, - 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x77, 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x76, 0x65, - 0x61, 0x6c, 0x22, 0x50, 0x0a, 0x13, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x64, 0x65, 0x63, - 0x6f, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, - 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0c, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x7c, 0x0a, 0x12, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x22, 0x3e, 0x0a, 0x16, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0e, - 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, - 0x6c, 0x65, 0x22, 0x38, 0x0a, 0x17, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0c, 0x52, 0x09, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xd0, 0x02, 0x0a, - 0x09, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x1a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x6e, 0x69, 0x78, - 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x78, - 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, - 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x75, - 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, - 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x75, 0x74, 0x78, 0x6f, 0x5f, 0x61, - 0x6d, 0x74, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x75, 0x74, - 0x78, 0x6f, 0x41, 0x6d, 0x74, 0x53, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x70, 0x72, - 0x6f, 0x6f, 0x74, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0e, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, - 0x67, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x68, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, - 0x74, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x3c, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, - 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x41, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, - 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x60, 0x0a, 0x10, 0x53, 0x65, 0x6e, 0x64, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, - 0x74, 0x61, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x08, 0x74, 0x61, 0x70, 0x41, 0x64, 0x64, 0x72, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x65, 0x65, - 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x66, 0x65, 0x65, - 0x52, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x85, 0x01, 0x0a, 0x0e, 0x50, - 0x72, 0x65, 0x76, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x21, 0x0a, - 0x0c, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x6f, 0x69, 0x6e, 0x74, - 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x22, 0x46, 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x52, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x22, 0x10, 0x0a, 0x0e, 0x47, 0x65, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x9b, 0x02, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x6e, - 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x6c, 0x6e, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x2e, 0x0a, 0x13, 0x6c, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x11, 0x6c, 0x6e, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, - 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x6c, - 0x69, 0x61, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, - 0x6f, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, - 0x79, 0x6e, 0x63, 0x54, 0x6f, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x22, 0xa6, 0x01, 0x0a, 0x15, 0x46, - 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x41, 0x74, 0x44, + 0x65, 0x70, 0x74, 0x68, 0x12, 0x2e, 0x0a, 0x13, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, + 0x76, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x11, 0x77, 0x69, 0x74, 0x68, 0x50, 0x72, 0x65, 0x76, 0x57, 0x69, 0x74, 0x6e, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, + 0x61, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, + 0x77, 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x22, 0x50, + 0x0a, 0x13, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, + 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x52, 0x0c, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x22, 0x7c, 0x0a, 0x12, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, + 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, + 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x3e, + 0x0a, 0x16, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x61, 0x77, 0x5f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0c, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x38, + 0x0a, 0x17, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x61, 0x77, + 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, 0x72, + 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xd0, 0x02, 0x0a, 0x09, 0x41, 0x64, 0x64, + 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x1a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x78, 0x53, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, + 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, + 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x75, 0x74, 0x78, 0x6f, 0x5f, 0x61, 0x6d, 0x74, 0x5f, 0x73, + 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x75, 0x74, 0x78, 0x6f, 0x41, 0x6d, + 0x74, 0x53, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x5f, + 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x74, + 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x0a, + 0x13, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x68, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x08, 0x68, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x74, 0x0a, 0x13, 0x41, + 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, + 0x64, 0x64, 0x72, 0x12, 0x3c, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x22, 0x41, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x22, 0x60, 0x0a, 0x10, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x70, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x70, + 0x41, 0x64, 0x64, 0x72, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x66, 0x65, 0x65, 0x52, 0x61, 0x74, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x85, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x65, 0x76, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x6e, 0x63, + 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x46, + 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x08, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x22, 0x10, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x9b, 0x02, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x6e, 0x64, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6c, 0x6e, 0x64, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x12, 0x2e, 0x0a, 0x13, 0x6c, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, + 0x6c, 0x6e, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x75, 0x62, 0x6b, 0x65, + 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, + 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x54, + 0x6f, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x22, 0xa6, 0x01, 0x0a, 0x15, 0x46, 0x65, 0x74, 0x63, 0x68, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1b, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x48, 0x00, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0c, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x53, 0x74, 0x72, + 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x73, 0x74, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x48, + 0x61, 0x73, 0x68, 0x53, 0x74, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x22, + 0xc3, 0x01, 0x0a, 0x10, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, - 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, - 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x73, 0x74, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, - 0x64, 0x53, 0x74, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x6d, - 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x53, 0x74, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x22, 0xc3, 0x01, 0x0a, 0x10, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, - 0x64, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x53, 0x74, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x62, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0c, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x42, 0x75, 0x72, 0x6e, 0x12, - 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x74, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, - 0x42, 0x07, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x11, 0x42, 0x75, - 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3a, 0x0a, 0x0d, 0x62, 0x75, 0x72, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x0c, 0x62, - 0x75, 0x72, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x33, 0x0a, 0x0a, 0x62, - 0x75, 0x72, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x09, 0x62, 0x75, 0x72, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x22, 0x7a, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, - 0x2a, 0x0a, 0x11, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x74, 0x77, 0x65, 0x61, - 0x6b, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x61, - 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, 0x22, 0x9f, 0x01, 0x0a, - 0x09, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x6f, - 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x12, 0x19, - 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x77, 0x65, - 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x0a, - 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, 0x22, 0x3c, - 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x05, 0x62, 0x75, 0x72, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x42, 0x75, 0x72, 0x6e, 0x52, 0x05, 0x62, 0x75, 0x72, 0x6e, 0x73, 0x22, 0x41, 0x0a, 0x08, - 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x74, 0x78, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, - 0x69, 0x0a, 0x1d, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, 0x65, - 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, - 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xe8, 0x01, 0x0a, 0x0c, 0x52, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 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, 0x26, 0x0a, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2f, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, - 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x6b, 0x0a, 0x1a, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, - 0x21, 0x0a, 0x0c, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x22, 0xc4, 0x03, 0x0a, 0x09, 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, - 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, 0x1d, - 0x0a, 0x0a, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, - 0x0b, 0x70, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x61, 0x72, 0x63, - 0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, - 0x64, 0x64, 0x72, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x27, - 0x0a, 0x0f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0e, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, - 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x61, 0x73, 0x73, 0x69, - 0x76, 0x65, 0x5f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, - 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x15, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, - 0x65, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, - 0x48, 0x0a, 0x12, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x08, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x52, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x97, 0x02, 0x0a, 0x11, 0x41, 0x6e, - 0x63, 0x68, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x73, 0x62, 0x74, - 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x73, - 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x46, 0x65, 0x65, 0x73, 0x53, 0x61, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x16, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x61, 0x74, 0x5f, - 0x6b, 0x77, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x46, 0x65, 0x65, 0x52, 0x61, 0x74, 0x65, 0x53, 0x61, 0x74, 0x4b, 0x77, 0x12, 0x3a, 0x0a, 0x10, - 0x6c, 0x6e, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x75, 0x74, 0x78, 0x6f, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x6c, 0x6e, 0x64, 0x4c, 0x6f, 0x63, - 0x6b, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x61, - 0x6c, 0x5f, 0x74, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x66, 0x69, 0x6e, 0x61, - 0x6c, 0x54, 0x78, 0x22, 0x9e, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x54, 0x0a, 0x18, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x38, 0x0a, 0x10, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x0f, 0x72, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x2a, 0x28, 0x0a, 0x09, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, - 0x4c, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4c, 0x4c, 0x45, 0x43, 0x54, 0x49, 0x42, - 0x4c, 0x45, 0x10, 0x01, 0x2a, 0x39, 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, - 0x61, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x4f, 0x50, 0x41, 0x51, 0x55, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4d, - 0x45, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x01, 0x2a, - 0x3a, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x14, 0x0a, 0x10, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, - 0x5f, 0x56, 0x30, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x56, - 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x31, 0x10, 0x01, 0x2a, 0x52, 0x0a, 0x0a, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x55, 0x54, - 0x50, 0x55, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4d, 0x50, 0x4c, 0x45, 0x10, - 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x53, 0x50, 0x4c, 0x49, 0x54, 0x5f, 0x52, 0x4f, 0x4f, 0x54, 0x10, 0x01, 0x22, 0x04, 0x08, - 0x02, 0x10, 0x02, 0x22, 0x04, 0x08, 0x03, 0x10, 0x03, 0x22, 0x04, 0x08, 0x04, 0x10, 0x04, 0x2a, - 0x86, 0x01, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x28, 0x0a, 0x24, 0x50, 0x52, 0x4f, 0x4f, 0x46, - 0x5f, 0x44, 0x45, 0x4c, 0x49, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x42, 0x4c, 0x45, 0x10, - 0x00, 0x12, 0x22, 0x0a, 0x1e, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x44, 0x45, 0x4c, 0x49, 0x56, - 0x45, 0x52, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, - 0x45, 0x54, 0x45, 0x10, 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x44, - 0x45, 0x4c, 0x49, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, - 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x55, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x72, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x44, 0x44, 0x52, 0x5f, - 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x30, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, - 0x44, 0x52, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x31, 0x10, 0x02, 0x2a, - 0xd0, 0x01, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, - 0x10, 0x00, 0x12, 0x2a, 0x0a, 0x26, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x2b, - 0x0a, 0x27, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x41, + 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x73, 0x74, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x49, 0x64, 0x53, 0x74, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, + 0x74, 0x6f, 0x5f, 0x62, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x61, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x78, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x42, 0x07, 0x0a, 0x05, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x11, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0d, 0x62, + 0x75, 0x72, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x0c, 0x62, 0x75, 0x72, 0x6e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x33, 0x0a, 0x0a, 0x62, 0x75, 0x72, 0x6e, 0x5f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x52, 0x09, 0x62, 0x75, 0x72, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x7a, 0x0a, 0x10, + 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, + 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, + 0x72, 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, 0x22, 0x9f, 0x01, 0x0a, 0x09, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0f, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, + 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, + 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, + 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, 0x22, 0x3c, 0x0a, 0x11, 0x4c, 0x69, + 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x27, 0x0a, 0x05, 0x62, 0x75, 0x72, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x75, 0x72, + 0x6e, 0x52, 0x05, 0x62, 0x75, 0x72, 0x6e, 0x73, 0x22, 0x41, 0x0a, 0x08, 0x4f, 0x75, 0x74, 0x50, + 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x74, 0x78, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x69, 0x0a, 0x1d, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x27, 0x0a, + 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xe8, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 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, 0x26, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x41, 0x64, 0x64, 0x72, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x6b, 0x0a, 0x1a, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, + 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2a, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0xc4, + 0x03, 0x0a, 0x09, 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 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, 0x1d, 0x0a, 0x0a, 0x73, 0x65, + 0x6e, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x73, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x0b, 0x70, 0x61, 0x72, + 0x63, 0x65, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, + 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, + 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x69, + 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0c, 0x52, 0x0e, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x76, + 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0c, 0x52, 0x15, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x56, 0x69, 0x72, + 0x74, 0x75, 0x61, 0x6c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x48, 0x0a, 0x12, 0x61, + 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x08, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x25, + 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x97, 0x02, 0x0a, 0x11, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, + 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x73, 0x62, 0x74, 0x12, 0x2e, 0x0a, 0x13, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x26, 0x0a, 0x0f, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x73, 0x61, 0x74, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x65, 0x65, 0x73, + 0x53, 0x61, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x16, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, + 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x61, 0x74, 0x5f, 0x6b, 0x77, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x65, 0x65, 0x52, + 0x61, 0x74, 0x65, 0x53, 0x61, 0x74, 0x4b, 0x77, 0x12, 0x3a, 0x0a, 0x10, 0x6c, 0x6e, 0x64, 0x5f, + 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x75, 0x74, 0x78, 0x6f, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, + 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x6c, 0x6e, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x55, + 0x74, 0x78, 0x6f, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x78, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x54, 0x78, 0x22, + 0x9e, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, + 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, + 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x22, 0x54, 0x0a, 0x18, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x10, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x0f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, + 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x2a, 0x28, 0x0a, 0x09, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, + 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4c, 0x4c, 0x45, 0x43, 0x54, 0x49, 0x42, 0x4c, 0x45, 0x10, 0x01, + 0x2a, 0x39, 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, + 0x50, 0x41, 0x51, 0x55, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x45, 0x54, 0x41, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x01, 0x2a, 0x3a, 0x0a, 0x0c, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x10, 0x41, + 0x53, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x30, 0x10, + 0x00, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, + 0x4f, 0x4e, 0x5f, 0x56, 0x31, 0x10, 0x01, 0x2a, 0x52, 0x0a, 0x0a, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4d, 0x50, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x1a, 0x0a, + 0x16, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x50, 0x4c, + 0x49, 0x54, 0x5f, 0x52, 0x4f, 0x4f, 0x54, 0x10, 0x01, 0x22, 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, + 0x04, 0x08, 0x03, 0x10, 0x03, 0x22, 0x04, 0x08, 0x04, 0x10, 0x04, 0x2a, 0x86, 0x01, 0x0a, 0x13, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x28, 0x0a, 0x24, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x44, 0x45, 0x4c, + 0x49, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, + 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x22, 0x0a, + 0x1e, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x44, 0x45, 0x4c, 0x49, 0x56, 0x45, 0x52, 0x59, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, + 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x44, 0x45, 0x4c, 0x49, 0x56, + 0x45, 0x52, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, + 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x55, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x72, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x56, 0x45, 0x52, 0x53, + 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, + 0x4e, 0x5f, 0x56, 0x30, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x56, + 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x31, 0x10, 0x02, 0x2a, 0xa9, 0x01, 0x0a, 0x0d, + 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, + 0x12, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, + 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, + 0x4b, 0x45, 0x59, 0x5f, 0x42, 0x49, 0x50, 0x38, 0x36, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x53, + 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, + 0x5f, 0x50, 0x41, 0x54, 0x48, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x02, + 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x42, + 0x55, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, + 0x4b, 0x45, 0x59, 0x5f, 0x54, 0x4f, 0x4d, 0x42, 0x53, 0x54, 0x4f, 0x4e, 0x45, 0x10, 0x04, 0x12, + 0x16, 0x0a, 0x12, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x43, 0x48, + 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x10, 0x05, 0x2a, 0xd0, 0x01, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x72, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x10, - 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, - 0x10, 0x04, 0x2a, 0x9b, 0x02, 0x0a, 0x09, 0x53, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x56, - 0x49, 0x52, 0x54, 0x55, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x5f, 0x53, 0x45, 0x4c, - 0x45, 0x43, 0x54, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x5f, 0x56, 0x49, 0x52, 0x54, 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x49, 0x47, 0x4e, - 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, - 0x5f, 0x41, 0x4e, 0x43, 0x48, 0x4f, 0x52, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x10, 0x02, 0x12, 0x1d, - 0x0a, 0x19, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4c, 0x4f, 0x47, - 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x18, 0x0a, - 0x14, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x42, 0x52, 0x4f, 0x41, - 0x44, 0x43, 0x41, 0x53, 0x54, 0x10, 0x04, 0x12, 0x20, 0x0a, 0x1c, 0x53, 0x45, 0x4e, 0x44, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, - 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x45, 0x4e, - 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x5f, 0x50, 0x52, - 0x4f, 0x4f, 0x46, 0x53, 0x10, 0x06, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x50, 0x52, - 0x4f, 0x4f, 0x46, 0x53, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x08, - 0x2a, 0x78, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, - 0x0a, 0x13, 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x44, - 0x44, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x41, 0x52, 0x43, 0x45, - 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, - 0x44, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, - 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x45, 0x5f, - 0x41, 0x4e, 0x43, 0x48, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x03, 0x32, 0xc5, 0x0c, 0x0a, 0x0d, 0x54, - 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x0a, - 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x40, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x12, 0x18, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, - 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x37, 0x0a, 0x0a, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x12, 0x13, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x44, 0x65, 0x62, 0x75, - 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, - 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2f, 0x0a, 0x07, 0x4e, 0x65, 0x77, 0x41, 0x64, 0x64, 0x72, 0x12, 0x16, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, - 0x72, 0x12, 0x35, 0x0a, 0x0a, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, - 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x41, - 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x49, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x72, - 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, - 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x12, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x12, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, - 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0b, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x52, 0x0a, 0x0f, 0x55, 0x6e, 0x70, 0x61, - 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, - 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, - 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, - 0x0a, 0x09, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x18, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x42, - 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x40, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x12, 0x18, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, + 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x2a, 0x0a, 0x26, 0x41, 0x44, + 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x54, 0x45, + 0x43, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x52, 0x41, 0x4e, + 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, + 0x44, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x52, + 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x44, 0x44, + 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, + 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x04, 0x2a, 0x9b, 0x02, 0x0a, 0x09, 0x53, + 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x45, 0x4e, 0x44, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x56, 0x49, 0x52, 0x54, 0x55, 0x41, 0x4c, 0x5f, 0x49, + 0x4e, 0x50, 0x55, 0x54, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x10, 0x00, 0x12, 0x1b, 0x0a, + 0x17, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x56, 0x49, 0x52, 0x54, + 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x45, + 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x4e, 0x43, 0x48, 0x4f, 0x52, 0x5f, + 0x53, 0x49, 0x47, 0x4e, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x4d, + 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x45, 0x5f, 0x42, 0x52, 0x4f, 0x41, 0x44, 0x43, 0x41, 0x53, 0x54, 0x10, 0x04, 0x12, + 0x20, 0x0a, 0x1c, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x57, 0x41, + 0x49, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, + 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x53, 0x54, 0x4f, 0x52, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x53, 0x10, 0x06, 0x12, 0x1e, + 0x0a, 0x1a, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x52, 0x41, + 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x53, 0x10, 0x07, 0x12, 0x18, + 0x0a, 0x14, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4d, + 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x08, 0x2a, 0x78, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x63, + 0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, + 0x1a, 0x0a, 0x16, 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, + 0x52, 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x50, + 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, + 0x4e, 0x47, 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x45, 0x5f, 0x41, 0x4e, 0x43, 0x48, 0x4f, 0x52, 0x45, 0x44, + 0x10, 0x03, 0x32, 0xc5, 0x0c, 0x0a, 0x0d, 0x54, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, + 0x74, 0x78, 0x6f, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x4c, 0x69, 0x73, + 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, + 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x1b, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0a, 0x53, 0x74, 0x6f, 0x70, 0x44, + 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x12, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, + 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x43, 0x0a, 0x0a, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, + 0x64, 0x72, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x4e, 0x65, 0x77, 0x41, + 0x64, 0x64, 0x72, 0x12, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4e, 0x65, 0x77, + 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x35, 0x0a, 0x0a, 0x44, 0x65, 0x63, + 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, + 0x12, 0x49, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, + 0x12, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x11, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x1b, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x44, 0x65, + 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, + 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0b, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x12, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, + 0x12, 0x52, 0x0a, 0x0f, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, + 0x69, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x75, 0x72, + 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, + 0x42, 0x75, 0x72, 0x6e, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, + 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x47, 0x65, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, - 0x0a, 0x0e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, - 0x12, 0x1d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, - 0x74, 0x61, 0x12, 0x57, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x4e, 0x0a, 0x13, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x22, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x55, 0x0a, 0x10, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, - 0x1f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, - 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x57, 0x0a, 0x16, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x30, 0x01, 0x12, 0x4e, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x6e, + 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x30, 0x01, 0x12, 0x55, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, + 0x6e, 0x67, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -7503,7 +7605,7 @@ func file_taprootassets_proto_rawDescGZIP() []byte { return file_taprootassets_proto_rawDescData } -var file_taprootassets_proto_enumTypes = make([]protoimpl.EnumInfo, 9) +var file_taprootassets_proto_enumTypes = make([]protoimpl.EnumInfo, 10) var file_taprootassets_proto_msgTypes = make([]protoimpl.MessageInfo, 84) var file_taprootassets_proto_goTypes = []any{ (AssetType)(0), // 0: taprpc.AssetType @@ -7512,221 +7614,223 @@ var file_taprootassets_proto_goTypes = []any{ (OutputType)(0), // 3: taprpc.OutputType (ProofDeliveryStatus)(0), // 4: taprpc.ProofDeliveryStatus (AddrVersion)(0), // 5: taprpc.AddrVersion - (AddrEventStatus)(0), // 6: taprpc.AddrEventStatus - (SendState)(0), // 7: taprpc.SendState - (ParcelType)(0), // 8: taprpc.ParcelType - (*AssetMeta)(nil), // 9: taprpc.AssetMeta - (*ListAssetRequest)(nil), // 10: taprpc.ListAssetRequest - (*AnchorInfo)(nil), // 11: taprpc.AnchorInfo - (*GenesisInfo)(nil), // 12: taprpc.GenesisInfo - (*ExternalKey)(nil), // 13: taprpc.ExternalKey - (*GroupKeyRequest)(nil), // 14: taprpc.GroupKeyRequest - (*TxOut)(nil), // 15: taprpc.TxOut - (*GroupVirtualTx)(nil), // 16: taprpc.GroupVirtualTx - (*GroupWitness)(nil), // 17: taprpc.GroupWitness - (*AssetGroup)(nil), // 18: taprpc.AssetGroup - (*GroupKeyReveal)(nil), // 19: taprpc.GroupKeyReveal - (*GenesisReveal)(nil), // 20: taprpc.GenesisReveal - (*DecimalDisplay)(nil), // 21: taprpc.DecimalDisplay - (*Asset)(nil), // 22: taprpc.Asset - (*PrevWitness)(nil), // 23: taprpc.PrevWitness - (*SplitCommitment)(nil), // 24: taprpc.SplitCommitment - (*ListAssetResponse)(nil), // 25: taprpc.ListAssetResponse - (*ListUtxosRequest)(nil), // 26: taprpc.ListUtxosRequest - (*ManagedUtxo)(nil), // 27: taprpc.ManagedUtxo - (*ListUtxosResponse)(nil), // 28: taprpc.ListUtxosResponse - (*ListGroupsRequest)(nil), // 29: taprpc.ListGroupsRequest - (*AssetHumanReadable)(nil), // 30: taprpc.AssetHumanReadable - (*GroupedAssets)(nil), // 31: taprpc.GroupedAssets - (*ListGroupsResponse)(nil), // 32: taprpc.ListGroupsResponse - (*ListBalancesRequest)(nil), // 33: taprpc.ListBalancesRequest - (*AssetBalance)(nil), // 34: taprpc.AssetBalance - (*AssetGroupBalance)(nil), // 35: taprpc.AssetGroupBalance - (*ListBalancesResponse)(nil), // 36: taprpc.ListBalancesResponse - (*ListTransfersRequest)(nil), // 37: taprpc.ListTransfersRequest - (*ListTransfersResponse)(nil), // 38: taprpc.ListTransfersResponse - (*ChainHash)(nil), // 39: taprpc.ChainHash - (*AssetTransfer)(nil), // 40: taprpc.AssetTransfer - (*TransferInput)(nil), // 41: taprpc.TransferInput - (*TransferOutputAnchor)(nil), // 42: taprpc.TransferOutputAnchor - (*TransferOutput)(nil), // 43: taprpc.TransferOutput - (*StopRequest)(nil), // 44: taprpc.StopRequest - (*StopResponse)(nil), // 45: taprpc.StopResponse - (*DebugLevelRequest)(nil), // 46: taprpc.DebugLevelRequest - (*DebugLevelResponse)(nil), // 47: taprpc.DebugLevelResponse - (*Addr)(nil), // 48: taprpc.Addr - (*QueryAddrRequest)(nil), // 49: taprpc.QueryAddrRequest - (*QueryAddrResponse)(nil), // 50: taprpc.QueryAddrResponse - (*NewAddrRequest)(nil), // 51: taprpc.NewAddrRequest - (*ScriptKey)(nil), // 52: taprpc.ScriptKey - (*KeyLocator)(nil), // 53: taprpc.KeyLocator - (*KeyDescriptor)(nil), // 54: taprpc.KeyDescriptor - (*TapscriptFullTree)(nil), // 55: taprpc.TapscriptFullTree - (*TapLeaf)(nil), // 56: taprpc.TapLeaf - (*TapBranch)(nil), // 57: taprpc.TapBranch - (*DecodeAddrRequest)(nil), // 58: taprpc.DecodeAddrRequest - (*ProofFile)(nil), // 59: taprpc.ProofFile - (*DecodedProof)(nil), // 60: taprpc.DecodedProof - (*VerifyProofResponse)(nil), // 61: taprpc.VerifyProofResponse - (*DecodeProofRequest)(nil), // 62: taprpc.DecodeProofRequest - (*DecodeProofResponse)(nil), // 63: taprpc.DecodeProofResponse - (*ExportProofRequest)(nil), // 64: taprpc.ExportProofRequest - (*UnpackProofFileRequest)(nil), // 65: taprpc.UnpackProofFileRequest - (*UnpackProofFileResponse)(nil), // 66: taprpc.UnpackProofFileResponse - (*AddrEvent)(nil), // 67: taprpc.AddrEvent - (*AddrReceivesRequest)(nil), // 68: taprpc.AddrReceivesRequest - (*AddrReceivesResponse)(nil), // 69: taprpc.AddrReceivesResponse - (*SendAssetRequest)(nil), // 70: taprpc.SendAssetRequest - (*PrevInputAsset)(nil), // 71: taprpc.PrevInputAsset - (*SendAssetResponse)(nil), // 72: taprpc.SendAssetResponse - (*GetInfoRequest)(nil), // 73: taprpc.GetInfoRequest - (*GetInfoResponse)(nil), // 74: taprpc.GetInfoResponse - (*FetchAssetMetaRequest)(nil), // 75: taprpc.FetchAssetMetaRequest - (*BurnAssetRequest)(nil), // 76: taprpc.BurnAssetRequest - (*BurnAssetResponse)(nil), // 77: taprpc.BurnAssetResponse - (*ListBurnsRequest)(nil), // 78: taprpc.ListBurnsRequest - (*AssetBurn)(nil), // 79: taprpc.AssetBurn - (*ListBurnsResponse)(nil), // 80: taprpc.ListBurnsResponse - (*OutPoint)(nil), // 81: taprpc.OutPoint - (*SubscribeReceiveEventsRequest)(nil), // 82: taprpc.SubscribeReceiveEventsRequest - (*ReceiveEvent)(nil), // 83: taprpc.ReceiveEvent - (*SubscribeSendEventsRequest)(nil), // 84: taprpc.SubscribeSendEventsRequest - (*SendEvent)(nil), // 85: taprpc.SendEvent - (*AnchorTransaction)(nil), // 86: taprpc.AnchorTransaction - (*RegisterTransferRequest)(nil), // 87: taprpc.RegisterTransferRequest - (*RegisterTransferResponse)(nil), // 88: taprpc.RegisterTransferResponse - nil, // 89: taprpc.ListUtxosResponse.ManagedUtxosEntry - nil, // 90: taprpc.ListGroupsResponse.GroupsEntry - nil, // 91: taprpc.ListBalancesResponse.AssetBalancesEntry - nil, // 92: taprpc.ListBalancesResponse.AssetGroupBalancesEntry + (ScriptKeyType)(0), // 6: taprpc.ScriptKeyType + (AddrEventStatus)(0), // 7: taprpc.AddrEventStatus + (SendState)(0), // 8: taprpc.SendState + (ParcelType)(0), // 9: taprpc.ParcelType + (*AssetMeta)(nil), // 10: taprpc.AssetMeta + (*ListAssetRequest)(nil), // 11: taprpc.ListAssetRequest + (*AnchorInfo)(nil), // 12: taprpc.AnchorInfo + (*GenesisInfo)(nil), // 13: taprpc.GenesisInfo + (*ExternalKey)(nil), // 14: taprpc.ExternalKey + (*GroupKeyRequest)(nil), // 15: taprpc.GroupKeyRequest + (*TxOut)(nil), // 16: taprpc.TxOut + (*GroupVirtualTx)(nil), // 17: taprpc.GroupVirtualTx + (*GroupWitness)(nil), // 18: taprpc.GroupWitness + (*AssetGroup)(nil), // 19: taprpc.AssetGroup + (*GroupKeyReveal)(nil), // 20: taprpc.GroupKeyReveal + (*GenesisReveal)(nil), // 21: taprpc.GenesisReveal + (*DecimalDisplay)(nil), // 22: taprpc.DecimalDisplay + (*Asset)(nil), // 23: taprpc.Asset + (*PrevWitness)(nil), // 24: taprpc.PrevWitness + (*SplitCommitment)(nil), // 25: taprpc.SplitCommitment + (*ListAssetResponse)(nil), // 26: taprpc.ListAssetResponse + (*ListUtxosRequest)(nil), // 27: taprpc.ListUtxosRequest + (*ManagedUtxo)(nil), // 28: taprpc.ManagedUtxo + (*ListUtxosResponse)(nil), // 29: taprpc.ListUtxosResponse + (*ListGroupsRequest)(nil), // 30: taprpc.ListGroupsRequest + (*AssetHumanReadable)(nil), // 31: taprpc.AssetHumanReadable + (*GroupedAssets)(nil), // 32: taprpc.GroupedAssets + (*ListGroupsResponse)(nil), // 33: taprpc.ListGroupsResponse + (*ListBalancesRequest)(nil), // 34: taprpc.ListBalancesRequest + (*AssetBalance)(nil), // 35: taprpc.AssetBalance + (*AssetGroupBalance)(nil), // 36: taprpc.AssetGroupBalance + (*ListBalancesResponse)(nil), // 37: taprpc.ListBalancesResponse + (*ListTransfersRequest)(nil), // 38: taprpc.ListTransfersRequest + (*ListTransfersResponse)(nil), // 39: taprpc.ListTransfersResponse + (*ChainHash)(nil), // 40: taprpc.ChainHash + (*AssetTransfer)(nil), // 41: taprpc.AssetTransfer + (*TransferInput)(nil), // 42: taprpc.TransferInput + (*TransferOutputAnchor)(nil), // 43: taprpc.TransferOutputAnchor + (*TransferOutput)(nil), // 44: taprpc.TransferOutput + (*StopRequest)(nil), // 45: taprpc.StopRequest + (*StopResponse)(nil), // 46: taprpc.StopResponse + (*DebugLevelRequest)(nil), // 47: taprpc.DebugLevelRequest + (*DebugLevelResponse)(nil), // 48: taprpc.DebugLevelResponse + (*Addr)(nil), // 49: taprpc.Addr + (*QueryAddrRequest)(nil), // 50: taprpc.QueryAddrRequest + (*QueryAddrResponse)(nil), // 51: taprpc.QueryAddrResponse + (*NewAddrRequest)(nil), // 52: taprpc.NewAddrRequest + (*ScriptKey)(nil), // 53: taprpc.ScriptKey + (*KeyLocator)(nil), // 54: taprpc.KeyLocator + (*KeyDescriptor)(nil), // 55: taprpc.KeyDescriptor + (*TapscriptFullTree)(nil), // 56: taprpc.TapscriptFullTree + (*TapLeaf)(nil), // 57: taprpc.TapLeaf + (*TapBranch)(nil), // 58: taprpc.TapBranch + (*DecodeAddrRequest)(nil), // 59: taprpc.DecodeAddrRequest + (*ProofFile)(nil), // 60: taprpc.ProofFile + (*DecodedProof)(nil), // 61: taprpc.DecodedProof + (*VerifyProofResponse)(nil), // 62: taprpc.VerifyProofResponse + (*DecodeProofRequest)(nil), // 63: taprpc.DecodeProofRequest + (*DecodeProofResponse)(nil), // 64: taprpc.DecodeProofResponse + (*ExportProofRequest)(nil), // 65: taprpc.ExportProofRequest + (*UnpackProofFileRequest)(nil), // 66: taprpc.UnpackProofFileRequest + (*UnpackProofFileResponse)(nil), // 67: taprpc.UnpackProofFileResponse + (*AddrEvent)(nil), // 68: taprpc.AddrEvent + (*AddrReceivesRequest)(nil), // 69: taprpc.AddrReceivesRequest + (*AddrReceivesResponse)(nil), // 70: taprpc.AddrReceivesResponse + (*SendAssetRequest)(nil), // 71: taprpc.SendAssetRequest + (*PrevInputAsset)(nil), // 72: taprpc.PrevInputAsset + (*SendAssetResponse)(nil), // 73: taprpc.SendAssetResponse + (*GetInfoRequest)(nil), // 74: taprpc.GetInfoRequest + (*GetInfoResponse)(nil), // 75: taprpc.GetInfoResponse + (*FetchAssetMetaRequest)(nil), // 76: taprpc.FetchAssetMetaRequest + (*BurnAssetRequest)(nil), // 77: taprpc.BurnAssetRequest + (*BurnAssetResponse)(nil), // 78: taprpc.BurnAssetResponse + (*ListBurnsRequest)(nil), // 79: taprpc.ListBurnsRequest + (*AssetBurn)(nil), // 80: taprpc.AssetBurn + (*ListBurnsResponse)(nil), // 81: taprpc.ListBurnsResponse + (*OutPoint)(nil), // 82: taprpc.OutPoint + (*SubscribeReceiveEventsRequest)(nil), // 83: taprpc.SubscribeReceiveEventsRequest + (*ReceiveEvent)(nil), // 84: taprpc.ReceiveEvent + (*SubscribeSendEventsRequest)(nil), // 85: taprpc.SubscribeSendEventsRequest + (*SendEvent)(nil), // 86: taprpc.SendEvent + (*AnchorTransaction)(nil), // 87: taprpc.AnchorTransaction + (*RegisterTransferRequest)(nil), // 88: taprpc.RegisterTransferRequest + (*RegisterTransferResponse)(nil), // 89: taprpc.RegisterTransferResponse + nil, // 90: taprpc.ListUtxosResponse.ManagedUtxosEntry + nil, // 91: taprpc.ListGroupsResponse.GroupsEntry + nil, // 92: taprpc.ListBalancesResponse.AssetBalancesEntry + nil, // 93: taprpc.ListBalancesResponse.AssetGroupBalancesEntry } var file_taprootassets_proto_depIdxs = []int32{ 1, // 0: taprpc.AssetMeta.type:type_name -> taprpc.AssetMetaType - 52, // 1: taprpc.ListAssetRequest.script_key:type_name -> taprpc.ScriptKey - 81, // 2: taprpc.ListAssetRequest.anchor_outpoint:type_name -> taprpc.OutPoint + 53, // 1: taprpc.ListAssetRequest.script_key:type_name -> taprpc.ScriptKey + 82, // 2: taprpc.ListAssetRequest.anchor_outpoint:type_name -> taprpc.OutPoint 0, // 3: taprpc.GenesisInfo.asset_type:type_name -> taprpc.AssetType - 54, // 4: taprpc.GroupKeyRequest.raw_key:type_name -> taprpc.KeyDescriptor - 12, // 5: taprpc.GroupKeyRequest.anchor_genesis:type_name -> taprpc.GenesisInfo - 13, // 6: taprpc.GroupKeyRequest.external_key:type_name -> taprpc.ExternalKey - 15, // 7: taprpc.GroupVirtualTx.prev_out:type_name -> taprpc.TxOut - 12, // 8: taprpc.GenesisReveal.genesis_base_reveal:type_name -> taprpc.GenesisInfo + 55, // 4: taprpc.GroupKeyRequest.raw_key:type_name -> taprpc.KeyDescriptor + 13, // 5: taprpc.GroupKeyRequest.anchor_genesis:type_name -> taprpc.GenesisInfo + 14, // 6: taprpc.GroupKeyRequest.external_key:type_name -> taprpc.ExternalKey + 16, // 7: taprpc.GroupVirtualTx.prev_out:type_name -> taprpc.TxOut + 13, // 8: taprpc.GenesisReveal.genesis_base_reveal:type_name -> taprpc.GenesisInfo 2, // 9: taprpc.Asset.version:type_name -> taprpc.AssetVersion - 12, // 10: taprpc.Asset.asset_genesis:type_name -> taprpc.GenesisInfo - 18, // 11: taprpc.Asset.asset_group:type_name -> taprpc.AssetGroup - 11, // 12: taprpc.Asset.chain_anchor:type_name -> taprpc.AnchorInfo - 23, // 13: taprpc.Asset.prev_witnesses:type_name -> taprpc.PrevWitness - 21, // 14: taprpc.Asset.decimal_display:type_name -> taprpc.DecimalDisplay - 71, // 15: taprpc.PrevWitness.prev_id:type_name -> taprpc.PrevInputAsset - 24, // 16: taprpc.PrevWitness.split_commitment:type_name -> taprpc.SplitCommitment - 22, // 17: taprpc.SplitCommitment.root_asset:type_name -> taprpc.Asset - 22, // 18: taprpc.ListAssetResponse.assets:type_name -> taprpc.Asset - 22, // 19: taprpc.ManagedUtxo.assets:type_name -> taprpc.Asset - 89, // 20: taprpc.ListUtxosResponse.managed_utxos:type_name -> taprpc.ListUtxosResponse.ManagedUtxosEntry + 13, // 10: taprpc.Asset.asset_genesis:type_name -> taprpc.GenesisInfo + 19, // 11: taprpc.Asset.asset_group:type_name -> taprpc.AssetGroup + 12, // 12: taprpc.Asset.chain_anchor:type_name -> taprpc.AnchorInfo + 24, // 13: taprpc.Asset.prev_witnesses:type_name -> taprpc.PrevWitness + 22, // 14: taprpc.Asset.decimal_display:type_name -> taprpc.DecimalDisplay + 72, // 15: taprpc.PrevWitness.prev_id:type_name -> taprpc.PrevInputAsset + 25, // 16: taprpc.PrevWitness.split_commitment:type_name -> taprpc.SplitCommitment + 23, // 17: taprpc.SplitCommitment.root_asset:type_name -> taprpc.Asset + 23, // 18: taprpc.ListAssetResponse.assets:type_name -> taprpc.Asset + 23, // 19: taprpc.ManagedUtxo.assets:type_name -> taprpc.Asset + 90, // 20: taprpc.ListUtxosResponse.managed_utxos:type_name -> taprpc.ListUtxosResponse.ManagedUtxosEntry 0, // 21: taprpc.AssetHumanReadable.type:type_name -> taprpc.AssetType 2, // 22: taprpc.AssetHumanReadable.version:type_name -> taprpc.AssetVersion - 30, // 23: taprpc.GroupedAssets.assets:type_name -> taprpc.AssetHumanReadable - 90, // 24: taprpc.ListGroupsResponse.groups:type_name -> taprpc.ListGroupsResponse.GroupsEntry - 12, // 25: taprpc.AssetBalance.asset_genesis:type_name -> taprpc.GenesisInfo - 91, // 26: taprpc.ListBalancesResponse.asset_balances:type_name -> taprpc.ListBalancesResponse.AssetBalancesEntry - 92, // 27: taprpc.ListBalancesResponse.asset_group_balances:type_name -> taprpc.ListBalancesResponse.AssetGroupBalancesEntry - 40, // 28: taprpc.ListTransfersResponse.transfers:type_name -> taprpc.AssetTransfer - 41, // 29: taprpc.AssetTransfer.inputs:type_name -> taprpc.TransferInput - 43, // 30: taprpc.AssetTransfer.outputs:type_name -> taprpc.TransferOutput - 39, // 31: taprpc.AssetTransfer.anchor_tx_block_hash:type_name -> taprpc.ChainHash - 42, // 32: taprpc.TransferOutput.anchor:type_name -> taprpc.TransferOutputAnchor + 31, // 23: taprpc.GroupedAssets.assets:type_name -> taprpc.AssetHumanReadable + 91, // 24: taprpc.ListGroupsResponse.groups:type_name -> taprpc.ListGroupsResponse.GroupsEntry + 13, // 25: taprpc.AssetBalance.asset_genesis:type_name -> taprpc.GenesisInfo + 92, // 26: taprpc.ListBalancesResponse.asset_balances:type_name -> taprpc.ListBalancesResponse.AssetBalancesEntry + 93, // 27: taprpc.ListBalancesResponse.asset_group_balances:type_name -> taprpc.ListBalancesResponse.AssetGroupBalancesEntry + 41, // 28: taprpc.ListTransfersResponse.transfers:type_name -> taprpc.AssetTransfer + 42, // 29: taprpc.AssetTransfer.inputs:type_name -> taprpc.TransferInput + 44, // 30: taprpc.AssetTransfer.outputs:type_name -> taprpc.TransferOutput + 40, // 31: taprpc.AssetTransfer.anchor_tx_block_hash:type_name -> taprpc.ChainHash + 43, // 32: taprpc.TransferOutput.anchor:type_name -> taprpc.TransferOutputAnchor 3, // 33: taprpc.TransferOutput.output_type:type_name -> taprpc.OutputType 2, // 34: taprpc.TransferOutput.asset_version:type_name -> taprpc.AssetVersion 4, // 35: taprpc.TransferOutput.proof_delivery_status:type_name -> taprpc.ProofDeliveryStatus 0, // 36: taprpc.Addr.asset_type:type_name -> taprpc.AssetType 2, // 37: taprpc.Addr.asset_version:type_name -> taprpc.AssetVersion 5, // 38: taprpc.Addr.address_version:type_name -> taprpc.AddrVersion - 48, // 39: taprpc.QueryAddrResponse.addrs:type_name -> taprpc.Addr - 52, // 40: taprpc.NewAddrRequest.script_key:type_name -> taprpc.ScriptKey - 54, // 41: taprpc.NewAddrRequest.internal_key:type_name -> taprpc.KeyDescriptor + 49, // 39: taprpc.QueryAddrResponse.addrs:type_name -> taprpc.Addr + 53, // 40: taprpc.NewAddrRequest.script_key:type_name -> taprpc.ScriptKey + 55, // 41: taprpc.NewAddrRequest.internal_key:type_name -> taprpc.KeyDescriptor 2, // 42: taprpc.NewAddrRequest.asset_version:type_name -> taprpc.AssetVersion 5, // 43: taprpc.NewAddrRequest.address_version:type_name -> taprpc.AddrVersion - 54, // 44: taprpc.ScriptKey.key_desc:type_name -> taprpc.KeyDescriptor - 53, // 45: taprpc.KeyDescriptor.key_loc:type_name -> taprpc.KeyLocator - 56, // 46: taprpc.TapscriptFullTree.all_leaves:type_name -> taprpc.TapLeaf - 22, // 47: taprpc.DecodedProof.asset:type_name -> taprpc.Asset - 9, // 48: taprpc.DecodedProof.meta_reveal:type_name -> taprpc.AssetMeta - 20, // 49: taprpc.DecodedProof.genesis_reveal:type_name -> taprpc.GenesisReveal - 19, // 50: taprpc.DecodedProof.group_key_reveal:type_name -> taprpc.GroupKeyReveal - 60, // 51: taprpc.VerifyProofResponse.decoded_proof:type_name -> taprpc.DecodedProof - 60, // 52: taprpc.DecodeProofResponse.decoded_proof:type_name -> taprpc.DecodedProof - 81, // 53: taprpc.ExportProofRequest.outpoint:type_name -> taprpc.OutPoint - 48, // 54: taprpc.AddrEvent.addr:type_name -> taprpc.Addr - 6, // 55: taprpc.AddrEvent.status:type_name -> taprpc.AddrEventStatus - 6, // 56: taprpc.AddrReceivesRequest.filter_status:type_name -> taprpc.AddrEventStatus - 67, // 57: taprpc.AddrReceivesResponse.events:type_name -> taprpc.AddrEvent - 40, // 58: taprpc.SendAssetResponse.transfer:type_name -> taprpc.AssetTransfer - 40, // 59: taprpc.BurnAssetResponse.burn_transfer:type_name -> taprpc.AssetTransfer - 60, // 60: taprpc.BurnAssetResponse.burn_proof:type_name -> taprpc.DecodedProof - 79, // 61: taprpc.ListBurnsResponse.burns:type_name -> taprpc.AssetBurn - 48, // 62: taprpc.ReceiveEvent.address:type_name -> taprpc.Addr - 6, // 63: taprpc.ReceiveEvent.status:type_name -> taprpc.AddrEventStatus - 8, // 64: taprpc.SendEvent.parcel_type:type_name -> taprpc.ParcelType - 48, // 65: taprpc.SendEvent.addresses:type_name -> taprpc.Addr - 86, // 66: taprpc.SendEvent.anchor_transaction:type_name -> taprpc.AnchorTransaction - 40, // 67: taprpc.SendEvent.transfer:type_name -> taprpc.AssetTransfer - 81, // 68: taprpc.AnchorTransaction.lnd_locked_utxos:type_name -> taprpc.OutPoint - 81, // 69: taprpc.RegisterTransferRequest.outpoint:type_name -> taprpc.OutPoint - 22, // 70: taprpc.RegisterTransferResponse.registered_asset:type_name -> taprpc.Asset - 27, // 71: taprpc.ListUtxosResponse.ManagedUtxosEntry.value:type_name -> taprpc.ManagedUtxo - 31, // 72: taprpc.ListGroupsResponse.GroupsEntry.value:type_name -> taprpc.GroupedAssets - 34, // 73: taprpc.ListBalancesResponse.AssetBalancesEntry.value:type_name -> taprpc.AssetBalance - 35, // 74: taprpc.ListBalancesResponse.AssetGroupBalancesEntry.value:type_name -> taprpc.AssetGroupBalance - 10, // 75: taprpc.TaprootAssets.ListAssets:input_type -> taprpc.ListAssetRequest - 26, // 76: taprpc.TaprootAssets.ListUtxos:input_type -> taprpc.ListUtxosRequest - 29, // 77: taprpc.TaprootAssets.ListGroups:input_type -> taprpc.ListGroupsRequest - 33, // 78: taprpc.TaprootAssets.ListBalances:input_type -> taprpc.ListBalancesRequest - 37, // 79: taprpc.TaprootAssets.ListTransfers:input_type -> taprpc.ListTransfersRequest - 44, // 80: taprpc.TaprootAssets.StopDaemon:input_type -> taprpc.StopRequest - 46, // 81: taprpc.TaprootAssets.DebugLevel:input_type -> taprpc.DebugLevelRequest - 49, // 82: taprpc.TaprootAssets.QueryAddrs:input_type -> taprpc.QueryAddrRequest - 51, // 83: taprpc.TaprootAssets.NewAddr:input_type -> taprpc.NewAddrRequest - 58, // 84: taprpc.TaprootAssets.DecodeAddr:input_type -> taprpc.DecodeAddrRequest - 68, // 85: taprpc.TaprootAssets.AddrReceives:input_type -> taprpc.AddrReceivesRequest - 59, // 86: taprpc.TaprootAssets.VerifyProof:input_type -> taprpc.ProofFile - 62, // 87: taprpc.TaprootAssets.DecodeProof:input_type -> taprpc.DecodeProofRequest - 64, // 88: taprpc.TaprootAssets.ExportProof:input_type -> taprpc.ExportProofRequest - 65, // 89: taprpc.TaprootAssets.UnpackProofFile:input_type -> taprpc.UnpackProofFileRequest - 70, // 90: taprpc.TaprootAssets.SendAsset:input_type -> taprpc.SendAssetRequest - 76, // 91: taprpc.TaprootAssets.BurnAsset:input_type -> taprpc.BurnAssetRequest - 78, // 92: taprpc.TaprootAssets.ListBurns:input_type -> taprpc.ListBurnsRequest - 73, // 93: taprpc.TaprootAssets.GetInfo:input_type -> taprpc.GetInfoRequest - 75, // 94: taprpc.TaprootAssets.FetchAssetMeta:input_type -> taprpc.FetchAssetMetaRequest - 82, // 95: taprpc.TaprootAssets.SubscribeReceiveEvents:input_type -> taprpc.SubscribeReceiveEventsRequest - 84, // 96: taprpc.TaprootAssets.SubscribeSendEvents:input_type -> taprpc.SubscribeSendEventsRequest - 87, // 97: taprpc.TaprootAssets.RegisterTransfer:input_type -> taprpc.RegisterTransferRequest - 25, // 98: taprpc.TaprootAssets.ListAssets:output_type -> taprpc.ListAssetResponse - 28, // 99: taprpc.TaprootAssets.ListUtxos:output_type -> taprpc.ListUtxosResponse - 32, // 100: taprpc.TaprootAssets.ListGroups:output_type -> taprpc.ListGroupsResponse - 36, // 101: taprpc.TaprootAssets.ListBalances:output_type -> taprpc.ListBalancesResponse - 38, // 102: taprpc.TaprootAssets.ListTransfers:output_type -> taprpc.ListTransfersResponse - 45, // 103: taprpc.TaprootAssets.StopDaemon:output_type -> taprpc.StopResponse - 47, // 104: taprpc.TaprootAssets.DebugLevel:output_type -> taprpc.DebugLevelResponse - 50, // 105: taprpc.TaprootAssets.QueryAddrs:output_type -> taprpc.QueryAddrResponse - 48, // 106: taprpc.TaprootAssets.NewAddr:output_type -> taprpc.Addr - 48, // 107: taprpc.TaprootAssets.DecodeAddr:output_type -> taprpc.Addr - 69, // 108: taprpc.TaprootAssets.AddrReceives:output_type -> taprpc.AddrReceivesResponse - 61, // 109: taprpc.TaprootAssets.VerifyProof:output_type -> taprpc.VerifyProofResponse - 63, // 110: taprpc.TaprootAssets.DecodeProof:output_type -> taprpc.DecodeProofResponse - 59, // 111: taprpc.TaprootAssets.ExportProof:output_type -> taprpc.ProofFile - 66, // 112: taprpc.TaprootAssets.UnpackProofFile:output_type -> taprpc.UnpackProofFileResponse - 72, // 113: taprpc.TaprootAssets.SendAsset:output_type -> taprpc.SendAssetResponse - 77, // 114: taprpc.TaprootAssets.BurnAsset:output_type -> taprpc.BurnAssetResponse - 80, // 115: taprpc.TaprootAssets.ListBurns:output_type -> taprpc.ListBurnsResponse - 74, // 116: taprpc.TaprootAssets.GetInfo:output_type -> taprpc.GetInfoResponse - 9, // 117: taprpc.TaprootAssets.FetchAssetMeta:output_type -> taprpc.AssetMeta - 83, // 118: taprpc.TaprootAssets.SubscribeReceiveEvents:output_type -> taprpc.ReceiveEvent - 85, // 119: taprpc.TaprootAssets.SubscribeSendEvents:output_type -> taprpc.SendEvent - 88, // 120: taprpc.TaprootAssets.RegisterTransfer:output_type -> taprpc.RegisterTransferResponse - 98, // [98:121] is the sub-list for method output_type - 75, // [75:98] is the sub-list for method input_type - 75, // [75:75] is the sub-list for extension type_name - 75, // [75:75] is the sub-list for extension extendee - 0, // [0:75] is the sub-list for field type_name + 55, // 44: taprpc.ScriptKey.key_desc:type_name -> taprpc.KeyDescriptor + 6, // 45: taprpc.ScriptKey.type:type_name -> taprpc.ScriptKeyType + 54, // 46: taprpc.KeyDescriptor.key_loc:type_name -> taprpc.KeyLocator + 57, // 47: taprpc.TapscriptFullTree.all_leaves:type_name -> taprpc.TapLeaf + 23, // 48: taprpc.DecodedProof.asset:type_name -> taprpc.Asset + 10, // 49: taprpc.DecodedProof.meta_reveal:type_name -> taprpc.AssetMeta + 21, // 50: taprpc.DecodedProof.genesis_reveal:type_name -> taprpc.GenesisReveal + 20, // 51: taprpc.DecodedProof.group_key_reveal:type_name -> taprpc.GroupKeyReveal + 61, // 52: taprpc.VerifyProofResponse.decoded_proof:type_name -> taprpc.DecodedProof + 61, // 53: taprpc.DecodeProofResponse.decoded_proof:type_name -> taprpc.DecodedProof + 82, // 54: taprpc.ExportProofRequest.outpoint:type_name -> taprpc.OutPoint + 49, // 55: taprpc.AddrEvent.addr:type_name -> taprpc.Addr + 7, // 56: taprpc.AddrEvent.status:type_name -> taprpc.AddrEventStatus + 7, // 57: taprpc.AddrReceivesRequest.filter_status:type_name -> taprpc.AddrEventStatus + 68, // 58: taprpc.AddrReceivesResponse.events:type_name -> taprpc.AddrEvent + 41, // 59: taprpc.SendAssetResponse.transfer:type_name -> taprpc.AssetTransfer + 41, // 60: taprpc.BurnAssetResponse.burn_transfer:type_name -> taprpc.AssetTransfer + 61, // 61: taprpc.BurnAssetResponse.burn_proof:type_name -> taprpc.DecodedProof + 80, // 62: taprpc.ListBurnsResponse.burns:type_name -> taprpc.AssetBurn + 49, // 63: taprpc.ReceiveEvent.address:type_name -> taprpc.Addr + 7, // 64: taprpc.ReceiveEvent.status:type_name -> taprpc.AddrEventStatus + 9, // 65: taprpc.SendEvent.parcel_type:type_name -> taprpc.ParcelType + 49, // 66: taprpc.SendEvent.addresses:type_name -> taprpc.Addr + 87, // 67: taprpc.SendEvent.anchor_transaction:type_name -> taprpc.AnchorTransaction + 41, // 68: taprpc.SendEvent.transfer:type_name -> taprpc.AssetTransfer + 82, // 69: taprpc.AnchorTransaction.lnd_locked_utxos:type_name -> taprpc.OutPoint + 82, // 70: taprpc.RegisterTransferRequest.outpoint:type_name -> taprpc.OutPoint + 23, // 71: taprpc.RegisterTransferResponse.registered_asset:type_name -> taprpc.Asset + 28, // 72: taprpc.ListUtxosResponse.ManagedUtxosEntry.value:type_name -> taprpc.ManagedUtxo + 32, // 73: taprpc.ListGroupsResponse.GroupsEntry.value:type_name -> taprpc.GroupedAssets + 35, // 74: taprpc.ListBalancesResponse.AssetBalancesEntry.value:type_name -> taprpc.AssetBalance + 36, // 75: taprpc.ListBalancesResponse.AssetGroupBalancesEntry.value:type_name -> taprpc.AssetGroupBalance + 11, // 76: taprpc.TaprootAssets.ListAssets:input_type -> taprpc.ListAssetRequest + 27, // 77: taprpc.TaprootAssets.ListUtxos:input_type -> taprpc.ListUtxosRequest + 30, // 78: taprpc.TaprootAssets.ListGroups:input_type -> taprpc.ListGroupsRequest + 34, // 79: taprpc.TaprootAssets.ListBalances:input_type -> taprpc.ListBalancesRequest + 38, // 80: taprpc.TaprootAssets.ListTransfers:input_type -> taprpc.ListTransfersRequest + 45, // 81: taprpc.TaprootAssets.StopDaemon:input_type -> taprpc.StopRequest + 47, // 82: taprpc.TaprootAssets.DebugLevel:input_type -> taprpc.DebugLevelRequest + 50, // 83: taprpc.TaprootAssets.QueryAddrs:input_type -> taprpc.QueryAddrRequest + 52, // 84: taprpc.TaprootAssets.NewAddr:input_type -> taprpc.NewAddrRequest + 59, // 85: taprpc.TaprootAssets.DecodeAddr:input_type -> taprpc.DecodeAddrRequest + 69, // 86: taprpc.TaprootAssets.AddrReceives:input_type -> taprpc.AddrReceivesRequest + 60, // 87: taprpc.TaprootAssets.VerifyProof:input_type -> taprpc.ProofFile + 63, // 88: taprpc.TaprootAssets.DecodeProof:input_type -> taprpc.DecodeProofRequest + 65, // 89: taprpc.TaprootAssets.ExportProof:input_type -> taprpc.ExportProofRequest + 66, // 90: taprpc.TaprootAssets.UnpackProofFile:input_type -> taprpc.UnpackProofFileRequest + 71, // 91: taprpc.TaprootAssets.SendAsset:input_type -> taprpc.SendAssetRequest + 77, // 92: taprpc.TaprootAssets.BurnAsset:input_type -> taprpc.BurnAssetRequest + 79, // 93: taprpc.TaprootAssets.ListBurns:input_type -> taprpc.ListBurnsRequest + 74, // 94: taprpc.TaprootAssets.GetInfo:input_type -> taprpc.GetInfoRequest + 76, // 95: taprpc.TaprootAssets.FetchAssetMeta:input_type -> taprpc.FetchAssetMetaRequest + 83, // 96: taprpc.TaprootAssets.SubscribeReceiveEvents:input_type -> taprpc.SubscribeReceiveEventsRequest + 85, // 97: taprpc.TaprootAssets.SubscribeSendEvents:input_type -> taprpc.SubscribeSendEventsRequest + 88, // 98: taprpc.TaprootAssets.RegisterTransfer:input_type -> taprpc.RegisterTransferRequest + 26, // 99: taprpc.TaprootAssets.ListAssets:output_type -> taprpc.ListAssetResponse + 29, // 100: taprpc.TaprootAssets.ListUtxos:output_type -> taprpc.ListUtxosResponse + 33, // 101: taprpc.TaprootAssets.ListGroups:output_type -> taprpc.ListGroupsResponse + 37, // 102: taprpc.TaprootAssets.ListBalances:output_type -> taprpc.ListBalancesResponse + 39, // 103: taprpc.TaprootAssets.ListTransfers:output_type -> taprpc.ListTransfersResponse + 46, // 104: taprpc.TaprootAssets.StopDaemon:output_type -> taprpc.StopResponse + 48, // 105: taprpc.TaprootAssets.DebugLevel:output_type -> taprpc.DebugLevelResponse + 51, // 106: taprpc.TaprootAssets.QueryAddrs:output_type -> taprpc.QueryAddrResponse + 49, // 107: taprpc.TaprootAssets.NewAddr:output_type -> taprpc.Addr + 49, // 108: taprpc.TaprootAssets.DecodeAddr:output_type -> taprpc.Addr + 70, // 109: taprpc.TaprootAssets.AddrReceives:output_type -> taprpc.AddrReceivesResponse + 62, // 110: taprpc.TaprootAssets.VerifyProof:output_type -> taprpc.VerifyProofResponse + 64, // 111: taprpc.TaprootAssets.DecodeProof:output_type -> taprpc.DecodeProofResponse + 60, // 112: taprpc.TaprootAssets.ExportProof:output_type -> taprpc.ProofFile + 67, // 113: taprpc.TaprootAssets.UnpackProofFile:output_type -> taprpc.UnpackProofFileResponse + 73, // 114: taprpc.TaprootAssets.SendAsset:output_type -> taprpc.SendAssetResponse + 78, // 115: taprpc.TaprootAssets.BurnAsset:output_type -> taprpc.BurnAssetResponse + 81, // 116: taprpc.TaprootAssets.ListBurns:output_type -> taprpc.ListBurnsResponse + 75, // 117: taprpc.TaprootAssets.GetInfo:output_type -> taprpc.GetInfoResponse + 10, // 118: taprpc.TaprootAssets.FetchAssetMeta:output_type -> taprpc.AssetMeta + 84, // 119: taprpc.TaprootAssets.SubscribeReceiveEvents:output_type -> taprpc.ReceiveEvent + 86, // 120: taprpc.TaprootAssets.SubscribeSendEvents:output_type -> taprpc.SendEvent + 89, // 121: taprpc.TaprootAssets.RegisterTransfer:output_type -> taprpc.RegisterTransferResponse + 99, // [99:122] is the sub-list for method output_type + 76, // [76:99] is the sub-list for method input_type + 76, // [76:76] is the sub-list for extension type_name + 76, // [76:76] is the sub-list for extension extendee + 0, // [0:76] is the sub-list for field type_name } func init() { file_taprootassets_proto_init() } @@ -8715,7 +8819,7 @@ func file_taprootassets_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_taprootassets_proto_rawDesc, - NumEnums: 9, + NumEnums: 10, NumMessages: 84, NumExtensions: 0, NumServices: 1, diff --git a/taprpc/taprootassets.proto b/taprpc/taprootassets.proto index 35451011b..16fbd4b84 100644 --- a/taprpc/taprootassets.proto +++ b/taprpc/taprootassets.proto @@ -1004,6 +1004,53 @@ message NewAddrRequest { AddrVersion address_version = 8; } +enum ScriptKeyType { + /* + The type of script key is not known. This should only be stored for assets + where we don't know the internal key of the script key (e.g. for + imported proofs). + */ + SCRIPT_KEY_UNKNOWN = 0; + + /* + The script key is a normal BIP-86 key. This means that the internal key is + turned into a Taproot output key by applying a BIP-86 tweak to it. + */ + SCRIPT_KEY_BIP86 = 1; + + /* + The script key is a key that contains a script path that is defined by the + user and is therefore external to the tapd wallet. Spending this key + requires providing a specific witness and must be signed through the vPSBT + signing flow. + */ + SCRIPT_KEY_SCRIPT_PATH_EXTERNAL = 2; + + /* + The script key is a specific un-spendable key that indicates a burnt asset. + Assets with this key type can never be spent again, as a burn key is a + tweaked NUMS key that nobody knows the private key for. + */ + SCRIPT_KEY_BURN = 3; + + /* + The script key is a specific un-spendable key that indicates a tombstone + output. This is only the case for zero-value assets that result from a + non-interactive (TAP address) send where no change was left over. + */ + SCRIPT_KEY_TOMBSTONE = 4; + + /* + The script key is used for an asset that resides within a Taproot Asset + Channel. That means the script key is either a funding key (OP_TRUE), a + commitment output key (to_local, to_remote, htlc), or a HTLC second-level + transaction output key. Keys related to channels are not shown in asset + balances (unless specifically requested) and are never used for coin + selection. + */ + SCRIPT_KEY_CHANNEL = 5; +} + message ScriptKey { /* The full Taproot output key the asset is locked to. This is either a BIP-86 @@ -1022,6 +1069,11 @@ message ScriptKey { empty then a BIP-86 style tweak is applied to the internal key. */ bytes tap_tweak = 3; + + /* + The type of the script key, as declared by the user. + */ + ScriptKeyType type = 4; } message KeyLocator { diff --git a/taprpc/taprootassets.swagger.json b/taprpc/taprootassets.swagger.json index c2f1ab1c3..981298b6e 100644 --- a/taprpc/taprootassets.swagger.json +++ b/taprpc/taprootassets.swagger.json @@ -278,6 +278,22 @@ "type": "string", "format": "byte" }, + { + "name": "script_key.type", + "description": "The type of the script key, as declared by the user.\n\n - SCRIPT_KEY_UNKNOWN: The type of script key is not known. This should only be stored for assets\nwhere we don't know the internal key of the script key (e.g. for\nimported proofs).\n - SCRIPT_KEY_BIP86: The script key is a normal BIP-86 key. This means that the internal key is\nturned into a Taproot output key by applying a BIP-86 tweak to it.\n - SCRIPT_KEY_SCRIPT_PATH_EXTERNAL: The script key is a key that contains a script path that is defined by the\nuser and is therefore external to the tapd wallet. Spending this key\nrequires providing a specific witness and must be signed through the vPSBT\nsigning flow.\n - SCRIPT_KEY_BURN: The script key is a specific un-spendable key that indicates a burnt asset.\nAssets with this key type can never be spent again, as a burn key is a\ntweaked NUMS key that nobody knows the private key for.\n - SCRIPT_KEY_TOMBSTONE: The script key is a specific un-spendable key that indicates a tombstone\noutput. This is only the case for zero-value assets that result from a\nnon-interactive (TAP address) send where no change was left over.\n - SCRIPT_KEY_CHANNEL: The script key is used for an asset that resides within a Taproot Asset\nChannel. That means the script key is either a funding key (OP_TRUE), a\ncommitment output key (to_local, to_remote, htlc), or a HTLC second-level\ntransaction output key. Keys related to channels are not shown in asset\nbalances (unless specifically requested) and are never used for coin\nselection.", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "SCRIPT_KEY_UNKNOWN", + "SCRIPT_KEY_BIP86", + "SCRIPT_KEY_SCRIPT_PATH_EXTERNAL", + "SCRIPT_KEY_BURN", + "SCRIPT_KEY_TOMBSTONE", + "SCRIPT_KEY_CHANNEL" + ], + "default": "SCRIPT_KEY_UNKNOWN" + }, { "name": "anchor_outpoint.txid", "description": "Raw bytes representing the transaction id.", @@ -2308,9 +2324,26 @@ "type": "string", "format": "byte", "description": "The optional Taproot tweak to apply to the above internal key. If this is\nempty then a BIP-86 style tweak is applied to the internal key." + }, + "type": { + "$ref": "#/definitions/taprpcScriptKeyType", + "description": "The type of the script key, as declared by the user." } } }, + "taprpcScriptKeyType": { + "type": "string", + "enum": [ + "SCRIPT_KEY_UNKNOWN", + "SCRIPT_KEY_BIP86", + "SCRIPT_KEY_SCRIPT_PATH_EXTERNAL", + "SCRIPT_KEY_BURN", + "SCRIPT_KEY_TOMBSTONE", + "SCRIPT_KEY_CHANNEL" + ], + "default": "SCRIPT_KEY_UNKNOWN", + "description": " - SCRIPT_KEY_UNKNOWN: The type of script key is not known. This should only be stored for assets\nwhere we don't know the internal key of the script key (e.g. for\nimported proofs).\n - SCRIPT_KEY_BIP86: The script key is a normal BIP-86 key. This means that the internal key is\nturned into a Taproot output key by applying a BIP-86 tweak to it.\n - SCRIPT_KEY_SCRIPT_PATH_EXTERNAL: The script key is a key that contains a script path that is defined by the\nuser and is therefore external to the tapd wallet. Spending this key\nrequires providing a specific witness and must be signed through the vPSBT\nsigning flow.\n - SCRIPT_KEY_BURN: The script key is a specific un-spendable key that indicates a burnt asset.\nAssets with this key type can never be spent again, as a burn key is a\ntweaked NUMS key that nobody knows the private key for.\n - SCRIPT_KEY_TOMBSTONE: The script key is a specific un-spendable key that indicates a tombstone\noutput. This is only the case for zero-value assets that result from a\nnon-interactive (TAP address) send where no change was left over.\n - SCRIPT_KEY_CHANNEL: The script key is used for an asset that resides within a Taproot Asset\nChannel. That means the script key is either a funding key (OP_TRUE), a\ncommitment output key (to_local, to_remote, htlc), or a HTLC second-level\ntransaction output key. Keys related to channels are not shown in asset\nbalances (unless specifically requested) and are never used for coin\nselection." + }, "taprpcSendAssetRequest": { "type": "object", "properties": { From 25f6aa69f9a4f3dc9ec049aa55bc3cc5a64970b8 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 3 Apr 2025 14:51:41 +0200 Subject: [PATCH 11/17] multi: remove now unused DeclaredKnown field Since we can now declare more than just knowledge of a script key by giving it a specific type, we no longer need the boolean flag that was added as a temporary workaround. --- address/book.go | 20 +-- asset/asset.go | 19 +-- asset/generators.go | 5 +- rpcserver.go | 4 +- tapchannel/aux_sweeper.go | 6 +- tapchannel/commitment.go | 2 +- tapdb/addrs.go | 4 +- tapdb/addrs_test.go | 136 ++---------------- tapdb/asset_minting.go | 10 +- tapdb/assets_common.go | 3 +- tapdb/assets_store.go | 2 +- tapdb/migrations.go | 2 +- tapdb/post_migration_checks.go | 1 - tapdb/sqlc/addrs.sql.go | 6 +- tapdb/sqlc/assets.sql.go | 69 ++++----- ...34_script_key_drop_declared_known.down.sql | 2 + ...0034_script_key_drop_declared_known.up.sql | 3 + tapdb/sqlc/models.go | 1 - tapdb/sqlc/queries/assets.sql | 13 +- tapdb/sqlc/schemas/generated_schema.sql | 2 +- tapdb/sqlc/transfers.sql.go | 3 +- 21 files changed, 69 insertions(+), 244 deletions(-) create mode 100644 tapdb/sqlc/migrations/000034_script_key_drop_declared_known.down.sql create mode 100644 tapdb/sqlc/migrations/000034_script_key_drop_declared_known.up.sql diff --git a/address/book.go b/address/book.go index de7d02a27..31323557a 100644 --- a/address/book.go +++ b/address/book.go @@ -134,13 +134,9 @@ type Storage interface { // InsertScriptKey inserts an address related script key into the // database, so it can be recognized as belonging to the wallet when a - // transfer comes in later on. The script key can be declared as known - // if it contains an internal key that isn't derived by the backing - // wallet (e.g. NUMS key) but it should still be recognized as a key - // being relevant for the local wallet (e.g. show assets received on - // this key in the asset list and balances). + // transfer comes in later on. InsertScriptKey(ctx context.Context, scriptKey asset.ScriptKey, - declareAsKnown bool, keyType asset.ScriptKeyType) error + keyType asset.ScriptKeyType) error } // KeyRing is used to create script and internal keys for Taproot Asset @@ -406,7 +402,7 @@ func (b *Book) NewAddressWithKeys(ctx context.Context, addrVersion Version, // through an RPC call. So we make a guess here. keyType := scriptKey.GuessType() - err = b.cfg.Store.InsertScriptKey(ctx, scriptKey, true, keyType) + err = b.cfg.Store.InsertScriptKey(ctx, scriptKey, keyType) if err != nil { return nil, fmt.Errorf("unable to insert script key: %w", err) } @@ -443,11 +439,9 @@ func (b *Book) IsLocalKey(ctx context.Context, // InsertScriptKey inserts an address related script key into the database. func (b *Book) InsertScriptKey(ctx context.Context, scriptKey asset.ScriptKey, - declareAsKnown bool, keyType asset.ScriptKeyType) error { + keyType asset.ScriptKeyType) error { - return b.cfg.Store.InsertScriptKey( - ctx, scriptKey, declareAsKnown, keyType, - ) + return b.cfg.Store.InsertScriptKey(ctx, scriptKey, keyType) } // NextInternalKey derives then inserts an internal key into the database to @@ -482,9 +476,7 @@ func (b *Book) NextScriptKey(ctx context.Context, } scriptKey := asset.NewScriptKeyBip86(keyDesc) - err = b.cfg.Store.InsertScriptKey( - ctx, scriptKey, true, asset.ScriptKeyBip86, - ) + err = b.cfg.Store.InsertScriptKey(ctx, scriptKey, asset.ScriptKeyBip86) if err != nil { return asset.ScriptKey{}, err } diff --git a/asset/asset.go b/asset/asset.go index 9a8a63c6e..036cef0c9 100644 --- a/asset/asset.go +++ b/asset/asset.go @@ -1049,15 +1049,6 @@ type TweakedScriptKey struct { // public key. If this is nil, then a BIP-0086 tweak is assumed. Tweak []byte - // DeclaredKnown indicates that this script key has been explicitly - // declared as being important to the local wallet, even if it might not - // be fully known to the local wallet. This could perhaps also be named - // "imported", though that might imply that the corresponding private - // key was also somehow imported and available. The only relevance this - // flag has is that assets with a declared key are shown in the asset - // list/balance. - DeclaredKnown bool - // Type is the type of script key that is being used. Type ScriptKeyType } @@ -1130,12 +1121,9 @@ func (s *ScriptKey) IsEqual(otherScriptKey *ScriptKey) bool { // the local wallet or was explicitly declared to be known by using the // DeclareScriptKey RPC. Knowing the key conceptually means the key belongs to // the local wallet or is at least known by a software that operates on the -// local wallet. The DeclaredAsKnown flag is never serialized in proofs, so this -// is never explicitly set for keys foreign to the local wallet. Therefore, if -// this method returns true for a script key, it means the asset with the script -// key will be shown in the wallet balance. +// local wallet. func (s *ScriptKey) DeclaredAsKnown() bool { - return s.TweakedScriptKey != nil && s.TweakedScriptKey.DeclaredKnown + return s.TweakedScriptKey != nil && s.Type != ScriptKeyUnknown } // HasScriptPath returns true if we know the internals of the script key and @@ -1606,8 +1594,7 @@ func (a *Asset) Copy() *Asset { if a.ScriptKey.TweakedScriptKey != nil { assetCopy.ScriptKey.TweakedScriptKey = &TweakedScriptKey{ - DeclaredKnown: a.ScriptKey.DeclaredKnown, - Type: a.ScriptKey.Type, + Type: a.ScriptKey.Type, } assetCopy.ScriptKey.RawKey = a.ScriptKey.RawKey diff --git a/asset/generators.go b/asset/generators.go index d2ea1bd4c..858c84e07 100644 --- a/asset/generators.go +++ b/asset/generators.go @@ -71,9 +71,8 @@ var ( }) TweakedScriptKeyGen = rapid.Custom(func(t *rapid.T) TweakedScriptKey { return TweakedScriptKey{ - RawKey: KeyDescGen.Draw(t, "raw_key"), - Tweak: HashBytesGen.Draw(t, "tweak"), - DeclaredKnown: rapid.Bool().Draw(t, "declared_known"), + RawKey: KeyDescGen.Draw(t, "raw_key"), + Tweak: HashBytesGen.Draw(t, "tweak"), Type: ScriptKeyType( rapid.Int16().Draw(t, "script_key_type"), ), diff --git a/rpcserver.go b/rpcserver.go index 4d9c5812e..93b5f2d86 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -8008,9 +8008,7 @@ func (r *rpcServer) DeclareScriptKey(ctx context.Context, return nil, fmt.Errorf("script key type must be set") } - err = r.cfg.TapAddrBook.InsertScriptKey( - ctx, *scriptKey, true, scriptKey.Type, - ) + err = r.cfg.TapAddrBook.InsertScriptKey(ctx, *scriptKey, scriptKey.Type) if err != nil { return nil, fmt.Errorf("error inserting script key: %w", err) } diff --git a/tapchannel/aux_sweeper.go b/tapchannel/aux_sweeper.go index d32e1bb2e..7d5a233a7 100644 --- a/tapchannel/aux_sweeper.go +++ b/tapchannel/aux_sweeper.go @@ -1265,7 +1265,7 @@ func (a *AuxSweeper) importCommitScriptKeys(req lnwallet.ResolutionReq) error { ctxb := context.Background() for _, key := range keysToImport { err := a.cfg.AddrBook.InsertScriptKey( - ctxb, key, true, asset.ScriptKeyScriptPathChannel, + ctxb, key, asset.ScriptKeyScriptPathChannel, ) if err != nil { return fmt.Errorf("unable to insert script "+ @@ -1299,7 +1299,7 @@ func (a *AuxSweeper) importOutputScriptKeys(desc tapscriptSweepDescs) error { limitSpewer.Sdump(scriptKey)) return a.cfg.AddrBook.InsertScriptKey( - ctxb, scriptKey, true, asset.ScriptKeyScriptPathChannel, + ctxb, scriptKey, asset.ScriptKeyScriptPathChannel, ) } @@ -1494,7 +1494,7 @@ func (a *AuxSweeper) importCommitTx(req lnwallet.ResolutionReq, // balance correctly. ctxb := context.Background() err := a.cfg.AddrBook.InsertScriptKey( - ctxb, fundingScriptKey, true, asset.ScriptKeyScriptPathChannel, + ctxb, fundingScriptKey, asset.ScriptKeyScriptPathChannel, ) if err != nil { return fmt.Errorf("unable to insert script key: %w", err) diff --git a/tapchannel/commitment.go b/tapchannel/commitment.go index 09d52a466..21854aaf6 100644 --- a/tapchannel/commitment.go +++ b/tapchannel/commitment.go @@ -1495,7 +1495,7 @@ func deriveFundingScriptKey(ctx context.Context, addrBook address.Storage, // the asset will be materialized in the asset table and show up in the // balance correctly. err := addrBook.InsertScriptKey( - ctx, fundingScriptKey, true, asset.ScriptKeyScriptPathChannel, + ctx, fundingScriptKey, asset.ScriptKeyScriptPathChannel, ) if err != nil { return asset.ScriptKey{}, fmt.Errorf("unable to insert script "+ diff --git a/tapdb/addrs.go b/tapdb/addrs.go index 17ff56590..563de0077 100644 --- a/tapdb/addrs.go +++ b/tapdb/addrs.go @@ -652,8 +652,7 @@ func (t *TapAddressBook) InsertInternalKey(ctx context.Context, // it can be recognized as belonging to the wallet when a transfer comes in // later on. func (t *TapAddressBook) InsertScriptKey(ctx context.Context, - scriptKey asset.ScriptKey, declaredKnown bool, - keyType asset.ScriptKeyType) error { + scriptKey asset.ScriptKey, keyType asset.ScriptKeyType) error { var writeTxOpts AddrBookTxOptions return t.db.ExecTx(ctx, &writeTxOpts, func(q AddrBook) error { @@ -669,7 +668,6 @@ func (t *TapAddressBook) InsertScriptKey(ctx context.Context, InternalKeyID: internalKeyID, TweakedScriptKey: scriptKey.PubKey.SerializeCompressed(), Tweak: scriptKey.Tweak, - DeclaredKnown: sqlBool(declaredKnown), KeyType: sqlInt16(keyType), }) return err diff --git a/tapdb/addrs_test.go b/tapdb/addrs_test.go index 358a11f1c..b700dd4d8 100644 --- a/tapdb/addrs_test.go +++ b/tapdb/addrs_test.go @@ -3,7 +3,6 @@ package tapdb import ( "context" "database/sql" - "fmt" "math/rand" "testing" "time" @@ -660,40 +659,12 @@ func randScriptKey(t *testing.T) asset.ScriptKey { return scriptKey } -// insertScriptKeyWithNull is a helper function that inserts a script key with a -// a NULL value for declared known. We use this so we can insert a NULL vs an -// actual value. It is identical to the InsertScriptKey. -func insertScriptKeyWithNull(ctx context.Context, - key asset.ScriptKey) func(AddrBook) error { - - return func(q AddrBook) error { - internalKeyID, err := insertInternalKey( - ctx, q, key.RawKey, - ) - if err != nil { - return fmt.Errorf("error inserting internal key: %w", - err) - } - - _, err = q.UpsertScriptKey(ctx, NewScriptKey{ - InternalKeyID: internalKeyID, - TweakedScriptKey: key.PubKey.SerializeCompressed(), - Tweak: key.Tweak, - DeclaredKnown: sql.NullBool{ - Valid: false, - }, - }) - return err - } -} - func assertKeyKnowledge(t *testing.T, ctx context.Context, - addrBook *TapAddressBook, scriptKey asset.ScriptKey, known bool, + addrBook *TapAddressBook, scriptKey asset.ScriptKey, keyType asset.ScriptKeyType) { dbScriptKey, err := addrBook.FetchScriptKey(ctx, scriptKey.PubKey) require.NoError(t, err) - require.Equal(t, known, dbScriptKey.DeclaredKnown) require.Equal(t, keyType, dbScriptKey.Type) } @@ -705,87 +676,6 @@ func assertTweak(t *testing.T, ctx context.Context, addrBook *TapAddressBook, require.Equal(t, tweak, dbScriptKey.Tweak) } -// TestScriptKeyKnownUpsert tests that we can insert a script key, then insert -// it again declared as known. -func TestScriptKeyKnownUpsert(t *testing.T) { - t.Parallel() - - // First, make a new addr book instance we'll use in the test below. - testClock := clock.NewTestClock(time.Now()) - addrBook, _ := newAddrBook(t, testClock) - - ctx := context.Background() - - // In this test, we insert the known field as false, and make sure we - // can flip it back to true. - t.Run("false_to_true", func(t *testing.T) { - known := false - scriptKey := randScriptKey(t) - - // We'll insert a random script key into the database. We won't - // declare it as known though. - err := addrBook.InsertScriptKey( - ctx, scriptKey, known, asset.ScriptKeyBip86, - ) - require.NoError(t, err) - - // We'll fetch the script key and confirm that it's not known. - assertKeyKnowledge( - t, ctx, addrBook, scriptKey, known, - asset.ScriptKeyBip86, - ) - - known = true - - // We'll now insert it again, but this time declare it as known. - err = addrBook.InsertScriptKey( - ctx, scriptKey, known, asset.ScriptKeyBip86, - ) - require.NoError(t, err) - - // We'll fetch the script key and confirm that it's known. - assertKeyKnowledge( - t, ctx, addrBook, scriptKey, known, - asset.ScriptKeyBip86, - ) - }) - - // In this test, we insert a NULL value, and make sure that it can still - // be set to true. - t.Run("null_to_true", func(t *testing.T) { - known := false - scriptKey := randScriptKey(t) - - // We'll lift the internal routine of InsertScriptKey so we can - // insert an actual NULL here. - err := addrBook.db.ExecTx( - ctx, &AddrBookTxOptions{}, - insertScriptKeyWithNull(ctx, scriptKey), - ) - require.NoError(t, err) - - // We'll fetch the script key and confirm that it's not known. - assertKeyKnowledge( - t, ctx, addrBook, scriptKey, known, - asset.ScriptKeyUnknown, - ) - - known = true - - // We'll now insert it again, but this time declare it as known. - err = addrBook.InsertScriptKey( - ctx, scriptKey, known, asset.ScriptKeyBip86, - ) - require.NoError(t, err) - - // We'll fetch the script key and confirm that it's known. - assertKeyKnowledge( - t, ctx, addrBook, scriptKey, known, - asset.ScriptKeyBip86, - ) - }) -} - // TestScriptKeyTweakUpsert tests that we can insert a script key, then insert // it again when we know the tweak for it. func TestScriptKeyTweakUpsert(t *testing.T) { @@ -800,40 +690,35 @@ func TestScriptKeyTweakUpsert(t *testing.T) { // In this test, we insert the tweak as NULL, and make sure we overwrite // it with an actual value again later. t.Run("null_to_value", func(t *testing.T) { - known := false scriptKey := randScriptKey(t) scriptKey.Tweak = nil // We'll insert a random script key into the database. We won't // declare it as known though, and it doesn't have the tweak. err := addrBook.InsertScriptKey( - ctx, scriptKey, known, - asset.ScriptKeyScriptPathExternal, + ctx, scriptKey, asset.ScriptKeyUnknown, ) require.NoError(t, err) // We'll fetch the script key and confirm that it's not known. assertKeyKnowledge( - t, ctx, addrBook, scriptKey, known, - asset.ScriptKeyScriptPathExternal, + t, ctx, addrBook, scriptKey, asset.ScriptKeyUnknown, ) assertTweak(t, ctx, addrBook, scriptKey, nil) - known = true randTweak := test.RandBytes(32) scriptKey.Tweak = randTweak // We'll now insert it again, but this time declare it as known // and also know the tweak. err = addrBook.InsertScriptKey( - ctx, scriptKey, known, - asset.ScriptKeyScriptPathExternal, + ctx, scriptKey, asset.ScriptKeyScriptPathExternal, ) require.NoError(t, err) // We'll fetch the script key and confirm that it's known. assertKeyKnowledge( - t, ctx, addrBook, scriptKey, known, + t, ctx, addrBook, scriptKey, asset.ScriptKeyScriptPathExternal, ) assertTweak(t, ctx, addrBook, scriptKey, randTweak) @@ -854,35 +739,32 @@ func TestScriptKeyTypeUpsert(t *testing.T) { // In this test, we insert the type as unknown, and make sure we // overwrite it with an actual value again later. t.Run("null_to_value", func(t *testing.T) { - known := true scriptKey := randScriptKey(t) scriptKey.Tweak = nil // We'll insert a random script key into the database. It is // declared as known, but doesn't have a known type. err := addrBook.InsertScriptKey( - ctx, scriptKey, known, asset.ScriptKeyUnknown, + ctx, scriptKey, asset.ScriptKeyUnknown, ) require.NoError(t, err) // We'll fetch the script key and confirm that it's not known. assertKeyKnowledge( - t, ctx, addrBook, scriptKey, known, - asset.ScriptKeyUnknown, + t, ctx, addrBook, scriptKey, asset.ScriptKeyUnknown, ) assertTweak(t, ctx, addrBook, scriptKey, nil) // We'll now insert it again, but this time declare it as known // and also know the tweak. err = addrBook.InsertScriptKey( - ctx, scriptKey, known, asset.ScriptKeyBip86, + ctx, scriptKey, asset.ScriptKeyBip86, ) require.NoError(t, err) // We'll fetch the script key and confirm that it's known. assertKeyKnowledge( - t, ctx, addrBook, scriptKey, known, - asset.ScriptKeyBip86, + t, ctx, addrBook, scriptKey, asset.ScriptKeyBip86, ) }) } diff --git a/tapdb/asset_minting.go b/tapdb/asset_minting.go index f6acb3479..5d5f74e22 100644 --- a/tapdb/asset_minting.go +++ b/tapdb/asset_minting.go @@ -737,19 +737,15 @@ func fetchAssetSeedlings(ctx context.Context, q PendingAssetStore, PubKey: scriptKeyInternalPub, } scriptKeyTweak := dbSeedling.ScriptKeyTweak - declaredKnown := extractBool( - dbSeedling.ScriptKeyDeclaredKnown, - ) scriptType := extractSqlInt16[asset.ScriptKeyType]( dbSeedling.ScriptKeyType, ) seedling.ScriptKey = asset.ScriptKey{ PubKey: tweakedScriptKey, TweakedScriptKey: &asset.TweakedScriptKey{ - RawKey: scriptKeyRawKey, - Tweak: scriptKeyTweak, - DeclaredKnown: declaredKnown, - Type: scriptType, + RawKey: scriptKeyRawKey, + Tweak: scriptKeyTweak, + Type: scriptType, }, } } diff --git a/tapdb/assets_common.go b/tapdb/assets_common.go index 9b5d0444e..bac9b84f3 100644 --- a/tapdb/assets_common.go +++ b/tapdb/assets_common.go @@ -511,8 +511,7 @@ func parseScriptKey(ik sqlc.InternalKey, sk sqlc.ScriptKey) (asset.ScriptKey, RawKey: keychain.KeyDescriptor{ KeyLocator: locator, }, - Tweak: sk.Tweak, - DeclaredKnown: extractBool(sk.DeclaredKnown), + Tweak: sk.Tweak, Type: extractSqlInt16[asset.ScriptKeyType]( sk.KeyType, ), diff --git a/tapdb/assets_store.go b/tapdb/assets_store.go index 574cf2e3d..ade025a64 100644 --- a/tapdb/assets_store.go +++ b/tapdb/assets_store.go @@ -3148,7 +3148,7 @@ func (a *AssetStore) LogAnchorTxConfirm(ctx context.Context, out.OutputType == int16(tappsbt.TypeSplitRoot) isBurn := !isNumsKey && len(witnessData) > 0 && asset.IsBurnKey(scriptPubKey, witnessData[0]) - isKnown := fullScriptKey.DeclaredKnown + isKnown := fullScriptKey.Type != asset.ScriptKeyUnknown skipAssetCreation := !isTombstone && !isBurn && !out.ScriptKeyLocal && !isKnown diff --git a/tapdb/migrations.go b/tapdb/migrations.go index 763211aaf..8f13ec7ac 100644 --- a/tapdb/migrations.go +++ b/tapdb/migrations.go @@ -24,7 +24,7 @@ const ( // daemon. // // NOTE: This MUST be updated when a new migration is added. - LatestMigrationVersion = 33 + LatestMigrationVersion = 34 ) // DatabaseBackend is an interface that contains all methods our different diff --git a/tapdb/post_migration_checks.go b/tapdb/post_migration_checks.go index c9a48956e..b174a17e4 100644 --- a/tapdb/post_migration_checks.go +++ b/tapdb/post_migration_checks.go @@ -188,7 +188,6 @@ func detectScriptKeyType(ctx context.Context, q sqlc.Querier) error { InternalKeyID: k.InternalKey.KeyID, TweakedScriptKey: k.ScriptKey.TweakedScriptKey, Tweak: k.ScriptKey.Tweak, - DeclaredKnown: k.ScriptKey.DeclaredKnown, KeyType: sqlInt16(newType), }) if err != nil { diff --git a/tapdb/sqlc/addrs.sql.go b/tapdb/sqlc/addrs.sql.go index 1123a2b73..158033286 100644 --- a/tapdb/sqlc/addrs.sql.go +++ b/tapdb/sqlc/addrs.sql.go @@ -16,7 +16,7 @@ SELECT version, asset_version, genesis_asset_id, group_key, tapscript_sibling, taproot_output_key, amount, asset_type, creation_time, managed_from, proof_courier_addr, - script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, script_keys.key_type, + script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.key_type, raw_script_keys.key_id, raw_script_keys.raw_key, raw_script_keys.key_family, raw_script_keys.key_index, taproot_keys.raw_key AS raw_taproot_key, taproot_keys.key_family AS taproot_key_family, @@ -69,7 +69,6 @@ func (q *Queries) FetchAddrByTaprootOutputKey(ctx context.Context, taprootOutput &i.ScriptKey.InternalKeyID, &i.ScriptKey.TweakedScriptKey, &i.ScriptKey.Tweak, - &i.ScriptKey.DeclaredKnown, &i.ScriptKey.KeyType, &i.InternalKey.KeyID, &i.InternalKey.RawKey, @@ -203,7 +202,7 @@ SELECT version, asset_version, genesis_asset_id, group_key, tapscript_sibling, taproot_output_key, amount, asset_type, creation_time, managed_from, proof_courier_addr, - script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, script_keys.key_type, + script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.key_type, raw_script_keys.key_id, raw_script_keys.raw_key, raw_script_keys.key_family, raw_script_keys.key_index, taproot_keys.raw_key AS raw_taproot_key, taproot_keys.key_family AS taproot_key_family, @@ -281,7 +280,6 @@ func (q *Queries) FetchAddrs(ctx context.Context, arg FetchAddrsParams) ([]Fetch &i.ScriptKey.InternalKeyID, &i.ScriptKey.TweakedScriptKey, &i.ScriptKey.Tweak, - &i.ScriptKey.DeclaredKnown, &i.ScriptKey.KeyType, &i.InternalKey.KeyID, &i.InternalKey.RawKey, diff --git a/tapdb/sqlc/assets.sql.go b/tapdb/sqlc/assets.sql.go index 837dc0e51..0e2ff962d 100644 --- a/tapdb/sqlc/assets.sql.go +++ b/tapdb/sqlc/assets.sql.go @@ -973,7 +973,7 @@ WITH genesis_info AS ( ) SELECT version, - script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, script_keys.key_type, + script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.key_type, internal_keys.key_id, internal_keys.raw_key, internal_keys.key_family, internal_keys.key_index, key_group_info.tapscript_root, key_group_info.witness_stack, @@ -1042,7 +1042,6 @@ func (q *Queries) FetchAssetsForBatch(ctx context.Context, rawKey []byte) ([]Fet &i.ScriptKey.InternalKeyID, &i.ScriptKey.TweakedScriptKey, &i.ScriptKey.Tweak, - &i.ScriptKey.DeclaredKnown, &i.ScriptKey.KeyType, &i.InternalKey.KeyID, &i.InternalKey.RawKey, @@ -1671,7 +1670,7 @@ func (q *Queries) FetchMintingBatchesByInverseState(ctx context.Context, batchSt } const FetchScriptKeyByTweakedKey = `-- name: FetchScriptKeyByTweakedKey :one -SELECT script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, script_keys.key_type, internal_keys.key_id, internal_keys.raw_key, internal_keys.key_family, internal_keys.key_index +SELECT script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.key_type, internal_keys.key_id, internal_keys.raw_key, internal_keys.key_family, internal_keys.key_index FROM script_keys JOIN internal_keys ON script_keys.internal_key_id = internal_keys.key_id @@ -1691,7 +1690,6 @@ func (q *Queries) FetchScriptKeyByTweakedKey(ctx context.Context, tweakedScriptK &i.ScriptKey.InternalKeyID, &i.ScriptKey.TweakedScriptKey, &i.ScriptKey.Tweak, - &i.ScriptKey.DeclaredKnown, &i.ScriptKey.KeyType, &i.InternalKey.KeyID, &i.InternalKey.RawKey, @@ -1788,7 +1786,6 @@ SELECT seedling_id, asset_name, asset_type, asset_version, asset_supply, -- LEFT JOIN is actually necessary or if we always have keys for seedlings. script_keys.tweak AS script_key_tweak, script_keys.tweaked_script_key, - script_keys.declared_known AS script_key_declared_known, script_keys.key_type AS script_key_type, internal_keys.raw_key AS script_key_raw, internal_keys.key_family AS script_key_fam, @@ -1809,27 +1806,26 @@ WHERE asset_seedlings.batch_id in (SELECT batch_id FROM target_batch) ` type FetchSeedlingsForBatchRow struct { - SeedlingID int64 - AssetName string - AssetType int16 - AssetVersion int16 - AssetSupply int64 - AssetsMetum AssetsMetum - EmissionEnabled bool - BatchID int64 - GroupGenesisID sql.NullInt64 - GroupAnchorID sql.NullInt64 - GroupTapscriptRoot []byte - ScriptKeyTweak []byte - TweakedScriptKey []byte - ScriptKeyDeclaredKnown sql.NullBool - ScriptKeyType sql.NullInt16 - ScriptKeyRaw []byte - ScriptKeyFam sql.NullInt32 - ScriptKeyIndex sql.NullInt32 - GroupKeyRaw []byte - GroupKeyFam sql.NullInt32 - GroupKeyIndex sql.NullInt32 + SeedlingID int64 + AssetName string + AssetType int16 + AssetVersion int16 + AssetSupply int64 + AssetsMetum AssetsMetum + EmissionEnabled bool + BatchID int64 + GroupGenesisID sql.NullInt64 + GroupAnchorID sql.NullInt64 + GroupTapscriptRoot []byte + ScriptKeyTweak []byte + TweakedScriptKey []byte + ScriptKeyType sql.NullInt16 + ScriptKeyRaw []byte + ScriptKeyFam sql.NullInt32 + ScriptKeyIndex sql.NullInt32 + GroupKeyRaw []byte + GroupKeyFam sql.NullInt32 + GroupKeyIndex sql.NullInt32 } func (q *Queries) FetchSeedlingsForBatch(ctx context.Context, rawKey []byte) ([]FetchSeedlingsForBatchRow, error) { @@ -1862,7 +1858,6 @@ func (q *Queries) FetchSeedlingsForBatch(ctx context.Context, rawKey []byte) ([] &i.GroupTapscriptRoot, &i.ScriptKeyTweak, &i.TweakedScriptKey, - &i.ScriptKeyDeclaredKnown, &i.ScriptKeyType, &i.ScriptKeyRaw, &i.ScriptKeyFam, @@ -1933,7 +1928,7 @@ func (q *Queries) FetchTapscriptTree(ctx context.Context, rootHash []byte) ([]Fe } const FetchUnknownTypeScriptKeys = `-- name: FetchUnknownTypeScriptKeys :many -SELECT script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, script_keys.key_type, internal_keys.key_id, internal_keys.raw_key, internal_keys.key_family, internal_keys.key_index +SELECT script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.key_type, internal_keys.key_id, internal_keys.raw_key, internal_keys.key_family, internal_keys.key_index FROM script_keys JOIN internal_keys ON script_keys.internal_key_id = internal_keys.key_id @@ -1959,7 +1954,6 @@ func (q *Queries) FetchUnknownTypeScriptKeys(ctx context.Context) ([]FetchUnknow &i.ScriptKey.InternalKeyID, &i.ScriptKey.TweakedScriptKey, &i.ScriptKey.Tweak, - &i.ScriptKey.DeclaredKnown, &i.ScriptKey.KeyType, &i.InternalKey.KeyID, &i.InternalKey.RawKey, @@ -2349,7 +2343,7 @@ const QueryAssets = `-- name: QueryAssets :many SELECT assets.asset_id AS asset_primary_key, assets.genesis_id, assets.version, spent, - script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, script_keys.key_type, + script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.key_type, internal_keys.key_id, internal_keys.raw_key, internal_keys.key_family, internal_keys.key_index, key_group_info_view.tapscript_root, key_group_info_view.witness_stack, @@ -2522,7 +2516,6 @@ func (q *Queries) QueryAssets(ctx context.Context, arg QueryAssetsParams) ([]Que &i.ScriptKey.InternalKeyID, &i.ScriptKey.TweakedScriptKey, &i.ScriptKey.Tweak, - &i.ScriptKey.DeclaredKnown, &i.ScriptKey.KeyType, &i.InternalKey.KeyID, &i.InternalKey.RawKey, @@ -3083,22 +3076,14 @@ func (q *Queries) UpsertMintAnchorUniCommitment(ctx context.Context, arg UpsertM const UpsertScriptKey = `-- name: UpsertScriptKey :one INSERT INTO script_keys ( - internal_key_id, tweaked_script_key, tweak, declared_known, key_type + internal_key_id, tweaked_script_key, tweak, key_type ) VALUES ( - $1, $2, $3, $4, $5 + $1, $2, $3, $4 ) ON CONFLICT (tweaked_script_key) -- Overwrite the declared_known, key_type and tweak fields if they were -- previously unknown. DO UPDATE SET tweaked_script_key = EXCLUDED.tweaked_script_key, - -- If the script key was previously unknown, we'll update to the new - -- value, if that is non-NULL. - declared_known = - CASE - WHEN COALESCE(script_keys.declared_known, FALSE) = FALSE - THEN COALESCE(EXCLUDED.declared_known, script_keys.declared_known) - ELSE script_keys.declared_known - END, -- If the tweak was previously unknown, we'll update to the new value. tweak = CASE @@ -3121,7 +3106,6 @@ type UpsertScriptKeyParams struct { InternalKeyID int64 TweakedScriptKey []byte Tweak []byte - DeclaredKnown sql.NullBool KeyType sql.NullInt16 } @@ -3130,7 +3114,6 @@ func (q *Queries) UpsertScriptKey(ctx context.Context, arg UpsertScriptKeyParams arg.InternalKeyID, arg.TweakedScriptKey, arg.Tweak, - arg.DeclaredKnown, arg.KeyType, ) var script_key_id int64 diff --git a/tapdb/sqlc/migrations/000034_script_key_drop_declared_known.down.sql b/tapdb/sqlc/migrations/000034_script_key_drop_declared_known.down.sql new file mode 100644 index 000000000..e4ac3c55d --- /dev/null +++ b/tapdb/sqlc/migrations/000034_script_key_drop_declared_known.down.sql @@ -0,0 +1,2 @@ +ALTER TABLE script_keys ADD COLUMN declared_known BOOLEAN; + diff --git a/tapdb/sqlc/migrations/000034_script_key_drop_declared_known.up.sql b/tapdb/sqlc/migrations/000034_script_key_drop_declared_known.up.sql new file mode 100644 index 000000000..75b750825 --- /dev/null +++ b/tapdb/sqlc/migrations/000034_script_key_drop_declared_known.up.sql @@ -0,0 +1,3 @@ +-- The declared_known flag was just a workaround. Now that we have an actual +-- type, we don't need this flag anymore. +ALTER TABLE script_keys DROP COLUMN declared_known; diff --git a/tapdb/sqlc/models.go b/tapdb/sqlc/models.go index dfc401ba6..8f8ff9da3 100644 --- a/tapdb/sqlc/models.go +++ b/tapdb/sqlc/models.go @@ -343,7 +343,6 @@ type ScriptKey struct { InternalKeyID int64 TweakedScriptKey []byte Tweak []byte - DeclaredKnown sql.NullBool KeyType sql.NullInt16 } diff --git a/tapdb/sqlc/queries/assets.sql b/tapdb/sqlc/queries/assets.sql index 0b4fef04f..c5e46e7ea 100644 --- a/tapdb/sqlc/queries/assets.sql +++ b/tapdb/sqlc/queries/assets.sql @@ -140,7 +140,6 @@ SELECT seedling_id, asset_name, asset_type, asset_version, asset_supply, -- LEFT JOIN is actually necessary or if we always have keys for seedlings. script_keys.tweak AS script_key_tweak, script_keys.tweaked_script_key, - script_keys.declared_known AS script_key_declared_known, script_keys.key_type AS script_key_type, internal_keys.raw_key AS script_key_raw, internal_keys.key_family AS script_key_fam, @@ -865,22 +864,14 @@ WHERE txid = $1; -- name: UpsertScriptKey :one INSERT INTO script_keys ( - internal_key_id, tweaked_script_key, tweak, declared_known, key_type + internal_key_id, tweaked_script_key, tweak, key_type ) VALUES ( - $1, $2, $3, $4, $5 + $1, $2, $3, $4 ) ON CONFLICT (tweaked_script_key) -- Overwrite the declared_known, key_type and tweak fields if they were -- previously unknown. DO UPDATE SET tweaked_script_key = EXCLUDED.tweaked_script_key, - -- If the script key was previously unknown, we'll update to the new - -- value, if that is non-NULL. - declared_known = - CASE - WHEN COALESCE(script_keys.declared_known, FALSE) = FALSE - THEN COALESCE(EXCLUDED.declared_known, script_keys.declared_known) - ELSE script_keys.declared_known - END, -- If the tweak was previously unknown, we'll update to the new value. tweak = CASE diff --git a/tapdb/sqlc/schemas/generated_schema.sql b/tapdb/sqlc/schemas/generated_schema.sql index 05552cce2..0cf935a3f 100644 --- a/tapdb/sqlc/schemas/generated_schema.sql +++ b/tapdb/sqlc/schemas/generated_schema.sql @@ -716,7 +716,7 @@ CREATE TABLE script_keys ( -- An optional tweak for the script_key. If NULL, the raw_key may be -- tweaked BIP-0086 style. tweak BLOB -, declared_known BOOLEAN, key_type SMALLINT); +, key_type SMALLINT); CREATE INDEX status_idx ON addr_events(status); diff --git a/tapdb/sqlc/transfers.sql.go b/tapdb/sqlc/transfers.sql.go index 75a88ceb0..15977cd57 100644 --- a/tapdb/sqlc/transfers.sql.go +++ b/tapdb/sqlc/transfers.sql.go @@ -137,7 +137,7 @@ SELECT utxo_internal_keys.raw_key AS internal_key_raw_key_bytes, utxo_internal_keys.key_family AS internal_key_family, utxo_internal_keys.key_index AS internal_key_index, - script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.declared_known, script_keys.key_type, + script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.key_type, script_internal_keys.key_id, script_internal_keys.raw_key, script_internal_keys.key_family, script_internal_keys.key_index FROM asset_transfer_outputs outputs JOIN managed_utxos utxos @@ -221,7 +221,6 @@ func (q *Queries) FetchTransferOutputs(ctx context.Context, transferID int64) ([ &i.ScriptKey.InternalKeyID, &i.ScriptKey.TweakedScriptKey, &i.ScriptKey.Tweak, - &i.ScriptKey.DeclaredKnown, &i.ScriptKey.KeyType, &i.InternalKey.KeyID, &i.InternalKey.RawKey, From 7192221dad265f8807f3eda6996ad8e3d6f00307 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 3 Apr 2025 14:51:42 +0200 Subject: [PATCH 12/17] taprpc: add script key type to asset --- taprpc/marshal.go | 18 +- taprpc/taprootassets.pb.go | 1942 +++++++++++----------- taprpc/taprootassets.proto | 5 + taprpc/taprootassets.swagger.json | 8 +- taprpc/universerpc/universe.swagger.json | 21 +- 5 files changed, 1022 insertions(+), 972 deletions(-) diff --git a/taprpc/marshal.go b/taprpc/marshal.go index 6642cd2d6..d294321c3 100644 --- a/taprpc/marshal.go +++ b/taprpc/marshal.go @@ -581,11 +581,18 @@ func MarshalAsset(ctx context.Context, a *asset.Asset, isSpent, withWitness bool, keyRing KeyLookup, decDisplay fn.Option[uint32]) (*Asset, error) { - scriptKeyIsLocal := false - if a.ScriptKey.TweakedScriptKey != nil && keyRing != nil { - scriptKeyIsLocal = keyRing.IsLocalKey( - ctx, a.ScriptKey.RawKey, - ) + var ( + scriptKeyIsLocal = false + scriptKeyType = asset.ScriptKeyUnknown + ) + if a.ScriptKey.TweakedScriptKey != nil { + if keyRing != nil { + scriptKeyIsLocal = keyRing.IsLocalKey( + ctx, a.ScriptKey.RawKey, + ) + } + + scriptKeyType = a.ScriptKey.Type } assetVersion, err := MarshalAssetVersion(a.Version) @@ -607,6 +614,7 @@ func MarshalAsset(ctx context.Context, a *asset.Asset, ScriptKeyHasScriptPath: a.ScriptKey.HasScriptPath(), IsSpent: isSpent, IsBurn: a.IsBurn(), + ScriptKeyType: MarshalScriptKeyType(scriptKeyType), } decDisplay.WhenSome(func(u uint32) { diff --git a/taprpc/taprootassets.pb.go b/taprpc/taprootassets.pb.go index 8d004af90..760273678 100644 --- a/taprpc/taprootassets.pb.go +++ b/taprpc/taprootassets.pb.go @@ -1652,6 +1652,7 @@ type Asset struct { // Indicates whether this transfer was an asset burn. If true, the number of // assets in this output are destroyed and can no longer be spent. IsBurn bool `protobuf:"varint,17,opt,name=is_burn,json=isBurn,proto3" json:"is_burn,omitempty"` + // Deprecated, use script_key_type instead! // Indicates whether this script key has either been derived by the local // wallet or was explicitly declared to be known by using the // DeclareScriptKey RPC. Knowing the key conceptually means the key belongs @@ -1661,6 +1662,7 @@ type Asset struct { // this method returns true for a script key, it means the asset with the // script key will be shown in the wallet balance. ScriptKeyDeclaredKnown bool `protobuf:"varint,18,opt,name=script_key_declared_known,json=scriptKeyDeclaredKnown,proto3" json:"script_key_declared_known,omitempty"` + // Deprecated, use script_key_type instead! // Indicates whether the script key is known to have a Tapscript spend path, // meaning that the Taproot merkle root tweak is not empty. This will only // ever be true if either script_key_is_local or script_key_internals_known @@ -1672,6 +1674,8 @@ type Asset struct { // field is null, it means the presence of a decimal display field is // unknown in the current context. DecimalDisplay *DecimalDisplay `protobuf:"bytes,20,opt,name=decimal_display,json=decimalDisplay,proto3" json:"decimal_display,omitempty"` + // The user-declared type of the script key. + ScriptKeyType ScriptKeyType `protobuf:"varint,21,opt,name=script_key_type,json=scriptKeyType,proto3,enum=taprpc.ScriptKeyType" json:"script_key_type,omitempty"` } func (x *Asset) Reset() { @@ -1832,6 +1836,13 @@ func (x *Asset) GetDecimalDisplay() *DecimalDisplay { return nil } +func (x *Asset) GetScriptKeyType() ScriptKeyType { + if x != nil { + return x.ScriptKeyType + } + return ScriptKeyType_SCRIPT_KEY_UNKNOWN +} + type PrevWitness struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6699,7 +6710,7 @@ var file_taprootassets_proto_rawDesc = []byte{ 0x61, 0x6c, 0x22, 0x39, 0x0a, 0x0e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x64, - 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x22, 0xa1, 0x06, + 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x22, 0xe0, 0x06, 0x0a, 0x05, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x2e, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, @@ -6750,847 +6761,851 @@ var file_taprootassets_proto_rawDesc = []byte{ 0x6c, 0x61, 0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x52, 0x0e, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x22, 0xa1, 0x01, 0x0a, 0x0b, 0x50, 0x72, 0x65, 0x76, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, - 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x65, 0x76, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x70, 0x72, 0x65, 0x76, - 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x78, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, 0x74, 0x78, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, - 0x73, 0x12, 0x42, 0x0a, 0x10, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0f, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3f, 0x0a, 0x0f, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x0a, 0x72, 0x6f, 0x6f, 0x74, - 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x09, 0x72, 0x6f, 0x6f, - 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x22, 0x9c, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x06, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x73, 0x12, 0x33, 0x0a, 0x15, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, - 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x14, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x75, 0x6e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x6d, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x10, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, - 0x4d, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x39, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, - 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x64, - 0x22, 0xa9, 0x02, 0x0a, 0x0b, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, - 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x17, 0x0a, - 0x07, 0x61, 0x6d, 0x74, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, - 0x61, 0x6d, 0x74, 0x53, 0x61, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x61, 0x70, - 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, - 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x65, - 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x25, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, - 0x1f, 0x0a, 0x0b, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, - 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, - 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6c, 0x65, 0x61, - 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x79, 0x55, 0x6e, 0x69, 0x78, 0x22, 0xbb, 0x01, 0x0a, - 0x11, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x50, 0x0a, 0x0d, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x75, 0x74, - 0x78, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, - 0x74, 0x78, 0x6f, 0x73, 0x1a, 0x54, 0x0a, 0x11, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, - 0x74, 0x78, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x13, 0x0a, 0x11, 0x4c, 0x69, - 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x8d, 0x02, 0x0a, 0x12, 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x52, 0x65, - 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x72, - 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, - 0x65, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x6d, - 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x2e, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x43, 0x0a, 0x0d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, - 0x12, 0x32, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, - 0x75, 0x6d, 0x61, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x06, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x73, 0x22, 0xa6, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x1a, 0x50, 0x0a, 0x0b, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, - 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, - 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, - 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x25, - 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, - 0x65, 0x61, 0x73, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x62, - 0x79, 0x22, 0x62, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x12, 0x38, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x73, - 0x69, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x62, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x4a, 0x0a, 0x11, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x22, 0x90, 0x03, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x0e, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x73, 0x12, 0x66, 0x0a, 0x14, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x34, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x61, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x1a, 0x56, 0x0a, 0x12, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x60, 0x0a, 0x17, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x37, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, - 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, 0x22, 0x4c, 0x0a, - 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x0a, 0x09, 0x43, - 0x68, 0x61, 0x69, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x19, 0x0a, 0x08, - 0x68, 0x61, 0x73, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x68, 0x61, 0x73, 0x68, 0x53, 0x74, 0x72, 0x22, 0xb8, 0x03, 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x6e, 0x63, 0x68, - 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0c, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x31, - 0x0a, 0x15, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x5f, 0x68, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x61, - 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x48, 0x69, 0x6e, - 0x74, 0x12, 0x2f, 0x0a, 0x14, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x65, - 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, - 0x73, 0x12, 0x30, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x73, 0x12, 0x42, 0x0a, 0x14, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, - 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, - 0x48, 0x61, 0x73, 0x68, 0x52, 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x33, 0x0a, 0x16, 0x61, 0x6e, 0x63, 0x68, 0x6f, - 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, - 0x78, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x22, 0x84, 0x01, 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x6e, 0x63, 0x68, - 0x6f, 0x72, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, - 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xb2, 0x02, 0x0a, 0x14, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x41, 0x6e, 0x63, 0x68, - 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x61, 0x70, 0x72, 0x6f, - 0x6f, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, - 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x6b, - 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, 0x62, 0x6c, - 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x69, - 0x76, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x10, 0x6e, 0x75, 0x6d, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6b, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0xae, - 0x04, 0x0a, 0x0e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x12, 0x34, 0x0a, 0x06, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x52, - 0x06, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x13, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x49, 0x73, - 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, - 0x0e, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, - 0x6c, 0x6f, 0x62, 0x12, 0x33, 0x0a, 0x16, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x13, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x33, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, - 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x6f, 0x63, - 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, - 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x10, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x4c, 0x6f, 0x63, 0x6b, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x4f, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x13, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x22, - 0x0d, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x0e, - 0x0a, 0x0c, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, - 0x0a, 0x11, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x68, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x04, 0x73, 0x68, 0x6f, 0x77, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x65, 0x76, 0x65, 0x6c, - 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x65, 0x76, - 0x65, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x22, 0x35, 0x0a, 0x12, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, - 0x73, 0x75, 0x62, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x22, 0xe6, 0x03, - 0x0a, 0x04, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, - 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x0a, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, - 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, - 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x10, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, - 0x67, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x6f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, - 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4b, 0x65, 0x79, 0x12, - 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x63, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x43, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x39, 0x0a, - 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0f, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x8c, 0x01, 0x0a, 0x10, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, - 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x65, 0x66, 0x6f, - 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x37, 0x0a, 0x11, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, - 0x64, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x05, 0x61, 0x64, - 0x64, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x05, 0x61, 0x64, 0x64, 0x72, 0x73, 0x22, 0xfd, - 0x02, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, - 0x61, 0x6d, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x61, 0x6d, 0x74, 0x12, 0x30, - 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, - 0x12, 0x38, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x0b, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x61, - 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6f, 0x66, - 0x5f, 0x63, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x43, 0x6f, 0x75, 0x72, 0x69, 0x65, - 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x39, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x3c, 0x0a, 0x0f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x9e, - 0x01, 0x0a, 0x09, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, - 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, - 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x64, 0x65, 0x73, - 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x07, - 0x6b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x70, 0x5f, 0x74, - 0x77, 0x65, 0x61, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x74, 0x61, 0x70, 0x54, - 0x77, 0x65, 0x61, 0x6b, 0x12, 0x29, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, - 0x48, 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x1d, 0x0a, - 0x0a, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, - 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x08, 0x6b, 0x65, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x60, 0x0a, 0x0d, 0x4b, 0x65, 0x79, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x61, - 0x77, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0b, 0x72, 0x61, 0x77, 0x4b, 0x65, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2b, - 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x22, 0x43, 0x0a, 0x11, 0x54, - 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x54, 0x72, 0x65, 0x65, - 0x12, 0x2e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, - 0x70, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, - 0x22, 0x21, 0x0a, 0x07, 0x54, 0x61, 0x70, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x22, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x70, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x61, 0x70, 0x68, 0x61, 0x73, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6c, 0x65, 0x66, 0x74, 0x54, 0x61, 0x70, 0x68, - 0x61, 0x73, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x74, 0x61, 0x70, - 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x54, 0x61, 0x70, 0x68, 0x61, 0x73, 0x68, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x63, 0x6f, - 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, - 0x72, 0x22, 0x56, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, - 0x0a, 0x0e, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x66, 0x69, 0x6c, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x46, 0x69, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x65, 0x6e, - 0x65, 0x73, 0x69, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0xf6, 0x04, 0x0a, 0x0c, 0x44, 0x65, - 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x5f, 0x61, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x41, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, - 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x4f, 0x66, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x23, 0x0a, 0x05, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, - 0x32, 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0a, 0x6d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x76, - 0x65, 0x61, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x78, 0x5f, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, - 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x78, - 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x27, 0x0a, 0x0f, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, - 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0f, - 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, - 0x28, 0x0a, 0x10, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x73, 0x70, 0x6c, 0x69, 0x74, - 0x52, 0x6f, 0x6f, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x32, 0x0a, 0x15, 0x6e, 0x75, 0x6d, - 0x5f, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x41, 0x64, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x2b, 0x0a, - 0x11, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, - 0x73, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, - 0x6e, 0x67, 0x65, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, - 0x5f, 0x62, 0x75, 0x72, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x42, - 0x75, 0x72, 0x6e, 0x12, 0x3c, 0x0a, 0x0e, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x72, - 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x52, 0x65, 0x76, 0x65, - 0x61, 0x6c, 0x52, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x52, 0x65, 0x76, 0x65, 0x61, - 0x6c, 0x12, 0x40, 0x0a, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x72, - 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x76, - 0x65, 0x61, 0x6c, 0x52, 0x0e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x76, - 0x65, 0x61, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x74, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, - 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x61, 0x6c, 0x74, 0x4c, 0x65, 0x61, 0x76, - 0x65, 0x73, 0x22, 0x66, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, - 0x39, 0x0a, 0x0d, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0c, 0x64, 0x65, - 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xb1, 0x01, 0x0a, 0x12, 0x44, - 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, - 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x61, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x41, 0x74, 0x44, - 0x65, 0x70, 0x74, 0x68, 0x12, 0x2e, 0x0a, 0x13, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, - 0x76, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x11, 0x77, 0x69, 0x74, 0x68, 0x50, 0x72, 0x65, 0x76, 0x57, 0x69, 0x74, 0x6e, 0x65, - 0x73, 0x73, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, - 0x61, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, - 0x77, 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x22, 0x50, - 0x0a, 0x13, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, - 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x52, 0x0c, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x22, 0x7c, 0x0a, 0x12, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, - 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, - 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x3e, - 0x0a, 0x16, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x61, 0x77, 0x5f, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0c, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x38, - 0x0a, 0x17, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x61, 0x77, - 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, 0x72, - 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xd0, 0x02, 0x0a, 0x09, 0x41, 0x64, 0x64, - 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x1a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x78, 0x53, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, - 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, - 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x75, 0x74, 0x78, 0x6f, 0x5f, 0x61, 0x6d, 0x74, 0x5f, 0x73, - 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x75, 0x74, 0x78, 0x6f, 0x41, 0x6d, - 0x74, 0x53, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x5f, - 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x74, - 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x0a, - 0x13, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x68, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x68, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x74, 0x0a, 0x13, 0x41, - 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, - 0x64, 0x64, 0x72, 0x12, 0x3c, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x22, 0x41, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x22, 0x60, 0x0a, 0x10, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x70, 0x5f, - 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x70, - 0x41, 0x64, 0x64, 0x72, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x66, 0x65, 0x65, 0x52, 0x61, 0x74, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x85, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x65, 0x76, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x6e, 0x63, - 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x46, - 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x08, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x22, 0x10, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x9b, 0x02, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x6e, 0x64, 0x5f, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6c, 0x6e, 0x64, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x12, 0x2e, 0x0a, 0x13, 0x6c, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, - 0x6c, 0x6e, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x75, 0x62, 0x6b, 0x65, - 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, - 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x68, - 0x61, 0x69, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x54, - 0x6f, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x22, 0xa6, 0x01, 0x0a, 0x15, 0x46, 0x65, 0x74, 0x63, 0x68, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1b, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, - 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x48, 0x00, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0c, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x53, 0x74, 0x72, - 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x73, 0x74, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x48, - 0x61, 0x73, 0x68, 0x53, 0x74, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x22, - 0xc3, 0x01, 0x0a, 0x10, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x79, 0x12, 0x3d, 0x0a, 0x0f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x0d, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, + 0x22, 0xa1, 0x01, 0x0a, 0x0b, 0x50, 0x72, 0x65, 0x76, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, + 0x12, 0x2f, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x70, 0x72, 0x65, 0x76, 0x49, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x78, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, 0x74, 0x78, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, + 0x12, 0x42, 0x0a, 0x10, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x0f, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3f, 0x0a, 0x0f, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x0a, 0x72, 0x6f, 0x6f, 0x74, 0x5f, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x09, 0x72, 0x6f, 0x6f, 0x74, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x22, 0x9c, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x73, 0x12, 0x33, 0x0a, 0x15, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, + 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x14, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x75, 0x6e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x6d, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x10, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4d, + 0x69, 0x6e, 0x74, 0x73, 0x22, 0x39, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x22, + 0xa9, 0x02, 0x0a, 0x0b, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x12, + 0x1b, 0x0a, 0x09, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x61, 0x6d, 0x74, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, + 0x6d, 0x74, 0x53, 0x61, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x61, 0x70, 0x72, + 0x6f, 0x6f, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, + 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x65, 0x72, + 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x25, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x1f, + 0x0a, 0x0b, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, + 0x2a, 0x0a, 0x11, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, + 0x75, 0x6e, 0x69, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x79, 0x55, 0x6e, 0x69, 0x78, 0x22, 0xbb, 0x01, 0x0a, 0x11, + 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x50, 0x0a, 0x0d, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x75, 0x74, 0x78, + 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, + 0x78, 0x6f, 0x73, 0x1a, 0x54, 0x0a, 0x11, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, + 0x78, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x13, 0x0a, 0x11, 0x4c, 0x69, 0x73, + 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x8d, + 0x02, 0x0a, 0x12, 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x52, 0x65, 0x61, + 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, + 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2e, + 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x43, + 0x0a, 0x0d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, + 0x32, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, 0x75, + 0x6d, 0x61, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x06, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x73, 0x22, 0xa6, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x1a, 0x50, 0x0a, 0x0b, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, + 0x13, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, - 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x73, 0x74, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x49, 0x64, 0x53, 0x74, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, - 0x74, 0x6f, 0x5f, 0x62, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x78, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x42, 0x07, 0x0a, 0x05, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x11, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0d, 0x62, - 0x75, 0x72, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x0c, 0x62, 0x75, 0x72, 0x6e, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x33, 0x0a, 0x0a, 0x62, 0x75, 0x72, 0x6e, 0x5f, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x52, 0x09, 0x62, 0x75, 0x72, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x7a, 0x0a, 0x10, - 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, + 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, + 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, + 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x25, 0x0a, + 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x65, + 0x61, 0x73, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x62, 0x79, + 0x22, 0x62, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x12, 0x38, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x22, 0x4a, 0x0a, 0x11, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x22, 0x90, 0x03, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x0e, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x73, 0x12, 0x66, 0x0a, 0x14, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x34, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x61, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x1a, 0x56, 0x0a, 0x12, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x60, 0x0a, 0x17, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x37, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, + 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, 0x22, 0x4c, 0x0a, 0x15, + 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, + 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x0a, 0x09, 0x43, 0x68, + 0x61, 0x69, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x68, + 0x61, 0x73, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, + 0x61, 0x73, 0x68, 0x53, 0x74, 0x72, 0x22, 0xb8, 0x03, 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x6e, 0x63, 0x68, 0x6f, + 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0c, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x31, 0x0a, + 0x15, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x5f, 0x68, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x61, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x48, 0x69, 0x6e, 0x74, + 0x12, 0x2f, 0x0a, 0x14, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, + 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x65, 0x65, + 0x73, 0x12, 0x2d, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, + 0x12, 0x30, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x73, 0x12, 0x42, 0x0a, 0x14, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x48, + 0x61, 0x73, 0x68, 0x52, 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x33, 0x0a, 0x16, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, + 0x5f, 0x74, 0x78, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x22, 0x84, 0x01, 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, + 0x72, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, + 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xb2, 0x02, 0x0a, 0x14, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x41, 0x6e, 0x63, 0x68, 0x6f, + 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, + 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x72, + 0x6f, 0x6f, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x6b, 0x6c, + 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x10, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, + 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, + 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, + 0x6e, 0x75, 0x6d, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, + 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6b, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0xae, 0x04, + 0x0a, 0x0e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x12, 0x34, 0x0a, 0x06, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x52, 0x06, + 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x13, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, + 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x10, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x49, 0x73, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, + 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x6c, + 0x6f, 0x62, 0x12, 0x33, 0x0a, 0x16, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x13, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, + 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x33, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0d, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x10, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x4f, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x13, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x22, 0x0d, + 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x0e, 0x0a, + 0x0c, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x0a, + 0x11, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x68, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x04, 0x73, 0x68, 0x6f, 0x77, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, + 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x65, 0x76, 0x65, + 0x6c, 0x53, 0x70, 0x65, 0x63, 0x22, 0x35, 0x0a, 0x12, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, + 0x75, 0x62, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x73, 0x75, 0x62, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x22, 0xe6, 0x03, 0x0a, + 0x04, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x12, + 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x0a, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, + 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, + 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x4b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, + 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, + 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, + 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x2c, + 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x63, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x43, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x39, 0x0a, 0x0d, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x8c, 0x01, 0x0a, 0x10, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, + 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, + 0x25, 0x0a, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x22, 0x37, 0x0a, 0x11, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x05, 0x61, 0x64, 0x64, + 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x05, 0x61, 0x64, 0x64, 0x72, 0x73, 0x22, 0xfd, 0x02, + 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, - 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, - 0x72, 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x6e, - 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, 0x22, 0x9f, 0x01, 0x0a, 0x09, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, - 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0f, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, - 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, - 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, - 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, 0x22, 0x3c, 0x0a, 0x11, 0x4c, 0x69, - 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x27, 0x0a, 0x05, 0x62, 0x75, 0x72, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x75, 0x72, - 0x6e, 0x52, 0x05, 0x62, 0x75, 0x72, 0x6e, 0x73, 0x22, 0x41, 0x0a, 0x08, 0x4f, 0x75, 0x74, 0x50, - 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x74, 0x78, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x69, 0x0a, 0x1d, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x27, 0x0a, - 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xe8, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x63, 0x65, 0x69, - 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 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, 0x26, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x41, 0x64, 0x64, 0x72, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, - 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, + 0x6d, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x61, 0x6d, 0x74, 0x12, 0x30, 0x0a, + 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, + 0x38, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4b, + 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x0b, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x61, 0x70, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, + 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, + 0x63, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x43, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, + 0x41, 0x64, 0x64, 0x72, 0x12, 0x39, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x3c, 0x0a, 0x0f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x9e, 0x01, + 0x0a, 0x09, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x70, + 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x75, + 0x62, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x64, 0x65, 0x73, 0x63, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x07, 0x6b, + 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x70, 0x5f, 0x74, 0x77, + 0x65, 0x61, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x74, 0x61, 0x70, 0x54, 0x77, + 0x65, 0x61, 0x6b, 0x12, 0x29, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x48, + 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, + 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x6b, 0x65, 0x79, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x6b, + 0x65, 0x79, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x6b, 0x65, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x60, 0x0a, 0x0d, 0x4b, 0x65, 0x79, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x61, 0x77, + 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0b, 0x72, 0x61, 0x77, 0x4b, 0x65, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2b, 0x0a, + 0x07, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x74, + 0x6f, 0x72, 0x52, 0x06, 0x6b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x22, 0x43, 0x0a, 0x11, 0x54, 0x61, + 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x54, 0x72, 0x65, 0x65, 0x12, + 0x2e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, 0x70, + 0x4c, 0x65, 0x61, 0x66, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x22, + 0x21, 0x0a, 0x07, 0x54, 0x61, 0x70, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x22, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x70, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, + 0x21, 0x0a, 0x0c, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x61, 0x70, 0x68, 0x61, 0x73, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6c, 0x65, 0x66, 0x74, 0x54, 0x61, 0x70, 0x68, 0x61, + 0x73, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x74, 0x61, 0x70, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x54, 0x61, 0x70, 0x68, 0x61, 0x73, 0x68, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x63, 0x6f, 0x64, + 0x65, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, + 0x22, 0x56, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, + 0x0e, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, + 0x69, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, + 0x73, 0x69, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0xf6, 0x04, 0x0a, 0x0c, 0x44, 0x65, 0x63, + 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x72, 0x6f, + 0x6f, 0x66, 0x5f, 0x61, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x41, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x12, + 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, 0x6f, + 0x6f, 0x66, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x4f, 0x66, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x23, 0x0a, 0x05, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x32, + 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0a, 0x6d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x76, 0x65, + 0x61, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x78, 0x5f, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x78, 0x4d, + 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0f, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x28, + 0x0a, 0x10, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x6f, + 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x52, + 0x6f, 0x6f, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x32, 0x0a, 0x15, 0x6e, 0x75, 0x6d, 0x5f, + 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x41, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, + 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, + 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, + 0x67, 0x65, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, + 0x62, 0x75, 0x72, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x42, 0x75, + 0x72, 0x6e, 0x12, 0x3c, 0x0a, 0x0e, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x72, 0x65, + 0x76, 0x65, 0x61, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x52, 0x65, 0x76, 0x65, 0x61, + 0x6c, 0x52, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, + 0x12, 0x40, 0x0a, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x65, + 0x76, 0x65, 0x61, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x76, 0x65, + 0x61, 0x6c, 0x52, 0x0e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x76, 0x65, + 0x61, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x74, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x61, 0x6c, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, + 0x73, 0x22, 0x66, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x39, + 0x0a, 0x0d, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, + 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0c, 0x64, 0x65, 0x63, + 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xb1, 0x01, 0x0a, 0x12, 0x44, 0x65, + 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, + 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x61, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x41, 0x74, 0x44, 0x65, + 0x70, 0x74, 0x68, 0x12, 0x2e, 0x0a, 0x13, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x11, 0x77, 0x69, 0x74, 0x68, 0x50, 0x72, 0x65, 0x76, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x61, + 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x77, + 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x22, 0x50, 0x0a, + 0x13, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x5f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x52, 0x0c, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, + 0x7c, 0x0a, 0x12, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, + 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, + 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x3e, 0x0a, + 0x16, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x61, 0x77, 0x5f, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0c, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x38, 0x0a, + 0x17, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x61, 0x77, 0x5f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, 0x72, 0x61, + 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xd0, 0x02, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x72, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x1a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x78, 0x53, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, + 0x61, 0x64, 0x64, 0x72, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, + 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x75, 0x74, 0x78, 0x6f, 0x5f, 0x61, 0x6d, 0x74, 0x5f, 0x73, 0x61, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x75, 0x74, 0x78, 0x6f, 0x41, 0x6d, 0x74, + 0x53, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x73, + 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x74, 0x61, + 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x0a, 0x13, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x68, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x68, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x74, 0x0a, 0x13, 0x41, 0x64, + 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, 0x64, + 0x64, 0x72, 0x12, 0x3c, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x22, 0x6b, 0x0a, 0x1a, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, - 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2a, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0xc4, - 0x03, 0x0a, 0x09, 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 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, 0x1d, 0x0a, 0x0a, 0x73, 0x65, - 0x6e, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x73, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x0b, 0x70, 0x61, 0x72, - 0x63, 0x65, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, - 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, - 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, - 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x69, - 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x0c, 0x52, 0x0e, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x61, 0x63, 0x6b, - 0x65, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x76, - 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x0c, 0x52, 0x15, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x56, 0x69, 0x72, - 0x74, 0x75, 0x61, 0x6c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x48, 0x0a, 0x12, 0x61, - 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x08, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x25, - 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x97, 0x02, 0x0a, 0x11, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, - 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x73, 0x62, 0x74, 0x12, 0x2e, 0x0a, 0x13, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x26, 0x0a, 0x0f, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x73, 0x61, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x65, 0x65, 0x73, - 0x53, 0x61, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x16, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, - 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x61, 0x74, 0x5f, 0x6b, 0x77, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x65, 0x65, 0x52, - 0x61, 0x74, 0x65, 0x53, 0x61, 0x74, 0x4b, 0x77, 0x12, 0x3a, 0x0a, 0x10, 0x6c, 0x6e, 0x64, 0x5f, - 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x75, 0x74, 0x78, 0x6f, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, - 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x6c, 0x6e, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x55, - 0x74, 0x78, 0x6f, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x78, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x54, 0x78, 0x22, - 0x9e, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, - 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, - 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x22, 0x54, 0x0a, 0x18, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x10, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x0f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x2a, 0x28, 0x0a, 0x09, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, - 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4c, 0x4c, 0x45, 0x43, 0x54, 0x49, 0x42, 0x4c, 0x45, 0x10, 0x01, - 0x2a, 0x39, 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, - 0x50, 0x41, 0x51, 0x55, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x45, 0x54, 0x41, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x01, 0x2a, 0x3a, 0x0a, 0x0c, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x10, 0x41, - 0x53, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x30, 0x10, - 0x00, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, - 0x4f, 0x4e, 0x5f, 0x56, 0x31, 0x10, 0x01, 0x2a, 0x52, 0x0a, 0x0a, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4d, 0x50, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x1a, 0x0a, - 0x16, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x50, 0x4c, - 0x49, 0x54, 0x5f, 0x52, 0x4f, 0x4f, 0x54, 0x10, 0x01, 0x22, 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, - 0x04, 0x08, 0x03, 0x10, 0x03, 0x22, 0x04, 0x08, 0x04, 0x10, 0x04, 0x2a, 0x86, 0x01, 0x0a, 0x13, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x28, 0x0a, 0x24, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x44, 0x45, 0x4c, - 0x49, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, - 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x22, 0x0a, - 0x1e, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x44, 0x45, 0x4c, 0x49, 0x56, 0x45, 0x52, 0x59, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, - 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x44, 0x45, 0x4c, 0x49, 0x56, - 0x45, 0x52, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, - 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x55, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x72, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x56, 0x45, 0x52, 0x53, - 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, - 0x4e, 0x5f, 0x56, 0x30, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x56, - 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x31, 0x10, 0x02, 0x2a, 0xa9, 0x01, 0x0a, 0x0d, - 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, - 0x12, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, - 0x4b, 0x45, 0x59, 0x5f, 0x42, 0x49, 0x50, 0x38, 0x36, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x53, - 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, - 0x5f, 0x50, 0x41, 0x54, 0x48, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x02, - 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x42, - 0x55, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, - 0x4b, 0x45, 0x59, 0x5f, 0x54, 0x4f, 0x4d, 0x42, 0x53, 0x54, 0x4f, 0x4e, 0x45, 0x10, 0x04, 0x12, - 0x16, 0x0a, 0x12, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x43, 0x48, - 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x10, 0x05, 0x2a, 0xd0, 0x01, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x72, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x19, 0x41, - 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x2a, 0x0a, 0x26, 0x41, 0x44, + 0x75, 0x73, 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x22, 0x41, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x22, 0x60, 0x0a, 0x10, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x70, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x70, 0x41, + 0x64, 0x64, 0x72, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x66, 0x65, 0x65, 0x52, 0x61, 0x74, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x85, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x65, 0x76, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x6e, 0x63, 0x68, + 0x6f, 0x72, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x46, 0x0a, + 0x11, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x31, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x08, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x22, 0x10, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x9b, 0x02, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x6e, 0x64, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6c, 0x6e, 0x64, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x12, 0x2e, 0x0a, 0x13, 0x6c, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6c, + 0x6e, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, + 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, + 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, + 0x68, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x6f, + 0x43, 0x68, 0x61, 0x69, 0x6e, 0x22, 0xa6, 0x01, 0x0a, 0x15, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1b, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x09, + 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, + 0x00, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x53, 0x74, 0x72, 0x12, + 0x24, 0x0a, 0x0d, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x73, 0x74, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, + 0x73, 0x68, 0x53, 0x74, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x22, 0xc3, + 0x01, 0x0a, 0x10, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, + 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x73, 0x74, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, + 0x64, 0x53, 0x74, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, + 0x6f, 0x5f, 0x62, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x11, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0d, 0x62, 0x75, + 0x72, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x0c, 0x62, 0x75, 0x72, 0x6e, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x33, 0x0a, 0x0a, 0x62, 0x75, 0x72, 0x6e, 0x5f, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x09, 0x62, 0x75, 0x72, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x7a, 0x0a, 0x10, 0x4c, + 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x77, + 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, + 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x6e, 0x63, + 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, 0x22, 0x9f, 0x01, 0x0a, 0x09, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0f, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, + 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, + 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, + 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, 0x22, 0x3c, 0x0a, 0x11, 0x4c, 0x69, 0x73, + 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, + 0x0a, 0x05, 0x62, 0x75, 0x72, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x75, 0x72, 0x6e, + 0x52, 0x05, 0x62, 0x75, 0x72, 0x6e, 0x73, 0x22, 0x41, 0x0a, 0x08, 0x4f, 0x75, 0x74, 0x50, 0x6f, + 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x04, 0x74, 0x78, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x69, 0x0a, 0x1d, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x27, 0x0a, 0x0f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xe8, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 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, 0x26, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, + 0x64, 0x64, 0x72, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, + 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0x6b, 0x0a, 0x1a, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x6e, + 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, + 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0xc4, 0x03, + 0x0a, 0x09, 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 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, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x6e, + 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, + 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x63, + 0x65, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, + 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x09, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x69, 0x72, + 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0c, 0x52, 0x0e, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x76, 0x69, + 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0c, 0x52, 0x15, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x56, 0x69, 0x72, 0x74, + 0x75, 0x61, 0x6c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x48, 0x0a, 0x12, 0x61, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x08, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x25, 0x0a, + 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x22, 0x97, 0x02, 0x0a, 0x11, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x73, 0x62, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x26, 0x0a, 0x0f, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x73, 0x61, 0x74, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x65, 0x65, 0x73, 0x53, + 0x61, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x16, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x65, + 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x61, 0x74, 0x5f, 0x6b, 0x77, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x65, 0x65, 0x52, 0x61, + 0x74, 0x65, 0x53, 0x61, 0x74, 0x4b, 0x77, 0x12, 0x3a, 0x0a, 0x10, 0x6c, 0x6e, 0x64, 0x5f, 0x6c, + 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x75, 0x74, 0x78, 0x6f, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, + 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x6c, 0x6e, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x55, 0x74, + 0x78, 0x6f, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x78, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x54, 0x78, 0x22, 0x9e, + 0x01, 0x0a, 0x17, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, + 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, + 0x79, 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, + 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, + 0x54, 0x0a, 0x18, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x10, 0x72, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x52, 0x0f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x2a, 0x28, 0x0a, 0x09, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x0f, + 0x0a, 0x0b, 0x43, 0x4f, 0x4c, 0x4c, 0x45, 0x43, 0x54, 0x49, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x2a, + 0x39, 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x50, + 0x41, 0x51, 0x55, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x01, 0x2a, 0x3a, 0x0a, 0x0c, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x53, + 0x53, 0x45, 0x54, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x30, 0x10, 0x00, + 0x12, 0x14, 0x0a, 0x10, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, + 0x4e, 0x5f, 0x56, 0x31, 0x10, 0x01, 0x2a, 0x52, 0x0a, 0x0a, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4d, 0x50, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, + 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x50, 0x4c, 0x49, + 0x54, 0x5f, 0x52, 0x4f, 0x4f, 0x54, 0x10, 0x01, 0x22, 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, 0x04, + 0x08, 0x03, 0x10, 0x03, 0x22, 0x04, 0x08, 0x04, 0x10, 0x04, 0x2a, 0x86, 0x01, 0x0a, 0x13, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x28, 0x0a, 0x24, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x44, 0x45, 0x4c, 0x49, + 0x56, 0x45, 0x52, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, + 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x22, 0x0a, 0x1e, + 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x44, 0x45, 0x4c, 0x49, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01, + 0x12, 0x21, 0x0a, 0x1d, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x44, 0x45, 0x4c, 0x49, 0x56, 0x45, + 0x52, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, + 0x47, 0x10, 0x02, 0x2a, 0x55, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, + 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, + 0x5f, 0x56, 0x30, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x56, 0x45, + 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x31, 0x10, 0x02, 0x2a, 0xa9, 0x01, 0x0a, 0x0d, 0x53, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, + 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, + 0x57, 0x4e, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, + 0x45, 0x59, 0x5f, 0x42, 0x49, 0x50, 0x38, 0x36, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x43, + 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, + 0x50, 0x41, 0x54, 0x48, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x02, 0x12, + 0x13, 0x0a, 0x0f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x42, 0x55, + 0x52, 0x4e, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, + 0x45, 0x59, 0x5f, 0x54, 0x4f, 0x4d, 0x42, 0x53, 0x54, 0x4f, 0x4e, 0x45, 0x10, 0x04, 0x12, 0x16, + 0x0a, 0x12, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x43, 0x48, 0x41, + 0x4e, 0x4e, 0x45, 0x4c, 0x10, 0x05, 0x2a, 0xd0, 0x01, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x72, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x54, 0x45, - 0x43, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x52, 0x41, 0x4e, - 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, - 0x44, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x52, - 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x44, 0x44, - 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, - 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x04, 0x2a, 0x9b, 0x02, 0x0a, 0x09, 0x53, - 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x45, 0x4e, 0x44, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x56, 0x49, 0x52, 0x54, 0x55, 0x41, 0x4c, 0x5f, 0x49, - 0x4e, 0x50, 0x55, 0x54, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x10, 0x00, 0x12, 0x1b, 0x0a, - 0x17, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x56, 0x49, 0x52, 0x54, - 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x45, - 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x4e, 0x43, 0x48, 0x4f, 0x52, 0x5f, - 0x53, 0x49, 0x47, 0x4e, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x4d, - 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x5f, 0x42, 0x52, 0x4f, 0x41, 0x44, 0x43, 0x41, 0x53, 0x54, 0x10, 0x04, 0x12, - 0x20, 0x0a, 0x1c, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x57, 0x41, - 0x49, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, - 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, - 0x53, 0x54, 0x4f, 0x52, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x53, 0x10, 0x06, 0x12, 0x1e, - 0x0a, 0x1a, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x52, 0x41, - 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x53, 0x10, 0x07, 0x12, 0x18, - 0x0a, 0x14, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4d, - 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x08, 0x2a, 0x78, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x63, - 0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, - 0x1a, 0x0a, 0x16, 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, - 0x52, 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x50, - 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, - 0x4e, 0x47, 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x45, 0x5f, 0x41, 0x4e, 0x43, 0x48, 0x4f, 0x52, 0x45, 0x44, - 0x10, 0x03, 0x32, 0xc5, 0x0c, 0x0a, 0x0d, 0x54, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, - 0x74, 0x78, 0x6f, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, - 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x4c, 0x69, 0x73, - 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, - 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x1b, - 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0a, 0x53, 0x74, 0x6f, 0x70, 0x44, - 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x12, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, - 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x43, 0x0a, 0x0a, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, - 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, - 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, - 0x64, 0x72, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x4e, 0x65, 0x77, 0x41, - 0x64, 0x64, 0x72, 0x12, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4e, 0x65, 0x77, - 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x35, 0x0a, 0x0a, 0x44, 0x65, 0x63, - 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, - 0x12, 0x49, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, - 0x12, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, - 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x11, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x1b, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x44, 0x65, - 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, - 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0b, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x12, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, - 0x12, 0x52, 0x0a, 0x0f, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, - 0x69, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x70, - 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x70, - 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x2a, 0x0a, 0x26, 0x41, 0x44, 0x44, + 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, + 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, + 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, + 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, + 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x52, 0x45, + 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x44, 0x44, 0x52, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, + 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x04, 0x2a, 0x9b, 0x02, 0x0a, 0x09, 0x53, 0x65, + 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x45, 0x4e, 0x44, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x56, 0x49, 0x52, 0x54, 0x55, 0x41, 0x4c, 0x5f, 0x49, 0x4e, + 0x50, 0x55, 0x54, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, + 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x56, 0x49, 0x52, 0x54, 0x55, + 0x41, 0x4c, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x45, 0x4e, + 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x4e, 0x43, 0x48, 0x4f, 0x52, 0x5f, 0x53, + 0x49, 0x47, 0x4e, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x45, 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x4d, 0x45, + 0x4e, 0x54, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x42, 0x52, 0x4f, 0x41, 0x44, 0x43, 0x41, 0x53, 0x54, 0x10, 0x04, 0x12, 0x20, + 0x0a, 0x1c, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x57, 0x41, 0x49, + 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, + 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, + 0x54, 0x4f, 0x52, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x53, 0x10, 0x06, 0x12, 0x1e, 0x0a, + 0x1a, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, + 0x53, 0x46, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x53, 0x10, 0x07, 0x12, 0x18, 0x0a, + 0x14, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x50, + 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x08, 0x2a, 0x78, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x63, 0x65, + 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x1a, + 0x0a, 0x16, 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, + 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x41, + 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, + 0x47, 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x50, 0x52, 0x45, 0x5f, 0x41, 0x4e, 0x43, 0x48, 0x4f, 0x52, 0x45, 0x44, 0x10, + 0x03, 0x32, 0xc5, 0x0c, 0x0a, 0x0d, 0x54, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x75, 0x72, - 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, - 0x42, 0x75, 0x72, 0x6e, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, - 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x47, 0x65, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x57, 0x0a, 0x16, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x30, 0x01, 0x12, 0x4e, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x6e, - 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, - 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x30, 0x01, 0x12, 0x55, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, + 0x78, 0x6f, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, + 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x1b, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0a, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x61, + 0x65, 0x6d, 0x6f, 0x6e, 0x12, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, + 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x43, 0x0a, 0x0a, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, + 0x72, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x4e, 0x65, 0x77, 0x41, 0x64, + 0x64, 0x72, 0x12, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4e, 0x65, 0x77, 0x41, + 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x35, 0x0a, 0x0a, 0x44, 0x65, 0x63, 0x6f, + 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x12, + 0x49, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x12, + 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, + 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x1b, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x44, 0x65, 0x63, + 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, + 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3c, 0x0a, 0x0b, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x12, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x12, + 0x52, 0x0a, 0x0f, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, + 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x75, 0x72, 0x6e, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x42, + 0x75, 0x72, 0x6e, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x47, 0x65, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x57, 0x0a, 0x16, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x30, 0x01, 0x12, 0x4e, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, + 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x6e, 0x64, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x30, 0x01, 0x12, 0x55, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, - 0x6e, 0x67, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, + 0x67, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -7704,133 +7719,134 @@ var file_taprootassets_proto_goTypes = []any{ nil, // 93: taprpc.ListBalancesResponse.AssetGroupBalancesEntry } var file_taprootassets_proto_depIdxs = []int32{ - 1, // 0: taprpc.AssetMeta.type:type_name -> taprpc.AssetMetaType - 53, // 1: taprpc.ListAssetRequest.script_key:type_name -> taprpc.ScriptKey - 82, // 2: taprpc.ListAssetRequest.anchor_outpoint:type_name -> taprpc.OutPoint - 0, // 3: taprpc.GenesisInfo.asset_type:type_name -> taprpc.AssetType - 55, // 4: taprpc.GroupKeyRequest.raw_key:type_name -> taprpc.KeyDescriptor - 13, // 5: taprpc.GroupKeyRequest.anchor_genesis:type_name -> taprpc.GenesisInfo - 14, // 6: taprpc.GroupKeyRequest.external_key:type_name -> taprpc.ExternalKey - 16, // 7: taprpc.GroupVirtualTx.prev_out:type_name -> taprpc.TxOut - 13, // 8: taprpc.GenesisReveal.genesis_base_reveal:type_name -> taprpc.GenesisInfo - 2, // 9: taprpc.Asset.version:type_name -> taprpc.AssetVersion - 13, // 10: taprpc.Asset.asset_genesis:type_name -> taprpc.GenesisInfo - 19, // 11: taprpc.Asset.asset_group:type_name -> taprpc.AssetGroup - 12, // 12: taprpc.Asset.chain_anchor:type_name -> taprpc.AnchorInfo - 24, // 13: taprpc.Asset.prev_witnesses:type_name -> taprpc.PrevWitness - 22, // 14: taprpc.Asset.decimal_display:type_name -> taprpc.DecimalDisplay - 72, // 15: taprpc.PrevWitness.prev_id:type_name -> taprpc.PrevInputAsset - 25, // 16: taprpc.PrevWitness.split_commitment:type_name -> taprpc.SplitCommitment - 23, // 17: taprpc.SplitCommitment.root_asset:type_name -> taprpc.Asset - 23, // 18: taprpc.ListAssetResponse.assets:type_name -> taprpc.Asset - 23, // 19: taprpc.ManagedUtxo.assets:type_name -> taprpc.Asset - 90, // 20: taprpc.ListUtxosResponse.managed_utxos:type_name -> taprpc.ListUtxosResponse.ManagedUtxosEntry - 0, // 21: taprpc.AssetHumanReadable.type:type_name -> taprpc.AssetType - 2, // 22: taprpc.AssetHumanReadable.version:type_name -> taprpc.AssetVersion - 31, // 23: taprpc.GroupedAssets.assets:type_name -> taprpc.AssetHumanReadable - 91, // 24: taprpc.ListGroupsResponse.groups:type_name -> taprpc.ListGroupsResponse.GroupsEntry - 13, // 25: taprpc.AssetBalance.asset_genesis:type_name -> taprpc.GenesisInfo - 92, // 26: taprpc.ListBalancesResponse.asset_balances:type_name -> taprpc.ListBalancesResponse.AssetBalancesEntry - 93, // 27: taprpc.ListBalancesResponse.asset_group_balances:type_name -> taprpc.ListBalancesResponse.AssetGroupBalancesEntry - 41, // 28: taprpc.ListTransfersResponse.transfers:type_name -> taprpc.AssetTransfer - 42, // 29: taprpc.AssetTransfer.inputs:type_name -> taprpc.TransferInput - 44, // 30: taprpc.AssetTransfer.outputs:type_name -> taprpc.TransferOutput - 40, // 31: taprpc.AssetTransfer.anchor_tx_block_hash:type_name -> taprpc.ChainHash - 43, // 32: taprpc.TransferOutput.anchor:type_name -> taprpc.TransferOutputAnchor - 3, // 33: taprpc.TransferOutput.output_type:type_name -> taprpc.OutputType - 2, // 34: taprpc.TransferOutput.asset_version:type_name -> taprpc.AssetVersion - 4, // 35: taprpc.TransferOutput.proof_delivery_status:type_name -> taprpc.ProofDeliveryStatus - 0, // 36: taprpc.Addr.asset_type:type_name -> taprpc.AssetType - 2, // 37: taprpc.Addr.asset_version:type_name -> taprpc.AssetVersion - 5, // 38: taprpc.Addr.address_version:type_name -> taprpc.AddrVersion - 49, // 39: taprpc.QueryAddrResponse.addrs:type_name -> taprpc.Addr - 53, // 40: taprpc.NewAddrRequest.script_key:type_name -> taprpc.ScriptKey - 55, // 41: taprpc.NewAddrRequest.internal_key:type_name -> taprpc.KeyDescriptor - 2, // 42: taprpc.NewAddrRequest.asset_version:type_name -> taprpc.AssetVersion - 5, // 43: taprpc.NewAddrRequest.address_version:type_name -> taprpc.AddrVersion - 55, // 44: taprpc.ScriptKey.key_desc:type_name -> taprpc.KeyDescriptor - 6, // 45: taprpc.ScriptKey.type:type_name -> taprpc.ScriptKeyType - 54, // 46: taprpc.KeyDescriptor.key_loc:type_name -> taprpc.KeyLocator - 57, // 47: taprpc.TapscriptFullTree.all_leaves:type_name -> taprpc.TapLeaf - 23, // 48: taprpc.DecodedProof.asset:type_name -> taprpc.Asset - 10, // 49: taprpc.DecodedProof.meta_reveal:type_name -> taprpc.AssetMeta - 21, // 50: taprpc.DecodedProof.genesis_reveal:type_name -> taprpc.GenesisReveal - 20, // 51: taprpc.DecodedProof.group_key_reveal:type_name -> taprpc.GroupKeyReveal - 61, // 52: taprpc.VerifyProofResponse.decoded_proof:type_name -> taprpc.DecodedProof - 61, // 53: taprpc.DecodeProofResponse.decoded_proof:type_name -> taprpc.DecodedProof - 82, // 54: taprpc.ExportProofRequest.outpoint:type_name -> taprpc.OutPoint - 49, // 55: taprpc.AddrEvent.addr:type_name -> taprpc.Addr - 7, // 56: taprpc.AddrEvent.status:type_name -> taprpc.AddrEventStatus - 7, // 57: taprpc.AddrReceivesRequest.filter_status:type_name -> taprpc.AddrEventStatus - 68, // 58: taprpc.AddrReceivesResponse.events:type_name -> taprpc.AddrEvent - 41, // 59: taprpc.SendAssetResponse.transfer:type_name -> taprpc.AssetTransfer - 41, // 60: taprpc.BurnAssetResponse.burn_transfer:type_name -> taprpc.AssetTransfer - 61, // 61: taprpc.BurnAssetResponse.burn_proof:type_name -> taprpc.DecodedProof - 80, // 62: taprpc.ListBurnsResponse.burns:type_name -> taprpc.AssetBurn - 49, // 63: taprpc.ReceiveEvent.address:type_name -> taprpc.Addr - 7, // 64: taprpc.ReceiveEvent.status:type_name -> taprpc.AddrEventStatus - 9, // 65: taprpc.SendEvent.parcel_type:type_name -> taprpc.ParcelType - 49, // 66: taprpc.SendEvent.addresses:type_name -> taprpc.Addr - 87, // 67: taprpc.SendEvent.anchor_transaction:type_name -> taprpc.AnchorTransaction - 41, // 68: taprpc.SendEvent.transfer:type_name -> taprpc.AssetTransfer - 82, // 69: taprpc.AnchorTransaction.lnd_locked_utxos:type_name -> taprpc.OutPoint - 82, // 70: taprpc.RegisterTransferRequest.outpoint:type_name -> taprpc.OutPoint - 23, // 71: taprpc.RegisterTransferResponse.registered_asset:type_name -> taprpc.Asset - 28, // 72: taprpc.ListUtxosResponse.ManagedUtxosEntry.value:type_name -> taprpc.ManagedUtxo - 32, // 73: taprpc.ListGroupsResponse.GroupsEntry.value:type_name -> taprpc.GroupedAssets - 35, // 74: taprpc.ListBalancesResponse.AssetBalancesEntry.value:type_name -> taprpc.AssetBalance - 36, // 75: taprpc.ListBalancesResponse.AssetGroupBalancesEntry.value:type_name -> taprpc.AssetGroupBalance - 11, // 76: taprpc.TaprootAssets.ListAssets:input_type -> taprpc.ListAssetRequest - 27, // 77: taprpc.TaprootAssets.ListUtxos:input_type -> taprpc.ListUtxosRequest - 30, // 78: taprpc.TaprootAssets.ListGroups:input_type -> taprpc.ListGroupsRequest - 34, // 79: taprpc.TaprootAssets.ListBalances:input_type -> taprpc.ListBalancesRequest - 38, // 80: taprpc.TaprootAssets.ListTransfers:input_type -> taprpc.ListTransfersRequest - 45, // 81: taprpc.TaprootAssets.StopDaemon:input_type -> taprpc.StopRequest - 47, // 82: taprpc.TaprootAssets.DebugLevel:input_type -> taprpc.DebugLevelRequest - 50, // 83: taprpc.TaprootAssets.QueryAddrs:input_type -> taprpc.QueryAddrRequest - 52, // 84: taprpc.TaprootAssets.NewAddr:input_type -> taprpc.NewAddrRequest - 59, // 85: taprpc.TaprootAssets.DecodeAddr:input_type -> taprpc.DecodeAddrRequest - 69, // 86: taprpc.TaprootAssets.AddrReceives:input_type -> taprpc.AddrReceivesRequest - 60, // 87: taprpc.TaprootAssets.VerifyProof:input_type -> taprpc.ProofFile - 63, // 88: taprpc.TaprootAssets.DecodeProof:input_type -> taprpc.DecodeProofRequest - 65, // 89: taprpc.TaprootAssets.ExportProof:input_type -> taprpc.ExportProofRequest - 66, // 90: taprpc.TaprootAssets.UnpackProofFile:input_type -> taprpc.UnpackProofFileRequest - 71, // 91: taprpc.TaprootAssets.SendAsset:input_type -> taprpc.SendAssetRequest - 77, // 92: taprpc.TaprootAssets.BurnAsset:input_type -> taprpc.BurnAssetRequest - 79, // 93: taprpc.TaprootAssets.ListBurns:input_type -> taprpc.ListBurnsRequest - 74, // 94: taprpc.TaprootAssets.GetInfo:input_type -> taprpc.GetInfoRequest - 76, // 95: taprpc.TaprootAssets.FetchAssetMeta:input_type -> taprpc.FetchAssetMetaRequest - 83, // 96: taprpc.TaprootAssets.SubscribeReceiveEvents:input_type -> taprpc.SubscribeReceiveEventsRequest - 85, // 97: taprpc.TaprootAssets.SubscribeSendEvents:input_type -> taprpc.SubscribeSendEventsRequest - 88, // 98: taprpc.TaprootAssets.RegisterTransfer:input_type -> taprpc.RegisterTransferRequest - 26, // 99: taprpc.TaprootAssets.ListAssets:output_type -> taprpc.ListAssetResponse - 29, // 100: taprpc.TaprootAssets.ListUtxos:output_type -> taprpc.ListUtxosResponse - 33, // 101: taprpc.TaprootAssets.ListGroups:output_type -> taprpc.ListGroupsResponse - 37, // 102: taprpc.TaprootAssets.ListBalances:output_type -> taprpc.ListBalancesResponse - 39, // 103: taprpc.TaprootAssets.ListTransfers:output_type -> taprpc.ListTransfersResponse - 46, // 104: taprpc.TaprootAssets.StopDaemon:output_type -> taprpc.StopResponse - 48, // 105: taprpc.TaprootAssets.DebugLevel:output_type -> taprpc.DebugLevelResponse - 51, // 106: taprpc.TaprootAssets.QueryAddrs:output_type -> taprpc.QueryAddrResponse - 49, // 107: taprpc.TaprootAssets.NewAddr:output_type -> taprpc.Addr - 49, // 108: taprpc.TaprootAssets.DecodeAddr:output_type -> taprpc.Addr - 70, // 109: taprpc.TaprootAssets.AddrReceives:output_type -> taprpc.AddrReceivesResponse - 62, // 110: taprpc.TaprootAssets.VerifyProof:output_type -> taprpc.VerifyProofResponse - 64, // 111: taprpc.TaprootAssets.DecodeProof:output_type -> taprpc.DecodeProofResponse - 60, // 112: taprpc.TaprootAssets.ExportProof:output_type -> taprpc.ProofFile - 67, // 113: taprpc.TaprootAssets.UnpackProofFile:output_type -> taprpc.UnpackProofFileResponse - 73, // 114: taprpc.TaprootAssets.SendAsset:output_type -> taprpc.SendAssetResponse - 78, // 115: taprpc.TaprootAssets.BurnAsset:output_type -> taprpc.BurnAssetResponse - 81, // 116: taprpc.TaprootAssets.ListBurns:output_type -> taprpc.ListBurnsResponse - 75, // 117: taprpc.TaprootAssets.GetInfo:output_type -> taprpc.GetInfoResponse - 10, // 118: taprpc.TaprootAssets.FetchAssetMeta:output_type -> taprpc.AssetMeta - 84, // 119: taprpc.TaprootAssets.SubscribeReceiveEvents:output_type -> taprpc.ReceiveEvent - 86, // 120: taprpc.TaprootAssets.SubscribeSendEvents:output_type -> taprpc.SendEvent - 89, // 121: taprpc.TaprootAssets.RegisterTransfer:output_type -> taprpc.RegisterTransferResponse - 99, // [99:122] is the sub-list for method output_type - 76, // [76:99] is the sub-list for method input_type - 76, // [76:76] is the sub-list for extension type_name - 76, // [76:76] is the sub-list for extension extendee - 0, // [0:76] is the sub-list for field type_name + 1, // 0: taprpc.AssetMeta.type:type_name -> taprpc.AssetMetaType + 53, // 1: taprpc.ListAssetRequest.script_key:type_name -> taprpc.ScriptKey + 82, // 2: taprpc.ListAssetRequest.anchor_outpoint:type_name -> taprpc.OutPoint + 0, // 3: taprpc.GenesisInfo.asset_type:type_name -> taprpc.AssetType + 55, // 4: taprpc.GroupKeyRequest.raw_key:type_name -> taprpc.KeyDescriptor + 13, // 5: taprpc.GroupKeyRequest.anchor_genesis:type_name -> taprpc.GenesisInfo + 14, // 6: taprpc.GroupKeyRequest.external_key:type_name -> taprpc.ExternalKey + 16, // 7: taprpc.GroupVirtualTx.prev_out:type_name -> taprpc.TxOut + 13, // 8: taprpc.GenesisReveal.genesis_base_reveal:type_name -> taprpc.GenesisInfo + 2, // 9: taprpc.Asset.version:type_name -> taprpc.AssetVersion + 13, // 10: taprpc.Asset.asset_genesis:type_name -> taprpc.GenesisInfo + 19, // 11: taprpc.Asset.asset_group:type_name -> taprpc.AssetGroup + 12, // 12: taprpc.Asset.chain_anchor:type_name -> taprpc.AnchorInfo + 24, // 13: taprpc.Asset.prev_witnesses:type_name -> taprpc.PrevWitness + 22, // 14: taprpc.Asset.decimal_display:type_name -> taprpc.DecimalDisplay + 6, // 15: taprpc.Asset.script_key_type:type_name -> taprpc.ScriptKeyType + 72, // 16: taprpc.PrevWitness.prev_id:type_name -> taprpc.PrevInputAsset + 25, // 17: taprpc.PrevWitness.split_commitment:type_name -> taprpc.SplitCommitment + 23, // 18: taprpc.SplitCommitment.root_asset:type_name -> taprpc.Asset + 23, // 19: taprpc.ListAssetResponse.assets:type_name -> taprpc.Asset + 23, // 20: taprpc.ManagedUtxo.assets:type_name -> taprpc.Asset + 90, // 21: taprpc.ListUtxosResponse.managed_utxos:type_name -> taprpc.ListUtxosResponse.ManagedUtxosEntry + 0, // 22: taprpc.AssetHumanReadable.type:type_name -> taprpc.AssetType + 2, // 23: taprpc.AssetHumanReadable.version:type_name -> taprpc.AssetVersion + 31, // 24: taprpc.GroupedAssets.assets:type_name -> taprpc.AssetHumanReadable + 91, // 25: taprpc.ListGroupsResponse.groups:type_name -> taprpc.ListGroupsResponse.GroupsEntry + 13, // 26: taprpc.AssetBalance.asset_genesis:type_name -> taprpc.GenesisInfo + 92, // 27: taprpc.ListBalancesResponse.asset_balances:type_name -> taprpc.ListBalancesResponse.AssetBalancesEntry + 93, // 28: taprpc.ListBalancesResponse.asset_group_balances:type_name -> taprpc.ListBalancesResponse.AssetGroupBalancesEntry + 41, // 29: taprpc.ListTransfersResponse.transfers:type_name -> taprpc.AssetTransfer + 42, // 30: taprpc.AssetTransfer.inputs:type_name -> taprpc.TransferInput + 44, // 31: taprpc.AssetTransfer.outputs:type_name -> taprpc.TransferOutput + 40, // 32: taprpc.AssetTransfer.anchor_tx_block_hash:type_name -> taprpc.ChainHash + 43, // 33: taprpc.TransferOutput.anchor:type_name -> taprpc.TransferOutputAnchor + 3, // 34: taprpc.TransferOutput.output_type:type_name -> taprpc.OutputType + 2, // 35: taprpc.TransferOutput.asset_version:type_name -> taprpc.AssetVersion + 4, // 36: taprpc.TransferOutput.proof_delivery_status:type_name -> taprpc.ProofDeliveryStatus + 0, // 37: taprpc.Addr.asset_type:type_name -> taprpc.AssetType + 2, // 38: taprpc.Addr.asset_version:type_name -> taprpc.AssetVersion + 5, // 39: taprpc.Addr.address_version:type_name -> taprpc.AddrVersion + 49, // 40: taprpc.QueryAddrResponse.addrs:type_name -> taprpc.Addr + 53, // 41: taprpc.NewAddrRequest.script_key:type_name -> taprpc.ScriptKey + 55, // 42: taprpc.NewAddrRequest.internal_key:type_name -> taprpc.KeyDescriptor + 2, // 43: taprpc.NewAddrRequest.asset_version:type_name -> taprpc.AssetVersion + 5, // 44: taprpc.NewAddrRequest.address_version:type_name -> taprpc.AddrVersion + 55, // 45: taprpc.ScriptKey.key_desc:type_name -> taprpc.KeyDescriptor + 6, // 46: taprpc.ScriptKey.type:type_name -> taprpc.ScriptKeyType + 54, // 47: taprpc.KeyDescriptor.key_loc:type_name -> taprpc.KeyLocator + 57, // 48: taprpc.TapscriptFullTree.all_leaves:type_name -> taprpc.TapLeaf + 23, // 49: taprpc.DecodedProof.asset:type_name -> taprpc.Asset + 10, // 50: taprpc.DecodedProof.meta_reveal:type_name -> taprpc.AssetMeta + 21, // 51: taprpc.DecodedProof.genesis_reveal:type_name -> taprpc.GenesisReveal + 20, // 52: taprpc.DecodedProof.group_key_reveal:type_name -> taprpc.GroupKeyReveal + 61, // 53: taprpc.VerifyProofResponse.decoded_proof:type_name -> taprpc.DecodedProof + 61, // 54: taprpc.DecodeProofResponse.decoded_proof:type_name -> taprpc.DecodedProof + 82, // 55: taprpc.ExportProofRequest.outpoint:type_name -> taprpc.OutPoint + 49, // 56: taprpc.AddrEvent.addr:type_name -> taprpc.Addr + 7, // 57: taprpc.AddrEvent.status:type_name -> taprpc.AddrEventStatus + 7, // 58: taprpc.AddrReceivesRequest.filter_status:type_name -> taprpc.AddrEventStatus + 68, // 59: taprpc.AddrReceivesResponse.events:type_name -> taprpc.AddrEvent + 41, // 60: taprpc.SendAssetResponse.transfer:type_name -> taprpc.AssetTransfer + 41, // 61: taprpc.BurnAssetResponse.burn_transfer:type_name -> taprpc.AssetTransfer + 61, // 62: taprpc.BurnAssetResponse.burn_proof:type_name -> taprpc.DecodedProof + 80, // 63: taprpc.ListBurnsResponse.burns:type_name -> taprpc.AssetBurn + 49, // 64: taprpc.ReceiveEvent.address:type_name -> taprpc.Addr + 7, // 65: taprpc.ReceiveEvent.status:type_name -> taprpc.AddrEventStatus + 9, // 66: taprpc.SendEvent.parcel_type:type_name -> taprpc.ParcelType + 49, // 67: taprpc.SendEvent.addresses:type_name -> taprpc.Addr + 87, // 68: taprpc.SendEvent.anchor_transaction:type_name -> taprpc.AnchorTransaction + 41, // 69: taprpc.SendEvent.transfer:type_name -> taprpc.AssetTransfer + 82, // 70: taprpc.AnchorTransaction.lnd_locked_utxos:type_name -> taprpc.OutPoint + 82, // 71: taprpc.RegisterTransferRequest.outpoint:type_name -> taprpc.OutPoint + 23, // 72: taprpc.RegisterTransferResponse.registered_asset:type_name -> taprpc.Asset + 28, // 73: taprpc.ListUtxosResponse.ManagedUtxosEntry.value:type_name -> taprpc.ManagedUtxo + 32, // 74: taprpc.ListGroupsResponse.GroupsEntry.value:type_name -> taprpc.GroupedAssets + 35, // 75: taprpc.ListBalancesResponse.AssetBalancesEntry.value:type_name -> taprpc.AssetBalance + 36, // 76: taprpc.ListBalancesResponse.AssetGroupBalancesEntry.value:type_name -> taprpc.AssetGroupBalance + 11, // 77: taprpc.TaprootAssets.ListAssets:input_type -> taprpc.ListAssetRequest + 27, // 78: taprpc.TaprootAssets.ListUtxos:input_type -> taprpc.ListUtxosRequest + 30, // 79: taprpc.TaprootAssets.ListGroups:input_type -> taprpc.ListGroupsRequest + 34, // 80: taprpc.TaprootAssets.ListBalances:input_type -> taprpc.ListBalancesRequest + 38, // 81: taprpc.TaprootAssets.ListTransfers:input_type -> taprpc.ListTransfersRequest + 45, // 82: taprpc.TaprootAssets.StopDaemon:input_type -> taprpc.StopRequest + 47, // 83: taprpc.TaprootAssets.DebugLevel:input_type -> taprpc.DebugLevelRequest + 50, // 84: taprpc.TaprootAssets.QueryAddrs:input_type -> taprpc.QueryAddrRequest + 52, // 85: taprpc.TaprootAssets.NewAddr:input_type -> taprpc.NewAddrRequest + 59, // 86: taprpc.TaprootAssets.DecodeAddr:input_type -> taprpc.DecodeAddrRequest + 69, // 87: taprpc.TaprootAssets.AddrReceives:input_type -> taprpc.AddrReceivesRequest + 60, // 88: taprpc.TaprootAssets.VerifyProof:input_type -> taprpc.ProofFile + 63, // 89: taprpc.TaprootAssets.DecodeProof:input_type -> taprpc.DecodeProofRequest + 65, // 90: taprpc.TaprootAssets.ExportProof:input_type -> taprpc.ExportProofRequest + 66, // 91: taprpc.TaprootAssets.UnpackProofFile:input_type -> taprpc.UnpackProofFileRequest + 71, // 92: taprpc.TaprootAssets.SendAsset:input_type -> taprpc.SendAssetRequest + 77, // 93: taprpc.TaprootAssets.BurnAsset:input_type -> taprpc.BurnAssetRequest + 79, // 94: taprpc.TaprootAssets.ListBurns:input_type -> taprpc.ListBurnsRequest + 74, // 95: taprpc.TaprootAssets.GetInfo:input_type -> taprpc.GetInfoRequest + 76, // 96: taprpc.TaprootAssets.FetchAssetMeta:input_type -> taprpc.FetchAssetMetaRequest + 83, // 97: taprpc.TaprootAssets.SubscribeReceiveEvents:input_type -> taprpc.SubscribeReceiveEventsRequest + 85, // 98: taprpc.TaprootAssets.SubscribeSendEvents:input_type -> taprpc.SubscribeSendEventsRequest + 88, // 99: taprpc.TaprootAssets.RegisterTransfer:input_type -> taprpc.RegisterTransferRequest + 26, // 100: taprpc.TaprootAssets.ListAssets:output_type -> taprpc.ListAssetResponse + 29, // 101: taprpc.TaprootAssets.ListUtxos:output_type -> taprpc.ListUtxosResponse + 33, // 102: taprpc.TaprootAssets.ListGroups:output_type -> taprpc.ListGroupsResponse + 37, // 103: taprpc.TaprootAssets.ListBalances:output_type -> taprpc.ListBalancesResponse + 39, // 104: taprpc.TaprootAssets.ListTransfers:output_type -> taprpc.ListTransfersResponse + 46, // 105: taprpc.TaprootAssets.StopDaemon:output_type -> taprpc.StopResponse + 48, // 106: taprpc.TaprootAssets.DebugLevel:output_type -> taprpc.DebugLevelResponse + 51, // 107: taprpc.TaprootAssets.QueryAddrs:output_type -> taprpc.QueryAddrResponse + 49, // 108: taprpc.TaprootAssets.NewAddr:output_type -> taprpc.Addr + 49, // 109: taprpc.TaprootAssets.DecodeAddr:output_type -> taprpc.Addr + 70, // 110: taprpc.TaprootAssets.AddrReceives:output_type -> taprpc.AddrReceivesResponse + 62, // 111: taprpc.TaprootAssets.VerifyProof:output_type -> taprpc.VerifyProofResponse + 64, // 112: taprpc.TaprootAssets.DecodeProof:output_type -> taprpc.DecodeProofResponse + 60, // 113: taprpc.TaprootAssets.ExportProof:output_type -> taprpc.ProofFile + 67, // 114: taprpc.TaprootAssets.UnpackProofFile:output_type -> taprpc.UnpackProofFileResponse + 73, // 115: taprpc.TaprootAssets.SendAsset:output_type -> taprpc.SendAssetResponse + 78, // 116: taprpc.TaprootAssets.BurnAsset:output_type -> taprpc.BurnAssetResponse + 81, // 117: taprpc.TaprootAssets.ListBurns:output_type -> taprpc.ListBurnsResponse + 75, // 118: taprpc.TaprootAssets.GetInfo:output_type -> taprpc.GetInfoResponse + 10, // 119: taprpc.TaprootAssets.FetchAssetMeta:output_type -> taprpc.AssetMeta + 84, // 120: taprpc.TaprootAssets.SubscribeReceiveEvents:output_type -> taprpc.ReceiveEvent + 86, // 121: taprpc.TaprootAssets.SubscribeSendEvents:output_type -> taprpc.SendEvent + 89, // 122: taprpc.TaprootAssets.RegisterTransfer:output_type -> taprpc.RegisterTransferResponse + 100, // [100:123] is the sub-list for method output_type + 77, // [77:100] is the sub-list for method input_type + 77, // [77:77] is the sub-list for extension type_name + 77, // [77:77] is the sub-list for extension extendee + 0, // [0:77] is the sub-list for field type_name } func init() { file_taprootassets_proto_init() } diff --git a/taprpc/taprootassets.proto b/taprpc/taprootassets.proto index 16fbd4b84..2bbd28c6b 100644 --- a/taprpc/taprootassets.proto +++ b/taprpc/taprootassets.proto @@ -514,6 +514,7 @@ message Asset { // assets in this output are destroyed and can no longer be spent. bool is_burn = 17; + // Deprecated, use script_key_type instead! // Indicates whether this script key has either been derived by the local // wallet or was explicitly declared to be known by using the // DeclareScriptKey RPC. Knowing the key conceptually means the key belongs @@ -524,6 +525,7 @@ message Asset { // script key will be shown in the wallet balance. bool script_key_declared_known = 18; + // Deprecated, use script_key_type instead! // Indicates whether the script key is known to have a Tapscript spend path, // meaning that the Taproot merkle root tweak is not empty. This will only // ever be true if either script_key_is_local or script_key_internals_known @@ -536,6 +538,9 @@ message Asset { // field is null, it means the presence of a decimal display field is // unknown in the current context. DecimalDisplay decimal_display = 20; + + // The user-declared type of the script key. + ScriptKeyType script_key_type = 21; } message PrevWitness { diff --git a/taprpc/taprootassets.swagger.json b/taprpc/taprootassets.swagger.json index 981298b6e..1cbb77554 100644 --- a/taprpc/taprootassets.swagger.json +++ b/taprpc/taprootassets.swagger.json @@ -1387,15 +1387,19 @@ }, "script_key_declared_known": { "type": "boolean", - "description": "Indicates whether this script key has either been derived by the local\nwallet or was explicitly declared to be known by using the\nDeclareScriptKey RPC. Knowing the key conceptually means the key belongs\nto the local wallet or is at least known by a software that operates on\nthe local wallet. The flag is never serialized in proofs, so this is\nnever explicitly set for keys foreign to the local wallet. Therefore, if\nthis method returns true for a script key, it means the asset with the\nscript key will be shown in the wallet balance." + "description": "Deprecated, use script_key_type instead!\nIndicates whether this script key has either been derived by the local\nwallet or was explicitly declared to be known by using the\nDeclareScriptKey RPC. Knowing the key conceptually means the key belongs\nto the local wallet or is at least known by a software that operates on\nthe local wallet. The flag is never serialized in proofs, so this is\nnever explicitly set for keys foreign to the local wallet. Therefore, if\nthis method returns true for a script key, it means the asset with the\nscript key will be shown in the wallet balance." }, "script_key_has_script_path": { "type": "boolean", - "description": "Indicates whether the script key is known to have a Tapscript spend path,\nmeaning that the Taproot merkle root tweak is not empty. This will only\never be true if either script_key_is_local or script_key_internals_known\nis true as well, since the presence of a Tapscript spend path cannot be\ndetermined for script keys that aren't known to the wallet of the local\ntapd node." + "description": "Deprecated, use script_key_type instead!\nIndicates whether the script key is known to have a Tapscript spend path,\nmeaning that the Taproot merkle root tweak is not empty. This will only\never be true if either script_key_is_local or script_key_internals_known\nis true as well, since the presence of a Tapscript spend path cannot be\ndetermined for script keys that aren't known to the wallet of the local\ntapd node." }, "decimal_display": { "$ref": "#/definitions/taprpcDecimalDisplay", "description": "This field defines a decimal display value that may be present. If this\nfield is null, it means the presence of a decimal display field is\nunknown in the current context." + }, + "script_key_type": { + "$ref": "#/definitions/taprpcScriptKeyType", + "description": "The user-declared type of the script key." } } }, diff --git a/taprpc/universerpc/universe.swagger.json b/taprpc/universerpc/universe.swagger.json index 65bac0103..a096f7a22 100644 --- a/taprpc/universerpc/universe.swagger.json +++ b/taprpc/universerpc/universe.swagger.json @@ -1676,15 +1676,19 @@ }, "script_key_declared_known": { "type": "boolean", - "description": "Indicates whether this script key has either been derived by the local\nwallet or was explicitly declared to be known by using the\nDeclareScriptKey RPC. Knowing the key conceptually means the key belongs\nto the local wallet or is at least known by a software that operates on\nthe local wallet. The flag is never serialized in proofs, so this is\nnever explicitly set for keys foreign to the local wallet. Therefore, if\nthis method returns true for a script key, it means the asset with the\nscript key will be shown in the wallet balance." + "description": "Deprecated, use script_key_type instead!\nIndicates whether this script key has either been derived by the local\nwallet or was explicitly declared to be known by using the\nDeclareScriptKey RPC. Knowing the key conceptually means the key belongs\nto the local wallet or is at least known by a software that operates on\nthe local wallet. The flag is never serialized in proofs, so this is\nnever explicitly set for keys foreign to the local wallet. Therefore, if\nthis method returns true for a script key, it means the asset with the\nscript key will be shown in the wallet balance." }, "script_key_has_script_path": { "type": "boolean", - "description": "Indicates whether the script key is known to have a Tapscript spend path,\nmeaning that the Taproot merkle root tweak is not empty. This will only\never be true if either script_key_is_local or script_key_internals_known\nis true as well, since the presence of a Tapscript spend path cannot be\ndetermined for script keys that aren't known to the wallet of the local\ntapd node." + "description": "Deprecated, use script_key_type instead!\nIndicates whether the script key is known to have a Tapscript spend path,\nmeaning that the Taproot merkle root tweak is not empty. This will only\never be true if either script_key_is_local or script_key_internals_known\nis true as well, since the presence of a Tapscript spend path cannot be\ndetermined for script keys that aren't known to the wallet of the local\ntapd node." }, "decimal_display": { "$ref": "#/definitions/taprpcDecimalDisplay", "description": "This field defines a decimal display value that may be present. If this\nfield is null, it means the presence of a decimal display field is\nunknown in the current context." + }, + "script_key_type": { + "$ref": "#/definitions/taprpcScriptKeyType", + "description": "The user-declared type of the script key." } } }, @@ -1811,6 +1815,19 @@ } } }, + "taprpcScriptKeyType": { + "type": "string", + "enum": [ + "SCRIPT_KEY_UNKNOWN", + "SCRIPT_KEY_BIP86", + "SCRIPT_KEY_SCRIPT_PATH_EXTERNAL", + "SCRIPT_KEY_BURN", + "SCRIPT_KEY_TOMBSTONE", + "SCRIPT_KEY_CHANNEL" + ], + "default": "SCRIPT_KEY_UNKNOWN", + "description": " - SCRIPT_KEY_UNKNOWN: The type of script key is not known. This should only be stored for assets\nwhere we don't know the internal key of the script key (e.g. for\nimported proofs).\n - SCRIPT_KEY_BIP86: The script key is a normal BIP-86 key. This means that the internal key is\nturned into a Taproot output key by applying a BIP-86 tweak to it.\n - SCRIPT_KEY_SCRIPT_PATH_EXTERNAL: The script key is a key that contains a script path that is defined by the\nuser and is therefore external to the tapd wallet. Spending this key\nrequires providing a specific witness and must be signed through the vPSBT\nsigning flow.\n - SCRIPT_KEY_BURN: The script key is a specific un-spendable key that indicates a burnt asset.\nAssets with this key type can never be spent again, as a burn key is a\ntweaked NUMS key that nobody knows the private key for.\n - SCRIPT_KEY_TOMBSTONE: The script key is a specific un-spendable key that indicates a tombstone\noutput. This is only the case for zero-value assets that result from a\nnon-interactive (TAP address) send where no change was left over.\n - SCRIPT_KEY_CHANNEL: The script key is used for an asset that resides within a Taproot Asset\nChannel. That means the script key is either a funding key (OP_TRUE), a\ncommitment output key (to_local, to_remote, htlc), or a HTLC second-level\ntransaction output key. Keys related to channels are not shown in asset\nbalances (unless specifically requested) and are never used for coin\nselection." + }, "taprpcSplitCommitment": { "type": "object", "properties": { From 21092c8cdecfb9b756c5717c12fd7f433c6b6731 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 3 Apr 2025 14:56:45 +0200 Subject: [PATCH 13/17] multi: add script key type filter to queries --- rpcserver.go | 59 +- tapchannel/aux_funding_controller.go | 2 +- tapdb/asset_minting_test.go | 6 +- tapdb/assets_store.go | 33 +- tapdb/assets_store_test.go | 16 +- tapdb/sqlc/assets.sql.go | 53 +- tapdb/sqlc/queries/assets.sql | 19 +- tapfreighter/coin_select.go | 1 + tapfreighter/interface.go | 4 + tapfreighter/wallet.go | 1 + taprpc/marshal.go | 34 + taprpc/taprootassets.pb.go | 2775 ++++++++++++++------------ taprpc/taprootassets.proto | 35 + taprpc/taprootassets.swagger.json | 82 + tapsend/send.go | 4 + 15 files changed, 1749 insertions(+), 1375 deletions(-) diff --git a/rpcserver.go b/rpcserver.go index 93b5f2d86..29adc37db 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -1010,7 +1010,7 @@ func (r *rpcServer) checkBalanceOverflow(ctx context.Context, case assetID != nil: // Retrieve the current asset balance. balances, err := r.cfg.AssetStore.QueryBalancesByAsset( - ctx, assetID, true, + ctx, assetID, true, fn.None[asset.ScriptKeyType](), ) if err != nil { return fmt.Errorf("unable to query asset balance: %w", @@ -1026,7 +1026,7 @@ func (r *rpcServer) checkBalanceOverflow(ctx context.Context, case groupPubKey != nil: // Retrieve the current balance of the group. balances, err := r.cfg.AssetStore.QueryAssetBalancesByGroup( - ctx, groupPubKey, true, + ctx, groupPubKey, true, fn.None[asset.ScriptKeyType](), ) if err != nil { return fmt.Errorf("unable to query group balance: %w", @@ -1105,9 +1105,18 @@ func (r *rpcServer) ListAssets(ctx context.Context, filters.AnchorPoint = outPoint } + scriptKeyType, includeSpent, err := taprpc.ParseScriptKeyTypeQuery( + req.ScriptKeyType, + ) + if err != nil { + return nil, fmt.Errorf("unable to parse script key type "+ + "query: %w", err) + } + filters.ScriptKeyType = scriptKeyType + rpcAssets, err := r.fetchRpcAssets( - ctx, req.WithWitness, req.IncludeSpent, req.IncludeLeased, - filters, + ctx, req.WithWitness, req.IncludeSpent || includeSpent, + req.IncludeLeased, filters, ) if err != nil { @@ -1218,11 +1227,12 @@ func (r *rpcServer) MarshalChainAsset(ctx context.Context, a asset.ChainAsset, } func (r *rpcServer) listBalancesByAsset(ctx context.Context, - assetID *asset.ID, includeLeased bool) (*taprpc.ListBalancesResponse, + assetID *asset.ID, includeLeased bool, + skt fn.Option[asset.ScriptKeyType]) (*taprpc.ListBalancesResponse, error) { balances, err := r.cfg.AssetStore.QueryBalancesByAsset( - ctx, assetID, includeLeased, + ctx, assetID, includeLeased, skt, ) if err != nil { return nil, fmt.Errorf("unable to list balances: %w", err) @@ -1253,11 +1263,12 @@ func (r *rpcServer) listBalancesByAsset(ctx context.Context, } func (r *rpcServer) listBalancesByGroupKey(ctx context.Context, - groupKey *btcec.PublicKey, - includeLeased bool) (*taprpc.ListBalancesResponse, error) { + groupKey *btcec.PublicKey, includeLeased bool, + skt fn.Option[asset.ScriptKeyType]) (*taprpc.ListBalancesResponse, + error) { balances, err := r.cfg.AssetStore.QueryAssetBalancesByGroup( - ctx, groupKey, includeLeased, + ctx, groupKey, includeLeased, skt, ) if err != nil { return nil, fmt.Errorf("unable to list balances: %w", err) @@ -1292,8 +1303,22 @@ func (r *rpcServer) listBalancesByGroupKey(ctx context.Context, func (r *rpcServer) ListUtxos(ctx context.Context, req *taprpc.ListUtxosRequest) (*taprpc.ListUtxosResponse, error) { + scriptKeyType, includeSpent, err := taprpc.ParseScriptKeyTypeQuery( + req.ScriptKeyType, + ) + if err != nil { + return nil, fmt.Errorf("unable to parse script key type "+ + "query: %w", err) + } + + filters := &tapdb.AssetQueryFilters{ + CommitmentConstraints: tapfreighter.CommitmentConstraints{ + ScriptKeyType: scriptKeyType, + }, + } + rpcAssets, err := r.fetchRpcAssets( - ctx, false, false, req.IncludeLeased, nil, + ctx, false, includeSpent, req.IncludeLeased, filters, ) if err != nil { return nil, err @@ -1395,6 +1420,14 @@ func (r *rpcServer) ListGroups(ctx context.Context, func (r *rpcServer) ListBalances(ctx context.Context, req *taprpc.ListBalancesRequest) (*taprpc.ListBalancesResponse, error) { + scriptKeyType, _, err := taprpc.ParseScriptKeyTypeQuery( + req.ScriptKeyType, + ) + if err != nil { + return nil, fmt.Errorf("unable to parse script key type "+ + "query: %w", err) + } + switch groupBy := req.GroupBy.(type) { case *taprpc.ListBalancesRequest_AssetId: if !groupBy.AssetId { @@ -1411,7 +1444,9 @@ func (r *rpcServer) ListBalances(ctx context.Context, copy(assetID[:], req.AssetFilter) } - return r.listBalancesByAsset(ctx, assetID, req.IncludeLeased) + return r.listBalancesByAsset( + ctx, assetID, req.IncludeLeased, scriptKeyType, + ) case *taprpc.ListBalancesRequest_GroupKey: if !groupBy.GroupKey { @@ -1429,7 +1464,7 @@ func (r *rpcServer) ListBalances(ctx context.Context, } return r.listBalancesByGroupKey( - ctx, groupKey, req.IncludeLeased, + ctx, groupKey, req.IncludeLeased, scriptKeyType, ) default: diff --git a/tapchannel/aux_funding_controller.go b/tapchannel/aux_funding_controller.go index b323b8a21..ed18bb002 100644 --- a/tapchannel/aux_funding_controller.go +++ b/tapchannel/aux_funding_controller.go @@ -794,7 +794,7 @@ func (f *FundingController) fundVirtualPacket(ctx context.Context, fundDesc := &tapsend.FundingDescriptor{ AssetSpecifier: specifier, Amount: amt, - CoinSelectType: tapsend.Bip86Only, + ScriptKeyType: fn.Some(asset.ScriptKeyBip86), DistinctSpecifier: true, } diff --git a/tapdb/asset_minting_test.go b/tapdb/asset_minting_test.go index 4f71cfd2a..0c59de0b0 100644 --- a/tapdb/asset_minting_test.go +++ b/tapdb/asset_minting_test.go @@ -1143,7 +1143,9 @@ func TestCommitBatchChainActions(t *testing.T) { // We'll now query for the set of balances to ensure they all line up // with the assets we just created, including the group genesis asset. - assetBalances, err := confAssets.QueryBalancesByAsset(ctx, nil, false) + assetBalances, err := confAssets.QueryBalancesByAsset( + ctx, nil, false, fn.None[asset.ScriptKeyType](), + ) require.NoError(t, err) require.Equal(t, numSeedlings+1, len(assetBalances)) @@ -1165,7 +1167,7 @@ func TestCommitBatchChainActions(t *testing.T) { } numKeyGroups := fn.Reduce(mintedAssets, keyGroupSumReducer) assetBalancesByGroup, err := confAssets.QueryAssetBalancesByGroup( - ctx, nil, false, + ctx, nil, false, fn.None[asset.ScriptKeyType](), ) require.NoError(t, err) require.Equal(t, numKeyGroups, len(assetBalancesByGroup)) diff --git a/tapdb/assets_store.go b/tapdb/assets_store.go index ade025a64..4e6f2cbca 100644 --- a/tapdb/assets_store.go +++ b/tapdb/assets_store.go @@ -24,7 +24,6 @@ import ( "github.com/lightninglabs/taproot-assets/tapfreighter" "github.com/lightninglabs/taproot-assets/tappsbt" "github.com/lightninglabs/taproot-assets/tapscript" - "github.com/lightninglabs/taproot-assets/tapsend" "github.com/lightningnetwork/lnd/clock" "github.com/lightningnetwork/lnd/keychain" ) @@ -897,13 +896,11 @@ func (a *AssetStore) constraintsToDbFilter( assetFilter.AssetIDFilter = nil } - switch query.CoinSelectType { - case tapsend.ScriptTreesAllowed: - assetFilter.Bip86ScriptKeysOnly = false - - default: - assetFilter.Bip86ScriptKeysOnly = true - } + // The fn.None option means we don't restrict on script key type + // at all. + query.ScriptKeyType.WhenSome(func(t asset.ScriptKeyType) { + assetFilter.ScriptKeyType = sqlInt16(t) + }) } return assetFilter, nil @@ -990,8 +987,8 @@ type AssetQueryFilters struct { // QueryBalancesByAsset queries the balances for assets or alternatively // for a selected one that matches the passed asset ID filter. func (a *AssetStore) QueryBalancesByAsset(ctx context.Context, - assetID *asset.ID, - includeLeased bool) (map[asset.ID]AssetBalance, error) { + assetID *asset.ID, includeLeased bool, + skt fn.Option[asset.ScriptKeyType]) (map[asset.ID]AssetBalance, error) { // We'll now map the application level filtering to the type of // filtering our database query understands. @@ -1002,6 +999,11 @@ func (a *AssetStore) QueryBalancesByAsset(ctx context.Context, }, } + // The fn.None option means we don't restrict on script key type at all. + skt.WhenSome(func(t asset.ScriptKeyType) { + assetBalancesFilter.ScriptKeyType = sqlInt16(t) + }) + // We exclude the assets that are specifically used for funding custom // channels. The balance of those assets is reported through lnd channel // balance. Those assets are identified by the funding script tree for a @@ -1070,9 +1072,9 @@ func (a *AssetStore) QueryBalancesByAsset(ctx context.Context, // QueryAssetBalancesByGroup queries the asset balances for asset groups or // alternatively for a selected one that matches the passed filter. func (a *AssetStore) QueryAssetBalancesByGroup(ctx context.Context, - groupKey *btcec.PublicKey, - includeLeased bool) (map[asset.SerializedKey]AssetGroupBalance, - error) { + groupKey *btcec.PublicKey, includeLeased bool, + skt fn.Option[asset.ScriptKeyType]) ( + map[asset.SerializedKey]AssetGroupBalance, error) { // We'll now map the application level filtering to the type of // filtering our database query understands. @@ -1083,6 +1085,11 @@ func (a *AssetStore) QueryAssetBalancesByGroup(ctx context.Context, }, } + // The fn.None option means we don't restrict on script key type at all. + skt.WhenSome(func(t asset.ScriptKeyType) { + assetBalancesFilter.ScriptKeyType = sqlInt16(t) + }) + // We exclude the assets that are specifically used for funding custom // channels. The balance of those assets is reported through lnd channel // balance. Those assets are identified by the funding script tree for a diff --git a/tapdb/assets_store_test.go b/tapdb/assets_store_test.go index 56293c60b..3cfda509e 100644 --- a/tapdb/assets_store_test.go +++ b/tapdb/assets_store_test.go @@ -2937,11 +2937,11 @@ func TestQueryAssetBalances(t *testing.T) { // At first, none of the assets should be leased. includeLeased := false balances, err := assetsStore.QueryBalancesByAsset( - ctx, nil, includeLeased, + ctx, nil, includeLeased, fn.None[asset.ScriptKeyType](), ) require.NoError(t, err) balancesByGroup, err := assetsStore.QueryAssetBalancesByGroup( - ctx, nil, includeLeased, + ctx, nil, includeLeased, fn.None[asset.ScriptKeyType](), ) require.NoError(t, err) require.Len(t, balances, numAssets) @@ -2977,14 +2977,14 @@ func TestQueryAssetBalances(t *testing.T) { // Only two assets should be returned that is not leased. unleasedBalances, err := assetsStore.QueryBalancesByAsset( - ctx, nil, includeLeased, + ctx, nil, includeLeased, fn.None[asset.ScriptKeyType](), ) require.NoError(t, err) require.Len(t, unleasedBalances, numAssets-2) // Only one group should be returned that is not leased. unleasedBalancesByGroup, err := assetsStore.QueryAssetBalancesByGroup( - ctx, nil, includeLeased, + ctx, nil, includeLeased, fn.None[asset.ScriptKeyType](), ) require.NoError(t, err) require.Len(t, unleasedBalancesByGroup, numGroups-1) @@ -3007,12 +3007,12 @@ func TestQueryAssetBalances(t *testing.T) { // the same results as when the assets where unleased. includeLeased = true includeLeasedBalances, err := assetsStore.QueryBalancesByAsset( - ctx, nil, includeLeased, + ctx, nil, includeLeased, fn.None[asset.ScriptKeyType](), ) require.NoError(t, err) require.Len(t, includeLeasedBalances, numAssets) includeLeasedBalByGroup, err := assetsStore.QueryAssetBalancesByGroup( - ctx, nil, includeLeased, + ctx, nil, includeLeased, fn.None[asset.ScriptKeyType](), ) require.NoError(t, err) require.Len(t, includeLeasedBalByGroup, len(assetGen.groupKeys)) @@ -3066,11 +3066,11 @@ func TestQueryAssetBalancesCustomChannelFunding(t *testing.T) { // Hit both balance queries, they should return the same result. includeLeased := false balances, err := assetsStore.QueryBalancesByAsset( - ctx, nil, includeLeased, + ctx, nil, includeLeased, fn.None[asset.ScriptKeyType](), ) require.NoError(t, err) balancesByGroup, err := assetsStore.QueryAssetBalancesByGroup( - ctx, nil, includeLeased, + ctx, nil, includeLeased, fn.None[asset.ScriptKeyType](), ) require.NoError(t, err) require.Len(t, balances, numAssets-1) diff --git a/tapdb/sqlc/assets.sql.go b/tapdb/sqlc/assets.sql.go index 0e2ff962d..481eeb5d7 100644 --- a/tapdb/sqlc/assets.sql.go +++ b/tapdb/sqlc/assets.sql.go @@ -2207,8 +2207,10 @@ JOIN managed_utxos utxos JOIN script_keys ON assets.script_key_id = script_keys.script_key_id WHERE spent = FALSE AND - (script_keys.tweaked_script_key != $4 OR - $4 IS NULL) + (script_keys.tweaked_script_key != $4 OR + $4 IS NULL) AND + ($5 = script_keys.key_type OR + $5 IS NULL) GROUP BY assets.genesis_id, genesis_info_view.asset_id, genesis_info_view.asset_tag, genesis_info_view.meta_hash, genesis_info_view.asset_type, genesis_info_view.output_index, @@ -2220,6 +2222,7 @@ type QueryAssetBalancesByAssetParams struct { Leased interface{} Now sql.NullTime ExcludeKey []byte + ScriptKeyType sql.NullInt16 } type QueryAssetBalancesByAssetRow struct { @@ -2242,6 +2245,7 @@ func (q *Queries) QueryAssetBalancesByAsset(ctx context.Context, arg QueryAssetB arg.Leased, arg.Now, arg.ExcludeKey, + arg.ScriptKeyType, ) if err != nil { return nil, err @@ -2294,8 +2298,10 @@ JOIN managed_utxos utxos JOIN script_keys ON assets.script_key_id = script_keys.script_key_id WHERE spent = FALSE AND - (script_keys.tweaked_script_key != $4 OR - $4 IS NULL) + (script_keys.tweaked_script_key != $4 OR + $4 IS NULL) AND + ($5 = script_keys.key_type OR + $5 IS NULL) GROUP BY key_group_info_view.tweaked_group_key ` @@ -2304,6 +2310,7 @@ type QueryAssetBalancesByGroupParams struct { Leased interface{} Now sql.NullTime ExcludeKey []byte + ScriptKeyType sql.NullInt16 } type QueryAssetBalancesByGroupRow struct { @@ -2317,6 +2324,7 @@ func (q *Queries) QueryAssetBalancesByGroup(ctx context.Context, arg QueryAssetB arg.Leased, arg.Now, arg.ExcludeKey, + arg.ScriptKeyType, ) if err != nil { return nil, err @@ -2411,29 +2419,26 @@ WHERE ( assets.anchor_utxo_id = COALESCE($11, assets.anchor_utxo_id) AND assets.genesis_id = COALESCE($12, assets.genesis_id) AND assets.script_key_id = COALESCE($13, assets.script_key_id) AND - COALESCE(length(script_keys.tweak), 0) = (CASE - WHEN cast($14 as bool) = TRUE - THEN 0 - ELSE COALESCE(length(script_keys.tweak), 0) - END) + ($14 = script_keys.key_type OR + $14 IS NULL) ) ` type QueryAssetsParams struct { - AssetIDFilter []byte - TweakedScriptKey []byte - AnchorPoint []byte - Leased interface{} - Now sql.NullTime - MinAnchorHeight sql.NullInt32 - MinAmt sql.NullInt64 - MaxAmt sql.NullInt64 - Spent sql.NullBool - KeyGroupFilter []byte - AnchorUtxoID sql.NullInt64 - GenesisID sql.NullInt64 - ScriptKeyID sql.NullInt64 - Bip86ScriptKeysOnly bool + AssetIDFilter []byte + TweakedScriptKey []byte + AnchorPoint []byte + Leased interface{} + Now sql.NullTime + MinAnchorHeight sql.NullInt32 + MinAmt sql.NullInt64 + MaxAmt sql.NullInt64 + Spent sql.NullBool + KeyGroupFilter []byte + AnchorUtxoID sql.NullInt64 + GenesisID sql.NullInt64 + ScriptKeyID sql.NullInt64 + ScriptKeyType sql.NullInt16 } type QueryAssetsRow struct { @@ -2498,7 +2503,7 @@ func (q *Queries) QueryAssets(ctx context.Context, arg QueryAssetsParams) ([]Que arg.AnchorUtxoID, arg.GenesisID, arg.ScriptKeyID, - arg.Bip86ScriptKeysOnly, + arg.ScriptKeyType, ) if err != nil { return nil, err diff --git a/tapdb/sqlc/queries/assets.sql b/tapdb/sqlc/queries/assets.sql index c5e46e7ea..8a679942d 100644 --- a/tapdb/sqlc/queries/assets.sql +++ b/tapdb/sqlc/queries/assets.sql @@ -339,8 +339,10 @@ JOIN managed_utxos utxos JOIN script_keys ON assets.script_key_id = script_keys.script_key_id WHERE spent = FALSE AND - (script_keys.tweaked_script_key != sqlc.narg('exclude_key') OR - sqlc.narg('exclude_key') IS NULL) + (script_keys.tweaked_script_key != sqlc.narg('exclude_key') OR + sqlc.narg('exclude_key') IS NULL) AND + (sqlc.narg('script_key_type') = script_keys.key_type OR + sqlc.narg('script_key_type') IS NULL) GROUP BY assets.genesis_id, genesis_info_view.asset_id, genesis_info_view.asset_tag, genesis_info_view.meta_hash, genesis_info_view.asset_type, genesis_info_view.output_index, @@ -368,8 +370,10 @@ JOIN managed_utxos utxos JOIN script_keys ON assets.script_key_id = script_keys.script_key_id WHERE spent = FALSE AND - (script_keys.tweaked_script_key != sqlc.narg('exclude_key') OR - sqlc.narg('exclude_key') IS NULL) + (script_keys.tweaked_script_key != sqlc.narg('exclude_key') OR + sqlc.narg('exclude_key') IS NULL) AND + (sqlc.narg('script_key_type') = script_keys.key_type OR + sqlc.narg('script_key_type') IS NULL) GROUP BY key_group_info_view.tweaked_group_key; -- name: FetchGroupedAssets :many @@ -502,11 +506,8 @@ WHERE ( assets.anchor_utxo_id = COALESCE(sqlc.narg('anchor_utxo_id'), assets.anchor_utxo_id) AND assets.genesis_id = COALESCE(sqlc.narg('genesis_id'), assets.genesis_id) AND assets.script_key_id = COALESCE(sqlc.narg('script_key_id'), assets.script_key_id) AND - COALESCE(length(script_keys.tweak), 0) = (CASE - WHEN cast(@bip86_script_keys_only as bool) = TRUE - THEN 0 - ELSE COALESCE(length(script_keys.tweak), 0) - END) + (sqlc.narg('script_key_type') = script_keys.key_type OR + sqlc.narg('script_key_type') IS NULL) ); -- name: AllAssets :many diff --git a/tapfreighter/coin_select.go b/tapfreighter/coin_select.go index 7906ee242..f82726d3e 100644 --- a/tapfreighter/coin_select.go +++ b/tapfreighter/coin_select.go @@ -55,6 +55,7 @@ func (s *CoinSelect) SelectCoins(ctx context.Context, AssetSpecifier: constraints.AssetSpecifier, MinAmt: 1, CoinSelectType: constraints.CoinSelectType, + ScriptKeyType: constraints.ScriptKeyType, PrevIDs: constraints.PrevIDs, DistinctSpecifier: constraints.DistinctSpecifier, } diff --git a/tapfreighter/interface.go b/tapfreighter/interface.go index cadcccf87..91051819a 100644 --- a/tapfreighter/interface.go +++ b/tapfreighter/interface.go @@ -54,6 +54,10 @@ type CommitmentConstraints struct { // key is set, we ignore the asset ID and allow multiple inputs of the // same group to be selected. DistinctSpecifier bool + + // ScriptKeyType is the type of script key the assets are expected to + // have. If this is fn.None, then any script key type is allowed. + ScriptKeyType fn.Option[asset.ScriptKeyType] } // AssetBurn holds data related to a burn of an asset. diff --git a/tapfreighter/wallet.go b/tapfreighter/wallet.go index e58102a55..9dd171432 100644 --- a/tapfreighter/wallet.go +++ b/tapfreighter/wallet.go @@ -414,6 +414,7 @@ func (f *AssetWallet) FundPacket(ctx context.Context, AssetSpecifier: fundDesc.AssetSpecifier, MinAmt: fundDesc.Amount, CoinSelectType: fundDesc.CoinSelectType, + ScriptKeyType: fundDesc.ScriptKeyType, PrevIDs: fundDesc.PrevIDs, DistinctSpecifier: fundDesc.DistinctSpecifier, } diff --git a/taprpc/marshal.go b/taprpc/marshal.go index d294321c3..29df2d4e0 100644 --- a/taprpc/marshal.go +++ b/taprpc/marshal.go @@ -692,3 +692,37 @@ func MarshalAsset(ctx context.Context, a *asset.Asset, return rpcAsset, nil } + +// ParseScriptKeyTypeQuery parses the script key type query from the RPC +// variant. +func ParseScriptKeyTypeQuery( + q *ScriptKeyTypeQuery) (fn.Option[asset.ScriptKeyType], bool, error) { + + if q == nil || q.Type == nil { + return fn.Some(asset.ScriptKeyBip86), false, nil + } + + switch t := q.Type.(type) { + case *ScriptKeyTypeQuery_ExplicitType: + explicitType, err := UnmarshalScriptKeyType(t.ExplicitType) + if err != nil { + return fn.None[asset.ScriptKeyType](), false, err + } + + includeSpent := false + switch explicitType { + case asset.ScriptKeyTombstone, asset.ScriptKeyBurn: + includeSpent = true + + default: + } + + return fn.Some(explicitType), includeSpent, nil + + case *ScriptKeyTypeQuery_AllTypes: + return fn.None[asset.ScriptKeyType](), false, nil + + default: + return fn.Some(asset.ScriptKeyBip86), false, nil + } +} diff --git a/taprpc/taprootassets.pb.go b/taprpc/taprootassets.pb.go index 760273678..77d8405aa 100644 --- a/taprpc/taprootassets.pb.go +++ b/taprpc/taprootassets.pb.go @@ -707,6 +707,13 @@ type ListAssetRequest struct { ScriptKey *ScriptKey `protobuf:"bytes,8,opt,name=script_key,json=scriptKey,proto3" json:"script_key,omitempty"` // Return all assets that are currently anchored on this outpoint. AnchorOutpoint *OutPoint `protobuf:"bytes,9,opt,name=anchor_outpoint,json=anchorOutpoint,proto3" json:"anchor_outpoint,omitempty"` + // The script key type to filter the assets by. If not set, only assets with + // a BIP-0086 script key will be returned (which is the equivalent of + // setting script_key_type.explicit_type = SCRIPT_KEY_BIP86). If the type + // is set to SCRIPT_KEY_BURN or SCRIPT_KEY_TOMBSTONE the include_spent flag + // will automatically be set to true, because assets of that type are always + // marked as spent. + ScriptKeyType *ScriptKeyTypeQuery `protobuf:"bytes,10,opt,name=script_key_type,json=scriptKeyType,proto3" json:"script_key_type,omitempty"` } func (x *ListAssetRequest) Reset() { @@ -804,6 +811,13 @@ func (x *ListAssetRequest) GetAnchorOutpoint() *OutPoint { return nil } +func (x *ListAssetRequest) GetScriptKeyType() *ScriptKeyTypeQuery { + if x != nil { + return x.ScriptKeyType + } + return nil +} + type AnchorInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2027,6 +2041,10 @@ type ListUtxosRequest struct { unknownFields protoimpl.UnknownFields IncludeLeased bool `protobuf:"varint,1,opt,name=include_leased,json=includeLeased,proto3" json:"include_leased,omitempty"` + // The script key type to filter the assets by. If not set, only assets with + // a BIP-0086 script key will be returned (which is the equivalent of + // setting script_key_type.explicit_type = SCRIPT_KEY_BIP86). + ScriptKeyType *ScriptKeyTypeQuery `protobuf:"bytes,2,opt,name=script_key_type,json=scriptKeyType,proto3" json:"script_key_type,omitempty"` } func (x *ListUtxosRequest) Reset() { @@ -2068,6 +2086,13 @@ func (x *ListUtxosRequest) GetIncludeLeased() bool { return false } +func (x *ListUtxosRequest) GetScriptKeyType() *ScriptKeyTypeQuery { + if x != nil { + return x.ScriptKeyType + } + return nil +} + type ManagedUtxo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2494,6 +2519,13 @@ type ListBalancesRequest struct { GroupKeyFilter []byte `protobuf:"bytes,4,opt,name=group_key_filter,json=groupKeyFilter,proto3" json:"group_key_filter,omitempty"` // An option to include previous leased assets in the balances. IncludeLeased bool `protobuf:"varint,5,opt,name=include_leased,json=includeLeased,proto3" json:"include_leased,omitempty"` + // The script key type to filter the assets by. If not set, only assets with + // a BIP-0086 script key will be returned (which is the equivalent of + // setting script_key_type.explicit_type = SCRIPT_KEY_BIP86). If the type + // is set to SCRIPT_KEY_BURN or SCRIPT_KEY_TOMBSTONE the include_spent flag + // will automatically be set to true, because assets of that type are always + // marked as spent. + ScriptKeyType *ScriptKeyTypeQuery `protobuf:"bytes,6,opt,name=script_key_type,json=scriptKeyType,proto3" json:"script_key_type,omitempty"` } func (x *ListBalancesRequest) Reset() { @@ -2570,6 +2602,13 @@ func (x *ListBalancesRequest) GetIncludeLeased() bool { return false } +func (x *ListBalancesRequest) GetScriptKeyType() *ScriptKeyTypeQuery { + if x != nil { + return x.ScriptKeyType + } + return nil +} + type isListBalancesRequest_GroupBy interface { isListBalancesRequest_GroupBy() } @@ -3949,6 +3988,89 @@ func (x *NewAddrRequest) GetAddressVersion() AddrVersion { return AddrVersion_ADDR_VERSION_UNSPECIFIED } +type ScriptKeyTypeQuery struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Type: + // + // *ScriptKeyTypeQuery_ExplicitType + // *ScriptKeyTypeQuery_AllTypes + Type isScriptKeyTypeQuery_Type `protobuf_oneof:"type"` +} + +func (x *ScriptKeyTypeQuery) Reset() { + *x = ScriptKeyTypeQuery{} + if protoimpl.UnsafeEnabled { + mi := &file_taprootassets_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ScriptKeyTypeQuery) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ScriptKeyTypeQuery) ProtoMessage() {} + +func (x *ScriptKeyTypeQuery) ProtoReflect() protoreflect.Message { + mi := &file_taprootassets_proto_msgTypes[43] + 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 ScriptKeyTypeQuery.ProtoReflect.Descriptor instead. +func (*ScriptKeyTypeQuery) Descriptor() ([]byte, []int) { + return file_taprootassets_proto_rawDescGZIP(), []int{43} +} + +func (m *ScriptKeyTypeQuery) GetType() isScriptKeyTypeQuery_Type { + if m != nil { + return m.Type + } + return nil +} + +func (x *ScriptKeyTypeQuery) GetExplicitType() ScriptKeyType { + if x, ok := x.GetType().(*ScriptKeyTypeQuery_ExplicitType); ok { + return x.ExplicitType + } + return ScriptKeyType_SCRIPT_KEY_UNKNOWN +} + +func (x *ScriptKeyTypeQuery) GetAllTypes() bool { + if x, ok := x.GetType().(*ScriptKeyTypeQuery_AllTypes); ok { + return x.AllTypes + } + return false +} + +type isScriptKeyTypeQuery_Type interface { + isScriptKeyTypeQuery_Type() +} + +type ScriptKeyTypeQuery_ExplicitType struct { + // Query for assets of a specific script key type. + ExplicitType ScriptKeyType `protobuf:"varint,1,opt,name=explicit_type,json=explicitType,proto3,enum=taprpc.ScriptKeyType,oneof"` +} + +type ScriptKeyTypeQuery_AllTypes struct { + // Query for assets with all script key types. + AllTypes bool `protobuf:"varint,2,opt,name=all_types,json=allTypes,proto3,oneof"` +} + +func (*ScriptKeyTypeQuery_ExplicitType) isScriptKeyTypeQuery_Type() {} + +func (*ScriptKeyTypeQuery_AllTypes) isScriptKeyTypeQuery_Type() {} + type ScriptKey struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3970,7 +4092,7 @@ type ScriptKey struct { func (x *ScriptKey) Reset() { *x = ScriptKey{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[43] + mi := &file_taprootassets_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3983,7 +4105,7 @@ func (x *ScriptKey) String() string { func (*ScriptKey) ProtoMessage() {} func (x *ScriptKey) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[43] + mi := &file_taprootassets_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3996,7 +4118,7 @@ func (x *ScriptKey) ProtoReflect() protoreflect.Message { // Deprecated: Use ScriptKey.ProtoReflect.Descriptor instead. func (*ScriptKey) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{43} + return file_taprootassets_proto_rawDescGZIP(), []int{44} } func (x *ScriptKey) GetPubKey() []byte { @@ -4041,7 +4163,7 @@ type KeyLocator struct { func (x *KeyLocator) Reset() { *x = KeyLocator{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[44] + mi := &file_taprootassets_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4054,7 +4176,7 @@ func (x *KeyLocator) String() string { func (*KeyLocator) ProtoMessage() {} func (x *KeyLocator) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[44] + mi := &file_taprootassets_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4067,7 +4189,7 @@ func (x *KeyLocator) ProtoReflect() protoreflect.Message { // Deprecated: Use KeyLocator.ProtoReflect.Descriptor instead. func (*KeyLocator) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{44} + return file_taprootassets_proto_rawDescGZIP(), []int{45} } func (x *KeyLocator) GetKeyFamily() int32 { @@ -4098,7 +4220,7 @@ type KeyDescriptor struct { func (x *KeyDescriptor) Reset() { *x = KeyDescriptor{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[45] + mi := &file_taprootassets_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4111,7 +4233,7 @@ func (x *KeyDescriptor) String() string { func (*KeyDescriptor) ProtoMessage() {} func (x *KeyDescriptor) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[45] + mi := &file_taprootassets_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4124,7 +4246,7 @@ func (x *KeyDescriptor) ProtoReflect() protoreflect.Message { // Deprecated: Use KeyDescriptor.ProtoReflect.Descriptor instead. func (*KeyDescriptor) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{45} + return file_taprootassets_proto_rawDescGZIP(), []int{46} } func (x *KeyDescriptor) GetRawKeyBytes() []byte { @@ -4153,7 +4275,7 @@ type TapscriptFullTree struct { func (x *TapscriptFullTree) Reset() { *x = TapscriptFullTree{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[46] + mi := &file_taprootassets_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4166,7 +4288,7 @@ func (x *TapscriptFullTree) String() string { func (*TapscriptFullTree) ProtoMessage() {} func (x *TapscriptFullTree) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[46] + mi := &file_taprootassets_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4179,7 +4301,7 @@ func (x *TapscriptFullTree) ProtoReflect() protoreflect.Message { // Deprecated: Use TapscriptFullTree.ProtoReflect.Descriptor instead. func (*TapscriptFullTree) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{46} + return file_taprootassets_proto_rawDescGZIP(), []int{47} } func (x *TapscriptFullTree) GetAllLeaves() []*TapLeaf { @@ -4201,7 +4323,7 @@ type TapLeaf struct { func (x *TapLeaf) Reset() { *x = TapLeaf{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[47] + mi := &file_taprootassets_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4214,7 +4336,7 @@ func (x *TapLeaf) String() string { func (*TapLeaf) ProtoMessage() {} func (x *TapLeaf) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[47] + mi := &file_taprootassets_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4227,7 +4349,7 @@ func (x *TapLeaf) ProtoReflect() protoreflect.Message { // Deprecated: Use TapLeaf.ProtoReflect.Descriptor instead. func (*TapLeaf) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{47} + return file_taprootassets_proto_rawDescGZIP(), []int{48} } func (x *TapLeaf) GetScript() []byte { @@ -4251,7 +4373,7 @@ type TapBranch struct { func (x *TapBranch) Reset() { *x = TapBranch{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[48] + mi := &file_taprootassets_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4264,7 +4386,7 @@ func (x *TapBranch) String() string { func (*TapBranch) ProtoMessage() {} func (x *TapBranch) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[48] + mi := &file_taprootassets_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4277,7 +4399,7 @@ func (x *TapBranch) ProtoReflect() protoreflect.Message { // Deprecated: Use TapBranch.ProtoReflect.Descriptor instead. func (*TapBranch) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{48} + return file_taprootassets_proto_rawDescGZIP(), []int{49} } func (x *TapBranch) GetLeftTaphash() []byte { @@ -4305,7 +4427,7 @@ type DecodeAddrRequest struct { func (x *DecodeAddrRequest) Reset() { *x = DecodeAddrRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[49] + mi := &file_taprootassets_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4318,7 +4440,7 @@ func (x *DecodeAddrRequest) String() string { func (*DecodeAddrRequest) ProtoMessage() {} func (x *DecodeAddrRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[49] + mi := &file_taprootassets_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4331,7 +4453,7 @@ func (x *DecodeAddrRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DecodeAddrRequest.ProtoReflect.Descriptor instead. func (*DecodeAddrRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{49} + return file_taprootassets_proto_rawDescGZIP(), []int{50} } func (x *DecodeAddrRequest) GetAddr() string { @@ -4355,7 +4477,7 @@ type ProofFile struct { func (x *ProofFile) Reset() { *x = ProofFile{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[50] + mi := &file_taprootassets_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4368,7 +4490,7 @@ func (x *ProofFile) String() string { func (*ProofFile) ProtoMessage() {} func (x *ProofFile) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[50] + mi := &file_taprootassets_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4381,7 +4503,7 @@ func (x *ProofFile) ProtoReflect() protoreflect.Message { // Deprecated: Use ProofFile.ProtoReflect.Descriptor instead. func (*ProofFile) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{50} + return file_taprootassets_proto_rawDescGZIP(), []int{51} } func (x *ProofFile) GetRawProofFile() []byte { @@ -4456,7 +4578,7 @@ type DecodedProof struct { func (x *DecodedProof) Reset() { *x = DecodedProof{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[51] + mi := &file_taprootassets_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4469,7 +4591,7 @@ func (x *DecodedProof) String() string { func (*DecodedProof) ProtoMessage() {} func (x *DecodedProof) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[51] + mi := &file_taprootassets_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4482,7 +4604,7 @@ func (x *DecodedProof) ProtoReflect() protoreflect.Message { // Deprecated: Use DecodedProof.ProtoReflect.Descriptor instead. func (*DecodedProof) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{51} + return file_taprootassets_proto_rawDescGZIP(), []int{52} } func (x *DecodedProof) GetProofAtDepth() uint32 { @@ -4596,7 +4718,7 @@ type VerifyProofResponse struct { func (x *VerifyProofResponse) Reset() { *x = VerifyProofResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[52] + mi := &file_taprootassets_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4609,7 +4731,7 @@ func (x *VerifyProofResponse) String() string { func (*VerifyProofResponse) ProtoMessage() {} func (x *VerifyProofResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[52] + mi := &file_taprootassets_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4622,7 +4744,7 @@ func (x *VerifyProofResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifyProofResponse.ProtoReflect.Descriptor instead. func (*VerifyProofResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{52} + return file_taprootassets_proto_rawDescGZIP(), []int{53} } func (x *VerifyProofResponse) GetValid() bool { @@ -4662,7 +4784,7 @@ type DecodeProofRequest struct { func (x *DecodeProofRequest) Reset() { *x = DecodeProofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[53] + mi := &file_taprootassets_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4675,7 +4797,7 @@ func (x *DecodeProofRequest) String() string { func (*DecodeProofRequest) ProtoMessage() {} func (x *DecodeProofRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[53] + mi := &file_taprootassets_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4688,7 +4810,7 @@ func (x *DecodeProofRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DecodeProofRequest.ProtoReflect.Descriptor instead. func (*DecodeProofRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{53} + return file_taprootassets_proto_rawDescGZIP(), []int{54} } func (x *DecodeProofRequest) GetRawProof() []byte { @@ -4730,7 +4852,7 @@ type DecodeProofResponse struct { func (x *DecodeProofResponse) Reset() { *x = DecodeProofResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[54] + mi := &file_taprootassets_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4743,7 +4865,7 @@ func (x *DecodeProofResponse) String() string { func (*DecodeProofResponse) ProtoMessage() {} func (x *DecodeProofResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[54] + mi := &file_taprootassets_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4756,7 +4878,7 @@ func (x *DecodeProofResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DecodeProofResponse.ProtoReflect.Descriptor instead. func (*DecodeProofResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{54} + return file_taprootassets_proto_rawDescGZIP(), []int{55} } func (x *DecodeProofResponse) GetDecodedProof() *DecodedProof { @@ -4779,7 +4901,7 @@ type ExportProofRequest struct { func (x *ExportProofRequest) Reset() { *x = ExportProofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[55] + mi := &file_taprootassets_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4792,7 +4914,7 @@ func (x *ExportProofRequest) String() string { func (*ExportProofRequest) ProtoMessage() {} func (x *ExportProofRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[55] + mi := &file_taprootassets_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4805,7 +4927,7 @@ func (x *ExportProofRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportProofRequest.ProtoReflect.Descriptor instead. func (*ExportProofRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{55} + return file_taprootassets_proto_rawDescGZIP(), []int{56} } func (x *ExportProofRequest) GetAssetId() []byte { @@ -4842,7 +4964,7 @@ type UnpackProofFileRequest struct { func (x *UnpackProofFileRequest) Reset() { *x = UnpackProofFileRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[56] + mi := &file_taprootassets_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4855,7 +4977,7 @@ func (x *UnpackProofFileRequest) String() string { func (*UnpackProofFileRequest) ProtoMessage() {} func (x *UnpackProofFileRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[56] + mi := &file_taprootassets_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4868,7 +4990,7 @@ func (x *UnpackProofFileRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UnpackProofFileRequest.ProtoReflect.Descriptor instead. func (*UnpackProofFileRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{56} + return file_taprootassets_proto_rawDescGZIP(), []int{57} } func (x *UnpackProofFileRequest) GetRawProofFile() []byte { @@ -4892,7 +5014,7 @@ type UnpackProofFileResponse struct { func (x *UnpackProofFileResponse) Reset() { *x = UnpackProofFileResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[57] + mi := &file_taprootassets_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4905,7 +5027,7 @@ func (x *UnpackProofFileResponse) String() string { func (*UnpackProofFileResponse) ProtoMessage() {} func (x *UnpackProofFileResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[57] + mi := &file_taprootassets_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4918,7 +5040,7 @@ func (x *UnpackProofFileResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UnpackProofFileResponse.ProtoReflect.Descriptor instead. func (*UnpackProofFileResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{57} + return file_taprootassets_proto_rawDescGZIP(), []int{58} } func (x *UnpackProofFileResponse) GetRawProofs() [][]byte { @@ -4958,7 +5080,7 @@ type AddrEvent struct { func (x *AddrEvent) Reset() { *x = AddrEvent{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[58] + mi := &file_taprootassets_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4971,7 +5093,7 @@ func (x *AddrEvent) String() string { func (*AddrEvent) ProtoMessage() {} func (x *AddrEvent) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[58] + mi := &file_taprootassets_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4984,7 +5106,7 @@ func (x *AddrEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AddrEvent.ProtoReflect.Descriptor instead. func (*AddrEvent) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{58} + return file_taprootassets_proto_rawDescGZIP(), []int{59} } func (x *AddrEvent) GetCreationTimeUnixSeconds() uint64 { @@ -5057,7 +5179,7 @@ type AddrReceivesRequest struct { func (x *AddrReceivesRequest) Reset() { *x = AddrReceivesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[59] + mi := &file_taprootassets_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5070,7 +5192,7 @@ func (x *AddrReceivesRequest) String() string { func (*AddrReceivesRequest) ProtoMessage() {} func (x *AddrReceivesRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[59] + mi := &file_taprootassets_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5083,7 +5205,7 @@ func (x *AddrReceivesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddrReceivesRequest.ProtoReflect.Descriptor instead. func (*AddrReceivesRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{59} + return file_taprootassets_proto_rawDescGZIP(), []int{60} } func (x *AddrReceivesRequest) GetFilterAddr() string { @@ -5112,7 +5234,7 @@ type AddrReceivesResponse struct { func (x *AddrReceivesResponse) Reset() { *x = AddrReceivesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[60] + mi := &file_taprootassets_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5125,7 +5247,7 @@ func (x *AddrReceivesResponse) String() string { func (*AddrReceivesResponse) ProtoMessage() {} func (x *AddrReceivesResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[60] + mi := &file_taprootassets_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5138,7 +5260,7 @@ func (x *AddrReceivesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AddrReceivesResponse.ProtoReflect.Descriptor instead. func (*AddrReceivesResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{60} + return file_taprootassets_proto_rawDescGZIP(), []int{61} } func (x *AddrReceivesResponse) GetEvents() []*AddrEvent { @@ -5165,7 +5287,7 @@ type SendAssetRequest struct { func (x *SendAssetRequest) Reset() { *x = SendAssetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[61] + mi := &file_taprootassets_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5178,7 +5300,7 @@ func (x *SendAssetRequest) String() string { func (*SendAssetRequest) ProtoMessage() {} func (x *SendAssetRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[61] + mi := &file_taprootassets_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5191,7 +5313,7 @@ func (x *SendAssetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SendAssetRequest.ProtoReflect.Descriptor instead. func (*SendAssetRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{61} + return file_taprootassets_proto_rawDescGZIP(), []int{62} } func (x *SendAssetRequest) GetTapAddrs() []string { @@ -5229,7 +5351,7 @@ type PrevInputAsset struct { func (x *PrevInputAsset) Reset() { *x = PrevInputAsset{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[62] + mi := &file_taprootassets_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5242,7 +5364,7 @@ func (x *PrevInputAsset) String() string { func (*PrevInputAsset) ProtoMessage() {} func (x *PrevInputAsset) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[62] + mi := &file_taprootassets_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5255,7 +5377,7 @@ func (x *PrevInputAsset) ProtoReflect() protoreflect.Message { // Deprecated: Use PrevInputAsset.ProtoReflect.Descriptor instead. func (*PrevInputAsset) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{62} + return file_taprootassets_proto_rawDescGZIP(), []int{63} } func (x *PrevInputAsset) GetAnchorPoint() string { @@ -5297,7 +5419,7 @@ type SendAssetResponse struct { func (x *SendAssetResponse) Reset() { *x = SendAssetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[63] + mi := &file_taprootassets_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5310,7 +5432,7 @@ func (x *SendAssetResponse) String() string { func (*SendAssetResponse) ProtoMessage() {} func (x *SendAssetResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[63] + mi := &file_taprootassets_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5323,7 +5445,7 @@ func (x *SendAssetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SendAssetResponse.ProtoReflect.Descriptor instead. func (*SendAssetResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{63} + return file_taprootassets_proto_rawDescGZIP(), []int{64} } func (x *SendAssetResponse) GetTransfer() *AssetTransfer { @@ -5342,7 +5464,7 @@ type GetInfoRequest struct { func (x *GetInfoRequest) Reset() { *x = GetInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[64] + mi := &file_taprootassets_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5355,7 +5477,7 @@ func (x *GetInfoRequest) String() string { func (*GetInfoRequest) ProtoMessage() {} func (x *GetInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[64] + mi := &file_taprootassets_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5368,7 +5490,7 @@ func (x *GetInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetInfoRequest.ProtoReflect.Descriptor instead. func (*GetInfoRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{64} + return file_taprootassets_proto_rawDescGZIP(), []int{65} } type GetInfoResponse struct { @@ -5389,7 +5511,7 @@ type GetInfoResponse struct { func (x *GetInfoResponse) Reset() { *x = GetInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[65] + mi := &file_taprootassets_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5402,7 +5524,7 @@ func (x *GetInfoResponse) String() string { func (*GetInfoResponse) ProtoMessage() {} func (x *GetInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[65] + mi := &file_taprootassets_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5415,7 +5537,7 @@ func (x *GetInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetInfoResponse.ProtoReflect.Descriptor instead. func (*GetInfoResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{65} + return file_taprootassets_proto_rawDescGZIP(), []int{66} } func (x *GetInfoResponse) GetVersion() string { @@ -5491,7 +5613,7 @@ type FetchAssetMetaRequest struct { func (x *FetchAssetMetaRequest) Reset() { *x = FetchAssetMetaRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[66] + mi := &file_taprootassets_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5504,7 +5626,7 @@ func (x *FetchAssetMetaRequest) String() string { func (*FetchAssetMetaRequest) ProtoMessage() {} func (x *FetchAssetMetaRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[66] + mi := &file_taprootassets_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5517,7 +5639,7 @@ func (x *FetchAssetMetaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchAssetMetaRequest.ProtoReflect.Descriptor instead. func (*FetchAssetMetaRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{66} + return file_taprootassets_proto_rawDescGZIP(), []int{67} } func (m *FetchAssetMetaRequest) GetAsset() isFetchAssetMetaRequest_Asset { @@ -5609,7 +5731,7 @@ type BurnAssetRequest struct { func (x *BurnAssetRequest) Reset() { *x = BurnAssetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[67] + mi := &file_taprootassets_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5622,7 +5744,7 @@ func (x *BurnAssetRequest) String() string { func (*BurnAssetRequest) ProtoMessage() {} func (x *BurnAssetRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[67] + mi := &file_taprootassets_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5635,7 +5757,7 @@ func (x *BurnAssetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BurnAssetRequest.ProtoReflect.Descriptor instead. func (*BurnAssetRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{67} + return file_taprootassets_proto_rawDescGZIP(), []int{68} } func (m *BurnAssetRequest) GetAsset() isBurnAssetRequest_Asset { @@ -5712,7 +5834,7 @@ type BurnAssetResponse struct { func (x *BurnAssetResponse) Reset() { *x = BurnAssetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[68] + mi := &file_taprootassets_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5725,7 +5847,7 @@ func (x *BurnAssetResponse) String() string { func (*BurnAssetResponse) ProtoMessage() {} func (x *BurnAssetResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[68] + mi := &file_taprootassets_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5738,7 +5860,7 @@ func (x *BurnAssetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use BurnAssetResponse.ProtoReflect.Descriptor instead. func (*BurnAssetResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{68} + return file_taprootassets_proto_rawDescGZIP(), []int{69} } func (x *BurnAssetResponse) GetBurnTransfer() *AssetTransfer { @@ -5771,7 +5893,7 @@ type ListBurnsRequest struct { func (x *ListBurnsRequest) Reset() { *x = ListBurnsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[69] + mi := &file_taprootassets_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5784,7 +5906,7 @@ func (x *ListBurnsRequest) String() string { func (*ListBurnsRequest) ProtoMessage() {} func (x *ListBurnsRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[69] + mi := &file_taprootassets_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5797,7 +5919,7 @@ func (x *ListBurnsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListBurnsRequest.ProtoReflect.Descriptor instead. func (*ListBurnsRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{69} + return file_taprootassets_proto_rawDescGZIP(), []int{70} } func (x *ListBurnsRequest) GetAssetId() []byte { @@ -5841,7 +5963,7 @@ type AssetBurn struct { func (x *AssetBurn) Reset() { *x = AssetBurn{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[70] + mi := &file_taprootassets_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5854,7 +5976,7 @@ func (x *AssetBurn) String() string { func (*AssetBurn) ProtoMessage() {} func (x *AssetBurn) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[70] + mi := &file_taprootassets_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5867,7 +5989,7 @@ func (x *AssetBurn) ProtoReflect() protoreflect.Message { // Deprecated: Use AssetBurn.ProtoReflect.Descriptor instead. func (*AssetBurn) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{70} + return file_taprootassets_proto_rawDescGZIP(), []int{71} } func (x *AssetBurn) GetNote() string { @@ -5916,7 +6038,7 @@ type ListBurnsResponse struct { func (x *ListBurnsResponse) Reset() { *x = ListBurnsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[71] + mi := &file_taprootassets_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5929,7 +6051,7 @@ func (x *ListBurnsResponse) String() string { func (*ListBurnsResponse) ProtoMessage() {} func (x *ListBurnsResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[71] + mi := &file_taprootassets_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5942,7 +6064,7 @@ func (x *ListBurnsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListBurnsResponse.ProtoReflect.Descriptor instead. func (*ListBurnsResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{71} + return file_taprootassets_proto_rawDescGZIP(), []int{72} } func (x *ListBurnsResponse) GetBurns() []*AssetBurn { @@ -5966,7 +6088,7 @@ type OutPoint struct { func (x *OutPoint) Reset() { *x = OutPoint{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[72] + mi := &file_taprootassets_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5979,7 +6101,7 @@ func (x *OutPoint) String() string { func (*OutPoint) ProtoMessage() {} func (x *OutPoint) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[72] + mi := &file_taprootassets_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5992,7 +6114,7 @@ func (x *OutPoint) ProtoReflect() protoreflect.Message { // Deprecated: Use OutPoint.ProtoReflect.Descriptor instead. func (*OutPoint) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{72} + return file_taprootassets_proto_rawDescGZIP(), []int{73} } func (x *OutPoint) GetTxid() []byte { @@ -6025,7 +6147,7 @@ type SubscribeReceiveEventsRequest struct { func (x *SubscribeReceiveEventsRequest) Reset() { *x = SubscribeReceiveEventsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[73] + mi := &file_taprootassets_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6038,7 +6160,7 @@ func (x *SubscribeReceiveEventsRequest) String() string { func (*SubscribeReceiveEventsRequest) ProtoMessage() {} func (x *SubscribeReceiveEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[73] + mi := &file_taprootassets_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6051,7 +6173,7 @@ func (x *SubscribeReceiveEventsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeReceiveEventsRequest.ProtoReflect.Descriptor instead. func (*SubscribeReceiveEventsRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{73} + return file_taprootassets_proto_rawDescGZIP(), []int{74} } func (x *SubscribeReceiveEventsRequest) GetFilterAddr() string { @@ -6093,7 +6215,7 @@ type ReceiveEvent struct { func (x *ReceiveEvent) Reset() { *x = ReceiveEvent{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[74] + mi := &file_taprootassets_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6106,7 +6228,7 @@ func (x *ReceiveEvent) String() string { func (*ReceiveEvent) ProtoMessage() {} func (x *ReceiveEvent) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[74] + mi := &file_taprootassets_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6119,7 +6241,7 @@ func (x *ReceiveEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use ReceiveEvent.ProtoReflect.Descriptor instead. func (*ReceiveEvent) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{74} + return file_taprootassets_proto_rawDescGZIP(), []int{75} } func (x *ReceiveEvent) GetTimestamp() int64 { @@ -6180,7 +6302,7 @@ type SubscribeSendEventsRequest struct { func (x *SubscribeSendEventsRequest) Reset() { *x = SubscribeSendEventsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[75] + mi := &file_taprootassets_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6193,7 +6315,7 @@ func (x *SubscribeSendEventsRequest) String() string { func (*SubscribeSendEventsRequest) ProtoMessage() {} func (x *SubscribeSendEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[75] + mi := &file_taprootassets_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6206,7 +6328,7 @@ func (x *SubscribeSendEventsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeSendEventsRequest.ProtoReflect.Descriptor instead. func (*SubscribeSendEventsRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{75} + return file_taprootassets_proto_rawDescGZIP(), []int{76} } func (x *SubscribeSendEventsRequest) GetFilterScriptKey() []byte { @@ -6261,7 +6383,7 @@ type SendEvent struct { func (x *SendEvent) Reset() { *x = SendEvent{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[76] + mi := &file_taprootassets_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6274,7 +6396,7 @@ func (x *SendEvent) String() string { func (*SendEvent) ProtoMessage() {} func (x *SendEvent) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[76] + mi := &file_taprootassets_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6287,7 +6409,7 @@ func (x *SendEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use SendEvent.ProtoReflect.Descriptor instead. func (*SendEvent) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{76} + return file_taprootassets_proto_rawDescGZIP(), []int{77} } func (x *SendEvent) GetTimestamp() int64 { @@ -6384,7 +6506,7 @@ type AnchorTransaction struct { func (x *AnchorTransaction) Reset() { *x = AnchorTransaction{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[77] + mi := &file_taprootassets_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6397,7 +6519,7 @@ func (x *AnchorTransaction) String() string { func (*AnchorTransaction) ProtoMessage() {} func (x *AnchorTransaction) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[77] + mi := &file_taprootassets_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6410,7 +6532,7 @@ func (x *AnchorTransaction) ProtoReflect() protoreflect.Message { // Deprecated: Use AnchorTransaction.ProtoReflect.Descriptor instead. func (*AnchorTransaction) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{77} + return file_taprootassets_proto_rawDescGZIP(), []int{78} } func (x *AnchorTransaction) GetAnchorPsbt() []byte { @@ -6473,7 +6595,7 @@ type RegisterTransferRequest struct { func (x *RegisterTransferRequest) Reset() { *x = RegisterTransferRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[78] + mi := &file_taprootassets_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6486,7 +6608,7 @@ func (x *RegisterTransferRequest) String() string { func (*RegisterTransferRequest) ProtoMessage() {} func (x *RegisterTransferRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[78] + mi := &file_taprootassets_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6499,7 +6621,7 @@ func (x *RegisterTransferRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RegisterTransferRequest.ProtoReflect.Descriptor instead. func (*RegisterTransferRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{78} + return file_taprootassets_proto_rawDescGZIP(), []int{79} } func (x *RegisterTransferRequest) GetAssetId() []byte { @@ -6541,7 +6663,7 @@ type RegisterTransferResponse struct { func (x *RegisterTransferResponse) Reset() { *x = RegisterTransferResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[79] + mi := &file_taprootassets_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6554,7 +6676,7 @@ func (x *RegisterTransferResponse) String() string { func (*RegisterTransferResponse) ProtoMessage() {} func (x *RegisterTransferResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[79] + mi := &file_taprootassets_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6567,7 +6689,7 @@ func (x *RegisterTransferResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RegisterTransferResponse.ProtoReflect.Descriptor instead. func (*RegisterTransferResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{79} + return file_taprootassets_proto_rawDescGZIP(), []int{80} } func (x *RegisterTransferResponse) GetRegisteredAsset() *Asset { @@ -6588,7 +6710,7 @@ var file_taprootassets_proto_rawDesc = []byte{ 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x22, 0x85, 0x03, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x22, 0xc9, 0x03, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x77, 0x69, 0x74, 0x68, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x23, @@ -6612,1000 +6734,1020 @@ var file_taprootassets_proto_rawDesc = []byte{ 0x4b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x0f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, - 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x92, - 0x02, 0x0a, 0x0a, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x0a, - 0x09, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x08, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x6e, - 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, - 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, - 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, - 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x6f, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, - 0x6f, 0x6f, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, - 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, - 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x22, 0xd3, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, - 0x73, 0x69, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, - 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x79, 0x0a, 0x0b, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x78, 0x70, 0x75, 0x62, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x78, 0x70, 0x75, 0x62, 0x12, 0x2d, 0x0a, 0x12, - 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, - 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x64, - 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x61, 0x74, 0x68, 0x22, 0xf9, 0x01, 0x0a, 0x0f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x07, 0x72, 0x61, 0x77, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, - 0x52, 0x06, 0x72, 0x61, 0x77, 0x4b, 0x65, 0x79, 0x12, 0x3a, 0x0a, 0x0e, 0x61, 0x6e, 0x63, 0x68, - 0x6f, 0x72, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, - 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x47, 0x65, 0x6e, - 0x65, 0x73, 0x69, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x61, - 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6e, - 0x65, 0x77, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, - 0x6e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x36, 0x0a, 0x0c, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x4b, 0x65, 0x79, 0x52, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, - 0x22, 0x3a, 0x0a, 0x05, 0x54, 0x78, 0x4f, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x70, 0x6b, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x08, 0x70, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x9c, 0x01, 0x0a, - 0x0e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x54, 0x78, 0x12, - 0x20, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x78, 0x4f, - 0x75, 0x74, 0x52, 0x07, 0x70, 0x72, 0x65, 0x76, 0x4f, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x67, - 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x09, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x77, - 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0a, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x22, 0x47, 0x0a, 0x0c, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x67, - 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x09, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x69, - 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x07, 0x77, 0x69, 0x74, - 0x6e, 0x65, 0x73, 0x73, 0x22, 0xa8, 0x01, 0x0a, 0x0a, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x61, 0x77, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x72, 0x61, 0x77, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x77, 0x65, 0x61, 0x6b, - 0x65, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0f, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x77, 0x69, 0x74, - 0x6e, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x70, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0d, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x22, - 0x5b, 0x0a, 0x0e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x76, 0x65, 0x61, - 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x61, 0x77, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x72, 0x61, 0x77, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, - 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x54, 0x0a, 0x0d, - 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x43, 0x0a, - 0x13, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, - 0x76, 0x65, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x11, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x76, 0x65, - 0x61, 0x6c, 0x22, 0x39, 0x0a, 0x0e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x5f, - 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x64, - 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x22, 0xe0, 0x06, - 0x0a, 0x05, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x2e, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x42, + 0x0a, 0x0f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x0d, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, + 0x70, 0x65, 0x22, 0x92, 0x02, 0x0a, 0x0a, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x12, 0x2a, + 0x0a, 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x6e, 0x63, 0x68, 0x6f, + 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, + 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x65, 0x72, + 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x61, 0x70, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, 0x62, + 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0xd3, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x6e, 0x65, + 0x73, 0x69, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, + 0x69, 0x73, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, 0x19, 0x0a, + 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x79, 0x0a, + 0x0b, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, + 0x78, 0x70, 0x75, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x78, 0x70, 0x75, 0x62, + 0x12, 0x2d, 0x0a, 0x12, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, + 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x6d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, + 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x22, 0xf9, 0x01, 0x0a, 0x0f, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x07, + 0x72, 0x61, 0x77, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x72, 0x61, 0x77, 0x4b, 0x65, 0x79, 0x12, 0x3a, 0x0a, 0x0e, + 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, + 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x61, 0x6e, 0x63, 0x68, 0x6f, + 0x72, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x70, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0d, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, + 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x36, 0x0a, 0x0c, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x4b, 0x65, 0x79, 0x22, 0x3a, 0x0a, 0x05, 0x54, 0x78, 0x4f, 0x75, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6b, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x22, 0x9c, 0x01, 0x0a, 0x0e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, + 0x6c, 0x54, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6f, 0x75, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x54, 0x78, 0x4f, 0x75, 0x74, 0x52, 0x07, 0x70, 0x72, 0x65, 0x76, 0x4f, 0x75, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x09, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, 0x64, 0x12, 0x1f, + 0x0a, 0x0b, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x22, + 0x47, 0x0a, 0x0c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, + 0x1d, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x09, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, 0x64, 0x12, 0x18, + 0x0a, 0x07, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, + 0x07, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x22, 0xa8, 0x01, 0x0a, 0x0a, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x61, 0x77, 0x5f, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, + 0x72, 0x61, 0x77, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x74, + 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x25, 0x0a, 0x0e, + 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, + 0x6f, 0x6f, 0x74, 0x22, 0x5b, 0x0a, 0x0e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x52, + 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x61, 0x77, 0x5f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x72, 0x61, + 0x77, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x70, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0d, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, 0x6f, 0x6f, 0x74, + 0x22, 0x54, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x52, 0x65, 0x76, 0x65, 0x61, + 0x6c, 0x12, 0x43, 0x0a, 0x13, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x62, 0x61, 0x73, + 0x65, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, - 0x73, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6c, 0x6f, - 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, - 0x76, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x10, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x4c, 0x6f, 0x63, 0x6b, - 0x54, 0x69, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x13, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, - 0x65, 0x79, 0x49, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x33, 0x0a, 0x0b, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x35, - 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x6e, - 0x63, 0x68, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x41, - 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x3a, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x77, 0x69, - 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x57, 0x69, 0x74, 0x6e, 0x65, - 0x73, 0x73, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, - 0x73, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x53, 0x70, 0x65, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0a, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x0a, - 0x0c, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x79, - 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x62, 0x75, 0x72, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x69, 0x73, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x39, 0x0a, 0x19, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, - 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x4b, - 0x6e, 0x6f, 0x77, 0x6e, 0x12, 0x3a, 0x0a, 0x1a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, - 0x65, 0x79, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x61, 0x74, 0x68, - 0x12, 0x3f, 0x0a, 0x0f, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x70, - 0x6c, 0x61, 0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x52, 0x0e, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x12, 0x3d, 0x0a, 0x0f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x0d, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, - 0x22, 0xa1, 0x01, 0x0a, 0x0b, 0x50, 0x72, 0x65, 0x76, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, - 0x12, 0x2f, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x70, 0x72, 0x65, 0x76, 0x49, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x78, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, 0x74, 0x78, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, - 0x12, 0x42, 0x0a, 0x10, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x0f, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3f, 0x0a, 0x0f, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x0a, 0x72, 0x6f, 0x6f, 0x74, 0x5f, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x09, 0x72, 0x6f, 0x6f, 0x74, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x22, 0x9c, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x73, 0x12, 0x33, 0x0a, 0x15, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, - 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x14, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x75, 0x6e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x6d, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x10, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4d, - 0x69, 0x6e, 0x74, 0x73, 0x22, 0x39, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x22, - 0xa9, 0x02, 0x0a, 0x0b, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x12, - 0x1b, 0x0a, 0x09, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, - 0x61, 0x6d, 0x74, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, - 0x6d, 0x74, 0x53, 0x61, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x61, 0x70, 0x72, - 0x6f, 0x6f, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, - 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x65, 0x72, - 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x25, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x1f, - 0x0a, 0x0b, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, - 0x2a, 0x0a, 0x11, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, - 0x75, 0x6e, 0x69, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6c, 0x65, 0x61, 0x73, - 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x79, 0x55, 0x6e, 0x69, 0x78, 0x22, 0xbb, 0x01, 0x0a, 0x11, - 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x50, 0x0a, 0x0d, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x75, 0x74, 0x78, - 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, - 0x78, 0x6f, 0x73, 0x1a, 0x54, 0x0a, 0x11, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, - 0x78, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x13, 0x0a, 0x11, 0x4c, 0x69, 0x73, - 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x8d, - 0x02, 0x0a, 0x12, 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x52, 0x65, 0x61, - 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x42, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x22, 0x39, 0x0a, 0x0e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, + 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x63, 0x69, + 0x6d, 0x61, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0e, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x22, 0xe0, 0x06, 0x0a, 0x05, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x2e, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x0d, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, + 0x73, 0x69, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x47, 0x65, + 0x6e, 0x65, 0x73, 0x69, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, - 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, - 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2e, - 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x43, - 0x0a, 0x0d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, - 0x32, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, 0x75, - 0x6d, 0x61, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x06, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x73, 0x22, 0xa6, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x1a, 0x50, 0x0a, 0x0b, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, - 0x13, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, - 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, - 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, - 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x25, 0x0a, - 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x65, - 0x61, 0x73, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x62, 0x79, - 0x22, 0x62, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x12, 0x38, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x22, 0x4a, 0x0a, 0x11, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x22, 0x90, 0x03, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x0e, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x12, 0x66, 0x0a, 0x14, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x34, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x61, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x1a, 0x56, 0x0a, 0x12, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x60, 0x0a, 0x17, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x37, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, - 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, 0x22, 0x4c, 0x0a, 0x15, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, - 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x0a, 0x09, 0x43, 0x68, - 0x61, 0x69, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x68, - 0x61, 0x73, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, - 0x61, 0x73, 0x68, 0x53, 0x74, 0x72, 0x22, 0xb8, 0x03, 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x6e, 0x63, 0x68, 0x6f, - 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0c, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x31, 0x0a, - 0x15, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x5f, 0x68, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x61, 0x6e, - 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x48, 0x69, 0x6e, 0x74, - 0x12, 0x2f, 0x0a, 0x14, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x63, 0x68, - 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, - 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x65, 0x65, - 0x73, 0x12, 0x2d, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, - 0x12, 0x30, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x73, 0x12, 0x42, 0x0a, 0x14, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x48, - 0x61, 0x73, 0x68, 0x52, 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x33, 0x0a, 0x16, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, - 0x5f, 0x74, 0x78, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x22, 0x84, 0x01, 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, - 0x72, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0d, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x2d, + 0x0a, 0x13, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x73, 0x5f, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x49, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x33, 0x0a, + 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x61, 0x6e, 0x63, 0x68, + 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x3a, 0x0a, 0x0e, 0x70, 0x72, 0x65, + 0x76, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x57, + 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x57, 0x69, 0x74, 0x6e, + 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x73, 0x70, 0x65, 0x6e, + 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x53, 0x70, 0x65, 0x6e, 0x74, + 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4f, 0x77, 0x6e, 0x65, + 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x45, 0x78, + 0x70, 0x69, 0x72, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x62, 0x75, 0x72, 0x6e, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x39, 0x0a, + 0x19, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x64, 0x65, 0x63, 0x6c, + 0x61, 0x72, 0x65, 0x64, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x16, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x44, 0x65, 0x63, 0x6c, 0x61, + 0x72, 0x65, 0x64, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x12, 0x3a, 0x0a, 0x1a, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x50, 0x61, 0x74, 0x68, 0x12, 0x3f, 0x0a, 0x0f, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x5f, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x52, 0x0e, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x12, 0x3d, 0x0a, 0x0f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, + 0x6b, 0x65, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, + 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, + 0x54, 0x79, 0x70, 0x65, 0x22, 0xa1, 0x01, 0x0a, 0x0b, 0x50, 0x72, 0x65, 0x76, 0x57, 0x69, 0x74, + 0x6e, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, + 0x72, 0x65, 0x76, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x70, + 0x72, 0x65, 0x76, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x78, 0x5f, 0x77, 0x69, 0x74, 0x6e, + 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, 0x74, 0x78, 0x57, 0x69, 0x74, + 0x6e, 0x65, 0x73, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0f, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3f, 0x0a, 0x0f, 0x53, 0x70, 0x6c, 0x69, + 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x0a, 0x72, + 0x6f, 0x6f, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x09, + 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x22, 0x9c, 0x01, 0x0a, 0x11, 0x4c, 0x69, + 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x25, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x33, 0x0a, 0x15, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, + 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x75, + 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x6d, 0x69, 0x6e, 0x74, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, + 0x6d, 0x65, 0x64, 0x4d, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x7d, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, + 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x65, 0x61, + 0x73, 0x65, 0x64, 0x12, 0x42, 0x0a, 0x0f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, + 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, + 0x79, 0x70, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x0d, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x22, 0xa9, 0x02, 0x0a, 0x0b, 0x4d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x75, 0x74, 0x5f, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x50, + 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x6d, 0x74, 0x5f, 0x73, 0x61, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x6d, 0x74, 0x53, 0x61, 0x74, 0x12, 0x21, 0x0a, + 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, + 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, + 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1f, + 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, + 0x25, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0f, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x79, 0x55, + 0x6e, 0x69, 0x78, 0x22, 0xbb, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a, 0x0d, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x64, 0x5f, 0x75, 0x74, 0x78, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, + 0x78, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x1a, 0x54, 0x0a, 0x11, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x13, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x8d, 0x02, 0x0a, 0x12, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, + 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, + 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, + 0x61, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, + 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x0d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x65, + 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x61, + 0x62, 0x6c, 0x65, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0xa6, 0x01, 0x0a, 0x12, + 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x73, 0x1a, 0x50, 0x0a, 0x0b, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x95, 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x08, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, + 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x08, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x10, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x5f, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x12, 0x42, 0x0a, 0x0f, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x0d, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, + 0x42, 0x0a, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x62, 0x79, 0x22, 0x62, 0x0a, 0x0c, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x0d, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x6e, + 0x65, 0x73, 0x69, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x47, + 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x22, 0x4a, 0x0a, 0x11, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, + 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x90, 0x03, 0x0a, + 0x14, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x0e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x62, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x66, 0x0a, + 0x14, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x62, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x12, 0x61, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x1a, 0x56, 0x0a, 0x12, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x60, 0x0a, + 0x17, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x37, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, + 0x72, 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, 0x22, 0x4c, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x33, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x09, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x48, + 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x61, 0x73, 0x68, 0x5f, + 0x73, 0x74, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x61, 0x73, 0x68, 0x53, + 0x74, 0x72, 0x22, 0xb8, 0x03, 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x61, 0x6e, 0x63, + 0x68, 0x6f, 0x72, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x31, 0x0a, 0x15, 0x61, 0x6e, 0x63, + 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x68, 0x69, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, + 0x54, 0x78, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x14, + 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, + 0x66, 0x65, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x61, 0x6e, 0x63, 0x68, + 0x6f, 0x72, 0x54, 0x78, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x65, 0x65, 0x73, 0x12, 0x2d, 0x0a, + 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x52, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x07, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x42, + 0x0a, 0x14, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x52, + 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, + 0x73, 0x68, 0x12, 0x33, 0x0a, 0x16, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x13, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x84, 0x01, + 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, + 0x21, 0x0a, 0x0c, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x6f, 0x69, + 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xb2, 0x02, 0x0a, 0x14, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x1a, 0x0a, + 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, + 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, + 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, + 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, + 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x73, + 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, + 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x2c, + 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x50, + 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, + 0x70, 0x6b, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x08, 0x70, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0xae, 0x04, 0x0a, 0x0e, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x34, 0x0a, 0x06, + 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x52, 0x06, 0x61, 0x6e, 0x63, 0x68, + 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, + 0x79, 0x12, 0x2d, 0x0a, 0x13, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, + 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x49, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xb2, 0x02, 0x0a, 0x14, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x41, 0x6e, 0x63, 0x68, 0x6f, - 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, - 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x72, - 0x6f, 0x6f, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x6b, 0x6c, - 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x5f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x33, + 0x0a, 0x16, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x72, + 0x6f, 0x6f, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x13, + 0x73, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x48, + 0x61, 0x73, 0x68, 0x12, 0x33, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x6f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, + 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4f, + 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x65, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x22, 0x0d, 0x0a, 0x0b, 0x53, 0x74, + 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x0e, 0x0a, 0x0c, 0x53, 0x74, 0x6f, + 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x0a, 0x11, 0x44, 0x65, 0x62, + 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x68, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x73, 0x68, + 0x6f, 0x77, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x73, 0x70, 0x65, 0x63, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x53, 0x70, 0x65, + 0x63, 0x22, 0x35, 0x0a, 0x12, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x75, 0x62, 0x5f, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x75, + 0x62, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x22, 0xe6, 0x03, 0x0a, 0x04, 0x41, 0x64, 0x64, + 0x72, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, + 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, + 0x2b, 0x0a, 0x11, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x73, 0x69, 0x62, + 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x12, + 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, + 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, + 0x6f, 0x6f, 0x66, 0x5f, 0x63, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x43, 0x6f, 0x75, + 0x72, 0x69, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x39, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x0e, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x8c, 0x01, 0x0a, 0x10, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x65, 0x66, 0x6f, + 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x22, 0x37, 0x0a, 0x11, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x05, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, + 0x64, 0x72, 0x52, 0x05, 0x61, 0x64, 0x64, 0x72, 0x73, 0x22, 0xfd, 0x02, 0x0a, 0x0e, 0x4e, 0x65, + 0x77, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6d, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x61, 0x6d, 0x74, 0x12, 0x30, 0x0a, 0x0a, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, + 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x38, 0x0a, 0x0c, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4b, 0x65, 0x79, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, - 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, - 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, - 0x6e, 0x75, 0x6d, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, - 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6b, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0xae, 0x04, - 0x0a, 0x0e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x12, 0x34, 0x0a, 0x06, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x52, 0x06, - 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x13, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, - 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x10, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x49, 0x73, 0x4c, - 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, - 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x6c, - 0x6f, 0x62, 0x12, 0x33, 0x0a, 0x16, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x13, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, - 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x33, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0d, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, - 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, - 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x10, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x4f, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x13, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x22, 0x0d, - 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x0e, 0x0a, - 0x0c, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x0a, - 0x11, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x68, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x04, 0x73, 0x68, 0x6f, 0x77, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, - 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x65, 0x76, 0x65, - 0x6c, 0x53, 0x70, 0x65, 0x63, 0x22, 0x35, 0x0a, 0x12, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, - 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, - 0x75, 0x62, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x73, 0x75, 0x62, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x22, 0xe6, 0x03, 0x0a, - 0x04, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x12, - 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x0a, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, - 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, - 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, - 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x4b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, - 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, - 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, - 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x2c, - 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x63, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x5f, - 0x61, 0x64, 0x64, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x6f, - 0x66, 0x43, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x39, 0x0a, 0x0d, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x8c, 0x01, 0x0a, 0x10, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, - 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, - 0x25, 0x0a, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, - 0x66, 0x73, 0x65, 0x74, 0x22, 0x37, 0x0a, 0x11, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x05, 0x61, 0x64, 0x64, - 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x05, 0x61, 0x64, 0x64, 0x72, 0x73, 0x22, 0xfd, 0x02, - 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, - 0x6d, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x61, 0x6d, 0x74, 0x12, 0x30, 0x0a, + 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x63, 0x6f, 0x75, 0x72, + 0x69, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x43, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, + 0x12, 0x39, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, + 0x64, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x79, 0x0a, 0x12, 0x53, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, + 0x3c, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, + 0x0c, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, + 0x09, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x00, 0x52, 0x08, 0x61, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x06, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x9e, 0x01, 0x0a, 0x09, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, + 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x08, 0x6b, + 0x65, 0x79, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x6f, 0x72, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x12, 0x1b, 0x0a, + 0x09, 0x74, 0x61, 0x70, 0x5f, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x08, 0x74, 0x61, 0x70, 0x54, 0x77, 0x65, 0x61, 0x6b, 0x12, 0x29, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x48, 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x46, 0x61, 0x6d, 0x69, + 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, + 0x60, 0x0a, 0x0d, 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, + 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x61, 0x77, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x72, 0x61, 0x77, 0x4b, 0x65, 0x79, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4b, + 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6b, 0x65, 0x79, 0x4c, 0x6f, + 0x63, 0x22, 0x43, 0x0a, 0x11, 0x54, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x46, 0x75, + 0x6c, 0x6c, 0x54, 0x72, 0x65, 0x65, 0x12, 0x2e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x6c, 0x65, + 0x61, 0x76, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, 0x70, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x09, 0x61, 0x6c, 0x6c, + 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x22, 0x21, 0x0a, 0x07, 0x54, 0x61, 0x70, 0x4c, 0x65, 0x61, + 0x66, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x70, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, + 0x61, 0x70, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6c, 0x65, + 0x66, 0x74, 0x54, 0x61, 0x70, 0x68, 0x61, 0x73, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x5f, 0x74, 0x61, 0x70, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0c, 0x72, 0x69, 0x67, 0x68, 0x74, 0x54, 0x61, 0x70, 0x68, 0x61, 0x73, 0x68, 0x22, 0x27, + 0x0a, 0x11, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x22, 0x56, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x61, + 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, + 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x22, + 0xf6, 0x04, 0x0a, 0x0c, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x61, 0x74, 0x5f, 0x64, 0x65, 0x70, + 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x41, + 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, + 0x12, 0x23, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x32, 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x72, 0x65, + 0x76, 0x65, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0a, 0x6d, + 0x65, 0x74, 0x61, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x78, 0x5f, + 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x78, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x72, + 0x6f, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, + 0x32, 0x0a, 0x15, 0x6e, 0x75, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, + 0x6e, 0x75, 0x6d, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, + 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, + 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, + 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x62, 0x75, 0x72, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x69, 0x73, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x3c, 0x0a, 0x0e, 0x67, 0x65, 0x6e, + 0x65, 0x73, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, + 0x69, 0x73, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x52, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, + 0x73, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x40, 0x0a, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x4b, 0x65, 0x79, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x52, 0x0e, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x4b, 0x65, 0x79, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x74, + 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x61, + 0x6c, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x22, 0x66, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x0d, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, + 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x52, 0x0c, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x22, 0xb1, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x61, 0x77, 0x5f, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x61, 0x77, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x61, 0x74, + 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x70, 0x72, + 0x6f, 0x6f, 0x66, 0x41, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x12, 0x2e, 0x0a, 0x13, 0x77, 0x69, + 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x77, 0x69, 0x74, 0x68, 0x50, 0x72, 0x65, + 0x76, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x77, 0x69, + 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x77, 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, + 0x76, 0x65, 0x61, 0x6c, 0x22, 0x50, 0x0a, 0x13, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x64, + 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, + 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0c, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, + 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x7c, 0x0a, 0x12, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x3e, 0x0a, 0x16, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, + 0x0a, 0x0e, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x46, 0x69, 0x6c, 0x65, 0x22, 0x38, 0x0a, 0x17, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0c, 0x52, 0x09, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xd0, + 0x02, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x1a, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x6e, + 0x69, 0x78, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x17, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x6e, + 0x69, 0x78, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x61, 0x64, 0x64, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x2f, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, + 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x75, 0x74, 0x78, 0x6f, + 0x5f, 0x61, 0x6d, 0x74, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, + 0x75, 0x74, 0x78, 0x6f, 0x41, 0x6d, 0x74, 0x53, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, + 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x53, 0x69, 0x62, 0x6c, + 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x68, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x22, 0x74, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x3c, 0x0a, 0x0d, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x41, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x72, 0x52, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x29, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x60, 0x0a, 0x10, 0x53, 0x65, + 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x74, 0x61, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x08, 0x74, 0x61, 0x70, 0x41, 0x64, 0x64, 0x72, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x66, + 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x66, + 0x65, 0x65, 0x52, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x85, 0x01, 0x0a, + 0x0e, 0x50, 0x72, 0x65, 0x76, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, + 0x21, 0x0a, 0x0c, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x6f, 0x69, + 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, - 0x38, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4b, - 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x0b, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x61, 0x70, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, - 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, - 0x63, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x43, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, - 0x41, 0x64, 0x64, 0x72, 0x12, 0x39, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x3c, 0x0a, 0x0f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x9e, 0x01, - 0x0a, 0x09, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x70, - 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x75, - 0x62, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x64, 0x65, 0x73, 0x63, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x07, 0x6b, - 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x70, 0x5f, 0x74, 0x77, - 0x65, 0x61, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x74, 0x61, 0x70, 0x54, 0x77, - 0x65, 0x61, 0x6b, 0x12, 0x29, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x48, - 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, - 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x09, 0x6b, 0x65, 0x79, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x6b, - 0x65, 0x79, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x60, 0x0a, 0x0d, 0x4b, 0x65, 0x79, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x61, 0x77, - 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0b, 0x72, 0x61, 0x77, 0x4b, 0x65, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2b, 0x0a, - 0x07, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x74, - 0x6f, 0x72, 0x52, 0x06, 0x6b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x22, 0x43, 0x0a, 0x11, 0x54, 0x61, - 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x54, 0x72, 0x65, 0x65, 0x12, - 0x2e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, 0x70, - 0x4c, 0x65, 0x61, 0x66, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x22, - 0x21, 0x0a, 0x07, 0x54, 0x61, 0x70, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x22, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x70, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, - 0x21, 0x0a, 0x0c, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x61, 0x70, 0x68, 0x61, 0x73, 0x68, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6c, 0x65, 0x66, 0x74, 0x54, 0x61, 0x70, 0x68, 0x61, - 0x73, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x74, 0x61, 0x70, 0x68, - 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x69, 0x67, 0x68, 0x74, - 0x54, 0x61, 0x70, 0x68, 0x61, 0x73, 0x68, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x63, 0x6f, 0x64, - 0x65, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, - 0x22, 0x56, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, - 0x0e, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, - 0x69, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, - 0x73, 0x69, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0xf6, 0x04, 0x0a, 0x0c, 0x44, 0x65, 0x63, - 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x5f, 0x61, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x41, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x12, - 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x4f, 0x66, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x23, 0x0a, 0x05, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x32, - 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0a, 0x6d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x76, 0x65, - 0x61, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x78, 0x5f, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x78, 0x4d, - 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, - 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0f, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x28, - 0x0a, 0x10, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x52, - 0x6f, 0x6f, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x32, 0x0a, 0x15, 0x6e, 0x75, 0x6d, 0x5f, - 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, - 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x41, 0x64, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, - 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, - 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, - 0x67, 0x65, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, - 0x62, 0x75, 0x72, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x42, 0x75, - 0x72, 0x6e, 0x12, 0x3c, 0x0a, 0x0e, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x72, 0x65, - 0x76, 0x65, 0x61, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x52, 0x65, 0x76, 0x65, 0x61, - 0x6c, 0x52, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, - 0x12, 0x40, 0x0a, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x65, - 0x76, 0x65, 0x61, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x76, 0x65, - 0x61, 0x6c, 0x52, 0x0e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x76, 0x65, - 0x61, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x74, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x61, 0x6c, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, - 0x73, 0x22, 0x66, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x39, - 0x0a, 0x0d, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, - 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0c, 0x64, 0x65, 0x63, - 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xb1, 0x01, 0x0a, 0x12, 0x44, 0x65, - 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, - 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x61, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x41, 0x74, 0x44, 0x65, - 0x70, 0x74, 0x68, 0x12, 0x2e, 0x0a, 0x13, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x76, - 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x11, 0x77, 0x69, 0x74, 0x68, 0x50, 0x72, 0x65, 0x76, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, - 0x73, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x61, - 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x77, - 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x22, 0x50, 0x0a, - 0x13, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x5f, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x52, 0x0c, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, - 0x7c, 0x0a, 0x12, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, - 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, - 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x3e, 0x0a, - 0x16, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x61, 0x77, 0x5f, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0c, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x38, 0x0a, - 0x17, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x61, 0x77, 0x5f, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, 0x72, 0x61, - 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xd0, 0x02, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x72, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x1a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x73, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x78, 0x53, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, - 0x61, 0x64, 0x64, 0x72, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, - 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x75, 0x74, 0x78, 0x6f, 0x5f, 0x61, 0x6d, 0x74, 0x5f, 0x73, 0x61, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x75, 0x74, 0x78, 0x6f, 0x41, 0x6d, 0x74, - 0x53, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x73, - 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x74, 0x61, - 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x0a, 0x13, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1b, 0x0a, - 0x09, 0x68, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x68, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x74, 0x0a, 0x13, 0x41, 0x64, - 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, 0x64, - 0x64, 0x72, 0x12, 0x3c, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x22, 0x41, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x22, 0x60, 0x0a, 0x10, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x70, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x70, 0x41, - 0x64, 0x64, 0x72, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x66, 0x65, 0x65, 0x52, 0x61, 0x74, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x85, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x65, 0x76, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x6e, 0x63, 0x68, - 0x6f, 0x72, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x46, 0x0a, - 0x11, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x31, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x08, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x22, 0x10, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x9b, 0x02, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x6e, 0x64, 0x5f, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6c, 0x6e, 0x64, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x12, 0x2e, 0x0a, 0x13, 0x6c, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6c, - 0x6e, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, - 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, - 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, - 0x68, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x6f, - 0x43, 0x68, 0x61, 0x69, 0x6e, 0x22, 0xa6, 0x01, 0x0a, 0x15, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1b, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x09, - 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, - 0x00, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x53, 0x74, 0x72, 0x12, - 0x24, 0x0a, 0x0d, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x73, 0x74, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, - 0x73, 0x68, 0x53, 0x74, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x22, 0xc3, - 0x01, 0x0a, 0x10, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, - 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x73, 0x74, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, - 0x64, 0x53, 0x74, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, - 0x6f, 0x5f, 0x62, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x11, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0d, 0x62, 0x75, - 0x72, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x0c, 0x62, 0x75, 0x72, 0x6e, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x33, 0x0a, 0x0a, 0x62, 0x75, 0x72, 0x6e, 0x5f, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x52, 0x09, 0x62, 0x75, 0x72, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x7a, 0x0a, 0x10, 0x4c, - 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x77, - 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, - 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x6e, 0x63, - 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, 0x22, 0x9f, 0x01, 0x0a, 0x09, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0f, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, - 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, - 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, - 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, 0x22, 0x3c, 0x0a, 0x11, 0x4c, 0x69, 0x73, - 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, - 0x0a, 0x05, 0x62, 0x75, 0x72, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x75, 0x72, 0x6e, - 0x52, 0x05, 0x62, 0x75, 0x72, 0x6e, 0x73, 0x22, 0x41, 0x0a, 0x08, 0x4f, 0x75, 0x74, 0x50, 0x6f, - 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x74, 0x78, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x69, 0x0a, 0x1d, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x27, 0x0a, 0x0f, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xe8, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, - 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 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, 0x26, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, - 0x64, 0x64, 0x72, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, - 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x22, 0x6b, 0x0a, 0x1a, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x6e, - 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, - 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0xc4, 0x03, - 0x0a, 0x09, 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 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, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x6e, - 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, - 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x63, - 0x65, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, - 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x09, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x69, 0x72, - 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0c, 0x52, 0x0e, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x61, 0x63, 0x6b, 0x65, - 0x74, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x76, 0x69, - 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x0c, 0x52, 0x15, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x56, 0x69, 0x72, 0x74, - 0x75, 0x61, 0x6c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x48, 0x0a, 0x12, 0x61, 0x6e, - 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x46, 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x08, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x52, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x22, 0x10, 0x0a, 0x0e, + 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x9b, + 0x02, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, + 0x6c, 0x6e, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x6c, 0x6e, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, + 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x2e, 0x0a, 0x13, 0x6c, 0x6e, 0x64, 0x5f, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6c, 0x6e, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x64, + 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, + 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x6f, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x22, 0xa6, 0x01, 0x0a, + 0x15, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, + 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x73, + 0x74, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x49, 0x64, 0x53, 0x74, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x53, 0x74, 0x72, 0x42, 0x07, 0x0a, 0x05, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x22, 0xc3, 0x01, 0x0a, 0x10, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x08, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x5f, 0x69, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x53, 0x74, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x61, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x62, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0c, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x42, 0x75, 0x72, + 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x78, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, + 0x74, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x11, + 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3a, 0x0a, 0x0d, 0x62, 0x75, 0x72, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, + 0x0c, 0x62, 0x75, 0x72, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x33, 0x0a, + 0x0a, 0x62, 0x75, 0x72, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, + 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x09, 0x62, 0x75, 0x72, 0x6e, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x22, 0x7a, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, + 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x74, 0x77, + 0x65, 0x61, 0x6b, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, + 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, 0x22, 0x9f, + 0x01, 0x0a, 0x09, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, + 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, + 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, + 0x22, 0x3c, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x05, 0x62, 0x75, 0x72, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x52, 0x05, 0x62, 0x75, 0x72, 0x6e, 0x73, 0x22, 0x41, + 0x0a, 0x08, 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x74, 0x78, 0x69, 0x64, 0x12, 0x21, + 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x22, 0x69, 0x0a, 0x1d, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, + 0x64, 0x64, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xe8, 0x01, 0x0a, + 0x0c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 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, 0x26, 0x0a, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, + 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x6b, 0x0a, 0x1a, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, + 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x22, 0xc4, 0x03, 0x0a, 0x09, 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, + 0x6e, 0x74, 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, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x33, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x61, + 0x72, 0x63, 0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x63, 0x65, 0x6c, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0e, 0x76, 0x69, 0x72, 0x74, 0x75, + 0x61, 0x6c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x61, 0x73, + 0x73, 0x69, 0x76, 0x65, 0x5f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x63, + 0x6b, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x15, 0x70, 0x61, 0x73, 0x73, + 0x69, 0x76, 0x65, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x12, 0x48, 0x0a, 0x12, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x08, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x52, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x97, 0x02, 0x0a, 0x11, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x08, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x25, 0x0a, - 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x22, 0x97, 0x02, 0x0a, 0x11, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, - 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x73, 0x62, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x26, 0x0a, 0x0f, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x73, 0x61, 0x74, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x65, 0x65, 0x73, 0x53, - 0x61, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x16, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x65, - 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x61, 0x74, 0x5f, 0x6b, 0x77, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x65, 0x65, 0x52, 0x61, - 0x74, 0x65, 0x53, 0x61, 0x74, 0x4b, 0x77, 0x12, 0x3a, 0x0a, 0x10, 0x6c, 0x6e, 0x64, 0x5f, 0x6c, - 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x75, 0x74, 0x78, 0x6f, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, - 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x6c, 0x6e, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x55, 0x74, - 0x78, 0x6f, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x78, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x54, 0x78, 0x22, 0x9e, - 0x01, 0x0a, 0x17, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, - 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, - 0x79, 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, - 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, - 0x54, 0x0a, 0x18, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x10, 0x72, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x52, 0x0f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x2a, 0x28, 0x0a, 0x09, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x0f, - 0x0a, 0x0b, 0x43, 0x4f, 0x4c, 0x4c, 0x45, 0x43, 0x54, 0x49, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x2a, - 0x39, 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x50, - 0x41, 0x51, 0x55, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x01, 0x2a, 0x3a, 0x0a, 0x0c, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x53, - 0x53, 0x45, 0x54, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x30, 0x10, 0x00, - 0x12, 0x14, 0x0a, 0x10, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, - 0x4e, 0x5f, 0x56, 0x31, 0x10, 0x01, 0x2a, 0x52, 0x0a, 0x0a, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4d, 0x50, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, - 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x50, 0x4c, 0x49, - 0x54, 0x5f, 0x52, 0x4f, 0x4f, 0x54, 0x10, 0x01, 0x22, 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, 0x04, - 0x08, 0x03, 0x10, 0x03, 0x22, 0x04, 0x08, 0x04, 0x10, 0x04, 0x2a, 0x86, 0x01, 0x0a, 0x13, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x28, 0x0a, 0x24, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x44, 0x45, 0x4c, 0x49, - 0x56, 0x45, 0x52, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, - 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x22, 0x0a, 0x1e, - 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x44, 0x45, 0x4c, 0x49, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01, - 0x12, 0x21, 0x0a, 0x1d, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x44, 0x45, 0x4c, 0x49, 0x56, 0x45, - 0x52, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, - 0x47, 0x10, 0x02, 0x2a, 0x55, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, - 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, - 0x5f, 0x56, 0x30, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x31, 0x10, 0x02, 0x2a, 0xa9, 0x01, 0x0a, 0x0d, 0x53, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, - 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, - 0x57, 0x4e, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, - 0x45, 0x59, 0x5f, 0x42, 0x49, 0x50, 0x38, 0x36, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x43, - 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, - 0x50, 0x41, 0x54, 0x48, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x02, 0x12, - 0x13, 0x0a, 0x0f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x42, 0x55, - 0x52, 0x4e, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, - 0x45, 0x59, 0x5f, 0x54, 0x4f, 0x4d, 0x42, 0x53, 0x54, 0x4f, 0x4e, 0x45, 0x10, 0x04, 0x12, 0x16, - 0x0a, 0x12, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x43, 0x48, 0x41, - 0x4e, 0x4e, 0x45, 0x4c, 0x10, 0x05, 0x2a, 0xd0, 0x01, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x72, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x44, - 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x2a, 0x0a, 0x26, 0x41, 0x44, 0x44, - 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, - 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, - 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, - 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, - 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, - 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x52, 0x45, - 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x44, 0x44, 0x52, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, - 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x04, 0x2a, 0x9b, 0x02, 0x0a, 0x09, 0x53, 0x65, - 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x45, 0x4e, 0x44, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x56, 0x49, 0x52, 0x54, 0x55, 0x41, 0x4c, 0x5f, 0x49, 0x4e, - 0x50, 0x55, 0x54, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, - 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x56, 0x49, 0x52, 0x54, 0x55, - 0x41, 0x4c, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x45, 0x4e, - 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x4e, 0x43, 0x48, 0x4f, 0x52, 0x5f, 0x53, - 0x49, 0x47, 0x4e, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x4d, 0x45, - 0x4e, 0x54, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x45, 0x5f, 0x42, 0x52, 0x4f, 0x41, 0x44, 0x43, 0x41, 0x53, 0x54, 0x10, 0x04, 0x12, 0x20, - 0x0a, 0x1c, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x57, 0x41, 0x49, - 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, - 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, - 0x54, 0x4f, 0x52, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x53, 0x10, 0x06, 0x12, 0x1e, 0x0a, - 0x1a, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, - 0x53, 0x46, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x53, 0x10, 0x07, 0x12, 0x18, 0x0a, - 0x14, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x50, - 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x08, 0x2a, 0x78, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x63, 0x65, - 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x1a, - 0x0a, 0x16, 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, - 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x41, - 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, - 0x47, 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x50, 0x52, 0x45, 0x5f, 0x41, 0x4e, 0x43, 0x48, 0x4f, 0x52, 0x45, 0x44, 0x10, - 0x03, 0x32, 0xc5, 0x0c, 0x0a, 0x0d, 0x54, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, - 0x78, 0x6f, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, - 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x1b, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0a, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x61, - 0x65, 0x6d, 0x6f, 0x6e, 0x12, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, - 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x43, 0x0a, 0x0a, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, - 0x72, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x4e, 0x65, 0x77, 0x41, 0x64, - 0x64, 0x72, 0x12, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4e, 0x65, 0x77, 0x41, - 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x35, 0x0a, 0x0a, 0x44, 0x65, 0x63, 0x6f, - 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x73, 0x62, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x73, + 0x62, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x11, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x65, 0x65, 0x73, + 0x5f, 0x73, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x46, 0x65, 0x65, 0x73, 0x53, 0x61, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x16, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x61, + 0x74, 0x5f, 0x6b, 0x77, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x46, 0x65, 0x65, 0x52, 0x61, 0x74, 0x65, 0x53, 0x61, 0x74, 0x4b, 0x77, 0x12, 0x3a, + 0x0a, 0x10, 0x6c, 0x6e, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x75, 0x74, 0x78, + 0x6f, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x6c, 0x6e, 0x64, 0x4c, + 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, + 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x66, 0x69, + 0x6e, 0x61, 0x6c, 0x54, 0x78, 0x22, 0x9e, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, + 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x54, 0x0a, 0x18, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x38, 0x0a, 0x10, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, + 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x0f, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x2a, 0x28, 0x0a, 0x09, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x52, + 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4c, 0x4c, 0x45, 0x43, 0x54, + 0x49, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x2a, 0x39, 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, + 0x65, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x45, 0x54, 0x41, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x50, 0x41, 0x51, 0x55, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, + 0x0e, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, + 0x01, 0x2a, 0x3a, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, + 0x4f, 0x4e, 0x5f, 0x56, 0x30, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x53, 0x53, 0x45, 0x54, + 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x31, 0x10, 0x01, 0x2a, 0x52, 0x0a, + 0x0a, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x4f, + 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4d, 0x50, 0x4c, + 0x45, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x53, 0x50, 0x4c, 0x49, 0x54, 0x5f, 0x52, 0x4f, 0x4f, 0x54, 0x10, 0x01, 0x22, + 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, 0x04, 0x08, 0x03, 0x10, 0x03, 0x22, 0x04, 0x08, 0x04, 0x10, + 0x04, 0x2a, 0x86, 0x01, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x65, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x28, 0x0a, 0x24, 0x50, 0x52, 0x4f, + 0x4f, 0x46, 0x5f, 0x44, 0x45, 0x4c, 0x49, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x42, 0x4c, + 0x45, 0x10, 0x00, 0x12, 0x22, 0x0a, 0x1e, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x44, 0x45, 0x4c, + 0x49, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4d, + 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x50, 0x52, 0x4f, 0x4f, 0x46, + 0x5f, 0x44, 0x45, 0x4c, 0x49, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x55, 0x0a, 0x0b, 0x41, 0x64, + 0x64, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x44, 0x44, + 0x52, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x44, 0x52, 0x5f, + 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x30, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, + 0x41, 0x44, 0x44, 0x52, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x31, 0x10, + 0x02, 0x2a, 0xa9, 0x01, 0x0a, 0x0d, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, + 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x53, + 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x42, 0x49, 0x50, 0x38, 0x36, 0x10, + 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, + 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x5f, 0x45, 0x58, 0x54, 0x45, + 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, + 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x42, 0x55, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x53, + 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x54, 0x4f, 0x4d, 0x42, 0x53, 0x54, + 0x4f, 0x4e, 0x45, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, + 0x4b, 0x45, 0x59, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x10, 0x05, 0x2a, 0xd0, 0x01, + 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, + 0x12, 0x2a, 0x0a, 0x26, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, + 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, + 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x41, 0x44, 0x44, + 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, + 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x10, 0x03, 0x12, + 0x1f, 0x0a, 0x1b, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x04, + 0x2a, 0x9b, 0x02, 0x0a, 0x09, 0x53, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, + 0x0a, 0x1f, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x56, 0x49, 0x52, + 0x54, 0x55, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, + 0x54, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x56, 0x49, 0x52, 0x54, 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x10, 0x01, + 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, + 0x4e, 0x43, 0x48, 0x4f, 0x52, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, + 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x43, + 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x53, + 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x42, 0x52, 0x4f, 0x41, 0x44, 0x43, + 0x41, 0x53, 0x54, 0x10, 0x04, 0x12, 0x20, 0x0a, 0x1c, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x45, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x45, 0x4e, 0x44, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x4f, + 0x46, 0x53, 0x10, 0x06, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x4f, + 0x46, 0x53, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x08, 0x2a, 0x78, + 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, + 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x44, 0x44, 0x52, + 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x10, + 0x01, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x41, + 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x45, 0x5f, 0x41, 0x4e, + 0x43, 0x48, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x03, 0x32, 0xc5, 0x0c, 0x0a, 0x0d, 0x54, 0x61, 0x70, + 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x0a, 0x4c, 0x69, + 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, + 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x43, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x19, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x4c, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, + 0x12, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, + 0x0a, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x12, 0x13, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, + 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0a, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, + 0x0a, 0x07, 0x4e, 0x65, 0x77, 0x41, 0x64, 0x64, 0x72, 0x12, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x12, - 0x49, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x12, - 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x1b, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x44, 0x65, 0x63, - 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, - 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x3c, 0x0a, 0x0b, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x12, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x12, - 0x52, 0x0a, 0x0f, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, - 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x70, 0x61, - 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x70, 0x61, - 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x75, 0x72, 0x6e, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x42, - 0x75, 0x72, 0x6e, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, - 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x47, 0x65, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x57, 0x0a, 0x16, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x30, 0x01, 0x12, 0x4e, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, - 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x6e, 0x64, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x30, 0x01, 0x12, 0x55, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, - 0x67, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x35, 0x0a, 0x0a, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x19, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x49, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, + 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x12, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, + 0x69, 0x6c, 0x65, 0x1a, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x46, 0x0a, 0x0b, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, + 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0b, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x52, 0x0a, 0x0f, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, + 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, + 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x53, 0x65, + 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, + 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x75, 0x72, + 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, + 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0e, + 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1d, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, + 0x12, 0x57, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, + 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, + 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x4e, 0x0a, 0x13, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x22, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, + 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x55, 0x0a, 0x10, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1f, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, + 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61, 0x70, + 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -7621,7 +7763,7 @@ func file_taprootassets_proto_rawDescGZIP() []byte { } var file_taprootassets_proto_enumTypes = make([]protoimpl.EnumInfo, 10) -var file_taprootassets_proto_msgTypes = make([]protoimpl.MessageInfo, 84) +var file_taprootassets_proto_msgTypes = make([]protoimpl.MessageInfo, 85) var file_taprootassets_proto_goTypes = []any{ (AssetType)(0), // 0: taprpc.AssetType (AssetMetaType)(0), // 1: taprpc.AssetMetaType @@ -7676,177 +7818,182 @@ var file_taprootassets_proto_goTypes = []any{ (*QueryAddrRequest)(nil), // 50: taprpc.QueryAddrRequest (*QueryAddrResponse)(nil), // 51: taprpc.QueryAddrResponse (*NewAddrRequest)(nil), // 52: taprpc.NewAddrRequest - (*ScriptKey)(nil), // 53: taprpc.ScriptKey - (*KeyLocator)(nil), // 54: taprpc.KeyLocator - (*KeyDescriptor)(nil), // 55: taprpc.KeyDescriptor - (*TapscriptFullTree)(nil), // 56: taprpc.TapscriptFullTree - (*TapLeaf)(nil), // 57: taprpc.TapLeaf - (*TapBranch)(nil), // 58: taprpc.TapBranch - (*DecodeAddrRequest)(nil), // 59: taprpc.DecodeAddrRequest - (*ProofFile)(nil), // 60: taprpc.ProofFile - (*DecodedProof)(nil), // 61: taprpc.DecodedProof - (*VerifyProofResponse)(nil), // 62: taprpc.VerifyProofResponse - (*DecodeProofRequest)(nil), // 63: taprpc.DecodeProofRequest - (*DecodeProofResponse)(nil), // 64: taprpc.DecodeProofResponse - (*ExportProofRequest)(nil), // 65: taprpc.ExportProofRequest - (*UnpackProofFileRequest)(nil), // 66: taprpc.UnpackProofFileRequest - (*UnpackProofFileResponse)(nil), // 67: taprpc.UnpackProofFileResponse - (*AddrEvent)(nil), // 68: taprpc.AddrEvent - (*AddrReceivesRequest)(nil), // 69: taprpc.AddrReceivesRequest - (*AddrReceivesResponse)(nil), // 70: taprpc.AddrReceivesResponse - (*SendAssetRequest)(nil), // 71: taprpc.SendAssetRequest - (*PrevInputAsset)(nil), // 72: taprpc.PrevInputAsset - (*SendAssetResponse)(nil), // 73: taprpc.SendAssetResponse - (*GetInfoRequest)(nil), // 74: taprpc.GetInfoRequest - (*GetInfoResponse)(nil), // 75: taprpc.GetInfoResponse - (*FetchAssetMetaRequest)(nil), // 76: taprpc.FetchAssetMetaRequest - (*BurnAssetRequest)(nil), // 77: taprpc.BurnAssetRequest - (*BurnAssetResponse)(nil), // 78: taprpc.BurnAssetResponse - (*ListBurnsRequest)(nil), // 79: taprpc.ListBurnsRequest - (*AssetBurn)(nil), // 80: taprpc.AssetBurn - (*ListBurnsResponse)(nil), // 81: taprpc.ListBurnsResponse - (*OutPoint)(nil), // 82: taprpc.OutPoint - (*SubscribeReceiveEventsRequest)(nil), // 83: taprpc.SubscribeReceiveEventsRequest - (*ReceiveEvent)(nil), // 84: taprpc.ReceiveEvent - (*SubscribeSendEventsRequest)(nil), // 85: taprpc.SubscribeSendEventsRequest - (*SendEvent)(nil), // 86: taprpc.SendEvent - (*AnchorTransaction)(nil), // 87: taprpc.AnchorTransaction - (*RegisterTransferRequest)(nil), // 88: taprpc.RegisterTransferRequest - (*RegisterTransferResponse)(nil), // 89: taprpc.RegisterTransferResponse - nil, // 90: taprpc.ListUtxosResponse.ManagedUtxosEntry - nil, // 91: taprpc.ListGroupsResponse.GroupsEntry - nil, // 92: taprpc.ListBalancesResponse.AssetBalancesEntry - nil, // 93: taprpc.ListBalancesResponse.AssetGroupBalancesEntry + (*ScriptKeyTypeQuery)(nil), // 53: taprpc.ScriptKeyTypeQuery + (*ScriptKey)(nil), // 54: taprpc.ScriptKey + (*KeyLocator)(nil), // 55: taprpc.KeyLocator + (*KeyDescriptor)(nil), // 56: taprpc.KeyDescriptor + (*TapscriptFullTree)(nil), // 57: taprpc.TapscriptFullTree + (*TapLeaf)(nil), // 58: taprpc.TapLeaf + (*TapBranch)(nil), // 59: taprpc.TapBranch + (*DecodeAddrRequest)(nil), // 60: taprpc.DecodeAddrRequest + (*ProofFile)(nil), // 61: taprpc.ProofFile + (*DecodedProof)(nil), // 62: taprpc.DecodedProof + (*VerifyProofResponse)(nil), // 63: taprpc.VerifyProofResponse + (*DecodeProofRequest)(nil), // 64: taprpc.DecodeProofRequest + (*DecodeProofResponse)(nil), // 65: taprpc.DecodeProofResponse + (*ExportProofRequest)(nil), // 66: taprpc.ExportProofRequest + (*UnpackProofFileRequest)(nil), // 67: taprpc.UnpackProofFileRequest + (*UnpackProofFileResponse)(nil), // 68: taprpc.UnpackProofFileResponse + (*AddrEvent)(nil), // 69: taprpc.AddrEvent + (*AddrReceivesRequest)(nil), // 70: taprpc.AddrReceivesRequest + (*AddrReceivesResponse)(nil), // 71: taprpc.AddrReceivesResponse + (*SendAssetRequest)(nil), // 72: taprpc.SendAssetRequest + (*PrevInputAsset)(nil), // 73: taprpc.PrevInputAsset + (*SendAssetResponse)(nil), // 74: taprpc.SendAssetResponse + (*GetInfoRequest)(nil), // 75: taprpc.GetInfoRequest + (*GetInfoResponse)(nil), // 76: taprpc.GetInfoResponse + (*FetchAssetMetaRequest)(nil), // 77: taprpc.FetchAssetMetaRequest + (*BurnAssetRequest)(nil), // 78: taprpc.BurnAssetRequest + (*BurnAssetResponse)(nil), // 79: taprpc.BurnAssetResponse + (*ListBurnsRequest)(nil), // 80: taprpc.ListBurnsRequest + (*AssetBurn)(nil), // 81: taprpc.AssetBurn + (*ListBurnsResponse)(nil), // 82: taprpc.ListBurnsResponse + (*OutPoint)(nil), // 83: taprpc.OutPoint + (*SubscribeReceiveEventsRequest)(nil), // 84: taprpc.SubscribeReceiveEventsRequest + (*ReceiveEvent)(nil), // 85: taprpc.ReceiveEvent + (*SubscribeSendEventsRequest)(nil), // 86: taprpc.SubscribeSendEventsRequest + (*SendEvent)(nil), // 87: taprpc.SendEvent + (*AnchorTransaction)(nil), // 88: taprpc.AnchorTransaction + (*RegisterTransferRequest)(nil), // 89: taprpc.RegisterTransferRequest + (*RegisterTransferResponse)(nil), // 90: taprpc.RegisterTransferResponse + nil, // 91: taprpc.ListUtxosResponse.ManagedUtxosEntry + nil, // 92: taprpc.ListGroupsResponse.GroupsEntry + nil, // 93: taprpc.ListBalancesResponse.AssetBalancesEntry + nil, // 94: taprpc.ListBalancesResponse.AssetGroupBalancesEntry } var file_taprootassets_proto_depIdxs = []int32{ 1, // 0: taprpc.AssetMeta.type:type_name -> taprpc.AssetMetaType - 53, // 1: taprpc.ListAssetRequest.script_key:type_name -> taprpc.ScriptKey - 82, // 2: taprpc.ListAssetRequest.anchor_outpoint:type_name -> taprpc.OutPoint - 0, // 3: taprpc.GenesisInfo.asset_type:type_name -> taprpc.AssetType - 55, // 4: taprpc.GroupKeyRequest.raw_key:type_name -> taprpc.KeyDescriptor - 13, // 5: taprpc.GroupKeyRequest.anchor_genesis:type_name -> taprpc.GenesisInfo - 14, // 6: taprpc.GroupKeyRequest.external_key:type_name -> taprpc.ExternalKey - 16, // 7: taprpc.GroupVirtualTx.prev_out:type_name -> taprpc.TxOut - 13, // 8: taprpc.GenesisReveal.genesis_base_reveal:type_name -> taprpc.GenesisInfo - 2, // 9: taprpc.Asset.version:type_name -> taprpc.AssetVersion - 13, // 10: taprpc.Asset.asset_genesis:type_name -> taprpc.GenesisInfo - 19, // 11: taprpc.Asset.asset_group:type_name -> taprpc.AssetGroup - 12, // 12: taprpc.Asset.chain_anchor:type_name -> taprpc.AnchorInfo - 24, // 13: taprpc.Asset.prev_witnesses:type_name -> taprpc.PrevWitness - 22, // 14: taprpc.Asset.decimal_display:type_name -> taprpc.DecimalDisplay - 6, // 15: taprpc.Asset.script_key_type:type_name -> taprpc.ScriptKeyType - 72, // 16: taprpc.PrevWitness.prev_id:type_name -> taprpc.PrevInputAsset - 25, // 17: taprpc.PrevWitness.split_commitment:type_name -> taprpc.SplitCommitment - 23, // 18: taprpc.SplitCommitment.root_asset:type_name -> taprpc.Asset - 23, // 19: taprpc.ListAssetResponse.assets:type_name -> taprpc.Asset - 23, // 20: taprpc.ManagedUtxo.assets:type_name -> taprpc.Asset - 90, // 21: taprpc.ListUtxosResponse.managed_utxos:type_name -> taprpc.ListUtxosResponse.ManagedUtxosEntry - 0, // 22: taprpc.AssetHumanReadable.type:type_name -> taprpc.AssetType - 2, // 23: taprpc.AssetHumanReadable.version:type_name -> taprpc.AssetVersion - 31, // 24: taprpc.GroupedAssets.assets:type_name -> taprpc.AssetHumanReadable - 91, // 25: taprpc.ListGroupsResponse.groups:type_name -> taprpc.ListGroupsResponse.GroupsEntry - 13, // 26: taprpc.AssetBalance.asset_genesis:type_name -> taprpc.GenesisInfo - 92, // 27: taprpc.ListBalancesResponse.asset_balances:type_name -> taprpc.ListBalancesResponse.AssetBalancesEntry - 93, // 28: taprpc.ListBalancesResponse.asset_group_balances:type_name -> taprpc.ListBalancesResponse.AssetGroupBalancesEntry - 41, // 29: taprpc.ListTransfersResponse.transfers:type_name -> taprpc.AssetTransfer - 42, // 30: taprpc.AssetTransfer.inputs:type_name -> taprpc.TransferInput - 44, // 31: taprpc.AssetTransfer.outputs:type_name -> taprpc.TransferOutput - 40, // 32: taprpc.AssetTransfer.anchor_tx_block_hash:type_name -> taprpc.ChainHash - 43, // 33: taprpc.TransferOutput.anchor:type_name -> taprpc.TransferOutputAnchor - 3, // 34: taprpc.TransferOutput.output_type:type_name -> taprpc.OutputType - 2, // 35: taprpc.TransferOutput.asset_version:type_name -> taprpc.AssetVersion - 4, // 36: taprpc.TransferOutput.proof_delivery_status:type_name -> taprpc.ProofDeliveryStatus - 0, // 37: taprpc.Addr.asset_type:type_name -> taprpc.AssetType - 2, // 38: taprpc.Addr.asset_version:type_name -> taprpc.AssetVersion - 5, // 39: taprpc.Addr.address_version:type_name -> taprpc.AddrVersion - 49, // 40: taprpc.QueryAddrResponse.addrs:type_name -> taprpc.Addr - 53, // 41: taprpc.NewAddrRequest.script_key:type_name -> taprpc.ScriptKey - 55, // 42: taprpc.NewAddrRequest.internal_key:type_name -> taprpc.KeyDescriptor - 2, // 43: taprpc.NewAddrRequest.asset_version:type_name -> taprpc.AssetVersion - 5, // 44: taprpc.NewAddrRequest.address_version:type_name -> taprpc.AddrVersion - 55, // 45: taprpc.ScriptKey.key_desc:type_name -> taprpc.KeyDescriptor - 6, // 46: taprpc.ScriptKey.type:type_name -> taprpc.ScriptKeyType - 54, // 47: taprpc.KeyDescriptor.key_loc:type_name -> taprpc.KeyLocator - 57, // 48: taprpc.TapscriptFullTree.all_leaves:type_name -> taprpc.TapLeaf - 23, // 49: taprpc.DecodedProof.asset:type_name -> taprpc.Asset - 10, // 50: taprpc.DecodedProof.meta_reveal:type_name -> taprpc.AssetMeta - 21, // 51: taprpc.DecodedProof.genesis_reveal:type_name -> taprpc.GenesisReveal - 20, // 52: taprpc.DecodedProof.group_key_reveal:type_name -> taprpc.GroupKeyReveal - 61, // 53: taprpc.VerifyProofResponse.decoded_proof:type_name -> taprpc.DecodedProof - 61, // 54: taprpc.DecodeProofResponse.decoded_proof:type_name -> taprpc.DecodedProof - 82, // 55: taprpc.ExportProofRequest.outpoint:type_name -> taprpc.OutPoint - 49, // 56: taprpc.AddrEvent.addr:type_name -> taprpc.Addr - 7, // 57: taprpc.AddrEvent.status:type_name -> taprpc.AddrEventStatus - 7, // 58: taprpc.AddrReceivesRequest.filter_status:type_name -> taprpc.AddrEventStatus - 68, // 59: taprpc.AddrReceivesResponse.events:type_name -> taprpc.AddrEvent - 41, // 60: taprpc.SendAssetResponse.transfer:type_name -> taprpc.AssetTransfer - 41, // 61: taprpc.BurnAssetResponse.burn_transfer:type_name -> taprpc.AssetTransfer - 61, // 62: taprpc.BurnAssetResponse.burn_proof:type_name -> taprpc.DecodedProof - 80, // 63: taprpc.ListBurnsResponse.burns:type_name -> taprpc.AssetBurn - 49, // 64: taprpc.ReceiveEvent.address:type_name -> taprpc.Addr - 7, // 65: taprpc.ReceiveEvent.status:type_name -> taprpc.AddrEventStatus - 9, // 66: taprpc.SendEvent.parcel_type:type_name -> taprpc.ParcelType - 49, // 67: taprpc.SendEvent.addresses:type_name -> taprpc.Addr - 87, // 68: taprpc.SendEvent.anchor_transaction:type_name -> taprpc.AnchorTransaction - 41, // 69: taprpc.SendEvent.transfer:type_name -> taprpc.AssetTransfer - 82, // 70: taprpc.AnchorTransaction.lnd_locked_utxos:type_name -> taprpc.OutPoint - 82, // 71: taprpc.RegisterTransferRequest.outpoint:type_name -> taprpc.OutPoint - 23, // 72: taprpc.RegisterTransferResponse.registered_asset:type_name -> taprpc.Asset - 28, // 73: taprpc.ListUtxosResponse.ManagedUtxosEntry.value:type_name -> taprpc.ManagedUtxo - 32, // 74: taprpc.ListGroupsResponse.GroupsEntry.value:type_name -> taprpc.GroupedAssets - 35, // 75: taprpc.ListBalancesResponse.AssetBalancesEntry.value:type_name -> taprpc.AssetBalance - 36, // 76: taprpc.ListBalancesResponse.AssetGroupBalancesEntry.value:type_name -> taprpc.AssetGroupBalance - 11, // 77: taprpc.TaprootAssets.ListAssets:input_type -> taprpc.ListAssetRequest - 27, // 78: taprpc.TaprootAssets.ListUtxos:input_type -> taprpc.ListUtxosRequest - 30, // 79: taprpc.TaprootAssets.ListGroups:input_type -> taprpc.ListGroupsRequest - 34, // 80: taprpc.TaprootAssets.ListBalances:input_type -> taprpc.ListBalancesRequest - 38, // 81: taprpc.TaprootAssets.ListTransfers:input_type -> taprpc.ListTransfersRequest - 45, // 82: taprpc.TaprootAssets.StopDaemon:input_type -> taprpc.StopRequest - 47, // 83: taprpc.TaprootAssets.DebugLevel:input_type -> taprpc.DebugLevelRequest - 50, // 84: taprpc.TaprootAssets.QueryAddrs:input_type -> taprpc.QueryAddrRequest - 52, // 85: taprpc.TaprootAssets.NewAddr:input_type -> taprpc.NewAddrRequest - 59, // 86: taprpc.TaprootAssets.DecodeAddr:input_type -> taprpc.DecodeAddrRequest - 69, // 87: taprpc.TaprootAssets.AddrReceives:input_type -> taprpc.AddrReceivesRequest - 60, // 88: taprpc.TaprootAssets.VerifyProof:input_type -> taprpc.ProofFile - 63, // 89: taprpc.TaprootAssets.DecodeProof:input_type -> taprpc.DecodeProofRequest - 65, // 90: taprpc.TaprootAssets.ExportProof:input_type -> taprpc.ExportProofRequest - 66, // 91: taprpc.TaprootAssets.UnpackProofFile:input_type -> taprpc.UnpackProofFileRequest - 71, // 92: taprpc.TaprootAssets.SendAsset:input_type -> taprpc.SendAssetRequest - 77, // 93: taprpc.TaprootAssets.BurnAsset:input_type -> taprpc.BurnAssetRequest - 79, // 94: taprpc.TaprootAssets.ListBurns:input_type -> taprpc.ListBurnsRequest - 74, // 95: taprpc.TaprootAssets.GetInfo:input_type -> taprpc.GetInfoRequest - 76, // 96: taprpc.TaprootAssets.FetchAssetMeta:input_type -> taprpc.FetchAssetMetaRequest - 83, // 97: taprpc.TaprootAssets.SubscribeReceiveEvents:input_type -> taprpc.SubscribeReceiveEventsRequest - 85, // 98: taprpc.TaprootAssets.SubscribeSendEvents:input_type -> taprpc.SubscribeSendEventsRequest - 88, // 99: taprpc.TaprootAssets.RegisterTransfer:input_type -> taprpc.RegisterTransferRequest - 26, // 100: taprpc.TaprootAssets.ListAssets:output_type -> taprpc.ListAssetResponse - 29, // 101: taprpc.TaprootAssets.ListUtxos:output_type -> taprpc.ListUtxosResponse - 33, // 102: taprpc.TaprootAssets.ListGroups:output_type -> taprpc.ListGroupsResponse - 37, // 103: taprpc.TaprootAssets.ListBalances:output_type -> taprpc.ListBalancesResponse - 39, // 104: taprpc.TaprootAssets.ListTransfers:output_type -> taprpc.ListTransfersResponse - 46, // 105: taprpc.TaprootAssets.StopDaemon:output_type -> taprpc.StopResponse - 48, // 106: taprpc.TaprootAssets.DebugLevel:output_type -> taprpc.DebugLevelResponse - 51, // 107: taprpc.TaprootAssets.QueryAddrs:output_type -> taprpc.QueryAddrResponse - 49, // 108: taprpc.TaprootAssets.NewAddr:output_type -> taprpc.Addr - 49, // 109: taprpc.TaprootAssets.DecodeAddr:output_type -> taprpc.Addr - 70, // 110: taprpc.TaprootAssets.AddrReceives:output_type -> taprpc.AddrReceivesResponse - 62, // 111: taprpc.TaprootAssets.VerifyProof:output_type -> taprpc.VerifyProofResponse - 64, // 112: taprpc.TaprootAssets.DecodeProof:output_type -> taprpc.DecodeProofResponse - 60, // 113: taprpc.TaprootAssets.ExportProof:output_type -> taprpc.ProofFile - 67, // 114: taprpc.TaprootAssets.UnpackProofFile:output_type -> taprpc.UnpackProofFileResponse - 73, // 115: taprpc.TaprootAssets.SendAsset:output_type -> taprpc.SendAssetResponse - 78, // 116: taprpc.TaprootAssets.BurnAsset:output_type -> taprpc.BurnAssetResponse - 81, // 117: taprpc.TaprootAssets.ListBurns:output_type -> taprpc.ListBurnsResponse - 75, // 118: taprpc.TaprootAssets.GetInfo:output_type -> taprpc.GetInfoResponse - 10, // 119: taprpc.TaprootAssets.FetchAssetMeta:output_type -> taprpc.AssetMeta - 84, // 120: taprpc.TaprootAssets.SubscribeReceiveEvents:output_type -> taprpc.ReceiveEvent - 86, // 121: taprpc.TaprootAssets.SubscribeSendEvents:output_type -> taprpc.SendEvent - 89, // 122: taprpc.TaprootAssets.RegisterTransfer:output_type -> taprpc.RegisterTransferResponse - 100, // [100:123] is the sub-list for method output_type - 77, // [77:100] is the sub-list for method input_type - 77, // [77:77] is the sub-list for extension type_name - 77, // [77:77] is the sub-list for extension extendee - 0, // [0:77] is the sub-list for field type_name + 54, // 1: taprpc.ListAssetRequest.script_key:type_name -> taprpc.ScriptKey + 83, // 2: taprpc.ListAssetRequest.anchor_outpoint:type_name -> taprpc.OutPoint + 53, // 3: taprpc.ListAssetRequest.script_key_type:type_name -> taprpc.ScriptKeyTypeQuery + 0, // 4: taprpc.GenesisInfo.asset_type:type_name -> taprpc.AssetType + 56, // 5: taprpc.GroupKeyRequest.raw_key:type_name -> taprpc.KeyDescriptor + 13, // 6: taprpc.GroupKeyRequest.anchor_genesis:type_name -> taprpc.GenesisInfo + 14, // 7: taprpc.GroupKeyRequest.external_key:type_name -> taprpc.ExternalKey + 16, // 8: taprpc.GroupVirtualTx.prev_out:type_name -> taprpc.TxOut + 13, // 9: taprpc.GenesisReveal.genesis_base_reveal:type_name -> taprpc.GenesisInfo + 2, // 10: taprpc.Asset.version:type_name -> taprpc.AssetVersion + 13, // 11: taprpc.Asset.asset_genesis:type_name -> taprpc.GenesisInfo + 19, // 12: taprpc.Asset.asset_group:type_name -> taprpc.AssetGroup + 12, // 13: taprpc.Asset.chain_anchor:type_name -> taprpc.AnchorInfo + 24, // 14: taprpc.Asset.prev_witnesses:type_name -> taprpc.PrevWitness + 22, // 15: taprpc.Asset.decimal_display:type_name -> taprpc.DecimalDisplay + 6, // 16: taprpc.Asset.script_key_type:type_name -> taprpc.ScriptKeyType + 73, // 17: taprpc.PrevWitness.prev_id:type_name -> taprpc.PrevInputAsset + 25, // 18: taprpc.PrevWitness.split_commitment:type_name -> taprpc.SplitCommitment + 23, // 19: taprpc.SplitCommitment.root_asset:type_name -> taprpc.Asset + 23, // 20: taprpc.ListAssetResponse.assets:type_name -> taprpc.Asset + 53, // 21: taprpc.ListUtxosRequest.script_key_type:type_name -> taprpc.ScriptKeyTypeQuery + 23, // 22: taprpc.ManagedUtxo.assets:type_name -> taprpc.Asset + 91, // 23: taprpc.ListUtxosResponse.managed_utxos:type_name -> taprpc.ListUtxosResponse.ManagedUtxosEntry + 0, // 24: taprpc.AssetHumanReadable.type:type_name -> taprpc.AssetType + 2, // 25: taprpc.AssetHumanReadable.version:type_name -> taprpc.AssetVersion + 31, // 26: taprpc.GroupedAssets.assets:type_name -> taprpc.AssetHumanReadable + 92, // 27: taprpc.ListGroupsResponse.groups:type_name -> taprpc.ListGroupsResponse.GroupsEntry + 53, // 28: taprpc.ListBalancesRequest.script_key_type:type_name -> taprpc.ScriptKeyTypeQuery + 13, // 29: taprpc.AssetBalance.asset_genesis:type_name -> taprpc.GenesisInfo + 93, // 30: taprpc.ListBalancesResponse.asset_balances:type_name -> taprpc.ListBalancesResponse.AssetBalancesEntry + 94, // 31: taprpc.ListBalancesResponse.asset_group_balances:type_name -> taprpc.ListBalancesResponse.AssetGroupBalancesEntry + 41, // 32: taprpc.ListTransfersResponse.transfers:type_name -> taprpc.AssetTransfer + 42, // 33: taprpc.AssetTransfer.inputs:type_name -> taprpc.TransferInput + 44, // 34: taprpc.AssetTransfer.outputs:type_name -> taprpc.TransferOutput + 40, // 35: taprpc.AssetTransfer.anchor_tx_block_hash:type_name -> taprpc.ChainHash + 43, // 36: taprpc.TransferOutput.anchor:type_name -> taprpc.TransferOutputAnchor + 3, // 37: taprpc.TransferOutput.output_type:type_name -> taprpc.OutputType + 2, // 38: taprpc.TransferOutput.asset_version:type_name -> taprpc.AssetVersion + 4, // 39: taprpc.TransferOutput.proof_delivery_status:type_name -> taprpc.ProofDeliveryStatus + 0, // 40: taprpc.Addr.asset_type:type_name -> taprpc.AssetType + 2, // 41: taprpc.Addr.asset_version:type_name -> taprpc.AssetVersion + 5, // 42: taprpc.Addr.address_version:type_name -> taprpc.AddrVersion + 49, // 43: taprpc.QueryAddrResponse.addrs:type_name -> taprpc.Addr + 54, // 44: taprpc.NewAddrRequest.script_key:type_name -> taprpc.ScriptKey + 56, // 45: taprpc.NewAddrRequest.internal_key:type_name -> taprpc.KeyDescriptor + 2, // 46: taprpc.NewAddrRequest.asset_version:type_name -> taprpc.AssetVersion + 5, // 47: taprpc.NewAddrRequest.address_version:type_name -> taprpc.AddrVersion + 6, // 48: taprpc.ScriptKeyTypeQuery.explicit_type:type_name -> taprpc.ScriptKeyType + 56, // 49: taprpc.ScriptKey.key_desc:type_name -> taprpc.KeyDescriptor + 6, // 50: taprpc.ScriptKey.type:type_name -> taprpc.ScriptKeyType + 55, // 51: taprpc.KeyDescriptor.key_loc:type_name -> taprpc.KeyLocator + 58, // 52: taprpc.TapscriptFullTree.all_leaves:type_name -> taprpc.TapLeaf + 23, // 53: taprpc.DecodedProof.asset:type_name -> taprpc.Asset + 10, // 54: taprpc.DecodedProof.meta_reveal:type_name -> taprpc.AssetMeta + 21, // 55: taprpc.DecodedProof.genesis_reveal:type_name -> taprpc.GenesisReveal + 20, // 56: taprpc.DecodedProof.group_key_reveal:type_name -> taprpc.GroupKeyReveal + 62, // 57: taprpc.VerifyProofResponse.decoded_proof:type_name -> taprpc.DecodedProof + 62, // 58: taprpc.DecodeProofResponse.decoded_proof:type_name -> taprpc.DecodedProof + 83, // 59: taprpc.ExportProofRequest.outpoint:type_name -> taprpc.OutPoint + 49, // 60: taprpc.AddrEvent.addr:type_name -> taprpc.Addr + 7, // 61: taprpc.AddrEvent.status:type_name -> taprpc.AddrEventStatus + 7, // 62: taprpc.AddrReceivesRequest.filter_status:type_name -> taprpc.AddrEventStatus + 69, // 63: taprpc.AddrReceivesResponse.events:type_name -> taprpc.AddrEvent + 41, // 64: taprpc.SendAssetResponse.transfer:type_name -> taprpc.AssetTransfer + 41, // 65: taprpc.BurnAssetResponse.burn_transfer:type_name -> taprpc.AssetTransfer + 62, // 66: taprpc.BurnAssetResponse.burn_proof:type_name -> taprpc.DecodedProof + 81, // 67: taprpc.ListBurnsResponse.burns:type_name -> taprpc.AssetBurn + 49, // 68: taprpc.ReceiveEvent.address:type_name -> taprpc.Addr + 7, // 69: taprpc.ReceiveEvent.status:type_name -> taprpc.AddrEventStatus + 9, // 70: taprpc.SendEvent.parcel_type:type_name -> taprpc.ParcelType + 49, // 71: taprpc.SendEvent.addresses:type_name -> taprpc.Addr + 88, // 72: taprpc.SendEvent.anchor_transaction:type_name -> taprpc.AnchorTransaction + 41, // 73: taprpc.SendEvent.transfer:type_name -> taprpc.AssetTransfer + 83, // 74: taprpc.AnchorTransaction.lnd_locked_utxos:type_name -> taprpc.OutPoint + 83, // 75: taprpc.RegisterTransferRequest.outpoint:type_name -> taprpc.OutPoint + 23, // 76: taprpc.RegisterTransferResponse.registered_asset:type_name -> taprpc.Asset + 28, // 77: taprpc.ListUtxosResponse.ManagedUtxosEntry.value:type_name -> taprpc.ManagedUtxo + 32, // 78: taprpc.ListGroupsResponse.GroupsEntry.value:type_name -> taprpc.GroupedAssets + 35, // 79: taprpc.ListBalancesResponse.AssetBalancesEntry.value:type_name -> taprpc.AssetBalance + 36, // 80: taprpc.ListBalancesResponse.AssetGroupBalancesEntry.value:type_name -> taprpc.AssetGroupBalance + 11, // 81: taprpc.TaprootAssets.ListAssets:input_type -> taprpc.ListAssetRequest + 27, // 82: taprpc.TaprootAssets.ListUtxos:input_type -> taprpc.ListUtxosRequest + 30, // 83: taprpc.TaprootAssets.ListGroups:input_type -> taprpc.ListGroupsRequest + 34, // 84: taprpc.TaprootAssets.ListBalances:input_type -> taprpc.ListBalancesRequest + 38, // 85: taprpc.TaprootAssets.ListTransfers:input_type -> taprpc.ListTransfersRequest + 45, // 86: taprpc.TaprootAssets.StopDaemon:input_type -> taprpc.StopRequest + 47, // 87: taprpc.TaprootAssets.DebugLevel:input_type -> taprpc.DebugLevelRequest + 50, // 88: taprpc.TaprootAssets.QueryAddrs:input_type -> taprpc.QueryAddrRequest + 52, // 89: taprpc.TaprootAssets.NewAddr:input_type -> taprpc.NewAddrRequest + 60, // 90: taprpc.TaprootAssets.DecodeAddr:input_type -> taprpc.DecodeAddrRequest + 70, // 91: taprpc.TaprootAssets.AddrReceives:input_type -> taprpc.AddrReceivesRequest + 61, // 92: taprpc.TaprootAssets.VerifyProof:input_type -> taprpc.ProofFile + 64, // 93: taprpc.TaprootAssets.DecodeProof:input_type -> taprpc.DecodeProofRequest + 66, // 94: taprpc.TaprootAssets.ExportProof:input_type -> taprpc.ExportProofRequest + 67, // 95: taprpc.TaprootAssets.UnpackProofFile:input_type -> taprpc.UnpackProofFileRequest + 72, // 96: taprpc.TaprootAssets.SendAsset:input_type -> taprpc.SendAssetRequest + 78, // 97: taprpc.TaprootAssets.BurnAsset:input_type -> taprpc.BurnAssetRequest + 80, // 98: taprpc.TaprootAssets.ListBurns:input_type -> taprpc.ListBurnsRequest + 75, // 99: taprpc.TaprootAssets.GetInfo:input_type -> taprpc.GetInfoRequest + 77, // 100: taprpc.TaprootAssets.FetchAssetMeta:input_type -> taprpc.FetchAssetMetaRequest + 84, // 101: taprpc.TaprootAssets.SubscribeReceiveEvents:input_type -> taprpc.SubscribeReceiveEventsRequest + 86, // 102: taprpc.TaprootAssets.SubscribeSendEvents:input_type -> taprpc.SubscribeSendEventsRequest + 89, // 103: taprpc.TaprootAssets.RegisterTransfer:input_type -> taprpc.RegisterTransferRequest + 26, // 104: taprpc.TaprootAssets.ListAssets:output_type -> taprpc.ListAssetResponse + 29, // 105: taprpc.TaprootAssets.ListUtxos:output_type -> taprpc.ListUtxosResponse + 33, // 106: taprpc.TaprootAssets.ListGroups:output_type -> taprpc.ListGroupsResponse + 37, // 107: taprpc.TaprootAssets.ListBalances:output_type -> taprpc.ListBalancesResponse + 39, // 108: taprpc.TaprootAssets.ListTransfers:output_type -> taprpc.ListTransfersResponse + 46, // 109: taprpc.TaprootAssets.StopDaemon:output_type -> taprpc.StopResponse + 48, // 110: taprpc.TaprootAssets.DebugLevel:output_type -> taprpc.DebugLevelResponse + 51, // 111: taprpc.TaprootAssets.QueryAddrs:output_type -> taprpc.QueryAddrResponse + 49, // 112: taprpc.TaprootAssets.NewAddr:output_type -> taprpc.Addr + 49, // 113: taprpc.TaprootAssets.DecodeAddr:output_type -> taprpc.Addr + 71, // 114: taprpc.TaprootAssets.AddrReceives:output_type -> taprpc.AddrReceivesResponse + 63, // 115: taprpc.TaprootAssets.VerifyProof:output_type -> taprpc.VerifyProofResponse + 65, // 116: taprpc.TaprootAssets.DecodeProof:output_type -> taprpc.DecodeProofResponse + 61, // 117: taprpc.TaprootAssets.ExportProof:output_type -> taprpc.ProofFile + 68, // 118: taprpc.TaprootAssets.UnpackProofFile:output_type -> taprpc.UnpackProofFileResponse + 74, // 119: taprpc.TaprootAssets.SendAsset:output_type -> taprpc.SendAssetResponse + 79, // 120: taprpc.TaprootAssets.BurnAsset:output_type -> taprpc.BurnAssetResponse + 82, // 121: taprpc.TaprootAssets.ListBurns:output_type -> taprpc.ListBurnsResponse + 76, // 122: taprpc.TaprootAssets.GetInfo:output_type -> taprpc.GetInfoResponse + 10, // 123: taprpc.TaprootAssets.FetchAssetMeta:output_type -> taprpc.AssetMeta + 85, // 124: taprpc.TaprootAssets.SubscribeReceiveEvents:output_type -> taprpc.ReceiveEvent + 87, // 125: taprpc.TaprootAssets.SubscribeSendEvents:output_type -> taprpc.SendEvent + 90, // 126: taprpc.TaprootAssets.RegisterTransfer:output_type -> taprpc.RegisterTransferResponse + 104, // [104:127] is the sub-list for method output_type + 81, // [81:104] is the sub-list for method input_type + 81, // [81:81] is the sub-list for extension type_name + 81, // [81:81] is the sub-list for extension extendee + 0, // [0:81] is the sub-list for field type_name } func init() { file_taprootassets_proto_init() } @@ -8372,7 +8519,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[43].Exporter = func(v any, i int) any { - switch v := v.(*ScriptKey); i { + switch v := v.(*ScriptKeyTypeQuery); i { case 0: return &v.state case 1: @@ -8384,7 +8531,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[44].Exporter = func(v any, i int) any { - switch v := v.(*KeyLocator); i { + switch v := v.(*ScriptKey); i { case 0: return &v.state case 1: @@ -8396,7 +8543,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[45].Exporter = func(v any, i int) any { - switch v := v.(*KeyDescriptor); i { + switch v := v.(*KeyLocator); i { case 0: return &v.state case 1: @@ -8408,7 +8555,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[46].Exporter = func(v any, i int) any { - switch v := v.(*TapscriptFullTree); i { + switch v := v.(*KeyDescriptor); i { case 0: return &v.state case 1: @@ -8420,7 +8567,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[47].Exporter = func(v any, i int) any { - switch v := v.(*TapLeaf); i { + switch v := v.(*TapscriptFullTree); i { case 0: return &v.state case 1: @@ -8432,7 +8579,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[48].Exporter = func(v any, i int) any { - switch v := v.(*TapBranch); i { + switch v := v.(*TapLeaf); i { case 0: return &v.state case 1: @@ -8444,7 +8591,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[49].Exporter = func(v any, i int) any { - switch v := v.(*DecodeAddrRequest); i { + switch v := v.(*TapBranch); i { case 0: return &v.state case 1: @@ -8456,7 +8603,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[50].Exporter = func(v any, i int) any { - switch v := v.(*ProofFile); i { + switch v := v.(*DecodeAddrRequest); i { case 0: return &v.state case 1: @@ -8468,7 +8615,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[51].Exporter = func(v any, i int) any { - switch v := v.(*DecodedProof); i { + switch v := v.(*ProofFile); i { case 0: return &v.state case 1: @@ -8480,7 +8627,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[52].Exporter = func(v any, i int) any { - switch v := v.(*VerifyProofResponse); i { + switch v := v.(*DecodedProof); i { case 0: return &v.state case 1: @@ -8492,7 +8639,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[53].Exporter = func(v any, i int) any { - switch v := v.(*DecodeProofRequest); i { + switch v := v.(*VerifyProofResponse); i { case 0: return &v.state case 1: @@ -8504,7 +8651,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[54].Exporter = func(v any, i int) any { - switch v := v.(*DecodeProofResponse); i { + switch v := v.(*DecodeProofRequest); i { case 0: return &v.state case 1: @@ -8516,7 +8663,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[55].Exporter = func(v any, i int) any { - switch v := v.(*ExportProofRequest); i { + switch v := v.(*DecodeProofResponse); i { case 0: return &v.state case 1: @@ -8528,7 +8675,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[56].Exporter = func(v any, i int) any { - switch v := v.(*UnpackProofFileRequest); i { + switch v := v.(*ExportProofRequest); i { case 0: return &v.state case 1: @@ -8540,7 +8687,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[57].Exporter = func(v any, i int) any { - switch v := v.(*UnpackProofFileResponse); i { + switch v := v.(*UnpackProofFileRequest); i { case 0: return &v.state case 1: @@ -8552,7 +8699,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[58].Exporter = func(v any, i int) any { - switch v := v.(*AddrEvent); i { + switch v := v.(*UnpackProofFileResponse); i { case 0: return &v.state case 1: @@ -8564,7 +8711,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[59].Exporter = func(v any, i int) any { - switch v := v.(*AddrReceivesRequest); i { + switch v := v.(*AddrEvent); i { case 0: return &v.state case 1: @@ -8576,7 +8723,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[60].Exporter = func(v any, i int) any { - switch v := v.(*AddrReceivesResponse); i { + switch v := v.(*AddrReceivesRequest); i { case 0: return &v.state case 1: @@ -8588,7 +8735,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[61].Exporter = func(v any, i int) any { - switch v := v.(*SendAssetRequest); i { + switch v := v.(*AddrReceivesResponse); i { case 0: return &v.state case 1: @@ -8600,7 +8747,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[62].Exporter = func(v any, i int) any { - switch v := v.(*PrevInputAsset); i { + switch v := v.(*SendAssetRequest); i { case 0: return &v.state case 1: @@ -8612,7 +8759,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[63].Exporter = func(v any, i int) any { - switch v := v.(*SendAssetResponse); i { + switch v := v.(*PrevInputAsset); i { case 0: return &v.state case 1: @@ -8624,7 +8771,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[64].Exporter = func(v any, i int) any { - switch v := v.(*GetInfoRequest); i { + switch v := v.(*SendAssetResponse); i { case 0: return &v.state case 1: @@ -8636,7 +8783,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[65].Exporter = func(v any, i int) any { - switch v := v.(*GetInfoResponse); i { + switch v := v.(*GetInfoRequest); i { case 0: return &v.state case 1: @@ -8648,7 +8795,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[66].Exporter = func(v any, i int) any { - switch v := v.(*FetchAssetMetaRequest); i { + switch v := v.(*GetInfoResponse); i { case 0: return &v.state case 1: @@ -8660,7 +8807,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[67].Exporter = func(v any, i int) any { - switch v := v.(*BurnAssetRequest); i { + switch v := v.(*FetchAssetMetaRequest); i { case 0: return &v.state case 1: @@ -8672,7 +8819,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[68].Exporter = func(v any, i int) any { - switch v := v.(*BurnAssetResponse); i { + switch v := v.(*BurnAssetRequest); i { case 0: return &v.state case 1: @@ -8684,7 +8831,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[69].Exporter = func(v any, i int) any { - switch v := v.(*ListBurnsRequest); i { + switch v := v.(*BurnAssetResponse); i { case 0: return &v.state case 1: @@ -8696,7 +8843,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[70].Exporter = func(v any, i int) any { - switch v := v.(*AssetBurn); i { + switch v := v.(*ListBurnsRequest); i { case 0: return &v.state case 1: @@ -8708,7 +8855,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[71].Exporter = func(v any, i int) any { - switch v := v.(*ListBurnsResponse); i { + switch v := v.(*AssetBurn); i { case 0: return &v.state case 1: @@ -8720,7 +8867,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[72].Exporter = func(v any, i int) any { - switch v := v.(*OutPoint); i { + switch v := v.(*ListBurnsResponse); i { case 0: return &v.state case 1: @@ -8732,7 +8879,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[73].Exporter = func(v any, i int) any { - switch v := v.(*SubscribeReceiveEventsRequest); i { + switch v := v.(*OutPoint); i { case 0: return &v.state case 1: @@ -8744,7 +8891,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[74].Exporter = func(v any, i int) any { - switch v := v.(*ReceiveEvent); i { + switch v := v.(*SubscribeReceiveEventsRequest); i { case 0: return &v.state case 1: @@ -8756,7 +8903,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[75].Exporter = func(v any, i int) any { - switch v := v.(*SubscribeSendEventsRequest); i { + switch v := v.(*ReceiveEvent); i { case 0: return &v.state case 1: @@ -8768,7 +8915,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[76].Exporter = func(v any, i int) any { - switch v := v.(*SendEvent); i { + switch v := v.(*SubscribeSendEventsRequest); i { case 0: return &v.state case 1: @@ -8780,7 +8927,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[77].Exporter = func(v any, i int) any { - switch v := v.(*AnchorTransaction); i { + switch v := v.(*SendEvent); i { case 0: return &v.state case 1: @@ -8792,7 +8939,7 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[78].Exporter = func(v any, i int) any { - switch v := v.(*RegisterTransferRequest); i { + switch v := v.(*AnchorTransaction); i { case 0: return &v.state case 1: @@ -8804,6 +8951,18 @@ func file_taprootassets_proto_init() { } } file_taprootassets_proto_msgTypes[79].Exporter = func(v any, i int) any { + switch v := v.(*RegisterTransferRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_taprootassets_proto_msgTypes[80].Exporter = func(v any, i int) any { switch v := v.(*RegisterTransferResponse); i { case 0: return &v.state @@ -8820,13 +8979,17 @@ func file_taprootassets_proto_init() { (*ListBalancesRequest_AssetId)(nil), (*ListBalancesRequest_GroupKey)(nil), } - file_taprootassets_proto_msgTypes[66].OneofWrappers = []any{ + file_taprootassets_proto_msgTypes[43].OneofWrappers = []any{ + (*ScriptKeyTypeQuery_ExplicitType)(nil), + (*ScriptKeyTypeQuery_AllTypes)(nil), + } + file_taprootassets_proto_msgTypes[67].OneofWrappers = []any{ (*FetchAssetMetaRequest_AssetId)(nil), (*FetchAssetMetaRequest_MetaHash)(nil), (*FetchAssetMetaRequest_AssetIdStr)(nil), (*FetchAssetMetaRequest_MetaHashStr)(nil), } - file_taprootassets_proto_msgTypes[67].OneofWrappers = []any{ + file_taprootassets_proto_msgTypes[68].OneofWrappers = []any{ (*BurnAssetRequest_AssetId)(nil), (*BurnAssetRequest_AssetIdStr)(nil), } @@ -8836,7 +8999,7 @@ func file_taprootassets_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_taprootassets_proto_rawDesc, NumEnums: 10, - NumMessages: 84, + NumMessages: 85, NumExtensions: 0, NumServices: 1, }, diff --git a/taprpc/taprootassets.proto b/taprpc/taprootassets.proto index 2bbd28c6b..709b0f6d4 100644 --- a/taprpc/taprootassets.proto +++ b/taprpc/taprootassets.proto @@ -231,6 +231,14 @@ message ListAssetRequest { // Return all assets that are currently anchored on this outpoint. OutPoint anchor_outpoint = 9; + + // The script key type to filter the assets by. If not set, only assets with + // a BIP-0086 script key will be returned (which is the equivalent of + // setting script_key_type.explicit_type = SCRIPT_KEY_BIP86). If the type + // is set to SCRIPT_KEY_BURN or SCRIPT_KEY_TOMBSTONE the include_spent flag + // will automatically be set to true, because assets of that type are always + // marked as spent. + ScriptKeyTypeQuery script_key_type = 10; } message AnchorInfo { @@ -570,6 +578,11 @@ message ListAssetResponse { message ListUtxosRequest { bool include_leased = 1; + + // The script key type to filter the assets by. If not set, only assets with + // a BIP-0086 script key will be returned (which is the equivalent of + // setting script_key_type.explicit_type = SCRIPT_KEY_BIP86). + ScriptKeyTypeQuery script_key_type = 2; } message ManagedUtxo { @@ -667,6 +680,14 @@ message ListBalancesRequest { // An option to include previous leased assets in the balances. bool include_leased = 5; + + // The script key type to filter the assets by. If not set, only assets with + // a BIP-0086 script key will be returned (which is the equivalent of + // setting script_key_type.explicit_type = SCRIPT_KEY_BIP86). If the type + // is set to SCRIPT_KEY_BURN or SCRIPT_KEY_TOMBSTONE the include_spent flag + // will automatically be set to true, because assets of that type are always + // marked as spent. + ScriptKeyTypeQuery script_key_type = 6; } message AssetBalance { @@ -1056,6 +1077,20 @@ enum ScriptKeyType { SCRIPT_KEY_CHANNEL = 5; } +message ScriptKeyTypeQuery { + oneof type { + // Query for assets of a specific script key type. + ScriptKeyType explicit_type = 1; + + // Query for assets with all script key types. + bool all_types = 2; + + // TODO(guggero): Add a bit field that allows querying for multiple + // script key types at once. Need a way to do a WHERE ... IN () type SQL + // query that is compatible with all backends first though. + } +} + message ScriptKey { /* The full Taproot output key the asset is locked to. This is either a BIP-86 diff --git a/taprpc/taprootassets.swagger.json b/taprpc/taprootassets.swagger.json index 1cbb77554..37ecad8ec 100644 --- a/taprpc/taprootassets.swagger.json +++ b/taprpc/taprootassets.swagger.json @@ -309,6 +309,29 @@ "required": false, "type": "integer", "format": "int64" + }, + { + "name": "script_key_type.explicit_type", + "description": "Query for assets of a specific script key type.\n\n - SCRIPT_KEY_UNKNOWN: The type of script key is not known. This should only be stored for assets\nwhere we don't know the internal key of the script key (e.g. for\nimported proofs).\n - SCRIPT_KEY_BIP86: The script key is a normal BIP-86 key. This means that the internal key is\nturned into a Taproot output key by applying a BIP-86 tweak to it.\n - SCRIPT_KEY_SCRIPT_PATH_EXTERNAL: The script key is a key that contains a script path that is defined by the\nuser and is therefore external to the tapd wallet. Spending this key\nrequires providing a specific witness and must be signed through the vPSBT\nsigning flow.\n - SCRIPT_KEY_BURN: The script key is a specific un-spendable key that indicates a burnt asset.\nAssets with this key type can never be spent again, as a burn key is a\ntweaked NUMS key that nobody knows the private key for.\n - SCRIPT_KEY_TOMBSTONE: The script key is a specific un-spendable key that indicates a tombstone\noutput. This is only the case for zero-value assets that result from a\nnon-interactive (TAP address) send where no change was left over.\n - SCRIPT_KEY_CHANNEL: The script key is used for an asset that resides within a Taproot Asset\nChannel. That means the script key is either a funding key (OP_TRUE), a\ncommitment output key (to_local, to_remote, htlc), or a HTLC second-level\ntransaction output key. Keys related to channels are not shown in asset\nbalances (unless specifically requested) and are never used for coin\nselection.", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "SCRIPT_KEY_UNKNOWN", + "SCRIPT_KEY_BIP86", + "SCRIPT_KEY_SCRIPT_PATH_EXTERNAL", + "SCRIPT_KEY_BURN", + "SCRIPT_KEY_TOMBSTONE", + "SCRIPT_KEY_CHANNEL" + ], + "default": "SCRIPT_KEY_UNKNOWN" + }, + { + "name": "script_key_type.all_types", + "description": "Query for assets with all script key types.", + "in": "query", + "required": false, + "type": "boolean" } ], "tags": [ @@ -371,6 +394,29 @@ "in": "query", "required": false, "type": "boolean" + }, + { + "name": "script_key_type.explicit_type", + "description": "Query for assets of a specific script key type.\n\n - SCRIPT_KEY_UNKNOWN: The type of script key is not known. This should only be stored for assets\nwhere we don't know the internal key of the script key (e.g. for\nimported proofs).\n - SCRIPT_KEY_BIP86: The script key is a normal BIP-86 key. This means that the internal key is\nturned into a Taproot output key by applying a BIP-86 tweak to it.\n - SCRIPT_KEY_SCRIPT_PATH_EXTERNAL: The script key is a key that contains a script path that is defined by the\nuser and is therefore external to the tapd wallet. Spending this key\nrequires providing a specific witness and must be signed through the vPSBT\nsigning flow.\n - SCRIPT_KEY_BURN: The script key is a specific un-spendable key that indicates a burnt asset.\nAssets with this key type can never be spent again, as a burn key is a\ntweaked NUMS key that nobody knows the private key for.\n - SCRIPT_KEY_TOMBSTONE: The script key is a specific un-spendable key that indicates a tombstone\noutput. This is only the case for zero-value assets that result from a\nnon-interactive (TAP address) send where no change was left over.\n - SCRIPT_KEY_CHANNEL: The script key is used for an asset that resides within a Taproot Asset\nChannel. That means the script key is either a funding key (OP_TRUE), a\ncommitment output key (to_local, to_remote, htlc), or a HTLC second-level\ntransaction output key. Keys related to channels are not shown in asset\nbalances (unless specifically requested) and are never used for coin\nselection.", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "SCRIPT_KEY_UNKNOWN", + "SCRIPT_KEY_BIP86", + "SCRIPT_KEY_SCRIPT_PATH_EXTERNAL", + "SCRIPT_KEY_BURN", + "SCRIPT_KEY_TOMBSTONE", + "SCRIPT_KEY_CHANNEL" + ], + "default": "SCRIPT_KEY_UNKNOWN" + }, + { + "name": "script_key_type.all_types", + "description": "Query for assets with all script key types.", + "in": "query", + "required": false, + "type": "boolean" } ], "tags": [ @@ -632,6 +678,29 @@ "in": "query", "required": false, "type": "boolean" + }, + { + "name": "script_key_type.explicit_type", + "description": "Query for assets of a specific script key type.\n\n - SCRIPT_KEY_UNKNOWN: The type of script key is not known. This should only be stored for assets\nwhere we don't know the internal key of the script key (e.g. for\nimported proofs).\n - SCRIPT_KEY_BIP86: The script key is a normal BIP-86 key. This means that the internal key is\nturned into a Taproot output key by applying a BIP-86 tweak to it.\n - SCRIPT_KEY_SCRIPT_PATH_EXTERNAL: The script key is a key that contains a script path that is defined by the\nuser and is therefore external to the tapd wallet. Spending this key\nrequires providing a specific witness and must be signed through the vPSBT\nsigning flow.\n - SCRIPT_KEY_BURN: The script key is a specific un-spendable key that indicates a burnt asset.\nAssets with this key type can never be spent again, as a burn key is a\ntweaked NUMS key that nobody knows the private key for.\n - SCRIPT_KEY_TOMBSTONE: The script key is a specific un-spendable key that indicates a tombstone\noutput. This is only the case for zero-value assets that result from a\nnon-interactive (TAP address) send where no change was left over.\n - SCRIPT_KEY_CHANNEL: The script key is used for an asset that resides within a Taproot Asset\nChannel. That means the script key is either a funding key (OP_TRUE), a\ncommitment output key (to_local, to_remote, htlc), or a HTLC second-level\ntransaction output key. Keys related to channels are not shown in asset\nbalances (unless specifically requested) and are never used for coin\nselection.", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "SCRIPT_KEY_UNKNOWN", + "SCRIPT_KEY_BIP86", + "SCRIPT_KEY_SCRIPT_PATH_EXTERNAL", + "SCRIPT_KEY_BURN", + "SCRIPT_KEY_TOMBSTONE", + "SCRIPT_KEY_CHANNEL" + ], + "default": "SCRIPT_KEY_UNKNOWN" + }, + { + "name": "script_key_type.all_types", + "description": "Query for assets with all script key types.", + "in": "query", + "required": false, + "type": "boolean" } ], "tags": [ @@ -2348,6 +2417,19 @@ "default": "SCRIPT_KEY_UNKNOWN", "description": " - SCRIPT_KEY_UNKNOWN: The type of script key is not known. This should only be stored for assets\nwhere we don't know the internal key of the script key (e.g. for\nimported proofs).\n - SCRIPT_KEY_BIP86: The script key is a normal BIP-86 key. This means that the internal key is\nturned into a Taproot output key by applying a BIP-86 tweak to it.\n - SCRIPT_KEY_SCRIPT_PATH_EXTERNAL: The script key is a key that contains a script path that is defined by the\nuser and is therefore external to the tapd wallet. Spending this key\nrequires providing a specific witness and must be signed through the vPSBT\nsigning flow.\n - SCRIPT_KEY_BURN: The script key is a specific un-spendable key that indicates a burnt asset.\nAssets with this key type can never be spent again, as a burn key is a\ntweaked NUMS key that nobody knows the private key for.\n - SCRIPT_KEY_TOMBSTONE: The script key is a specific un-spendable key that indicates a tombstone\noutput. This is only the case for zero-value assets that result from a\nnon-interactive (TAP address) send where no change was left over.\n - SCRIPT_KEY_CHANNEL: The script key is used for an asset that resides within a Taproot Asset\nChannel. That means the script key is either a funding key (OP_TRUE), a\ncommitment output key (to_local, to_remote, htlc), or a HTLC second-level\ntransaction output key. Keys related to channels are not shown in asset\nbalances (unless specifically requested) and are never used for coin\nselection." }, + "taprpcScriptKeyTypeQuery": { + "type": "object", + "properties": { + "explicit_type": { + "$ref": "#/definitions/taprpcScriptKeyType", + "description": "Query for assets of a specific script key type." + }, + "all_types": { + "type": "boolean", + "description": "Query for assets with all script key types." + } + } + }, "taprpcSendAssetRequest": { "type": "object", "properties": { diff --git a/tapsend/send.go b/tapsend/send.go index bb007e989..8e2d16bac 100644 --- a/tapsend/send.go +++ b/tapsend/send.go @@ -214,6 +214,10 @@ type FundingDescriptor struct { // key is set, we ignore the asset ID and allow multiple inputs of the // same group to be selected. DistinctSpecifier bool + + // ScriptKeyType is the type of script key the assets are expected to + // have. If this is fn.None, then any script key type is allowed. + ScriptKeyType fn.Option[asset.ScriptKeyType] } // TapCommitmentKey is the key that maps to the root commitment for the asset From 4c2b6f0ab7df40ce069f084d82a6be1550aa3776 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 3 Apr 2025 14:56:48 +0200 Subject: [PATCH 14/17] multi: turn coin selection type into script key filter --- rpcserver.go | 29 ++++++++++++++--------------- tapdb/assets_store_test.go | 29 +++++++---------------------- tapfreighter/chain_porter.go | 3 ++- tapfreighter/coin_select.go | 1 - tapfreighter/interface.go | 4 ---- tapfreighter/wallet.go | 9 ++++----- tapsend/send.go | 25 ------------------------- 7 files changed, 27 insertions(+), 73 deletions(-) diff --git a/rpcserver.go b/rpcserver.go index 29adc37db..9af1ac55d 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -1060,9 +1060,8 @@ func (r *rpcServer) ListAssets(ctx context.Context, } constraints := tapfreighter.CommitmentConstraints{ - MinAmt: req.MinAmount, - MaxAmt: req.MaxAmount, - CoinSelectType: tapsend.DefaultCoinSelectType, + MinAmt: req.MinAmount, + MaxAmt: req.MaxAmount, } if len(req.GroupKey) > 0 { @@ -2203,7 +2202,7 @@ func (r *rpcServer) FundVirtualPsbt(ctx context.Context, req *wrpc.FundVirtualPsbtRequest) (*wrpc.FundVirtualPsbtResponse, error) { - coinSelectType, err := unmarshalCoinSelectType(req.CoinSelectType) + scriptKeyType, err := unmarshalCoinSelectType(req.CoinSelectType) if err != nil { return nil, fmt.Errorf("error parsing coin select type: %w", err) @@ -2230,7 +2229,7 @@ func (r *rpcServer) FundVirtualPsbt(ctx context.Context, "recipients: %w", err) } - desc.CoinSelectType = coinSelectType + desc.ScriptKeyType = scriptKeyType fundedVPkt, err = r.cfg.AssetWallet.FundPacket(ctx, desc, vPkt) if err != nil { return nil, fmt.Errorf("error funding packet: %w", err) @@ -2300,7 +2299,7 @@ func (r *rpcServer) FundVirtualPsbt(ctx context.Context, } fundedVPkt, err = r.cfg.AssetWallet.FundAddressSend( - ctx, coinSelectType, prevIDs, addr, + ctx, scriptKeyType, prevIDs, addr, ) if err != nil { return nil, fmt.Errorf("error funding address send: "+ @@ -2351,21 +2350,21 @@ func (r *rpcServer) FundVirtualPsbt(ctx context.Context, // unmarshalCoinSelectType converts an RPC select type into a native one. func unmarshalCoinSelectType( - coinSelectType wrpc.CoinSelectType) (tapsend.CoinSelectType, error) { + coinSelectType wrpc.CoinSelectType) (fn.Option[asset.ScriptKeyType], + error) { switch coinSelectType { - case wrpc.CoinSelectType_COIN_SELECT_DEFAULT: - return tapsend.DefaultCoinSelectType, nil + case wrpc.CoinSelectType_COIN_SELECT_DEFAULT, + wrpc.CoinSelectType_COIN_SELECT_SCRIPT_TREES_ALLOWED: - case wrpc.CoinSelectType_COIN_SELECT_BIP86_ONLY: - return tapsend.Bip86Only, nil + return fn.None[asset.ScriptKeyType](), nil - case wrpc.CoinSelectType_COIN_SELECT_SCRIPT_TREES_ALLOWED: - return tapsend.ScriptTreesAllowed, nil + case wrpc.CoinSelectType_COIN_SELECT_BIP86_ONLY: + return fn.Some(asset.ScriptKeyBip86), nil default: - return 0, fmt.Errorf("unknown coin select type: %d", - coinSelectType) + return fn.None[asset.ScriptKeyType](), fmt.Errorf("unknown "+ + "coin select type: %d", coinSelectType) } } diff --git a/tapdb/assets_store_test.go b/tapdb/assets_store_test.go index 3cfda509e..78d149431 100644 --- a/tapdb/assets_store_test.go +++ b/tapdb/assets_store_test.go @@ -24,7 +24,6 @@ import ( "github.com/lightninglabs/taproot-assets/tapdb/sqlc" "github.com/lightninglabs/taproot-assets/tapfreighter" "github.com/lightninglabs/taproot-assets/tapscript" - "github.com/lightninglabs/taproot-assets/tapsend" "github.com/lightningnetwork/lnd/input" "github.com/lightningnetwork/lnd/keychain" "github.com/stretchr/testify/require" @@ -730,12 +729,6 @@ func filterMaxAmt(amt uint64) filterOpt { } } -func filterCoinSelectType(typ tapsend.CoinSelectType) filterOpt { - return func(f *AssetQueryFilters) { - f.CoinSelectType = typ - } -} - func filterDistinctSpecifier() filterOpt { return func(f *AssetQueryFilters) { f.DistinctSpecifier = true @@ -760,6 +753,12 @@ func filterScriptKey(key *asset.ScriptKey) filterOpt { } } +func filterScriptKeyType(keyType asset.ScriptKeyType) filterOpt { + return func(f *AssetQueryFilters) { + f.ScriptKeyType = fn.Some(keyType) + } +} + // TestFetchAllAssets tests that the different AssetQueryFilters work as // expected. func TestFetchAllAssets(t *testing.T) { @@ -889,14 +888,12 @@ func TestFetchAllAssets(t *testing.T) { name: "min amount", filter: makeFilter( filterMinAmt(12), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), numAssets: 2, }, { name: "min amount, include spent", filter: makeFilter( filterMinAmt(12), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), includeSpent: true, numAssets: 4, @@ -904,7 +901,6 @@ func TestFetchAllAssets(t *testing.T) { name: "min amount, include leased", filter: makeFilter( filterMinAmt(12), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), includeLeased: true, numAssets: 5, @@ -912,7 +908,6 @@ func TestFetchAllAssets(t *testing.T) { name: "min amount, include leased, include spent", filter: makeFilter( filterMinAmt(12), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), includeLeased: true, includeSpent: true, @@ -921,14 +916,12 @@ func TestFetchAllAssets(t *testing.T) { name: "max amount", filter: makeFilter( filterMaxAmt(100), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), numAssets: 6, }, { name: "max amount, include spent", filter: makeFilter( filterMaxAmt(100), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), includeSpent: true, numAssets: 7, @@ -936,7 +929,6 @@ func TestFetchAllAssets(t *testing.T) { name: "max amount, include leased", filter: makeFilter( filterMaxAmt(100), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), includeLeased: true, numAssets: 8, @@ -944,7 +936,6 @@ func TestFetchAllAssets(t *testing.T) { name: "max amount, include leased, include spent", filter: makeFilter( filterMaxAmt(100), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), includeLeased: true, includeSpent: true, @@ -953,7 +944,6 @@ func TestFetchAllAssets(t *testing.T) { name: "default min height, include spent", filter: makeFilter( filterAnchorHeight(500), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), includeSpent: true, numAssets: 8, @@ -961,14 +951,12 @@ func TestFetchAllAssets(t *testing.T) { name: "specific height", filter: makeFilter( filterAnchorHeight(512), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), numAssets: 0, }, { name: "specific height, include spent", filter: makeFilter( filterAnchorHeight(502), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), includeSpent: true, numAssets: 3, @@ -976,21 +964,19 @@ func TestFetchAllAssets(t *testing.T) { name: "script key with tapscript", filter: makeFilter( filterMinAmt(100), - filterCoinSelectType(tapsend.Bip86Only), + filterScriptKeyType(asset.ScriptKeyBip86), ), numAssets: 0, }, { name: "query by script key", filter: makeFilter( filterScriptKey(scriptKeyWithScript), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), numAssets: 1, }, { name: "query by script key, include leased", filter: makeFilter( filterScriptKey(scriptKeyWithScript), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), includeLeased: true, numAssets: 2, @@ -1022,7 +1008,6 @@ func TestFetchAllAssets(t *testing.T) { name: "query by anchor point", filter: makeFilter( filterAnchorPoint(&assetGen.anchorPoints[0]), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), numAssets: 3, }} diff --git a/tapfreighter/chain_porter.go b/tapfreighter/chain_porter.go index 71dd1c6ed..0a915794c 100644 --- a/tapfreighter/chain_porter.go +++ b/tapfreighter/chain_porter.go @@ -1113,7 +1113,8 @@ func (p *ChainPorter) stateStep(currentPkg sendPackage) (*sendPackage, error) { "address parcel") } fundSendRes, err := p.cfg.AssetWallet.FundAddressSend( - ctx, tapsend.Bip86Only, nil, addrParcel.destAddrs..., + ctx, fn.Some(asset.ScriptKeyBip86), nil, + addrParcel.destAddrs..., ) if err != nil { return nil, fmt.Errorf("unable to fund address send: "+ diff --git a/tapfreighter/coin_select.go b/tapfreighter/coin_select.go index f82726d3e..0a1c23de9 100644 --- a/tapfreighter/coin_select.go +++ b/tapfreighter/coin_select.go @@ -54,7 +54,6 @@ func (s *CoinSelect) SelectCoins(ctx context.Context, listConstraints := CommitmentConstraints{ AssetSpecifier: constraints.AssetSpecifier, MinAmt: 1, - CoinSelectType: constraints.CoinSelectType, ScriptKeyType: constraints.ScriptKeyType, PrevIDs: constraints.PrevIDs, DistinctSpecifier: constraints.DistinctSpecifier, diff --git a/tapfreighter/interface.go b/tapfreighter/interface.go index 91051819a..06ea47198 100644 --- a/tapfreighter/interface.go +++ b/tapfreighter/interface.go @@ -21,7 +21,6 @@ import ( "github.com/lightninglabs/taproot-assets/tapgarden" "github.com/lightninglabs/taproot-assets/tappsbt" "github.com/lightninglabs/taproot-assets/tapscript" - "github.com/lightninglabs/taproot-assets/tapsend" "github.com/lightningnetwork/lnd/keychain" ) @@ -46,9 +45,6 @@ type CommitmentConstraints struct { // PrevIDs are the set of inputs allowed to be used. PrevIDs []asset.PrevID - // CoinSelectType is the type of coins that should be selected. - CoinSelectType tapsend.CoinSelectType - // DistinctSpecifier indicates whether we _only_ look at either the // group key _or_ the asset ID but not both. That means, if the group // key is set, we ignore the asset ID and allow multiple inputs of the diff --git a/tapfreighter/wallet.go b/tapfreighter/wallet.go index 9dd171432..2436054b0 100644 --- a/tapfreighter/wallet.go +++ b/tapfreighter/wallet.go @@ -69,7 +69,8 @@ type Wallet interface { // asset re-anchors and the Taproot Asset level commitment of the // selected assets. FundAddressSend(ctx context.Context, - coinSelectType tapsend.CoinSelectType, prevIDs []asset.PrevID, + scriptKeyType fn.Option[asset.ScriptKeyType], + prevIDs []asset.PrevID, receiverAddrs ...*address.Tap) (*FundedVPacket, error) // FundPacket funds a virtual transaction, selecting assets to spend @@ -240,8 +241,7 @@ type FundedVPacket struct { // // NOTE: This is part of the Wallet interface. func (f *AssetWallet) FundAddressSend(ctx context.Context, - coinSelectType tapsend.CoinSelectType, - prevIDs []asset.PrevID, + scriptKeyType fn.Option[asset.ScriptKeyType], prevIDs []asset.PrevID, receiverAddrs ...*address.Tap) (*FundedVPacket, error) { // We start by creating a new virtual transaction that will be used to @@ -264,7 +264,7 @@ func (f *AssetWallet) FundAddressSend(ctx context.Context, fundDesc.PrevIDs = prevIDs } - fundDesc.CoinSelectType = coinSelectType + fundDesc.ScriptKeyType = scriptKeyType fundedVPkt, err := f.FundPacket(ctx, fundDesc, vPkt) if err != nil { return nil, err @@ -413,7 +413,6 @@ func (f *AssetWallet) FundPacket(ctx context.Context, constraints := CommitmentConstraints{ AssetSpecifier: fundDesc.AssetSpecifier, MinAmt: fundDesc.Amount, - CoinSelectType: fundDesc.CoinSelectType, ScriptKeyType: fundDesc.ScriptKeyType, PrevIDs: fundDesc.PrevIDs, DistinctSpecifier: fundDesc.DistinctSpecifier, diff --git a/tapsend/send.go b/tapsend/send.go index 8e2d16bac..58babffbe 100644 --- a/tapsend/send.go +++ b/tapsend/send.go @@ -171,28 +171,6 @@ type AssetGroupQuerier interface { QueryAssetGroup(context.Context, asset.ID) (*asset.AssetGroup, error) } -// CoinSelectType is a type that indicates the type of coins that should be -// selected. This type is defined in the tapsend package to avoid a circular -// dependency with the freighter package. -type CoinSelectType uint8 - -const ( - // Bip86Only indicates that only coins that have a BIP-086 script key - // should be selected. - Bip86Only CoinSelectType = 0 - - // ScriptTreesAllowed indicates that coins with any script key type - // should be selected. - ScriptTreesAllowed CoinSelectType = 1 - - // DefaultCoinSelectType is the default coin selection type that should - // be used when no specific type is specified. We default to allowing - // any script key type to be in line with the RPC values, which are - // intended to be backward compatible with clients that didn't specify - // the type (when funding a vPSBT for example). - DefaultCoinSelectType = ScriptTreesAllowed -) - // FundingDescriptor describes the information that is needed to select and // verify input assets in order to send to a specific recipient. It is a subset // of the information contained in a Taproot Asset address. @@ -206,9 +184,6 @@ type FundingDescriptor struct { // PrevIDs is the set of inputs that can be used to fund the transfer. PrevIDs []asset.PrevID - // CoinSelectType specifies the type of coins that should be selected. - CoinSelectType CoinSelectType - // DistinctSpecifier indicates whether we _only_ look at either the // group key _or_ the asset ID but not both. That means, if the group // key is set, we ignore the asset ID and allow multiple inputs of the From 5e2bbda2824665e86d3ee89ba07067c0eea6bfaf Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 3 Apr 2025 14:51:44 +0200 Subject: [PATCH 15/17] tapdb: change script key exclusion mechanism With an explicit type for a script key now being used, we can turn the key based matching into a type based matching, which will also be more generic for unique funding script keys that are required for grouped asset channel funding. --- tapdb/assets_store.go | 49 +++++++++++++++++++++-------------- tapdb/assets_store_test.go | 46 +++++++++++++++++++++++++++++--- tapdb/sqlc/assets.sql.go | 30 ++++++++++----------- tapdb/sqlc/queries/assets.sql | 10 +++---- 4 files changed, 92 insertions(+), 43 deletions(-) diff --git a/tapdb/assets_store.go b/tapdb/assets_store.go index 4e6f2cbca..22765cbbb 100644 --- a/tapdb/assets_store.go +++ b/tapdb/assets_store.go @@ -23,7 +23,6 @@ import ( "github.com/lightninglabs/taproot-assets/tapdb/sqlc" "github.com/lightninglabs/taproot-assets/tapfreighter" "github.com/lightninglabs/taproot-assets/tappsbt" - "github.com/lightninglabs/taproot-assets/tapscript" "github.com/lightningnetwork/lnd/clock" "github.com/lightningnetwork/lnd/keychain" ) @@ -999,19 +998,25 @@ func (a *AssetStore) QueryBalancesByAsset(ctx context.Context, }, } + // We exclude the assets that are specifically used for funding custom + // channels. The balance of those assets is reported through lnd channel + // balance. Those assets are identified by the specific script key type + // for channel keys. We exclude them unless explicitly queried for. + assetBalancesFilter.ExcludeScriptKeyType = sqlInt16( + asset.ScriptKeyScriptPathChannel, + ) + // The fn.None option means we don't restrict on script key type at all. skt.WhenSome(func(t asset.ScriptKeyType) { assetBalancesFilter.ScriptKeyType = sqlInt16(t) - }) - // We exclude the assets that are specifically used for funding custom - // channels. The balance of those assets is reported through lnd channel - // balance. Those assets are identified by the funding script tree for a - // custom channel asset-level script key. - excludeKey := asset.NewScriptKey( - tapscript.NewChannelFundingScriptTree().TaprootKey, - ) - assetBalancesFilter.ExcludeKey = excludeKey.PubKey.SerializeCompressed() + // If the user explicitly wants to see the channel related asset + // balances, we need to set the exclude type to NULL. + if t == asset.ScriptKeyScriptPathChannel { + nullValue := sql.NullInt16{} + assetBalancesFilter.ExcludeScriptKeyType = nullValue + } + }) // By default, we only show assets that are not leased. if !includeLeased { @@ -1085,19 +1090,25 @@ func (a *AssetStore) QueryAssetBalancesByGroup(ctx context.Context, }, } + // We exclude the assets that are specifically used for funding custom + // channels. The balance of those assets is reported through lnd channel + // balance. Those assets are identified by the specific script key type + // for channel keys. We exclude them unless explicitly queried for. + assetBalancesFilter.ExcludeScriptKeyType = sqlInt16( + asset.ScriptKeyScriptPathChannel, + ) + // The fn.None option means we don't restrict on script key type at all. skt.WhenSome(func(t asset.ScriptKeyType) { assetBalancesFilter.ScriptKeyType = sqlInt16(t) - }) - // We exclude the assets that are specifically used for funding custom - // channels. The balance of those assets is reported through lnd channel - // balance. Those assets are identified by the funding script tree for a - // custom channel asset-level script key. - excludeKey := asset.NewScriptKey( - tapscript.NewChannelFundingScriptTree().TaprootKey, - ) - assetBalancesFilter.ExcludeKey = excludeKey.PubKey.SerializeCompressed() + // If the user explicitly wants to see the channel related asset + // balances, we need to set the exclude type to NULL. + if t == asset.ScriptKeyScriptPathChannel { + nullValue := sql.NullInt16{} + assetBalancesFilter.ExcludeScriptKeyType = nullValue + } + }) // By default, we only show assets that are not leased. if !includeLeased { diff --git a/tapdb/assets_store_test.go b/tapdb/assets_store_test.go index 78d149431..975cfbc33 100644 --- a/tapdb/assets_store_test.go +++ b/tapdb/assets_store_test.go @@ -11,6 +11,7 @@ import ( "time" "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/schnorr" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" @@ -3027,23 +3028,33 @@ func TestQueryAssetBalancesCustomChannelFunding(t *testing.T) { const numGroups = 1 assetGen := newAssetGenerator(t, numAssets, numGroups) - fundingScriptKey := asset.NewScriptKey( - tapscript.NewChannelFundingScriptTree().TaprootKey, + fundingKey := tapscript.NewChannelFundingScriptTree() + xOnlyKey, _ := schnorr.ParsePubKey( + schnorr.SerializePubKey(fundingKey.TaprootKey), ) + fundingScriptKey := asset.ScriptKey{ + PubKey: xOnlyKey, + TweakedScriptKey: &asset.TweakedScriptKey{ + RawKey: keychain.KeyDescriptor{ + PubKey: fundingKey.InternalKey, + }, + Type: asset.ScriptKeyScriptPathChannel, + }, + } assetDesc := []assetDesc{ { assetGen: assetGen.assetGens[0], anchorPoint: assetGen.anchorPoints[0], keyGroup: assetGen.groupKeys[0], - amt: 4, + amt: 8, scriptKey: &fundingScriptKey, }, { assetGen: assetGen.assetGens[1], anchorPoint: assetGen.anchorPoints[1], keyGroup: assetGen.groupKeys[0], - amt: 4, + amt: 12, }, } assetGen.genAssets(t, assetsStore, assetDesc) @@ -3074,4 +3085,31 @@ func TestQueryAssetBalancesCustomChannelFunding(t *testing.T) { balanceByGroupSum += balance.Balance } require.Equal(t, assetDesc[1].amt, balanceByGroupSum) + + // If we explicitly query for channel related script keys, we should get + // just those assets. + balances, err = assetsStore.QueryBalancesByAsset( + ctx, nil, includeLeased, + fn.Some(asset.ScriptKeyScriptPathChannel), + ) + require.NoError(t, err) + balancesByGroup, err = assetsStore.QueryAssetBalancesByGroup( + ctx, nil, includeLeased, + fn.Some(asset.ScriptKeyScriptPathChannel), + ) + require.NoError(t, err) + require.Len(t, balances, numAssets-1) + require.Len(t, balancesByGroup, numAssets-1) + + balanceSum = uint64(0) + for _, balance := range balances { + balanceSum += balance.Balance + } + require.Equal(t, assetDesc[0].amt, balanceSum) + + balanceByGroupSum = uint64(0) + for _, balance := range balancesByGroup { + balanceByGroupSum += balance.Balance + } + require.Equal(t, assetDesc[0].amt, balanceByGroupSum) } diff --git a/tapdb/sqlc/assets.sql.go b/tapdb/sqlc/assets.sql.go index 481eeb5d7..4fd0e0fe4 100644 --- a/tapdb/sqlc/assets.sql.go +++ b/tapdb/sqlc/assets.sql.go @@ -2207,7 +2207,7 @@ JOIN managed_utxos utxos JOIN script_keys ON assets.script_key_id = script_keys.script_key_id WHERE spent = FALSE AND - (script_keys.tweaked_script_key != $4 OR + (script_keys.key_type != $4 OR $4 IS NULL) AND ($5 = script_keys.key_type OR $5 IS NULL) @@ -2218,11 +2218,11 @@ GROUP BY assets.genesis_id, genesis_info_view.asset_id, ` type QueryAssetBalancesByAssetParams struct { - AssetIDFilter []byte - Leased interface{} - Now sql.NullTime - ExcludeKey []byte - ScriptKeyType sql.NullInt16 + AssetIDFilter []byte + Leased interface{} + Now sql.NullTime + ExcludeScriptKeyType sql.NullInt16 + ScriptKeyType sql.NullInt16 } type QueryAssetBalancesByAssetRow struct { @@ -2244,7 +2244,7 @@ func (q *Queries) QueryAssetBalancesByAsset(ctx context.Context, arg QueryAssetB arg.AssetIDFilter, arg.Leased, arg.Now, - arg.ExcludeKey, + arg.ExcludeScriptKeyType, arg.ScriptKeyType, ) if err != nil { @@ -2297,8 +2297,8 @@ JOIN managed_utxos utxos END JOIN script_keys ON assets.script_key_id = script_keys.script_key_id -WHERE spent = FALSE AND - (script_keys.tweaked_script_key != $4 OR +WHERE spent = FALSE AND + (script_keys.key_type != $4 OR $4 IS NULL) AND ($5 = script_keys.key_type OR $5 IS NULL) @@ -2306,11 +2306,11 @@ GROUP BY key_group_info_view.tweaked_group_key ` type QueryAssetBalancesByGroupParams struct { - KeyGroupFilter []byte - Leased interface{} - Now sql.NullTime - ExcludeKey []byte - ScriptKeyType sql.NullInt16 + KeyGroupFilter []byte + Leased interface{} + Now sql.NullTime + ExcludeScriptKeyType sql.NullInt16 + ScriptKeyType sql.NullInt16 } type QueryAssetBalancesByGroupRow struct { @@ -2323,7 +2323,7 @@ func (q *Queries) QueryAssetBalancesByGroup(ctx context.Context, arg QueryAssetB arg.KeyGroupFilter, arg.Leased, arg.Now, - arg.ExcludeKey, + arg.ExcludeScriptKeyType, arg.ScriptKeyType, ) if err != nil { diff --git a/tapdb/sqlc/queries/assets.sql b/tapdb/sqlc/queries/assets.sql index 8a679942d..b2104dd6a 100644 --- a/tapdb/sqlc/queries/assets.sql +++ b/tapdb/sqlc/queries/assets.sql @@ -339,8 +339,8 @@ JOIN managed_utxos utxos JOIN script_keys ON assets.script_key_id = script_keys.script_key_id WHERE spent = FALSE AND - (script_keys.tweaked_script_key != sqlc.narg('exclude_key') OR - sqlc.narg('exclude_key') IS NULL) AND + (script_keys.key_type != sqlc.narg('exclude_script_key_type') OR + sqlc.narg('exclude_script_key_type') IS NULL) AND (sqlc.narg('script_key_type') = script_keys.key_type OR sqlc.narg('script_key_type') IS NULL) GROUP BY assets.genesis_id, genesis_info_view.asset_id, @@ -369,9 +369,9 @@ JOIN managed_utxos utxos END JOIN script_keys ON assets.script_key_id = script_keys.script_key_id -WHERE spent = FALSE AND - (script_keys.tweaked_script_key != sqlc.narg('exclude_key') OR - sqlc.narg('exclude_key') IS NULL) AND +WHERE spent = FALSE AND + (script_keys.key_type != sqlc.narg('exclude_script_key_type') OR + sqlc.narg('exclude_script_key_type') IS NULL) AND (sqlc.narg('script_key_type') = script_keys.key_type OR sqlc.narg('script_key_type') IS NULL) GROUP BY key_group_info_view.tweaked_group_key; From dfe3fbf7724624af5863218852580e5028c0ff1a Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 3 Apr 2025 16:24:36 +0200 Subject: [PATCH 16/17] itest: query for all asset script types To make sure our itests still work, we need to query assets with all possible script key types. --- itest/assertions.go | 14 ++++++++++++-- itest/assets_test.go | 4 +++- itest/burn_test.go | 14 ++++++++------ itest/psbt_test.go | 24 ++++++++++++++++++------ itest/utils.go | 1 + 5 files changed, 42 insertions(+), 15 deletions(-) diff --git a/itest/assertions.go b/itest/assertions.go index 3e76be2cb..4f62b3b25 100644 --- a/itest/assertions.go +++ b/itest/assertions.go @@ -46,6 +46,12 @@ var ( batchFrozen = mintrpc.BatchState_BATCH_STATE_FROZEN batchFinalized = mintrpc.BatchState_BATCH_STATE_FINALIZED + + allScriptKeysQuery = &taprpc.ScriptKeyTypeQuery{ + Type: &taprpc.ScriptKeyTypeQuery_AllTypes{ + AllTypes: true, + }, + } ) // tapClient is an interface that covers all currently available RPC interfaces @@ -1336,7 +1342,8 @@ func AssertBalanceByID(t *testing.T, client taprpc.TaprootAssetsClient, GroupBy: &taprpc.ListBalancesRequest_AssetId{ AssetId: true, }, - AssetFilter: id, + AssetFilter: id, + ScriptKeyType: allScriptKeysQuery, }, ) require.NoError(t, err) @@ -1902,7 +1909,9 @@ func AssertAssetsMinted(t *testing.T, tapClient commands.RpcClientsBundle, ) listRespConfirmed, err := tapClient.ListAssets( - ctxt, &taprpc.ListAssetRequest{}, + ctxt, &taprpc.ListAssetRequest{ + ScriptKeyType: allScriptKeysQuery, + }, ) require.NoError(t, err) confirmedAssets := GroupAssetsByName(listRespConfirmed.Assets) @@ -2198,6 +2207,7 @@ func assertNumAssetOutputs(t *testing.T, client taprpc.TaprootAssetsClient, resp, err := client.ListAssets(ctxt, &taprpc.ListAssetRequest{ IncludeLeased: true, + ScriptKeyType: allScriptKeysQuery, }) require.NoError(t, err) diff --git a/itest/assets_test.go b/itest/assets_test.go index 31b14f36f..7ca06be98 100644 --- a/itest/assets_test.go +++ b/itest/assets_test.go @@ -241,7 +241,9 @@ func transferAssetProofs(t *harnessTest, src, dst *tapdHarness, } listResp, err := dst.ListAssets( - ctxt, &taprpc.ListAssetRequest{}, + ctxt, &taprpc.ListAssetRequest{ + ScriptKeyType: allScriptKeysQuery, + }, ) require.NoError(t.t, err) diff --git a/itest/burn_test.go b/itest/burn_test.go index ec65142a5..0c39feed4 100644 --- a/itest/burn_test.go +++ b/itest/burn_test.go @@ -157,9 +157,10 @@ func testBurnAssets(t *harnessTest) { // We'll now assert that the burned asset has the correct state. burnedAsset := burnResp.BurnProof.Asset - allAssets, err := t.tapd.ListAssets( - ctxt, &taprpc.ListAssetRequest{IncludeSpent: true}, - ) + allAssets, err := t.tapd.ListAssets(ctxt, &taprpc.ListAssetRequest{ + IncludeSpent: true, + ScriptKeyType: allScriptKeysQuery, + }) require.NoError(t.t, err) AssertAssetStateByScriptKey( t.t, allAssets.Assets, burnedAsset.ScriptKey, @@ -454,9 +455,10 @@ func testBurnGroupedAssets(t *harnessTest) { // Ensure that the burnt asset has the correct state. burnedAsset := burnResp.BurnProof.Asset - allAssets, err := t.tapd.ListAssets( - ctxb, &taprpc.ListAssetRequest{IncludeSpent: true}, - ) + allAssets, err := t.tapd.ListAssets(ctxb, &taprpc.ListAssetRequest{ + IncludeSpent: true, + ScriptKeyType: allScriptKeysQuery, + }) require.NoError(t.t, err) AssertAssetStateByScriptKey( t.t, allAssets.Assets, burnedAsset.ScriptKey, diff --git a/itest/psbt_test.go b/itest/psbt_test.go index 753832a72..6cb893f18 100644 --- a/itest/psbt_test.go +++ b/itest/psbt_test.go @@ -874,7 +874,9 @@ func runPsbtInteractiveSplitSendTest(ctxt context.Context, t *harnessTest, ) senderAssets, err := sender.ListAssets( - ctxt, &taprpc.ListAssetRequest{}, + ctxt, &taprpc.ListAssetRequest{ + ScriptKeyType: allScriptKeysQuery, + }, ) require.NoError(t.t, err) @@ -898,7 +900,9 @@ func runPsbtInteractiveSplitSendTest(ctxt context.Context, t *harnessTest, require.Len(t.t, senderAssets.Assets, numSenderAssets) receiverAssets, err := receiver.ListAssets( - ctxt, &taprpc.ListAssetRequest{}, + ctxt, &taprpc.ListAssetRequest{ + ScriptKeyType: allScriptKeysQuery, + }, ) require.NoError(t.t, err) require.Len(t.t, receiverAssets.Assets, numReceiverAssets) @@ -1226,13 +1230,17 @@ func testPsbtInteractiveTapscriptSibling(t *harnessTest) { ) senderAssets, err := alice.ListAssets( - ctxt, &taprpc.ListAssetRequest{}, + ctxt, &taprpc.ListAssetRequest{ + ScriptKeyType: allScriptKeysQuery, + }, ) require.NoError(t.t, err) require.Len(t.t, senderAssets.Assets, 1) receiverAssets, err := bob.ListAssets( - ctxt, &taprpc.ListAssetRequest{}, + ctxt, &taprpc.ListAssetRequest{ + ScriptKeyType: allScriptKeysQuery, + }, ) require.NoError(t.t, err) require.Len(t.t, receiverAssets.Assets, 1) @@ -1402,13 +1410,17 @@ func testPsbtMultiSend(t *harnessTest) { ) senderAssets, err := sender.ListAssets( - ctxt, &taprpc.ListAssetRequest{}, + ctxt, &taprpc.ListAssetRequest{ + ScriptKeyType: allScriptKeysQuery, + }, ) require.NoError(t.t, err) require.Len(t.t, senderAssets.Assets, 4) receiverAssets, err := receiver.ListAssets( - ctxt, &taprpc.ListAssetRequest{}, + ctxt, &taprpc.ListAssetRequest{ + ScriptKeyType: allScriptKeysQuery, + }, ) require.NoError(t.t, err) require.Len(t.t, receiverAssets.Assets, 2) diff --git a/itest/utils.go b/itest/utils.go index 27c161e29..7317d5c9e 100644 --- a/itest/utils.go +++ b/itest/utils.go @@ -449,6 +449,7 @@ func FinalizeBatchUnconfirmed(t *testing.T, minerClient *rpcclient.Client, listRespUnconfirmed, err := tapClient.ListAssets( ctxt, &taprpc.ListAssetRequest{ IncludeUnconfirmedMints: true, + ScriptKeyType: allScriptKeysQuery, }, ) require.NoError(t, err) From de58c8949ced85ee8795ae5910a2f6772fc6f9fc Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Fri, 4 Apr 2025 19:29:43 +0200 Subject: [PATCH 17/17] itest: add new balance assertions to multiple tests We add a new AssetBalances function that makes sure that the output from all the following RPCs is aligned: - ListAssets - ListBalances (both grouped by asset ID or group key) - ListUtxos --- itest/assertions.go | 299 ++++++++++++++++++++++++++++++--- itest/assets_test.go | 65 ++++--- itest/burn_test.go | 30 ++++ itest/full_value_split_test.go | 33 +++- itest/psbt_test.go | 19 +++ itest/send_test.go | 12 ++ 6 files changed, 402 insertions(+), 56 deletions(-) diff --git a/itest/assertions.go b/itest/assertions.go index 4f62b3b25..d0696079e 100644 --- a/itest/assertions.go +++ b/itest/assertions.go @@ -52,6 +52,14 @@ var ( AllTypes: true, }, } + + groupBalancesByAssetID = &taprpc.ListBalancesRequest_AssetId{ + AssetId: true, + } + + groupBalancesByGroupKey = &taprpc.ListBalancesRequest_GroupKey{ + GroupKey: true, + } ) // tapClient is an interface that covers all currently available RPC interfaces @@ -2010,7 +2018,7 @@ func AssertGenesisOutput(t *testing.T, output *taprpc.ManagedUtxo, require.Equal(t, expectedMerkleRoot[:], output.MerkleRoot) } -func AssertAssetBalances(t *testing.T, client taprpc.TaprootAssetsClient, +func AssertMintedAssetBalances(t *testing.T, client taprpc.TaprootAssetsClient, simpleAssets, issuableAssets []*taprpc.Asset, includeLeased bool) { t.Helper() @@ -2021,12 +2029,9 @@ func AssertAssetBalances(t *testing.T, client taprpc.TaprootAssetsClient, // First, we'll ensure that we're able to get the balances of all the // assets grouped by their asset IDs. - balanceReq := &taprpc.ListBalancesRequest_AssetId{ - AssetId: true, - } assetIDBalances, err := client.ListBalances( ctxt, &taprpc.ListBalancesRequest{ - GroupBy: balanceReq, + GroupBy: groupBalancesByAssetID, IncludeLeased: includeLeased, }, ) @@ -2067,20 +2072,17 @@ func AssertAssetBalances(t *testing.T, client taprpc.TaprootAssetsClient, require.NoError(t, err) var totalAssetListBalance uint64 - for _, asset := range assetList.Assets { - totalAssetListBalance += asset.Amount + for _, a := range assetList.Assets { + totalAssetListBalance += a.Amount } require.Equal(t, totalBalance, totalAssetListBalance) // We'll also ensure that we're able to get the balance by key group // for all the assets that have one specified. - groupBalanceReq := &taprpc.ListBalancesRequest_GroupKey{ - GroupKey: true, - } assetGroupBalances, err := client.ListBalances( ctxt, &taprpc.ListBalancesRequest{ - GroupBy: groupBalanceReq, + GroupBy: groupBalancesByGroupKey, }, ) require.NoError(t, err) @@ -2089,19 +2091,274 @@ func AssertAssetBalances(t *testing.T, client taprpc.TaprootAssetsClient, t, len(issuableAssets), len(assetGroupBalances.AssetGroupBalances), ) +} - for _, balance := range assetGroupBalances.AssetBalances { - for _, rpcAsset := range issuableAssets { - if balance.AssetGenesis.Name == rpcAsset.AssetGenesis.Name { - require.Equal( - t, balance.Balance, rpcAsset.Amount, - ) - require.Equal( - t, balance.AssetGenesis, - rpcAsset.AssetGenesis, - ) +type balanceConfig struct { + assetID []byte + groupKey []byte + groupedAssetBalance uint64 + numAssetUtxos uint32 + numAnchorUtxos uint32 + includeLeased bool + allScriptKeyTypes bool + scriptKeyType *asset.ScriptKeyType +} + +type BalanceOption func(*balanceConfig) + +func WithAssetID(assetID []byte) BalanceOption { + return func(c *balanceConfig) { + c.assetID = assetID + } +} + +func WithGroupKey(groupKey []byte) BalanceOption { + return func(c *balanceConfig) { + c.groupKey = groupKey + } +} + +func WithGroupedAssetBalance(groupedAssetBalance uint64) BalanceOption { + return func(c *balanceConfig) { + c.groupedAssetBalance = groupedAssetBalance + } +} + +func WithNumUtxos(numAssetUtxos uint32) BalanceOption { + return func(c *balanceConfig) { + c.numAssetUtxos = numAssetUtxos + } +} + +func WithNumAnchorUtxos(numAnchorUtxos uint32) BalanceOption { + return func(c *balanceConfig) { + c.numAnchorUtxos = numAnchorUtxos + } +} + +func WithIncludeLeased() BalanceOption { + return func(c *balanceConfig) { + c.includeLeased = true + } +} + +func WithAllScriptKeyTypes() BalanceOption { + return func(c *balanceConfig) { + c.allScriptKeyTypes = true + } +} + +func WithScriptKeyType(scriptKeyType asset.ScriptKeyType) BalanceOption { + return func(c *balanceConfig) { + c.scriptKeyType = &scriptKeyType + } +} + +func AssertBalances(t *testing.T, client taprpc.TaprootAssetsClient, + balance uint64, opts ...BalanceOption) { + + t.Helper() + + config := &balanceConfig{} + for _, opt := range opts { + opt(config) + } + + var rpcTypeQuery *taprpc.ScriptKeyTypeQuery + switch { + case config.allScriptKeyTypes: + rpcTypeQuery = &taprpc.ScriptKeyTypeQuery{ + Type: &taprpc.ScriptKeyTypeQuery_AllTypes{ + AllTypes: true, + }, + } + + case config.scriptKeyType != nil: + rpcTypeQuery = &taprpc.ScriptKeyTypeQuery{ + Type: &taprpc.ScriptKeyTypeQuery_ExplicitType{ + ExplicitType: taprpc.MarshalScriptKeyType( + *config.scriptKeyType, + ), + }, + } + } + + balanceSum := func(resp *taprpc.ListBalancesResponse, + group bool) uint64 { + + var totalBalance uint64 + + if group { + for _, currentBalance := range resp.AssetGroupBalances { + totalBalance += currentBalance.Balance + } + } else { + for _, currentBalance := range resp.AssetBalances { + totalBalance += currentBalance.Balance + } + } + + return totalBalance + } + + ctxb := context.Background() + ctxt, cancel := context.WithTimeout(ctxb, defaultWaitTimeout) + defer cancel() + + // First, we'll ensure that we're able to get the balances of all the + // assets grouped by their asset IDs. + assetIDBalances, err := client.ListBalances( + ctxt, &taprpc.ListBalancesRequest{ + GroupBy: groupBalancesByAssetID, + IncludeLeased: config.includeLeased, + ScriptKeyType: rpcTypeQuery, + AssetFilter: config.assetID, + GroupKeyFilter: config.groupKey, + }, + ) + require.NoError(t, err) + + // Spent assets (burns/tombstones) are never included in the balance, + // even if we specifically query for their type. So we skip the balance + // check in that case. + checkBalance := config.scriptKeyType == nil || + (*config.scriptKeyType != asset.ScriptKeyBurn && + *config.scriptKeyType != asset.ScriptKeyTombstone) + if checkBalance { + require.Equal( + t, balance, balanceSum(assetIDBalances, false), + "asset balance, wanted %d, got: %v", balance, + toJSON(t, assetIDBalances), + ) + } + + // Next, we do the same but grouped by group keys (if requested, since + // this only returns the balances for actually grouped assets). + if config.groupedAssetBalance > 0 { + assetGroupBalances, err := client.ListBalances( + ctxt, &taprpc.ListBalancesRequest{ + GroupBy: groupBalancesByGroupKey, + IncludeLeased: config.includeLeased, + ScriptKeyType: rpcTypeQuery, + AssetFilter: config.assetID, + GroupKeyFilter: config.groupKey, + }, + ) + require.NoError(t, err) + + // Spent assets (burns/tombstones) are never included in the + // balance, even if we specifically query for their type. So we + // skip the balance check in that case. + if checkBalance { + require.Equalf( + t, config.groupedAssetBalance, + balanceSum(assetGroupBalances, true), + "grouped balance, wanted %d, got: %v", balance, + toJSON(t, assetGroupBalances), + ) + } + } + + // Finally, we assert that the sum of all assets queried with the given + // query parameters matches the expected balance. + assetList, err := client.ListAssets(ctxt, &taprpc.ListAssetRequest{ + IncludeLeased: config.includeLeased, + ScriptKeyType: rpcTypeQuery, + }) + require.NoError(t, err) + + var ( + totalBalance uint64 + numUtxos uint32 + ) + for _, a := range assetList.Assets { + if len(config.assetID) > 0 { + if !bytes.Equal( + a.AssetGenesis.AssetId, config.assetID, + ) { + + continue + } + } + + if len(config.groupKey) > 0 { + if !bytes.Equal( + a.AssetGroup.TweakedGroupKey, config.groupKey, + ) { + + continue } } + + totalBalance += a.Amount + numUtxos++ + } + require.Equalf( + t, balance, totalBalance, "ListAssets balance, wanted %d, "+ + "got: %v", balance, toJSON(t, assetList), + ) + + // The number of UTXOs means asset outputs in this case. We check the + // BTC-level UTXOs below as well, but that's just to make sure the + // output of that RPC lists the same assets. + if config.numAssetUtxos > 0 { + require.Equal( + t, config.numAssetUtxos, numUtxos, "ListAssets num "+ + "asset utxos", + ) + } + + utxoList, err := client.ListUtxos(ctxt, &taprpc.ListUtxosRequest{ + IncludeLeased: config.includeLeased, + ScriptKeyType: rpcTypeQuery, + }) + require.NoError(t, err) + + // Make sure the ListUtxos call returns the same number of (asset) UTXOs + // as the ListAssets call. + var numAnchorUtxos uint32 + totalBalance = 0 + numUtxos = 0 + for _, btcUtxo := range utxoList.ManagedUtxos { + numAnchorUtxos++ + for _, assetUtxo := range btcUtxo.Assets { + if len(config.assetID) > 0 { + if !bytes.Equal( + assetUtxo.AssetGenesis.AssetId, + config.assetID, + ) { + + continue + } + } + + if len(config.groupKey) > 0 { + if !bytes.Equal( + btcUtxo.TaprootAssetRoot, + config.groupKey, + ) { + + continue + } + } + + totalBalance += assetUtxo.Amount + numUtxos++ + } + } + require.Equal(t, balance, totalBalance, "ListUtxos balance") + + if config.numAnchorUtxos > 0 { + require.Equal( + t, config.numAnchorUtxos, numAnchorUtxos, "num anchor "+ + "utxos", + ) + } + if config.numAssetUtxos > 0 { + require.Equal( + t, config.numAssetUtxos, numUtxos, "ListUtxos num "+ + "asset utxos", + ) } } diff --git a/itest/assets_test.go b/itest/assets_test.go index 7ca06be98..ed1babd73 100644 --- a/itest/assets_test.go +++ b/itest/assets_test.go @@ -109,9 +109,14 @@ func testMintAssets(t *harnessTest) { // Now that all our assets have been issued, we'll use the balance // calls to ensure that we're able to retrieve the proper balance for // them all. - AssertAssetBalances( + AssertMintedAssetBalances( t.t, t.tapd, rpcSimpleAssets, rpcIssuableAssets, false, ) + AssertBalances( + t.t, t.tapd, 10002, WithNumUtxos(4), WithNumAnchorUtxos(1), + WithGroupedAssetBalance(5001), + WithScriptKeyType(asset.ScriptKeyBip86), + ) // Check that we can retrieve the group keys for the issuable assets. assertGroups(t.t, t.tapd, issuableAssets) @@ -450,7 +455,7 @@ func testMintAssetsWithTapscriptSibling(t *harnessTest) { rpcIssuableAssets := MintAssetsConfirmBatch( t.t, t.lndHarness.Miner().Client, t.tapd, issuableAssets, ) - AssertAssetBalances( + AssertMintedAssetBalances( t.t, t.tapd, rpcSimpleAssets, rpcIssuableAssets, false, ) @@ -653,17 +658,12 @@ func testAssetBalances(t *harnessTest) { rpcSimpleAssets := MintAssetsConfirmBatch( t.t, t.lndHarness.Miner().Client, t.tapd, simpleAssets, ) - rpcIssuableAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, issuableAssets, - ) targetAsset := rpcSimpleAssets[0] // Now that all our assets have been issued, we'll use the balance // calls to ensure that we're able to retrieve the proper balance for // them all. - AssertAssetBalances( - t.t, t.tapd, rpcSimpleAssets, rpcIssuableAssets, false, - ) + AssertMintedAssetBalances(t.t, t.tapd, rpcSimpleAssets, nil, false) // Check chain anchor for the target asset. out, err := wire.NewOutPointFromString( @@ -816,33 +816,32 @@ func testAssetBalances(t *harnessTest) { if tt.expectError { require.ErrorContains(t.t, err, tt.expectedErrMsg) - } else { - require.NoError(t.t, err) + continue + } - // With a transaction funding should have led to a - // lease on the simple assets, we'll use the balance - // calls to ensure that we're able to retrieve the - // proper balances. - rpcEmptyAssets := []*taprpc.Asset{} - AssertAssetBalances( - t.t, t.tapd, rpcEmptyAssets, rpcIssuableAssets, - false, - ) - AssertAssetBalances( - t.t, t.tapd, rpcSimpleAssets, rpcIssuableAssets, - true, - ) + require.NoError(t.t, err) - // Unlock the input if provided so it can be reused. - for _, input := range tt.inputs { - _, err = aliceTapd.RemoveUTXOLease( - ctxb, - &wrpc.RemoveUTXOLeaseRequest{ - Outpoint: input.Outpoint, - }, - ) - require.NoError(t.t, err) - } + // With a transaction funding should have led to a lease on the + // simple assets, we'll use the balance calls to ensure that + // we're able to retrieve the proper balances. + AssertBalances( + t.t, t.tapd, 0, WithAssetID(targetAssetGenesis.AssetId), + WithNumAnchorUtxos(0), + ) + AssertBalances( + t.t, t.tapd, 5000, WithIncludeLeased(), WithNumUtxos(1), + WithAssetID(targetAssetGenesis.AssetId), + WithNumAnchorUtxos(1), + ) + + // Unlock the input if provided so it can be reused. + for _, input := range tt.inputs { + _, err = aliceTapd.RemoveUTXOLease( + ctxb, &wrpc.RemoveUTXOLeaseRequest{ + Outpoint: input.Outpoint, + }, + ) + require.NoError(t.t, err) } } } diff --git a/itest/burn_test.go b/itest/burn_test.go index 0c39feed4..871855935 100644 --- a/itest/burn_test.go +++ b/itest/burn_test.go @@ -169,6 +169,10 @@ func testBurnAssets(t *harnessTest) { AssetScriptKeyIsLocalCheck(false), AssetScriptKeyIsBurnCheck(true), ) + AssertBalances( + t.t, t.tapd, burnAmt, WithNumUtxos(1), WithNumAnchorUtxos(1), + WithScriptKeyType(asset.ScriptKeyBurn), + ) // And now our asset balance should have been decreased by the burned // amount. @@ -226,6 +230,12 @@ func testBurnAssets(t *harnessTest) { ) AssertSendEventsComplete(t.t, fullSendAddr.ScriptKey, sendEvents) + AssertBalances( + t.t, t.tapd, burnAmt+simpleCollectible.Amount, + WithNumUtxos(2), WithNumAnchorUtxos(2), + WithScriptKeyType(asset.ScriptKeyBurn), + ) + // Test case 4: Burn assets from multiple inputs. This will select the // two largest inputs we have, the one over 1500 we sent above and the // 1200 from the initial fan out transfer. @@ -258,6 +268,12 @@ func testBurnAssets(t *harnessTest) { simpleAsset.Amount-burnAmt-multiBurnAmt, ) + AssertBalances( + t.t, t.tapd, burnAmt+simpleCollectible.Amount+multiBurnAmt, + WithNumUtxos(3), WithNumAnchorUtxos(3), + WithScriptKeyType(asset.ScriptKeyBurn), + ) + resp, err := t.tapd.ListAssets(ctxt, &taprpc.ListAssetRequest{ IncludeSpent: true, }) @@ -294,6 +310,13 @@ func testBurnAssets(t *harnessTest) { t.t, t.tapd, simpleGroupGen.AssetId, simpleGroup.Amount-burnAmt, ) + AssertBalances( + t.t, t.tapd, + burnAmt+simpleCollectible.Amount+multiBurnAmt+burnAmt, + WithNumUtxos(4), WithNumAnchorUtxos(4), + WithScriptKeyType(asset.ScriptKeyBurn), + ) + burns = AssertNumBurns(t.t, t.tapd, 4, nil) var groupBurn *taprpc.AssetBurn for _, b := range burns { @@ -346,6 +369,13 @@ func testBurnAssets(t *harnessTest) { ) AssertBalanceByID(t.t, t.tapd, simpleGroupCollectGen.AssetId, 0) + AssertBalances( + t.t, t.tapd, + burnAmt+simpleCollectible.Amount+multiBurnAmt+burnAmt+1, + WithNumUtxos(5), WithNumAnchorUtxos(5), + WithScriptKeyType(asset.ScriptKeyBurn), + ) + // We now perform some queries to test the filters of the ListBurns // call. diff --git a/itest/full_value_split_test.go b/itest/full_value_split_test.go index 8b2645797..8c3f9517e 100644 --- a/itest/full_value_split_test.go +++ b/itest/full_value_split_test.go @@ -3,6 +3,7 @@ package itest import ( "context" + "github.com/lightninglabs/taproot-assets/asset" "github.com/lightninglabs/taproot-assets/taprpc" "github.com/lightninglabs/taproot-assets/taprpc/mintrpc" "github.com/stretchr/testify/require" @@ -11,7 +12,7 @@ import ( // testFullValueSend tests that we can properly send the full value of a // normal asset. func testFullValueSend(t *harnessTest) { - // First, we'll make an normal assets with enough units to allow us to + // First, we'll make a normal assets with enough units to allow us to // send it around a few times. rpcAssets := MintAssetsConfirmBatch( t.t, t.lndHarness.Miner().Client, t.tapd, @@ -37,13 +38,39 @@ func testFullValueSend(t *harnessTest) { require.NoError(t.t, secondTapd.stop(!*noDelete)) }() + // Run the test scenario with the normal asset. runFullValueSendTests( ctxt, t, t.tapd, secondTapd, genInfo, mintedAsset, 0, 1, ) + + // After the first run, we should've sent everything to Bob. But Alice + // should have two zero-value tombstones in her wallet. + AssertBalances( + t.t, t.tapd, 0, WithScriptKeyType(asset.ScriptKeyTombstone), + WithNumUtxos(2), WithNumAnchorUtxos(2), + ) + AssertBalances( + t.t, secondTapd, mintedAsset.Amount, + WithScriptKeyType(asset.ScriptKeyBip86), WithNumUtxos(1), + WithNumAnchorUtxos(1), + ) + + // Run the same scenario with the grouped asset. runFullValueSendTests( ctxt, t, t.tapd, secondTapd, groupGenInfo, mintedGroupAsset, 1, 2, ) + + // Alice should have one more zero-value tombstones in her wallet. + AssertBalances( + t.t, t.tapd, 0, WithScriptKeyType(asset.ScriptKeyTombstone), + WithNumUtxos(3), WithNumAnchorUtxos(3), + ) + AssertBalances( + t.t, secondTapd, mintedAsset.Amount+mintedGroupAsset.Amount, + WithScriptKeyType(asset.ScriptKeyBip86), WithNumUtxos(2), + WithNumAnchorUtxos(2), + ) } // runFullValueSendTests runs the full value send tests for a single asset. @@ -124,7 +151,9 @@ func runFullValueSendTests(ctxt context.Context, t *harnessTest, alice, // zero-value transfers. and Bob should have 1. The main node should // show a balance of zero, and Bob should hold the total asset supply. AssertTransfer(t.t, alice, runIdx*2, numRuns*2, []uint64{0, fullAmount}) - AssertTransfer(t.t, alice, runIdx*2+1, numRuns*2, []uint64{0, fullAmount}) + AssertTransfer( + t.t, alice, runIdx*2+1, numRuns*2, []uint64{0, fullAmount}, + ) AssertBalanceByID(t.t, alice, genInfo.AssetId, 0) AssertTransfer(t.t, bob, runIdx, numRuns, []uint64{0, fullAmount}) diff --git a/itest/psbt_test.go b/itest/psbt_test.go index 6cb893f18..4712905e1 100644 --- a/itest/psbt_test.go +++ b/itest/psbt_test.go @@ -85,6 +85,10 @@ func testPsbtScriptHashLockSend(t *harnessTest) { ctxt, t, alice, bob, numUnits, genInfo, mintedAsset, bobScriptKey, bobInternalKey, tapscript, rootHash, ) + AssertBalances( + t.t, bob, numUnits, WithNumUtxos(1), WithNumAnchorUtxos(1), + WithScriptKeyType(asset.ScriptKeyScriptPathExternal), + ) // Now try to send back those assets using the PSBT flow. aliceAddr, err := alice.NewAddr(ctxb, &taprpc.NewAddrRequest{ @@ -152,6 +156,11 @@ func testPsbtScriptHashLockSend(t *harnessTest) { assetsJSON, err := formatProtoJSON(aliceAssets) require.NoError(t.t, err) t.Logf("Got alice assets: %s", assetsJSON) + + AssertBalances( + t.t, alice, mintedAsset.Amount-numUnits/2, WithNumUtxos(2), + WithNumAnchorUtxos(2), WithScriptKeyType(asset.ScriptKeyBip86), + ) } // testPsbtScriptCheckSigSend tests that we can properly send assets with a sig @@ -205,6 +214,11 @@ func testPsbtScriptCheckSigSend(t *harnessTest) { bobScriptKey, bobInternalKey, tapscript, rootHash, ) + AssertBalances( + t.t, bob, numUnits, WithNumUtxos(1), WithNumAnchorUtxos(1), + WithScriptKeyType(asset.ScriptKeyScriptPathExternal), + ) + // Now try to send back those assets using the PSBT flow. aliceAddr, err := alice.NewAddr(ctxb, &taprpc.NewAddrRequest{ AssetId: genInfo.AssetId, @@ -274,6 +288,11 @@ func testPsbtScriptCheckSigSend(t *harnessTest) { assetsJSON, err := formatProtoJSON(aliceAssets) require.NoError(t.t, err) t.Logf("Got alice assets: %s", assetsJSON) + + AssertBalances( + t.t, alice, mintedAsset.Amount-numUnits/2, WithNumUtxos(2), + WithNumAnchorUtxos(2), WithScriptKeyType(asset.ScriptKeyBip86), + ) } // testPsbtNormalInteractiveFullValueSend tests that we can properly send normal diff --git a/itest/send_test.go b/itest/send_test.go index 0d9853d63..55127e752 100644 --- a/itest/send_test.go +++ b/itest/send_test.go @@ -1736,6 +1736,10 @@ func testSendMultipleCoins(t *harnessTest) { ) AssertNonInteractiveRecvComplete(t.t, t.tapd, 5) AssertSendEventsComplete(t.t, addrs[0].ScriptKey, sendEvents) + AssertBalances( + t.t, t.tapd, rpcAssets[0].Amount, WithNumUtxos(numParts), + WithNumAnchorUtxos(numParts), + ) // Next, we'll attempt to complete 5 parallel transfers with distinct // addresses from our main node to Bob. @@ -1788,6 +1792,14 @@ func testSendMultipleCoins(t *harnessTest) { for idx, events := range addrSendEvents { AssertSendEventsComplete(t.t, bobAddrs[idx].ScriptKey, events) } + + // Finally, we make sure that both the sender and receiver have the + // correct number of asset units and UTXOs in their wallets. + AssertBalances(t.t, t.tapd, 0, WithNumAnchorUtxos(0)) + AssertBalances( + t.t, secondTapd, unitsPerPart*numParts, WithNumUtxos(numParts), + WithNumAnchorUtxos(numParts), + ) } // testSendNoCourierUniverseImport tests that we can send assets to a node that