diff --git a/auth/authenticator.go b/auth/authenticator.go index 07449e7..41ae6f8 100644 --- a/auth/authenticator.go +++ b/auth/authenticator.go @@ -38,10 +38,6 @@ func (a *Authenticator) BuildJWT(service, uri string) (string, error) { return "", fmt.Errorf("jwt: Could not decode private key") } - if block.Type != "ECDSA Private Key" { - return "", fmt.Errorf("jwt: Bad private key type") - } - key, err := x509.ParseECPrivateKey(block.Bytes) if err != nil { return "", fmt.Errorf("jwt: %w", err) diff --git a/clients/v1/blockchain.go b/clients/v1/blockchain.go index db4b610..db8d857 100644 --- a/clients/v1/blockchain.go +++ b/clients/v1/blockchain.go @@ -125,7 +125,7 @@ func (b *BlockchainServiceClient) ListNetworks( return &networkIteratorImpl{iter: b.client.ListNetworks(ctx, req, opts...)} } -// GetAsset get an Asset. +// GetAsset retrieves an Asset by resource name. func (b *BlockchainServiceClient) GetAsset( ctx context.Context, req *blockchainpb.GetAssetRequest, @@ -186,3 +186,13 @@ func (b *BlockchainServiceClient) ListAssets( opts ...gax.CallOption) AssetIterator { return &assetIteratorImpl{b.client.ListAssets(ctx, req, opts...)} } + +// BatchGetAssets returns the list of Assets indicated by the given request. +func (b *BlockchainServiceClient) BatchGetAssets( + ctx context.Context, + req *blockchainpb.BatchGetAssetsRequest, + opts ...gax.CallOption) (*blockchainpb.BatchGetAssetsResponse, error) { + asset, err := b.client.BatchGetAssets(ctx, req, opts...) + + return asset, clients.UnwrapError(err) +} diff --git a/clients/v1/mpc_keys.go b/clients/v1/mpc_keys.go index 286aa5a..b29eb3d 100644 --- a/clients/v1/mpc_keys.go +++ b/clients/v1/mpc_keys.go @@ -5,11 +5,12 @@ import ( "fmt" "net/url" + "github.com/googleapis/gax-go/v2" + "google.golang.org/grpc" + "github.com/coinbase/waas-client-library-go/clients" innerClient "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/clients/v1" mpc_keyspb "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/mpc_keys/v1" - "github.com/googleapis/gax-go/v2" - "google.golang.org/grpc" ) const ( @@ -260,3 +261,221 @@ func (m *MPCKeyServiceClient) CreateSignatureOperation(name string) *WrappedCrea pathPrefix: m.pathPrefix, } } + +// WrappedPrepareDeviceArchiveOperation wraps the long-running operation to handle +// unwrapping errors and setting the LRO options. +type WrappedPrepareDeviceArchiveOperation struct { + *innerClient.PrepareDeviceArchiveOperation + pathPrefix string +} + +// PathPrefix returns the path prefix for the operation to be used in HTTP requests. +// E.g. if the path prefix is `/waas/mpc_keys`, then the request path would be: +// `/waas/mpc_keys/v1/operations/`. +func (w *WrappedPrepareDeviceArchiveOperation) PathPrefix() string { + return w.pathPrefix +} + +// Wait delegates to the wrapped longrunning PrepareDeviceArchiveOperation with the +// override LRO options and handling unwrapping client errors. +func (w *WrappedPrepareDeviceArchiveOperation) Wait( + ctx context.Context, + opts ...gax.CallOption, +) (*mpc_keyspb.DeviceGroup, error) { + deviceGroup, err := w.PrepareDeviceArchiveOperation.Wait(ctx, clients.LROOptions(w, version, opts)...) + + return deviceGroup, clients.UnwrapError(err) +} + +// Poll delegates to the wrapped longrunning PrepareDeviceArchiveOperation with the +// override LRO options and handling unwrapping client errors. +func (w *WrappedPrepareDeviceArchiveOperation) Poll( + ctx context.Context, + opts ...gax.CallOption, +) (*mpc_keyspb.DeviceGroup, error) { + deviceGroup, err := w.PrepareDeviceArchiveOperation.Poll(ctx, clients.LROOptions(w, version, opts)...) + + return deviceGroup, clients.UnwrapError(err) +} + +// PrepareDeviceArchive prepares an archive in the local storage of the given Device. The archive contains +// cryptographic materials that can be used to export MPCKeys, which have the given DeviceGroup as their parent. +// The Device specified in the request must be a member of this DeviceGroup and must participate +// in the associated MPC operation for the archive to be prepared. After calling this, +// use ListMPCOperations to poll for the pending PrepareDeviceArchive operation, and use the WaaS SDK's +// ComputeMPCOperation to complete the operation. Once the operation completes, the Device can utilize the +// WaaS SDK to export the private keys corresponding to each of the MPCKeys under this DeviceGroup. +func (m *MPCKeyServiceClient) PrepareDeviceArchive( + ctx context.Context, + req *mpc_keyspb.PrepareDeviceArchiveRequest, + opts ...gax.CallOption) (*WrappedPrepareDeviceArchiveOperation, error) { + op, err := m.client.PrepareDeviceArchive(ctx, req, opts...) + if err != nil { + return nil, clients.UnwrapError(err) + } + + return &WrappedPrepareDeviceArchiveOperation{ + PrepareDeviceArchiveOperation: op, + pathPrefix: m.pathPrefix, + }, nil +} + +// PrepareDeviceArchiveOperation returns the PrepareDeviceArchiveOperation indicated by the given name. +func (m *MPCKeyServiceClient) PrepareDeviceArchiveOperation(name string) *WrappedPrepareDeviceArchiveOperation { + return &WrappedPrepareDeviceArchiveOperation{ + PrepareDeviceArchiveOperation: m.client.PrepareDeviceArchiveOperation(name), + pathPrefix: m.pathPrefix, + } +} + +// WrappedPrepareDeviceBackupOperation wraps the long-running operation to handle +// unwrapping errors and setting the LRO options. +type WrappedPrepareDeviceBackupOperation struct { + *innerClient.PrepareDeviceBackupOperation + pathPrefix string +} + +// PathPrefix returns the path prefix for the operation to be used in HTTP requests. +// E.g. if the path prefix is `/waas/mpc_keys`, then the request path would be: +// `/waas/mpc_keys/v1/operations/`. +func (w *WrappedPrepareDeviceBackupOperation) PathPrefix() string { + return w.pathPrefix +} + +// Wait delegates to the wrapped longrunning PrepareDeviceBackupOperation with the +// override LRO options and handling unwrapping client errors. +func (w *WrappedPrepareDeviceBackupOperation) Wait( + ctx context.Context, + opts ...gax.CallOption, +) (*mpc_keyspb.DeviceGroup, error) { + deviceGroup, err := w.PrepareDeviceBackupOperation.Wait(ctx, clients.LROOptions(w, version, opts)...) + + return deviceGroup, clients.UnwrapError(err) +} + +// Poll delegates to the wrapped longrunning PrepareDeviceBackupOperation with the +// override LRO options and handling unwrapping client errors. +func (w *WrappedPrepareDeviceBackupOperation) Poll( + ctx context.Context, + opts ...gax.CallOption, +) (*mpc_keyspb.DeviceGroup, error) { + deviceGroup, err := w.PrepareDeviceBackupOperation.Poll(ctx, clients.LROOptions(w, version, opts)...) + + return deviceGroup, clients.UnwrapError(err) +} + +// PrepareDeviceBackup prepares a backup in the given Device. The backup contains certain +// cryptographic materials that can be used to restore MPCKeys, which have the given DeviceGroup as their parent, +// on a new Device. The Device specified in the request must be a member of this DeviceGroup and must participate +// in the associated MPC operation for the backup to be prepared. +// After calling this RPC, use ListMPCOperations to poll for the pending PrepareDeviceBackup operation, +// and use the WaaS SDK's ComputeMPCOperation to complete the operation. Once the operation completes, +// the Device can utilize WaaS SDK to download the backup bundle. We recommend storing this backup bundle securely +// in a storage provider of your choice. If the user loses access to their existing Device and wants to recover +// MPCKeys in the given DeviceGroup on a new Device, use AddDevice RPC on the MPCKeyService. +func (m *MPCKeyServiceClient) PrepareDeviceBackup( + ctx context.Context, + req *mpc_keyspb.PrepareDeviceBackupRequest, + opts ...gax.CallOption) (*WrappedPrepareDeviceBackupOperation, error) { + op, err := m.client.PrepareDeviceBackup(ctx, req, opts...) + if err != nil { + return nil, clients.UnwrapError(err) + } + + return &WrappedPrepareDeviceBackupOperation{ + PrepareDeviceBackupOperation: op, + pathPrefix: m.pathPrefix, + }, nil +} + +// PrepareDeviceBackupOperation returns the PrepareDeviceBackupOperation indicated by the given name. +func (m *MPCKeyServiceClient) PrepareDeviceBackupOperation(name string) *WrappedPrepareDeviceBackupOperation { + return &WrappedPrepareDeviceBackupOperation{ + PrepareDeviceBackupOperation: m.client.PrepareDeviceBackupOperation(name), + pathPrefix: m.pathPrefix, + } +} + +// WrappedAddDeviceOperation wraps the long-running operation to handle +// unwrapping errors and setting the LRO options. +type WrappedAddDeviceOperation struct { + *innerClient.AddDeviceOperation + pathPrefix string +} + +// PathPrefix returns the path prefix for the operation to be used in HTTP requests. +// E.g. if the path prefix is `/waas/mpc_keys`, then the request path would be: +// `/waas/mpc_keys/v1/operations/`. +func (w *WrappedAddDeviceOperation) PathPrefix() string { + return w.pathPrefix +} + +// Wait delegates to the wrapped longrunning AddDeviceOperation with the +// override LRO options and handling unwrapping client errors. +func (w *WrappedAddDeviceOperation) Wait( + ctx context.Context, + opts ...gax.CallOption, +) (*mpc_keyspb.DeviceGroup, error) { + deviceGroup, err := w.AddDeviceOperation.Wait(ctx, clients.LROOptions(w, version, opts)...) + + return deviceGroup, clients.UnwrapError(err) +} + +// Poll delegates to the wrapped longrunning AddDeviceOperation with the +// override LRO options and handling unwrapping client errors. +func (w *WrappedAddDeviceOperation) Poll( + ctx context.Context, + opts ...gax.CallOption, +) (*mpc_keyspb.DeviceGroup, error) { + deviceGroup, err := w.AddDeviceOperation.Poll(ctx, clients.LROOptions(w, version, opts)...) + + return deviceGroup, clients.UnwrapError(err) +} + +// AddDevice adds a Device to an existing DeviceGroup. Prior to this API being called, the Device must be registered using +// RegisterDevice RPC. The Device must have access to the backup created with PrepareDeviceBackup RPC to compute this +// operation. After calling this RPC, use ListMPCOperations to poll for the pending AddDevice operation, +// and use the WaaS SDK's ComputeAddDeviceMPCOperation to complete the operation. +// After the operation is computed on WaaS SDK, the Device will have access to cryptographic materials +// required to process MPCOperations for this DeviceGroup. +// Once the operation completes on MPCKeyService, the Device will be added to the given DeviceGroup as a new member +// and all existing Devices in the DeviceGroup will stay functional. +// MPCKeyService will expose RemoveDevice RPC in a future release that can remove any of the +// existing Devices from the DeviceGroup. +func (m *MPCKeyServiceClient) AddDevice( + ctx context.Context, + req *mpc_keyspb.AddDeviceRequest, + opts ...gax.CallOption) (*WrappedAddDeviceOperation, error) { + op, err := m.client.AddDevice(ctx, req, opts...) + if err != nil { + return nil, clients.UnwrapError(err) + } + + return &WrappedAddDeviceOperation{ + AddDeviceOperation: op, + pathPrefix: m.pathPrefix, + }, nil +} + +// AddDeviceOperation returns the AddDeviceOperation indicated by the given name. +func (m *MPCKeyServiceClient) AddDeviceOperation(name string) *WrappedAddDeviceOperation { + return &WrappedAddDeviceOperation{ + AddDeviceOperation: m.client.AddDeviceOperation(name), + pathPrefix: m.pathPrefix, + } +} + +// RevokeDevice revokes a registered Device. This operation removes the registered Device from all the DeviceGroups that it is a +// part of. Once the Device is revoked, cryptographic materials in your physical Device are invalidated, +// and the Device can no longer participate in any MPCOperations of the DeviceGroups it was a part of. +// Use this API in scenarios such as losing the existing Device, switching to a new physical Device, etc. +// Ensure that a new Device is successfully added to your DeviceGroups using the AddDevice RPC before invoking +// the RevokeDevice RPC. +func (m *MPCKeyServiceClient) RevokeDevice( + ctx context.Context, + req *mpc_keyspb.RevokeDeviceRequest, + opts ...gax.CallOption) error { + err := m.client.RevokeDevice(ctx, req, opts...) + + return clients.UnwrapError(err) +} diff --git a/clients/v1/mpc_transactions.go b/clients/v1/mpc_transactions.go index 59c06c3..32648e3 100644 --- a/clients/v1/mpc_transactions.go +++ b/clients/v1/mpc_transactions.go @@ -92,9 +92,9 @@ func (w *WrappedCreateMPCTransactionOperation) Wait( ctx context.Context, opts ...gax.CallOption, ) (*mpc_transactionspb.MPCTransaction, error) { - deviceGroup, err := w.CreateMPCTransactionOperation.Wait(ctx, clients.LROOptions(w, version, opts)...) + mpcTransaction, err := w.CreateMPCTransactionOperation.Wait(ctx, clients.LROOptions(w, version, opts)...) - return deviceGroup, clients.UnwrapError(err) + return mpcTransaction, clients.UnwrapError(err) } // Poll delegates to the wrapped longrunning CreateMPCTransactionOperation with the @@ -103,9 +103,9 @@ func (w *WrappedCreateMPCTransactionOperation) Poll( ctx context.Context, opts ...gax.CallOption, ) (*mpc_transactionspb.MPCTransaction, error) { - deviceGroup, err := w.CreateMPCTransactionOperation.Poll(ctx, clients.LROOptions(w, version, opts)...) + mpcTransaction, err := w.CreateMPCTransactionOperation.Poll(ctx, clients.LROOptions(w, version, opts)...) - return deviceGroup, clients.UnwrapError(err) + return mpcTransaction, clients.UnwrapError(err) } // CreateMPCTransaction creates an MPCTransaction. The long-running operation returned from this API will contain diff --git a/clients/v1/mpc_wallets.go b/clients/v1/mpc_wallets.go index dc1dd3b..c27ee21 100644 --- a/clients/v1/mpc_wallets.go +++ b/clients/v1/mpc_wallets.go @@ -92,9 +92,9 @@ func (w *WrappedCreateMPCWalletOperation) Wait( ctx context.Context, opts ...gax.CallOption, ) (*mpc_walletspb.MPCWallet, error) { - deviceGroup, err := w.CreateMPCWalletOperation.Wait(ctx, clients.LROOptions(w, version, opts)...) + mpcWallet, err := w.CreateMPCWalletOperation.Wait(ctx, clients.LROOptions(w, version, opts)...) - return deviceGroup, clients.UnwrapError(err) + return mpcWallet, clients.UnwrapError(err) } // Poll delegates to the wrapped longrunning CreateMPCWalletOperation with the @@ -103,9 +103,9 @@ func (w *WrappedCreateMPCWalletOperation) Poll( ctx context.Context, opts ...gax.CallOption, ) (*mpc_walletspb.MPCWallet, error) { - deviceGroup, err := w.CreateMPCWalletOperation.Poll(ctx, clients.LROOptions(w, version, opts)...) + mpcWallet, err := w.CreateMPCWalletOperation.Poll(ctx, clients.LROOptions(w, version, opts)...) - return deviceGroup, clients.UnwrapError(err) + return mpcWallet, clients.UnwrapError(err) } // CreateMPCWallet creates an MPCWallet. The Device in the request must have been registered @@ -322,3 +322,55 @@ func (m *MPCWalletServiceClient) ListBalances( opts ...gax.CallOption) BalanceIterator { return &balanceIteratorImpl{iter: m.client.ListBalances(ctx, req, opts...)} } + +// BalanceDetailIterator is an interface for iterating through the response to ListBalanceDetails. +type BalanceDetailIterator interface { + // PageInfo supports pagination. See the google.golang.org/api/iterator package for details. + PageInfo() *iterator.PageInfo + + // Next returns the next result. Its second return value is iterator.Done if there are no more + // results. Once Next returns Done, all subsequent calls will return Done. + Next() (*mpc_walletspb.BalanceDetail, error) + + // Response is the raw response for the current page. + // Calling Next() or InternalFetch() updates this value. + Response() *mpc_walletspb.ListBalanceDetailsResponse +} + +// balanceDetailIteratorImpl is an implementation of BalanceDetailIterator that unwraps correctly. +type balanceDetailIteratorImpl struct { + iter *innerClient.BalanceDetailIterator +} + +// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. +func (n *balanceDetailIteratorImpl) PageInfo() *iterator.PageInfo { + return n.iter.PageInfo() +} + +// Next returns the next result. Its second return value is iterator.Done if there are no more +// results. Once Next returns Done, all subsequent calls will return Done. +func (n *balanceDetailIteratorImpl) Next() (*mpc_walletspb.BalanceDetail, error) { + balanceDetail, err := n.iter.Next() + + return balanceDetail, clients.UnwrapError(err) +} + +// Response is the raw response for the current page. +// Calling Next() or InternalFetch() updates this value. +func (n *balanceDetailIteratorImpl) Response() *mpc_walletspb.ListBalanceDetailsResponse { + if n.iter.Response == nil { + return nil + } + + response := n.iter.Response.(*mpc_walletspb.ListBalanceDetailsResponse) + + return response +} + +// ListBalanceDetails lists BalanceDetails. +func (m *MPCWalletServiceClient) ListBalanceDetails( + ctx context.Context, + req *mpc_walletspb.ListBalanceDetailsRequest, + opts ...gax.CallOption) BalanceDetailIterator { + return &balanceDetailIteratorImpl{iter: m.client.ListBalanceDetails(ctx, req, opts...)} +} diff --git a/clients/v1/protocols.go b/clients/v1/protocols.go index 3814fa3..e18f8ab 100644 --- a/clients/v1/protocols.go +++ b/clients/v1/protocols.go @@ -97,3 +97,14 @@ func (b *ProtocolServiceClient) BroadcastTransaction( return transaction, clients.UnwrapError(err) } + +// EstimateFee estimates the current network fee for the specified Network. For EVM Networks, this +// corresponds to the gas_price, max_fee_per_gas, and max_priority_fee_per_gas. +func (b *ProtocolServiceClient) EstimateFee( + ctx context.Context, + req *protocolspb.EstimateFeeRequest, + opts ...gax.CallOption) (*protocolspb.EstimateFeeResponse, error) { + response, err := b.client.EstimateFee(ctx, req, opts...) + + return response, clients.UnwrapError(err) +} diff --git a/example.go b/example.go index ab9bf0b..d06e959 100644 --- a/example.go +++ b/example.go @@ -16,8 +16,8 @@ const ( // apiKeyName is the name of the API Key to use. Fill this out before running the main function. apiKeyName = "organizations/my-organization/apiKeys/my-api-key" - // apiKeyPrivateKey is the private key of the API Key to use. Fill this out before running the main function. - apiKeyPrivateKey = "-----BEGIN ECDSA Private Key-----\nmy-private-key\n-----END ECDSA Private Key-----\n" + // privKeyTemplate is the private key of the API Key to use. Fill this out before running the main function. + privKeyTemplate = "-----BEGIN EC PRIVATE KEY-----\nmy-private-key\n-----END EC PRIVATE KEY-----\n" ) // An example function to demonstrate how to use the WaaS client libraries. @@ -26,7 +26,7 @@ func main() { authOpt := clients.WithAPIKey(&auth.APIKey{ Name: apiKeyName, - PrivateKey: apiKeyPrivateKey, + PrivateKey: privKeyTemplate, }) poolsClient, err := v1clients.NewPoolServiceClient(ctx, authOpt) diff --git a/gen/go/coinbase/cloud/blockchain/v1/blockchain.pb.go b/gen/go/coinbase/cloud/blockchain/v1/blockchain.pb.go index e15a11f..b341904 100644 --- a/gen/go/coinbase/cloud/blockchain/v1/blockchain.pb.go +++ b/gen/go/coinbase/cloud/blockchain/v1/blockchain.pb.go @@ -164,8 +164,6 @@ func (x *Network) GetType() Network_Type { } // The Asset resource, which represents an on-chain asset. -// For fungible assets, one resource exists per Asset. In the case -// of non-fungible tokens, a unique Asset entry exists for every token. type Asset struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -608,6 +606,127 @@ func (x *ListAssetsResponse) GetNextPageToken() string { return "" } +// The request message for BatchGetAssets. +type BatchGetAssetsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The resource name of the parent Network. + // Format: networks/{network_id} + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // The resource names of the Assets to retrieve. + // Each name has format: networks/{network_id}/assets/{asset_id} + // A maximum of 1000 Assets can be retrieved in a batch. + Names []string `protobuf:"bytes,2,rep,name=names,proto3" json:"names,omitempty"` +} + +func (x *BatchGetAssetsRequest) Reset() { + *x = BatchGetAssetsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_coinbase_cloud_blockchain_v1_blockchain_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchGetAssetsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchGetAssetsRequest) ProtoMessage() {} + +func (x *BatchGetAssetsRequest) ProtoReflect() protoreflect.Message { + mi := &file_coinbase_cloud_blockchain_v1_blockchain_proto_msgTypes[8] + 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 BatchGetAssetsRequest.ProtoReflect.Descriptor instead. +func (*BatchGetAssetsRequest) Descriptor() ([]byte, []int) { + return file_coinbase_cloud_blockchain_v1_blockchain_proto_rawDescGZIP(), []int{8} +} + +func (x *BatchGetAssetsRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *BatchGetAssetsRequest) GetNames() []string { + if x != nil { + return x.Names + } + return nil +} + +// The response message for BatchGetAssets. +type BatchGetAssetsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The list of Assets. + // Note: The returned Assets may not be in the same order as in the request. + Assets []*Asset `protobuf:"bytes,1,rep,name=assets,proto3" json:"assets,omitempty"` + // The resource names of the Assets that were not found. + // Each name has format: networks/{network_id}/assets/{asset_id}. + NotFound []string `protobuf:"bytes,2,rep,name=not_found,json=notFound,proto3" json:"not_found,omitempty"` +} + +func (x *BatchGetAssetsResponse) Reset() { + *x = BatchGetAssetsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_coinbase_cloud_blockchain_v1_blockchain_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchGetAssetsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchGetAssetsResponse) ProtoMessage() {} + +func (x *BatchGetAssetsResponse) ProtoReflect() protoreflect.Message { + mi := &file_coinbase_cloud_blockchain_v1_blockchain_proto_msgTypes[9] + 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 BatchGetAssetsResponse.ProtoReflect.Descriptor instead. +func (*BatchGetAssetsResponse) Descriptor() ([]byte, []int) { + return file_coinbase_cloud_blockchain_v1_blockchain_proto_rawDescGZIP(), []int{9} +} + +func (x *BatchGetAssetsResponse) GetAssets() []*Asset { + if x != nil { + return x.Assets + } + return nil +} + +func (x *BatchGetAssetsResponse) GetNotFound() []string { + if x != nil { + return x.NotFound + } + return nil +} + // The defining characteristics that combine to uniquely identify an Asset on-chain. // Fungible tokens, such as ERC-20s, require an asset_group_id (the contract address). // Non-fungible tokens and multi-token assets such as ERC-721s and ERC-1155s @@ -632,7 +751,7 @@ type Asset_Definition struct { func (x *Asset_Definition) Reset() { *x = Asset_Definition{} if protoimpl.UnsafeEnabled { - mi := &file_coinbase_cloud_blockchain_v1_blockchain_proto_msgTypes[8] + mi := &file_coinbase_cloud_blockchain_v1_blockchain_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -645,7 +764,7 @@ func (x *Asset_Definition) String() string { func (*Asset_Definition) ProtoMessage() {} func (x *Asset_Definition) ProtoReflect() protoreflect.Message { - mi := &file_coinbase_cloud_blockchain_v1_blockchain_proto_msgTypes[8] + mi := &file_coinbase_cloud_blockchain_v1_blockchain_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -762,7 +881,7 @@ var file_coinbase_cloud_blockchain_v1_blockchain_proto_rawDesc = []byte{ 0x41, 0x3b, 0x0a, 0x22, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x15, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x2f, 0x7b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0xdb, 0x10, + 0x2f, 0x7b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0xd3, 0x0f, 0x0a, 0x05, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0xb8, 0x01, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0xa3, 0x01, 0x92, 0x41, 0x9f, 0x01, 0x2a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x4f, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, @@ -878,163 +997,194 @@ var file_coinbase_cloud_blockchain_v1_blockchain_proto_rawDesc = []byte{ 0x65, 0x20, 0x61, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x20, 0x28, 0x74, - 0x68, 0x65, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x49, 0x44, 0x29, 0x2e, 0x3a, 0x9b, 0x02, - 0x92, 0x41, 0xc9, 0x01, 0x0a, 0xc6, 0x01, 0x2a, 0x05, 0x41, 0x73, 0x73, 0x65, 0x74, 0x32, 0xbc, - 0x01, 0x54, 0x68, 0x65, 0x20, 0x41, 0x73, 0x73, 0x65, 0x74, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, - 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x2d, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x0a, 0x46, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, - 0x67, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2c, 0x20, 0x6f, 0x6e, - 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, - 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x41, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x0a, 0x49, 0x6e, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, - 0x66, 0x75, 0x6e, 0x67, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2c, - 0x20, 0x61, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x41, 0x73, 0x73, 0x65, 0x74, 0x20, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0xea, 0x41, 0x4b, - 0x0a, 0x20, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, - 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x12, 0x27, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x7b, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, - 0x2f, 0x7b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x68, 0x0a, 0x11, 0x47, - 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x53, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3f, - 0x92, 0x41, 0x11, 0xca, 0x3e, 0x0e, 0xfa, 0x02, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x24, 0x0a, 0x22, 0x61, 0x70, 0x69, - 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, - 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x51, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, - 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, - 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xc6, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, - 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x41, 0x0a, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x08, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, - 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, - 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x43, 0x92, 0x41, - 0x40, 0x0a, 0x3e, 0x2a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x26, 0x54, 0x68, 0x65, 0x20, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x2e, 0x22, 0x62, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x4f, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x3b, 0x92, 0x41, 0x0f, 0xca, 0x3e, 0x0c, 0xfa, 0x02, 0x09, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x22, 0x0a, 0x20, 0x61, - 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, - 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xbe, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x55, 0x0a, 0x06, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3d, 0x92, 0x41, 0x11, - 0xca, 0x3e, 0x0e, 0xfa, 0x02, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, - 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x22, 0x12, 0x20, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, + 0x68, 0x65, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x49, 0x44, 0x29, 0x2e, 0x3a, 0x93, 0x01, + 0x92, 0x41, 0x42, 0x0a, 0x40, 0x2a, 0x05, 0x41, 0x73, 0x73, 0x65, 0x74, 0x32, 0x37, 0x54, 0x68, + 0x65, 0x20, 0x41, 0x73, 0x73, 0x65, 0x74, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x2e, 0xea, 0x41, 0x4b, 0x0a, 0x20, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, - 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0xba, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, - 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, - 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x3a, 0x3f, 0x92, 0x41, 0x3c, 0x0a, 0x3a, 0x2a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x24, 0x54, - 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x73, 0x2e, 0x32, 0xec, 0x08, 0x0a, 0x11, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xc0, 0x01, 0x0a, 0x0a, 0x47, 0x65, - 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x2f, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x27, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x7b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x7d, 0x22, 0x68, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x53, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3f, 0x92, 0x41, 0x11, 0xca, 0x3e, 0x0e, 0xfa, 0x02, + 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, + 0xfa, 0x41, 0x24, 0x0a, 0x22, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, + 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x51, 0x0a, + 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x22, 0xc6, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x08, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x6f, + 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x52, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x26, 0x0a, 0x0f, + 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x43, 0x92, 0x41, 0x40, 0x0a, 0x3e, 0x2a, 0x14, 0x4c, 0x69, 0x73, + 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x32, 0x26, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4c, 0x69, 0x73, 0x74, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x22, 0x62, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4f, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3b, 0x92, 0x41, 0x0f, 0xca, + 0x3e, 0x0c, 0xfa, 0x02, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, + 0x01, 0x02, 0xfa, 0x41, 0x22, 0x0a, 0x20, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, + 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xbe, 0x01, + 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x55, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x3d, 0x92, 0x41, 0x11, 0xca, 0x3e, 0x0e, 0xfa, 0x02, 0x0b, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x22, + 0x12, 0x20, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, + 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, + 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, + 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0xba, + 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, + 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, + 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x3f, 0x92, 0x41, 0x3c, 0x0a, + 0x3a, 0x2a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x24, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2e, 0x22, 0xaf, 0x01, 0x0a, 0x15, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x55, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3d, 0x92, 0x41, 0x11, 0xca, 0x3e, 0x0e, 0xfa, 0x02, 0x0b, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, + 0x41, 0x22, 0x12, 0x20, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, + 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x3f, 0x0a, 0x05, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x29, 0xe2, 0x41, 0x01, + 0x02, 0xfa, 0x41, 0x22, 0x0a, 0x20, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, + 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0xbb, 0x01, + 0x0a, 0x16, 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x6f, 0x69, 0x6e, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x22, 0x5a, 0x92, 0x41, 0x33, 0x12, 0x0a, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x1a, 0x25, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x61, 0x20, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2e, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, - 0x3d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xcd, 0x01, 0x0a, - 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x31, 0x2e, - 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x32, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, + 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x74, 0x5f, 0x66, 0x6f, 0x75, + 0x6e, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x74, 0x46, 0x6f, 0x75, + 0x6e, 0x64, 0x3a, 0x47, 0x92, 0x41, 0x44, 0x0a, 0x42, 0x2a, 0x16, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x32, 0x28, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2e, 0x32, 0xfa, 0x0a, 0x0a, 0x11, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0xc0, 0x01, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x12, 0x2f, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x56, 0x92, 0x41, 0x3f, 0x12, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x1a, 0x2f, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x75, 0x73, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, - 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x12, 0xc0, 0x01, 0x0a, - 0x08, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x69, 0x6e, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, + 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x5a, 0x92, 0x41, 0x33, 0x12, 0x0a, 0x47, + 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x1a, 0x25, 0x52, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x76, 0x65, 0x73, 0x20, 0x61, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x62, + 0x79, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2e, + 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, + 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xcd, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x31, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, + 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x22, 0x60, 0x92, - 0x41, 0x30, 0x12, 0x08, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x1a, 0x24, 0x52, 0x65, - 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x2e, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, - 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x73, 0x2f, 0x2a, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x12, - 0xe7, 0x01, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x2f, - 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x30, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x76, 0x92, 0x41, 0x44, 0x12, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x73, 0x1a, 0x36, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, - 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x20, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, - 0x6e, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x7b, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, - 0x2a, 0x7d, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x1a, 0x96, 0x02, 0x92, 0x41, 0xe5, 0x01, - 0x12, 0xe2, 0x01, 0x41, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, - 0x72, 0x65, 0x61, 0x64, 0x2d, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x41, 0x50, 0x49, 0x73, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, - 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, - 0x61, 0x69, 0x6e, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2e, - 0x20, 0x55, 0x73, 0x65, 0x72, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x75, 0x74, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, - 0x6e, 0x20, 0x62, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x65, 0x64, 0x20, - 0x77, 0x69, 0x74, 0x68, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, - 0x41, 0x50, 0x49, 0x73, 0x2e, 0xca, 0x41, 0x2a, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, - 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x77, 0x61, 0x61, 0x73, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x42, 0xbd, 0x01, 0x5a, 0x4e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x77, 0x61, 0x61, 0x73, 0x2d, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x2d, 0x67, - 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, - 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x2f, 0x76, 0x31, 0x92, 0x41, 0x6a, 0x12, 0x15, 0x0a, 0x0e, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x41, 0x50, 0x49, 0x32, 0x03, 0x31, 0x2e, 0x30, 0x1a, - 0x2a, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, - 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x77, 0x61, 0x61, 0x73, - 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2a, 0x01, 0x02, 0x32, 0x10, - 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, - 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, - 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x56, 0x92, 0x41, + 0x3f, 0x12, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x1a, + 0x2f, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x75, 0x73, 0x65, 0x2e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x12, 0xc0, 0x01, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x22, 0x60, 0x92, 0x41, 0x30, 0x12, 0x08, 0x47, 0x65, 0x74, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x1a, 0x24, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, + 0x61, 0x6e, 0x20, 0x41, 0x73, 0x73, 0x65, 0x74, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2e, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x2a, 0x2f, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xe7, 0x01, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x2f, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, + 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, + 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x76, 0x92, 0x41, 0x44, 0x12, 0x0a, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x1a, 0x36, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6f, + 0x6e, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x2e, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x20, 0x12, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x73, 0x12, 0x8b, 0x02, 0x0a, 0x0e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x74, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x73, 0x12, 0x33, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x63, 0x6f, 0x69, 0x6e, + 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, + 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x8d, 0x01, 0x92, 0x41, 0x4c, 0x12, 0x0e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x74, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x73, 0x1a, 0x3a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x73, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0xda, 0x41, 0x0c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x12, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x3d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x3a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x74, 0x1a, + 0x96, 0x02, 0x92, 0x41, 0xe5, 0x01, 0x12, 0xe2, 0x01, 0x41, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x73, + 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2d, 0x6f, 0x6e, 0x6c, 0x79, 0x20, + 0x41, 0x50, 0x49, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2e, 0x20, 0x55, 0x73, 0x65, 0x72, 0x73, 0x20, 0x63, 0x61, 0x6e, + 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, + 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x41, 0x50, 0x49, 0x73, 0x2e, 0xca, 0x41, 0x2a, 0x61, 0x70, + 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, + 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x77, 0x61, 0x61, 0x73, 0x2f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x42, 0xbd, 0x01, 0x5a, 0x4e, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, + 0x2f, 0x77, 0x61, 0x61, 0x73, 0x2d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x69, 0x62, + 0x72, 0x61, 0x72, 0x79, 0x2d, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x63, + 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2f, 0x76, 0x31, 0x92, 0x41, 0x6a, 0x12, 0x15, + 0x0a, 0x0e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x41, 0x50, 0x49, + 0x32, 0x03, 0x31, 0x2e, 0x30, 0x1a, 0x2a, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, + 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x77, 0x61, 0x61, 0x73, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x2a, 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1050,37 +1200,42 @@ func file_coinbase_cloud_blockchain_v1_blockchain_proto_rawDescGZIP() []byte { } var file_coinbase_cloud_blockchain_v1_blockchain_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_coinbase_cloud_blockchain_v1_blockchain_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_coinbase_cloud_blockchain_v1_blockchain_proto_msgTypes = make([]protoimpl.MessageInfo, 11) var file_coinbase_cloud_blockchain_v1_blockchain_proto_goTypes = []interface{}{ - (Network_Type)(0), // 0: coinbase.cloud.blockchain.v1.Network.Type - (*Network)(nil), // 1: coinbase.cloud.blockchain.v1.Network - (*Asset)(nil), // 2: coinbase.cloud.blockchain.v1.Asset - (*GetNetworkRequest)(nil), // 3: coinbase.cloud.blockchain.v1.GetNetworkRequest - (*ListNetworksRequest)(nil), // 4: coinbase.cloud.blockchain.v1.ListNetworksRequest - (*ListNetworksResponse)(nil), // 5: coinbase.cloud.blockchain.v1.ListNetworksResponse - (*GetAssetRequest)(nil), // 6: coinbase.cloud.blockchain.v1.GetAssetRequest - (*ListAssetsRequest)(nil), // 7: coinbase.cloud.blockchain.v1.ListAssetsRequest - (*ListAssetsResponse)(nil), // 8: coinbase.cloud.blockchain.v1.ListAssetsResponse - (*Asset_Definition)(nil), // 9: coinbase.cloud.blockchain.v1.Asset.Definition + (Network_Type)(0), // 0: coinbase.cloud.blockchain.v1.Network.Type + (*Network)(nil), // 1: coinbase.cloud.blockchain.v1.Network + (*Asset)(nil), // 2: coinbase.cloud.blockchain.v1.Asset + (*GetNetworkRequest)(nil), // 3: coinbase.cloud.blockchain.v1.GetNetworkRequest + (*ListNetworksRequest)(nil), // 4: coinbase.cloud.blockchain.v1.ListNetworksRequest + (*ListNetworksResponse)(nil), // 5: coinbase.cloud.blockchain.v1.ListNetworksResponse + (*GetAssetRequest)(nil), // 6: coinbase.cloud.blockchain.v1.GetAssetRequest + (*ListAssetsRequest)(nil), // 7: coinbase.cloud.blockchain.v1.ListAssetsRequest + (*ListAssetsResponse)(nil), // 8: coinbase.cloud.blockchain.v1.ListAssetsResponse + (*BatchGetAssetsRequest)(nil), // 9: coinbase.cloud.blockchain.v1.BatchGetAssetsRequest + (*BatchGetAssetsResponse)(nil), // 10: coinbase.cloud.blockchain.v1.BatchGetAssetsResponse + (*Asset_Definition)(nil), // 11: coinbase.cloud.blockchain.v1.Asset.Definition } var file_coinbase_cloud_blockchain_v1_blockchain_proto_depIdxs = []int32{ - 0, // 0: coinbase.cloud.blockchain.v1.Network.type:type_name -> coinbase.cloud.blockchain.v1.Network.Type - 9, // 1: coinbase.cloud.blockchain.v1.Asset.definition:type_name -> coinbase.cloud.blockchain.v1.Asset.Definition - 1, // 2: coinbase.cloud.blockchain.v1.ListNetworksResponse.networks:type_name -> coinbase.cloud.blockchain.v1.Network - 2, // 3: coinbase.cloud.blockchain.v1.ListAssetsResponse.assets:type_name -> coinbase.cloud.blockchain.v1.Asset - 3, // 4: coinbase.cloud.blockchain.v1.BlockchainService.GetNetwork:input_type -> coinbase.cloud.blockchain.v1.GetNetworkRequest - 4, // 5: coinbase.cloud.blockchain.v1.BlockchainService.ListNetworks:input_type -> coinbase.cloud.blockchain.v1.ListNetworksRequest - 6, // 6: coinbase.cloud.blockchain.v1.BlockchainService.GetAsset:input_type -> coinbase.cloud.blockchain.v1.GetAssetRequest - 7, // 7: coinbase.cloud.blockchain.v1.BlockchainService.ListAssets:input_type -> coinbase.cloud.blockchain.v1.ListAssetsRequest - 1, // 8: coinbase.cloud.blockchain.v1.BlockchainService.GetNetwork:output_type -> coinbase.cloud.blockchain.v1.Network - 5, // 9: coinbase.cloud.blockchain.v1.BlockchainService.ListNetworks:output_type -> coinbase.cloud.blockchain.v1.ListNetworksResponse - 2, // 10: coinbase.cloud.blockchain.v1.BlockchainService.GetAsset:output_type -> coinbase.cloud.blockchain.v1.Asset - 8, // 11: coinbase.cloud.blockchain.v1.BlockchainService.ListAssets:output_type -> coinbase.cloud.blockchain.v1.ListAssetsResponse - 8, // [8:12] is the sub-list for method output_type - 4, // [4:8] is the sub-list for method input_type - 4, // [4:4] is the sub-list for extension type_name - 4, // [4:4] is the sub-list for extension extendee - 0, // [0:4] is the sub-list for field type_name + 0, // 0: coinbase.cloud.blockchain.v1.Network.type:type_name -> coinbase.cloud.blockchain.v1.Network.Type + 11, // 1: coinbase.cloud.blockchain.v1.Asset.definition:type_name -> coinbase.cloud.blockchain.v1.Asset.Definition + 1, // 2: coinbase.cloud.blockchain.v1.ListNetworksResponse.networks:type_name -> coinbase.cloud.blockchain.v1.Network + 2, // 3: coinbase.cloud.blockchain.v1.ListAssetsResponse.assets:type_name -> coinbase.cloud.blockchain.v1.Asset + 2, // 4: coinbase.cloud.blockchain.v1.BatchGetAssetsResponse.assets:type_name -> coinbase.cloud.blockchain.v1.Asset + 3, // 5: coinbase.cloud.blockchain.v1.BlockchainService.GetNetwork:input_type -> coinbase.cloud.blockchain.v1.GetNetworkRequest + 4, // 6: coinbase.cloud.blockchain.v1.BlockchainService.ListNetworks:input_type -> coinbase.cloud.blockchain.v1.ListNetworksRequest + 6, // 7: coinbase.cloud.blockchain.v1.BlockchainService.GetAsset:input_type -> coinbase.cloud.blockchain.v1.GetAssetRequest + 7, // 8: coinbase.cloud.blockchain.v1.BlockchainService.ListAssets:input_type -> coinbase.cloud.blockchain.v1.ListAssetsRequest + 9, // 9: coinbase.cloud.blockchain.v1.BlockchainService.BatchGetAssets:input_type -> coinbase.cloud.blockchain.v1.BatchGetAssetsRequest + 1, // 10: coinbase.cloud.blockchain.v1.BlockchainService.GetNetwork:output_type -> coinbase.cloud.blockchain.v1.Network + 5, // 11: coinbase.cloud.blockchain.v1.BlockchainService.ListNetworks:output_type -> coinbase.cloud.blockchain.v1.ListNetworksResponse + 2, // 12: coinbase.cloud.blockchain.v1.BlockchainService.GetAsset:output_type -> coinbase.cloud.blockchain.v1.Asset + 8, // 13: coinbase.cloud.blockchain.v1.BlockchainService.ListAssets:output_type -> coinbase.cloud.blockchain.v1.ListAssetsResponse + 10, // 14: coinbase.cloud.blockchain.v1.BlockchainService.BatchGetAssets:output_type -> coinbase.cloud.blockchain.v1.BatchGetAssetsResponse + 10, // [10:15] is the sub-list for method output_type + 5, // [5:10] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name } func init() { file_coinbase_cloud_blockchain_v1_blockchain_proto_init() } @@ -1186,6 +1341,30 @@ func file_coinbase_cloud_blockchain_v1_blockchain_proto_init() { } } file_coinbase_cloud_blockchain_v1_blockchain_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchGetAssetsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_coinbase_cloud_blockchain_v1_blockchain_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchGetAssetsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_coinbase_cloud_blockchain_v1_blockchain_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Asset_Definition); i { case 0: return &v.state @@ -1204,7 +1383,7 @@ func file_coinbase_cloud_blockchain_v1_blockchain_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_coinbase_cloud_blockchain_v1_blockchain_proto_rawDesc, NumEnums: 1, - NumMessages: 9, + NumMessages: 11, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/go/coinbase/cloud/blockchain/v1/blockchain.pb.gw.go b/gen/go/coinbase/cloud/blockchain/v1/blockchain.pb.gw.go index bdaa7da..512b909 100644 --- a/gen/go/coinbase/cloud/blockchain/v1/blockchain.pb.gw.go +++ b/gen/go/coinbase/cloud/blockchain/v1/blockchain.pb.gw.go @@ -241,6 +241,76 @@ func local_request_BlockchainService_ListAssets_0(ctx context.Context, marshaler } +var ( + filter_BlockchainService_BatchGetAssets_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} +) + +func request_BlockchainService_BatchGetAssets_0(ctx context.Context, marshaler runtime.Marshaler, client BlockchainServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq BatchGetAssetsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_BlockchainService_BatchGetAssets_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.BatchGetAssets(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_BlockchainService_BatchGetAssets_0(ctx context.Context, marshaler runtime.Marshaler, server BlockchainServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq BatchGetAssetsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_BlockchainService_BatchGetAssets_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.BatchGetAssets(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterBlockchainServiceHandlerServer registers the http handlers for service BlockchainService to "mux". // UnaryRPC :call BlockchainServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -347,6 +417,31 @@ func RegisterBlockchainServiceHandlerServer(ctx context.Context, mux *runtime.Se }) + mux.Handle("GET", pattern_BlockchainService_BatchGetAssets_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/coinbase.cloud.blockchain.v1.BlockchainService/BatchGetAssets", runtime.WithHTTPPathPattern("/v1/{parent=networks/*}/assets:batchGet")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_BlockchainService_BatchGetAssets_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_BlockchainService_BatchGetAssets_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -476,6 +571,28 @@ func RegisterBlockchainServiceHandlerClient(ctx context.Context, mux *runtime.Se }) + mux.Handle("GET", pattern_BlockchainService_BatchGetAssets_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/coinbase.cloud.blockchain.v1.BlockchainService/BatchGetAssets", runtime.WithHTTPPathPattern("/v1/{parent=networks/*}/assets:batchGet")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_BlockchainService_BatchGetAssets_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_BlockchainService_BatchGetAssets_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -487,6 +604,8 @@ var ( pattern_BlockchainService_GetAsset_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "networks", "assets", "name"}, "")) pattern_BlockchainService_ListAssets_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "networks", "parent", "assets"}, "")) + + pattern_BlockchainService_BatchGetAssets_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "networks", "parent", "assets"}, "batchGet")) ) var ( @@ -497,4 +616,6 @@ var ( forward_BlockchainService_GetAsset_0 = runtime.ForwardResponseMessage forward_BlockchainService_ListAssets_0 = runtime.ForwardResponseMessage + + forward_BlockchainService_BatchGetAssets_0 = runtime.ForwardResponseMessage ) diff --git a/gen/go/coinbase/cloud/blockchain/v1/blockchain_grpc.pb.go b/gen/go/coinbase/cloud/blockchain/v1/blockchain_grpc.pb.go index a08fc08..42c79fc 100644 --- a/gen/go/coinbase/cloud/blockchain/v1/blockchain_grpc.pb.go +++ b/gen/go/coinbase/cloud/blockchain/v1/blockchain_grpc.pb.go @@ -26,6 +26,8 @@ type BlockchainServiceClient interface { GetAsset(ctx context.Context, in *GetAssetRequest, opts ...grpc.CallOption) (*Asset, error) // Returns a list of Assets available on a given Network. ListAssets(ctx context.Context, in *ListAssetsRequest, opts ...grpc.CallOption) (*ListAssetsResponse, error) + // Returns the list of Assets indicated by the given request. + BatchGetAssets(ctx context.Context, in *BatchGetAssetsRequest, opts ...grpc.CallOption) (*BatchGetAssetsResponse, error) } type blockchainServiceClient struct { @@ -72,6 +74,15 @@ func (c *blockchainServiceClient) ListAssets(ctx context.Context, in *ListAssets return out, nil } +func (c *blockchainServiceClient) BatchGetAssets(ctx context.Context, in *BatchGetAssetsRequest, opts ...grpc.CallOption) (*BatchGetAssetsResponse, error) { + out := new(BatchGetAssetsResponse) + err := c.cc.Invoke(ctx, "/coinbase.cloud.blockchain.v1.BlockchainService/BatchGetAssets", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // BlockchainServiceServer is the server API for BlockchainService service. // All implementations must embed UnimplementedBlockchainServiceServer // for forward compatibility @@ -84,6 +95,8 @@ type BlockchainServiceServer interface { GetAsset(context.Context, *GetAssetRequest) (*Asset, error) // Returns a list of Assets available on a given Network. ListAssets(context.Context, *ListAssetsRequest) (*ListAssetsResponse, error) + // Returns the list of Assets indicated by the given request. + BatchGetAssets(context.Context, *BatchGetAssetsRequest) (*BatchGetAssetsResponse, error) mustEmbedUnimplementedBlockchainServiceServer() } @@ -103,6 +116,9 @@ func (UnimplementedBlockchainServiceServer) GetAsset(context.Context, *GetAssetR func (UnimplementedBlockchainServiceServer) ListAssets(context.Context, *ListAssetsRequest) (*ListAssetsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListAssets not implemented") } +func (UnimplementedBlockchainServiceServer) BatchGetAssets(context.Context, *BatchGetAssetsRequest) (*BatchGetAssetsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method BatchGetAssets not implemented") +} func (UnimplementedBlockchainServiceServer) mustEmbedUnimplementedBlockchainServiceServer() {} // UnsafeBlockchainServiceServer may be embedded to opt out of forward compatibility for this service. @@ -188,6 +204,24 @@ func _BlockchainService_ListAssets_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _BlockchainService_BatchGetAssets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(BatchGetAssetsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BlockchainServiceServer).BatchGetAssets(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/coinbase.cloud.blockchain.v1.BlockchainService/BatchGetAssets", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BlockchainServiceServer).BatchGetAssets(ctx, req.(*BatchGetAssetsRequest)) + } + return interceptor(ctx, in, info, handler) +} + // BlockchainService_ServiceDesc is the grpc.ServiceDesc for BlockchainService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -211,6 +245,10 @@ var BlockchainService_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListAssets", Handler: _BlockchainService_ListAssets_Handler, }, + { + MethodName: "BatchGetAssets", + Handler: _BlockchainService_BatchGetAssets_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "coinbase/cloud/blockchain/v1/blockchain.proto", diff --git a/gen/go/coinbase/cloud/blockchain/v1/mocks/BlockchainServiceClient.go b/gen/go/coinbase/cloud/blockchain/v1/mocks/BlockchainServiceClient.go index 70aaccd..32b05bf 100644 --- a/gen/go/coinbase/cloud/blockchain/v1/mocks/BlockchainServiceClient.go +++ b/gen/go/coinbase/cloud/blockchain/v1/mocks/BlockchainServiceClient.go @@ -17,6 +17,36 @@ type BlockchainServiceClient struct { mock.Mock } +// BatchGetAssets provides a mock function with given fields: ctx, in, opts +func (_m *BlockchainServiceClient) BatchGetAssets(ctx context.Context, in *v1.BatchGetAssetsRequest, opts ...grpc.CallOption) (*v1.BatchGetAssetsResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *v1.BatchGetAssetsResponse + if rf, ok := ret.Get(0).(func(context.Context, *v1.BatchGetAssetsRequest, ...grpc.CallOption) *v1.BatchGetAssetsResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.BatchGetAssetsResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *v1.BatchGetAssetsRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // GetAsset provides a mock function with given fields: ctx, in, opts func (_m *BlockchainServiceClient) GetAsset(ctx context.Context, in *v1.GetAssetRequest, opts ...grpc.CallOption) (*v1.Asset, error) { _va := make([]interface{}, len(opts)) diff --git a/gen/go/coinbase/cloud/blockchain/v1/mocks/BlockchainServiceServer.go b/gen/go/coinbase/cloud/blockchain/v1/mocks/BlockchainServiceServer.go index fc1324a..8df6431 100644 --- a/gen/go/coinbase/cloud/blockchain/v1/mocks/BlockchainServiceServer.go +++ b/gen/go/coinbase/cloud/blockchain/v1/mocks/BlockchainServiceServer.go @@ -14,6 +14,29 @@ type BlockchainServiceServer struct { mock.Mock } +// BatchGetAssets provides a mock function with given fields: _a0, _a1 +func (_m *BlockchainServiceServer) BatchGetAssets(_a0 context.Context, _a1 *v1.BatchGetAssetsRequest) (*v1.BatchGetAssetsResponse, error) { + ret := _m.Called(_a0, _a1) + + var r0 *v1.BatchGetAssetsResponse + if rf, ok := ret.Get(0).(func(context.Context, *v1.BatchGetAssetsRequest) *v1.BatchGetAssetsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.BatchGetAssetsResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *v1.BatchGetAssetsRequest) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // GetAsset provides a mock function with given fields: _a0, _a1 func (_m *BlockchainServiceServer) GetAsset(_a0 context.Context, _a1 *v1.GetAssetRequest) (*v1.Asset, error) { ret := _m.Called(_a0, _a1) diff --git a/gen/go/coinbase/cloud/clients/v1/blockchain_client.go b/gen/go/coinbase/cloud/clients/v1/blockchain_client.go index 2c94788..fbd52b3 100644 --- a/gen/go/coinbase/cloud/clients/v1/blockchain_client.go +++ b/gen/go/coinbase/cloud/clients/v1/blockchain_client.go @@ -47,6 +47,7 @@ type BlockchainCallOptions struct { ListNetworks []gax.CallOption GetAsset []gax.CallOption ListAssets []gax.CallOption + BatchGetAssets []gax.CallOption } func defaultBlockchainGRPCClientOptions() []option.ClientOption { @@ -71,6 +72,8 @@ func defaultBlockchainCallOptions() *BlockchainCallOptions { }, ListAssets: []gax.CallOption{ }, + BatchGetAssets: []gax.CallOption{ + }, } } @@ -84,6 +87,8 @@ func defaultBlockchainRESTCallOptions() *BlockchainCallOptions { }, ListAssets: []gax.CallOption{ }, + BatchGetAssets: []gax.CallOption{ + }, } } @@ -96,6 +101,7 @@ type internalBlockchainClient interface { ListNetworks(context.Context, *blockchainpb.ListNetworksRequest, ...gax.CallOption) *NetworkIterator GetAsset(context.Context, *blockchainpb.GetAssetRequest, ...gax.CallOption) (*blockchainpb.Asset, error) ListAssets(context.Context, *blockchainpb.ListAssetsRequest, ...gax.CallOption) *AssetIterator + BatchGetAssets(context.Context, *blockchainpb.BatchGetAssetsRequest, ...gax.CallOption) (*blockchainpb.BatchGetAssetsResponse, error) } // BlockchainClient is a client for interacting with . @@ -156,6 +162,11 @@ func (c *BlockchainClient) ListAssets(ctx context.Context, req *blockchainpb.Lis return c.internalClient.ListAssets(ctx, req, opts...) } +// BatchGetAssets returns the list of Assets indicated by the given request. +func (c *BlockchainClient) BatchGetAssets(ctx context.Context, req *blockchainpb.BatchGetAssetsRequest, opts ...gax.CallOption) (*blockchainpb.BatchGetAssetsResponse, error) { + return c.internalClient.BatchGetAssets(ctx, req, opts...) +} + // blockchainGRPCClient is a client for interacting with over gRPC transport. // // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. @@ -431,6 +442,23 @@ func (c *blockchainGRPCClient) ListAssets(ctx context.Context, req *blockchainpb return it } +func (c *blockchainGRPCClient) BatchGetAssets(ctx context.Context, req *blockchainpb.BatchGetAssetsRequest, opts ...gax.CallOption) (*blockchainpb.BatchGetAssetsResponse, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))) + + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append((*c.CallOptions).BatchGetAssets[0:len((*c.CallOptions).BatchGetAssets):len((*c.CallOptions).BatchGetAssets)], opts...) + var resp *blockchainpb.BatchGetAssetsResponse + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.blockchainClient.BatchGetAssets(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + // GetNetwork retrieves a Network by resource name. func (c *blockchainRESTClient) GetNetwork(ctx context.Context, req *blockchainpb.GetNetworkRequest, opts ...gax.CallOption) (*blockchainpb.Network, error) { baseUrl, err := url.Parse(c.endpoint) @@ -710,6 +738,67 @@ func (c *blockchainRESTClient) ListAssets(ctx context.Context, req *blockchainpb return it } +// BatchGetAssets returns the list of Assets indicated by the given request. +func (c *blockchainRESTClient) BatchGetAssets(ctx context.Context, req *blockchainpb.BatchGetAssetsRequest, opts ...gax.CallOption) (*blockchainpb.BatchGetAssetsResponse, error) { + baseUrl, err := url.Parse(c.endpoint) + if err != nil { + return nil, err + } + baseUrl.Path += fmt.Sprintf("/v1/%v/assets:batchGet", req.GetParent()) + + params := url.Values{} + if items := req.GetNames(); len(items) > 0 { + for _, item := range items { + params.Add("names", fmt.Sprintf("%v", item)) + } + } + + baseUrl.RawQuery = params.Encode() + + // Build HTTP headers from client and context metadata. + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))) + + headers := buildHeaders(ctx, c.xGoogMetadata, md, metadata.Pairs("Content-Type", "application/json")) + opts = append((*c.CallOptions).BatchGetAssets[0:len((*c.CallOptions).BatchGetAssets):len((*c.CallOptions).BatchGetAssets)], opts...) + unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} + resp := &blockchainpb.BatchGetAssetsResponse{} + e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + if settings.Path != "" { + baseUrl.Path = settings.Path + } + httpReq, err := http.NewRequest("GET", baseUrl.String(), nil) + if err != nil { + return err + } + httpReq = httpReq.WithContext(ctx) + httpReq.Header = headers + + httpRsp, err := c.httpClient.Do(httpReq) + if err != nil{ + return err + } + defer httpRsp.Body.Close() + + if err = googleapi.CheckResponse(httpRsp); err != nil { + return err + } + + buf, err := ioutil.ReadAll(httpRsp.Body) + if err != nil { + return err + } + + if err := unm.Unmarshal(buf, resp); err != nil { + return maybeUnknownEnum(err) + } + + return nil + }, opts...) + if e != nil { + return nil, e + } + return resp, nil +} // AssetIterator manages a stream of *blockchainpb.Asset. type AssetIterator struct { items []*blockchainpb.Asset diff --git a/gen/go/coinbase/cloud/clients/v1/blockchain_client_example_test.go b/gen/go/coinbase/cloud/clients/v1/blockchain_client_example_test.go index 58ef9bd..79d2a00 100644 --- a/gen/go/coinbase/cloud/clients/v1/blockchain_client_example_test.go +++ b/gen/go/coinbase/cloud/clients/v1/blockchain_client_example_test.go @@ -170,3 +170,28 @@ func ExampleBlockchainClient_ListAssets() { _ = resp } } + +func ExampleBlockchainClient_BatchGetAssets() { + ctx := context.Background() + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in: + // https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options + c, err := v1.NewBlockchainClient(ctx) + if err != nil { + // TODO: Handle error. + } + defer c.Close() + + req := &blockchainpb.BatchGetAssetsRequest{ + // TODO: Fill request struct fields. + // See https://pkg.go.dev/github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/blockchain/v1#BatchGetAssetsRequest. + } + resp, err := c.BatchGetAssets(ctx, req) + if err != nil { + // TODO: Handle error. + } + // TODO: Use resp. + _ = resp +} diff --git a/gen/go/coinbase/cloud/clients/v1/doc.go b/gen/go/coinbase/cloud/clients/v1/doc.go index 0665f71..04aa87e 100644 --- a/gen/go/coinbase/cloud/clients/v1/doc.go +++ b/gen/go/coinbase/cloud/clients/v1/doc.go @@ -29,7 +29,7 @@ // // - It may require correct/in-range values for request initialization. // // - It may require specifying regional endpoints when creating the service client as shown in: // // https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options -// c, err := v1.NewProtocolClient(ctx) +// c, err := v1.NewMPCKeyClient(ctx) // if err != nil { // // TODO: Handle error. // } @@ -49,17 +49,17 @@ // // - It may require correct/in-range values for request initialization. // // - It may require specifying regional endpoints when creating the service client as shown in: // // https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options -// c, err := v1.NewProtocolClient(ctx) +// c, err := v1.NewMPCKeyClient(ctx) // if err != nil { // // TODO: Handle error. // } // defer c.Close() // -// req := &protocolspb.ConstructTransactionRequest{ +// req := &mpc_keyspb.RegisterDeviceRequest{ // // TODO: Fill request struct fields. -// // See https://pkg.go.dev/github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/protocols/v1#ConstructTransactionRequest. +// // See https://pkg.go.dev/github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/mpc_keys/v1#RegisterDeviceRequest. // } -// resp, err := c.ConstructTransaction(ctx, req) +// resp, err := c.RegisterDevice(ctx, req) // if err != nil { // // TODO: Handle error. // } @@ -68,7 +68,7 @@ // // Use of Context // -// The ctx passed to NewProtocolClient is used for authentication requests and +// The ctx passed to NewMPCKeyClient is used for authentication requests and // for creating the underlying connection, but is not used for subsequent calls. // Individual methods on the client use the ctx given to them. // diff --git a/gen/go/coinbase/cloud/clients/v1/internal/snippets/BlockchainClient/BatchGetAssets/main.go b/gen/go/coinbase/cloud/clients/v1/internal/snippets/BlockchainClient/BatchGetAssets/main.go new file mode 100644 index 0000000..e52a6bb --- /dev/null +++ b/gen/go/coinbase/cloud/clients/v1/internal/snippets/BlockchainClient/BatchGetAssets/main.go @@ -0,0 +1,53 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go_gapic. DO NOT EDIT. + +// [START api_v1_generated_BlockchainService_BatchGetAssets_sync] + +package main + +import ( + "context" + + blockchainpb "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/blockchain/v1" + v1 "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/clients/v1" +) + +func main() { + ctx := context.Background() + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in: + // https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options + c, err := v1.NewBlockchainClient(ctx) + if err != nil { + // TODO: Handle error. + } + defer c.Close() + + req := &blockchainpb.BatchGetAssetsRequest{ + // TODO: Fill request struct fields. + // See https://pkg.go.dev/github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/blockchain/v1#BatchGetAssetsRequest. + } + resp, err := c.BatchGetAssets(ctx, req) + if err != nil { + // TODO: Handle error. + } + // TODO: Use resp. + _ = resp +} + +// [END api_v1_generated_BlockchainService_BatchGetAssets_sync] diff --git a/gen/go/coinbase/cloud/clients/v1/internal/snippets/MPCKeyClient/AddDevice/main.go b/gen/go/coinbase/cloud/clients/v1/internal/snippets/MPCKeyClient/AddDevice/main.go new file mode 100644 index 0000000..d38fe63 --- /dev/null +++ b/gen/go/coinbase/cloud/clients/v1/internal/snippets/MPCKeyClient/AddDevice/main.go @@ -0,0 +1,58 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go_gapic. DO NOT EDIT. + +// [START api_v1_generated_MPCKeyService_AddDevice_sync] + +package main + +import ( + "context" + + v1 "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/clients/v1" + mpc_keyspb "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/mpc_keys/v1" +) + +func main() { + ctx := context.Background() + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in: + // https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options + c, err := v1.NewMPCKeyClient(ctx) + if err != nil { + // TODO: Handle error. + } + defer c.Close() + + req := &mpc_keyspb.AddDeviceRequest{ + // TODO: Fill request struct fields. + // See https://pkg.go.dev/github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/mpc_keys/v1#AddDeviceRequest. + } + op, err := c.AddDevice(ctx, req) + if err != nil { + // TODO: Handle error. + } + + resp, err := op.Wait(ctx) + if err != nil { + // TODO: Handle error. + } + // TODO: Use resp. + _ = resp +} + +// [END api_v1_generated_MPCKeyService_AddDevice_sync] diff --git a/gen/go/coinbase/cloud/clients/v1/internal/snippets/MPCKeyClient/PrepareDeviceArchive/main.go b/gen/go/coinbase/cloud/clients/v1/internal/snippets/MPCKeyClient/PrepareDeviceArchive/main.go new file mode 100644 index 0000000..1ffa458 --- /dev/null +++ b/gen/go/coinbase/cloud/clients/v1/internal/snippets/MPCKeyClient/PrepareDeviceArchive/main.go @@ -0,0 +1,58 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go_gapic. DO NOT EDIT. + +// [START api_v1_generated_MPCKeyService_PrepareDeviceArchive_sync] + +package main + +import ( + "context" + + v1 "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/clients/v1" + mpc_keyspb "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/mpc_keys/v1" +) + +func main() { + ctx := context.Background() + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in: + // https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options + c, err := v1.NewMPCKeyClient(ctx) + if err != nil { + // TODO: Handle error. + } + defer c.Close() + + req := &mpc_keyspb.PrepareDeviceArchiveRequest{ + // TODO: Fill request struct fields. + // See https://pkg.go.dev/github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/mpc_keys/v1#PrepareDeviceArchiveRequest. + } + op, err := c.PrepareDeviceArchive(ctx, req) + if err != nil { + // TODO: Handle error. + } + + resp, err := op.Wait(ctx) + if err != nil { + // TODO: Handle error. + } + // TODO: Use resp. + _ = resp +} + +// [END api_v1_generated_MPCKeyService_PrepareDeviceArchive_sync] diff --git a/gen/go/coinbase/cloud/clients/v1/internal/snippets/MPCKeyClient/PrepareDeviceBackup/main.go b/gen/go/coinbase/cloud/clients/v1/internal/snippets/MPCKeyClient/PrepareDeviceBackup/main.go new file mode 100644 index 0000000..b8996fb --- /dev/null +++ b/gen/go/coinbase/cloud/clients/v1/internal/snippets/MPCKeyClient/PrepareDeviceBackup/main.go @@ -0,0 +1,58 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go_gapic. DO NOT EDIT. + +// [START api_v1_generated_MPCKeyService_PrepareDeviceBackup_sync] + +package main + +import ( + "context" + + v1 "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/clients/v1" + mpc_keyspb "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/mpc_keys/v1" +) + +func main() { + ctx := context.Background() + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in: + // https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options + c, err := v1.NewMPCKeyClient(ctx) + if err != nil { + // TODO: Handle error. + } + defer c.Close() + + req := &mpc_keyspb.PrepareDeviceBackupRequest{ + // TODO: Fill request struct fields. + // See https://pkg.go.dev/github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/mpc_keys/v1#PrepareDeviceBackupRequest. + } + op, err := c.PrepareDeviceBackup(ctx, req) + if err != nil { + // TODO: Handle error. + } + + resp, err := op.Wait(ctx) + if err != nil { + // TODO: Handle error. + } + // TODO: Use resp. + _ = resp +} + +// [END api_v1_generated_MPCKeyService_PrepareDeviceBackup_sync] diff --git a/gen/go/coinbase/cloud/clients/v1/internal/snippets/MPCKeyClient/RevokeDevice/main.go b/gen/go/coinbase/cloud/clients/v1/internal/snippets/MPCKeyClient/RevokeDevice/main.go new file mode 100644 index 0000000..4cd3af4 --- /dev/null +++ b/gen/go/coinbase/cloud/clients/v1/internal/snippets/MPCKeyClient/RevokeDevice/main.go @@ -0,0 +1,51 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go_gapic. DO NOT EDIT. + +// [START api_v1_generated_MPCKeyService_RevokeDevice_sync] + +package main + +import ( + "context" + + v1 "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/clients/v1" + mpc_keyspb "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/mpc_keys/v1" +) + +func main() { + ctx := context.Background() + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in: + // https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options + c, err := v1.NewMPCKeyClient(ctx) + if err != nil { + // TODO: Handle error. + } + defer c.Close() + + req := &mpc_keyspb.RevokeDeviceRequest{ + // TODO: Fill request struct fields. + // See https://pkg.go.dev/github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/mpc_keys/v1#RevokeDeviceRequest. + } + err = c.RevokeDevice(ctx, req) + if err != nil { + // TODO: Handle error. + } +} + +// [END api_v1_generated_MPCKeyService_RevokeDevice_sync] diff --git a/gen/go/coinbase/cloud/clients/v1/internal/snippets/MPCWalletClient/ListBalanceDetails/main.go b/gen/go/coinbase/cloud/clients/v1/internal/snippets/MPCWalletClient/ListBalanceDetails/main.go new file mode 100644 index 0000000..7c7d46e --- /dev/null +++ b/gen/go/coinbase/cloud/clients/v1/internal/snippets/MPCWalletClient/ListBalanceDetails/main.go @@ -0,0 +1,60 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go_gapic. DO NOT EDIT. + +// [START api_v1_generated_MPCWalletService_ListBalanceDetails_sync] + +package main + +import ( + "context" + + v1 "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/clients/v1" + mpc_walletspb "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/mpc_wallets/v1" + "google.golang.org/api/iterator" +) + +func main() { + ctx := context.Background() + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in: + // https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options + c, err := v1.NewMPCWalletClient(ctx) + if err != nil { + // TODO: Handle error. + } + defer c.Close() + + req := &mpc_walletspb.ListBalanceDetailsRequest{ + // TODO: Fill request struct fields. + // See https://pkg.go.dev/github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/mpc_wallets/v1#ListBalanceDetailsRequest. + } + it := c.ListBalanceDetails(ctx, req) + for { + resp, err := it.Next() + if err == iterator.Done { + break + } + if err != nil { + // TODO: Handle error. + } + // TODO: Use resp. + _ = resp + } +} + +// [END api_v1_generated_MPCWalletService_ListBalanceDetails_sync] diff --git a/gen/go/coinbase/cloud/clients/v1/internal/snippets/ProtocolClient/EstimateFee/main.go b/gen/go/coinbase/cloud/clients/v1/internal/snippets/ProtocolClient/EstimateFee/main.go new file mode 100644 index 0000000..e36209c --- /dev/null +++ b/gen/go/coinbase/cloud/clients/v1/internal/snippets/ProtocolClient/EstimateFee/main.go @@ -0,0 +1,53 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go_gapic. DO NOT EDIT. + +// [START api_v1_generated_ProtocolService_EstimateFee_sync] + +package main + +import ( + "context" + + v1 "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/clients/v1" + protocolspb "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/protocols/v1" +) + +func main() { + ctx := context.Background() + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in: + // https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options + c, err := v1.NewProtocolClient(ctx) + if err != nil { + // TODO: Handle error. + } + defer c.Close() + + req := &protocolspb.EstimateFeeRequest{ + // TODO: Fill request struct fields. + // See https://pkg.go.dev/github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/protocols/v1#EstimateFeeRequest. + } + resp, err := c.EstimateFee(ctx, req) + if err != nil { + // TODO: Handle error. + } + // TODO: Use resp. + _ = resp +} + +// [END api_v1_generated_ProtocolService_EstimateFee_sync] diff --git a/gen/go/coinbase/cloud/clients/v1/internal/snippets/snippet_metadata.coinbase.cloud.blockchain.v1.json b/gen/go/coinbase/cloud/clients/v1/internal/snippets/snippet_metadata.coinbase.cloud.blockchain.v1.json index 3fab448..e30a698 100644 --- a/gen/go/coinbase/cloud/clients/v1/internal/snippets/snippet_metadata.coinbase.cloud.blockchain.v1.json +++ b/gen/go/coinbase/cloud/clients/v1/internal/snippets/snippet_metadata.coinbase.cloud.blockchain.v1.json @@ -11,6 +11,52 @@ ] }, "snippets": [ + { + "regionTag": "api_v1_generated_BlockchainService_BatchGetAssets_sync", + "title": "api BatchGetAssets Sample", + "description": "BatchGetAssets returns the list of Assets indicated by the given request.", + "file": "BlockchainClient/BatchGetAssets/main.go", + "language": "GO", + "clientMethod": { + "shortName": "BatchGetAssets", + "fullName": "coinbase.cloud.blockchain.v1.BlockchainClient.BatchGetAssets", + "parameters": [ + { + "type": "context.Context", + "name": "ctx" + }, + { + "type": "blockchainpb.BatchGetAssetsRequest", + "name": "req" + }, + { + "type": "...gax.CallOption", + "name": "opts" + } + ], + "resultType": "*blockchainpb.BatchGetAssetsResponse", + "client": { + "shortName": "BlockchainClient", + "fullName": "coinbase.cloud.blockchain.v1.BlockchainClient" + }, + "method": { + "shortName": "BatchGetAssets", + "fullName": "coinbase.cloud.blockchain.v1.BlockchainService.BatchGetAssets", + "service": { + "shortName": "BlockchainService", + "fullName": "coinbase.cloud.blockchain.v1.BlockchainService" + } + } + }, + "origin": "API_DEFINITION", + "segments": [ + { + "start": 18, + "end": 53, + "type": "FULL" + } + ] + }, { "regionTag": "api_v1_generated_BlockchainService_GetAsset_sync", "title": "api GetAsset Sample", diff --git a/gen/go/coinbase/cloud/clients/v1/internal/snippets/snippet_metadata.coinbase.cloud.mpc_keys.v1.json b/gen/go/coinbase/cloud/clients/v1/internal/snippets/snippet_metadata.coinbase.cloud.mpc_keys.v1.json index ac7d8e2..4bd7814 100644 --- a/gen/go/coinbase/cloud/clients/v1/internal/snippets/snippet_metadata.coinbase.cloud.mpc_keys.v1.json +++ b/gen/go/coinbase/cloud/clients/v1/internal/snippets/snippet_metadata.coinbase.cloud.mpc_keys.v1.json @@ -11,6 +11,52 @@ ] }, "snippets": [ + { + "regionTag": "api_v1_generated_MPCKeyService_AddDevice_sync", + "title": "api AddDevice Sample", + "description": "AddDevice adds a Device to an existing DeviceGroup. Prior to this API being called, the Device must be registered using\nRegisterDevice RPC. The Device must have access to the backup created with PrepareDeviceBackup RPC to compute this\noperation. After calling this RPC, use ListMPCOperations to poll for the pending AddDevice operation,\nand use the WaaS SDK's ComputeAddDeviceMPCOperation to complete the operation.\nAfter the operation is computed on WaaS SDK, the Device will have access to cryptographic materials\nrequired to process MPCOperations for this DeviceGroup.\nOnce the operation completes on MPCKeyService, the Device will be added to the given DeviceGroup as a new member\nand all existing Devices in the DeviceGroup will stay functional.\nUse the RevokeDevice RPC to remove any of the existing Devices from the DeviceGroup.", + "file": "MPCKeyClient/AddDevice/main.go", + "language": "GO", + "clientMethod": { + "shortName": "AddDevice", + "fullName": "coinbase.cloud.mpc_keys.v1.MPCKeyClient.AddDevice", + "parameters": [ + { + "type": "context.Context", + "name": "ctx" + }, + { + "type": "mpc_keyspb.AddDeviceRequest", + "name": "req" + }, + { + "type": "...gax.CallOption", + "name": "opts" + } + ], + "resultType": "AddDeviceOperation", + "client": { + "shortName": "MPCKeyClient", + "fullName": "coinbase.cloud.mpc_keys.v1.MPCKeyClient" + }, + "method": { + "shortName": "AddDevice", + "fullName": "coinbase.cloud.mpc_keys.v1.MPCKeyService.AddDevice", + "service": { + "shortName": "MPCKeyService", + "fullName": "coinbase.cloud.mpc_keys.v1.MPCKeyService" + } + } + }, + "origin": "API_DEFINITION", + "segments": [ + { + "start": 18, + "end": 58, + "type": "FULL" + } + ] + }, { "regionTag": "api_v1_generated_MPCKeyService_CreateDeviceGroup_sync", "title": "api CreateDeviceGroup Sample", @@ -333,6 +379,98 @@ } ] }, + { + "regionTag": "api_v1_generated_MPCKeyService_PrepareDeviceArchive_sync", + "title": "api PrepareDeviceArchive Sample", + "description": "PrepareDeviceArchive prepares an archive in the local storage of the given Device. The archive contains cryptographic materials\nthat can be used to export MPCKeys, which have the given DeviceGroup as their parent.\nThe Device specified in the request must be a member of this DeviceGroup and must participate\nin the associated MPC operation for the archive to be prepared. After calling this,\nuse ListMPCOperations to poll for the pending PrepareDeviceArchive operation, and use the WaaS SDK's\nComputeMPCOperation to complete the operation. Once the operation completes, the Device can utilize the\nWaaS SDK to export the private keys corresponding to each of the MPCKeys under this DeviceGroup.", + "file": "MPCKeyClient/PrepareDeviceArchive/main.go", + "language": "GO", + "clientMethod": { + "shortName": "PrepareDeviceArchive", + "fullName": "coinbase.cloud.mpc_keys.v1.MPCKeyClient.PrepareDeviceArchive", + "parameters": [ + { + "type": "context.Context", + "name": "ctx" + }, + { + "type": "mpc_keyspb.PrepareDeviceArchiveRequest", + "name": "req" + }, + { + "type": "...gax.CallOption", + "name": "opts" + } + ], + "resultType": "PrepareDeviceArchiveOperation", + "client": { + "shortName": "MPCKeyClient", + "fullName": "coinbase.cloud.mpc_keys.v1.MPCKeyClient" + }, + "method": { + "shortName": "PrepareDeviceArchive", + "fullName": "coinbase.cloud.mpc_keys.v1.MPCKeyService.PrepareDeviceArchive", + "service": { + "shortName": "MPCKeyService", + "fullName": "coinbase.cloud.mpc_keys.v1.MPCKeyService" + } + } + }, + "origin": "API_DEFINITION", + "segments": [ + { + "start": 18, + "end": 58, + "type": "FULL" + } + ] + }, + { + "regionTag": "api_v1_generated_MPCKeyService_PrepareDeviceBackup_sync", + "title": "api PrepareDeviceBackup Sample", + "description": "PrepareDeviceBackup prepares a backup in the given Device. The backup contains certain cryptographic materials\nthat can be used to restore MPCKeys, which have the given DeviceGroup as their parent, on a new Device.\nThe Device specified in the request must be a member of this DeviceGroup and must participate in the associated\nMPC operation for the backup to be prepared.\nAfter calling this RPC, use ListMPCOperations to poll for the pending PrepareDeviceBackup operation,\nand use the WaaS SDK's ComputeMPCOperation to complete the operation. Once the operation completes,\nthe Device can utilize WaaS SDK to download the backup bundle. We recommend storing this backup bundle securely\nin a storage provider of your choice. If the user loses access to their existing Device and wants to recover\nMPCKeys in the given DeviceGroup on a new Device, use AddDevice RPC on the MPCKeyService.", + "file": "MPCKeyClient/PrepareDeviceBackup/main.go", + "language": "GO", + "clientMethod": { + "shortName": "PrepareDeviceBackup", + "fullName": "coinbase.cloud.mpc_keys.v1.MPCKeyClient.PrepareDeviceBackup", + "parameters": [ + { + "type": "context.Context", + "name": "ctx" + }, + { + "type": "mpc_keyspb.PrepareDeviceBackupRequest", + "name": "req" + }, + { + "type": "...gax.CallOption", + "name": "opts" + } + ], + "resultType": "PrepareDeviceBackupOperation", + "client": { + "shortName": "MPCKeyClient", + "fullName": "coinbase.cloud.mpc_keys.v1.MPCKeyClient" + }, + "method": { + "shortName": "PrepareDeviceBackup", + "fullName": "coinbase.cloud.mpc_keys.v1.MPCKeyService.PrepareDeviceBackup", + "service": { + "shortName": "MPCKeyService", + "fullName": "coinbase.cloud.mpc_keys.v1.MPCKeyService" + } + } + }, + "origin": "API_DEFINITION", + "segments": [ + { + "start": 18, + "end": 58, + "type": "FULL" + } + ] + }, { "regionTag": "api_v1_generated_MPCKeyService_RegisterDevice_sync", "title": "api RegisterDevice Sample", @@ -378,6 +516,51 @@ "type": "FULL" } ] + }, + { + "regionTag": "api_v1_generated_MPCKeyService_RevokeDevice_sync", + "title": "api RevokeDevice Sample", + "description": "RevokeDevice revokes a registered Device. This operation removes the registered Device from all the DeviceGroups that it is a\npart of. Once the Device is revoked, cryptographic materials in your physical Device are invalidated,\nand the Device can no longer participate in any MPCOperations of the DeviceGroups it was a part of.\nUse this API in scenarios such as losing the existing Device, switching to a new physical Device, etc.\nEnsure that a new Device is successfully added to your DeviceGroups using the AddDevice RPC before invoking\nthe RevokeDevice RPC.", + "file": "MPCKeyClient/RevokeDevice/main.go", + "language": "GO", + "clientMethod": { + "shortName": "RevokeDevice", + "fullName": "coinbase.cloud.mpc_keys.v1.MPCKeyClient.RevokeDevice", + "parameters": [ + { + "type": "context.Context", + "name": "ctx" + }, + { + "type": "mpc_keyspb.RevokeDeviceRequest", + "name": "req" + }, + { + "type": "...gax.CallOption", + "name": "opts" + } + ], + "client": { + "shortName": "MPCKeyClient", + "fullName": "coinbase.cloud.mpc_keys.v1.MPCKeyClient" + }, + "method": { + "shortName": "RevokeDevice", + "fullName": "coinbase.cloud.mpc_keys.v1.MPCKeyService.RevokeDevice", + "service": { + "shortName": "MPCKeyService", + "fullName": "coinbase.cloud.mpc_keys.v1.MPCKeyService" + } + } + }, + "origin": "API_DEFINITION", + "segments": [ + { + "start": 18, + "end": 51, + "type": "FULL" + } + ] } ] } \ No newline at end of file diff --git a/gen/go/coinbase/cloud/clients/v1/internal/snippets/snippet_metadata.coinbase.cloud.mpc_wallets.v1.json b/gen/go/coinbase/cloud/clients/v1/internal/snippets/snippet_metadata.coinbase.cloud.mpc_wallets.v1.json index c98921c..104e268 100644 --- a/gen/go/coinbase/cloud/clients/v1/internal/snippets/snippet_metadata.coinbase.cloud.mpc_wallets.v1.json +++ b/gen/go/coinbase/cloud/clients/v1/internal/snippets/snippet_metadata.coinbase.cloud.mpc_wallets.v1.json @@ -60,7 +60,7 @@ { "regionTag": "api_v1_generated_MPCWalletService_GenerateAddress_sync", "title": "api GenerateAddress Sample", - "description": "GenerateAddress generates an Address within an MPCWallet.", + "description": "GenerateAddress generates an Address within an MPCWallet. The Address values generated are identical across\nNetworks of the same protocol family (e.g. EVM). So, for example, calling GenerateAddress twice\nfor networks/ethereum-mainnet, and then calling it twice more for networks/ethereum-goerli, will\nresult in two pairs of identical addresses on Ethereum Mainnet and Goerli.", "file": "MPCWalletClient/GenerateAddress/main.go", "language": "GO", "clientMethod": { @@ -241,6 +241,52 @@ } ] }, + { + "regionTag": "api_v1_generated_MPCWalletService_ListBalanceDetails_sync", + "title": "api ListBalanceDetails Sample", + "description": "ListBalanceDetails returns a list of BalanceDetails.", + "file": "MPCWalletClient/ListBalanceDetails/main.go", + "language": "GO", + "clientMethod": { + "shortName": "ListBalanceDetails", + "fullName": "coinbase.cloud.mpc_wallets.v1.MPCWalletClient.ListBalanceDetails", + "parameters": [ + { + "type": "context.Context", + "name": "ctx" + }, + { + "type": "mpc_walletspb.ListBalanceDetailsRequest", + "name": "req" + }, + { + "type": "...gax.CallOption", + "name": "opts" + } + ], + "resultType": "BalanceDetailIterator", + "client": { + "shortName": "MPCWalletClient", + "fullName": "coinbase.cloud.mpc_wallets.v1.MPCWalletClient" + }, + "method": { + "shortName": "ListBalanceDetails", + "fullName": "coinbase.cloud.mpc_wallets.v1.MPCWalletService.ListBalanceDetails", + "service": { + "shortName": "MPCWalletService", + "fullName": "coinbase.cloud.mpc_wallets.v1.MPCWalletService" + } + } + }, + "origin": "API_DEFINITION", + "segments": [ + { + "start": 18, + "end": 60, + "type": "FULL" + } + ] + }, { "regionTag": "api_v1_generated_MPCWalletService_ListBalances_sync", "title": "api ListBalances Sample", diff --git a/gen/go/coinbase/cloud/clients/v1/internal/snippets/snippet_metadata.coinbase.cloud.protocols.v1.json b/gen/go/coinbase/cloud/clients/v1/internal/snippets/snippet_metadata.coinbase.cloud.protocols.v1.json index 4c143f7..3a130a7 100644 --- a/gen/go/coinbase/cloud/clients/v1/internal/snippets/snippet_metadata.coinbase.cloud.protocols.v1.json +++ b/gen/go/coinbase/cloud/clients/v1/internal/snippets/snippet_metadata.coinbase.cloud.protocols.v1.json @@ -148,6 +148,52 @@ "type": "FULL" } ] + }, + { + "regionTag": "api_v1_generated_ProtocolService_EstimateFee_sync", + "title": "api EstimateFee Sample", + "description": "EstimateFee estimates the current network fee for the specified Network. For EVM Networks, this\ncorresponds to the gas_price, max_fee_per_gas, and max_priority_fee_per_gas.", + "file": "ProtocolClient/EstimateFee/main.go", + "language": "GO", + "clientMethod": { + "shortName": "EstimateFee", + "fullName": "coinbase.cloud.protocols.v1.ProtocolClient.EstimateFee", + "parameters": [ + { + "type": "context.Context", + "name": "ctx" + }, + { + "type": "protocolspb.EstimateFeeRequest", + "name": "req" + }, + { + "type": "...gax.CallOption", + "name": "opts" + } + ], + "resultType": "*protocolspb.EstimateFeeResponse", + "client": { + "shortName": "ProtocolClient", + "fullName": "coinbase.cloud.protocols.v1.ProtocolClient" + }, + "method": { + "shortName": "EstimateFee", + "fullName": "coinbase.cloud.protocols.v1.ProtocolService.EstimateFee", + "service": { + "shortName": "ProtocolService", + "fullName": "coinbase.cloud.protocols.v1.ProtocolService" + } + } + }, + "origin": "API_DEFINITION", + "segments": [ + { + "start": 18, + "end": 53, + "type": "FULL" + } + ] } ] } \ No newline at end of file diff --git a/gen/go/coinbase/cloud/clients/v1/mpc_key_client.go b/gen/go/coinbase/cloud/clients/v1/mpc_key_client.go index f60122f..5730f3e 100644 --- a/gen/go/coinbase/cloud/clients/v1/mpc_key_client.go +++ b/gen/go/coinbase/cloud/clients/v1/mpc_key_client.go @@ -54,6 +54,10 @@ type MPCKeyCallOptions struct { CreateMPCKey []gax.CallOption GetMPCKey []gax.CallOption CreateSignature []gax.CallOption + PrepareDeviceArchive []gax.CallOption + PrepareDeviceBackup []gax.CallOption + AddDevice []gax.CallOption + RevokeDevice []gax.CallOption } func defaultMPCKeyGRPCClientOptions() []option.ClientOption { @@ -86,6 +90,14 @@ func defaultMPCKeyCallOptions() *MPCKeyCallOptions { }, CreateSignature: []gax.CallOption{ }, + PrepareDeviceArchive: []gax.CallOption{ + }, + PrepareDeviceBackup: []gax.CallOption{ + }, + AddDevice: []gax.CallOption{ + }, + RevokeDevice: []gax.CallOption{ + }, } } @@ -107,6 +119,14 @@ func defaultMPCKeyRESTCallOptions() *MPCKeyCallOptions { }, CreateSignature: []gax.CallOption{ }, + PrepareDeviceArchive: []gax.CallOption{ + }, + PrepareDeviceBackup: []gax.CallOption{ + }, + AddDevice: []gax.CallOption{ + }, + RevokeDevice: []gax.CallOption{ + }, } } @@ -125,6 +145,13 @@ type internalMPCKeyClient interface { GetMPCKey(context.Context, *mpc_keyspb.GetMPCKeyRequest, ...gax.CallOption) (*mpc_keyspb.MPCKey, error) CreateSignature(context.Context, *mpc_keyspb.CreateSignatureRequest, ...gax.CallOption) (*CreateSignatureOperation, error) CreateSignatureOperation(name string) *CreateSignatureOperation + PrepareDeviceArchive(context.Context, *mpc_keyspb.PrepareDeviceArchiveRequest, ...gax.CallOption) (*PrepareDeviceArchiveOperation, error) + PrepareDeviceArchiveOperation(name string) *PrepareDeviceArchiveOperation + PrepareDeviceBackup(context.Context, *mpc_keyspb.PrepareDeviceBackupRequest, ...gax.CallOption) (*PrepareDeviceBackupOperation, error) + PrepareDeviceBackupOperation(name string) *PrepareDeviceBackupOperation + AddDevice(context.Context, *mpc_keyspb.AddDeviceRequest, ...gax.CallOption) (*AddDeviceOperation, error) + AddDeviceOperation(name string) *AddDeviceOperation + RevokeDevice(context.Context, *mpc_keyspb.RevokeDeviceRequest, ...gax.CallOption) error } // MPCKeyClient is a client for interacting with . @@ -248,6 +275,71 @@ func (c *MPCKeyClient) CreateSignatureOperation(name string) *CreateSignatureOpe return c.internalClient.CreateSignatureOperation(name) } +// PrepareDeviceArchive prepares an archive in the local storage of the given Device. The archive contains cryptographic materials +// that can be used to export MPCKeys, which have the given DeviceGroup as their parent. +// The Device specified in the request must be a member of this DeviceGroup and must participate +// in the associated MPC operation for the archive to be prepared. After calling this, +// use ListMPCOperations to poll for the pending PrepareDeviceArchive operation, and use the WaaS SDK’s +// ComputeMPCOperation to complete the operation. Once the operation completes, the Device can utilize the +// WaaS SDK to export the private keys corresponding to each of the MPCKeys under this DeviceGroup. +func (c *MPCKeyClient) PrepareDeviceArchive(ctx context.Context, req *mpc_keyspb.PrepareDeviceArchiveRequest, opts ...gax.CallOption) (*PrepareDeviceArchiveOperation, error) { + return c.internalClient.PrepareDeviceArchive(ctx, req, opts...) +} + +// PrepareDeviceArchiveOperation returns a new PrepareDeviceArchiveOperation from a given name. +// The name must be that of a previously created PrepareDeviceArchiveOperation, possibly from a different process. +func (c *MPCKeyClient) PrepareDeviceArchiveOperation(name string) *PrepareDeviceArchiveOperation { + return c.internalClient.PrepareDeviceArchiveOperation(name) +} + +// PrepareDeviceBackup prepares a backup in the given Device. The backup contains certain cryptographic materials +// that can be used to restore MPCKeys, which have the given DeviceGroup as their parent, on a new Device. +// The Device specified in the request must be a member of this DeviceGroup and must participate in the associated +// MPC operation for the backup to be prepared. +// After calling this RPC, use ListMPCOperations to poll for the pending PrepareDeviceBackup operation, +// and use the WaaS SDK’s ComputeMPCOperation to complete the operation. Once the operation completes, +// the Device can utilize WaaS SDK to download the backup bundle. We recommend storing this backup bundle securely +// in a storage provider of your choice. If the user loses access to their existing Device and wants to recover +// MPCKeys in the given DeviceGroup on a new Device, use AddDevice RPC on the MPCKeyService. +func (c *MPCKeyClient) PrepareDeviceBackup(ctx context.Context, req *mpc_keyspb.PrepareDeviceBackupRequest, opts ...gax.CallOption) (*PrepareDeviceBackupOperation, error) { + return c.internalClient.PrepareDeviceBackup(ctx, req, opts...) +} + +// PrepareDeviceBackupOperation returns a new PrepareDeviceBackupOperation from a given name. +// The name must be that of a previously created PrepareDeviceBackupOperation, possibly from a different process. +func (c *MPCKeyClient) PrepareDeviceBackupOperation(name string) *PrepareDeviceBackupOperation { + return c.internalClient.PrepareDeviceBackupOperation(name) +} + +// AddDevice adds a Device to an existing DeviceGroup. Prior to this API being called, the Device must be registered using +// RegisterDevice RPC. The Device must have access to the backup created with PrepareDeviceBackup RPC to compute this +// operation. After calling this RPC, use ListMPCOperations to poll for the pending AddDevice operation, +// and use the WaaS SDK’s ComputeAddDeviceMPCOperation to complete the operation. +// After the operation is computed on WaaS SDK, the Device will have access to cryptographic materials +// required to process MPCOperations for this DeviceGroup. +// Once the operation completes on MPCKeyService, the Device will be added to the given DeviceGroup as a new member +// and all existing Devices in the DeviceGroup will stay functional. +// Use the RevokeDevice RPC to remove any of the existing Devices from the DeviceGroup. +func (c *MPCKeyClient) AddDevice(ctx context.Context, req *mpc_keyspb.AddDeviceRequest, opts ...gax.CallOption) (*AddDeviceOperation, error) { + return c.internalClient.AddDevice(ctx, req, opts...) +} + +// AddDeviceOperation returns a new AddDeviceOperation from a given name. +// The name must be that of a previously created AddDeviceOperation, possibly from a different process. +func (c *MPCKeyClient) AddDeviceOperation(name string) *AddDeviceOperation { + return c.internalClient.AddDeviceOperation(name) +} + +// RevokeDevice revokes a registered Device. This operation removes the registered Device from all the DeviceGroups that it is a +// part of. Once the Device is revoked, cryptographic materials in your physical Device are invalidated, +// and the Device can no longer participate in any MPCOperations of the DeviceGroups it was a part of. +// Use this API in scenarios such as losing the existing Device, switching to a new physical Device, etc. +// Ensure that a new Device is successfully added to your DeviceGroups using the AddDevice RPC before invoking +// the RevokeDevice RPC. +func (c *MPCKeyClient) RevokeDevice(ctx context.Context, req *mpc_keyspb.RevokeDeviceRequest, opts ...gax.CallOption) error { + return c.internalClient.RevokeDevice(ctx, req, opts...) +} + // mPCKeyGRPCClient is a client for interacting with over gRPC transport. // // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. @@ -606,6 +698,74 @@ func (c *mPCKeyGRPCClient) CreateSignature(ctx context.Context, req *mpc_keyspb. }, nil } +func (c *mPCKeyGRPCClient) PrepareDeviceArchive(ctx context.Context, req *mpc_keyspb.PrepareDeviceArchiveRequest, opts ...gax.CallOption) (*PrepareDeviceArchiveOperation, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "device_group", url.QueryEscape(req.GetDeviceGroup()))) + + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append((*c.CallOptions).PrepareDeviceArchive[0:len((*c.CallOptions).PrepareDeviceArchive):len((*c.CallOptions).PrepareDeviceArchive)], opts...) + var resp *longrunningpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.mPCKeyClient.PrepareDeviceArchive(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return &PrepareDeviceArchiveOperation{ + lro: longrunning.InternalNewOperation(*c.LROClient, resp), + }, nil +} + +func (c *mPCKeyGRPCClient) PrepareDeviceBackup(ctx context.Context, req *mpc_keyspb.PrepareDeviceBackupRequest, opts ...gax.CallOption) (*PrepareDeviceBackupOperation, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "device_group", url.QueryEscape(req.GetDeviceGroup()))) + + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append((*c.CallOptions).PrepareDeviceBackup[0:len((*c.CallOptions).PrepareDeviceBackup):len((*c.CallOptions).PrepareDeviceBackup)], opts...) + var resp *longrunningpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.mPCKeyClient.PrepareDeviceBackup(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return &PrepareDeviceBackupOperation{ + lro: longrunning.InternalNewOperation(*c.LROClient, resp), + }, nil +} + +func (c *mPCKeyGRPCClient) AddDevice(ctx context.Context, req *mpc_keyspb.AddDeviceRequest, opts ...gax.CallOption) (*AddDeviceOperation, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "device_group", url.QueryEscape(req.GetDeviceGroup()))) + + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append((*c.CallOptions).AddDevice[0:len((*c.CallOptions).AddDevice):len((*c.CallOptions).AddDevice)], opts...) + var resp *longrunningpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.mPCKeyClient.AddDevice(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return &AddDeviceOperation{ + lro: longrunning.InternalNewOperation(*c.LROClient, resp), + }, nil +} + +func (c *mPCKeyGRPCClient) RevokeDevice(ctx context.Context, req *mpc_keyspb.RevokeDeviceRequest, opts ...gax.CallOption) error { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append((*c.CallOptions).RevokeDevice[0:len((*c.CallOptions).RevokeDevice):len((*c.CallOptions).RevokeDevice)], opts...) + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + _, err = c.mPCKeyClient.RevokeDevice(ctx, req, settings.GRPC...) + return err + }, opts...) + return err +} + // RegisterDevice registers a new Device. A Device must be registered before it can be added to a DeviceGroup. func (c *mPCKeyRESTClient) RegisterDevice(ctx context.Context, req *mpc_keyspb.RegisterDeviceRequest, opts ...gax.CallOption) (*mpc_keyspb.Device, error) { m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} @@ -1089,6 +1249,342 @@ func (c *mPCKeyRESTClient) CreateSignature(ctx context.Context, req *mpc_keyspb. }, nil } +// PrepareDeviceArchive prepares an archive in the local storage of the given Device. The archive contains cryptographic materials +// that can be used to export MPCKeys, which have the given DeviceGroup as their parent. +// The Device specified in the request must be a member of this DeviceGroup and must participate +// in the associated MPC operation for the archive to be prepared. After calling this, +// use ListMPCOperations to poll for the pending PrepareDeviceArchive operation, and use the WaaS SDK’s +// ComputeMPCOperation to complete the operation. Once the operation completes, the Device can utilize the +// WaaS SDK to export the private keys corresponding to each of the MPCKeys under this DeviceGroup. +func (c *mPCKeyRESTClient) PrepareDeviceArchive(ctx context.Context, req *mpc_keyspb.PrepareDeviceArchiveRequest, opts ...gax.CallOption) (*PrepareDeviceArchiveOperation, error) { + m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} + jsonReq, err := m.Marshal(req) + if err != nil { + return nil, err + } + + baseUrl, err := url.Parse(c.endpoint) + if err != nil { + return nil, err + } + baseUrl.Path += fmt.Sprintf("/v1/%v:prepareDeviceArchive", req.GetDeviceGroup()) + + // Build HTTP headers from client and context metadata. + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "device_group", url.QueryEscape(req.GetDeviceGroup()))) + + headers := buildHeaders(ctx, c.xGoogMetadata, md, metadata.Pairs("Content-Type", "application/json")) + unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} + resp := &longrunningpb.Operation{} + e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + if settings.Path != "" { + baseUrl.Path = settings.Path + } + httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) + if err != nil { + return err + } + httpReq = httpReq.WithContext(ctx) + httpReq.Header = headers + + httpRsp, err := c.httpClient.Do(httpReq) + if err != nil{ + return err + } + defer httpRsp.Body.Close() + + if err = googleapi.CheckResponse(httpRsp); err != nil { + return err + } + + buf, err := ioutil.ReadAll(httpRsp.Body) + if err != nil { + return err + } + + if err := unm.Unmarshal(buf, resp); err != nil { + return maybeUnknownEnum(err) + } + + return nil + }, opts...) + if e != nil { + return nil, e + } + + override := fmt.Sprintf("/v1/%s", resp.GetName()) + return &PrepareDeviceArchiveOperation{ + lro: longrunning.InternalNewOperation(*c.LROClient, resp), + pollPath: override, + }, nil +} + +// PrepareDeviceBackup prepares a backup in the given Device. The backup contains certain cryptographic materials +// that can be used to restore MPCKeys, which have the given DeviceGroup as their parent, on a new Device. +// The Device specified in the request must be a member of this DeviceGroup and must participate in the associated +// MPC operation for the backup to be prepared. +// After calling this RPC, use ListMPCOperations to poll for the pending PrepareDeviceBackup operation, +// and use the WaaS SDK’s ComputeMPCOperation to complete the operation. Once the operation completes, +// the Device can utilize WaaS SDK to download the backup bundle. We recommend storing this backup bundle securely +// in a storage provider of your choice. If the user loses access to their existing Device and wants to recover +// MPCKeys in the given DeviceGroup on a new Device, use AddDevice RPC on the MPCKeyService. +func (c *mPCKeyRESTClient) PrepareDeviceBackup(ctx context.Context, req *mpc_keyspb.PrepareDeviceBackupRequest, opts ...gax.CallOption) (*PrepareDeviceBackupOperation, error) { + m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} + jsonReq, err := m.Marshal(req) + if err != nil { + return nil, err + } + + baseUrl, err := url.Parse(c.endpoint) + if err != nil { + return nil, err + } + baseUrl.Path += fmt.Sprintf("/v1/%v:prepareDeviceBackup", req.GetDeviceGroup()) + + // Build HTTP headers from client and context metadata. + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "device_group", url.QueryEscape(req.GetDeviceGroup()))) + + headers := buildHeaders(ctx, c.xGoogMetadata, md, metadata.Pairs("Content-Type", "application/json")) + unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} + resp := &longrunningpb.Operation{} + e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + if settings.Path != "" { + baseUrl.Path = settings.Path + } + httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) + if err != nil { + return err + } + httpReq = httpReq.WithContext(ctx) + httpReq.Header = headers + + httpRsp, err := c.httpClient.Do(httpReq) + if err != nil{ + return err + } + defer httpRsp.Body.Close() + + if err = googleapi.CheckResponse(httpRsp); err != nil { + return err + } + + buf, err := ioutil.ReadAll(httpRsp.Body) + if err != nil { + return err + } + + if err := unm.Unmarshal(buf, resp); err != nil { + return maybeUnknownEnum(err) + } + + return nil + }, opts...) + if e != nil { + return nil, e + } + + override := fmt.Sprintf("/v1/%s", resp.GetName()) + return &PrepareDeviceBackupOperation{ + lro: longrunning.InternalNewOperation(*c.LROClient, resp), + pollPath: override, + }, nil +} + +// AddDevice adds a Device to an existing DeviceGroup. Prior to this API being called, the Device must be registered using +// RegisterDevice RPC. The Device must have access to the backup created with PrepareDeviceBackup RPC to compute this +// operation. After calling this RPC, use ListMPCOperations to poll for the pending AddDevice operation, +// and use the WaaS SDK’s ComputeAddDeviceMPCOperation to complete the operation. +// After the operation is computed on WaaS SDK, the Device will have access to cryptographic materials +// required to process MPCOperations for this DeviceGroup. +// Once the operation completes on MPCKeyService, the Device will be added to the given DeviceGroup as a new member +// and all existing Devices in the DeviceGroup will stay functional. +// Use the RevokeDevice RPC to remove any of the existing Devices from the DeviceGroup. +func (c *mPCKeyRESTClient) AddDevice(ctx context.Context, req *mpc_keyspb.AddDeviceRequest, opts ...gax.CallOption) (*AddDeviceOperation, error) { + m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} + jsonReq, err := m.Marshal(req) + if err != nil { + return nil, err + } + + baseUrl, err := url.Parse(c.endpoint) + if err != nil { + return nil, err + } + baseUrl.Path += fmt.Sprintf("/v1/%v:addDevice", req.GetDeviceGroup()) + + // Build HTTP headers from client and context metadata. + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "device_group", url.QueryEscape(req.GetDeviceGroup()))) + + headers := buildHeaders(ctx, c.xGoogMetadata, md, metadata.Pairs("Content-Type", "application/json")) + unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} + resp := &longrunningpb.Operation{} + e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + if settings.Path != "" { + baseUrl.Path = settings.Path + } + httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) + if err != nil { + return err + } + httpReq = httpReq.WithContext(ctx) + httpReq.Header = headers + + httpRsp, err := c.httpClient.Do(httpReq) + if err != nil{ + return err + } + defer httpRsp.Body.Close() + + if err = googleapi.CheckResponse(httpRsp); err != nil { + return err + } + + buf, err := ioutil.ReadAll(httpRsp.Body) + if err != nil { + return err + } + + if err := unm.Unmarshal(buf, resp); err != nil { + return maybeUnknownEnum(err) + } + + return nil + }, opts...) + if e != nil { + return nil, e + } + + override := fmt.Sprintf("/v1/%s", resp.GetName()) + return &AddDeviceOperation{ + lro: longrunning.InternalNewOperation(*c.LROClient, resp), + pollPath: override, + }, nil +} + +// RevokeDevice revokes a registered Device. This operation removes the registered Device from all the DeviceGroups that it is a +// part of. Once the Device is revoked, cryptographic materials in your physical Device are invalidated, +// and the Device can no longer participate in any MPCOperations of the DeviceGroups it was a part of. +// Use this API in scenarios such as losing the existing Device, switching to a new physical Device, etc. +// Ensure that a new Device is successfully added to your DeviceGroups using the AddDevice RPC before invoking +// the RevokeDevice RPC. +func (c *mPCKeyRESTClient) RevokeDevice(ctx context.Context, req *mpc_keyspb.RevokeDeviceRequest, opts ...gax.CallOption) error { + m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} + jsonReq, err := m.Marshal(req) + if err != nil { + return err + } + + baseUrl, err := url.Parse(c.endpoint) + if err != nil { + return err + } + baseUrl.Path += fmt.Sprintf("/v1/device:revoke") + + // Build HTTP headers from client and context metadata. + headers := buildHeaders(ctx, c.xGoogMetadata, metadata.Pairs("Content-Type", "application/json")) + return gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + if settings.Path != "" { + baseUrl.Path = settings.Path + } + httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) + if err != nil { + return err + } + httpReq = httpReq.WithContext(ctx) + httpReq.Header = headers + + httpRsp, err := c.httpClient.Do(httpReq) + if err != nil{ + return err + } + defer httpRsp.Body.Close() + + // Returns nil if there is no error, otherwise wraps + // the response code and body into a non-nil error + return googleapi.CheckResponse(httpRsp) + }, opts...) +} +// AddDeviceOperation manages a long-running operation from AddDevice. +type AddDeviceOperation struct { + lro *longrunning.Operation + pollPath string +} + +// AddDeviceOperation returns a new AddDeviceOperation from a given name. +// The name must be that of a previously created AddDeviceOperation, possibly from a different process. +func (c *mPCKeyGRPCClient) AddDeviceOperation(name string) *AddDeviceOperation { + return &AddDeviceOperation{ + lro: longrunning.InternalNewOperation(*c.LROClient, &longrunningpb.Operation{Name: name}), + } +} + +// AddDeviceOperation returns a new AddDeviceOperation from a given name. +// The name must be that of a previously created AddDeviceOperation, possibly from a different process. +func (c *mPCKeyRESTClient) AddDeviceOperation(name string) *AddDeviceOperation { + override := fmt.Sprintf("/v1/%s", name) + return &AddDeviceOperation{ + lro: longrunning.InternalNewOperation(*c.LROClient, &longrunningpb.Operation{Name: name}), + pollPath: override, + } +} + +// Wait blocks until the long-running operation is completed, returning the response and any errors encountered. +// +// See documentation of Poll for error-handling information. +func (op *AddDeviceOperation) Wait(ctx context.Context, opts ...gax.CallOption) (*mpc_keyspb.DeviceGroup, error) { + opts = append([]gax.CallOption{gax.WithPath(op.pollPath)}, opts...) + var resp mpc_keyspb.DeviceGroup + if err := op.lro.WaitWithInterval(ctx, &resp, time.Minute, opts...); err != nil { + return nil, err + } + return &resp, nil +} + +// Poll fetches the latest state of the long-running operation. +// +// Poll also fetches the latest metadata, which can be retrieved by Metadata. +// +// If Poll fails, the error is returned and op is unmodified. If Poll succeeds and +// the operation has completed with failure, the error is returned and op.Done will return true. +// If Poll succeeds and the operation has completed successfully, +// op.Done will return true, and the response of the operation is returned. +// If Poll succeeds and the operation has not completed, the returned response and error are both nil. +func (op *AddDeviceOperation) Poll(ctx context.Context, opts ...gax.CallOption) (*mpc_keyspb.DeviceGroup, error) { + opts = append([]gax.CallOption{gax.WithPath(op.pollPath)}, opts...) + var resp mpc_keyspb.DeviceGroup + if err := op.lro.Poll(ctx, &resp, opts...); err != nil { + return nil, err + } + if !op.Done() { + return nil, nil + } + return &resp, nil +} + +// Metadata returns metadata associated with the long-running operation. +// Metadata itself does not contact the server, but Poll does. +// To get the latest metadata, call this method after a successful call to Poll. +// If the metadata is not available, the returned metadata and error are both nil. +func (op *AddDeviceOperation) Metadata() (*mpc_keyspb.AddDeviceMetadata, error) { + var meta mpc_keyspb.AddDeviceMetadata + if err := op.lro.Metadata(&meta); err == longrunning.ErrNoMetadata { + return nil, nil + } else if err != nil { + return nil, err + } + return &meta, nil +} + +// Done reports whether the long-running operation has completed. +func (op *AddDeviceOperation) Done() bool { + return op.lro.Done() +} + +// Name returns the name of the long-running operation. +// The name is assigned by the server and is unique within the service from which the operation is created. +func (op *AddDeviceOperation) Name() string { + return op.lro.Name() +} + // CreateDeviceGroupOperation manages a long-running operation from CreateDeviceGroup. type CreateDeviceGroupOperation struct { lro *longrunning.Operation @@ -1252,3 +1748,167 @@ func (op *CreateSignatureOperation) Done() bool { func (op *CreateSignatureOperation) Name() string { return op.lro.Name() } + +// PrepareDeviceArchiveOperation manages a long-running operation from PrepareDeviceArchive. +type PrepareDeviceArchiveOperation struct { + lro *longrunning.Operation + pollPath string +} + +// PrepareDeviceArchiveOperation returns a new PrepareDeviceArchiveOperation from a given name. +// The name must be that of a previously created PrepareDeviceArchiveOperation, possibly from a different process. +func (c *mPCKeyGRPCClient) PrepareDeviceArchiveOperation(name string) *PrepareDeviceArchiveOperation { + return &PrepareDeviceArchiveOperation{ + lro: longrunning.InternalNewOperation(*c.LROClient, &longrunningpb.Operation{Name: name}), + } +} + +// PrepareDeviceArchiveOperation returns a new PrepareDeviceArchiveOperation from a given name. +// The name must be that of a previously created PrepareDeviceArchiveOperation, possibly from a different process. +func (c *mPCKeyRESTClient) PrepareDeviceArchiveOperation(name string) *PrepareDeviceArchiveOperation { + override := fmt.Sprintf("/v1/%s", name) + return &PrepareDeviceArchiveOperation{ + lro: longrunning.InternalNewOperation(*c.LROClient, &longrunningpb.Operation{Name: name}), + pollPath: override, + } +} + +// Wait blocks until the long-running operation is completed, returning the response and any errors encountered. +// +// See documentation of Poll for error-handling information. +func (op *PrepareDeviceArchiveOperation) Wait(ctx context.Context, opts ...gax.CallOption) (*mpc_keyspb.DeviceGroup, error) { + opts = append([]gax.CallOption{gax.WithPath(op.pollPath)}, opts...) + var resp mpc_keyspb.DeviceGroup + if err := op.lro.WaitWithInterval(ctx, &resp, time.Minute, opts...); err != nil { + return nil, err + } + return &resp, nil +} + +// Poll fetches the latest state of the long-running operation. +// +// Poll also fetches the latest metadata, which can be retrieved by Metadata. +// +// If Poll fails, the error is returned and op is unmodified. If Poll succeeds and +// the operation has completed with failure, the error is returned and op.Done will return true. +// If Poll succeeds and the operation has completed successfully, +// op.Done will return true, and the response of the operation is returned. +// If Poll succeeds and the operation has not completed, the returned response and error are both nil. +func (op *PrepareDeviceArchiveOperation) Poll(ctx context.Context, opts ...gax.CallOption) (*mpc_keyspb.DeviceGroup, error) { + opts = append([]gax.CallOption{gax.WithPath(op.pollPath)}, opts...) + var resp mpc_keyspb.DeviceGroup + if err := op.lro.Poll(ctx, &resp, opts...); err != nil { + return nil, err + } + if !op.Done() { + return nil, nil + } + return &resp, nil +} + +// Metadata returns metadata associated with the long-running operation. +// Metadata itself does not contact the server, but Poll does. +// To get the latest metadata, call this method after a successful call to Poll. +// If the metadata is not available, the returned metadata and error are both nil. +func (op *PrepareDeviceArchiveOperation) Metadata() (*mpc_keyspb.PrepareDeviceArchiveMetadata, error) { + var meta mpc_keyspb.PrepareDeviceArchiveMetadata + if err := op.lro.Metadata(&meta); err == longrunning.ErrNoMetadata { + return nil, nil + } else if err != nil { + return nil, err + } + return &meta, nil +} + +// Done reports whether the long-running operation has completed. +func (op *PrepareDeviceArchiveOperation) Done() bool { + return op.lro.Done() +} + +// Name returns the name of the long-running operation. +// The name is assigned by the server and is unique within the service from which the operation is created. +func (op *PrepareDeviceArchiveOperation) Name() string { + return op.lro.Name() +} + +// PrepareDeviceBackupOperation manages a long-running operation from PrepareDeviceBackup. +type PrepareDeviceBackupOperation struct { + lro *longrunning.Operation + pollPath string +} + +// PrepareDeviceBackupOperation returns a new PrepareDeviceBackupOperation from a given name. +// The name must be that of a previously created PrepareDeviceBackupOperation, possibly from a different process. +func (c *mPCKeyGRPCClient) PrepareDeviceBackupOperation(name string) *PrepareDeviceBackupOperation { + return &PrepareDeviceBackupOperation{ + lro: longrunning.InternalNewOperation(*c.LROClient, &longrunningpb.Operation{Name: name}), + } +} + +// PrepareDeviceBackupOperation returns a new PrepareDeviceBackupOperation from a given name. +// The name must be that of a previously created PrepareDeviceBackupOperation, possibly from a different process. +func (c *mPCKeyRESTClient) PrepareDeviceBackupOperation(name string) *PrepareDeviceBackupOperation { + override := fmt.Sprintf("/v1/%s", name) + return &PrepareDeviceBackupOperation{ + lro: longrunning.InternalNewOperation(*c.LROClient, &longrunningpb.Operation{Name: name}), + pollPath: override, + } +} + +// Wait blocks until the long-running operation is completed, returning the response and any errors encountered. +// +// See documentation of Poll for error-handling information. +func (op *PrepareDeviceBackupOperation) Wait(ctx context.Context, opts ...gax.CallOption) (*mpc_keyspb.DeviceGroup, error) { + opts = append([]gax.CallOption{gax.WithPath(op.pollPath)}, opts...) + var resp mpc_keyspb.DeviceGroup + if err := op.lro.WaitWithInterval(ctx, &resp, time.Minute, opts...); err != nil { + return nil, err + } + return &resp, nil +} + +// Poll fetches the latest state of the long-running operation. +// +// Poll also fetches the latest metadata, which can be retrieved by Metadata. +// +// If Poll fails, the error is returned and op is unmodified. If Poll succeeds and +// the operation has completed with failure, the error is returned and op.Done will return true. +// If Poll succeeds and the operation has completed successfully, +// op.Done will return true, and the response of the operation is returned. +// If Poll succeeds and the operation has not completed, the returned response and error are both nil. +func (op *PrepareDeviceBackupOperation) Poll(ctx context.Context, opts ...gax.CallOption) (*mpc_keyspb.DeviceGroup, error) { + opts = append([]gax.CallOption{gax.WithPath(op.pollPath)}, opts...) + var resp mpc_keyspb.DeviceGroup + if err := op.lro.Poll(ctx, &resp, opts...); err != nil { + return nil, err + } + if !op.Done() { + return nil, nil + } + return &resp, nil +} + +// Metadata returns metadata associated with the long-running operation. +// Metadata itself does not contact the server, but Poll does. +// To get the latest metadata, call this method after a successful call to Poll. +// If the metadata is not available, the returned metadata and error are both nil. +func (op *PrepareDeviceBackupOperation) Metadata() (*mpc_keyspb.PrepareDeviceBackupMetadata, error) { + var meta mpc_keyspb.PrepareDeviceBackupMetadata + if err := op.lro.Metadata(&meta); err == longrunning.ErrNoMetadata { + return nil, nil + } else if err != nil { + return nil, err + } + return &meta, nil +} + +// Done reports whether the long-running operation has completed. +func (op *PrepareDeviceBackupOperation) Done() bool { + return op.lro.Done() +} + +// Name returns the name of the long-running operation. +// The name is assigned by the server and is unique within the service from which the operation is created. +func (op *PrepareDeviceBackupOperation) Name() string { + return op.lro.Name() +} diff --git a/gen/go/coinbase/cloud/clients/v1/mpc_key_client_example_test.go b/gen/go/coinbase/cloud/clients/v1/mpc_key_client_example_test.go index 6e8680a..128ca5f 100644 --- a/gen/go/coinbase/cloud/clients/v1/mpc_key_client_example_test.go +++ b/gen/go/coinbase/cloud/clients/v1/mpc_key_client_example_test.go @@ -267,3 +267,116 @@ func ExampleMPCKeyClient_CreateSignature() { // TODO: Use resp. _ = resp } + +func ExampleMPCKeyClient_PrepareDeviceArchive() { + ctx := context.Background() + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in: + // https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options + c, err := v1.NewMPCKeyClient(ctx) + if err != nil { + // TODO: Handle error. + } + defer c.Close() + + req := &mpc_keyspb.PrepareDeviceArchiveRequest{ + // TODO: Fill request struct fields. + // See https://pkg.go.dev/github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/mpc_keys/v1#PrepareDeviceArchiveRequest. + } + op, err := c.PrepareDeviceArchive(ctx, req) + if err != nil { + // TODO: Handle error. + } + + resp, err := op.Wait(ctx) + if err != nil { + // TODO: Handle error. + } + // TODO: Use resp. + _ = resp +} + +func ExampleMPCKeyClient_PrepareDeviceBackup() { + ctx := context.Background() + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in: + // https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options + c, err := v1.NewMPCKeyClient(ctx) + if err != nil { + // TODO: Handle error. + } + defer c.Close() + + req := &mpc_keyspb.PrepareDeviceBackupRequest{ + // TODO: Fill request struct fields. + // See https://pkg.go.dev/github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/mpc_keys/v1#PrepareDeviceBackupRequest. + } + op, err := c.PrepareDeviceBackup(ctx, req) + if err != nil { + // TODO: Handle error. + } + + resp, err := op.Wait(ctx) + if err != nil { + // TODO: Handle error. + } + // TODO: Use resp. + _ = resp +} + +func ExampleMPCKeyClient_AddDevice() { + ctx := context.Background() + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in: + // https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options + c, err := v1.NewMPCKeyClient(ctx) + if err != nil { + // TODO: Handle error. + } + defer c.Close() + + req := &mpc_keyspb.AddDeviceRequest{ + // TODO: Fill request struct fields. + // See https://pkg.go.dev/github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/mpc_keys/v1#AddDeviceRequest. + } + op, err := c.AddDevice(ctx, req) + if err != nil { + // TODO: Handle error. + } + + resp, err := op.Wait(ctx) + if err != nil { + // TODO: Handle error. + } + // TODO: Use resp. + _ = resp +} + +func ExampleMPCKeyClient_RevokeDevice() { + ctx := context.Background() + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in: + // https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options + c, err := v1.NewMPCKeyClient(ctx) + if err != nil { + // TODO: Handle error. + } + defer c.Close() + + req := &mpc_keyspb.RevokeDeviceRequest{ + // TODO: Fill request struct fields. + // See https://pkg.go.dev/github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/mpc_keys/v1#RevokeDeviceRequest. + } + err = c.RevokeDevice(ctx, req) + if err != nil { + // TODO: Handle error. + } +} diff --git a/gen/go/coinbase/cloud/clients/v1/mpc_wallet_client.go b/gen/go/coinbase/cloud/clients/v1/mpc_wallet_client.go index cf10106..442760a 100644 --- a/gen/go/coinbase/cloud/clients/v1/mpc_wallet_client.go +++ b/gen/go/coinbase/cloud/clients/v1/mpc_wallet_client.go @@ -55,6 +55,7 @@ type MPCWalletCallOptions struct { GetAddress []gax.CallOption ListAddresses []gax.CallOption ListBalances []gax.CallOption + ListBalanceDetails []gax.CallOption } func defaultMPCWalletGRPCClientOptions() []option.ClientOption { @@ -85,6 +86,8 @@ func defaultMPCWalletCallOptions() *MPCWalletCallOptions { }, ListBalances: []gax.CallOption{ }, + ListBalanceDetails: []gax.CallOption{ + }, } } @@ -104,6 +107,8 @@ func defaultMPCWalletRESTCallOptions() *MPCWalletCallOptions { }, ListBalances: []gax.CallOption{ }, + ListBalanceDetails: []gax.CallOption{ + }, } } @@ -120,6 +125,7 @@ type internalMPCWalletClient interface { GetAddress(context.Context, *mpc_walletspb.GetAddressRequest, ...gax.CallOption) (*mpc_walletspb.Address, error) ListAddresses(context.Context, *mpc_walletspb.ListAddressesRequest, ...gax.CallOption) *AddressIterator ListBalances(context.Context, *mpc_walletspb.ListBalancesRequest, ...gax.CallOption) *BalanceIterator + ListBalanceDetails(context.Context, *mpc_walletspb.ListBalanceDetailsRequest, ...gax.CallOption) *BalanceDetailIterator } // MPCWalletClient is a client for interacting with . @@ -191,7 +197,10 @@ func (c *MPCWalletClient) ListMPCWallets(ctx context.Context, req *mpc_walletspb return c.internalClient.ListMPCWallets(ctx, req, opts...) } -// GenerateAddress generates an Address within an MPCWallet. +// GenerateAddress generates an Address within an MPCWallet. The Address values generated are identical across +// Networks of the same protocol family (e.g. EVM). So, for example, calling GenerateAddress twice +// for networks/ethereum-mainnet, and then calling it twice more for networks/ethereum-goerli, will +// result in two pairs of identical addresses on Ethereum Mainnet and Goerli. func (c *MPCWalletClient) GenerateAddress(ctx context.Context, req *mpc_walletspb.GenerateAddressRequest, opts ...gax.CallOption) (*mpc_walletspb.Address, error) { return c.internalClient.GenerateAddress(ctx, req, opts...) } @@ -211,6 +220,11 @@ func (c *MPCWalletClient) ListBalances(ctx context.Context, req *mpc_walletspb.L return c.internalClient.ListBalances(ctx, req, opts...) } +// ListBalanceDetails returns a list of BalanceDetails. +func (c *MPCWalletClient) ListBalanceDetails(ctx context.Context, req *mpc_walletspb.ListBalanceDetailsRequest, opts ...gax.CallOption) *BalanceDetailIterator { + return c.internalClient.ListBalanceDetails(ctx, req, opts...) +} + // mPCWalletGRPCClient is a client for interacting with over gRPC transport. // // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. @@ -602,6 +616,51 @@ func (c *mPCWalletGRPCClient) ListBalances(ctx context.Context, req *mpc_wallets return it } +func (c *mPCWalletGRPCClient) ListBalanceDetails(ctx context.Context, req *mpc_walletspb.ListBalanceDetailsRequest, opts ...gax.CallOption) *BalanceDetailIterator { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))) + + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append((*c.CallOptions).ListBalanceDetails[0:len((*c.CallOptions).ListBalanceDetails):len((*c.CallOptions).ListBalanceDetails)], opts...) + it := &BalanceDetailIterator{} + req = proto.Clone(req).(*mpc_walletspb.ListBalanceDetailsRequest) + it.InternalFetch = func(pageSize int, pageToken string) ([]*mpc_walletspb.BalanceDetail, string, error) { + resp := &mpc_walletspb.ListBalanceDetailsResponse{} + if pageToken != "" { + req.PageToken = pageToken + } + if pageSize > math.MaxInt32 { + req.PageSize = math.MaxInt32 + } else if pageSize != 0 { + req.PageSize = int32(pageSize) + } + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.mPCWalletClient.ListBalanceDetails(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, "", err + } + + it.Response = resp + return resp.GetBalanceDetails(), resp.GetNextPageToken(), nil + } + fetch := func(pageSize int, pageToken string) (string, error) { + items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) + if err != nil { + return "", err + } + it.items = append(it.items, items...) + return nextPageToken, nil + } + + it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) + it.pageInfo.MaxSize = int(req.GetPageSize()) + it.pageInfo.Token = req.GetPageToken() + + return it +} + // CreateMPCWallet creates an MPCWallet. The Device in the request must have been registered using MPCKeyService’s // RegisterDevice before this method is called. Under the hood, this calls MPCKeyService’s // CreateDeviceGroup with the appropriate parameters. After calling this, use MPCKeyService’s @@ -816,7 +875,10 @@ func (c *mPCWalletRESTClient) ListMPCWallets(ctx context.Context, req *mpc_walle return it } -// GenerateAddress generates an Address within an MPCWallet. +// GenerateAddress generates an Address within an MPCWallet. The Address values generated are identical across +// Networks of the same protocol family (e.g. EVM). So, for example, calling GenerateAddress twice +// for networks/ethereum-mainnet, and then calling it twice more for networks/ethereum-goerli, will +// result in two pairs of identical addresses on Ethereum Mainnet and Goerli. func (c *mPCWalletRESTClient) GenerateAddress(ctx context.Context, req *mpc_walletspb.GenerateAddressRequest, opts ...gax.CallOption) (*mpc_walletspb.Address, error) { m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} jsonReq, err := m.Marshal(req) @@ -1101,6 +1163,92 @@ func (c *mPCWalletRESTClient) ListBalances(ctx context.Context, req *mpc_wallets return it } +// ListBalanceDetails returns a list of BalanceDetails. +func (c *mPCWalletRESTClient) ListBalanceDetails(ctx context.Context, req *mpc_walletspb.ListBalanceDetailsRequest, opts ...gax.CallOption) *BalanceDetailIterator { + it := &BalanceDetailIterator{} + req = proto.Clone(req).(*mpc_walletspb.ListBalanceDetailsRequest) + unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} + it.InternalFetch = func(pageSize int, pageToken string) ([]*mpc_walletspb.BalanceDetail, string, error) { + resp := &mpc_walletspb.ListBalanceDetailsResponse{} + if pageToken != "" { + req.PageToken = pageToken + } + if pageSize > math.MaxInt32 { + req.PageSize = math.MaxInt32 + } else if pageSize != 0 { + req.PageSize = int32(pageSize) + } + baseUrl, err := url.Parse(c.endpoint) + if err != nil { + return nil, "", err + } + baseUrl.Path += fmt.Sprintf("/v1/%v/balanceDetails", req.GetParent()) + + params := url.Values{} + if req.GetPageSize() != 0 { + params.Add("pageSize", fmt.Sprintf("%v", req.GetPageSize())) + } + if req.GetPageToken() != "" { + params.Add("pageToken", fmt.Sprintf("%v", req.GetPageToken())) + } + + baseUrl.RawQuery = params.Encode() + + // Build HTTP headers from client and context metadata. + headers := buildHeaders(ctx, c.xGoogMetadata, metadata.Pairs("Content-Type", "application/json")) + e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + if settings.Path != "" { + baseUrl.Path = settings.Path + } + httpReq, err := http.NewRequest("GET", baseUrl.String(), nil) + if err != nil { + return err + } + httpReq.Header = headers + + httpRsp, err := c.httpClient.Do(httpReq) + if err != nil{ + return err + } + defer httpRsp.Body.Close() + + if err = googleapi.CheckResponse(httpRsp); err != nil { + return err + } + + buf, err := ioutil.ReadAll(httpRsp.Body) + if err != nil { + return err + } + + if err := unm.Unmarshal(buf, resp); err != nil { + return maybeUnknownEnum(err) + } + + return nil + }, opts...) + if e != nil { + return nil, "", e + } + it.Response = resp + return resp.GetBalanceDetails(), resp.GetNextPageToken(), nil + } + + fetch := func(pageSize int, pageToken string) (string, error) { + items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) + if err != nil { + return "", err + } + it.items = append(it.items, items...) + return nextPageToken, nil + } + + it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) + it.pageInfo.MaxSize = int(req.GetPageSize()) + it.pageInfo.Token = req.GetPageToken() + + return it +} // CreateMPCWalletOperation manages a long-running operation from CreateMPCWallet. type CreateMPCWalletOperation struct { lro *longrunning.Operation @@ -1230,6 +1378,53 @@ func (it *AddressIterator) takeBuf() interface{} { return b } +// BalanceDetailIterator manages a stream of *mpc_walletspb.BalanceDetail. +type BalanceDetailIterator struct { + items []*mpc_walletspb.BalanceDetail + pageInfo *iterator.PageInfo + nextFunc func() error + + // Response is the raw response for the current page. + // It must be cast to the RPC response type. + // Calling Next() or InternalFetch() updates this value. + Response interface{} + + // InternalFetch is for use by the Google Cloud Libraries only. + // It is not part of the stable interface of this package. + // + // InternalFetch returns results from a single call to the underlying RPC. + // The number of results is no greater than pageSize. + // If there are no more results, nextPageToken is empty and err is nil. + InternalFetch func(pageSize int, pageToken string) (results []*mpc_walletspb.BalanceDetail, nextPageToken string, err error) +} + +// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. +func (it *BalanceDetailIterator) PageInfo() *iterator.PageInfo { + return it.pageInfo +} + +// Next returns the next result. Its second return value is iterator.Done if there are no more +// results. Once Next returns Done, all subsequent calls will return Done. +func (it *BalanceDetailIterator) Next() (*mpc_walletspb.BalanceDetail, error) { + var item *mpc_walletspb.BalanceDetail + if err := it.nextFunc(); err != nil { + return item, err + } + item = it.items[0] + it.items = it.items[1:] + return item, nil +} + +func (it *BalanceDetailIterator) bufLen() int { + return len(it.items) +} + +func (it *BalanceDetailIterator) takeBuf() interface{} { + b := it.items + it.items = nil + return b +} + // BalanceIterator manages a stream of *mpc_walletspb.Balance. type BalanceIterator struct { items []*mpc_walletspb.Balance diff --git a/gen/go/coinbase/cloud/clients/v1/mpc_wallet_client_example_test.go b/gen/go/coinbase/cloud/clients/v1/mpc_wallet_client_example_test.go index 019d0e5..56eb903 100644 --- a/gen/go/coinbase/cloud/clients/v1/mpc_wallet_client_example_test.go +++ b/gen/go/coinbase/cloud/clients/v1/mpc_wallet_client_example_test.go @@ -256,3 +256,34 @@ func ExampleMPCWalletClient_ListBalances() { _ = resp } } + +func ExampleMPCWalletClient_ListBalanceDetails() { + ctx := context.Background() + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in: + // https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options + c, err := v1.NewMPCWalletClient(ctx) + if err != nil { + // TODO: Handle error. + } + defer c.Close() + + req := &mpc_walletspb.ListBalanceDetailsRequest{ + // TODO: Fill request struct fields. + // See https://pkg.go.dev/github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/mpc_wallets/v1#ListBalanceDetailsRequest. + } + it := c.ListBalanceDetails(ctx, req) + for { + resp, err := it.Next() + if err == iterator.Done { + break + } + if err != nil { + // TODO: Handle error. + } + // TODO: Use resp. + _ = resp + } +} diff --git a/gen/go/coinbase/cloud/clients/v1/protocol_client.go b/gen/go/coinbase/cloud/clients/v1/protocol_client.go index 9e6b971..3b7a2d0 100644 --- a/gen/go/coinbase/cloud/clients/v1/protocol_client.go +++ b/gen/go/coinbase/cloud/clients/v1/protocol_client.go @@ -46,6 +46,7 @@ type ProtocolCallOptions struct { ConstructTransaction []gax.CallOption ConstructTransferTransaction []gax.CallOption BroadcastTransaction []gax.CallOption + EstimateFee []gax.CallOption } func defaultProtocolGRPCClientOptions() []option.ClientOption { @@ -68,6 +69,8 @@ func defaultProtocolCallOptions() *ProtocolCallOptions { }, BroadcastTransaction: []gax.CallOption{ }, + EstimateFee: []gax.CallOption{ + }, } } @@ -79,6 +82,8 @@ func defaultProtocolRESTCallOptions() *ProtocolCallOptions { }, BroadcastTransaction: []gax.CallOption{ }, + EstimateFee: []gax.CallOption{ + }, } } @@ -90,6 +95,7 @@ type internalProtocolClient interface { ConstructTransaction(context.Context, *protocolspb.ConstructTransactionRequest, ...gax.CallOption) (*typespb.Transaction, error) ConstructTransferTransaction(context.Context, *protocolspb.ConstructTransferTransactionRequest, ...gax.CallOption) (*typespb.Transaction, error) BroadcastTransaction(context.Context, *protocolspb.BroadcastTransactionRequest, ...gax.CallOption) (*typespb.Transaction, error) + EstimateFee(context.Context, *protocolspb.EstimateFeeRequest, ...gax.CallOption) (*protocolspb.EstimateFeeResponse, error) } // ProtocolClient is a client for interacting with . @@ -153,6 +159,12 @@ func (c *ProtocolClient) BroadcastTransaction(ctx context.Context, req *protocol return c.internalClient.BroadcastTransaction(ctx, req, opts...) } +// EstimateFee estimates the current network fee for the specified Network. For EVM Networks, this +// corresponds to the gas_price, max_fee_per_gas, and max_priority_fee_per_gas. +func (c *ProtocolClient) EstimateFee(ctx context.Context, req *protocolspb.EstimateFeeRequest, opts ...gax.CallOption) (*protocolspb.EstimateFeeResponse, error) { + return c.internalClient.EstimateFee(ctx, req, opts...) +} + // protocolGRPCClient is a client for interacting with over gRPC transport. // // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. @@ -355,6 +367,23 @@ func (c *protocolGRPCClient) BroadcastTransaction(ctx context.Context, req *prot return resp, nil } +func (c *protocolGRPCClient) EstimateFee(ctx context.Context, req *protocolspb.EstimateFeeRequest, opts ...gax.CallOption) (*protocolspb.EstimateFeeResponse, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "network", url.QueryEscape(req.GetNetwork()))) + + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append((*c.CallOptions).EstimateFee[0:len((*c.CallOptions).EstimateFee):len((*c.CallOptions).EstimateFee)], opts...) + var resp *protocolspb.EstimateFeeResponse + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.protocolClient.EstimateFee(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + // ConstructTransaction constructs an unsigned transaction. The payloads in the required_signatures of the // returned Transaction must be signed before the Transaction is broadcast. func (c *protocolRESTClient) ConstructTransaction(ctx context.Context, req *protocolspb.ConstructTransactionRequest, opts ...gax.CallOption) (*typespb.Transaction, error) { @@ -538,3 +567,62 @@ func (c *protocolRESTClient) BroadcastTransaction(ctx context.Context, req *prot } return resp, nil } +// EstimateFee estimates the current network fee for the specified Network. For EVM Networks, this +// corresponds to the gas_price, max_fee_per_gas, and max_priority_fee_per_gas. +func (c *protocolRESTClient) EstimateFee(ctx context.Context, req *protocolspb.EstimateFeeRequest, opts ...gax.CallOption) (*protocolspb.EstimateFeeResponse, error) { + m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} + jsonReq, err := m.Marshal(req) + if err != nil { + return nil, err + } + + baseUrl, err := url.Parse(c.endpoint) + if err != nil { + return nil, err + } + baseUrl.Path += fmt.Sprintf("/v1/%v:estimateFee", req.GetNetwork()) + + // Build HTTP headers from client and context metadata. + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "network", url.QueryEscape(req.GetNetwork()))) + + headers := buildHeaders(ctx, c.xGoogMetadata, md, metadata.Pairs("Content-Type", "application/json")) + opts = append((*c.CallOptions).EstimateFee[0:len((*c.CallOptions).EstimateFee):len((*c.CallOptions).EstimateFee)], opts...) + unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} + resp := &protocolspb.EstimateFeeResponse{} + e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + if settings.Path != "" { + baseUrl.Path = settings.Path + } + httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) + if err != nil { + return err + } + httpReq = httpReq.WithContext(ctx) + httpReq.Header = headers + + httpRsp, err := c.httpClient.Do(httpReq) + if err != nil{ + return err + } + defer httpRsp.Body.Close() + + if err = googleapi.CheckResponse(httpRsp); err != nil { + return err + } + + buf, err := ioutil.ReadAll(httpRsp.Body) + if err != nil { + return err + } + + if err := unm.Unmarshal(buf, resp); err != nil { + return maybeUnknownEnum(err) + } + + return nil + }, opts...) + if e != nil { + return nil, e + } + return resp, nil +} diff --git a/gen/go/coinbase/cloud/clients/v1/protocol_client_example_test.go b/gen/go/coinbase/cloud/clients/v1/protocol_client_example_test.go index 171c366..21d45e4 100644 --- a/gen/go/coinbase/cloud/clients/v1/protocol_client_example_test.go +++ b/gen/go/coinbase/cloud/clients/v1/protocol_client_example_test.go @@ -132,3 +132,28 @@ func ExampleProtocolClient_BroadcastTransaction() { // TODO: Use resp. _ = resp } + +func ExampleProtocolClient_EstimateFee() { + ctx := context.Background() + // This snippet has been automatically generated and should be regarded as a code template only. + // It will require modifications to work: + // - It may require correct/in-range values for request initialization. + // - It may require specifying regional endpoints when creating the service client as shown in: + // https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options + c, err := v1.NewProtocolClient(ctx) + if err != nil { + // TODO: Handle error. + } + defer c.Close() + + req := &protocolspb.EstimateFeeRequest{ + // TODO: Fill request struct fields. + // See https://pkg.go.dev/github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/protocols/v1#EstimateFeeRequest. + } + resp, err := c.EstimateFee(ctx, req) + if err != nil { + // TODO: Handle error. + } + // TODO: Use resp. + _ = resp +} diff --git a/gen/go/coinbase/cloud/mpc_keys/v1/mocks/MPCKeyServiceClient.go b/gen/go/coinbase/cloud/mpc_keys/v1/mocks/MPCKeyServiceClient.go index b73097b..bda94d5 100644 --- a/gen/go/coinbase/cloud/mpc_keys/v1/mocks/MPCKeyServiceClient.go +++ b/gen/go/coinbase/cloud/mpc_keys/v1/mocks/MPCKeyServiceClient.go @@ -6,6 +6,7 @@ import ( context "context" grpc "google.golang.org/grpc" + emptypb "google.golang.org/protobuf/types/known/emptypb" longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" @@ -19,6 +20,36 @@ type MPCKeyServiceClient struct { mock.Mock } +// AddDevice provides a mock function with given fields: ctx, in, opts +func (_m *MPCKeyServiceClient) AddDevice(ctx context.Context, in *v1.AddDeviceRequest, opts ...grpc.CallOption) (*longrunningpb.Operation, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *longrunningpb.Operation + if rf, ok := ret.Get(0).(func(context.Context, *v1.AddDeviceRequest, ...grpc.CallOption) *longrunningpb.Operation); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*longrunningpb.Operation) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *v1.AddDeviceRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // CreateDeviceGroup provides a mock function with given fields: ctx, in, opts func (_m *MPCKeyServiceClient) CreateDeviceGroup(ctx context.Context, in *v1.CreateDeviceGroupRequest, opts ...grpc.CallOption) (*longrunningpb.Operation, error) { _va := make([]interface{}, len(opts)) @@ -229,6 +260,66 @@ func (_m *MPCKeyServiceClient) ListMPCOperations(ctx context.Context, in *v1.Lis return r0, r1 } +// PrepareDeviceArchive provides a mock function with given fields: ctx, in, opts +func (_m *MPCKeyServiceClient) PrepareDeviceArchive(ctx context.Context, in *v1.PrepareDeviceArchiveRequest, opts ...grpc.CallOption) (*longrunningpb.Operation, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *longrunningpb.Operation + if rf, ok := ret.Get(0).(func(context.Context, *v1.PrepareDeviceArchiveRequest, ...grpc.CallOption) *longrunningpb.Operation); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*longrunningpb.Operation) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *v1.PrepareDeviceArchiveRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PrepareDeviceBackup provides a mock function with given fields: ctx, in, opts +func (_m *MPCKeyServiceClient) PrepareDeviceBackup(ctx context.Context, in *v1.PrepareDeviceBackupRequest, opts ...grpc.CallOption) (*longrunningpb.Operation, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *longrunningpb.Operation + if rf, ok := ret.Get(0).(func(context.Context, *v1.PrepareDeviceBackupRequest, ...grpc.CallOption) *longrunningpb.Operation); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*longrunningpb.Operation) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *v1.PrepareDeviceBackupRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // RegisterDevice provides a mock function with given fields: ctx, in, opts func (_m *MPCKeyServiceClient) RegisterDevice(ctx context.Context, in *v1.RegisterDeviceRequest, opts ...grpc.CallOption) (*v1.Device, error) { _va := make([]interface{}, len(opts)) @@ -259,6 +350,36 @@ func (_m *MPCKeyServiceClient) RegisterDevice(ctx context.Context, in *v1.Regist return r0, r1 } +// RevokeDevice provides a mock function with given fields: ctx, in, opts +func (_m *MPCKeyServiceClient) RevokeDevice(ctx context.Context, in *v1.RevokeDeviceRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *emptypb.Empty + if rf, ok := ret.Get(0).(func(context.Context, *v1.RevokeDeviceRequest, ...grpc.CallOption) *emptypb.Empty); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*emptypb.Empty) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *v1.RevokeDeviceRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + type NewMPCKeyServiceClientT interface { mock.TestingT Cleanup(func()) diff --git a/gen/go/coinbase/cloud/mpc_keys/v1/mocks/MPCKeyServiceServer.go b/gen/go/coinbase/cloud/mpc_keys/v1/mocks/MPCKeyServiceServer.go index 5c96b4f..3aa728d 100644 --- a/gen/go/coinbase/cloud/mpc_keys/v1/mocks/MPCKeyServiceServer.go +++ b/gen/go/coinbase/cloud/mpc_keys/v1/mocks/MPCKeyServiceServer.go @@ -6,6 +6,8 @@ import ( context "context" longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" + emptypb "google.golang.org/protobuf/types/known/emptypb" + mock "github.com/stretchr/testify/mock" v1 "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/mpc_keys/v1" @@ -16,6 +18,29 @@ type MPCKeyServiceServer struct { mock.Mock } +// AddDevice provides a mock function with given fields: _a0, _a1 +func (_m *MPCKeyServiceServer) AddDevice(_a0 context.Context, _a1 *v1.AddDeviceRequest) (*longrunningpb.Operation, error) { + ret := _m.Called(_a0, _a1) + + var r0 *longrunningpb.Operation + if rf, ok := ret.Get(0).(func(context.Context, *v1.AddDeviceRequest) *longrunningpb.Operation); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*longrunningpb.Operation) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *v1.AddDeviceRequest) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // CreateDeviceGroup provides a mock function with given fields: _a0, _a1 func (_m *MPCKeyServiceServer) CreateDeviceGroup(_a0 context.Context, _a1 *v1.CreateDeviceGroupRequest) (*longrunningpb.Operation, error) { ret := _m.Called(_a0, _a1) @@ -177,6 +202,52 @@ func (_m *MPCKeyServiceServer) ListMPCOperations(_a0 context.Context, _a1 *v1.Li return r0, r1 } +// PrepareDeviceArchive provides a mock function with given fields: _a0, _a1 +func (_m *MPCKeyServiceServer) PrepareDeviceArchive(_a0 context.Context, _a1 *v1.PrepareDeviceArchiveRequest) (*longrunningpb.Operation, error) { + ret := _m.Called(_a0, _a1) + + var r0 *longrunningpb.Operation + if rf, ok := ret.Get(0).(func(context.Context, *v1.PrepareDeviceArchiveRequest) *longrunningpb.Operation); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*longrunningpb.Operation) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *v1.PrepareDeviceArchiveRequest) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PrepareDeviceBackup provides a mock function with given fields: _a0, _a1 +func (_m *MPCKeyServiceServer) PrepareDeviceBackup(_a0 context.Context, _a1 *v1.PrepareDeviceBackupRequest) (*longrunningpb.Operation, error) { + ret := _m.Called(_a0, _a1) + + var r0 *longrunningpb.Operation + if rf, ok := ret.Get(0).(func(context.Context, *v1.PrepareDeviceBackupRequest) *longrunningpb.Operation); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*longrunningpb.Operation) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *v1.PrepareDeviceBackupRequest) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // RegisterDevice provides a mock function with given fields: _a0, _a1 func (_m *MPCKeyServiceServer) RegisterDevice(_a0 context.Context, _a1 *v1.RegisterDeviceRequest) (*v1.Device, error) { ret := _m.Called(_a0, _a1) @@ -200,6 +271,29 @@ func (_m *MPCKeyServiceServer) RegisterDevice(_a0 context.Context, _a1 *v1.Regis return r0, r1 } +// RevokeDevice provides a mock function with given fields: _a0, _a1 +func (_m *MPCKeyServiceServer) RevokeDevice(_a0 context.Context, _a1 *v1.RevokeDeviceRequest) (*emptypb.Empty, error) { + ret := _m.Called(_a0, _a1) + + var r0 *emptypb.Empty + if rf, ok := ret.Get(0).(func(context.Context, *v1.RevokeDeviceRequest) *emptypb.Empty); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*emptypb.Empty) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *v1.RevokeDeviceRequest) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // mustEmbedUnimplementedMPCKeyServiceServer provides a mock function with given fields: func (_m *MPCKeyServiceServer) mustEmbedUnimplementedMPCKeyServiceServer() { _m.Called() diff --git a/gen/go/coinbase/cloud/mpc_keys/v1/mpc_keys.pb.go b/gen/go/coinbase/cloud/mpc_keys/v1/mpc_keys.pb.go index b5a0037..03074a4 100644 --- a/gen/go/coinbase/cloud/mpc_keys/v1/mpc_keys.pb.go +++ b/gen/go/coinbase/cloud/mpc_keys/v1/mpc_keys.pb.go @@ -13,6 +13,7 @@ import ( longrunning "google.golang.org/genproto/googleapis/longrunning" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" reflect "reflect" sync "sync" ) @@ -136,6 +137,10 @@ type Seed struct { // The hardened children derived from the Seed. To create an MPCKey, // at least one hardened child must be derived. HardenedChildren []*HardenedChild `protobuf:"bytes,1,rep,name=hardened_children,json=hardenedChildren,proto3" json:"hardened_children,omitempty"` + // The metadata to be used to export MPCKeys derived from this Seed. This metadata has to be passed to the + // WaaS SDK's ExportPrivateKeys to export private keys corresponding to MPCKeys that are derived from this Seed's + // HardenedChildren. + MpcKeyExportMetadata []byte `protobuf:"bytes,2,opt,name=mpc_key_export_metadata,json=mpcKeyExportMetadata,proto3" json:"mpc_key_export_metadata,omitempty"` } func (x *Seed) Reset() { @@ -177,6 +182,13 @@ func (x *Seed) GetHardenedChildren() []*HardenedChild { return nil } +func (x *Seed) GetMpcKeyExportMetadata() []byte { + if x != nil { + return x.MpcKeyExportMetadata + } + return nil +} + // The DeviceGroup resource, which represents a collection of Devices that have access to the // same set of Seed resources. type DeviceGroup struct { @@ -270,6 +282,9 @@ type MPCOperation struct { // Types that are assignable to Metadata: // *MPCOperation_CreateDeviceGroupMetadata // *MPCOperation_CreateSignatureMetadata + // *MPCOperation_PrepareDeviceArchiveMetadata + // *MPCOperation_PrepareDeviceBackupMetadata + // *MPCOperation_AddDeviceMetadata Metadata isMPCOperation_Metadata `protobuf_oneof:"metadata"` } @@ -340,6 +355,27 @@ func (x *MPCOperation) GetCreateSignatureMetadata() *CreateSignatureMetadata { return nil } +func (x *MPCOperation) GetPrepareDeviceArchiveMetadata() *PrepareDeviceArchiveMetadata { + if x, ok := x.GetMetadata().(*MPCOperation_PrepareDeviceArchiveMetadata); ok { + return x.PrepareDeviceArchiveMetadata + } + return nil +} + +func (x *MPCOperation) GetPrepareDeviceBackupMetadata() *PrepareDeviceBackupMetadata { + if x, ok := x.GetMetadata().(*MPCOperation_PrepareDeviceBackupMetadata); ok { + return x.PrepareDeviceBackupMetadata + } + return nil +} + +func (x *MPCOperation) GetAddDeviceMetadata() *AddDeviceMetadata { + if x, ok := x.GetMetadata().(*MPCOperation_AddDeviceMetadata); ok { + return x.AddDeviceMetadata + } + return nil +} + type isMPCOperation_Metadata interface { isMPCOperation_Metadata() } @@ -354,10 +390,31 @@ type MPCOperation_CreateSignatureMetadata struct { CreateSignatureMetadata *CreateSignatureMetadata `protobuf:"bytes,4,opt,name=create_signature_metadata,json=createSignatureMetadata,proto3,oneof"` } +type MPCOperation_PrepareDeviceArchiveMetadata struct { + // Metadata associated with the PrepareDeviceArchive long-running operation. + PrepareDeviceArchiveMetadata *PrepareDeviceArchiveMetadata `protobuf:"bytes,5,opt,name=prepare_device_archive_metadata,json=prepareDeviceArchiveMetadata,proto3,oneof"` +} + +type MPCOperation_PrepareDeviceBackupMetadata struct { + // Metadata associated with the PrepareDeviceBackup long-running operation. + PrepareDeviceBackupMetadata *PrepareDeviceBackupMetadata `protobuf:"bytes,6,opt,name=prepare_device_backup_metadata,json=prepareDeviceBackupMetadata,proto3,oneof"` +} + +type MPCOperation_AddDeviceMetadata struct { + // Metadata associated with the AddDevice long-running operation. + AddDeviceMetadata *AddDeviceMetadata `protobuf:"bytes,7,opt,name=add_device_metadata,json=addDeviceMetadata,proto3,oneof"` +} + func (*MPCOperation_CreateDeviceGroupMetadata) isMPCOperation_Metadata() {} func (*MPCOperation_CreateSignatureMetadata) isMPCOperation_Metadata() {} +func (*MPCOperation_PrepareDeviceArchiveMetadata) isMPCOperation_Metadata() {} + +func (*MPCOperation_PrepareDeviceBackupMetadata) isMPCOperation_Metadata() {} + +func (*MPCOperation_AddDeviceMetadata) isMPCOperation_Metadata() {} + // The MPCKey resource. An MPCKey can be used to participate in distributed M-of-N signing // via the WaaS SDK. An MPCKey is created from a Seed. type MPCKey struct { @@ -790,8 +847,6 @@ func (x *GetDeviceGroupRequest) GetName() string { } // The request message for ListMPCOperations. -// (-- api-linter: core::0158::request-page-size-field=disabled --) -// (-- api-linter: core::0158::request-page-token-field=disabled --) type ListMPCOperationsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -842,7 +897,6 @@ func (x *ListMPCOperationsRequest) GetParent() string { } // The response message for ListMPCOperations. -// (-- api-linter: core::0158::response-next-page-token-field=disabled --) type ListMPCOperationsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1137,6 +1191,429 @@ func (x *CreateSignatureMetadata) GetPayload() []byte { return nil } +// The request message for PrepareDeviceArchive. +type PrepareDeviceArchiveRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The resource name of the DeviceGroup. The prepared archive will include cryptographic materials to export the + // private keys corresponding to each of the MPCKey under this DeviceGroup. + // Format: pools/{pool_id}/deviceGroups/{device_group_id} + DeviceGroup string `protobuf:"bytes,1,opt,name=device_group,json=deviceGroup,proto3" json:"device_group,omitempty"` + // The resource name of the Device that prepares the archive in its local storage. + // The Device must be part of the DeviceGroup specified above. + // Format: devices/{device_id} + Device string `protobuf:"bytes,2,opt,name=device,proto3" json:"device,omitempty"` + // A user-provided request ID to allow for idempotency. This should be a UUID. + RequestId string `protobuf:"bytes,3,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` +} + +func (x *PrepareDeviceArchiveRequest) Reset() { + *x = PrepareDeviceArchiveRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PrepareDeviceArchiveRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PrepareDeviceArchiveRequest) ProtoMessage() {} + +func (x *PrepareDeviceArchiveRequest) ProtoReflect() protoreflect.Message { + mi := &file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[18] + 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 PrepareDeviceArchiveRequest.ProtoReflect.Descriptor instead. +func (*PrepareDeviceArchiveRequest) Descriptor() ([]byte, []int) { + return file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_rawDescGZIP(), []int{18} +} + +func (x *PrepareDeviceArchiveRequest) GetDeviceGroup() string { + if x != nil { + return x.DeviceGroup + } + return "" +} + +func (x *PrepareDeviceArchiveRequest) GetDevice() string { + if x != nil { + return x.Device + } + return "" +} + +func (x *PrepareDeviceArchiveRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +// Metadata associated with the PrepareDeviceArchive long-running operation. +type PrepareDeviceArchiveMetadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The resource name of the DeviceGroup to poll using ListMPCOperations. + // Format: pools/{pool_id}/deviceGroups/{device_group_id} + DeviceGroup string `protobuf:"bytes,1,opt,name=device_group,json=deviceGroup,proto3" json:"device_group,omitempty"` +} + +func (x *PrepareDeviceArchiveMetadata) Reset() { + *x = PrepareDeviceArchiveMetadata{} + if protoimpl.UnsafeEnabled { + mi := &file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PrepareDeviceArchiveMetadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PrepareDeviceArchiveMetadata) ProtoMessage() {} + +func (x *PrepareDeviceArchiveMetadata) ProtoReflect() protoreflect.Message { + mi := &file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PrepareDeviceArchiveMetadata.ProtoReflect.Descriptor instead. +func (*PrepareDeviceArchiveMetadata) Descriptor() ([]byte, []int) { + return file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_rawDescGZIP(), []int{19} +} + +func (x *PrepareDeviceArchiveMetadata) GetDeviceGroup() string { + if x != nil { + return x.DeviceGroup + } + return "" +} + +// The request message for PrepareDeviceBackup. +type PrepareDeviceBackupRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The resource name of the DeviceGroup. The prepared backup will include cryptographic materials to recover the + // MPCKeys under this DeviceGroup on a new Device. + // Format: pools/{pool_id}/deviceGroups/{device_group_id} + DeviceGroup string `protobuf:"bytes,1,opt,name=device_group,json=deviceGroup,proto3" json:"device_group,omitempty"` + // The resource name of the Device that prepares the backup. + // The Device must be part of the DeviceGroup specified above. + // Format: devices/{device_id} + Device string `protobuf:"bytes,2,opt,name=device,proto3" json:"device,omitempty"` + // A user-provided request ID to allow for idempotency. This should be a UUID. + RequestId string `protobuf:"bytes,3,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` +} + +func (x *PrepareDeviceBackupRequest) Reset() { + *x = PrepareDeviceBackupRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PrepareDeviceBackupRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PrepareDeviceBackupRequest) ProtoMessage() {} + +func (x *PrepareDeviceBackupRequest) ProtoReflect() protoreflect.Message { + mi := &file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[20] + 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 PrepareDeviceBackupRequest.ProtoReflect.Descriptor instead. +func (*PrepareDeviceBackupRequest) Descriptor() ([]byte, []int) { + return file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_rawDescGZIP(), []int{20} +} + +func (x *PrepareDeviceBackupRequest) GetDeviceGroup() string { + if x != nil { + return x.DeviceGroup + } + return "" +} + +func (x *PrepareDeviceBackupRequest) GetDevice() string { + if x != nil { + return x.Device + } + return "" +} + +func (x *PrepareDeviceBackupRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +// Metadata associated with the PrepareDeviceBackup long-running operation. +type PrepareDeviceBackupMetadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The resource name of the DeviceGroup to poll using ListMPCOperations. + // Format: pools/{pool_id}/deviceGroups/{device_group_id} + DeviceGroup string `protobuf:"bytes,1,opt,name=device_group,json=deviceGroup,proto3" json:"device_group,omitempty"` +} + +func (x *PrepareDeviceBackupMetadata) Reset() { + *x = PrepareDeviceBackupMetadata{} + if protoimpl.UnsafeEnabled { + mi := &file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PrepareDeviceBackupMetadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PrepareDeviceBackupMetadata) ProtoMessage() {} + +func (x *PrepareDeviceBackupMetadata) ProtoReflect() protoreflect.Message { + mi := &file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[21] + 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 PrepareDeviceBackupMetadata.ProtoReflect.Descriptor instead. +func (*PrepareDeviceBackupMetadata) Descriptor() ([]byte, []int) { + return file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_rawDescGZIP(), []int{21} +} + +func (x *PrepareDeviceBackupMetadata) GetDeviceGroup() string { + if x != nil { + return x.DeviceGroup + } + return "" +} + +// The request message for AddDevice. +type AddDeviceRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The resource name of the DeviceGroup to which the Device is being added. + // Format: pools/{pool_id}/deviceGroups/{device_group_id} + DeviceGroup string `protobuf:"bytes,1,opt,name=device_group,json=deviceGroup,proto3" json:"device_group,omitempty"` + // The resource name of the Device that is being added to the DeviceGroup. + // The Device must not be part of the DeviceGroup specified above. + // Format: devices/{device_id} + Device string `protobuf:"bytes,2,opt,name=device,proto3" json:"device,omitempty"` + // A user-provided request ID to allow for idempotency. This should be a UUID. + RequestId string `protobuf:"bytes,3,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` +} + +func (x *AddDeviceRequest) Reset() { + *x = AddDeviceRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddDeviceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddDeviceRequest) ProtoMessage() {} + +func (x *AddDeviceRequest) ProtoReflect() protoreflect.Message { + mi := &file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[22] + 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 AddDeviceRequest.ProtoReflect.Descriptor instead. +func (*AddDeviceRequest) Descriptor() ([]byte, []int) { + return file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_rawDescGZIP(), []int{22} +} + +func (x *AddDeviceRequest) GetDeviceGroup() string { + if x != nil { + return x.DeviceGroup + } + return "" +} + +func (x *AddDeviceRequest) GetDevice() string { + if x != nil { + return x.Device + } + return "" +} + +func (x *AddDeviceRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +// Metadata associated with the AddDevice long-running operation. +type AddDeviceMetadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The resource name of the DeviceGroup to poll using ListMPCOperations. + // Format: pools/{pool_id}/deviceGroups/{device_group_id} + DeviceGroup string `protobuf:"bytes,1,opt,name=device_group,json=deviceGroup,proto3" json:"device_group,omitempty"` + // The list of Device resource names that can compute the MPCOperation by invoking ComputeAddDeviceMPCOperation on the + // WaaS SDK. + // Format: devices/{device_id} + ParticipatingDevices []string `protobuf:"bytes,2,rep,name=participating_devices,json=participatingDevices,proto3" json:"participating_devices,omitempty"` +} + +func (x *AddDeviceMetadata) Reset() { + *x = AddDeviceMetadata{} + if protoimpl.UnsafeEnabled { + mi := &file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddDeviceMetadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddDeviceMetadata) ProtoMessage() {} + +func (x *AddDeviceMetadata) ProtoReflect() protoreflect.Message { + mi := &file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[23] + 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 AddDeviceMetadata.ProtoReflect.Descriptor instead. +func (*AddDeviceMetadata) Descriptor() ([]byte, []int) { + return file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_rawDescGZIP(), []int{23} +} + +func (x *AddDeviceMetadata) GetDeviceGroup() string { + if x != nil { + return x.DeviceGroup + } + return "" +} + +func (x *AddDeviceMetadata) GetParticipatingDevices() []string { + if x != nil { + return x.ParticipatingDevices + } + return nil +} + +// The request message for RevokeDevice. +type RevokeDeviceRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The resource name of the Device that is being revoked. + // Format: devices/{device_id} + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *RevokeDeviceRequest) Reset() { + *x = RevokeDeviceRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RevokeDeviceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RevokeDeviceRequest) ProtoMessage() {} + +func (x *RevokeDeviceRequest) ProtoReflect() protoreflect.Message { + mi := &file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[24] + 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 RevokeDeviceRequest.ProtoReflect.Descriptor instead. +func (*RevokeDeviceRequest) Descriptor() ([]byte, []int) { + return file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_rawDescGZIP(), []int{24} +} + +func (x *RevokeDeviceRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + var File_coinbase_cloud_mpc_keys_v1_mpc_keys_proto protoreflect.FileDescriptor var file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_rawDesc = []byte{ @@ -1156,480 +1633,661 @@ var file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_rawDesc = []byte{ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2f, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2f, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, - 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, - 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, - 0xb6, 0x02, 0x0a, 0x06, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x7b, 0x92, 0x41, 0x74, 0x2a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x3c, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x0a, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x7d, 0x4a, 0x2e, 0x22, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x31, 0x35, 0x39, - 0x31, 0x30, 0x38, 0x39, 0x63, 0x2d, 0x32, 0x32, 0x39, 0x64, 0x2d, 0x34, 0x35, 0x37, 0x38, 0x2d, - 0x61, 0x62, 0x39, 0x34, 0x2d, 0x61, 0x33, 0x66, 0x61, 0x33, 0x34, 0x34, 0x32, 0x64, 0x37, 0x37, - 0x62, 0x22, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x99, 0x01, 0x92, - 0x41, 0x5b, 0x0a, 0x59, 0x2a, 0x06, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x32, 0x4f, 0x54, 0x68, - 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, - 0x6e, 0x74, 0x73, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x4d, 0x50, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0xea, 0x41, 0x38, - 0x0a, 0x21, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, - 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x13, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0xee, 0x03, 0x0a, 0x0d, 0x48, 0x61, 0x72, - 0x64, 0x65, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x12, 0xb4, 0x02, 0x0a, 0x0f, 0x64, - 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x05, 0x42, 0x8a, 0x02, 0x92, 0x41, 0x82, 0x02, 0x2a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x32, 0xea, 0x01, 0x54, 0x68, 0x65, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x63, 0x68, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, 0x20, 0x63, 0x68, - 0x69, 0x6c, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x65, 0x65, - 0x64, 0x20, 0x28, 0x69, 0x2e, 0x65, 0x2e, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x6f, 0x6f, - 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x44, 0x20, 0x74, 0x72, 0x65, 0x65, - 0x29, 0x2e, 0x45, 0x61, 0x63, 0x68, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x69, - 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x65, 0x74, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, - 0x6f, 0x20, 0x42, 0x49, 0x50, 0x2d, 0x34, 0x34, 0x3a, 0x20, 0x6d, 0x20, 0x2f, 0x20, 0x70, 0x75, - 0x72, 0x70, 0x6f, 0x73, 0x65, 0xe2, 0x80, 0x99, 0x20, 0x2f, 0x20, 0x63, 0x6f, 0x69, 0x6e, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0xe2, 0x80, 0x99, 0x20, 0x2f, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0xe2, 0x80, 0x99, 0x20, 0x2f, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x2f, 0x20, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x4a, 0x0d, - 0x22, 0x5b, 0x34, 0x34, 0x2c, 0x20, 0x36, 0x30, 0x2c, 0x20, 0x30, 0x5d, 0x22, 0xe2, 0x41, 0x01, - 0x02, 0x52, 0x0e, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, - 0x68, 0x3a, 0xa5, 0x01, 0x92, 0x41, 0xa1, 0x01, 0x0a, 0x9e, 0x01, 0x2a, 0x0d, 0x48, 0x61, 0x72, - 0x64, 0x65, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x32, 0x8c, 0x01, 0x41, 0x20, 0x63, - 0x68, 0x69, 0x6c, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x53, 0x65, 0x65, 0x64, 0x20, 0x69, - 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x48, 0x44, 0x20, 0x74, 0x72, 0x65, 0x65, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x75, - 0x73, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, 0x20, 0x64, 0x65, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x64, 0x65, 0x66, - 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x42, 0x49, 0x50, 0x2d, 0x33, 0x32, 0x2e, 0x20, - 0x41, 0x6c, 0x6c, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x73, 0x20, 0x64, 0x65, 0x73, 0x63, - 0x65, 0x6e, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x48, 0x61, 0x72, 0x64, 0x65, - 0x6e, 0x65, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x2e, 0x22, 0x82, 0x03, 0x0a, 0x04, 0x53, 0x65, - 0x65, 0x64, 0x12, 0xe3, 0x01, 0x0a, 0x11, 0x68, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, 0x5f, - 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, + 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2f, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb6, 0x02, 0x0a, + 0x06, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x7b, 0x92, 0x41, 0x74, 0x2a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x32, 0x3c, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x2e, 0x0a, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x4a, + 0x2e, 0x22, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x31, 0x35, 0x39, 0x31, 0x30, 0x38, + 0x39, 0x63, 0x2d, 0x32, 0x32, 0x39, 0x64, 0x2d, 0x34, 0x35, 0x37, 0x38, 0x2d, 0x61, 0x62, 0x39, + 0x34, 0x2d, 0x61, 0x33, 0x66, 0x61, 0x33, 0x34, 0x34, 0x32, 0x64, 0x37, 0x37, 0x62, 0x22, 0xe2, + 0x41, 0x01, 0x03, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x99, 0x01, 0x92, 0x41, 0x5b, 0x0a, + 0x59, 0x2a, 0x06, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x32, 0x4f, 0x54, 0x68, 0x65, 0x20, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, + 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, + 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, + 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0xea, 0x41, 0x38, 0x0a, 0x21, 0x61, + 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, + 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x13, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0xee, 0x03, 0x0a, 0x0d, 0x48, 0x61, 0x72, 0x64, 0x65, 0x6e, + 0x65, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x12, 0xb4, 0x02, 0x0a, 0x0f, 0x64, 0x65, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x05, 0x42, 0x8a, 0x02, 0x92, 0x41, 0x82, 0x02, 0x2a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0xea, + 0x01, 0x54, 0x68, 0x65, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x63, 0x68, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x68, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x64, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x65, 0x65, 0x64, 0x20, 0x28, + 0x69, 0x2e, 0x65, 0x2e, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x44, 0x20, 0x74, 0x72, 0x65, 0x65, 0x29, 0x2e, 0x45, + 0x61, 0x63, 0x68, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, + 0x74, 0x68, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, + 0x64, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x42, + 0x49, 0x50, 0x2d, 0x34, 0x34, 0x3a, 0x20, 0x6d, 0x20, 0x2f, 0x20, 0x70, 0x75, 0x72, 0x70, 0x6f, + 0x73, 0x65, 0xe2, 0x80, 0x99, 0x20, 0x2f, 0x20, 0x63, 0x6f, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0xe2, 0x80, 0x99, 0x20, 0x2f, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0xe2, 0x80, + 0x99, 0x20, 0x2f, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x2f, 0x20, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x4a, 0x0d, 0x22, 0x5b, 0x34, + 0x34, 0x2c, 0x20, 0x36, 0x30, 0x2c, 0x20, 0x30, 0x5d, 0x22, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x0e, + 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x3a, 0xa5, + 0x01, 0x92, 0x41, 0xa1, 0x01, 0x0a, 0x9e, 0x01, 0x2a, 0x0d, 0x48, 0x61, 0x72, 0x64, 0x65, 0x6e, + 0x65, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x32, 0x8c, 0x01, 0x41, 0x20, 0x63, 0x68, 0x69, 0x6c, + 0x64, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x53, 0x65, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, + 0x6e, 0x20, 0x48, 0x44, 0x20, 0x74, 0x72, 0x65, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, + 0x61, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x75, 0x73, 0x69, 0x6e, + 0x67, 0x20, 0x68, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x20, 0x42, 0x49, 0x50, 0x2d, 0x33, 0x32, 0x2e, 0x20, 0x41, 0x6c, 0x6c, + 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x73, 0x20, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x48, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, + 0x43, 0x68, 0x69, 0x6c, 0x64, 0x2e, 0x22, 0xc4, 0x05, 0x0a, 0x04, 0x53, 0x65, 0x65, 0x64, 0x12, + 0xe3, 0x01, 0x0a, 0x11, 0x68, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6f, + 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, + 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, + 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x42, 0x8a, 0x01, 0x92, 0x41, 0x82, 0x01, 0x2a, 0x10, 0x68, + 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x32, + 0x6e, 0x54, 0x68, 0x65, 0x20, 0x68, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, 0x20, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x65, 0x65, 0x64, 0x2e, 0x20, 0x54, 0x6f, + 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, + 0x79, 0x2c, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x20, + 0x68, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x2e, 0xe2, + 0x41, 0x01, 0x02, 0x52, 0x10, 0x68, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x12, 0xbf, 0x02, 0x0a, 0x17, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, + 0x79, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x87, 0x02, 0x92, 0x41, 0xff, 0x01, 0x2a, 0x14, + 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x32, 0xe6, 0x01, 0x54, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x73, + 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x53, 0x65, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x68, 0x61, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x62, 0x65, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x57, 0x61, 0x61, + 0x53, 0x20, 0x53, 0x44, 0x4b, 0x27, 0x73, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x20, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x73, + 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x6f, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x53, 0x65, 0x65, 0x64, 0x27, 0x73, 0x20, 0x48, 0x61, 0x72, 0x64, + 0x65, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x2e, 0xe2, 0x41, 0x01, + 0x03, 0x52, 0x14, 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x93, 0x01, 0x92, 0x41, 0x8f, 0x01, 0x0a, 0x8c, + 0x01, 0x2a, 0x04, 0x53, 0x65, 0x65, 0x64, 0x32, 0x83, 0x01, 0x41, 0x20, 0x62, 0x79, 0x74, 0x65, + 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, + 0x72, 0x63, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x69, 0x73, 0x74, 0x69, 0x63, 0x20, 0x28, 0x48, 0x44, 0x29, 0x20, 0x77, 0x61, 0x6c, + 0x6c, 0x65, 0x74, 0x20, 0x61, 0x73, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x42, 0x49, 0x50, 0x2d, 0x33, 0x32, 0x2e, 0x20, 0x41, 0x20, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x68, 0x61, 0x73, 0x20, 0x65, 0x78, 0x61, 0x63, + 0x74, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x53, 0x65, 0x65, 0x64, 0x2e, 0x22, 0x89, 0x07, + 0x0a, 0x0b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0xe1, 0x01, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0xcc, 0x01, 0x92, + 0x41, 0xc4, 0x01, 0x2a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x5c, 0x54, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, + 0x0a, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, + 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x4a, 0x5e, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, + 0x39, 0x35, 0x32, 0x35, 0x37, 0x63, 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, 0x2d, 0x34, 0x32, + 0x34, 0x31, 0x2d, 0x62, 0x66, 0x39, 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, 0x38, 0x65, 0x39, + 0x63, 0x63, 0x39, 0x31, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x73, 0x2f, 0x33, 0x61, 0x31, 0x36, 0x38, 0x61, 0x35, 0x34, 0x2d, 0x36, 0x36, 0x36, 0x31, 0x2d, + 0x34, 0x65, 0x35, 0x61, 0x2d, 0x38, 0x62, 0x63, 0x35, 0x2d, 0x39, 0x37, 0x35, 0x39, 0x36, 0x37, + 0x31, 0x61, 0x61, 0x37, 0x37, 0x37, 0x22, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0xf6, 0x01, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x42, 0xdb, 0x01, 0x92, 0x41, 0xd3, 0x01, 0x2a, 0x07, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x32, 0x95, 0x01, 0x54, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, + 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x20, 0x4f, 0x6e, 0x20, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x65, 0x78, 0x61, 0x63, 0x74, + 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x73, 0x65, + 0x74, 0x2e, 0x0a, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x7d, 0x4a, 0x30, 0x5b, 0x22, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x31, 0x35, 0x39, 0x31, 0x30, 0x38, 0x39, 0x63, 0x2d, + 0x32, 0x32, 0x39, 0x64, 0x2d, 0x34, 0x35, 0x37, 0x38, 0x2d, 0x61, 0x62, 0x39, 0x34, 0x2d, 0x61, + 0x33, 0x66, 0x61, 0x33, 0x34, 0x34, 0x32, 0x64, 0x37, 0x37, 0x62, 0x22, 0x5d, 0xe2, 0x41, 0x01, + 0x02, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0xb2, 0x01, 0x0a, 0x04, 0x73, + 0x65, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x6f, 0x69, 0x6e, + 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, + 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x65, 0x64, 0x42, 0x7c, 0x92, 0x41, 0x75, + 0x2a, 0x04, 0x73, 0x65, 0x65, 0x64, 0x32, 0x6d, 0x54, 0x68, 0x65, 0x20, 0x53, 0x65, 0x65, 0x64, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x20, 0x4f, 0x6e, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x65, 0x65, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, + 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x6f, + 0x6e, 0x65, 0x20, 0x48, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, + 0x20, 0x73, 0x65, 0x74, 0x2e, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x04, 0x73, 0x65, 0x65, 0x64, 0x3a, + 0xe7, 0x01, 0x92, 0x41, 0x88, 0x01, 0x0a, 0x85, 0x01, 0x2a, 0x0b, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x32, 0x76, 0x54, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x66, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x53, + 0x65, 0x65, 0x64, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0xea, 0x41, + 0x58, 0x0a, 0x26, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, + 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x2e, 0x70, 0x6f, 0x6f, 0x6c, 0x73, + 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0xb6, 0x10, 0x0a, 0x0c, 0x4d, 0x50, + 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0xb7, 0x02, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0xa2, 0x02, 0x92, 0x41, 0x9a, 0x02, + 0x2a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x7e, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, + 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x70, 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6d, 0x70, 0x63, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x4a, 0x91, 0x01, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, + 0x39, 0x35, 0x32, 0x35, 0x37, 0x63, 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, 0x2d, 0x34, 0x32, + 0x34, 0x31, 0x2d, 0x62, 0x66, 0x39, 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, 0x38, 0x65, 0x39, + 0x63, 0x63, 0x39, 0x31, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x73, 0x2f, 0x33, 0x61, 0x31, 0x36, 0x38, 0x61, 0x35, 0x34, 0x2d, 0x36, 0x36, 0x36, 0x31, 0x2d, + 0x34, 0x65, 0x35, 0x61, 0x2d, 0x38, 0x62, 0x63, 0x35, 0x2d, 0x39, 0x37, 0x35, 0x39, 0x36, 0x37, + 0x31, 0x61, 0x61, 0x37, 0x37, 0x37, 0x2f, 0x6d, 0x70, 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x31, 0x32, 0x38, 0x38, 0x35, 0x31, 0x35, 0x34, 0x2d, 0x38, 0x64, + 0x36, 0x65, 0x2d, 0x34, 0x30, 0x36, 0x30, 0x2d, 0x38, 0x61, 0x64, 0x65, 0x2d, 0x35, 0x62, 0x32, + 0x62, 0x33, 0x64, 0x39, 0x31, 0x39, 0x33, 0x31, 0x37, 0x22, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x08, 0x6d, 0x70, 0x63, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x76, 0x92, 0x41, 0x6f, 0x2a, 0x07, 0x6d, 0x70, + 0x63, 0x44, 0x61, 0x74, 0x61, 0x32, 0x64, 0x44, 0x61, 0x74, 0x61, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, + 0x4b, 0x27, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0xe2, 0x41, 0x01, 0x03, 0x52, + 0x07, 0x6d, 0x70, 0x63, 0x44, 0x61, 0x74, 0x61, 0x12, 0xe0, 0x01, 0x0a, 0x1c, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x35, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0x66, 0x92, 0x41, 0x63, 0x2a, 0x19, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x32, 0x46, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x2d, 0x72, 0x75, 0x6e, 0x6e, + 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x48, 0x00, + 0x52, 0x19, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0xd5, 0x01, 0x0a, 0x19, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x33, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x42, 0x62, 0x92, 0x41, 0x5f, 0x2a, 0x17, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x32, 0x44, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x61, 0x73, 0x73, + 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x2d, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x48, 0x00, 0x52, 0x17, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x12, 0xef, 0x01, 0x0a, 0x1f, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x5f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x5f, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, + 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, + 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x70, 0x61, + 0x72, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0x6c, 0x92, 0x41, 0x69, 0x2a, 0x1c, 0x70, 0x72, + 0x65, 0x70, 0x61, 0x72, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, + 0x76, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x32, 0x49, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x20, 0x6c, 0x6f, + 0x6e, 0x67, 0x2d, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x48, 0x00, 0x52, 0x1c, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0xea, 0x01, 0x0a, 0x1e, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, + 0x65, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, - 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x61, 0x72, 0x64, - 0x65, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x42, 0x8a, 0x01, 0x92, 0x41, 0x82, 0x01, - 0x2a, 0x10, 0x68, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, - 0x65, 0x6e, 0x32, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x68, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, - 0x20, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, - 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x65, 0x65, 0x64, 0x2e, - 0x20, 0x54, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x4d, 0x50, - 0x43, 0x4b, 0x65, 0x79, 0x2c, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x6f, - 0x6e, 0x65, 0x20, 0x68, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, 0x20, 0x63, 0x68, 0x69, 0x6c, - 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, - 0x64, 0x2e, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x10, 0x68, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, - 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x3a, 0x93, 0x01, 0x92, 0x41, 0x8f, 0x01, 0x0a, - 0x8c, 0x01, 0x2a, 0x04, 0x53, 0x65, 0x65, 0x64, 0x32, 0x83, 0x01, 0x41, 0x20, 0x62, 0x79, 0x74, - 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x68, 0x69, 0x65, 0x72, - 0x61, 0x72, 0x63, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, - 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x69, 0x63, 0x20, 0x28, 0x48, 0x44, 0x29, 0x20, 0x77, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x20, 0x61, 0x73, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, - 0x69, 0x6e, 0x20, 0x42, 0x49, 0x50, 0x2d, 0x33, 0x32, 0x2e, 0x20, 0x41, 0x20, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x68, 0x61, 0x73, 0x20, 0x65, 0x78, 0x61, - 0x63, 0x74, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x53, 0x65, 0x65, 0x64, 0x2e, 0x22, 0x89, - 0x07, 0x0a, 0x0b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0xe1, - 0x01, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0xcc, 0x01, - 0x92, 0x41, 0xc4, 0x01, 0x2a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x5c, 0x54, 0x68, 0x65, 0x20, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x2e, 0x0a, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, - 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x4a, 0x5e, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x73, + 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x70, + 0x61, 0x72, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0x6a, 0x92, 0x41, 0x67, 0x2a, 0x1b, 0x70, 0x72, + 0x65, 0x70, 0x61, 0x72, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x32, 0x48, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x20, 0x6c, 0x6f, 0x6e, 0x67, + 0x2d, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x48, 0x00, 0x52, 0x1b, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x12, 0xb7, 0x01, 0x0a, 0x13, 0x61, 0x64, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2d, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, + 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, + 0x56, 0x92, 0x41, 0x53, 0x2a, 0x11, 0x61, 0x64, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x32, 0x3e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, + 0x6c, 0x6f, 0x6e, 0x67, 0x2d, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x48, 0x00, 0x52, 0x11, 0x61, 0x64, 0x64, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x3a, 0xf7, 0x03, 0x92, + 0x41, 0xf6, 0x02, 0x0a, 0xf3, 0x02, 0x2a, 0x0c, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x32, 0xe2, 0x02, 0x54, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x73, 0x20, 0x61, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x4d, 0x50, 0x43, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x77, 0x61, 0x69, 0x74, + 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x50, 0x6f, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x69, + 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, + 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, 0x27, 0x73, 0x20, 0x43, + 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x54, 0x68, + 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x49, 0x44, 0x20, 0x69, 0x73, 0x20, 0x67, 0x75, + 0x61, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x79, 0x69, 0x6e, + 0x67, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x2d, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0xea, 0x41, 0x7a, 0x0a, 0x27, 0x61, 0x70, + 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, + 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, + 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x70, 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6d, 0x70, 0x63, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x42, 0x0a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x22, 0xde, 0x08, 0x0a, 0x06, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x12, 0x9f, 0x02, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x8a, 0x02, 0x92, + 0x41, 0x82, 0x02, 0x2a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x6c, 0x54, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x2e, 0x0a, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, + 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x7b, 0x6d, 0x70, 0x63, 0x5f, + 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x4a, 0x8b, 0x01, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x39, 0x35, 0x32, 0x35, 0x37, 0x63, 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, 0x2d, 0x34, 0x32, 0x34, 0x31, 0x2d, 0x62, 0x66, 0x39, 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, 0x38, 0x65, 0x39, 0x63, 0x63, 0x39, 0x31, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x33, 0x61, 0x31, 0x36, 0x38, 0x61, 0x35, 0x34, 0x2d, 0x36, 0x36, 0x36, 0x31, 0x2d, 0x34, 0x65, 0x35, 0x61, 0x2d, 0x38, 0x62, 0x63, 0x35, 0x2d, 0x39, 0x37, 0x35, 0x39, 0x36, - 0x37, 0x31, 0x61, 0x61, 0x37, 0x37, 0x37, 0x22, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0xf6, 0x01, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x42, 0xdb, 0x01, 0x92, 0x41, 0xd3, 0x01, 0x2a, 0x07, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x32, 0x95, 0x01, 0x54, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, - 0x6f, 0x66, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, - 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x20, 0x4f, 0x6e, 0x20, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6c, 0x69, 0x73, - 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x65, 0x78, 0x61, 0x63, - 0x74, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x73, - 0x65, 0x74, 0x2e, 0x0a, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x7d, 0x4a, 0x30, 0x5b, 0x22, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x31, 0x35, 0x39, 0x31, 0x30, 0x38, 0x39, 0x63, - 0x2d, 0x32, 0x32, 0x39, 0x64, 0x2d, 0x34, 0x35, 0x37, 0x38, 0x2d, 0x61, 0x62, 0x39, 0x34, 0x2d, - 0x61, 0x33, 0x66, 0x61, 0x33, 0x34, 0x34, 0x32, 0x64, 0x37, 0x37, 0x62, 0x22, 0x5d, 0xe2, 0x41, - 0x01, 0x02, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0xb2, 0x01, 0x0a, 0x04, - 0x73, 0x65, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x6f, 0x69, - 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, - 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x65, 0x64, 0x42, 0x7c, 0x92, 0x41, - 0x75, 0x2a, 0x04, 0x73, 0x65, 0x65, 0x64, 0x32, 0x6d, 0x54, 0x68, 0x65, 0x20, 0x53, 0x65, 0x65, - 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x20, 0x4f, 0x6e, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x65, 0x65, 0x64, 0x20, 0x6d, 0x75, 0x73, - 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, - 0x6f, 0x6e, 0x65, 0x20, 0x48, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x69, 0x6c, - 0x64, 0x20, 0x73, 0x65, 0x74, 0x2e, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x04, 0x73, 0x65, 0x65, 0x64, - 0x3a, 0xe7, 0x01, 0x92, 0x41, 0x88, 0x01, 0x0a, 0x85, 0x01, 0x2a, 0x0b, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x32, 0x76, 0x54, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, - 0x6e, 0x74, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x6f, 0x66, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, - 0x53, 0x65, 0x65, 0x64, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0xea, - 0x41, 0x58, 0x0a, 0x26, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, - 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x2e, 0x70, 0x6f, 0x6f, 0x6c, + 0x37, 0x31, 0x61, 0x61, 0x37, 0x37, 0x37, 0x2f, 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x2f, + 0x64, 0x32, 0x38, 0x62, 0x39, 0x34, 0x36, 0x62, 0x2d, 0x35, 0x33, 0x33, 0x62, 0x2d, 0x34, 0x36, + 0x36, 0x65, 0x2d, 0x62, 0x62, 0x36, 0x31, 0x2d, 0x39, 0x31, 0x64, 0x39, 0x33, 0x38, 0x37, 0x34, + 0x33, 0x38, 0x35, 0x38, 0x22, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0xab, 0x03, 0x0a, 0x0f, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x42, 0x81, 0x03, 0x92, 0x41, 0xf9, 0x02, + 0x2a, 0x0e, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, + 0x32, 0xd3, 0x02, 0x54, 0x68, 0x65, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x63, 0x68, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x65, 0x65, 0x64, 0x20, 0x28, 0x69, 0x2e, 0x65, 0x2e, 0x2c, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x48, 0x44, 0x20, 0x74, 0x72, 0x65, 0x65, 0x29, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65, + 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x48, 0x61, 0x72, 0x64, 0x65, + 0x6e, 0x65, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x53, 0x65, 0x65, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x77, + 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x20, 0x45, 0x61, 0x63, 0x68, 0x20, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x69, 0x73, + 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, + 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x42, 0x49, 0x50, 0x2d, 0x34, 0x34, + 0x3a, 0x20, 0x6d, 0x20, 0x2f, 0x20, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0xe2, 0x80, 0x99, + 0x20, 0x2f, 0x20, 0x63, 0x6f, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0xe2, 0x80, 0x99, 0x20, + 0x2f, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0xe2, 0x80, 0x99, 0x20, 0x2f, 0x20, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x2f, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x4a, 0x11, 0x5b, 0x34, 0x34, 0x2c, 0x20, 0x36, 0x30, 0x2c, + 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x5d, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x0e, 0x64, + 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x12, 0x79, 0x0a, + 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x72, 0x79, + 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x42, 0x35, 0x92, 0x41, 0x2e, 0x2a, 0x09, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x32, 0x21, 0x54, 0x68, 0x65, 0x20, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x2e, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x09, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x3a, 0x88, 0x02, 0x92, 0x41, 0x99, 0x01, 0x0a, + 0x96, 0x01, 0x2a, 0x06, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x32, 0x8b, 0x01, 0x54, 0x68, 0x65, + 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x2e, 0x20, 0x41, 0x6e, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x20, 0x63, 0x61, 0x6e, 0x20, + 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x64, 0x20, 0x4d, 0x2d, 0x6f, 0x66, 0x2d, 0x4e, 0x20, 0x73, 0x69, 0x67, + 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x69, 0x61, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x61, 0x61, + 0x53, 0x20, 0x53, 0x44, 0x4b, 0x2e, 0x20, 0x41, 0x6e, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, + 0x20, 0x69, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x61, 0x20, 0x53, 0x65, 0x65, 0x64, 0x2e, 0xea, 0x41, 0x68, 0x0a, 0x21, 0x61, 0x70, 0x69, + 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, + 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x12, 0x43, + 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, + 0x70, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x7b, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, + 0x69, 0x64, 0x7d, 0x22, 0xe6, 0x06, 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x12, 0xed, 0x02, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0xd8, 0x02, 0x92, 0x41, 0xd0, 0x02, 0x2a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x89, 0x01, + 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x2e, 0x0a, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x9d, 0x0b, 0x0a, 0x0c, 0x4d, - 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0xb7, 0x02, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0xa2, 0x02, 0x92, 0x41, 0x9a, - 0x02, 0x2a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x7e, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, - 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, - 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x70, 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6d, 0x70, 0x63, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x4a, 0x91, 0x01, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x73, - 0x2f, 0x39, 0x35, 0x32, 0x35, 0x37, 0x63, 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, 0x2d, 0x34, - 0x32, 0x34, 0x31, 0x2d, 0x62, 0x66, 0x39, 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, 0x38, 0x65, - 0x39, 0x63, 0x63, 0x39, 0x31, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x73, 0x2f, 0x33, 0x61, 0x31, 0x36, 0x38, 0x61, 0x35, 0x34, 0x2d, 0x36, 0x36, 0x36, 0x31, - 0x2d, 0x34, 0x65, 0x35, 0x61, 0x2d, 0x38, 0x62, 0x63, 0x35, 0x2d, 0x39, 0x37, 0x35, 0x39, 0x36, - 0x37, 0x31, 0x61, 0x61, 0x37, 0x37, 0x37, 0x2f, 0x6d, 0x70, 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x31, 0x32, 0x38, 0x38, 0x35, 0x31, 0x35, 0x34, 0x2d, 0x38, - 0x64, 0x36, 0x65, 0x2d, 0x34, 0x30, 0x36, 0x30, 0x2d, 0x38, 0x61, 0x64, 0x65, 0x2d, 0x35, 0x62, - 0x32, 0x62, 0x33, 0x64, 0x39, 0x31, 0x39, 0x33, 0x31, 0x37, 0x22, 0xe2, 0x41, 0x01, 0x03, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x08, 0x6d, 0x70, 0x63, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x76, 0x92, 0x41, 0x6f, 0x2a, 0x07, 0x6d, - 0x70, 0x63, 0x44, 0x61, 0x74, 0x61, 0x32, 0x64, 0x44, 0x61, 0x74, 0x61, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x73, 0x73, - 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, - 0x44, 0x4b, 0x27, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0xe2, 0x41, 0x01, 0x03, - 0x52, 0x07, 0x6d, 0x70, 0x63, 0x44, 0x61, 0x74, 0x61, 0x12, 0xe0, 0x01, 0x0a, 0x1c, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x35, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0x66, 0x92, 0x41, 0x63, 0x2a, 0x19, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x32, 0x46, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, - 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x2d, 0x72, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x48, - 0x00, 0x52, 0x19, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0xd5, 0x01, 0x0a, - 0x19, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x33, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0x62, 0x92, 0x41, 0x5f, 0x2a, 0x17, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x32, 0x44, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x61, 0x73, - 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x2d, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x48, 0x00, 0x52, 0x17, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x3a, 0xf7, 0x03, 0x92, 0x41, 0xf6, 0x02, 0x0a, 0xf3, 0x02, 0x2a, 0x0c, - 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x32, 0xe2, 0x02, 0x54, - 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, - 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x20, 0x70, 0x65, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x20, 0x4d, 0x50, 0x43, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x50, 0x6f, 0x6c, - 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x20, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, - 0x20, 0x53, 0x44, 0x4b, 0x27, 0x73, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x4d, 0x50, - 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, - 0x49, 0x44, 0x20, 0x69, 0x73, 0x20, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x64, - 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, - 0x61, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, - 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x2d, 0x72, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0xea, 0x41, 0x7a, 0x0a, 0x27, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, - 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x70, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x70, 0x63, 0x4b, 0x65, + 0x79, 0x73, 0x2f, 0x7b, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x4a, 0xbb, 0x01, 0x22, 0x70, 0x6f, 0x6f, + 0x6c, 0x73, 0x2f, 0x39, 0x35, 0x32, 0x35, 0x37, 0x63, 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, + 0x2d, 0x34, 0x32, 0x34, 0x31, 0x2d, 0x62, 0x66, 0x39, 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, + 0x38, 0x65, 0x39, 0x63, 0x63, 0x39, 0x31, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x33, 0x61, 0x31, 0x36, 0x38, 0x61, 0x35, 0x34, 0x2d, 0x36, 0x36, + 0x36, 0x31, 0x2d, 0x34, 0x65, 0x35, 0x61, 0x2d, 0x38, 0x62, 0x63, 0x35, 0x2d, 0x39, 0x37, 0x35, + 0x39, 0x36, 0x37, 0x31, 0x61, 0x61, 0x37, 0x37, 0x37, 0x2f, 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, + 0x73, 0x2f, 0x64, 0x32, 0x38, 0x62, 0x39, 0x34, 0x36, 0x62, 0x2d, 0x35, 0x33, 0x33, 0x62, 0x2d, + 0x34, 0x36, 0x36, 0x65, 0x2d, 0x62, 0x62, 0x36, 0x31, 0x2d, 0x39, 0x31, 0x64, 0x39, 0x33, 0x38, + 0x37, 0x34, 0x33, 0x38, 0x35, 0x38, 0x2f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x2f, 0x31, 0x32, 0x39, 0x36, 0x30, 0x62, 0x66, 0x37, 0x2d, 0x66, 0x32, 0x31, 0x35, 0x2d, + 0x34, 0x34, 0x63, 0x66, 0x2d, 0x38, 0x35, 0x38, 0x39, 0x2d, 0x36, 0x62, 0x38, 0x61, 0x30, 0x66, + 0x64, 0x39, 0x63, 0x34, 0x32, 0x64, 0x22, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x4d, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x42, 0x33, 0x92, 0x41, 0x2c, 0x2a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x24, 0x54, + 0x68, 0x65, 0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x69, + 0x67, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4b, + 0x65, 0x79, 0x2e, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x12, 0x89, 0x01, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x42, 0x46, 0x92, 0x41, 0x3f, 0x2a, 0x09, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x32, 0x32, 0x54, 0x68, 0x65, 0x20, 0x70, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x68, 0x61, 0x73, + 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x2e, 0xe2, 0x41, 0x01, + 0x03, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x3a, 0x8d, 0x02, 0x92, + 0x41, 0x80, 0x01, 0x0a, 0x7e, 0x2a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x32, 0x71, 0x54, 0x68, 0x65, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x64, 0x20, 0x4d, 0x2d, 0x6f, 0x66, 0x2d, 0x4e, 0x20, 0x73, 0x69, 0x67, 0x6e, + 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, + 0x73, 0x20, 0x76, 0x69, 0x61, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, + 0x44, 0x4b, 0x2e, 0xea, 0x41, 0x85, 0x01, 0x0a, 0x24, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, + 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x5d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x70, - 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6d, 0x70, 0x63, - 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x42, 0x0a, - 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xde, 0x08, 0x0a, 0x06, 0x4d, - 0x50, 0x43, 0x4b, 0x65, 0x79, 0x12, 0x9f, 0x02, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x8a, 0x02, 0x92, 0x41, 0x82, 0x02, 0x2a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x32, 0x6c, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, - 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4b, - 0x65, 0x79, 0x2e, 0x0a, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, - 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x70, 0x63, 0x4b, 0x65, - 0x79, 0x73, 0x2f, 0x7b, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x4a, - 0x8b, 0x01, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x39, 0x35, 0x32, 0x35, 0x37, 0x63, 0x35, - 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, 0x2d, 0x34, 0x32, 0x34, 0x31, 0x2d, 0x62, 0x66, 0x39, 0x37, - 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, 0x38, 0x65, 0x39, 0x63, 0x63, 0x39, 0x31, 0x2f, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x33, 0x61, 0x31, 0x36, 0x38, - 0x61, 0x35, 0x34, 0x2d, 0x36, 0x36, 0x36, 0x31, 0x2d, 0x34, 0x65, 0x35, 0x61, 0x2d, 0x38, 0x62, - 0x63, 0x35, 0x2d, 0x39, 0x37, 0x35, 0x39, 0x36, 0x37, 0x31, 0x61, 0x61, 0x37, 0x37, 0x37, 0x2f, - 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x64, 0x32, 0x38, 0x62, 0x39, 0x34, 0x36, 0x62, - 0x2d, 0x35, 0x33, 0x33, 0x62, 0x2d, 0x34, 0x36, 0x36, 0x65, 0x2d, 0x62, 0x62, 0x36, 0x31, 0x2d, - 0x39, 0x31, 0x64, 0x39, 0x33, 0x38, 0x37, 0x34, 0x33, 0x38, 0x35, 0x38, 0x22, 0xe2, 0x41, 0x01, - 0x03, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0xab, 0x03, 0x0a, 0x0f, 0x64, 0x65, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x05, 0x42, 0x81, 0x03, 0x92, 0x41, 0xf9, 0x02, 0x2a, 0x0e, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x32, 0xd3, 0x02, 0x54, 0x68, 0x65, 0x20, 0x64, - 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, - 0x6f, 0x20, 0x72, 0x65, 0x61, 0x63, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4d, 0x50, 0x43, - 0x4b, 0x65, 0x79, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x65, 0x65, - 0x64, 0x20, 0x28, 0x69, 0x2e, 0x65, 0x2e, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x6f, 0x6f, - 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x44, 0x20, 0x74, 0x72, 0x65, 0x65, - 0x29, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, - 0x20, 0x61, 0x20, 0x48, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, - 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x65, 0x65, 0x64, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, - 0x61, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, - 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, - 0x2e, 0x20, 0x45, 0x61, 0x63, 0x68, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x69, - 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x65, 0x74, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, - 0x6f, 0x20, 0x42, 0x49, 0x50, 0x2d, 0x34, 0x34, 0x3a, 0x20, 0x6d, 0x20, 0x2f, 0x20, 0x70, 0x75, - 0x72, 0x70, 0x6f, 0x73, 0x65, 0xe2, 0x80, 0x99, 0x20, 0x2f, 0x20, 0x63, 0x6f, 0x69, 0x6e, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0xe2, 0x80, 0x99, 0x20, 0x2f, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0xe2, 0x80, 0x99, 0x20, 0x2f, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x2f, 0x20, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x4a, 0x11, - 0x5b, 0x34, 0x34, 0x2c, 0x20, 0x36, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, - 0x5d, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x0e, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x61, 0x74, 0x68, 0x12, 0x79, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x69, 0x6e, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x42, 0x35, - 0x92, 0x41, 0x2e, 0x2a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x32, 0x21, - 0x54, 0x68, 0x65, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, - 0x2e, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, - 0x3a, 0x88, 0x02, 0x92, 0x41, 0x99, 0x01, 0x0a, 0x96, 0x01, 0x2a, 0x06, 0x4d, 0x50, 0x43, 0x4b, - 0x65, 0x79, 0x32, 0x8b, 0x01, 0x54, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x20, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x20, 0x41, 0x6e, 0x20, 0x4d, 0x50, 0x43, - 0x4b, 0x65, 0x79, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, - 0x74, 0x6f, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x20, 0x69, - 0x6e, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x20, 0x4d, 0x2d, - 0x6f, 0x66, 0x2d, 0x4e, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x69, 0x61, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, 0x2e, 0x20, 0x41, - 0x6e, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x20, 0x69, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x53, 0x65, 0x65, 0x64, 0x2e, - 0xea, 0x41, 0x68, 0x0a, 0x21, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, - 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x12, 0x43, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, - 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x7b, - 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0xe6, 0x06, 0x0a, 0x09, - 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0xed, 0x02, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0xd8, 0x02, 0x92, 0x41, 0xd0, 0x02, 0x2a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x89, 0x01, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, + 0x63, 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x7b, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x6f, 0x0a, 0x15, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x11, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x10, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, + 0x01, 0x01, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x22, 0x65, 0x0a, + 0x10, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x51, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x3d, 0x92, 0x41, 0x10, 0xca, 0x3e, 0x0d, 0xfa, 0x02, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x61, 0x70, 0x69, + 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, + 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x99, 0x02, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x58, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x40, 0x92, 0x41, 0x0e, 0xca, 0x3e, 0x0b, 0xfa, 0x02, 0x08, 0x70, 0x6f, 0x6f, 0x6c, + 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x28, 0x12, 0x26, 0x61, 0x70, 0x69, + 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, + 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x50, 0x0a, 0x0c, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, + 0x52, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x2c, 0x0a, + 0x0f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, 0x0d, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, + 0x22, 0xe2, 0x02, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0xc4, + 0x02, 0x0a, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0xa0, 0x02, 0x92, 0x41, 0xed, 0x01, 0x2a, 0x0c, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x32, 0x7d, 0x54, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6f, 0x6c, 0x6c, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x4c, + 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x0a, 0x20, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, + 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x4a, 0x5e, 0x22, 0x70, 0x6f, 0x6f, 0x6c, + 0x73, 0x2f, 0x39, 0x35, 0x32, 0x35, 0x37, 0x63, 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, 0x2d, + 0x34, 0x32, 0x34, 0x31, 0x2d, 0x62, 0x66, 0x39, 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, 0x38, + 0x65, 0x39, 0x63, 0x63, 0x39, 0x31, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x2f, 0x33, 0x61, 0x31, 0x36, 0x38, 0x61, 0x35, 0x34, 0x2d, 0x36, 0x36, 0x36, + 0x31, 0x2d, 0x34, 0x65, 0x35, 0x61, 0x2d, 0x38, 0x62, 0x63, 0x35, 0x2d, 0x39, 0x37, 0x35, 0x39, + 0x36, 0x37, 0x31, 0x61, 0x61, 0x37, 0x37, 0x37, 0x22, 0xe2, 0x41, 0x01, 0x03, 0xfa, 0x41, 0x28, + 0x0a, 0x26, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, + 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x74, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5b, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x47, 0x92, 0x41, + 0x15, 0xca, 0x3e, 0x12, 0xfa, 0x02, 0x0f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x28, 0x0a, 0x26, 0x61, + 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, + 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xca, 0x01, 0x0a, 0x18, + 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x60, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x48, 0x92, 0x41, 0x15, 0xca, 0x3e, 0x12, + 0xfa, 0x02, 0x0f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, + 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x29, 0x12, 0x27, 0x61, 0x70, 0x69, 0x2e, 0x64, + 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3a, 0x4c, 0x92, 0x41, 0x49, 0x0a, + 0x47, 0x2a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x2a, 0x54, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0xbb, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0e, 0x6d, 0x70, 0x63, 0x5f, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, + 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, + 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x50, 0x43, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6d, 0x70, 0x63, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x4d, 0x92, 0x41, 0x4a, 0x0a, 0x48, 0x2a, 0x19, + 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0xd9, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5a, + 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x42, + 0x92, 0x41, 0x15, 0xca, 0x3e, 0x12, 0xfa, 0x02, 0x0f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x23, 0x12, + 0x21, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, + 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x4b, + 0x65, 0x79, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x07, 0x6d, 0x70, + 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6f, + 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, + 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x42, + 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x06, 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, + 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x49, 0x64, 0x22, 0x65, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x3d, 0x92, 0x41, 0x10, 0xca, 0x3e, 0x0d, 0xfa, 0x02, 0x0a, 0x6d, + 0x70, 0x63, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x23, + 0x0a, 0x21, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, + 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, + 0x4b, 0x65, 0x79, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xe2, 0x01, 0x0a, 0x16, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x40, 0x92, 0x41, 0x10, 0xca, 0x3e, 0x0d, 0xfa, 0x02, 0x0a, 0x6d, + 0x70, 0x63, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x26, + 0x12, 0x24, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, + 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x49, + 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x09, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x23, 0x0a, 0x0a, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, + 0x41, 0x01, 0x01, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x22, 0x80, + 0x03, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0xc4, 0x02, 0x0a, 0x0c, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0xa0, 0x02, 0x92, 0x41, 0xed, 0x01, 0x2a, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x32, 0x7d, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x0a, 0x46, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, - 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x7b, 0x6d, 0x70, 0x63, 0x5f, - 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, - 0x7d, 0x4a, 0xbb, 0x01, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x39, 0x35, 0x32, 0x35, 0x37, - 0x63, 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, 0x2d, 0x34, 0x32, 0x34, 0x31, 0x2d, 0x62, 0x66, - 0x39, 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, 0x38, 0x65, 0x39, 0x63, 0x63, 0x39, 0x31, 0x2f, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x33, 0x61, 0x31, - 0x36, 0x38, 0x61, 0x35, 0x34, 0x2d, 0x36, 0x36, 0x36, 0x31, 0x2d, 0x34, 0x65, 0x35, 0x61, 0x2d, - 0x38, 0x62, 0x63, 0x35, 0x2d, 0x39, 0x37, 0x35, 0x39, 0x36, 0x37, 0x31, 0x61, 0x61, 0x37, 0x37, - 0x37, 0x2f, 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x64, 0x32, 0x38, 0x62, 0x39, 0x34, - 0x36, 0x62, 0x2d, 0x35, 0x33, 0x33, 0x62, 0x2d, 0x34, 0x36, 0x36, 0x65, 0x2d, 0x62, 0x62, 0x36, - 0x31, 0x2d, 0x39, 0x31, 0x64, 0x39, 0x33, 0x38, 0x37, 0x34, 0x33, 0x38, 0x35, 0x38, 0x2f, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x2f, 0x31, 0x32, 0x39, 0x36, 0x30, 0x62, - 0x66, 0x37, 0x2d, 0x66, 0x32, 0x31, 0x35, 0x2d, 0x34, 0x34, 0x63, 0x66, 0x2d, 0x38, 0x35, 0x38, - 0x39, 0x2d, 0x36, 0x62, 0x38, 0x61, 0x30, 0x66, 0x64, 0x39, 0x63, 0x34, 0x32, 0x64, 0x22, 0xe2, - 0x41, 0x01, 0x03, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4d, 0x0a, 0x07, 0x70, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x33, 0x92, 0x41, 0x2c, 0x2a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x24, 0x54, 0x68, 0x65, 0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x2e, 0xe2, 0x41, 0x01, 0x02, 0x52, - 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x89, 0x01, 0x0a, 0x09, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, - 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x42, 0x46, 0x92, 0x41, 0x3f, 0x2a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x32, 0x32, 0x54, 0x68, 0x65, 0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x77, - 0x68, 0x69, 0x63, 0x68, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x73, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, - 0x43, 0x4b, 0x65, 0x79, 0x2e, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x3a, 0x8d, 0x02, 0x92, 0x41, 0x80, 0x01, 0x0a, 0x7e, 0x2a, 0x09, 0x53, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x32, 0x71, 0x54, 0x68, 0x65, 0x20, 0x53, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x2e, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x63, 0x61, 0x6e, - 0x20, 0x62, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, - 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x20, 0x4d, 0x2d, 0x6f, - 0x66, 0x2d, 0x4e, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x69, 0x6e, - 0x67, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x73, 0x20, 0x76, 0x69, 0x61, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, 0x2e, 0xea, 0x41, 0x85, 0x01, 0x0a, - 0x24, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, - 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x5d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, + 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x74, 0x6f, 0x20, + 0x70, 0x6f, 0x6c, 0x6c, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x0a, 0x20, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x7b, 0x6d, - 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x6f, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, - 0x11, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x10, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x23, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x49, 0x64, 0x22, 0x65, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3d, 0x92, 0x41, 0x10, 0xca, 0x3e, 0x0d, 0xfa, - 0x02, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, - 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, - 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x99, 0x02, 0x0a, - 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x06, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x40, 0x92, 0x41, 0x0e, 0xca, 0x3e, - 0x0b, 0xfa, 0x02, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, - 0xfa, 0x41, 0x28, 0x12, 0x26, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, - 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x06, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x12, 0x50, 0x0a, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x69, 0x6e, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, - 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x2c, 0x0a, 0x0f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, - 0xe2, 0x41, 0x01, 0x01, 0x52, 0x0d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, 0x09, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x22, 0xe2, 0x02, 0x0a, 0x19, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0xc4, 0x02, 0x0a, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0xa0, 0x02, - 0x92, 0x41, 0xed, 0x01, 0x2a, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x32, 0x7d, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6f, 0x6c, 0x6c, - 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x0a, 0x20, 0x46, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, - 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, - 0x7d, 0x4a, 0x5e, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x39, 0x35, 0x32, 0x35, 0x37, 0x63, - 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, 0x2d, 0x34, 0x32, 0x34, 0x31, 0x2d, 0x62, 0x66, 0x39, - 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, 0x38, 0x65, 0x39, 0x63, 0x63, 0x39, 0x31, 0x2f, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x33, 0x61, 0x31, 0x36, - 0x38, 0x61, 0x35, 0x34, 0x2d, 0x36, 0x36, 0x36, 0x31, 0x2d, 0x34, 0x65, 0x35, 0x61, 0x2d, 0x38, - 0x62, 0x63, 0x35, 0x2d, 0x39, 0x37, 0x35, 0x39, 0x36, 0x37, 0x31, 0x61, 0x61, 0x37, 0x37, 0x37, - 0x22, 0xe2, 0x41, 0x01, 0x03, 0xfa, 0x41, 0x28, 0x0a, 0x26, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, + 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x4a, 0x5e, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x39, 0x35, + 0x32, 0x35, 0x37, 0x63, 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, 0x2d, 0x34, 0x32, 0x34, 0x31, + 0x2d, 0x62, 0x66, 0x39, 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, 0x38, 0x65, 0x39, 0x63, 0x63, + 0x39, 0x31, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, + 0x33, 0x61, 0x31, 0x36, 0x38, 0x61, 0x35, 0x34, 0x2d, 0x36, 0x36, 0x36, 0x31, 0x2d, 0x34, 0x65, + 0x35, 0x61, 0x2d, 0x38, 0x62, 0x63, 0x35, 0x2d, 0x39, 0x37, 0x35, 0x39, 0x36, 0x37, 0x31, 0x61, + 0x61, 0x37, 0x37, 0x37, 0x22, 0xe2, 0x41, 0x01, 0x03, 0xfa, 0x41, 0x28, 0x0a, 0x26, 0x61, 0x70, + 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, + 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x12, 0x1e, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x22, 0x85, 0x02, 0x0a, 0x1b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x6a, 0x0a, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x47, 0x92, 0x41, 0x15, 0xca, 0x3e, 0x12, 0xfa, + 0x02, 0x0f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, + 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x28, 0x0a, 0x26, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x52, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x74, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x47, 0x92, 0x41, 0x15, 0xca, 0x3e, 0x12, 0xfa, 0x02, 0x0f, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, - 0x01, 0x02, 0xfa, 0x41, 0x28, 0x0a, 0x26, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, - 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0xca, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x60, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x48, 0x92, 0x41, 0x15, 0xca, 0x3e, 0x12, 0xfa, 0x02, 0x0f, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, - 0x29, 0x12, 0x27, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, - 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, - 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x3a, 0x4c, 0x92, 0x41, 0x49, 0x0a, 0x47, 0x2a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x4d, - 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x2a, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4c, 0x69, - 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x22, 0xbb, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, - 0x0a, 0x0e, 0x6d, 0x70, 0x63, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, - 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0d, 0x6d, 0x70, 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, - 0x4d, 0x92, 0x41, 0x4a, 0x0a, 0x48, 0x2a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x32, 0x2b, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0xd9, - 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5a, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x42, 0x92, 0x41, 0x15, 0xca, 0x3e, 0x12, 0xfa, 0x02, + 0x52, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x55, 0x0a, + 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3d, 0x92, + 0x41, 0x10, 0xca, 0x3e, 0x0d, 0xfa, 0x02, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x61, 0x70, 0x69, 0x2e, 0x64, + 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x06, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, 0x09, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x22, 0xe5, 0x02, 0x0a, 0x1c, 0x50, 0x72, + 0x65, 0x70, 0x61, 0x72, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, + 0x76, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0xc4, 0x02, 0x0a, 0x0c, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0xa0, 0x02, 0x92, 0x41, 0xed, 0x01, 0x2a, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x32, 0x7d, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x74, 0x6f, 0x20, + 0x70, 0x6f, 0x6c, 0x6c, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x0a, 0x20, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, + 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x4a, 0x5e, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x39, 0x35, + 0x32, 0x35, 0x37, 0x63, 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, 0x2d, 0x34, 0x32, 0x34, 0x31, + 0x2d, 0x62, 0x66, 0x39, 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, 0x38, 0x65, 0x39, 0x63, 0x63, + 0x39, 0x31, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, + 0x33, 0x61, 0x31, 0x36, 0x38, 0x61, 0x35, 0x34, 0x2d, 0x36, 0x36, 0x36, 0x31, 0x2d, 0x34, 0x65, + 0x35, 0x61, 0x2d, 0x38, 0x62, 0x63, 0x35, 0x2d, 0x39, 0x37, 0x35, 0x39, 0x36, 0x37, 0x31, 0x61, + 0x61, 0x37, 0x37, 0x37, 0x22, 0xe2, 0x41, 0x01, 0x03, 0xfa, 0x41, 0x28, 0x0a, 0x26, 0x61, 0x70, + 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, + 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x22, 0x84, 0x02, 0x0a, 0x1a, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x6a, 0x0a, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x47, 0x92, 0x41, 0x15, 0xca, 0x3e, 0x12, 0xfa, 0x02, 0x0f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, - 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x23, 0x12, 0x21, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, + 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x28, 0x0a, 0x26, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x07, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x06, 0x6d, - 0x70, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, - 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x22, 0x65, 0x0a, 0x10, 0x47, 0x65, - 0x74, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3d, 0x92, 0x41, - 0x10, 0xca, 0x3e, 0x0d, 0xfa, 0x02, 0x0a, 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, + 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x55, 0x0a, 0x06, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3d, 0x92, 0x41, + 0x10, 0xca, 0x3e, 0x0d, 0xfa, 0x02, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x22, 0xe2, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x06, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x40, 0x92, 0x41, - 0x10, 0xca, 0x3e, 0x0d, 0xfa, 0x02, 0x0a, 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, - 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x26, 0x12, 0x24, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, - 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x06, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x49, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x6f, 0x69, 0x6e, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, - 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x12, 0x23, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, 0x09, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x22, 0x80, 0x03, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x06, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, 0x09, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x22, 0xe4, 0x02, 0x0a, 0x1b, 0x50, 0x72, 0x65, + 0x70, 0x61, 0x72, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0xc4, 0x02, 0x0a, 0x0c, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0xa0, 0x02, 0x92, 0x41, 0xed, 0x01, 0x2a, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x32, 0x7d, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6f, + 0x6c, 0x6c, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x0a, 0x20, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, + 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x69, 0x64, 0x7d, 0x4a, 0x5e, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x39, 0x35, 0x32, 0x35, + 0x37, 0x63, 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, 0x2d, 0x34, 0x32, 0x34, 0x31, 0x2d, 0x62, + 0x66, 0x39, 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, 0x38, 0x65, 0x39, 0x63, 0x63, 0x39, 0x31, + 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x33, 0x61, + 0x31, 0x36, 0x38, 0x61, 0x35, 0x34, 0x2d, 0x36, 0x36, 0x36, 0x31, 0x2d, 0x34, 0x65, 0x35, 0x61, + 0x2d, 0x38, 0x62, 0x63, 0x35, 0x2d, 0x39, 0x37, 0x35, 0x39, 0x36, 0x37, 0x31, 0x61, 0x61, 0x37, + 0x37, 0x37, 0x22, 0xe2, 0x41, 0x01, 0x03, 0xfa, 0x41, 0x28, 0x0a, 0x26, 0x61, 0x70, 0x69, 0x2e, + 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, + 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, + 0xfa, 0x01, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x6a, 0x0a, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x47, 0x92, 0x41, 0x15, 0xca, + 0x3e, 0x12, 0xfa, 0x02, 0x0f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x28, 0x0a, 0x26, 0x61, 0x70, 0x69, + 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, + 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x52, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x12, 0x55, 0x0a, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x3d, 0x92, 0x41, 0x10, 0xca, 0x3e, 0x0d, 0xfa, 0x02, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x61, 0x70, + 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, + 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, + 0x01, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x22, 0xef, 0x04, 0x0a, + 0x11, 0x41, 0x64, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0xc4, 0x02, 0x0a, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0xa0, 0x02, 0x92, 0x41, 0xed, 0x01, 0x2a, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x32, 0x7d, @@ -1650,252 +2308,520 @@ var file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_rawDesc = []byte{ 0x03, 0xfa, 0x41, 0x28, 0x0a, 0x26, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0b, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1e, 0x0a, 0x07, 0x70, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, - 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x32, 0xef, 0x1c, 0x0a, 0x0d, 0x4d, 0x50, - 0x43, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8d, 0x02, 0x0a, 0x0e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x31, - 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, - 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x22, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0xa3, 0x01, 0x92, 0x41, 0x6e, 0x12, 0x0e, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x5c, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x2e, 0x20, 0x41, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x6d, 0x75, - 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, - 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, - 0x65, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0xda, 0x41, 0x11, 0x72, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x3a, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0xb6, 0x01, 0x0a, 0x09, - 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2c, 0x2e, 0x63, 0x6f, 0x69, 0x6e, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, - 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, - 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x57, 0x92, 0x41, 0x31, - 0x12, 0x09, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x24, 0x52, 0x65, 0x74, - 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x61, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, - 0x62, 0x79, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0x2e, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, - 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xcc, 0x04, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x34, 0x2e, 0x63, 0x6f, 0x69, - 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, - 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, - 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0xe1, 0x03, 0x92, 0x41, 0xd5, 0x02, 0x12, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x1a, 0xbf, 0x02, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, - 0x65, 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2c, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x65, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6d, - 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, - 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x48, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, 0x43, 0x68, - 0x69, 0x6c, 0x64, 0x2e, 0x0a, 0x0a, 0x20, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x63, 0x61, 0x6c, - 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x4c, - 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6f, 0x6c, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, 0x27, 0x73, 0x20, 0x43, 0x6f, 0x6d, - 0x70, 0x75, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0xca, 0x41, 0x28, 0x0a, 0x0b, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x19, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xda, 0x41, 0x23, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2c, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x31, 0x3a, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x22, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x6f, - 0x6f, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x73, 0x12, 0xdc, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x31, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, + 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x92, 0x02, 0x0a, 0x15, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0xdc, 0x01, 0x92, 0x41, 0xd4, 0x01, + 0x2a, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x32, 0x96, 0x01, 0x54, 0x68, 0x65, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x62, 0x79, 0x20, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x43, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x41, 0x64, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x50, 0x43, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, 0x2e, 0x0a, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x3a, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x7d, 0x4a, 0x30, 0x5b, 0x22, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x31, 0x35, + 0x39, 0x31, 0x30, 0x38, 0x39, 0x63, 0x2d, 0x32, 0x32, 0x39, 0x64, 0x2d, 0x34, 0x35, 0x37, 0x38, + 0x2d, 0x61, 0x62, 0x39, 0x34, 0x2d, 0x61, 0x33, 0x66, 0x61, 0x33, 0x34, 0x34, 0x32, 0x64, 0x37, + 0x37, 0x62, 0x22, 0x5d, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x14, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x68, + 0x0a, 0x13, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x3d, 0x92, 0x41, 0x10, 0xca, 0x3e, 0x0d, 0xfa, 0x02, 0x0a, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x23, 0x0a, + 0x21, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, + 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0xcf, 0x3b, 0x0a, 0x0d, 0x4d, 0x50, 0x43, + 0x4b, 0x65, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8d, 0x02, 0x0a, 0x0e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x31, 0x2e, + 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, + 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x22, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x22, 0xa3, 0x01, 0x92, 0x41, 0x6e, 0x12, 0x0e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x5c, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x2e, 0x20, 0x41, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x6d, 0x75, 0x73, + 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, + 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, + 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0xda, 0x41, 0x11, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x3a, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0xb6, 0x01, 0x0a, 0x09, 0x47, + 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2c, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, + 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, + 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x69, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x57, 0x92, 0x41, 0x31, 0x12, + 0x09, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x24, 0x52, 0x65, 0x74, 0x72, + 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x61, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x62, + 0x79, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2e, + 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, + 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x2f, 0x2a, 0x7d, 0x12, 0xcc, 0x04, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x34, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, - 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x22, 0x6e, 0x92, 0x41, 0x3b, 0x12, 0x0e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x1a, 0x29, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, + 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe1, + 0x03, 0x92, 0x41, 0xd5, 0x02, 0x12, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x1a, 0xbf, 0x02, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x2e, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, - 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, - 0x2f, 0x2a, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, - 0x2a, 0x7d, 0x12, 0xa9, 0x03, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, + 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x65, + 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2c, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x65, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, + 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x48, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x2e, 0x0a, 0x0a, 0x20, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x63, 0x61, 0x6c, 0x6c, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x4c, 0x69, + 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x70, 0x6f, 0x6c, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, 0x27, 0x73, 0x20, 0x43, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0xca, 0x41, 0x28, 0x0a, 0x0b, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x19, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0xda, 0x41, 0x23, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2c, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x31, 0x3a, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, + 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x6f, 0x6f, + 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x73, 0x12, 0xdc, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x31, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, + 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, - 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, - 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, - 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa6, 0x02, 0x92, 0x41, 0xe0, 0x01, 0x12, 0x11, 0x4c, 0x69, - 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, - 0xca, 0x01, 0x4c, 0x69, 0x73, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x20, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, - 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, - 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x2e, 0x0a, 0x0a, 0x20, 0x55, 0x73, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, - 0x41, 0x50, 0x49, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, - 0x20, 0x53, 0x44, 0x4b, 0x27, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x4d, 0x50, - 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0xda, 0x41, 0x06, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x12, 0x31, 0x2f, 0x76, 0x31, - 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x2a, - 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x7d, - 0x2f, 0x6d, 0x70, 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xdf, - 0x02, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x12, - 0x2f, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x50, - 0x43, 0x4b, 0x65, 0x79, 0x22, 0xf9, 0x01, 0x92, 0x41, 0xa8, 0x01, 0x12, 0x0c, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x1a, 0x97, 0x01, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x2e, 0x20, 0x54, - 0x68, 0x65, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x48, - 0x61, 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x69, 0x6e, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x53, 0x65, 0x65, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x22, 0x6e, 0x92, 0x41, 0x3b, 0x12, 0x0e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x1a, 0x29, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, + 0x73, 0x20, 0x61, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, + 0x62, 0x79, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x2e, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, + 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, + 0x2a, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x2a, + 0x7d, 0x12, 0xa9, 0x03, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, + 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, + 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, + 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa6, 0x02, 0x92, 0x41, 0xe0, 0x01, 0x12, 0x11, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0xca, + 0x01, 0x4c, 0x69, 0x73, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x70, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4b, - 0x65, 0x79, 0x2e, 0xda, 0x41, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x6d, 0x70, 0x63, - 0x5f, 0x6b, 0x65, 0x79, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x3a, 0x07, 0x6d, 0x70, 0x63, 0x5f, - 0x6b, 0x65, 0x79, 0x22, 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x3d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x73, - 0x12, 0xce, 0x01, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x12, 0x2c, + 0x75, 0x70, 0x2e, 0x0a, 0x0a, 0x20, 0x55, 0x73, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, + 0x50, 0x49, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, + 0x53, 0x44, 0x4b, 0x27, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x4d, 0x50, 0x43, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0xda, 0x41, 0x06, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x12, 0x31, 0x2f, 0x76, 0x31, 0x2f, + 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x2a, 0x2f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, + 0x6d, 0x70, 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xdf, 0x02, + 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x12, 0x2f, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, - 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, - 0x50, 0x43, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x63, - 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, - 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, - 0x22, 0x6f, 0x92, 0x41, 0x32, 0x12, 0x09, 0x47, 0x65, 0x74, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, - 0x1a, 0x25, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x4d, - 0x50, 0x43, 0x4b, 0x65, 0x79, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2e, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x2d, 0x12, 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x50, 0x43, + 0x4b, 0x65, 0x79, 0x22, 0xf9, 0x01, 0x92, 0x41, 0xa8, 0x01, 0x12, 0x0c, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x1a, 0x97, 0x01, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x2e, 0x20, 0x54, 0x68, + 0x65, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x48, 0x61, + 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x53, 0x65, 0x65, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, + 0x79, 0x2e, 0xda, 0x41, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x6d, 0x70, 0x63, 0x5f, + 0x6b, 0x65, 0x79, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x3a, 0x07, 0x6d, 0x70, 0x63, 0x5f, 0x6b, + 0x65, 0x79, 0x22, 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x2f, 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x2a, - 0x7d, 0x12, 0xce, 0x03, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x32, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, - 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe7, 0x02, 0x92, 0x41, 0xde, 0x01, 0x12, - 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x1a, 0xc9, 0x01, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, 0x53, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, - 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x2e, 0x0a, 0x0a, 0x20, 0x41, 0x66, 0x74, 0x65, 0x72, - 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x75, - 0x73, 0x65, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6f, 0x6c, 0x6c, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, 0x27, 0x73, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0xca, 0x41, 0x24, - 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x17, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xda, 0x41, 0x10, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x3a, 0x09, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x38, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x2f, 0x6d, 0x70, 0x63, - 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x1a, 0xb6, 0x07, 0x92, 0x41, 0x87, 0x07, 0x12, 0x84, 0x07, 0x4d, 0x50, 0x43, 0x4b, - 0x65, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x73, 0x20, 0x41, 0x50, 0x49, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x2d, 0x70, 0x61, 0x72, 0x74, 0x79, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x4d, 0x50, 0x43, 0x29, 0x2e, 0x20, 0x49, 0x74, 0x20, - 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, - 0x64, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x2d, 0x73, 0x69, 0x64, 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, 0x2e, 0x20, - 0x54, 0x68, 0x65, 0x20, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, - 0x63, 0x20, 0x4b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x20, 0x75, 0x6e, 0x64, 0x65, - 0x72, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x69, - 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x69, 0x73, - 0x74, 0x69, 0x63, 0x20, 0x28, 0x48, 0x44, 0x29, 0x20, 0x54, 0x72, 0x65, 0x65, 0x2c, 0x20, 0x66, - 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x42, 0x49, 0x50, 0x2d, - 0x33, 0x32, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x42, 0x49, 0x50, 0x2d, 0x34, 0x34, 0x2e, 0x20, 0x54, - 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x77, 0x20, - 0x69, 0x73, 0x20, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x3a, 0x0a, 0x20, - 0x31, 0x2e, 0x20, 0x43, 0x61, 0x6c, 0x6c, 0x20, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x2e, 0x0a, 0x20, 0x32, 0x2e, 0x20, 0x43, 0x61, 0x6c, 0x6c, 0x20, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x77, - 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x61, 0x73, 0x20, 0x69, 0x74, 0x73, - 0x20, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x48, 0x61, - 0x72, 0x64, 0x65, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x73, 0x65, 0x74, 0x20, - 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x65, 0x65, 0x64, 0x2e, 0x0a, 0x20, 0x33, 0x2e, - 0x20, 0x50, 0x6f, 0x6c, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x75, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, 0x2e, 0x0a, 0x20, 0x34, 0x2e, 0x20, 0x43, 0x61, - 0x6c, 0x6c, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x2c, - 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x20, - 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, - 0x0a, 0x20, 0x35, 0x2e, 0x20, 0x43, 0x61, 0x6c, 0x6c, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x66, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x0a, 0x20, 0x36, 0x2e, 0x20, 0x50, 0x6f, 0x6c, 0x6c, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x53, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x4c, 0x69, - 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x73, 0x69, - 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, 0x2e, - 0xca, 0x41, 0x28, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, - 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x77, 0x61, - 0x61, 0x73, 0x2f, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x42, 0xb6, 0x01, 0x5a, 0x4c, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, - 0x61, 0x73, 0x65, 0x2f, 0x77, 0x61, 0x61, 0x73, 0x2d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2d, - 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x2d, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, - 0x6f, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x2f, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x76, 0x31, 0x92, 0x41, 0x65, 0x12, - 0x12, 0x0a, 0x0b, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x73, 0x20, 0x41, 0x50, 0x49, 0x32, 0x03, - 0x31, 0x2e, 0x30, 0x1a, 0x28, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, - 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x77, 0x61, 0x61, 0x73, 0x2f, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2a, 0x01, 0x02, - 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, - 0x6f, 0x6e, 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, - 0x6a, 0x73, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x12, + 0xce, 0x01, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x2e, + 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, + 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x50, + 0x43, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x63, 0x6f, + 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, + 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x22, + 0x6f, 0x92, 0x41, 0x32, 0x12, 0x09, 0x47, 0x65, 0x74, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x1a, + 0x25, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x4d, 0x50, + 0x43, 0x4b, 0x65, 0x79, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2e, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x2d, 0x12, 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, + 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x2f, 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x2a, 0x7d, + 0x12, 0xcd, 0x03, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x12, 0x32, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe6, 0x02, 0x92, 0x41, 0xdd, 0x01, 0x12, 0x0f, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x1a, + 0xc9, 0x01, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, 0x53, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x20, 0x4d, + 0x50, 0x43, 0x4b, 0x65, 0x79, 0x2e, 0x0a, 0x0a, 0x20, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x75, 0x73, 0x65, + 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6f, 0x6c, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, 0x27, 0x73, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x75, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0xca, 0x41, 0x24, 0x0a, 0x09, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0xda, 0x41, 0x10, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x3a, 0x09, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x38, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x2f, 0x6d, 0x70, 0x63, 0x4b, 0x65, + 0x79, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x12, 0xc1, 0x07, 0x0a, 0x14, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x12, 0x37, 0x2e, 0x63, 0x6f, 0x69, 0x6e, + 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, + 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, + 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0xd0, 0x06, 0x92, 0x41, 0xbf, 0x05, 0x12, 0x14, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, + 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x1a, 0xa6, + 0x05, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x63, + 0x68, 0x69, 0x76, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x0a, 0x0a, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x69, 0x63, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x73, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x73, + 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x2e, 0x0a, 0x0a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, + 0x65, 0x20, 0x61, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x74, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, + 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x4d, 0x50, 0x43, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x63, 0x68, + 0x69, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, + 0x65, 0x64, 0x2e, 0x20, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x70, 0x6f, 0x6c, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, 0x27, 0x73, 0x20, 0x43, 0x6f, 0x6d, + 0x70, 0x75, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, 0x20, 0x4f, 0x6e, + 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x69, + 0x7a, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, 0x20, + 0x74, 0x6f, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x61, 0x63, 0x68, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x73, 0x20, + 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0xca, 0x41, 0x2b, 0x0a, 0x0b, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1c, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0xda, 0x41, 0x13, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x2c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x43, 0x3a, 0x01, 0x2a, 0x22, 0x3e, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x3d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x2a, 0x2f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, + 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x63, + 0x68, 0x69, 0x76, 0x65, 0x12, 0x85, 0x09, 0x0a, 0x13, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x36, 0x2e, 0x63, + 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, + 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, + 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, + 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x96, 0x08, 0x92, 0x41, 0x87, 0x07, 0x12, 0x13, 0x50, 0x72, 0x65, 0x70, + 0x61, 0x72, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, + 0xef, 0x06, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x73, 0x20, 0x61, 0x20, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, + 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x0a, 0x0a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x63, + 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x69, 0x63, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x73, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x20, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, + 0x79, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x6e, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x0a, 0x0a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x6d, 0x75, 0x73, + 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x73, + 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x4d, 0x50, 0x43, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x65, 0x70, + 0x61, 0x72, 0x65, 0x64, 0x2e, 0x20, 0x0a, 0x0a, 0x20, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x52, 0x50, 0x43, 0x2c, + 0x20, 0x75, 0x73, 0x65, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6f, 0x6c, 0x6c, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x50, + 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, + 0x44, 0x4b, 0x27, 0x73, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x20, 0x0a, 0x0a, 0x20, 0x4f, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, + 0x63, 0x61, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, + 0x20, 0x53, 0x44, 0x4b, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x20, 0x62, 0x75, 0x6e, 0x64, + 0x6c, 0x65, 0x2e, 0x20, 0x0a, 0x0a, 0x20, 0x57, 0x65, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x20, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x73, + 0x65, 0x63, 0x75, 0x72, 0x65, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x73, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x2e, 0x20, 0x0a, 0x0a, + 0x20, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x6c, 0x6f, 0x73, + 0x65, 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x69, 0x72, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x73, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6f, 0x6e, 0x20, 0x61, 0x20, 0x6e, 0x65, + 0x77, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x41, 0x64, + 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x52, 0x50, 0x43, 0x20, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x2e, 0xca, 0x41, 0x2a, 0x0a, 0x0b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x12, 0x1b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xda, 0x41, + 0x13, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2c, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x42, 0x3a, 0x01, 0x2a, 0x22, 0x3d, 0x2f, + 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x3d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0xd7, 0x08, 0x0a, + 0x09, 0x41, 0x64, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2c, 0x2e, 0x63, 0x6f, 0x69, + 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, + 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xfc, 0x07, 0x92, 0x41, 0x81, 0x07, 0x12, 0x09, + 0x41, 0x64, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x1a, 0xf3, 0x06, 0x41, 0x64, 0x64, 0x73, + 0x20, 0x61, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x20, + 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x20, 0x0a, 0x0a, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, + 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x52, 0x50, 0x43, 0x2e, 0x20, + 0x0a, 0x0a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x20, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, + 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x20, 0x52, 0x50, + 0x43, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x0a, 0x0a, 0x20, + 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x52, 0x50, 0x43, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x70, 0x6f, 0x6c, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x41, 0x64, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, + 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, 0x27, + 0x73, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x41, 0x64, 0x64, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x57, 0x61, 0x61, + 0x53, 0x20, 0x53, 0x44, 0x4b, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x69, 0x63, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x73, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x20, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x20, 0x20, 0x0a, 0x0a, 0x4f, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x6e, + 0x65, 0x77, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6c, + 0x6c, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x79, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2e, 0x20, 0x20, 0x0a, 0x0a, 0x4d, + 0x50, 0x43, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x52, 0x50, 0x43, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x66, + 0x75, 0x74, 0x75, 0x72, 0x65, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x61, 0x6e, + 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0xca, + 0x41, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, + 0x11, 0x41, 0x64, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0xda, 0x41, 0x13, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x2c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x3a, 0x01, + 0x2a, 0x22, 0x33, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x3d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x61, 0x64, 0x64, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0xb8, 0x05, 0x0a, 0x0c, 0x52, 0x65, 0x76, 0x6f, 0x6b, + 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2f, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, + 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0xde, 0x04, 0x92, 0x41, 0xb7, 0x04, 0x12, 0x0c, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x1a, 0xa6, 0x04, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x73, 0x20, + 0x61, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x2e, 0x0a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, + 0x66, 0x2e, 0x0a, 0x20, 0x4f, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x64, 0x2c, 0x20, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x6d, 0x61, + 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, + 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, + 0x61, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x2c, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, + 0x63, 0x61, 0x6e, 0x20, 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x20, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x79, + 0x20, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x73, 0x20, 0x69, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x74, + 0x20, 0x6f, 0x66, 0x2e, 0x20, 0x55, 0x73, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, + 0x49, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x63, 0x65, 0x6e, 0x61, 0x72, 0x69, 0x6f, 0x73, 0x20, 0x73, + 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x2c, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, + 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x2e, 0x0a, 0x20, 0x45, 0x6e, 0x73, + 0x75, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x69, 0x73, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x79, + 0x6f, 0x75, 0x72, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, + 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x64, 0x64, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x20, 0x52, 0x50, 0x43, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, + 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x52, 0x65, 0x76, + 0x6f, 0x6b, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x52, 0x50, 0x43, 0x2e, 0xda, 0x41, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, + 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3a, 0x72, 0x65, 0x76, 0x6f, 0x6b, + 0x65, 0x1a, 0xb6, 0x07, 0x92, 0x41, 0x87, 0x07, 0x12, 0x84, 0x07, 0x4d, 0x50, 0x43, 0x4b, 0x65, + 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x73, 0x20, 0x41, 0x50, 0x49, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x72, 0x79, 0x70, + 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x2d, 0x70, 0x61, 0x72, 0x74, 0x79, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x4d, 0x50, 0x43, 0x29, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x73, + 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2d, + 0x73, 0x69, 0x64, 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, 0x2e, 0x20, 0x54, + 0x68, 0x65, 0x20, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, + 0x20, 0x4b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, + 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x69, 0x63, + 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, + 0x69, 0x63, 0x20, 0x28, 0x48, 0x44, 0x29, 0x20, 0x54, 0x72, 0x65, 0x65, 0x2c, 0x20, 0x66, 0x6f, + 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x42, 0x49, 0x50, 0x2d, 0x33, + 0x32, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x42, 0x49, 0x50, 0x2d, 0x34, 0x34, 0x2e, 0x20, 0x54, 0x68, + 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x77, 0x20, 0x69, + 0x73, 0x20, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x3a, 0x0a, 0x20, 0x31, + 0x2e, 0x20, 0x43, 0x61, 0x6c, 0x6c, 0x20, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x2e, 0x0a, 0x20, 0x32, 0x2e, 0x20, 0x43, 0x61, 0x6c, 0x6c, 0x20, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, + 0x64, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x61, 0x73, 0x20, 0x69, 0x74, 0x73, 0x20, + 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x48, 0x61, 0x72, + 0x64, 0x65, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x65, 0x65, 0x64, 0x2e, 0x0a, 0x20, 0x33, 0x2e, 0x20, + 0x50, 0x6f, 0x6c, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, + 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, 0x2e, 0x0a, 0x20, 0x34, 0x2e, 0x20, 0x43, 0x61, 0x6c, + 0x6c, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x2c, 0x20, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x20, 0x64, + 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x0a, + 0x20, 0x35, 0x2e, 0x20, 0x43, 0x61, 0x6c, 0x6c, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, + 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x2e, 0x0a, 0x20, 0x36, 0x2e, 0x20, 0x50, 0x6f, 0x6c, 0x6c, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, + 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x73, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, 0x2e, 0xca, + 0x41, 0x28, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, + 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x77, 0x61, 0x61, + 0x73, 0x2f, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x42, 0xb6, 0x01, 0x5a, 0x4c, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, + 0x73, 0x65, 0x2f, 0x77, 0x61, 0x61, 0x73, 0x2d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2d, 0x6c, + 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x2d, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, + 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, + 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x76, 0x31, 0x92, 0x41, 0x65, 0x12, 0x12, + 0x0a, 0x0b, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x73, 0x20, 0x41, 0x50, 0x49, 0x32, 0x03, 0x31, + 0x2e, 0x30, 0x1a, 0x28, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, + 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x77, + 0x61, 0x61, 0x73, 0x2f, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2a, 0x01, 0x02, 0x32, + 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1910,62 +2836,81 @@ func file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_rawDescGZIP() []byte { return file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_rawDescData } -var file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes = make([]protoimpl.MessageInfo, 18) +var file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes = make([]protoimpl.MessageInfo, 25) var file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_goTypes = []interface{}{ - (*Device)(nil), // 0: coinbase.cloud.mpc_keys.v1.Device - (*HardenedChild)(nil), // 1: coinbase.cloud.mpc_keys.v1.HardenedChild - (*Seed)(nil), // 2: coinbase.cloud.mpc_keys.v1.Seed - (*DeviceGroup)(nil), // 3: coinbase.cloud.mpc_keys.v1.DeviceGroup - (*MPCOperation)(nil), // 4: coinbase.cloud.mpc_keys.v1.MPCOperation - (*MPCKey)(nil), // 5: coinbase.cloud.mpc_keys.v1.MPCKey - (*Signature)(nil), // 6: coinbase.cloud.mpc_keys.v1.Signature - (*RegisterDeviceRequest)(nil), // 7: coinbase.cloud.mpc_keys.v1.RegisterDeviceRequest - (*GetDeviceRequest)(nil), // 8: coinbase.cloud.mpc_keys.v1.GetDeviceRequest - (*CreateDeviceGroupRequest)(nil), // 9: coinbase.cloud.mpc_keys.v1.CreateDeviceGroupRequest - (*CreateDeviceGroupMetadata)(nil), // 10: coinbase.cloud.mpc_keys.v1.CreateDeviceGroupMetadata - (*GetDeviceGroupRequest)(nil), // 11: coinbase.cloud.mpc_keys.v1.GetDeviceGroupRequest - (*ListMPCOperationsRequest)(nil), // 12: coinbase.cloud.mpc_keys.v1.ListMPCOperationsRequest - (*ListMPCOperationsResponse)(nil), // 13: coinbase.cloud.mpc_keys.v1.ListMPCOperationsResponse - (*CreateMPCKeyRequest)(nil), // 14: coinbase.cloud.mpc_keys.v1.CreateMPCKeyRequest - (*GetMPCKeyRequest)(nil), // 15: coinbase.cloud.mpc_keys.v1.GetMPCKeyRequest - (*CreateSignatureRequest)(nil), // 16: coinbase.cloud.mpc_keys.v1.CreateSignatureRequest - (*CreateSignatureMetadata)(nil), // 17: coinbase.cloud.mpc_keys.v1.CreateSignatureMetadata - (*v1.PublicKey)(nil), // 18: coinbase.crypto.types.v1.PublicKey - (*v1.Signature)(nil), // 19: coinbase.crypto.types.v1.Signature - (*longrunning.Operation)(nil), // 20: google.longrunning.Operation + (*Device)(nil), // 0: coinbase.cloud.mpc_keys.v1.Device + (*HardenedChild)(nil), // 1: coinbase.cloud.mpc_keys.v1.HardenedChild + (*Seed)(nil), // 2: coinbase.cloud.mpc_keys.v1.Seed + (*DeviceGroup)(nil), // 3: coinbase.cloud.mpc_keys.v1.DeviceGroup + (*MPCOperation)(nil), // 4: coinbase.cloud.mpc_keys.v1.MPCOperation + (*MPCKey)(nil), // 5: coinbase.cloud.mpc_keys.v1.MPCKey + (*Signature)(nil), // 6: coinbase.cloud.mpc_keys.v1.Signature + (*RegisterDeviceRequest)(nil), // 7: coinbase.cloud.mpc_keys.v1.RegisterDeviceRequest + (*GetDeviceRequest)(nil), // 8: coinbase.cloud.mpc_keys.v1.GetDeviceRequest + (*CreateDeviceGroupRequest)(nil), // 9: coinbase.cloud.mpc_keys.v1.CreateDeviceGroupRequest + (*CreateDeviceGroupMetadata)(nil), // 10: coinbase.cloud.mpc_keys.v1.CreateDeviceGroupMetadata + (*GetDeviceGroupRequest)(nil), // 11: coinbase.cloud.mpc_keys.v1.GetDeviceGroupRequest + (*ListMPCOperationsRequest)(nil), // 12: coinbase.cloud.mpc_keys.v1.ListMPCOperationsRequest + (*ListMPCOperationsResponse)(nil), // 13: coinbase.cloud.mpc_keys.v1.ListMPCOperationsResponse + (*CreateMPCKeyRequest)(nil), // 14: coinbase.cloud.mpc_keys.v1.CreateMPCKeyRequest + (*GetMPCKeyRequest)(nil), // 15: coinbase.cloud.mpc_keys.v1.GetMPCKeyRequest + (*CreateSignatureRequest)(nil), // 16: coinbase.cloud.mpc_keys.v1.CreateSignatureRequest + (*CreateSignatureMetadata)(nil), // 17: coinbase.cloud.mpc_keys.v1.CreateSignatureMetadata + (*PrepareDeviceArchiveRequest)(nil), // 18: coinbase.cloud.mpc_keys.v1.PrepareDeviceArchiveRequest + (*PrepareDeviceArchiveMetadata)(nil), // 19: coinbase.cloud.mpc_keys.v1.PrepareDeviceArchiveMetadata + (*PrepareDeviceBackupRequest)(nil), // 20: coinbase.cloud.mpc_keys.v1.PrepareDeviceBackupRequest + (*PrepareDeviceBackupMetadata)(nil), // 21: coinbase.cloud.mpc_keys.v1.PrepareDeviceBackupMetadata + (*AddDeviceRequest)(nil), // 22: coinbase.cloud.mpc_keys.v1.AddDeviceRequest + (*AddDeviceMetadata)(nil), // 23: coinbase.cloud.mpc_keys.v1.AddDeviceMetadata + (*RevokeDeviceRequest)(nil), // 24: coinbase.cloud.mpc_keys.v1.RevokeDeviceRequest + (*v1.PublicKey)(nil), // 25: coinbase.crypto.types.v1.PublicKey + (*v1.Signature)(nil), // 26: coinbase.crypto.types.v1.Signature + (*longrunning.Operation)(nil), // 27: google.longrunning.Operation + (*emptypb.Empty)(nil), // 28: google.protobuf.Empty } var file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_depIdxs = []int32{ 1, // 0: coinbase.cloud.mpc_keys.v1.Seed.hardened_children:type_name -> coinbase.cloud.mpc_keys.v1.HardenedChild 2, // 1: coinbase.cloud.mpc_keys.v1.DeviceGroup.seed:type_name -> coinbase.cloud.mpc_keys.v1.Seed 10, // 2: coinbase.cloud.mpc_keys.v1.MPCOperation.create_device_group_metadata:type_name -> coinbase.cloud.mpc_keys.v1.CreateDeviceGroupMetadata 17, // 3: coinbase.cloud.mpc_keys.v1.MPCOperation.create_signature_metadata:type_name -> coinbase.cloud.mpc_keys.v1.CreateSignatureMetadata - 18, // 4: coinbase.cloud.mpc_keys.v1.MPCKey.public_key:type_name -> coinbase.crypto.types.v1.PublicKey - 19, // 5: coinbase.cloud.mpc_keys.v1.Signature.signature:type_name -> coinbase.crypto.types.v1.Signature - 3, // 6: coinbase.cloud.mpc_keys.v1.CreateDeviceGroupRequest.device_group:type_name -> coinbase.cloud.mpc_keys.v1.DeviceGroup - 4, // 7: coinbase.cloud.mpc_keys.v1.ListMPCOperationsResponse.mpc_operations:type_name -> coinbase.cloud.mpc_keys.v1.MPCOperation - 5, // 8: coinbase.cloud.mpc_keys.v1.CreateMPCKeyRequest.mpc_key:type_name -> coinbase.cloud.mpc_keys.v1.MPCKey - 6, // 9: coinbase.cloud.mpc_keys.v1.CreateSignatureRequest.signature:type_name -> coinbase.cloud.mpc_keys.v1.Signature - 7, // 10: coinbase.cloud.mpc_keys.v1.MPCKeyService.RegisterDevice:input_type -> coinbase.cloud.mpc_keys.v1.RegisterDeviceRequest - 8, // 11: coinbase.cloud.mpc_keys.v1.MPCKeyService.GetDevice:input_type -> coinbase.cloud.mpc_keys.v1.GetDeviceRequest - 9, // 12: coinbase.cloud.mpc_keys.v1.MPCKeyService.CreateDeviceGroup:input_type -> coinbase.cloud.mpc_keys.v1.CreateDeviceGroupRequest - 11, // 13: coinbase.cloud.mpc_keys.v1.MPCKeyService.GetDeviceGroup:input_type -> coinbase.cloud.mpc_keys.v1.GetDeviceGroupRequest - 12, // 14: coinbase.cloud.mpc_keys.v1.MPCKeyService.ListMPCOperations:input_type -> coinbase.cloud.mpc_keys.v1.ListMPCOperationsRequest - 14, // 15: coinbase.cloud.mpc_keys.v1.MPCKeyService.CreateMPCKey:input_type -> coinbase.cloud.mpc_keys.v1.CreateMPCKeyRequest - 15, // 16: coinbase.cloud.mpc_keys.v1.MPCKeyService.GetMPCKey:input_type -> coinbase.cloud.mpc_keys.v1.GetMPCKeyRequest - 16, // 17: coinbase.cloud.mpc_keys.v1.MPCKeyService.CreateSignature:input_type -> coinbase.cloud.mpc_keys.v1.CreateSignatureRequest - 0, // 18: coinbase.cloud.mpc_keys.v1.MPCKeyService.RegisterDevice:output_type -> coinbase.cloud.mpc_keys.v1.Device - 0, // 19: coinbase.cloud.mpc_keys.v1.MPCKeyService.GetDevice:output_type -> coinbase.cloud.mpc_keys.v1.Device - 20, // 20: coinbase.cloud.mpc_keys.v1.MPCKeyService.CreateDeviceGroup:output_type -> google.longrunning.Operation - 3, // 21: coinbase.cloud.mpc_keys.v1.MPCKeyService.GetDeviceGroup:output_type -> coinbase.cloud.mpc_keys.v1.DeviceGroup - 13, // 22: coinbase.cloud.mpc_keys.v1.MPCKeyService.ListMPCOperations:output_type -> coinbase.cloud.mpc_keys.v1.ListMPCOperationsResponse - 5, // 23: coinbase.cloud.mpc_keys.v1.MPCKeyService.CreateMPCKey:output_type -> coinbase.cloud.mpc_keys.v1.MPCKey - 5, // 24: coinbase.cloud.mpc_keys.v1.MPCKeyService.GetMPCKey:output_type -> coinbase.cloud.mpc_keys.v1.MPCKey - 20, // 25: coinbase.cloud.mpc_keys.v1.MPCKeyService.CreateSignature:output_type -> google.longrunning.Operation - 18, // [18:26] is the sub-list for method output_type - 10, // [10:18] is the sub-list for method input_type - 10, // [10:10] is the sub-list for extension type_name - 10, // [10:10] is the sub-list for extension extendee - 0, // [0:10] is the sub-list for field type_name + 19, // 4: coinbase.cloud.mpc_keys.v1.MPCOperation.prepare_device_archive_metadata:type_name -> coinbase.cloud.mpc_keys.v1.PrepareDeviceArchiveMetadata + 21, // 5: coinbase.cloud.mpc_keys.v1.MPCOperation.prepare_device_backup_metadata:type_name -> coinbase.cloud.mpc_keys.v1.PrepareDeviceBackupMetadata + 23, // 6: coinbase.cloud.mpc_keys.v1.MPCOperation.add_device_metadata:type_name -> coinbase.cloud.mpc_keys.v1.AddDeviceMetadata + 25, // 7: coinbase.cloud.mpc_keys.v1.MPCKey.public_key:type_name -> coinbase.crypto.types.v1.PublicKey + 26, // 8: coinbase.cloud.mpc_keys.v1.Signature.signature:type_name -> coinbase.crypto.types.v1.Signature + 3, // 9: coinbase.cloud.mpc_keys.v1.CreateDeviceGroupRequest.device_group:type_name -> coinbase.cloud.mpc_keys.v1.DeviceGroup + 4, // 10: coinbase.cloud.mpc_keys.v1.ListMPCOperationsResponse.mpc_operations:type_name -> coinbase.cloud.mpc_keys.v1.MPCOperation + 5, // 11: coinbase.cloud.mpc_keys.v1.CreateMPCKeyRequest.mpc_key:type_name -> coinbase.cloud.mpc_keys.v1.MPCKey + 6, // 12: coinbase.cloud.mpc_keys.v1.CreateSignatureRequest.signature:type_name -> coinbase.cloud.mpc_keys.v1.Signature + 7, // 13: coinbase.cloud.mpc_keys.v1.MPCKeyService.RegisterDevice:input_type -> coinbase.cloud.mpc_keys.v1.RegisterDeviceRequest + 8, // 14: coinbase.cloud.mpc_keys.v1.MPCKeyService.GetDevice:input_type -> coinbase.cloud.mpc_keys.v1.GetDeviceRequest + 9, // 15: coinbase.cloud.mpc_keys.v1.MPCKeyService.CreateDeviceGroup:input_type -> coinbase.cloud.mpc_keys.v1.CreateDeviceGroupRequest + 11, // 16: coinbase.cloud.mpc_keys.v1.MPCKeyService.GetDeviceGroup:input_type -> coinbase.cloud.mpc_keys.v1.GetDeviceGroupRequest + 12, // 17: coinbase.cloud.mpc_keys.v1.MPCKeyService.ListMPCOperations:input_type -> coinbase.cloud.mpc_keys.v1.ListMPCOperationsRequest + 14, // 18: coinbase.cloud.mpc_keys.v1.MPCKeyService.CreateMPCKey:input_type -> coinbase.cloud.mpc_keys.v1.CreateMPCKeyRequest + 15, // 19: coinbase.cloud.mpc_keys.v1.MPCKeyService.GetMPCKey:input_type -> coinbase.cloud.mpc_keys.v1.GetMPCKeyRequest + 16, // 20: coinbase.cloud.mpc_keys.v1.MPCKeyService.CreateSignature:input_type -> coinbase.cloud.mpc_keys.v1.CreateSignatureRequest + 18, // 21: coinbase.cloud.mpc_keys.v1.MPCKeyService.PrepareDeviceArchive:input_type -> coinbase.cloud.mpc_keys.v1.PrepareDeviceArchiveRequest + 20, // 22: coinbase.cloud.mpc_keys.v1.MPCKeyService.PrepareDeviceBackup:input_type -> coinbase.cloud.mpc_keys.v1.PrepareDeviceBackupRequest + 22, // 23: coinbase.cloud.mpc_keys.v1.MPCKeyService.AddDevice:input_type -> coinbase.cloud.mpc_keys.v1.AddDeviceRequest + 24, // 24: coinbase.cloud.mpc_keys.v1.MPCKeyService.RevokeDevice:input_type -> coinbase.cloud.mpc_keys.v1.RevokeDeviceRequest + 0, // 25: coinbase.cloud.mpc_keys.v1.MPCKeyService.RegisterDevice:output_type -> coinbase.cloud.mpc_keys.v1.Device + 0, // 26: coinbase.cloud.mpc_keys.v1.MPCKeyService.GetDevice:output_type -> coinbase.cloud.mpc_keys.v1.Device + 27, // 27: coinbase.cloud.mpc_keys.v1.MPCKeyService.CreateDeviceGroup:output_type -> google.longrunning.Operation + 3, // 28: coinbase.cloud.mpc_keys.v1.MPCKeyService.GetDeviceGroup:output_type -> coinbase.cloud.mpc_keys.v1.DeviceGroup + 13, // 29: coinbase.cloud.mpc_keys.v1.MPCKeyService.ListMPCOperations:output_type -> coinbase.cloud.mpc_keys.v1.ListMPCOperationsResponse + 5, // 30: coinbase.cloud.mpc_keys.v1.MPCKeyService.CreateMPCKey:output_type -> coinbase.cloud.mpc_keys.v1.MPCKey + 5, // 31: coinbase.cloud.mpc_keys.v1.MPCKeyService.GetMPCKey:output_type -> coinbase.cloud.mpc_keys.v1.MPCKey + 27, // 32: coinbase.cloud.mpc_keys.v1.MPCKeyService.CreateSignature:output_type -> google.longrunning.Operation + 27, // 33: coinbase.cloud.mpc_keys.v1.MPCKeyService.PrepareDeviceArchive:output_type -> google.longrunning.Operation + 27, // 34: coinbase.cloud.mpc_keys.v1.MPCKeyService.PrepareDeviceBackup:output_type -> google.longrunning.Operation + 27, // 35: coinbase.cloud.mpc_keys.v1.MPCKeyService.AddDevice:output_type -> google.longrunning.Operation + 28, // 36: coinbase.cloud.mpc_keys.v1.MPCKeyService.RevokeDevice:output_type -> google.protobuf.Empty + 25, // [25:37] is the sub-list for method output_type + 13, // [13:25] is the sub-list for method input_type + 13, // [13:13] is the sub-list for extension type_name + 13, // [13:13] is the sub-list for extension extendee + 0, // [0:13] is the sub-list for field type_name } func init() { file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_init() } @@ -2190,10 +3135,97 @@ func file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_init() { return nil } } + file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PrepareDeviceArchiveRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PrepareDeviceArchiveMetadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PrepareDeviceBackupRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PrepareDeviceBackupMetadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddDeviceRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddDeviceMetadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RevokeDeviceRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_msgTypes[4].OneofWrappers = []interface{}{ (*MPCOperation_CreateDeviceGroupMetadata)(nil), (*MPCOperation_CreateSignatureMetadata)(nil), + (*MPCOperation_PrepareDeviceArchiveMetadata)(nil), + (*MPCOperation_PrepareDeviceBackupMetadata)(nil), + (*MPCOperation_AddDeviceMetadata)(nil), } type x struct{} out := protoimpl.TypeBuilder{ @@ -2201,7 +3233,7 @@ func file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_coinbase_cloud_mpc_keys_v1_mpc_keys_proto_rawDesc, NumEnums: 0, - NumMessages: 18, + NumMessages: 25, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/go/coinbase/cloud/mpc_keys/v1/mpc_keys.pb.gw.go b/gen/go/coinbase/cloud/mpc_keys/v1/mpc_keys.pb.gw.go index 3358082..b39d456 100644 --- a/gen/go/coinbase/cloud/mpc_keys/v1/mpc_keys.pb.gw.go +++ b/gen/go/coinbase/cloud/mpc_keys/v1/mpc_keys.pb.gw.go @@ -531,6 +531,244 @@ func local_request_MPCKeyService_CreateSignature_0(ctx context.Context, marshale } +func request_MPCKeyService_PrepareDeviceArchive_0(ctx context.Context, marshaler runtime.Marshaler, client MPCKeyServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PrepareDeviceArchiveRequest + 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 { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["device_group"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "device_group") + } + + protoReq.DeviceGroup, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "device_group", err) + } + + msg, err := client.PrepareDeviceArchive(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MPCKeyService_PrepareDeviceArchive_0(ctx context.Context, marshaler runtime.Marshaler, server MPCKeyServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PrepareDeviceArchiveRequest + 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 { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["device_group"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "device_group") + } + + protoReq.DeviceGroup, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "device_group", err) + } + + msg, err := server.PrepareDeviceArchive(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MPCKeyService_PrepareDeviceBackup_0(ctx context.Context, marshaler runtime.Marshaler, client MPCKeyServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PrepareDeviceBackupRequest + 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 { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["device_group"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "device_group") + } + + protoReq.DeviceGroup, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "device_group", err) + } + + msg, err := client.PrepareDeviceBackup(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MPCKeyService_PrepareDeviceBackup_0(ctx context.Context, marshaler runtime.Marshaler, server MPCKeyServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PrepareDeviceBackupRequest + 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 { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["device_group"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "device_group") + } + + protoReq.DeviceGroup, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "device_group", err) + } + + msg, err := server.PrepareDeviceBackup(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MPCKeyService_AddDevice_0(ctx context.Context, marshaler runtime.Marshaler, client MPCKeyServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq AddDeviceRequest + 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 { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["device_group"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "device_group") + } + + protoReq.DeviceGroup, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "device_group", err) + } + + msg, err := client.AddDevice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MPCKeyService_AddDevice_0(ctx context.Context, marshaler runtime.Marshaler, server MPCKeyServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq AddDeviceRequest + 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 { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["device_group"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "device_group") + } + + protoReq.DeviceGroup, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "device_group", err) + } + + msg, err := server.AddDevice(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MPCKeyService_RevokeDevice_0(ctx context.Context, marshaler runtime.Marshaler, client MPCKeyServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RevokeDeviceRequest + 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 { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.RevokeDevice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MPCKeyService_RevokeDevice_0(ctx context.Context, marshaler runtime.Marshaler, server MPCKeyServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RevokeDeviceRequest + 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 { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.RevokeDevice(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterMPCKeyServiceHandlerServer registers the http handlers for service MPCKeyService to "mux". // UnaryRPC :call MPCKeyServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -737,6 +975,106 @@ func RegisterMPCKeyServiceHandlerServer(ctx context.Context, mux *runtime.ServeM }) + mux.Handle("POST", pattern_MPCKeyService_PrepareDeviceArchive_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/coinbase.cloud.mpc_keys.v1.MPCKeyService/PrepareDeviceArchive", runtime.WithHTTPPathPattern("/v1/{device_group=pools/*/deviceGroups/*}:prepareDeviceArchive")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MPCKeyService_PrepareDeviceArchive_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MPCKeyService_PrepareDeviceArchive_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MPCKeyService_PrepareDeviceBackup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/coinbase.cloud.mpc_keys.v1.MPCKeyService/PrepareDeviceBackup", runtime.WithHTTPPathPattern("/v1/{device_group=pools/*/deviceGroups/*}:prepareDeviceBackup")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MPCKeyService_PrepareDeviceBackup_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MPCKeyService_PrepareDeviceBackup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MPCKeyService_AddDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/coinbase.cloud.mpc_keys.v1.MPCKeyService/AddDevice", runtime.WithHTTPPathPattern("/v1/{device_group=pools/*/deviceGroups/*}:addDevice")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MPCKeyService_AddDevice_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MPCKeyService_AddDevice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MPCKeyService_RevokeDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/coinbase.cloud.mpc_keys.v1.MPCKeyService/RevokeDevice", runtime.WithHTTPPathPattern("/v1/device:revoke")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MPCKeyService_RevokeDevice_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MPCKeyService_RevokeDevice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -954,6 +1292,94 @@ func RegisterMPCKeyServiceHandlerClient(ctx context.Context, mux *runtime.ServeM }) + mux.Handle("POST", pattern_MPCKeyService_PrepareDeviceArchive_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/coinbase.cloud.mpc_keys.v1.MPCKeyService/PrepareDeviceArchive", runtime.WithHTTPPathPattern("/v1/{device_group=pools/*/deviceGroups/*}:prepareDeviceArchive")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MPCKeyService_PrepareDeviceArchive_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MPCKeyService_PrepareDeviceArchive_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MPCKeyService_PrepareDeviceBackup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/coinbase.cloud.mpc_keys.v1.MPCKeyService/PrepareDeviceBackup", runtime.WithHTTPPathPattern("/v1/{device_group=pools/*/deviceGroups/*}:prepareDeviceBackup")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MPCKeyService_PrepareDeviceBackup_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MPCKeyService_PrepareDeviceBackup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MPCKeyService_AddDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/coinbase.cloud.mpc_keys.v1.MPCKeyService/AddDevice", runtime.WithHTTPPathPattern("/v1/{device_group=pools/*/deviceGroups/*}:addDevice")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MPCKeyService_AddDevice_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MPCKeyService_AddDevice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MPCKeyService_RevokeDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/coinbase.cloud.mpc_keys.v1.MPCKeyService/RevokeDevice", runtime.WithHTTPPathPattern("/v1/device:revoke")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MPCKeyService_RevokeDevice_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MPCKeyService_RevokeDevice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -973,6 +1399,14 @@ var ( pattern_MPCKeyService_GetMPCKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4}, []string{"v1", "pools", "deviceGroups", "mpcKeys", "name"}, "")) pattern_MPCKeyService_CreateSignature_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4, 2, 5}, []string{"v1", "pools", "deviceGroups", "mpcKeys", "parent", "signatures"}, "")) + + pattern_MPCKeyService_PrepareDeviceArchive_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "pools", "deviceGroups", "device_group"}, "prepareDeviceArchive")) + + pattern_MPCKeyService_PrepareDeviceBackup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "pools", "deviceGroups", "device_group"}, "prepareDeviceBackup")) + + pattern_MPCKeyService_AddDevice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3}, []string{"v1", "pools", "deviceGroups", "device_group"}, "addDevice")) + + pattern_MPCKeyService_RevokeDevice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "device"}, "revoke")) ) var ( @@ -991,4 +1425,12 @@ var ( forward_MPCKeyService_GetMPCKey_0 = runtime.ForwardResponseMessage forward_MPCKeyService_CreateSignature_0 = runtime.ForwardResponseMessage + + forward_MPCKeyService_PrepareDeviceArchive_0 = runtime.ForwardResponseMessage + + forward_MPCKeyService_PrepareDeviceBackup_0 = runtime.ForwardResponseMessage + + forward_MPCKeyService_AddDevice_0 = runtime.ForwardResponseMessage + + forward_MPCKeyService_RevokeDevice_0 = runtime.ForwardResponseMessage ) diff --git a/gen/go/coinbase/cloud/mpc_keys/v1/mpc_keys_grpc.pb.go b/gen/go/coinbase/cloud/mpc_keys/v1/mpc_keys_grpc.pb.go index b49ebff..288c0ce 100644 --- a/gen/go/coinbase/cloud/mpc_keys/v1/mpc_keys_grpc.pb.go +++ b/gen/go/coinbase/cloud/mpc_keys/v1/mpc_keys_grpc.pb.go @@ -8,6 +8,7 @@ import ( grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" ) // This is a compile-time assertion to ensure that this generated file @@ -43,6 +44,41 @@ type MPCKeyServiceClient interface { // to poll for the pending CreateSignature operation, and use the WaaS SDK's // computeMPCOperation to complete the operation. CreateSignature(ctx context.Context, in *CreateSignatureRequest, opts ...grpc.CallOption) (*longrunning.Operation, error) + // Prepares an archive in the local storage of the given Device. The archive contains cryptographic materials + // that can be used to export MPCKeys, which have the given DeviceGroup as their parent. + // The Device specified in the request must be a member of this DeviceGroup and must participate + // in the associated MPC operation for the archive to be prepared. After calling this, + // use ListMPCOperations to poll for the pending PrepareDeviceArchive operation, and use the WaaS SDK's + // ComputeMPCOperation to complete the operation. Once the operation completes, the Device can utilize the + // WaaS SDK to export the private keys corresponding to each of the MPCKeys under this DeviceGroup. + PrepareDeviceArchive(ctx context.Context, in *PrepareDeviceArchiveRequest, opts ...grpc.CallOption) (*longrunning.Operation, error) + // Prepares a backup in the given Device. The backup contains certain cryptographic materials + // that can be used to restore MPCKeys, which have the given DeviceGroup as their parent, on a new Device. + // The Device specified in the request must be a member of this DeviceGroup and must participate in the associated + // MPC operation for the backup to be prepared. + // After calling this RPC, use ListMPCOperations to poll for the pending PrepareDeviceBackup operation, + // and use the WaaS SDK's ComputeMPCOperation to complete the operation. Once the operation completes, + // the Device can utilize WaaS SDK to download the backup bundle. We recommend storing this backup bundle securely + // in a storage provider of your choice. If the user loses access to their existing Device and wants to recover + // MPCKeys in the given DeviceGroup on a new Device, use AddDevice RPC on the MPCKeyService. + PrepareDeviceBackup(ctx context.Context, in *PrepareDeviceBackupRequest, opts ...grpc.CallOption) (*longrunning.Operation, error) + // Adds a Device to an existing DeviceGroup. Prior to this API being called, the Device must be registered using + // RegisterDevice RPC. The Device must have access to the backup created with PrepareDeviceBackup RPC to compute this + // operation. After calling this RPC, use ListMPCOperations to poll for the pending AddDevice operation, + // and use the WaaS SDK's ComputeAddDeviceMPCOperation to complete the operation. + // After the operation is computed on WaaS SDK, the Device will have access to cryptographic materials + // required to process MPCOperations for this DeviceGroup. + // Once the operation completes on MPCKeyService, the Device will be added to the given DeviceGroup as a new member + // and all existing Devices in the DeviceGroup will stay functional. + // Use the RevokeDevice RPC to remove any of the existing Devices from the DeviceGroup. + AddDevice(ctx context.Context, in *AddDeviceRequest, opts ...grpc.CallOption) (*longrunning.Operation, error) + // Revokes a registered Device. This operation removes the registered Device from all the DeviceGroups that it is a + // part of. Once the Device is revoked, cryptographic materials in your physical Device are invalidated, + // and the Device can no longer participate in any MPCOperations of the DeviceGroups it was a part of. + // Use this API in scenarios such as losing the existing Device, switching to a new physical Device, etc. + // Ensure that a new Device is successfully added to your DeviceGroups using the AddDevice RPC before invoking + // the RevokeDevice RPC. + RevokeDevice(ctx context.Context, in *RevokeDeviceRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) } type mPCKeyServiceClient struct { @@ -125,6 +161,42 @@ func (c *mPCKeyServiceClient) CreateSignature(ctx context.Context, in *CreateSig return out, nil } +func (c *mPCKeyServiceClient) PrepareDeviceArchive(ctx context.Context, in *PrepareDeviceArchiveRequest, opts ...grpc.CallOption) (*longrunning.Operation, error) { + out := new(longrunning.Operation) + err := c.cc.Invoke(ctx, "/coinbase.cloud.mpc_keys.v1.MPCKeyService/PrepareDeviceArchive", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *mPCKeyServiceClient) PrepareDeviceBackup(ctx context.Context, in *PrepareDeviceBackupRequest, opts ...grpc.CallOption) (*longrunning.Operation, error) { + out := new(longrunning.Operation) + err := c.cc.Invoke(ctx, "/coinbase.cloud.mpc_keys.v1.MPCKeyService/PrepareDeviceBackup", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *mPCKeyServiceClient) AddDevice(ctx context.Context, in *AddDeviceRequest, opts ...grpc.CallOption) (*longrunning.Operation, error) { + out := new(longrunning.Operation) + err := c.cc.Invoke(ctx, "/coinbase.cloud.mpc_keys.v1.MPCKeyService/AddDevice", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *mPCKeyServiceClient) RevokeDevice(ctx context.Context, in *RevokeDeviceRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/coinbase.cloud.mpc_keys.v1.MPCKeyService/RevokeDevice", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MPCKeyServiceServer is the server API for MPCKeyService service. // All implementations must embed UnimplementedMPCKeyServiceServer // for forward compatibility @@ -153,6 +225,41 @@ type MPCKeyServiceServer interface { // to poll for the pending CreateSignature operation, and use the WaaS SDK's // computeMPCOperation to complete the operation. CreateSignature(context.Context, *CreateSignatureRequest) (*longrunning.Operation, error) + // Prepares an archive in the local storage of the given Device. The archive contains cryptographic materials + // that can be used to export MPCKeys, which have the given DeviceGroup as their parent. + // The Device specified in the request must be a member of this DeviceGroup and must participate + // in the associated MPC operation for the archive to be prepared. After calling this, + // use ListMPCOperations to poll for the pending PrepareDeviceArchive operation, and use the WaaS SDK's + // ComputeMPCOperation to complete the operation. Once the operation completes, the Device can utilize the + // WaaS SDK to export the private keys corresponding to each of the MPCKeys under this DeviceGroup. + PrepareDeviceArchive(context.Context, *PrepareDeviceArchiveRequest) (*longrunning.Operation, error) + // Prepares a backup in the given Device. The backup contains certain cryptographic materials + // that can be used to restore MPCKeys, which have the given DeviceGroup as their parent, on a new Device. + // The Device specified in the request must be a member of this DeviceGroup and must participate in the associated + // MPC operation for the backup to be prepared. + // After calling this RPC, use ListMPCOperations to poll for the pending PrepareDeviceBackup operation, + // and use the WaaS SDK's ComputeMPCOperation to complete the operation. Once the operation completes, + // the Device can utilize WaaS SDK to download the backup bundle. We recommend storing this backup bundle securely + // in a storage provider of your choice. If the user loses access to their existing Device and wants to recover + // MPCKeys in the given DeviceGroup on a new Device, use AddDevice RPC on the MPCKeyService. + PrepareDeviceBackup(context.Context, *PrepareDeviceBackupRequest) (*longrunning.Operation, error) + // Adds a Device to an existing DeviceGroup. Prior to this API being called, the Device must be registered using + // RegisterDevice RPC. The Device must have access to the backup created with PrepareDeviceBackup RPC to compute this + // operation. After calling this RPC, use ListMPCOperations to poll for the pending AddDevice operation, + // and use the WaaS SDK's ComputeAddDeviceMPCOperation to complete the operation. + // After the operation is computed on WaaS SDK, the Device will have access to cryptographic materials + // required to process MPCOperations for this DeviceGroup. + // Once the operation completes on MPCKeyService, the Device will be added to the given DeviceGroup as a new member + // and all existing Devices in the DeviceGroup will stay functional. + // Use the RevokeDevice RPC to remove any of the existing Devices from the DeviceGroup. + AddDevice(context.Context, *AddDeviceRequest) (*longrunning.Operation, error) + // Revokes a registered Device. This operation removes the registered Device from all the DeviceGroups that it is a + // part of. Once the Device is revoked, cryptographic materials in your physical Device are invalidated, + // and the Device can no longer participate in any MPCOperations of the DeviceGroups it was a part of. + // Use this API in scenarios such as losing the existing Device, switching to a new physical Device, etc. + // Ensure that a new Device is successfully added to your DeviceGroups using the AddDevice RPC before invoking + // the RevokeDevice RPC. + RevokeDevice(context.Context, *RevokeDeviceRequest) (*emptypb.Empty, error) mustEmbedUnimplementedMPCKeyServiceServer() } @@ -184,6 +291,18 @@ func (UnimplementedMPCKeyServiceServer) GetMPCKey(context.Context, *GetMPCKeyReq func (UnimplementedMPCKeyServiceServer) CreateSignature(context.Context, *CreateSignatureRequest) (*longrunning.Operation, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateSignature not implemented") } +func (UnimplementedMPCKeyServiceServer) PrepareDeviceArchive(context.Context, *PrepareDeviceArchiveRequest) (*longrunning.Operation, error) { + return nil, status.Errorf(codes.Unimplemented, "method PrepareDeviceArchive not implemented") +} +func (UnimplementedMPCKeyServiceServer) PrepareDeviceBackup(context.Context, *PrepareDeviceBackupRequest) (*longrunning.Operation, error) { + return nil, status.Errorf(codes.Unimplemented, "method PrepareDeviceBackup not implemented") +} +func (UnimplementedMPCKeyServiceServer) AddDevice(context.Context, *AddDeviceRequest) (*longrunning.Operation, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddDevice not implemented") +} +func (UnimplementedMPCKeyServiceServer) RevokeDevice(context.Context, *RevokeDeviceRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method RevokeDevice not implemented") +} func (UnimplementedMPCKeyServiceServer) mustEmbedUnimplementedMPCKeyServiceServer() {} // UnsafeMPCKeyServiceServer may be embedded to opt out of forward compatibility for this service. @@ -341,6 +460,78 @@ func _MPCKeyService_CreateSignature_Handler(srv interface{}, ctx context.Context return interceptor(ctx, in, info, handler) } +func _MPCKeyService_PrepareDeviceArchive_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PrepareDeviceArchiveRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MPCKeyServiceServer).PrepareDeviceArchive(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/coinbase.cloud.mpc_keys.v1.MPCKeyService/PrepareDeviceArchive", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MPCKeyServiceServer).PrepareDeviceArchive(ctx, req.(*PrepareDeviceArchiveRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _MPCKeyService_PrepareDeviceBackup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PrepareDeviceBackupRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MPCKeyServiceServer).PrepareDeviceBackup(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/coinbase.cloud.mpc_keys.v1.MPCKeyService/PrepareDeviceBackup", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MPCKeyServiceServer).PrepareDeviceBackup(ctx, req.(*PrepareDeviceBackupRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _MPCKeyService_AddDevice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AddDeviceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MPCKeyServiceServer).AddDevice(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/coinbase.cloud.mpc_keys.v1.MPCKeyService/AddDevice", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MPCKeyServiceServer).AddDevice(ctx, req.(*AddDeviceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _MPCKeyService_RevokeDevice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RevokeDeviceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MPCKeyServiceServer).RevokeDevice(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/coinbase.cloud.mpc_keys.v1.MPCKeyService/RevokeDevice", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MPCKeyServiceServer).RevokeDevice(ctx, req.(*RevokeDeviceRequest)) + } + return interceptor(ctx, in, info, handler) +} + // MPCKeyService_ServiceDesc is the grpc.ServiceDesc for MPCKeyService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -380,6 +571,22 @@ var MPCKeyService_ServiceDesc = grpc.ServiceDesc{ MethodName: "CreateSignature", Handler: _MPCKeyService_CreateSignature_Handler, }, + { + MethodName: "PrepareDeviceArchive", + Handler: _MPCKeyService_PrepareDeviceArchive_Handler, + }, + { + MethodName: "PrepareDeviceBackup", + Handler: _MPCKeyService_PrepareDeviceBackup_Handler, + }, + { + MethodName: "AddDevice", + Handler: _MPCKeyService_AddDevice_Handler, + }, + { + MethodName: "RevokeDevice", + Handler: _MPCKeyService_RevokeDevice_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "coinbase/cloud/mpc_keys/v1/mpc_keys.proto", diff --git a/gen/go/coinbase/cloud/mpc_transactions/v1/mpc_transactions.pb.go b/gen/go/coinbase/cloud/mpc_transactions/v1/mpc_transactions.pb.go index 2299846..7c2ee50 100644 --- a/gen/go/coinbase/cloud/mpc_transactions/v1/mpc_transactions.pb.go +++ b/gen/go/coinbase/cloud/mpc_transactions/v1/mpc_transactions.pb.go @@ -130,7 +130,6 @@ type MPCTransaction struct { // The resource name of the Addresses from which to send the MPCTransaction. // For account-based Networks, only the first address is used. // Format: networks/{network_id}/addresses/{address_id}. - // (-- api-linter: core::0140::prepositions=disabled --) FromAddresses []string `protobuf:"bytes,3,rep,name=from_addresses,json=fromAddresses,proto3" json:"from_addresses,omitempty"` // The current state of the MPCTransaction. State MPCTransaction_State `protobuf:"varint,4,opt,name=state,proto3,enum=coinbase.cloud.mpc_transactions.v1.MPCTransaction_State" json:"state,omitempty"` @@ -968,20 +967,20 @@ var file_coinbase_cloud_mpc_transactions_v1_mpc_transactions_proto_rawDesc = []b 0x73, 0x2e, 0xca, 0x41, 0x30, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x77, 0x61, 0x61, 0x73, 0x2f, 0x6d, 0x70, 0x63, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xcf, 0x01, 0x5a, 0x54, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xce, 0x01, 0x5a, 0x54, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x77, 0x61, 0x61, 0x73, 0x2d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x2d, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x6d, 0x70, 0x63, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x31, 0x92, 0x41, - 0x76, 0x12, 0x1b, 0x0a, 0x14, 0x4d, 0x50, 0x43, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x41, 0x50, 0x49, 0x32, 0x03, 0x31, 0x2e, 0x30, 0x1a, 0x30, - 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, - 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x77, 0x61, 0x61, 0x73, 0x2f, - 0x6d, 0x70, 0x63, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2a, 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x12, 0x1a, 0x0a, 0x13, 0x4d, 0x50, 0x43, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x41, 0x50, 0x49, 0x32, 0x03, 0x31, 0x2e, 0x30, 0x1a, 0x30, 0x61, + 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, + 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x77, 0x61, 0x61, 0x73, 0x2f, 0x6d, + 0x70, 0x63, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2a, + 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/gen/go/coinbase/cloud/mpc_wallets/v1/mocks/MPCWalletServiceClient.go b/gen/go/coinbase/cloud/mpc_wallets/v1/mocks/MPCWalletServiceClient.go index 4b4f59f..e089628 100644 --- a/gen/go/coinbase/cloud/mpc_wallets/v1/mocks/MPCWalletServiceClient.go +++ b/gen/go/coinbase/cloud/mpc_wallets/v1/mocks/MPCWalletServiceClient.go @@ -169,6 +169,36 @@ func (_m *MPCWalletServiceClient) ListAddresses(ctx context.Context, in *v1.List return r0, r1 } +// ListBalanceDetails provides a mock function with given fields: ctx, in, opts +func (_m *MPCWalletServiceClient) ListBalanceDetails(ctx context.Context, in *v1.ListBalanceDetailsRequest, opts ...grpc.CallOption) (*v1.ListBalanceDetailsResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *v1.ListBalanceDetailsResponse + if rf, ok := ret.Get(0).(func(context.Context, *v1.ListBalanceDetailsRequest, ...grpc.CallOption) *v1.ListBalanceDetailsResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.ListBalanceDetailsResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *v1.ListBalanceDetailsRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // ListBalances provides a mock function with given fields: ctx, in, opts func (_m *MPCWalletServiceClient) ListBalances(ctx context.Context, in *v1.ListBalancesRequest, opts ...grpc.CallOption) (*v1.ListBalancesResponse, error) { _va := make([]interface{}, len(opts)) diff --git a/gen/go/coinbase/cloud/mpc_wallets/v1/mocks/MPCWalletServiceServer.go b/gen/go/coinbase/cloud/mpc_wallets/v1/mocks/MPCWalletServiceServer.go index 70e9fbc..b0e1b16 100644 --- a/gen/go/coinbase/cloud/mpc_wallets/v1/mocks/MPCWalletServiceServer.go +++ b/gen/go/coinbase/cloud/mpc_wallets/v1/mocks/MPCWalletServiceServer.go @@ -131,6 +131,29 @@ func (_m *MPCWalletServiceServer) ListAddresses(_a0 context.Context, _a1 *v1.Lis return r0, r1 } +// ListBalanceDetails provides a mock function with given fields: _a0, _a1 +func (_m *MPCWalletServiceServer) ListBalanceDetails(_a0 context.Context, _a1 *v1.ListBalanceDetailsRequest) (*v1.ListBalanceDetailsResponse, error) { + ret := _m.Called(_a0, _a1) + + var r0 *v1.ListBalanceDetailsResponse + if rf, ok := ret.Get(0).(func(context.Context, *v1.ListBalanceDetailsRequest) *v1.ListBalanceDetailsResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.ListBalanceDetailsResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *v1.ListBalanceDetailsRequest) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // ListBalances provides a mock function with given fields: _a0, _a1 func (_m *MPCWalletServiceServer) ListBalances(_a0 context.Context, _a1 *v1.ListBalancesRequest) (*v1.ListBalancesResponse, error) { ret := _m.Called(_a0, _a1) diff --git a/gen/go/coinbase/cloud/mpc_wallets/v1/mpc_wallets.pb.go b/gen/go/coinbase/cloud/mpc_wallets/v1/mpc_wallets.pb.go index aae751d..ba165f7 100644 --- a/gen/go/coinbase/cloud/mpc_wallets/v1/mpc_wallets.pb.go +++ b/gen/go/coinbase/cloud/mpc_wallets/v1/mpc_wallets.pb.go @@ -7,6 +7,7 @@ package v1 import ( + v1 "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/blockchain/v1" _ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options" _ "google.golang.org/genproto/googleapis/api/annotations" longrunning "google.golang.org/genproto/googleapis/longrunning" @@ -180,8 +181,9 @@ type Balance struct { // The resource name of the Asset to which this Balance corresponds. // Format: networks/{network}/assets/{asset} Asset string `protobuf:"bytes,2,opt,name=asset,proto3" json:"asset,omitempty"` - // The amount of the Asset, denominated in atomic units of the asset (e.g., Wei for Ether), - // as a base-10 number. + // The amount of the asset. For native assets or ERC-20 contracts, this is presented in terms of + // atomic units (e.g., Wei for Ether) as a base-10 number. For ERC-721 and ERC-1155 contracts, it + // is the count of distinct token IDs held by address. Amount string `protobuf:"bytes,3,opt,name=amount,proto3" json:"amount,omitempty"` // The resource name of the MPCWallet to which this Balance belongs. // Format: pools/{pool}/mpcWallets/{mpcWallet} @@ -248,6 +250,100 @@ func (x *Balance) GetMpcWallet() string { return "" } +// The BalanceDetail resource, which enumerates the specific tokens held which compose a Balance. +type BalanceDetail struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The resource name of the BalanceDetail. + // Format: networks/{network_id}/addresses/{address_id}/balances/{balance_id}/balanceDetails/{balance_detail_id} + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The resource name of the Asset to which the parent Balance corresponds. + // Format: networks/{network}/assets/{asset} + Asset string `protobuf:"bytes,2,opt,name=asset,proto3" json:"asset,omitempty"` + // The amount of the BalanceDetail as a base-10 number. + // For a BalanceDetail for a native Balance or ERC-20 Balance, this is denominated in atomic units of the asset. + Amount string `protobuf:"bytes,3,opt,name=amount,proto3" json:"amount,omitempty"` + // The asset definition which can be used to identify what token the amount corresponds to. + // + // A BalanceDetail for a native Balance will only have the asset_type field set ("native"). + // A BalanceDetail for an ERC-20 Balance will only have the asset_type ("erc20") and asset_group_id (contract address) fields set. + // A BalanceDetail for an ERC-721 Balance or ERC-1155 Balance will have the asset_type ("erc721" or "erc1155"), + // asset_group_id (contract address), and sub_group_id (token ID) fields set. + AssetDefinition *v1.Asset_Definition `protobuf:"bytes,4,opt,name=asset_definition,json=assetDefinition,proto3" json:"asset_definition,omitempty"` + // The resource name of the MPCWallet to which the parent Balance belongs. + // Format: pools/{pool}/mpcWallets/{mpcWallet} + MpcWallet string `protobuf:"bytes,5,opt,name=mpc_wallet,json=mpcWallet,proto3" json:"mpc_wallet,omitempty"` +} + +func (x *BalanceDetail) Reset() { + *x = BalanceDetail{} + if protoimpl.UnsafeEnabled { + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BalanceDetail) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BalanceDetail) ProtoMessage() {} + +func (x *BalanceDetail) ProtoReflect() protoreflect.Message { + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[3] + 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 BalanceDetail.ProtoReflect.Descriptor instead. +func (*BalanceDetail) Descriptor() ([]byte, []int) { + return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{3} +} + +func (x *BalanceDetail) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *BalanceDetail) GetAsset() string { + if x != nil { + return x.Asset + } + return "" +} + +func (x *BalanceDetail) GetAmount() string { + if x != nil { + return x.Amount + } + return "" +} + +func (x *BalanceDetail) GetAssetDefinition() *v1.Asset_Definition { + if x != nil { + return x.AssetDefinition + } + return nil +} + +func (x *BalanceDetail) GetMpcWallet() string { + if x != nil { + return x.MpcWallet + } + return "" +} + // The request message for CreateMPCWallet. type CreateMPCWalletRequest struct { state protoimpl.MessageState @@ -271,7 +367,7 @@ type CreateMPCWalletRequest struct { func (x *CreateMPCWalletRequest) Reset() { *x = CreateMPCWalletRequest{} if protoimpl.UnsafeEnabled { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[3] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -284,7 +380,7 @@ func (x *CreateMPCWalletRequest) String() string { func (*CreateMPCWalletRequest) ProtoMessage() {} func (x *CreateMPCWalletRequest) ProtoReflect() protoreflect.Message { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[3] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -297,7 +393,7 @@ func (x *CreateMPCWalletRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateMPCWalletRequest.ProtoReflect.Descriptor instead. func (*CreateMPCWalletRequest) Descriptor() ([]byte, []int) { - return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{3} + return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{4} } func (x *CreateMPCWalletRequest) GetParent() string { @@ -342,7 +438,7 @@ type CreateMPCWalletMetadata struct { func (x *CreateMPCWalletMetadata) Reset() { *x = CreateMPCWalletMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[4] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -355,7 +451,7 @@ func (x *CreateMPCWalletMetadata) String() string { func (*CreateMPCWalletMetadata) ProtoMessage() {} func (x *CreateMPCWalletMetadata) ProtoReflect() protoreflect.Message { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[4] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -368,7 +464,7 @@ func (x *CreateMPCWalletMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateMPCWalletMetadata.ProtoReflect.Descriptor instead. func (*CreateMPCWalletMetadata) Descriptor() ([]byte, []int) { - return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{4} + return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{5} } func (x *CreateMPCWalletMetadata) GetDeviceGroup() string { @@ -392,7 +488,7 @@ type GetMPCWalletRequest struct { func (x *GetMPCWalletRequest) Reset() { *x = GetMPCWalletRequest{} if protoimpl.UnsafeEnabled { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[5] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -405,7 +501,7 @@ func (x *GetMPCWalletRequest) String() string { func (*GetMPCWalletRequest) ProtoMessage() {} func (x *GetMPCWalletRequest) ProtoReflect() protoreflect.Message { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[5] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -418,7 +514,7 @@ func (x *GetMPCWalletRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMPCWalletRequest.ProtoReflect.Descriptor instead. func (*GetMPCWalletRequest) Descriptor() ([]byte, []int) { - return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{5} + return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{6} } func (x *GetMPCWalletRequest) GetName() string { @@ -447,7 +543,7 @@ type ListMPCWalletsRequest struct { func (x *ListMPCWalletsRequest) Reset() { *x = ListMPCWalletsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[6] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -460,7 +556,7 @@ func (x *ListMPCWalletsRequest) String() string { func (*ListMPCWalletsRequest) ProtoMessage() {} func (x *ListMPCWalletsRequest) ProtoReflect() protoreflect.Message { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[6] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -473,7 +569,7 @@ func (x *ListMPCWalletsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMPCWalletsRequest.ProtoReflect.Descriptor instead. func (*ListMPCWalletsRequest) Descriptor() ([]byte, []int) { - return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{6} + return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{7} } func (x *ListMPCWalletsRequest) GetParent() string { @@ -513,7 +609,7 @@ type ListMPCWalletsResponse struct { func (x *ListMPCWalletsResponse) Reset() { *x = ListMPCWalletsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[7] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -526,7 +622,7 @@ func (x *ListMPCWalletsResponse) String() string { func (*ListMPCWalletsResponse) ProtoMessage() {} func (x *ListMPCWalletsResponse) ProtoReflect() protoreflect.Message { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[7] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -539,7 +635,7 @@ func (x *ListMPCWalletsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMPCWalletsResponse.ProtoReflect.Descriptor instead. func (*ListMPCWalletsResponse) Descriptor() ([]byte, []int) { - return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{7} + return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{8} } func (x *ListMPCWalletsResponse) GetMpcWallets() []*MPCWallet { @@ -575,7 +671,7 @@ type GenerateAddressRequest struct { func (x *GenerateAddressRequest) Reset() { *x = GenerateAddressRequest{} if protoimpl.UnsafeEnabled { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[8] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -588,7 +684,7 @@ func (x *GenerateAddressRequest) String() string { func (*GenerateAddressRequest) ProtoMessage() {} func (x *GenerateAddressRequest) ProtoReflect() protoreflect.Message { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[8] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -601,7 +697,7 @@ func (x *GenerateAddressRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateAddressRequest.ProtoReflect.Descriptor instead. func (*GenerateAddressRequest) Descriptor() ([]byte, []int) { - return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{8} + return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{9} } func (x *GenerateAddressRequest) GetMpcWallet() string { @@ -639,7 +735,7 @@ type GetAddressRequest struct { func (x *GetAddressRequest) Reset() { *x = GetAddressRequest{} if protoimpl.UnsafeEnabled { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[9] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -652,7 +748,7 @@ func (x *GetAddressRequest) String() string { func (*GetAddressRequest) ProtoMessage() {} func (x *GetAddressRequest) ProtoReflect() protoreflect.Message { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[9] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -665,7 +761,7 @@ func (x *GetAddressRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAddressRequest.ProtoReflect.Descriptor instead. func (*GetAddressRequest) Descriptor() ([]byte, []int) { - return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{9} + return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{10} } func (x *GetAddressRequest) GetName() string { @@ -697,7 +793,7 @@ type ListAddressesRequest struct { func (x *ListAddressesRequest) Reset() { *x = ListAddressesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[10] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -710,7 +806,7 @@ func (x *ListAddressesRequest) String() string { func (*ListAddressesRequest) ProtoMessage() {} func (x *ListAddressesRequest) ProtoReflect() protoreflect.Message { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[10] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -723,7 +819,7 @@ func (x *ListAddressesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAddressesRequest.ProtoReflect.Descriptor instead. func (*ListAddressesRequest) Descriptor() ([]byte, []int) { - return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{10} + return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{11} } func (x *ListAddressesRequest) GetParent() string { @@ -770,7 +866,7 @@ type ListAddressesResponse struct { func (x *ListAddressesResponse) Reset() { *x = ListAddressesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[11] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -783,7 +879,7 @@ func (x *ListAddressesResponse) String() string { func (*ListAddressesResponse) ProtoMessage() {} func (x *ListAddressesResponse) ProtoReflect() protoreflect.Message { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[11] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -796,7 +892,7 @@ func (x *ListAddressesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAddressesResponse.ProtoReflect.Descriptor instead. func (*ListAddressesResponse) Descriptor() ([]byte, []int) { - return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{11} + return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{12} } func (x *ListAddressesResponse) GetAddresses() []*Address { @@ -822,7 +918,7 @@ type ListBalancesRequest struct { // The resource name of the parent Address. // Format: networks/{network_id}/addresses/{address_id} Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` - // The maximum number of Balances to return. If unspecified, at most 50 Balances + // The maximum number of Balances to return. If unspecified, at most 25 Balances // will be returned. PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // A page token, received from a previous ListBalances call. @@ -833,7 +929,7 @@ type ListBalancesRequest struct { func (x *ListBalancesRequest) Reset() { *x = ListBalancesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[12] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -846,7 +942,7 @@ func (x *ListBalancesRequest) String() string { func (*ListBalancesRequest) ProtoMessage() {} func (x *ListBalancesRequest) ProtoReflect() protoreflect.Message { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[12] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -859,7 +955,7 @@ func (x *ListBalancesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListBalancesRequest.ProtoReflect.Descriptor instead. func (*ListBalancesRequest) Descriptor() ([]byte, []int) { - return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{12} + return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{13} } func (x *ListBalancesRequest) GetParent() string { @@ -899,7 +995,7 @@ type ListBalancesResponse struct { func (x *ListBalancesResponse) Reset() { *x = ListBalancesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[13] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -912,7 +1008,7 @@ func (x *ListBalancesResponse) String() string { func (*ListBalancesResponse) ProtoMessage() {} func (x *ListBalancesResponse) ProtoReflect() protoreflect.Message { - mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[13] + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -925,7 +1021,7 @@ func (x *ListBalancesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListBalancesResponse.ProtoReflect.Descriptor instead. func (*ListBalancesResponse) Descriptor() ([]byte, []int) { - return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{13} + return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{14} } func (x *ListBalancesResponse) GetBalances() []*Balance { @@ -942,6 +1038,135 @@ func (x *ListBalancesResponse) GetNextPageToken() string { return "" } +// The request message for ListBalanceDetails. +type ListBalanceDetailsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The resource name of the parent Balance. + // Format: networks/{network_id}/addresses/{address_id}/balances/{balance_id} + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + // The maximum number of BalanceDetails to return. If unspecified, at most 25 BalanceDetails + // will be returned. + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // A page token, received from a previous ListBalanceDetails call. + // Provide this to retrieve the subsequent page. + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` +} + +func (x *ListBalanceDetailsRequest) Reset() { + *x = ListBalanceDetailsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListBalanceDetailsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListBalanceDetailsRequest) ProtoMessage() {} + +func (x *ListBalanceDetailsRequest) ProtoReflect() protoreflect.Message { + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[15] + 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 ListBalanceDetailsRequest.ProtoReflect.Descriptor instead. +func (*ListBalanceDetailsRequest) Descriptor() ([]byte, []int) { + return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{15} +} + +func (x *ListBalanceDetailsRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *ListBalanceDetailsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListBalanceDetailsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +// The response message for ListBalanceDetails. +type ListBalanceDetailsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The list of balance details. + BalanceDetails []*BalanceDetail `protobuf:"bytes,1,rep,name=balance_details,json=balanceDetails,proto3" json:"balance_details,omitempty"` + // A token, which can be sent as page_token to retrieve the next page. + // If this field is omitted, there are no subsequent pages. + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` +} + +func (x *ListBalanceDetailsResponse) Reset() { + *x = ListBalanceDetailsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListBalanceDetailsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListBalanceDetailsResponse) ProtoMessage() {} + +func (x *ListBalanceDetailsResponse) ProtoReflect() protoreflect.Message { + mi := &file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[16] + 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 ListBalanceDetailsResponse.ProtoReflect.Descriptor instead. +func (*ListBalanceDetailsResponse) Descriptor() ([]byte, []int) { + return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP(), []int{16} +} + +func (x *ListBalanceDetailsResponse) GetBalanceDetails() []*BalanceDetail { + if x != nil { + return x.BalanceDetails + } + return nil +} + +func (x *ListBalanceDetailsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + var File_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto protoreflect.FileDescriptor var file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDesc = []byte{ @@ -950,165 +1175,256 @@ var file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDesc = []byte{ 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, - 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, - 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6c, 0x6f, 0x6e, 0x67, - 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc2, 0x06, 0x0a, 0x09, 0x4d, 0x50, 0x43, - 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0xd9, 0x01, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0xc4, 0x01, 0x92, 0x41, 0xbc, 0x01, 0x2a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x32, 0x56, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, - 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x0a, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, - 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, - 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2f, 0x7b, 0x6d, 0x70, 0x63, 0x5f, - 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x4a, 0x5c, 0x22, 0x70, 0x6f, 0x6f, + 0x1a, 0x2d, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, + 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x23, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6c, 0x6f, 0x6e, 0x67, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, + 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc2, 0x06, 0x0a, 0x09, 0x4d, 0x50, 0x43, 0x57, + 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0xd9, 0x01, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0xc4, 0x01, 0x92, 0x41, 0xbc, 0x01, 0x2a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x32, 0x56, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x57, + 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x0a, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x70, + 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, + 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2f, 0x7b, 0x6d, 0x70, 0x63, 0x5f, 0x77, + 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x4a, 0x5c, 0x22, 0x70, 0x6f, 0x6f, 0x6c, + 0x73, 0x2f, 0x39, 0x35, 0x32, 0x35, 0x37, 0x63, 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, 0x2d, + 0x34, 0x32, 0x34, 0x31, 0x2d, 0x62, 0x66, 0x39, 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, 0x38, + 0x65, 0x39, 0x63, 0x63, 0x39, 0x31, 0x2f, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, + 0x73, 0x2f, 0x64, 0x32, 0x38, 0x31, 0x39, 0x37, 0x65, 0x38, 0x2d, 0x33, 0x37, 0x32, 0x63, 0x2d, + 0x34, 0x36, 0x31, 0x63, 0x2d, 0x39, 0x61, 0x30, 0x30, 0x2d, 0x32, 0x64, 0x61, 0x33, 0x63, 0x35, + 0x32, 0x38, 0x63, 0x32, 0x64, 0x31, 0x22, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x88, 0x03, 0x0a, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xe4, 0x02, 0x92, 0x41, 0xb1, 0x02, 0x2a, + 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x32, 0xc1, 0x01, 0x54, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, + 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, + 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x4d, 0x50, 0x43, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, + 0x4a, 0x5e, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x39, 0x35, 0x32, 0x35, 0x37, 0x63, 0x35, + 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, 0x2d, 0x34, 0x32, 0x34, 0x31, 0x2d, 0x62, 0x66, 0x39, 0x37, + 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, 0x38, 0x65, 0x39, 0x63, 0x63, 0x39, 0x31, 0x2f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x33, 0x61, 0x31, 0x36, 0x38, + 0x61, 0x35, 0x34, 0x2d, 0x36, 0x36, 0x36, 0x31, 0x2d, 0x34, 0x65, 0x35, 0x61, 0x2d, 0x38, 0x62, + 0x63, 0x35, 0x2d, 0x39, 0x37, 0x35, 0x39, 0x36, 0x37, 0x31, 0x61, 0x61, 0x37, 0x37, 0x37, 0x22, + 0xe2, 0x41, 0x01, 0x03, 0xfa, 0x41, 0x28, 0x0a, 0x26, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, + 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x3a, 0xcd, 0x01, 0x92, + 0x41, 0x75, 0x0a, 0x73, 0x2a, 0x09, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x32, + 0x66, 0x54, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x20, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x72, + 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x2d, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x4d, + 0x50, 0x43, 0x4b, 0x65, 0x79, 0x73, 0x2e, 0xea, 0x41, 0x52, 0x0a, 0x24, 0x61, 0x70, 0x69, 0x2e, + 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, + 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, + 0x12, 0x2a, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2f, 0x7b, 0x6d, 0x70, + 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0xc8, 0x0a, 0x0a, + 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0xcc, 0x01, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0xb7, 0x01, 0x92, 0x41, 0xaf, 0x01, 0x2a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x56, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x0a, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x7b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2f, + 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x64, 0x7d, 0x4a, 0x4f, 0x22, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x2d, 0x67, 0x6f, 0x65, 0x72, 0x6c, 0x69, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x73, 0x2f, 0x30, 0x78, 0x44, 0x41, 0x46, 0x45, 0x41, 0x34, 0x39, 0x32, 0x44, 0x39, 0x63, 0x36, + 0x37, 0x33, 0x33, 0x61, 0x65, 0x33, 0x64, 0x35, 0x36, 0x62, 0x37, 0x45, 0x64, 0x31, 0x41, 0x44, + 0x42, 0x36, 0x30, 0x36, 0x39, 0x32, 0x63, 0x39, 0x38, 0x42, 0x63, 0x35, 0x22, 0xe2, 0x41, 0x01, + 0x03, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0xda, 0x01, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xbf, 0x01, 0x92, 0x41, 0xb7, 0x01, + 0x2a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x32, 0x7f, 0x54, 0x68, 0x65, 0x20, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x2d, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x61, 0x20, 0x30, 0x78, + 0x2d, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, + 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x20, 0x68, 0x65, 0x78, 0x61, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, + 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, + 0x73, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x49, 0x44, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4a, 0x2b, 0x22, 0x30, 0x78, 0x44, + 0x41, 0x46, 0x45, 0x41, 0x34, 0x39, 0x32, 0x44, 0x39, 0x63, 0x36, 0x37, 0x33, 0x33, 0x61, 0x65, + 0x33, 0x64, 0x35, 0x36, 0x62, 0x37, 0x45, 0x64, 0x31, 0x41, 0x44, 0x42, 0x36, 0x30, 0x36, 0x39, + 0x32, 0x63, 0x39, 0x38, 0x42, 0x63, 0x22, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x9d, 0x03, 0x0a, 0x08, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x81, 0x03, 0x92, 0x41, 0xd3, 0x02, 0x2a, 0x07, + 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x32, 0xb7, 0x01, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x45, 0x56, 0x4d, 0x20, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x4d, 0x50, 0x43, + 0x4b, 0x65, 0x79, 0x2e, 0x0a, 0x20, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x70, 0x6f, + 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x70, 0x63, + 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x7b, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, + 0x7d, 0x4a, 0x8d, 0x01, 0x5b, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x39, 0x35, 0x32, 0x35, + 0x37, 0x63, 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, 0x2d, 0x34, 0x32, 0x34, 0x31, 0x2d, 0x62, + 0x66, 0x39, 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, 0x38, 0x65, 0x39, 0x63, 0x63, 0x39, 0x31, + 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x33, 0x61, + 0x31, 0x36, 0x38, 0x61, 0x35, 0x34, 0x2d, 0x36, 0x36, 0x36, 0x31, 0x2d, 0x34, 0x65, 0x35, 0x61, + 0x2d, 0x38, 0x62, 0x63, 0x35, 0x2d, 0x39, 0x37, 0x35, 0x39, 0x36, 0x37, 0x31, 0x61, 0x61, 0x37, + 0x37, 0x37, 0x2f, 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x64, 0x32, 0x38, 0x62, 0x39, + 0x34, 0x36, 0x62, 0x2d, 0x35, 0x33, 0x33, 0x62, 0x2d, 0x34, 0x36, 0x36, 0x65, 0x2d, 0x62, 0x62, + 0x36, 0x31, 0x2d, 0x39, 0x31, 0x64, 0x39, 0x33, 0x38, 0x37, 0x34, 0x33, 0x38, 0x35, 0x38, 0x22, + 0x5d, 0xe2, 0x41, 0x01, 0x03, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, + 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x52, 0x07, 0x6d, 0x70, 0x63, + 0x4b, 0x65, 0x79, 0x73, 0x12, 0xa9, 0x02, 0x0a, 0x0a, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, + 0x6c, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x89, 0x02, 0x92, 0x41, 0xd8, 0x01, + 0x2a, 0x09, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x32, 0x6d, 0x54, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x20, + 0x74, 0x6f, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x2e, 0x20, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, + 0x6f, 0x6c, 0x7d, 0x2f, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2f, 0x7b, + 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x7d, 0x4a, 0x5c, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x39, 0x35, 0x32, 0x35, 0x37, 0x63, 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, 0x2d, 0x34, 0x32, 0x34, 0x31, 0x2d, 0x62, 0x66, 0x39, 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, 0x38, 0x65, 0x39, 0x63, 0x63, 0x39, 0x31, 0x2f, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2f, 0x64, 0x32, 0x38, 0x31, 0x39, 0x37, 0x65, 0x38, 0x2d, 0x33, 0x37, 0x32, 0x63, 0x2d, 0x34, 0x36, 0x31, 0x63, 0x2d, 0x39, 0x61, 0x30, 0x30, 0x2d, 0x32, 0x64, 0x61, 0x33, 0x63, - 0x35, 0x32, 0x38, 0x63, 0x32, 0x64, 0x31, 0x22, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x88, 0x03, 0x0a, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xe4, 0x02, 0x92, 0x41, 0xb1, 0x02, - 0x2a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x32, 0xc1, 0x01, - 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x4d, 0x50, 0x43, 0x20, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, - 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, - 0x7d, 0x4a, 0x5e, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x39, 0x35, 0x32, 0x35, 0x37, 0x63, - 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, 0x2d, 0x34, 0x32, 0x34, 0x31, 0x2d, 0x62, 0x66, 0x39, - 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, 0x38, 0x65, 0x39, 0x63, 0x63, 0x39, 0x31, 0x2f, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x33, 0x61, 0x31, 0x36, - 0x38, 0x61, 0x35, 0x34, 0x2d, 0x36, 0x36, 0x36, 0x31, 0x2d, 0x34, 0x65, 0x35, 0x61, 0x2d, 0x38, - 0x62, 0x63, 0x35, 0x2d, 0x39, 0x37, 0x35, 0x39, 0x36, 0x37, 0x31, 0x61, 0x61, 0x37, 0x37, 0x37, - 0x22, 0xe2, 0x41, 0x01, 0x03, 0xfa, 0x41, 0x28, 0x0a, 0x26, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, - 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x52, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x3a, 0xcd, 0x01, - 0x92, 0x41, 0x75, 0x0a, 0x73, 0x2a, 0x09, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x32, 0x66, 0x54, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x20, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, - 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x2d, 0x63, 0x68, - 0x61, 0x69, 0x6e, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, - 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x73, 0x2e, 0xea, 0x41, 0x52, 0x0a, 0x24, 0x61, 0x70, 0x69, - 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, - 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x12, 0x2a, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2f, 0x7b, 0x6d, - 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0xc8, 0x0a, - 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0xcc, 0x01, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0xb7, 0x01, 0x92, 0x41, 0xaf, 0x01, 0x2a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x56, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x0a, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, - 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x7b, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, - 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x64, 0x7d, 0x4a, 0x4f, 0x22, + 0x35, 0x32, 0x38, 0x63, 0x32, 0x64, 0x31, 0x22, 0xe2, 0x41, 0x01, 0x03, 0xfa, 0x41, 0x26, 0x0a, + 0x24, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, + 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x57, + 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x09, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, + 0x3a, 0xc4, 0x01, 0x92, 0x41, 0x6c, 0x0a, 0x6a, 0x2a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x32, 0x5f, 0x54, 0x68, 0x65, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x72, + 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x2d, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x62, 0x61, + 0x63, 0x6b, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, + 0x79, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, + 0x74, 0x2e, 0xea, 0x41, 0x52, 0x0a, 0x22, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, + 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2c, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x2f, 0x7b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x7d, + 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0xcd, 0x0a, 0x0a, 0x07, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x12, 0x90, 0x02, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0xfb, 0x01, 0x92, 0x41, 0xf3, 0x01, 0x2a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, + 0x6c, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x2e, 0x0a, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x2f, 0x7b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x7d, + 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, + 0x2f, 0x7b, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x4a, 0x7d, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2d, 0x67, 0x6f, 0x65, 0x72, 0x6c, 0x69, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2f, 0x30, 0x78, 0x44, 0x41, 0x46, 0x45, 0x41, 0x34, 0x39, 0x32, 0x44, 0x39, 0x63, 0x36, 0x37, 0x33, 0x33, 0x61, 0x65, 0x33, 0x64, 0x35, 0x36, 0x62, 0x37, 0x45, 0x64, 0x31, 0x41, - 0x44, 0x42, 0x36, 0x30, 0x36, 0x39, 0x32, 0x63, 0x39, 0x38, 0x42, 0x63, 0x35, 0x22, 0xe2, 0x41, - 0x01, 0x03, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0xda, 0x01, 0x0a, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xbf, 0x01, 0x92, 0x41, 0xb7, - 0x01, 0x2a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x32, 0x7f, 0x54, 0x68, 0x65, 0x20, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x2d, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x61, 0x20, 0x30, - 0x78, 0x2d, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x20, 0x68, 0x65, 0x78, 0x61, 0x64, 0x65, 0x63, 0x69, 0x6d, - 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, - 0x69, 0x73, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x49, 0x44, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4a, 0x2b, 0x22, 0x30, 0x78, - 0x44, 0x41, 0x46, 0x45, 0x41, 0x34, 0x39, 0x32, 0x44, 0x39, 0x63, 0x36, 0x37, 0x33, 0x33, 0x61, - 0x65, 0x33, 0x64, 0x35, 0x36, 0x62, 0x37, 0x45, 0x64, 0x31, 0x41, 0x44, 0x42, 0x36, 0x30, 0x36, - 0x39, 0x32, 0x63, 0x39, 0x38, 0x42, 0x63, 0x22, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x07, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x9d, 0x03, 0x0a, 0x08, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, - 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x81, 0x03, 0x92, 0x41, 0xd3, 0x02, 0x2a, - 0x07, 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x32, 0xb7, 0x01, 0x54, 0x68, 0x65, 0x20, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x73, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x45, 0x56, 0x4d, 0x20, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x77, 0x69, 0x6c, - 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x4d, 0x50, - 0x43, 0x4b, 0x65, 0x79, 0x2e, 0x0a, 0x20, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x70, - 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x70, - 0x63, 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x7b, 0x6d, 0x70, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, - 0x64, 0x7d, 0x4a, 0x8d, 0x01, 0x5b, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x39, 0x35, 0x32, - 0x35, 0x37, 0x63, 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, 0x2d, 0x34, 0x32, 0x34, 0x31, 0x2d, - 0x62, 0x66, 0x39, 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, 0x38, 0x65, 0x39, 0x63, 0x63, 0x39, - 0x31, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x33, - 0x61, 0x31, 0x36, 0x38, 0x61, 0x35, 0x34, 0x2d, 0x36, 0x36, 0x36, 0x31, 0x2d, 0x34, 0x65, 0x35, - 0x61, 0x2d, 0x38, 0x62, 0x63, 0x35, 0x2d, 0x39, 0x37, 0x35, 0x39, 0x36, 0x37, 0x31, 0x61, 0x61, - 0x37, 0x37, 0x37, 0x2f, 0x6d, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x64, 0x32, 0x38, 0x62, - 0x39, 0x34, 0x36, 0x62, 0x2d, 0x35, 0x33, 0x33, 0x62, 0x2d, 0x34, 0x36, 0x36, 0x65, 0x2d, 0x62, - 0x62, 0x36, 0x31, 0x2d, 0x39, 0x31, 0x64, 0x39, 0x33, 0x38, 0x37, 0x34, 0x33, 0x38, 0x35, 0x38, - 0x22, 0x5d, 0xe2, 0x41, 0x01, 0x03, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x61, 0x70, 0x69, 0x2e, 0x64, - 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, - 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x52, 0x07, 0x6d, 0x70, - 0x63, 0x4b, 0x65, 0x79, 0x73, 0x12, 0xa9, 0x02, 0x0a, 0x0a, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x89, 0x02, 0x92, 0x41, 0xd8, - 0x01, 0x2a, 0x09, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x32, 0x6d, 0x54, 0x68, - 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x20, 0x74, 0x6f, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x2e, 0x20, - 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, - 0x6f, 0x6f, 0x6c, 0x7d, 0x2f, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2f, - 0x7b, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x7d, 0x4a, 0x5c, 0x22, 0x70, 0x6f, - 0x6f, 0x6c, 0x73, 0x2f, 0x39, 0x35, 0x32, 0x35, 0x37, 0x63, 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, - 0x66, 0x2d, 0x34, 0x32, 0x34, 0x31, 0x2d, 0x62, 0x66, 0x39, 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, - 0x61, 0x38, 0x65, 0x39, 0x63, 0x63, 0x39, 0x31, 0x2f, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x73, 0x2f, 0x64, 0x32, 0x38, 0x31, 0x39, 0x37, 0x65, 0x38, 0x2d, 0x33, 0x37, 0x32, - 0x63, 0x2d, 0x34, 0x36, 0x31, 0x63, 0x2d, 0x39, 0x61, 0x30, 0x30, 0x2d, 0x32, 0x64, 0x61, 0x33, - 0x63, 0x35, 0x32, 0x38, 0x63, 0x32, 0x64, 0x31, 0x22, 0xe2, 0x41, 0x01, 0x03, 0xfa, 0x41, 0x26, - 0x0a, 0x24, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, - 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, - 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x09, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x3a, 0xc4, 0x01, 0x92, 0x41, 0x6c, 0x0a, 0x6a, 0x2a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x32, 0x5f, 0x54, 0x68, 0x65, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, - 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x6e, - 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x62, - 0x61, 0x63, 0x6b, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x4d, 0x50, 0x43, 0x4b, - 0x65, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x2e, 0xea, 0x41, 0x52, 0x0a, 0x22, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, - 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2c, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x7b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, - 0x7d, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0xc9, 0x09, 0x0a, 0x07, 0x42, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x12, 0x90, 0x02, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0xfb, 0x01, 0x92, 0x41, 0xf3, 0x01, 0x2a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x32, 0x6c, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, - 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x2e, 0x0a, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x7b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, - 0x7d, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x2f, 0x7b, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x4a, 0x7d, + 0x44, 0x42, 0x36, 0x30, 0x36, 0x39, 0x32, 0x63, 0x39, 0x38, 0x42, 0x63, 0x35, 0x2f, 0x62, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x65, 0x31, 0x38, 0x33, 0x35, 0x38, 0x30, 0x36, 0x2d, + 0x30, 0x37, 0x31, 0x38, 0x2d, 0x34, 0x31, 0x38, 0x61, 0x2d, 0x62, 0x31, 0x38, 0x35, 0x2d, 0x39, + 0x33, 0x35, 0x35, 0x33, 0x63, 0x34, 0x39, 0x36, 0x36, 0x35, 0x35, 0x22, 0xe2, 0x41, 0x01, 0x03, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x80, 0x02, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xe9, 0x01, 0x92, 0x41, 0xbc, 0x01, 0x2a, 0x05, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x32, 0x6b, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x7b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x7d, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x7d, 0x4a, 0x46, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2d, 0x67, 0x6f, 0x65, 0x72, 0x6c, 0x69, 0x2f, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x73, 0x2f, 0x65, 0x31, 0x38, 0x33, 0x35, 0x38, 0x30, 0x36, 0x2d, 0x30, 0x37, 0x31, + 0x38, 0x2d, 0x34, 0x31, 0x38, 0x61, 0x2d, 0x62, 0x31, 0x38, 0x35, 0x2d, 0x39, 0x33, 0x35, 0x35, + 0x33, 0x63, 0x34, 0x39, 0x36, 0x36, 0x35, 0x35, 0x22, 0xe2, 0x41, 0x01, 0x03, 0xfa, 0x41, 0x22, + 0x0a, 0x20, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, + 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0xa8, 0x02, 0x0a, 0x06, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x8f, 0x02, 0x92, 0x41, 0x87, + 0x02, 0x2a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x32, 0xf0, 0x01, 0x54, 0x68, 0x65, 0x20, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x45, 0x52, 0x43, 0x2d, 0x32, 0x30, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, + 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x20, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x2c, 0x20, 0x57, 0x65, + 0x69, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x29, 0x20, 0x61, 0x73, 0x20, + 0x61, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x31, 0x30, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x45, 0x52, 0x43, 0x2d, 0x37, 0x32, 0x31, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x45, 0x52, 0x43, 0x2d, 0x31, 0x31, 0x35, 0x35, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x61, 0x63, 0x74, 0x73, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, + 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x49, 0x44, 0x73, 0x20, 0x68, 0x65, 0x6c, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4a, 0x0a, 0x22, 0x31, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x06, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0xa9, 0x02, 0x0a, 0x0a, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, + 0x6c, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x89, 0x02, 0x92, 0x41, 0xd8, 0x01, + 0x2a, 0x09, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x32, 0x6d, 0x54, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x20, + 0x74, 0x6f, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x2e, 0x20, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, + 0x6f, 0x6c, 0x7d, 0x2f, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2f, 0x7b, + 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x7d, 0x4a, 0x5c, 0x22, 0x70, 0x6f, 0x6f, + 0x6c, 0x73, 0x2f, 0x39, 0x35, 0x32, 0x35, 0x37, 0x63, 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, + 0x2d, 0x34, 0x32, 0x34, 0x31, 0x2d, 0x62, 0x66, 0x39, 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, + 0x38, 0x65, 0x39, 0x63, 0x63, 0x39, 0x31, 0x2f, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, + 0x74, 0x73, 0x2f, 0x64, 0x32, 0x38, 0x31, 0x39, 0x37, 0x65, 0x38, 0x2d, 0x33, 0x37, 0x32, 0x63, + 0x2d, 0x34, 0x36, 0x31, 0x63, 0x2d, 0x39, 0x61, 0x30, 0x30, 0x2d, 0x32, 0x64, 0x61, 0x33, 0x63, + 0x35, 0x32, 0x38, 0x63, 0x32, 0x64, 0x31, 0x22, 0xe2, 0x41, 0x01, 0x03, 0xfa, 0x41, 0x26, 0x0a, + 0x24, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, + 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x57, + 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x09, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, + 0x3a, 0xd4, 0x01, 0x92, 0x41, 0x66, 0x0a, 0x64, 0x2a, 0x07, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x32, 0x59, 0x54, 0x68, 0x65, 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x72, + 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x73, 0x73, 0x65, 0x74, 0x20, + 0x68, 0x65, 0x6c, 0x64, 0x20, 0x6f, 0x6e, 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x62, 0x79, + 0x20, 0x61, 0x6e, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0xea, 0x41, 0x68, 0x0a, + 0x22, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, + 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x12, 0x42, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x7b, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x62, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0xa0, 0x0f, 0x0a, 0x0d, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0xef, 0x02, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0xda, 0x02, 0x92, 0x41, 0xd2, 0x02, 0x2a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x95, 0x01, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x2e, 0x0a, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x2f, 0x7b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x62, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x62, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2f, 0x7b, 0x62, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x4a, 0xb1, 0x01, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2d, 0x67, 0x6f, 0x65, 0x72, 0x6c, 0x69, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2f, 0x30, 0x78, 0x44, 0x41, 0x46, 0x45, 0x41, 0x34, 0x39, 0x32, 0x44, 0x39, @@ -1116,379 +1432,486 @@ var file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDesc = []byte{ 0x41, 0x44, 0x42, 0x36, 0x30, 0x36, 0x39, 0x32, 0x63, 0x39, 0x38, 0x42, 0x63, 0x35, 0x2f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x65, 0x31, 0x38, 0x33, 0x35, 0x38, 0x30, 0x36, 0x2d, 0x30, 0x37, 0x31, 0x38, 0x2d, 0x34, 0x31, 0x38, 0x61, 0x2d, 0x62, 0x31, 0x38, 0x35, 0x2d, - 0x39, 0x33, 0x35, 0x35, 0x33, 0x63, 0x34, 0x39, 0x36, 0x36, 0x35, 0x35, 0x22, 0xe2, 0x41, 0x01, - 0x03, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x80, 0x02, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xe9, 0x01, 0x92, 0x41, 0xbc, 0x01, 0x2a, 0x05, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x32, 0x6b, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, - 0x68, 0x69, 0x73, 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, - 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x7b, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x7d, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x7d, 0x4a, 0x46, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2d, 0x67, 0x6f, 0x65, 0x72, 0x6c, 0x69, 0x2f, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x73, 0x2f, 0x30, 0x63, 0x33, 0x35, 0x36, 0x39, 0x64, 0x33, 0x2d, 0x62, 0x32, - 0x35, 0x33, 0x2d, 0x35, 0x31, 0x32, 0x38, 0x2d, 0x61, 0x32, 0x32, 0x39, 0x2d, 0x35, 0x34, 0x33, - 0x65, 0x31, 0x65, 0x38, 0x31, 0x39, 0x34, 0x33, 0x30, 0x22, 0xe2, 0x41, 0x01, 0x03, 0xfa, 0x41, - 0x22, 0x0a, 0x20, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, - 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0xa4, 0x01, 0x0a, 0x06, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x8b, 0x01, 0x92, 0x41, - 0x83, 0x01, 0x2a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x32, 0x6d, 0x54, 0x68, 0x65, 0x20, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x2c, 0x20, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, - 0x20, 0x69, 0x6e, 0x20, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, - 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x73, 0x73, 0x65, 0x74, 0x20, 0x28, 0x65, - 0x2e, 0x67, 0x2e, 0x2c, 0x20, 0x57, 0x65, 0x69, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x45, 0x74, 0x68, - 0x65, 0x72, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x31, - 0x30, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x4a, 0x0a, 0x22, 0x31, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x22, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0xa9, 0x02, 0x0a, 0x0a, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x89, 0x02, 0x92, 0x41, 0xd8, 0x01, 0x2a, 0x09, 0x6d, - 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x32, 0x6d, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, - 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x7d, - 0x2f, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2f, 0x7b, 0x6d, 0x70, 0x63, - 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x7d, 0x4a, 0x5c, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, - 0x39, 0x35, 0x32, 0x35, 0x37, 0x63, 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, 0x2d, 0x34, 0x32, - 0x34, 0x31, 0x2d, 0x62, 0x66, 0x39, 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, 0x38, 0x65, 0x39, - 0x63, 0x63, 0x39, 0x31, 0x2f, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2f, - 0x64, 0x32, 0x38, 0x31, 0x39, 0x37, 0x65, 0x38, 0x2d, 0x33, 0x37, 0x32, 0x63, 0x2d, 0x34, 0x36, - 0x31, 0x63, 0x2d, 0x39, 0x61, 0x30, 0x30, 0x2d, 0x32, 0x64, 0x61, 0x33, 0x63, 0x35, 0x32, 0x38, - 0x63, 0x32, 0x64, 0x31, 0x22, 0xe2, 0x41, 0x01, 0x03, 0xfa, 0x41, 0x26, 0x0a, 0x24, 0x61, 0x70, + 0x39, 0x33, 0x35, 0x35, 0x33, 0x63, 0x34, 0x39, 0x36, 0x36, 0x35, 0x35, 0x2f, 0x62, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2f, 0x32, 0x35, 0x62, 0x30, + 0x33, 0x36, 0x63, 0x62, 0x2d, 0x65, 0x39, 0x36, 0x38, 0x2d, 0x35, 0x33, 0x35, 0x31, 0x2d, 0x38, + 0x62, 0x30, 0x65, 0x2d, 0x33, 0x63, 0x61, 0x62, 0x63, 0x36, 0x63, 0x64, 0x64, 0x61, 0x62, 0x63, + 0x22, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x86, 0x02, 0x0a, 0x05, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xef, 0x01, 0x92, 0x41, + 0xc2, 0x01, 0x2a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x32, 0x71, 0x54, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x41, 0x73, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, + 0x73, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x2f, 0x7b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x7d, 0x2f, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x7d, 0x4a, 0x46, 0x22, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x2d, 0x67, 0x6f, 0x65, 0x72, 0x6c, 0x69, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x65, + 0x31, 0x38, 0x33, 0x35, 0x38, 0x30, 0x36, 0x2d, 0x30, 0x37, 0x31, 0x38, 0x2d, 0x34, 0x31, 0x38, + 0x61, 0x2d, 0x62, 0x31, 0x38, 0x35, 0x2d, 0x39, 0x33, 0x35, 0x35, 0x33, 0x63, 0x34, 0x39, 0x36, + 0x36, 0x35, 0x35, 0x22, 0xe2, 0x41, 0x01, 0x03, 0xfa, 0x41, 0x22, 0x0a, 0x20, 0x61, 0x70, 0x69, + 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, + 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x12, 0x6c, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x54, 0x92, 0x41, 0x4d, 0x2a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x32, 0x37, 0x2f, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2d, + 0x31, 0x30, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x4a, 0x0a, 0x22, 0x31, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0xe7, 0x04, 0x0a, 0x10, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, + 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x8b, 0x04, + 0x92, 0x41, 0x83, 0x04, 0x2a, 0x10, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x32, 0xee, 0x03, 0x54, 0x68, 0x65, 0x20, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x68, + 0x69, 0x63, 0x68, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x20, 0x77, 0x68, 0x61, 0x74, + 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, + 0x2e, 0x0a, 0x0a, 0x20, 0x41, 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x6e, + 0x6c, 0x79, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x73, 0x65, 0x74, + 0x20, 0x28, 0x22, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x22, 0x29, 0x2e, 0x0a, 0x20, 0x41, 0x20, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x61, 0x6e, 0x20, 0x45, 0x52, 0x43, 0x2d, 0x32, 0x30, 0x20, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x68, 0x61, + 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x28, 0x22, 0x65, 0x72, 0x63, 0x32, 0x30, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x20, 0x28, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x29, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x73, 0x65, 0x74, 0x2e, 0x0a, 0x20, 0x41, + 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x45, 0x52, 0x43, 0x2d, 0x37, 0x32, 0x31, 0x20, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x45, 0x52, 0x43, 0x2d, 0x31, 0x31, 0x35, + 0x35, 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x68, + 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x28, 0x22, 0x65, 0x72, 0x63, 0x37, 0x32, 0x31, 0x22, 0x20, 0x6f, 0x72, 0x20, + 0x22, 0x65, 0x72, 0x63, 0x31, 0x31, 0x35, 0x35, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x20, 0x28, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x29, 0x2c, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, + 0x20, 0x28, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x49, 0x44, 0x29, 0x20, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x20, 0x73, 0x65, 0x74, 0x2e, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x0f, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0xaf, 0x02, 0x0a, + 0x0a, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x8f, 0x02, 0x92, 0x41, 0xde, 0x01, 0x2a, 0x09, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, + 0x6c, 0x65, 0x74, 0x32, 0x73, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, + 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x2e, 0x20, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, + 0x7d, 0x2f, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2f, 0x7b, 0x6d, 0x70, + 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x7d, 0x4a, 0x5c, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x73, + 0x2f, 0x39, 0x35, 0x32, 0x35, 0x37, 0x63, 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, 0x2d, 0x34, + 0x32, 0x34, 0x31, 0x2d, 0x62, 0x66, 0x39, 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, 0x38, 0x65, + 0x39, 0x63, 0x63, 0x39, 0x31, 0x2f, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, + 0x2f, 0x64, 0x32, 0x38, 0x31, 0x39, 0x37, 0x65, 0x38, 0x2d, 0x33, 0x37, 0x32, 0x63, 0x2d, 0x34, + 0x36, 0x31, 0x63, 0x2d, 0x39, 0x61, 0x30, 0x30, 0x2d, 0x32, 0x64, 0x61, 0x33, 0x63, 0x35, 0x32, + 0x38, 0x63, 0x32, 0x64, 0x31, 0x22, 0xe2, 0x41, 0x01, 0x03, 0xfa, 0x41, 0x26, 0x0a, 0x24, 0x61, + 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, + 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, + 0x6c, 0x65, 0x74, 0x52, 0x09, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x3a, 0x89, + 0x02, 0x92, 0x41, 0x71, 0x0a, 0x6f, 0x2a, 0x0d, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x32, 0x5e, 0x54, 0x68, 0x65, 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, + 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x68, 0x65, 0x6c, 0x64, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x20, 0x61, 0x20, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x2e, 0xea, 0x41, 0x91, 0x01, 0x0a, 0x28, 0x61, 0x70, 0x69, 0x2e, 0x64, + 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x12, 0x65, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x7b, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x62, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2f, 0x7b, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0xa8, 0x02, 0x0a, 0x16, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x56, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3e, 0x92, 0x41, 0x0e, 0xca, 0x3e, 0x0b, 0xfa, 0x02, 0x08, + 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x26, 0x12, + 0x24, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, + 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x57, + 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, + 0x0a, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x42, 0x04, 0xe2, 0x41, 0x01, + 0x02, 0x52, 0x09, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x42, 0x0a, 0x06, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2a, 0xe2, 0x41, + 0x01, 0x02, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, + 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x23, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x49, 0x64, 0x22, 0xe0, 0x02, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0xc4, 0x02, 0x0a, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0xa0, 0x02, 0x92, 0x41, 0xed, 0x01, 0x2a, + 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x32, 0x7d, 0x54, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6f, 0x6c, 0x6c, 0x20, 0x75, 0x73, 0x69, 0x6e, + 0x67, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x0a, 0x20, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x70, 0x6f, + 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x4a, 0x5e, 0x22, 0x70, + 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x39, 0x35, 0x32, 0x35, 0x37, 0x63, 0x35, 0x61, 0x2d, 0x35, 0x32, + 0x32, 0x66, 0x2d, 0x34, 0x32, 0x34, 0x31, 0x2d, 0x62, 0x66, 0x39, 0x37, 0x2d, 0x32, 0x36, 0x35, + 0x36, 0x61, 0x38, 0x65, 0x39, 0x63, 0x63, 0x39, 0x31, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x33, 0x61, 0x31, 0x36, 0x38, 0x61, 0x35, 0x34, 0x2d, + 0x36, 0x36, 0x36, 0x31, 0x2d, 0x34, 0x65, 0x35, 0x61, 0x2d, 0x38, 0x62, 0x63, 0x35, 0x2d, 0x39, + 0x37, 0x35, 0x39, 0x36, 0x37, 0x31, 0x61, 0x61, 0x37, 0x37, 0x37, 0x22, 0xe2, 0x41, 0x01, 0x03, + 0xfa, 0x41, 0x28, 0x0a, 0x26, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, + 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0b, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x6e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4d, + 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x57, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x43, 0x92, + 0x41, 0x13, 0xca, 0x3e, 0x10, 0xfa, 0x02, 0x0d, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x26, 0x0a, 0x24, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x52, 0x09, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x3a, 0xd4, 0x01, - 0x92, 0x41, 0x66, 0x0a, 0x64, 0x2a, 0x07, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x32, 0x59, - 0x54, 0x68, 0x65, 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x72, 0x65, 0x70, 0x72, - 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x73, 0x73, 0x65, 0x74, 0x20, 0x68, 0x65, 0x6c, - 0x64, 0x20, 0x6f, 0x6e, 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x62, 0x79, 0x20, 0x61, 0x6e, - 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0xea, 0x41, 0x68, 0x0a, 0x22, 0x61, 0x70, + 0x65, 0x74, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xab, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x56, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x3e, 0x92, 0x41, 0x0e, 0xca, 0x3e, 0x0b, 0xfa, 0x02, 0x08, 0x70, 0x6f, 0x6f, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x26, 0x12, 0x24, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x12, 0x42, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x7b, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, - 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x62, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x5f, 0x69, 0x64, 0x7d, 0x22, 0xa8, 0x02, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, - 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x56, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x3e, 0x92, 0x41, 0x0e, 0xca, 0x3e, 0x0b, 0xfa, 0x02, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, - 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x26, 0x12, 0x24, 0x61, 0x70, 0x69, 0x2e, 0x64, - 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, - 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, - 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x0a, 0x6d, 0x70, 0x63, 0x5f, 0x77, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6f, - 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, - 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x50, 0x43, 0x57, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x09, 0x6d, 0x70, 0x63, - 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x42, 0x0a, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2a, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x23, 0x0a, - 0x21, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, - 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0a, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, - 0xe2, 0x41, 0x01, 0x01, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x22, - 0xe0, 0x02, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0xc4, 0x02, 0x0a, 0x0c, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0xa0, 0x02, 0x92, 0x41, 0xed, 0x01, 0x2a, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x32, 0x7d, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x74, 0x6f, - 0x20, 0x70, 0x6f, 0x6c, 0x6c, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x0a, 0x20, - 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, - 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x4a, 0x5e, 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x39, - 0x35, 0x32, 0x35, 0x37, 0x63, 0x35, 0x61, 0x2d, 0x35, 0x32, 0x32, 0x66, 0x2d, 0x34, 0x32, 0x34, - 0x31, 0x2d, 0x62, 0x66, 0x39, 0x37, 0x2d, 0x32, 0x36, 0x35, 0x36, 0x61, 0x38, 0x65, 0x39, 0x63, - 0x63, 0x39, 0x31, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, - 0x2f, 0x33, 0x61, 0x31, 0x36, 0x38, 0x61, 0x35, 0x34, 0x2d, 0x36, 0x36, 0x36, 0x31, 0x2d, 0x34, - 0x65, 0x35, 0x61, 0x2d, 0x38, 0x62, 0x63, 0x35, 0x2d, 0x39, 0x37, 0x35, 0x39, 0x36, 0x37, 0x31, - 0x61, 0x61, 0x37, 0x37, 0x37, 0x22, 0xe2, 0x41, 0x01, 0x03, 0xfa, 0x41, 0x28, 0x0a, 0x26, 0x61, - 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, - 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x22, 0x6e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x57, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x43, 0x92, 0x41, 0x13, 0xca, 0x3e, 0x10, 0xfa, - 0x02, 0x0d, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0xe2, - 0x41, 0x01, 0x02, 0xfa, 0x41, 0x26, 0x0a, 0x24, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, - 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0xab, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x57, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x56, 0x0a, 0x06, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3e, 0x92, 0x41, - 0x0e, 0xca, 0x3e, 0x0b, 0xfa, 0x02, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0xe2, - 0x41, 0x01, 0x02, 0xfa, 0x41, 0x26, 0x12, 0x24, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, - 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x06, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x22, 0xd4, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0b, 0x6d, - 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x28, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x0a, 0x6d, 0x70, 0x63, 0x57, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, - 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x47, - 0x92, 0x41, 0x44, 0x0a, 0x42, 0x2a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x57, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x28, 0x54, - 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x57, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x22, 0xe8, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x62, 0x0a, 0x0a, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x43, 0x92, 0x41, 0x13, 0xca, 0x3e, 0x10, 0xfa, 0x02, - 0x0d, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, - 0x01, 0x02, 0xfa, 0x41, 0x26, 0x0a, 0x24, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, - 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x09, 0x6d, 0x70, 0x63, - 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x45, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2b, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x24, - 0x0a, 0x22, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, - 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x23, 0x0a, - 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x49, 0x64, 0x22, 0x68, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x53, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3f, 0x92, 0x41, 0x11, 0xca, 0x3e, 0x0e, 0xfa, 0x02, 0x0b, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, - 0x41, 0x24, 0x0a, 0x22, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, - 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x85, 0x02, 0x0a, - 0x14, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x57, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3f, 0x92, 0x41, 0x11, 0xca, 0x3e, 0x0e, 0xfa, 0x02, 0x0b, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, - 0x41, 0x24, 0x12, 0x22, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, - 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x4c, - 0x0a, 0x0a, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x2d, 0xe2, 0x41, 0x01, 0x01, 0xfa, 0x41, 0x26, 0x0a, 0x24, 0x61, 0x70, 0x69, + 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, + 0x65, 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, + 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, + 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xd4, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x49, 0x0a, 0x0b, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, + 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, + 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, + 0x52, 0x0a, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, + 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x47, 0x92, 0x41, 0x44, 0x0a, 0x42, 0x2a, 0x16, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x32, 0x28, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4c, 0x69, + 0x73, 0x74, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x22, 0xe8, 0x01, + 0x0a, 0x16, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x62, 0x0a, 0x0a, 0x6d, 0x70, 0x63, 0x5f, + 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x43, 0x92, 0x41, + 0x13, 0xca, 0x3e, 0x10, 0xfa, 0x02, 0x0d, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x26, 0x0a, 0x24, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x52, 0x09, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x09, - 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, - 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x23, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xcc, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, - 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, - 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, - 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x45, 0x92, 0x41, - 0x42, 0x0a, 0x40, 0x2a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x27, 0x54, 0x68, 0x65, 0x20, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x73, 0x2e, 0x22, 0xb6, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x57, 0x0a, 0x06, 0x70, + 0x74, 0x52, 0x09, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x45, 0x0a, 0x07, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2b, 0xe2, + 0x41, 0x01, 0x02, 0xfa, 0x41, 0x24, 0x0a, 0x22, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, + 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x12, 0x23, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, 0x09, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x22, 0x68, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x53, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3f, 0x92, 0x41, 0x11, + 0xca, 0x3e, 0x0e, 0xfa, 0x02, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, + 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x24, 0x0a, 0x22, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, + 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x85, 0x02, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x57, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3f, 0x92, 0x41, 0x11, - 0xca, 0x3e, 0x0e, 0xfa, 0x02, 0x0b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4e, 0x61, 0x6d, + 0xca, 0x3e, 0x0e, 0xfa, 0x02, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x24, 0x12, 0x22, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, 0x08, 0x70, - 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x23, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, - 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xc7, 0x01, 0x0a, - 0x14, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x08, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x06, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x12, 0x4c, 0x0a, 0x0a, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, + 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2d, 0xe2, 0x41, 0x01, 0x01, 0xfa, 0x41, + 0x26, 0x0a, 0x24, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, + 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x50, + 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x09, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, + 0x65, 0x74, 0x12, 0x21, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x23, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, + 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xcc, 0x01, 0x0a, 0x15, 0x4c, + 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, - 0x08, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, - 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x3a, 0x43, 0x92, 0x41, 0x40, 0x0a, 0x3e, 0x2a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x26, - 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x32, 0xf4, 0x13, 0x0a, 0x10, 0x4d, 0x50, 0x43, 0x57, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xa8, 0x05, 0x0a, 0x0f, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, - 0x35, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xbe, 0x04, 0x92, 0x41, 0xb5, 0x03, 0x12, 0x0f, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x1a, 0xa1, 0x03, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x4d, 0x50, 0x43, 0x57, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, - 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x72, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, - 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x27, 0x73, 0x20, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x62, - 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x20, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x20, 0x55, - 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x6f, 0x6f, 0x64, 0x2c, 0x20, 0x74, - 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x27, 0x73, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x77, 0x69, 0x74, 0x68, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x70, 0x72, 0x69, 0x61, 0x74, 0x65, - 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x20, 0x41, 0x66, 0x74, - 0x65, 0x72, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2c, - 0x20, 0x75, 0x73, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x27, 0x73, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6f, 0x6c, 0x6c, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, - 0x27, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0xca, 0x41, 0x24, 0x0a, 0x09, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, - 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xda, 0x41, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x2c, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2c, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x2c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x5f, 0x69, 0x64, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x0a, 0x6d, 0x70, 0x63, 0x5f, 0x77, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x22, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x3d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6d, 0x70, 0x63, 0x57, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x12, 0xd7, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4d, 0x50, - 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x32, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, - 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x50, 0x43, 0x57, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x63, 0x6f, - 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, - 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x50, 0x43, 0x57, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x22, 0x69, 0x92, 0x41, 0x38, 0x12, 0x0c, 0x47, 0x65, 0x74, 0x4d, - 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x1a, 0x28, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, - 0x76, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x2e, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, - 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, - 0x2f, 0x2a, 0x2f, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2f, 0x2a, 0x7d, - 0x12, 0xeb, 0x01, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x73, 0x12, 0x34, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x63, 0x6f, 0x69, 0x6e, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, - 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x6c, 0x92, 0x41, 0x39, 0x12, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x57, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x1a, 0x27, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, - 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0xda, 0x41, - 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, - 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, - 0x2f, 0x2a, 0x7d, 0x2f, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x87, - 0x02, 0x0a, 0x0f, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x35, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x69, 0x6e, + 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, + 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, + 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x3a, 0x45, 0x92, 0x41, 0x42, 0x0a, 0x40, 0x2a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x32, 0x27, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x22, 0xb6, 0x01, 0x0a, 0x13, 0x4c, 0x69, + 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x57, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x3f, 0x92, 0x41, 0x11, 0xca, 0x3e, 0x0e, 0xfa, 0x02, 0x0b, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x24, 0x12, 0x22, + 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, + 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x09, 0x70, 0x61, + 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x04, 0xe2, + 0x41, 0x01, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x23, 0x0a, + 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x22, 0xc7, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x08, 0x62, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, + 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, + 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x43, 0x92, 0x41, 0x40, 0x0a, 0x3e, 0x2a, 0x14, + 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x26, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4c, + 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x22, 0xc2, 0x01, 0x0a, + 0x19, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5d, 0x0a, 0x06, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x45, 0x92, 0x41, 0x11, 0xca, + 0x3e, 0x0e, 0xfa, 0x02, 0x0b, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x2a, 0x12, 0x28, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, + 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x09, 0x70, 0x61, 0x67, + 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x04, 0xe2, 0x41, + 0x01, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x23, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x22, 0xec, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x55, 0x0a, 0x0f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x22, 0x94, 0x01, 0x92, 0x41, 0x3c, 0x12, 0x0f, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x29, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x77, - 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x2e, 0xda, 0x41, 0x12, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x2c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x3a, 0x01, - 0x2a, 0x22, 0x35, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x3d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x2a, 0x2f, 0x6d, 0x70, 0x63, 0x57, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0xcf, 0x01, 0x0a, 0x0a, 0x47, 0x65, 0x74, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, - 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x69, 0x6e, + 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x0e, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, + 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, + 0x4f, 0x92, 0x41, 0x4c, 0x0a, 0x4a, 0x2a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x32, 0x2c, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4c, 0x69, 0x73, + 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, + 0x32, 0xcb, 0x18, 0x0a, 0x10, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xa8, 0x05, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x35, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x22, 0x67, 0x92, 0x41, 0x34, 0x12, 0x0a, 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x1a, 0x26, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x61, 0x6e, - 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2e, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, - 0x6d, 0x65, 0x3d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x2a, 0x2f, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xf9, 0x01, 0x0a, 0x0d, 0x4c, - 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x33, 0x2e, 0x63, + 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0xbe, 0x04, 0x92, 0x41, 0xb5, 0x03, 0x12, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x50, + 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x1a, 0xa1, 0x03, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x61, 0x6e, 0x20, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x20, + 0x54, 0x68, 0x65, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, + 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x65, 0x64, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x27, 0x73, 0x20, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x69, 0x73, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x20, 0x55, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x68, 0x6f, 0x6f, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, + 0x6c, 0x6c, 0x73, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x27, 0x73, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, + 0x70, 0x70, 0x72, 0x6f, 0x70, 0x72, 0x69, 0x61, 0x74, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x20, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x63, 0x61, 0x6c, + 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x4d, + 0x50, 0x43, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x27, 0x73, 0x20, 0x4c, + 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6f, 0x6c, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, 0x27, 0x73, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x75, 0x74, 0x65, 0x4d, 0x50, 0x43, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0xca, 0x41, 0x24, 0x0a, 0x09, + 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0xda, 0x41, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x6d, 0x70, 0x63, 0x5f, + 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2c, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x2d, 0x3a, 0x0a, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x22, + 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x6f, 0x6f, + 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, + 0x12, 0xd7, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, + 0x74, 0x12, 0x32, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, + 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, + 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x22, + 0x69, 0x92, 0x41, 0x38, 0x12, 0x0c, 0x47, 0x65, 0x74, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, + 0x65, 0x74, 0x1a, 0x28, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x61, 0x6e, + 0x20, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2e, 0xda, 0x41, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x7b, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x2a, 0x2f, 0x6d, 0x70, 0x63, + 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xeb, 0x01, 0x0a, 0x0e, 0x4c, + 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x34, 0x2e, + 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, + 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x92, 0x41, 0x39, 0x12, + 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x1a, + 0x27, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x61, 0x20, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6d, 0x70, + 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x12, 0xc7, 0x04, 0x0a, 0x0f, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x35, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, - 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x34, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, + 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xd4, 0x03, 0x92, 0x41, + 0xfb, 0x02, 0x12, 0x0f, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x1a, 0xe7, 0x02, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x73, 0x20, + 0x61, 0x6e, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, + 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x20, + 0x54, 0x68, 0x65, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x72, 0x65, + 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x63, 0x72, 0x6f, 0x73, + 0x73, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, + 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x20, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x45, 0x56, 0x4d, + 0x29, 0x2e, 0x20, 0x53, 0x6f, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x74, 0x77, 0x69, 0x63, + 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2d, 0x6d, 0x61, 0x69, 0x6e, 0x6e, 0x65, 0x74, 0x2c, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, + 0x67, 0x20, 0x69, 0x74, 0x20, 0x74, 0x77, 0x69, 0x63, 0x65, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2d, 0x67, 0x6f, 0x65, 0x72, 0x6c, 0x69, 0x2c, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x77, 0x6f, + 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x63, 0x61, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x20, 0x6f, 0x6e, + 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x20, 0x4d, 0x61, 0x69, 0x6e, 0x6e, 0x65, + 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x6f, 0x65, 0x72, 0x6c, 0x69, 0x2e, 0xda, 0x41, 0x12, + 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2c, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x3a, 0x01, 0x2a, 0x22, 0x35, 0x2f, 0x76, 0x31, + 0x2f, 0x7b, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x3d, 0x70, 0x6f, 0x6f, + 0x6c, 0x73, 0x2f, 0x2a, 0x2f, 0x6d, 0x70, 0x63, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2f, + 0x2a, 0x7d, 0x3a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0xcf, 0x01, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x30, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7d, 0x92, 0x41, 0x3d, 0x12, 0x0d, 0x4c, 0x69, - 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0x2c, 0x52, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x4d, - 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0xda, 0x41, 0x11, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x2c, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x3d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0xe4, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x42, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x32, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, - 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x63, 0x6f, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x67, 0x92, 0x41, 0x34, + 0x12, 0x0a, 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x26, 0x52, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x2e, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x23, 0x12, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x2a, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xf9, 0x01, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x33, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, + 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, + 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x6b, 0x92, 0x41, 0x2b, 0x12, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x1a, 0x1b, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, - 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2e, - 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, - 0x2c, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x6e, 0x65, 0x74, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x7d, 0x92, 0x41, 0x3d, 0x12, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0x2c, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, + 0x65, 0x74, 0x2e, 0xda, 0x41, 0x11, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x6d, 0x70, 0x63, + 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, + 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x12, 0xe4, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x73, 0x12, 0x32, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, + 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, + 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6b, 0x92, 0x41, 0x2b, 0x12, + 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x1a, 0x1b, 0x52, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, 0x2c, 0x2f, 0x76, 0x31, 0x2f, 0x7b, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, + 0x2a, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x62, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x94, 0x02, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x38, + 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, + 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, + 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, + 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x88, 0x01, 0x92, 0x41, 0x37, 0x12, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x42, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x21, 0x52, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, + 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x12, + 0x3d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x2a, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, - 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x1a, 0xad, 0x03, - 0x92, 0x41, 0xfb, 0x02, 0x12, 0xf8, 0x02, 0x41, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x73, 0x20, 0x42, 0x49, - 0x50, 0x2d, 0x33, 0x32, 0x2d, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x48, 0x69, 0x65, 0x72, 0x61, - 0x72, 0x63, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x44, 0x65, 0x74, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x69, 0x73, 0x74, 0x69, 0x63, 0x20, 0x28, 0x48, 0x44, 0x29, 0x20, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x2d, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, - 0x74, 0x65, 0x64, 0x20, 0x41, 0x73, 0x73, 0x65, 0x74, 0x20, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x73, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, - 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x71, 0x75, 0x65, 0x72, - 0x69, 0x65, 0x64, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x20, 0x42, 0x65, 0x63, - 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b, - 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x4d, 0x50, 0x43, 0x20, 0x4b, 0x65, 0x79, 0x73, 0x2c, - 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, - 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x41, 0x50, 0x49, - 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, 0x2e, 0xca, - 0x41, 0x2b, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, - 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x77, 0x61, 0x61, - 0x73, 0x2f, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x42, 0xc0, 0x01, - 0x5a, 0x4f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x69, - 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x77, 0x61, 0x61, 0x73, 0x2d, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x2d, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x2d, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, - 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x2f, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2f, 0x76, - 0x31, 0x92, 0x41, 0x6c, 0x12, 0x16, 0x0a, 0x0f, 0x4d, 0x50, 0x43, 0x20, 0x57, 0x61, 0x6c, 0x6c, + 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0xad, + 0x03, 0x92, 0x41, 0xfb, 0x02, 0x12, 0xf8, 0x02, 0x41, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x73, 0x20, 0x42, + 0x49, 0x50, 0x2d, 0x33, 0x32, 0x2d, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x48, 0x69, 0x65, 0x72, + 0x61, 0x72, 0x63, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x44, 0x65, 0x74, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x69, 0x63, 0x20, 0x28, 0x48, 0x44, 0x29, 0x20, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x2d, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x41, 0x73, 0x73, 0x65, 0x74, 0x20, 0x62, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x73, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x43, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x71, 0x75, 0x65, + 0x72, 0x69, 0x65, 0x64, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x20, 0x42, 0x65, + 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x61, 0x63, + 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x4d, 0x50, 0x43, 0x20, 0x4b, 0x65, 0x79, 0x73, + 0x2c, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x41, 0x50, + 0x49, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x20, 0x75, 0x73, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x61, 0x61, 0x53, 0x20, 0x53, 0x44, 0x4b, 0x2e, + 0xca, 0x41, 0x2b, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, + 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x77, 0x61, + 0x61, 0x73, 0x2f, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x42, 0xbf, + 0x01, 0x5a, 0x4f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, + 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x77, 0x61, 0x61, 0x73, 0x2d, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x2d, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x2d, 0x67, 0x6f, 0x2f, 0x67, 0x65, + 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x2f, 0x6d, 0x70, 0x63, 0x5f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x2f, + 0x76, 0x31, 0x92, 0x41, 0x6b, 0x12, 0x15, 0x0a, 0x0e, 0x4d, 0x50, 0x43, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x20, 0x41, 0x50, 0x49, 0x32, 0x03, 0x31, 0x2e, 0x30, 0x1a, 0x2b, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x77, 0x61, 0x61, 0x73, 0x2f, 0x6d, 0x70, @@ -1510,48 +1933,56 @@ func file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescGZIP() []byte { return file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDescData } -var file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes = make([]protoimpl.MessageInfo, 17) var file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_goTypes = []interface{}{ - (*MPCWallet)(nil), // 0: coinbase.cloud.mpc_wallets.v1.MPCWallet - (*Address)(nil), // 1: coinbase.cloud.mpc_wallets.v1.Address - (*Balance)(nil), // 2: coinbase.cloud.mpc_wallets.v1.Balance - (*CreateMPCWalletRequest)(nil), // 3: coinbase.cloud.mpc_wallets.v1.CreateMPCWalletRequest - (*CreateMPCWalletMetadata)(nil), // 4: coinbase.cloud.mpc_wallets.v1.CreateMPCWalletMetadata - (*GetMPCWalletRequest)(nil), // 5: coinbase.cloud.mpc_wallets.v1.GetMPCWalletRequest - (*ListMPCWalletsRequest)(nil), // 6: coinbase.cloud.mpc_wallets.v1.ListMPCWalletsRequest - (*ListMPCWalletsResponse)(nil), // 7: coinbase.cloud.mpc_wallets.v1.ListMPCWalletsResponse - (*GenerateAddressRequest)(nil), // 8: coinbase.cloud.mpc_wallets.v1.GenerateAddressRequest - (*GetAddressRequest)(nil), // 9: coinbase.cloud.mpc_wallets.v1.GetAddressRequest - (*ListAddressesRequest)(nil), // 10: coinbase.cloud.mpc_wallets.v1.ListAddressesRequest - (*ListAddressesResponse)(nil), // 11: coinbase.cloud.mpc_wallets.v1.ListAddressesResponse - (*ListBalancesRequest)(nil), // 12: coinbase.cloud.mpc_wallets.v1.ListBalancesRequest - (*ListBalancesResponse)(nil), // 13: coinbase.cloud.mpc_wallets.v1.ListBalancesResponse - (*longrunning.Operation)(nil), // 14: google.longrunning.Operation + (*MPCWallet)(nil), // 0: coinbase.cloud.mpc_wallets.v1.MPCWallet + (*Address)(nil), // 1: coinbase.cloud.mpc_wallets.v1.Address + (*Balance)(nil), // 2: coinbase.cloud.mpc_wallets.v1.Balance + (*BalanceDetail)(nil), // 3: coinbase.cloud.mpc_wallets.v1.BalanceDetail + (*CreateMPCWalletRequest)(nil), // 4: coinbase.cloud.mpc_wallets.v1.CreateMPCWalletRequest + (*CreateMPCWalletMetadata)(nil), // 5: coinbase.cloud.mpc_wallets.v1.CreateMPCWalletMetadata + (*GetMPCWalletRequest)(nil), // 6: coinbase.cloud.mpc_wallets.v1.GetMPCWalletRequest + (*ListMPCWalletsRequest)(nil), // 7: coinbase.cloud.mpc_wallets.v1.ListMPCWalletsRequest + (*ListMPCWalletsResponse)(nil), // 8: coinbase.cloud.mpc_wallets.v1.ListMPCWalletsResponse + (*GenerateAddressRequest)(nil), // 9: coinbase.cloud.mpc_wallets.v1.GenerateAddressRequest + (*GetAddressRequest)(nil), // 10: coinbase.cloud.mpc_wallets.v1.GetAddressRequest + (*ListAddressesRequest)(nil), // 11: coinbase.cloud.mpc_wallets.v1.ListAddressesRequest + (*ListAddressesResponse)(nil), // 12: coinbase.cloud.mpc_wallets.v1.ListAddressesResponse + (*ListBalancesRequest)(nil), // 13: coinbase.cloud.mpc_wallets.v1.ListBalancesRequest + (*ListBalancesResponse)(nil), // 14: coinbase.cloud.mpc_wallets.v1.ListBalancesResponse + (*ListBalanceDetailsRequest)(nil), // 15: coinbase.cloud.mpc_wallets.v1.ListBalanceDetailsRequest + (*ListBalanceDetailsResponse)(nil), // 16: coinbase.cloud.mpc_wallets.v1.ListBalanceDetailsResponse + (*v1.Asset_Definition)(nil), // 17: coinbase.cloud.blockchain.v1.Asset.Definition + (*longrunning.Operation)(nil), // 18: google.longrunning.Operation } var file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_depIdxs = []int32{ - 0, // 0: coinbase.cloud.mpc_wallets.v1.CreateMPCWalletRequest.mpc_wallet:type_name -> coinbase.cloud.mpc_wallets.v1.MPCWallet - 0, // 1: coinbase.cloud.mpc_wallets.v1.ListMPCWalletsResponse.mpc_wallets:type_name -> coinbase.cloud.mpc_wallets.v1.MPCWallet - 1, // 2: coinbase.cloud.mpc_wallets.v1.ListAddressesResponse.addresses:type_name -> coinbase.cloud.mpc_wallets.v1.Address - 2, // 3: coinbase.cloud.mpc_wallets.v1.ListBalancesResponse.balances:type_name -> coinbase.cloud.mpc_wallets.v1.Balance - 3, // 4: coinbase.cloud.mpc_wallets.v1.MPCWalletService.CreateMPCWallet:input_type -> coinbase.cloud.mpc_wallets.v1.CreateMPCWalletRequest - 5, // 5: coinbase.cloud.mpc_wallets.v1.MPCWalletService.GetMPCWallet:input_type -> coinbase.cloud.mpc_wallets.v1.GetMPCWalletRequest - 6, // 6: coinbase.cloud.mpc_wallets.v1.MPCWalletService.ListMPCWallets:input_type -> coinbase.cloud.mpc_wallets.v1.ListMPCWalletsRequest - 8, // 7: coinbase.cloud.mpc_wallets.v1.MPCWalletService.GenerateAddress:input_type -> coinbase.cloud.mpc_wallets.v1.GenerateAddressRequest - 9, // 8: coinbase.cloud.mpc_wallets.v1.MPCWalletService.GetAddress:input_type -> coinbase.cloud.mpc_wallets.v1.GetAddressRequest - 10, // 9: coinbase.cloud.mpc_wallets.v1.MPCWalletService.ListAddresses:input_type -> coinbase.cloud.mpc_wallets.v1.ListAddressesRequest - 12, // 10: coinbase.cloud.mpc_wallets.v1.MPCWalletService.ListBalances:input_type -> coinbase.cloud.mpc_wallets.v1.ListBalancesRequest - 14, // 11: coinbase.cloud.mpc_wallets.v1.MPCWalletService.CreateMPCWallet:output_type -> google.longrunning.Operation - 0, // 12: coinbase.cloud.mpc_wallets.v1.MPCWalletService.GetMPCWallet:output_type -> coinbase.cloud.mpc_wallets.v1.MPCWallet - 7, // 13: coinbase.cloud.mpc_wallets.v1.MPCWalletService.ListMPCWallets:output_type -> coinbase.cloud.mpc_wallets.v1.ListMPCWalletsResponse - 1, // 14: coinbase.cloud.mpc_wallets.v1.MPCWalletService.GenerateAddress:output_type -> coinbase.cloud.mpc_wallets.v1.Address - 1, // 15: coinbase.cloud.mpc_wallets.v1.MPCWalletService.GetAddress:output_type -> coinbase.cloud.mpc_wallets.v1.Address - 11, // 16: coinbase.cloud.mpc_wallets.v1.MPCWalletService.ListAddresses:output_type -> coinbase.cloud.mpc_wallets.v1.ListAddressesResponse - 13, // 17: coinbase.cloud.mpc_wallets.v1.MPCWalletService.ListBalances:output_type -> coinbase.cloud.mpc_wallets.v1.ListBalancesResponse - 11, // [11:18] is the sub-list for method output_type - 4, // [4:11] is the sub-list for method input_type - 4, // [4:4] is the sub-list for extension type_name - 4, // [4:4] is the sub-list for extension extendee - 0, // [0:4] is the sub-list for field type_name + 17, // 0: coinbase.cloud.mpc_wallets.v1.BalanceDetail.asset_definition:type_name -> coinbase.cloud.blockchain.v1.Asset.Definition + 0, // 1: coinbase.cloud.mpc_wallets.v1.CreateMPCWalletRequest.mpc_wallet:type_name -> coinbase.cloud.mpc_wallets.v1.MPCWallet + 0, // 2: coinbase.cloud.mpc_wallets.v1.ListMPCWalletsResponse.mpc_wallets:type_name -> coinbase.cloud.mpc_wallets.v1.MPCWallet + 1, // 3: coinbase.cloud.mpc_wallets.v1.ListAddressesResponse.addresses:type_name -> coinbase.cloud.mpc_wallets.v1.Address + 2, // 4: coinbase.cloud.mpc_wallets.v1.ListBalancesResponse.balances:type_name -> coinbase.cloud.mpc_wallets.v1.Balance + 3, // 5: coinbase.cloud.mpc_wallets.v1.ListBalanceDetailsResponse.balance_details:type_name -> coinbase.cloud.mpc_wallets.v1.BalanceDetail + 4, // 6: coinbase.cloud.mpc_wallets.v1.MPCWalletService.CreateMPCWallet:input_type -> coinbase.cloud.mpc_wallets.v1.CreateMPCWalletRequest + 6, // 7: coinbase.cloud.mpc_wallets.v1.MPCWalletService.GetMPCWallet:input_type -> coinbase.cloud.mpc_wallets.v1.GetMPCWalletRequest + 7, // 8: coinbase.cloud.mpc_wallets.v1.MPCWalletService.ListMPCWallets:input_type -> coinbase.cloud.mpc_wallets.v1.ListMPCWalletsRequest + 9, // 9: coinbase.cloud.mpc_wallets.v1.MPCWalletService.GenerateAddress:input_type -> coinbase.cloud.mpc_wallets.v1.GenerateAddressRequest + 10, // 10: coinbase.cloud.mpc_wallets.v1.MPCWalletService.GetAddress:input_type -> coinbase.cloud.mpc_wallets.v1.GetAddressRequest + 11, // 11: coinbase.cloud.mpc_wallets.v1.MPCWalletService.ListAddresses:input_type -> coinbase.cloud.mpc_wallets.v1.ListAddressesRequest + 13, // 12: coinbase.cloud.mpc_wallets.v1.MPCWalletService.ListBalances:input_type -> coinbase.cloud.mpc_wallets.v1.ListBalancesRequest + 15, // 13: coinbase.cloud.mpc_wallets.v1.MPCWalletService.ListBalanceDetails:input_type -> coinbase.cloud.mpc_wallets.v1.ListBalanceDetailsRequest + 18, // 14: coinbase.cloud.mpc_wallets.v1.MPCWalletService.CreateMPCWallet:output_type -> google.longrunning.Operation + 0, // 15: coinbase.cloud.mpc_wallets.v1.MPCWalletService.GetMPCWallet:output_type -> coinbase.cloud.mpc_wallets.v1.MPCWallet + 8, // 16: coinbase.cloud.mpc_wallets.v1.MPCWalletService.ListMPCWallets:output_type -> coinbase.cloud.mpc_wallets.v1.ListMPCWalletsResponse + 1, // 17: coinbase.cloud.mpc_wallets.v1.MPCWalletService.GenerateAddress:output_type -> coinbase.cloud.mpc_wallets.v1.Address + 1, // 18: coinbase.cloud.mpc_wallets.v1.MPCWalletService.GetAddress:output_type -> coinbase.cloud.mpc_wallets.v1.Address + 12, // 19: coinbase.cloud.mpc_wallets.v1.MPCWalletService.ListAddresses:output_type -> coinbase.cloud.mpc_wallets.v1.ListAddressesResponse + 14, // 20: coinbase.cloud.mpc_wallets.v1.MPCWalletService.ListBalances:output_type -> coinbase.cloud.mpc_wallets.v1.ListBalancesResponse + 16, // 21: coinbase.cloud.mpc_wallets.v1.MPCWalletService.ListBalanceDetails:output_type -> coinbase.cloud.mpc_wallets.v1.ListBalanceDetailsResponse + 14, // [14:22] is the sub-list for method output_type + 6, // [6:14] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name } func init() { file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_init() } @@ -1597,7 +2028,7 @@ func file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_init() { } } file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateMPCWalletRequest); i { + switch v := v.(*BalanceDetail); i { case 0: return &v.state case 1: @@ -1609,7 +2040,7 @@ func file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_init() { } } file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateMPCWalletMetadata); i { + switch v := v.(*CreateMPCWalletRequest); i { case 0: return &v.state case 1: @@ -1621,7 +2052,7 @@ func file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_init() { } } file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMPCWalletRequest); i { + switch v := v.(*CreateMPCWalletMetadata); i { case 0: return &v.state case 1: @@ -1633,7 +2064,7 @@ func file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_init() { } } file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMPCWalletsRequest); i { + switch v := v.(*GetMPCWalletRequest); i { case 0: return &v.state case 1: @@ -1645,7 +2076,7 @@ func file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_init() { } } file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMPCWalletsResponse); i { + switch v := v.(*ListMPCWalletsRequest); i { case 0: return &v.state case 1: @@ -1657,7 +2088,7 @@ func file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_init() { } } file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateAddressRequest); i { + switch v := v.(*ListMPCWalletsResponse); i { case 0: return &v.state case 1: @@ -1669,7 +2100,7 @@ func file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_init() { } } file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAddressRequest); i { + switch v := v.(*GenerateAddressRequest); i { case 0: return &v.state case 1: @@ -1681,7 +2112,7 @@ func file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_init() { } } file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListAddressesRequest); i { + switch v := v.(*GetAddressRequest); i { case 0: return &v.state case 1: @@ -1693,7 +2124,7 @@ func file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_init() { } } file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListAddressesResponse); i { + switch v := v.(*ListAddressesRequest); i { case 0: return &v.state case 1: @@ -1705,7 +2136,7 @@ func file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_init() { } } file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListBalancesRequest); i { + switch v := v.(*ListAddressesResponse); i { case 0: return &v.state case 1: @@ -1717,6 +2148,18 @@ func file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_init() { } } file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListBalancesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListBalancesResponse); i { case 0: return &v.state @@ -1728,6 +2171,30 @@ func file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_init() { return nil } } + file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListBalanceDetailsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListBalanceDetailsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -1735,7 +2202,7 @@ func file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_coinbase_cloud_mpc_wallets_v1_mpc_wallets_proto_rawDesc, NumEnums: 0, - NumMessages: 14, + NumMessages: 17, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/go/coinbase/cloud/mpc_wallets/v1/mpc_wallets.pb.gw.go b/gen/go/coinbase/cloud/mpc_wallets/v1/mpc_wallets.pb.gw.go index 24e2871..c12a62f 100644 --- a/gen/go/coinbase/cloud/mpc_wallets/v1/mpc_wallets.pb.gw.go +++ b/gen/go/coinbase/cloud/mpc_wallets/v1/mpc_wallets.pb.gw.go @@ -499,6 +499,76 @@ func local_request_MPCWalletService_ListBalances_0(ctx context.Context, marshale } +var ( + filter_MPCWalletService_ListBalanceDetails_0 = &utilities.DoubleArray{Encoding: map[string]int{"parent": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} +) + +func request_MPCWalletService_ListBalanceDetails_0(ctx context.Context, marshaler runtime.Marshaler, client MPCWalletServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListBalanceDetailsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MPCWalletService_ListBalanceDetails_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ListBalanceDetails(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MPCWalletService_ListBalanceDetails_0(ctx context.Context, marshaler runtime.Marshaler, server MPCWalletServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListBalanceDetailsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["parent"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "parent") + } + + protoReq.Parent, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "parent", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MPCWalletService_ListBalanceDetails_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListBalanceDetails(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterMPCWalletServiceHandlerServer registers the http handlers for service MPCWalletService to "mux". // UnaryRPC :call MPCWalletServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -680,6 +750,31 @@ func RegisterMPCWalletServiceHandlerServer(ctx context.Context, mux *runtime.Ser }) + mux.Handle("GET", pattern_MPCWalletService_ListBalanceDetails_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/coinbase.cloud.mpc_wallets.v1.MPCWalletService/ListBalanceDetails", runtime.WithHTTPPathPattern("/v1/{parent=networks/*/addresses/*/balances/*}/balanceDetails")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MPCWalletService_ListBalanceDetails_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MPCWalletService_ListBalanceDetails_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -875,6 +970,28 @@ func RegisterMPCWalletServiceHandlerClient(ctx context.Context, mux *runtime.Ser }) + mux.Handle("GET", pattern_MPCWalletService_ListBalanceDetails_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/coinbase.cloud.mpc_wallets.v1.MPCWalletService/ListBalanceDetails", runtime.WithHTTPPathPattern("/v1/{parent=networks/*/addresses/*/balances/*}/balanceDetails")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MPCWalletService_ListBalanceDetails_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MPCWalletService_ListBalanceDetails_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -892,6 +1009,8 @@ var ( pattern_MPCWalletService_ListAddresses_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2, 2, 3}, []string{"v1", "networks", "parent", "addresses"}, "")) pattern_MPCWalletService_ListBalances_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 4, 4, 5, 3, 2, 4}, []string{"v1", "networks", "addresses", "parent", "balances"}, "")) + + pattern_MPCWalletService_ListBalanceDetails_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 2, 2, 1, 0, 2, 3, 1, 0, 4, 6, 5, 4, 2, 5}, []string{"v1", "networks", "addresses", "balances", "parent", "balanceDetails"}, "")) ) var ( @@ -908,4 +1027,6 @@ var ( forward_MPCWalletService_ListAddresses_0 = runtime.ForwardResponseMessage forward_MPCWalletService_ListBalances_0 = runtime.ForwardResponseMessage + + forward_MPCWalletService_ListBalanceDetails_0 = runtime.ForwardResponseMessage ) diff --git a/gen/go/coinbase/cloud/mpc_wallets/v1/mpc_wallets_aip.go b/gen/go/coinbase/cloud/mpc_wallets/v1/mpc_wallets_aip.go index 5cd7803..a13df33 100644 --- a/gen/go/coinbase/cloud/mpc_wallets/v1/mpc_wallets_aip.go +++ b/gen/go/coinbase/cloud/mpc_wallets/v1/mpc_wallets_aip.go @@ -185,3 +185,108 @@ func (n BalanceResourceName) AddressResourceName() AddressResourceName { AddressId: n.AddressId, } } + +type BalanceDetailResourceName struct { + NetworkId string + AddressId string + BalanceId string + BalanceDetailId string +} + +func (n AddressResourceName) BalanceDetailResourceName( + balanceId string, + balanceDetailId string, +) BalanceDetailResourceName { + return BalanceDetailResourceName{ + NetworkId: n.NetworkId, + AddressId: n.AddressId, + BalanceId: balanceId, + BalanceDetailId: balanceDetailId, + } +} + +func (n BalanceResourceName) BalanceDetailResourceName( + balanceDetailId string, +) BalanceDetailResourceName { + return BalanceDetailResourceName{ + NetworkId: n.NetworkId, + AddressId: n.AddressId, + BalanceId: n.BalanceId, + BalanceDetailId: balanceDetailId, + } +} + +func (n BalanceDetailResourceName) Validate() error { + if n.NetworkId == "" { + return fmt.Errorf("network_id: empty") + } + if strings.IndexByte(n.NetworkId, '/') != -1 { + return fmt.Errorf("network_id: contains illegal character '/'") + } + if n.AddressId == "" { + return fmt.Errorf("address_id: empty") + } + if strings.IndexByte(n.AddressId, '/') != -1 { + return fmt.Errorf("address_id: contains illegal character '/'") + } + if n.BalanceId == "" { + return fmt.Errorf("balance_id: empty") + } + if strings.IndexByte(n.BalanceId, '/') != -1 { + return fmt.Errorf("balance_id: contains illegal character '/'") + } + if n.BalanceDetailId == "" { + return fmt.Errorf("balance_detail_id: empty") + } + if strings.IndexByte(n.BalanceDetailId, '/') != -1 { + return fmt.Errorf("balance_detail_id: contains illegal character '/'") + } + return nil +} + +func (n BalanceDetailResourceName) ContainsWildcard() bool { + return false || n.NetworkId == "-" || n.AddressId == "-" || n.BalanceId == "-" || n.BalanceDetailId == "-" +} + +func (n BalanceDetailResourceName) String() string { + return resourcename.Sprint( + "networks/{network_id}/addresses/{address_id}/balances/{balance_id}/balanceDetails/{balance_detail_id}", + n.NetworkId, + n.AddressId, + n.BalanceId, + n.BalanceDetailId, + ) +} + +func (n BalanceDetailResourceName) MarshalString() (string, error) { + if err := n.Validate(); err != nil { + return "", err + } + return n.String(), nil +} + +func (n *BalanceDetailResourceName) UnmarshalString(name string) error { + return resourcename.Sscan( + name, + "networks/{network_id}/addresses/{address_id}/balances/{balance_id}/balanceDetails/{balance_detail_id}", + &n.NetworkId, + &n.AddressId, + &n.BalanceId, + &n.BalanceDetailId, + ) +} + +func (n BalanceDetailResourceName) AddressResourceName() AddressResourceName { + return AddressResourceName{ + NetworkId: n.NetworkId, + AddressId: n.AddressId, + } +} + +func (n BalanceDetailResourceName) BalanceResourceName() BalanceResourceName { + return BalanceResourceName{ + NetworkId: n.NetworkId, + AddressId: n.AddressId, + BalanceId: n.BalanceId, + } +} diff --git a/gen/go/coinbase/cloud/mpc_wallets/v1/mpc_wallets_grpc.pb.go b/gen/go/coinbase/cloud/mpc_wallets/v1/mpc_wallets_grpc.pb.go index e6bc765..819e921 100644 --- a/gen/go/coinbase/cloud/mpc_wallets/v1/mpc_wallets_grpc.pb.go +++ b/gen/go/coinbase/cloud/mpc_wallets/v1/mpc_wallets_grpc.pb.go @@ -29,7 +29,10 @@ type MPCWalletServiceClient interface { GetMPCWallet(ctx context.Context, in *GetMPCWalletRequest, opts ...grpc.CallOption) (*MPCWallet, error) // Returns a list of MPCWallets in a Pool. ListMPCWallets(ctx context.Context, in *ListMPCWalletsRequest, opts ...grpc.CallOption) (*ListMPCWalletsResponse, error) - // Generates an Address within an MPCWallet. + // Generates an Address within an MPCWallet. The Address values generated are identical across + // Networks of the same protocol family (e.g. EVM). So, for example, calling GenerateAddress twice + // for networks/ethereum-mainnet, and then calling it twice more for networks/ethereum-goerli, will + // result in two pairs of identical addresses on Ethereum Mainnet and Goerli. GenerateAddress(ctx context.Context, in *GenerateAddressRequest, opts ...grpc.CallOption) (*Address, error) // Retrieves an Address by resource name. GetAddress(ctx context.Context, in *GetAddressRequest, opts ...grpc.CallOption) (*Address, error) @@ -37,6 +40,8 @@ type MPCWalletServiceClient interface { ListAddresses(ctx context.Context, in *ListAddressesRequest, opts ...grpc.CallOption) (*ListAddressesResponse, error) // Returns a list of Balances. ListBalances(ctx context.Context, in *ListBalancesRequest, opts ...grpc.CallOption) (*ListBalancesResponse, error) + // Returns a list of BalanceDetails. + ListBalanceDetails(ctx context.Context, in *ListBalanceDetailsRequest, opts ...grpc.CallOption) (*ListBalanceDetailsResponse, error) } type mPCWalletServiceClient struct { @@ -110,6 +115,15 @@ func (c *mPCWalletServiceClient) ListBalances(ctx context.Context, in *ListBalan return out, nil } +func (c *mPCWalletServiceClient) ListBalanceDetails(ctx context.Context, in *ListBalanceDetailsRequest, opts ...grpc.CallOption) (*ListBalanceDetailsResponse, error) { + out := new(ListBalanceDetailsResponse) + err := c.cc.Invoke(ctx, "/coinbase.cloud.mpc_wallets.v1.MPCWalletService/ListBalanceDetails", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MPCWalletServiceServer is the server API for MPCWalletService service. // All implementations must embed UnimplementedMPCWalletServiceServer // for forward compatibility @@ -124,7 +138,10 @@ type MPCWalletServiceServer interface { GetMPCWallet(context.Context, *GetMPCWalletRequest) (*MPCWallet, error) // Returns a list of MPCWallets in a Pool. ListMPCWallets(context.Context, *ListMPCWalletsRequest) (*ListMPCWalletsResponse, error) - // Generates an Address within an MPCWallet. + // Generates an Address within an MPCWallet. The Address values generated are identical across + // Networks of the same protocol family (e.g. EVM). So, for example, calling GenerateAddress twice + // for networks/ethereum-mainnet, and then calling it twice more for networks/ethereum-goerli, will + // result in two pairs of identical addresses on Ethereum Mainnet and Goerli. GenerateAddress(context.Context, *GenerateAddressRequest) (*Address, error) // Retrieves an Address by resource name. GetAddress(context.Context, *GetAddressRequest) (*Address, error) @@ -132,6 +149,8 @@ type MPCWalletServiceServer interface { ListAddresses(context.Context, *ListAddressesRequest) (*ListAddressesResponse, error) // Returns a list of Balances. ListBalances(context.Context, *ListBalancesRequest) (*ListBalancesResponse, error) + // Returns a list of BalanceDetails. + ListBalanceDetails(context.Context, *ListBalanceDetailsRequest) (*ListBalanceDetailsResponse, error) mustEmbedUnimplementedMPCWalletServiceServer() } @@ -160,6 +179,9 @@ func (UnimplementedMPCWalletServiceServer) ListAddresses(context.Context, *ListA func (UnimplementedMPCWalletServiceServer) ListBalances(context.Context, *ListBalancesRequest) (*ListBalancesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListBalances not implemented") } +func (UnimplementedMPCWalletServiceServer) ListBalanceDetails(context.Context, *ListBalanceDetailsRequest) (*ListBalanceDetailsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListBalanceDetails not implemented") +} func (UnimplementedMPCWalletServiceServer) mustEmbedUnimplementedMPCWalletServiceServer() {} // UnsafeMPCWalletServiceServer may be embedded to opt out of forward compatibility for this service. @@ -299,6 +321,24 @@ func _MPCWalletService_ListBalances_Handler(srv interface{}, ctx context.Context return interceptor(ctx, in, info, handler) } +func _MPCWalletService_ListBalanceDetails_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListBalanceDetailsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MPCWalletServiceServer).ListBalanceDetails(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/coinbase.cloud.mpc_wallets.v1.MPCWalletService/ListBalanceDetails", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MPCWalletServiceServer).ListBalanceDetails(ctx, req.(*ListBalanceDetailsRequest)) + } + return interceptor(ctx, in, info, handler) +} + // MPCWalletService_ServiceDesc is the grpc.ServiceDesc for MPCWalletService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -334,6 +374,10 @@ var MPCWalletService_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListBalances", Handler: _MPCWalletService_ListBalances_Handler, }, + { + MethodName: "ListBalanceDetails", + Handler: _MPCWalletService_ListBalanceDetails_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "coinbase/cloud/mpc_wallets/v1/mpc_wallets.proto", diff --git a/gen/go/coinbase/cloud/protocols/ethereum/v1/outputs.pb.go b/gen/go/coinbase/cloud/protocols/ethereum/v1/outputs.pb.go new file mode 100644 index 0000000..39a67dd --- /dev/null +++ b/gen/go/coinbase/cloud/protocols/ethereum/v1/outputs.pb.go @@ -0,0 +1,180 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.26.0 +// protoc (unknown) +// source: coinbase/cloud/protocols/ethereum/v1/outputs.proto + +package v1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// A message representing a fee estimate on an Ethereum-like network. +type FeeEstimate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The estimated legacy gas price denominated in atomic units of the native asset + // as a "0x"-prefixed hex string. + GasPrice string `protobuf:"bytes,1,opt,name=gas_price,json=gasPrice,proto3" json:"gas_price,omitempty"` + // The estimated max fee per gas (EIP-1559) denominated in atomic units of the asset + // as a "0x"-prefixed hex string. + MaxFeePerGas string `protobuf:"bytes,2,opt,name=max_fee_per_gas,json=maxFeePerGas,proto3" json:"max_fee_per_gas,omitempty"` + // The estimated max priority fee per gas (EIP-1559) denominated in atomic units of + // the native asset as a "0x"-prefixed hex string. + MaxPriorityFeePerGas string `protobuf:"bytes,3,opt,name=max_priority_fee_per_gas,json=maxPriorityFeePerGas,proto3" json:"max_priority_fee_per_gas,omitempty"` +} + +func (x *FeeEstimate) Reset() { + *x = FeeEstimate{} + if protoimpl.UnsafeEnabled { + mi := &file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FeeEstimate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FeeEstimate) ProtoMessage() {} + +func (x *FeeEstimate) ProtoReflect() protoreflect.Message { + mi := &file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_msgTypes[0] + 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 FeeEstimate.ProtoReflect.Descriptor instead. +func (*FeeEstimate) Descriptor() ([]byte, []int) { + return file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_rawDescGZIP(), []int{0} +} + +func (x *FeeEstimate) GetGasPrice() string { + if x != nil { + return x.GasPrice + } + return "" +} + +func (x *FeeEstimate) GetMaxFeePerGas() string { + if x != nil { + return x.MaxFeePerGas + } + return "" +} + +func (x *FeeEstimate) GetMaxPriorityFeePerGas() string { + if x != nil { + return x.MaxPriorityFeePerGas + } + return "" +} + +var File_coinbase_cloud_protocols_ethereum_v1_outputs_proto protoreflect.FileDescriptor + +var file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_rawDesc = []byte{ + 0x0a, 0x32, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x2f, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x24, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x2e, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x22, 0x89, 0x01, 0x0a, 0x0b, 0x46, + 0x65, 0x65, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x61, + 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, + 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x66, + 0x65, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x46, 0x65, 0x65, 0x50, 0x65, 0x72, 0x47, 0x61, 0x73, 0x12, 0x36, + 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x66, + 0x65, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x14, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, + 0x50, 0x65, 0x72, 0x47, 0x61, 0x73, 0x42, 0x58, 0x5a, 0x56, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x77, 0x61, + 0x61, 0x73, 0x2d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x2d, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x6f, 0x69, 0x6e, + 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x73, 0x2f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2f, 0x76, 0x31, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_rawDescOnce sync.Once + file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_rawDescData = file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_rawDesc +) + +func file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_rawDescGZIP() []byte { + file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_rawDescOnce.Do(func() { + file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_rawDescData = protoimpl.X.CompressGZIP(file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_rawDescData) + }) + return file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_rawDescData +} + +var file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_goTypes = []interface{}{ + (*FeeEstimate)(nil), // 0: coinbase.cloud.protocols.ethereum.v1.FeeEstimate +} +var file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_init() } +func file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_init() { + if File_coinbase_cloud_protocols_ethereum_v1_outputs_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FeeEstimate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_goTypes, + DependencyIndexes: file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_depIdxs, + MessageInfos: file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_msgTypes, + }.Build() + File_coinbase_cloud_protocols_ethereum_v1_outputs_proto = out.File + file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_rawDesc = nil + file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_goTypes = nil + file_coinbase_cloud_protocols_ethereum_v1_outputs_proto_depIdxs = nil +} diff --git a/gen/go/coinbase/cloud/protocols/v1/mocks/ProtocolServiceClient.go b/gen/go/coinbase/cloud/protocols/v1/mocks/ProtocolServiceClient.go index f0cc708..395965c 100644 --- a/gen/go/coinbase/cloud/protocols/v1/mocks/ProtocolServiceClient.go +++ b/gen/go/coinbase/cloud/protocols/v1/mocks/ProtocolServiceClient.go @@ -109,6 +109,36 @@ func (_m *ProtocolServiceClient) ConstructTransferTransaction(ctx context.Contex return r0, r1 } +// EstimateFee provides a mock function with given fields: ctx, in, opts +func (_m *ProtocolServiceClient) EstimateFee(ctx context.Context, in *v1.EstimateFeeRequest, opts ...grpc.CallOption) (*v1.EstimateFeeResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *v1.EstimateFeeResponse + if rf, ok := ret.Get(0).(func(context.Context, *v1.EstimateFeeRequest, ...grpc.CallOption) *v1.EstimateFeeResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.EstimateFeeResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *v1.EstimateFeeRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + type NewProtocolServiceClientT interface { mock.TestingT Cleanup(func()) diff --git a/gen/go/coinbase/cloud/protocols/v1/mocks/ProtocolServiceServer.go b/gen/go/coinbase/cloud/protocols/v1/mocks/ProtocolServiceServer.go index de9607f..79f5b9a 100644 --- a/gen/go/coinbase/cloud/protocols/v1/mocks/ProtocolServiceServer.go +++ b/gen/go/coinbase/cloud/protocols/v1/mocks/ProtocolServiceServer.go @@ -84,6 +84,29 @@ func (_m *ProtocolServiceServer) ConstructTransferTransaction(_a0 context.Contex return r0, r1 } +// EstimateFee provides a mock function with given fields: _a0, _a1 +func (_m *ProtocolServiceServer) EstimateFee(_a0 context.Context, _a1 *v1.EstimateFeeRequest) (*v1.EstimateFeeResponse, error) { + ret := _m.Called(_a0, _a1) + + var r0 *v1.EstimateFeeResponse + if rf, ok := ret.Get(0).(func(context.Context, *v1.EstimateFeeRequest) *v1.EstimateFeeResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.EstimateFeeResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *v1.EstimateFeeRequest) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // mustEmbedUnimplementedProtocolServiceServer provides a mock function with given fields: func (_m *ProtocolServiceServer) mustEmbedUnimplementedProtocolServiceServer() { _m.Called() diff --git a/gen/go/coinbase/cloud/protocols/v1/protocols.pb.go b/gen/go/coinbase/cloud/protocols/v1/protocols.pb.go index 1ea4b59..04ab33d 100644 --- a/gen/go/coinbase/cloud/protocols/v1/protocols.pb.go +++ b/gen/go/coinbase/cloud/protocols/v1/protocols.pb.go @@ -7,6 +7,8 @@ package v1 import ( + v11 "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/blockchain/v1" + v12 "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/protocols/ethereum/v1" v1 "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/types/v1" _ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options" _ "google.golang.org/genproto/googleapis/api/annotations" @@ -106,6 +108,12 @@ type ConstructTransferTransactionRequest struct { Nonce int64 `protobuf:"varint,6,opt,name=nonce,proto3" json:"nonce,omitempty"` // The fee to be paid for the transfer. If not provided, the API will default to a network-based fee estimate. Fee *v1.TransactionFee `protobuf:"bytes,7,opt,name=fee,proto3" json:"fee,omitempty"` + // The Definition of the BlockchainService Asset for which the transfer transaction is being constructed. + // Supplying an Asset Definition is not strictly necessary for constructing transfer transactions for a native Asset + // or an ERC-20. + // For an ERC-721, an Asset Definition with a sub_group_id must be provided to specify the token being transferred. + // For an ERC-1155, an Asset Definition with a sub_group_id must be provided to specify the token being transferred. + AssetDefinition *v11.Asset_Definition `protobuf:"bytes,8,opt,name=asset_definition,json=assetDefinition,proto3" json:"asset_definition,omitempty"` } func (x *ConstructTransferTransactionRequest) Reset() { @@ -189,6 +197,13 @@ func (x *ConstructTransferTransactionRequest) GetFee() *v1.TransactionFee { return nil } +func (x *ConstructTransferTransactionRequest) GetAssetDefinition() *v11.Asset_Definition { + if x != nil { + return x.AssetDefinition + } + return nil +} + // The request message for BroadcastTransaction. For the broadcast to complete successfully, // one of the following must be true: // 1. The raw_signed_transaction on the Transaction is populated. This is equivalent to the payload @@ -256,6 +271,126 @@ func (x *BroadcastTransactionRequest) GetTransaction() *v1.Transaction { return nil } +// The request message for EstimateFee. +type EstimateFeeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The resource name of the Network. + // Format: networks/{network_id} + Network string `protobuf:"bytes,1,opt,name=network,proto3" json:"network,omitempty"` +} + +func (x *EstimateFeeRequest) Reset() { + *x = EstimateFeeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_coinbase_cloud_protocols_v1_protocols_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EstimateFeeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EstimateFeeRequest) ProtoMessage() {} + +func (x *EstimateFeeRequest) ProtoReflect() protoreflect.Message { + mi := &file_coinbase_cloud_protocols_v1_protocols_proto_msgTypes[3] + 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 EstimateFeeRequest.ProtoReflect.Descriptor instead. +func (*EstimateFeeRequest) Descriptor() ([]byte, []int) { + return file_coinbase_cloud_protocols_v1_protocols_proto_rawDescGZIP(), []int{3} +} + +func (x *EstimateFeeRequest) GetNetwork() string { + if x != nil { + return x.Network + } + return "" +} + +// The response message for EstimateFee. +type EstimateFeeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The estimated fee for the given Network. + // + // Types that are assignable to NetworkFeeEstimate: + // *EstimateFeeResponse_EthereumFeeEstimate + NetworkFeeEstimate isEstimateFeeResponse_NetworkFeeEstimate `protobuf_oneof:"network_fee_estimate"` +} + +func (x *EstimateFeeResponse) Reset() { + *x = EstimateFeeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_coinbase_cloud_protocols_v1_protocols_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EstimateFeeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EstimateFeeResponse) ProtoMessage() {} + +func (x *EstimateFeeResponse) ProtoReflect() protoreflect.Message { + mi := &file_coinbase_cloud_protocols_v1_protocols_proto_msgTypes[4] + 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 EstimateFeeResponse.ProtoReflect.Descriptor instead. +func (*EstimateFeeResponse) Descriptor() ([]byte, []int) { + return file_coinbase_cloud_protocols_v1_protocols_proto_rawDescGZIP(), []int{4} +} + +func (m *EstimateFeeResponse) GetNetworkFeeEstimate() isEstimateFeeResponse_NetworkFeeEstimate { + if m != nil { + return m.NetworkFeeEstimate + } + return nil +} + +func (x *EstimateFeeResponse) GetEthereumFeeEstimate() *v12.FeeEstimate { + if x, ok := x.GetNetworkFeeEstimate().(*EstimateFeeResponse_EthereumFeeEstimate); ok { + return x.EthereumFeeEstimate + } + return nil +} + +type isEstimateFeeResponse_NetworkFeeEstimate interface { + isEstimateFeeResponse_NetworkFeeEstimate() +} + +type EstimateFeeResponse_EthereumFeeEstimate struct { + // The estimated network fee for the given EVM Network. + EthereumFeeEstimate *v12.FeeEstimate `protobuf:"bytes,1,opt,name=ethereum_fee_estimate,json=ethereumFeeEstimate,proto3,oneof"` +} + +func (*EstimateFeeResponse_EthereumFeeEstimate) isEstimateFeeResponse_NetworkFeeEstimate() {} + var File_coinbase_cloud_protocols_v1_protocols_proto protoreflect.FileDescriptor var file_coinbase_cloud_protocols_v1_protocols_proto_rawDesc = []byte{ @@ -263,190 +398,241 @@ var file_coinbase_cloud_protocols_v1_protocols_proto_rawDesc = []byte{ 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1b, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x2e, 0x76, 0x31, 0x1a, 0x29, 0x63, 0x6f, 0x69, 0x6e, - 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, - 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb9, 0x01, 0x0a, 0x1b, 0x43, 0x6f, 0x6e, - 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x59, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3f, 0x92, 0x41, 0x11, 0xca, 0x3e, - 0x0e, 0xfa, 0x02, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0xe2, - 0x41, 0x01, 0x02, 0xfa, 0x41, 0x24, 0x0a, 0x22, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, - 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x12, 0x3f, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x05, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x22, 0xfe, 0x02, 0x0a, 0x23, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x59, 0x0a, 0x07, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3f, 0x92, - 0x41, 0x11, 0xca, 0x3e, 0x0e, 0xfa, 0x02, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, - 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x24, 0x0a, 0x22, 0x61, 0x70, 0x69, 0x2e, - 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, - 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x07, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x3f, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x22, 0x0a, - 0x20, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, - 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, - 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x06, - 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, - 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, - 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x06, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, - 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, 0x05, 0x6e, - 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x65, 0x65, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, - 0x52, 0x03, 0x66, 0x65, 0x65, 0x22, 0xc0, 0x01, 0x0a, 0x1b, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, - 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x59, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3f, 0x92, 0x41, 0x11, 0xca, 0x3e, 0x0e, 0xfa, 0x02, - 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, - 0xfa, 0x41, 0x24, 0x0a, 0x22, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, - 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x12, 0x46, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x2e, 0x76, 0x31, 0x1a, 0x2d, 0x63, 0x6f, 0x69, 0x6e, + 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x32, 0x63, 0x6f, 0x69, 0x6e, 0x62, + 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x73, 0x2f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2f, 0x76, 0x31, 0x2f, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x29, 0x63, + 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb9, 0x01, 0x0a, 0x1b, + 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x59, 0x0a, 0x07, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3f, 0x92, 0x41, + 0x11, 0xca, 0x3e, 0x0e, 0xfa, 0x02, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, + 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x24, 0x0a, 0x22, 0x61, 0x70, 0x69, 0x2e, 0x64, + 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x07, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x3f, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x32, 0xd5, 0x0d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xf9, 0x02, 0x0a, - 0x14, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, - 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x24, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x80, 0x02, 0x92, 0x41, 0xb4, 0x01, 0x12, 0x14, 0x43, 0x6f, - 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x1a, 0x9b, 0x01, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x73, 0x20, - 0x61, 0x6e, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x70, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, - 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x75, 0x73, - 0x74, 0x20, 0x62, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x65, 0x66, 0x6f, - 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x2e, - 0xda, 0x41, 0x0d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x3a, 0x01, 0x2a, 0x22, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x3d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x2f, 0x2a, 0x7d, 0x3a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x94, 0x04, 0x0a, 0x1c, 0x43, 0x6f, 0x6e, - 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x2e, 0x63, 0x6f, 0x69, 0x6e, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x22, 0xdf, 0x03, 0x0a, 0x23, 0x43, 0x6f, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x59, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x3f, 0x92, 0x41, 0x11, 0xca, 0x3e, 0x0e, 0xfa, 0x02, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x24, 0x0a, 0x22, 0x61, + 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, + 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x3f, 0x0a, 0x05, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe2, 0x41, 0x01, 0x02, 0xfa, + 0x41, 0x22, 0x0a, 0x20, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, + 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x06, 0x73, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, + 0x02, 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x09, 0x72, 0x65, 0x63, + 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, + 0x01, 0x02, 0x52, 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, + 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, + 0x41, 0x01, 0x02, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x05, 0x6e, + 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, + 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x65, 0x65, 0x42, 0x04, 0xe2, + 0x41, 0x01, 0x01, 0x52, 0x03, 0x66, 0x65, 0x65, 0x12, 0x5f, 0x0a, 0x10, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x01, 0x52, 0x0f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xc0, 0x01, 0x0a, 0x1b, 0x42, 0x72, + 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x59, 0x0a, 0x07, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3f, 0x92, 0x41, 0x11, 0xca, + 0x3e, 0x0e, 0xfa, 0x02, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, + 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x24, 0x0a, 0x22, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, + 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x07, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x46, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x69, 0x6e, + 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x6f, 0x0a, 0x12, + 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x59, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x3f, 0x92, 0x41, 0x11, 0xca, 0x3e, 0x0e, 0xfa, 0x02, 0x0b, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0xe2, 0x41, 0x01, 0x02, 0xfa, 0x41, 0x24, + 0x0a, 0x22, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, + 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x96, 0x01, + 0x0a, 0x13, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x15, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x2e, + 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x45, + 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x13, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x46, 0x65, 0x65, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x42, 0x16, + 0x0a, 0x14, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x65, 0x73, + 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x32, 0xb8, 0x10, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xf9, 0x02, 0x0a, 0x14, 0x43, + 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x80, 0x02, 0x92, 0x41, 0xb4, 0x01, 0x12, 0x14, 0x43, 0x6f, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x1a, 0x9b, 0x01, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x73, 0x20, 0x61, 0x6e, + 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, + 0x62, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x69, 0x73, 0x20, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x2e, 0xda, 0x41, + 0x0d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x32, 0x3a, 0x01, 0x2a, 0x22, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x3d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x2a, + 0x7d, 0x3a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x94, 0x04, 0x0a, 0x1c, 0x43, 0x6f, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, + 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63, 0x6f, 0x69, 0x6e, + 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x8b, 0x03, 0x92, 0x41, 0x9f, 0x02, 0x12, 0x1c, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63, 0x6f, - 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x8b, 0x03, 0x92, 0x41, 0x9f, 0x02, 0x12, 0x1c, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xfe, 0x01, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x41, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, - 0x61, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x20, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x2e, 0x0a, 0x0a, - 0x54, 0x68, 0x65, 0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x20, 0x69, 0x6e, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x62, 0x72, 0x6f, - 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x2e, 0xda, 0x41, 0x25, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x2c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2c, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x2c, 0x72, - 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x2c, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x3a, 0x01, 0x2a, 0x22, 0x35, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x3d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, - 0x2a, 0x7d, 0x3a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x8e, 0x05, 0x0a, 0x14, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, - 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x95, 0x04, 0x92, 0x41, 0xc3, 0x03, 0x12, - 0x14, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xaa, 0x03, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, - 0x74, 0x73, 0x20, 0x61, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65, - 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x77, 0x61, 0x79, 0x73, 0x20, 0x6f, 0x66, - 0x20, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, - 0x50, 0x49, 0x3a, 0x0a, 0x20, 0x31, 0x2e, 0x20, 0x53, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x72, 0x61, 0x77, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, - 0x69, 0x73, 0x20, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x75, 0x73, 0x65, - 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x20, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x76, 0x69, 0x61, 0x20, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x73, 0x20, - 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x73, 0x63, 0x61, - 0x6e, 0x2e, 0x0a, 0x20, 0x32, 0x2e, 0x20, 0x53, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2f, 0x2f, 0x20, 0x54, - 0x68, 0x65, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x20, 0x69, 0x74, 0x73, 0x65, 0x6c, 0x66, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, - 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x65, 0x64, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x69, - 0x74, 0x2e, 0xda, 0x41, 0x13, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2c, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x3a, 0x01, - 0x2a, 0x22, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x3d, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x62, 0x72, 0x6f, 0x61, - 0x64, 0x63, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x1a, 0x9d, 0x01, 0x92, 0x41, 0x6e, 0x12, 0x6c, 0x41, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x73, 0x65, - 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x41, - 0x50, 0x49, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2d, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0xca, 0x41, 0x29, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, - 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x77, 0x61, 0x61, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, - 0x42, 0xba, 0x01, 0x5a, 0x4d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x77, 0x61, 0x61, 0x73, 0x2d, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x2d, 0x67, 0x6f, 0x2f, - 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, - 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x2f, - 0x76, 0x31, 0x92, 0x41, 0x68, 0x12, 0x14, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x73, 0x20, 0x41, 0x50, 0x49, 0x32, 0x03, 0x31, 0x2e, 0x30, 0x1a, 0x29, 0x61, 0x70, 0x69, - 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, - 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x77, 0x61, 0x61, 0x73, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x2a, 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xfe, 0x01, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x73, 0x20, 0x61, 0x6e, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x20, 0x41, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x20, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x73, 0x73, 0x65, 0x74, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x2e, 0x0a, 0x0a, 0x54, 0x68, + 0x65, 0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, + 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x62, 0x72, 0x6f, 0x61, 0x64, + 0x63, 0x61, 0x73, 0x74, 0x2e, 0xda, 0x41, 0x25, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2c, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x2c, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x2c, 0x72, 0x65, 0x63, + 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x2c, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x3a, 0x3a, 0x01, 0x2a, 0x22, 0x35, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x3d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x2a, 0x7d, + 0x3a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x8e, 0x05, + 0x0a, 0x14, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, + 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x24, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x95, 0x04, 0x92, 0x41, 0xc3, 0x03, 0x12, 0x14, 0x42, + 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x1a, 0xaa, 0x03, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x73, + 0x20, 0x61, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x6f, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x77, 0x61, 0x79, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x6e, 0x76, 0x6f, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, + 0x3a, 0x0a, 0x20, 0x31, 0x2e, 0x20, 0x53, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x61, + 0x77, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, + 0x20, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x20, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x76, 0x69, 0x61, 0x20, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x73, 0x20, 0x73, 0x75, + 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x73, 0x63, 0x61, 0x6e, 0x2e, + 0x0a, 0x20, 0x32, 0x2e, 0x20, 0x53, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x20, 0x69, 0x74, 0x73, 0x65, 0x6c, 0x66, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x65, 0x64, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x68, 0x61, 0x73, 0x68, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x69, 0x74, 0x2e, + 0xda, 0x41, 0x13, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2c, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x3a, 0x01, 0x2a, 0x22, + 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x3d, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, + 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0xe0, + 0x02, 0x0a, 0x0b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x12, 0x2f, + 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x73, 0x74, + 0x69, 0x6d, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x30, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x73, + 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0xed, 0x01, 0x92, 0x41, 0xb0, 0x01, 0x12, 0x0b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, + 0x74, 0x65, 0x46, 0x65, 0x65, 0x1a, 0xa0, 0x01, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x66, 0x65, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x45, 0x56, 0x4d, 0x20, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x72, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, + 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x65, + 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x61, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, + 0x61, 0x78, 0x5f, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x5f, + 0x70, 0x65, 0x72, 0x5f, 0x67, 0x61, 0x73, 0x2e, 0xda, 0x41, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x76, 0x31, + 0x2f, 0x7b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x3d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x46, 0x65, + 0x65, 0x1a, 0x9d, 0x01, 0x92, 0x41, 0x6e, 0x12, 0x6c, 0x41, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x73, + 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x20, + 0x41, 0x50, 0x49, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, + 0x61, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2d, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0xca, 0x41, 0x29, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, + 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x77, 0x61, 0x61, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x73, 0x42, 0xba, 0x01, 0x5a, 0x4d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x77, 0x61, 0x61, 0x73, 0x2d, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x2d, 0x67, 0x6f, + 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, + 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, + 0x2f, 0x76, 0x31, 0x92, 0x41, 0x68, 0x12, 0x14, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x73, 0x20, 0x41, 0x50, 0x49, 0x32, 0x03, 0x31, 0x2e, 0x30, 0x1a, 0x29, 0x61, 0x70, + 0x69, 0x2e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x69, 0x6e, + 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x77, 0x61, 0x61, 0x73, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x2a, 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -461,30 +647,38 @@ func file_coinbase_cloud_protocols_v1_protocols_proto_rawDescGZIP() []byte { return file_coinbase_cloud_protocols_v1_protocols_proto_rawDescData } -var file_coinbase_cloud_protocols_v1_protocols_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_coinbase_cloud_protocols_v1_protocols_proto_msgTypes = make([]protoimpl.MessageInfo, 5) var file_coinbase_cloud_protocols_v1_protocols_proto_goTypes = []interface{}{ (*ConstructTransactionRequest)(nil), // 0: coinbase.cloud.protocols.v1.ConstructTransactionRequest (*ConstructTransferTransactionRequest)(nil), // 1: coinbase.cloud.protocols.v1.ConstructTransferTransactionRequest (*BroadcastTransactionRequest)(nil), // 2: coinbase.cloud.protocols.v1.BroadcastTransactionRequest - (*v1.TransactionInput)(nil), // 3: coinbase.cloud.types.v1.TransactionInput - (*v1.TransactionFee)(nil), // 4: coinbase.cloud.types.v1.TransactionFee - (*v1.Transaction)(nil), // 5: coinbase.cloud.types.v1.Transaction + (*EstimateFeeRequest)(nil), // 3: coinbase.cloud.protocols.v1.EstimateFeeRequest + (*EstimateFeeResponse)(nil), // 4: coinbase.cloud.protocols.v1.EstimateFeeResponse + (*v1.TransactionInput)(nil), // 5: coinbase.cloud.types.v1.TransactionInput + (*v1.TransactionFee)(nil), // 6: coinbase.cloud.types.v1.TransactionFee + (*v11.Asset_Definition)(nil), // 7: coinbase.cloud.blockchain.v1.Asset.Definition + (*v1.Transaction)(nil), // 8: coinbase.cloud.types.v1.Transaction + (*v12.FeeEstimate)(nil), // 9: coinbase.cloud.protocols.ethereum.v1.FeeEstimate } var file_coinbase_cloud_protocols_v1_protocols_proto_depIdxs = []int32{ - 3, // 0: coinbase.cloud.protocols.v1.ConstructTransactionRequest.input:type_name -> coinbase.cloud.types.v1.TransactionInput - 4, // 1: coinbase.cloud.protocols.v1.ConstructTransferTransactionRequest.fee:type_name -> coinbase.cloud.types.v1.TransactionFee - 5, // 2: coinbase.cloud.protocols.v1.BroadcastTransactionRequest.transaction:type_name -> coinbase.cloud.types.v1.Transaction - 0, // 3: coinbase.cloud.protocols.v1.ProtocolService.ConstructTransaction:input_type -> coinbase.cloud.protocols.v1.ConstructTransactionRequest - 1, // 4: coinbase.cloud.protocols.v1.ProtocolService.ConstructTransferTransaction:input_type -> coinbase.cloud.protocols.v1.ConstructTransferTransactionRequest - 2, // 5: coinbase.cloud.protocols.v1.ProtocolService.BroadcastTransaction:input_type -> coinbase.cloud.protocols.v1.BroadcastTransactionRequest - 5, // 6: coinbase.cloud.protocols.v1.ProtocolService.ConstructTransaction:output_type -> coinbase.cloud.types.v1.Transaction - 5, // 7: coinbase.cloud.protocols.v1.ProtocolService.ConstructTransferTransaction:output_type -> coinbase.cloud.types.v1.Transaction - 5, // 8: coinbase.cloud.protocols.v1.ProtocolService.BroadcastTransaction:output_type -> coinbase.cloud.types.v1.Transaction - 6, // [6:9] is the sub-list for method output_type - 3, // [3:6] is the sub-list for method input_type - 3, // [3:3] is the sub-list for extension type_name - 3, // [3:3] is the sub-list for extension extendee - 0, // [0:3] is the sub-list for field type_name + 5, // 0: coinbase.cloud.protocols.v1.ConstructTransactionRequest.input:type_name -> coinbase.cloud.types.v1.TransactionInput + 6, // 1: coinbase.cloud.protocols.v1.ConstructTransferTransactionRequest.fee:type_name -> coinbase.cloud.types.v1.TransactionFee + 7, // 2: coinbase.cloud.protocols.v1.ConstructTransferTransactionRequest.asset_definition:type_name -> coinbase.cloud.blockchain.v1.Asset.Definition + 8, // 3: coinbase.cloud.protocols.v1.BroadcastTransactionRequest.transaction:type_name -> coinbase.cloud.types.v1.Transaction + 9, // 4: coinbase.cloud.protocols.v1.EstimateFeeResponse.ethereum_fee_estimate:type_name -> coinbase.cloud.protocols.ethereum.v1.FeeEstimate + 0, // 5: coinbase.cloud.protocols.v1.ProtocolService.ConstructTransaction:input_type -> coinbase.cloud.protocols.v1.ConstructTransactionRequest + 1, // 6: coinbase.cloud.protocols.v1.ProtocolService.ConstructTransferTransaction:input_type -> coinbase.cloud.protocols.v1.ConstructTransferTransactionRequest + 2, // 7: coinbase.cloud.protocols.v1.ProtocolService.BroadcastTransaction:input_type -> coinbase.cloud.protocols.v1.BroadcastTransactionRequest + 3, // 8: coinbase.cloud.protocols.v1.ProtocolService.EstimateFee:input_type -> coinbase.cloud.protocols.v1.EstimateFeeRequest + 8, // 9: coinbase.cloud.protocols.v1.ProtocolService.ConstructTransaction:output_type -> coinbase.cloud.types.v1.Transaction + 8, // 10: coinbase.cloud.protocols.v1.ProtocolService.ConstructTransferTransaction:output_type -> coinbase.cloud.types.v1.Transaction + 8, // 11: coinbase.cloud.protocols.v1.ProtocolService.BroadcastTransaction:output_type -> coinbase.cloud.types.v1.Transaction + 4, // 12: coinbase.cloud.protocols.v1.ProtocolService.EstimateFee:output_type -> coinbase.cloud.protocols.v1.EstimateFeeResponse + 9, // [9:13] is the sub-list for method output_type + 5, // [5:9] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name } func init() { file_coinbase_cloud_protocols_v1_protocols_proto_init() } @@ -529,6 +723,33 @@ func file_coinbase_cloud_protocols_v1_protocols_proto_init() { return nil } } + file_coinbase_cloud_protocols_v1_protocols_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EstimateFeeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_coinbase_cloud_protocols_v1_protocols_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EstimateFeeResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_coinbase_cloud_protocols_v1_protocols_proto_msgTypes[4].OneofWrappers = []interface{}{ + (*EstimateFeeResponse_EthereumFeeEstimate)(nil), } type x struct{} out := protoimpl.TypeBuilder{ @@ -536,7 +757,7 @@ func file_coinbase_cloud_protocols_v1_protocols_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_coinbase_cloud_protocols_v1_protocols_proto_rawDesc, NumEnums: 0, - NumMessages: 3, + NumMessages: 5, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/go/coinbase/cloud/protocols/v1/protocols.pb.gw.go b/gen/go/coinbase/cloud/protocols/v1/protocols.pb.gw.go index 3042dd3..2b0e9b4 100644 --- a/gen/go/coinbase/cloud/protocols/v1/protocols.pb.gw.go +++ b/gen/go/coinbase/cloud/protocols/v1/protocols.pb.gw.go @@ -235,6 +235,74 @@ func local_request_ProtocolService_BroadcastTransaction_0(ctx context.Context, m } +func request_ProtocolService_EstimateFee_0(ctx context.Context, marshaler runtime.Marshaler, client ProtocolServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq EstimateFeeRequest + 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 { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["network"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "network") + } + + protoReq.Network, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "network", err) + } + + msg, err := client.EstimateFee(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ProtocolService_EstimateFee_0(ctx context.Context, marshaler runtime.Marshaler, server ProtocolServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq EstimateFeeRequest + 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 { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["network"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "network") + } + + protoReq.Network, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "network", err) + } + + msg, err := server.EstimateFee(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterProtocolServiceHandlerServer registers the http handlers for service ProtocolService to "mux". // UnaryRPC :call ProtocolServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -316,6 +384,31 @@ func RegisterProtocolServiceHandlerServer(ctx context.Context, mux *runtime.Serv }) + mux.Handle("POST", pattern_ProtocolService_EstimateFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/coinbase.cloud.protocols.v1.ProtocolService/EstimateFee", runtime.WithHTTPPathPattern("/v1/{network=networks/*}:estimateFee")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ProtocolService_EstimateFee_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ProtocolService_EstimateFee_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -423,6 +516,28 @@ func RegisterProtocolServiceHandlerClient(ctx context.Context, mux *runtime.Serv }) + mux.Handle("POST", pattern_ProtocolService_EstimateFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/coinbase.cloud.protocols.v1.ProtocolService/EstimateFee", runtime.WithHTTPPathPattern("/v1/{network=networks/*}:estimateFee")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ProtocolService_EstimateFee_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ProtocolService_EstimateFee_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -432,6 +547,8 @@ var ( pattern_ProtocolService_ConstructTransferTransaction_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "networks", "network"}, "constructTransferTransaction")) pattern_ProtocolService_BroadcastTransaction_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "networks", "network"}, "broadcastTransaction")) + + pattern_ProtocolService_EstimateFee_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 2, 5, 2}, []string{"v1", "networks", "network"}, "estimateFee")) ) var ( @@ -440,4 +557,6 @@ var ( forward_ProtocolService_ConstructTransferTransaction_0 = runtime.ForwardResponseMessage forward_ProtocolService_BroadcastTransaction_0 = runtime.ForwardResponseMessage + + forward_ProtocolService_EstimateFee_0 = runtime.ForwardResponseMessage ) diff --git a/gen/go/coinbase/cloud/protocols/v1/protocols_grpc.pb.go b/gen/go/coinbase/cloud/protocols/v1/protocols_grpc.pb.go index 594a744..0a0f7fb 100644 --- a/gen/go/coinbase/cloud/protocols/v1/protocols_grpc.pb.go +++ b/gen/go/coinbase/cloud/protocols/v1/protocols_grpc.pb.go @@ -32,6 +32,9 @@ type ProtocolServiceClient interface { // 2. Set the signature(s) in the required_signatures of the Transaction. // The TransactionInput itself is not required. The Transaction returned will have the hash set on it. BroadcastTransaction(ctx context.Context, in *BroadcastTransactionRequest, opts ...grpc.CallOption) (*v1.Transaction, error) + // Estimates the current network fee for the specified Network. For EVM Networks, this + // corresponds to the gas_price, max_fee_per_gas, and max_priority_fee_per_gas. + EstimateFee(ctx context.Context, in *EstimateFeeRequest, opts ...grpc.CallOption) (*EstimateFeeResponse, error) } type protocolServiceClient struct { @@ -69,6 +72,15 @@ func (c *protocolServiceClient) BroadcastTransaction(ctx context.Context, in *Br return out, nil } +func (c *protocolServiceClient) EstimateFee(ctx context.Context, in *EstimateFeeRequest, opts ...grpc.CallOption) (*EstimateFeeResponse, error) { + out := new(EstimateFeeResponse) + err := c.cc.Invoke(ctx, "/coinbase.cloud.protocols.v1.ProtocolService/EstimateFee", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ProtocolServiceServer is the server API for ProtocolService service. // All implementations must embed UnimplementedProtocolServiceServer // for forward compatibility @@ -86,6 +98,9 @@ type ProtocolServiceServer interface { // 2. Set the signature(s) in the required_signatures of the Transaction. // The TransactionInput itself is not required. The Transaction returned will have the hash set on it. BroadcastTransaction(context.Context, *BroadcastTransactionRequest) (*v1.Transaction, error) + // Estimates the current network fee for the specified Network. For EVM Networks, this + // corresponds to the gas_price, max_fee_per_gas, and max_priority_fee_per_gas. + EstimateFee(context.Context, *EstimateFeeRequest) (*EstimateFeeResponse, error) mustEmbedUnimplementedProtocolServiceServer() } @@ -102,6 +117,9 @@ func (UnimplementedProtocolServiceServer) ConstructTransferTransaction(context.C func (UnimplementedProtocolServiceServer) BroadcastTransaction(context.Context, *BroadcastTransactionRequest) (*v1.Transaction, error) { return nil, status.Errorf(codes.Unimplemented, "method BroadcastTransaction not implemented") } +func (UnimplementedProtocolServiceServer) EstimateFee(context.Context, *EstimateFeeRequest) (*EstimateFeeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EstimateFee not implemented") +} func (UnimplementedProtocolServiceServer) mustEmbedUnimplementedProtocolServiceServer() {} // UnsafeProtocolServiceServer may be embedded to opt out of forward compatibility for this service. @@ -169,6 +187,24 @@ func _ProtocolService_BroadcastTransaction_Handler(srv interface{}, ctx context. return interceptor(ctx, in, info, handler) } +func _ProtocolService_EstimateFee_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(EstimateFeeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProtocolServiceServer).EstimateFee(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/coinbase.cloud.protocols.v1.ProtocolService/EstimateFee", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProtocolServiceServer).EstimateFee(ctx, req.(*EstimateFeeRequest)) + } + return interceptor(ctx, in, info, handler) +} + // ProtocolService_ServiceDesc is the grpc.ServiceDesc for ProtocolService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -188,6 +224,10 @@ var ProtocolService_ServiceDesc = grpc.ServiceDesc{ MethodName: "BroadcastTransaction", Handler: _ProtocolService_BroadcastTransaction_Handler, }, + { + MethodName: "EstimateFee", + Handler: _ProtocolService_EstimateFee_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "coinbase/cloud/protocols/v1/protocols.proto", diff --git a/gen/openapiv2/coinbase/cloud/blockchain/v1/blockchain.swagger.json b/gen/openapiv2/coinbase/cloud/blockchain/v1/blockchain.swagger.json index ca74760..e06d556 100644 --- a/gen/openapiv2/coinbase/cloud/blockchain/v1/blockchain.swagger.json +++ b/gen/openapiv2/coinbase/cloud/blockchain/v1/blockchain.swagger.json @@ -185,6 +185,51 @@ "BlockchainService" ] } + }, + "/v1/{networkName}/assets:batchGet": { + "get": { + "summary": "BatchGetAssets", + "description": "Returns the list of Assets indicated by the given request.", + "operationId": "BlockchainService_BatchGetAssets", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1BatchGetAssetsResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "networkName", + "description": "The resource name of the parent Network.\nFormat: networks/{network_id}", + "in": "path", + "required": true, + "type": "string", + "pattern": "networks/[^/]+" + }, + { + "name": "names", + "description": "The resource names of the Assets to retrieve.\nEach name has format: networks/{network_id}/assets/{asset_id}\nA maximum of 1000 Assets can be retrieved in a batch.", + "in": "query", + "required": true, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi" + } + ], + "tags": [ + "BlockchainService" + ] + } } }, "definitions": { @@ -267,9 +312,30 @@ "title": "definition" } }, - "description": "The Asset resource, which represents an on-chain asset.\nFor fungible assets, one resource exists per Asset.\nIn the case of non-fungible tokens, a unique Asset entry exists for every token.", + "description": "The Asset resource, which represents an on-chain asset.", "title": "Asset" }, + "v1BatchGetAssetsResponse": { + "type": "object", + "properties": { + "assets": { + "type": "array", + "items": { + "$ref": "#/definitions/v1Asset" + }, + "description": "The list of Assets.\nNote: The returned Assets may not be in the same order as in the request." + }, + "notFound": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The resource names of the Assets that were not found.\nEach name has format: networks/{network_id}/assets/{asset_id}." + } + }, + "description": "The response message for BatchGetAssets.", + "title": "BatchGetAssetsResponse" + }, "v1ListAssetsResponse": { "type": "object", "properties": { diff --git a/gen/openapiv2/coinbase/cloud/mpc_keys/v1/mpc_keys.swagger.json b/gen/openapiv2/coinbase/cloud/mpc_keys/v1/mpc_keys.swagger.json index 012bafb..46fc895 100644 --- a/gen/openapiv2/coinbase/cloud/mpc_keys/v1/mpc_keys.swagger.json +++ b/gen/openapiv2/coinbase/cloud/mpc_keys/v1/mpc_keys.swagger.json @@ -56,6 +56,42 @@ ] } }, + "/v1/device:revoke": { + "post": { + "summary": "RevokeDevice", + "description": "Revokes a registered Device.\n This operation removes the registered Device from all the DeviceGroups that it is a part of.\n Once the Device is revoked, cryptographic materials in your physical Device are invalidated, and the Device can no longer participate in any MPCOperations of the DeviceGroups it was a part of. Use this API in scenarios such as losing the existing Device, switching to a new physical Device, etc.\n Ensure that a new Device is successfully added to your DeviceGroups using the AddDevice RPC before invoking the RevokeDevice RPC.", + "operationId": "MPCKeyService_RevokeDevice", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "type": "object", + "properties": {} + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "description": "The request message for RevokeDevice.", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1RevokeDeviceRequest" + } + } + ], + "tags": [ + "MPCKeyService" + ] + } + }, "/v1/{deviceGroupName}": { "get": { "summary": "GetDeviceGroup", @@ -177,6 +213,174 @@ ] } }, + "/v1/{deviceGroupName}:addDevice": { + "post": { + "summary": "AddDevice", + "description": "Adds a Device to an existing DeviceGroup. \n\nPrior to this API being called, the Device must be registered using RegisterDevice RPC. \n\n The Device must have access to the backup created with PrepareDeviceBackup RPC to compute this operation. \n\n After calling this RPC, use ListMPCOperations to poll for the pending AddDevice operation, and use the WaaS SDK's ComputeAddDeviceMPCOperation to complete the operation. After the operation is computed on WaaS SDK, the Device will have access to cryptographic materials required to process MPCOperations for this DeviceGroup. \n\nOnce the operation completes on MPCKeyService, the Device will be added to the given DeviceGroup as a new member and all existing Devices in the DeviceGroup will stay functional. \n\nMPCKeyService will expose RemoveDevice RPC in a future release that can remove any of the existing Devices from the DeviceGroup.", + "operationId": "MPCKeyService_AddDevice", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/googlelongrunningOperation" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "deviceGroupName", + "description": "The resource name of the DeviceGroup to which the Device is being added.\nFormat: pools/{pool_id}/deviceGroups/{device_group_id}", + "in": "path", + "required": true, + "type": "string", + "pattern": "pools/[^/]+/deviceGroups/[^/]+" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "device": { + "type": "string", + "title": "The resource name of the Device that is being added to the DeviceGroup.\nThe Device must not be part of the DeviceGroup specified above.\nFormat: devices/{device_id}" + }, + "requestId": { + "type": "string", + "description": "A user-provided request ID to allow for idempotency. This should be a UUID." + } + }, + "description": "The request message for AddDevice.", + "required": [ + "device" + ] + } + } + ], + "tags": [ + "MPCKeyService" + ] + } + }, + "/v1/{deviceGroupName}:prepareDeviceArchive": { + "post": { + "summary": "PrepareDeviceArchive", + "description": "Prepares an archive in the local storage of the given Device.\n\n The archive contains cryptographic materials that can be used to export MPCKeys, which have the given DeviceGroup as their parent.\n\n The Device specified in the request must be a member of this DeviceGroup and must participate in the associated MPC operation for the archive to be prepared. After calling this, use ListMPCOperations to poll for the pending PrepareDeviceArchive operation, and use the WaaS SDK's ComputeMPCOperation to complete the operation.\n\n Once the operation completes, the Device can utilize the WaaS SDK to export the private keys corresponding to each of the MPCKeys under this DeviceGroup.", + "operationId": "MPCKeyService_PrepareDeviceArchive", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/googlelongrunningOperation" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "deviceGroupName", + "description": "The resource name of the DeviceGroup. The prepared archive will include cryptographic materials to export the\nprivate keys corresponding to each of the MPCKey under this DeviceGroup.\nFormat: pools/{pool_id}/deviceGroups/{device_group_id}", + "in": "path", + "required": true, + "type": "string", + "pattern": "pools/[^/]+/deviceGroups/[^/]+" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "device": { + "type": "string", + "title": "The resource name of the Device that prepares the archive in its local storage.\nThe Device must be part of the DeviceGroup specified above.\nFormat: devices/{device_id}" + }, + "requestId": { + "type": "string", + "description": "A user-provided request ID to allow for idempotency. This should be a UUID." + } + }, + "description": "The request message for PrepareDeviceArchive.", + "required": [ + "device" + ] + } + } + ], + "tags": [ + "MPCKeyService" + ] + } + }, + "/v1/{deviceGroupName}:prepareDeviceBackup": { + "post": { + "summary": "PrepareDeviceBackup", + "description": "Prepares a backup in the given Device.\n\n The backup contains certain cryptographic materials that can be used to restore MPCKeys, which have the given DeviceGroup as their parent, on a new Device.\n\n The Device specified in the request must be a member of this DeviceGroup and must participate in the associated MPC operation for the backup to be prepared. \n\n After calling this RPC, use ListMPCOperations to poll for the pending PrepareDeviceBackup operation, and use the WaaS SDK's ComputeMPCOperation to complete the operation. \n\n Once the operation completes, the Device can utilize WaaS SDK to download the backup bundle. \n\n We recommend storing this backup bundle securely in a storage provider of your choice. \n\n If the user loses access to their existing Device and wants to recover MPCKeys in the given DeviceGroup on a new Device, use AddDevice RPC on the MPCKeyService.", + "operationId": "MPCKeyService_PrepareDeviceBackup", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/googlelongrunningOperation" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "deviceGroupName", + "description": "The resource name of the DeviceGroup. The prepared backup will include cryptographic materials to recover the\nMPCKeys under this DeviceGroup on a new Device.\nFormat: pools/{pool_id}/deviceGroups/{device_group_id}", + "in": "path", + "required": true, + "type": "string", + "pattern": "pools/[^/]+/deviceGroups/[^/]+" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "device": { + "type": "string", + "title": "The resource name of the Device that prepares the backup.\nThe Device must be part of the DeviceGroup specified above.\nFormat: devices/{device_id}" + }, + "requestId": { + "type": "string", + "description": "A user-provided request ID to allow for idempotency. This should be a UUID." + } + }, + "description": "The request message for PrepareDeviceBackup.", + "required": [ + "device" + ] + } + } + ], + "tags": [ + "MPCKeyService" + ] + } + }, "/v1/{deviceName}": { "get": { "summary": "GetDevice", @@ -247,7 +451,7 @@ }, "/v1/{mpcKeyName}/signatures": { "post": { - "summary": "Create Signature", + "summary": "CreateSignature", "description": "Creates a Signature using an MPCKey.\n\n After calling this, use ListMPCOperations to poll for the pending CreateSignature operation, and use the WaaS SDK's computeMPCOperation to complete the operation.", "operationId": "MPCKeyService_CreateSignature", "responses": { @@ -458,6 +662,31 @@ }, "description": "The `Status` type defines a logical error model that is suitable for\ndifferent programming environments, including REST APIs and RPC APIs. It is\nused by [gRPC](https://github.com/grpc). Each `Status` message contains\nthree pieces of data: error code, error message, and error details.\n\nYou can find out more about this error model and how to work with it in the\n[API Design Guide](https://cloud.google.com/apis/design/errors)." }, + "v1AddDeviceMetadata": { + "type": "object", + "properties": { + "deviceGroup": { + "type": "string", + "example": "pools/95257c5a-522f-4241-bf97-2656a8e9cc91/deviceGroups/3a168a54-6661-4e5a-8bc5-9759671aa777", + "description": "The resource name of the DeviceGroup to poll using ListMPCOperations.\n Format: pools/{pool_id}/deviceGroups/{device_group_id}", + "title": "device_group", + "readOnly": true + }, + "participatingDevices": { + "type": "array", + "example": [ + "devices/1591089c-229d-4578-ab94-a3fa3442d77b" + ], + "items": { + "type": "string" + }, + "description": "The list of Device resource names that can compute the MPCOperation by invoking ComputeAddDeviceMPCOperation on the WaaS SDK.\nFormat: devices/{device}", + "title": "devices", + "readOnly": true + } + }, + "description": "Metadata associated with the AddDevice long-running operation." + }, "v1CreateDeviceGroupMetadata": { "type": "object", "properties": { @@ -684,11 +913,52 @@ "$ref": "#/definitions/v1CreateSignatureMetadata", "description": "Metadata associated with the CreateSignature long-running operation.", "title": "createSignatureMetadata" + }, + "prepareDeviceArchiveMetadata": { + "$ref": "#/definitions/v1PrepareDeviceArchiveMetadata", + "description": "Metadata associated with the PrepareDeviceArchive long-running operation.", + "title": "prepareDeviceArchiveMetadata" + }, + "prepareDeviceBackupMetadata": { + "$ref": "#/definitions/v1PrepareDeviceBackupMetadata", + "description": "Metadata associated with the PrepareDeviceBackup long-running operation.", + "title": "prepareDeviceBackupMetadata" + }, + "addDeviceMetadata": { + "$ref": "#/definitions/v1AddDeviceMetadata", + "description": "Metadata associated with the AddDevice long-running operation.", + "title": "addDeviceMetadata" } }, "description": "The MPCOperation resource, which represents a pending MPC operation of a DeviceGroup waiting for computation. Poll the ListMPCOperations method for these pending MPCOperations, and use the WaaS SDK's ComputeMPCOperation to complete the operation. The MPCOperation resource ID is guaranteed to be the same as that of the underlying long-running operation.", "title": "MPCOperation" }, + "v1PrepareDeviceArchiveMetadata": { + "type": "object", + "properties": { + "deviceGroup": { + "type": "string", + "example": "pools/95257c5a-522f-4241-bf97-2656a8e9cc91/deviceGroups/3a168a54-6661-4e5a-8bc5-9759671aa777", + "description": "The resource name of the DeviceGroup to poll using ListMPCOperations.\n Format: pools/{pool_id}/deviceGroups/{device_group_id}", + "title": "device_group", + "readOnly": true + } + }, + "description": "Metadata associated with the PrepareDeviceArchive long-running operation." + }, + "v1PrepareDeviceBackupMetadata": { + "type": "object", + "properties": { + "deviceGroup": { + "type": "string", + "example": "pools/95257c5a-522f-4241-bf97-2656a8e9cc91/deviceGroups/3a168a54-6661-4e5a-8bc5-9759671aa777", + "description": "The resource name of the DeviceGroup to poll using ListMPCOperations.\n Format: pools/{pool_id}/deviceGroups/{device_group_id}", + "title": "device_group", + "readOnly": true + } + }, + "description": "Metadata associated with the PrepareDeviceBackup long-running operation." + }, "v1PublicKey": { "type": "object", "properties": { @@ -717,6 +987,19 @@ "registrationData" ] }, + "v1RevokeDeviceRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "The resource name of the Device that is being revoked.\nFormat: devices/{device_id}" + } + }, + "description": "The request message for RevokeDevice.", + "required": [ + "name" + ] + }, "v1Seed": { "type": "object", "properties": { @@ -727,6 +1010,13 @@ }, "description": "The hardened children derived from the Seed. To create an MPCKey, at least one hardened child must be derived.", "title": "hardenedChildren" + }, + "mpcKeyExportMetadata": { + "type": "string", + "format": "byte", + "description": "The metadata to be used to export MPCKeys derived from this Seed.\n\n This metadata has to be passed to WaaS SDK's ExportPrivateKeys to export private keys corresponding to MPCKeys that are derived from this Seed's HardenedChildren.", + "title": "mpcKeyExportMetadata", + "readOnly": true } }, "description": "A byte sequence at the root of a hierarchically deterministic (HD) wallet as defined in BIP-32. A DeviceGroup has exactly one Seed.", diff --git a/gen/openapiv2/coinbase/cloud/mpc_transactions/v1/mpc_transactions.swagger.json b/gen/openapiv2/coinbase/cloud/mpc_transactions/v1/mpc_transactions.swagger.json index 3f6be80..31aeb20 100644 --- a/gen/openapiv2/coinbase/cloud/mpc_transactions/v1/mpc_transactions.swagger.json +++ b/gen/openapiv2/coinbase/cloud/mpc_transactions/v1/mpc_transactions.swagger.json @@ -1,7 +1,7 @@ { "swagger": "2.0", "info": { - "title": "MPC Transactions API", + "title": "MPCTransactions API", "version": "1.0" }, "tags": [ diff --git a/gen/openapiv2/coinbase/cloud/mpc_wallets/v1/mpc_wallets.swagger.json b/gen/openapiv2/coinbase/cloud/mpc_wallets/v1/mpc_wallets.swagger.json index 588fe80..66306a6 100644 --- a/gen/openapiv2/coinbase/cloud/mpc_wallets/v1/mpc_wallets.swagger.json +++ b/gen/openapiv2/coinbase/cloud/mpc_wallets/v1/mpc_wallets.swagger.json @@ -1,7 +1,7 @@ { "swagger": "2.0", "info": { - "title": "MPC Wallets API", + "title": "MPCWallets API", "version": "1.0" }, "tags": [ @@ -51,7 +51,7 @@ }, { "name": "pageSize", - "description": "The maximum number of Balances to return. If unspecified, at most 50 Balances\nwill be returned.", + "description": "The maximum number of Balances to return. If unspecified, at most 25 Balances\nwill be returned.", "in": "query", "required": false, "type": "integer", @@ -70,6 +70,55 @@ ] } }, + "/v1/{balanceName}/balanceDetails": { + "get": { + "summary": "ListBalanceDetails", + "description": "Returns a list of BalanceDetails.", + "operationId": "MPCWalletService_ListBalanceDetails", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ListBalanceDetailsResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "balanceName", + "description": "The resource name of the parent Balance.\nFormat: networks/{network_id}/addresses/{address_id}/balances/{balance_id}", + "in": "path", + "required": true, + "type": "string", + "pattern": "networks/[^/]+/addresses/[^/]+/balances/[^/]+" + }, + { + "name": "pageSize", + "description": "The maximum number of BalanceDetails to return. If unspecified, at most 25 BalanceDetails\nwill be returned.", + "in": "query", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "pageToken", + "description": "A page token, received from a previous ListBalanceDetails call.\nProvide this to retrieve the subsequent page.", + "in": "query", + "required": false, + "type": "string" + } + ], + "tags": [ + "MPCWalletService" + ] + } + }, "/v1/{mpcWalletName}": { "get": { "summary": "GetMPCWallet", @@ -107,7 +156,7 @@ "/v1/{mpcWalletName}:generateAddress": { "post": { "summary": "GenerateAddress", - "description": "Generates an Address within an MPCWallet.", + "description": "Generates an Address within an MPCWallet. The Address values generated are identical across Networks of the same protocol family (e.g. EVM). So, for example, calling GenerateAddress twice for networks/ethereum-mainnet, and then calling it twice more for networks/ethereum-goerli, will result in two pairs of identical addresses on Ethereum Mainnet and Goerli.", "operationId": "MPCWalletService_GenerateAddress", "responses": { "200": { @@ -359,6 +408,30 @@ } }, "definitions": { + "AssetDefinition": { + "type": "object", + "properties": { + "assetType": { + "type": "string", + "example": "native", + "description": "The type of Asset the definition describes.\nPossible values: 'native', 'erc20', 'erc721', 'erc1155'", + "title": "assetType" + }, + "assetGroupId": { + "type": "string", + "example": "0x887CFe31C888EE0780795b7feFF46CE7f9AB556C", + "description": "The identifier that distinguishes this Asset group.\nGenerally a 0x-prefixed contract address for the Asset. For a native Asset this is not set.", + "title": "assetGroupId" + }, + "subGroupId": { + "type": "string", + "description": "The identifier that distinguishes the specific Asset within the asset group.\nGenerally a token ID. For a native Asset or ERC-20 this is not set.", + "title": "subGroupId" + } + }, + "description": "The defining characteristics that combine to uniquely identify an Asset on-chain.\nFungible tokens, such as ERC-20s, require an asset_group_id (the contract address).\nNon-fungible tokens and multi-token assets such as ERC-721s and ERC-1155s require a both an asset_group_id and a sub_group_id (the token ID).", + "title": "Asset.Definition" + }, "googlelongrunningOperation": { "type": "object", "properties": { @@ -470,7 +543,7 @@ }, "asset": { "type": "string", - "example": "networks/ethereum-goerli/assets/0c3569d3-b253-5128-a229-543e1e819430", + "example": "networks/ethereum-goerli/assets/e1835806-0718-418a-b185-93553c496655", "description": "The resource name of the Asset to which this Balance corresponds. Format: networks/{network}/assets/{asset}", "title": "asset", "readOnly": true @@ -478,7 +551,7 @@ "amount": { "type": "string", "example": "10000000", - "description": "The amount of the Asset, denominated in atomic units of the asset (e.g., Wei for Ether), as a base-10 number.", + "description": "The amount of the asset. For native assets or ERC-20 contracts, this is presented in terms of atomic units (e.g., Wei for Ether) as a base-10 number. For ERC-721 and ERC-1155 contracts, it is the count of distinct token IDs held by address.", "title": "amount", "readOnly": true }, @@ -493,6 +566,47 @@ "description": "The Balance resource, which represents an amount of an Asset held on-chain by an Address.", "title": "Balance" }, + "v1BalanceDetail": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "networks/ethereum-goerli/addresses/0xDAFEA492D9c6733ae3d56b7Ed1ADB60692c98Bc5/balances/e1835806-0718-418a-b185-93553c496655/balanceDetails/25b036cb-e968-5351-8b0e-3cabc6cddabc", + "description": "The resource name of the BalanceDetail.\nFormat: networks/{network_id}/addresses/{address_id}/balances/{balance_id}/balanceDetails/{balance_detail_id}", + "title": "name", + "readOnly": true + }, + "asset": { + "type": "string", + "example": "networks/ethereum-goerli/assets/e1835806-0718-418a-b185-93553c496655", + "description": "The resource name of the Asset to which the parent Balance corresponds. Format: networks/{network}/assets/{asset}", + "title": "asset", + "readOnly": true + }, + "amount": { + "type": "string", + "example": "10000000", + "description": "// The amount of the BalanceDetail as a base-10 number.", + "title": "amount", + "readOnly": true + }, + "assetDefinition": { + "$ref": "#/definitions/AssetDefinition", + "description": "The asset definition which can be used to identify what token the amount corresponds to.\n\n A BalanceDetail for a native Balance will only have the asset_type field set (\"native\").\n A BalanceDetail for an ERC-20 Balance will only have the asset_type (\"erc20\") and asset_group_id (contract address) fields set.\n A BalanceDetail for an ERC-721 Balance or ERC-1155 Balance will have the asset_type (\"erc721\" or \"erc1155\"),\n asset_group_id (contract address), and sub_group_id (token ID) fields set.", + "title": "asset_definition", + "readOnly": true + }, + "mpcWallet": { + "type": "string", + "example": "pools/95257c5a-522f-4241-bf97-2656a8e9cc91/mpcWallets/d28197e8-372c-461c-9a00-2da3c528c2d1", + "description": "The resource name of the MPCWallet to which the parent Balance belongs. Format: pools/{pool}/mpcWallets/{mpcWallet}", + "title": "mpcWallet", + "readOnly": true + } + }, + "description": "The BalanceDetail resource, which enumerates the specific tokens held which compose a Balance.", + "title": "BalanceDetail" + }, "v1ListAddressesResponse": { "type": "object", "properties": { @@ -511,6 +625,24 @@ "description": "The response message for ListAddresses.", "title": "ListAddressesResponse" }, + "v1ListBalanceDetailsResponse": { + "type": "object", + "properties": { + "balanceDetails": { + "type": "array", + "items": { + "$ref": "#/definitions/v1BalanceDetail" + }, + "description": "The list of balance details." + }, + "nextPageToken": { + "type": "string", + "description": "A token, which can be sent as page_token to retrieve the next page.\nIf this field is omitted, there are no subsequent pages." + } + }, + "description": "The response message for ListBalanceDetails.", + "title": "ListBalanceDetailsResponse" + }, "v1ListBalancesResponse": { "type": "object", "properties": { diff --git a/gen/openapiv2/coinbase/cloud/protocols/v1/protocols.swagger.json b/gen/openapiv2/coinbase/cloud/protocols/v1/protocols.swagger.json index e1a112d..db889b9 100644 --- a/gen/openapiv2/coinbase/cloud/protocols/v1/protocols.swagger.json +++ b/gen/openapiv2/coinbase/cloud/protocols/v1/protocols.swagger.json @@ -178,6 +178,10 @@ "fee": { "$ref": "#/definitions/v1TransactionFee", "description": "The fee to be paid for the transfer. If not provided, the API will default to a network-based fee estimate." + }, + "assetDefinition": { + "$ref": "#/definitions/AssetDefinition", + "description": "The Definition of the BlockchainService Asset for which the transfer transaction is being constructed.\nSupplying an Asset Definition is not strictly necessary for constructing transfer transactions for a native Asset\nor an ERC-20.\nFor an ERC-721, an Asset Definition with a sub_group_id must be provided to specify the token being transferred.\nFor an ERC-1155, an Asset Definition with a sub_group_id must be provided to specify the token being transferred." } }, "description": "The request message for ConstructTransferTransaction.", @@ -194,9 +198,76 @@ "ProtocolService" ] } + }, + "/v1/{networkName}:estimateFee": { + "post": { + "summary": "EstimateFee", + "description": "Estimates the current network fee for the specified Network. For EVM Networks, this corresponds to the gas_price, max_fee_per_gas, and max_priority_fee_per_gas.", + "operationId": "ProtocolService_EstimateFee", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1EstimateFeeResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "networkName", + "description": "The resource name of the Network.\nFormat: networks/{network_id}", + "in": "path", + "required": true, + "type": "string", + "pattern": "networks/[^/]+" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "description": "The request message for EstimateFee." + } + } + ], + "tags": [ + "ProtocolService" + ] + } } }, "definitions": { + "AssetDefinition": { + "type": "object", + "properties": { + "assetType": { + "type": "string", + "example": "native", + "description": "The type of Asset the definition describes.\nPossible values: 'native', 'erc20', 'erc721', 'erc1155'", + "title": "assetType" + }, + "assetGroupId": { + "type": "string", + "example": "0x887CFe31C888EE0780795b7feFF46CE7f9AB556C", + "description": "The identifier that distinguishes this Asset group.\nGenerally a 0x-prefixed contract address for the Asset. For a native Asset this is not set.", + "title": "assetGroupId" + }, + "subGroupId": { + "type": "string", + "description": "The identifier that distinguishes the specific Asset within the asset group.\nGenerally a token ID. For a native Asset or ERC-20 this is not set.", + "title": "subGroupId" + } + }, + "description": "The defining characteristics that combine to uniquely identify an Asset on-chain.\nFungible tokens, such as ERC-20s, require an asset_group_id (the contract address).\nNon-fungible tokens and multi-token assets such as ERC-721s and ERC-1155s require a both an asset_group_id and a sub_group_id (the token ID).", + "title": "Asset.Definition" + }, "protobufAny": { "type": "object", "properties": { @@ -304,6 +375,34 @@ }, "description": "A message representing an EIP-1559 transaction input." }, + "v1EstimateFeeResponse": { + "type": "object", + "properties": { + "ethereumFeeEstimate": { + "$ref": "#/definitions/v1FeeEstimate", + "description": "The estimated network fee for the given EVM Network." + } + }, + "description": "The response message for EstimateFee." + }, + "v1FeeEstimate": { + "type": "object", + "properties": { + "gasPrice": { + "type": "string", + "description": "The estimated legacy gas price denominated in atomic units of the native asset\nas a \"0x\"-prefixed hex string." + }, + "maxFeePerGas": { + "type": "string", + "description": "The estimated max fee per gas (EIP-1559) denominated in atomic units of the asset\nas a \"0x\"-prefixed hex string." + }, + "maxPriorityFeePerGas": { + "type": "string", + "description": "The estimated max priority fee per gas (EIP-1559) denominated in atomic units of\nthe native asset as a \"0x\"-prefixed hex string." + } + }, + "description": "A message representing a fee estimate on an Ethereum-like network." + }, "v1RLPTransaction": { "type": "object", "properties": { diff --git a/protos/services/coinbase/cloud/blockchain/v1/blockchain.proto b/protos/services/coinbase/cloud/blockchain/v1/blockchain.proto index 1b6cca7..e5bf319 100644 --- a/protos/services/coinbase/cloud/blockchain/v1/blockchain.proto +++ b/protos/services/coinbase/cloud/blockchain/v1/blockchain.proto @@ -76,6 +76,18 @@ service BlockchainService { description: "Returns a list of Assets available on a given Network." }; } + + // Returns the list of Assets indicated by the given request. + rpc BatchGetAssets(BatchGetAssetsRequest) returns (BatchGetAssetsResponse) { + option (google.api.http) = { + get: "/v1/{parent=networks/*}/assets:batchGet" + }; + option (google.api.method_signature) = "parent,names"; + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "BatchGetAssets" + description: "Returns the list of Assets indicated by the given request." + }; + } } // The Network resource, which represents a blockchain network. @@ -154,8 +166,6 @@ message Network { } // The Asset resource, which represents an on-chain asset. -// For fungible assets, one resource exists per Asset. In the case -// of non-fungible tokens, a unique Asset entry exists for every token. message Asset { option (google.api.resource) = { type: "api.developer.coinbase.com/Asset" @@ -164,7 +174,7 @@ message Asset { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { json_schema: { title: "Asset" - description: "The Asset resource, which represents an on-chain asset.\nFor fungible assets, one resource exists per Asset.\nIn the case of non-fungible tokens, a unique Asset entry exists for every token." + description: "The Asset resource, which represents an on-chain asset." } }; @@ -353,3 +363,45 @@ message ListAssetsResponse { // If this field is omitted, there are no subsequent pages. string next_page_token = 2; } + +// The request message for BatchGetAssets. +message BatchGetAssetsRequest { + // The resource name of the parent Network. + // Format: networks/{network_id} + string parent = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + child_type: "api.developer.coinbase.com/Asset" + }, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + field_configuration: {path_param_name: "networkName"} + } + ]; + + // The resource names of the Assets to retrieve. + // Each name has format: networks/{network_id}/assets/{asset_id} + // A maximum of 1000 Assets can be retrieved in a batch. + repeated string names = 2 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "api.developer.coinbase.com/Asset" + }]; +} + +// The response message for BatchGetAssets. +message BatchGetAssetsResponse { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { + json_schema: { + title: "BatchGetAssetsResponse" + description: "The response message for BatchGetAssets." + } + }; + + // The list of Assets. + // Note: The returned Assets may not be in the same order as in the request. + repeated Asset assets = 1; + + // The resource names of the Assets that were not found. + // Each name has format: networks/{network_id}/assets/{asset_id}. + repeated string not_found = 2; +} diff --git a/protos/services/coinbase/cloud/mpc_keys/v1/mpc_keys.proto b/protos/services/coinbase/cloud/mpc_keys/v1/mpc_keys.proto index 752dc87..0d3e0d6 100644 --- a/protos/services/coinbase/cloud/mpc_keys/v1/mpc_keys.proto +++ b/protos/services/coinbase/cloud/mpc_keys/v1/mpc_keys.proto @@ -8,6 +8,7 @@ import "google/api/annotations.proto"; import "google/api/client.proto"; import "google/api/field_behavior.proto"; import "google/api/resource.proto"; +import "google/protobuf/empty.proto"; import "google/longrunning/operations.proto"; import "protoc-gen-openapiv2/options/annotations.proto"; @@ -156,10 +157,101 @@ service MPCKeyService { metadata_type: "CreateSignatureMetadata" }; option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { - summary: "Create Signature" + summary: "CreateSignature" description: "Creates a Signature using an MPCKey.\n\n After calling this, use ListMPCOperations to poll for the pending CreateSignature operation, and use the WaaS SDK's computeMPCOperation to complete the operation." }; } + + // Prepares an archive in the local storage of the given Device. The archive contains cryptographic materials + // that can be used to export MPCKeys, which have the given DeviceGroup as their parent. + // The Device specified in the request must be a member of this DeviceGroup and must participate + // in the associated MPC operation for the archive to be prepared. After calling this, + // use ListMPCOperations to poll for the pending PrepareDeviceArchive operation, and use the WaaS SDK's + // ComputeMPCOperation to complete the operation. Once the operation completes, the Device can utilize the + // WaaS SDK to export the private keys corresponding to each of the MPCKeys under this DeviceGroup. + rpc PrepareDeviceArchive(PrepareDeviceArchiveRequest) returns (google.longrunning.Operation) { + option (google.api.http) = { + post: "/v1/{device_group=pools/*/deviceGroups/*}:prepareDeviceArchive" + body: "*" + }; + option (google.api.method_signature) = "device_group,device"; + option (google.longrunning.operation_info) = { + response_type: "DeviceGroup" + metadata_type: "PrepareDeviceArchiveMetadata" + }; + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "PrepareDeviceArchive" + description: "Prepares an archive in the local storage of the given Device.\n\n The archive contains cryptographic materials that can be used to export MPCKeys, which have the given DeviceGroup as their parent.\n\n The Device specified in the request must be a member of this DeviceGroup and must participate in the associated MPC operation for the archive to be prepared. After calling this, use ListMPCOperations to poll for the pending PrepareDeviceArchive operation, and use the WaaS SDK's ComputeMPCOperation to complete the operation.\n\n Once the operation completes, the Device can utilize the WaaS SDK to export the private keys corresponding to each of the MPCKeys under this DeviceGroup." + }; + } + + // Prepares a backup in the given Device. The backup contains certain cryptographic materials + // that can be used to restore MPCKeys, which have the given DeviceGroup as their parent, on a new Device. + // The Device specified in the request must be a member of this DeviceGroup and must participate in the associated + // MPC operation for the backup to be prepared. + // After calling this RPC, use ListMPCOperations to poll for the pending PrepareDeviceBackup operation, + // and use the WaaS SDK's ComputeMPCOperation to complete the operation. Once the operation completes, + // the Device can utilize WaaS SDK to download the backup bundle. We recommend storing this backup bundle securely + // in a storage provider of your choice. If the user loses access to their existing Device and wants to recover + // MPCKeys in the given DeviceGroup on a new Device, use AddDevice RPC on the MPCKeyService. + rpc PrepareDeviceBackup(PrepareDeviceBackupRequest) returns (google.longrunning.Operation) { + option (google.api.http) = { + post: "/v1/{device_group=pools/*/deviceGroups/*}:prepareDeviceBackup" + body: "*" + }; + option (google.api.method_signature) = "device_group,device"; + option (google.longrunning.operation_info) = { + response_type: "DeviceGroup" + metadata_type: "PrepareDeviceBackupMetadata" + }; + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "PrepareDeviceBackup" + description: "Prepares a backup in the given Device.\n\n The backup contains certain cryptographic materials that can be used to restore MPCKeys, which have the given DeviceGroup as their parent, on a new Device.\n\n The Device specified in the request must be a member of this DeviceGroup and must participate in the associated MPC operation for the backup to be prepared. \n\n After calling this RPC, use ListMPCOperations to poll for the pending PrepareDeviceBackup operation, and use the WaaS SDK's ComputeMPCOperation to complete the operation. \n\n Once the operation completes, the Device can utilize WaaS SDK to download the backup bundle. \n\n We recommend storing this backup bundle securely in a storage provider of your choice. \n\n If the user loses access to their existing Device and wants to recover MPCKeys in the given DeviceGroup on a new Device, use AddDevice RPC on the MPCKeyService." + }; + } + + // Adds a Device to an existing DeviceGroup. Prior to this API being called, the Device must be registered using + // RegisterDevice RPC. The Device must have access to the backup created with PrepareDeviceBackup RPC to compute this + // operation. After calling this RPC, use ListMPCOperations to poll for the pending AddDevice operation, + // and use the WaaS SDK's ComputeAddDeviceMPCOperation to complete the operation. + // After the operation is computed on WaaS SDK, the Device will have access to cryptographic materials + // required to process MPCOperations for this DeviceGroup. + // Once the operation completes on MPCKeyService, the Device will be added to the given DeviceGroup as a new member + // and all existing Devices in the DeviceGroup will stay functional. + // Use the RevokeDevice RPC to remove any of the existing Devices from the DeviceGroup. + rpc AddDevice(AddDeviceRequest) returns (google.longrunning.Operation) { + option (google.api.http) = { + post: "/v1/{device_group=pools/*/deviceGroups/*}:addDevice" + body: "*" + }; + option (google.api.method_signature) = "device_group,device"; + option (google.longrunning.operation_info) = { + response_type: "DeviceGroup" + metadata_type: "AddDeviceMetadata" + }; + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "AddDevice" + description: "Adds a Device to an existing DeviceGroup. \n\nPrior to this API being called, the Device must be registered using RegisterDevice RPC. \n\n The Device must have access to the backup created with PrepareDeviceBackup RPC to compute this operation. \n\n After calling this RPC, use ListMPCOperations to poll for the pending AddDevice operation, and use the WaaS SDK's ComputeAddDeviceMPCOperation to complete the operation. After the operation is computed on WaaS SDK, the Device will have access to cryptographic materials required to process MPCOperations for this DeviceGroup. \n\nOnce the operation completes on MPCKeyService, the Device will be added to the given DeviceGroup as a new member and all existing Devices in the DeviceGroup will stay functional. \n\nMPCKeyService will expose RemoveDevice RPC in a future release that can remove any of the existing Devices from the DeviceGroup." + }; + } + + // Revokes a registered Device. This operation removes the registered Device from all the DeviceGroups that it is a + // part of. Once the Device is revoked, cryptographic materials in your physical Device are invalidated, + // and the Device can no longer participate in any MPCOperations of the DeviceGroups it was a part of. + // Use this API in scenarios such as losing the existing Device, switching to a new physical Device, etc. + // Ensure that a new Device is successfully added to your DeviceGroups using the AddDevice RPC before invoking + // the RevokeDevice RPC. + rpc RevokeDevice(RevokeDeviceRequest) returns (google.protobuf.Empty) { + option (google.api.http) = { + post: "/v1/device:revoke" + body: "*" + }; + option (google.api.method_signature) = "name"; + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "RevokeDevice" + description: "Revokes a registered Device.\n This operation removes the registered Device from all the DeviceGroups that it is a part of.\n Once the Device is revoked, cryptographic materials in your physical Device are invalidated, and the Device can no longer participate in any MPCOperations of the DeviceGroups it was a part of. Use this API in scenarios such as losing the existing Device, switching to a new physical Device, etc.\n Ensure that a new Device is successfully added to your DeviceGroups using the AddDevice RPC before invoking the RevokeDevice RPC." + }; + } }; // The Device resource, which represents a single participant in the MPC protocol. @@ -228,6 +320,17 @@ message Seed { description: "The hardened children derived from the Seed. To create an MPCKey, at least one hardened child must be derived.", } ]; + + // The metadata to be used to export MPCKeys derived from this Seed. This metadata has to be passed to the + // WaaS SDK's ExportPrivateKeys to export private keys corresponding to MPCKeys that are derived from this Seed's + // HardenedChildren. + bytes mpc_key_export_metadata = 2 [ + (google.api.field_behavior) = OUTPUT_ONLY, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + title: "mpcKeyExportMetadata" + description: "The metadata to be used to export MPCKeys derived from this Seed.\n\n This metadata has to be passed to WaaS SDK's ExportPrivateKeys to export private keys corresponding to MPCKeys that are derived from this Seed's HardenedChildren." + } + ]; } // The DeviceGroup resource, which represents a collection of Devices that have access to the @@ -332,6 +435,27 @@ message MPCOperation { description: "Metadata associated with the CreateSignature long-running operation." } ]; + // Metadata associated with the PrepareDeviceArchive long-running operation. + PrepareDeviceArchiveMetadata prepare_device_archive_metadata = 5 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + title: "prepareDeviceArchiveMetadata" + description: "Metadata associated with the PrepareDeviceArchive long-running operation." + } + ]; + // Metadata associated with the PrepareDeviceBackup long-running operation. + PrepareDeviceBackupMetadata prepare_device_backup_metadata = 6 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + title: "prepareDeviceBackupMetadata" + description: "Metadata associated with the PrepareDeviceBackup long-running operation." + } + ]; + // Metadata associated with the AddDevice long-running operation. + AddDeviceMetadata add_device_metadata = 7 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + title: "addDeviceMetadata" + description: "Metadata associated with the AddDevice long-running operation." + } + ]; } } @@ -435,7 +559,7 @@ message RegisterDeviceRequest { bytes registration_data = 1 [(google.api.field_behavior) = REQUIRED]; // A user-provided request ID to allow for idempotency. This should be a UUID. - string request_id = 2 [(google.api.field_behavior) = OPTIONAL]; + string request_id = 2 [(google.api.field_behavior) = OPTIONAL]; } // The request message for GetDevice. @@ -505,8 +629,6 @@ message GetDeviceGroupRequest { } // The request message for ListMPCOperations. -// (-- api-linter: core::0158::request-page-size-field=disabled --) -// (-- api-linter: core::0158::request-page-token-field=disabled --) message ListMPCOperationsRequest { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { json_schema: { @@ -526,7 +648,6 @@ message ListMPCOperationsRequest { } // The response message for ListMPCOperations. -// (-- api-linter: core::0158::response-next-page-token-field=disabled --) message ListMPCOperationsResponse { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { json_schema: { @@ -608,3 +729,154 @@ message CreateSignatureMetadata { // correct payload is being signed. bytes payload = 2 [(google.api.field_behavior) = REQUIRED]; } + + +// The request message for PrepareDeviceArchive. +message PrepareDeviceArchiveRequest { + // The resource name of the DeviceGroup. The prepared archive will include cryptographic materials to export the + // private keys corresponding to each of the MPCKey under this DeviceGroup. + // Format: pools/{pool_id}/deviceGroups/{device_group_id} + string device_group = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = {type: "api.developer.coinbase.com/DeviceGroup"}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + field_configuration: {path_param_name: "deviceGroupName"} + } + ]; + + // The resource name of the Device that prepares the archive in its local storage. + // The Device must be part of the DeviceGroup specified above. + // Format: devices/{device_id} + string device = 2 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = {type: "api.developer.coinbase.com/Device"}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + field_configuration: {path_param_name: "deviceName"} + } ]; + + // A user-provided request ID to allow for idempotency. This should be a UUID. + string request_id = 3 [(google.api.field_behavior) = OPTIONAL]; +} + +// Metadata associated with the PrepareDeviceArchive long-running operation. +message PrepareDeviceArchiveMetadata { + // The resource name of the DeviceGroup to poll using ListMPCOperations. + // Format: pools/{pool_id}/deviceGroups/{device_group_id} + string device_group = 1 [ + (google.api.field_behavior) = OUTPUT_ONLY, + (google.api.resource_reference) = {type: "api.developer.coinbase.com/DeviceGroup"}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + title: "device_group" + description: "The resource name of the DeviceGroup to poll using ListMPCOperations.\n Format: pools/{pool_id}/deviceGroups/{device_group_id}" + example: "\"pools/95257c5a-522f-4241-bf97-2656a8e9cc91/deviceGroups/3a168a54-6661-4e5a-8bc5-9759671aa777\"" + } + ]; +} + +// The request message for PrepareDeviceBackup. +message PrepareDeviceBackupRequest { + // The resource name of the DeviceGroup. The prepared backup will include cryptographic materials to recover the + // MPCKeys under this DeviceGroup on a new Device. + // Format: pools/{pool_id}/deviceGroups/{device_group_id} + string device_group = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = {type: "api.developer.coinbase.com/DeviceGroup"}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + field_configuration: {path_param_name: "deviceGroupName"} + } + ]; + + // The resource name of the Device that prepares the backup. + // The Device must be part of the DeviceGroup specified above. + // Format: devices/{device_id} + string device = 2 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = {type: "api.developer.coinbase.com/Device"}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + field_configuration: {path_param_name: "deviceName"} + } ]; + + // A user-provided request ID to allow for idempotency. This should be a UUID. + string request_id = 3 [(google.api.field_behavior) = OPTIONAL]; +} + +// Metadata associated with the PrepareDeviceBackup long-running operation. +message PrepareDeviceBackupMetadata { + // The resource name of the DeviceGroup to poll using ListMPCOperations. + // Format: pools/{pool_id}/deviceGroups/{device_group_id} + string device_group = 1 [ + (google.api.field_behavior) = OUTPUT_ONLY, + (google.api.resource_reference) = {type: "api.developer.coinbase.com/DeviceGroup"}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + title: "device_group" + description: "The resource name of the DeviceGroup to poll using ListMPCOperations.\n Format: pools/{pool_id}/deviceGroups/{device_group_id}" + example: "\"pools/95257c5a-522f-4241-bf97-2656a8e9cc91/deviceGroups/3a168a54-6661-4e5a-8bc5-9759671aa777\"" + } + ]; +} + +// The request message for AddDevice. +message AddDeviceRequest { + // The resource name of the DeviceGroup to which the Device is being added. + // Format: pools/{pool_id}/deviceGroups/{device_group_id} + string device_group = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = {type: "api.developer.coinbase.com/DeviceGroup"}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + field_configuration: {path_param_name: "deviceGroupName"} + } + ]; + + // The resource name of the Device that is being added to the DeviceGroup. + // The Device must not be part of the DeviceGroup specified above. + // Format: devices/{device_id} + string device = 2 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = {type: "api.developer.coinbase.com/Device"}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + field_configuration: {path_param_name: "deviceName"} + } ]; + + // A user-provided request ID to allow for idempotency. This should be a UUID. + string request_id = 3 [(google.api.field_behavior) = OPTIONAL]; +} + +// Metadata associated with the AddDevice long-running operation. +message AddDeviceMetadata { + // The resource name of the DeviceGroup to poll using ListMPCOperations. + // Format: pools/{pool_id}/deviceGroups/{device_group_id} + string device_group = 1 [ + (google.api.field_behavior) = OUTPUT_ONLY, + (google.api.resource_reference) = {type: "api.developer.coinbase.com/DeviceGroup"}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + title: "device_group" + description: "The resource name of the DeviceGroup to poll using ListMPCOperations.\n Format: pools/{pool_id}/deviceGroups/{device_group_id}" + example: "\"pools/95257c5a-522f-4241-bf97-2656a8e9cc91/deviceGroups/3a168a54-6661-4e5a-8bc5-9759671aa777\"" + } + ]; + + // The list of Device resource names that can compute the MPCOperation by invoking ComputeAddDeviceMPCOperation on the + // WaaS SDK. + // Format: devices/{device_id} + repeated string participating_devices = 2[ + (google.api.field_behavior) = OUTPUT_ONLY, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + title: "devices" + description: "The list of Device resource names that can compute the MPCOperation by invoking ComputeAddDeviceMPCOperation on the WaaS SDK.\nFormat: devices/{device}", + example: "[\"devices/1591089c-229d-4578-ab94-a3fa3442d77b\"]" + } + ]; +} + +// The request message for RevokeDevice. +message RevokeDeviceRequest { + // The resource name of the Device that is being revoked. + // Format: devices/{device_id} + string name = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = {type: "api.developer.coinbase.com/Device"}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + field_configuration: {path_param_name: "deviceName"} + } + ]; +} diff --git a/protos/services/coinbase/cloud/mpc_transactions/v1/mpc_transactions.proto b/protos/services/coinbase/cloud/mpc_transactions/v1/mpc_transactions.proto index 6a07d83..f7c426b 100644 --- a/protos/services/coinbase/cloud/mpc_transactions/v1/mpc_transactions.proto +++ b/protos/services/coinbase/cloud/mpc_transactions/v1/mpc_transactions.proto @@ -14,7 +14,7 @@ option go_package = "github.com/coinbase/waas-client-library-go/gen/go/coinbase/ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { info: { - title: "MPC Transactions API"; + title: "MPCTransactions API"; version: "1.0"; }; host: "api.developer.coinbase.com/waas/mpc_transactions" @@ -133,7 +133,6 @@ message MPCTransaction { // The resource name of the Addresses from which to send the MPCTransaction. // For account-based Networks, only the first address is used. // Format: networks/{network_id}/addresses/{address_id}. - // (-- api-linter: core::0140::prepositions=disabled --) repeated string from_addresses = 3 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = {type: "api.developer.coinbase.com/MPCWallet"}, diff --git a/protos/services/coinbase/cloud/mpc_wallets/v1/mpc_wallets.proto b/protos/services/coinbase/cloud/mpc_wallets/v1/mpc_wallets.proto index 9c88a29..b976cd3 100644 --- a/protos/services/coinbase/cloud/mpc_wallets/v1/mpc_wallets.proto +++ b/protos/services/coinbase/cloud/mpc_wallets/v1/mpc_wallets.proto @@ -2,6 +2,7 @@ syntax = "proto3"; package coinbase.cloud.mpc_wallets.v1; +import "coinbase/cloud/blockchain/v1/blockchain.proto"; import "google/api/annotations.proto"; import "google/api/client.proto"; import "google/api/field_behavior.proto"; @@ -13,7 +14,7 @@ option go_package = "github.com/coinbase/waas-client-library-go/gen/go/coinbase/ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { info: { - title: "MPC Wallets API"; + title: "MPCWallets API"; version: "1.0"; }; host: "api.developer.coinbase.com/waas/mpc_wallets" @@ -77,7 +78,10 @@ service MPCWalletService { }; } - // Generates an Address within an MPCWallet. + // Generates an Address within an MPCWallet. The Address values generated are identical across + // Networks of the same protocol family (e.g. EVM). So, for example, calling GenerateAddress twice + // for networks/ethereum-mainnet, and then calling it twice more for networks/ethereum-goerli, will + // result in two pairs of identical addresses on Ethereum Mainnet and Goerli. rpc GenerateAddress(GenerateAddressRequest) returns (Address) { option (google.api.http) = { post: "/v1/{mpc_wallet=pools/*/mpcWallets/*}:generateAddress" @@ -86,7 +90,7 @@ service MPCWalletService { option (google.api.method_signature) = "mpc_wallet,network"; option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { summary: "GenerateAddress" - description: "Generates an Address within an MPCWallet." + description: "Generates an Address within an MPCWallet. The Address values generated are identical across Networks of the same protocol family (e.g. EVM). So, for example, calling GenerateAddress twice for networks/ethereum-mainnet, and then calling it twice more for networks/ethereum-goerli, will result in two pairs of identical addresses on Ethereum Mainnet and Goerli." }; } @@ -125,6 +129,18 @@ service MPCWalletService { description: "Returns a list of Balances." }; } + + // Returns a list of BalanceDetails. + rpc ListBalanceDetails(ListBalanceDetailsRequest) returns (ListBalanceDetailsResponse) { + option (google.api.http) = { + get: "/v1/{parent=networks/*/addresses/*/balances/*}/balanceDetails" + }; + option (google.api.method_signature) = "parent"; + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "ListBalanceDetails" + description: "Returns a list of BalanceDetails." + }; + } } // The MPCWallet resource, which represents a collection of on-chain Addresses and their @@ -261,17 +277,18 @@ message Balance { (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { title: "asset" description: "The resource name of the Asset to which this Balance corresponds. Format: networks/{network}/assets/{asset}" - example: "\"networks/ethereum-goerli/assets/0c3569d3-b253-5128-a229-543e1e819430\"" + example: "\"networks/ethereum-goerli/assets/e1835806-0718-418a-b185-93553c496655\"" } ]; - // The amount of the Asset, denominated in atomic units of the asset (e.g., Wei for Ether), - // as a base-10 number. + // The amount of the asset. For native assets or ERC-20 contracts, this is presented in terms of + // atomic units (e.g., Wei for Ether) as a base-10 number. For ERC-721 and ERC-1155 contracts, it + // is the count of distinct token IDs held by address. string amount = 3 [ (google.api.field_behavior) = OUTPUT_ONLY, (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { title: "amount" - description: "The amount of the Asset, denominated in atomic units of the asset (e.g., Wei for Ether), as a base-10 number." + description: "The amount of the asset. For native assets or ERC-20 contracts, this is presented in terms of atomic units (e.g., Wei for Ether) as a base-10 number. For ERC-721 and ERC-1155 contracts, it is the count of distinct token IDs held by address." example: "\"10000000\"" } ]; @@ -289,6 +306,80 @@ message Balance { ]; } +// The BalanceDetail resource, which enumerates the specific tokens held which compose a Balance. +message BalanceDetail { + option (google.api.resource) = { + type: "api.developer.coinbase.com/BalanceDetail" + pattern: "networks/{network_id}/addresses/{address_id}/balances/{balance_id}/balanceDetails/{balance_detail_id}" + }; + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { + json_schema: { + title: "BalanceDetail" + description: "The BalanceDetail resource, which enumerates the specific tokens held which compose a Balance." + } + }; + + // The resource name of the BalanceDetail. + // Format: networks/{network_id}/addresses/{address_id}/balances/{balance_id}/balanceDetails/{balance_detail_id} + string name = 1 [ + (google.api.field_behavior) = OUTPUT_ONLY, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + title: "name" + description: "The resource name of the BalanceDetail.\nFormat: networks/{network_id}/addresses/{address_id}/balances/{balance_id}/balanceDetails/{balance_detail_id}", + example: "\"networks/ethereum-goerli/addresses/0xDAFEA492D9c6733ae3d56b7Ed1ADB60692c98Bc5/balances/e1835806-0718-418a-b185-93553c496655/balanceDetails/25b036cb-e968-5351-8b0e-3cabc6cddabc\"" + } + ]; + + // The resource name of the Asset to which the parent Balance corresponds. + // Format: networks/{network}/assets/{asset} + string asset = 2 [ + (google.api.field_behavior) = OUTPUT_ONLY, + (google.api.resource_reference) = {type: "api.developer.coinbase.com/Asset"}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + title: "asset" + description: "The resource name of the Asset to which the parent Balance corresponds. Format: networks/{network}/assets/{asset}" + example: "\"networks/ethereum-goerli/assets/e1835806-0718-418a-b185-93553c496655\"" + } + ]; + + // The amount of the BalanceDetail as a base-10 number. + // For a BalanceDetail for a native Balance or ERC-20 Balance, this is denominated in atomic units of the asset. + string amount = 3 [ + (google.api.field_behavior) = OUTPUT_ONLY, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + title: "amount" + description: "// The amount of the BalanceDetail as a base-10 number." + example: "\"10000000\"" + } + ]; + + // The asset definition which can be used to identify what token the amount corresponds to. + // + // A BalanceDetail for a native Balance will only have the asset_type field set ("native"). + // A BalanceDetail for an ERC-20 Balance will only have the asset_type ("erc20") and asset_group_id (contract address) fields set. + // A BalanceDetail for an ERC-721 Balance or ERC-1155 Balance will have the asset_type ("erc721" or "erc1155"), + // asset_group_id (contract address), and sub_group_id (token ID) fields set. + coinbase.cloud.blockchain.v1.Asset.Definition asset_definition = 4 [ + (google.api.field_behavior) = OUTPUT_ONLY, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + title: "asset_definition" + description: "The asset definition which can be used to identify what token the amount corresponds to.\n\n A BalanceDetail for a native Balance will only have the asset_type field set (\"native\").\n A BalanceDetail for an ERC-20 Balance will only have the asset_type (\"erc20\") and asset_group_id (contract address) fields set.\n A BalanceDetail for an ERC-721 Balance or ERC-1155 Balance will have the asset_type (\"erc721\" or \"erc1155\"),\n asset_group_id (contract address), and sub_group_id (token ID) fields set." + } + ]; + + // The resource name of the MPCWallet to which the parent Balance belongs. + // Format: pools/{pool}/mpcWallets/{mpcWallet} + string mpc_wallet = 5 [ + (google.api.field_behavior) = OUTPUT_ONLY, + (google.api.resource_reference) = {type: "api.developer.coinbase.com/MPCWallet"}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + title: "mpcWallet" + description: "The resource name of the MPCWallet to which the parent Balance belongs. Format: pools/{pool}/mpcWallets/{mpcWallet}" + example: "\"pools/95257c5a-522f-4241-bf97-2656a8e9cc91/mpcWallets/d28197e8-372c-461c-9a00-2da3c528c2d1\"" + } + ]; +} + // The request message for CreateMPCWallet. message CreateMPCWalletRequest { // The resource name of the parent Pool. @@ -411,7 +502,7 @@ message GetAddressRequest { // Format: networks/{network_id}/addresses/{address_id} string name = 1 [ (google.api.field_behavior) = REQUIRED, - (google.api.resource_reference) = {type: "api.developer.coinbase.com/Network"}, + (google.api.resource_reference) = {type: "api.developer.coinbase.com/Address"}, (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { field_configuration: {path_param_name: "networkName"} } @@ -480,7 +571,7 @@ message ListBalancesRequest { } ]; - // The maximum number of Balances to return. If unspecified, at most 50 Balances + // The maximum number of Balances to return. If unspecified, at most 25 Balances // will be returned. int32 page_size = 3 [(google.api.field_behavior) = OPTIONAL]; @@ -505,3 +596,43 @@ message ListBalancesResponse { // If this field is omitted, there are no subsequent pages. string next_page_token = 2; } + +// The request message for ListBalanceDetails. +message ListBalanceDetailsRequest { + // The resource name of the parent Balance. + // Format: networks/{network_id}/addresses/{address_id}/balances/{balance_id} + string parent = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + child_type: "api.developer.coinbase.com/BalanceDetail" + }, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + field_configuration: {path_param_name: "balanceName"} + } + ]; + + // The maximum number of BalanceDetails to return. If unspecified, at most 25 BalanceDetails + // will be returned. + int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL]; + + // A page token, received from a previous ListBalanceDetails call. + // Provide this to retrieve the subsequent page. + string page_token = 3 [(google.api.field_behavior) = OPTIONAL]; +} + +// The response message for ListBalanceDetails. +message ListBalanceDetailsResponse{ + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { + json_schema: { + title: "ListBalanceDetailsResponse" + description: "The response message for ListBalanceDetails." + } + }; + + // The list of balance details. + repeated BalanceDetail balance_details = 1; + + // A token, which can be sent as page_token to retrieve the next page. + // If this field is omitted, there are no subsequent pages. + string next_page_token = 2; +} diff --git a/protos/services/coinbase/cloud/protocols/v1/protocols.proto b/protos/services/coinbase/cloud/protocols/v1/protocols.proto index 17b88c2..b3a2653 100644 --- a/protos/services/coinbase/cloud/protocols/v1/protocols.proto +++ b/protos/services/coinbase/cloud/protocols/v1/protocols.proto @@ -2,6 +2,8 @@ syntax = "proto3"; package coinbase.cloud.protocols.v1; +import "coinbase/cloud/blockchain/v1/blockchain.proto"; +import "coinbase/cloud/protocols/ethereum/v1/outputs.proto"; import "coinbase/cloud/types/v1/transaction.proto"; import "google/api/annotations.proto"; import "google/api/client.proto"; @@ -74,6 +76,20 @@ service ProtocolService { description: "Broadcasts a transaction to a node in the Network. There are two ways of invoking this API:\n 1. Set the raw_signed_transaction on the Transaction. This is equivalent to the payload used to broadcast transactions via block explorers such as Etherscan.\n 2. Set the signature(s) in the required_signatures of the Transaction.\n // The TransactionInput itself is not required. The Transaction returned will have the hash set on it." }; } + + // Estimates the current network fee for the specified Network. For EVM Networks, this + // corresponds to the gas_price, max_fee_per_gas, and max_priority_fee_per_gas. + rpc EstimateFee(EstimateFeeRequest) returns (EstimateFeeResponse) { + option (google.api.http) = { + post: "/v1/{network=networks/*}:estimateFee" + body: "*" + }; + option (google.api.method_signature) = "network"; + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "EstimateFee" + description: "Estimates the current network fee for the specified Network. For EVM Networks, this corresponds to the gas_price, max_fee_per_gas, and max_priority_fee_per_gas." + }; + } } // The request message for ConstructTransaction. @@ -127,6 +143,13 @@ message ConstructTransferTransactionRequest { // The fee to be paid for the transfer. If not provided, the API will default to a network-based fee estimate. coinbase.cloud.types.v1.TransactionFee fee = 7 [(google.api.field_behavior) = OPTIONAL]; + + // The Definition of the BlockchainService Asset for which the transfer transaction is being constructed. + // Supplying an Asset Definition is not strictly necessary for constructing transfer transactions for a native Asset + // or an ERC-20. + // For an ERC-721, an Asset Definition with a sub_group_id must be provided to specify the token being transferred. + // For an ERC-1155, an Asset Definition with a sub_group_id must be provided to specify the token being transferred. + coinbase.cloud.blockchain.v1.Asset.Definition asset_definition = 8 [(google.api.field_behavior) = OPTIONAL]; } // The request message for BroadcastTransaction. For the broadcast to complete successfully, @@ -152,3 +175,25 @@ message BroadcastTransactionRequest { // 2. The signature(s) in the required_signatures of the Transaction is populated. coinbase.cloud.types.v1.Transaction transaction = 2; } + +// The request message for EstimateFee. +message EstimateFeeRequest { + // The resource name of the Network. + // Format: networks/{network_id} + string network = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = {type: "api.developer.coinbase.com/Network"}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + field_configuration: {path_param_name: "networkName"} + } + ]; +} + +// The response message for EstimateFee. +message EstimateFeeResponse { + // The estimated fee for the given Network. + oneof network_fee_estimate { + // The estimated network fee for the given EVM Network. + coinbase.cloud.protocols.ethereum.v1.FeeEstimate ethereum_fee_estimate = 1; + } +} diff --git a/protos/types/coinbase/cloud/protocols/ethereum/v1/outputs.proto b/protos/types/coinbase/cloud/protocols/ethereum/v1/outputs.proto new file mode 100644 index 0000000..54fe625 --- /dev/null +++ b/protos/types/coinbase/cloud/protocols/ethereum/v1/outputs.proto @@ -0,0 +1,20 @@ +syntax = "proto3"; + +package coinbase.cloud.protocols.ethereum.v1; + +option go_package = "github.com/coinbase/waas-client-library-go/gen/go/coinbase/cloud/protocols/ethereum/v1"; + +// A message representing a fee estimate on an Ethereum-like network. +message FeeEstimate { + // The estimated legacy gas price denominated in atomic units of the native asset + // as a "0x"-prefixed hex string. + string gas_price = 1; + + // The estimated max fee per gas (EIP-1559) denominated in atomic units of the asset + // as a "0x"-prefixed hex string. + string max_fee_per_gas = 2; + + // The estimated max priority fee per gas (EIP-1559) denominated in atomic units of + // the native asset as a "0x"-prefixed hex string. + string max_priority_fee_per_gas = 3; +}