Add a query to list authorities #42

Merged
nabarun merged 4 commits from pm-list-authorities into main 2024-07-24 09:14:40 +00:00
9 changed files with 2089 additions and 342 deletions

File diff suppressed because it is too large Load Diff

View File

@ -28,6 +28,7 @@ const (
Query_LookupLrn_FullMethodName = "/cerc.registry.v1.Query/LookupLrn"
Query_ResolveLrn_FullMethodName = "/cerc.registry.v1.Query/ResolveLrn"
Query_GetRegistryModuleBalance_FullMethodName = "/cerc.registry.v1.Query/GetRegistryModuleBalance"
Query_Authorities_FullMethodName = "/cerc.registry.v1.Query/Authorities"
)
// QueryClient is the client API for Query service.
@ -52,6 +53,8 @@ type QueryClient interface {
ResolveLrn(ctx context.Context, in *QueryResolveLrnRequest, opts ...grpc.CallOption) (*QueryResolveLrnResponse, error)
// Get registry module balance
GetRegistryModuleBalance(ctx context.Context, in *QueryGetRegistryModuleBalanceRequest, opts ...grpc.CallOption) (*QueryGetRegistryModuleBalanceResponse, error)
// Authorities queries all authorities
Authorities(ctx context.Context, in *QueryAuthoritiesRequest, opts ...grpc.CallOption) (*QueryAuthoritiesResponse, error)
}
type queryClient struct {
@ -143,6 +146,15 @@ func (c *queryClient) GetRegistryModuleBalance(ctx context.Context, in *QueryGet
return out, nil
}
func (c *queryClient) Authorities(ctx context.Context, in *QueryAuthoritiesRequest, opts ...grpc.CallOption) (*QueryAuthoritiesResponse, error) {
out := new(QueryAuthoritiesResponse)
err := c.cc.Invoke(ctx, Query_Authorities_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// QueryServer is the server API for Query service.
// All implementations must embed UnimplementedQueryServer
// for forward compatibility
@ -165,6 +177,8 @@ type QueryServer interface {
ResolveLrn(context.Context, *QueryResolveLrnRequest) (*QueryResolveLrnResponse, error)
// Get registry module balance
GetRegistryModuleBalance(context.Context, *QueryGetRegistryModuleBalanceRequest) (*QueryGetRegistryModuleBalanceResponse, error)
// Authorities queries all authorities
Authorities(context.Context, *QueryAuthoritiesRequest) (*QueryAuthoritiesResponse, error)
mustEmbedUnimplementedQueryServer()
}
@ -199,6 +213,9 @@ func (UnimplementedQueryServer) ResolveLrn(context.Context, *QueryResolveLrnRequ
func (UnimplementedQueryServer) GetRegistryModuleBalance(context.Context, *QueryGetRegistryModuleBalanceRequest) (*QueryGetRegistryModuleBalanceResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetRegistryModuleBalance not implemented")
}
func (UnimplementedQueryServer) Authorities(context.Context, *QueryAuthoritiesRequest) (*QueryAuthoritiesResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method Authorities not implemented")
}
func (UnimplementedQueryServer) mustEmbedUnimplementedQueryServer() {}
// UnsafeQueryServer may be embedded to opt out of forward compatibility for this service.
@ -374,6 +391,24 @@ func _Query_GetRegistryModuleBalance_Handler(srv interface{}, ctx context.Contex
return interceptor(ctx, in, info, handler)
}
func _Query_Authorities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(QueryAuthoritiesRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(QueryServer).Authorities(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Query_Authorities_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(QueryServer).Authorities(ctx, req.(*QueryAuthoritiesRequest))
}
return interceptor(ctx, in, info, handler)
}
// Query_ServiceDesc is the grpc.ServiceDesc for Query service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
@ -417,6 +452,10 @@ var Query_ServiceDesc = grpc.ServiceDesc{
MethodName: "GetRegistryModuleBalance",
Handler: _Query_GetRegistryModuleBalance_Handler,
},
{
MethodName: "Authorities",
Handler: _Query_Authorities_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "cerc/registry/v1/query.proto",

View File

@ -58,6 +58,11 @@ service Query {
returns (QueryGetRegistryModuleBalanceResponse) {
option (google.api.http).get = "/cerc/registry/v1/balance";
}
// Authorities queries all authorities
rpc Authorities(QueryAuthoritiesRequest) returns (QueryAuthoritiesResponse) {
option (google.api.http).get = "/cerc/registry/v1/authorities";
}
}
// QueryParamsRequest is request type for registry params
@ -152,6 +157,16 @@ message QueryWhoisResponse {
];
}
// QueryAuthoritiesRequest is request type to get all authorities
message QueryAuthoritiesRequest { string owner = 1; }
// QueryAuthoritiesResponse is response type for authorities request
message QueryAuthoritiesResponse {
repeated AuthorityEntry authorities = 1 [ (gogoproto.nullable) = false ];
// pagination defines the pagination in the response.
cosmos.base.query.v1beta1.PageResponse pagination = 2;
}
// QueryLookupLrnRequest is request type for LookupLrn
message QueryLookupLrnRequest { string lrn = 1; }

View File

@ -67,20 +67,11 @@ func (k *Keeper) ExportGenesis(ctx sdk.Context) (*registry.GenesisState, error)
return nil, err
}
authorities, err := k.ListNameAuthorityRecords(ctx)
authorityEntries, err := k.ListNameAuthorityRecords(ctx, "")
if err != nil {
return nil, err
}
authorityEntries := []registry.AuthorityEntry{}
// #nosec G705
for name, record := range authorities {
authorityEntries = append(authorityEntries, registry.AuthorityEntry{
Name: name,
Entry: &record, //nolint: all
}) // #nosec G601
}
names, err := k.ListNameRecords(ctx)
if err != nil {
return nil, err

View File

@ -41,19 +41,30 @@ func (k Keeper) GetNameAuthority(ctx sdk.Context, name string) (registrytypes.Na
return authority, nil
}
// ListNameAuthorityRecords - get all name authority records.
func (k Keeper) ListNameAuthorityRecords(ctx sdk.Context) (map[string]registrytypes.NameAuthority, error) {
nameAuthorityRecords := make(map[string]registrytypes.NameAuthority)
// ListNameAuthorityRecords - get all name authority records for given owner
// Returns all authorities if owner set to ""
func (k Keeper) ListNameAuthorityRecords(ctx sdk.Context, owner string) ([]registrytypes.AuthorityEntry, error) {
authorityEntries := []registrytypes.AuthorityEntry{}
err := k.Authorities.Walk(ctx, nil, func(key string, value registrytypes.NameAuthority) (bool, error) {
nameAuthorityRecords[key] = value
// If owner is not empty, skip if authority is not owned by owner
if owner != "" && owner != value.OwnerAddress {
return false, nil
}
authorityEntries = append(authorityEntries, registrytypes.AuthorityEntry{
Name: key,
Entry: &value,
})
// Continue the walk
return false, nil
})
if err != nil {
return map[string]registrytypes.NameAuthority{}, err
return []registrytypes.AuthorityEntry{}, err
}
return nameAuthorityRecords, nil
return authorityEntries, nil
}
// HasNameRecord - checks if a name record exists.

View File

@ -112,10 +112,10 @@ func (qs queryServer) NameRecords(c context.Context, _ *registrytypes.QueryNameR
return &registrytypes.QueryNameRecordsResponse{Names: nameRecords}, nil
}
func (qs queryServer) Whois(c context.Context, request *registrytypes.QueryWhoisRequest) (*registrytypes.QueryWhoisResponse, error) {
func (qs queryServer) Whois(c context.Context, req *registrytypes.QueryWhoisRequest) (*registrytypes.QueryWhoisResponse, error) {
ctx := sdk.UnwrapSDKContext(c)
nameAuthority, err := qs.k.GetNameAuthority(ctx, request.GetName())
nameAuthority, err := qs.k.GetNameAuthority(ctx, req.GetName())
if err != nil {
return nil, err
}
@ -123,6 +123,17 @@ func (qs queryServer) Whois(c context.Context, request *registrytypes.QueryWhois
return &registrytypes.QueryWhoisResponse{NameAuthority: nameAuthority}, nil
}
func (qs queryServer) Authorities(c context.Context, req *registrytypes.QueryAuthoritiesRequest) (*registrytypes.QueryAuthoritiesResponse, error) {
ctx := sdk.UnwrapSDKContext(c)
authorityEntries, err := qs.k.ListNameAuthorityRecords(ctx, req.GetOwner())
if err != nil {
return nil, err
}
return &registrytypes.QueryAuthoritiesResponse{Authorities: authorityEntries}, nil
}
func (qs queryServer) LookupLrn(c context.Context, req *registrytypes.QueryLookupLrnRequest) (*registrytypes.QueryLookupLrnResponse, error) {
ctx := sdk.UnwrapSDKContext(c)
lrn := req.GetLrn()

View File

@ -51,6 +51,18 @@ func (am AppModule) AutoCLIOptions() *autocliv1.ModuleOptions {
{ProtoField: "name"},
},
},
{
RpcMethod: "Authorities",
Use: "list-authorities",
Short: "List authorities (optionally by owner)",
FlagOptions: map[string]*autocliv1.FlagOptions{
"owner": {
Name: "owner",
Usage: "Owner to get the authorities for",
DefaultValue: "",
},
},
},
{
RpcMethod: "NameRecords",
Use: "names",

View File

@ -915,6 +915,105 @@ func (m *QueryWhoisResponse) GetNameAuthority() NameAuthority {
return NameAuthority{}
}
// QueryAuthoritiesRequest is request type to get all authorities
type QueryAuthoritiesRequest struct {
Owner string `protobuf:"bytes,1,opt,name=owner,proto3" json:"owner,omitempty"`
}
func (m *QueryAuthoritiesRequest) Reset() { *m = QueryAuthoritiesRequest{} }
func (m *QueryAuthoritiesRequest) String() string { return proto.CompactTextString(m) }
func (*QueryAuthoritiesRequest) ProtoMessage() {}
func (*QueryAuthoritiesRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_c642b96b6da07a30, []int{12}
}
func (m *QueryAuthoritiesRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *QueryAuthoritiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_QueryAuthoritiesRequest.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *QueryAuthoritiesRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryAuthoritiesRequest.Merge(m, src)
}
func (m *QueryAuthoritiesRequest) XXX_Size() int {
return m.Size()
}
func (m *QueryAuthoritiesRequest) XXX_DiscardUnknown() {
xxx_messageInfo_QueryAuthoritiesRequest.DiscardUnknown(m)
}
var xxx_messageInfo_QueryAuthoritiesRequest proto.InternalMessageInfo
func (m *QueryAuthoritiesRequest) GetOwner() string {
if m != nil {
return m.Owner
}
return ""
}
// QueryAuthoritiesResponse is response type for authorities request
type QueryAuthoritiesResponse struct {
Authorities []AuthorityEntry `protobuf:"bytes,1,rep,name=authorities,proto3" json:"authorities"`
// pagination defines the pagination in the response.
Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"`
}
func (m *QueryAuthoritiesResponse) Reset() { *m = QueryAuthoritiesResponse{} }
func (m *QueryAuthoritiesResponse) String() string { return proto.CompactTextString(m) }
func (*QueryAuthoritiesResponse) ProtoMessage() {}
func (*QueryAuthoritiesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_c642b96b6da07a30, []int{13}
}
func (m *QueryAuthoritiesResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *QueryAuthoritiesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_QueryAuthoritiesResponse.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *QueryAuthoritiesResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryAuthoritiesResponse.Merge(m, src)
}
func (m *QueryAuthoritiesResponse) XXX_Size() int {
return m.Size()
}
func (m *QueryAuthoritiesResponse) XXX_DiscardUnknown() {
xxx_messageInfo_QueryAuthoritiesResponse.DiscardUnknown(m)
}
var xxx_messageInfo_QueryAuthoritiesResponse proto.InternalMessageInfo
func (m *QueryAuthoritiesResponse) GetAuthorities() []AuthorityEntry {
if m != nil {
return m.Authorities
}
return nil
}
func (m *QueryAuthoritiesResponse) GetPagination() *query.PageResponse {
if m != nil {
return m.Pagination
}
return nil
}
// QueryLookupLrnRequest is request type for LookupLrn
type QueryLookupLrnRequest struct {
Lrn string `protobuf:"bytes,1,opt,name=lrn,proto3" json:"lrn,omitempty"`
@ -924,7 +1023,7 @@ func (m *QueryLookupLrnRequest) Reset() { *m = QueryLookupLrnRequest{} }
func (m *QueryLookupLrnRequest) String() string { return proto.CompactTextString(m) }
func (*QueryLookupLrnRequest) ProtoMessage() {}
func (*QueryLookupLrnRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_c642b96b6da07a30, []int{12}
return fileDescriptor_c642b96b6da07a30, []int{14}
}
func (m *QueryLookupLrnRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -969,7 +1068,7 @@ func (m *QueryLookupLrnResponse) Reset() { *m = QueryLookupLrnResponse{}
func (m *QueryLookupLrnResponse) String() string { return proto.CompactTextString(m) }
func (*QueryLookupLrnResponse) ProtoMessage() {}
func (*QueryLookupLrnResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_c642b96b6da07a30, []int{13}
return fileDescriptor_c642b96b6da07a30, []int{15}
}
func (m *QueryLookupLrnResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1014,7 +1113,7 @@ func (m *QueryResolveLrnRequest) Reset() { *m = QueryResolveLrnRequest{}
func (m *QueryResolveLrnRequest) String() string { return proto.CompactTextString(m) }
func (*QueryResolveLrnRequest) ProtoMessage() {}
func (*QueryResolveLrnRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_c642b96b6da07a30, []int{14}
return fileDescriptor_c642b96b6da07a30, []int{16}
}
func (m *QueryResolveLrnRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1059,7 +1158,7 @@ func (m *QueryResolveLrnResponse) Reset() { *m = QueryResolveLrnResponse
func (m *QueryResolveLrnResponse) String() string { return proto.CompactTextString(m) }
func (*QueryResolveLrnResponse) ProtoMessage() {}
func (*QueryResolveLrnResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_c642b96b6da07a30, []int{15}
return fileDescriptor_c642b96b6da07a30, []int{17}
}
func (m *QueryResolveLrnResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1104,7 +1203,7 @@ func (m *QueryGetRegistryModuleBalanceRequest) Reset() { *m = QueryGetRe
func (m *QueryGetRegistryModuleBalanceRequest) String() string { return proto.CompactTextString(m) }
func (*QueryGetRegistryModuleBalanceRequest) ProtoMessage() {}
func (*QueryGetRegistryModuleBalanceRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_c642b96b6da07a30, []int{16}
return fileDescriptor_c642b96b6da07a30, []int{18}
}
func (m *QueryGetRegistryModuleBalanceRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1143,7 +1242,7 @@ func (m *QueryGetRegistryModuleBalanceResponse) Reset() { *m = QueryGetR
func (m *QueryGetRegistryModuleBalanceResponse) String() string { return proto.CompactTextString(m) }
func (*QueryGetRegistryModuleBalanceResponse) ProtoMessage() {}
func (*QueryGetRegistryModuleBalanceResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_c642b96b6da07a30, []int{17}
return fileDescriptor_c642b96b6da07a30, []int{19}
}
func (m *QueryGetRegistryModuleBalanceResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1189,7 +1288,7 @@ func (m *AccountBalance) Reset() { *m = AccountBalance{} }
func (m *AccountBalance) String() string { return proto.CompactTextString(m) }
func (*AccountBalance) ProtoMessage() {}
func (*AccountBalance) Descriptor() ([]byte, []int) {
return fileDescriptor_c642b96b6da07a30, []int{18}
return fileDescriptor_c642b96b6da07a30, []int{20}
}
func (m *AccountBalance) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1250,6 +1349,8 @@ func init() {
proto.RegisterType((*QueryNameRecordsResponse)(nil), "cerc.registry.v1.QueryNameRecordsResponse")
proto.RegisterType((*QueryWhoisRequest)(nil), "cerc.registry.v1.QueryWhoisRequest")
proto.RegisterType((*QueryWhoisResponse)(nil), "cerc.registry.v1.QueryWhoisResponse")
proto.RegisterType((*QueryAuthoritiesRequest)(nil), "cerc.registry.v1.QueryAuthoritiesRequest")
proto.RegisterType((*QueryAuthoritiesResponse)(nil), "cerc.registry.v1.QueryAuthoritiesResponse")
proto.RegisterType((*QueryLookupLrnRequest)(nil), "cerc.registry.v1.QueryLookupLrnRequest")
proto.RegisterType((*QueryLookupLrnResponse)(nil), "cerc.registry.v1.QueryLookupLrnResponse")
proto.RegisterType((*QueryResolveLrnRequest)(nil), "cerc.registry.v1.QueryResolveLrnRequest")
@ -1262,88 +1363,93 @@ func init() {
func init() { proto.RegisterFile("cerc/registry/v1/query.proto", fileDescriptor_c642b96b6da07a30) }
var fileDescriptor_c642b96b6da07a30 = []byte{
// 1293 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x57, 0xcd, 0x6f, 0x1b, 0xc5,
0x1b, 0xf6, 0xda, 0xb1, 0xdd, 0xbc, 0xfe, 0xb5, 0xea, 0x6f, 0x08, 0xed, 0x76, 0x1b, 0x6c, 0xb3,
0xe4, 0xc3, 0x49, 0x94, 0xdd, 0x38, 0x91, 0xda, 0x2a, 0xe2, 0x40, 0x8c, 0x68, 0x5c, 0xfa, 0xa1,
0x74, 0x91, 0x8a, 0xc4, 0xa5, 0x1a, 0xdb, 0x8b, 0xb3, 0x64, 0x3d, 0xe3, 0xee, 0xae, 0xdd, 0x9a,
0xa8, 0x12, 0x42, 0xd0, 0x33, 0x88, 0x13, 0x82, 0x23, 0x27, 0x84, 0xf8, 0x3b, 0x2a, 0x71, 0xa9,
0xc4, 0x85, 0x53, 0x40, 0x09, 0x17, 0xae, 0x85, 0x3f, 0x00, 0xed, 0xcc, 0xac, 0xbd, 0x6b, 0x67,
0x63, 0x27, 0x02, 0x89, 0x93, 0x77, 0x67, 0x9f, 0xf7, 0x7d, 0x9e, 0x79, 0xbf, 0x66, 0x0c, 0xb3,
0x75, 0xd3, 0xa9, 0xeb, 0x8e, 0xd9, 0xb4, 0x5c, 0xcf, 0xe9, 0xe9, 0xdd, 0xb2, 0xfe, 0xa8, 0x63,
0x3a, 0x3d, 0xad, 0xed, 0x50, 0x8f, 0xa2, 0x8b, 0xfe, 0x57, 0x2d, 0xf8, 0xaa, 0x75, 0xcb, 0xca,
0x6c, 0x93, 0xd2, 0xa6, 0x6d, 0xea, 0xb8, 0x6d, 0xe9, 0x98, 0x10, 0xea, 0x61, 0xcf, 0xa2, 0xc4,
0xe5, 0x78, 0x65, 0xb9, 0x4e, 0xdd, 0x16, 0x75, 0xf5, 0x1a, 0x76, 0x4d, 0xee, 0x48, 0xef, 0x96,
0x6b, 0xa6, 0x87, 0xcb, 0x7a, 0x1b, 0x37, 0x2d, 0xc2, 0xc0, 0x02, 0x3b, 0xd3, 0xa4, 0x4d, 0xca,
0x1e, 0x75, 0xff, 0x49, 0xac, 0xe6, 0xc3, 0x1e, 0x02, 0xdb, 0x3a, 0xb5, 0x02, 0xab, 0xc2, 0x88,
0xde, 0xbe, 0x3a, 0x06, 0x50, 0x67, 0x00, 0xdd, 0xf7, 0x89, 0x77, 0xb0, 0x83, 0x5b, 0xae, 0x61,
0x3e, 0xea, 0x98, 0xae, 0xa7, 0x6e, 0xc3, 0x2b, 0x91, 0x55, 0xb7, 0x4d, 0x89, 0x6b, 0xa2, 0x35,
0xc8, 0xb4, 0xd9, 0x8a, 0x2c, 0x15, 0xa5, 0x52, 0x6e, 0x5d, 0xd6, 0x86, 0x37, 0xac, 0x09, 0x0b,
0x81, 0x53, 0xff, 0xcc, 0x08, 0x4f, 0x86, 0x59, 0xa7, 0x4e, 0x23, 0x20, 0x40, 0xef, 0x01, 0x60,
0xcf, 0x73, 0xac, 0x5a, 0xc7, 0x33, 0x7d, 0x6f, 0xa9, 0x52, 0x6e, 0x7d, 0x63, 0xd4, 0xdb, 0x31,
0xa6, 0xda, 0x6d, 0xb3, 0xf7, 0x00, 0xdb, 0x1d, 0xf3, 0x16, 0x69, 0x77, 0x3c, 0x23, 0xe4, 0x06,
0x5d, 0x84, 0x14, 0xb6, 0x6d, 0x39, 0x59, 0x94, 0x4a, 0xe7, 0x0c, 0xff, 0x11, 0xdd, 0x04, 0x18,
0x04, 0x52, 0x4e, 0x31, 0xd1, 0x0b, 0x1a, 0x8f, 0x99, 0xe6, 0xc7, 0x4c, 0xe3, 0xe9, 0x13, 0x91,
0xd3, 0x76, 0x70, 0xd3, 0x14, 0x3c, 0x46, 0xc8, 0x52, 0x79, 0x00, 0xb0, 0xe5, 0x38, 0xb8, 0xc7,
0x38, 0x51, 0x15, 0x32, 0x5d, 0x5f, 0x41, 0x20, 0x7c, 0x6d, 0x32, 0xe1, 0x21, 0xd5, 0xc2, 0x5e,
0xf9, 0x49, 0x82, 0x73, 0x77, 0x71, 0x9b, 0xbb, 0x35, 0x86, 0xdc, 0x6e, 0x4e, 0xe6, 0x36, 0xb0,
0xe7, 0xfe, 0xdd, 0x77, 0x88, 0xe7, 0xf4, 0xfa, 0x04, 0x7b, 0x90, 0x0b, 0x2d, 0xfb, 0x11, 0xda,
0x33, 0x7b, 0x2c, 0x7b, 0xd3, 0x86, 0xff, 0x88, 0x6e, 0x42, 0x9a, 0x41, 0x59, 0xd4, 0xce, 0xb2,
0x15, 0x6e, 0xbe, 0x99, 0xbc, 0x21, 0x29, 0xdf, 0x24, 0x01, 0x06, 0x5f, 0x90, 0x0c, 0x19, 0xd7,
0x73, 0x2c, 0xd2, 0xe4, 0x7c, 0xd5, 0x84, 0x21, 0xde, 0x11, 0x82, 0x94, 0x45, 0x3c, 0x46, 0x99,
0xaa, 0x26, 0x0c, 0xff, 0x05, 0x5d, 0x82, 0xf4, 0x87, 0x36, 0xc5, 0x1e, 0xcb, 0x92, 0x54, 0x4d,
0x18, 0xfc, 0x15, 0x29, 0x90, 0xad, 0x51, 0x6a, 0x9b, 0x98, 0xc8, 0x53, 0x7e, 0x62, 0xab, 0x09,
0x23, 0x58, 0x40, 0x33, 0x30, 0x65, 0x5b, 0x64, 0x4f, 0x4e, 0x0b, 0xff, 0xec, 0x0d, 0x55, 0x21,
0x8d, 0xfd, 0x64, 0xc9, 0x99, 0xd3, 0x6c, 0x69, 0x90, 0x5f, 0x9f, 0x9b, 0x39, 0x40, 0x15, 0x48,
0xb5, 0x70, 0x5b, 0xce, 0x32, 0x3f, 0xda, 0xe9, 0xd2, 0xe1, 0xef, 0xab, 0x85, 0xdb, 0x95, 0xac,
0x08, 0xb0, 0x62, 0xc1, 0xf9, 0x48, 0xe9, 0xfe, 0x7b, 0xc9, 0x50, 0xbf, 0x96, 0x60, 0x26, 0x8a,
0x14, 0x0d, 0x7c, 0x03, 0xb2, 0x0e, 0x5f, 0x12, 0x35, 0x76, 0x4c, 0x07, 0x73, 0x9b, 0xca, 0xd4,
0xf3, 0x83, 0x42, 0xc2, 0x08, 0xe0, 0x68, 0x3b, 0xd2, 0x49, 0x5c, 0xdf, 0xe2, 0xd8, 0x4e, 0xe2,
0xb4, 0xe1, 0x56, 0x52, 0x17, 0xe1, 0x55, 0x26, 0x6d, 0xdb, 0xf4, 0x38, 0x53, 0x30, 0x12, 0x2e,
0x40, 0xd2, 0x6a, 0x88, 0x68, 0x24, 0xad, 0x86, 0xba, 0x03, 0x97, 0x86, 0x81, 0x62, 0x17, 0xd7,
0x20, 0xc3, 0x65, 0xc5, 0x8f, 0xa1, 0xc8, 0x26, 0x04, 0x5a, 0x7d, 0x02, 0xf9, 0xa8, 0x47, 0xb7,
0xd2, 0xab, 0x50, 0xd2, 0xb8, 0x15, 0xa7, 0x61, 0x68, 0x7e, 0x24, 0xcf, 0x3a, 0x3f, 0xd4, 0xef,
0x24, 0x28, 0xc4, 0x52, 0xff, 0x77, 0x72, 0x83, 0xe1, 0x32, 0x53, 0x79, 0x0f, 0xb7, 0xcc, 0xa1,
0x81, 0x1d, 0x8d, 0x84, 0x74, 0xe6, 0x48, 0x7c, 0x2b, 0x81, 0x3c, 0xca, 0x21, 0x42, 0x70, 0x1d,
0xd2, 0x04, 0xb7, 0xfa, 0x03, 0xf0, 0xea, 0x68, 0x00, 0x7c, 0x2b, 0x36, 0xca, 0x44, 0x0c, 0x38,
0xfe, 0x9f, 0xac, 0xce, 0xff, 0x33, 0x75, 0xef, 0xef, 0x52, 0xab, 0xbf, 0x77, 0x04, 0x53, 0x3e,
0x8d, 0xa8, 0x0b, 0xf6, 0xac, 0x7e, 0x29, 0x89, 0x83, 0x53, 0x20, 0xc5, 0x0e, 0xf6, 0xe1, 0x82,
0xff, 0xf9, 0x21, 0xee, 0x78, 0xbb, 0xd4, 0xb1, 0xbc, 0x9e, 0x08, 0x55, 0xe1, 0xf8, 0xad, 0x6c,
0x05, 0xb0, 0xca, 0x86, 0xbf, 0x9d, 0x97, 0x07, 0x85, 0x95, 0x8f, 0x5c, 0x4a, 0x36, 0xd5, 0xa8,
0x13, 0xb5, 0xd8, 0xc3, 0x2d, 0x7b, 0x64, 0xd5, 0x38, 0x4f, 0xc2, 0x3e, 0xd4, 0x25, 0xd1, 0x5a,
0x77, 0x28, 0xdd, 0xeb, 0xb4, 0xef, 0x38, 0x24, 0xd8, 0xc0, 0x45, 0x48, 0xd9, 0x0e, 0x09, 0x26,
0x8d, 0xed, 0x10, 0xf5, 0x5d, 0xd1, 0x5c, 0x21, 0x68, 0xff, 0x8c, 0x1f, 0x6c, 0x36, 0xb7, 0x3e,
0x7b, 0xbc, 0x6e, 0xd1, 0x90, 0x3c, 0x14, 0xcb, 0xc2, 0x97, 0x61, 0xba, 0xd4, 0xee, 0x9a, 0x27,
0xf2, 0xde, 0x16, 0x15, 0x16, 0xc6, 0x0e, 0x2e, 0x17, 0x93, 0x75, 0x75, 0xbf, 0x9f, 0x17, 0x60,
0x6e, 0xd0, 0x54, 0x1c, 0x75, 0x97, 0x36, 0x3a, 0xb6, 0x59, 0xc1, 0x36, 0x26, 0xf5, 0xa0, 0xfe,
0x54, 0x13, 0xe6, 0xc7, 0xe0, 0x84, 0x84, 0x37, 0xe1, 0x5c, 0x8d, 0x2f, 0x05, 0x25, 0x58, 0x1c,
0x15, 0xb1, 0x55, 0xaf, 0xd3, 0x0e, 0xf1, 0x02, 0xdb, 0xbe, 0x85, 0xfa, 0x87, 0x04, 0x17, 0xa2,
0x1f, 0xd1, 0x3d, 0xf8, 0x1f, 0xe6, 0x2b, 0x0f, 0x07, 0x15, 0x54, 0x59, 0x79, 0x79, 0x50, 0x58,
0xe4, 0x79, 0x0e, 0x7f, 0x0d, 0xb2, 0x1c, 0x59, 0x33, 0x72, 0xe2, 0xd5, 0x0f, 0x3b, 0x7a, 0x26,
0x41, 0x56, 0xf0, 0xc9, 0x29, 0x26, 0xf0, 0x4a, 0xa4, 0xca, 0x83, 0xfa, 0x7e, 0x9b, 0x5a, 0xa4,
0x72, 0x5f, 0x94, 0xd4, 0x6b, 0x9c, 0x4a, 0xd8, 0x05, 0x2c, 0xc1, 0xeb, 0xf7, 0xbf, 0x16, 0x4a,
0x4d, 0xcb, 0xdb, 0xed, 0xd4, 0xb4, 0x3a, 0x6d, 0xe9, 0xe2, 0x3e, 0xc9, 0x7f, 0x56, 0xdd, 0xc6,
0x9e, 0xee, 0xf5, 0xda, 0xa6, 0xcb, 0x3c, 0xba, 0x46, 0x40, 0xbe, 0xfe, 0xd7, 0x34, 0xa4, 0x59,
0x4c, 0xd1, 0x63, 0xc8, 0xf0, 0x3b, 0x1f, 0x9a, 0x8b, 0x39, 0xae, 0x22, 0x57, 0x4b, 0x65, 0x7e,
0x0c, 0x8a, 0xa7, 0x42, 0x2d, 0x7e, 0xfa, 0xf3, 0xef, 0x5f, 0x25, 0x15, 0x24, 0xeb, 0x23, 0x37,
0x58, 0x7e, 0xb5, 0x44, 0xfb, 0x90, 0x15, 0xf3, 0x03, 0xcd, 0x4f, 0x74, 0x50, 0x2a, 0x0b, 0xe3,
0x60, 0x82, 0xfb, 0x75, 0xc6, 0x7d, 0x15, 0x5d, 0xd1, 0x8f, 0xb9, 0x3d, 0x73, 0xc6, 0x67, 0x12,
0x4c, 0xf7, 0x67, 0x39, 0x5a, 0x8c, 0x71, 0x3c, 0x7c, 0xc6, 0x29, 0xa5, 0xf1, 0x40, 0xa1, 0x61,
0x81, 0x69, 0x28, 0xa2, 0x7c, 0xac, 0x06, 0x7d, 0xdf, 0x6a, 0x3c, 0x45, 0x3f, 0x48, 0x80, 0x46,
0x0f, 0x15, 0xb4, 0x36, 0x8e, 0x68, 0xf8, 0xe8, 0x53, 0xca, 0xa7, 0xb0, 0x10, 0x1a, 0xcb, 0x4c,
0xe3, 0x0a, 0x5a, 0x8a, 0xd5, 0xb8, 0x5a, 0xeb, 0xad, 0xd6, 0x28, 0x69, 0xac, 0x5a, 0x0d, 0x2e,
0xf7, 0x73, 0x09, 0x72, 0xa1, 0xc9, 0x8f, 0x96, 0x62, 0x58, 0x47, 0x4f, 0x20, 0x65, 0x79, 0x12,
0xa8, 0x50, 0x56, 0x60, 0xca, 0xae, 0xa0, 0xcb, 0xa3, 0xca, 0xf8, 0x81, 0xf1, 0x31, 0xa4, 0xd9,
0xe0, 0x46, 0x6f, 0xc4, 0x78, 0x0d, 0x1f, 0x00, 0xca, 0xdc, 0xc9, 0xa0, 0xf1, 0x29, 0x7b, 0xec,
0x03, 0xf5, 0x7d, 0x9f, 0xfb, 0x29, 0xfa, 0x44, 0x82, 0xe9, 0xfe, 0xdc, 0x8d, 0xad, 0x9d, 0xe1,
0x21, 0x1e, 0x5b, 0x3b, 0x23, 0x23, 0xfc, 0xa4, 0xde, 0xb1, 0x19, 0x18, 0x7d, 0x26, 0x01, 0x0c,
0x46, 0x30, 0x2a, 0xc5, 0x36, 0xc6, 0xd0, 0x44, 0x57, 0x96, 0x26, 0x40, 0x4e, 0xd2, 0x45, 0x0c,
0x8d, 0x7e, 0x94, 0x40, 0x8e, 0x1b, 0xca, 0xe8, 0xda, 0x49, 0x05, 0x19, 0x3f, 0xed, 0x95, 0xeb,
0xa7, 0xb6, 0x1b, 0x2f, 0x58, 0x8c, 0xbd, 0xca, 0x5b, 0xcf, 0x0f, 0xf3, 0xd2, 0x8b, 0xc3, 0xbc,
0xf4, 0xdb, 0x61, 0x5e, 0xfa, 0xe2, 0x28, 0x9f, 0x78, 0x71, 0x94, 0x4f, 0xfc, 0x72, 0x94, 0x4f,
0x7c, 0xb0, 0xd0, 0xb4, 0x3c, 0xad, 0xdb, 0xa8, 0x69, 0x1e, 0x65, 0xe6, 0xab, 0x16, 0xd5, 0x6d,
0x5c, 0xa7, 0xc4, 0xaa, 0x37, 0xf4, 0x27, 0x7d, 0x67, 0xb5, 0x0c, 0xfb, 0xdb, 0xbd, 0xf1, 0x77,
0x00, 0x00, 0x00, 0xff, 0xff, 0xd9, 0x85, 0x36, 0x9d, 0x49, 0x10, 0x00, 0x00,
// 1366 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0xcf, 0x8f, 0xd3, 0xc6,
0x17, 0x8f, 0x93, 0x4d, 0x16, 0x5e, 0xbe, 0x20, 0xbe, 0xd3, 0x2d, 0x18, 0x03, 0xc9, 0xd6, 0x65,
0x77, 0xb3, 0xa0, 0xb5, 0xc9, 0x22, 0x01, 0x42, 0x3d, 0x94, 0x54, 0x85, 0x50, 0x7e, 0x08, 0x5c,
0x89, 0x4a, 0xbd, 0xa0, 0x49, 0x32, 0x0d, 0xee, 0x3a, 0x33, 0xc1, 0x76, 0x02, 0xe9, 0x0a, 0xa9,
0x42, 0x2d, 0x97, 0x5e, 0x5a, 0xf5, 0x54, 0xb5, 0xc7, 0x9e, 0xaa, 0xb6, 0x7f, 0x07, 0x52, 0x2f,
0x48, 0xbd, 0xf4, 0x44, 0x2b, 0xe8, 0xa5, 0x57, 0xfa, 0x0f, 0x54, 0x9e, 0x19, 0x3b, 0x76, 0x1c,
0x6f, 0xb2, 0x88, 0x4a, 0x3d, 0xad, 0x3d, 0xfe, 0xbc, 0xf7, 0xf9, 0xbc, 0x1f, 0xf3, 0x66, 0x36,
0x70, 0xb4, 0x4d, 0xdc, 0xb6, 0xe9, 0x92, 0xae, 0xed, 0xf9, 0xee, 0xc8, 0x1c, 0xd6, 0xcd, 0xbb,
0x03, 0xe2, 0x8e, 0x8c, 0xbe, 0xcb, 0x7c, 0x86, 0x0e, 0x04, 0x5f, 0x8d, 0xf0, 0xab, 0x31, 0xac,
0x6b, 0x47, 0xbb, 0x8c, 0x75, 0x1d, 0x62, 0xe2, 0xbe, 0x6d, 0x62, 0x4a, 0x99, 0x8f, 0x7d, 0x9b,
0x51, 0x4f, 0xe0, 0xb5, 0x13, 0x6d, 0xe6, 0xf5, 0x98, 0x67, 0xb6, 0xb0, 0x47, 0x84, 0x23, 0x73,
0x58, 0x6f, 0x11, 0x1f, 0xd7, 0xcd, 0x3e, 0xee, 0xda, 0x94, 0x83, 0x25, 0x76, 0xa9, 0xcb, 0xba,
0x8c, 0x3f, 0x9a, 0xc1, 0x93, 0x5c, 0xad, 0xc4, 0x3d, 0x84, 0xb6, 0x6d, 0x66, 0x87, 0x56, 0xd5,
0x94, 0xde, 0x48, 0x1d, 0x07, 0xe8, 0x4b, 0x80, 0x6e, 0x06, 0xc4, 0x37, 0xb0, 0x8b, 0x7b, 0x9e,
0x45, 0xee, 0x0e, 0x88, 0xe7, 0xeb, 0x97, 0xe0, 0xb5, 0xc4, 0xaa, 0xd7, 0x67, 0xd4, 0x23, 0xe8,
0x14, 0x94, 0xfa, 0x7c, 0x45, 0x55, 0x96, 0x95, 0x5a, 0x79, 0x53, 0x35, 0x26, 0x03, 0x36, 0xa4,
0x85, 0xc4, 0xe9, 0x7f, 0x97, 0xa4, 0x27, 0x8b, 0xb4, 0x99, 0xdb, 0x09, 0x09, 0xd0, 0xfb, 0x00,
0xd8, 0xf7, 0x5d, 0xbb, 0x35, 0xf0, 0x49, 0xe0, 0xad, 0x50, 0x2b, 0x6f, 0x9e, 0x4e, 0x7b, 0x9b,
0x62, 0x6a, 0x5c, 0x21, 0xa3, 0x5b, 0xd8, 0x19, 0x90, 0xcb, 0xb4, 0x3f, 0xf0, 0xad, 0x98, 0x1b,
0x74, 0x00, 0x0a, 0xd8, 0x71, 0xd4, 0xfc, 0xb2, 0x52, 0xdb, 0x63, 0x05, 0x8f, 0xe8, 0x22, 0xc0,
0x38, 0x91, 0x6a, 0x81, 0x8b, 0x5e, 0x35, 0x44, 0xce, 0x8c, 0x20, 0x67, 0x86, 0x28, 0x9f, 0xcc,
0x9c, 0x71, 0x03, 0x77, 0x89, 0xe4, 0xb1, 0x62, 0x96, 0xda, 0x2d, 0x80, 0x0b, 0xae, 0x8b, 0x47,
0x9c, 0x13, 0x35, 0xa1, 0x34, 0x0c, 0x14, 0x84, 0xc2, 0x4f, 0xcd, 0x27, 0x3c, 0xa6, 0x5a, 0xda,
0x6b, 0xbf, 0x28, 0xb0, 0xe7, 0x1a, 0xee, 0x0b, 0xb7, 0xd6, 0x84, 0xdb, 0xf3, 0xf3, 0xb9, 0x0d,
0xed, 0x85, 0x7f, 0xef, 0x5d, 0xea, 0xbb, 0xa3, 0x88, 0x60, 0x0b, 0xca, 0xb1, 0xe5, 0x20, 0x43,
0x5b, 0x64, 0xc4, 0xab, 0xb7, 0xd7, 0x0a, 0x1e, 0xd1, 0x45, 0x28, 0x72, 0x28, 0xcf, 0xda, 0xcb,
0x84, 0x22, 0xcc, 0xcf, 0xe7, 0xcf, 0x29, 0xda, 0xb7, 0x79, 0x80, 0xf1, 0x17, 0xa4, 0x42, 0xc9,
0xf3, 0x5d, 0x9b, 0x76, 0x05, 0x5f, 0x33, 0x67, 0xc9, 0x77, 0x84, 0xa0, 0x60, 0x53, 0x9f, 0x53,
0x16, 0x9a, 0x39, 0x2b, 0x78, 0x41, 0x07, 0xa1, 0xf8, 0x91, 0xc3, 0xb0, 0xcf, 0xab, 0xa4, 0x34,
0x73, 0x96, 0x78, 0x45, 0x1a, 0x2c, 0xb6, 0x18, 0x73, 0x08, 0xa6, 0xea, 0x42, 0x50, 0xd8, 0x66,
0xce, 0x0a, 0x17, 0xd0, 0x12, 0x2c, 0x38, 0x36, 0xdd, 0x52, 0x8b, 0xd2, 0x3f, 0x7f, 0x43, 0x4d,
0x28, 0xe2, 0xa0, 0x58, 0x6a, 0x69, 0x37, 0x21, 0x8d, 0xeb, 0x1b, 0x70, 0x73, 0x07, 0xa8, 0x01,
0x85, 0x1e, 0xee, 0xab, 0x8b, 0xdc, 0x8f, 0xb1, 0xbb, 0x72, 0x04, 0x71, 0xf5, 0x70, 0xbf, 0xb1,
0x28, 0x13, 0xac, 0xd9, 0xb0, 0x2f, 0xd1, 0xba, 0xff, 0x5e, 0x31, 0xf4, 0x6f, 0x14, 0x58, 0x4a,
0x22, 0xe5, 0x06, 0x3e, 0x07, 0x8b, 0xae, 0x58, 0x92, 0x3d, 0x36, 0x65, 0x07, 0x0b, 0x9b, 0xc6,
0xc2, 0xe3, 0xa7, 0xd5, 0x9c, 0x15, 0xc2, 0xd1, 0xa5, 0xc4, 0x4e, 0x12, 0xfa, 0xd6, 0x66, 0xee,
0x24, 0x41, 0x1b, 0xdf, 0x4a, 0xfa, 0x1a, 0xbc, 0xce, 0xa5, 0x5d, 0x22, 0xbe, 0x60, 0x0a, 0x47,
0xc2, 0x7e, 0xc8, 0xdb, 0x1d, 0x99, 0x8d, 0xbc, 0xdd, 0xd1, 0x6f, 0xc0, 0xc1, 0x49, 0xa0, 0x8c,
0xe2, 0x0c, 0x94, 0x84, 0xac, 0xec, 0x31, 0x94, 0x08, 0x42, 0xa2, 0xf5, 0xfb, 0x50, 0x49, 0x7a,
0xf4, 0x1a, 0xa3, 0x06, 0xa3, 0x9d, 0xcb, 0x59, 0x1a, 0x26, 0xe6, 0x47, 0xfe, 0x65, 0xe7, 0x87,
0xfe, 0xbd, 0x02, 0xd5, 0x4c, 0xea, 0xff, 0x4e, 0x6d, 0x30, 0x1c, 0xe2, 0x2a, 0xaf, 0xe3, 0x1e,
0x99, 0x18, 0xd8, 0xc9, 0x4c, 0x28, 0x2f, 0x9d, 0x89, 0xef, 0x14, 0x50, 0xd3, 0x1c, 0x32, 0x05,
0x67, 0xa1, 0x48, 0x71, 0x2f, 0x1a, 0x80, 0x47, 0xd2, 0x09, 0x08, 0xac, 0xf8, 0x28, 0x93, 0x39,
0x10, 0xf8, 0x57, 0xd9, 0x9d, 0xff, 0xe7, 0xea, 0x3e, 0xb8, 0xc3, 0xec, 0x28, 0x76, 0x04, 0x0b,
0x01, 0x8d, 0xec, 0x0b, 0xfe, 0xac, 0x7f, 0xa5, 0xc8, 0x83, 0x53, 0x22, 0x65, 0x04, 0xdb, 0xb0,
0x3f, 0xf8, 0x7c, 0x1b, 0x0f, 0xfc, 0x3b, 0xcc, 0xb5, 0xfd, 0x91, 0x4c, 0x55, 0x75, 0x7a, 0x28,
0x17, 0x42, 0x58, 0xe3, 0x74, 0x10, 0xce, 0x8b, 0xa7, 0xd5, 0x93, 0x1f, 0x7b, 0x8c, 0x9e, 0xd7,
0x93, 0x4e, 0xf4, 0xe5, 0x11, 0xee, 0x39, 0xa9, 0x55, 0x6b, 0x1f, 0x8d, 0xfb, 0xd0, 0x4d, 0x59,
0xbe, 0x70, 0xc5, 0x26, 0x51, 0x08, 0x4b, 0x50, 0x64, 0xf7, 0x28, 0x71, 0x65, 0x0c, 0xe2, 0x45,
0xff, 0x29, 0x2c, 0x46, 0xc2, 0x42, 0x86, 0xd2, 0x84, 0x32, 0x1e, 0x2f, 0xcb, 0x92, 0x2c, 0xa7,
0xe3, 0x88, 0xf8, 0xe3, 0x75, 0x89, 0x9b, 0xbe, 0xba, 0xea, 0xac, 0xcb, 0xd9, 0x71, 0x95, 0xb1,
0xad, 0x41, 0xff, 0xaa, 0x4b, 0xc3, 0xf0, 0x0e, 0x40, 0xc1, 0x71, 0x69, 0x38, 0x4a, 0x1d, 0x97,
0xea, 0xef, 0xc9, 0xe9, 0x11, 0x83, 0x46, 0x97, 0x98, 0x71, 0x35, 0xcb, 0x9b, 0x47, 0xa7, 0x17,
0x46, 0x4e, 0x1c, 0x51, 0xeb, 0x13, 0xd2, 0x97, 0x45, 0x3c, 0xe6, 0x0c, 0xc9, 0x8e, 0xbc, 0x57,
0x64, 0x0d, 0xe2, 0xd8, 0xf1, 0xed, 0x69, 0xbe, 0xb1, 0x15, 0x0d, 0xac, 0x55, 0x38, 0x3e, 0x9e,
0x1a, 0x02, 0x75, 0x8d, 0x75, 0x06, 0x0e, 0x69, 0x60, 0x07, 0xd3, 0x76, 0xb8, 0xc1, 0x74, 0x02,
0x2b, 0x33, 0x70, 0x52, 0xc2, 0x5b, 0xb0, 0xa7, 0x25, 0x96, 0x76, 0x2a, 0x68, 0xbb, 0xcd, 0x06,
0xd4, 0x0f, 0x6d, 0x23, 0x0b, 0xfd, 0x2f, 0x05, 0xf6, 0x27, 0x3f, 0xa2, 0xeb, 0xf0, 0x3f, 0x2c,
0x56, 0x6e, 0x8f, 0xb7, 0x48, 0xe3, 0xe4, 0x8b, 0xa7, 0xd5, 0x35, 0xd1, 0xc8, 0xf1, 0xaf, 0x61,
0x1b, 0x27, 0xd6, 0xac, 0xb2, 0x7c, 0x0d, 0xd2, 0x8e, 0x1e, 0x29, 0xb0, 0x28, 0xf9, 0xd4, 0x02,
0x17, 0x78, 0x38, 0xd1, 0x28, 0x61, 0x8b, 0xbc, 0xc3, 0x6c, 0xda, 0xb8, 0x29, 0xf7, 0xcc, 0x31,
0x41, 0x25, 0xed, 0x42, 0x96, 0xf0, 0xf5, 0x87, 0xdf, 0xab, 0xb5, 0xae, 0xed, 0xdf, 0x19, 0xb4,
0x8c, 0x36, 0xeb, 0x99, 0xf2, 0xc2, 0x2c, 0xfe, 0x6c, 0x78, 0x9d, 0x2d, 0xd3, 0x1f, 0xf5, 0x89,
0xc7, 0x3d, 0x7a, 0x56, 0x48, 0xbe, 0xf9, 0xb0, 0x0c, 0x45, 0x9e, 0x53, 0x74, 0x0f, 0x4a, 0xe2,
0x52, 0x8b, 0x8e, 0x67, 0x9c, 0xc7, 0x89, 0xbb, 0xb3, 0xb6, 0x32, 0x03, 0x25, 0x4a, 0xa1, 0x2f,
0x3f, 0xfc, 0xf5, 0xcf, 0xaf, 0xf3, 0x1a, 0x52, 0xcd, 0xd4, 0x15, 0x5d, 0xdc, 0x9d, 0xd1, 0x36,
0x2c, 0xca, 0x01, 0x89, 0x56, 0xe6, 0xba, 0x09, 0x68, 0xab, 0xb3, 0x60, 0x92, 0xfb, 0x0d, 0xce,
0x7d, 0x04, 0x1d, 0x36, 0xa7, 0xfc, 0x7b, 0x20, 0x18, 0x1f, 0x29, 0xb0, 0x37, 0x3a, 0xac, 0xd0,
0x5a, 0x86, 0xe3, 0xc9, 0x43, 0x5c, 0xab, 0xcd, 0x06, 0x4a, 0x0d, 0xab, 0x5c, 0xc3, 0x32, 0xaa,
0x64, 0x6a, 0x30, 0xb7, 0xed, 0xce, 0x03, 0xf4, 0xa3, 0x02, 0x28, 0x7d, 0x6a, 0xa2, 0x53, 0xb3,
0x88, 0x26, 0xcf, 0x76, 0xad, 0xbe, 0x0b, 0x0b, 0xa9, 0xb1, 0xce, 0x35, 0x9e, 0x44, 0xeb, 0x99,
0x1a, 0x37, 0x5a, 0xa3, 0x8d, 0x16, 0xa3, 0x9d, 0x0d, 0xbb, 0x23, 0xe4, 0x7e, 0xae, 0x40, 0x39,
0x76, 0xb4, 0xa1, 0xf5, 0x0c, 0xd6, 0xf4, 0x11, 0xab, 0x9d, 0x98, 0x07, 0x2a, 0x95, 0x55, 0xb9,
0xb2, 0xc3, 0xe8, 0x50, 0x5a, 0x99, 0x38, 0x11, 0x3f, 0x81, 0x22, 0x3f, 0x99, 0xd0, 0x9b, 0x19,
0x5e, 0xe3, 0x27, 0x9c, 0x76, 0x7c, 0x67, 0xd0, 0xec, 0x92, 0xdd, 0x0b, 0x80, 0xe6, 0x76, 0xc0,
0xfd, 0x00, 0x7d, 0xaa, 0xc0, 0xde, 0x68, 0xee, 0x66, 0xf6, 0xce, 0xe4, 0x10, 0xcf, 0xec, 0x9d,
0xd4, 0x08, 0xdf, 0x69, 0xef, 0x38, 0x1c, 0x8c, 0x3e, 0x53, 0x00, 0xc6, 0x23, 0x18, 0xd5, 0x32,
0x37, 0xc6, 0xc4, 0x44, 0xd7, 0xd6, 0xe7, 0x40, 0xce, 0xb3, 0x8b, 0x38, 0x1a, 0xfd, 0xac, 0x80,
0x9a, 0x35, 0x94, 0xd1, 0x99, 0x9d, 0x1a, 0x32, 0x7b, 0xda, 0x6b, 0x67, 0x77, 0x6d, 0x37, 0x5b,
0xb0, 0x1c, 0x7b, 0xe8, 0x0b, 0x05, 0xca, 0xb1, 0xcb, 0x40, 0x66, 0xfb, 0xa6, 0xaf, 0x18, 0x99,
0xed, 0x3b, 0xe5, 0x6e, 0xa1, 0xaf, 0x70, 0x25, 0x55, 0x74, 0x2c, 0xad, 0x24, 0x76, 0x71, 0x68,
0xbc, 0xfd, 0xf8, 0x59, 0x45, 0x79, 0xf2, 0xac, 0xa2, 0xfc, 0xf1, 0xac, 0xa2, 0x7c, 0xf9, 0xbc,
0x92, 0x7b, 0xf2, 0xbc, 0x92, 0xfb, 0xed, 0x79, 0x25, 0xf7, 0xe1, 0x6a, 0xd7, 0xf6, 0x8d, 0x61,
0xa7, 0x65, 0xf8, 0x8c, 0xbb, 0xd8, 0xb0, 0x99, 0xe9, 0xe0, 0x36, 0xa3, 0x76, 0xbb, 0x63, 0xde,
0x8f, 0x1c, 0xb6, 0x4a, 0xfc, 0x57, 0x8e, 0xd3, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x4e, 0x7a,
0x2b, 0x91, 0xb8, 0x11, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -1376,6 +1482,8 @@ type QueryClient interface {
ResolveLrn(ctx context.Context, in *QueryResolveLrnRequest, opts ...grpc.CallOption) (*QueryResolveLrnResponse, error)
// Get registry module balance
GetRegistryModuleBalance(ctx context.Context, in *QueryGetRegistryModuleBalanceRequest, opts ...grpc.CallOption) (*QueryGetRegistryModuleBalanceResponse, error)
// Authorities queries all authorities
Authorities(ctx context.Context, in *QueryAuthoritiesRequest, opts ...grpc.CallOption) (*QueryAuthoritiesResponse, error)
}
type queryClient struct {
@ -1467,6 +1575,15 @@ func (c *queryClient) GetRegistryModuleBalance(ctx context.Context, in *QueryGet
return out, nil
}
func (c *queryClient) Authorities(ctx context.Context, in *QueryAuthoritiesRequest, opts ...grpc.CallOption) (*QueryAuthoritiesResponse, error) {
out := new(QueryAuthoritiesResponse)
err := c.cc.Invoke(ctx, "/cerc.registry.v1.Query/Authorities", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// QueryServer is the server API for Query service.
type QueryServer interface {
// Params queries the registry module params.
@ -1487,6 +1604,8 @@ type QueryServer interface {
ResolveLrn(context.Context, *QueryResolveLrnRequest) (*QueryResolveLrnResponse, error)
// Get registry module balance
GetRegistryModuleBalance(context.Context, *QueryGetRegistryModuleBalanceRequest) (*QueryGetRegistryModuleBalanceResponse, error)
// Authorities queries all authorities
Authorities(context.Context, *QueryAuthoritiesRequest) (*QueryAuthoritiesResponse, error)
}
// UnimplementedQueryServer can be embedded to have forward compatible implementations.
@ -1520,6 +1639,9 @@ func (*UnimplementedQueryServer) ResolveLrn(ctx context.Context, req *QueryResol
func (*UnimplementedQueryServer) GetRegistryModuleBalance(ctx context.Context, req *QueryGetRegistryModuleBalanceRequest) (*QueryGetRegistryModuleBalanceResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetRegistryModuleBalance not implemented")
}
func (*UnimplementedQueryServer) Authorities(ctx context.Context, req *QueryAuthoritiesRequest) (*QueryAuthoritiesResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method Authorities not implemented")
}
func RegisterQueryServer(s grpc1.Server, srv QueryServer) {
s.RegisterService(&_Query_serviceDesc, srv)
@ -1687,6 +1809,24 @@ func _Query_GetRegistryModuleBalance_Handler(srv interface{}, ctx context.Contex
return interceptor(ctx, in, info, handler)
}
func _Query_Authorities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(QueryAuthoritiesRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(QueryServer).Authorities(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/cerc.registry.v1.Query/Authorities",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(QueryServer).Authorities(ctx, req.(*QueryAuthoritiesRequest))
}
return interceptor(ctx, in, info, handler)
}
var _Query_serviceDesc = grpc.ServiceDesc{
ServiceName: "cerc.registry.v1.Query",
HandlerType: (*QueryServer)(nil),
@ -1727,6 +1867,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{
MethodName: "GetRegistryModuleBalance",
Handler: _Query_GetRegistryModuleBalance_Handler,
},
{
MethodName: "Authorities",
Handler: _Query_Authorities_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "cerc/registry/v1/query.proto",
@ -2471,6 +2615,85 @@ func (m *QueryWhoisResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
func (m *QueryAuthoritiesRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *QueryAuthoritiesRequest) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *QueryAuthoritiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
if len(m.Owner) > 0 {
i -= len(m.Owner)
copy(dAtA[i:], m.Owner)
i = encodeVarintQuery(dAtA, i, uint64(len(m.Owner)))
i--
dAtA[i] = 0xa
}
return len(dAtA) - i, nil
}
func (m *QueryAuthoritiesResponse) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *QueryAuthoritiesResponse) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *QueryAuthoritiesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
if m.Pagination != nil {
{
size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintQuery(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x12
}
if len(m.Authorities) > 0 {
for iNdEx := len(m.Authorities) - 1; iNdEx >= 0; iNdEx-- {
{
size, err := m.Authorities[iNdEx].MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintQuery(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0xa
}
}
return len(dAtA) - i, nil
}
func (m *QueryLookupLrnRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@ -3032,6 +3255,38 @@ func (m *QueryWhoisResponse) Size() (n int) {
return n
}
func (m *QueryAuthoritiesRequest) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
l = len(m.Owner)
if l > 0 {
n += 1 + l + sovQuery(uint64(l))
}
return n
}
func (m *QueryAuthoritiesResponse) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
if len(m.Authorities) > 0 {
for _, e := range m.Authorities {
l = e.Size()
n += 1 + l + sovQuery(uint64(l))
}
}
if m.Pagination != nil {
l = m.Pagination.Size()
n += 1 + l + sovQuery(uint64(l))
}
return n
}
func (m *QueryLookupLrnRequest) Size() (n int) {
if m == nil {
return 0
@ -4920,6 +5175,208 @@ func (m *QueryWhoisResponse) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *QueryAuthoritiesRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: QueryAuthoritiesRequest: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: QueryAuthoritiesRequest: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Owner", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthQuery
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthQuery
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Owner = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipQuery(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthQuery
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *QueryAuthoritiesResponse) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: QueryAuthoritiesResponse: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: QueryAuthoritiesResponse: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Authorities", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthQuery
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthQuery
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Authorities = append(m.Authorities, AuthorityEntry{})
if err := m.Authorities[len(m.Authorities)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthQuery
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthQuery
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.Pagination == nil {
m.Pagination = &query.PageResponse{}
}
if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipQuery(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthQuery
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *QueryLookupLrnRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0

View File

@ -393,6 +393,42 @@ func local_request_Query_GetRegistryModuleBalance_0(ctx context.Context, marshal
}
var (
filter_Query_Authorities_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)}
)
func request_Query_Authorities_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq QueryAuthoritiesRequest
var metadata runtime.ServerMetadata
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Authorities_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := client.Authorities(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_Query_Authorities_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq QueryAuthoritiesRequest
var metadata runtime.ServerMetadata
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Authorities_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := server.Authorities(ctx, &protoReq)
return msg, metadata, err
}
// RegisterQueryHandlerServer registers the http handlers for service Query to "mux".
// UnaryRPC :call QueryServer directly.
// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
@ -606,6 +642,29 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
})
mux.Handle("GET", pattern_Query_Authorities_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
var stream runtime.ServerTransportStream
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_Query_Authorities_0(rctx, inboundMarshaler, server, req, pathParams)
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_Query_Authorities_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil
}
@ -827,6 +886,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie
})
mux.Handle("GET", pattern_Query_Authorities_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_Query_Authorities_0(rctx, inboundMarshaler, client, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_Query_Authorities_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil
}
@ -848,6 +927,8 @@ var (
pattern_Query_ResolveLrn_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"cerc", "registry", "v1", "resolve"}, "", runtime.AssumeColonVerbOpt(false)))
pattern_Query_GetRegistryModuleBalance_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"cerc", "registry", "v1", "balance"}, "", runtime.AssumeColonVerbOpt(false)))
pattern_Query_Authorities_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"cerc", "registry", "v1", "authorities"}, "", runtime.AssumeColonVerbOpt(false)))
)
var (
@ -868,4 +949,6 @@ var (
forward_Query_ResolveLrn_0 = runtime.ForwardResponseMessage
forward_Query_GetRegistryModuleBalance_0 = runtime.ForwardResponseMessage
forward_Query_Authorities_0 = runtime.ForwardResponseMessage
)