Merge pull request #1734 from joostjager/edgesets

routing: prune based on channel sets instead of channels
This commit is contained in:
Olaoluwa Osuntokun 2019-08-13 19:14:30 -07:00 committed by GitHub
commit d134e0362e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 1183 additions and 1026 deletions

@ -32,24 +32,43 @@ func queryMissionControl(ctx *cli.Context) error {
} }
type displayNodeHistory struct { type displayNodeHistory struct {
Pubkey string Pubkey string
LastFailTime int64 LastFailTime int64
OtherChanSuccessProb float32 OtherSuccessProb float32
Channels []*routerrpc.ChannelHistory }
type displayPairHistory struct {
NodeFrom, NodeTo string
LastFailTime int64
SuccessProb float32
MinPenalizeAmtSat int64
} }
displayResp := struct { displayResp := struct {
Nodes []displayNodeHistory Nodes []displayNodeHistory
Pairs []displayPairHistory
}{} }{}
for _, n := range snapshot.Nodes { for _, n := range snapshot.Nodes {
displayResp.Nodes = append( displayResp.Nodes = append(
displayResp.Nodes, displayResp.Nodes,
displayNodeHistory{ displayNodeHistory{
Pubkey: hex.EncodeToString(n.Pubkey), Pubkey: hex.EncodeToString(n.Pubkey),
LastFailTime: n.LastFailTime, LastFailTime: n.LastFailTime,
OtherChanSuccessProb: n.OtherChanSuccessProb, OtherSuccessProb: n.OtherSuccessProb,
Channels: n.Channels, },
)
}
for _, n := range snapshot.Pairs {
displayResp.Pairs = append(
displayResp.Pairs,
displayPairHistory{
NodeFrom: hex.EncodeToString(n.NodeFrom),
NodeTo: hex.EncodeToString(n.NodeTo),
LastFailTime: n.LastFailTime,
SuccessProb: n.SuccessProb,
MinPenalizeAmtSat: n.MinPenalizeAmtSat,
}, },
) )
} }

@ -979,9 +979,12 @@ func (m *QueryMissionControlRequest) XXX_DiscardUnknown() {
var xxx_messageInfo_QueryMissionControlRequest proto.InternalMessageInfo var xxx_messageInfo_QueryMissionControlRequest proto.InternalMessageInfo
/// QueryMissionControlResponse contains mission control state per node. /// QueryMissionControlResponse contains mission control state.
type QueryMissionControlResponse struct { type QueryMissionControlResponse struct {
Nodes []*NodeHistory `protobuf:"bytes,1,rep,name=nodes,proto3" json:"nodes,omitempty"` /// Node-level mission control state.
Nodes []*NodeHistory `protobuf:"bytes,1,rep,name=nodes,proto3" json:"nodes,omitempty"`
/// Node pair-level mission control state.
Pairs []*PairHistory `protobuf:"bytes,2,rep,name=pairs,proto3" json:"pairs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -1019,19 +1022,26 @@ func (m *QueryMissionControlResponse) GetNodes() []*NodeHistory {
return nil return nil
} }
func (m *QueryMissionControlResponse) GetPairs() []*PairHistory {
if m != nil {
return m.Pairs
}
return nil
}
/// NodeHistory contains the mission control state for a particular node. /// NodeHistory contains the mission control state for a particular node.
type NodeHistory struct { type NodeHistory struct {
/// Node pubkey /// Node pubkey
Pubkey []byte `protobuf:"bytes,1,opt,name=pubkey,proto3" json:"pubkey,omitempty"` Pubkey []byte `protobuf:"bytes,1,opt,name=pubkey,proto3" json:"pubkey,omitempty"`
/// Time stamp of last failure. Set to zero if no failure happened yet. /// Time stamp of last failure. Set to zero if no failure happened yet.
LastFailTime int64 `protobuf:"varint,2,opt,name=last_fail_time,proto3" json:"last_fail_time,omitempty"` LastFailTime int64 `protobuf:"varint,2,opt,name=last_fail_time,proto3" json:"last_fail_time,omitempty"`
/// Estimation of success probability for channels not in the channel array. //*
OtherChanSuccessProb float32 `protobuf:"fixed32,3,opt,name=other_chan_success_prob,proto3" json:"other_chan_success_prob,omitempty"` //Estimation of success probability of forwarding towards peers of this node
/// Historical information of particular channels. //for which no specific history is available.
Channels []*ChannelHistory `protobuf:"bytes,4,rep,name=channels,proto3" json:"channels,omitempty"` OtherSuccessProb float32 `protobuf:"fixed32,3,opt,name=other_success_prob,proto3" json:"other_success_prob,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
} }
func (m *NodeHistory) Reset() { *m = NodeHistory{} } func (m *NodeHistory) Reset() { *m = NodeHistory{} }
@ -1073,82 +1083,84 @@ func (m *NodeHistory) GetLastFailTime() int64 {
return 0 return 0
} }
func (m *NodeHistory) GetOtherChanSuccessProb() float32 { func (m *NodeHistory) GetOtherSuccessProb() float32 {
if m != nil { if m != nil {
return m.OtherChanSuccessProb return m.OtherSuccessProb
} }
return 0 return 0
} }
func (m *NodeHistory) GetChannels() []*ChannelHistory { /// PairHistory contains the mission control state for a particular node pair.
if m != nil { type PairHistory struct {
return m.Channels /// The source node pubkey of the pair.
} NodeFrom []byte `protobuf:"bytes,1,opt,name=node_from,proto3" json:"node_from,omitempty"`
return nil /// The destination node pubkey of the pair.
} NodeTo []byte `protobuf:"bytes,2,opt,name=node_to,proto3" json:"node_to,omitempty"`
/// NodeHistory contains the mission control state for a particular channel.
type ChannelHistory struct {
/// Short channel id
ChannelId uint64 `protobuf:"varint,1,opt,name=channel_id,proto3" json:"channel_id,omitempty"`
/// Time stamp of last failure. /// Time stamp of last failure.
LastFailTime int64 `protobuf:"varint,2,opt,name=last_fail_time,proto3" json:"last_fail_time,omitempty"` LastFailTime int64 `protobuf:"varint,3,opt,name=last_fail_time,proto3" json:"last_fail_time,omitempty"`
/// Minimum penalization amount. /// Minimum penalization amount.
MinPenalizeAmtSat int64 `protobuf:"varint,3,opt,name=min_penalize_amt_sat,proto3" json:"min_penalize_amt_sat,omitempty"` MinPenalizeAmtSat int64 `protobuf:"varint,4,opt,name=min_penalize_amt_sat,proto3" json:"min_penalize_amt_sat,omitempty"`
/// Estimation of success probability for this channel. /// Estimation of success probability for this pair.
SuccessProb float32 `protobuf:"fixed32,4,opt,name=success_prob,proto3" json:"success_prob,omitempty"` SuccessProb float32 `protobuf:"fixed32,5,opt,name=success_prob,proto3" json:"success_prob,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
} }
func (m *ChannelHistory) Reset() { *m = ChannelHistory{} } func (m *PairHistory) Reset() { *m = PairHistory{} }
func (m *ChannelHistory) String() string { return proto.CompactTextString(m) } func (m *PairHistory) String() string { return proto.CompactTextString(m) }
func (*ChannelHistory) ProtoMessage() {} func (*PairHistory) ProtoMessage() {}
func (*ChannelHistory) Descriptor() ([]byte, []int) { func (*PairHistory) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{14} return fileDescriptor_7a0613f69d37b0a5, []int{14}
} }
func (m *ChannelHistory) XXX_Unmarshal(b []byte) error { func (m *PairHistory) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChannelHistory.Unmarshal(m, b) return xxx_messageInfo_PairHistory.Unmarshal(m, b)
} }
func (m *ChannelHistory) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { func (m *PairHistory) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ChannelHistory.Marshal(b, m, deterministic) return xxx_messageInfo_PairHistory.Marshal(b, m, deterministic)
} }
func (m *ChannelHistory) XXX_Merge(src proto.Message) { func (m *PairHistory) XXX_Merge(src proto.Message) {
xxx_messageInfo_ChannelHistory.Merge(m, src) xxx_messageInfo_PairHistory.Merge(m, src)
} }
func (m *ChannelHistory) XXX_Size() int { func (m *PairHistory) XXX_Size() int {
return xxx_messageInfo_ChannelHistory.Size(m) return xxx_messageInfo_PairHistory.Size(m)
} }
func (m *ChannelHistory) XXX_DiscardUnknown() { func (m *PairHistory) XXX_DiscardUnknown() {
xxx_messageInfo_ChannelHistory.DiscardUnknown(m) xxx_messageInfo_PairHistory.DiscardUnknown(m)
} }
var xxx_messageInfo_ChannelHistory proto.InternalMessageInfo var xxx_messageInfo_PairHistory proto.InternalMessageInfo
func (m *ChannelHistory) GetChannelId() uint64 { func (m *PairHistory) GetNodeFrom() []byte {
if m != nil { if m != nil {
return m.ChannelId return m.NodeFrom
} }
return 0 return nil
} }
func (m *ChannelHistory) GetLastFailTime() int64 { func (m *PairHistory) GetNodeTo() []byte {
if m != nil {
return m.NodeTo
}
return nil
}
func (m *PairHistory) GetLastFailTime() int64 {
if m != nil { if m != nil {
return m.LastFailTime return m.LastFailTime
} }
return 0 return 0
} }
func (m *ChannelHistory) GetMinPenalizeAmtSat() int64 { func (m *PairHistory) GetMinPenalizeAmtSat() int64 {
if m != nil { if m != nil {
return m.MinPenalizeAmtSat return m.MinPenalizeAmtSat
} }
return 0 return 0
} }
func (m *ChannelHistory) GetSuccessProb() float32 { func (m *PairHistory) GetSuccessProb() float32 {
if m != nil { if m != nil {
return m.SuccessProb return m.SuccessProb
} }
@ -1172,117 +1184,118 @@ func init() {
proto.RegisterType((*QueryMissionControlRequest)(nil), "routerrpc.QueryMissionControlRequest") proto.RegisterType((*QueryMissionControlRequest)(nil), "routerrpc.QueryMissionControlRequest")
proto.RegisterType((*QueryMissionControlResponse)(nil), "routerrpc.QueryMissionControlResponse") proto.RegisterType((*QueryMissionControlResponse)(nil), "routerrpc.QueryMissionControlResponse")
proto.RegisterType((*NodeHistory)(nil), "routerrpc.NodeHistory") proto.RegisterType((*NodeHistory)(nil), "routerrpc.NodeHistory")
proto.RegisterType((*ChannelHistory)(nil), "routerrpc.ChannelHistory") proto.RegisterType((*PairHistory)(nil), "routerrpc.PairHistory")
} }
func init() { proto.RegisterFile("routerrpc/router.proto", fileDescriptor_7a0613f69d37b0a5) } func init() { proto.RegisterFile("routerrpc/router.proto", fileDescriptor_7a0613f69d37b0a5) }
var fileDescriptor_7a0613f69d37b0a5 = []byte{ var fileDescriptor_7a0613f69d37b0a5 = []byte{
// 1663 bytes of a gzipped FileDescriptorProto // 1677 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x57, 0x4f, 0x77, 0x22, 0xc7, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x57, 0x4f, 0x77, 0x22, 0xc7,
0x11, 0x37, 0x02, 0x84, 0x28, 0xfe, 0x8d, 0x5a, 0x5a, 0x89, 0x45, 0xab, 0xb5, 0x8c, 0x9d, 0xb5, 0x11, 0x37, 0x02, 0x84, 0x28, 0xfe, 0xcd, 0xb6, 0xb4, 0xda, 0x59, 0xb4, 0xb2, 0xe5, 0xb1, 0xb3,
0xde, 0x3e, 0x47, 0x72, 0xc8, 0x5b, 0x3f, 0x9f, 0x92, 0xc7, 0x42, 0x63, 0x8d, 0x17, 0x66, 0xe4, 0xd6, 0xdb, 0xe7, 0x48, 0x0e, 0x79, 0xf6, 0xcb, 0x29, 0x79, 0x2c, 0x34, 0xd6, 0xec, 0xc2, 0x8c,
0x06, 0xd6, 0xde, 0xe4, 0xd0, 0xaf, 0xc5, 0xb4, 0x60, 0x9e, 0x60, 0x06, 0xcf, 0x34, 0xce, 0x2a, 0xdc, 0xc0, 0xda, 0x9b, 0x1c, 0xfa, 0xb5, 0xa0, 0x05, 0xf3, 0x04, 0x33, 0x78, 0xa6, 0x71, 0x56,
0x87, 0xdc, 0x72, 0xcc, 0x3d, 0xdf, 0x22, 0xf9, 0x04, 0xb9, 0xe7, 0x8b, 0x24, 0xdf, 0x21, 0xa7, 0x39, 0xe4, 0x92, 0x97, 0x63, 0xee, 0xf9, 0x16, 0xf9, 0x14, 0x39, 0xe4, 0x8b, 0x24, 0xdf, 0x21,
0xbc, 0xee, 0x9e, 0x81, 0x01, 0xa1, 0xb5, 0x4f, 0x62, 0x7e, 0xbf, 0x5f, 0x57, 0x75, 0x57, 0x75, 0xa7, 0xbc, 0xee, 0x9e, 0x81, 0x01, 0xb1, 0x1b, 0x9f, 0x98, 0xfe, 0xd5, 0xaf, 0xab, 0xaa, 0xab,
0x55, 0x97, 0xe0, 0x28, 0xf0, 0x17, 0x82, 0x07, 0xc1, 0x7c, 0x74, 0xa9, 0x7f, 0x5d, 0xcc, 0x03, 0xba, 0xaa, 0x0b, 0x38, 0x0e, 0x83, 0xa5, 0xe0, 0x61, 0xb8, 0x18, 0x5d, 0xea, 0xaf, 0x8b, 0x45,
0x5f, 0xf8, 0x28, 0xbf, 0xc4, 0x6b, 0xf9, 0x60, 0x3e, 0xd2, 0x68, 0xfd, 0x7f, 0x3b, 0x80, 0xfa, 0x18, 0x88, 0x00, 0x15, 0x57, 0x78, 0xbd, 0x18, 0x2e, 0x46, 0x1a, 0xb5, 0xfe, 0xbb, 0x07, 0xa8,
0xdc, 0x73, 0xae, 0xd9, 0xfd, 0x8c, 0x7b, 0x82, 0xf0, 0x1f, 0x17, 0x3c, 0x14, 0x08, 0x41, 0xc6, 0xcf, 0xfd, 0xf1, 0x35, 0xbb, 0x9f, 0x73, 0x5f, 0x10, 0xfe, 0xe3, 0x92, 0x47, 0x02, 0x21, 0xc8,
0xe1, 0xa1, 0xa8, 0xa6, 0xce, 0x52, 0xe7, 0x45, 0xa2, 0x7e, 0x23, 0x03, 0xd2, 0x6c, 0x26, 0xaa, 0x8d, 0x79, 0x24, 0xcc, 0xcc, 0x59, 0xe6, 0xbc, 0x4c, 0xd4, 0x37, 0x32, 0x20, 0xcb, 0xe6, 0xc2,
0x3b, 0x67, 0xa9, 0xf3, 0x34, 0x91, 0x3f, 0xd1, 0x27, 0x50, 0x9c, 0xeb, 0x75, 0x74, 0xc2, 0xc2, 0xdc, 0x3b, 0xcb, 0x9c, 0x67, 0x89, 0xfc, 0x44, 0x9f, 0x42, 0x79, 0xa1, 0xf7, 0xd1, 0x29, 0x8b,
0x49, 0x35, 0xad, 0xd4, 0x85, 0x08, 0xbb, 0x62, 0xe1, 0x04, 0x9d, 0x83, 0x71, 0xeb, 0x7a, 0x6c, 0xa6, 0x66, 0x56, 0xb1, 0x4b, 0x31, 0x76, 0xc5, 0xa2, 0x29, 0x3a, 0x07, 0xe3, 0xd6, 0xf3, 0xd9,
0x4a, 0x47, 0x53, 0xf1, 0x13, 0x75, 0xf8, 0x54, 0xb0, 0x6a, 0xe6, 0x2c, 0x75, 0x9e, 0x25, 0x65, 0x8c, 0x8e, 0x66, 0xe2, 0x27, 0x3a, 0xe6, 0x33, 0xc1, 0xcc, 0xdc, 0x59, 0xe6, 0x3c, 0x4f, 0xaa,
0x85, 0xb7, 0xa6, 0xe2, 0xa7, 0xb6, 0x44, 0xd1, 0xe7, 0x50, 0x89, 0x8d, 0x05, 0x7a, 0x17, 0xd5, 0x0a, 0x6f, 0xcd, 0xc4, 0x4f, 0x6d, 0x89, 0xa2, 0x2f, 0xa0, 0x96, 0x28, 0x0b, 0xb5, 0x17, 0x66,
0xec, 0x59, 0xea, 0x3c, 0x4f, 0xca, 0xf3, 0xf5, 0xbd, 0x7d, 0x0e, 0x15, 0xe1, 0xce, 0xb8, 0xbf, 0xfe, 0x2c, 0x73, 0x5e, 0x24, 0xd5, 0xc5, 0xa6, 0x6f, 0x5f, 0x40, 0x4d, 0x78, 0x73, 0x1e, 0x2c,
0x10, 0x34, 0xe4, 0x23, 0xdf, 0x73, 0xc2, 0xea, 0xae, 0xb6, 0x18, 0xc1, 0x7d, 0x8d, 0xa2, 0x3a, 0x05, 0x8d, 0xf8, 0x28, 0xf0, 0xc7, 0x91, 0xb9, 0xaf, 0x35, 0xc6, 0x70, 0x5f, 0xa3, 0xc8, 0x82,
0x94, 0x6e, 0x39, 0xa7, 0x53, 0x77, 0xe6, 0x0a, 0x1a, 0x32, 0x51, 0xcd, 0xa9, 0xad, 0x17, 0x6e, 0xca, 0x2d, 0xe7, 0x74, 0xe6, 0xcd, 0x3d, 0x41, 0x23, 0x26, 0xcc, 0x82, 0x72, 0xbd, 0x74, 0xcb,
0x39, 0xef, 0x4a, 0xac, 0xcf, 0x84, 0xdc, 0x9f, 0xbf, 0x10, 0x63, 0xdf, 0xf5, 0xc6, 0x74, 0x34, 0x79, 0x57, 0x62, 0x7d, 0x26, 0xa4, 0x7f, 0xc1, 0x52, 0x4c, 0x02, 0xcf, 0x9f, 0xd0, 0xd1, 0x94,
0x61, 0x1e, 0x75, 0x9d, 0xea, 0xde, 0x59, 0xea, 0x3c, 0x43, 0xca, 0x31, 0xde, 0x9a, 0x30, 0xcf, 0xf9, 0xd4, 0x1b, 0x9b, 0x07, 0x67, 0x99, 0xf3, 0x1c, 0xa9, 0x26, 0x78, 0x6b, 0xca, 0x7c, 0x7b,
0x74, 0xd0, 0x29, 0x80, 0x3a, 0x83, 0x32, 0x57, 0xcd, 0x2b, 0x8f, 0x79, 0x89, 0x28, 0x5b, 0xa8, 0x8c, 0x4e, 0x01, 0xd4, 0x19, 0x94, 0x3a, 0xb3, 0xa8, 0x2c, 0x16, 0x25, 0xa2, 0x74, 0xa1, 0x06,
0x01, 0x05, 0x15, 0x60, 0x3a, 0x71, 0x3d, 0x11, 0x56, 0xe1, 0x2c, 0x7d, 0x5e, 0x68, 0x18, 0x17, 0x94, 0x54, 0x80, 0xe9, 0xd4, 0xf3, 0x45, 0x64, 0xc2, 0x59, 0xf6, 0xbc, 0xd4, 0x30, 0x2e, 0x66,
0x53, 0x4f, 0xc6, 0x9a, 0x48, 0xe6, 0xca, 0xf5, 0x04, 0x49, 0x8a, 0xea, 0x5f, 0xc3, 0xc1, 0x20, 0xbe, 0x8c, 0x35, 0x91, 0x92, 0x2b, 0xcf, 0x17, 0x24, 0x4d, 0xb2, 0x7e, 0x03, 0x87, 0x83, 0x90,
0x60, 0xa3, 0xbb, 0x8d, 0xe0, 0x6f, 0x86, 0x35, 0xf5, 0x20, 0xac, 0xf5, 0xbf, 0x40, 0x29, 0x5a, 0x8d, 0xee, 0xb6, 0x82, 0xbf, 0x1d, 0xd6, 0xcc, 0x83, 0xb0, 0x5a, 0x7f, 0x86, 0x4a, 0xbc, 0xa9,
0xd4, 0x17, 0x4c, 0x2c, 0x42, 0xf4, 0x6b, 0xc8, 0x86, 0x82, 0x09, 0xae, 0xc4, 0xe5, 0xc6, 0xf1, 0x2f, 0x98, 0x58, 0x46, 0xe8, 0x97, 0x90, 0x8f, 0x04, 0x13, 0x5c, 0x91, 0xab, 0x8d, 0x27, 0x17,
0xc5, 0x32, 0xdb, 0x17, 0x09, 0x21, 0x27, 0x5a, 0x85, 0x6a, 0xb0, 0x37, 0x0f, 0xb8, 0x3b, 0x63, 0xab, 0x6c, 0x5f, 0xa4, 0x88, 0x9c, 0x68, 0x16, 0xaa, 0xc3, 0xc1, 0x22, 0xe4, 0xde, 0x9c, 0x4d,
0x63, 0xae, 0x12, 0x5a, 0x24, 0xcb, 0x6f, 0x54, 0x87, 0xac, 0x5a, 0xac, 0xd2, 0x59, 0x68, 0x14, 0xb8, 0x4a, 0x68, 0x99, 0xac, 0xd6, 0xc8, 0x82, 0xbc, 0xda, 0xac, 0xd2, 0x59, 0x6a, 0x94, 0xd3,
0x93, 0x67, 0x20, 0x9a, 0xaa, 0xff, 0x0e, 0x2a, 0xea, 0xbb, 0xc3, 0xf9, 0x87, 0xae, 0xcc, 0x31, 0x67, 0x20, 0x5a, 0x64, 0xfd, 0x16, 0x6a, 0x6a, 0xdd, 0xe1, 0xfc, 0x43, 0x57, 0xe6, 0x09, 0x14,
0xe4, 0xd8, 0x4c, 0xc7, 0x5e, 0x5f, 0x9b, 0x5d, 0x36, 0x93, 0x61, 0xaf, 0x3b, 0x60, 0xac, 0xd6, 0xd8, 0x5c, 0xc7, 0x5e, 0x5f, 0x9b, 0x7d, 0x36, 0x97, 0x61, 0xb7, 0xc6, 0x60, 0xac, 0xf7, 0x47,
0x87, 0x73, 0xdf, 0x0b, 0xb9, 0x4c, 0x85, 0x34, 0x2e, 0x33, 0x21, 0xd3, 0x36, 0x93, 0xab, 0x52, 0x8b, 0xc0, 0x8f, 0xb8, 0x4c, 0x85, 0x54, 0x2e, 0x33, 0x21, 0xd3, 0x36, 0x97, 0xbb, 0x32, 0x6a,
0x6a, 0x55, 0x39, 0xc2, 0x3b, 0x9c, 0xf7, 0x42, 0x26, 0xd0, 0x0b, 0x7d, 0x03, 0xe8, 0xd4, 0x1f, 0x57, 0x35, 0xc6, 0x3b, 0x9c, 0xf7, 0x22, 0x26, 0xd0, 0x73, 0x7d, 0x03, 0xe8, 0x2c, 0x18, 0xdd,
0xdd, 0xc9, 0x3b, 0xc5, 0xee, 0x23, 0xf3, 0x25, 0x09, 0x77, 0xfd, 0xd1, 0x5d, 0x5b, 0x82, 0xf5, 0xc9, 0x3b, 0xc5, 0xee, 0x63, 0xf5, 0x15, 0x09, 0x77, 0x83, 0xd1, 0x5d, 0x5b, 0x82, 0xd6, 0x1f,
0x3f, 0xea, 0xbb, 0x3d, 0xf0, 0xf5, 0xde, 0x7f, 0x71, 0x78, 0x57, 0x21, 0xd8, 0x79, 0x3c, 0x04, 0xf4, 0xdd, 0x1e, 0x04, 0xda, 0xf7, 0x9f, 0x1d, 0xde, 0x75, 0x08, 0xf6, 0xde, 0x1f, 0x02, 0x0a,
0x14, 0x0e, 0xd6, 0x8c, 0x47, 0xa7, 0x48, 0x46, 0x36, 0xb5, 0x11, 0xd9, 0x2f, 0x20, 0x77, 0xcb, 0x87, 0x1b, 0xca, 0xe3, 0x53, 0xa4, 0x23, 0x9b, 0xd9, 0x8a, 0xec, 0x97, 0x50, 0xb8, 0x65, 0xde,
0xdc, 0xe9, 0x22, 0x88, 0x0d, 0xa3, 0x44, 0x9a, 0x3a, 0x9a, 0x21, 0xb1, 0xa4, 0xfe, 0xef, 0x1c, 0x6c, 0x19, 0x26, 0x8a, 0x51, 0x2a, 0x4d, 0x1d, 0x2d, 0x21, 0x09, 0xc5, 0xfa, 0x57, 0x01, 0x0a,
0xe4, 0x22, 0x10, 0x35, 0x20, 0x33, 0xf2, 0x9d, 0x38, 0xbb, 0xcf, 0x1f, 0x2e, 0x8b, 0xff, 0xb6, 0x31, 0x88, 0x1a, 0x90, 0x1b, 0x05, 0xe3, 0x24, 0xbb, 0x1f, 0x3f, 0xdc, 0x96, 0xfc, 0xb6, 0x82,
0x7c, 0x87, 0x13, 0xa5, 0x45, 0xbf, 0x87, 0xb2, 0xbc, 0xd1, 0x1e, 0x9f, 0xd2, 0xc5, 0xdc, 0x61, 0x31, 0x27, 0x8a, 0x8b, 0x7e, 0x07, 0x55, 0x79, 0xa3, 0x7d, 0x3e, 0xa3, 0xcb, 0xc5, 0x98, 0xad,
0xcb, 0x84, 0x56, 0x13, 0xab, 0x5b, 0x5a, 0x30, 0x54, 0x3c, 0x29, 0x8d, 0x92, 0x9f, 0xe8, 0x04, 0x12, 0x6a, 0xa6, 0x76, 0xb7, 0x34, 0x61, 0xa8, 0xe4, 0xa4, 0x32, 0x4a, 0x2f, 0xd1, 0x09, 0x14,
0xf2, 0x13, 0x31, 0x1d, 0xe9, 0x4c, 0x64, 0x54, 0x51, 0xec, 0x49, 0x40, 0xe5, 0xa0, 0x0e, 0x25, 0xa7, 0x62, 0x36, 0xd2, 0x99, 0xc8, 0xa9, 0xa2, 0x38, 0x90, 0x80, 0xca, 0x81, 0x05, 0x95, 0xc0,
0xdf, 0x73, 0x7d, 0x8f, 0x86, 0x13, 0x46, 0x1b, 0xaf, 0xbe, 0x52, 0xc5, 0x5a, 0x24, 0x05, 0x05, 0xf7, 0x02, 0x9f, 0x46, 0x53, 0x46, 0x1b, 0x5f, 0x7f, 0xa3, 0x8a, 0xb5, 0x4c, 0x4a, 0x0a, 0xec,
0xf6, 0x27, 0xac, 0xf1, 0xea, 0x2b, 0xf4, 0x31, 0x14, 0x54, 0xc9, 0xf0, 0xf7, 0x73, 0x37, 0xb8, 0x4f, 0x59, 0xe3, 0xeb, 0x6f, 0xd0, 0x27, 0x50, 0x52, 0x25, 0xc3, 0xdf, 0x2d, 0xbc, 0xf0, 0x5e,
0x57, 0x55, 0x5a, 0x22, 0xaa, 0x8a, 0xb0, 0x42, 0xd0, 0x21, 0x64, 0x6f, 0xa7, 0x6c, 0x1c, 0xaa, 0x55, 0x69, 0x85, 0xa8, 0x2a, 0xc2, 0x0a, 0x41, 0x47, 0x90, 0xbf, 0x9d, 0xb1, 0x49, 0xa4, 0x2a,
0xca, 0x2c, 0x11, 0xfd, 0x81, 0xbe, 0x84, 0xc3, 0x28, 0x06, 0x34, 0xf4, 0x17, 0xc1, 0x88, 0x53, 0xb3, 0x42, 0xf4, 0x02, 0x7d, 0x05, 0x47, 0x71, 0x0c, 0x68, 0x14, 0x2c, 0xc3, 0x11, 0xa7, 0x9e,
0xd7, 0x73, 0xf8, 0x7b, 0x55, 0x97, 0x25, 0x82, 0x22, 0xae, 0xaf, 0x28, 0x53, 0x32, 0xf5, 0xbf, 0x3f, 0xe6, 0xef, 0x54, 0x5d, 0x56, 0x08, 0x8a, 0x65, 0x7d, 0x25, 0xb2, 0xa5, 0xc4, 0xfa, 0x7b,
0x67, 0xa1, 0x90, 0x08, 0x00, 0x2a, 0xc2, 0x1e, 0xc1, 0x7d, 0x4c, 0xde, 0xe2, 0xb6, 0xf1, 0x11, 0x1e, 0x4a, 0xa9, 0x00, 0xa0, 0x32, 0x1c, 0x10, 0xdc, 0xc7, 0xe4, 0x0d, 0x6e, 0x1b, 0x1f, 0xa1,
0x3a, 0x87, 0xcf, 0x4c, 0xab, 0x65, 0x13, 0x82, 0x5b, 0x03, 0x6a, 0x13, 0x3a, 0xb4, 0xde, 0x58, 0x73, 0xf8, 0xdc, 0x76, 0x5a, 0x2e, 0x21, 0xb8, 0x35, 0xa0, 0x2e, 0xa1, 0x43, 0xe7, 0xb5, 0xe3,
0xf6, 0xf7, 0x16, 0xbd, 0x6e, 0xbe, 0xeb, 0x61, 0x6b, 0x40, 0xdb, 0x78, 0xd0, 0x34, 0xbb, 0x7d, 0x7e, 0xef, 0xd0, 0xeb, 0xe6, 0xdb, 0x1e, 0x76, 0x06, 0xb4, 0x8d, 0x07, 0x4d, 0xbb, 0xdb, 0x37,
0x23, 0x85, 0x9e, 0x41, 0x75, 0xa5, 0x8c, 0xe9, 0x66, 0xcf, 0x1e, 0x5a, 0x03, 0x63, 0x07, 0x7d, 0x32, 0xe8, 0x19, 0x98, 0x6b, 0x66, 0x22, 0x6e, 0xf6, 0xdc, 0xa1, 0x33, 0x30, 0xf6, 0xd0, 0x27,
0x0c, 0x27, 0x1d, 0xd3, 0x6a, 0x76, 0xe9, 0x4a, 0xd3, 0xea, 0x0e, 0xde, 0x52, 0xfc, 0xc3, 0xb5, 0x70, 0xd2, 0xb1, 0x9d, 0x66, 0x97, 0xae, 0x39, 0xad, 0xee, 0xe0, 0x0d, 0xc5, 0x3f, 0x5c, 0xdb,
0x49, 0xde, 0x19, 0xe9, 0x6d, 0x82, 0xab, 0x41, 0xb7, 0x15, 0x5b, 0xc8, 0xa0, 0xa7, 0xf0, 0x44, 0xe4, 0xad, 0x91, 0xdd, 0x45, 0xb8, 0x1a, 0x74, 0x5b, 0x89, 0x86, 0x1c, 0x7a, 0x0a, 0x8f, 0x35,
0x0b, 0xf4, 0x12, 0x3a, 0xb0, 0x6d, 0xda, 0xb7, 0x6d, 0xcb, 0xc8, 0xa2, 0x7d, 0x28, 0x99, 0xd6, 0x41, 0x6f, 0xa1, 0x03, 0xd7, 0xa5, 0x7d, 0xd7, 0x75, 0x8c, 0x3c, 0x7a, 0x04, 0x15, 0xdb, 0x79,
0xdb, 0x66, 0xd7, 0x6c, 0x53, 0x82, 0x9b, 0xdd, 0x9e, 0xb1, 0x8b, 0x0e, 0xa0, 0xb2, 0xa9, 0xcb, 0xd3, 0xec, 0xda, 0x6d, 0x4a, 0x70, 0xb3, 0xdb, 0x33, 0xf6, 0xd1, 0x21, 0xd4, 0xb6, 0x79, 0x05,
0x49, 0x13, 0xb1, 0xce, 0xb6, 0x4c, 0xdb, 0xa2, 0x6f, 0x31, 0xe9, 0x9b, 0xb6, 0x65, 0xec, 0xa1, 0xa9, 0x22, 0xe1, 0xb9, 0x8e, 0xed, 0x3a, 0xf4, 0x0d, 0x26, 0x7d, 0xdb, 0x75, 0x8c, 0x03, 0x74,
0x23, 0x40, 0xeb, 0xd4, 0x55, 0xaf, 0xd9, 0x32, 0xf2, 0xe8, 0x09, 0xec, 0xaf, 0xe3, 0x6f, 0xf0, 0x0c, 0x68, 0x53, 0x74, 0xd5, 0x6b, 0xb6, 0x8c, 0x22, 0x7a, 0x0c, 0x8f, 0x36, 0xf1, 0xd7, 0xf8,
0x3b, 0x03, 0x50, 0x15, 0x0e, 0xf5, 0xc6, 0xe8, 0x6b, 0xdc, 0xb5, 0xbf, 0xa7, 0x3d, 0xd3, 0x32, 0xad, 0x01, 0xc8, 0x84, 0x23, 0xed, 0x18, 0x7d, 0x89, 0xbb, 0xee, 0xf7, 0xb4, 0x67, 0x3b, 0x76,
0x7b, 0xc3, 0x9e, 0x51, 0x40, 0x87, 0x60, 0x74, 0x30, 0xa6, 0xa6, 0xd5, 0x1f, 0x76, 0x3a, 0x66, 0x6f, 0xd8, 0x33, 0x4a, 0xe8, 0x08, 0x8c, 0x0e, 0xc6, 0xd4, 0x76, 0xfa, 0xc3, 0x4e, 0xc7, 0x6e,
0xcb, 0xc4, 0xd6, 0xc0, 0x28, 0x6a, 0xcf, 0xdb, 0x0e, 0x5e, 0x92, 0x0b, 0x5a, 0x57, 0x4d, 0xcb, 0xd9, 0xd8, 0x19, 0x18, 0x65, 0x6d, 0x79, 0xd7, 0xc1, 0x2b, 0x72, 0x43, 0xeb, 0xaa, 0xe9, 0x38,
0xc2, 0x5d, 0xda, 0x36, 0xfb, 0xcd, 0xd7, 0x5d, 0xdc, 0x36, 0xca, 0xe8, 0x14, 0x9e, 0x0e, 0x70, 0xb8, 0x4b, 0xdb, 0x76, 0xbf, 0xf9, 0xb2, 0x8b, 0xdb, 0x46, 0x15, 0x9d, 0xc2, 0xd3, 0x01, 0xee,
0xef, 0xda, 0x26, 0x4d, 0xf2, 0x8e, 0xc6, 0x7c, 0xa7, 0x69, 0x76, 0x87, 0x04, 0x1b, 0x15, 0xf4, 0x5d, 0xbb, 0xa4, 0x49, 0xde, 0xd2, 0x44, 0xde, 0x69, 0xda, 0xdd, 0x21, 0xc1, 0x46, 0x0d, 0x7d,
0x09, 0x9c, 0x12, 0xfc, 0xdd, 0xd0, 0x24, 0xb8, 0x4d, 0x2d, 0xbb, 0x8d, 0x69, 0x07, 0x37, 0x07, 0x0a, 0xa7, 0x04, 0x7f, 0x37, 0xb4, 0x09, 0x6e, 0x53, 0xc7, 0x6d, 0x63, 0xda, 0xc1, 0xcd, 0xc1,
0x43, 0x82, 0x69, 0xcf, 0xec, 0xf7, 0x4d, 0xeb, 0x1b, 0xc3, 0x40, 0x9f, 0xc1, 0xd9, 0x52, 0xb2, 0x90, 0x60, 0xda, 0xb3, 0xfb, 0x7d, 0xdb, 0xf9, 0xd6, 0x30, 0xd0, 0xe7, 0x70, 0xb6, 0xa2, 0xac,
0x34, 0xb0, 0xa1, 0xda, 0x97, 0xe7, 0x8b, 0x53, 0x6a, 0xe1, 0x1f, 0x06, 0xf4, 0x1a, 0x63, 0x62, 0x14, 0x6c, 0xb1, 0x1e, 0xc9, 0xf3, 0x25, 0x29, 0x75, 0xf0, 0x0f, 0x03, 0x7a, 0x8d, 0x31, 0x31,
0x20, 0x54, 0x83, 0xa3, 0x95, 0x7b, 0xed, 0x20, 0xf2, 0x7d, 0x20, 0xb9, 0x6b, 0x4c, 0x7a, 0x4d, 0x10, 0xaa, 0xc3, 0xf1, 0xda, 0xbc, 0x36, 0x10, 0xdb, 0x3e, 0x94, 0xb2, 0x6b, 0x4c, 0x7a, 0x4d,
0x4b, 0x26, 0x78, 0x8d, 0x3b, 0x94, 0xdb, 0x5e, 0x71, 0x9b, 0xdb, 0x7e, 0x82, 0x0e, 0xa1, 0x12, 0x47, 0x26, 0x78, 0x43, 0x76, 0x24, 0xdd, 0x5e, 0xcb, 0xb6, 0xdd, 0x7e, 0x8c, 0x8e, 0xa0, 0x96,
0x7b, 0x8b, 0xc1, 0xff, 0xe4, 0xd0, 0x31, 0xa0, 0xa1, 0x45, 0x70, 0xb3, 0x2d, 0x0f, 0xbf, 0x24, 0x58, 0x4b, 0xc0, 0x7f, 0x17, 0xd0, 0x13, 0x40, 0x43, 0x87, 0xe0, 0x66, 0x5b, 0x1e, 0x7e, 0x25,
0xfe, 0x9b, 0xfb, 0x36, 0xb3, 0xb7, 0x63, 0xa4, 0xeb, 0xff, 0x48, 0x43, 0x69, 0xad, 0xd6, 0xd0, 0xf8, 0x4f, 0xe1, 0x55, 0xee, 0x60, 0xcf, 0xc8, 0x5a, 0xff, 0xc8, 0x42, 0x65, 0xa3, 0xd6, 0xd0,
0x33, 0xc8, 0x87, 0xee, 0xd8, 0x63, 0x42, 0x76, 0x03, 0xdd, 0x28, 0x56, 0x80, 0x7a, 0x6c, 0x26, 0x33, 0x28, 0x46, 0xde, 0xc4, 0x67, 0x42, 0x76, 0x03, 0xdd, 0x28, 0xd6, 0x80, 0x7a, 0x6c, 0xa6,
0xcc, 0xf5, 0x74, 0x87, 0xd2, 0x1d, 0x3a, 0xaf, 0x10, 0xd5, 0x9f, 0x8e, 0x21, 0x17, 0x3f, 0x56, 0xcc, 0xf3, 0x75, 0x87, 0xd2, 0x1d, 0xba, 0xa8, 0x10, 0xd5, 0x9f, 0x9e, 0x40, 0x21, 0x79, 0xac,
0x69, 0x55, 0x97, 0xbb, 0x23, 0xfd, 0x48, 0x3d, 0x83, 0xbc, 0x6c, 0x81, 0xa1, 0x60, 0xb3, 0xb9, 0xb2, 0xaa, 0x2e, 0xf7, 0x47, 0xfa, 0x91, 0x7a, 0x06, 0x45, 0xd9, 0x02, 0x23, 0xc1, 0xe6, 0x0b,
0x2a, 0xd9, 0x12, 0x59, 0x01, 0xe8, 0x53, 0x28, 0xcd, 0x78, 0x18, 0xb2, 0x31, 0xa7, 0xba, 0xec, 0x55, 0xb2, 0x15, 0xb2, 0x06, 0xd0, 0x67, 0x50, 0x99, 0xf3, 0x28, 0x62, 0x13, 0x4e, 0x75, 0xd9,
0x40, 0x29, 0x8a, 0x11, 0xd8, 0x51, 0xd5, 0xf7, 0x29, 0xc4, 0x6d, 0x20, 0x12, 0x65, 0xb5, 0x28, 0x81, 0x62, 0x94, 0x63, 0xb0, 0xa3, 0xaa, 0xef, 0x33, 0x48, 0xda, 0x40, 0x4c, 0xca, 0x6b, 0x52,
0x02, 0xb5, 0x68, 0xb3, 0x03, 0x0b, 0x16, 0x55, 0x77, 0xb2, 0x03, 0x0b, 0x86, 0x5e, 0xc2, 0xbe, 0x0c, 0x6a, 0xd2, 0x76, 0x07, 0x16, 0x2c, 0xae, 0xee, 0x74, 0x07, 0x16, 0x0c, 0xbd, 0x80, 0x47,
0x6e, 0x21, 0xae, 0xe7, 0xce, 0x16, 0x33, 0xdd, 0x4a, 0x72, 0x6a, 0xcb, 0x15, 0xd5, 0x4a, 0x34, 0xba, 0x85, 0x78, 0xbe, 0x37, 0x5f, 0xce, 0x75, 0x2b, 0x29, 0x28, 0x97, 0x6b, 0xaa, 0x95, 0x68,
0xae, 0x3a, 0xca, 0x53, 0xd8, 0xbb, 0x61, 0x21, 0x97, 0xcd, 0x3f, 0x2a, 0xf5, 0x9c, 0xfc, 0xee, 0x5c, 0x75, 0x94, 0xa7, 0x70, 0x70, 0xc3, 0x22, 0x2e, 0x9b, 0x7f, 0x5c, 0xea, 0x05, 0xb9, 0xee,
0x70, 0x2e, 0x29, 0xf9, 0x24, 0x04, 0xb2, 0x89, 0xe5, 0x35, 0x75, 0xcb, 0x39, 0x91, 0x71, 0x5c, 0x70, 0x2e, 0x45, 0xf2, 0x49, 0x08, 0x65, 0x13, 0x2b, 0x6a, 0xd1, 0x2d, 0xe7, 0x44, 0xc6, 0x71,
0x7a, 0x60, 0xef, 0x57, 0x1e, 0x0a, 0x09, 0x0f, 0x1a, 0x57, 0x1e, 0x5e, 0xc2, 0x3e, 0x7f, 0x2f, 0x65, 0x81, 0xbd, 0x5b, 0x5b, 0x28, 0xa5, 0x2c, 0x68, 0x5c, 0x59, 0x78, 0x01, 0x8f, 0xf8, 0x3b,
0x02, 0x46, 0xfd, 0x39, 0xfb, 0x71, 0xc1, 0xa9, 0xc3, 0x04, 0xab, 0x16, 0x55, 0x70, 0x2b, 0x8a, 0x11, 0x32, 0x1a, 0x2c, 0xd8, 0x8f, 0x4b, 0x4e, 0xc7, 0x4c, 0x30, 0xb3, 0xac, 0x82, 0x5b, 0x53,
0xb0, 0x15, 0xde, 0x66, 0x82, 0xd5, 0x9f, 0x41, 0x8d, 0xf0, 0x90, 0x8b, 0x9e, 0x1b, 0x86, 0xae, 0x02, 0x57, 0xe1, 0x6d, 0x26, 0x98, 0xf5, 0x0c, 0xea, 0x84, 0x47, 0x5c, 0xf4, 0xbc, 0x28, 0xf2,
0xef, 0xb5, 0x7c, 0x4f, 0x04, 0xfe, 0x34, 0x7a, 0x43, 0xea, 0xa7, 0x70, 0xb2, 0x95, 0xd5, 0x8f, 0x02, 0xbf, 0x15, 0xf8, 0x22, 0x0c, 0x66, 0xf1, 0x1b, 0x62, 0x9d, 0xc2, 0xc9, 0x4e, 0xa9, 0x7e,
0x80, 0x5c, 0xfc, 0xdd, 0x82, 0x07, 0xf7, 0xdb, 0x17, 0xbf, 0x81, 0x93, 0xad, 0x6c, 0xf4, 0x82, 0x04, 0xe4, 0xe6, 0xef, 0x96, 0x3c, 0xbc, 0xdf, 0xbd, 0xf9, 0x1e, 0x4e, 0x76, 0x4a, 0xe3, 0x17,
0x7c, 0x01, 0x59, 0xcf, 0x77, 0x78, 0x58, 0x4d, 0xa9, 0x19, 0xe2, 0x28, 0xd1, 0xae, 0x2d, 0xdf, 0xe4, 0x4b, 0xc8, 0xfb, 0xc1, 0x98, 0x47, 0x66, 0x46, 0xcd, 0x10, 0xc7, 0xa9, 0x76, 0xed, 0x04,
0xe1, 0x57, 0x6e, 0x28, 0xfc, 0xe0, 0x9e, 0x68, 0x51, 0xfd, 0x5f, 0x29, 0x28, 0x24, 0x60, 0x74, 0x63, 0x7e, 0xe5, 0x45, 0x22, 0x08, 0xef, 0x89, 0x26, 0x49, 0xf6, 0x82, 0x79, 0x61, 0x64, 0xee,
0x04, 0xbb, 0xf3, 0xc5, 0xcd, 0x1d, 0xbf, 0x8f, 0x2e, 0x55, 0xf4, 0x85, 0x5e, 0x40, 0x79, 0xca, 0x3d, 0x60, 0x5f, 0x33, 0x2f, 0x5c, 0xb1, 0x15, 0xc9, 0xfa, 0x4b, 0x06, 0x4a, 0x29, 0x25, 0xe8,
0x42, 0x41, 0x65, 0xf7, 0xa4, 0x32, 0x49, 0xd1, 0x93, 0xb9, 0x81, 0xa2, 0xaf, 0xe1, 0xd8, 0x17, 0x18, 0xf6, 0x17, 0xcb, 0x9b, 0x3b, 0x7e, 0x1f, 0x5f, 0xc1, 0x78, 0x85, 0x9e, 0x43, 0x75, 0xc6,
0x13, 0x1e, 0xe8, 0x69, 0x28, 0x5c, 0x8c, 0x46, 0x3c, 0x0c, 0xe9, 0x3c, 0xf0, 0x6f, 0xd4, 0x55, 0x22, 0x41, 0x65, 0xaf, 0xa5, 0x32, 0xa5, 0xf1, 0x03, 0xbb, 0x85, 0xa2, 0x0b, 0x40, 0x81, 0x98,
0xdb, 0x21, 0x8f, 0xd1, 0xe8, 0x15, 0xec, 0x45, 0x77, 0x24, 0xac, 0x66, 0xd4, 0xd6, 0x9f, 0x3e, 0xf2, 0x90, 0x46, 0xcb, 0xd1, 0x88, 0x47, 0x11, 0x5d, 0x84, 0xc1, 0x8d, 0xba, 0x93, 0x7b, 0x64,
0x7c, 0x69, 0xe2, 0xdd, 0x2f, 0xa5, 0xf5, 0x7f, 0xa6, 0xa0, 0xbc, 0x4e, 0xa2, 0xe7, 0xea, 0xf6, 0x87, 0xe4, 0x55, 0xee, 0x20, 0x67, 0xe4, 0xad, 0x7f, 0x66, 0xa0, 0x94, 0x72, 0x4e, 0xde, 0x5a,
0xab, 0x2b, 0xe8, 0x3a, 0xea, 0x1c, 0x19, 0x92, 0x40, 0x7e, 0xf1, 0x59, 0x1a, 0x70, 0x38, 0x73, 0x79, 0x18, 0x7a, 0x1b, 0x06, 0xf3, 0xa4, 0x16, 0x56, 0x00, 0x32, 0xa1, 0xa0, 0x16, 0x22, 0x88,
0x3d, 0x3a, 0xe7, 0x1e, 0x9b, 0xba, 0x7f, 0xe6, 0x34, 0x9e, 0x45, 0xd2, 0x4a, 0xbd, 0x95, 0x43, 0x0b, 0x21, 0x59, 0xee, 0xf0, 0x32, 0xbb, 0xd3, 0xcb, 0x06, 0x1c, 0xcd, 0x3d, 0x9f, 0x2e, 0xb8,
0x75, 0x28, 0xae, 0x1d, 0x3a, 0xa3, 0x0e, 0xbd, 0x86, 0xbd, 0xfc, 0x5b, 0x0a, 0x8a, 0xc9, 0xa9, 0xcf, 0x66, 0xde, 0x9f, 0x38, 0x4d, 0x66, 0x92, 0x9c, 0x62, 0xef, 0x94, 0x21, 0x0b, 0xca, 0x1b,
0x0a, 0x95, 0x20, 0x6f, 0x5a, 0xb4, 0xd3, 0x35, 0xbf, 0xb9, 0x1a, 0x18, 0x1f, 0xc9, 0xcf, 0xfe, 0x67, 0xca, 0xab, 0x33, 0x6d, 0x60, 0x2f, 0xfe, 0x96, 0x81, 0x72, 0x7a, 0xba, 0x42, 0x15, 0x28,
0xb0, 0xd5, 0xc2, 0xb8, 0x8d, 0xdb, 0x46, 0x0a, 0x21, 0x28, 0xcb, 0x86, 0x80, 0xdb, 0x74, 0x60, 0xda, 0x0e, 0xed, 0x74, 0xed, 0x6f, 0xaf, 0x06, 0xc6, 0x47, 0x72, 0xd9, 0x1f, 0xb6, 0x5a, 0x18,
0xf6, 0xb0, 0x3d, 0x94, 0x6f, 0xc9, 0x01, 0x54, 0x22, 0xcc, 0xb2, 0x29, 0xb1, 0x87, 0x03, 0x6c, 0xb7, 0x71, 0xdb, 0xc8, 0x20, 0x04, 0x55, 0xd9, 0x18, 0x70, 0x9b, 0x0e, 0xec, 0x1e, 0x76, 0x87,
0xa4, 0x91, 0x01, 0xc5, 0x08, 0xc4, 0x84, 0xd8, 0xc4, 0xc8, 0xc8, 0x06, 0x18, 0x21, 0x0f, 0xdf, 0xf2, 0x4d, 0x39, 0x84, 0x5a, 0x8c, 0x39, 0x2e, 0x25, 0xee, 0x70, 0x80, 0x8d, 0x2c, 0x32, 0xa0,
0xa5, 0xf8, 0xd9, 0xca, 0x36, 0xfe, 0x9a, 0x81, 0x5d, 0x35, 0x85, 0x04, 0xe8, 0x0a, 0x0a, 0x89, 0x1c, 0x83, 0x98, 0x10, 0x97, 0x18, 0x39, 0xd9, 0x08, 0x63, 0xe4, 0xe1, 0xfb, 0x94, 0x3c, 0x5f,
0x71, 0x1e, 0x9d, 0x26, 0x32, 0xf0, 0x70, 0xcc, 0xaf, 0x55, 0xb7, 0x8f, 0x89, 0x8b, 0xf0, 0xcb, 0xf9, 0xc6, 0x5f, 0x73, 0xb0, 0xaf, 0xa6, 0x91, 0x10, 0x5d, 0x41, 0x29, 0x35, 0xd6, 0xa3, 0xd3,
0x14, 0xfa, 0x16, 0x8a, 0xc9, 0xe1, 0x14, 0x25, 0x87, 0x8e, 0x2d, 0x53, 0xeb, 0x07, 0x6d, 0xbd, 0xd4, 0xb5, 0x78, 0x38, 0xee, 0xd7, 0xcd, 0xdd, 0xe3, 0xe2, 0x32, 0xfa, 0x2a, 0x83, 0x5e, 0x41,
0x01, 0x03, 0x87, 0xc2, 0x9d, 0xc9, 0x21, 0x23, 0x1a, 0xfb, 0x50, 0x2d, 0xa1, 0xdf, 0x98, 0x25, 0x39, 0x3d, 0xa4, 0xa2, 0xf4, 0xf0, 0xb1, 0x63, 0x7a, 0xfd, 0xa0, 0xae, 0xd7, 0x60, 0xe0, 0x48,
0x6b, 0x27, 0x5b, 0xb9, 0xa8, 0x3e, 0xba, 0xfa, 0x88, 0xd1, 0xe0, 0xf5, 0xe0, 0x88, 0xeb, 0xd3, 0x78, 0x73, 0x39, 0x6c, 0xc4, 0xe3, 0x1f, 0xaa, 0xa7, 0xf8, 0x5b, 0x33, 0x65, 0xfd, 0x64, 0xa7,
0x5e, 0xed, 0xf9, 0x63, 0x74, 0x64, 0xcd, 0x81, 0x83, 0x2d, 0x95, 0x8c, 0x7e, 0x95, 0xdc, 0xc1, 0x2c, 0xae, 0x93, 0xae, 0x3e, 0x62, 0x3c, 0x80, 0x3d, 0x38, 0xe2, 0xe6, 0xd4, 0x57, 0xff, 0xf8,
0xa3, 0x7d, 0xa0, 0xf6, 0xe2, 0xe7, 0x64, 0x2b, 0x2f, 0x5b, 0x4a, 0x7e, 0xcd, 0xcb, 0xe3, 0x0d, 0x7d, 0xe2, 0x58, 0xdb, 0x18, 0x0e, 0x77, 0x54, 0x34, 0xfa, 0x45, 0xda, 0x83, 0xf7, 0xf6, 0x83,
0x63, 0xcd, 0xcb, 0x07, 0x3a, 0xc7, 0xeb, 0xdf, 0xfc, 0xe1, 0x72, 0xec, 0x8a, 0xc9, 0xe2, 0xe6, 0xfa, 0xf3, 0xff, 0x47, 0x5b, 0x5b, 0xd9, 0x51, 0xfa, 0x1b, 0x56, 0xde, 0xdf, 0x38, 0x36, 0xac,
0x62, 0xe4, 0xcf, 0x2e, 0xa7, 0xee, 0x78, 0x22, 0x3c, 0xd7, 0x1b, 0x7b, 0x5c, 0xfc, 0xc9, 0x0f, 0x7c, 0xa0, 0x83, 0xbc, 0xfc, 0xd5, 0xef, 0x2f, 0x27, 0x9e, 0x98, 0x2e, 0x6f, 0x2e, 0x46, 0xc1,
0xee, 0x2e, 0xa7, 0x9e, 0x73, 0xa9, 0x06, 0xd9, 0xcb, 0xa5, 0xb9, 0x9b, 0x5d, 0xf5, 0x6f, 0xe0, 0xfc, 0x72, 0xe6, 0x4d, 0xa6, 0xc2, 0xf7, 0xfc, 0x89, 0xcf, 0xc5, 0x1f, 0x83, 0xf0, 0xee, 0x72,
0x6f, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x58, 0x80, 0x4d, 0xdb, 0x36, 0x0e, 0x00, 0x00, 0xe6, 0x8f, 0x2f, 0xd5, 0x40, 0x7b, 0xb9, 0x52, 0x77, 0xb3, 0xaf, 0xfe, 0x0e, 0xfe, 0xfa, 0x7f,
0x01, 0x00, 0x00, 0xff, 0xff, 0x6d, 0xa6, 0xd9, 0x94, 0x3e, 0x0e, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.

@ -323,9 +323,13 @@ message ResetMissionControlResponse{}
message QueryMissionControlRequest {} message QueryMissionControlRequest {}
/// QueryMissionControlResponse contains mission control state per node. /// QueryMissionControlResponse contains mission control state.
message QueryMissionControlResponse { message QueryMissionControlResponse {
/// Node-level mission control state.
repeated NodeHistory nodes = 1; repeated NodeHistory nodes = 1;
/// Node pair-level mission control state.
repeated PairHistory pairs = 2;
} }
/// NodeHistory contains the mission control state for a particular node. /// NodeHistory contains the mission control state for a particular node.
@ -336,26 +340,31 @@ message NodeHistory {
/// Time stamp of last failure. Set to zero if no failure happened yet. /// Time stamp of last failure. Set to zero if no failure happened yet.
int64 last_fail_time = 2 [json_name = "last_fail_time"]; int64 last_fail_time = 2 [json_name = "last_fail_time"];
/// Estimation of success probability for channels not in the channel array. /**
float other_chan_success_prob = 3 [json_name = "other_chan_success_prob"]; Estimation of success probability of forwarding towards peers of this node
for which no specific history is available.
**/
float other_success_prob = 3 [json_name = "other_success_prob"];
/// Historical information of particular channels. reserved 4;
repeated ChannelHistory channels = 4 [json_name = "channels"];
} }
/// NodeHistory contains the mission control state for a particular channel. /// PairHistory contains the mission control state for a particular node pair.
message ChannelHistory { message PairHistory {
/// Short channel id /// The source node pubkey of the pair.
uint64 channel_id = 1 [json_name = "channel_id"]; bytes node_from = 1 [json_name="node_from"];
/// The destination node pubkey of the pair.
bytes node_to = 2 [json_name="node_to"];
/// Time stamp of last failure. /// Time stamp of last failure.
int64 last_fail_time = 2 [json_name = "last_fail_time"]; int64 last_fail_time = 3 [json_name = "last_fail_time"];
/// Minimum penalization amount. /// Minimum penalization amount.
int64 min_penalize_amt_sat = 3 [json_name = "min_penalize_amt_sat"]; int64 min_penalize_amt_sat = 4 [json_name = "min_penalize_amt_sat"];
/// Estimation of success probability for this channel. /// Estimation of success probability for this pair.
float success_prob = 4 [json_name = "success_prob"]; float success_prob = 5 [json_name = "success_prob"];
} }
service Router { service Router {

@ -57,17 +57,17 @@ type RouterBackend struct {
// MissionControl defines the mission control dependencies of routerrpc. // MissionControl defines the mission control dependencies of routerrpc.
type MissionControl interface { type MissionControl interface {
// GetEdgeProbability is expected to return the success probability of a payment // GetProbability is expected to return the success probability of a
// from fromNode along edge. // payment from fromNode to toNode.
GetEdgeProbability(fromNode route.Vertex, GetProbability(fromNode, toNode route.Vertex,
edge routing.EdgeLocator, amt lnwire.MilliSatoshi) float64 amt lnwire.MilliSatoshi) float64
// ResetHistory resets the history of MissionControl returning it to a state as // ResetHistory resets the history of MissionControl returning it to a
// if no payment attempts have been made. // state as if no payment attempts have been made.
ResetHistory() error ResetHistory() error
// GetHistorySnapshot takes a snapshot from the current mission control state // GetHistorySnapshot takes a snapshot from the current mission control
// and actual probability estimates. // state and actual probability estimates.
GetHistorySnapshot() *routing.MissionControlSnapshot GetHistorySnapshot() *routing.MissionControlSnapshot
} }
@ -89,15 +89,7 @@ func (r *RouterBackend) QueryRoutes(ctx context.Context,
return route.Vertex{}, err return route.Vertex{}, err
} }
if len(pubKeyBytes) != 33 { return route.NewVertexFromBytes(pubKeyBytes)
return route.Vertex{},
errors.New("invalid key length")
}
var v route.Vertex
copy(v[:], pubKeyBytes)
return v, nil
} }
// Parse the hex-encoded source and target public keys into full public // Parse the hex-encoded source and target public keys into full public
@ -134,36 +126,57 @@ func (r *RouterBackend) QueryRoutes(ctx context.Context,
ignoredNodes := make(map[route.Vertex]struct{}) ignoredNodes := make(map[route.Vertex]struct{})
for _, ignorePubKey := range in.IgnoredNodes { for _, ignorePubKey := range in.IgnoredNodes {
if len(ignorePubKey) != 33 { ignoreVertex, err := route.NewVertexFromBytes(ignorePubKey)
return nil, fmt.Errorf("invalid ignore node pubkey") if err != nil {
return nil, err
} }
var ignoreVertex route.Vertex
copy(ignoreVertex[:], ignorePubKey)
ignoredNodes[ignoreVertex] = struct{}{} ignoredNodes[ignoreVertex] = struct{}{}
} }
ignoredEdges := make(map[routing.EdgeLocator]struct{}) ignoredPairs := make(map[routing.DirectedNodePair]struct{})
// Convert deprecated ignoredEdges to pairs.
for _, ignoredEdge := range in.IgnoredEdges { for _, ignoredEdge := range in.IgnoredEdges {
locator := routing.EdgeLocator{ pair, err := r.rpcEdgeToPair(ignoredEdge)
ChannelID: ignoredEdge.ChannelId, if err != nil {
log.Warnf("Ignore channel %v skipped: %v",
ignoredEdge.ChannelId, err)
continue
} }
if ignoredEdge.DirectionReverse { ignoredPairs[pair] = struct{}{}
locator.Direction = 1 }
// Add ignored pairs to set.
for _, ignorePair := range in.IgnoredPairs {
from, err := route.NewVertexFromBytes(ignorePair.From)
if err != nil {
return nil, err
} }
ignoredEdges[locator] = struct{}{}
to, err := route.NewVertexFromBytes(ignorePair.To)
if err != nil {
return nil, err
}
pair := routing.NewDirectedNodePair(from, to)
ignoredPairs[pair] = struct{}{}
} }
restrictions := &routing.RestrictParams{ restrictions := &routing.RestrictParams{
FeeLimit: feeLimit, FeeLimit: feeLimit,
ProbabilitySource: func(node route.Vertex, ProbabilitySource: func(fromNode, toNode route.Vertex,
edge routing.EdgeLocator,
amt lnwire.MilliSatoshi) float64 { amt lnwire.MilliSatoshi) float64 {
if _, ok := ignoredNodes[node]; ok { if _, ok := ignoredNodes[fromNode]; ok {
return 0 return 0
} }
if _, ok := ignoredEdges[edge]; ok { pair := routing.DirectedNodePair{
From: fromNode,
To: toNode,
}
if _, ok := ignoredPairs[pair]; ok {
return 0 return 0
} }
@ -171,8 +184,8 @@ func (r *RouterBackend) QueryRoutes(ctx context.Context,
return 1 return 1
} }
return r.MissionControl.GetEdgeProbability( return r.MissionControl.GetProbability(
node, edge, amt, fromNode, toNode, amt,
) )
}, },
} }
@ -211,6 +224,26 @@ func (r *RouterBackend) QueryRoutes(ctx context.Context,
return routeResp, nil return routeResp, nil
} }
// rpcEdgeToPair looks up the provided channel and returns the channel endpoints
// as a directed pair.
func (r *RouterBackend) rpcEdgeToPair(e *lnrpc.EdgeLocator) (
routing.DirectedNodePair, error) {
a, b, err := r.FetchChannelEndpoints(e.ChannelId)
if err != nil {
return routing.DirectedNodePair{}, err
}
var pair routing.DirectedNodePair
if e.DirectionReverse {
pair.From, pair.To = b, a
} else {
pair.From, pair.To = a, b
}
return pair, nil
}
// calculateFeeLimit returns the fee limit in millisatoshis. If a percentage // calculateFeeLimit returns the fee limit in millisatoshis. If a percentage
// based fee limit has been requested, we'll factor in the ratio provided with // based fee limit has been requested, we'll factor in the ratio provided with
// the amount of the payment. // the amount of the payment.
@ -484,12 +517,11 @@ func (r *RouterBackend) extractIntentFromSendRequest(
// from the other fields. // from the other fields.
// Payment destination. // Payment destination.
if len(rpcPayReq.Dest) != 33 { target, err := route.NewVertexFromBytes(rpcPayReq.Dest)
return nil, errors.New("invalid key length") if err != nil {
return nil, err
} }
pubBytes := rpcPayReq.Dest payIntent.Target = target
copy(payIntent.Target[:], pubBytes)
// Final payment CLTV delta. // Final payment CLTV delta.
if rpcPayReq.FinalCltvDelta != 0 { if rpcPayReq.FinalCltvDelta != 0 {

@ -23,6 +23,10 @@ const (
var ( var (
sourceKey = route.Vertex{1, 2, 3} sourceKey = route.Vertex{1, 2, 3}
node1 = route.Vertex{10}
node2 = route.Vertex{11}
) )
// TestQueryRoutes asserts that query routes rpc parameters are properly parsed // TestQueryRoutes asserts that query routes rpc parameters are properly parsed
@ -50,11 +54,6 @@ func testQueryRoutes(t *testing.T, useMissionControl bool) {
t.Fatal(err) t.Fatal(err)
} }
ignoredEdge := routing.EdgeLocator{
ChannelID: 555,
Direction: 1,
}
request := &lnrpc.QueryRoutesRequest{ request := &lnrpc.QueryRoutesRequest{
PubKey: destKey, PubKey: destKey,
Amt: 100000, Amt: 100000,
@ -69,6 +68,10 @@ func testQueryRoutes(t *testing.T, useMissionControl bool) {
ChannelId: 555, ChannelId: 555,
DirectionReverse: true, DirectionReverse: true,
}}, }},
IgnoredPairs: []*lnrpc.NodePair{{
From: node1[:],
To: node2[:],
}},
UseMissionControl: useMissionControl, UseMissionControl: useMissionControl,
} }
@ -92,24 +95,28 @@ func testQueryRoutes(t *testing.T, useMissionControl bool) {
t.Fatal("unexpected fee limit") t.Fatal("unexpected fee limit")
} }
if restrictions.ProbabilitySource(route.Vertex{}, if restrictions.ProbabilitySource(route.Vertex{2},
ignoredEdge, 0, route.Vertex{1}, 0,
) != 0 { ) != 0 {
t.Fatal("expecting 0% probability for ignored edge") t.Fatal("expecting 0% probability for ignored edge")
} }
if restrictions.ProbabilitySource(ignoreNodeVertex, if restrictions.ProbabilitySource(ignoreNodeVertex,
routing.EdgeLocator{}, 0, route.Vertex{6}, 0,
) != 0 { ) != 0 {
t.Fatal("expecting 0% probability for ignored node") t.Fatal("expecting 0% probability for ignored node")
} }
if restrictions.ProbabilitySource(node1, node2, 0) != 0 {
t.Fatal("expecting 0% probability for ignored pair")
}
expectedProb := 1.0 expectedProb := 1.0
if useMissionControl { if useMissionControl {
expectedProb = testMissionControlProb expectedProb = testMissionControlProb
} }
if restrictions.ProbabilitySource(route.Vertex{}, if restrictions.ProbabilitySource(route.Vertex{4},
routing.EdgeLocator{}, 0, route.Vertex{5}, 0,
) != expectedProb { ) != expectedProb {
t.Fatal("expecting 100% probability") t.Fatal("expecting 100% probability")
} }
@ -128,6 +135,16 @@ func testQueryRoutes(t *testing.T, useMissionControl bool) {
return 1, nil return 1, nil
}, },
MissionControl: &mockMissionControl{}, MissionControl: &mockMissionControl{},
FetchChannelEndpoints: func(chanID uint64) (route.Vertex,
route.Vertex, error) {
if chanID != 555 {
t.Fatal("expected endpoints to be fetched for "+
"channel 555, but got %v instead",
chanID)
}
return route.Vertex{1}, route.Vertex{2}, nil
},
} }
resp, err := backend.QueryRoutes(context.Background(), request) resp, err := backend.QueryRoutes(context.Background(), request)
@ -142,8 +159,9 @@ func testQueryRoutes(t *testing.T, useMissionControl bool) {
type mockMissionControl struct { type mockMissionControl struct {
} }
func (m *mockMissionControl) GetEdgeProbability(fromNode route.Vertex, func (m *mockMissionControl) GetProbability(fromNode, toNode route.Vertex,
edge routing.EdgeLocator, amt lnwire.MilliSatoshi) float64 { amt lnwire.MilliSatoshi) float64 {
return testMissionControlProb return testMissionControlProb
} }

@ -451,40 +451,43 @@ func (s *Server) QueryMissionControl(ctx context.Context,
snapshot := s.cfg.RouterBackend.MissionControl.GetHistorySnapshot() snapshot := s.cfg.RouterBackend.MissionControl.GetHistorySnapshot()
rpcNodes := make([]*NodeHistory, len(snapshot.Nodes)) rpcNodes := make([]*NodeHistory, 0, len(snapshot.Nodes))
for i, n := range snapshot.Nodes { for _, n := range snapshot.Nodes {
// Copy node struct to prevent loop variable binding bugs. // Copy node struct to prevent loop variable binding bugs.
node := n node := n
channels := make([]*ChannelHistory, len(node.Channels)) rpcNode := NodeHistory{
for j, channel := range node.Channels {
channels[j] = &ChannelHistory{
ChannelId: channel.ChannelID,
LastFailTime: channel.LastFail.Unix(),
MinPenalizeAmtSat: int64(
channel.MinPenalizeAmt.ToSatoshis(),
),
SuccessProb: float32(channel.SuccessProb),
}
}
var lastFail int64
if node.LastFail != nil {
lastFail = node.LastFail.Unix()
}
rpcNodes[i] = &NodeHistory{
Pubkey: node.Node[:], Pubkey: node.Node[:],
LastFailTime: lastFail, LastFailTime: node.LastFail.Unix(),
OtherChanSuccessProb: float32( OtherSuccessProb: float32(
node.OtherChanSuccessProb, node.OtherSuccessProb,
), ),
Channels: channels,
} }
rpcNodes = append(rpcNodes, &rpcNode)
}
rpcPairs := make([]*PairHistory, 0, len(snapshot.Pairs))
for _, p := range snapshot.Pairs {
// Prevent binding to loop variable.
pair := p
rpcPair := PairHistory{
NodeFrom: pair.Pair.From[:],
NodeTo: pair.Pair.To[:],
LastFailTime: pair.LastFail.Unix(),
MinPenalizeAmtSat: int64(
pair.MinPenalizeAmt.ToSatoshis(),
),
SuccessProb: float32(pair.SuccessProb),
}
rpcPairs = append(rpcPairs, &rpcPair)
} }
response := QueryMissionControlResponse{ response := QueryMissionControlResponse{
Nodes: rpcNodes, Nodes: rpcNodes,
Pairs: rpcPairs,
} }
return &response, nil return &response, nil

@ -189,7 +189,7 @@ func (x Invoice_InvoiceState) String() string {
} }
func (Invoice_InvoiceState) EnumDescriptor() ([]byte, []int) { func (Invoice_InvoiceState) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{92, 0} return fileDescriptor_77a6da22d6a3feb1, []int{93, 0}
} }
type Payment_PaymentStatus int32 type Payment_PaymentStatus int32
@ -220,7 +220,7 @@ func (x Payment_PaymentStatus) String() string {
} }
func (Payment_PaymentStatus) EnumDescriptor() ([]byte, []int) { func (Payment_PaymentStatus) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{98, 0} return fileDescriptor_77a6da22d6a3feb1, []int{99, 0}
} }
type GenSeedRequest struct { type GenSeedRequest struct {
@ -4805,8 +4805,8 @@ type QueryRoutesRequest struct {
//A list of nodes to ignore during path finding. //A list of nodes to ignore during path finding.
IgnoredNodes [][]byte `protobuf:"bytes,6,rep,name=ignored_nodes,json=ignoredNodes,proto3" json:"ignored_nodes,omitempty"` IgnoredNodes [][]byte `protobuf:"bytes,6,rep,name=ignored_nodes,json=ignoredNodes,proto3" json:"ignored_nodes,omitempty"`
//* //*
//A list of edges to ignore during path finding. //Deprecated. A list of edges to ignore during path finding.
IgnoredEdges []*EdgeLocator `protobuf:"bytes,7,rep,name=ignored_edges,json=ignoredEdges,proto3" json:"ignored_edges,omitempty"` IgnoredEdges []*EdgeLocator `protobuf:"bytes,7,rep,name=ignored_edges,json=ignoredEdges,proto3" json:"ignored_edges,omitempty"` // Deprecated: Do not use.
//* //*
//The source node where the request route should originated from. If empty, //The source node where the request route should originated from. If empty,
//self is assumed. //self is assumed.
@ -4814,10 +4814,13 @@ type QueryRoutesRequest struct {
//* //*
//If set to true, edge probabilities from mission control will be used to get //If set to true, edge probabilities from mission control will be used to get
//the optimal route. //the optimal route.
UseMissionControl bool `protobuf:"varint,9,opt,name=use_mission_control,json=useMissionControl,proto3" json:"use_mission_control,omitempty"` UseMissionControl bool `protobuf:"varint,9,opt,name=use_mission_control,json=useMissionControl,proto3" json:"use_mission_control,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` //*
XXX_unrecognized []byte `json:"-"` //A list of directed node pairs that will be ignored during path finding.
XXX_sizecache int32 `json:"-"` IgnoredPairs []*NodePair `protobuf:"bytes,10,rep,name=ignored_pairs,json=ignoredPairs,proto3" json:"ignored_pairs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
} }
func (m *QueryRoutesRequest) Reset() { *m = QueryRoutesRequest{} } func (m *QueryRoutesRequest) Reset() { *m = QueryRoutesRequest{} }
@ -4880,6 +4883,7 @@ func (m *QueryRoutesRequest) GetIgnoredNodes() [][]byte {
return nil return nil
} }
// Deprecated: Do not use.
func (m *QueryRoutesRequest) GetIgnoredEdges() []*EdgeLocator { func (m *QueryRoutesRequest) GetIgnoredEdges() []*EdgeLocator {
if m != nil { if m != nil {
return m.IgnoredEdges return m.IgnoredEdges
@ -4901,6 +4905,62 @@ func (m *QueryRoutesRequest) GetUseMissionControl() bool {
return false return false
} }
func (m *QueryRoutesRequest) GetIgnoredPairs() []*NodePair {
if m != nil {
return m.IgnoredPairs
}
return nil
}
type NodePair struct {
/// The sending node of the pair.
From []byte `protobuf:"bytes,1,opt,name=from,proto3" json:"from,omitempty"`
/// The receiving node of the pair.
To []byte `protobuf:"bytes,2,opt,name=to,proto3" json:"to,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *NodePair) Reset() { *m = NodePair{} }
func (m *NodePair) String() string { return proto.CompactTextString(m) }
func (*NodePair) ProtoMessage() {}
func (*NodePair) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{68}
}
func (m *NodePair) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NodePair.Unmarshal(m, b)
}
func (m *NodePair) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_NodePair.Marshal(b, m, deterministic)
}
func (m *NodePair) XXX_Merge(src proto.Message) {
xxx_messageInfo_NodePair.Merge(m, src)
}
func (m *NodePair) XXX_Size() int {
return xxx_messageInfo_NodePair.Size(m)
}
func (m *NodePair) XXX_DiscardUnknown() {
xxx_messageInfo_NodePair.DiscardUnknown(m)
}
var xxx_messageInfo_NodePair proto.InternalMessageInfo
func (m *NodePair) GetFrom() []byte {
if m != nil {
return m.From
}
return nil
}
func (m *NodePair) GetTo() []byte {
if m != nil {
return m.To
}
return nil
}
type EdgeLocator struct { type EdgeLocator struct {
/// The short channel id of this edge. /// The short channel id of this edge.
ChannelId uint64 `protobuf:"varint,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` ChannelId uint64 `protobuf:"varint,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
@ -4919,7 +4979,7 @@ func (m *EdgeLocator) Reset() { *m = EdgeLocator{} }
func (m *EdgeLocator) String() string { return proto.CompactTextString(m) } func (m *EdgeLocator) String() string { return proto.CompactTextString(m) }
func (*EdgeLocator) ProtoMessage() {} func (*EdgeLocator) ProtoMessage() {}
func (*EdgeLocator) Descriptor() ([]byte, []int) { func (*EdgeLocator) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{68} return fileDescriptor_77a6da22d6a3feb1, []int{69}
} }
func (m *EdgeLocator) XXX_Unmarshal(b []byte) error { func (m *EdgeLocator) XXX_Unmarshal(b []byte) error {
@ -4965,7 +5025,7 @@ func (m *QueryRoutesResponse) Reset() { *m = QueryRoutesResponse{} }
func (m *QueryRoutesResponse) String() string { return proto.CompactTextString(m) } func (m *QueryRoutesResponse) String() string { return proto.CompactTextString(m) }
func (*QueryRoutesResponse) ProtoMessage() {} func (*QueryRoutesResponse) ProtoMessage() {}
func (*QueryRoutesResponse) Descriptor() ([]byte, []int) { func (*QueryRoutesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{69} return fileDescriptor_77a6da22d6a3feb1, []int{70}
} }
func (m *QueryRoutesResponse) XXX_Unmarshal(b []byte) error { func (m *QueryRoutesResponse) XXX_Unmarshal(b []byte) error {
@ -5018,7 +5078,7 @@ func (m *Hop) Reset() { *m = Hop{} }
func (m *Hop) String() string { return proto.CompactTextString(m) } func (m *Hop) String() string { return proto.CompactTextString(m) }
func (*Hop) ProtoMessage() {} func (*Hop) ProtoMessage() {}
func (*Hop) Descriptor() ([]byte, []int) { func (*Hop) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{70} return fileDescriptor_77a6da22d6a3feb1, []int{71}
} }
func (m *Hop) XXX_Unmarshal(b []byte) error { func (m *Hop) XXX_Unmarshal(b []byte) error {
@ -5140,7 +5200,7 @@ func (m *Route) Reset() { *m = Route{} }
func (m *Route) String() string { return proto.CompactTextString(m) } func (m *Route) String() string { return proto.CompactTextString(m) }
func (*Route) ProtoMessage() {} func (*Route) ProtoMessage() {}
func (*Route) Descriptor() ([]byte, []int) { func (*Route) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{71} return fileDescriptor_77a6da22d6a3feb1, []int{72}
} }
func (m *Route) XXX_Unmarshal(b []byte) error { func (m *Route) XXX_Unmarshal(b []byte) error {
@ -5219,7 +5279,7 @@ func (m *NodeInfoRequest) Reset() { *m = NodeInfoRequest{} }
func (m *NodeInfoRequest) String() string { return proto.CompactTextString(m) } func (m *NodeInfoRequest) String() string { return proto.CompactTextString(m) }
func (*NodeInfoRequest) ProtoMessage() {} func (*NodeInfoRequest) ProtoMessage() {}
func (*NodeInfoRequest) Descriptor() ([]byte, []int) { func (*NodeInfoRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{72} return fileDescriptor_77a6da22d6a3feb1, []int{73}
} }
func (m *NodeInfoRequest) XXX_Unmarshal(b []byte) error { func (m *NodeInfoRequest) XXX_Unmarshal(b []byte) error {
@ -5276,7 +5336,7 @@ func (m *NodeInfo) Reset() { *m = NodeInfo{} }
func (m *NodeInfo) String() string { return proto.CompactTextString(m) } func (m *NodeInfo) String() string { return proto.CompactTextString(m) }
func (*NodeInfo) ProtoMessage() {} func (*NodeInfo) ProtoMessage() {}
func (*NodeInfo) Descriptor() ([]byte, []int) { func (*NodeInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{73} return fileDescriptor_77a6da22d6a3feb1, []int{74}
} }
func (m *NodeInfo) XXX_Unmarshal(b []byte) error { func (m *NodeInfo) XXX_Unmarshal(b []byte) error {
@ -5345,7 +5405,7 @@ func (m *LightningNode) Reset() { *m = LightningNode{} }
func (m *LightningNode) String() string { return proto.CompactTextString(m) } func (m *LightningNode) String() string { return proto.CompactTextString(m) }
func (*LightningNode) ProtoMessage() {} func (*LightningNode) ProtoMessage() {}
func (*LightningNode) Descriptor() ([]byte, []int) { func (*LightningNode) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{74} return fileDescriptor_77a6da22d6a3feb1, []int{75}
} }
func (m *LightningNode) XXX_Unmarshal(b []byte) error { func (m *LightningNode) XXX_Unmarshal(b []byte) error {
@ -5413,7 +5473,7 @@ func (m *NodeAddress) Reset() { *m = NodeAddress{} }
func (m *NodeAddress) String() string { return proto.CompactTextString(m) } func (m *NodeAddress) String() string { return proto.CompactTextString(m) }
func (*NodeAddress) ProtoMessage() {} func (*NodeAddress) ProtoMessage() {}
func (*NodeAddress) Descriptor() ([]byte, []int) { func (*NodeAddress) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{75} return fileDescriptor_77a6da22d6a3feb1, []int{76}
} }
func (m *NodeAddress) XXX_Unmarshal(b []byte) error { func (m *NodeAddress) XXX_Unmarshal(b []byte) error {
@ -5465,7 +5525,7 @@ func (m *RoutingPolicy) Reset() { *m = RoutingPolicy{} }
func (m *RoutingPolicy) String() string { return proto.CompactTextString(m) } func (m *RoutingPolicy) String() string { return proto.CompactTextString(m) }
func (*RoutingPolicy) ProtoMessage() {} func (*RoutingPolicy) ProtoMessage() {}
func (*RoutingPolicy) Descriptor() ([]byte, []int) { func (*RoutingPolicy) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{76} return fileDescriptor_77a6da22d6a3feb1, []int{77}
} }
func (m *RoutingPolicy) XXX_Unmarshal(b []byte) error { func (m *RoutingPolicy) XXX_Unmarshal(b []byte) error {
@ -5563,7 +5623,7 @@ func (m *ChannelEdge) Reset() { *m = ChannelEdge{} }
func (m *ChannelEdge) String() string { return proto.CompactTextString(m) } func (m *ChannelEdge) String() string { return proto.CompactTextString(m) }
func (*ChannelEdge) ProtoMessage() {} func (*ChannelEdge) ProtoMessage() {}
func (*ChannelEdge) Descriptor() ([]byte, []int) { func (*ChannelEdge) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{77} return fileDescriptor_77a6da22d6a3feb1, []int{78}
} }
func (m *ChannelEdge) XXX_Unmarshal(b []byte) error { func (m *ChannelEdge) XXX_Unmarshal(b []byte) error {
@ -5656,7 +5716,7 @@ func (m *ChannelGraphRequest) Reset() { *m = ChannelGraphRequest{} }
func (m *ChannelGraphRequest) String() string { return proto.CompactTextString(m) } func (m *ChannelGraphRequest) String() string { return proto.CompactTextString(m) }
func (*ChannelGraphRequest) ProtoMessage() {} func (*ChannelGraphRequest) ProtoMessage() {}
func (*ChannelGraphRequest) Descriptor() ([]byte, []int) { func (*ChannelGraphRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{78} return fileDescriptor_77a6da22d6a3feb1, []int{79}
} }
func (m *ChannelGraphRequest) XXX_Unmarshal(b []byte) error { func (m *ChannelGraphRequest) XXX_Unmarshal(b []byte) error {
@ -5699,7 +5759,7 @@ func (m *ChannelGraph) Reset() { *m = ChannelGraph{} }
func (m *ChannelGraph) String() string { return proto.CompactTextString(m) } func (m *ChannelGraph) String() string { return proto.CompactTextString(m) }
func (*ChannelGraph) ProtoMessage() {} func (*ChannelGraph) ProtoMessage() {}
func (*ChannelGraph) Descriptor() ([]byte, []int) { func (*ChannelGraph) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{79} return fileDescriptor_77a6da22d6a3feb1, []int{80}
} }
func (m *ChannelGraph) XXX_Unmarshal(b []byte) error { func (m *ChannelGraph) XXX_Unmarshal(b []byte) error {
@ -5749,7 +5809,7 @@ func (m *ChanInfoRequest) Reset() { *m = ChanInfoRequest{} }
func (m *ChanInfoRequest) String() string { return proto.CompactTextString(m) } func (m *ChanInfoRequest) String() string { return proto.CompactTextString(m) }
func (*ChanInfoRequest) ProtoMessage() {} func (*ChanInfoRequest) ProtoMessage() {}
func (*ChanInfoRequest) Descriptor() ([]byte, []int) { func (*ChanInfoRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{80} return fileDescriptor_77a6da22d6a3feb1, []int{81}
} }
func (m *ChanInfoRequest) XXX_Unmarshal(b []byte) error { func (m *ChanInfoRequest) XXX_Unmarshal(b []byte) error {
@ -5787,7 +5847,7 @@ func (m *NetworkInfoRequest) Reset() { *m = NetworkInfoRequest{} }
func (m *NetworkInfoRequest) String() string { return proto.CompactTextString(m) } func (m *NetworkInfoRequest) String() string { return proto.CompactTextString(m) }
func (*NetworkInfoRequest) ProtoMessage() {} func (*NetworkInfoRequest) ProtoMessage() {}
func (*NetworkInfoRequest) Descriptor() ([]byte, []int) { func (*NetworkInfoRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{81} return fileDescriptor_77a6da22d6a3feb1, []int{82}
} }
func (m *NetworkInfoRequest) XXX_Unmarshal(b []byte) error { func (m *NetworkInfoRequest) XXX_Unmarshal(b []byte) error {
@ -5830,7 +5890,7 @@ func (m *NetworkInfo) Reset() { *m = NetworkInfo{} }
func (m *NetworkInfo) String() string { return proto.CompactTextString(m) } func (m *NetworkInfo) String() string { return proto.CompactTextString(m) }
func (*NetworkInfo) ProtoMessage() {} func (*NetworkInfo) ProtoMessage() {}
func (*NetworkInfo) Descriptor() ([]byte, []int) { func (*NetworkInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{82} return fileDescriptor_77a6da22d6a3feb1, []int{83}
} }
func (m *NetworkInfo) XXX_Unmarshal(b []byte) error { func (m *NetworkInfo) XXX_Unmarshal(b []byte) error {
@ -5938,7 +5998,7 @@ func (m *StopRequest) Reset() { *m = StopRequest{} }
func (m *StopRequest) String() string { return proto.CompactTextString(m) } func (m *StopRequest) String() string { return proto.CompactTextString(m) }
func (*StopRequest) ProtoMessage() {} func (*StopRequest) ProtoMessage() {}
func (*StopRequest) Descriptor() ([]byte, []int) { func (*StopRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{83} return fileDescriptor_77a6da22d6a3feb1, []int{84}
} }
func (m *StopRequest) XXX_Unmarshal(b []byte) error { func (m *StopRequest) XXX_Unmarshal(b []byte) error {
@ -5969,7 +6029,7 @@ func (m *StopResponse) Reset() { *m = StopResponse{} }
func (m *StopResponse) String() string { return proto.CompactTextString(m) } func (m *StopResponse) String() string { return proto.CompactTextString(m) }
func (*StopResponse) ProtoMessage() {} func (*StopResponse) ProtoMessage() {}
func (*StopResponse) Descriptor() ([]byte, []int) { func (*StopResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{84} return fileDescriptor_77a6da22d6a3feb1, []int{85}
} }
func (m *StopResponse) XXX_Unmarshal(b []byte) error { func (m *StopResponse) XXX_Unmarshal(b []byte) error {
@ -6000,7 +6060,7 @@ func (m *GraphTopologySubscription) Reset() { *m = GraphTopologySubscrip
func (m *GraphTopologySubscription) String() string { return proto.CompactTextString(m) } func (m *GraphTopologySubscription) String() string { return proto.CompactTextString(m) }
func (*GraphTopologySubscription) ProtoMessage() {} func (*GraphTopologySubscription) ProtoMessage() {}
func (*GraphTopologySubscription) Descriptor() ([]byte, []int) { func (*GraphTopologySubscription) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{85} return fileDescriptor_77a6da22d6a3feb1, []int{86}
} }
func (m *GraphTopologySubscription) XXX_Unmarshal(b []byte) error { func (m *GraphTopologySubscription) XXX_Unmarshal(b []byte) error {
@ -6034,7 +6094,7 @@ func (m *GraphTopologyUpdate) Reset() { *m = GraphTopologyUpdate{} }
func (m *GraphTopologyUpdate) String() string { return proto.CompactTextString(m) } func (m *GraphTopologyUpdate) String() string { return proto.CompactTextString(m) }
func (*GraphTopologyUpdate) ProtoMessage() {} func (*GraphTopologyUpdate) ProtoMessage() {}
func (*GraphTopologyUpdate) Descriptor() ([]byte, []int) { func (*GraphTopologyUpdate) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{86} return fileDescriptor_77a6da22d6a3feb1, []int{87}
} }
func (m *GraphTopologyUpdate) XXX_Unmarshal(b []byte) error { func (m *GraphTopologyUpdate) XXX_Unmarshal(b []byte) error {
@ -6091,7 +6151,7 @@ func (m *NodeUpdate) Reset() { *m = NodeUpdate{} }
func (m *NodeUpdate) String() string { return proto.CompactTextString(m) } func (m *NodeUpdate) String() string { return proto.CompactTextString(m) }
func (*NodeUpdate) ProtoMessage() {} func (*NodeUpdate) ProtoMessage() {}
func (*NodeUpdate) Descriptor() ([]byte, []int) { func (*NodeUpdate) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{87} return fileDescriptor_77a6da22d6a3feb1, []int{88}
} }
func (m *NodeUpdate) XXX_Unmarshal(b []byte) error { func (m *NodeUpdate) XXX_Unmarshal(b []byte) error {
@ -6167,7 +6227,7 @@ func (m *ChannelEdgeUpdate) Reset() { *m = ChannelEdgeUpdate{} }
func (m *ChannelEdgeUpdate) String() string { return proto.CompactTextString(m) } func (m *ChannelEdgeUpdate) String() string { return proto.CompactTextString(m) }
func (*ChannelEdgeUpdate) ProtoMessage() {} func (*ChannelEdgeUpdate) ProtoMessage() {}
func (*ChannelEdgeUpdate) Descriptor() ([]byte, []int) { func (*ChannelEdgeUpdate) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{88} return fileDescriptor_77a6da22d6a3feb1, []int{89}
} }
func (m *ChannelEdgeUpdate) XXX_Unmarshal(b []byte) error { func (m *ChannelEdgeUpdate) XXX_Unmarshal(b []byte) error {
@ -6248,7 +6308,7 @@ func (m *ClosedChannelUpdate) Reset() { *m = ClosedChannelUpdate{} }
func (m *ClosedChannelUpdate) String() string { return proto.CompactTextString(m) } func (m *ClosedChannelUpdate) String() string { return proto.CompactTextString(m) }
func (*ClosedChannelUpdate) ProtoMessage() {} func (*ClosedChannelUpdate) ProtoMessage() {}
func (*ClosedChannelUpdate) Descriptor() ([]byte, []int) { func (*ClosedChannelUpdate) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{89} return fileDescriptor_77a6da22d6a3feb1, []int{90}
} }
func (m *ClosedChannelUpdate) XXX_Unmarshal(b []byte) error { func (m *ClosedChannelUpdate) XXX_Unmarshal(b []byte) error {
@ -6319,7 +6379,7 @@ func (m *HopHint) Reset() { *m = HopHint{} }
func (m *HopHint) String() string { return proto.CompactTextString(m) } func (m *HopHint) String() string { return proto.CompactTextString(m) }
func (*HopHint) ProtoMessage() {} func (*HopHint) ProtoMessage() {}
func (*HopHint) Descriptor() ([]byte, []int) { func (*HopHint) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{90} return fileDescriptor_77a6da22d6a3feb1, []int{91}
} }
func (m *HopHint) XXX_Unmarshal(b []byte) error { func (m *HopHint) XXX_Unmarshal(b []byte) error {
@ -6389,7 +6449,7 @@ func (m *RouteHint) Reset() { *m = RouteHint{} }
func (m *RouteHint) String() string { return proto.CompactTextString(m) } func (m *RouteHint) String() string { return proto.CompactTextString(m) }
func (*RouteHint) ProtoMessage() {} func (*RouteHint) ProtoMessage() {}
func (*RouteHint) Descriptor() ([]byte, []int) { func (*RouteHint) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{91} return fileDescriptor_77a6da22d6a3feb1, []int{92}
} }
func (m *RouteHint) XXX_Unmarshal(b []byte) error { func (m *RouteHint) XXX_Unmarshal(b []byte) error {
@ -6505,7 +6565,7 @@ func (m *Invoice) Reset() { *m = Invoice{} }
func (m *Invoice) String() string { return proto.CompactTextString(m) } func (m *Invoice) String() string { return proto.CompactTextString(m) }
func (*Invoice) ProtoMessage() {} func (*Invoice) ProtoMessage() {}
func (*Invoice) Descriptor() ([]byte, []int) { func (*Invoice) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{92} return fileDescriptor_77a6da22d6a3feb1, []int{93}
} }
func (m *Invoice) XXX_Unmarshal(b []byte) error { func (m *Invoice) XXX_Unmarshal(b []byte) error {
@ -6698,7 +6758,7 @@ func (m *AddInvoiceResponse) Reset() { *m = AddInvoiceResponse{} }
func (m *AddInvoiceResponse) String() string { return proto.CompactTextString(m) } func (m *AddInvoiceResponse) String() string { return proto.CompactTextString(m) }
func (*AddInvoiceResponse) ProtoMessage() {} func (*AddInvoiceResponse) ProtoMessage() {}
func (*AddInvoiceResponse) Descriptor() ([]byte, []int) { func (*AddInvoiceResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{93} return fileDescriptor_77a6da22d6a3feb1, []int{94}
} }
func (m *AddInvoiceResponse) XXX_Unmarshal(b []byte) error { func (m *AddInvoiceResponse) XXX_Unmarshal(b []byte) error {
@ -6756,7 +6816,7 @@ func (m *PaymentHash) Reset() { *m = PaymentHash{} }
func (m *PaymentHash) String() string { return proto.CompactTextString(m) } func (m *PaymentHash) String() string { return proto.CompactTextString(m) }
func (*PaymentHash) ProtoMessage() {} func (*PaymentHash) ProtoMessage() {}
func (*PaymentHash) Descriptor() ([]byte, []int) { func (*PaymentHash) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{94} return fileDescriptor_77a6da22d6a3feb1, []int{95}
} }
func (m *PaymentHash) XXX_Unmarshal(b []byte) error { func (m *PaymentHash) XXX_Unmarshal(b []byte) error {
@ -6813,7 +6873,7 @@ func (m *ListInvoiceRequest) Reset() { *m = ListInvoiceRequest{} }
func (m *ListInvoiceRequest) String() string { return proto.CompactTextString(m) } func (m *ListInvoiceRequest) String() string { return proto.CompactTextString(m) }
func (*ListInvoiceRequest) ProtoMessage() {} func (*ListInvoiceRequest) ProtoMessage() {}
func (*ListInvoiceRequest) Descriptor() ([]byte, []int) { func (*ListInvoiceRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{95} return fileDescriptor_77a6da22d6a3feb1, []int{96}
} }
func (m *ListInvoiceRequest) XXX_Unmarshal(b []byte) error { func (m *ListInvoiceRequest) XXX_Unmarshal(b []byte) error {
@ -6884,7 +6944,7 @@ func (m *ListInvoiceResponse) Reset() { *m = ListInvoiceResponse{} }
func (m *ListInvoiceResponse) String() string { return proto.CompactTextString(m) } func (m *ListInvoiceResponse) String() string { return proto.CompactTextString(m) }
func (*ListInvoiceResponse) ProtoMessage() {} func (*ListInvoiceResponse) ProtoMessage() {}
func (*ListInvoiceResponse) Descriptor() ([]byte, []int) { func (*ListInvoiceResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{96} return fileDescriptor_77a6da22d6a3feb1, []int{97}
} }
func (m *ListInvoiceResponse) XXX_Unmarshal(b []byte) error { func (m *ListInvoiceResponse) XXX_Unmarshal(b []byte) error {
@ -6948,7 +7008,7 @@ func (m *InvoiceSubscription) Reset() { *m = InvoiceSubscription{} }
func (m *InvoiceSubscription) String() string { return proto.CompactTextString(m) } func (m *InvoiceSubscription) String() string { return proto.CompactTextString(m) }
func (*InvoiceSubscription) ProtoMessage() {} func (*InvoiceSubscription) ProtoMessage() {}
func (*InvoiceSubscription) Descriptor() ([]byte, []int) { func (*InvoiceSubscription) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{97} return fileDescriptor_77a6da22d6a3feb1, []int{98}
} }
func (m *InvoiceSubscription) XXX_Unmarshal(b []byte) error { func (m *InvoiceSubscription) XXX_Unmarshal(b []byte) error {
@ -7017,7 +7077,7 @@ func (m *Payment) Reset() { *m = Payment{} }
func (m *Payment) String() string { return proto.CompactTextString(m) } func (m *Payment) String() string { return proto.CompactTextString(m) }
func (*Payment) ProtoMessage() {} func (*Payment) ProtoMessage() {}
func (*Payment) Descriptor() ([]byte, []int) { func (*Payment) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{98} return fileDescriptor_77a6da22d6a3feb1, []int{99}
} }
func (m *Payment) XXX_Unmarshal(b []byte) error { func (m *Payment) XXX_Unmarshal(b []byte) error {
@ -7139,7 +7199,7 @@ func (m *ListPaymentsRequest) Reset() { *m = ListPaymentsRequest{} }
func (m *ListPaymentsRequest) String() string { return proto.CompactTextString(m) } func (m *ListPaymentsRequest) String() string { return proto.CompactTextString(m) }
func (*ListPaymentsRequest) ProtoMessage() {} func (*ListPaymentsRequest) ProtoMessage() {}
func (*ListPaymentsRequest) Descriptor() ([]byte, []int) { func (*ListPaymentsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{99} return fileDescriptor_77a6da22d6a3feb1, []int{100}
} }
func (m *ListPaymentsRequest) XXX_Unmarshal(b []byte) error { func (m *ListPaymentsRequest) XXX_Unmarshal(b []byte) error {
@ -7179,7 +7239,7 @@ func (m *ListPaymentsResponse) Reset() { *m = ListPaymentsResponse{} }
func (m *ListPaymentsResponse) String() string { return proto.CompactTextString(m) } func (m *ListPaymentsResponse) String() string { return proto.CompactTextString(m) }
func (*ListPaymentsResponse) ProtoMessage() {} func (*ListPaymentsResponse) ProtoMessage() {}
func (*ListPaymentsResponse) Descriptor() ([]byte, []int) { func (*ListPaymentsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{100} return fileDescriptor_77a6da22d6a3feb1, []int{101}
} }
func (m *ListPaymentsResponse) XXX_Unmarshal(b []byte) error { func (m *ListPaymentsResponse) XXX_Unmarshal(b []byte) error {
@ -7217,7 +7277,7 @@ func (m *DeleteAllPaymentsRequest) Reset() { *m = DeleteAllPaymentsReque
func (m *DeleteAllPaymentsRequest) String() string { return proto.CompactTextString(m) } func (m *DeleteAllPaymentsRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteAllPaymentsRequest) ProtoMessage() {} func (*DeleteAllPaymentsRequest) ProtoMessage() {}
func (*DeleteAllPaymentsRequest) Descriptor() ([]byte, []int) { func (*DeleteAllPaymentsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{101} return fileDescriptor_77a6da22d6a3feb1, []int{102}
} }
func (m *DeleteAllPaymentsRequest) XXX_Unmarshal(b []byte) error { func (m *DeleteAllPaymentsRequest) XXX_Unmarshal(b []byte) error {
@ -7248,7 +7308,7 @@ func (m *DeleteAllPaymentsResponse) Reset() { *m = DeleteAllPaymentsResp
func (m *DeleteAllPaymentsResponse) String() string { return proto.CompactTextString(m) } func (m *DeleteAllPaymentsResponse) String() string { return proto.CompactTextString(m) }
func (*DeleteAllPaymentsResponse) ProtoMessage() {} func (*DeleteAllPaymentsResponse) ProtoMessage() {}
func (*DeleteAllPaymentsResponse) Descriptor() ([]byte, []int) { func (*DeleteAllPaymentsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{102} return fileDescriptor_77a6da22d6a3feb1, []int{103}
} }
func (m *DeleteAllPaymentsResponse) XXX_Unmarshal(b []byte) error { func (m *DeleteAllPaymentsResponse) XXX_Unmarshal(b []byte) error {
@ -7280,7 +7340,7 @@ func (m *AbandonChannelRequest) Reset() { *m = AbandonChannelRequest{} }
func (m *AbandonChannelRequest) String() string { return proto.CompactTextString(m) } func (m *AbandonChannelRequest) String() string { return proto.CompactTextString(m) }
func (*AbandonChannelRequest) ProtoMessage() {} func (*AbandonChannelRequest) ProtoMessage() {}
func (*AbandonChannelRequest) Descriptor() ([]byte, []int) { func (*AbandonChannelRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{103} return fileDescriptor_77a6da22d6a3feb1, []int{104}
} }
func (m *AbandonChannelRequest) XXX_Unmarshal(b []byte) error { func (m *AbandonChannelRequest) XXX_Unmarshal(b []byte) error {
@ -7318,7 +7378,7 @@ func (m *AbandonChannelResponse) Reset() { *m = AbandonChannelResponse{}
func (m *AbandonChannelResponse) String() string { return proto.CompactTextString(m) } func (m *AbandonChannelResponse) String() string { return proto.CompactTextString(m) }
func (*AbandonChannelResponse) ProtoMessage() {} func (*AbandonChannelResponse) ProtoMessage() {}
func (*AbandonChannelResponse) Descriptor() ([]byte, []int) { func (*AbandonChannelResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{104} return fileDescriptor_77a6da22d6a3feb1, []int{105}
} }
func (m *AbandonChannelResponse) XXX_Unmarshal(b []byte) error { func (m *AbandonChannelResponse) XXX_Unmarshal(b []byte) error {
@ -7351,7 +7411,7 @@ func (m *DebugLevelRequest) Reset() { *m = DebugLevelRequest{} }
func (m *DebugLevelRequest) String() string { return proto.CompactTextString(m) } func (m *DebugLevelRequest) String() string { return proto.CompactTextString(m) }
func (*DebugLevelRequest) ProtoMessage() {} func (*DebugLevelRequest) ProtoMessage() {}
func (*DebugLevelRequest) Descriptor() ([]byte, []int) { func (*DebugLevelRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{105} return fileDescriptor_77a6da22d6a3feb1, []int{106}
} }
func (m *DebugLevelRequest) XXX_Unmarshal(b []byte) error { func (m *DebugLevelRequest) XXX_Unmarshal(b []byte) error {
@ -7397,7 +7457,7 @@ func (m *DebugLevelResponse) Reset() { *m = DebugLevelResponse{} }
func (m *DebugLevelResponse) String() string { return proto.CompactTextString(m) } func (m *DebugLevelResponse) String() string { return proto.CompactTextString(m) }
func (*DebugLevelResponse) ProtoMessage() {} func (*DebugLevelResponse) ProtoMessage() {}
func (*DebugLevelResponse) Descriptor() ([]byte, []int) { func (*DebugLevelResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{106} return fileDescriptor_77a6da22d6a3feb1, []int{107}
} }
func (m *DebugLevelResponse) XXX_Unmarshal(b []byte) error { func (m *DebugLevelResponse) XXX_Unmarshal(b []byte) error {
@ -7437,7 +7497,7 @@ func (m *PayReqString) Reset() { *m = PayReqString{} }
func (m *PayReqString) String() string { return proto.CompactTextString(m) } func (m *PayReqString) String() string { return proto.CompactTextString(m) }
func (*PayReqString) ProtoMessage() {} func (*PayReqString) ProtoMessage() {}
func (*PayReqString) Descriptor() ([]byte, []int) { func (*PayReqString) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{107} return fileDescriptor_77a6da22d6a3feb1, []int{108}
} }
func (m *PayReqString) XXX_Unmarshal(b []byte) error { func (m *PayReqString) XXX_Unmarshal(b []byte) error {
@ -7485,7 +7545,7 @@ func (m *PayReq) Reset() { *m = PayReq{} }
func (m *PayReq) String() string { return proto.CompactTextString(m) } func (m *PayReq) String() string { return proto.CompactTextString(m) }
func (*PayReq) ProtoMessage() {} func (*PayReq) ProtoMessage() {}
func (*PayReq) Descriptor() ([]byte, []int) { func (*PayReq) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{108} return fileDescriptor_77a6da22d6a3feb1, []int{109}
} }
func (m *PayReq) XXX_Unmarshal(b []byte) error { func (m *PayReq) XXX_Unmarshal(b []byte) error {
@ -7586,7 +7646,7 @@ func (m *FeeReportRequest) Reset() { *m = FeeReportRequest{} }
func (m *FeeReportRequest) String() string { return proto.CompactTextString(m) } func (m *FeeReportRequest) String() string { return proto.CompactTextString(m) }
func (*FeeReportRequest) ProtoMessage() {} func (*FeeReportRequest) ProtoMessage() {}
func (*FeeReportRequest) Descriptor() ([]byte, []int) { func (*FeeReportRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{109} return fileDescriptor_77a6da22d6a3feb1, []int{110}
} }
func (m *FeeReportRequest) XXX_Unmarshal(b []byte) error { func (m *FeeReportRequest) XXX_Unmarshal(b []byte) error {
@ -7625,7 +7685,7 @@ func (m *ChannelFeeReport) Reset() { *m = ChannelFeeReport{} }
func (m *ChannelFeeReport) String() string { return proto.CompactTextString(m) } func (m *ChannelFeeReport) String() string { return proto.CompactTextString(m) }
func (*ChannelFeeReport) ProtoMessage() {} func (*ChannelFeeReport) ProtoMessage() {}
func (*ChannelFeeReport) Descriptor() ([]byte, []int) { func (*ChannelFeeReport) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{110} return fileDescriptor_77a6da22d6a3feb1, []int{111}
} }
func (m *ChannelFeeReport) XXX_Unmarshal(b []byte) error { func (m *ChannelFeeReport) XXX_Unmarshal(b []byte) error {
@ -7692,7 +7752,7 @@ func (m *FeeReportResponse) Reset() { *m = FeeReportResponse{} }
func (m *FeeReportResponse) String() string { return proto.CompactTextString(m) } func (m *FeeReportResponse) String() string { return proto.CompactTextString(m) }
func (*FeeReportResponse) ProtoMessage() {} func (*FeeReportResponse) ProtoMessage() {}
func (*FeeReportResponse) Descriptor() ([]byte, []int) { func (*FeeReportResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{111} return fileDescriptor_77a6da22d6a3feb1, []int{112}
} }
func (m *FeeReportResponse) XXX_Unmarshal(b []byte) error { func (m *FeeReportResponse) XXX_Unmarshal(b []byte) error {
@ -7761,7 +7821,7 @@ func (m *PolicyUpdateRequest) Reset() { *m = PolicyUpdateRequest{} }
func (m *PolicyUpdateRequest) String() string { return proto.CompactTextString(m) } func (m *PolicyUpdateRequest) String() string { return proto.CompactTextString(m) }
func (*PolicyUpdateRequest) ProtoMessage() {} func (*PolicyUpdateRequest) ProtoMessage() {}
func (*PolicyUpdateRequest) Descriptor() ([]byte, []int) { func (*PolicyUpdateRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{112} return fileDescriptor_77a6da22d6a3feb1, []int{113}
} }
func (m *PolicyUpdateRequest) XXX_Unmarshal(b []byte) error { func (m *PolicyUpdateRequest) XXX_Unmarshal(b []byte) error {
@ -7858,7 +7918,7 @@ func (m *PolicyUpdateResponse) Reset() { *m = PolicyUpdateResponse{} }
func (m *PolicyUpdateResponse) String() string { return proto.CompactTextString(m) } func (m *PolicyUpdateResponse) String() string { return proto.CompactTextString(m) }
func (*PolicyUpdateResponse) ProtoMessage() {} func (*PolicyUpdateResponse) ProtoMessage() {}
func (*PolicyUpdateResponse) Descriptor() ([]byte, []int) { func (*PolicyUpdateResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{113} return fileDescriptor_77a6da22d6a3feb1, []int{114}
} }
func (m *PolicyUpdateResponse) XXX_Unmarshal(b []byte) error { func (m *PolicyUpdateResponse) XXX_Unmarshal(b []byte) error {
@ -7897,7 +7957,7 @@ func (m *ForwardingHistoryRequest) Reset() { *m = ForwardingHistoryReque
func (m *ForwardingHistoryRequest) String() string { return proto.CompactTextString(m) } func (m *ForwardingHistoryRequest) String() string { return proto.CompactTextString(m) }
func (*ForwardingHistoryRequest) ProtoMessage() {} func (*ForwardingHistoryRequest) ProtoMessage() {}
func (*ForwardingHistoryRequest) Descriptor() ([]byte, []int) { func (*ForwardingHistoryRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{114} return fileDescriptor_77a6da22d6a3feb1, []int{115}
} }
func (m *ForwardingHistoryRequest) XXX_Unmarshal(b []byte) error { func (m *ForwardingHistoryRequest) XXX_Unmarshal(b []byte) error {
@ -7970,7 +8030,7 @@ func (m *ForwardingEvent) Reset() { *m = ForwardingEvent{} }
func (m *ForwardingEvent) String() string { return proto.CompactTextString(m) } func (m *ForwardingEvent) String() string { return proto.CompactTextString(m) }
func (*ForwardingEvent) ProtoMessage() {} func (*ForwardingEvent) ProtoMessage() {}
func (*ForwardingEvent) Descriptor() ([]byte, []int) { func (*ForwardingEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{115} return fileDescriptor_77a6da22d6a3feb1, []int{116}
} }
func (m *ForwardingEvent) XXX_Unmarshal(b []byte) error { func (m *ForwardingEvent) XXX_Unmarshal(b []byte) error {
@ -8054,7 +8114,7 @@ func (m *ForwardingHistoryResponse) Reset() { *m = ForwardingHistoryResp
func (m *ForwardingHistoryResponse) String() string { return proto.CompactTextString(m) } func (m *ForwardingHistoryResponse) String() string { return proto.CompactTextString(m) }
func (*ForwardingHistoryResponse) ProtoMessage() {} func (*ForwardingHistoryResponse) ProtoMessage() {}
func (*ForwardingHistoryResponse) Descriptor() ([]byte, []int) { func (*ForwardingHistoryResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{116} return fileDescriptor_77a6da22d6a3feb1, []int{117}
} }
func (m *ForwardingHistoryResponse) XXX_Unmarshal(b []byte) error { func (m *ForwardingHistoryResponse) XXX_Unmarshal(b []byte) error {
@ -8101,7 +8161,7 @@ func (m *ExportChannelBackupRequest) Reset() { *m = ExportChannelBackupR
func (m *ExportChannelBackupRequest) String() string { return proto.CompactTextString(m) } func (m *ExportChannelBackupRequest) String() string { return proto.CompactTextString(m) }
func (*ExportChannelBackupRequest) ProtoMessage() {} func (*ExportChannelBackupRequest) ProtoMessage() {}
func (*ExportChannelBackupRequest) Descriptor() ([]byte, []int) { func (*ExportChannelBackupRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{117} return fileDescriptor_77a6da22d6a3feb1, []int{118}
} }
func (m *ExportChannelBackupRequest) XXX_Unmarshal(b []byte) error { func (m *ExportChannelBackupRequest) XXX_Unmarshal(b []byte) error {
@ -8147,7 +8207,7 @@ func (m *ChannelBackup) Reset() { *m = ChannelBackup{} }
func (m *ChannelBackup) String() string { return proto.CompactTextString(m) } func (m *ChannelBackup) String() string { return proto.CompactTextString(m) }
func (*ChannelBackup) ProtoMessage() {} func (*ChannelBackup) ProtoMessage() {}
func (*ChannelBackup) Descriptor() ([]byte, []int) { func (*ChannelBackup) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{118} return fileDescriptor_77a6da22d6a3feb1, []int{119}
} }
func (m *ChannelBackup) XXX_Unmarshal(b []byte) error { func (m *ChannelBackup) XXX_Unmarshal(b []byte) error {
@ -8200,7 +8260,7 @@ func (m *MultiChanBackup) Reset() { *m = MultiChanBackup{} }
func (m *MultiChanBackup) String() string { return proto.CompactTextString(m) } func (m *MultiChanBackup) String() string { return proto.CompactTextString(m) }
func (*MultiChanBackup) ProtoMessage() {} func (*MultiChanBackup) ProtoMessage() {}
func (*MultiChanBackup) Descriptor() ([]byte, []int) { func (*MultiChanBackup) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{119} return fileDescriptor_77a6da22d6a3feb1, []int{120}
} }
func (m *MultiChanBackup) XXX_Unmarshal(b []byte) error { func (m *MultiChanBackup) XXX_Unmarshal(b []byte) error {
@ -8245,7 +8305,7 @@ func (m *ChanBackupExportRequest) Reset() { *m = ChanBackupExportRequest
func (m *ChanBackupExportRequest) String() string { return proto.CompactTextString(m) } func (m *ChanBackupExportRequest) String() string { return proto.CompactTextString(m) }
func (*ChanBackupExportRequest) ProtoMessage() {} func (*ChanBackupExportRequest) ProtoMessage() {}
func (*ChanBackupExportRequest) Descriptor() ([]byte, []int) { func (*ChanBackupExportRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{120} return fileDescriptor_77a6da22d6a3feb1, []int{121}
} }
func (m *ChanBackupExportRequest) XXX_Unmarshal(b []byte) error { func (m *ChanBackupExportRequest) XXX_Unmarshal(b []byte) error {
@ -8284,7 +8344,7 @@ func (m *ChanBackupSnapshot) Reset() { *m = ChanBackupSnapshot{} }
func (m *ChanBackupSnapshot) String() string { return proto.CompactTextString(m) } func (m *ChanBackupSnapshot) String() string { return proto.CompactTextString(m) }
func (*ChanBackupSnapshot) ProtoMessage() {} func (*ChanBackupSnapshot) ProtoMessage() {}
func (*ChanBackupSnapshot) Descriptor() ([]byte, []int) { func (*ChanBackupSnapshot) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{121} return fileDescriptor_77a6da22d6a3feb1, []int{122}
} }
func (m *ChanBackupSnapshot) XXX_Unmarshal(b []byte) error { func (m *ChanBackupSnapshot) XXX_Unmarshal(b []byte) error {
@ -8332,7 +8392,7 @@ func (m *ChannelBackups) Reset() { *m = ChannelBackups{} }
func (m *ChannelBackups) String() string { return proto.CompactTextString(m) } func (m *ChannelBackups) String() string { return proto.CompactTextString(m) }
func (*ChannelBackups) ProtoMessage() {} func (*ChannelBackups) ProtoMessage() {}
func (*ChannelBackups) Descriptor() ([]byte, []int) { func (*ChannelBackups) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{122} return fileDescriptor_77a6da22d6a3feb1, []int{123}
} }
func (m *ChannelBackups) XXX_Unmarshal(b []byte) error { func (m *ChannelBackups) XXX_Unmarshal(b []byte) error {
@ -8374,7 +8434,7 @@ func (m *RestoreChanBackupRequest) Reset() { *m = RestoreChanBackupReque
func (m *RestoreChanBackupRequest) String() string { return proto.CompactTextString(m) } func (m *RestoreChanBackupRequest) String() string { return proto.CompactTextString(m) }
func (*RestoreChanBackupRequest) ProtoMessage() {} func (*RestoreChanBackupRequest) ProtoMessage() {}
func (*RestoreChanBackupRequest) Descriptor() ([]byte, []int) { func (*RestoreChanBackupRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{123} return fileDescriptor_77a6da22d6a3feb1, []int{124}
} }
func (m *RestoreChanBackupRequest) XXX_Unmarshal(b []byte) error { func (m *RestoreChanBackupRequest) XXX_Unmarshal(b []byte) error {
@ -8450,7 +8510,7 @@ func (m *RestoreBackupResponse) Reset() { *m = RestoreBackupResponse{} }
func (m *RestoreBackupResponse) String() string { return proto.CompactTextString(m) } func (m *RestoreBackupResponse) String() string { return proto.CompactTextString(m) }
func (*RestoreBackupResponse) ProtoMessage() {} func (*RestoreBackupResponse) ProtoMessage() {}
func (*RestoreBackupResponse) Descriptor() ([]byte, []int) { func (*RestoreBackupResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{124} return fileDescriptor_77a6da22d6a3feb1, []int{125}
} }
func (m *RestoreBackupResponse) XXX_Unmarshal(b []byte) error { func (m *RestoreBackupResponse) XXX_Unmarshal(b []byte) error {
@ -8481,7 +8541,7 @@ func (m *ChannelBackupSubscription) Reset() { *m = ChannelBackupSubscrip
func (m *ChannelBackupSubscription) String() string { return proto.CompactTextString(m) } func (m *ChannelBackupSubscription) String() string { return proto.CompactTextString(m) }
func (*ChannelBackupSubscription) ProtoMessage() {} func (*ChannelBackupSubscription) ProtoMessage() {}
func (*ChannelBackupSubscription) Descriptor() ([]byte, []int) { func (*ChannelBackupSubscription) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{125} return fileDescriptor_77a6da22d6a3feb1, []int{126}
} }
func (m *ChannelBackupSubscription) XXX_Unmarshal(b []byte) error { func (m *ChannelBackupSubscription) XXX_Unmarshal(b []byte) error {
@ -8512,7 +8572,7 @@ func (m *VerifyChanBackupResponse) Reset() { *m = VerifyChanBackupRespon
func (m *VerifyChanBackupResponse) String() string { return proto.CompactTextString(m) } func (m *VerifyChanBackupResponse) String() string { return proto.CompactTextString(m) }
func (*VerifyChanBackupResponse) ProtoMessage() {} func (*VerifyChanBackupResponse) ProtoMessage() {}
func (*VerifyChanBackupResponse) Descriptor() ([]byte, []int) { func (*VerifyChanBackupResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{126} return fileDescriptor_77a6da22d6a3feb1, []int{127}
} }
func (m *VerifyChanBackupResponse) XXX_Unmarshal(b []byte) error { func (m *VerifyChanBackupResponse) XXX_Unmarshal(b []byte) error {
@ -8615,6 +8675,7 @@ func init() {
proto.RegisterType((*ChannelBalanceRequest)(nil), "lnrpc.ChannelBalanceRequest") proto.RegisterType((*ChannelBalanceRequest)(nil), "lnrpc.ChannelBalanceRequest")
proto.RegisterType((*ChannelBalanceResponse)(nil), "lnrpc.ChannelBalanceResponse") proto.RegisterType((*ChannelBalanceResponse)(nil), "lnrpc.ChannelBalanceResponse")
proto.RegisterType((*QueryRoutesRequest)(nil), "lnrpc.QueryRoutesRequest") proto.RegisterType((*QueryRoutesRequest)(nil), "lnrpc.QueryRoutesRequest")
proto.RegisterType((*NodePair)(nil), "lnrpc.NodePair")
proto.RegisterType((*EdgeLocator)(nil), "lnrpc.EdgeLocator") proto.RegisterType((*EdgeLocator)(nil), "lnrpc.EdgeLocator")
proto.RegisterType((*QueryRoutesResponse)(nil), "lnrpc.QueryRoutesResponse") proto.RegisterType((*QueryRoutesResponse)(nil), "lnrpc.QueryRoutesResponse")
proto.RegisterType((*Hop)(nil), "lnrpc.Hop") proto.RegisterType((*Hop)(nil), "lnrpc.Hop")
@ -8679,505 +8740,508 @@ func init() {
func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) }
var fileDescriptor_77a6da22d6a3feb1 = []byte{ var fileDescriptor_77a6da22d6a3feb1 = []byte{
// 7964 bytes of a gzipped FileDescriptorProto // 8015 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7d, 0x5d, 0x6c, 0x24, 0x49, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7d, 0x5d, 0x6c, 0x24, 0x49,
0xd2, 0x90, 0xab, 0x7f, 0xec, 0xee, 0xe8, 0x76, 0xbb, 0x9d, 0xfe, 0xeb, 0xe9, 0x9d, 0x9d, 0xf5, 0xd2, 0x90, 0xab, 0x7f, 0xec, 0xee, 0xe8, 0x76, 0xbb, 0x9d, 0xfe, 0xeb, 0xe9, 0x9d, 0x9d, 0xf5,
0xd6, 0xcd, 0x37, 0x33, 0xeb, 0xdd, 0xcf, 0x9e, 0xf5, 0xdd, 0xed, 0x37, 0xdf, 0x0e, 0x1f, 0x1f, 0xd6, 0xcd, 0x37, 0x33, 0xeb, 0xdd, 0xcf, 0x9e, 0xf5, 0xed, 0x2d, 0xf3, 0xed, 0xf0, 0xf1, 0xe1,
0xfe, 0x9b, 0xf1, 0xec, 0x7a, 0x3c, 0xbe, 0xf2, 0xcc, 0x0d, 0xbb, 0x77, 0xa8, 0xaf, 0xdc, 0x9d, 0xbf, 0x19, 0xcf, 0xae, 0xc7, 0xe3, 0x2b, 0xcf, 0xdc, 0xb0, 0x7b, 0x1f, 0xea, 0x2b, 0x77, 0xa7,
0x6e, 0xd7, 0x4e, 0x77, 0x55, 0x6f, 0x55, 0xb5, 0x3d, 0xde, 0x65, 0x78, 0x40, 0x08, 0x10, 0x12, 0xdb, 0xb5, 0xd3, 0x5d, 0xd5, 0x5b, 0x55, 0x6d, 0x8f, 0x77, 0x19, 0x1e, 0x10, 0x02, 0x04, 0x42,
0x42, 0x0b, 0x02, 0x01, 0x02, 0x21, 0xdd, 0xf1, 0xc0, 0x89, 0x07, 0xe0, 0x01, 0x04, 0xd2, 0x49, 0x68, 0x41, 0x20, 0x40, 0x20, 0xa4, 0x3b, 0x1e, 0x38, 0xf1, 0x00, 0x3c, 0x80, 0x40, 0x3a, 0x89,
0x3c, 0xf2, 0x84, 0xd0, 0xe9, 0x1e, 0x91, 0x38, 0x21, 0x90, 0xd0, 0x89, 0x27, 0x90, 0x78, 0x47, 0x47, 0x9e, 0x10, 0x42, 0xf7, 0x88, 0xc4, 0x09, 0x81, 0x84, 0x4e, 0x3c, 0x81, 0xc4, 0x3b, 0xca,
0x19, 0xf9, 0x53, 0x99, 0x55, 0xd5, 0xe3, 0xd9, 0xbb, 0x83, 0x27, 0x77, 0x46, 0x44, 0xe5, 0x6f, 0xc8, 0x9f, 0xca, 0xac, 0xaa, 0x1e, 0xcf, 0xde, 0x1d, 0xdf, 0x93, 0x3b, 0x23, 0xa2, 0xf2, 0x37,
0x44, 0x64, 0x44, 0x64, 0x64, 0x1a, 0xaa, 0xe1, 0xa8, 0xbb, 0x3e, 0x0a, 0x83, 0x38, 0x20, 0xe5, 0x22, 0x32, 0x22, 0x32, 0x32, 0x0d, 0xd5, 0x70, 0xd4, 0x5d, 0x1f, 0x85, 0x41, 0x1c, 0x90, 0xf2,
0x81, 0x1f, 0x8e, 0xba, 0xed, 0xeb, 0xfd, 0x20, 0xe8, 0x0f, 0xe8, 0x86, 0x3b, 0xf2, 0x36, 0x5c, 0xc0, 0x0f, 0x47, 0xdd, 0xf6, 0xf5, 0x7e, 0x10, 0xf4, 0x07, 0x74, 0xc3, 0x1d, 0x79, 0x1b, 0xae,
0xdf, 0x0f, 0x62, 0x37, 0xf6, 0x02, 0x3f, 0xe2, 0x44, 0xf6, 0x4f, 0xa0, 0xf1, 0x90, 0xfa, 0xc7, 0xef, 0x07, 0xb1, 0x1b, 0x7b, 0x81, 0x1f, 0x71, 0x22, 0xfb, 0x27, 0xd0, 0x78, 0x48, 0xfd, 0x63,
0x94, 0xf6, 0x1c, 0xfa, 0xe5, 0x98, 0x46, 0x31, 0x79, 0x1f, 0xe6, 0x5d, 0xfa, 0x15, 0xa5, 0xbd, 0x4a, 0x7b, 0x0e, 0xfd, 0x6a, 0x4c, 0xa3, 0x98, 0xbc, 0x0f, 0xf3, 0x2e, 0xfd, 0x9a, 0xd2, 0x5e,
0xce, 0xc8, 0x8d, 0xa2, 0xd1, 0x59, 0xe8, 0x46, 0xb4, 0x65, 0xad, 0x5a, 0x77, 0xea, 0x4e, 0x93, 0x67, 0xe4, 0x46, 0xd1, 0xe8, 0x2c, 0x74, 0x23, 0xda, 0xb2, 0x56, 0xad, 0x3b, 0x75, 0xa7, 0xc9,
0x23, 0x8e, 0x14, 0x9c, 0xbc, 0x0b, 0xf5, 0x88, 0x91, 0x52, 0x3f, 0x0e, 0x83, 0xd1, 0x65, 0xab, 0x11, 0x47, 0x0a, 0x4e, 0xde, 0x85, 0x7a, 0xc4, 0x48, 0xa9, 0x1f, 0x87, 0xc1, 0xe8, 0xb2, 0x55,
0x80, 0x74, 0x35, 0x06, 0xdb, 0xe3, 0x20, 0x7b, 0x00, 0x73, 0xaa, 0x85, 0x68, 0x14, 0xf8, 0x11, 0x40, 0xba, 0x1a, 0x83, 0xed, 0x71, 0x90, 0x3d, 0x80, 0x39, 0xd5, 0x42, 0x34, 0x0a, 0xfc, 0x88,
0x25, 0x77, 0x61, 0xb1, 0xeb, 0x8d, 0xce, 0x68, 0xd8, 0xc1, 0x8f, 0x87, 0x3e, 0x1d, 0x06, 0xbe, 0x92, 0xbb, 0xb0, 0xd8, 0xf5, 0x46, 0x67, 0x34, 0xec, 0xe0, 0xc7, 0x43, 0x9f, 0x0e, 0x03, 0xdf,
0xd7, 0x6d, 0x59, 0xab, 0xc5, 0x3b, 0x55, 0x87, 0x70, 0x1c, 0xfb, 0xe2, 0xb1, 0xc0, 0x90, 0xdb, 0xeb, 0xb6, 0xac, 0xd5, 0xe2, 0x9d, 0xaa, 0x43, 0x38, 0x8e, 0x7d, 0xf1, 0x58, 0x60, 0xc8, 0x6d,
0x30, 0x47, 0x7d, 0x0e, 0xa7, 0x3d, 0xfc, 0x4a, 0x34, 0xd5, 0x48, 0xc0, 0xec, 0x03, 0xfb, 0xaf, 0x98, 0xa3, 0x3e, 0x87, 0xd3, 0x1e, 0x7e, 0x25, 0x9a, 0x6a, 0x24, 0x60, 0xf6, 0x81, 0xfd, 0xd7,
0x17, 0x60, 0xfe, 0x91, 0xef, 0xc5, 0xcf, 0xdd, 0xc1, 0x80, 0xc6, 0x72, 0x4c, 0xb7, 0x61, 0xee, 0x0a, 0x30, 0xff, 0xc8, 0xf7, 0xe2, 0xe7, 0xee, 0x60, 0x40, 0x63, 0x39, 0xa6, 0xdb, 0x30, 0x77,
0x02, 0x01, 0x38, 0xa6, 0x8b, 0x20, 0xec, 0x89, 0x11, 0x35, 0x38, 0xf8, 0x48, 0x40, 0x27, 0xf6, 0x81, 0x00, 0x1c, 0xd3, 0x45, 0x10, 0xf6, 0xc4, 0x88, 0x1a, 0x1c, 0x7c, 0x24, 0xa0, 0x13, 0x7b,
0xac, 0x30, 0xb1, 0x67, 0xb9, 0xd3, 0x55, 0x9c, 0x30, 0x5d, 0xb7, 0x61, 0x2e, 0xa4, 0xdd, 0xe0, 0x56, 0x98, 0xd8, 0xb3, 0xdc, 0xe9, 0x2a, 0x4e, 0x98, 0xae, 0xdb, 0x30, 0x17, 0xd2, 0x6e, 0x70,
0x9c, 0x86, 0x97, 0x9d, 0x0b, 0xcf, 0xef, 0x05, 0x17, 0xad, 0xd2, 0xaa, 0x75, 0xa7, 0xec, 0x34, 0x4e, 0xc3, 0xcb, 0xce, 0x85, 0xe7, 0xf7, 0x82, 0x8b, 0x56, 0x69, 0xd5, 0xba, 0x53, 0x76, 0x1a,
0x24, 0xf8, 0x39, 0x42, 0xc9, 0x36, 0xcc, 0x75, 0xcf, 0x5c, 0xdf, 0xa7, 0x83, 0xce, 0x89, 0xdb, 0x12, 0xfc, 0x1c, 0xa1, 0x64, 0x1b, 0xe6, 0xba, 0x67, 0xae, 0xef, 0xd3, 0x41, 0xe7, 0xc4, 0xed,
0x7d, 0x31, 0x1e, 0x45, 0xad, 0xf2, 0xaa, 0x75, 0xa7, 0xb6, 0x79, 0x6d, 0x1d, 0x57, 0x75, 0x7d, 0xbe, 0x18, 0x8f, 0xa2, 0x56, 0x79, 0xd5, 0xba, 0x53, 0xdb, 0xbc, 0xb6, 0x8e, 0xab, 0xba, 0xbe,
0xe7, 0xcc, 0xf5, 0xb7, 0x11, 0x73, 0xec, 0xbb, 0xa3, 0xe8, 0x2c, 0x88, 0x9d, 0x86, 0xf8, 0x82, 0x73, 0xe6, 0xfa, 0xdb, 0x88, 0x39, 0xf6, 0xdd, 0x51, 0x74, 0x16, 0xc4, 0x4e, 0x43, 0x7c, 0xc1,
0x83, 0x23, 0x7b, 0x11, 0x88, 0x3e, 0x13, 0x7c, 0xee, 0xed, 0x7f, 0x6e, 0xc1, 0xc2, 0x33, 0x7f, 0xc1, 0x91, 0xbd, 0x08, 0x44, 0x9f, 0x09, 0x3e, 0xf7, 0xf6, 0x3f, 0xb7, 0x60, 0xe1, 0x99, 0x3f,
0x10, 0x74, 0x5f, 0xfc, 0x96, 0x53, 0x94, 0x33, 0x86, 0xc2, 0x9b, 0x8e, 0xa1, 0xf8, 0x6d, 0xc7, 0x08, 0xba, 0x2f, 0x7e, 0xc3, 0x29, 0xca, 0x19, 0x43, 0xe1, 0x4d, 0xc7, 0x50, 0xfc, 0xae, 0x63,
0xb0, 0x0c, 0x8b, 0x66, 0x67, 0xc5, 0x28, 0x28, 0x2c, 0xb1, 0xaf, 0xfb, 0x54, 0x76, 0x4b, 0x0e, 0x58, 0x86, 0x45, 0xb3, 0xb3, 0x62, 0x14, 0x14, 0x96, 0xd8, 0xd7, 0x7d, 0x2a, 0xbb, 0x25, 0x87,
0xe3, 0x3d, 0x68, 0x76, 0xc7, 0x61, 0x48, 0xfd, 0xcc, 0x38, 0xe6, 0x04, 0x5c, 0x0d, 0xe4, 0x5d, 0xf1, 0x1e, 0x34, 0xbb, 0xe3, 0x30, 0xa4, 0x7e, 0x66, 0x1c, 0x73, 0x02, 0xae, 0x06, 0xf2, 0x2e,
0xa8, 0xfb, 0xf4, 0x22, 0x21, 0x13, 0xbc, 0xeb, 0xd3, 0x0b, 0x49, 0x62, 0xb7, 0x60, 0x39, 0xdd, 0xd4, 0x7d, 0x7a, 0x91, 0x90, 0x09, 0xde, 0xf5, 0xe9, 0x85, 0x24, 0xb1, 0x5b, 0xb0, 0x9c, 0x6e,
0x8c, 0xe8, 0xc0, 0x7f, 0xb5, 0xa0, 0xf4, 0x2c, 0x7e, 0x19, 0x90, 0x75, 0x28, 0xc5, 0x97, 0x23, 0x46, 0x74, 0xe0, 0xbf, 0x59, 0x50, 0x7a, 0x16, 0xbf, 0x0c, 0xc8, 0x3a, 0x94, 0xe2, 0xcb, 0x11,
0x2e, 0x21, 0x8d, 0x4d, 0x22, 0x86, 0xb6, 0xd5, 0xeb, 0x85, 0x34, 0x8a, 0x9e, 0x5e, 0x8e, 0xa8, 0x97, 0x90, 0xc6, 0x26, 0x11, 0x43, 0xdb, 0xea, 0xf5, 0x42, 0x1a, 0x45, 0x4f, 0x2f, 0x47, 0xd4,
0x53, 0x77, 0x79, 0xa1, 0xc3, 0xe8, 0x48, 0x0b, 0x66, 0x44, 0x19, 0x1b, 0xac, 0x3a, 0xb2, 0x48, 0xa9, 0xbb, 0xbc, 0xd0, 0x61, 0x74, 0xa4, 0x05, 0x33, 0xa2, 0x8c, 0x0d, 0x56, 0x1d, 0x59, 0x24,
0x6e, 0x00, 0xb8, 0xc3, 0x60, 0xec, 0xc7, 0x9d, 0xc8, 0x8d, 0x71, 0xaa, 0x8a, 0x8e, 0x06, 0x21, 0x37, 0x00, 0xdc, 0x61, 0x30, 0xf6, 0xe3, 0x4e, 0xe4, 0xc6, 0x38, 0x55, 0x45, 0x47, 0x83, 0x90,
0xd7, 0xa1, 0x3a, 0x7a, 0xd1, 0x89, 0xba, 0xa1, 0x37, 0x8a, 0x91, 0x6d, 0xaa, 0x4e, 0x02, 0x20, 0xeb, 0x50, 0x1d, 0xbd, 0xe8, 0x44, 0xdd, 0xd0, 0x1b, 0xc5, 0xc8, 0x36, 0x55, 0x27, 0x01, 0x90,
0xef, 0x43, 0x25, 0x18, 0xc7, 0xa3, 0xc0, 0xf3, 0x63, 0xc1, 0x2a, 0x73, 0xa2, 0x2f, 0x4f, 0xc6, 0xf7, 0xa1, 0x12, 0x8c, 0xe3, 0x51, 0xe0, 0xf9, 0xb1, 0x60, 0x95, 0x39, 0xd1, 0x97, 0x27, 0xe3,
0xf1, 0x11, 0x03, 0x3b, 0x8a, 0x80, 0xdc, 0x84, 0xd9, 0x6e, 0xe0, 0x9f, 0x7a, 0xe1, 0x90, 0x2b, 0xf8, 0x88, 0x81, 0x1d, 0x45, 0x40, 0x6e, 0xc2, 0x6c, 0x37, 0xf0, 0x4f, 0xbd, 0x70, 0xc8, 0x95,
0x83, 0xd6, 0x34, 0xb6, 0x66, 0x02, 0xed, 0x7f, 0x57, 0x80, 0xda, 0xd3, 0xd0, 0xf5, 0x23, 0xb7, 0x41, 0x6b, 0x1a, 0x5b, 0x33, 0x81, 0xf6, 0xbf, 0x2b, 0x40, 0xed, 0x69, 0xe8, 0xfa, 0x91, 0xdb,
0xcb, 0x00, 0xac, 0xeb, 0xf1, 0xcb, 0xce, 0x99, 0x1b, 0x9d, 0xe1, 0x68, 0xab, 0x8e, 0x2c, 0x92, 0x65, 0x00, 0xd6, 0xf5, 0xf8, 0x65, 0xe7, 0xcc, 0x8d, 0xce, 0x70, 0xb4, 0x55, 0x47, 0x16, 0xc9,
0x65, 0x98, 0xe6, 0x1d, 0xc5, 0x31, 0x15, 0x1d, 0x51, 0x22, 0x1f, 0xc0, 0xbc, 0x3f, 0x1e, 0x76, 0x32, 0x4c, 0xf3, 0x8e, 0xe2, 0x98, 0x8a, 0x8e, 0x28, 0x91, 0x0f, 0x60, 0xde, 0x1f, 0x0f, 0x3b,
0xcc, 0xb6, 0x8a, 0xc8, 0x2d, 0x59, 0x04, 0x9b, 0x80, 0x13, 0xb6, 0xd6, 0xbc, 0x09, 0x3e, 0x42, 0x66, 0x5b, 0x45, 0xe4, 0x96, 0x2c, 0x82, 0x4d, 0xc0, 0x09, 0x5b, 0x6b, 0xde, 0x04, 0x1f, 0xa1,
0x0d, 0x42, 0x6c, 0xa8, 0x8b, 0x12, 0xf5, 0xfa, 0x67, 0x7c, 0x98, 0x65, 0xc7, 0x80, 0xb1, 0x3a, 0x06, 0x21, 0x36, 0xd4, 0x45, 0x89, 0x7a, 0xfd, 0x33, 0x3e, 0xcc, 0xb2, 0x63, 0xc0, 0x58, 0x1d,
0x62, 0x6f, 0x48, 0x3b, 0x51, 0xec, 0x0e, 0x47, 0x62, 0x58, 0x1a, 0x04, 0xf1, 0x41, 0xec, 0x0e, 0xb1, 0x37, 0xa4, 0x9d, 0x28, 0x76, 0x87, 0x23, 0x31, 0x2c, 0x0d, 0x82, 0xf8, 0x20, 0x76, 0x07,
0x3a, 0xa7, 0x94, 0x46, 0xad, 0x19, 0x81, 0x57, 0x10, 0x72, 0x0b, 0x1a, 0x3d, 0x1a, 0xc5, 0x1d, 0x9d, 0x53, 0x4a, 0xa3, 0xd6, 0x8c, 0xc0, 0x2b, 0x08, 0xb9, 0x05, 0x8d, 0x1e, 0x8d, 0xe2, 0x8e,
0xb1, 0x28, 0x34, 0x6a, 0x55, 0x50, 0xf4, 0x53, 0x50, 0x56, 0x4f, 0xe8, 0x5e, 0x74, 0xd8, 0x04, 0x58, 0x14, 0x1a, 0xb5, 0x2a, 0x28, 0xfa, 0x29, 0x28, 0xab, 0x27, 0x74, 0x2f, 0x3a, 0x6c, 0x02,
0xd0, 0x97, 0xad, 0x2a, 0xef, 0x6b, 0x02, 0x61, 0x9c, 0xf3, 0x90, 0xc6, 0xda, 0xec, 0x45, 0x82, 0xe8, 0xcb, 0x56, 0x95, 0xf7, 0x35, 0x81, 0x30, 0xce, 0x79, 0x48, 0x63, 0x6d, 0xf6, 0x22, 0xc1,
0x43, 0xed, 0x03, 0x20, 0x1a, 0x78, 0x97, 0xc6, 0xae, 0x37, 0x88, 0xc8, 0x47, 0x50, 0x8f, 0x35, 0xa1, 0xf6, 0x01, 0x10, 0x0d, 0xbc, 0x4b, 0x63, 0xd7, 0x1b, 0x44, 0xe4, 0x63, 0xa8, 0xc7, 0x1a,
0x62, 0x54, 0x85, 0x35, 0xc5, 0x4e, 0xda, 0x07, 0x8e, 0x41, 0x67, 0x3f, 0x84, 0xca, 0x03, 0x4a, 0x31, 0xaa, 0xc2, 0x9a, 0x62, 0x27, 0xed, 0x03, 0xc7, 0xa0, 0xb3, 0x1f, 0x42, 0xe5, 0x01, 0xa5,
0x0f, 0xbc, 0xa1, 0x17, 0x93, 0x65, 0x28, 0x9f, 0x7a, 0x2f, 0x29, 0x67, 0xf8, 0xe2, 0xfe, 0x94, 0x07, 0xde, 0xd0, 0x8b, 0xc9, 0x32, 0x94, 0x4f, 0xbd, 0x97, 0x94, 0x33, 0x7c, 0x71, 0x7f, 0xca,
0xc3, 0x8b, 0xa4, 0x0d, 0x33, 0x23, 0x1a, 0x76, 0xa9, 0x5c, 0x9e, 0xfd, 0x29, 0x47, 0x02, 0xb6, 0xe1, 0x45, 0xd2, 0x86, 0x99, 0x11, 0x0d, 0xbb, 0x54, 0x2e, 0xcf, 0xfe, 0x94, 0x23, 0x01, 0xdb,
0x67, 0xa0, 0x3c, 0x60, 0x1f, 0xdb, 0xff, 0xab, 0x00, 0xb5, 0x63, 0xea, 0x2b, 0x41, 0x22, 0x50, 0x33, 0x50, 0x1e, 0xb0, 0x8f, 0xed, 0xff, 0x5d, 0x80, 0xda, 0x31, 0xf5, 0x95, 0x20, 0x11, 0x28,
0x62, 0x43, 0x16, 0xc2, 0x83, 0xbf, 0xc9, 0x3b, 0x50, 0xc3, 0x69, 0x88, 0xe2, 0xd0, 0xf3, 0xfb, 0xb1, 0x21, 0x0b, 0xe1, 0xc1, 0xdf, 0xe4, 0x1d, 0xa8, 0xe1, 0x34, 0x44, 0x71, 0xe8, 0xf9, 0x7d,
0x82, 0x7f, 0x81, 0x81, 0x8e, 0x11, 0x42, 0x9a, 0x50, 0x74, 0x87, 0x92, 0x77, 0xd9, 0x4f, 0x26, 0xc1, 0xbf, 0xc0, 0x40, 0xc7, 0x08, 0x21, 0x4d, 0x28, 0xba, 0x43, 0xc9, 0xbb, 0xec, 0x27, 0x13,
0x64, 0x23, 0xf7, 0x72, 0xc8, 0xe4, 0x51, 0xad, 0x6a, 0xdd, 0xa9, 0x09, 0xd8, 0x3e, 0x5b, 0xd6, 0xb2, 0x91, 0x7b, 0x39, 0x64, 0xf2, 0xa8, 0x56, 0xb5, 0xee, 0xd4, 0x04, 0x6c, 0x9f, 0x2d, 0xeb,
0x75, 0x58, 0xd0, 0x49, 0x64, 0xed, 0x65, 0xac, 0x7d, 0x5e, 0xa3, 0x14, 0x8d, 0xdc, 0x86, 0x39, 0x3a, 0x2c, 0xe8, 0x24, 0xb2, 0xf6, 0x32, 0xd6, 0x3e, 0xaf, 0x51, 0x8a, 0x46, 0x6e, 0xc3, 0x9c,
0x49, 0x1f, 0xf2, 0xce, 0xe2, 0x3a, 0x57, 0x9d, 0x86, 0x00, 0xcb, 0x21, 0xdc, 0x81, 0xe6, 0xa9, 0xa4, 0x0f, 0x79, 0x67, 0x71, 0x9d, 0xab, 0x4e, 0x43, 0x80, 0xe5, 0x10, 0xee, 0x40, 0xf3, 0xd4,
0xe7, 0xbb, 0x83, 0x4e, 0x77, 0x10, 0x9f, 0x77, 0x7a, 0x74, 0x10, 0xbb, 0xb8, 0xe2, 0x65, 0xa7, 0xf3, 0xdd, 0x41, 0xa7, 0x3b, 0x88, 0xcf, 0x3b, 0x3d, 0x3a, 0x88, 0x5d, 0x5c, 0xf1, 0xb2, 0xd3,
0x81, 0xf0, 0x9d, 0x41, 0x7c, 0xbe, 0xcb, 0xa0, 0xe4, 0x03, 0xa8, 0x9e, 0x52, 0xda, 0xc1, 0x99, 0x40, 0xf8, 0xce, 0x20, 0x3e, 0xdf, 0x65, 0x50, 0xf2, 0x01, 0x54, 0x4f, 0x29, 0xed, 0xe0, 0x4c,
0x68, 0x55, 0x0c, 0xe9, 0x91, 0xb3, 0xeb, 0x54, 0x4e, 0xe5, 0x3c, 0xdf, 0x81, 0x66, 0x30, 0x8e, 0xb4, 0x2a, 0x86, 0xf4, 0xc8, 0xd9, 0x75, 0x2a, 0xa7, 0x72, 0x9e, 0xef, 0x40, 0x33, 0x18, 0xc7,
0xfb, 0x81, 0xe7, 0xf7, 0x3b, 0x4c, 0x5f, 0x75, 0xbc, 0x1e, 0x72, 0x40, 0xc9, 0x69, 0x48, 0x38, 0xfd, 0xc0, 0xf3, 0xfb, 0x1d, 0xa6, 0xaf, 0x3a, 0x5e, 0x0f, 0x39, 0xa0, 0xe4, 0x34, 0x24, 0x9c,
0xd3, 0x1a, 0x8f, 0x7a, 0xe4, 0x6d, 0x00, 0x6c, 0x9b, 0x57, 0x0c, 0xab, 0xd6, 0x9d, 0x59, 0xa7, 0x69, 0x8d, 0x47, 0x3d, 0xf2, 0x36, 0x00, 0xb6, 0xcd, 0x2b, 0x86, 0x55, 0xeb, 0xce, 0xac, 0x53,
0xca, 0x20, 0x58, 0x91, 0xfd, 0x6f, 0x2d, 0xa8, 0xf3, 0x39, 0x17, 0x1b, 0xe3, 0x4d, 0x98, 0x95, 0x65, 0x10, 0xac, 0xc8, 0xfe, 0xb7, 0x16, 0xd4, 0xf9, 0x9c, 0x8b, 0x8d, 0xf1, 0x26, 0xcc, 0xca,
0x43, 0xa3, 0x61, 0x18, 0x84, 0x42, 0xce, 0x4c, 0x20, 0x59, 0x83, 0xa6, 0x04, 0x8c, 0x42, 0xea, 0xa1, 0xd1, 0x30, 0x0c, 0x42, 0x21, 0x67, 0x26, 0x90, 0xac, 0x41, 0x53, 0x02, 0x46, 0x21, 0xf5,
0x0d, 0xdd, 0x3e, 0x15, 0xca, 0x2b, 0x03, 0x27, 0x9b, 0x49, 0x8d, 0x61, 0x30, 0x8e, 0xa9, 0x50, 0x86, 0x6e, 0x9f, 0x0a, 0xe5, 0x95, 0x81, 0x93, 0xcd, 0xa4, 0xc6, 0x30, 0x18, 0xc7, 0x54, 0xa8,
0xc1, 0x75, 0x31, 0x3a, 0x87, 0xc1, 0x1c, 0x93, 0x84, 0xc9, 0x59, 0xce, 0x9a, 0x19, 0x30, 0xfb, 0xe0, 0xba, 0x18, 0x9d, 0xc3, 0x60, 0x8e, 0x49, 0xc2, 0xe4, 0x2c, 0x67, 0xcd, 0x0c, 0x98, 0xfd,
0x1b, 0x0b, 0x08, 0xeb, 0xfa, 0xd3, 0x80, 0x57, 0x21, 0xa6, 0x3c, 0xbd, 0xdc, 0xd6, 0x1b, 0x2f, 0xad, 0x05, 0x84, 0x75, 0xfd, 0x69, 0xc0, 0xab, 0x10, 0x53, 0x9e, 0x5e, 0x6e, 0xeb, 0x8d, 0x97,
0x77, 0x61, 0xd2, 0x72, 0xdb, 0x50, 0xe6, 0x3d, 0x2f, 0xe5, 0xf4, 0x9c, 0xa3, 0x3e, 0x29, 0x55, 0xbb, 0x30, 0x69, 0xb9, 0x6d, 0x28, 0xf3, 0x9e, 0x97, 0x72, 0x7a, 0xce, 0x51, 0x9f, 0x96, 0x2a,
0x8a, 0xcd, 0x92, 0xfd, 0x53, 0x0b, 0xea, 0x3b, 0x7c, 0xff, 0x40, 0x85, 0x47, 0xee, 0x02, 0x39, 0xc5, 0x66, 0xc9, 0xfe, 0xa9, 0x05, 0xf5, 0x1d, 0xbe, 0x7f, 0xa0, 0xc2, 0x23, 0x77, 0x81, 0x9c,
0x1d, 0xfb, 0x3d, 0xb6, 0x4e, 0xf1, 0x4b, 0xaf, 0xd7, 0x39, 0xb9, 0x8c, 0x69, 0xc4, 0xfb, 0xb4, 0x8e, 0xfd, 0x1e, 0x5b, 0xa7, 0xf8, 0xa5, 0xd7, 0xeb, 0x9c, 0x5c, 0xc6, 0x34, 0xe2, 0x7d, 0xda,
0x3f, 0xe5, 0xe4, 0xe0, 0xc8, 0x07, 0xd0, 0x34, 0xa0, 0x51, 0x1c, 0xf2, 0x9e, 0xed, 0x4f, 0x39, 0x9f, 0x72, 0x72, 0x70, 0xe4, 0x03, 0x68, 0x1a, 0xd0, 0x28, 0x0e, 0x79, 0xcf, 0xf6, 0xa7, 0x9c,
0x19, 0x0c, 0x9b, 0x28, 0xa6, 0x52, 0xc7, 0x71, 0xc7, 0xf3, 0x7b, 0xf4, 0x25, 0xce, 0xed, 0xac, 0x0c, 0x86, 0x4d, 0x14, 0x53, 0xa9, 0xe3, 0xb8, 0xe3, 0xf9, 0x3d, 0xfa, 0x12, 0xe7, 0x76, 0xd6,
0x63, 0xc0, 0xb6, 0x1b, 0x50, 0xd7, 0xbf, 0xb3, 0xbf, 0x80, 0x8a, 0x54, 0xc8, 0xa8, 0x8c, 0x52, 0x31, 0x60, 0xdb, 0x0d, 0xa8, 0xeb, 0xdf, 0xd9, 0x5f, 0x42, 0x45, 0x2a, 0x64, 0x54, 0x46, 0xa9,
0xfd, 0x72, 0x34, 0x08, 0x69, 0x43, 0xc5, 0xec, 0x85, 0x53, 0xf9, 0x36, 0x6d, 0xdb, 0x7f, 0x16, 0x7e, 0x39, 0x1a, 0x84, 0xb4, 0xa1, 0x62, 0xf6, 0xc2, 0xa9, 0x7c, 0x97, 0xb6, 0xed, 0x3f, 0x03,
0x9a, 0x07, 0x4c, 0x2b, 0xfa, 0x9e, 0xdf, 0x17, 0x3b, 0x12, 0x53, 0xd5, 0xa3, 0xf1, 0xc9, 0x0b, 0xcd, 0x03, 0xa6, 0x15, 0x7d, 0xcf, 0xef, 0x8b, 0x1d, 0x89, 0xa9, 0xea, 0xd1, 0xf8, 0xe4, 0x05,
0x7a, 0x29, 0x78, 0x4b, 0x94, 0x98, 0xbc, 0x9f, 0x05, 0x51, 0x2c, 0xda, 0xc1, 0xdf, 0xf6, 0x7f, 0xbd, 0x14, 0xbc, 0x25, 0x4a, 0x4c, 0xde, 0xcf, 0x82, 0x28, 0x16, 0xed, 0xe0, 0x6f, 0xfb, 0x3f,
0xb0, 0x80, 0xec, 0x45, 0xb1, 0x37, 0x74, 0x63, 0xfa, 0x80, 0xaa, 0x45, 0x7e, 0x02, 0x75, 0x56, 0x58, 0x40, 0xf6, 0xa2, 0xd8, 0x1b, 0xba, 0x31, 0x7d, 0x40, 0xd5, 0x22, 0x3f, 0x81, 0x3a, 0xab,
0xdb, 0xd3, 0x60, 0x8b, 0xeb, 0x7c, 0xae, 0xab, 0xde, 0x17, 0x0b, 0x93, 0xfd, 0x60, 0x5d, 0xa7, 0xed, 0x69, 0xb0, 0xc5, 0x75, 0x3e, 0xd7, 0x55, 0xef, 0x8b, 0x85, 0xc9, 0x7e, 0xb0, 0xae, 0x53,
0x66, 0x66, 0xe1, 0xa5, 0x63, 0x54, 0xc0, 0xf4, 0x4a, 0xec, 0x86, 0x7d, 0x1a, 0xe3, 0x86, 0x20, 0x33, 0xb3, 0xf0, 0xd2, 0x31, 0x2a, 0x60, 0x7a, 0x25, 0x76, 0xc3, 0x3e, 0x8d, 0x71, 0x43, 0x10,
0xcc, 0x09, 0xe0, 0xa0, 0x9d, 0xc0, 0x3f, 0x6d, 0xff, 0x29, 0xcc, 0x67, 0xea, 0x60, 0xca, 0x26, 0xe6, 0x04, 0x70, 0xd0, 0x4e, 0xe0, 0x9f, 0xb6, 0xff, 0x08, 0xe6, 0x33, 0x75, 0x30, 0x65, 0x93,
0x19, 0x06, 0xfb, 0x49, 0x16, 0xa1, 0x7c, 0xee, 0x0e, 0xc6, 0x54, 0xec, 0x42, 0xbc, 0xf0, 0x71, 0x0c, 0x83, 0xfd, 0x24, 0x8b, 0x50, 0x3e, 0x77, 0x07, 0x63, 0x2a, 0x76, 0x21, 0x5e, 0xf8, 0xa4,
0xe1, 0x9e, 0x65, 0x77, 0x61, 0xc1, 0xe8, 0x97, 0x90, 0xb7, 0x16, 0xcc, 0x30, 0xb9, 0x67, 0xfb, 0x70, 0xcf, 0xb2, 0xbb, 0xb0, 0x60, 0xf4, 0x4b, 0xc8, 0x5b, 0x0b, 0x66, 0x98, 0xdc, 0xb3, 0xfd,
0x2d, 0xea, 0x4c, 0x47, 0x16, 0xc9, 0x26, 0x2c, 0x9e, 0x52, 0x1a, 0xba, 0x31, 0x16, 0x3b, 0x23, 0x16, 0x75, 0xa6, 0x23, 0x8b, 0x64, 0x13, 0x16, 0x4f, 0x29, 0x0d, 0xdd, 0x18, 0x8b, 0x9d, 0x11,
0x1a, 0xe2, 0x9a, 0x88, 0x9a, 0x73, 0x71, 0xf6, 0x7f, 0xb3, 0x60, 0x8e, 0xc9, 0xc4, 0x63, 0xd7, 0x0d, 0x71, 0x4d, 0x44, 0xcd, 0xb9, 0x38, 0xfb, 0xbf, 0x5b, 0x30, 0xc7, 0x64, 0xe2, 0xb1, 0xeb,
0xbf, 0x94, 0x73, 0x75, 0x90, 0x3b, 0x57, 0x77, 0xc4, 0x5c, 0xa5, 0xa8, 0xbf, 0xed, 0x44, 0x15, 0x5f, 0xca, 0xb9, 0x3a, 0xc8, 0x9d, 0xab, 0x3b, 0x62, 0xae, 0x52, 0xd4, 0xdf, 0x75, 0xa2, 0x8a,
0xd3, 0x13, 0x45, 0x56, 0xa1, 0x6e, 0x74, 0xb7, 0xcc, 0x37, 0xb8, 0xc8, 0x8d, 0x8f, 0x68, 0xb8, 0xe9, 0x89, 0x22, 0xab, 0x50, 0x37, 0xba, 0x5b, 0xe6, 0x1b, 0x5c, 0xe4, 0xc6, 0x47, 0x34, 0xdc,
0x7d, 0x19, 0xd3, 0xdf, 0x7d, 0x2a, 0x6f, 0x41, 0x33, 0xe9, 0xb6, 0x98, 0x47, 0x02, 0x25, 0xc6, 0xbe, 0x8c, 0xe9, 0x6f, 0x3f, 0x95, 0xb7, 0xa0, 0x99, 0x74, 0x5b, 0xcc, 0x23, 0x81, 0x12, 0x63,
0x98, 0xa2, 0x02, 0xfc, 0x6d, 0xff, 0x23, 0x8b, 0x13, 0xee, 0x04, 0x9e, 0xda, 0xfc, 0x18, 0x21, 0x4c, 0x51, 0x01, 0xfe, 0xb6, 0xff, 0x91, 0xc5, 0x09, 0x77, 0x02, 0x4f, 0x6d, 0x7e, 0x8c, 0x90,
0xdb, 0x43, 0x25, 0x21, 0xfb, 0x3d, 0xd1, 0x78, 0xf8, 0xdd, 0x07, 0x4b, 0xae, 0x41, 0x25, 0xa2, 0xed, 0xa1, 0x92, 0x90, 0xfd, 0x9e, 0x68, 0x3c, 0xfc, 0xf6, 0x83, 0x25, 0xd7, 0xa0, 0x12, 0x51,
0x7e, 0xaf, 0xe3, 0x0e, 0x06, 0xb8, 0x47, 0x54, 0x9c, 0x19, 0x56, 0xde, 0x1a, 0x0c, 0xec, 0xdb, 0xbf, 0xd7, 0x71, 0x07, 0x03, 0xdc, 0x23, 0x2a, 0xce, 0x0c, 0x2b, 0x6f, 0x0d, 0x06, 0xf6, 0x6d,
0x30, 0xaf, 0xf5, 0xee, 0x35, 0xe3, 0x38, 0x04, 0x72, 0xe0, 0x45, 0xf1, 0x33, 0x3f, 0x1a, 0x69, 0x98, 0xd7, 0x7a, 0xf7, 0x9a, 0x71, 0x1c, 0x02, 0x39, 0xf0, 0xa2, 0xf8, 0x99, 0x1f, 0x8d, 0xb4,
0x7b, 0xcb, 0x5b, 0x50, 0x1d, 0x7a, 0x3e, 0xf6, 0x8c, 0x4b, 0x6e, 0xd9, 0xa9, 0x0c, 0x3d, 0x9f, 0xbd, 0xe5, 0x2d, 0xa8, 0x0e, 0x3d, 0x1f, 0x7b, 0xc6, 0x25, 0xb7, 0xec, 0x54, 0x86, 0x9e, 0xcf,
0xf5, 0x2b, 0x42, 0xa4, 0xfb, 0x52, 0x20, 0x0b, 0x02, 0xe9, 0xbe, 0x44, 0xa4, 0x7d, 0x0f, 0x16, 0xfa, 0x15, 0x21, 0xd2, 0x7d, 0x29, 0x90, 0x05, 0x81, 0x74, 0x5f, 0x22, 0xd2, 0xbe, 0x07, 0x0b,
0x8c, 0xfa, 0x44, 0xd3, 0xef, 0x42, 0x79, 0x1c, 0xbf, 0x0c, 0xe4, 0xce, 0x5f, 0x13, 0x1c, 0xc2, 0x46, 0x7d, 0xa2, 0xe9, 0x77, 0xa1, 0x3c, 0x8e, 0x5f, 0x06, 0x72, 0xe7, 0xaf, 0x09, 0x0e, 0x61,
0x6c, 0x4c, 0x87, 0x63, 0xec, 0xfb, 0x30, 0x7f, 0x48, 0x2f, 0x84, 0x20, 0xcb, 0x8e, 0xdc, 0xba, 0x36, 0xa6, 0xc3, 0x31, 0xf6, 0x7d, 0x98, 0x3f, 0xa4, 0x17, 0x42, 0x90, 0x65, 0x47, 0x6e, 0x5d,
0xd2, 0xfe, 0x44, 0xbc, 0xbd, 0x0e, 0x44, 0xff, 0x38, 0x11, 0x00, 0x69, 0x8d, 0x5a, 0x86, 0x35, 0x69, 0x7f, 0x22, 0xde, 0x5e, 0x07, 0xa2, 0x7f, 0x9c, 0x08, 0x80, 0xb4, 0x46, 0x2d, 0xc3, 0x1a,
0x6a, 0xdf, 0x02, 0x72, 0xec, 0xf5, 0xfd, 0xc7, 0x34, 0x8a, 0xdc, 0xbe, 0x12, 0xfd, 0x26, 0x14, 0xb5, 0x6f, 0x01, 0x39, 0xf6, 0xfa, 0xfe, 0x63, 0x1a, 0x45, 0x6e, 0x5f, 0x89, 0x7e, 0x13, 0x8a,
0x87, 0x51, 0x5f, 0xa8, 0x2a, 0xf6, 0xd3, 0xfe, 0x2e, 0x2c, 0x18, 0x74, 0xa2, 0xe2, 0xeb, 0x50, 0xc3, 0xa8, 0x2f, 0x54, 0x15, 0xfb, 0x69, 0x7f, 0x1f, 0x16, 0x0c, 0x3a, 0x51, 0xf1, 0x75, 0xa8,
0x8d, 0xbc, 0xbe, 0xef, 0xc6, 0xe3, 0x90, 0x8a, 0xaa, 0x13, 0x80, 0xfd, 0x00, 0x16, 0x7f, 0x48, 0x46, 0x5e, 0xdf, 0x77, 0xe3, 0x71, 0x48, 0x45, 0xd5, 0x09, 0xc0, 0x7e, 0x00, 0x8b, 0x3f, 0xa2,
0x43, 0xef, 0xf4, 0xf2, 0xaa, 0xea, 0xcd, 0x7a, 0x0a, 0xe9, 0x7a, 0xf6, 0x60, 0x29, 0x55, 0x8f, 0xa1, 0x77, 0x7a, 0x79, 0x55, 0xf5, 0x66, 0x3d, 0x85, 0x74, 0x3d, 0x7b, 0xb0, 0x94, 0xaa, 0x47,
0x68, 0x9e, 0xb3, 0xaf, 0x58, 0xc9, 0x8a, 0xc3, 0x0b, 0x9a, 0xee, 0x2b, 0xe8, 0xba, 0xcf, 0x7e, 0x34, 0xcf, 0xd9, 0x57, 0xac, 0x64, 0xc5, 0xe1, 0x05, 0x4d, 0xf7, 0x15, 0x74, 0xdd, 0x67, 0x3f,
0x06, 0x64, 0x27, 0xf0, 0x7d, 0xda, 0x8d, 0x8f, 0x28, 0x0d, 0x13, 0x47, 0x38, 0xe1, 0xd5, 0xda, 0x03, 0xb2, 0x13, 0xf8, 0x3e, 0xed, 0xc6, 0x47, 0x94, 0x86, 0x89, 0x23, 0x9c, 0xf0, 0x6a, 0x6d,
0xe6, 0x8a, 0x98, 0xd9, 0xb4, 0x42, 0x15, 0x4c, 0x4c, 0xa0, 0x34, 0xa2, 0xe1, 0x10, 0x2b, 0xae, 0x73, 0x45, 0xcc, 0x6c, 0x5a, 0xa1, 0x0a, 0x26, 0x26, 0x50, 0x1a, 0xd1, 0x70, 0x88, 0x15, 0x57,
0x38, 0xf8, 0xdb, 0x5e, 0x82, 0x05, 0xa3, 0x5a, 0xe1, 0x3a, 0x7c, 0x08, 0x4b, 0xbb, 0x5e, 0xd4, 0x1c, 0xfc, 0x6d, 0x2f, 0xc1, 0x82, 0x51, 0xad, 0x70, 0x1d, 0x3e, 0x84, 0xa5, 0x5d, 0x2f, 0xea,
0xcd, 0x36, 0xd8, 0x82, 0x99, 0xd1, 0xf8, 0xa4, 0x93, 0x48, 0xa2, 0x2c, 0x32, 0x6b, 0x32, 0xfd, 0x66, 0x1b, 0x6c, 0xc1, 0xcc, 0x68, 0x7c, 0xd2, 0x49, 0x24, 0x51, 0x16, 0x99, 0x35, 0x99, 0xfe,
0x89, 0xa8, 0xec, 0xaf, 0x5a, 0x50, 0xda, 0x7f, 0x7a, 0xb0, 0xc3, 0xf6, 0x0a, 0xcf, 0xef, 0x06, 0x44, 0x54, 0xf6, 0x57, 0x2c, 0x28, 0xed, 0x3f, 0x3d, 0xd8, 0x61, 0x7b, 0x85, 0xe7, 0x77, 0x83,
0x43, 0xb6, 0x97, 0xf2, 0x41, 0xab, 0xf2, 0x44, 0x09, 0xbb, 0x0e, 0x55, 0xdc, 0x82, 0x99, 0x01, 0x21, 0xdb, 0x4b, 0xf9, 0xa0, 0x55, 0x79, 0xa2, 0x84, 0x5d, 0x87, 0x2a, 0x6e, 0xc1, 0xcc, 0x80,
0x2d, 0x7c, 0xd6, 0x04, 0xc0, 0x8c, 0x77, 0xfa, 0x72, 0xe4, 0x85, 0x68, 0x9d, 0x4b, 0x9b, 0xbb, 0x16, 0x3e, 0x6b, 0x02, 0x60, 0xc6, 0x3b, 0x7d, 0x39, 0xf2, 0x42, 0xb4, 0xce, 0xa5, 0xcd, 0x5d,
0x84, 0xdb, 0x4c, 0x16, 0x61, 0xff, 0x62, 0x1a, 0x66, 0xc4, 0xe6, 0x8b, 0xed, 0x75, 0x63, 0xef, 0xc2, 0x6d, 0x26, 0x8b, 0xb0, 0x7f, 0x31, 0x0d, 0x33, 0x62, 0xf3, 0xc5, 0xf6, 0xba, 0xb1, 0x77,
0x9c, 0x8a, 0x9e, 0x88, 0x12, 0x33, 0x6f, 0x42, 0x3a, 0x0c, 0x62, 0xda, 0x31, 0x96, 0xc1, 0x04, 0x4e, 0x45, 0x4f, 0x44, 0x89, 0x99, 0x37, 0x21, 0x1d, 0x06, 0x31, 0xed, 0x18, 0xcb, 0x60, 0x02,
0xa2, 0x73, 0x22, 0xfc, 0x46, 0xee, 0xce, 0x14, 0x39, 0x95, 0x01, 0x64, 0x93, 0x25, 0x6d, 0xaf, 0xd1, 0x39, 0x11, 0x7e, 0x23, 0x77, 0x67, 0x8a, 0x9c, 0xca, 0x00, 0xb2, 0xc9, 0x92, 0xb6, 0x57,
0x12, 0xda, 0x5e, 0xb2, 0xc8, 0x66, 0xa2, 0xeb, 0x8e, 0xdc, 0xae, 0x17, 0x5f, 0x0a, 0x95, 0xa0, 0x09, 0x6d, 0x2f, 0x59, 0x64, 0x33, 0xd1, 0x75, 0x47, 0x6e, 0xd7, 0x8b, 0x2f, 0x85, 0x4a, 0x50,
0xca, 0xac, 0xee, 0x41, 0xd0, 0x75, 0x99, 0x47, 0x3a, 0x70, 0xfd, 0x2e, 0x95, 0x8e, 0x8f, 0x01, 0x65, 0x56, 0xf7, 0x20, 0xe8, 0xba, 0xcc, 0x23, 0x1d, 0xb8, 0x7e, 0x97, 0x4a, 0xc7, 0xc7, 0x00,
0x64, 0x4e, 0x80, 0xe8, 0x92, 0x24, 0xe3, 0x8e, 0x42, 0x0a, 0xca, 0xf6, 0xef, 0x6e, 0x30, 0x1c, 0x32, 0x27, 0x40, 0x74, 0x49, 0x92, 0x71, 0x47, 0x21, 0x05, 0x65, 0xfb, 0x77, 0x37, 0x18, 0x0e,
0x7a, 0x31, 0xf3, 0x1d, 0xd0, 0x6e, 0x2c, 0x3a, 0x1a, 0x84, 0xbb, 0x59, 0x58, 0xba, 0xe0, 0xb3, 0xbd, 0x98, 0xf9, 0x0e, 0x68, 0x37, 0x16, 0x1d, 0x0d, 0xc2, 0xdd, 0x2c, 0x2c, 0x5d, 0xf0, 0xd9,
0x57, 0x95, 0x6e, 0x96, 0x06, 0x64, 0xb5, 0xb0, 0x5d, 0x87, 0xa9, 0xb1, 0x17, 0x17, 0x68, 0x24, 0xab, 0x4a, 0x37, 0x4b, 0x03, 0xb2, 0x5a, 0xd8, 0xae, 0xc3, 0xd4, 0xd8, 0x8b, 0x0b, 0x34, 0x12,
0x16, 0x1d, 0x0d, 0xc2, 0xd6, 0x61, 0xec, 0x47, 0x34, 0x8e, 0x07, 0xb4, 0xa7, 0x3a, 0x54, 0x43, 0x8b, 0x8e, 0x06, 0x61, 0xeb, 0x30, 0xf6, 0x23, 0x1a, 0xc7, 0x03, 0xda, 0x53, 0x1d, 0xaa, 0x21,
0xb2, 0x2c, 0x82, 0xdc, 0x85, 0x05, 0xee, 0xce, 0x44, 0x6e, 0x1c, 0x44, 0x67, 0x5e, 0xd4, 0x89, 0x59, 0x16, 0x41, 0xee, 0xc2, 0x02, 0x77, 0x67, 0x22, 0x37, 0x0e, 0xa2, 0x33, 0x2f, 0xea, 0x44,
0x98, 0xe1, 0x5f, 0x47, 0xfa, 0x3c, 0x14, 0xb9, 0x07, 0x2b, 0x29, 0x70, 0x48, 0xbb, 0xd4, 0x3b, 0xcc, 0xf0, 0xaf, 0x23, 0x7d, 0x1e, 0x8a, 0xdc, 0x83, 0x95, 0x14, 0x38, 0xa4, 0x5d, 0xea, 0x9d,
0xa7, 0xbd, 0xd6, 0x2c, 0x7e, 0x35, 0x09, 0x4d, 0x56, 0xa1, 0xc6, 0xbc, 0xb8, 0xf1, 0xa8, 0xe7, 0xd3, 0x5e, 0x6b, 0x16, 0xbf, 0x9a, 0x84, 0x26, 0xab, 0x50, 0x63, 0x5e, 0xdc, 0x78, 0xd4, 0x73,
0x32, 0x03, 0xa6, 0x81, 0xeb, 0xa0, 0x83, 0xc8, 0x87, 0x30, 0x3b, 0xa2, 0xdc, 0xfa, 0x39, 0x8b, 0x99, 0x01, 0xd3, 0xc0, 0x75, 0xd0, 0x41, 0xe4, 0x43, 0x98, 0x1d, 0x51, 0x6e, 0xfd, 0x9c, 0xc5,
0x07, 0xdd, 0xa8, 0x35, 0x67, 0x68, 0x37, 0xc6, 0xb9, 0x8e, 0x49, 0xc1, 0x98, 0xb2, 0x1b, 0xa1, 0x83, 0x6e, 0xd4, 0x9a, 0x33, 0xb4, 0x1b, 0xe3, 0x5c, 0xc7, 0xa4, 0x60, 0x4c, 0xd9, 0x8d, 0xd0,
0xb9, 0xee, 0x5e, 0xb6, 0x9a, 0xc2, 0x64, 0x96, 0x00, 0x94, 0x91, 0xd0, 0x3b, 0x77, 0x63, 0xda, 0x5c, 0x77, 0x2f, 0x5b, 0x4d, 0x61, 0x32, 0x4b, 0x00, 0xca, 0x48, 0xe8, 0x9d, 0xbb, 0x31, 0x6d,
0x9a, 0xe7, 0x0a, 0x5d, 0x14, 0xd9, 0x77, 0x9e, 0xef, 0xc5, 0x9e, 0x1b, 0x07, 0x61, 0x8b, 0x20, 0xcd, 0x73, 0x85, 0x2e, 0x8a, 0xec, 0x3b, 0xcf, 0xf7, 0x62, 0xcf, 0x8d, 0x83, 0xb0, 0x45, 0x10,
0x2e, 0x01, 0xb0, 0x49, 0x44, 0xfe, 0x88, 0x62, 0x37, 0x1e, 0x47, 0x9d, 0xd3, 0x81, 0xdb, 0x8f, 0x97, 0x00, 0xd8, 0x24, 0x22, 0x7f, 0x44, 0xb1, 0x1b, 0x8f, 0xa3, 0xce, 0xe9, 0xc0, 0xed, 0x47,
0x5a, 0x0b, 0xdc, 0xe6, 0xcc, 0x20, 0xc8, 0x47, 0xb0, 0xcc, 0x39, 0x02, 0x51, 0x21, 0x8d, 0x68, 0xad, 0x05, 0x6e, 0x73, 0x66, 0x10, 0xe4, 0x63, 0x58, 0xe6, 0x1c, 0x81, 0xa8, 0x90, 0x46, 0x34,
0x78, 0xce, 0xcd, 0x84, 0x45, 0x9c, 0x91, 0x09, 0x58, 0x36, 0x95, 0x82, 0x45, 0x32, 0x1f, 0x2e, 0x3c, 0xe7, 0x66, 0xc2, 0x22, 0xce, 0xc8, 0x04, 0x2c, 0x9b, 0x4a, 0xc1, 0x22, 0x99, 0x0f, 0x97,
0xf1, 0xa9, 0x9c, 0x80, 0xb6, 0xff, 0x89, 0xc5, 0xb7, 0x05, 0x21, 0x42, 0x4a, 0xbd, 0xbf, 0x03, 0xf8, 0x54, 0x4e, 0x40, 0xdb, 0xff, 0xc4, 0xe2, 0xdb, 0x82, 0x10, 0x21, 0xa5, 0xde, 0xdf, 0x81,
0x35, 0x2e, 0x3c, 0x9d, 0xc0, 0x1f, 0x5c, 0x0a, 0x79, 0x02, 0x0e, 0x7a, 0xe2, 0x0f, 0x2e, 0xc9, 0x1a, 0x17, 0x9e, 0x4e, 0xe0, 0x0f, 0x2e, 0x85, 0x3c, 0x01, 0x07, 0x3d, 0xf1, 0x07, 0x97, 0xe4,
0x77, 0x60, 0xd6, 0xf3, 0x75, 0x12, 0xae, 0x81, 0xea, 0x12, 0x88, 0x44, 0xef, 0x40, 0x6d, 0x34, 0x7b, 0x30, 0xeb, 0xf9, 0x3a, 0x09, 0xd7, 0x40, 0x75, 0x09, 0x44, 0xa2, 0x77, 0xa0, 0x36, 0x1a,
0x3e, 0x19, 0x78, 0x5d, 0x4e, 0x52, 0xe4, 0xb5, 0x70, 0x10, 0x12, 0x30, 0xbb, 0x9d, 0xcf, 0x23, 0x9f, 0x0c, 0xbc, 0x2e, 0x27, 0x29, 0xf2, 0x5a, 0x38, 0x08, 0x09, 0x98, 0xdd, 0xce, 0xe7, 0x91,
0xa7, 0x28, 0x21, 0x45, 0x4d, 0xc0, 0x18, 0x89, 0xbd, 0x0d, 0x8b, 0x66, 0x07, 0x85, 0xaa, 0x5d, 0x53, 0x94, 0x90, 0xa2, 0x26, 0x60, 0x8c, 0xc4, 0xde, 0x86, 0x45, 0xb3, 0x83, 0x42, 0xd5, 0xae,
0x83, 0x8a, 0x90, 0xcc, 0xa8, 0x55, 0xc3, 0xd5, 0x6d, 0x68, 0xf1, 0x1d, 0x9f, 0x0e, 0x1c, 0x85, 0x41, 0x45, 0x48, 0x66, 0xd4, 0xaa, 0xe1, 0xea, 0x36, 0xb4, 0xf8, 0x8e, 0x4f, 0x07, 0x8e, 0xc2,
0xb7, 0xff, 0x4d, 0x09, 0x16, 0x04, 0x74, 0x67, 0x10, 0x44, 0xf4, 0x78, 0x3c, 0x1c, 0xba, 0x61, 0xdb, 0xff, 0xa6, 0x04, 0x0b, 0x02, 0xba, 0x33, 0x08, 0x22, 0x7a, 0x3c, 0x1e, 0x0e, 0xdd, 0x30,
0x8e, 0xc8, 0x5b, 0x57, 0x88, 0x7c, 0xc1, 0x14, 0x79, 0x26, 0x88, 0x67, 0xae, 0xe7, 0x73, 0xa7, 0x47, 0xe4, 0xad, 0x2b, 0x44, 0xbe, 0x60, 0x8a, 0x3c, 0x13, 0xc4, 0x33, 0xd7, 0xf3, 0xb9, 0xd3,
0x83, 0xeb, 0x0b, 0x0d, 0x42, 0xee, 0xc0, 0x5c, 0x77, 0x10, 0x44, 0xdc, 0x08, 0xd7, 0xc3, 0x0b, 0xc1, 0xf5, 0x85, 0x06, 0x21, 0x77, 0x60, 0xae, 0x3b, 0x08, 0x22, 0x6e, 0x84, 0xeb, 0xe1, 0x85,
0x69, 0x70, 0x56, 0x45, 0x95, 0xf3, 0x54, 0x94, 0xae, 0x62, 0xa6, 0x53, 0x2a, 0xc6, 0x86, 0x3a, 0x34, 0x38, 0xab, 0xa2, 0xca, 0x79, 0x2a, 0x4a, 0x57, 0x31, 0xd3, 0x29, 0x15, 0x63, 0x43, 0x9d,
0xab, 0x94, 0x4a, 0x8d, 0x39, 0xc3, 0x0d, 0x73, 0x1d, 0xc6, 0xfa, 0x93, 0x16, 0x68, 0xae, 0x3d, 0x55, 0x4a, 0xa5, 0xc6, 0x9c, 0xe1, 0x86, 0xb9, 0x0e, 0x63, 0xfd, 0x49, 0x0b, 0x34, 0xd7, 0x1e,
0xe6, 0xf2, 0xc4, 0xd9, 0x1b, 0x52, 0xd4, 0xc8, 0x1a, 0x75, 0x55, 0x88, 0x73, 0x16, 0x45, 0x1e, 0x73, 0x79, 0xe2, 0xec, 0x0d, 0x29, 0x6a, 0x64, 0x8d, 0xba, 0x2a, 0xc4, 0x39, 0x8b, 0x22, 0x0f,
0x30, 0x9f, 0x93, 0xb5, 0x85, 0x66, 0x01, 0xa0, 0x59, 0x70, 0xcb, 0x5c, 0x11, 0x7d, 0xee, 0xd7, 0x98, 0xcf, 0xc9, 0xda, 0x42, 0xb3, 0x00, 0xd0, 0x2c, 0xb8, 0x65, 0xae, 0x88, 0x3e, 0xf7, 0xeb,
0x59, 0x61, 0x1c, 0x52, 0x34, 0x15, 0xb4, 0x2f, 0xed, 0xbf, 0x61, 0x41, 0x4d, 0xc3, 0x91, 0x25, 0xac, 0x30, 0x0e, 0x29, 0x9a, 0x0a, 0xda, 0x97, 0xf6, 0x5f, 0xb7, 0xa0, 0xa6, 0xe1, 0xc8, 0x12,
0x98, 0xdf, 0x79, 0xf2, 0xe4, 0x68, 0xcf, 0xd9, 0x7a, 0xfa, 0xe8, 0x87, 0x7b, 0x9d, 0x9d, 0x83, 0xcc, 0xef, 0x3c, 0x79, 0x72, 0xb4, 0xe7, 0x6c, 0x3d, 0x7d, 0xf4, 0xa3, 0xbd, 0xce, 0xce, 0xc1,
0x27, 0xc7, 0x7b, 0xcd, 0x29, 0x06, 0x3e, 0x78, 0xb2, 0xb3, 0x75, 0xd0, 0x79, 0xf0, 0xc4, 0xd9, 0x93, 0xe3, 0xbd, 0xe6, 0x14, 0x03, 0x1f, 0x3c, 0xd9, 0xd9, 0x3a, 0xe8, 0x3c, 0x78, 0xe2, 0xec,
0x91, 0x60, 0x8b, 0x2c, 0x03, 0x71, 0xf6, 0x1e, 0x3f, 0x79, 0xba, 0x67, 0xc0, 0x0b, 0xa4, 0x09, 0x48, 0xb0, 0x45, 0x96, 0x81, 0x38, 0x7b, 0x8f, 0x9f, 0x3c, 0xdd, 0x33, 0xe0, 0x05, 0xd2, 0x84,
0xf5, 0x6d, 0x67, 0x6f, 0x6b, 0x67, 0x5f, 0x40, 0x8a, 0x64, 0x11, 0x9a, 0x0f, 0x9e, 0x1d, 0xee, 0xfa, 0xb6, 0xb3, 0xb7, 0xb5, 0xb3, 0x2f, 0x20, 0x45, 0xb2, 0x08, 0xcd, 0x07, 0xcf, 0x0e, 0x77,
0x3e, 0x3a, 0x7c, 0xd8, 0xd9, 0xd9, 0x3a, 0xdc, 0xd9, 0x3b, 0xd8, 0xdb, 0x6d, 0x96, 0xc8, 0x2c, 0x1f, 0x1d, 0x3e, 0xec, 0xec, 0x6c, 0x1d, 0xee, 0xec, 0x1d, 0xec, 0xed, 0x36, 0x4b, 0x64, 0x16,
0x54, 0xb7, 0xb6, 0xb7, 0x0e, 0x77, 0x9f, 0x1c, 0xee, 0xed, 0x36, 0xcb, 0xf6, 0x7f, 0xb1, 0x60, 0xaa, 0x5b, 0xdb, 0x5b, 0x87, 0xbb, 0x4f, 0x0e, 0xf7, 0x76, 0x9b, 0x65, 0xfb, 0xbf, 0x5a, 0xb0,
0x09, 0x7b, 0xdd, 0x4b, 0x0b, 0xc8, 0x2a, 0xd4, 0xba, 0x41, 0x30, 0x62, 0xe6, 0x78, 0xb2, 0xe1, 0x84, 0xbd, 0xee, 0xa5, 0x05, 0x64, 0x15, 0x6a, 0xdd, 0x20, 0x18, 0x31, 0x73, 0x3c, 0xd9, 0x70,
0xe8, 0x20, 0xc6, 0xfc, 0x5c, 0x5c, 0x4f, 0x83, 0xb0, 0x4b, 0x85, 0x7c, 0x00, 0x82, 0x1e, 0x30, 0x74, 0x10, 0x63, 0x7e, 0x2e, 0xae, 0xa7, 0x41, 0xd8, 0xa5, 0x42, 0x3e, 0x00, 0x41, 0x0f, 0x18,
0x08, 0x63, 0x7e, 0xb1, 0xbc, 0x9c, 0x82, 0x8b, 0x47, 0x8d, 0xc3, 0x38, 0xc9, 0x32, 0x4c, 0x9f, 0x84, 0x31, 0xbf, 0x58, 0x5e, 0x4e, 0xc1, 0xc5, 0xa3, 0xc6, 0x61, 0x9c, 0x64, 0x19, 0xa6, 0x4f,
0x84, 0xd4, 0xed, 0x9e, 0x09, 0xc9, 0x10, 0x25, 0xf2, 0x5e, 0xe2, 0x2f, 0x76, 0xd9, 0xec, 0x0f, 0x42, 0xea, 0x76, 0xcf, 0x84, 0x64, 0x88, 0x12, 0x79, 0x2f, 0xf1, 0x17, 0xbb, 0x6c, 0xf6, 0x07,
0x68, 0x0f, 0x39, 0xa6, 0xe2, 0xcc, 0x09, 0xf8, 0x8e, 0x00, 0x33, 0xfd, 0xe4, 0x9e, 0xb8, 0x7e, 0xb4, 0x87, 0x1c, 0x53, 0x71, 0xe6, 0x04, 0x7c, 0x47, 0x80, 0x99, 0x7e, 0x72, 0x4f, 0x5c, 0xbf,
0x2f, 0xf0, 0x69, 0x4f, 0x18, 0xa3, 0x09, 0xc0, 0x3e, 0x82, 0xe5, 0xf4, 0xf8, 0x84, 0x7c, 0x7d, 0x17, 0xf8, 0xb4, 0x27, 0x8c, 0xd1, 0x04, 0x60, 0x1f, 0xc1, 0x72, 0x7a, 0x7c, 0x42, 0xbe, 0x3e,
0xa4, 0xc9, 0x17, 0xb7, 0x0d, 0xdb, 0x93, 0x57, 0x53, 0x93, 0xb5, 0x5f, 0x17, 0xa0, 0xc4, 0x4c, 0xd6, 0xe4, 0x8b, 0xdb, 0x86, 0xed, 0xc9, 0xab, 0xa9, 0xc9, 0xda, 0xaf, 0x0a, 0x50, 0x62, 0xa6,
0x85, 0xc9, 0x66, 0x85, 0x6e, 0xfd, 0x15, 0x33, 0xb1, 0x48, 0x74, 0x41, 0xf9, 0xe6, 0xc1, 0x37, 0xc2, 0x64, 0xb3, 0x42, 0xb7, 0xfe, 0x8a, 0x99, 0x58, 0x24, 0xba, 0xa0, 0x7c, 0xf3, 0xe0, 0x1b,
0x58, 0x0d, 0x92, 0xe0, 0x43, 0xda, 0x3d, 0xc7, 0x11, 0x2b, 0x3c, 0x83, 0x30, 0x01, 0x61, 0xa6, 0xac, 0x06, 0x49, 0xf0, 0x21, 0xed, 0x9e, 0xe3, 0x88, 0x15, 0x9e, 0x41, 0x98, 0x80, 0x30, 0xd3,
0x39, 0x7e, 0x2d, 0x04, 0x44, 0x96, 0x25, 0x0e, 0xbf, 0x9c, 0x49, 0x70, 0xf8, 0x5d, 0x0b, 0x66, 0x1c, 0xbf, 0x16, 0x02, 0x22, 0xcb, 0x12, 0x87, 0x5f, 0xce, 0x24, 0x38, 0xfc, 0xae, 0x05, 0x33,
0x3c, 0xff, 0x24, 0x18, 0xfb, 0x3d, 0x14, 0x88, 0x8a, 0x23, 0x8b, 0x18, 0xfd, 0x44, 0x41, 0xf5, 0x9e, 0x7f, 0x12, 0x8c, 0xfd, 0x1e, 0x0a, 0x44, 0xc5, 0x91, 0x45, 0x8c, 0x7e, 0xa2, 0xa0, 0x7a,
0x86, 0x92, 0xfd, 0x13, 0x00, 0xd9, 0x84, 0x6a, 0x74, 0xe9, 0x77, 0x75, 0x9e, 0x5f, 0x14, 0xb3, 0x43, 0xc9, 0xfe, 0x09, 0x80, 0x6c, 0x42, 0x35, 0xba, 0xf4, 0xbb, 0x3a, 0xcf, 0x2f, 0x8a, 0x59,
0xc4, 0xe6, 0x60, 0xfd, 0xf8, 0xd2, 0xef, 0x22, 0x87, 0x27, 0x64, 0xf6, 0x9f, 0x42, 0x45, 0x82, 0x62, 0x73, 0xb0, 0x7e, 0x7c, 0xe9, 0x77, 0x91, 0xc3, 0x13, 0x32, 0xfb, 0x8f, 0xa0, 0x22, 0xc1,
0x19, 0x5b, 0x3e, 0x3b, 0xfc, 0xf4, 0xf0, 0xc9, 0xf3, 0xc3, 0xce, 0xf1, 0x67, 0x87, 0x3b, 0xcd, 0x8c, 0x2d, 0x9f, 0x1d, 0x7e, 0x76, 0xf8, 0xe4, 0xf9, 0x61, 0xe7, 0xf8, 0xf3, 0xc3, 0x9d, 0xe6,
0x29, 0x32, 0x07, 0xb5, 0xad, 0x1d, 0xe4, 0x74, 0x04, 0x58, 0x8c, 0xe4, 0x68, 0xeb, 0xf8, 0x58, 0x14, 0x99, 0x83, 0xda, 0xd6, 0x0e, 0x72, 0x3a, 0x02, 0x2c, 0x46, 0x72, 0xb4, 0x75, 0x7c, 0xac,
0x41, 0x0a, 0x36, 0x61, 0xee, 0x75, 0x84, 0xf6, 0x98, 0x8a, 0xee, 0x7d, 0x04, 0xf3, 0x1a, 0x2c, 0x20, 0x05, 0x9b, 0x30, 0xf7, 0x3a, 0x42, 0x7b, 0x4c, 0x45, 0xf7, 0x3e, 0x86, 0x79, 0x0d, 0x96,
0xb1, 0xed, 0x47, 0x0c, 0x90, 0xb2, 0xed, 0xd1, 0x90, 0xe3, 0x18, 0xbb, 0x09, 0x8d, 0x87, 0x34, 0xd8, 0xf6, 0x23, 0x06, 0x48, 0xd9, 0xf6, 0x68, 0xc8, 0x71, 0x8c, 0xdd, 0x84, 0xc6, 0x43, 0x1a,
0x7e, 0xe4, 0x9f, 0x06, 0xb2, 0xa6, 0xff, 0x51, 0x82, 0x39, 0x05, 0x12, 0x15, 0xdd, 0x81, 0x39, 0x3f, 0xf2, 0x4f, 0x03, 0x59, 0xd3, 0xff, 0x2c, 0xc1, 0x9c, 0x02, 0x89, 0x8a, 0xee, 0xc0, 0x9c,
0xaf, 0x47, 0xfd, 0xd8, 0x8b, 0x2f, 0x3b, 0x86, 0x17, 0x9f, 0x06, 0x33, 0x03, 0xd8, 0x1d, 0x78, 0xd7, 0xa3, 0x7e, 0xec, 0xc5, 0x97, 0x1d, 0xc3, 0x8b, 0x4f, 0x83, 0x99, 0x01, 0xec, 0x0e, 0x3c,
0xae, 0x0c, 0x32, 0xf3, 0x02, 0xf3, 0x6a, 0xd9, 0xee, 0x2c, 0x37, 0x5c, 0xc5, 0x57, 0x3c, 0x78, 0x57, 0x06, 0x99, 0x79, 0x81, 0x79, 0xb5, 0x6c, 0x77, 0x96, 0x1b, 0xae, 0xe2, 0x2b, 0x1e, 0x3c,
0x90, 0x8b, 0x63, 0x1a, 0x88, 0xc1, 0xc5, 0x16, 0xa3, 0x3e, 0xe1, 0x86, 0x60, 0x1e, 0x8a, 0x2d, 0xc8, 0xc5, 0x31, 0x0d, 0xc4, 0xe0, 0x62, 0x8b, 0x51, 0x9f, 0x70, 0x43, 0x30, 0x0f, 0xc5, 0x96,
0x15, 0xaf, 0x89, 0x0d, 0xb9, 0xcc, 0x77, 0x70, 0x05, 0xc8, 0x44, 0x71, 0xa7, 0xb9, 0x7e, 0x4c, 0x8a, 0xd7, 0xc4, 0x86, 0x5c, 0xe6, 0x3b, 0xb8, 0x02, 0x64, 0xa2, 0xb8, 0xd3, 0x5c, 0x3f, 0xa6,
0x47, 0x71, 0xb5, 0x48, 0x70, 0x25, 0x13, 0x09, 0x66, 0xfa, 0xf3, 0xd2, 0xef, 0xd2, 0x5e, 0x27, 0xa3, 0xb8, 0x5a, 0x24, 0xb8, 0x92, 0x89, 0x04, 0x33, 0xfd, 0x79, 0xe9, 0x77, 0x69, 0xaf, 0x13,
0x0e, 0x3a, 0xa8, 0xe7, 0x91, 0x25, 0x2a, 0x4e, 0x1a, 0x4c, 0xae, 0xc3, 0x4c, 0x4c, 0xa3, 0xd8, 0x07, 0x1d, 0xd4, 0xf3, 0xc8, 0x12, 0x15, 0x27, 0x0d, 0x26, 0xd7, 0x61, 0x26, 0xa6, 0x51, 0xec,
0xa7, 0x3c, 0xfc, 0x56, 0xd9, 0x2e, 0xb4, 0x2c, 0x47, 0x82, 0x98, 0xd5, 0x3e, 0x0e, 0xbd, 0xa8, 0x53, 0x1e, 0x7e, 0xab, 0x6c, 0x17, 0x5a, 0x96, 0x23, 0x41, 0xcc, 0x6a, 0x1f, 0x87, 0x5e, 0xd4,
0x55, 0xc7, 0x18, 0x2f, 0xfe, 0x26, 0xdf, 0x83, 0xa5, 0x13, 0x1a, 0xc5, 0x9d, 0x33, 0xea, 0xf6, 0xaa, 0x63, 0x8c, 0x17, 0x7f, 0x93, 0x8f, 0x60, 0xe9, 0x84, 0x46, 0x71, 0xe7, 0x8c, 0xba, 0x3d,
0x68, 0x88, 0xec, 0xc5, 0x83, 0xc9, 0xdc, 0x18, 0xca, 0x47, 0x32, 0xc6, 0x3d, 0xa7, 0x61, 0xe4, 0x1a, 0x22, 0x7b, 0xf1, 0x60, 0x32, 0x37, 0x86, 0xf2, 0x91, 0x8c, 0x71, 0xcf, 0x69, 0x18, 0x79,
0x05, 0x3e, 0x9a, 0x41, 0x55, 0x47, 0x16, 0x59, 0x7d, 0x6c, 0xf0, 0x6a, 0x93, 0x56, 0x33, 0x38, 0x81, 0x8f, 0x66, 0x50, 0xd5, 0x91, 0x45, 0x56, 0x1f, 0x1b, 0xbc, 0xda, 0xa4, 0xd5, 0x0c, 0xce,
0x87, 0x03, 0xcf, 0x47, 0x92, 0x9b, 0x30, 0x8d, 0x03, 0x88, 0x5a, 0x4d, 0xe4, 0x99, 0x7a, 0x22, 0xe1, 0xc0, 0xf3, 0x91, 0xe4, 0x26, 0x4c, 0xe3, 0x00, 0xa2, 0x56, 0x13, 0x79, 0xa6, 0x9e, 0xc8,
0xf3, 0x9e, 0xef, 0x08, 0x1c, 0x5b, 0xe5, 0x6e, 0x30, 0x08, 0x42, 0xb4, 0x85, 0xaa, 0x0e, 0x2f, 0xbc, 0xe7, 0x3b, 0x02, 0xc7, 0x56, 0xb9, 0x1b, 0x0c, 0x82, 0x10, 0x6d, 0xa1, 0xaa, 0xc3, 0x0b,
0x98, 0xb3, 0xd3, 0x0f, 0xdd, 0xd1, 0x99, 0xb0, 0x87, 0xd2, 0xe0, 0x4f, 0x4a, 0x95, 0x5a, 0xb3, 0xe6, 0xec, 0xf4, 0x43, 0x77, 0x74, 0x26, 0xec, 0xa1, 0x34, 0xf8, 0xd3, 0x52, 0xa5, 0xd6, 0xac,
0x6e, 0xff, 0x11, 0x94, 0xb1, 0x5a, 0xac, 0x0e, 0x27, 0xd3, 0x12, 0xd5, 0x21, 0xb4, 0x05, 0x33, 0xdb, 0x7f, 0x0a, 0xca, 0x58, 0x2d, 0x56, 0x87, 0x93, 0x69, 0x89, 0xea, 0x10, 0xda, 0x82, 0x19,
0x3e, 0x8d, 0x2f, 0x82, 0xf0, 0x85, 0x3c, 0xb1, 0x10, 0x45, 0xfb, 0x2b, 0xf4, 0x9b, 0x54, 0x04, 0x9f, 0xc6, 0x17, 0x41, 0xf8, 0x42, 0x9e, 0x58, 0x88, 0xa2, 0xfd, 0x35, 0xfa, 0x4d, 0x2a, 0x82,
0xff, 0x19, 0x1a, 0x7d, 0xcc, 0xfb, 0xe5, 0x4b, 0x15, 0x9d, 0xb9, 0xc2, 0x95, 0xab, 0x20, 0xe0, 0xff, 0x0c, 0x8d, 0x3e, 0xe6, 0xfd, 0xf2, 0xa5, 0x8a, 0xce, 0x5c, 0xe1, 0xca, 0x55, 0x10, 0x70,
0xf8, 0xcc, 0x65, 0xba, 0xd6, 0x58, 0x7d, 0xee, 0x1d, 0xd7, 0x10, 0xb6, 0xcf, 0x17, 0xff, 0x26, 0x7c, 0xe6, 0x32, 0x5d, 0x6b, 0xac, 0x3e, 0xf7, 0x8e, 0x6b, 0x08, 0xdb, 0xe7, 0x8b, 0x7f, 0x13,
0x34, 0xe4, 0xd9, 0x40, 0xd4, 0x19, 0xd0, 0xd3, 0x58, 0xc6, 0xb6, 0xfc, 0xf1, 0x10, 0x5d, 0xe8, 0x1a, 0xf2, 0x6c, 0x20, 0xea, 0x0c, 0xe8, 0x69, 0x2c, 0x63, 0x5b, 0xfe, 0x78, 0x88, 0x2e, 0xf4,
0x03, 0x7a, 0x1a, 0xdb, 0x87, 0x30, 0x2f, 0xf4, 0xdf, 0x93, 0x11, 0x95, 0x4d, 0xff, 0x71, 0x9e, 0x01, 0x3d, 0x8d, 0xed, 0x43, 0x98, 0x17, 0xfa, 0xef, 0xc9, 0x88, 0xca, 0xa6, 0xff, 0x20, 0xcf,
0x1d, 0x51, 0xdb, 0x5c, 0x30, 0x15, 0x26, 0x3f, 0x0d, 0x31, 0x29, 0x6d, 0x07, 0x88, 0xae, 0x4f, 0x8e, 0xa8, 0x6d, 0x2e, 0x98, 0x0a, 0x93, 0x9f, 0x86, 0x98, 0x94, 0xb6, 0x03, 0x44, 0xd7, 0xa7,
0x45, 0x85, 0x62, 0x33, 0x97, 0xd1, 0x3b, 0x31, 0x1c, 0x03, 0xc6, 0xe6, 0x27, 0x1a, 0x77, 0xbb, 0xa2, 0x42, 0xb1, 0x99, 0xcb, 0xe8, 0x9d, 0x18, 0x8e, 0x01, 0x63, 0xf3, 0x13, 0x8d, 0xbb, 0x5d,
0xf2, 0x44, 0xa7, 0xe2, 0xc8, 0xa2, 0xfd, 0xcf, 0x2c, 0x58, 0xc0, 0xda, 0xa4, 0x25, 0x24, 0xf6, 0x79, 0xa2, 0x53, 0x71, 0x64, 0xd1, 0xfe, 0x67, 0x16, 0x2c, 0x60, 0x6d, 0xd2, 0x12, 0x12, 0x7b,
0xac, 0x7b, 0xdf, 0xa2, 0x9b, 0xf5, 0xae, 0x1e, 0xd1, 0x5c, 0x84, 0xb2, 0xbe, 0x8b, 0xf1, 0xc2, 0xd6, 0xbd, 0xef, 0xd0, 0xcd, 0x7a, 0x57, 0x8f, 0x68, 0x2e, 0x42, 0x59, 0xdf, 0xc5, 0x78, 0xe1,
0xb7, 0x8f, 0x94, 0x94, 0xd2, 0x91, 0x12, 0xfb, 0xef, 0x5b, 0x30, 0xcf, 0x37, 0x12, 0xb4, 0x83, 0xbb, 0x47, 0x4a, 0x4a, 0xe9, 0x48, 0x89, 0xfd, 0xf7, 0x2d, 0x98, 0xe7, 0x1b, 0x09, 0xda, 0xc1,
0xc5, 0xf0, 0xff, 0x0c, 0xcc, 0x72, 0x8b, 0x40, 0x68, 0x05, 0xd1, 0xd1, 0x44, 0xb5, 0x22, 0x94, 0x62, 0xf8, 0x7f, 0x1a, 0x66, 0xb9, 0x45, 0x20, 0xb4, 0x82, 0xe8, 0x68, 0xa2, 0x5a, 0x11, 0xca,
0x13, 0xef, 0x4f, 0x39, 0x26, 0x31, 0xb9, 0x8f, 0x56, 0x99, 0xdf, 0x41, 0x68, 0xce, 0xd9, 0x9f, 0x89, 0xf7, 0xa7, 0x1c, 0x93, 0x98, 0xdc, 0x47, 0xab, 0xcc, 0xef, 0x20, 0x34, 0xe7, 0xec, 0xcf,
0x39, 0xd7, 0xfb, 0x53, 0x8e, 0x46, 0xbe, 0x5d, 0x81, 0x69, 0xee, 0x44, 0xd8, 0x0f, 0x61, 0xd6, 0x9c, 0xeb, 0xfd, 0x29, 0x47, 0x23, 0xdf, 0xae, 0xc0, 0x34, 0x77, 0x22, 0xec, 0x87, 0x30, 0x6b,
0x68, 0xc8, 0x88, 0xd2, 0xd4, 0x79, 0x94, 0x26, 0x13, 0x0e, 0x2d, 0xe4, 0x84, 0x43, 0xff, 0x55, 0x34, 0x64, 0x44, 0x69, 0xea, 0x3c, 0x4a, 0x93, 0x09, 0x87, 0x16, 0x72, 0xc2, 0xa1, 0xff, 0xaa,
0x11, 0x08, 0x63, 0x96, 0xd4, 0x6a, 0x30, 0x2f, 0x26, 0xe8, 0x19, 0x3e, 0x69, 0xdd, 0xd1, 0x41, 0x08, 0x84, 0x31, 0x4b, 0x6a, 0x35, 0x98, 0x17, 0x13, 0xf4, 0x0c, 0x9f, 0xb4, 0xee, 0xe8, 0x20,
0x64, 0x1d, 0x88, 0x56, 0x94, 0x11, 0x6b, 0xbe, 0x65, 0xe6, 0x60, 0x98, 0x9a, 0x15, 0x16, 0x87, 0xb2, 0x0e, 0x44, 0x2b, 0xca, 0x88, 0x35, 0xdf, 0x32, 0x73, 0x30, 0x4c, 0xcd, 0x0a, 0x8b, 0x43,
0xb0, 0x0d, 0x84, 0xf7, 0xcd, 0xa7, 0x3d, 0x17, 0xc7, 0x76, 0xc5, 0xd1, 0x38, 0x3a, 0x43, 0x5f, 0xd8, 0x06, 0xc2, 0xfb, 0xe6, 0xd3, 0x9e, 0x8b, 0x63, 0xbb, 0xe2, 0x68, 0x1c, 0x9d, 0xa1, 0xaf,
0x41, 0x78, 0xad, 0xb2, 0x9c, 0x5e, 0xdf, 0xe9, 0x2b, 0xd7, 0x77, 0x26, 0x13, 0x09, 0xd3, 0xfc, 0x20, 0xbc, 0x56, 0x59, 0x4e, 0xaf, 0xef, 0xf4, 0x95, 0xeb, 0x3b, 0x93, 0x89, 0x84, 0x69, 0x7e,
0xa6, 0x8a, 0xe9, 0x37, 0xdd, 0x84, 0xd9, 0x21, 0xb3, 0x93, 0xe3, 0x41, 0xb7, 0x33, 0x64, 0xad, 0x53, 0xc5, 0xf4, 0x9b, 0x6e, 0xc2, 0xec, 0x90, 0xd9, 0xc9, 0xf1, 0xa0, 0xdb, 0x19, 0xb2, 0xd6,
0x0b, 0x27, 0xd5, 0x00, 0x92, 0x35, 0x68, 0x4a, 0xd7, 0x45, 0x39, 0x67, 0xfc, 0x3c, 0x23, 0x03, 0x85, 0x93, 0x6a, 0x00, 0xc9, 0x1a, 0x34, 0xa5, 0xeb, 0xa2, 0x9c, 0x33, 0x7e, 0x9e, 0x91, 0x81,
0x67, 0xfa, 0x3f, 0x89, 0x8d, 0xd5, 0xb0, 0xb3, 0x09, 0x80, 0x79, 0x62, 0x11, 0xe3, 0x90, 0xce, 0x33, 0xfd, 0x9f, 0xc4, 0xc6, 0x6a, 0xd8, 0xd9, 0x04, 0xc0, 0x3c, 0xb1, 0x88, 0x71, 0x48, 0x67,
0xd8, 0x17, 0xc7, 0x7f, 0xb4, 0x87, 0xee, 0x69, 0xc5, 0xc9, 0x22, 0xec, 0xbf, 0x6d, 0x41, 0x93, 0xec, 0x8b, 0xe3, 0x3f, 0xda, 0x43, 0xf7, 0xb4, 0xe2, 0x64, 0x11, 0xf6, 0xdf, 0xb6, 0xa0, 0xc9,
0xad, 0x99, 0xc1, 0x96, 0x1f, 0x03, 0x4a, 0xc5, 0x1b, 0x72, 0xa5, 0x41, 0x4b, 0xee, 0x41, 0x15, 0xd6, 0xcc, 0x60, 0xcb, 0x4f, 0x00, 0xa5, 0xe2, 0x0d, 0xb9, 0xd2, 0xa0, 0x25, 0xf7, 0xa0, 0x8a,
0xcb, 0xc1, 0x88, 0xfa, 0x82, 0x27, 0x5b, 0x26, 0x4f, 0x26, 0xfa, 0x64, 0x7f, 0xca, 0x49, 0x88, 0xe5, 0x60, 0x44, 0x7d, 0xc1, 0x93, 0x2d, 0x93, 0x27, 0x13, 0x7d, 0xb2, 0x3f, 0xe5, 0x24, 0xc4,
0x35, 0x8e, 0xfc, 0x4f, 0x16, 0xd4, 0x44, 0x2b, 0xbf, 0x75, 0xec, 0xa5, 0xad, 0x9d, 0xd7, 0x72, 0x1a, 0x47, 0xfe, 0x27, 0x0b, 0x6a, 0xa2, 0x95, 0xdf, 0x38, 0xf6, 0xd2, 0xd6, 0xce, 0x6b, 0x39,
0x4e, 0x4a, 0x8e, 0x67, 0xef, 0xc0, 0xdc, 0xd0, 0x8d, 0xc7, 0x21, 0xdb, 0xcf, 0x8d, 0xb8, 0x4b, 0x27, 0x25, 0xc7, 0xb3, 0x77, 0x60, 0x6e, 0xe8, 0xc6, 0xe3, 0x90, 0xed, 0xe7, 0x46, 0xdc, 0x25,
0x1a, 0xcc, 0x36, 0x67, 0x54, 0x9d, 0x51, 0x27, 0xf6, 0x06, 0x1d, 0x89, 0x15, 0x27, 0xa3, 0x79, 0x0d, 0x66, 0x9b, 0x33, 0xaa, 0xce, 0xa8, 0x13, 0x7b, 0x83, 0x8e, 0xc4, 0x8a, 0x93, 0xd1, 0x3c,
0x28, 0xa6, 0x41, 0xa2, 0xd8, 0xed, 0x53, 0xb1, 0xef, 0xf2, 0x82, 0xdd, 0x82, 0x65, 0x31, 0xa0, 0x14, 0xd3, 0x20, 0x51, 0xec, 0xf6, 0xa9, 0xd8, 0x77, 0x79, 0xc1, 0x6e, 0xc1, 0xb2, 0x18, 0x50,
0x94, 0x7d, 0x6d, 0xff, 0x8b, 0x59, 0x58, 0xc9, 0xa0, 0x54, 0x1e, 0x87, 0x08, 0x28, 0x0c, 0xbc, 0xca, 0xbe, 0xb6, 0xff, 0xc5, 0x2c, 0xac, 0x64, 0x50, 0x2a, 0x8f, 0x43, 0x04, 0x14, 0x06, 0xde,
0xe1, 0x49, 0xa0, 0x9c, 0x13, 0x4b, 0x8f, 0x35, 0x18, 0x28, 0xd2, 0x87, 0x25, 0x69, 0x60, 0xb0, 0xf0, 0x24, 0x50, 0xce, 0x89, 0xa5, 0xc7, 0x1a, 0x0c, 0x14, 0xe9, 0xc3, 0x92, 0x34, 0x30, 0xd8,
0x39, 0x4d, 0x36, 0xc3, 0x02, 0xee, 0x72, 0x1f, 0x9a, 0x4b, 0x98, 0x6e, 0x50, 0xc2, 0x75, 0x21, 0x9c, 0x26, 0x9b, 0x61, 0x01, 0x77, 0xb9, 0x0f, 0xcd, 0x25, 0x4c, 0x37, 0x28, 0xe1, 0xba, 0x10,
0xce, 0xaf, 0x8f, 0x9c, 0x41, 0x4b, 0x59, 0x32, 0x42, 0x59, 0x6b, 0xd6, 0x0e, 0x6b, 0xeb, 0x83, 0xe7, 0xd7, 0x47, 0xce, 0xa0, 0xa5, 0x2c, 0x19, 0xa1, 0xac, 0x35, 0x6b, 0x87, 0xb5, 0xf5, 0xc1,
0x2b, 0xda, 0x32, 0xcc, 0x71, 0x67, 0x62, 0x6d, 0xe4, 0x12, 0x6e, 0x48, 0x1c, 0x6a, 0xe3, 0x6c, 0x15, 0x6d, 0x19, 0xe6, 0xb8, 0x33, 0xb1, 0x36, 0x72, 0x09, 0x37, 0x24, 0x0e, 0xb5, 0x71, 0xb6,
0x7b, 0xa5, 0x37, 0x1a, 0x1b, 0x3a, 0x1a, 0x66, 0xa3, 0x57, 0x54, 0x4c, 0xbe, 0x80, 0xe5, 0x0b, 0xbd, 0xd2, 0x1b, 0x8d, 0x0d, 0x1d, 0x0d, 0xb3, 0xd1, 0x2b, 0x2a, 0x26, 0x5f, 0xc2, 0xf2, 0x85,
0xd7, 0x8b, 0x65, 0xb7, 0x34, 0xdb, 0xa2, 0x8c, 0x4d, 0x6e, 0x5e, 0xd1, 0xe4, 0x73, 0xfe, 0xb1, 0xeb, 0xc5, 0xb2, 0x5b, 0x9a, 0x6d, 0x51, 0xc6, 0x26, 0x37, 0xaf, 0x68, 0xf2, 0x39, 0xff, 0xd8,
0xb1, 0x45, 0x4d, 0xa8, 0xb1, 0xfd, 0x8b, 0x02, 0x34, 0xcc, 0x7a, 0x18, 0x9b, 0x0a, 0xd9, 0x97, 0xd8, 0xa2, 0x26, 0xd4, 0xd8, 0xfe, 0x45, 0x01, 0x1a, 0x66, 0x3d, 0x8c, 0x4d, 0x85, 0xec, 0x4b,
0x3a, 0x50, 0x5a, 0xa3, 0x29, 0x70, 0xd6, 0xbf, 0x2f, 0xe4, 0xf9, 0xf7, 0xba, 0x57, 0x5d, 0xbc, 0x1d, 0x28, 0xad, 0xd1, 0x14, 0x38, 0xeb, 0xdf, 0x17, 0xf2, 0xfc, 0x7b, 0xdd, 0xab, 0x2e, 0x5e,
0x2a, 0x70, 0x57, 0x7a, 0xb3, 0xc0, 0x5d, 0x39, 0x37, 0x70, 0x37, 0x39, 0xbe, 0x33, 0xfd, 0xdb, 0x15, 0xb8, 0x2b, 0xbd, 0x59, 0xe0, 0xae, 0x9c, 0x1b, 0xb8, 0x9b, 0x1c, 0xdf, 0x99, 0xfe, 0x4d,
0xc6, 0x77, 0x66, 0x5e, 0x1b, 0xdf, 0x69, 0xff, 0x1f, 0x0b, 0x48, 0x96, 0x7b, 0xc9, 0x43, 0x1e, 0xe3, 0x3b, 0x33, 0xaf, 0x8d, 0xef, 0xb4, 0xff, 0xaf, 0x05, 0x24, 0xcb, 0xbd, 0xe4, 0x21, 0x0f,
0xd2, 0xf0, 0xe9, 0x40, 0x28, 0xb1, 0x3f, 0x7c, 0x33, 0x09, 0x90, 0xab, 0x25, 0xbf, 0x66, 0xa2, 0x69, 0xf8, 0x74, 0x20, 0x94, 0xd8, 0xef, 0xbf, 0x99, 0x04, 0xc8, 0xd5, 0x92, 0x5f, 0x33, 0x51,
0xa8, 0x27, 0x53, 0xe8, 0xe6, 0xd5, 0xac, 0x93, 0x87, 0x4a, 0x05, 0x2f, 0x4b, 0x57, 0x07, 0x2f, 0xd4, 0x93, 0x29, 0x74, 0xf3, 0x6a, 0xd6, 0xc9, 0x43, 0xa5, 0x82, 0x97, 0xa5, 0xab, 0x83, 0x97,
0xcb, 0x57, 0x07, 0x2f, 0xa7, 0xd3, 0xc1, 0xcb, 0xf6, 0x5f, 0xb1, 0x60, 0x21, 0x87, 0xcd, 0x7e, 0xe5, 0xab, 0x83, 0x97, 0xd3, 0xe9, 0xe0, 0x65, 0xfb, 0x2f, 0x5b, 0xb0, 0x90, 0xc3, 0x66, 0xbf,
0x7f, 0x03, 0x67, 0x8c, 0x61, 0x68, 0x9f, 0x82, 0x60, 0x0c, 0x1d, 0xd8, 0xfe, 0x8b, 0x30, 0x6b, 0xbb, 0x81, 0x33, 0xc6, 0x30, 0xb4, 0x4f, 0x41, 0x30, 0x86, 0x0e, 0x6c, 0xff, 0x05, 0x98, 0x35,
0x88, 0xd6, 0xef, 0xaf, 0xfd, 0xb4, 0x85, 0xc8, 0x39, 0xdb, 0x80, 0xb5, 0xff, 0x67, 0x01, 0x48, 0x44, 0xeb, 0x77, 0xd7, 0x7e, 0xda, 0x42, 0xe4, 0x9c, 0x6d, 0xc0, 0xda, 0xff, 0xab, 0x00, 0x24,
0x56, 0xbc, 0xff, 0xbf, 0xf6, 0x21, 0x3b, 0x4f, 0xc5, 0x9c, 0x79, 0xfa, 0x7f, 0xba, 0xf3, 0x7c, 0x2b, 0xde, 0x7f, 0xa2, 0x7d, 0xc8, 0xce, 0x53, 0x31, 0x67, 0x9e, 0xfe, 0xbf, 0xee, 0x3c, 0x1f,
0x00, 0xf3, 0x22, 0x43, 0x4c, 0x0b, 0x64, 0x71, 0x8e, 0xc9, 0x22, 0x98, 0x8d, 0x6c, 0x46, 0x8e, 0xc0, 0xbc, 0xc8, 0x10, 0xd3, 0x02, 0x59, 0x9c, 0x63, 0xb2, 0x08, 0x66, 0x23, 0x9b, 0x91, 0xe3,
0x2b, 0x46, 0x46, 0x8c, 0xb6, 0xfd, 0xa6, 0x02, 0xc8, 0x76, 0x1b, 0x5a, 0x62, 0x86, 0xf6, 0xce, 0x8a, 0x91, 0x11, 0xa3, 0x6d, 0xbf, 0xa9, 0x00, 0xb2, 0xdd, 0x86, 0x96, 0x98, 0xa1, 0xbd, 0x73,
0xa9, 0x1f, 0x1f, 0x8f, 0x4f, 0x78, 0x8a, 0x94, 0x17, 0xf8, 0xf6, 0xbf, 0x2e, 0x2a, 0x33, 0x1f, 0xea, 0xc7, 0xc7, 0xe3, 0x13, 0x9e, 0x22, 0xe5, 0x05, 0xbe, 0xfd, 0xaf, 0x8b, 0xca, 0xcc, 0x47,
0x91, 0xc2, 0xa0, 0xf8, 0x1e, 0xd4, 0xf5, 0xed, 0x43, 0x2c, 0x47, 0x2a, 0x8e, 0xc9, 0x4c, 0x09, 0xa4, 0x30, 0x28, 0x3e, 0x82, 0xba, 0xbe, 0x7d, 0x88, 0xe5, 0x48, 0xc5, 0x31, 0x99, 0x29, 0xa1,
0x9d, 0x8a, 0xec, 0x42, 0x03, 0x95, 0x64, 0x4f, 0x7d, 0x57, 0xc0, 0xef, 0x5e, 0x13, 0x9f, 0xd9, 0x53, 0x91, 0x5d, 0x68, 0xa0, 0x92, 0xec, 0xa9, 0xef, 0x0a, 0xf8, 0xdd, 0x6b, 0xe2, 0x33, 0xfb,
0x9f, 0x72, 0x52, 0xdf, 0x90, 0x3f, 0x81, 0x86, 0xe9, 0xfc, 0x09, 0xab, 0x24, 0xcf, 0x1b, 0x60, 0x53, 0x4e, 0xea, 0x1b, 0xf2, 0x87, 0xd0, 0x30, 0x9d, 0x3f, 0x61, 0x95, 0xe4, 0x79, 0x03, 0xec,
0x9f, 0x9b, 0xc4, 0x64, 0x0b, 0x9a, 0x69, 0xef, 0x51, 0x64, 0x4a, 0x4c, 0xa8, 0x20, 0x43, 0x4e, 0x73, 0x93, 0x98, 0x6c, 0x41, 0x33, 0xed, 0x3d, 0x8a, 0x4c, 0x89, 0x09, 0x15, 0x64, 0xc8, 0xc9,
0xee, 0x89, 0x23, 0xc4, 0x32, 0xc6, 0x4d, 0x6e, 0x9a, 0x9f, 0x69, 0xd3, 0xb4, 0xce, 0xff, 0x68, 0x3d, 0x71, 0x84, 0x58, 0xc6, 0xb8, 0xc9, 0x4d, 0xf3, 0x33, 0x6d, 0x9a, 0xd6, 0xf9, 0x1f, 0xed,
0x87, 0x8a, 0x3f, 0x06, 0x48, 0x60, 0xa4, 0x09, 0xf5, 0x27, 0x47, 0x7b, 0x87, 0x9d, 0x9d, 0xfd, 0x50, 0xf1, 0x8f, 0x01, 0x12, 0x18, 0x69, 0x42, 0xfd, 0xc9, 0xd1, 0xde, 0x61, 0x67, 0x67, 0x7f,
0xad, 0xc3, 0xc3, 0xbd, 0x83, 0xe6, 0x14, 0x21, 0xd0, 0xc0, 0x30, 0xdf, 0xae, 0x82, 0x59, 0x0c, 0xeb, 0xf0, 0x70, 0xef, 0xa0, 0x39, 0x45, 0x08, 0x34, 0x30, 0xcc, 0xb7, 0xab, 0x60, 0x16, 0x83,
0x26, 0x02, 0x2b, 0x12, 0x56, 0x20, 0x8b, 0xd0, 0x7c, 0x74, 0x98, 0x82, 0x16, 0xb7, 0xab, 0x4a, 0x89, 0xc0, 0x8a, 0x84, 0x15, 0xc8, 0x22, 0x34, 0x1f, 0x1d, 0xa6, 0xa0, 0xc5, 0xed, 0xaa, 0x92,
0x3e, 0xec, 0x65, 0x58, 0xe4, 0x19, 0x80, 0xdb, 0x9c, 0x3d, 0xa4, 0x75, 0xf2, 0x8f, 0x2d, 0x58, 0x0f, 0x7b, 0x19, 0x16, 0x79, 0x06, 0xe0, 0x36, 0x67, 0x0f, 0x69, 0x9d, 0xfc, 0x63, 0x0b, 0x96,
0x4a, 0x21, 0x92, 0x54, 0x1a, 0x6e, 0x80, 0x98, 0x56, 0x89, 0x09, 0xc4, 0x63, 0x01, 0x69, 0x6b, 0x52, 0x88, 0x24, 0x95, 0x86, 0x1b, 0x20, 0xa6, 0x55, 0x62, 0x02, 0xf1, 0x58, 0x40, 0xda, 0x9a,
0xa6, 0x34, 0x48, 0x16, 0xc1, 0x78, 0x5e, 0xb3, 0x4d, 0x53, 0x92, 0x94, 0x87, 0xb2, 0x57, 0x78, 0x29, 0x0d, 0x92, 0x45, 0x30, 0x9e, 0xd7, 0x6c, 0xd3, 0x94, 0x24, 0xe5, 0xa1, 0xec, 0x15, 0x9e,
0x9e, 0x22, 0x66, 0x34, 0x1a, 0x1d, 0x3f, 0xe5, 0x99, 0x85, 0x3a, 0x22, 0x39, 0x92, 0x35, 0xbb, 0xa7, 0x88, 0x19, 0x8d, 0x46, 0xc7, 0x4f, 0x79, 0x66, 0xa1, 0x8e, 0x48, 0x8e, 0x64, 0xcd, 0x2e,
0x2c, 0x8b, 0xcc, 0xad, 0x30, 0x8c, 0x1d, 0xb3, 0xbf, 0xb9, 0x38, 0xfb, 0x97, 0x05, 0x20, 0x3f, 0xcb, 0x22, 0x73, 0x2b, 0x0c, 0x63, 0xc7, 0xec, 0x6f, 0x2e, 0xce, 0xfe, 0x1b, 0x45, 0x20, 0x3f,
0x18, 0xd3, 0xf0, 0x12, 0xf3, 0x65, 0x54, 0xd4, 0x74, 0x25, 0x1d, 0x13, 0x9c, 0x1e, 0x8d, 0x4f, 0x1c, 0xd3, 0xf0, 0x12, 0xf3, 0x65, 0x54, 0xd4, 0x74, 0x25, 0x1d, 0x13, 0x9c, 0x1e, 0x8d, 0x4f,
0x3e, 0xa5, 0x97, 0x32, 0x83, 0xab, 0x90, 0x64, 0x70, 0xe5, 0x65, 0x51, 0x95, 0xae, 0xce, 0xa2, 0x3e, 0xa3, 0x97, 0x32, 0x83, 0xab, 0x90, 0x64, 0x70, 0xe5, 0x65, 0x51, 0x95, 0xae, 0xce, 0xa2,
0x2a, 0x5f, 0x95, 0x45, 0xf5, 0x1d, 0x98, 0xf5, 0xfa, 0x7e, 0xc0, 0x64, 0x9e, 0xd9, 0x09, 0x51, 0x2a, 0x5f, 0x95, 0x45, 0xf5, 0x3d, 0x98, 0xf5, 0xfa, 0x7e, 0xc0, 0x64, 0x9e, 0xd9, 0x09, 0x51,
0x6b, 0x7a, 0xb5, 0xc8, 0x7c, 0x6b, 0x01, 0x3c, 0x64, 0x30, 0xf2, 0x47, 0x09, 0x11, 0xed, 0xf5, 0x6b, 0x7a, 0xb5, 0xc8, 0x7c, 0x6b, 0x01, 0x3c, 0x64, 0x30, 0x72, 0x3f, 0x21, 0xa2, 0xbd, 0x3e,
0x31, 0x63, 0x4f, 0xd7, 0x02, 0x7b, 0xbd, 0x3e, 0x3d, 0x08, 0xba, 0x6e, 0x1c, 0x84, 0xea, 0x43, 0x66, 0xec, 0xe9, 0x5a, 0x60, 0xaf, 0xd7, 0xa7, 0x07, 0x41, 0xd7, 0x8d, 0x83, 0x10, 0x03, 0x3b,
0x06, 0x8b, 0xc8, 0x4d, 0x68, 0x44, 0xc1, 0x98, 0x59, 0x4d, 0x72, 0x9c, 0x3c, 0x8a, 0x54, 0xe7, 0xf2, 0x63, 0x06, 0x8f, 0xc8, 0x4d, 0x68, 0x44, 0xc1, 0x98, 0x59, 0x4e, 0x72, 0xac, 0x3c, 0x92,
0xd0, 0x23, 0x3e, 0xda, 0x75, 0x58, 0x18, 0x47, 0xb4, 0x33, 0xf4, 0xa2, 0x88, 0xed, 0x8c, 0xdd, 0x54, 0xe7, 0xd0, 0x23, 0x3e, 0xe2, 0x75, 0x58, 0x18, 0x47, 0xb4, 0x33, 0xf4, 0xa2, 0x88, 0xed,
0xc0, 0x8f, 0xc3, 0x60, 0x20, 0x62, 0x49, 0xf3, 0xe3, 0x88, 0x3e, 0xe6, 0x98, 0x1d, 0x8e, 0x10, 0x8e, 0xdd, 0xc0, 0x8f, 0xc3, 0x60, 0x20, 0xe2, 0x49, 0xf3, 0xe3, 0x88, 0x3e, 0xe6, 0x98, 0x1d,
0x79, 0x46, 0x9f, 0x41, 0x4d, 0x6b, 0x18, 0x93, 0xbc, 0x84, 0x1d, 0x23, 0x9c, 0xd2, 0x12, 0x77, 0x8e, 0x20, 0x1f, 0x25, 0x5d, 0x1a, 0xb9, 0x5e, 0x18, 0xb5, 0x00, 0xbb, 0x24, 0x47, 0xca, 0xfa,
0x1b, 0x7c, 0x3a, 0x78, 0xd4, 0x23, 0xef, 0xc3, 0x7c, 0xcf, 0x0b, 0x29, 0xe6, 0xeb, 0x75, 0x42, 0x7d, 0xe4, 0x7a, 0xa1, 0xea, 0x0b, 0x2b, 0x44, 0x22, 0x43, 0x69, 0x1d, 0x2a, 0x12, 0xcf, 0xbc,
0x7a, 0x4e, 0xc3, 0x48, 0xba, 0xef, 0x4d, 0x85, 0x70, 0x38, 0xdc, 0xbe, 0x0f, 0x0b, 0xc6, 0x6a, 0xd8, 0xd3, 0x30, 0x18, 0x4a, 0x2f, 0x96, 0xfd, 0x26, 0x0d, 0x28, 0xc4, 0x81, 0xf0, 0x40, 0x0b,
0x29, 0x66, 0x9e, 0xc6, 0x44, 0x27, 0x19, 0x41, 0x34, 0x93, 0xa0, 0x04, 0xce, 0xfe, 0x6b, 0x05, 0x71, 0x60, 0x7f, 0x0e, 0x35, 0x6d, 0x88, 0x98, 0x4e, 0x26, 0x2c, 0x26, 0xe1, 0xfe, 0x96, 0xb8,
0x28, 0xee, 0x07, 0x23, 0xfd, 0x9c, 0xc4, 0x32, 0xcf, 0x49, 0x84, 0x1d, 0xd6, 0x51, 0x66, 0x96, 0x83, 0xe2, 0xd3, 0xc1, 0xa3, 0x1e, 0x79, 0x1f, 0xe6, 0x7b, 0x5e, 0x48, 0x31, 0x33, 0xb0, 0x13,
0xd8, 0x2c, 0x0d, 0x20, 0x59, 0x83, 0x86, 0x3b, 0x8c, 0x3b, 0x71, 0xc0, 0xec, 0xce, 0x0b, 0x37, 0xd2, 0x73, 0x1a, 0x46, 0x32, 0x50, 0xd0, 0x54, 0x08, 0x87, 0xc3, 0xed, 0xfb, 0xb0, 0x60, 0xf0,
0xec, 0x71, 0x0e, 0xc7, 0xd0, 0x59, 0x0a, 0x43, 0x16, 0xa1, 0xa8, 0xcc, 0x07, 0x24, 0x60, 0x45, 0x85, 0x12, 0x9b, 0x69, 0x4c, 0xa9, 0x92, 0xb1, 0x4a, 0x33, 0xdd, 0x4a, 0xe0, 0xec, 0xbf, 0x5a,
0xe6, 0xf4, 0xe0, 0x09, 0xf1, 0xa5, 0x08, 0xff, 0x89, 0x12, 0x13, 0x20, 0xf3, 0x7b, 0xee, 0x71, 0x80, 0xe2, 0x7e, 0x30, 0xd2, 0x4f, 0x64, 0x2c, 0xf3, 0x44, 0x46, 0x58, 0x7c, 0x1d, 0x65, 0xd0,
0xf2, 0x4d, 0x20, 0x0f, 0xc5, 0x6c, 0x42, 0xc6, 0x53, 0xc3, 0xc4, 0xc4, 0x52, 0x65, 0x3d, 0xb0, 0x89, 0x6d, 0xd9, 0x00, 0x92, 0x35, 0x68, 0xb8, 0xc3, 0xb8, 0x13, 0x07, 0xcc, 0xc2, 0xbd, 0x70,
0x5d, 0x31, 0xcf, 0xcb, 0x7f, 0x63, 0x41, 0x19, 0xe7, 0x86, 0x6d, 0x68, 0x5c, 0xe2, 0xd5, 0x51, 0xc3, 0x1e, 0x97, 0x25, 0x5c, 0xcb, 0x14, 0x86, 0x2c, 0x42, 0x51, 0x19, 0x2a, 0x48, 0xc0, 0x8a,
0x09, 0xce, 0xc9, 0xac, 0x93, 0x06, 0x13, 0xdb, 0xc8, 0x0c, 0x2d, 0xa8, 0x01, 0xe9, 0xd9, 0xa1, 0xcc, 0xbd, 0xc2, 0xb3, 0xe8, 0x4b, 0x11, 0x68, 0x14, 0x25, 0x26, 0xaa, 0xe6, 0xf7, 0xdc, 0xb7,
0xab, 0x50, 0xe5, 0x25, 0x95, 0xe5, 0x88, 0x24, 0x09, 0x90, 0xdc, 0x80, 0xd2, 0x59, 0x30, 0x92, 0xe5, 0xdb, 0x4d, 0x1e, 0x8a, 0x59, 0x9f, 0x8c, 0x7b, 0x87, 0x89, 0x31, 0xa7, 0xca, 0x7a, 0x08,
0x36, 0x3f, 0xc8, 0x73, 0xce, 0x60, 0xe4, 0x20, 0x3c, 0xe9, 0x0f, 0xab, 0x8f, 0x0f, 0x8b, 0xdb, 0xbd, 0x62, 0x9e, 0xcc, 0xff, 0xda, 0x82, 0x32, 0xce, 0x0d, 0xdb, 0x3a, 0xb9, 0x6e, 0x51, 0x87,
0x55, 0x69, 0x30, 0xb3, 0x65, 0x55, 0xb5, 0xfa, 0x34, 0xa5, 0xa0, 0xf6, 0x33, 0x98, 0x63, 0xb2, 0x32, 0x38, 0x27, 0xb3, 0x4e, 0x1a, 0x4c, 0x6c, 0x23, 0x07, 0xb5, 0xa0, 0x06, 0xa4, 0xe7, 0xa1,
0xa2, 0x85, 0x8e, 0x27, 0x4b, 0xf7, 0x7b, 0x6c, 0xb3, 0xe8, 0x0e, 0xc6, 0x3d, 0xaa, 0x7b, 0x5e, 0xae, 0x42, 0x95, 0x97, 0x54, 0x3e, 0x25, 0x92, 0x24, 0x40, 0x72, 0x03, 0x4a, 0x67, 0xc1, 0x48,
0x18, 0x1a, 0x14, 0x70, 0x69, 0x73, 0xd8, 0xff, 0xd2, 0x82, 0x8a, 0xac, 0x97, 0xdc, 0x81, 0x12, 0x7a, 0x17, 0x20, 0x4f, 0x54, 0x83, 0x91, 0x83, 0xf0, 0xa4, 0x3f, 0xac, 0x3e, 0x3e, 0x2c, 0x6e,
0x93, 0xd1, 0x94, 0xa3, 0xad, 0x52, 0x21, 0x18, 0x9d, 0x83, 0x14, 0xcc, 0x14, 0xc1, 0xe0, 0x9d, 0xc1, 0xa5, 0xc1, 0xcc, 0x6a, 0x56, 0xd5, 0xea, 0xd3, 0x94, 0x82, 0xda, 0xcf, 0x60, 0x8e, 0x71,
0x5e, 0x3b, 0x0f, 0xdd, 0x25, 0x6e, 0x8b, 0x1a, 0x59, 0xca, 0xda, 0x4f, 0x41, 0xc9, 0xba, 0x76, 0xaf, 0x16, 0xa4, 0x9e, 0xac, 0x47, 0xde, 0x63, 0xdb, 0x52, 0x77, 0x30, 0xee, 0x51, 0xdd, 0xc7,
0xf2, 0x51, 0x32, 0xe4, 0x5e, 0xee, 0x4d, 0xbd, 0x3e, 0xd5, 0x4e, 0x3c, 0x7e, 0x6e, 0xc1, 0xac, 0xc3, 0x20, 0xa4, 0x80, 0x4b, 0xeb, 0xc6, 0xfe, 0x97, 0x16, 0x97, 0x0a, 0x56, 0x2f, 0xb9, 0x03,
0xd1, 0x27, 0xb2, 0x0a, 0xb5, 0x81, 0x1b, 0xc5, 0xe2, 0x38, 0x5a, 0xac, 0xbc, 0x0e, 0xd2, 0x79, 0x25, 0xa6, 0x0d, 0x52, 0x2e, 0xbd, 0x4a, 0xba, 0x60, 0x74, 0x0e, 0x52, 0x30, 0xa3, 0x07, 0xc3,
0xa8, 0x60, 0x1e, 0x8e, 0xa8, 0x08, 0x7a, 0x51, 0x8f, 0xa0, 0xdf, 0x85, 0x6a, 0x92, 0x1a, 0x6c, 0x84, 0x7a, 0xed, 0x3c, 0x48, 0x98, 0x38, 0x48, 0x6a, 0x64, 0x29, 0xbf, 0x22, 0x05, 0x25, 0xeb,
0x76, 0x8a, 0xb5, 0x28, 0x93, 0x42, 0x12, 0xa2, 0x24, 0x46, 0x5b, 0xd6, 0x62, 0xb4, 0xf6, 0x7d, 0xda, 0x19, 0x4b, 0xc9, 0xd0, 0x30, 0x72, 0x17, 0xec, 0xf5, 0xa9, 0x76, 0xb6, 0xf2, 0x73, 0x0b,
0xa8, 0x69, 0xf4, 0x7a, 0x8c, 0xd5, 0x32, 0x62, 0xac, 0x2a, 0x63, 0xaa, 0x90, 0x64, 0x4c, 0xd9, 0x66, 0x8d, 0x3e, 0x91, 0x55, 0xa8, 0x0d, 0xdc, 0x28, 0x16, 0x07, 0xdf, 0x62, 0xe5, 0x75, 0x90,
0xdf, 0x14, 0x60, 0x96, 0xb1, 0xb7, 0xe7, 0xf7, 0x8f, 0x82, 0x81, 0xd7, 0xbd, 0x44, 0xb6, 0x92, 0xce, 0x43, 0x05, 0xf3, 0x18, 0x46, 0xc5, 0xea, 0x8b, 0x7a, 0xac, 0xfe, 0x2e, 0x54, 0x93, 0x24,
0x9c, 0x2c, 0x74, 0xb4, 0x64, 0x73, 0x13, 0xcc, 0x04, 0x4a, 0x46, 0x76, 0x84, 0xf4, 0xab, 0x32, 0x64, 0xb3, 0x53, 0xac, 0x45, 0x99, 0x7e, 0x92, 0x10, 0x25, 0xd1, 0xe0, 0xb2, 0x16, 0x0d, 0xb6,
0x53, 0x0f, 0x4c, 0xb8, 0x4e, 0xdc, 0x48, 0x48, 0x9c, 0xb0, 0x11, 0x0d, 0x20, 0x13, 0x62, 0x06, 0xef, 0x43, 0x4d, 0xa3, 0xd7, 0xa3, 0xb9, 0x96, 0x11, 0xcd, 0x55, 0xb9, 0x59, 0x85, 0x24, 0x37,
0xc0, 0xfc, 0xb7, 0xa1, 0x37, 0x18, 0x78, 0x9c, 0x96, 0x7b, 0x10, 0x79, 0x28, 0xd6, 0x66, 0xcf, 0xcb, 0xfe, 0xb6, 0x00, 0xb3, 0x8c, 0xbd, 0x3d, 0xbf, 0x7f, 0x14, 0x0c, 0xbc, 0xee, 0x25, 0xb2,
0x8b, 0xdc, 0x93, 0xe4, 0x74, 0x4c, 0x95, 0x31, 0xfc, 0xe4, 0xbe, 0xd4, 0xc2, 0x4f, 0xd3, 0xa8, 0x95, 0xe4, 0x64, 0xb1, 0x1b, 0x48, 0x36, 0x37, 0xc1, 0x4c, 0xa0, 0x64, 0x0c, 0x49, 0x48, 0xbf,
0xb2, 0x4c, 0x60, 0x7a, 0x21, 0x67, 0x32, 0x0b, 0x69, 0xff, 0xfb, 0x02, 0xd4, 0x34, 0xb6, 0x10, 0x2a, 0x33, 0xf5, 0xc0, 0x84, 0xeb, 0xc4, 0x8d, 0x84, 0xc4, 0x09, 0x6b, 0xd4, 0x00, 0x32, 0x21,
0x47, 0xc2, 0xa6, 0x56, 0xd6, 0x20, 0x12, 0x6f, 0xf8, 0xa3, 0x1a, 0x84, 0xdc, 0x34, 0x5b, 0xc4, 0x66, 0x00, 0xcc, 0xb4, 0x1b, 0x7a, 0x83, 0x81, 0xc7, 0x69, 0xb9, 0xaf, 0x92, 0x87, 0x62, 0x6d,
0x10, 0x34, 0x0a, 0xbb, 0xc1, 0x3e, 0xd7, 0xa1, 0xca, 0xd8, 0xfe, 0x43, 0x74, 0x7e, 0x45, 0x4e, 0xf6, 0xbc, 0xc8, 0x3d, 0x49, 0xce, 0xe1, 0x54, 0x19, 0x03, 0x5d, 0xee, 0x4b, 0x2d, 0xd0, 0x35,
0xbe, 0x02, 0x48, 0xec, 0x26, 0x62, 0xcb, 0x09, 0x16, 0x01, 0xaf, 0x3d, 0x44, 0xbe, 0x07, 0x75, 0x8d, 0x2a, 0xcb, 0x04, 0xa6, 0x17, 0x72, 0x26, 0xb3, 0x90, 0xf6, 0xbf, 0x2f, 0x40, 0x4d, 0x63,
0x51, 0x0d, 0xae, 0x2f, 0x0e, 0x38, 0x11, 0x3c, 0x63, 0xed, 0x1d, 0x83, 0x52, 0x7e, 0xb9, 0x29, 0x0b, 0x71, 0xf8, 0x6c, 0x6a, 0x65, 0x0d, 0x22, 0xf1, 0x86, 0xe7, 0xab, 0x41, 0xc8, 0x4d, 0xb3,
0xbf, 0xac, 0x5c, 0xf5, 0xa5, 0xa4, 0xb4, 0x1f, 0xaa, 0xb3, 0xf9, 0x87, 0xa1, 0x3b, 0x3a, 0x93, 0x45, 0x0c, 0x76, 0xa3, 0xb0, 0x1b, 0xec, 0x73, 0x1d, 0xaa, 0x8c, 0xed, 0x3f, 0x44, 0x37, 0x5b,
0xca, 0xe4, 0x2e, 0x2c, 0x48, 0x9d, 0x31, 0xf6, 0x5d, 0xdf, 0x0f, 0xc6, 0x7e, 0x97, 0xca, 0xc4, 0x64, 0xff, 0x2b, 0x80, 0xc4, 0x6e, 0x22, 0xb6, 0x9c, 0x60, 0x11, 0xf0, 0xda, 0xe3, 0xea, 0x7b,
0xaa, 0x3c, 0x94, 0xdd, 0x53, 0x69, 0xb8, 0x58, 0x11, 0x59, 0x83, 0x32, 0xdf, 0xe1, 0xf9, 0xe6, 0x50, 0x17, 0xd5, 0xe0, 0xfa, 0xe2, 0x80, 0x13, 0xc1, 0x33, 0xd6, 0xde, 0x31, 0x28, 0xe5, 0x97,
0x95, 0xaf, 0x3e, 0x38, 0x09, 0xb9, 0x03, 0x65, 0xbe, 0xd1, 0x17, 0x26, 0x0a, 0x3c, 0x27, 0xb0, 0x9b, 0xf2, 0xcb, 0xca, 0x55, 0x5f, 0x4a, 0x4a, 0xfb, 0xa1, 0xca, 0x02, 0x78, 0x18, 0xba, 0xa3,
0xd7, 0x60, 0x0e, 0xb3, 0xac, 0x4d, 0xbd, 0x67, 0x6e, 0x7c, 0xd3, 0x5d, 0xcc, 0xc3, 0xb6, 0x17, 0x33, 0xa9, 0x4c, 0xee, 0xc2, 0x82, 0xd4, 0x19, 0x63, 0xdf, 0xf5, 0xfd, 0x60, 0xec, 0x77, 0xa9,
0x81, 0x1c, 0x72, 0x79, 0xd2, 0x4f, 0xd8, 0x7e, 0x53, 0x84, 0x9a, 0x06, 0x66, 0x7a, 0x09, 0x8f, 0x4c, 0xe1, 0xca, 0x43, 0xd9, 0x3d, 0x95, 0xf0, 0x8b, 0x15, 0x91, 0x35, 0x28, 0x73, 0x5b, 0x82,
0x45, 0x3a, 0x3d, 0xcf, 0x1d, 0xd2, 0x98, 0x86, 0x42, 0x86, 0x52, 0x50, 0x46, 0xe7, 0x9e, 0xf7, 0x6f, 0x5e, 0xf9, 0xea, 0x83, 0x93, 0x90, 0x3b, 0x50, 0xe6, 0x26, 0x45, 0x61, 0xa2, 0xc0, 0x73,
0x3b, 0xc1, 0x38, 0xee, 0xf4, 0x68, 0x3f, 0xa4, 0x7c, 0x3b, 0x67, 0x7b, 0xa3, 0x01, 0x65, 0x74, 0x02, 0x7b, 0x0d, 0xe6, 0x30, 0x9f, 0xdb, 0xd4, 0x7b, 0xe6, 0xc6, 0x37, 0xdd, 0xc5, 0x8c, 0x6f,
0x8c, 0x8b, 0x35, 0x3a, 0x7e, 0x90, 0x91, 0x82, 0xca, 0xf3, 0x32, 0x3e, 0x47, 0xa5, 0xe4, 0xbc, 0x7b, 0x11, 0xc8, 0x21, 0x97, 0x27, 0xfd, 0x2c, 0xef, 0xd7, 0x45, 0xa8, 0x69, 0x60, 0xa6, 0x97,
0x8c, 0xcf, 0x48, 0x5a, 0xa3, 0x96, 0x73, 0x34, 0xea, 0x47, 0xb0, 0xcc, 0x75, 0xa7, 0xd0, 0x1a, 0xf0, 0x00, 0xa6, 0xd3, 0xf3, 0xdc, 0x21, 0x8d, 0x69, 0x28, 0x64, 0x28, 0x05, 0x65, 0x74, 0xee,
0x9d, 0x14, 0x63, 0x4d, 0xc0, 0x92, 0x35, 0x68, 0xb2, 0x3e, 0x4b, 0xb1, 0x88, 0xbc, 0xaf, 0xb8, 0x79, 0xbf, 0x13, 0x8c, 0xe3, 0x4e, 0x8f, 0xf6, 0x43, 0xca, 0xb7, 0x73, 0xb6, 0x37, 0x1a, 0x50,
0x6c, 0x59, 0x4e, 0x06, 0xce, 0x68, 0x31, 0x88, 0xab, 0xd3, 0xf2, 0xa4, 0x85, 0x0c, 0x1c, 0x69, 0x46, 0xc7, 0xb8, 0x58, 0xa3, 0xe3, 0x47, 0x26, 0x29, 0xa8, 0x3c, 0x99, 0xe3, 0x73, 0x54, 0x4a,
0xdd, 0x97, 0x26, 0x6d, 0x55, 0xd0, 0xa6, 0xe0, 0xe4, 0x1e, 0xac, 0x0c, 0x69, 0xcf, 0x73, 0xcd, 0x4e, 0xe6, 0xf8, 0x8c, 0xa4, 0x35, 0x6a, 0x39, 0x47, 0xa3, 0x7e, 0x0c, 0xcb, 0x5c, 0x77, 0x0a,
0x2a, 0x30, 0xa6, 0xc2, 0x73, 0xa1, 0x26, 0xa1, 0x59, 0x2b, 0x6c, 0x16, 0xbe, 0x0a, 0x86, 0x27, 0xad, 0xd1, 0x49, 0x31, 0xd6, 0x04, 0x2c, 0x59, 0x83, 0x26, 0xeb, 0xb3, 0x14, 0x8b, 0xc8, 0xfb,
0x1e, 0xdf, 0xd0, 0x78, 0xb8, 0xb9, 0xe4, 0x64, 0xe0, 0xf6, 0x2c, 0xd4, 0x8e, 0xe3, 0x60, 0x24, 0x9a, 0xcb, 0x96, 0xe5, 0x64, 0xe0, 0x8c, 0x16, 0xc3, 0xc5, 0x3a, 0x2d, 0x4f, 0x8f, 0xc8, 0xc0,
0x97, 0xbe, 0x01, 0x75, 0x5e, 0x14, 0x69, 0x74, 0x6f, 0xc1, 0x35, 0xe4, 0xd5, 0xa7, 0xc1, 0x28, 0x91, 0xd6, 0x7d, 0x69, 0xd2, 0x56, 0x05, 0x6d, 0x0a, 0x4e, 0xee, 0xc1, 0xca, 0x90, 0xf6, 0x3c,
0x18, 0x04, 0xfd, 0x4b, 0xc3, 0x69, 0xfc, 0x8f, 0x16, 0x2c, 0x18, 0xd8, 0xc4, 0x6b, 0xc4, 0x08, 0xd7, 0xac, 0x02, 0xa3, 0x37, 0x3c, 0xeb, 0x6a, 0x12, 0x9a, 0xb5, 0xc2, 0x66, 0xe1, 0xeb, 0x60,
0x97, 0xcc, 0x7f, 0xe2, 0xec, 0x3d, 0xaf, 0x6d, 0x07, 0x9c, 0x90, 0x1f, 0x26, 0x3c, 0x13, 0x29, 0x78, 0xe2, 0xf1, 0x0d, 0x8d, 0x07, 0xb6, 0x4b, 0x4e, 0x06, 0x6e, 0xcf, 0x42, 0xed, 0x38, 0x0e,
0x51, 0x5b, 0xc9, 0xb5, 0x28, 0xf9, 0x21, 0xe7, 0xf5, 0x56, 0x96, 0xd7, 0xc5, 0xf7, 0xf2, 0x56, 0x46, 0x72, 0xe9, 0x1b, 0x50, 0xe7, 0x45, 0x91, 0xb0, 0xf7, 0x16, 0x5c, 0x43, 0x5e, 0x7d, 0x1a,
0x94, 0xac, 0xe2, 0x4f, 0x44, 0x8a, 0x49, 0x4f, 0x0c, 0xba, 0x68, 0xa6, 0x05, 0xe8, 0x41, 0x06, 0x8c, 0x82, 0x41, 0xd0, 0xbf, 0x34, 0xdc, 0xd3, 0xff, 0x68, 0xc1, 0x82, 0x81, 0x4d, 0xfc, 0x53,
0xd9, 0x83, 0xae, 0x02, 0x46, 0xf6, 0x4f, 0x2d, 0x80, 0xa4, 0x77, 0x98, 0x98, 0xa0, 0xb6, 0x34, 0x8c, 0xa5, 0xc9, 0x4c, 0x2b, 0xce, 0xde, 0xf3, 0xda, 0x76, 0xc0, 0x09, 0xf9, 0xb1, 0xc5, 0x33,
0x7e, 0x05, 0x4f, 0xdb, 0xbe, 0xde, 0x85, 0xba, 0x3a, 0x5b, 0x4e, 0x76, 0xc9, 0x9a, 0x84, 0x31, 0x91, 0x7c, 0xb5, 0x95, 0x5c, 0xc0, 0x92, 0x1f, 0x72, 0x5e, 0x6f, 0x65, 0x79, 0x5d, 0x7c, 0x2f,
0xab, 0xe2, 0x36, 0xcc, 0xf5, 0x07, 0xc1, 0x09, 0x5a, 0x2f, 0x98, 0x97, 0x19, 0x89, 0x64, 0xc2, 0xef, 0x5f, 0xc9, 0x2a, 0xfe, 0x50, 0x24, 0xb3, 0xf4, 0xc4, 0xa0, 0x8b, 0x66, 0x02, 0x82, 0x1e,
0x06, 0x07, 0x3f, 0x10, 0xd0, 0x64, 0x4b, 0x2d, 0xe9, 0x5b, 0x6a, 0xfe, 0x06, 0xf9, 0x37, 0x0b, 0xce, 0x90, 0x3d, 0xe8, 0x2a, 0x60, 0x64, 0xff, 0xd4, 0x02, 0x48, 0x7a, 0x87, 0x29, 0x10, 0x6a,
0xea, 0x80, 0x2f, 0x99, 0x89, 0x89, 0x12, 0x4e, 0x36, 0x33, 0xea, 0x7c, 0xc2, 0x79, 0x1a, 0x5a, 0x4b, 0xe3, 0x97, 0xfd, 0xb4, 0xed, 0xeb, 0x5d, 0xa8, 0xab, 0x53, 0xec, 0x64, 0x97, 0xac, 0x49,
0xe6, 0x47, 0x57, 0xc6, 0x1b, 0xef, 0x43, 0x23, 0xe4, 0xba, 0x52, 0x2a, 0xd2, 0xd2, 0x6b, 0x14, 0x18, 0xb3, 0x2a, 0x6e, 0xc3, 0x5c, 0x7f, 0x10, 0x9c, 0xa0, 0xf5, 0x82, 0x19, 0xa0, 0x91, 0x48,
0xe9, 0x6c, 0x68, 0xec, 0xc6, 0xef, 0x41, 0xd3, 0xed, 0x9d, 0xd3, 0x30, 0xf6, 0x30, 0xfe, 0x82, 0x5b, 0x6c, 0x70, 0xf0, 0x03, 0x01, 0x4d, 0xb6, 0xd4, 0x92, 0xbe, 0xa5, 0xe6, 0x6f, 0x90, 0x7f,
0xa6, 0x13, 0x1f, 0xdc, 0x9c, 0x06, 0x47, 0x0b, 0xe5, 0x36, 0xcc, 0x89, 0xb4, 0x4e, 0x45, 0x29, 0xb3, 0xa0, 0x8e, 0x12, 0x93, 0x99, 0x98, 0x28, 0xe1, 0x64, 0x33, 0xa3, 0xce, 0x27, 0x9c, 0xdc,
0x2e, 0xb3, 0x24, 0x60, 0x46, 0x68, 0xff, 0x4c, 0x9e, 0x25, 0x9a, 0x2b, 0x3b, 0x79, 0x46, 0xf4, 0xa1, 0x65, 0x7e, 0x74, 0x65, 0x64, 0xf3, 0x3e, 0x34, 0x42, 0xae, 0x2b, 0xa5, 0x22, 0x2d, 0xbd,
0xd1, 0x15, 0x52, 0xa3, 0xfb, 0x8e, 0x38, 0xd7, 0xeb, 0xc9, 0x20, 0x4f, 0x51, 0x4b, 0x52, 0xea, 0x46, 0x91, 0xce, 0x86, 0xc6, 0x6e, 0xfc, 0x1e, 0x34, 0xdd, 0xde, 0x39, 0x0d, 0x63, 0x0f, 0x23,
0x89, 0x73, 0x58, 0x73, 0x4a, 0x4b, 0x6f, 0x32, 0xa5, 0xf6, 0xaf, 0x2c, 0x98, 0xd9, 0x0f, 0x46, 0x3d, 0x68, 0x3a, 0xf1, 0xc1, 0xcd, 0x69, 0x70, 0xb4, 0x50, 0x6e, 0xc3, 0x9c, 0x48, 0x20, 0x55,
0xfb, 0x22, 0x5d, 0x0b, 0xc5, 0x43, 0xe5, 0x53, 0xcb, 0xe2, 0x6b, 0x12, 0xb9, 0x72, 0x2d, 0x90, 0x94, 0xe2, 0xda, 0x4c, 0x02, 0x66, 0x84, 0xf6, 0xcf, 0xe4, 0xa9, 0xa5, 0xb9, 0xb2, 0x93, 0x67,
0xd9, 0xb4, 0x05, 0xf2, 0xe7, 0xe0, 0x2d, 0x0c, 0x31, 0x86, 0xc1, 0x28, 0x08, 0x99, 0x88, 0xba, 0x44, 0x1f, 0x5d, 0x21, 0x35, 0xba, 0xef, 0x89, 0x13, 0xc4, 0x9e, 0x0c, 0x27, 0x15, 0xb5, 0x74,
0x03, 0x6e, 0x6e, 0x04, 0x7e, 0x7c, 0x26, 0x55, 0xe8, 0xeb, 0x48, 0xd0, 0xef, 0x67, 0xee, 0x2c, 0xa8, 0x9e, 0x38, 0xf1, 0x35, 0xa7, 0xb4, 0xf4, 0x26, 0x53, 0x6a, 0xff, 0xd2, 0x82, 0x99, 0xfd,
0xf7, 0x4b, 0x84, 0xc5, 0xc4, 0x35, 0x6b, 0x16, 0x61, 0xff, 0x31, 0x54, 0xd1, 0x9b, 0xc0, 0x61, 0x60, 0xb4, 0x2f, 0x12, 0xc3, 0x50, 0x3c, 0x54, 0xe6, 0xb6, 0x2c, 0xbe, 0x26, 0x65, 0x2c, 0xd7,
0x7d, 0x00, 0xd5, 0xb3, 0x60, 0xd4, 0x39, 0xf3, 0xfc, 0x58, 0x8a, 0x7c, 0x23, 0x31, 0xf3, 0xf7, 0x02, 0x99, 0x4d, 0x5b, 0x20, 0x7f, 0x16, 0xde, 0xc2, 0x60, 0x66, 0x18, 0x8c, 0x82, 0x90, 0x89,
0x71, 0x42, 0x14, 0x81, 0xfd, 0x77, 0xa7, 0x61, 0xe6, 0x91, 0x7f, 0x1e, 0x78, 0x5d, 0x3c, 0xb7, 0xa8, 0x3b, 0xe0, 0xe6, 0x46, 0xe0, 0xc7, 0x67, 0x52, 0x85, 0xbe, 0x8e, 0x04, 0x23, 0x0c, 0xcc,
0x1c, 0xd2, 0x61, 0x20, 0xb3, 0xcb, 0xd9, 0x6f, 0x72, 0x1d, 0x66, 0x30, 0x9d, 0x72, 0xc4, 0x99, 0x71, 0xe6, 0x7e, 0x89, 0xb0, 0x98, 0xb8, 0x66, 0xcd, 0x22, 0xec, 0x3f, 0x80, 0x2a, 0x7a, 0x13,
0xb6, 0xce, 0xf3, 0x13, 0x04, 0x08, 0x6f, 0x99, 0x25, 0x77, 0x7c, 0xb8, 0x50, 0x69, 0x10, 0xe6, 0x38, 0xac, 0x0f, 0xa0, 0x7a, 0x16, 0x8c, 0x3a, 0x67, 0x9e, 0x1f, 0x4b, 0x91, 0x6f, 0x24, 0x66,
0x67, 0x85, 0xfa, 0x1d, 0x1d, 0x51, 0x4a, 0xb2, 0xf7, 0xcb, 0x5a, 0xf6, 0x3e, 0x6b, 0x4b, 0xa4, 0xfe, 0x3e, 0x4e, 0x88, 0x22, 0xb0, 0xff, 0xee, 0x34, 0xcc, 0x3c, 0xf2, 0xcf, 0x03, 0xaf, 0x8b,
0x97, 0xf1, 0xfc, 0x23, 0xde, 0x96, 0x00, 0xa1, 0x6f, 0x18, 0x52, 0x1e, 0x22, 0x56, 0x46, 0x16, 0x27, 0xa4, 0x43, 0x3a, 0x0c, 0x64, 0x1e, 0x3b, 0xfb, 0x4d, 0xae, 0xc3, 0x0c, 0x26, 0x6e, 0x8e,
0xf3, 0x0d, 0x75, 0x20, 0x33, 0xc4, 0xf8, 0x07, 0x9c, 0x86, 0x6f, 0x00, 0x3a, 0x88, 0x99, 0xa2, 0x38, 0xd3, 0xd6, 0x79, 0x26, 0x84, 0x00, 0xe1, 0x7d, 0xb6, 0xe4, 0x36, 0x11, 0x17, 0x2a, 0x0d,
0xe9, 0xeb, 0x59, 0xfc, 0x7a, 0x5c, 0x1a, 0xcc, 0xf4, 0x77, 0x8f, 0x2a, 0x35, 0xcb, 0xc7, 0x01, 0xc2, 0xfc, 0xac, 0x50, 0xbf, 0x0d, 0x24, 0x4a, 0xc9, 0x3d, 0x81, 0xb2, 0x76, 0x4f, 0x80, 0xb5,
0xfc, 0x1e, 0x53, 0x1a, 0xae, 0x79, 0x94, 0x3c, 0xf3, 0x55, 0x7a, 0x94, 0x8c, 0x61, 0xdc, 0xc1, 0x25, 0x12, 0xd9, 0x78, 0xa6, 0x13, 0x6f, 0x4b, 0x80, 0xd0, 0x37, 0x0c, 0x29, 0x0f, 0x46, 0x2b,
0xe0, 0xc4, 0xed, 0xbe, 0xc0, 0xdb, 0x79, 0x78, 0x92, 0x58, 0x75, 0x4c, 0x20, 0x26, 0x89, 0x25, 0x23, 0x8b, 0xf9, 0x86, 0x3a, 0x90, 0x19, 0x62, 0xfc, 0x03, 0x4e, 0xc3, 0x37, 0x00, 0x1d, 0xc4,
0xab, 0x8a, 0x99, 0x1c, 0x25, 0x47, 0x07, 0x91, 0x4d, 0xa8, 0xa1, 0x17, 0x2d, 0xd6, 0xb5, 0x81, 0x4c, 0xd1, 0xf4, 0x45, 0x30, 0x7e, 0x11, 0x2f, 0x0d, 0x66, 0xfa, 0xbb, 0x47, 0x95, 0x9a, 0xe5,
0xeb, 0xda, 0xd4, 0xdd, 0x6c, 0x5c, 0x59, 0x9d, 0x48, 0x3f, 0x53, 0x9d, 0xcb, 0xe4, 0xa2, 0xba, 0xe3, 0x00, 0x7e, 0x63, 0x2a, 0x0d, 0xd7, 0x3c, 0x4a, 0x9e, 0x63, 0x2b, 0x3d, 0x4a, 0xc6, 0x30,
0xbd, 0x9e, 0x38, 0x8a, 0x6e, 0xf2, 0x88, 0x80, 0x02, 0xb0, 0x1d, 0x5d, 0x4c, 0x18, 0x27, 0x98, 0xee, 0x60, 0x70, 0xe2, 0x76, 0x5f, 0xe0, 0x3d, 0x40, 0x3c, 0xb3, 0xac, 0x3a, 0x26, 0x10, 0xd3,
0x47, 0x02, 0x03, 0x46, 0x6e, 0x40, 0x85, 0x79, 0x78, 0x23, 0xd7, 0xeb, 0x61, 0xf2, 0x06, 0x77, 0xd1, 0x92, 0x55, 0xc5, 0x9c, 0x91, 0x92, 0xa3, 0x83, 0xc8, 0x26, 0xd4, 0xd0, 0x8b, 0x16, 0xeb,
0x34, 0x15, 0x8c, 0xd5, 0x21, 0x7f, 0xe3, 0x56, 0xb9, 0x80, 0xb3, 0x62, 0xc0, 0xd8, 0xdc, 0xa8, 0xda, 0xc0, 0x75, 0x6d, 0xea, 0x6e, 0x36, 0xae, 0xac, 0x4e, 0xa4, 0x9f, 0xde, 0xce, 0x65, 0xb2,
0xf2, 0x30, 0x49, 0x5e, 0x35, 0x81, 0xe4, 0x43, 0x3c, 0x10, 0x8c, 0x29, 0x66, 0xa8, 0x36, 0x36, 0x5e, 0xdd, 0x5e, 0x4f, 0x1c, 0x7a, 0x37, 0x79, 0x44, 0x40, 0x01, 0xd8, 0x8e, 0x2e, 0x26, 0x8c,
0xdf, 0x12, 0x63, 0x16, 0x4c, 0x2b, 0xff, 0x1e, 0x33, 0x12, 0x87, 0x53, 0xda, 0x5b, 0x50, 0xd7, 0x13, 0xcc, 0x23, 0x81, 0x01, 0x23, 0x37, 0xa0, 0xc2, 0x3c, 0xbc, 0x91, 0xeb, 0xf5, 0x30, 0x4d,
0xc1, 0xa4, 0x02, 0xa5, 0x27, 0x47, 0x7b, 0x87, 0xcd, 0x29, 0x52, 0x83, 0x99, 0xe3, 0xbd, 0xa7, 0x84, 0x3b, 0x9a, 0x0a, 0xc6, 0xea, 0x90, 0xbf, 0x71, 0xab, 0x5c, 0xc0, 0x59, 0x31, 0x60, 0x6c,
0x4f, 0x0f, 0xf6, 0x76, 0x9b, 0x16, 0xa9, 0x43, 0x45, 0x65, 0xf4, 0x15, 0x58, 0x69, 0x6b, 0x67, 0x6e, 0x54, 0x79, 0x98, 0xa4, 0xc9, 0x9a, 0x40, 0xf2, 0x21, 0x1e, 0x3d, 0xc6, 0x14, 0x73, 0x61,
0x67, 0xef, 0xe8, 0xe9, 0xde, 0x6e, 0xb3, 0x68, 0xc7, 0x40, 0xb6, 0x7a, 0x3d, 0x51, 0x8b, 0x8a, 0x1b, 0x9b, 0x6f, 0x89, 0x31, 0x0b, 0xa6, 0x95, 0x7f, 0x8f, 0x19, 0x89, 0xc3, 0x29, 0xed, 0x2d,
0x73, 0x24, 0xfc, 0x6c, 0x19, 0xfc, 0x9c, 0xc3, 0x53, 0x85, 0x7c, 0x9e, 0x7a, 0xed, 0xcc, 0xdb, 0xa8, 0xeb, 0x60, 0x52, 0x81, 0xd2, 0x93, 0xa3, 0xbd, 0xc3, 0xe6, 0x14, 0xa9, 0xc1, 0xcc, 0xf1,
0x7b, 0x50, 0x3b, 0xd2, 0xae, 0xa2, 0xa1, 0x78, 0xc9, 0x4b, 0x68, 0x42, 0x2c, 0x35, 0x88, 0xd6, 0xde, 0xd3, 0xa7, 0x07, 0x7b, 0xbb, 0x4d, 0x8b, 0xd4, 0xa1, 0xa2, 0x72, 0x07, 0x0b, 0xac, 0xb4,
0x9d, 0x82, 0xde, 0x1d, 0xfb, 0x9f, 0x5a, 0xfc, 0x4e, 0x88, 0xea, 0x3e, 0x6f, 0xdb, 0x86, 0xba, 0xb5, 0xb3, 0xb3, 0x77, 0xf4, 0x74, 0x6f, 0xb7, 0x59, 0xb4, 0x63, 0x20, 0x5b, 0xbd, 0x9e, 0xa8,
0x8a, 0xc1, 0x25, 0xc9, 0xba, 0x06, 0x8c, 0xd1, 0x60, 0x57, 0x3a, 0xc1, 0xe9, 0x69, 0x44, 0x65, 0x45, 0xc5, 0x39, 0x12, 0x7e, 0xb6, 0x0c, 0x7e, 0xce, 0xe1, 0xa9, 0x42, 0x3e, 0x4f, 0xbd, 0x76,
0x6a, 0x9d, 0x01, 0x93, 0x76, 0x0d, 0xb3, 0x94, 0x3c, 0xde, 0x42, 0x24, 0x52, 0xec, 0x32, 0x70, 0xe6, 0xed, 0x3d, 0xa8, 0x1d, 0x69, 0x97, 0xde, 0x50, 0xbc, 0xe4, 0x75, 0x37, 0x21, 0x96, 0x1a,
0xa6, 0xe5, 0x45, 0x4c, 0x49, 0x26, 0x15, 0xaa, 0xb2, 0xca, 0x29, 0x4e, 0xcf, 0xf2, 0x1a, 0x54, 0x44, 0xeb, 0x4e, 0x41, 0xef, 0x8e, 0xfd, 0x4f, 0x2d, 0x7e, 0xfb, 0x44, 0x75, 0x9f, 0xb7, 0x6d,
0x54, 0xbd, 0xa6, 0x02, 0x93, 0x94, 0x0a, 0xcf, 0x14, 0x25, 0xfa, 0x3b, 0x46, 0xa7, 0xb9, 0xd2, 0x43, 0x5d, 0x45, 0xfb, 0x92, 0xb4, 0x60, 0x03, 0xc6, 0x68, 0xb0, 0x2b, 0x9d, 0xe0, 0xf4, 0x34,
0xce, 0x22, 0xc8, 0x3a, 0x90, 0x53, 0x2f, 0x4c, 0x93, 0x17, 0x91, 0x3c, 0x07, 0x63, 0x3f, 0x87, 0xa2, 0x32, 0x89, 0xcf, 0x80, 0x49, 0xbb, 0x86, 0x59, 0x4a, 0x1e, 0x6f, 0x21, 0x12, 0xc9, 0x7c,
0x05, 0xc9, 0x48, 0x9a, 0xc1, 0x65, 0x2e, 0xa2, 0x75, 0x95, 0xf8, 0x14, 0xb2, 0xe2, 0x63, 0xff, 0x19, 0x38, 0xd3, 0xf2, 0x22, 0xa6, 0x24, 0xd3, 0x17, 0x55, 0x59, 0x65, 0x2f, 0xa7, 0x67, 0x79,
0xba, 0x08, 0x33, 0x62, 0xa5, 0x33, 0xd7, 0x19, 0xf9, 0x3a, 0x1b, 0x30, 0xd2, 0x32, 0xae, 0x3b, 0x0d, 0x2a, 0xaa, 0x5e, 0x53, 0x81, 0x49, 0x4a, 0x85, 0x67, 0x8a, 0x12, 0xfd, 0x1d, 0xa3, 0xd3,
0xa1, 0xac, 0x09, 0xa5, 0x99, 0x51, 0x8b, 0xc5, 0x3c, 0xb5, 0x48, 0xa0, 0x34, 0x72, 0xe3, 0x33, 0x5c, 0x69, 0x67, 0x11, 0x64, 0x1d, 0xc8, 0xa9, 0x17, 0xa6, 0xc9, 0x8b, 0x48, 0x9e, 0x83, 0xb1,
0x8c, 0x08, 0x54, 0x1d, 0xfc, 0x2d, 0x43, 0x63, 0x65, 0x33, 0x34, 0x96, 0x77, 0x79, 0x93, 0xef, 0x9f, 0xc3, 0x82, 0x64, 0x24, 0xcd, 0xe0, 0x32, 0x17, 0xd1, 0xba, 0x4a, 0x7c, 0x0a, 0x59, 0xf1,
0xf8, 0xd9, 0xcb, 0x9b, 0xd7, 0xa1, 0x8a, 0x9d, 0xd0, 0x0e, 0x18, 0x13, 0x00, 0xe3, 0x5e, 0x5e, 0xb1, 0x7f, 0x55, 0x84, 0x19, 0xb1, 0xd2, 0x99, 0x8b, 0x93, 0x7c, 0x9d, 0x0d, 0x18, 0x69, 0x19,
0x40, 0xd9, 0x16, 0xb7, 0x0f, 0x12, 0xc8, 0xb7, 0x50, 0xc4, 0xdf, 0x83, 0x69, 0x9e, 0xfe, 0x2e, 0x17, 0xab, 0x50, 0xd6, 0x84, 0xd2, 0xcc, 0xa8, 0xc5, 0x62, 0x9e, 0x5a, 0x24, 0x50, 0x1a, 0xb9,
0x52, 0x27, 0xaf, 0xcb, 0x43, 0x16, 0x4e, 0x27, 0xff, 0xf2, 0x1c, 0x0c, 0x47, 0xd0, 0xea, 0x97, 0xf1, 0x19, 0x46, 0x04, 0xaa, 0x0e, 0xfe, 0x96, 0xa1, 0xb1, 0xb2, 0x19, 0x1a, 0xcb, 0xbb, 0x26,
0xe7, 0x6a, 0xe6, 0xe5, 0x39, 0x3d, 0x68, 0x57, 0x37, 0x83, 0x76, 0xf6, 0x03, 0x98, 0x35, 0xaa, 0xca, 0x77, 0xfc, 0xec, 0x35, 0xd1, 0xeb, 0x50, 0xc5, 0x4e, 0x68, 0x47, 0x99, 0x09, 0x80, 0x71,
0x63, 0x2a, 0x43, 0xa4, 0x5e, 0x36, 0xa7, 0xc8, 0x2c, 0x54, 0x1f, 0x1d, 0x76, 0x1e, 0x1c, 0x3c, 0x2f, 0x2f, 0xa0, 0x6c, 0x8b, 0x7b, 0x0e, 0x09, 0xe4, 0x3b, 0x28, 0xe2, 0x8f, 0x60, 0x9a, 0x27,
0x7a, 0xb8, 0xff, 0xb4, 0x69, 0xb1, 0xe2, 0xf1, 0xb3, 0x9d, 0x9d, 0xbd, 0xbd, 0x5d, 0x54, 0x21, 0xda, 0x8b, 0x24, 0xcd, 0xeb, 0xf2, 0x38, 0x87, 0xd3, 0xc9, 0xbf, 0x3c, 0xdb, 0xc3, 0x11, 0xb4,
0x00, 0xd3, 0x0f, 0xb6, 0x1e, 0x1d, 0xa0, 0x02, 0xd9, 0xe5, 0xbc, 0x2d, 0xea, 0x52, 0x81, 0xed, 0xfa, 0x35, 0xbd, 0x9a, 0x79, 0x4d, 0x4f, 0x0f, 0xda, 0xd5, 0xcd, 0xa0, 0x9d, 0xfd, 0x00, 0x66,
0x3f, 0x04, 0x22, 0x5d, 0x52, 0x4c, 0xc1, 0x18, 0x0d, 0x68, 0x2c, 0xb3, 0x82, 0xe7, 0x05, 0xe6, 0x8d, 0xea, 0x98, 0xca, 0x10, 0x49, 0x9e, 0xcd, 0x29, 0x32, 0x0b, 0xd5, 0x47, 0x87, 0x9d, 0x07,
0x91, 0x42, 0xc8, 0xa4, 0xf6, 0xa4, 0x96, 0x44, 0x44, 0xc4, 0x24, 0xa5, 0x45, 0x44, 0x90, 0x3a, 0x07, 0x8f, 0x1e, 0xee, 0x3f, 0x6d, 0x5a, 0xac, 0x78, 0xfc, 0x6c, 0x67, 0x67, 0x6f, 0x6f, 0x17,
0x0a, 0x6f, 0xb7, 0xa1, 0xb5, 0x4b, 0x59, 0x6d, 0x5b, 0x83, 0x41, 0xaa, 0x3b, 0xcc, 0xaf, 0xc8, 0x55, 0x08, 0xc0, 0xf4, 0x83, 0xad, 0x47, 0x07, 0xa8, 0x40, 0x76, 0x39, 0x6f, 0x8b, 0xba, 0x54,
0xc1, 0x09, 0xa7, 0xe3, 0x07, 0xb0, 0xb4, 0xc5, 0x13, 0x80, 0x7f, 0x5f, 0xf9, 0x61, 0x76, 0x0b, 0x08, 0xfd, 0xf7, 0x81, 0x48, 0x97, 0x14, 0x93, 0x3d, 0x46, 0x03, 0x1a, 0xcb, 0xfc, 0xe3, 0x79,
0x96, 0xd3, 0x55, 0x8a, 0xc6, 0x1e, 0xc0, 0xfc, 0x2e, 0x3d, 0x19, 0xf7, 0x0f, 0xe8, 0x79, 0xd2, 0x81, 0x79, 0xa4, 0x10, 0x32, 0x7d, 0x3e, 0xa9, 0x25, 0x11, 0x11, 0x31, 0x49, 0x69, 0x11, 0x11,
0x10, 0x81, 0x52, 0x74, 0x16, 0x5c, 0x88, 0xf9, 0xc1, 0xdf, 0xe4, 0x6d, 0x80, 0x01, 0xa3, 0xe9, 0xa4, 0x8e, 0xc2, 0xdb, 0x6d, 0x68, 0xed, 0x52, 0x56, 0xdb, 0xd6, 0x60, 0x90, 0xea, 0x0e, 0xf3,
0x44, 0x23, 0xda, 0x95, 0x57, 0xae, 0x10, 0x72, 0x3c, 0xa2, 0x5d, 0xfb, 0x23, 0x20, 0x7a, 0x3d, 0x2b, 0x72, 0x70, 0xc2, 0xe9, 0xf8, 0x21, 0x2c, 0x6d, 0xf1, 0x54, 0xe3, 0xdf, 0x55, 0x26, 0x9a,
0x62, 0xbe, 0x98, 0x59, 0x30, 0x3e, 0xe9, 0x44, 0x97, 0x51, 0x4c, 0x87, 0xf2, 0x2e, 0x99, 0x0e, 0xdd, 0x82, 0xe5, 0x74, 0x95, 0xa2, 0xb1, 0x07, 0x30, 0xbf, 0x4b, 0x4f, 0xc6, 0xfd, 0x03, 0x7a,
0xb2, 0x6f, 0x43, 0xfd, 0xc8, 0xbd, 0x74, 0xe8, 0x97, 0xe2, 0x5a, 0xef, 0x0a, 0xcc, 0x8c, 0xdc, 0x9e, 0x34, 0x44, 0xa0, 0x14, 0x9d, 0x05, 0x17, 0x62, 0x7e, 0xf0, 0x37, 0x79, 0x1b, 0x60, 0xc0,
0x4b, 0xc6, 0x82, 0x2a, 0x46, 0x89, 0x68, 0xfb, 0x7f, 0x17, 0x60, 0x9a, 0x53, 0xb2, 0x5a, 0x7b, 0x68, 0x3a, 0xd1, 0x88, 0x76, 0xe5, 0xe5, 0x2e, 0x84, 0x1c, 0x8f, 0x68, 0xd7, 0xfe, 0x18, 0x88,
0x34, 0x8a, 0x3d, 0x1f, 0x25, 0x4d, 0xd6, 0xaa, 0x81, 0x32, 0xb2, 0x5d, 0xc8, 0x91, 0x6d, 0xe1, 0x5e, 0x8f, 0x98, 0x2f, 0x66, 0x16, 0x8c, 0x4f, 0x3a, 0xd1, 0x65, 0x14, 0xd3, 0xa1, 0xbc, 0xb5,
0x40, 0xcb, 0xeb, 0x2b, 0x42, 0x80, 0x0d, 0x18, 0x93, 0xb4, 0x24, 0xd1, 0x93, 0x47, 0xb2, 0x12, 0xa6, 0x83, 0xec, 0xdb, 0x50, 0x3f, 0x72, 0x2f, 0x1d, 0xfa, 0x95, 0xb8, 0x40, 0xbc, 0x02, 0x33,
0x40, 0x2a, 0x9c, 0x9d, 0x18, 0x1f, 0xbc, 0x7f, 0x52, 0x6d, 0x09, 0x31, 0xd6, 0x41, 0xb9, 0x26, 0x23, 0xf7, 0x92, 0xb1, 0xa0, 0x8a, 0x51, 0x22, 0xda, 0xfe, 0x3f, 0x05, 0x98, 0xe6, 0x94, 0xac,
0xce, 0x0c, 0x97, 0xf6, 0x8c, 0x89, 0x93, 0x31, 0x65, 0x2a, 0x6f, 0x60, 0xca, 0x70, 0xaf, 0xfa, 0xd6, 0x1e, 0x8d, 0x62, 0xcf, 0x47, 0x49, 0x93, 0xb5, 0x6a, 0xa0, 0x8c, 0x6c, 0x17, 0x72, 0x64,
0x75, 0xa6, 0x0c, 0xbc, 0x81, 0x29, 0x63, 0x13, 0x68, 0xe2, 0xbd, 0x58, 0x66, 0x2c, 0x4b, 0xde, 0x5b, 0x38, 0xd0, 0xf2, 0xa2, 0x8c, 0x10, 0x60, 0x03, 0xc6, 0x24, 0x2d, 0x49, 0x29, 0xe5, 0x91,
0xfd, 0x07, 0x16, 0x34, 0x05, 0x17, 0x29, 0x1c, 0x79, 0xd7, 0x70, 0x0a, 0x72, 0xaf, 0x69, 0xdc, 0xac, 0x04, 0x90, 0x0a, 0x67, 0x27, 0xc6, 0x07, 0xef, 0x9f, 0x54, 0x5b, 0x42, 0x8c, 0x75, 0x50,
0x84, 0x59, 0x34, 0xd5, 0x95, 0x0a, 0x10, 0x87, 0x0c, 0x06, 0x90, 0x8d, 0x43, 0xa6, 0x09, 0x0c, 0xae, 0x89, 0x33, 0xc3, 0xa5, 0x3d, 0x63, 0xe2, 0x64, 0x4c, 0x99, 0xca, 0x1b, 0x98, 0x32, 0xdc,
0xbd, 0x81, 0x58, 0x14, 0x1d, 0x24, 0xb5, 0x48, 0xe8, 0x8a, 0x84, 0x45, 0xcb, 0x51, 0x65, 0xfb, 0xab, 0x7e, 0x9d, 0x29, 0x03, 0x6f, 0x60, 0xca, 0xd8, 0x04, 0x9a, 0x78, 0x03, 0x97, 0x19, 0xcb,
0x17, 0x16, 0xcc, 0x6b, 0x1d, 0x16, 0x5c, 0x78, 0x1f, 0xa4, 0x34, 0xf0, 0x20, 0x3e, 0x97, 0xdc, 0x92, 0x77, 0xff, 0x81, 0x05, 0x4d, 0xc1, 0x45, 0x0a, 0x47, 0xde, 0x35, 0x9c, 0x82, 0xdc, 0x0b,
0x15, 0x53, 0x6c, 0x92, 0xcf, 0x0c, 0x62, 0x5c, 0x4c, 0xf7, 0x12, 0x3b, 0x18, 0x8d, 0x87, 0x62, 0x21, 0x37, 0x61, 0x16, 0x4d, 0x75, 0xa5, 0x02, 0xc4, 0x21, 0x83, 0x01, 0x64, 0xe3, 0x90, 0x09,
0x57, 0xd1, 0x41, 0x8c, 0x91, 0x2e, 0x28, 0x7d, 0xa1, 0x48, 0xf8, 0xbe, 0x66, 0xc0, 0x30, 0x9c, 0x09, 0x43, 0x6f, 0x20, 0x16, 0x45, 0x07, 0x49, 0x2d, 0x12, 0xba, 0x22, 0x35, 0xd2, 0x72, 0x54,
0xc9, 0x5c, 0x0c, 0x45, 0x54, 0x12, 0xe1, 0x4c, 0x1d, 0x68, 0xff, 0x67, 0x0b, 0x16, 0xb8, 0xaf, 0xd9, 0xfe, 0x85, 0x05, 0xf3, 0x5a, 0x87, 0x05, 0x17, 0xde, 0x07, 0x29, 0x0d, 0x3c, 0x88, 0xcf,
0x28, 0xfc, 0x73, 0x75, 0x03, 0x70, 0x9a, 0xbb, 0xcc, 0x5c, 0x22, 0xf7, 0xa7, 0x1c, 0x51, 0x26, 0x25, 0x77, 0xc5, 0x14, 0x9b, 0xe4, 0x33, 0x83, 0x18, 0x17, 0xd3, 0xbd, 0xc4, 0x0e, 0x46, 0xe3,
0xdf, 0x7f, 0x43, 0xff, 0x56, 0x65, 0x51, 0x4e, 0x58, 0x8b, 0x62, 0xde, 0x5a, 0xbc, 0x66, 0xa6, 0xa1, 0xd8, 0x55, 0x74, 0x10, 0x63, 0xa4, 0x0b, 0x4a, 0x5f, 0x28, 0x12, 0xbe, 0xaf, 0x19, 0x30,
0xf3, 0x22, 0xcb, 0xe5, 0xdc, 0xc8, 0xf2, 0xf6, 0x0c, 0x94, 0xa3, 0x6e, 0x30, 0xa2, 0xf6, 0x32, 0x0c, 0x67, 0x32, 0x17, 0x43, 0x11, 0x95, 0x44, 0x38, 0x53, 0x07, 0xda, 0xff, 0xc5, 0x82, 0x05,
0x2c, 0x9a, 0x83, 0x13, 0x2a, 0xe8, 0xa7, 0x16, 0xb4, 0x1e, 0xf0, 0xc3, 0x1d, 0xcf, 0xef, 0xef, 0xee, 0x2b, 0x0a, 0xff, 0x5c, 0xdd, 0x35, 0x9c, 0xe6, 0x2e, 0x33, 0x97, 0xc8, 0xfd, 0x29, 0x47,
0x7b, 0x51, 0x1c, 0x84, 0xea, 0xa2, 0xf4, 0x0d, 0x80, 0x28, 0x76, 0xc3, 0x98, 0x27, 0xf8, 0x8b, 0x94, 0xc9, 0x0f, 0xde, 0xd0, 0xbf, 0x55, 0xf9, 0x9a, 0x13, 0xd6, 0xa2, 0x98, 0xb7, 0x16, 0xaf,
0x78, 0x6d, 0x02, 0x61, 0x7d, 0xa4, 0x7e, 0x8f, 0x63, 0xf9, 0xda, 0xa8, 0x72, 0xc6, 0xa8, 0x12, 0x99, 0xe9, 0xbc, 0xc8, 0x72, 0x39, 0x37, 0xb2, 0xbc, 0x3d, 0x03, 0xe5, 0xa8, 0x1b, 0x8c, 0xa8,
0xde, 0xac, 0x61, 0x9a, 0xdc, 0xe2, 0x59, 0xc5, 0xcc, 0x78, 0xa2, 0xe7, 0xa8, 0xd7, 0xb9, 0x9b, 0xbd, 0x0c, 0x8b, 0xe6, 0xe0, 0x84, 0x0a, 0xfa, 0xa9, 0x05, 0xad, 0x07, 0xfc, 0x70, 0xc7, 0xf3,
0x98, 0x82, 0xda, 0xbf, 0xb4, 0x60, 0x2e, 0xe9, 0x24, 0x9e, 0x7e, 0x9b, 0xda, 0x41, 0xd8, 0x23, 0xfb, 0xfb, 0x5e, 0x14, 0x07, 0xa1, 0xba, 0x92, 0x7d, 0x03, 0x20, 0x8a, 0xdd, 0x30, 0xe6, 0x57,
0x89, 0x76, 0x90, 0x91, 0x64, 0x8f, 0x19, 0x28, 0xa2, 0x6f, 0x1a, 0x04, 0x25, 0x56, 0x94, 0x82, 0x09, 0x44, 0xbc, 0x36, 0x81, 0xb0, 0x3e, 0x52, 0xbf, 0xc7, 0xb1, 0x7c, 0x6d, 0x54, 0x39, 0x63,
0xb1, 0xb4, 0xf8, 0x74, 0x10, 0xcf, 0x11, 0x64, 0xa6, 0x91, 0x30, 0xf3, 0x44, 0x09, 0xef, 0x67, 0x54, 0x09, 0x6f, 0xd6, 0x30, 0x4d, 0x6e, 0xf1, 0xfc, 0x65, 0x66, 0x3c, 0xd1, 0x73, 0xd4, 0xeb,
0x0c, 0x63, 0xfc, 0x8a, 0x47, 0xc5, 0x65, 0x91, 0x34, 0xb9, 0x6d, 0x31, 0x83, 0x50, 0xb4, 0x2b, 0xdc, 0x4d, 0x4c, 0x41, 0xed, 0xff, 0x6c, 0xc1, 0x5c, 0xd2, 0x49, 0x3c, 0x67, 0x37, 0xb5, 0x83,
0xf4, 0x3d, 0xb7, 0xc2, 0xe7, 0x47, 0xed, 0xb9, 0x7f, 0xcb, 0x82, 0x6b, 0x39, 0x13, 0x2f, 0xa4, 0xb0, 0x47, 0x12, 0xed, 0x20, 0x23, 0xc9, 0x1e, 0x33, 0x50, 0x44, 0xdf, 0x34, 0x08, 0x4a, 0xac,
0x66, 0x17, 0xe6, 0x4f, 0x15, 0x52, 0x4e, 0x0e, 0x17, 0x9d, 0x65, 0x79, 0x7c, 0x6b, 0x4e, 0x88, 0x28, 0x05, 0x63, 0x69, 0xf1, 0xe9, 0x20, 0x9e, 0x8d, 0xc8, 0x4c, 0x23, 0x61, 0xe6, 0x89, 0x12,
0x93, 0xfd, 0x40, 0x19, 0x8a, 0x7c, 0xba, 0x8d, 0x2c, 0xdc, 0x2c, 0xc2, 0x3e, 0x82, 0xf6, 0xde, 0xde, 0x04, 0x19, 0xc6, 0xf8, 0x15, 0x8f, 0x8a, 0xcb, 0x22, 0x69, 0x72, 0xdb, 0x62, 0x06, 0xa1,
0x4b, 0x26, 0x84, 0x3b, 0xfa, 0x7b, 0x3f, 0x92, 0x17, 0x36, 0x33, 0x4a, 0xe6, 0xea, 0xc8, 0xc3, 0x68, 0x57, 0xe8, 0x7b, 0x6e, 0x85, 0xcf, 0x8f, 0xda, 0x73, 0xff, 0x96, 0x05, 0xd7, 0x72, 0x26,
0x29, 0xcc, 0x1a, 0x75, 0x91, 0xef, 0xbe, 0x69, 0x25, 0xba, 0xbc, 0xc8, 0xb5, 0xe2, 0x0f, 0x16, 0x5e, 0x48, 0xcd, 0x2e, 0xcc, 0x9f, 0x2a, 0xa4, 0x9c, 0x1c, 0x2e, 0x3a, 0xcb, 0xf2, 0xa0, 0xd8,
0xc9, 0x5c, 0x60, 0x0d, 0x64, 0x9f, 0xc3, 0xdc, 0xe3, 0xf1, 0x20, 0xf6, 0x92, 0xc7, 0x8b, 0xc8, 0x9c, 0x10, 0x27, 0xfb, 0x81, 0x32, 0x14, 0xf9, 0x74, 0x1b, 0xf9, 0xbe, 0x59, 0x84, 0x7d, 0x04,
0xf7, 0xc5, 0x47, 0x58, 0x85, 0x9c, 0xba, 0xdc, 0xa6, 0x74, 0x3a, 0x36, 0x63, 0x43, 0x56, 0x53, 0xed, 0xbd, 0x97, 0x4c, 0x08, 0x77, 0xf4, 0x97, 0x85, 0x24, 0x2f, 0x6c, 0x66, 0x94, 0xcc, 0xd5,
0x27, 0xdb, 0x62, 0x16, 0x61, 0x5f, 0x83, 0x95, 0xa4, 0x49, 0x3e, 0x77, 0x52, 0x51, 0xff, 0xcc, 0x91, 0x87, 0x53, 0x98, 0x35, 0xea, 0x22, 0xdf, 0x7f, 0xd3, 0x4a, 0x74, 0x79, 0x91, 0x6b, 0xc5,
0xe2, 0x49, 0x2d, 0xe6, 0x5b, 0x4a, 0xe4, 0x21, 0x2c, 0x44, 0x9e, 0xdf, 0x1f, 0x50, 0xbd, 0x9e, 0x9f, 0x46, 0x92, 0x59, 0xc7, 0x1a, 0xc8, 0x3e, 0x87, 0xb9, 0xc7, 0xe3, 0x41, 0xec, 0x25, 0xcf,
0x48, 0xcc, 0xc4, 0x92, 0xd9, 0x3d, 0xf1, 0xde, 0x92, 0x93, 0xf7, 0x05, 0x63, 0x90, 0xfc, 0x8e, 0x24, 0x91, 0x1f, 0x88, 0x8f, 0xb0, 0x0a, 0x39, 0x75, 0xb9, 0x4d, 0xe9, 0x74, 0x6c, 0xc6, 0x86,
0x26, 0x0c, 0x92, 0x9a, 0x92, 0xbc, 0x01, 0x7c, 0x02, 0x0d, 0xb3, 0x31, 0x72, 0x4f, 0xa4, 0xf1, 0xac, 0xa6, 0x4e, 0xb6, 0xc5, 0x2c, 0xc2, 0xbe, 0x06, 0x2b, 0x49, 0x93, 0x7c, 0xee, 0xa4, 0xa2,
0x26, 0x3d, 0xd3, 0x8f, 0x07, 0x4c, 0xce, 0x30, 0x28, 0xed, 0x6f, 0x2c, 0x68, 0x39, 0x94, 0xb1, 0xfe, 0x99, 0xc5, 0xd3, 0x67, 0xcc, 0x57, 0x9b, 0xc8, 0x43, 0x58, 0x88, 0x3c, 0xbf, 0x3f, 0xa0,
0x31, 0xd5, 0x1a, 0x15, 0xdc, 0x73, 0x3f, 0x53, 0xed, 0xe4, 0x01, 0xab, 0xf4, 0x60, 0x39, 0xd6, 0x7a, 0x3d, 0x91, 0x98, 0x89, 0x25, 0xb3, 0x7b, 0xe2, 0x65, 0x27, 0x27, 0xef, 0x0b, 0xc6, 0x20,
0xf5, 0x89, 0x8b, 0xb2, 0x3f, 0x95, 0x33, 0xaa, 0xed, 0x0a, 0x4c, 0x8b, 0xf1, 0xad, 0xc0, 0x92, 0xf9, 0x1d, 0x4d, 0x18, 0x24, 0x35, 0x25, 0x79, 0x03, 0xf8, 0x14, 0x1a, 0x66, 0x63, 0xe4, 0x9e,
0xe8, 0x92, 0xec, 0x4e, 0x12, 0x5b, 0x36, 0x1a, 0x35, 0x62, 0xcb, 0x6d, 0x68, 0xf1, 0x1b, 0xec, 0x48, 0x18, 0x4e, 0x7a, 0xa6, 0x1f, 0x0f, 0x98, 0x9c, 0x61, 0x50, 0xda, 0xdf, 0x5a, 0xd0, 0x72,
0xfa, 0x38, 0xf8, 0x87, 0x6b, 0xaf, 0xa0, 0xa6, 0xdd, 0xe3, 0x27, 0x2b, 0xb0, 0xf0, 0xfc, 0xd1, 0x28, 0x63, 0x63, 0xaa, 0x35, 0x2a, 0xb8, 0xe7, 0x7e, 0xa6, 0xda, 0xc9, 0x03, 0x56, 0x89, 0xc8,
0xd3, 0xc3, 0xbd, 0xe3, 0xe3, 0xce, 0xd1, 0xb3, 0xed, 0x4f, 0xf7, 0x3e, 0xeb, 0xec, 0x6f, 0x1d, 0x72, 0xac, 0xeb, 0x13, 0x17, 0x65, 0x7f, 0x2a, 0x67, 0x54, 0xdb, 0x15, 0x98, 0x16, 0xe3, 0x5b,
0xef, 0x37, 0xa7, 0xc8, 0x32, 0x90, 0xc3, 0xbd, 0xe3, 0xa7, 0x7b, 0xbb, 0x06, 0xdc, 0x22, 0x37, 0x81, 0x25, 0xd1, 0x25, 0xd9, 0x9d, 0x24, 0xb6, 0x6c, 0x34, 0x6a, 0xc4, 0x96, 0xdb, 0xd0, 0xe2,
0xa0, 0xfd, 0xec, 0xf0, 0xd9, 0xf1, 0xde, 0x6e, 0x27, 0xef, 0xbb, 0x02, 0x79, 0x1b, 0xae, 0x09, 0x77, 0xe5, 0xf5, 0x71, 0xf0, 0x0f, 0xd7, 0x5e, 0x41, 0x4d, 0x7b, 0x31, 0x80, 0xac, 0xc0, 0xc2,
0x7c, 0xce, 0xe7, 0xc5, 0xcd, 0x6f, 0x8a, 0xd0, 0xe0, 0xb9, 0x35, 0xfc, 0x09, 0x2e, 0x1a, 0x92, 0xf3, 0x47, 0x4f, 0x0f, 0xf7, 0x8e, 0x8f, 0x3b, 0x47, 0xcf, 0xb6, 0x3f, 0xdb, 0xfb, 0xbc, 0xb3,
0xc7, 0x30, 0x23, 0xde, 0x72, 0x23, 0x72, 0x3e, 0xcd, 0xd7, 0xe3, 0xda, 0xcb, 0x69, 0xb0, 0x98, 0xbf, 0x75, 0xbc, 0xdf, 0x9c, 0x22, 0xcb, 0x40, 0x0e, 0xf7, 0x8e, 0x9f, 0xee, 0xed, 0x1a, 0x70,
0x84, 0x85, 0xbf, 0xfc, 0xab, 0xff, 0xfe, 0x77, 0x0a, 0xb3, 0xa4, 0xb6, 0x71, 0xfe, 0xe1, 0x46, 0x8b, 0xdc, 0x80, 0xf6, 0xb3, 0xc3, 0x67, 0xc7, 0x7b, 0xbb, 0x9d, 0xbc, 0xef, 0x0a, 0xe4, 0x6d,
0x9f, 0xfa, 0x11, 0xab, 0xe3, 0xc7, 0x00, 0xc9, 0x0b, 0x65, 0xa4, 0xa5, 0x9c, 0xd0, 0xd4, 0xf3, 0xb8, 0x26, 0xf0, 0x39, 0x9f, 0x17, 0x37, 0xbf, 0x2d, 0x42, 0x83, 0x67, 0xf1, 0xf0, 0xc7, 0xbe,
0x6d, 0xed, 0x6b, 0x39, 0x18, 0x51, 0xef, 0x35, 0xac, 0x77, 0xc1, 0x6e, 0xb0, 0x7a, 0x3d, 0xdf, 0x68, 0x48, 0x1e, 0xc3, 0x8c, 0x78, 0x35, 0x8e, 0xc8, 0xf9, 0x34, 0xdf, 0xa9, 0x6b, 0x2f, 0xa7,
0x8b, 0xf9, 0x6b, 0x65, 0x1f, 0x5b, 0x6b, 0xa4, 0x07, 0x75, 0xfd, 0xed, 0x30, 0x22, 0xe3, 0xe3, 0xc1, 0x62, 0x12, 0x16, 0xfe, 0xd2, 0x2f, 0xff, 0xc7, 0xdf, 0x29, 0xcc, 0x92, 0xda, 0xc6, 0xf9,
0x39, 0xaf, 0x9f, 0xb5, 0xdf, 0xca, 0xc5, 0xc9, 0x05, 0xc4, 0x36, 0x96, 0xec, 0x26, 0x6b, 0x63, 0x87, 0x1b, 0x7d, 0xea, 0x47, 0xac, 0x8e, 0x3f, 0x06, 0x48, 0xde, 0x42, 0x23, 0x2d, 0xe5, 0x84,
0x8c, 0x14, 0x49, 0x2b, 0x03, 0xce, 0xd6, 0xc9, 0x13, 0x61, 0xe4, 0xba, 0xc6, 0x69, 0x99, 0x07, 0xa6, 0x1e, 0x8a, 0x6b, 0x5f, 0xcb, 0xc1, 0x88, 0x7a, 0xaf, 0x61, 0xbd, 0x0b, 0x76, 0x83, 0xd5,
0xca, 0xda, 0x6f, 0x4f, 0xc0, 0x8a, 0xb6, 0xde, 0xc6, 0xb6, 0x56, 0x6c, 0xc2, 0xda, 0xea, 0x22, 0xeb, 0xf9, 0x5e, 0xcc, 0xdf, 0x45, 0xfb, 0xc4, 0x5a, 0x23, 0x3d, 0xa8, 0xeb, 0xaf, 0x94, 0x11,
0x8d, 0x7c, 0xa0, 0xec, 0x63, 0x6b, 0x6d, 0xf3, 0xef, 0xdd, 0x82, 0xaa, 0x3a, 0x37, 0x23, 0x5f, 0x19, 0x1f, 0xcf, 0x79, 0x67, 0xad, 0xfd, 0x56, 0x2e, 0x4e, 0x2e, 0x20, 0xb6, 0xb1, 0x64, 0x37,
0xc0, 0xac, 0x91, 0xfc, 0x44, 0xe4, 0x30, 0xf2, 0x72, 0xa5, 0xda, 0xd7, 0xf3, 0x91, 0xa2, 0xe1, 0x59, 0x1b, 0x63, 0xa4, 0x48, 0x5a, 0x19, 0x70, 0xb6, 0x4e, 0x1e, 0x23, 0x23, 0xd7, 0x35, 0x4e,
0x1b, 0xd8, 0x70, 0x8b, 0x2c, 0xb3, 0x86, 0x45, 0xf6, 0xd0, 0x06, 0xa6, 0xf1, 0xf1, 0x5b, 0x40, 0xcb, 0x3c, 0x85, 0xd6, 0x7e, 0x7b, 0x02, 0x56, 0xb4, 0xf5, 0x36, 0xb6, 0xb5, 0x62, 0x13, 0xd6,
0x2f, 0x34, 0xf1, 0xe5, 0x8d, 0x5d, 0x4f, 0x4b, 0x94, 0xd1, 0xda, 0xdb, 0x13, 0xb0, 0xa2, 0xb9, 0x56, 0x17, 0x69, 0xe4, 0x53, 0x68, 0x9f, 0x58, 0x6b, 0x9b, 0x7f, 0xef, 0x16, 0x54, 0xd5, 0xb9,
0xeb, 0xd8, 0xdc, 0x32, 0x59, 0xd4, 0x9b, 0x53, 0xe7, 0x59, 0x14, 0xaf, 0xbe, 0xe9, 0xaf, 0x67, 0x19, 0xf9, 0x12, 0x66, 0x8d, 0x34, 0x2b, 0x22, 0x87, 0x91, 0x97, 0x95, 0xd5, 0xbe, 0x9e, 0x8f,
0x91, 0xb7, 0x15, 0x63, 0xe5, 0xbd, 0xaa, 0xa5, 0x58, 0x24, 0xfb, 0xb4, 0x96, 0xdd, 0xc2, 0xa6, 0x14, 0x0d, 0xdf, 0xc0, 0x86, 0x5b, 0x64, 0x99, 0x35, 0x2c, 0xf2, 0x94, 0x36, 0x30, 0x61, 0x90,
0x08, 0xc1, 0xe5, 0xd3, 0x1f, 0xcf, 0x22, 0x27, 0x50, 0xd3, 0x5e, 0x85, 0x21, 0xd7, 0x26, 0xbe, 0xdf, 0x37, 0x7a, 0xa1, 0x89, 0x2f, 0x6f, 0xec, 0x7a, 0x5a, 0xa2, 0x8c, 0xd6, 0xde, 0x9e, 0x80,
0x60, 0xd3, 0x6e, 0xe7, 0xa1, 0xf2, 0x86, 0xa2, 0xd7, 0xbf, 0xc1, 0xf6, 0xe5, 0x1f, 0x41, 0x55, 0x15, 0xcd, 0x5d, 0xc7, 0xe6, 0x96, 0xc9, 0xa2, 0xde, 0x9c, 0x3a, 0xcf, 0xa2, 0x78, 0xc9, 0x4e,
0xbd, 0x33, 0x42, 0x56, 0xb4, 0x77, 0x5f, 0xf4, 0x77, 0x51, 0xda, 0xad, 0x2c, 0x22, 0x8f, 0xf9, 0x7f, 0xa7, 0x8b, 0xbc, 0xad, 0x18, 0x2b, 0xef, 0xfd, 0x2e, 0xc5, 0x22, 0xd9, 0x47, 0xbc, 0xec,
0xf4, 0xda, 0x19, 0xf3, 0x3d, 0x87, 0x9a, 0xf6, 0x96, 0x88, 0x1a, 0x40, 0xf6, 0xbd, 0x12, 0x35, 0x16, 0x36, 0x45, 0x08, 0x2e, 0x9f, 0xfe, 0x4c, 0x17, 0x39, 0x81, 0x9a, 0xf6, 0xfe, 0x0c, 0xb9,
0x80, 0x9c, 0xa7, 0x47, 0xec, 0x79, 0x6c, 0xa2, 0x46, 0xaa, 0xc8, 0xdf, 0xf1, 0xcb, 0x20, 0x22, 0x36, 0xf1, 0xad, 0x9c, 0x76, 0x3b, 0x0f, 0x95, 0x37, 0x14, 0xbd, 0xfe, 0x0d, 0xb6, 0x2f, 0xff,
0x07, 0xb0, 0x24, 0xd4, 0xd4, 0x09, 0xfd, 0x36, 0xcb, 0x90, 0xf3, 0x60, 0xd9, 0x5d, 0x8b, 0xdc, 0x18, 0xaa, 0xea, 0x45, 0x13, 0xb2, 0xa2, 0xbd, 0x30, 0xa3, 0xbf, 0xc0, 0xd2, 0x6e, 0x65, 0x11,
0x87, 0x8a, 0x7c, 0x32, 0x86, 0x2c, 0xe7, 0x3f, 0x7d, 0xd3, 0x5e, 0xc9, 0xc0, 0x85, 0x79, 0xf2, 0x79, 0xcc, 0xa7, 0xd7, 0xce, 0x98, 0xef, 0x39, 0xd4, 0xb4, 0x57, 0x4b, 0xd4, 0x00, 0xb2, 0x2f,
0x19, 0x40, 0xf2, 0x70, 0x89, 0x52, 0x12, 0x99, 0x87, 0x50, 0x14, 0x07, 0x64, 0x5f, 0x39, 0xb1, 0xa3, 0xa8, 0x01, 0xe4, 0x3c, 0x72, 0x62, 0xcf, 0x63, 0x13, 0x35, 0x52, 0x45, 0xfe, 0x8e, 0x5f,
0x97, 0x71, 0x80, 0x4d, 0x82, 0x4a, 0xc2, 0xa7, 0x17, 0xf2, 0x96, 0xeb, 0x4f, 0xa0, 0xa6, 0xbd, 0x06, 0x11, 0x39, 0x80, 0x25, 0xa1, 0xa6, 0x4e, 0xe8, 0x77, 0x59, 0x86, 0x9c, 0xa7, 0xd1, 0xee,
0x5d, 0xa2, 0xa6, 0x2f, 0xfb, 0xee, 0x89, 0x9a, 0xbe, 0x9c, 0xa7, 0x4e, 0xec, 0x36, 0xd6, 0xbe, 0x5a, 0xe4, 0x3e, 0x54, 0xe4, 0xe3, 0x34, 0x64, 0x39, 0xff, 0x91, 0x9d, 0xf6, 0x4a, 0x06, 0x2e,
0x68, 0xcf, 0xb1, 0xda, 0x23, 0xaf, 0xef, 0x0f, 0x39, 0x01, 0x5b, 0xa0, 0x33, 0x98, 0x35, 0x1e, 0xcc, 0x93, 0xcf, 0x01, 0x92, 0x27, 0x52, 0x94, 0x92, 0xc8, 0x3c, 0xb9, 0xa2, 0x38, 0x20, 0xfb,
0x28, 0x51, 0x12, 0x9a, 0xf7, 0xfc, 0x89, 0x92, 0xd0, 0xdc, 0x37, 0x4d, 0x24, 0x9f, 0xd9, 0xf3, 0x9e, 0x8a, 0xbd, 0x8c, 0x03, 0x6c, 0x12, 0x54, 0x12, 0x3e, 0xbd, 0x90, 0xf7, 0x69, 0x7f, 0x02,
0xac, 0x9d, 0x73, 0x24, 0xd1, 0x5a, 0xfa, 0x1c, 0x6a, 0xda, 0x63, 0x23, 0x6a, 0x2c, 0xd9, 0x77, 0x35, 0xed, 0x95, 0x14, 0x35, 0x7d, 0xd9, 0x17, 0x56, 0xd4, 0xf4, 0xe5, 0x3c, 0xaa, 0x62, 0xb7,
0x4d, 0xd4, 0x58, 0xf2, 0xde, 0x26, 0x59, 0xc4, 0x36, 0x1a, 0x36, 0xb2, 0x02, 0xde, 0xd7, 0x64, 0xb1, 0xf6, 0x45, 0x7b, 0x8e, 0xd5, 0x1e, 0x79, 0x7d, 0x7f, 0xc8, 0x09, 0xd8, 0x02, 0x9d, 0xc1,
0x75, 0x7f, 0x01, 0x0d, 0xf3, 0xf9, 0x11, 0x25, 0xfb, 0xb9, 0x0f, 0x99, 0x28, 0xd9, 0x9f, 0xf0, 0xac, 0xf1, 0x14, 0x8a, 0x92, 0xd0, 0xbc, 0x87, 0x56, 0x94, 0x84, 0xe6, 0xbe, 0x9e, 0x22, 0xf9,
0x66, 0x89, 0x60, 0xe9, 0xb5, 0x05, 0xd5, 0xc8, 0xc6, 0xd7, 0x22, 0xeb, 0xe6, 0x15, 0xf9, 0x01, 0xcc, 0x9e, 0x67, 0xed, 0x9c, 0x23, 0x89, 0xd6, 0xd2, 0x17, 0x50, 0xd3, 0x9e, 0x35, 0x51, 0x63,
0x53, 0x70, 0xe2, 0x02, 0x2d, 0x59, 0xd1, 0xb8, 0x56, 0xbf, 0x66, 0xab, 0xe4, 0x25, 0x73, 0xd7, 0xc9, 0xbe, 0xa0, 0xa2, 0xc6, 0x92, 0xf7, 0x0a, 0xca, 0x22, 0xb6, 0xd1, 0xb0, 0x91, 0x15, 0xf0,
0xd6, 0x64, 0x66, 0x7e, 0xe3, 0x14, 0x77, 0x2d, 0xbc, 0x48, 0xab, 0xed, 0x5a, 0xfa, 0x5d, 0x5b, 0x66, 0x28, 0xab, 0xfb, 0x4b, 0x68, 0x98, 0x0f, 0x9d, 0x28, 0xd9, 0xcf, 0x7d, 0x32, 0x45, 0xc9,
0x6d, 0xd7, 0x32, 0xee, 0xdb, 0xa6, 0x77, 0xad, 0xd8, 0x63, 0x75, 0xf8, 0x30, 0x97, 0x4a, 0xd0, 0xfe, 0x84, 0xd7, 0x51, 0x04, 0x4b, 0xaf, 0x2d, 0xa8, 0x46, 0x36, 0xbe, 0x11, 0x59, 0x37, 0xaf,
0x56, 0x52, 0x91, 0x7f, 0x87, 0xa6, 0x7d, 0xe3, 0xf5, 0x79, 0xdd, 0xa6, 0x06, 0x91, 0x4a, 0x70, 0xc8, 0x0f, 0x99, 0x82, 0x13, 0x57, 0x75, 0xc9, 0x8a, 0xc6, 0xb5, 0xfa, 0x85, 0x5e, 0x25, 0x2f,
0x43, 0xde, 0x58, 0xfa, 0x0b, 0x50, 0xd7, 0x1f, 0x5e, 0x20, 0xba, 0x28, 0xa7, 0x5b, 0x7a, 0x2b, 0x99, 0x5b, 0xbd, 0x26, 0x33, 0xf3, 0xbb, 0xad, 0xb8, 0x6b, 0xe1, 0x95, 0x5d, 0x6d, 0xd7, 0xd2,
0x17, 0x67, 0x2e, 0x2e, 0xa9, 0xeb, 0xcd, 0x90, 0x1f, 0xc2, 0xb2, 0x12, 0x75, 0x3d, 0xe7, 0x37, 0x6f, 0xf5, 0x6a, 0xbb, 0x96, 0x71, 0xb3, 0x37, 0xbd, 0x6b, 0xc5, 0x1e, 0xab, 0xc3, 0x87, 0xb9,
0x22, 0xef, 0xe4, 0x64, 0x02, 0xeb, 0xc6, 0x4b, 0xfb, 0xda, 0xc4, 0x54, 0xe1, 0xbb, 0x16, 0x63, 0x54, 0x2a, 0xb8, 0x92, 0x8a, 0xfc, 0xdb, 0x3a, 0xed, 0x1b, 0xaf, 0xcf, 0x20, 0x37, 0x35, 0x88,
0x1a, 0xf3, 0x46, 0x7b, 0xb2, 0x61, 0xe4, 0x5d, 0xe4, 0x4f, 0x36, 0x8c, 0xdc, 0x6b, 0xf0, 0x92, 0x54, 0x82, 0x1b, 0xf2, 0x6e, 0xd4, 0x9f, 0x87, 0xba, 0xfe, 0xc4, 0x03, 0xd1, 0x45, 0x39, 0xdd,
0x69, 0xc8, 0x82, 0x31, 0x47, 0xfc, 0xc0, 0x92, 0x7c, 0x0e, 0x73, 0xda, 0xad, 0x8a, 0xe3, 0x4b, 0xd2, 0x5b, 0xb9, 0x38, 0x73, 0x71, 0x49, 0x5d, 0x6f, 0x86, 0xfc, 0x08, 0x96, 0x95, 0xa8, 0xeb,
0xbf, 0xab, 0x04, 0x20, 0x7b, 0xe1, 0xaf, 0x9d, 0x67, 0x9a, 0xdb, 0x2b, 0x58, 0xff, 0xbc, 0x6d, 0xd9, 0xc5, 0x11, 0x79, 0x27, 0x27, 0xe7, 0x58, 0x37, 0x5e, 0xda, 0xd7, 0x26, 0x26, 0x25, 0xdf,
0x4c, 0x0e, 0x63, 0xfe, 0x1d, 0xa8, 0xe9, 0x37, 0x36, 0x5e, 0x53, 0xef, 0x8a, 0x86, 0xd2, 0xef, 0xb5, 0x18, 0xd3, 0x98, 0x77, 0xe7, 0x93, 0x0d, 0x23, 0xef, 0xc9, 0x80, 0x64, 0xc3, 0xc8, 0xbd,
0xab, 0xdd, 0xb5, 0xc8, 0x3f, 0xb4, 0xa0, 0x6e, 0xdc, 0x7f, 0x30, 0x0e, 0xeb, 0x53, 0xf5, 0xb4, 0x70, 0x2f, 0x99, 0x86, 0x2c, 0x18, 0x73, 0xc4, 0x0f, 0x2c, 0xc9, 0x17, 0x30, 0xa7, 0xdd, 0xdf,
0x74, 0x9c, 0x5e, 0x91, 0xed, 0x60, 0x27, 0x0f, 0xd6, 0x3e, 0x31, 0x26, 0xe1, 0x6b, 0x23, 0xfe, 0x38, 0xbe, 0xf4, 0xbb, 0x4a, 0x00, 0xb2, 0x57, 0x0b, 0xdb, 0x79, 0xa6, 0xb9, 0xbd, 0x82, 0xf5,
0xb2, 0x9e, 0x7e, 0xa6, 0xee, 0x55, 0x9a, 0x40, 0xbf, 0x14, 0xf9, 0xea, 0xae, 0x45, 0x7e, 0x6e, 0xcf, 0xdb, 0xc6, 0xe4, 0x30, 0xe6, 0xdf, 0x81, 0x9a, 0x7e, 0x37, 0xe4, 0x35, 0xf5, 0xae, 0x68,
0x41, 0xc3, 0x8c, 0x1a, 0xaa, 0xa5, 0xca, 0x8d, 0x4f, 0xaa, 0xa5, 0x9a, 0x10, 0x6a, 0xfc, 0x1c, 0x28, 0xfd, 0x66, 0xdc, 0x5d, 0x8b, 0xfc, 0x43, 0x0b, 0xea, 0xc6, 0x4d, 0x0b, 0xe3, 0xb0, 0x3e,
0x7b, 0xf9, 0x74, 0xcd, 0x31, 0x7a, 0x29, 0xde, 0x3a, 0xf8, 0xdd, 0x7a, 0x4b, 0x3e, 0xe6, 0xaf, 0x55, 0x4f, 0x4b, 0xc7, 0xe9, 0x15, 0xd9, 0x0e, 0x76, 0xf2, 0x60, 0xed, 0x53, 0x63, 0x12, 0xbe,
0x54, 0xca, 0xd8, 0x3e, 0xd1, 0x76, 0x8d, 0xf4, 0xf2, 0xea, 0x2f, 0x2b, 0xde, 0xb1, 0xee, 0x5a, 0x31, 0xe2, 0x2f, 0xeb, 0xe9, 0x07, 0xf1, 0x5e, 0xa5, 0x09, 0xf4, 0xeb, 0x97, 0xaf, 0xee, 0x5a,
0xe4, 0x27, 0xfc, 0x79, 0x36, 0x19, 0x7e, 0x66, 0x5c, 0xf2, 0xa6, 0xdf, 0xdb, 0x37, 0x71, 0x4c, 0xe4, 0xe7, 0x16, 0x34, 0xcc, 0xa8, 0xa1, 0x5a, 0xaa, 0xdc, 0xf8, 0xa4, 0x5a, 0xaa, 0x09, 0xa1,
0x37, 0xec, 0x6b, 0xc6, 0x98, 0xd2, 0xfb, 0xf1, 0x16, 0xef, 0x9d, 0x78, 0x14, 0x31, 0xd9, 0x50, 0xc6, 0x2f, 0xb0, 0x97, 0x4f, 0xd7, 0x1c, 0xa3, 0x97, 0xe2, 0x55, 0x85, 0xdf, 0xae, 0xb7, 0xe4,
0x32, 0x0f, 0x25, 0x4e, 0xee, 0xe4, 0x90, 0x77, 0x52, 0x90, 0x1b, 0xac, 0xfc, 0x86, 0xd5, 0xd8, 0x13, 0xfe, 0x1e, 0xa6, 0x8c, 0xed, 0x13, 0x6d, 0xd7, 0x48, 0x2f, 0xaf, 0xfe, 0x86, 0xe3, 0x1d,
0x6b, 0xd8, 0xd7, 0x9b, 0xf6, 0x3b, 0x13, 0xfb, 0xba, 0x81, 0xb1, 0x3f, 0xd6, 0xe3, 0x23, 0x80, 0xeb, 0xae, 0x45, 0x7e, 0xc2, 0x1f, 0x82, 0x93, 0xe1, 0x67, 0xc6, 0x25, 0x6f, 0xfa, 0xbd, 0x7d,
0xe4, 0x1c, 0x8e, 0xa4, 0xce, 0x81, 0x94, 0x80, 0x67, 0x8f, 0xea, 0x4c, 0x79, 0x91, 0xc7, 0x45, 0x13, 0xc7, 0x74, 0xc3, 0xbe, 0x66, 0x8c, 0x29, 0xbd, 0x1f, 0x6f, 0xf1, 0xde, 0x89, 0xe7, 0x17,
0xac, 0xc6, 0x1f, 0x71, 0x75, 0xf5, 0x48, 0x9e, 0x20, 0xe9, 0x46, 0x89, 0x79, 0x60, 0x66, 0x18, 0x93, 0x0d, 0x25, 0xf3, 0x24, 0xe3, 0xe4, 0x4e, 0x0e, 0x79, 0x27, 0x05, 0xb9, 0xc1, 0xca, 0x6f,
0x25, 0xe9, 0xfa, 0x0d, 0x65, 0xa5, 0x8e, 0xa3, 0x9e, 0xc1, 0xec, 0x41, 0x10, 0xbc, 0x18, 0x8f, 0x58, 0x8d, 0xbd, 0x86, 0x7d, 0xbd, 0x69, 0xbf, 0x33, 0xb1, 0xaf, 0x1b, 0x18, 0xfb, 0x63, 0x3d,
0xd4, 0x99, 0xba, 0x19, 0x96, 0xdf, 0x77, 0xa3, 0xb3, 0x76, 0x6a, 0x14, 0xf6, 0x2a, 0x56, 0xd5, 0x3e, 0x02, 0x48, 0xce, 0xe1, 0x48, 0xea, 0x1c, 0x48, 0x09, 0x78, 0xf6, 0xa8, 0xce, 0x94, 0x17,
0x26, 0x2d, 0xad, 0xaa, 0x8d, 0xaf, 0x93, 0x73, 0xbe, 0x57, 0xc4, 0x85, 0x79, 0xa5, 0x03, 0x55, 0x79, 0x5c, 0xc4, 0x6a, 0xfc, 0x31, 0x57, 0x57, 0x8f, 0xe4, 0x09, 0x92, 0x6e, 0x94, 0x98, 0x07,
0xc7, 0xdb, 0x66, 0x35, 0x86, 0xe6, 0x4b, 0x37, 0x61, 0x58, 0xcf, 0xb2, 0xb7, 0x1b, 0x91, 0xac, 0x66, 0x86, 0x51, 0x92, 0xae, 0xdf, 0x50, 0x56, 0xea, 0x38, 0xea, 0x19, 0xcc, 0x1e, 0x04, 0xc1,
0xf3, 0xae, 0x45, 0x8e, 0xa0, 0xbe, 0x4b, 0xbb, 0x41, 0x8f, 0x8a, 0xd8, 0xf6, 0x42, 0xd2, 0x71, 0x8b, 0xf1, 0x48, 0x9d, 0xa9, 0x9b, 0x61, 0xf9, 0x7d, 0x37, 0x3a, 0x6b, 0xa7, 0x46, 0x61, 0xaf,
0x15, 0x14, 0x6f, 0xcf, 0x1a, 0x40, 0x73, 0x5f, 0x18, 0xb9, 0x97, 0x21, 0xfd, 0x72, 0xe3, 0x6b, 0x62, 0x55, 0x6d, 0xd2, 0xd2, 0xaa, 0xda, 0xf8, 0x26, 0x39, 0xe7, 0x7b, 0x45, 0x5c, 0x98, 0x57,
0x11, 0x35, 0x7f, 0x25, 0xf7, 0x05, 0x79, 0xac, 0x60, 0xec, 0x0b, 0xa9, 0x73, 0x08, 0x63, 0x5f, 0x3a, 0x50, 0x75, 0xbc, 0x6d, 0x56, 0x63, 0x68, 0xbe, 0x74, 0x13, 0x86, 0xf5, 0x2c, 0x7b, 0xbb,
0xc8, 0x9c, 0x43, 0x18, 0x53, 0x2d, 0x8f, 0x35, 0xc8, 0x00, 0xe6, 0x33, 0x47, 0x17, 0x6a, 0x4b, 0x11, 0xc9, 0x3a, 0xef, 0x5a, 0xe4, 0x08, 0xea, 0xbb, 0xb4, 0x8b, 0x69, 0xe6, 0x18, 0xdb, 0x5e,
0x98, 0x74, 0xe0, 0xd1, 0x5e, 0x9d, 0x4c, 0x60, 0xb6, 0xb6, 0x66, 0xb6, 0x76, 0x0c, 0xb3, 0xbb, 0x48, 0x3a, 0xae, 0x82, 0xe2, 0xed, 0x59, 0x03, 0x68, 0xee, 0x0b, 0x23, 0xf7, 0x32, 0xa4, 0x5f,
0x94, 0x4f, 0x16, 0x4f, 0x1a, 0x4c, 0x5d, 0xa2, 0xd1, 0x53, 0x12, 0xd3, 0x0a, 0x1c, 0x71, 0xe6, 0x6d, 0x7c, 0x23, 0xa2, 0xe6, 0xaf, 0xe4, 0xbe, 0x20, 0x8f, 0x15, 0x8c, 0x7d, 0x21, 0x75, 0x0e,
0xc6, 0x8f, 0x19, 0x7b, 0xe4, 0x47, 0x50, 0x7b, 0x48, 0x63, 0x99, 0x25, 0xa8, 0x4c, 0xcf, 0x54, 0x61, 0xec, 0x0b, 0x99, 0x73, 0x08, 0x63, 0xaa, 0xe5, 0xb1, 0x06, 0x19, 0xc0, 0x7c, 0xe6, 0xe8,
0xda, 0x60, 0x3b, 0x27, 0xc9, 0xd0, 0xe4, 0x19, 0xac, 0x6d, 0x83, 0xf6, 0xfa, 0x94, 0x2b, 0xa7, 0x42, 0x6d, 0x09, 0x93, 0x0e, 0x3c, 0xda, 0xab, 0x93, 0x09, 0xcc, 0xd6, 0xd6, 0xcc, 0xd6, 0x8e,
0x8e, 0xd7, 0x7b, 0x45, 0xfe, 0x3c, 0x56, 0xae, 0x52, 0xa4, 0x97, 0xb5, 0xb4, 0x2f, 0xbd, 0xf2, 0x61, 0x76, 0x97, 0xf2, 0xc9, 0xe2, 0x49, 0x83, 0xa9, 0xeb, 0x3a, 0x7a, 0x4a, 0x62, 0x5a, 0x81,
0xb9, 0x14, 0x3c, 0xaf, 0x66, 0x3f, 0xe8, 0x51, 0xcd, 0x04, 0xf2, 0xa1, 0xa6, 0x5d, 0x02, 0x50, 0x23, 0xce, 0xdc, 0xf8, 0x31, 0x63, 0x8f, 0xfc, 0x18, 0x6a, 0x0f, 0x69, 0x2c, 0xb3, 0x04, 0x95,
0x02, 0x94, 0xbd, 0xc6, 0xa1, 0x04, 0x28, 0xe7, 0xce, 0x80, 0x7d, 0x07, 0xdb, 0xb1, 0xc9, 0x6a, 0xe9, 0x99, 0x4a, 0x1b, 0x6c, 0xe7, 0x24, 0x19, 0x9a, 0x3c, 0x83, 0xb5, 0x6d, 0xd0, 0x5e, 0x9f,
0xd2, 0x0e, 0xbf, 0x27, 0x90, 0xb4, 0xb4, 0xf1, 0xb5, 0x3b, 0x8c, 0x5f, 0x91, 0xe7, 0xf8, 0xf6, 0x72, 0xe5, 0xd4, 0xf1, 0x7a, 0xaf, 0xc8, 0x9f, 0xc3, 0xca, 0x55, 0x8a, 0xf4, 0xb2, 0x96, 0xf6,
0x88, 0x9e, 0x09, 0x99, 0xd8, 0xd2, 0xe9, 0xa4, 0x49, 0x35, 0x59, 0x1a, 0xca, 0xb4, 0xaf, 0x79, 0xa5, 0x57, 0x3e, 0x97, 0x82, 0xe7, 0xd5, 0xec, 0x07, 0x3d, 0xaa, 0x99, 0x40, 0x3e, 0xd4, 0xb4,
0x53, 0x68, 0x29, 0x7d, 0x1f, 0xe0, 0x38, 0x0e, 0x46, 0xbb, 0x2e, 0x1d, 0x06, 0x7e, 0xa2, 0x6b, 0x4b, 0x00, 0x4a, 0x80, 0xb2, 0x17, 0x46, 0x94, 0x00, 0xe5, 0xdc, 0x19, 0xb0, 0xef, 0x60, 0x3b,
0x93, 0x3c, 0xbc, 0x44, 0x7f, 0x69, 0xc9, 0x78, 0xe4, 0xb9, 0xe6, 0x7c, 0x18, 0x89, 0xa4, 0x92, 0x36, 0x59, 0x4d, 0xda, 0xe1, 0xf7, 0x04, 0x92, 0x96, 0x36, 0xbe, 0x71, 0x87, 0xf1, 0x2b, 0xf2,
0xb9, 0x26, 0xa6, 0xea, 0xa9, 0x09, 0xc9, 0x49, 0xd7, 0xbb, 0x6b, 0x91, 0x2d, 0x80, 0xe4, 0xec, 0x1c, 0x5f, 0x39, 0xd1, 0x33, 0x21, 0x13, 0x5b, 0x3a, 0x9d, 0x34, 0xa9, 0x26, 0x4b, 0x43, 0x99,
0x4a, 0xb9, 0x12, 0x99, 0x63, 0x31, 0xa5, 0xf6, 0x72, 0x0e, 0xba, 0x8e, 0xa0, 0x9a, 0x1c, 0x86, 0xf6, 0x35, 0x6f, 0x0a, 0x2d, 0xa5, 0x1f, 0x00, 0x1c, 0xc7, 0xc1, 0x68, 0xd7, 0xa5, 0xc3, 0xc0,
0xac, 0x24, 0xb7, 0x5b, 0x8c, 0xa3, 0x13, 0xb5, 0x83, 0x67, 0x8e, 0x28, 0xec, 0x26, 0x4e, 0x15, 0x4f, 0x74, 0x6d, 0x92, 0x87, 0x97, 0xe8, 0x2f, 0x2d, 0x19, 0x8f, 0x3c, 0xd7, 0x9c, 0x0f, 0x23,
0x90, 0x0a, 0x9b, 0x2a, 0x3c, 0x77, 0xf0, 0x60, 0x81, 0x77, 0x50, 0x99, 0x23, 0x98, 0x43, 0x26, 0x91, 0x54, 0x32, 0xd7, 0xc4, 0x54, 0x3d, 0x35, 0x21, 0x39, 0xe9, 0x7a, 0x77, 0x2d, 0xb2, 0x05,
0x47, 0x92, 0x73, 0x4c, 0xa0, 0xa4, 0x39, 0x37, 0xca, 0x6e, 0x44, 0x44, 0x18, 0xb7, 0xf2, 0xfc, 0x90, 0x9c, 0x5d, 0x29, 0x57, 0x22, 0x73, 0x2c, 0xa6, 0xd4, 0x5e, 0xce, 0x41, 0xd7, 0x11, 0x54,
0x35, 0xa6, 0x9a, 0x87, 0x30, 0x9f, 0x09, 0x03, 0x2b, 0x91, 0x9e, 0x14, 0x99, 0x57, 0x22, 0x3d, 0x93, 0xc3, 0x90, 0x95, 0xe4, 0x1e, 0x8d, 0x71, 0x74, 0xa2, 0x76, 0xf0, 0xcc, 0x11, 0x85, 0xdd,
0x31, 0x82, 0x6c, 0x2f, 0x61, 0x93, 0x73, 0x36, 0xa0, 0x07, 0x74, 0xe1, 0xc5, 0xdd, 0x33, 0xd6, 0xc4, 0xa9, 0x02, 0x52, 0x61, 0x53, 0x85, 0xe7, 0x0e, 0x1e, 0x2c, 0xf0, 0x0e, 0x2a, 0x73, 0x04,
0xdc, 0xcf, 0x2c, 0x58, 0xc8, 0x89, 0xf2, 0x92, 0x77, 0xa5, 0x33, 0x3d, 0x31, 0x02, 0xdc, 0xce, 0x73, 0xc8, 0xe4, 0x48, 0x72, 0x8e, 0x09, 0x94, 0x34, 0xe7, 0x46, 0xd9, 0x8d, 0x88, 0x08, 0xe3,
0x0d, 0x02, 0xda, 0xc7, 0xd8, 0xce, 0x63, 0xf2, 0xa9, 0xb1, 0xb1, 0xf1, 0xf8, 0x9b, 0x90, 0xcc, 0x56, 0x9e, 0xbf, 0xc6, 0x54, 0xf3, 0x10, 0xe6, 0x33, 0x61, 0x60, 0x25, 0xd2, 0x93, 0x22, 0xf3,
0xd7, 0x1a, 0x15, 0xb9, 0x16, 0xc5, 0x97, 0xb0, 0xc2, 0x3b, 0xb2, 0x35, 0x18, 0xa4, 0x02, 0x94, 0x4a, 0xa4, 0x27, 0x46, 0x90, 0xed, 0x25, 0x6c, 0x72, 0xce, 0x06, 0xf4, 0x80, 0x2e, 0xbc, 0xb8,
0x37, 0x32, 0x0f, 0xd5, 0x1b, 0x81, 0xd7, 0xf6, 0xe4, 0x87, 0xec, 0x27, 0x98, 0xab, 0xbc, 0xab, 0x7b, 0xc6, 0x9a, 0xfb, 0x99, 0x05, 0x0b, 0x39, 0x51, 0x5e, 0xf2, 0xae, 0x74, 0xa6, 0x27, 0x46,
0x64, 0x0c, 0xcd, 0x74, 0xd0, 0x8f, 0x4c, 0xae, 0xab, 0xfd, 0x8e, 0xe1, 0x16, 0x66, 0x03, 0x85, 0x80, 0xdb, 0xb9, 0x41, 0x40, 0xfb, 0x18, 0xdb, 0x79, 0x4c, 0x3e, 0x33, 0x36, 0x36, 0x1e, 0x7f,
0xf6, 0x1f, 0x60, 0x63, 0xef, 0xd8, 0xed, 0xbc, 0x79, 0xe1, 0x9e, 0x22, 0x5b, 0x8f, 0xbf, 0xa4, 0x13, 0x92, 0xf9, 0x5a, 0xa3, 0x22, 0xd7, 0xa2, 0xf8, 0x0a, 0x56, 0x78, 0x47, 0xb6, 0x06, 0x83,
0x22, 0x94, 0xa9, 0x71, 0xca, 0x06, 0x26, 0x85, 0x54, 0x95, 0x63, 0x9a, 0x1f, 0xe0, 0xbc, 0x85, 0x54, 0x80, 0xf2, 0x46, 0xe6, 0x49, 0x7c, 0x23, 0xf0, 0xda, 0x9e, 0xfc, 0x64, 0xfe, 0x04, 0x73,
0xcd, 0xaf, 0xda, 0x6f, 0xe5, 0x35, 0x1f, 0xf2, 0x4f, 0xb8, 0x8b, 0xba, 0x92, 0x96, 0x6b, 0xd9, 0x95, 0x77, 0x95, 0x8c, 0xa1, 0x99, 0x0e, 0xfa, 0x91, 0xc9, 0x75, 0xb5, 0xdf, 0x31, 0xdc, 0xc2,
0x83, 0xd5, 0xbc, 0xf5, 0x9e, 0xe8, 0x6b, 0xa4, 0xe6, 0x7a, 0xea, 0xae, 0xb5, 0x7d, 0xfb, 0xf3, 0x6c, 0xa0, 0xd0, 0xfe, 0x3d, 0x6c, 0xec, 0x1d, 0xbb, 0x9d, 0x37, 0x2f, 0xdc, 0x53, 0x64, 0xeb,
0x3f, 0xe8, 0x7b, 0xf1, 0xd9, 0xf8, 0x64, 0xbd, 0x1b, 0x0c, 0x37, 0x06, 0x32, 0x44, 0x26, 0x32, 0xf1, 0x17, 0x55, 0x84, 0x32, 0x35, 0x4e, 0xd9, 0xc0, 0xa4, 0x90, 0xaa, 0x72, 0x4c, 0xf3, 0x03,
0x9e, 0x37, 0x06, 0x7e, 0x6f, 0x03, 0xbf, 0x3f, 0x99, 0xc6, 0xff, 0x7b, 0xf1, 0xdd, 0xff, 0x1b, 0x9c, 0xb7, 0xb0, 0xf9, 0x55, 0xfb, 0xad, 0xbc, 0xe6, 0x43, 0xfe, 0x09, 0x77, 0x51, 0x57, 0xd2,
0x00, 0x00, 0xff, 0xff, 0xcc, 0x41, 0x1f, 0x31, 0x29, 0x63, 0x00, 0x00, 0x72, 0x2d, 0x7b, 0xb0, 0x9a, 0xb7, 0xde, 0x13, 0x7d, 0x8d, 0xd4, 0x5c, 0x4f, 0xdd, 0xb5, 0xb6,
0x6f, 0x7f, 0xf1, 0x7b, 0x7d, 0x2f, 0x3e, 0x1b, 0x9f, 0xac, 0x77, 0x83, 0xe1, 0xc6, 0x40, 0x86,
0xc8, 0x44, 0xc6, 0xf3, 0xc6, 0xc0, 0xef, 0x6d, 0xe0, 0xf7, 0x27, 0xd3, 0xf8, 0x1f, 0x36, 0xbe,
0xff, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x82, 0x63, 0x17, 0xa9, 0x93, 0x63, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.

@ -1645,9 +1645,9 @@ message QueryRoutesRequest {
repeated bytes ignored_nodes = 6; repeated bytes ignored_nodes = 6;
/** /**
A list of edges to ignore during path finding. Deprecated. A list of edges to ignore during path finding.
*/ */
repeated EdgeLocator ignored_edges = 7; repeated EdgeLocator ignored_edges = 7 [deprecated = true];
/** /**
The source node where the request route should originated from. If empty, The source node where the request route should originated from. If empty,
@ -1660,6 +1660,19 @@ message QueryRoutesRequest {
the optimal route. the optimal route.
*/ */
bool use_mission_control = 9; bool use_mission_control = 9;
/**
A list of directed node pairs that will be ignored during path finding.
*/
repeated NodePair ignored_pairs = 10;
}
message NodePair {
/// The sending node of the pair.
bytes from = 1;
/// The receiving node of the pair.
bytes to = 2;
} }
message EdgeLocator { message EdgeLocator {

@ -9543,6 +9543,17 @@ func testBidirectionalAsyncPayments(net *lntest.NetworkHarness, t *harnessTest)
"timeout: %v", err) "timeout: %v", err)
} }
// Reset mission control to prevent previous payment results from
// interfering with this test. A new channel has been opened, but
// mission control operates on node pairs.
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
_, err = net.Alice.RouterClient.ResetMissionControl(
ctxt, &routerrpc.ResetMissionControlRequest{},
)
if err != nil {
t.Fatalf("unable to reset mc for alice: %v", err)
}
// Open up a payment streams to Alice and to Bob, that we'll use to // Open up a payment streams to Alice and to Bob, that we'll use to
// send payment between nodes. // send payment between nodes.
ctx, cancel := context.WithTimeout(ctxb, lntest.AsyncBenchmarkTimeout) ctx, cancel := context.WithTimeout(ctxb, lntest.AsyncBenchmarkTimeout)

@ -55,7 +55,11 @@ const (
// since the last failure is used to estimate a success probability that is fed // since the last failure is used to estimate a success probability that is fed
// into the path finding process for subsequent payment attempts. // into the path finding process for subsequent payment attempts.
type MissionControl struct { type MissionControl struct {
history map[route.Vertex]*nodeHistory // lastPairFailure tracks the last payment failure per node pair.
lastPairFailure map[DirectedNodePair]pairFailure
// lastNodeFailure tracks the last node level failure per node.
lastNodeFailure map[route.Vertex]time.Time
// lastSecondChance tracks the last time a second chance was granted for // lastSecondChance tracks the last time a second chance was granted for
// a directed node pair. // a directed node pair.
@ -93,22 +97,10 @@ type MissionControlConfig struct {
MaxMcHistory int MaxMcHistory int
} }
// nodeHistory contains a summary of payment attempt outcomes involving a // pairFailure describes a payment failure for a node pair.
// particular node. type pairFailure struct {
type nodeHistory struct { // timestamp is the time when this failure result was obtained.
// lastFail is the last time a node level failure occurred, if any. timestamp time.Time
lastFail *time.Time
// channelLastFail tracks history per channel, if available for that
// channel.
channelLastFail map[uint64]*channelHistory
}
// channelHistory contains a summary of payment attempt outcomes involving a
// particular channel.
type channelHistory struct {
// lastFail is the last time a channel level failure occurred.
lastFail time.Time
// minPenalizeAmt is the minimum amount for which to take this failure // minPenalizeAmt is the minimum amount for which to take this failure
// into account. // into account.
@ -120,6 +112,10 @@ type channelHistory struct {
type MissionControlSnapshot struct { type MissionControlSnapshot struct {
// Nodes contains the per node information of this snapshot. // Nodes contains the per node information of this snapshot.
Nodes []MissionControlNodeSnapshot Nodes []MissionControlNodeSnapshot
// Pairs is a list of channels for which specific information is
// logged.
Pairs []MissionControlPairSnapshot
} }
// MissionControlNodeSnapshot contains a snapshot of the current node state in // MissionControlNodeSnapshot contains a snapshot of the current node state in
@ -128,23 +124,19 @@ type MissionControlNodeSnapshot struct {
// Node pubkey. // Node pubkey.
Node route.Vertex Node route.Vertex
// Lastfail is the time of last failure, if any. // LastFail is the time of last failure.
LastFail *time.Time LastFail time.Time
// Channels is a list of channels for which specific information is // OtherSuccessProb is the success probability for pairs not in
// logged. // the Pairs slice.
Channels []MissionControlChannelSnapshot OtherSuccessProb float64
// OtherChanSuccessProb is the success probability for channels not in
// the Channels slice.
OtherChanSuccessProb float64
} }
// MissionControlChannelSnapshot contains a snapshot of the current channel // MissionControlPairSnapshot contains a snapshot of the current node pair
// state in mission control. // state in mission control.
type MissionControlChannelSnapshot struct { type MissionControlPairSnapshot struct {
// ChannelID is the short channel id of the snapshot. // Pair is the node pair of which the state is described.
ChannelID uint64 Pair DirectedNodePair
// LastFail is the time of last failure. // LastFail is the time of last failure.
LastFail time.Time LastFail time.Time
@ -182,7 +174,8 @@ func NewMissionControl(db *bbolt.DB, cfg *MissionControlConfig) (
} }
mc := &MissionControl{ mc := &MissionControl{
history: make(map[route.Vertex]*nodeHistory), lastPairFailure: make(map[DirectedNodePair]pairFailure),
lastNodeFailure: make(map[route.Vertex]time.Time),
lastSecondChance: make(map[DirectedNodePair]time.Time), lastSecondChance: make(map[DirectedNodePair]time.Time),
now: time.Now, now: time.Now,
cfg: cfg, cfg: cfg,
@ -227,7 +220,8 @@ func (m *MissionControl) ResetHistory() error {
return err return err
} }
m.history = make(map[route.Vertex]*nodeHistory) m.lastPairFailure = make(map[DirectedNodePair]pairFailure)
m.lastNodeFailure = make(map[route.Vertex]time.Time)
m.lastSecondChance = make(map[DirectedNodePair]time.Time) m.lastSecondChance = make(map[DirectedNodePair]time.Time)
log.Debugf("Mission control history cleared") log.Debugf("Mission control history cleared")
@ -235,59 +229,24 @@ func (m *MissionControl) ResetHistory() error {
return nil return nil
} }
// GetEdgeProbability is expected to return the success probability of a payment // GetProbability is expected to return the success probability of a payment
// from fromNode along edge. // from fromNode along edge.
func (m *MissionControl) GetEdgeProbability(fromNode route.Vertex, func (m *MissionControl) GetProbability(fromNode, toNode route.Vertex,
edge EdgeLocator, amt lnwire.MilliSatoshi) float64 { amt lnwire.MilliSatoshi) float64 {
m.Lock() m.Lock()
defer m.Unlock() defer m.Unlock()
// Get the history for this node. If there is no history available, return m.getPairProbability(fromNode, toNode, amt)
// assume that it's success probability is a constant a priori
// probability. After the attempt new information becomes available to
// adjust this probability.
nodeHistory, ok := m.history[fromNode]
if !ok {
return m.cfg.AprioriHopProbability
}
return m.getEdgeProbabilityForNode(nodeHistory, edge.ChannelID, amt)
} }
// getEdgeProbabilityForNode estimates the probability of successfully // getProbAfterFail returns a probability estimate based on a last failure time.
// traversing a channel based on the node history. func (m *MissionControl) getProbAfterFail(lastFailure time.Time) float64 {
func (m *MissionControl) getEdgeProbabilityForNode(nodeHistory *nodeHistory, if lastFailure.IsZero() {
channelID uint64, amt lnwire.MilliSatoshi) float64 {
// Calculate the last failure of the given edge. A node failure is
// considered a failure that would have affected every edge. Therefore
// we insert a node level failure into the history of every channel.
lastFailure := nodeHistory.lastFail
// Take into account a minimum penalize amount. For balance errors, a
// failure may be reported with such a minimum to prevent too aggresive
// penalization. We only take into account a previous failure if the
// amount that we currently get the probability for is greater or equal
// than the minPenalizeAmt of the previous failure.
channelHistory, ok := nodeHistory.channelLastFail[channelID]
if ok && channelHistory.minPenalizeAmt <= amt {
// If there is both a node level failure recorded and a channel
// level failure is applicable too, we take the most recent of
// the two.
if lastFailure == nil ||
channelHistory.lastFail.After(*lastFailure) {
lastFailure = &channelHistory.lastFail
}
}
if lastFailure == nil {
return m.cfg.AprioriHopProbability return m.cfg.AprioriHopProbability
} }
timeSinceLastFailure := m.now().Sub(*lastFailure) timeSinceLastFailure := m.now().Sub(lastFailure)
// Calculate success probability. It is an exponential curve that brings // Calculate success probability. It is an exponential curve that brings
// the probability down to zero when a failure occurs. From there it // the probability down to zero when a failure occurs. From there it
@ -299,6 +258,39 @@ func (m *MissionControl) getEdgeProbabilityForNode(nodeHistory *nodeHistory,
return probability return probability
} }
// getPairProbability estimates the probability of successfully
// traversing from fromNode to toNode based on historical payment outcomes.
func (m *MissionControl) getPairProbability(fromNode,
toNode route.Vertex, amt lnwire.MilliSatoshi) float64 {
// Start by getting the last node level failure. A node failure is
// considered a failure that would have affected every edge. Therefore
// we insert a node level failure into the history of every channel. If
// there is none, lastFail will be zero.
lastFail := m.lastNodeFailure[fromNode]
// Retrieve the last pair outcome.
pair := NewDirectedNodePair(fromNode, toNode)
lastPairResult, ok := m.lastPairFailure[pair]
// Only look at the last pair outcome if it happened after the last node
// level failure. Otherwise the node level failure is the most recent
// and used as the basis for calculation of the probability.
if ok && lastPairResult.timestamp.After(lastFail) {
// Take into account a minimum penalize amount. For balance
// errors, a failure may be reported with such a minimum to
// prevent too aggresive penalization. We only take into account
// a previous failure if the amount that we currently get the
// probability for is greater or equal than the minPenalizeAmt
// of the previous failure.
if amt >= lastPairResult.minPenalizeAmt {
lastFail = lastPairResult.timestamp
}
}
return m.getProbAfterFail(lastFail)
}
// requestSecondChance checks whether the node fromNode can have a second chance // requestSecondChance checks whether the node fromNode can have a second chance
// at providing a channel update for its channel with toNode. // at providing a channel update for its channel with toNode.
func (m *MissionControl) requestSecondChance(timestamp time.Time, func (m *MissionControl) requestSecondChance(timestamp time.Time,
@ -330,21 +322,6 @@ func (m *MissionControl) requestSecondChance(timestamp time.Time,
return false return false
} }
// createHistoryIfNotExists returns the history for the given node. If the node
// is yet unknown, it will create an empty history structure.
func (m *MissionControl) createHistoryIfNotExists(vertex route.Vertex) *nodeHistory {
if node, ok := m.history[vertex]; ok {
return node
}
node := &nodeHistory{
channelLastFail: make(map[uint64]*channelHistory),
}
m.history[vertex] = node
return node
}
// reportVertexFailure reports a node level failure. // reportVertexFailure reports a node level failure.
func (m *MissionControl) reportVertexFailure(timestamp time.Time, func (m *MissionControl) reportVertexFailure(timestamp time.Time,
v route.Vertex) { v route.Vertex) {
@ -354,13 +331,12 @@ func (m *MissionControl) reportVertexFailure(timestamp time.Time,
m.Lock() m.Lock()
defer m.Unlock() defer m.Unlock()
history := m.createHistoryIfNotExists(v) m.lastNodeFailure[v] = timestamp
history.lastFail = &timestamp
} }
// reportEdgePolicyFailure reports a policy related failure. // reportPairPolicyFailure reports a policy related failure.
func (m *MissionControl) reportEdgePolicyFailure(timestamp time.Time, func (m *MissionControl) reportPairPolicyFailure(timestamp time.Time,
failedEdge edge) { failedPair DirectedNodePair) {
m.Lock() m.Lock()
defer m.Unlock() defer m.Unlock()
@ -369,31 +345,29 @@ func (m *MissionControl) reportEdgePolicyFailure(timestamp time.Time,
// immediately. If some time has passed since the last policy failure, // immediately. If some time has passed since the last policy failure,
// we grant the node a second chance at forwarding the payment. // we grant the node a second chance at forwarding the payment.
if m.requestSecondChance( if m.requestSecondChance(
timestamp, failedEdge.from, failedEdge.to, timestamp, failedPair.From, failedPair.To,
) { ) {
return return
} }
history := m.createHistoryIfNotExists(failedEdge.from) m.lastNodeFailure[failedPair.From] = timestamp
history.lastFail = &timestamp
} }
// reportEdgeFailure reports a channel level failure. // reportPairFailure reports a pair level failure.
// //
// TODO(roasbeef): also add value attempted to send and capacity of channel // TODO(roasbeef): also add value attempted to send and capacity of channel
func (m *MissionControl) reportEdgeFailure(timestamp time.Time, failedEdge edge, func (m *MissionControl) reportPairFailure(timestamp time.Time,
minPenalizeAmt lnwire.MilliSatoshi) { failedPair DirectedNodePair, minPenalizeAmt lnwire.MilliSatoshi) {
log.Debugf("Reporting channel %v failure to Mission Control", log.Debugf("Reporting pair %v failure to Mission Control", failedPair)
failedEdge.channel)
m.Lock() m.Lock()
defer m.Unlock() defer m.Unlock()
history := m.createHistoryIfNotExists(failedEdge.from) pair := NewDirectedNodePair(failedPair.From, failedPair.To)
history.channelLastFail[failedEdge.channel] = &channelHistory{ m.lastPairFailure[pair] = pairFailure{
lastFail: timestamp,
minPenalizeAmt: minPenalizeAmt, minPenalizeAmt: minPenalizeAmt,
timestamp: timestamp,
} }
} }
@ -404,46 +378,40 @@ func (m *MissionControl) GetHistorySnapshot() *MissionControlSnapshot {
defer m.Unlock() defer m.Unlock()
log.Debugf("Requesting history snapshot from mission control: "+ log.Debugf("Requesting history snapshot from mission control: "+
"node_count=%v", len(m.history)) "node_failure_count=%v, pair_result_count=%v",
len(m.lastNodeFailure), len(m.lastPairFailure))
nodes := make([]MissionControlNodeSnapshot, 0, len(m.history)) nodes := make([]MissionControlNodeSnapshot, 0, len(m.lastNodeFailure))
for v, h := range m.lastNodeFailure {
otherProb := m.getPairProbability(v, route.Vertex{}, 0)
for v, h := range m.history { nodes = append(nodes, MissionControlNodeSnapshot{
channelSnapshot := make([]MissionControlChannelSnapshot, 0, Node: v,
len(h.channelLastFail), LastFail: h,
) OtherSuccessProb: otherProb,
})
}
for id, lastFail := range h.channelLastFail { pairs := make([]MissionControlPairSnapshot, 0, len(m.lastPairFailure))
// Show probability assuming amount meets min
// penalization amount.
prob := m.getEdgeProbabilityForNode(
h, id, lastFail.minPenalizeAmt,
)
channelSnapshot = append(channelSnapshot, for v, h := range m.lastPairFailure {
MissionControlChannelSnapshot{ // Show probability assuming amount meets min
ChannelID: id, // penalization amount.
LastFail: lastFail.lastFail, prob := m.getPairProbability(v.From, v.To, h.minPenalizeAmt)
MinPenalizeAmt: lastFail.minPenalizeAmt,
SuccessProb: prob, pair := MissionControlPairSnapshot{
}, Pair: v,
) MinPenalizeAmt: h.minPenalizeAmt,
LastFail: h.timestamp,
SuccessProb: prob,
} }
otherProb := m.getEdgeProbabilityForNode(h, 0, 0) pairs = append(pairs, pair)
nodes = append(nodes,
MissionControlNodeSnapshot{
Node: v,
LastFail: h.lastFail,
OtherChanSuccessProb: otherProb,
Channels: channelSnapshot,
},
)
} }
snapshot := MissionControlSnapshot{ snapshot := MissionControlSnapshot{
Nodes: nodes, Nodes: nodes,
Pairs: pairs,
} }
return &snapshot return &snapshot
@ -518,7 +486,7 @@ func (m *MissionControl) applyPaymentResult(result *paymentResult) (
// Always determine chan id ourselves, because a channel update with id // Always determine chan id ourselves, because a channel update with id
// may not be available. // may not be available.
failedEdge, failedAmt := getFailedEdge( failedPair, failedAmt := getFailedPair(
result.route, failureSourceIdxInt, result.route, failureSourceIdxInt,
) )
@ -598,35 +566,35 @@ func (m *MissionControl) applyPaymentResult(result *paymentResult) (
// amount, we'll apply the new minimum amount and retry // amount, we'll apply the new minimum amount and retry
// routing. // routing.
case *lnwire.FailAmountBelowMinimum: case *lnwire.FailAmountBelowMinimum:
m.reportEdgePolicyFailure(result.timeReply, failedEdge) m.reportPairPolicyFailure(result.timeReply, failedPair)
return false, 0 return false, 0
// If we get a failure due to a fee, we'll apply the // If we get a failure due to a fee, we'll apply the
// new fee update, and retry our attempt using the // new fee update, and retry our attempt using the
// newly updated fees. // newly updated fees.
case *lnwire.FailFeeInsufficient: case *lnwire.FailFeeInsufficient:
m.reportEdgePolicyFailure(result.timeReply, failedEdge) m.reportPairPolicyFailure(result.timeReply, failedPair)
return false, 0 return false, 0
// If we get the failure for an intermediate node that // If we get the failure for an intermediate node that
// disagrees with our time lock values, then we'll // disagrees with our time lock values, then we'll
// apply the new delta value and try it once more. // apply the new delta value and try it once more.
case *lnwire.FailIncorrectCltvExpiry: case *lnwire.FailIncorrectCltvExpiry:
m.reportEdgePolicyFailure(result.timeReply, failedEdge) m.reportPairPolicyFailure(result.timeReply, failedPair)
return false, 0 return false, 0
// The outgoing channel that this node was meant to // The outgoing channel that this node was meant to
// forward one is currently disabled, so we'll apply // forward one is currently disabled, so we'll apply
// the update and continue. // the update and continue.
case *lnwire.FailChannelDisabled: case *lnwire.FailChannelDisabled:
m.reportEdgeFailure(result.timeReply, failedEdge, 0) m.reportPairFailure(result.timeReply, failedPair, 0)
return false, 0 return false, 0
// It's likely that the outgoing channel didn't have // It's likely that the outgoing channel didn't have
// sufficient capacity, so we'll prune this edge for // sufficient capacity, so we'll prune this pair for
// now, and continue onwards with our path finding. // now, and continue onwards with our path finding.
case *lnwire.FailTemporaryChannelFailure: case *lnwire.FailTemporaryChannelFailure:
m.reportEdgeFailure(result.timeReply, failedEdge, failedAmt) m.reportPairFailure(result.timeReply, failedPair, failedAmt)
return false, 0 return false, 0
// If the send fail due to a node not having the // If the send fail due to a node not having the
@ -651,7 +619,7 @@ func (m *MissionControl) applyPaymentResult(result *paymentResult) (
// returning errors in order to attempt to black list // returning errors in order to attempt to black list
// another node. // another node.
case *lnwire.FailUnknownNextPeer: case *lnwire.FailUnknownNextPeer:
m.reportEdgeFailure(result.timeReply, failedEdge, 0) m.reportPairFailure(result.timeReply, failedPair, 0)
return false, 0 return false, 0
// If the node wasn't able to forward for which ever // If the node wasn't able to forward for which ever
@ -682,12 +650,10 @@ func (m *MissionControl) applyPaymentResult(result *paymentResult) (
// we'll prune the channel in both directions and // we'll prune the channel in both directions and
// continue with the rest of the routes. // continue with the rest of the routes.
case *lnwire.FailPermanentChannelFailure: case *lnwire.FailPermanentChannelFailure:
m.reportEdgeFailure(result.timeReply, failedEdge, 0) m.reportPairFailure(result.timeReply, failedPair, 0)
m.reportEdgeFailure(result.timeReply, edge{ m.reportPairFailure(
from: failedEdge.to, result.timeReply, failedPair.Reverse(), 0,
to: failedEdge.from, )
channel: failedEdge.channel,
}, 0)
return false, 0 return false, 0
// Any other failure or an empty failure will get the node pruned. // Any other failure or an empty failure will get the node pruned.
@ -697,11 +663,11 @@ func (m *MissionControl) applyPaymentResult(result *paymentResult) (
} }
} }
// getFailedEdge tries to locate the failing channel given a route and the // getFailedPair tries to locate the failing pair given a route and the pubkey
// pubkey of the node that sent the failure. It will assume that the failure is // of the node that sent the failure. It will assume that the failure is
// associated with the outgoing channel of the failing node. As a second result, // associated with the outgoing channel set of the failing node. As a second
// it returns the amount sent over the edge. // result, it returns the amount sent between the pair.
func getFailedEdge(route *route.Route, failureSource int) (edge, func getFailedPair(route *route.Route, failureSource int) (DirectedNodePair,
lnwire.MilliSatoshi) { lnwire.MilliSatoshi) {
// Determine if we have a failure from the final hop. If it is, we // Determine if we have a failure from the final hop. If it is, we
@ -718,16 +684,14 @@ func getFailedEdge(route *route.Route, failureSource int) (edge,
// this HTLC (for w/e reason), we'll return the _outgoing_ channel that // this HTLC (for w/e reason), we'll return the _outgoing_ channel that
// the source of the failure was meant to pass the HTLC along to. // the source of the failure was meant to pass the HTLC along to.
if failureSource == 0 { if failureSource == 0 {
return edge{ return NewDirectedNodePair(
from: route.SourcePubKey, route.SourcePubKey,
to: route.Hops[0].PubKeyBytes, route.Hops[0].PubKeyBytes,
channel: route.Hops[0].ChannelID, ), route.TotalAmount
}, route.TotalAmount
} }
return edge{ return NewDirectedNodePair(
from: route.Hops[failureSource-1].PubKeyBytes, route.Hops[failureSource-1].PubKeyBytes,
to: route.Hops[failureSource].PubKeyBytes, route.Hops[failureSource].PubKeyBytes,
channel: route.Hops[failureSource].ChannelID, ), route.Hops[failureSource-1].AmtToForward
}, route.Hops[failureSource-1].AmtToForward
} }

@ -12,10 +12,6 @@ import (
) )
var ( var (
mcTestEdge = EdgeLocator{
ChannelID: 2,
}
mcTestRoute = &route.Route{ mcTestRoute = &route.Route{
SourcePubKey: route.Vertex{10}, SourcePubKey: route.Vertex{10},
Hops: []*route.Hop{ Hops: []*route.Hop{
@ -94,14 +90,13 @@ func (ctx *mcTestContext) cleanup() {
} }
// Assert that mission control returns a probability for an edge. // Assert that mission control returns a probability for an edge.
func (ctx *mcTestContext) expectP(amt lnwire.MilliSatoshi, func (ctx *mcTestContext) expectP(amt lnwire.MilliSatoshi, expected float64) {
expected float64) {
ctx.t.Helper() ctx.t.Helper()
p := ctx.mc.GetEdgeProbability(mcTestNode1, mcTestEdge, amt) p := ctx.mc.GetProbability(mcTestNode1, mcTestNode2, amt)
if p != expected { if p != expected {
ctx.t.Fatalf("unexpected probability %v", p) ctx.t.Fatalf("expected probability %v but got %v", expected, p)
} }
} }
@ -175,7 +170,7 @@ func TestMissionControl(t *testing.T) {
t.Fatal("unexpected number of nodes") t.Fatal("unexpected number of nodes")
} }
if len(history.Nodes[0].Channels) != 1 { if len(history.Pairs) != 1 {
t.Fatal("unexpected number of channels") t.Fatal("unexpected number of channels")
} }
} }
@ -184,7 +179,6 @@ func TestMissionControl(t *testing.T) {
// penalizing the channel yet. // penalizing the channel yet.
func TestMissionControlChannelUpdate(t *testing.T) { func TestMissionControlChannelUpdate(t *testing.T) {
ctx := createMcTestContext(t) ctx := createMcTestContext(t)
defer ctx.cleanup()
// Report a policy related failure. Because it is the first, we don't // Report a policy related failure. Because it is the first, we don't
// expect a penalty. // expect a penalty.

@ -105,15 +105,7 @@ func (m *mockMissionControl) ReportPaymentFail(paymentID uint64,
return false, 0, nil return false, 0, nil
} }
func (m *mockMissionControl) ReportEdgeFailure(failedEdge edge, func (m *mockMissionControl) GetProbability(fromNode, toNode route.Vertex,
minPenalizeAmt lnwire.MilliSatoshi) {
}
func (m *mockMissionControl) ReportEdgePolicyFailure(failedEdge edge) {}
func (m *mockMissionControl) ReportVertexFailure(v route.Vertex) {}
func (m *mockMissionControl) GetEdgeProbability(fromNode route.Vertex, edge EdgeLocator,
amt lnwire.MilliSatoshi) float64 { amt lnwire.MilliSatoshi) float64 {
return 0 return 0
@ -138,12 +130,6 @@ func (m *mockPaymentSession) RequestRoute(payment *LightningPayment,
return r, nil return r, nil
} }
func (m *mockPaymentSession) ReportVertexFailure(v route.Vertex) {}
func (m *mockPaymentSession) ReportEdgeFailure(failedEdge edge, minPenalizeAmt lnwire.MilliSatoshi) {}
func (m *mockPaymentSession) ReportEdgePolicyFailure(failedEdge edge) {}
type mockPayer struct { type mockPayer struct {
sendResult chan error sendResult chan error
paymentResultErr chan error paymentResultErr chan error

@ -1,6 +1,8 @@
package routing package routing
import ( import (
"fmt"
"github.com/lightningnetwork/lnd/routing/route" "github.com/lightningnetwork/lnd/routing/route"
) )
@ -8,3 +10,21 @@ import (
type DirectedNodePair struct { type DirectedNodePair struct {
From, To route.Vertex From, To route.Vertex
} }
// NewDirectedNodePair instantiates a new DirectedNodePair struct.
func NewDirectedNodePair(from, to route.Vertex) DirectedNodePair {
return DirectedNodePair{
From: from,
To: to,
}
}
// String converts a node pair to its human readable representation.
func (d DirectedNodePair) String() string {
return fmt.Sprintf("%v -> %v", d.From, d.To)
}
// Reverse returns a reversed copy of the pair.
func (d DirectedNodePair) Reverse() DirectedNodePair {
return DirectedNodePair{From: d.To, To: d.From}
}

@ -246,7 +246,7 @@ type graphParams struct {
type RestrictParams struct { type RestrictParams struct {
// ProbabilitySource is a callback that is expected to return the // ProbabilitySource is a callback that is expected to return the
// success probability of traversing the channel from the node. // success probability of traversing the channel from the node.
ProbabilitySource func(route.Vertex, EdgeLocator, ProbabilitySource func(route.Vertex, route.Vertex,
lnwire.MilliSatoshi) float64 lnwire.MilliSatoshi) float64
// FeeLimit is a maximum fee amount allowed to be used on the path from // FeeLimit is a maximum fee amount allowed to be used on the path from
@ -401,14 +401,12 @@ func findPath(g *graphParams, r *RestrictParams, cfg *PathFindingConfig,
amountToSend := toNodeDist.amountToReceive amountToSend := toNodeDist.amountToReceive
// Request the success probability for this edge. // Request the success probability for this edge.
locator := newEdgeLocator(edge)
edgeProbability := r.ProbabilitySource( edgeProbability := r.ProbabilitySource(
fromVertex, *locator, amountToSend, fromVertex, toNode, amountToSend,
) )
log.Tracef("path finding probability: fromnode=%v, chanid=%v, "+ log.Tracef("path finding probability: fromnode=%v, tonode=%v, "+
"probability=%v", fromVertex, locator.ChannelID, "probability=%v", fromVertex, toNode, edgeProbability)
edgeProbability)
// If the probability is zero, there is no point in trying. // If the probability is zero, there is no point in trying.
if edgeProbability == 0 { if edgeProbability == 0 {

@ -77,7 +77,7 @@ var (
// noProbabilitySource is used in testing to return the same probability 1 for // noProbabilitySource is used in testing to return the same probability 1 for
// all edges. // all edges.
func noProbabilitySource(route.Vertex, EdgeLocator, lnwire.MilliSatoshi) float64 { func noProbabilitySource(route.Vertex, route.Vertex, lnwire.MilliSatoshi) float64 {
return 1 return 1
} }
@ -2156,6 +2156,8 @@ func testProbabilityRouting(t *testing.T, p10, p11, p20, minProbability float64,
} }
defer testGraphInstance.cleanUp() defer testGraphInstance.cleanUp()
alias := testGraphInstance.aliasMap
sourceNode, err := testGraphInstance.graph.SourceNode() sourceNode, err := testGraphInstance.graph.SourceNode()
if err != nil { if err != nil {
t.Fatalf("unable to fetch source node: %v", err) t.Fatalf("unable to fetch source node: %v", err)
@ -2166,19 +2168,19 @@ func testProbabilityRouting(t *testing.T, p10, p11, p20, minProbability float64,
target := testGraphInstance.aliasMap["target"] target := testGraphInstance.aliasMap["target"]
// Configure a probability source with the test parameters. // Configure a probability source with the test parameters.
probabilitySource := func(node route.Vertex, edge EdgeLocator, probabilitySource := func(fromNode, toNode route.Vertex,
amt lnwire.MilliSatoshi) float64 { amt lnwire.MilliSatoshi) float64 {
if amt == 0 { if amt == 0 {
t.Fatal("expected non-zero amount") t.Fatal("expected non-zero amount")
} }
switch edge.ChannelID { switch {
case 10: case fromNode == alias["a1"] && toNode == alias["a2"]:
return p10 return p10
case 11: case fromNode == alias["a2"] && toNode == alias["target"]:
return p11 return p11
case 20: case fromNode == alias["b"] && toNode == alias["target"]:
return p20 return p20
default: default:
return 1 return 1

@ -91,7 +91,7 @@ func (p *paymentSession) RequestRoute(payment *LightningPayment,
ss := p.sessionSource ss := p.sessionSource
restrictions := &RestrictParams{ restrictions := &RestrictParams{
ProbabilitySource: ss.MissionControl.GetEdgeProbability, ProbabilitySource: ss.MissionControl.GetProbability,
FeeLimit: payment.FeeLimit, FeeLimit: payment.FeeLimit,
OutgoingChannelID: payment.OutgoingChannelID, OutgoingChannelID: payment.OutgoingChannelID,
CltvLimit: cltvLimit, CltvLimit: cltvLimit,

@ -11,13 +11,16 @@ import (
"github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/lnwire"
) )
// VertexSize is the size of the array to store a vertex.
const VertexSize = 33
// ErrNoRouteHopsProvided is returned when a caller attempts to construct a new // ErrNoRouteHopsProvided is returned when a caller attempts to construct a new
// sphinx packet, but provides an empty set of hops for each route. // sphinx packet, but provides an empty set of hops for each route.
var ErrNoRouteHopsProvided = fmt.Errorf("empty route hops provided") var ErrNoRouteHopsProvided = fmt.Errorf("empty route hops provided")
// Vertex is a simple alias for the serialization of a compressed Bitcoin // Vertex is a simple alias for the serialization of a compressed Bitcoin
// public key. // public key.
type Vertex [33]byte type Vertex [VertexSize]byte
// NewVertex returns a new Vertex given a public key. // NewVertex returns a new Vertex given a public key.
func NewVertex(pub *btcec.PublicKey) Vertex { func NewVertex(pub *btcec.PublicKey) Vertex {
@ -26,6 +29,20 @@ func NewVertex(pub *btcec.PublicKey) Vertex {
return v return v
} }
// NewVertexFromBytes returns a new Vertex based on a serialized pubkey in a
// byte slice.
func NewVertexFromBytes(b []byte) (Vertex, error) {
vertexLen := len(b)
if vertexLen != VertexSize {
return Vertex{}, fmt.Errorf("invalid vertex length of %v, "+
"want %v", vertexLen, VertexSize)
}
var v Vertex
copy(v[:], b)
return v, nil
}
// String returns a human readable version of the Vertex which is the // String returns a human readable version of the Vertex which is the
// hex-encoding of the serialized compressed public key. // hex-encoding of the serialized compressed public key.
func (v Vertex) String() string { func (v Vertex) String() string {

@ -182,9 +182,9 @@ type MissionController interface {
failureSourceIdx *int, failure lnwire.FailureMessage) (bool, failureSourceIdx *int, failure lnwire.FailureMessage) (bool,
channeldb.FailureReason, error) channeldb.FailureReason, error)
// GetEdgeProbability is expected to return the success probability of a // GetProbability is expected to return the success probability of a
// payment from fromNode along edge. // payment from fromNode along edge.
GetEdgeProbability(fromNode route.Vertex, edge EdgeLocator, GetProbability(fromNode, toNode route.Vertex,
amt lnwire.MilliSatoshi) float64 amt lnwire.MilliSatoshi) float64
} }
@ -350,13 +350,6 @@ func (e *EdgeLocator) String() string {
return fmt.Sprintf("%v:%v", e.ChannelID, e.Direction) return fmt.Sprintf("%v:%v", e.ChannelID, e.Direction)
} }
// edge is a combination of a channel and the node pubkeys of both of its
// endpoints.
type edge struct {
from, to route.Vertex
channel uint64
}
// ChannelRouter is the layer 3 router within the Lightning stack. Below the // ChannelRouter is the layer 3 router within the Lightning stack. Below the
// ChannelRouter is the HtlcSwitch, and below that is the Bitcoin blockchain // ChannelRouter is the HtlcSwitch, and below that is the Bitcoin blockchain
// itself. The primary role of the ChannelRouter is to respond to queries for // itself. The primary role of the ChannelRouter is to respond to queries for

@ -2960,6 +2960,7 @@ func TestRouterPaymentStateMachine(t *testing.T) {
ChainView: chainView, ChainView: chainView,
Control: control, Control: control,
SessionSource: &mockPaymentSessionSource{}, SessionSource: &mockPaymentSessionSource{},
MissionControl: &mockMissionControl{},
Payer: payer, Payer: payer,
ChannelPruneExpiry: time.Hour * 24, ChannelPruneExpiry: time.Hour * 24,
GraphPruneInterval: time.Hour * 2, GraphPruneInterval: time.Hour * 2,