diff --git a/macaroons.go b/macaroons.go index e33e123..640ab87 100644 --- a/macaroons.go +++ b/macaroons.go @@ -124,6 +124,18 @@ var ( Entity: "auction", Action: "read", }}, + "/poolrpc.Trader/OfferSidecar": {{ + Entity: "order", + Action: "write", + }}, + "/poolrpc.Trader/RegisterSidecar": {{ + Entity: "order", + Action: "write", + }}, + "/poolrpc.Trader/ExpectSidecarChannel": {{ + Entity: "order", + Action: "write", + }}, } // allPermissions is the list of all existing permissions that exist diff --git a/poolrpc/rest-annotations.yaml b/poolrpc/rest-annotations.yaml index c7e7733..da9ee8a 100644 --- a/poolrpc/rest-annotations.yaml +++ b/poolrpc/rest-annotations.yaml @@ -56,6 +56,15 @@ http: get: "/v1/pool/leases" - selector: poolrpc.Trader.NodeRatings get: "/v1/pool/node_ratings" + - selector: poolrpc.Trader.OfferSidecar + post: "/v1/pool/sidecar/offer" + body: "*" + - selector: poolrpc.Trader.RegisterSidecar + post: "/v1/pool/sidecar/register" + body: "*" + - selector: poolrpc.Trader.ExpectSidecarChannel + post: "/v1/pool/sidecar/expect" + body: "*" # Make the URI convenient to be called in different ways, the shortest of # them just returning the most recent batch. diff --git a/poolrpc/trader.pb.go b/poolrpc/trader.pb.go index 16744c7..feb838d 100644 --- a/poolrpc/trader.pb.go +++ b/poolrpc/trader.pb.go @@ -3403,6 +3403,237 @@ func (m *StopDaemonResponse) XXX_DiscardUnknown() { var xxx_messageInfo_StopDaemonResponse proto.InternalMessageInfo +type OfferSidecarRequest struct { + // + //The total channel capacity in satoshis. This will be used for the bid + //order's amount and min channel/match size values. + ChannelCapacitySat uint64 `protobuf:"varint,1,opt,name=channel_capacity_sat,json=channelCapacitySat,proto3" json:"channel_capacity_sat,omitempty"` + // + //The number of satoshis that will be pushed to the recipient in the sidecar + //channel resulting from the bid order submitted by the offering trader + //(=provider). The initial outbound channel balance will be transferred from + //the provider's pool account (=taker account) to the maker's account to + //reimburse them for the balance they'll effectively be giving away. The + //reimbursement between the recipient of the sidecar channel and the provider + //(=taker) is _not_ part of the protocol and must happen out of band. The + //sidecar protocol simply deducts all fees for the sidecar channel (execution + //fee, lease premium, chain fees, push amount) from the taker's trading + //account. + SelfChanBalance uint64 `protobuf:"varint,2,opt,name=self_chan_balance,json=selfChanBalance,proto3" json:"self_chan_balance,omitempty"` + // + //The number of blocks the resulting leased channel should be open for. + LeaseDurationBlocks uint32 `protobuf:"varint,3,opt,name=lease_duration_blocks,json=leaseDurationBlocks,proto3" json:"lease_duration_blocks,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OfferSidecarRequest) Reset() { *m = OfferSidecarRequest{} } +func (m *OfferSidecarRequest) String() string { return proto.CompactTextString(m) } +func (*OfferSidecarRequest) ProtoMessage() {} +func (*OfferSidecarRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_b8f61804588c75fe, []int{51} +} + +func (m *OfferSidecarRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OfferSidecarRequest.Unmarshal(m, b) +} +func (m *OfferSidecarRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OfferSidecarRequest.Marshal(b, m, deterministic) +} +func (m *OfferSidecarRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_OfferSidecarRequest.Merge(m, src) +} +func (m *OfferSidecarRequest) XXX_Size() int { + return xxx_messageInfo_OfferSidecarRequest.Size(m) +} +func (m *OfferSidecarRequest) XXX_DiscardUnknown() { + xxx_messageInfo_OfferSidecarRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_OfferSidecarRequest proto.InternalMessageInfo + +func (m *OfferSidecarRequest) GetChannelCapacitySat() uint64 { + if m != nil { + return m.ChannelCapacitySat + } + return 0 +} + +func (m *OfferSidecarRequest) GetSelfChanBalance() uint64 { + if m != nil { + return m.SelfChanBalance + } + return 0 +} + +func (m *OfferSidecarRequest) GetLeaseDurationBlocks() uint32 { + if m != nil { + return m.LeaseDurationBlocks + } + return 0 +} + +type SidecarTicket struct { + // + //The complete sidecar ticket in its string encoded form which is base64 URL + //encoded, has a human readable prefix ('sidecar...') and a checksum built in. + //The string encoded version will only be used on the trader side of the API. + //All requests to the auctioneer expect the ticket to be in its raw, tlv + //encoded byte form. + Ticket string `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SidecarTicket) Reset() { *m = SidecarTicket{} } +func (m *SidecarTicket) String() string { return proto.CompactTextString(m) } +func (*SidecarTicket) ProtoMessage() {} +func (*SidecarTicket) Descriptor() ([]byte, []int) { + return fileDescriptor_b8f61804588c75fe, []int{52} +} + +func (m *SidecarTicket) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SidecarTicket.Unmarshal(m, b) +} +func (m *SidecarTicket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SidecarTicket.Marshal(b, m, deterministic) +} +func (m *SidecarTicket) XXX_Merge(src proto.Message) { + xxx_messageInfo_SidecarTicket.Merge(m, src) +} +func (m *SidecarTicket) XXX_Size() int { + return xxx_messageInfo_SidecarTicket.Size(m) +} +func (m *SidecarTicket) XXX_DiscardUnknown() { + xxx_messageInfo_SidecarTicket.DiscardUnknown(m) +} + +var xxx_messageInfo_SidecarTicket proto.InternalMessageInfo + +func (m *SidecarTicket) GetTicket() string { + if m != nil { + return m.Ticket + } + return "" +} + +type RegisterSidecarRequest struct { + // + //The sidecar ticket to register and add the node and channel funding + //information to. The ticket must be in the state "offered". + Ticket string `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RegisterSidecarRequest) Reset() { *m = RegisterSidecarRequest{} } +func (m *RegisterSidecarRequest) String() string { return proto.CompactTextString(m) } +func (*RegisterSidecarRequest) ProtoMessage() {} +func (*RegisterSidecarRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_b8f61804588c75fe, []int{53} +} + +func (m *RegisterSidecarRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RegisterSidecarRequest.Unmarshal(m, b) +} +func (m *RegisterSidecarRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RegisterSidecarRequest.Marshal(b, m, deterministic) +} +func (m *RegisterSidecarRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RegisterSidecarRequest.Merge(m, src) +} +func (m *RegisterSidecarRequest) XXX_Size() int { + return xxx_messageInfo_RegisterSidecarRequest.Size(m) +} +func (m *RegisterSidecarRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RegisterSidecarRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RegisterSidecarRequest proto.InternalMessageInfo + +func (m *RegisterSidecarRequest) GetTicket() string { + if m != nil { + return m.Ticket + } + return "" +} + +type ExpectSidecarChannelRequest struct { + // + //The sidecar ticket to expect an incoming channel for. The ticket must be in + //the state "ordered". + Ticket string `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ExpectSidecarChannelRequest) Reset() { *m = ExpectSidecarChannelRequest{} } +func (m *ExpectSidecarChannelRequest) String() string { return proto.CompactTextString(m) } +func (*ExpectSidecarChannelRequest) ProtoMessage() {} +func (*ExpectSidecarChannelRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_b8f61804588c75fe, []int{54} +} + +func (m *ExpectSidecarChannelRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ExpectSidecarChannelRequest.Unmarshal(m, b) +} +func (m *ExpectSidecarChannelRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ExpectSidecarChannelRequest.Marshal(b, m, deterministic) +} +func (m *ExpectSidecarChannelRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExpectSidecarChannelRequest.Merge(m, src) +} +func (m *ExpectSidecarChannelRequest) XXX_Size() int { + return xxx_messageInfo_ExpectSidecarChannelRequest.Size(m) +} +func (m *ExpectSidecarChannelRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ExpectSidecarChannelRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ExpectSidecarChannelRequest proto.InternalMessageInfo + +func (m *ExpectSidecarChannelRequest) GetTicket() string { + if m != nil { + return m.Ticket + } + return "" +} + +type ExpectSidecarChannelResponse struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ExpectSidecarChannelResponse) Reset() { *m = ExpectSidecarChannelResponse{} } +func (m *ExpectSidecarChannelResponse) String() string { return proto.CompactTextString(m) } +func (*ExpectSidecarChannelResponse) ProtoMessage() {} +func (*ExpectSidecarChannelResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_b8f61804588c75fe, []int{55} +} + +func (m *ExpectSidecarChannelResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ExpectSidecarChannelResponse.Unmarshal(m, b) +} +func (m *ExpectSidecarChannelResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ExpectSidecarChannelResponse.Marshal(b, m, deterministic) +} +func (m *ExpectSidecarChannelResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExpectSidecarChannelResponse.Merge(m, src) +} +func (m *ExpectSidecarChannelResponse) XXX_Size() int { + return xxx_messageInfo_ExpectSidecarChannelResponse.Size(m) +} +func (m *ExpectSidecarChannelResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ExpectSidecarChannelResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ExpectSidecarChannelResponse proto.InternalMessageInfo + func init() { proto.RegisterEnum("poolrpc.AccountState", AccountState_name, AccountState_value) proto.RegisterEnum("poolrpc.MatchState", MatchState_name, MatchState_value) @@ -3461,226 +3692,240 @@ func init() { proto.RegisterMapType((map[uint32]*auctioneerrpc.MarketInfo)(nil), "poolrpc.GetInfoResponse.MarketInfoEntry") proto.RegisterType((*StopDaemonRequest)(nil), "poolrpc.StopDaemonRequest") proto.RegisterType((*StopDaemonResponse)(nil), "poolrpc.StopDaemonResponse") + proto.RegisterType((*OfferSidecarRequest)(nil), "poolrpc.OfferSidecarRequest") + proto.RegisterType((*SidecarTicket)(nil), "poolrpc.SidecarTicket") + proto.RegisterType((*RegisterSidecarRequest)(nil), "poolrpc.RegisterSidecarRequest") + proto.RegisterType((*ExpectSidecarChannelRequest)(nil), "poolrpc.ExpectSidecarChannelRequest") + proto.RegisterType((*ExpectSidecarChannelResponse)(nil), "poolrpc.ExpectSidecarChannelResponse") } func init() { proto.RegisterFile("trader.proto", fileDescriptor_b8f61804588c75fe) } var fileDescriptor_b8f61804588c75fe = []byte{ - // 3410 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x3a, 0x4b, 0x73, 0x1b, 0xc7, - 0x99, 0x04, 0xf8, 0xc4, 0x87, 0x27, 0x1b, 0x24, 0x05, 0x53, 0xa2, 0x45, 0x8d, 0x57, 0x36, 0x25, - 0x79, 0x25, 0x2f, 0xd7, 0xd2, 0x7a, 0xb5, 0xde, 0xb5, 0x41, 0x12, 0x14, 0xb0, 0xa2, 0x40, 0xb8, - 0x09, 0x29, 0x8e, 0x2f, 0x53, 0x0d, 0x4c, 0x93, 0x1c, 0x13, 0x98, 0x41, 0x66, 0x1a, 0x7c, 0x1c, - 0x72, 0x48, 0xc5, 0x55, 0x39, 0x26, 0xe5, 0x54, 0x72, 0xcd, 0x0f, 0x49, 0x55, 0x0e, 0x39, 0xa5, - 0x2a, 0xb9, 0xe4, 0x07, 0xe4, 0x0f, 0xe4, 0x37, 0xe4, 0x90, 0xea, 0xd7, 0x4c, 0xcf, 0x00, 0xf0, - 0xeb, 0x92, 0x1b, 0xe6, 0x7b, 0x74, 0x7f, 0xef, 0xef, 0xeb, 0x6e, 0x40, 0x81, 0x05, 0xc4, 0xa1, - 0xc1, 0xe3, 0x51, 0xe0, 0x33, 0x1f, 0x2d, 0x8f, 0x7c, 0x7f, 0x10, 0x8c, 0xfa, 0x9b, 0x6f, 0x93, - 0x71, 0x9f, 0xb9, 0xbe, 0x47, 0x69, 0x10, 0x8c, 0xfa, 0x4f, 0xe2, 0x2f, 0x49, 0x68, 0xfd, 0x3d, - 0x03, 0xa8, 0xe5, 0xb9, 0xac, 0xde, 0xef, 0xfb, 0x63, 0x8f, 0x61, 0xfa, 0x93, 0x31, 0x0d, 0x19, - 0x7a, 0x07, 0x8a, 0x44, 0x42, 0xec, 0x4b, 0x32, 0x18, 0xd3, 0x5a, 0x66, 0x3b, 0xb3, 0xb3, 0x80, - 0x0b, 0x0a, 0xf8, 0x86, 0xc3, 0xd0, 0x03, 0x28, 0x93, 0x5e, 0xe8, 0x0f, 0xc6, 0x8c, 0xda, 0xe7, - 0xd4, 0x3d, 0x3b, 0x67, 0xb5, 0xec, 0x76, 0x66, 0xa7, 0xd8, 0x9c, 0xc3, 0x25, 0x8d, 0x68, 0x0a, - 0x38, 0x27, 0x0d, 0xe8, 0x80, 0x30, 0xf7, 0x32, 0x22, 0x9d, 0xd7, 0xa4, 0x1a, 0xa1, 0x48, 0xef, - 0x41, 0xbe, 0xef, 0x7b, 0xa7, 0x36, 0x23, 0xc1, 0x19, 0x65, 0xb5, 0x05, 0x41, 0x96, 0xc1, 0xc0, - 0x81, 0x5d, 0x01, 0x43, 0x77, 0x20, 0xe7, 0x7a, 0x2e, 0x73, 0x09, 0xf3, 0x83, 0xda, 0xe2, 0x76, - 0x66, 0x27, 0x87, 0x63, 0xc0, 0x5e, 0x05, 0x4a, 0x5a, 0x76, 0x7a, 0x3d, 0x72, 0x83, 0x9b, 0xbd, - 0x25, 0x58, 0x38, 0xa5, 0x34, 0xb4, 0x28, 0x54, 0x3f, 0x1b, 0xfb, 0x8c, 0xfe, 0x10, 0x65, 0x53, - 0x62, 0x69, 0x45, 0x0d, 0xb1, 0xa2, 0x6d, 0xae, 0x60, 0x2d, 0xb9, 0x4d, 0x38, 0xf2, 0xbd, 0x90, - 0xa2, 0xff, 0x82, 0xb7, 0x86, 0xae, 0x47, 0x03, 0xfb, 0x94, 0x52, 0x3b, 0x20, 0x8c, 0xda, 0x21, - 0x61, 0xf6, 0x88, 0x06, 0xf6, 0xc5, 0x95, 0xda, 0x73, 0x4d, 0x10, 0x1c, 0x52, 0x8a, 0x09, 0xa3, - 0x27, 0x84, 0x75, 0x68, 0xf0, 0xf2, 0x0a, 0xbd, 0x0b, 0xe5, 0x98, 0x91, 0xf9, 0x8c, 0x0c, 0xc4, - 0xfe, 0x0b, 0xb8, 0xa8, 0xc9, 0xbb, 0x1c, 0x68, 0x3d, 0x83, 0xea, 0x91, 0x1b, 0x6a, 0x5f, 0x86, - 0x5a, 0xbf, 0xbb, 0x90, 0x27, 0x7d, 0x61, 0x7a, 0xdf, 0x1b, 0xdc, 0x88, 0x9d, 0x56, 0x30, 0x48, - 0xd0, 0xb1, 0x37, 0xb8, 0xb1, 0x0e, 0x60, 0x2d, 0xc9, 0xa7, 0x04, 0x7e, 0x1f, 0x56, 0x94, 0x0d, - 0xc2, 0x5a, 0x66, 0x7b, 0x7e, 0x27, 0xbf, 0x5b, 0x79, 0xac, 0x02, 0xeb, 0xb1, 0x56, 0x2e, 0xa2, - 0xb0, 0x3e, 0x81, 0xa5, 0xe3, 0x31, 0x1b, 0x8d, 0x19, 0xba, 0x0d, 0x39, 0x61, 0x48, 0xae, 0x9f, - 0x52, 0x6c, 0x45, 0x00, 0x4e, 0x08, 0x43, 0x35, 0x58, 0x26, 0x8e, 0x13, 0xd0, 0x30, 0x14, 0x4a, - 0xe4, 0xb0, 0xfe, 0xb4, 0xbe, 0xca, 0x40, 0x51, 0xae, 0xf0, 0x23, 0x97, 0x9d, 0x1f, 0x52, 0x6a, - 0xd2, 0x66, 0x12, 0xb4, 0xdf, 0xc1, 0x1d, 0xe8, 0x31, 0x54, 0xa7, 0x19, 0x9a, 0xc7, 0xdd, 0x42, - 0x73, 0x0e, 0x97, 0x4f, 0x93, 0x56, 0x8e, 0xdc, 0xb7, 0x0f, 0x1b, 0x52, 0x8a, 0x90, 0x8b, 0xd1, - 0x1a, 0x8e, 0x06, 0x6e, 0xdf, 0x65, 0x5c, 0x9c, 0x07, 0xb0, 0xec, 0x4b, 0x8c, 0x32, 0x47, 0x39, - 0x32, 0x87, 0xe4, 0xc0, 0x1a, 0x6f, 0xfd, 0x29, 0x03, 0xd5, 0xfd, 0x81, 0x1f, 0xa6, 0x63, 0x6d, - 0x0b, 0x40, 0x26, 0xaa, 0x7d, 0x41, 0xa5, 0x2b, 0x0a, 0x38, 0x27, 0x21, 0x2f, 0xe9, 0x0d, 0xfa, - 0x14, 0xca, 0x72, 0x05, 0xfb, 0xca, 0x65, 0xe7, 0xdc, 0xdf, 0x42, 0xb5, 0xfc, 0xee, 0x46, 0x6a, - 0x27, 0x65, 0xa1, 0xe6, 0x1c, 0x2e, 0xfa, 0x09, 0x93, 0xfd, 0x4f, 0x2c, 0xe3, 0xbc, 0xe0, 0xbc, - 0x9b, 0xe2, 0x4c, 0x6b, 0xd5, 0x9c, 0x8b, 0xa4, 0xde, 0xab, 0xc2, 0xea, 0xe9, 0xd8, 0x73, 0x42, - 0xdb, 0xa1, 0x21, 0x73, 0x3d, 0xc2, 0x6b, 0x85, 0xf5, 0x14, 0xd6, 0x92, 0x9a, 0xa8, 0xe8, 0xd8, - 0x02, 0xe8, 0x73, 0xb8, 0xcd, 0xae, 0x5d, 0x47, 0xab, 0x22, 0x20, 0xdd, 0x6b, 0xd7, 0xb1, 0x7e, - 0x95, 0x81, 0x0d, 0xbe, 0x95, 0x13, 0x90, 0xab, 0xef, 0x67, 0x04, 0xc3, 0xcc, 0xd9, 0x6f, 0x36, - 0x33, 0x7a, 0xff, 0x1b, 0x7c, 0x3c, 0xe1, 0x61, 0xeb, 0x4b, 0xb8, 0x35, 0x21, 0x91, 0x52, 0xe6, - 0x21, 0x2c, 0xab, 0x40, 0x16, 0xf2, 0x4c, 0x8b, 0x74, 0x4d, 0xc0, 0xeb, 0xc5, 0x95, 0x5a, 0x46, - 0xea, 0x9e, 0x15, 0x1a, 0x14, 0x34, 0x50, 0xa8, 0xff, 0xf3, 0x0c, 0xac, 0x1f, 0xd0, 0x91, 0x1f, - 0x4e, 0xd4, 0xd6, 0x6f, 0xd1, 0x7e, 0x0b, 0x80, 0x0c, 0x45, 0x31, 0xe2, 0xd9, 0x23, 0xf3, 0x3c, - 0x27, 0x21, 0x3c, 0x7d, 0xbe, 0x9f, 0xc6, 0x67, 0xb0, 0x91, 0x16, 0xe2, 0x07, 0x28, 0x7c, 0x0f, - 0x0a, 0x8e, 0x5c, 0xc5, 0xd4, 0x37, 0xaf, 0x60, 0x42, 0xdd, 0xbf, 0x64, 0xa0, 0x8a, 0xa9, 0x47, - 0xd3, 0xae, 0x16, 0xb5, 0x47, 0xd6, 0xd6, 0x58, 0x5b, 0x50, 0x20, 0xe9, 0xec, 0xb8, 0x89, 0xc8, - 0x72, 0x3d, 0xd9, 0x44, 0x1a, 0x02, 0x9e, 0x68, 0x22, 0x8a, 0x74, 0xa2, 0x89, 0x28, 0xd2, 0x19, - 0x56, 0x5a, 0x98, 0x6a, 0xa5, 0xc9, 0x8e, 0x61, 0x51, 0x58, 0x4b, 0x6a, 0xf3, 0xc3, 0xac, 0x16, - 0xf0, 0x35, 0xc8, 0x20, 0x61, 0x35, 0x05, 0x13, 0x56, 0x73, 0x60, 0x7d, 0x6f, 0x3c, 0x1c, 0x29, - 0x56, 0x5e, 0xf6, 0xbf, 0x5b, 0x8c, 0xcc, 0x50, 0x2f, 0x3b, 0x3d, 0x08, 0x6a, 0xb0, 0x91, 0xde, - 0x45, 0xaa, 0x63, 0xfd, 0x26, 0x0b, 0xcb, 0x0a, 0xfc, 0x6d, 0x5b, 0xfe, 0x3b, 0xac, 0xf0, 0xa4, - 0xf3, 0x5d, 0x8f, 0xa9, 0x92, 0xb4, 0x6a, 0x66, 0x65, 0x87, 0x23, 0x70, 0x44, 0x82, 0xd6, 0x60, - 0x51, 0xf6, 0x52, 0x19, 0x98, 0xf2, 0x03, 0x3d, 0x82, 0x55, 0x72, 0x49, 0xdc, 0x01, 0xe9, 0x0d, - 0xa8, 0xdd, 0x23, 0x03, 0xe2, 0xf5, 0xa9, 0x72, 0x4a, 0x25, 0x42, 0xec, 0x49, 0x38, 0x27, 0x16, - 0xde, 0x10, 0x55, 0x48, 0x4f, 0x0d, 0xbc, 0xdb, 0x17, 0x71, 0x25, 0x46, 0xa8, 0xa9, 0xe1, 0x11, - 0x2c, 0x86, 0x8c, 0x30, 0x5a, 0x5b, 0xda, 0xce, 0xec, 0x94, 0x76, 0xd7, 0xd3, 0x6e, 0x39, 0xe1, - 0x48, 0x2c, 0x69, 0x78, 0x50, 0x0e, 0x08, 0xa3, 0xa1, 0x0a, 0xe7, 0x65, 0x19, 0x94, 0x12, 0x24, - 0xfc, 0xf2, 0xb3, 0x0c, 0xa0, 0x93, 0x71, 0x6f, 0xe8, 0xb2, 0xe3, 0xc0, 0xa1, 0x81, 0xf6, 0xca, - 0x36, 0xcc, 0x93, 0xf0, 0x42, 0x79, 0xbe, 0x10, 0x6f, 0x11, 0x5e, 0x34, 0xe7, 0x30, 0x47, 0x71, - 0x8a, 0x9e, 0x72, 0xb5, 0x49, 0xb1, 0xe7, 0x3a, 0x9c, 0xa2, 0xe7, 0x3a, 0xc9, 0xd9, 0x65, 0x3e, - 0x3d, 0xbb, 0xe4, 0x60, 0xd9, 0xa1, 0x8c, 0xb8, 0x83, 0xd0, 0xfa, 0x3a, 0x03, 0xd5, 0x84, 0x0c, - 0x2a, 0x04, 0x3f, 0x86, 0xa2, 0xeb, 0x5d, 0x92, 0x81, 0xeb, 0xd8, 0x3e, 0x47, 0x28, 0x71, 0x62, - 0x8d, 0x5b, 0x12, 0x2b, 0xb8, 0x9a, 0x73, 0xb8, 0xe0, 0x1a, 0xdf, 0x68, 0x17, 0xd6, 0x48, 0xbf, - 0x4f, 0x47, 0x8c, 0x2a, 0x76, 0xdb, 0xf3, 0xb9, 0x13, 0x44, 0x70, 0x36, 0xe7, 0x30, 0xd2, 0x58, - 0x41, 0xde, 0xe6, 0x38, 0x53, 0xa8, 0x36, 0xac, 0xf2, 0x49, 0x41, 0x20, 0xa3, 0xf9, 0xa2, 0x06, - 0xcb, 0x97, 0x34, 0xe8, 0xf9, 0x21, 0x55, 0xb3, 0x85, 0xfe, 0x4c, 0x4f, 0x1e, 0xd9, 0x89, 0xc9, - 0xe3, 0x73, 0x40, 0xe6, 0x7a, 0x4a, 0xc5, 0x6d, 0x58, 0x20, 0xe1, 0x85, 0x6e, 0xb2, 0x09, 0x43, - 0x63, 0x81, 0xe1, 0x14, 0x3d, 0xd7, 0xd1, 0xfd, 0x21, 0x61, 0x68, 0x2c, 0x30, 0xd6, 0x53, 0x40, - 0xfb, 0x3c, 0x8c, 0x06, 0x09, 0x0f, 0xde, 0x85, 0xbc, 0xa9, 0xb5, 0x2a, 0x47, 0x7e, 0xa4, 0xab, - 0xb5, 0x0e, 0xd5, 0x04, 0x9b, 0x4a, 0x94, 0xbf, 0xcd, 0xc3, 0xa2, 0x34, 0xe0, 0xb7, 0x57, 0x6f, - 0x91, 0x95, 0xa7, 0xee, 0x35, 0x95, 0x71, 0x50, 0xc4, 0x39, 0x0e, 0x39, 0xe4, 0x00, 0x54, 0x81, - 0x79, 0x32, 0x64, 0x2a, 0x29, 0xf8, 0x4f, 0xf4, 0x7f, 0xb0, 0x35, 0x24, 0xd7, 0x76, 0x8f, 0xb0, - 0xfe, 0xb9, 0x3d, 0xbb, 0x66, 0xdd, 0x1a, 0x92, 0xeb, 0x3d, 0x4e, 0x93, 0x9e, 0x0d, 0x53, 0x1a, - 0x2d, 0xa6, 0x35, 0x42, 0x0f, 0x92, 0x99, 0x51, 0x8d, 0xb3, 0x96, 0xd3, 0x24, 0xf2, 0x62, 0x0d, - 0x16, 0xc7, 0x9e, 0xcb, 0x42, 0x91, 0x11, 0x45, 0x2c, 0x3f, 0x78, 0x1e, 0x8a, 0x1f, 0xf6, 0xd8, - 0x3b, 0x1d, 0x0f, 0x4e, 0xdd, 0xc1, 0x80, 0x3a, 0xb5, 0x15, 0x99, 0x87, 0x02, 0xf1, 0x3a, 0x86, - 0xa3, 0xf7, 0x01, 0x05, 0x34, 0xa4, 0xc1, 0x25, 0x75, 0xec, 0x78, 0x06, 0xcc, 0xc9, 0x14, 0xd7, - 0x98, 0x37, 0x7a, 0x16, 0xdc, 0x85, 0xf5, 0x7e, 0x40, 0x65, 0x82, 0x33, 0x77, 0x48, 0x43, 0x46, - 0x86, 0x23, 0xdb, 0x0b, 0x6b, 0x20, 0x18, 0xaa, 0x1a, 0xd9, 0xd5, 0xb8, 0x36, 0x17, 0x67, 0x89, - 0x5e, 0x52, 0x3e, 0x92, 0xe6, 0x85, 0xf3, 0x53, 0x0a, 0x35, 0x38, 0x0e, 0x2b, 0x12, 0x35, 0x39, - 0xdb, 0x52, 0xfe, 0x21, 0xb7, 0x5f, 0xad, 0x20, 0x24, 0xe7, 0x93, 0xf3, 0x6b, 0x0e, 0x7d, 0xc5, - 0x81, 0xd6, 0x2f, 0xb2, 0x30, 0xbf, 0xe7, 0x3a, 0x68, 0x27, 0x0a, 0x75, 0x95, 0x56, 0xa5, 0xe4, - 0xea, 0x58, 0xa3, 0xb9, 0xe8, 0x03, 0x4a, 0x42, 0x6a, 0x3b, 0x63, 0x55, 0xa1, 0x7a, 0x03, 0xbf, - 0x7f, 0x11, 0x2a, 0x9f, 0x57, 0x05, 0xf2, 0x40, 0xe1, 0xf6, 0x04, 0x4a, 0x25, 0x4a, 0xe8, 0xfa, - 0x9e, 0x6c, 0x5c, 0x58, 0x7f, 0xa2, 0xa7, 0xc0, 0x05, 0xb2, 0x3d, 0xdf, 0xa1, 0x36, 0x73, 0x69, - 0x20, 0xbc, 0x5e, 0x32, 0x4a, 0x6c, 0xdb, 0x77, 0x68, 0xd7, 0xa5, 0x01, 0xce, 0x0f, 0x5d, 0x4f, - 0x7f, 0xa0, 0x87, 0xb0, 0x1a, 0xd2, 0xc1, 0xa9, 0xdd, 0x3f, 0x27, 0x5e, 0x54, 0x4f, 0x17, 0x65, - 0x17, 0xe0, 0x88, 0xfd, 0x73, 0xe2, 0xe9, 0x72, 0x7a, 0x1f, 0x4a, 0xa1, 0xeb, 0xd0, 0x3e, 0x09, - 0x6c, 0xe6, 0xf6, 0x2f, 0x28, 0x13, 0x01, 0x91, 0xc3, 0x45, 0x05, 0xed, 0x0a, 0xa0, 0xf5, 0x53, - 0x98, 0xaf, 0x87, 0x17, 0xff, 0x2a, 0x43, 0x58, 0x7f, 0xcc, 0x00, 0xc4, 0x7e, 0xe4, 0x3d, 0x34, - 0x11, 0x17, 0x5c, 0x96, 0x79, 0x9c, 0x67, 0x46, 0x3c, 0xdc, 0x86, 0x9c, 0x70, 0xb6, 0x1d, 0xb2, - 0x40, 0x9d, 0x28, 0x56, 0x04, 0xe0, 0x84, 0x05, 0xe8, 0x39, 0x14, 0x44, 0x68, 0x0b, 0x0b, 0x9d, - 0x51, 0x35, 0x12, 0xc7, 0xb5, 0xf2, 0xf5, 0xc8, 0x21, 0x8c, 0x3a, 0x62, 0xb3, 0xe6, 0x1c, 0xce, - 0x0b, 0xe2, 0x7d, 0x41, 0x8b, 0x9e, 0xc0, 0xb2, 0x88, 0x18, 0xea, 0x08, 0x6f, 0x98, 0x91, 0x26, - 0x82, 0x46, 0x33, 0x69, 0xaa, 0xbd, 0x65, 0x58, 0x14, 0x1b, 0x5b, 0xbf, 0xcb, 0x40, 0xc1, 0x5c, - 0x19, 0x3d, 0x87, 0xd2, 0x28, 0xa0, 0x97, 0xae, 0x3f, 0x0e, 0x6d, 0x99, 0x8c, 0x99, 0xd9, 0xc9, - 0x58, 0xd4, 0xa4, 0xe2, 0x13, 0x7d, 0x00, 0x39, 0x8f, 0x5e, 0x29, 0xb6, 0xec, 0x6c, 0xb6, 0x15, - 0x8f, 0x5e, 0x49, 0x8e, 0x7b, 0x50, 0x90, 0x01, 0xaf, 0x72, 0x55, 0x9a, 0x38, 0x2f, 0x60, 0x87, - 0x02, 0x64, 0xfd, 0x39, 0x03, 0x10, 0x2b, 0x81, 0x3e, 0x84, 0xbc, 0x50, 0x62, 0x86, 0x70, 0x82, - 0x52, 0xee, 0x02, 0xc3, 0xe8, 0xf7, 0xc4, 0x3e, 0xd9, 0x89, 0x7d, 0xf8, 0xa8, 0xac, 0xac, 0xa3, - 0x9a, 0xd5, 0xbc, 0x1c, 0x95, 0x15, 0x50, 0x96, 0xd4, 0x4f, 0xa0, 0x18, 0xd0, 0x2f, 0x69, 0x9f, - 0xd9, 0x01, 0x25, 0xa1, 0xef, 0xa9, 0xe0, 0xdf, 0x4c, 0xee, 0x8f, 0x05, 0x09, 0x16, 0x14, 0xb8, - 0x10, 0x18, 0x5f, 0x7c, 0xc0, 0xc1, 0xb4, 0xef, 0x5f, 0xd2, 0x20, 0x75, 0xf4, 0xb5, 0x8e, 0xe1, - 0xd6, 0x04, 0x46, 0x35, 0x99, 0x0f, 0x61, 0xc3, 0x1b, 0x0f, 0xed, 0x40, 0xa2, 0xa9, 0x63, 0x1b, - 0x47, 0x5d, 0xae, 0xc7, 0x9a, 0x37, 0x1e, 0x62, 0x8d, 0xd4, 0xdc, 0x56, 0x15, 0x56, 0xeb, 0xf2, - 0x0e, 0x25, 0x9e, 0xd6, 0xac, 0x0e, 0x20, 0x13, 0xa8, 0x36, 0x78, 0x0e, 0x45, 0x7a, 0x4d, 0xfb, - 0x63, 0x91, 0x13, 0xfc, 0x24, 0x97, 0x6e, 0xd4, 0x0d, 0x8d, 0xe5, 0x5c, 0x05, 0x6a, 0x7c, 0x59, - 0x7f, 0x5d, 0x80, 0xc5, 0x23, 0x9e, 0x38, 0xe8, 0x19, 0x14, 0x79, 0xec, 0x7a, 0x74, 0x60, 0xcb, - 0xe1, 0x2b, 0x33, 0x6b, 0xf8, 0x2a, 0x28, 0x3a, 0xf1, 0xc5, 0x2b, 0x9f, 0xe6, 0x23, 0x43, 0xf3, - 0x2c, 0xa1, 0x97, 0xab, 0x0f, 0xc5, 0x79, 0xe2, 0x19, 0xdc, 0xd2, 0x74, 0xe9, 0x04, 0x96, 0x71, - 0xb3, 0xae, 0xd0, 0xa9, 0x14, 0xfe, 0x00, 0xd6, 0x34, 0x9f, 0x4c, 0x7f, 0x35, 0x91, 0x8b, 0xfb, - 0x1a, 0x8c, 0x14, 0x4e, 0xe8, 0xa0, 0x66, 0xf2, 0xbb, 0x90, 0x1f, 0x05, 0x74, 0xe8, 0x8e, 0x87, - 0x42, 0x1a, 0x59, 0xa6, 0x40, 0x81, 0xb8, 0x28, 0x0f, 0xf9, 0xc0, 0x67, 0x18, 0x4c, 0x90, 0x2d, - 0xc9, 0x6a, 0x66, 0x5a, 0x87, 0xd3, 0x5a, 0xc2, 0x2c, 0x6e, 0x4c, 0xb7, 0x2c, 0xe8, 0xf2, 0x02, - 0xa8, 0x68, 0x1e, 0x43, 0xb5, 0x3f, 0xa0, 0x24, 0x70, 0xbd, 0x33, 0xd9, 0x55, 0x47, 0x81, 0xdb, - 0xa7, 0xa2, 0x75, 0x2d, 0xe0, 0x55, 0x8d, 0xe2, 0xdd, 0xb4, 0xc3, 0x11, 0x68, 0x07, 0x2a, 0xb2, - 0x95, 0x8a, 0xe6, 0x2d, 0x58, 0x54, 0xe7, 0x2a, 0x09, 0xb8, 0x68, 0xe1, 0x58, 0x0d, 0x90, 0x66, - 0xd3, 0x85, 0x89, 0xa6, 0x7b, 0x07, 0x72, 0xa3, 0x71, 0xd0, 0x3f, 0x27, 0x21, 0x75, 0x6a, 0x79, - 0x31, 0xf6, 0xc4, 0x00, 0xf4, 0x34, 0xb6, 0x79, 0x40, 0x87, 0x3e, 0xa3, 0xb2, 0xf0, 0xf3, 0x81, - 0xa2, 0x20, 0x96, 0xd2, 0xa6, 0xc5, 0x02, 0xcb, 0xcb, 0x3d, 0x9f, 0x2d, 0xfe, 0x17, 0x56, 0x35, - 0x5b, 0xdc, 0x28, 0x8a, 0xb3, 0x1a, 0x85, 0x76, 0xbf, 0x06, 0x58, 0x4d, 0x28, 0x0a, 0x77, 0x44, - 0x73, 0xdb, 0x6d, 0xc8, 0xc9, 0xb1, 0x83, 0x4f, 0x52, 0x7c, 0xd6, 0x2a, 0xe0, 0x15, 0x01, 0x68, - 0x39, 0x21, 0xda, 0x34, 0xee, 0x7e, 0xb2, 0x12, 0x17, 0xdd, 0xf4, 0xfc, 0x36, 0x03, 0x25, 0xbd, - 0x94, 0x0a, 0xf6, 0x77, 0x61, 0x49, 0x84, 0x81, 0x1e, 0xda, 0xe2, 0x76, 0x21, 0x08, 0xb1, 0xc2, - 0xa2, 0x27, 0xb0, 0x26, 0x2e, 0xb0, 0x44, 0x50, 0x52, 0x12, 0x78, 0xd4, 0x31, 0x62, 0x73, 0x55, - 0xe0, 0xea, 0x43, 0xd6, 0x10, 0x18, 0xee, 0xc4, 0x47, 0x80, 0x62, 0x86, 0x11, 0x71, 0x25, 0xb9, - 0x3a, 0xee, 0x6a, 0xf2, 0x0e, 0x71, 0x39, 0xb1, 0x55, 0x86, 0x62, 0xd7, 0xbf, 0xa0, 0x5e, 0x94, - 0xff, 0x1f, 0x43, 0x49, 0x03, 0xa2, 0x13, 0xdc, 0x12, 0x13, 0x10, 0x25, 0x28, 0x8a, 0x05, 0x0d, - 0x09, 0x13, 0xc4, 0x58, 0x51, 0x58, 0xbf, 0xcf, 0x42, 0x2e, 0x82, 0xf2, 0x5a, 0xd6, 0xe3, 0x81, - 0x3e, 0x24, 0x7d, 0x12, 0xf8, 0xbe, 0xa7, 0x86, 0xbf, 0x02, 0x07, 0xbe, 0x52, 0x30, 0x5e, 0x13, - 0x47, 0xe4, 0x66, 0xc8, 0xfb, 0xd1, 0x39, 0x09, 0xcf, 0xf5, 0xa1, 0x4f, 0xc1, 0x9a, 0x24, 0x3c, - 0x47, 0x0f, 0xa0, 0xa2, 0x49, 0x46, 0x01, 0x75, 0x87, 0x44, 0xf5, 0xa5, 0x02, 0x2e, 0x2b, 0x78, - 0x47, 0x81, 0x79, 0x44, 0xaa, 0xbb, 0x00, 0xa1, 0xf9, 0x90, 0xab, 0xbe, 0x20, 0x5a, 0x60, 0x49, - 0xc2, 0xb9, 0xe2, 0xaf, 0x42, 0xc2, 0xd0, 0x7f, 0xc0, 0x7a, 0xe0, 0x8f, 0x19, 0x0f, 0x75, 0x9e, - 0x11, 0x31, 0xf9, 0xa2, 0x20, 0x47, 0x0a, 0x79, 0x48, 0x69, 0xc4, 0xa2, 0x7a, 0xab, 0x2d, 0x86, - 0x2c, 0xea, 0x88, 0x4c, 0x53, 0xbd, 0x75, 0x5f, 0x82, 0x78, 0x9f, 0x16, 0x69, 0x4d, 0xe5, 0x21, - 0x69, 0x05, 0xeb, 0x4f, 0xce, 0x1c, 0x32, 0x3f, 0x20, 0x67, 0xd4, 0xf6, 0xc8, 0x50, 0x26, 0x55, - 0x8e, 0xf7, 0x4f, 0x01, 0x6b, 0x93, 0x21, 0xb5, 0x36, 0x60, 0xed, 0xc8, 0xec, 0xfd, 0xda, 0x27, - 0x5f, 0xcf, 0xc3, 0x7a, 0x0a, 0xa1, 0x7c, 0x63, 0x43, 0x39, 0x39, 0x4a, 0x68, 0x27, 0xed, 0x26, - 0xa3, 0x29, 0xcd, 0x98, 0x84, 0x86, 0x0d, 0x8f, 0x05, 0x37, 0x7b, 0xd9, 0x5a, 0x06, 0x97, 0x12, - 0xc3, 0x47, 0x88, 0x3c, 0xd8, 0x48, 0xcf, 0x2a, 0x63, 0x3e, 0xf5, 0xe8, 0x83, 0xc4, 0x47, 0xdf, - 0x67, 0x9f, 0x3d, 0xc9, 0x2a, 0x76, 0xc3, 0x6b, 0x83, 0x29, 0xa8, 0xcd, 0x3a, 0x54, 0xa7, 0x88, - 0xc6, 0x4f, 0x01, 0xfa, 0xf0, 0x50, 0xc4, 0xfc, 0x67, 0x7c, 0x5c, 0x96, 0x47, 0x24, 0xf9, 0xf1, - 0x3c, 0xfb, 0x51, 0x66, 0x93, 0xc2, 0x5b, 0x33, 0x77, 0x9d, 0xb2, 0xd0, 0xae, 0xb9, 0x50, 0x69, - 0xf7, 0x4e, 0xa4, 0x50, 0x92, 0x5f, 0x8d, 0xfd, 0xd1, 0x36, 0xdc, 0x59, 0x6d, 0x7a, 0xcd, 0xc4, - 0x11, 0xa3, 0xe5, 0x9d, 0xfa, 0xda, 0x59, 0xbf, 0xcc, 0xc0, 0x7a, 0x0a, 0xa1, 0x9c, 0x75, 0x37, - 0x79, 0x03, 0x2b, 0x0f, 0xe6, 0xe6, 0xfd, 0xeb, 0x8c, 0x4b, 0x8a, 0xa5, 0xa9, 0x97, 0x14, 0xe8, - 0x3d, 0x28, 0x8b, 0x8a, 0x1c, 0x9f, 0x03, 0x54, 0x49, 0x2f, 0x09, 0x70, 0x74, 0x02, 0xb0, 0x9e, - 0xc1, 0x2a, 0x2f, 0x69, 0x98, 0xf0, 0x78, 0xd6, 0xa5, 0xec, 0x1e, 0x14, 0x44, 0x49, 0x1c, 0x8d, - 0x7b, 0x17, 0xf4, 0x46, 0x57, 0xb3, 0x3c, 0x87, 0x75, 0x24, 0xc8, 0x3a, 0x02, 0x64, 0xf2, 0x29, - 0x2d, 0x9e, 0x29, 0xc6, 0x40, 0x80, 0x75, 0xbc, 0x55, 0x13, 0xe5, 0x54, 0xb1, 0x88, 0xd5, 0xe4, - 0xef, 0xd0, 0xaa, 0x40, 0xe9, 0x05, 0x65, 0xa6, 0xa5, 0xbe, 0x5a, 0x82, 0x72, 0x04, 0x52, 0xab, - 0x1b, 0x73, 0xae, 0xba, 0xbf, 0xd6, 0x03, 0xff, 0xfd, 0xe8, 0xca, 0x29, 0x34, 0x6e, 0xf4, 0x8b, - 0x58, 0xbf, 0x44, 0x84, 0xe2, 0x46, 0x9f, 0x5b, 0x25, 0x22, 0x93, 0xc7, 0x66, 0xd5, 0x95, 0x23, - 0xee, 0xba, 0x80, 0xf2, 0x36, 0x9e, 0x22, 0xb4, 0x75, 0xe6, 0xca, 0x8e, 0xbc, 0x9e, 0x64, 0x68, - 0xa8, 0x3c, 0x7e, 0x04, 0xab, 0x31, 0x5f, 0xd0, 0x3f, 0x77, 0x2f, 0xa9, 0xa3, 0x2f, 0x59, 0x22, - 0x0e, 0x05, 0xe7, 0x56, 0x16, 0x3d, 0x4e, 0x8b, 0xbc, 0x24, 0x07, 0x3e, 0x09, 0x93, 0x02, 0xbf, - 0x03, 0x45, 0x45, 0xa2, 0xc4, 0x95, 0x47, 0x49, 0xc5, 0xa7, 0x84, 0x7d, 0x0f, 0xca, 0x9a, 0x48, - 0x6f, 0x29, 0xcf, 0x93, 0x25, 0x45, 0xa6, 0x37, 0xe4, 0x43, 0xc6, 0x38, 0x08, 0x78, 0xa9, 0x14, - 0x33, 0x89, 0xbe, 0x05, 0xca, 0xa9, 0x21, 0x43, 0xe2, 0xc4, 0x44, 0x12, 0x3d, 0x34, 0x55, 0x44, - 0x0b, 0xa3, 0xa1, 0xed, 0x7a, 0x97, 0xfe, 0x80, 0xaf, 0x0d, 0x82, 0xba, 0xac, 0xe0, 0x2d, 0x05, - 0xe6, 0x43, 0xaf, 0xe1, 0x7a, 0xd1, 0xa5, 0x67, 0x78, 0x1e, 0x62, 0xcf, 0x8b, 0xbb, 0x23, 0x1e, - 0xcd, 0xaa, 0x89, 0xc8, 0xd3, 0x24, 0x0c, 0x74, 0x97, 0x08, 0xd1, 0x47, 0x50, 0x0b, 0xc7, 0xbd, - 0xb0, 0x1f, 0xb8, 0x3d, 0xea, 0xd8, 0xcc, 0xb7, 0xe3, 0x37, 0x37, 0xd1, 0xac, 0x57, 0xf0, 0x46, - 0x8c, 0xef, 0xfa, 0xf5, 0x08, 0x8b, 0xfe, 0x0d, 0x4a, 0x7c, 0xd2, 0xe7, 0x9b, 0x85, 0xf2, 0xc2, - 0xa4, 0x24, 0xe8, 0x0b, 0x1e, 0xbd, 0xe2, 0xd2, 0x84, 0xc7, 0xde, 0xe0, 0x06, 0xb5, 0xf8, 0xac, - 0x1e, 0x5c, 0x50, 0x66, 0xbb, 0xde, 0xa9, 0x5f, 0x2b, 0x8b, 0x80, 0xdd, 0x89, 0xc4, 0x4e, 0x85, - 0xe0, 0xe3, 0x57, 0x82, 0x96, 0x83, 0x64, 0xa1, 0x82, 0x61, 0x04, 0xd8, 0xc4, 0x50, 0x4e, 0xa1, - 0xa7, 0x54, 0x94, 0x07, 0x66, 0x45, 0x49, 0x1e, 0x82, 0x34, 0xab, 0x59, 0x48, 0xaa, 0xb0, 0x7a, - 0xc2, 0xfc, 0xd1, 0x01, 0xa1, 0xc3, 0xb8, 0xe4, 0xaf, 0x01, 0x32, 0x81, 0x52, 0xb4, 0x87, 0xbf, - 0xce, 0x40, 0xc1, 0xbc, 0x9e, 0x43, 0x15, 0x28, 0x74, 0x1a, 0xed, 0x83, 0x56, 0xfb, 0x85, 0x7d, - 0xdc, 0x69, 0xb4, 0x2b, 0x73, 0x08, 0x41, 0x49, 0x43, 0x5e, 0x77, 0x0e, 0xea, 0xdd, 0x46, 0x25, - 0x83, 0x56, 0x60, 0x41, 0x60, 0xb3, 0x28, 0x0f, 0xcb, 0x8d, 0xcf, 0x3b, 0x2d, 0xdc, 0x38, 0xa8, - 0xcc, 0x9b, 0xa4, 0xfb, 0x47, 0xc7, 0x27, 0x8d, 0x83, 0xca, 0x02, 0x02, 0x58, 0x52, 0xbf, 0x17, - 0x51, 0x15, 0xca, 0xb8, 0xb1, 0x7f, 0xfc, 0xa6, 0x81, 0x7f, 0x6c, 0x1f, 0xd6, 0x5b, 0x47, 0x8d, - 0x83, 0xca, 0x12, 0x5a, 0x85, 0xa2, 0x66, 0xda, 0xab, 0x77, 0xf7, 0x9b, 0x95, 0xe5, 0x87, 0x1d, - 0x75, 0x32, 0x92, 0x22, 0xe5, 0x61, 0xb9, 0x83, 0x1b, 0x9d, 0x3a, 0x6e, 0x54, 0xe6, 0x50, 0x01, - 0x56, 0xea, 0xfb, 0xfb, 0x8d, 0x4e, 0xb7, 0x71, 0x50, 0xc9, 0xf0, 0x2f, 0xdc, 0xf8, 0xff, 0xc6, - 0x3e, 0xff, 0xca, 0xf2, 0xad, 0x4e, 0x5a, 0x2f, 0xda, 0x42, 0x94, 0x22, 0xe4, 0x0e, 0x5b, 0xed, - 0xfa, 0x51, 0xeb, 0x0b, 0x2e, 0xc5, 0xc3, 0x3f, 0x64, 0x60, 0x75, 0xe2, 0x08, 0xc3, 0xd5, 0x68, - 0x1f, 0xb7, 0xf9, 0xb2, 0x1b, 0x80, 0x4e, 0x1a, 0xf8, 0x4d, 0x03, 0xdb, 0xaf, 0x5a, 0x27, 0x7b, - 0x8d, 0x66, 0xfd, 0x4d, 0xeb, 0x18, 0x57, 0x32, 0x68, 0x13, 0x36, 0x84, 0x50, 0xf6, 0x9b, 0x06, - 0x3e, 0x69, 0x1d, 0xb7, 0x39, 0xfa, 0x95, 0x90, 0x32, 0x8b, 0xb6, 0xe0, 0xad, 0x4e, 0x1d, 0x77, - 0x5b, 0xf5, 0x23, 0x5b, 0x0a, 0x61, 0xef, 0x1f, 0x1f, 0x1d, 0xd5, 0xbb, 0x0d, 0x5c, 0x3f, 0xaa, - 0xcc, 0xa3, 0x7b, 0xb0, 0x95, 0x42, 0x1f, 0xbc, 0xee, 0x1c, 0xb5, 0xf6, 0xeb, 0xdd, 0x86, 0xdd, - 0x69, 0x34, 0x70, 0x65, 0x01, 0x3d, 0x80, 0xfb, 0xe9, 0x15, 0x9a, 0xf5, 0x76, 0xbb, 0x71, 0x64, - 0x1f, 0xbe, 0x96, 0x16, 0x51, 0x56, 0x5a, 0xdc, 0xfd, 0x47, 0x01, 0x96, 0xba, 0xe2, 0x8a, 0x0b, - 0x7d, 0x0c, 0xcb, 0x2a, 0xc2, 0xd0, 0xad, 0xc9, 0x98, 0x13, 0xde, 0xde, 0xac, 0xcd, 0x0a, 0x46, - 0xd4, 0x00, 0x88, 0xe3, 0x00, 0xc5, 0x07, 0xbc, 0x89, 0x88, 0xd9, 0xbc, 0x3d, 0x15, 0xa7, 0x96, - 0x79, 0x09, 0x05, 0xf3, 0x81, 0x15, 0xc5, 0x5d, 0x6e, 0xca, 0xf3, 0xee, 0xe6, 0xd6, 0x0c, 0x6c, - 0x74, 0x9f, 0x9a, 0x37, 0x1e, 0xc0, 0xd1, 0x6d, 0xe3, 0x1e, 0x35, 0xfd, 0x74, 0xb3, 0x39, 0x71, - 0xdb, 0xcf, 0x45, 0x31, 0x9f, 0x4e, 0x0d, 0x51, 0xa6, 0xbc, 0xc4, 0x1a, 0xa2, 0x4c, 0x7d, 0x6f, - 0x7d, 0x09, 0x05, 0xf3, 0xa5, 0xcd, 0x58, 0x6c, 0xca, 0x53, 0xa2, 0xb1, 0xd8, 0xd4, 0xe7, 0xb9, - 0x2e, 0x94, 0x53, 0x8f, 0x5d, 0x28, 0x7e, 0x0a, 0x9c, 0xfe, 0x30, 0xb7, 0xb9, 0x3d, 0x9b, 0x40, - 0xad, 0xfa, 0x19, 0x94, 0x92, 0x0f, 0x4a, 0xe8, 0xed, 0x78, 0xc4, 0x98, 0xf6, 0xdc, 0xb5, 0x79, - 0x77, 0x26, 0x3e, 0xd6, 0xda, 0x7c, 0x6b, 0x31, 0xb4, 0x9e, 0xf2, 0xa0, 0x64, 0x68, 0x3d, 0xf5, - 0x81, 0xe6, 0x33, 0x28, 0x25, 0xdf, 0x3a, 0x0c, 0xf9, 0xa6, 0x3e, 0xb5, 0x18, 0xf2, 0x4d, 0x7f, - 0x24, 0xe1, 0x86, 0x4c, 0xdd, 0x21, 0x18, 0x86, 0x9c, 0x7e, 0xef, 0x60, 0x18, 0x72, 0xd6, 0xf5, - 0x43, 0x13, 0xf2, 0xc6, 0xed, 0xbe, 0x11, 0x76, 0x93, 0xef, 0x0e, 0x9b, 0x77, 0xa6, 0x23, 0xe3, - 0xa4, 0x8a, 0xef, 0xd0, 0x8d, 0xa4, 0x9a, 0xb8, 0xa8, 0x37, 0x92, 0x6a, 0xca, 0xa5, 0x7b, 0x13, - 0xf2, 0xc6, 0xcd, 0xb7, 0x21, 0xd0, 0xe4, 0x35, 0xba, 0x21, 0xd0, 0x94, 0xcb, 0x72, 0x2e, 0x50, - 0x7c, 0x1d, 0x62, 0x08, 0x34, 0x71, 0x71, 0x62, 0x08, 0x34, 0xe5, 0xfe, 0xe4, 0x58, 0x1d, 0x32, - 0xe3, 0xf1, 0x7d, 0x6b, 0xd6, 0x78, 0x2e, 0x57, 0x7b, 0xfb, 0x9b, 0xa7, 0x77, 0xd4, 0x86, 0x62, - 0x62, 0x94, 0x35, 0xd6, 0x9b, 0x36, 0xfb, 0x1a, 0xeb, 0x4d, 0x9f, 0x80, 0xdb, 0x50, 0x14, 0xc0, - 0x13, 0x8f, 0x8c, 0xc2, 0x73, 0x9f, 0x19, 0xeb, 0x25, 0xe0, 0x93, 0xeb, 0xa5, 0xd0, 0x6a, 0xbd, - 0x4f, 0xa1, 0xf8, 0x82, 0xb2, 0xa3, 0x78, 0x94, 0x88, 0x1f, 0xfd, 0x13, 0xa7, 0xda, 0xcd, 0x5b, - 0x13, 0x70, 0xb5, 0xc2, 0x7f, 0xc3, 0x92, 0x3c, 0x97, 0x1b, 0xac, 0x89, 0x33, 0xbf, 0xc1, 0x9a, - 0x3a, 0xc0, 0x1f, 0x42, 0x3e, 0x9e, 0x78, 0xcc, 0x30, 0x9a, 0x18, 0xb6, 0x0d, 0xaf, 0x4d, 0x19, - 0xa8, 0x79, 0x02, 0x9a, 0xda, 0x85, 0x68, 0x86, 0xda, 0xe1, 0x94, 0x04, 0x4c, 0xe1, 0xe5, 0x92, - 0x7b, 0xef, 0x7d, 0x71, 0xff, 0xcc, 0x65, 0xe7, 0xe3, 0xde, 0xe3, 0xbe, 0x3f, 0x7c, 0x32, 0xe0, - 0x73, 0x9e, 0xe7, 0x7a, 0x67, 0x03, 0xd2, 0x0b, 0x9f, 0x70, 0xd6, 0x27, 0x8a, 0xbf, 0xb7, 0x24, - 0xfe, 0xd3, 0xf4, 0x9f, 0xff, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xb2, 0xc0, 0x37, 0x04, 0x0c, 0x25, - 0x00, 0x00, + // 3562 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x3a, 0x4b, 0x73, 0xdb, 0x48, + 0x7a, 0x22, 0xf5, 0xe4, 0xc7, 0x87, 0xa8, 0xa6, 0x24, 0x73, 0x68, 0x7b, 0x6c, 0x63, 0xd7, 0x3b, + 0xb6, 0x67, 0x62, 0x4f, 0x94, 0xb5, 0x33, 0x99, 0x4c, 0xb2, 0x4b, 0x49, 0xd0, 0x88, 0x3b, 0x32, + 0xc5, 0x69, 0xd1, 0xce, 0x66, 0x2f, 0xa8, 0x26, 0xd0, 0x92, 0xb0, 0x22, 0x01, 0x06, 0x68, 0xea, + 0x71, 0xc8, 0x21, 0x95, 0xad, 0xca, 0x31, 0xa9, 0x4d, 0x25, 0xd7, 0x1c, 0xf3, 0x23, 0x52, 0x95, + 0x43, 0x4e, 0xa9, 0x4a, 0x2e, 0xf9, 0x01, 0xf9, 0x03, 0xb9, 0xe6, 0x0f, 0xa4, 0xfa, 0x05, 0x34, + 0x40, 0x70, 0xbc, 0x33, 0x97, 0xdc, 0x88, 0xef, 0xd1, 0xfd, 0x7d, 0x5f, 0x7f, 0xcf, 0x6e, 0x42, + 0x8d, 0x45, 0xc4, 0xa3, 0xd1, 0xcb, 0x69, 0x14, 0xb2, 0x10, 0xad, 0x4f, 0xc3, 0x70, 0x1c, 0x4d, + 0xdd, 0xce, 0xc7, 0x64, 0xe6, 0x32, 0x3f, 0x0c, 0x28, 0x8d, 0xa2, 0xa9, 0xfb, 0x2a, 0xfd, 0x92, + 0x84, 0xd6, 0xff, 0x94, 0x00, 0xf5, 0x02, 0x9f, 0x75, 0x5d, 0x37, 0x9c, 0x05, 0x0c, 0xd3, 0xbf, + 0x98, 0xd1, 0x98, 0xa1, 0x1f, 0x41, 0x9d, 0x48, 0x88, 0x73, 0x4d, 0xc6, 0x33, 0xda, 0x2e, 0x3d, + 0x2e, 0x3d, 0x5b, 0xc1, 0x35, 0x05, 0x7c, 0xcf, 0x61, 0xe8, 0x39, 0x6c, 0x92, 0x51, 0x1c, 0x8e, + 0x67, 0x8c, 0x3a, 0x97, 0xd4, 0xbf, 0xb8, 0x64, 0xed, 0xf2, 0xe3, 0xd2, 0xb3, 0xfa, 0xf1, 0x12, + 0x6e, 0x68, 0xc4, 0xb1, 0x80, 0x73, 0xd2, 0x88, 0x8e, 0x09, 0xf3, 0xaf, 0x13, 0xd2, 0x65, 0x4d, + 0xaa, 0x11, 0x8a, 0xf4, 0x09, 0x54, 0xdd, 0x30, 0x38, 0x77, 0x18, 0x89, 0x2e, 0x28, 0x6b, 0xaf, + 0x08, 0xb2, 0x12, 0x06, 0x0e, 0x1c, 0x0a, 0x18, 0x7a, 0x00, 0x15, 0x3f, 0xf0, 0x99, 0x4f, 0x58, + 0x18, 0xb5, 0x57, 0x1f, 0x97, 0x9e, 0x55, 0x70, 0x0a, 0xd8, 0x6f, 0x42, 0x43, 0xcb, 0x4e, 0x6f, + 0xa7, 0x7e, 0x74, 0xb7, 0xbf, 0x06, 0x2b, 0xe7, 0x94, 0xc6, 0x16, 0x85, 0xd6, 0xb7, 0xb3, 0x90, + 0xd1, 0x1f, 0xa2, 0x6c, 0x4e, 0x2c, 0xad, 0xa8, 0x21, 0x56, 0xb2, 0xcd, 0x0d, 0x6c, 0x67, 0xb7, + 0x89, 0xa7, 0x61, 0x10, 0x53, 0xf4, 0x87, 0xf0, 0xd1, 0xc4, 0x0f, 0x68, 0xe4, 0x9c, 0x53, 0xea, + 0x44, 0x84, 0x51, 0x27, 0x26, 0xcc, 0x99, 0xd2, 0xc8, 0xb9, 0xba, 0x51, 0x7b, 0x6e, 0x0b, 0x82, + 0x23, 0x4a, 0x31, 0x61, 0xf4, 0x8c, 0xb0, 0x01, 0x8d, 0xbe, 0xb9, 0x41, 0x3f, 0x81, 0xcd, 0x94, + 0x91, 0x85, 0x8c, 0x8c, 0xc5, 0xfe, 0x2b, 0xb8, 0xae, 0xc9, 0x87, 0x1c, 0x68, 0xbd, 0x81, 0xd6, + 0x89, 0x1f, 0xeb, 0xb3, 0x8c, 0xb5, 0x7e, 0x8f, 0xa0, 0x4a, 0x5c, 0x61, 0xfa, 0x30, 0x18, 0xdf, + 0x89, 0x9d, 0x36, 0x30, 0x48, 0xd0, 0x69, 0x30, 0xbe, 0xb3, 0x0e, 0x61, 0x3b, 0xcb, 0xa7, 0x04, + 0xfe, 0x0c, 0x36, 0x94, 0x0d, 0xe2, 0x76, 0xe9, 0xf1, 0xf2, 0xb3, 0xea, 0x5e, 0xf3, 0xa5, 0x72, + 0xac, 0x97, 0x5a, 0xb9, 0x84, 0xc2, 0xfa, 0x19, 0xac, 0x9d, 0xce, 0xd8, 0x74, 0xc6, 0xd0, 0x7d, + 0xa8, 0x08, 0x43, 0x72, 0xfd, 0x94, 0x62, 0x1b, 0x02, 0x70, 0x46, 0x18, 0x6a, 0xc3, 0x3a, 0xf1, + 0xbc, 0x88, 0xc6, 0xb1, 0x50, 0xa2, 0x82, 0xf5, 0xa7, 0xf5, 0x9b, 0x12, 0xd4, 0xe5, 0x0a, 0x7f, + 0xe6, 0xb3, 0xcb, 0x23, 0x4a, 0x4d, 0xda, 0x52, 0x86, 0xf6, 0x77, 0x38, 0x0e, 0xf4, 0x12, 0x5a, + 0x45, 0x86, 0xe6, 0x7e, 0xb7, 0x72, 0xbc, 0x84, 0x37, 0xcf, 0xb3, 0x56, 0x4e, 0x8e, 0xef, 0x00, + 0x76, 0xa5, 0x14, 0x31, 0x17, 0xa3, 0x37, 0x99, 0x8e, 0x7d, 0xd7, 0x67, 0x5c, 0x9c, 0xe7, 0xb0, + 0x1e, 0x4a, 0x8c, 0x32, 0xc7, 0x66, 0x62, 0x0e, 0xc9, 0x81, 0x35, 0xde, 0xfa, 0xf7, 0x12, 0xb4, + 0x0e, 0xc6, 0x61, 0x9c, 0xf7, 0xb5, 0x87, 0x00, 0x32, 0x50, 0x9d, 0x2b, 0x2a, 0x8f, 0xa2, 0x86, + 0x2b, 0x12, 0xf2, 0x0d, 0xbd, 0x43, 0x3f, 0x87, 0x4d, 0xb9, 0x82, 0x73, 0xe3, 0xb3, 0x4b, 0x7e, + 0xde, 0x42, 0xb5, 0xea, 0xde, 0x6e, 0x6e, 0x27, 0x65, 0xa1, 0xe3, 0x25, 0x5c, 0x0f, 0x33, 0x26, + 0xfb, 0xe3, 0x54, 0xc6, 0x65, 0xc1, 0xf9, 0x28, 0xc7, 0x99, 0xd7, 0xea, 0x78, 0x29, 0x91, 0x7a, + 0xbf, 0x05, 0x5b, 0xe7, 0xb3, 0xc0, 0x8b, 0x1d, 0x8f, 0xc6, 0xcc, 0x0f, 0x08, 0xcf, 0x15, 0xd6, + 0x6b, 0xd8, 0xce, 0x6a, 0xa2, 0xbc, 0xe3, 0x21, 0x80, 0xcb, 0xe1, 0x0e, 0xbb, 0xf5, 0x3d, 0xad, + 0x8a, 0x80, 0x0c, 0x6f, 0x7d, 0xcf, 0xfa, 0xbb, 0x12, 0xec, 0xf2, 0xad, 0xbc, 0x88, 0xdc, 0x7c, + 0x3f, 0x23, 0x18, 0x66, 0x2e, 0x7f, 0xb7, 0x99, 0xd1, 0x67, 0xdf, 0x71, 0xc6, 0x73, 0x27, 0x6c, + 0xfd, 0x1a, 0xee, 0xcd, 0x49, 0xa4, 0x94, 0x79, 0x01, 0xeb, 0xca, 0x91, 0x85, 0x3c, 0x45, 0x9e, + 0xae, 0x09, 0x78, 0xbe, 0xb8, 0x51, 0xcb, 0x48, 0xdd, 0xcb, 0x42, 0x83, 0x9a, 0x06, 0x0a, 0xf5, + 0xff, 0xba, 0x04, 0x3b, 0x87, 0x74, 0x1a, 0xc6, 0x73, 0xb9, 0xf5, 0x03, 0xda, 0x3f, 0x04, 0x20, + 0x13, 0x91, 0x8c, 0x78, 0xf4, 0xc8, 0x38, 0xaf, 0x48, 0x08, 0x0f, 0x9f, 0xef, 0xa7, 0xf1, 0x05, + 0xec, 0xe6, 0x85, 0xf8, 0x01, 0x0a, 0x3f, 0x81, 0x9a, 0x27, 0x57, 0x31, 0xf5, 0xad, 0x2a, 0x98, + 0x50, 0xf7, 0x3f, 0x4b, 0xd0, 0xc2, 0x34, 0xa0, 0xf9, 0xa3, 0x16, 0xb9, 0x47, 0xe6, 0xd6, 0x54, + 0x5b, 0x50, 0x20, 0x79, 0xd8, 0x69, 0x11, 0x91, 0xe9, 0x7a, 0xbe, 0x88, 0xd8, 0x02, 0x9e, 0x29, + 0x22, 0x8a, 0x74, 0xae, 0x88, 0x28, 0xd2, 0x05, 0x56, 0x5a, 0x29, 0xb4, 0xd2, 0x7c, 0xc5, 0xb0, + 0x28, 0x6c, 0x67, 0xb5, 0xf9, 0x61, 0x56, 0x8b, 0xf8, 0x1a, 0x64, 0x9c, 0xb1, 0x9a, 0x82, 0x09, + 0xab, 0x79, 0xb0, 0xb3, 0x3f, 0x9b, 0x4c, 0x15, 0x2b, 0x4f, 0xfb, 0xbf, 0x9b, 0x8f, 0x2c, 0x50, + 0xaf, 0x5c, 0xec, 0x04, 0x6d, 0xd8, 0xcd, 0xef, 0x22, 0xd5, 0xb1, 0xfe, 0xa1, 0x0c, 0xeb, 0x0a, + 0xfc, 0xa1, 0x2d, 0x7f, 0x0f, 0x36, 0x78, 0xd0, 0x85, 0x7e, 0xc0, 0x54, 0x4a, 0xda, 0x32, 0xa3, + 0x72, 0xc0, 0x11, 0x38, 0x21, 0x41, 0xdb, 0xb0, 0x2a, 0x6b, 0xa9, 0x74, 0x4c, 0xf9, 0x81, 0x3e, + 0x85, 0x2d, 0x72, 0x4d, 0xfc, 0x31, 0x19, 0x8d, 0xa9, 0x33, 0x22, 0x63, 0x12, 0xb8, 0x54, 0x1d, + 0x4a, 0x33, 0x41, 0xec, 0x4b, 0x38, 0x27, 0x16, 0xa7, 0x21, 0xb2, 0x90, 0xee, 0x1a, 0x78, 0xb5, + 0xaf, 0xe3, 0x66, 0x8a, 0x50, 0x5d, 0xc3, 0xa7, 0xb0, 0x1a, 0x33, 0xc2, 0x68, 0x7b, 0xed, 0x71, + 0xe9, 0x59, 0x63, 0x6f, 0x27, 0x7f, 0x2c, 0x67, 0x1c, 0x89, 0x25, 0x0d, 0x77, 0xca, 0x31, 0x61, + 0x34, 0x56, 0xee, 0xbc, 0x2e, 0x9d, 0x52, 0x82, 0xc4, 0xb9, 0xfc, 0x55, 0x09, 0xd0, 0xd9, 0x6c, + 0x34, 0xf1, 0xd9, 0x69, 0xe4, 0xd1, 0x48, 0x9f, 0xca, 0x63, 0x58, 0x26, 0xf1, 0x95, 0x3a, 0xf9, + 0x5a, 0xba, 0x45, 0x7c, 0x75, 0xbc, 0x84, 0x39, 0x8a, 0x53, 0x8c, 0xd4, 0x51, 0x9b, 0x14, 0xfb, + 0xbe, 0xc7, 0x29, 0x46, 0xbe, 0x97, 0xed, 0x5d, 0x96, 0xf3, 0xbd, 0x4b, 0x05, 0xd6, 0x3d, 0xca, + 0x88, 0x3f, 0x8e, 0xad, 0xdf, 0x96, 0xa0, 0x95, 0x91, 0x41, 0xb9, 0xe0, 0x57, 0x50, 0xf7, 0x83, + 0x6b, 0x32, 0xf6, 0x3d, 0x27, 0xe4, 0x08, 0x25, 0x4e, 0xaa, 0x71, 0x4f, 0x62, 0x05, 0xd7, 0xf1, + 0x12, 0xae, 0xf9, 0xc6, 0x37, 0xda, 0x83, 0x6d, 0xe2, 0xba, 0x74, 0xca, 0xa8, 0x62, 0x77, 0x82, + 0x90, 0x1f, 0x82, 0x70, 0xce, 0xe3, 0x25, 0x8c, 0x34, 0x56, 0x90, 0xf7, 0x39, 0xce, 0x14, 0xaa, + 0x0f, 0x5b, 0xbc, 0x53, 0x10, 0xc8, 0xa4, 0xbf, 0x68, 0xc3, 0xfa, 0x35, 0x8d, 0x46, 0x61, 0x4c, + 0x55, 0x6f, 0xa1, 0x3f, 0xf3, 0x9d, 0x47, 0x79, 0xae, 0xf3, 0xf8, 0x25, 0x20, 0x73, 0x3d, 0xa5, + 0xe2, 0x63, 0x58, 0x21, 0xf1, 0x95, 0x2e, 0xb2, 0x19, 0x43, 0x63, 0x81, 0xe1, 0x14, 0x23, 0xdf, + 0xd3, 0xf5, 0x21, 0x63, 0x68, 0x2c, 0x30, 0xd6, 0x6b, 0x40, 0x07, 0xdc, 0x8d, 0xc6, 0x99, 0x13, + 0x7c, 0x04, 0x55, 0x53, 0x6b, 0x95, 0x8e, 0xc2, 0x44, 0x57, 0x6b, 0x07, 0x5a, 0x19, 0x36, 0x15, + 0x28, 0xff, 0xbd, 0x0c, 0xab, 0xd2, 0x80, 0x1f, 0xce, 0xde, 0x22, 0x2a, 0xcf, 0xfd, 0x5b, 0x2a, + 0xfd, 0xa0, 0x8e, 0x2b, 0x1c, 0x72, 0xc4, 0x01, 0xa8, 0x09, 0xcb, 0x64, 0xc2, 0x54, 0x50, 0xf0, + 0x9f, 0xe8, 0x4f, 0xe1, 0xe1, 0x84, 0xdc, 0x3a, 0x23, 0xc2, 0xdc, 0x4b, 0x67, 0x71, 0xce, 0xba, + 0x37, 0x21, 0xb7, 0xfb, 0x9c, 0x26, 0xdf, 0x1b, 0xe6, 0x34, 0x5a, 0xcd, 0x6b, 0x84, 0x9e, 0x67, + 0x23, 0xa3, 0x95, 0x46, 0x2d, 0xa7, 0xc9, 0xc4, 0xc5, 0x36, 0xac, 0xce, 0x02, 0x9f, 0xc5, 0x22, + 0x22, 0xea, 0x58, 0x7e, 0xf0, 0x38, 0x14, 0x3f, 0x9c, 0x59, 0x70, 0x3e, 0x1b, 0x9f, 0xfb, 0xe3, + 0x31, 0xf5, 0xda, 0x1b, 0x32, 0x0e, 0x05, 0xe2, 0x5d, 0x0a, 0x47, 0x9f, 0x01, 0x8a, 0x68, 0x4c, + 0xa3, 0x6b, 0xea, 0x39, 0x69, 0x0f, 0x58, 0x91, 0x21, 0xae, 0x31, 0xef, 0x75, 0x2f, 0xb8, 0x07, + 0x3b, 0x6e, 0x44, 0x65, 0x80, 0x33, 0x7f, 0x42, 0x63, 0x46, 0x26, 0x53, 0x27, 0x88, 0xdb, 0x20, + 0x18, 0x5a, 0x1a, 0x39, 0xd4, 0xb8, 0x3e, 0x17, 0x67, 0x8d, 0x5e, 0x53, 0xde, 0x92, 0x56, 0xc5, + 0xe1, 0xe7, 0x14, 0xb2, 0x39, 0x0e, 0x2b, 0x12, 0xd5, 0x39, 0x3b, 0x52, 0xfe, 0x09, 0xb7, 0x5f, + 0xbb, 0x26, 0x24, 0xe7, 0x9d, 0xf3, 0x3b, 0x0e, 0x7d, 0xcb, 0x81, 0xd6, 0xdf, 0x94, 0x61, 0x79, + 0xdf, 0xf7, 0xd0, 0xb3, 0xc4, 0xd5, 0x55, 0x58, 0x35, 0xb2, 0xab, 0x63, 0x8d, 0xe6, 0xa2, 0x8f, + 0x29, 0x89, 0xa9, 0xe3, 0xcd, 0x54, 0x86, 0x1a, 0x8d, 0x43, 0xf7, 0x2a, 0x56, 0x67, 0xde, 0x12, + 0xc8, 0x43, 0x85, 0xdb, 0x17, 0x28, 0x15, 0x28, 0xb1, 0x1f, 0x06, 0xb2, 0x70, 0x61, 0xfd, 0x89, + 0x5e, 0x03, 0x17, 0xc8, 0x09, 0x42, 0x8f, 0x3a, 0xcc, 0xa7, 0x91, 0x38, 0xf5, 0x86, 0x91, 0x62, + 0xfb, 0xa1, 0x47, 0x87, 0x3e, 0x8d, 0x70, 0x75, 0xe2, 0x07, 0xfa, 0x03, 0xbd, 0x80, 0xad, 0x98, + 0x8e, 0xcf, 0x1d, 0xf7, 0x92, 0x04, 0x49, 0x3e, 0x5d, 0x95, 0x55, 0x80, 0x23, 0x0e, 0x2e, 0x49, + 0xa0, 0xd3, 0xe9, 0x53, 0x68, 0xc4, 0xbe, 0x47, 0x5d, 0x12, 0x39, 0xcc, 0x77, 0xaf, 0x28, 0x13, + 0x0e, 0x51, 0xc1, 0x75, 0x05, 0x1d, 0x0a, 0xa0, 0xf5, 0x97, 0xb0, 0xdc, 0x8d, 0xaf, 0xfe, 0xbf, + 0x0c, 0x61, 0xfd, 0x5b, 0x09, 0x20, 0x3d, 0x47, 0x5e, 0x43, 0x33, 0x7e, 0xc1, 0x65, 0x59, 0xc6, + 0x55, 0x66, 0xf8, 0xc3, 0x7d, 0xa8, 0x88, 0xc3, 0x76, 0x62, 0x16, 0xa9, 0x89, 0x62, 0x43, 0x00, + 0xce, 0x58, 0x84, 0xbe, 0x84, 0x9a, 0x70, 0x6d, 0x61, 0xa1, 0x0b, 0xaa, 0x5a, 0xe2, 0x34, 0x57, + 0xbe, 0x9b, 0x7a, 0x84, 0x51, 0x4f, 0x6c, 0x76, 0xbc, 0x84, 0xab, 0x82, 0xf8, 0x40, 0xd0, 0xa2, + 0x57, 0xb0, 0x2e, 0x3c, 0x86, 0x7a, 0xe2, 0x34, 0x4c, 0x4f, 0x13, 0x4e, 0xa3, 0x99, 0x34, 0xd5, + 0xfe, 0x3a, 0xac, 0x8a, 0x8d, 0xad, 0x7f, 0x2a, 0x41, 0xcd, 0x5c, 0x19, 0x7d, 0x09, 0x8d, 0x69, + 0x44, 0xaf, 0xfd, 0x70, 0x16, 0x3b, 0x32, 0x18, 0x4b, 0x8b, 0x83, 0xb1, 0xae, 0x49, 0xc5, 0x27, + 0xfa, 0x1c, 0x2a, 0x01, 0xbd, 0x51, 0x6c, 0xe5, 0xc5, 0x6c, 0x1b, 0x01, 0xbd, 0x91, 0x1c, 0x4f, + 0xa0, 0x26, 0x1d, 0x5e, 0xc5, 0xaa, 0x34, 0x71, 0x55, 0xc0, 0x8e, 0x04, 0xc8, 0xfa, 0x8f, 0x12, + 0x40, 0xaa, 0x04, 0xfa, 0x29, 0x54, 0x85, 0x12, 0x0b, 0x84, 0x13, 0x94, 0x72, 0x17, 0x98, 0x24, + 0xbf, 0xe7, 0xf6, 0x29, 0xcf, 0xed, 0xc3, 0x5b, 0x65, 0x65, 0x1d, 0x55, 0xac, 0x96, 0x65, 0xab, + 0xac, 0x80, 0x32, 0xa5, 0xfe, 0x0c, 0xea, 0x11, 0xfd, 0x35, 0x75, 0x99, 0x13, 0x51, 0x12, 0x87, + 0x81, 0x72, 0xfe, 0x4e, 0x76, 0x7f, 0x2c, 0x48, 0xb0, 0xa0, 0xc0, 0xb5, 0xc8, 0xf8, 0xe2, 0x0d, + 0x0e, 0xa6, 0x6e, 0x78, 0x4d, 0xa3, 0xdc, 0xe8, 0x6b, 0x9d, 0xc2, 0xbd, 0x39, 0x8c, 0x2a, 0x32, + 0x3f, 0x85, 0xdd, 0x60, 0x36, 0x71, 0x22, 0x89, 0xa6, 0x9e, 0x63, 0x8c, 0xba, 0x5c, 0x8f, 0xed, + 0x60, 0x36, 0xc1, 0x1a, 0xa9, 0xb9, 0xad, 0x16, 0x6c, 0x75, 0xe5, 0x1d, 0x4a, 0xda, 0xad, 0x59, + 0x03, 0x40, 0x26, 0x50, 0x6d, 0xf0, 0x25, 0xd4, 0xe9, 0x2d, 0x75, 0x67, 0x22, 0x26, 0xf8, 0x24, + 0x97, 0x2f, 0xd4, 0xb6, 0xc6, 0x72, 0xae, 0x1a, 0x35, 0xbe, 0xac, 0xff, 0x5a, 0x81, 0xd5, 0x13, + 0x1e, 0x38, 0xe8, 0x0d, 0xd4, 0xb9, 0xef, 0x06, 0x74, 0xec, 0xc8, 0xe6, 0xab, 0xb4, 0xa8, 0xf9, + 0xaa, 0x29, 0x3a, 0xf1, 0xc5, 0x33, 0x9f, 0xe6, 0x23, 0x13, 0x73, 0x96, 0xd0, 0xcb, 0x75, 0x27, + 0x62, 0x9e, 0x78, 0x03, 0xf7, 0x34, 0x5d, 0x3e, 0x80, 0xa5, 0xdf, 0xec, 0x28, 0x74, 0x2e, 0x84, + 0x3f, 0x87, 0x6d, 0xcd, 0x27, 0xc3, 0x5f, 0x75, 0xe4, 0xe2, 0xbe, 0x06, 0x23, 0x85, 0x13, 0x3a, + 0xa8, 0x9e, 0xfc, 0x11, 0x54, 0xa7, 0x11, 0x9d, 0xf8, 0xb3, 0x89, 0x90, 0x46, 0xa6, 0x29, 0x50, + 0x20, 0x2e, 0xca, 0x0b, 0xde, 0xf0, 0x19, 0x06, 0x13, 0x64, 0x6b, 0x32, 0x9b, 0x99, 0xd6, 0xe1, + 0xb4, 0x96, 0x30, 0x8b, 0x9f, 0xd2, 0xad, 0x0b, 0xba, 0xaa, 0x00, 0x2a, 0x9a, 0x97, 0xd0, 0x72, + 0xc7, 0x94, 0x44, 0x7e, 0x70, 0x21, 0xab, 0xea, 0x34, 0xf2, 0x5d, 0x2a, 0x4a, 0xd7, 0x0a, 0xde, + 0xd2, 0x28, 0x5e, 0x4d, 0x07, 0x1c, 0x81, 0x9e, 0x41, 0x53, 0x96, 0x52, 0x51, 0xbc, 0x05, 0x8b, + 0xaa, 0x5c, 0x0d, 0x01, 0x17, 0x25, 0x1c, 0xab, 0x06, 0xd2, 0x2c, 0xba, 0x30, 0x57, 0x74, 0x1f, + 0x40, 0x65, 0x3a, 0x8b, 0xdc, 0x4b, 0x12, 0x53, 0xaf, 0x5d, 0x15, 0x6d, 0x4f, 0x0a, 0x40, 0xaf, + 0x53, 0x9b, 0x47, 0x74, 0x12, 0x32, 0x2a, 0x13, 0x3f, 0x6f, 0x28, 0x6a, 0x62, 0x29, 0x6d, 0x5a, + 0x2c, 0xb0, 0x3c, 0xdd, 0xf3, 0xde, 0xe2, 0x4f, 0x60, 0x4b, 0xb3, 0xa5, 0x85, 0xa2, 0xbe, 0xa8, + 0x50, 0xe8, 0xe3, 0xd7, 0x00, 0xeb, 0x18, 0xea, 0xe2, 0x38, 0x92, 0xbe, 0xed, 0x3e, 0x54, 0x64, + 0xdb, 0xc1, 0x3b, 0x29, 0xde, 0x6b, 0xd5, 0xf0, 0x86, 0x00, 0xf4, 0xbc, 0x18, 0x75, 0x8c, 0xbb, + 0x9f, 0xb2, 0xc4, 0x25, 0x37, 0x3d, 0xff, 0x58, 0x82, 0x86, 0x5e, 0x4a, 0x39, 0xfb, 0x4f, 0x60, + 0x4d, 0xb8, 0x81, 0x6e, 0xda, 0xd2, 0x72, 0x21, 0x08, 0xb1, 0xc2, 0xa2, 0x57, 0xb0, 0x2d, 0x2e, + 0xb0, 0x84, 0x53, 0x52, 0x12, 0x05, 0xd4, 0x33, 0x7c, 0x73, 0x4b, 0xe0, 0xba, 0x13, 0x66, 0x0b, + 0x0c, 0x3f, 0xc4, 0x4f, 0x01, 0xa5, 0x0c, 0x53, 0xe2, 0x4b, 0x72, 0x35, 0xee, 0x6a, 0xf2, 0x01, + 0xf1, 0x39, 0xb1, 0xb5, 0x09, 0xf5, 0x61, 0x78, 0x45, 0x83, 0x24, 0xfe, 0xbf, 0x82, 0x86, 0x06, + 0x24, 0x13, 0xdc, 0x1a, 0x13, 0x10, 0x25, 0x28, 0x4a, 0x05, 0x8d, 0x09, 0x13, 0xc4, 0x58, 0x51, + 0x58, 0xff, 0x52, 0x86, 0x4a, 0x02, 0xe5, 0xb9, 0x6c, 0xc4, 0x1d, 0x7d, 0x42, 0x5c, 0x12, 0x85, + 0x61, 0xa0, 0x9a, 0xbf, 0x1a, 0x07, 0xbe, 0x55, 0x30, 0x9e, 0x13, 0xa7, 0xe4, 0x6e, 0xc2, 0xeb, + 0xd1, 0x25, 0x89, 0x2f, 0xf5, 0xd0, 0xa7, 0x60, 0xc7, 0x24, 0xbe, 0x44, 0xcf, 0xa1, 0xa9, 0x49, + 0xa6, 0x11, 0xf5, 0x27, 0x44, 0xd5, 0xa5, 0x1a, 0xde, 0x54, 0xf0, 0x81, 0x02, 0x73, 0x8f, 0x54, + 0x77, 0x01, 0x42, 0xf3, 0x09, 0x57, 0x7d, 0x45, 0x94, 0xc0, 0x86, 0x84, 0x73, 0xc5, 0xdf, 0xc6, + 0x84, 0xa1, 0xdf, 0x87, 0x9d, 0x28, 0x9c, 0x31, 0xee, 0xea, 0x3c, 0x22, 0x52, 0xf2, 0x55, 0x41, + 0x8e, 0x14, 0xf2, 0x88, 0xd2, 0x84, 0x45, 0xd5, 0x56, 0x47, 0x34, 0x59, 0xd4, 0x13, 0x91, 0xa6, + 0x6a, 0xeb, 0x81, 0x04, 0xf1, 0x3a, 0x2d, 0xc2, 0x9a, 0xca, 0x21, 0x69, 0x03, 0xeb, 0x4f, 0xce, + 0x1c, 0xb3, 0x30, 0x22, 0x17, 0xd4, 0x09, 0xc8, 0x44, 0x06, 0x55, 0x85, 0xd7, 0x4f, 0x01, 0xeb, + 0x93, 0x09, 0xb5, 0x76, 0x61, 0xfb, 0xc4, 0xac, 0xfd, 0xfa, 0x4c, 0x7e, 0xbb, 0x0c, 0x3b, 0x39, + 0x84, 0x3a, 0x1b, 0x07, 0x36, 0xb3, 0xad, 0x84, 0x3e, 0xa4, 0xbd, 0xac, 0x37, 0xe5, 0x19, 0xb3, + 0xd0, 0xd8, 0x0e, 0x58, 0x74, 0xb7, 0x5f, 0x6e, 0x97, 0x70, 0x23, 0xd3, 0x7c, 0xc4, 0x28, 0x80, + 0xdd, 0x7c, 0xaf, 0x32, 0xe3, 0x5d, 0x8f, 0x1e, 0x24, 0xbe, 0xf8, 0x3e, 0xfb, 0xec, 0x4b, 0x56, + 0xb1, 0x1b, 0xde, 0x1e, 0x17, 0xa0, 0x3a, 0x5d, 0x68, 0x15, 0x88, 0xc6, 0xa7, 0x00, 0x3d, 0x3c, + 0xd4, 0x31, 0xff, 0x99, 0x8e, 0xcb, 0x72, 0x44, 0x92, 0x1f, 0x5f, 0x96, 0xbf, 0x28, 0x75, 0x28, + 0x7c, 0xb4, 0x70, 0xd7, 0x82, 0x85, 0xf6, 0xcc, 0x85, 0x1a, 0x7b, 0x0f, 0x12, 0x85, 0xb2, 0xfc, + 0xaa, 0xed, 0x4f, 0xb6, 0xe1, 0x87, 0xd5, 0xa7, 0xb7, 0x4c, 0x8c, 0x18, 0xbd, 0xe0, 0x3c, 0xd4, + 0x87, 0xf5, 0xb7, 0x25, 0xd8, 0xc9, 0x21, 0xd4, 0x61, 0x3d, 0xca, 0xde, 0xc0, 0xca, 0xc1, 0xdc, + 0xbc, 0x7f, 0x5d, 0x70, 0x49, 0xb1, 0x56, 0x78, 0x49, 0x81, 0x3e, 0x81, 0x4d, 0x91, 0x91, 0xd3, + 0x39, 0x40, 0xa5, 0xf4, 0x86, 0x00, 0x27, 0x13, 0x80, 0xf5, 0x06, 0xb6, 0x78, 0x4a, 0xc3, 0x84, + 0xfb, 0xb3, 0x4e, 0x65, 0x4f, 0xa0, 0x26, 0x52, 0xe2, 0x74, 0x36, 0xba, 0xa2, 0x77, 0x3a, 0x9b, + 0x55, 0x39, 0x6c, 0x20, 0x41, 0xd6, 0x09, 0x20, 0x93, 0x4f, 0x69, 0xf1, 0x46, 0x31, 0x46, 0x02, + 0xac, 0xfd, 0xad, 0x95, 0x49, 0xa7, 0x8a, 0x45, 0xac, 0x26, 0x7f, 0xc7, 0x56, 0x13, 0x1a, 0x5f, + 0x53, 0x66, 0x5a, 0xea, 0x37, 0x6b, 0xb0, 0x99, 0x80, 0xd4, 0xea, 0x46, 0x9f, 0xab, 0xee, 0xaf, + 0x75, 0xc3, 0xff, 0x34, 0xb9, 0x72, 0x8a, 0x8d, 0x1b, 0xfd, 0x3a, 0xd6, 0x2f, 0x11, 0xb1, 0xb8, + 0xd1, 0xe7, 0x56, 0x49, 0xc8, 0xe4, 0xd8, 0xac, 0xaa, 0x72, 0xc2, 0xdd, 0x15, 0x50, 0x5e, 0xc6, + 0x73, 0x84, 0x8e, 0x8e, 0x5c, 0x59, 0x91, 0x77, 0xb2, 0x0c, 0xb6, 0x8a, 0xe3, 0x4f, 0x61, 0x2b, + 0xe5, 0x8b, 0xdc, 0x4b, 0xff, 0x9a, 0x7a, 0xfa, 0x92, 0x25, 0xe1, 0x50, 0x70, 0x6e, 0x65, 0x51, + 0xe3, 0xb4, 0xc8, 0x6b, 0xb2, 0xe1, 0x93, 0x30, 0x29, 0xf0, 0x8f, 0xa0, 0xae, 0x48, 0x94, 0xb8, + 0x72, 0x94, 0x54, 0x7c, 0x4a, 0xd8, 0x4f, 0x60, 0x53, 0x13, 0xe9, 0x2d, 0xe5, 0x3c, 0xd9, 0x50, + 0x64, 0x7a, 0x43, 0xde, 0x64, 0xcc, 0xa2, 0x88, 0xa7, 0x4a, 0xd1, 0x93, 0xe8, 0x5b, 0xa0, 0x8a, + 0x6a, 0x32, 0x24, 0x4e, 0x74, 0x24, 0xc9, 0x43, 0x53, 0x53, 0x94, 0x30, 0x1a, 0x3b, 0x7e, 0x70, + 0x1d, 0x8e, 0xf9, 0xda, 0x20, 0xa8, 0x37, 0x15, 0xbc, 0xa7, 0xc0, 0xbc, 0xe9, 0x35, 0x8e, 0x5e, + 0x54, 0xe9, 0x05, 0x27, 0x0f, 0xe9, 0xc9, 0x8b, 0xbb, 0x23, 0xee, 0xcd, 0xaa, 0x88, 0xc8, 0x69, + 0x12, 0xc6, 0xba, 0x4a, 0xc4, 0xe8, 0x0b, 0x68, 0xc7, 0xb3, 0x51, 0xec, 0x46, 0xfe, 0x88, 0x7a, + 0x0e, 0x0b, 0x9d, 0xf4, 0xcd, 0x4d, 0x14, 0xeb, 0x0d, 0xbc, 0x9b, 0xe2, 0x87, 0x61, 0x37, 0xc1, + 0xa2, 0x1f, 0x43, 0x83, 0x77, 0xfa, 0x7c, 0xb3, 0x58, 0x5e, 0x98, 0x34, 0x04, 0x7d, 0x2d, 0xa0, + 0x37, 0x5c, 0x9a, 0xf8, 0x34, 0x18, 0xdf, 0xa1, 0x1e, 0xef, 0xd5, 0xa3, 0x2b, 0xca, 0x1c, 0x3f, + 0x38, 0x0f, 0xdb, 0x9b, 0xc2, 0x61, 0x9f, 0x25, 0x62, 0xe7, 0x5c, 0xf0, 0xe5, 0x5b, 0x41, 0xcb, + 0x41, 0x32, 0x51, 0xc1, 0x24, 0x01, 0x74, 0x30, 0x6c, 0xe6, 0xd0, 0x05, 0x19, 0xe5, 0xb9, 0x99, + 0x51, 0xb2, 0x43, 0x90, 0x66, 0x35, 0x13, 0x49, 0x0b, 0xb6, 0xce, 0x58, 0x38, 0x3d, 0x24, 0x74, + 0x92, 0xa6, 0xfc, 0x6d, 0x40, 0x26, 0x50, 0x5d, 0xaa, 0xfc, 0x73, 0x09, 0x5a, 0xa7, 0xe7, 0xe7, + 0x34, 0x3a, 0x93, 0x13, 0xa8, 0x0e, 0x66, 0xa3, 0xb5, 0x74, 0xc9, 0x94, 0xb8, 0x3e, 0xbb, 0x33, + 0x5e, 0x92, 0x74, 0x6b, 0x79, 0xa0, 0x50, 0xaa, 0x73, 0x9c, 0x9f, 0x83, 0xcb, 0xc5, 0x73, 0xf0, + 0xc2, 0x79, 0x75, 0x79, 0xe1, 0xbc, 0x6a, 0x7d, 0x02, 0xf5, 0x33, 0x73, 0x4a, 0x46, 0xbb, 0xb0, + 0xa6, 0x86, 0x68, 0x19, 0xd7, 0xea, 0xcb, 0xfa, 0x9c, 0x4f, 0x22, 0x17, 0x7e, 0xcc, 0xe6, 0x94, + 0x5a, 0xc4, 0xf1, 0x1a, 0xee, 0xdb, 0xb7, 0x53, 0xea, 0x32, 0x45, 0x7f, 0xa0, 0x3b, 0xbf, 0xef, + 0x66, 0xfb, 0x18, 0x1e, 0x14, 0xb3, 0x49, 0xdb, 0xbe, 0xf8, 0xfb, 0x12, 0xd4, 0xcc, 0xab, 0x4f, + 0xd4, 0x84, 0xda, 0xc0, 0xee, 0x1f, 0xf6, 0xfa, 0x5f, 0x3b, 0xa7, 0x03, 0xbb, 0xdf, 0x5c, 0x42, + 0x08, 0x1a, 0x1a, 0xf2, 0x6e, 0x70, 0xd8, 0x1d, 0xda, 0xcd, 0x12, 0xda, 0x80, 0x15, 0x81, 0x2d, + 0xa3, 0x2a, 0xac, 0xdb, 0xbf, 0x1c, 0xf4, 0xb0, 0x7d, 0xd8, 0x5c, 0x36, 0x49, 0x0f, 0x4e, 0x4e, + 0xcf, 0xec, 0xc3, 0xe6, 0x0a, 0x02, 0x58, 0x53, 0xbf, 0x57, 0x51, 0x0b, 0x36, 0xb1, 0x7d, 0x70, + 0xfa, 0xde, 0xc6, 0x7f, 0xee, 0x1c, 0x75, 0x7b, 0x27, 0xf6, 0x61, 0x73, 0x0d, 0x6d, 0x41, 0x5d, + 0x33, 0xed, 0x77, 0x87, 0x07, 0xc7, 0xcd, 0xf5, 0x17, 0x03, 0x35, 0x75, 0x4a, 0x91, 0xaa, 0xb0, + 0x3e, 0xc0, 0xf6, 0xa0, 0x8b, 0xed, 0xe6, 0x12, 0xaa, 0xc1, 0x46, 0xf7, 0xe0, 0xc0, 0x1e, 0x0c, + 0xed, 0xc3, 0x66, 0x89, 0x7f, 0x61, 0xfb, 0x17, 0xf6, 0x01, 0xff, 0x2a, 0xf3, 0xad, 0xce, 0x7a, + 0x5f, 0xf7, 0x85, 0x28, 0x75, 0xa8, 0x1c, 0xf5, 0xfa, 0xdd, 0x93, 0xde, 0xaf, 0xb8, 0x14, 0x2f, + 0xfe, 0xb5, 0x04, 0x5b, 0x73, 0xe3, 0x21, 0x57, 0xa3, 0x7f, 0xda, 0xe7, 0xcb, 0xee, 0x02, 0x3a, + 0xb3, 0xf1, 0x7b, 0x1b, 0x3b, 0x6f, 0x7b, 0x67, 0xfb, 0xf6, 0x71, 0xf7, 0x7d, 0xef, 0x14, 0x37, + 0x4b, 0xa8, 0x03, 0xbb, 0x42, 0x28, 0xe7, 0xbd, 0x8d, 0xcf, 0x7a, 0xa7, 0x7d, 0x8e, 0x7e, 0x2b, + 0xa4, 0x2c, 0xa3, 0x87, 0xf0, 0xd1, 0xa0, 0x8b, 0x87, 0xbd, 0xee, 0x89, 0x23, 0x85, 0x70, 0x0e, + 0x4e, 0x4f, 0x4e, 0xba, 0x43, 0x1b, 0x77, 0x4f, 0x9a, 0xcb, 0xe8, 0x09, 0x3c, 0xcc, 0xa1, 0x0f, + 0xdf, 0x0d, 0x4e, 0x7a, 0x07, 0xdd, 0xa1, 0xed, 0x0c, 0x6c, 0x1b, 0x37, 0x57, 0xd0, 0x73, 0x78, + 0x9a, 0x5f, 0xe1, 0xb8, 0xdb, 0xef, 0xdb, 0x27, 0xce, 0xd1, 0x3b, 0x69, 0x11, 0x65, 0xa5, 0xd5, + 0xbd, 0xff, 0x6d, 0xc0, 0xda, 0x50, 0x5c, 0x1f, 0xa2, 0xaf, 0x60, 0x5d, 0x45, 0x2f, 0xba, 0x37, + 0x1f, 0xcf, 0xc2, 0x1f, 0x3a, 0xed, 0x45, 0x81, 0x8e, 0x6c, 0x80, 0x34, 0xc6, 0x50, 0x3a, 0x3c, + 0xcf, 0x45, 0x63, 0xe7, 0x7e, 0x21, 0x4e, 0x2d, 0xf3, 0x0d, 0xd4, 0xcc, 0xc7, 0x6b, 0x94, 0x76, + 0x10, 0x05, 0x4f, 0xe7, 0x9d, 0x87, 0x0b, 0xb0, 0xc9, 0x5d, 0x75, 0xd5, 0xf8, 0x73, 0x01, 0xba, + 0x6f, 0xdc, 0x51, 0xe7, 0x9f, 0xc5, 0x3a, 0x73, 0x2f, 0x29, 0x5c, 0x14, 0xf3, 0x59, 0xda, 0x10, + 0xa5, 0xe0, 0x95, 0xdb, 0x10, 0xa5, 0xf0, 0x2d, 0xfb, 0x1b, 0xa8, 0x99, 0xaf, 0x98, 0xc6, 0x62, + 0x05, 0xcf, 0xb4, 0xc6, 0x62, 0x85, 0x4f, 0x9f, 0x43, 0xd8, 0xcc, 0x3d, 0x24, 0xa2, 0xf4, 0x99, + 0xb5, 0xf8, 0xd1, 0xb3, 0xf3, 0x78, 0x31, 0x81, 0x5a, 0xf5, 0x5b, 0x68, 0x64, 0x1f, 0xeb, 0xd0, + 0xc7, 0x69, 0xfb, 0x56, 0xf4, 0x94, 0xd8, 0x79, 0xb4, 0x10, 0x9f, 0x6a, 0x6d, 0xbe, 0x63, 0x19, + 0x5a, 0x17, 0x3c, 0xd6, 0x19, 0x5a, 0x17, 0x3e, 0x7e, 0x7d, 0x0b, 0x8d, 0xec, 0x3b, 0x92, 0x21, + 0x5f, 0xe1, 0x33, 0x96, 0x21, 0x5f, 0xf1, 0x03, 0x14, 0x37, 0x64, 0xee, 0x7e, 0xc6, 0x30, 0x64, + 0xf1, 0x9d, 0x8e, 0x61, 0xc8, 0x45, 0x57, 0x3b, 0xc7, 0x50, 0x35, 0x5e, 0x4e, 0x0c, 0xb7, 0x9b, + 0x7f, 0xd3, 0xe9, 0x3c, 0x28, 0x46, 0xa6, 0x41, 0x95, 0xbe, 0x4f, 0x18, 0x41, 0x35, 0xf7, 0x08, + 0x62, 0x04, 0x55, 0xc1, 0x83, 0xc6, 0x31, 0x54, 0x8d, 0x57, 0x05, 0x43, 0xa0, 0xf9, 0x27, 0x0a, + 0x43, 0xa0, 0x82, 0x87, 0x08, 0x2e, 0x50, 0x7a, 0xd5, 0x64, 0x08, 0x34, 0x77, 0x29, 0x65, 0x08, + 0x54, 0x70, 0x37, 0x75, 0xaa, 0x06, 0xf8, 0x74, 0x34, 0x7a, 0xb8, 0x68, 0xf4, 0x91, 0xab, 0x7d, + 0xfc, 0xdd, 0x93, 0x11, 0xea, 0x43, 0x3d, 0x33, 0x26, 0x18, 0xeb, 0x15, 0xcd, 0x15, 0xc6, 0x7a, + 0xc5, 0xd3, 0x45, 0x1f, 0xea, 0x02, 0x78, 0x16, 0x90, 0x69, 0x7c, 0x19, 0x32, 0x63, 0xbd, 0x0c, + 0x7c, 0x7e, 0xbd, 0x1c, 0x5a, 0xad, 0xf7, 0x73, 0xa8, 0x7f, 0x4d, 0xd9, 0x49, 0xda, 0xa6, 0xa5, + 0x7f, 0xa8, 0xc8, 0xdc, 0x18, 0x74, 0xee, 0xcd, 0xc1, 0xd5, 0x0a, 0x7f, 0x04, 0x6b, 0xf2, 0xce, + 0xc3, 0x60, 0xcd, 0xdc, 0xa7, 0x18, 0xac, 0xb9, 0xcb, 0x91, 0x23, 0xa8, 0xa6, 0xdd, 0xa4, 0xe9, + 0x46, 0x73, 0x83, 0x8c, 0x71, 0x6a, 0x05, 0xc3, 0x0a, 0x0f, 0x40, 0x53, 0xbb, 0x18, 0x2d, 0x50, + 0x3b, 0x2e, 0x08, 0xc0, 0x1c, 0x5e, 0x2d, 0x79, 0x08, 0x35, 0xb3, 0x05, 0x33, 0x12, 0x44, 0x41, + 0x67, 0xd6, 0x49, 0x35, 0xcf, 0xb6, 0x43, 0xbf, 0xe0, 0x61, 0x9c, 0x69, 0x7b, 0x32, 0x61, 0x5c, + 0xd4, 0x10, 0x2d, 0x5c, 0xcb, 0x85, 0xed, 0xa2, 0xce, 0x06, 0xfd, 0xd8, 0xb8, 0x37, 0x5d, 0xd8, + 0x2f, 0x75, 0x9e, 0x7e, 0x80, 0x4a, 0xaa, 0xbd, 0xff, 0xc9, 0xaf, 0x9e, 0x5e, 0xf8, 0xec, 0x72, + 0x36, 0x7a, 0xe9, 0x86, 0x93, 0x57, 0x63, 0x3e, 0x3a, 0x04, 0x7e, 0x70, 0x31, 0x26, 0xa3, 0xf8, + 0x15, 0x5f, 0xe0, 0x95, 0x5a, 0x65, 0xb4, 0x26, 0xfe, 0x26, 0xf7, 0x07, 0xff, 0x17, 0x00, 0x00, + 0xff, 0xff, 0x42, 0xc4, 0xd0, 0xbf, 0x5f, 0x27, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3789,6 +4034,32 @@ type TraderClient interface { //one call. If no start batch ID is provided, the most recent finalized batch //is used as the starting point to go back from. BatchSnapshots(ctx context.Context, in *auctioneerrpc.BatchSnapshotsRequest, opts ...grpc.CallOption) (*auctioneerrpc.BatchSnapshotsResponse, error) + // pool: `sidecar offer` + //OfferSidecar is step 1/4 of the sidecar negotiation between the provider + //(the trader submitting the bid order) and the recipient (the trader + //receiving the sidecar channel). + //This step must be run by the provider. The result is a sidecar ticket with + //an offer to lease a sidecar channel for the recipient. The offer will be + //signed with the provider's lnd node public key. The ticket returned by this + //call will have the state "offered". + OfferSidecar(ctx context.Context, in *OfferSidecarRequest, opts ...grpc.CallOption) (*SidecarTicket, error) + // pool: `sidecar register` + //RegisterSidecarRequest is step 2/4 of the sidecar negotiation between the + //provider (the trader submitting the bid order) and the recipient (the trader + //receiving the sidecar channel). + //This step must be run by the recipient. The result is a sidecar ticket with + //the recipient's node information and channel funding multisig pubkey filled + //in. The ticket returned by this call will have the state "registered". + RegisterSidecar(ctx context.Context, in *RegisterSidecarRequest, opts ...grpc.CallOption) (*SidecarTicket, error) + // pool: `sidecar expect-channel` + //ExpectSidecarChannel is step 4/4 of the sidecar negotiation between the + //provider (the trader submitting the bid order) and the recipient (the trader + //receiving the sidecar channel). + //This step must be run by the recipient once the provider has submitted the + //bid order for the sidecar channel. From this point onwards the Pool trader + //daemon of both the provider as well as the recipient need to be online to + //receive and react to match making events from the server. + ExpectSidecarChannel(ctx context.Context, in *ExpectSidecarChannelRequest, opts ...grpc.CallOption) (*ExpectSidecarChannelResponse, error) } type traderClient struct { @@ -3997,6 +4268,33 @@ func (c *traderClient) BatchSnapshots(ctx context.Context, in *auctioneerrpc.Bat return out, nil } +func (c *traderClient) OfferSidecar(ctx context.Context, in *OfferSidecarRequest, opts ...grpc.CallOption) (*SidecarTicket, error) { + out := new(SidecarTicket) + err := c.cc.Invoke(ctx, "/poolrpc.Trader/OfferSidecar", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *traderClient) RegisterSidecar(ctx context.Context, in *RegisterSidecarRequest, opts ...grpc.CallOption) (*SidecarTicket, error) { + out := new(SidecarTicket) + err := c.cc.Invoke(ctx, "/poolrpc.Trader/RegisterSidecar", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *traderClient) ExpectSidecarChannel(ctx context.Context, in *ExpectSidecarChannelRequest, opts ...grpc.CallOption) (*ExpectSidecarChannelResponse, error) { + out := new(ExpectSidecarChannelResponse) + err := c.cc.Invoke(ctx, "/poolrpc.Trader/ExpectSidecarChannel", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // TraderServer is the server API for Trader service. type TraderServer interface { // pool: `getinfo` @@ -4093,6 +4391,32 @@ type TraderServer interface { //one call. If no start batch ID is provided, the most recent finalized batch //is used as the starting point to go back from. BatchSnapshots(context.Context, *auctioneerrpc.BatchSnapshotsRequest) (*auctioneerrpc.BatchSnapshotsResponse, error) + // pool: `sidecar offer` + //OfferSidecar is step 1/4 of the sidecar negotiation between the provider + //(the trader submitting the bid order) and the recipient (the trader + //receiving the sidecar channel). + //This step must be run by the provider. The result is a sidecar ticket with + //an offer to lease a sidecar channel for the recipient. The offer will be + //signed with the provider's lnd node public key. The ticket returned by this + //call will have the state "offered". + OfferSidecar(context.Context, *OfferSidecarRequest) (*SidecarTicket, error) + // pool: `sidecar register` + //RegisterSidecarRequest is step 2/4 of the sidecar negotiation between the + //provider (the trader submitting the bid order) and the recipient (the trader + //receiving the sidecar channel). + //This step must be run by the recipient. The result is a sidecar ticket with + //the recipient's node information and channel funding multisig pubkey filled + //in. The ticket returned by this call will have the state "registered". + RegisterSidecar(context.Context, *RegisterSidecarRequest) (*SidecarTicket, error) + // pool: `sidecar expect-channel` + //ExpectSidecarChannel is step 4/4 of the sidecar negotiation between the + //provider (the trader submitting the bid order) and the recipient (the trader + //receiving the sidecar channel). + //This step must be run by the recipient once the provider has submitted the + //bid order for the sidecar channel. From this point onwards the Pool trader + //daemon of both the provider as well as the recipient need to be online to + //receive and react to match making events from the server. + ExpectSidecarChannel(context.Context, *ExpectSidecarChannelRequest) (*ExpectSidecarChannelResponse, error) } // UnimplementedTraderServer can be embedded to have forward compatible implementations. @@ -4165,6 +4489,15 @@ func (*UnimplementedTraderServer) NodeRatings(ctx context.Context, req *NodeRati func (*UnimplementedTraderServer) BatchSnapshots(ctx context.Context, req *auctioneerrpc.BatchSnapshotsRequest) (*auctioneerrpc.BatchSnapshotsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method BatchSnapshots not implemented") } +func (*UnimplementedTraderServer) OfferSidecar(ctx context.Context, req *OfferSidecarRequest) (*SidecarTicket, error) { + return nil, status.Errorf(codes.Unimplemented, "method OfferSidecar not implemented") +} +func (*UnimplementedTraderServer) RegisterSidecar(ctx context.Context, req *RegisterSidecarRequest) (*SidecarTicket, error) { + return nil, status.Errorf(codes.Unimplemented, "method RegisterSidecar not implemented") +} +func (*UnimplementedTraderServer) ExpectSidecarChannel(ctx context.Context, req *ExpectSidecarChannelRequest) (*ExpectSidecarChannelResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ExpectSidecarChannel not implemented") +} func RegisterTraderServer(s *grpc.Server, srv TraderServer) { s.RegisterService(&_Trader_serviceDesc, srv) @@ -4566,6 +4899,60 @@ func _Trader_BatchSnapshots_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } +func _Trader_OfferSidecar_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(OfferSidecarRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TraderServer).OfferSidecar(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/poolrpc.Trader/OfferSidecar", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TraderServer).OfferSidecar(ctx, req.(*OfferSidecarRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Trader_RegisterSidecar_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RegisterSidecarRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TraderServer).RegisterSidecar(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/poolrpc.Trader/RegisterSidecar", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TraderServer).RegisterSidecar(ctx, req.(*RegisterSidecarRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Trader_ExpectSidecarChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExpectSidecarChannelRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TraderServer).ExpectSidecarChannel(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/poolrpc.Trader/ExpectSidecarChannel", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TraderServer).ExpectSidecarChannel(ctx, req.(*ExpectSidecarChannelRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Trader_serviceDesc = grpc.ServiceDesc{ ServiceName: "poolrpc.Trader", HandlerType: (*TraderServer)(nil), @@ -4658,6 +5045,18 @@ var _Trader_serviceDesc = grpc.ServiceDesc{ MethodName: "BatchSnapshots", Handler: _Trader_BatchSnapshots_Handler, }, + { + MethodName: "OfferSidecar", + Handler: _Trader_OfferSidecar_Handler, + }, + { + MethodName: "RegisterSidecar", + Handler: _Trader_RegisterSidecar_Handler, + }, + { + MethodName: "ExpectSidecarChannel", + Handler: _Trader_ExpectSidecarChannel_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "trader.proto", diff --git a/poolrpc/trader.pb.gw.go b/poolrpc/trader.pb.gw.go index 725e12d..534b7ca 100644 --- a/poolrpc/trader.pb.gw.go +++ b/poolrpc/trader.pb.gw.go @@ -858,6 +858,108 @@ func local_request_Trader_BatchSnapshots_2(ctx context.Context, marshaler runtim } +func request_Trader_OfferSidecar_0(ctx context.Context, marshaler runtime.Marshaler, client TraderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq OfferSidecarRequest + 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.OfferSidecar(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Trader_OfferSidecar_0(ctx context.Context, marshaler runtime.Marshaler, server TraderServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq OfferSidecarRequest + 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.OfferSidecar(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Trader_RegisterSidecar_0(ctx context.Context, marshaler runtime.Marshaler, client TraderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RegisterSidecarRequest + 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.RegisterSidecar(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Trader_RegisterSidecar_0(ctx context.Context, marshaler runtime.Marshaler, server TraderServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RegisterSidecarRequest + 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.RegisterSidecar(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Trader_ExpectSidecarChannel_0(ctx context.Context, marshaler runtime.Marshaler, client TraderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ExpectSidecarChannelRequest + 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.ExpectSidecarChannel(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Trader_ExpectSidecarChannel_0(ctx context.Context, marshaler runtime.Marshaler, server TraderServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ExpectSidecarChannelRequest + 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.ExpectSidecarChannel(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterTraderHandlerServer registers the http handlers for service Trader to "mux". // UnaryRPC :call TraderServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -1343,6 +1445,66 @@ func RegisterTraderHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser }) + mux.Handle("POST", pattern_Trader_OfferSidecar_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.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Trader_OfferSidecar_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Trader_OfferSidecar_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Trader_RegisterSidecar_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.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Trader_RegisterSidecar_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Trader_RegisterSidecar_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Trader_ExpectSidecarChannel_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.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Trader_ExpectSidecarChannel_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Trader_ExpectSidecarChannel_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -1864,6 +2026,66 @@ func RegisterTraderHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli }) + mux.Handle("POST", pattern_Trader_OfferSidecar_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_Trader_OfferSidecar_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Trader_OfferSidecar_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Trader_RegisterSidecar_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_Trader_RegisterSidecar_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Trader_RegisterSidecar_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Trader_ExpectSidecarChannel_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_Trader_ExpectSidecarChannel_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Trader_ExpectSidecarChannel_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -1915,6 +2137,12 @@ var ( pattern_Trader_BatchSnapshots_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"v1", "pool", "batch", "snapshots", "start_batch_id"}, "", runtime.AssumeColonVerbOpt(true))) pattern_Trader_BatchSnapshots_2 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5}, []string{"v1", "pool", "batch", "snapshots", "start_batch_id", "num_batches_back"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Trader_OfferSidecar_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "pool", "sidecar", "offer"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Trader_RegisterSidecar_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "pool", "sidecar", "register"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Trader_ExpectSidecarChannel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "pool", "sidecar", "expect"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -1965,4 +2193,10 @@ var ( forward_Trader_BatchSnapshots_1 = runtime.ForwardResponseMessage forward_Trader_BatchSnapshots_2 = runtime.ForwardResponseMessage + + forward_Trader_OfferSidecar_0 = runtime.ForwardResponseMessage + + forward_Trader_RegisterSidecar_0 = runtime.ForwardResponseMessage + + forward_Trader_ExpectSidecarChannel_0 = runtime.ForwardResponseMessage ) diff --git a/poolrpc/trader.proto b/poolrpc/trader.proto index 136c66c..a1075b0 100644 --- a/poolrpc/trader.proto +++ b/poolrpc/trader.proto @@ -146,6 +146,39 @@ service Trader { is used as the starting point to go back from. */ rpc BatchSnapshots (BatchSnapshotsRequest) returns (BatchSnapshotsResponse); + + /* pool: `sidecar offer` + OfferSidecar is step 1/4 of the sidecar negotiation between the provider + (the trader submitting the bid order) and the recipient (the trader + receiving the sidecar channel). + This step must be run by the provider. The result is a sidecar ticket with + an offer to lease a sidecar channel for the recipient. The offer will be + signed with the provider's lnd node public key. The ticket returned by this + call will have the state "offered". + */ + rpc OfferSidecar (OfferSidecarRequest) returns (SidecarTicket); + + /* pool: `sidecar register` + RegisterSidecarRequest is step 2/4 of the sidecar negotiation between the + provider (the trader submitting the bid order) and the recipient (the trader + receiving the sidecar channel). + This step must be run by the recipient. The result is a sidecar ticket with + the recipient's node information and channel funding multisig pubkey filled + in. The ticket returned by this call will have the state "registered". + */ + rpc RegisterSidecar (RegisterSidecarRequest) returns (SidecarTicket); + + /* pool: `sidecar expect-channel` + ExpectSidecarChannel is step 4/4 of the sidecar negotiation between the + provider (the trader submitting the bid order) and the recipient (the trader + receiving the sidecar channel). + This step must be run by the recipient once the provider has submitted the + bid order for the sidecar channel. From this point onwards the Pool trader + daemon of both the provider as well as the recipient need to be online to + receive and react to match making events from the server. + */ + rpc ExpectSidecarChannel (ExpectSidecarChannelRequest) + returns (ExpectSidecarChannelResponse); } message InitAccountRequest { @@ -998,3 +1031,60 @@ message StopDaemonRequest { message StopDaemonResponse { } + +message OfferSidecarRequest { + /* + The total channel capacity in satoshis. This will be used for the bid + order's amount and min channel/match size values. + */ + uint64 channel_capacity_sat = 1; + + /* + The number of satoshis that will be pushed to the recipient in the sidecar + channel resulting from the bid order submitted by the offering trader + (=provider). The initial outbound channel balance will be transferred from + the provider's pool account (=taker account) to the maker's account to + reimburse them for the balance they'll effectively be giving away. The + reimbursement between the recipient of the sidecar channel and the provider + (=taker) is _not_ part of the protocol and must happen out of band. The + sidecar protocol simply deducts all fees for the sidecar channel (execution + fee, lease premium, chain fees, push amount) from the taker's trading + account. + */ + uint64 self_chan_balance = 2; + + /* + The number of blocks the resulting leased channel should be open for. + */ + uint32 lease_duration_blocks = 3; +} + +message SidecarTicket { + /* + The complete sidecar ticket in its string encoded form which is base64 URL + encoded, has a human readable prefix ('sidecar...') and a checksum built in. + The string encoded version will only be used on the trader side of the API. + All requests to the auctioneer expect the ticket to be in its raw, tlv + encoded byte form. + */ + string ticket = 1; +} + +message RegisterSidecarRequest { + /* + The sidecar ticket to register and add the node and channel funding + information to. The ticket must be in the state "offered". + */ + string ticket = 1; +} + +message ExpectSidecarChannelRequest { + /* + The sidecar ticket to expect an incoming channel for. The ticket must be in + the state "ordered". + */ + string ticket = 1; +} + +message ExpectSidecarChannelResponse { +} diff --git a/poolrpc/trader.swagger.json b/poolrpc/trader.swagger.json index 561d6ff..dcf37f9 100644 --- a/poolrpc/trader.swagger.json +++ b/poolrpc/trader.swagger.json @@ -788,6 +788,105 @@ ] } }, + "/v1/pool/sidecar/expect": { + "post": { + "summary": "pool: `sidecar expect-channel`\nExpectSidecarChannel is step 4/4 of the sidecar negotiation between the\nprovider (the trader submitting the bid order) and the recipient (the trader\nreceiving the sidecar channel).\nThis step must be run by the recipient once the provider has submitted the\nbid order for the sidecar channel. From this point onwards the Pool trader\ndaemon of both the provider as well as the recipient need to be online to\nreceive and react to match making events from the server.", + "operationId": "ExpectSidecarChannel", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/poolrpcExpectSidecarChannelResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/gatewayruntimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/poolrpcExpectSidecarChannelRequest" + } + } + ], + "tags": [ + "Trader" + ] + } + }, + "/v1/pool/sidecar/offer": { + "post": { + "summary": "pool: `sidecar offer`\nOfferSidecar is step 1/4 of the sidecar negotiation between the provider\n(the trader submitting the bid order) and the recipient (the trader\nreceiving the sidecar channel).\nThis step must be run by the provider. The result is a sidecar ticket with\nan offer to lease a sidecar channel for the recipient. The offer will be\nsigned with the provider's lnd node public key. The ticket returned by this\ncall will have the state \"offered\".", + "operationId": "OfferSidecar", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/poolrpcSidecarTicket" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/gatewayruntimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/poolrpcOfferSidecarRequest" + } + } + ], + "tags": [ + "Trader" + ] + } + }, + "/v1/pool/sidecar/register": { + "post": { + "summary": "pool: `sidecar register`\nRegisterSidecarRequest is step 2/4 of the sidecar negotiation between the\nprovider (the trader submitting the bid order) and the recipient (the trader\nreceiving the sidecar channel).\nThis step must be run by the recipient. The result is a sidecar ticket with\nthe recipient's node information and channel funding multisig pubkey filled\nin. The ticket returned by this call will have the state \"registered\".", + "operationId": "RegisterSidecar", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/poolrpcSidecarTicket" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/gatewayruntimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/poolrpcRegisterSidecarRequest" + } + } + ], + "tags": [ + "Trader" + ] + } + }, "/v1/pool/stop": { "post": { "summary": "pool: `stop`\nStop gracefully shuts down the Pool trader daemon.", @@ -1187,6 +1286,18 @@ } } }, + "poolrpcExpectSidecarChannelRequest": { + "type": "object", + "properties": { + "ticket": { + "type": "string", + "description": "The sidecar ticket to expect an incoming channel for. The ticket must be in\nthe state \"ordered\"." + } + } + }, + "poolrpcExpectSidecarChannelResponse": { + "type": "object" + }, "poolrpcGetInfoResponse": { "type": "object", "properties": { @@ -1672,6 +1783,26 @@ "default": "TIER_DEFAULT", "description": " - TIER_DEFAULT: The default node tier. This value will be determined at run-time by the\ncurrent order version.\n - TIER_0: Tier 0, bid with this tier are opting out of the smaller \"higher\nquality\" pool of nodes to match their bids. Nodes in this tier are\nconsidered to have \"no rating\".\n - TIER_1: Tier 1, the \"base\" node tier. Nodes in this tier are shown to have a\nhigher degree of up time and route-ability compared to the rest of the\nnodes in the network. This is the current default node tier when\nsubmitting bid orders." }, + "poolrpcOfferSidecarRequest": { + "type": "object", + "properties": { + "channel_capacity_sat": { + "type": "string", + "format": "uint64", + "description": "The total channel capacity in satoshis. This will be used for the bid\norder's amount and min channel/match size values." + }, + "self_chan_balance": { + "type": "string", + "format": "uint64", + "description": "The number of satoshis that will be pushed to the recipient in the sidecar\nchannel resulting from the bid order submitted by the offering trader\n(=provider). The initial outbound channel balance will be transferred from\nthe provider's pool account (=taker account) to the maker's account to\nreimburse them for the balance they'll effectively be giving away. The\nreimbursement between the recipient of the sidecar channel and the provider\n(=taker) is _not_ part of the protocol and must happen out of band. The\nsidecar protocol simply deducts all fees for the sidecar channel (execution\nfee, lease premium, chain fees, push amount) from the taker's trading\naccount." + }, + "lease_duration_blocks": { + "type": "integer", + "format": "int64", + "description": "The number of blocks the resulting leased channel should be open for." + } + } + }, "poolrpcOrder": { "type": "object", "properties": { @@ -1872,6 +2003,15 @@ } } }, + "poolrpcRegisterSidecarRequest": { + "type": "object", + "properties": { + "ticket": { + "type": "string", + "description": "The sidecar ticket to register and add the node and channel funding\ninformation to. The ticket must be in the state \"offered\"." + } + } + }, "poolrpcRenewAccountRequest": { "type": "object", "properties": { @@ -1911,6 +2051,15 @@ } } }, + "poolrpcSidecarTicket": { + "type": "object", + "properties": { + "ticket": { + "type": "string", + "description": "The complete sidecar ticket in its string encoded form which is base64 URL\nencoded, has a human readable prefix ('sidecar...') and a checksum built in.\nThe string encoded version will only be used on the trader side of the API.\nAll requests to the auctioneer expect the ticket to be in its raw, tlv\nencoded byte form." + } + } + }, "poolrpcStopDaemonRequest": { "type": "object" }, diff --git a/rpcserver.go b/rpcserver.go index 5368556..b287121 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -180,7 +180,7 @@ func (s *rpcServer) Start() error { return fmt.Errorf("unable to start funding manager: %v", err) } if err := s.server.sidecarAcceptor.Start(blockErrChan); err != nil { - return fmt.Errorf("unable to start channel acceptor: %v", err) + return fmt.Errorf("unable to start sidecar acceptor: %v", err) } s.wg.Add(1) @@ -209,7 +209,7 @@ func (s *rpcServer) Stop() error { s.accountManager.Stop() s.orderManager.Stop() if err := s.auctioneer.Stop(); err != nil { - rpcLog.Errorf("Error closing server stream: %v") + rpcLog.Errorf("Error closing server stream: %v", err) } close(s.quit) @@ -2124,6 +2124,116 @@ func (s *rpcServer) StopDaemon(_ context.Context, return &poolrpc.StopDaemonResponse{}, nil } +// OfferSidecar is step 1/4 of the sidecar negotiation between the provider +// (the trader submitting the bid order) and the recipient (the trader +// receiving the sidecar channel). +// This step must be run by the provider. The result is a sidecar ticket with +// an offer to lease a sidecar channel for the recipient. The offer will be +// signed with the provider's lnd node public key. The ticket returned by this +// call will have the state "offered". +func (s *rpcServer) OfferSidecar(ctx context.Context, + req *poolrpc.OfferSidecarRequest) (*poolrpc.SidecarTicket, error) { + + // Do some basic sanity checks first. + if req.ChannelCapacitySat == 0 { + return nil, fmt.Errorf("channel capacity missing") + } + + // The funding manager does all the work, including signing and storing + // the new ticket. + ticket, err := s.server.fundingManager.OfferSidecar( + ctx, btcutil.Amount(req.ChannelCapacitySat), + btcutil.Amount(req.SelfChanBalance), req.LeaseDurationBlocks, + ) + if err != nil { + return nil, err + } + + // We'll return a nice string encoded version of the ticket to the user. + ticketStr, err := sidecar.EncodeToString(ticket) + if err != nil { + return nil, err + } + return &poolrpc.SidecarTicket{Ticket: ticketStr}, nil +} + +// RegisterSidecar is step 2/4 of the sidecar negotiation between the provider +// (the trader submitting the bid order) and the recipient (the trader receiving +// the sidecar channel). +// This step must be run by the recipient. The result is a sidecar ticket with +// the recipient's node information and channel funding multisig pubkey filled +// in. The ticket returned by this call will have the state "registered". +func (s *rpcServer) RegisterSidecar(ctx context.Context, + req *poolrpc.RegisterSidecarRequest) (*poolrpc.SidecarTicket, error) { + + // Parse the ticket from its string encoded representation. + ticket, err := sidecar.DecodeString(req.Ticket) + if err != nil { + return nil, fmt.Errorf("error decoding ticket: %v", err) + } + + // The sidecar acceptor will add all required information and add the + // ticket to our DB. + err = s.server.sidecarAcceptor.RegisterSidecar(ctx, ticket) + if err != nil { + return nil, err + } + + // We'll return a nice string encoded version of the ticket to the user. + ticketStr, err := sidecar.EncodeToString(ticket) + if err != nil { + return nil, err + } + return &poolrpc.SidecarTicket{Ticket: ticketStr}, nil +} + +// ExpectSidecarChannel is step 4/4 of the sidecar negotiation between the +// provider (the trader submitting the bid order) and the recipient (the trader +// receiving the sidecar channel). +// This step must be run by the recipient once the provider has submitted the +// bid order for the sidecar channel. From this point onwards the Pool trader +// daemon of both the provider as well as the recipient need to be online to +// receive and react to match making events from the server. +func (s *rpcServer) ExpectSidecarChannel(ctx context.Context, + req *poolrpc.ExpectSidecarChannelRequest) ( + *poolrpc.ExpectSidecarChannelResponse, error) { + + // Parse the ticket from its string encoded representation. + t, err := sidecar.DecodeString(req.Ticket) + if err != nil { + return nil, fmt.Errorf("error decoding ticket: %v", err) + } + + // Let's make sure the ticket itself and the offer is valid. + if err := sidecar.VerifyOffer(ctx, t, s.lndServices.Signer); err != nil { + return nil, fmt.Errorf("error validating order in sidecar "+ + "ticket: %v", err) + } + + // Make sure the order signature is valid and the ticket actually exists + // in our database. We need to have it stored already since must've done + // the register part before. + if err := sidecar.VerifyOrder(ctx, t, s.lndServices.Signer); err != nil { + return nil, fmt.Errorf("error validating order in sidecar "+ + "ticket: %v", err) + } + if _, err = s.server.db.Sidecar(t.ID, t.Offer.SignPubKey); err != nil { + return nil, fmt.Errorf("error looking up sidecar order for "+ + "ticket with ID %x: %v", t.ID[:], err) + } + + // Formally everything looks good so far. We can now pass the sidecar + // order with the verified information to the acceptor and let it do its + // job. + err = s.server.sidecarAcceptor.ExpectChannel(ctx, t) + if err != nil { + return nil, fmt.Errorf("error managing sidecar channel: %v", + err) + } + + return &poolrpc.ExpectSidecarChannelResponse{}, nil +} + // setTicketStateForOrder updates the sidecar ticket state we have for a given // order in our local database to the new state. func (s *rpcServer) setTicketStateForOrder(newState sidecar.State,