routerrpc: add mission control import

This commit is contained in:
carla committed 2021-03-18 10:51:45 +02:00
1 parent 22491ad567
commit d0e7164c07
9 files changed
+709 -212

No files matched your search

+3
View File
@@ -215,6 +215,9 @@ http:
body: "*"
- selector: routerrpc.Router.QueryProbability
get: "/v2/router/mc/probability/{from_node}/{to_node}/{amt_msat}"
- selector: routerrpc.Router.XImportMissionControl
post: "/v2/router/ximporthistory"
body: "*"
- selector: routerrpc.Router.BuildRoute
post: "/v2/router/route"
body: "*"
+333 -211
View File
@@ -253,7 +253,7 @@ func (x HtlcEvent_EventType) String() string {
}
func (HtlcEvent_EventType) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{22, 0}
return fileDescriptor_7a0613f69d37b0a5, []int{24, 0}
}
type SendPaymentRequest struct {
@@ -923,6 +923,77 @@ func (m *QueryMissionControlResponse) GetPairs() []*PairHistory {
return nil
}
type XImportMissionControlRequest struct {
// Node pair-level mission control state to be imported.
Pairs []*PairHistory `protobuf:"bytes,1,rep,name=pairs,proto3" json:"pairs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *XImportMissionControlRequest) Reset() { *m = XImportMissionControlRequest{} }
func (m *XImportMissionControlRequest) String() string { return proto.CompactTextString(m) }
func (*XImportMissionControlRequest) ProtoMessage() {}
func (*XImportMissionControlRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{10}
}
func (m *XImportMissionControlRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_XImportMissionControlRequest.Unmarshal(m, b)
}
func (m *XImportMissionControlRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_XImportMissionControlRequest.Marshal(b, m, deterministic)
}
func (m *XImportMissionControlRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_XImportMissionControlRequest.Merge(m, src)
}
func (m *XImportMissionControlRequest) XXX_Size() int {
return xxx_messageInfo_XImportMissionControlRequest.Size(m)
}
func (m *XImportMissionControlRequest) XXX_DiscardUnknown() {
xxx_messageInfo_XImportMissionControlRequest.DiscardUnknown(m)
}
var xxx_messageInfo_XImportMissionControlRequest proto.InternalMessageInfo
func (m *XImportMissionControlRequest) GetPairs() []*PairHistory {
if m != nil {
return m.Pairs
}
return nil
}
type XImportMissionControlResponse struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *XImportMissionControlResponse) Reset() { *m = XImportMissionControlResponse{} }
func (m *XImportMissionControlResponse) String() string { return proto.CompactTextString(m) }
func (*XImportMissionControlResponse) ProtoMessage() {}
func (*XImportMissionControlResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{11}
}
func (m *XImportMissionControlResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_XImportMissionControlResponse.Unmarshal(m, b)
}
func (m *XImportMissionControlResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_XImportMissionControlResponse.Marshal(b, m, deterministic)
}
func (m *XImportMissionControlResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_XImportMissionControlResponse.Merge(m, src)
}
func (m *XImportMissionControlResponse) XXX_Size() int {
return xxx_messageInfo_XImportMissionControlResponse.Size(m)
}
func (m *XImportMissionControlResponse) XXX_DiscardUnknown() {
xxx_messageInfo_XImportMissionControlResponse.DiscardUnknown(m)
}
var xxx_messageInfo_XImportMissionControlResponse proto.InternalMessageInfo
// PairHistory contains the mission control state for a particular node pair.
type PairHistory struct {
// The source node pubkey of the pair.
@@ -939,7 +1010,7 @@ func (m *PairHistory) Reset() { *m = PairHistory{} }
func (m *PairHistory) String() string { return proto.CompactTextString(m) }
func (*PairHistory) ProtoMessage() {}
func (*PairHistory) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{10}
return fileDescriptor_7a0613f69d37b0a5, []int{12}
}
func (m *PairHistory) XXX_Unmarshal(b []byte) error {
@@ -1007,7 +1078,7 @@ func (m *PairData) Reset() { *m = PairData{} }
func (m *PairData) String() string { return proto.CompactTextString(m) }
func (*PairData) ProtoMessage() {}
func (*PairData) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{11}
return fileDescriptor_7a0613f69d37b0a5, []int{13}
}
func (m *PairData) XXX_Unmarshal(b []byte) error {
@@ -1080,7 +1151,7 @@ func (m *GetMissionControlConfigRequest) Reset() { *m = GetMissionContro
func (m *GetMissionControlConfigRequest) String() string { return proto.CompactTextString(m) }
func (*GetMissionControlConfigRequest) ProtoMessage() {}
func (*GetMissionControlConfigRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{12}
return fileDescriptor_7a0613f69d37b0a5, []int{14}
}
func (m *GetMissionControlConfigRequest) XXX_Unmarshal(b []byte) error {
@@ -1114,7 +1185,7 @@ func (m *GetMissionControlConfigResponse) Reset() { *m = GetMissionContr
func (m *GetMissionControlConfigResponse) String() string { return proto.CompactTextString(m) }
func (*GetMissionControlConfigResponse) ProtoMessage() {}
func (*GetMissionControlConfigResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{13}
return fileDescriptor_7a0613f69d37b0a5, []int{15}
}
func (m *GetMissionControlConfigResponse) XXX_Unmarshal(b []byte) error {
@@ -1156,7 +1227,7 @@ func (m *SetMissionControlConfigRequest) Reset() { *m = SetMissionContro
func (m *SetMissionControlConfigRequest) String() string { return proto.CompactTextString(m) }
func (*SetMissionControlConfigRequest) ProtoMessage() {}
func (*SetMissionControlConfigRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{14}
return fileDescriptor_7a0613f69d37b0a5, []int{16}
}
func (m *SetMissionControlConfigRequest) XXX_Unmarshal(b []byte) error {
@@ -1194,7 +1265,7 @@ func (m *SetMissionControlConfigResponse) Reset() { *m = SetMissionContr
func (m *SetMissionControlConfigResponse) String() string { return proto.CompactTextString(m) }
func (*SetMissionControlConfigResponse) ProtoMessage() {}
func (*SetMissionControlConfigResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{15}
return fileDescriptor_7a0613f69d37b0a5, []int{17}
}
func (m *SetMissionControlConfigResponse) XXX_Unmarshal(b []byte) error {
@@ -1253,7 +1324,7 @@ func (m *MissionControlConfig) Reset() { *m = MissionControlConfig{} }
func (m *MissionControlConfig) String() string { return proto.CompactTextString(m) }
func (*MissionControlConfig) ProtoMessage() {}
func (*MissionControlConfig) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{16}
return fileDescriptor_7a0613f69d37b0a5, []int{18}
}
func (m *MissionControlConfig) XXX_Unmarshal(b []byte) error {
@@ -1325,7 +1396,7 @@ func (m *QueryProbabilityRequest) Reset() { *m = QueryProbabilityRequest
func (m *QueryProbabilityRequest) String() string { return proto.CompactTextString(m) }
func (*QueryProbabilityRequest) ProtoMessage() {}
func (*QueryProbabilityRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{17}
return fileDescriptor_7a0613f69d37b0a5, []int{19}
}
func (m *QueryProbabilityRequest) XXX_Unmarshal(b []byte) error {
@@ -1381,7 +1452,7 @@ func (m *QueryProbabilityResponse) Reset() { *m = QueryProbabilityRespon
func (m *QueryProbabilityResponse) String() string { return proto.CompactTextString(m) }
func (*QueryProbabilityResponse) ProtoMessage() {}
func (*QueryProbabilityResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{18}
return fileDescriptor_7a0613f69d37b0a5, []int{20}
}
func (m *QueryProbabilityResponse) XXX_Unmarshal(b []byte) error {
@@ -1444,7 +1515,7 @@ func (m *BuildRouteRequest) Reset() { *m = BuildRouteRequest{} }
func (m *BuildRouteRequest) String() string { return proto.CompactTextString(m) }
func (*BuildRouteRequest) ProtoMessage() {}
func (*BuildRouteRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{19}
return fileDescriptor_7a0613f69d37b0a5, []int{21}
}
func (m *BuildRouteRequest) XXX_Unmarshal(b []byte) error {
@@ -1513,7 +1584,7 @@ func (m *BuildRouteResponse) Reset() { *m = BuildRouteResponse{} }
func (m *BuildRouteResponse) String() string { return proto.CompactTextString(m) }
func (*BuildRouteResponse) ProtoMessage() {}
func (*BuildRouteResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{20}
return fileDescriptor_7a0613f69d37b0a5, []int{22}
}
func (m *BuildRouteResponse) XXX_Unmarshal(b []byte) error {
@@ -1551,7 +1622,7 @@ func (m *SubscribeHtlcEventsRequest) Reset() { *m = SubscribeHtlcEventsR
func (m *SubscribeHtlcEventsRequest) String() string { return proto.CompactTextString(m) }
func (*SubscribeHtlcEventsRequest) ProtoMessage() {}
func (*SubscribeHtlcEventsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{21}
return fileDescriptor_7a0613f69d37b0a5, []int{23}
}
func (m *SubscribeHtlcEventsRequest) XXX_Unmarshal(b []byte) error {
@@ -1618,7 +1689,7 @@ func (m *HtlcEvent) Reset() { *m = HtlcEvent{} }
func (m *HtlcEvent) String() string { return proto.CompactTextString(m) }
func (*HtlcEvent) ProtoMessage() {}
func (*HtlcEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{22}
return fileDescriptor_7a0613f69d37b0a5, []int{24}
}
func (m *HtlcEvent) XXX_Unmarshal(b []byte) error {
@@ -1772,7 +1843,7 @@ func (m *HtlcInfo) Reset() { *m = HtlcInfo{} }
func (m *HtlcInfo) String() string { return proto.CompactTextString(m) }
func (*HtlcInfo) ProtoMessage() {}
func (*HtlcInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{23}
return fileDescriptor_7a0613f69d37b0a5, []int{25}
}
func (m *HtlcInfo) XXX_Unmarshal(b []byte) error {
@@ -1833,7 +1904,7 @@ func (m *ForwardEvent) Reset() { *m = ForwardEvent{} }
func (m *ForwardEvent) String() string { return proto.CompactTextString(m) }
func (*ForwardEvent) ProtoMessage() {}
func (*ForwardEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{24}
return fileDescriptor_7a0613f69d37b0a5, []int{26}
}
func (m *ForwardEvent) XXX_Unmarshal(b []byte) error {
@@ -1871,7 +1942,7 @@ func (m *ForwardFailEvent) Reset() { *m = ForwardFailEvent{} }
func (m *ForwardFailEvent) String() string { return proto.CompactTextString(m) }
func (*ForwardFailEvent) ProtoMessage() {}
func (*ForwardFailEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{25}
return fileDescriptor_7a0613f69d37b0a5, []int{27}
}
func (m *ForwardFailEvent) XXX_Unmarshal(b []byte) error {
@@ -1902,7 +1973,7 @@ func (m *SettleEvent) Reset() { *m = SettleEvent{} }
func (m *SettleEvent) String() string { return proto.CompactTextString(m) }
func (*SettleEvent) ProtoMessage() {}
func (*SettleEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{26}
return fileDescriptor_7a0613f69d37b0a5, []int{28}
}
func (m *SettleEvent) XXX_Unmarshal(b []byte) error {
@@ -1944,7 +2015,7 @@ func (m *LinkFailEvent) Reset() { *m = LinkFailEvent{} }
func (m *LinkFailEvent) String() string { return proto.CompactTextString(m) }
func (*LinkFailEvent) ProtoMessage() {}
func (*LinkFailEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{27}
return fileDescriptor_7a0613f69d37b0a5, []int{29}
}
func (m *LinkFailEvent) XXX_Unmarshal(b []byte) error {
@@ -2011,7 +2082,7 @@ func (m *PaymentStatus) Reset() { *m = PaymentStatus{} }
func (m *PaymentStatus) String() string { return proto.CompactTextString(m) }
func (*PaymentStatus) ProtoMessage() {}
func (*PaymentStatus) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{28}
return fileDescriptor_7a0613f69d37b0a5, []int{30}
}
func (m *PaymentStatus) XXX_Unmarshal(b []byte) error {
@@ -2067,7 +2138,7 @@ func (m *CircuitKey) Reset() { *m = CircuitKey{} }
func (m *CircuitKey) String() string { return proto.CompactTextString(m) }
func (*CircuitKey) ProtoMessage() {}
func (*CircuitKey) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{29}
return fileDescriptor_7a0613f69d37b0a5, []int{31}
}
func (m *CircuitKey) XXX_Unmarshal(b []byte) error {
@@ -2137,7 +2208,7 @@ func (m *ForwardHtlcInterceptRequest) Reset() { *m = ForwardHtlcIntercep
func (m *ForwardHtlcInterceptRequest) String() string { return proto.CompactTextString(m) }
func (*ForwardHtlcInterceptRequest) ProtoMessage() {}
func (*ForwardHtlcInterceptRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{30}
return fileDescriptor_7a0613f69d37b0a5, []int{32}
}
func (m *ForwardHtlcInterceptRequest) XXX_Unmarshal(b []byte) error {
@@ -2245,7 +2316,7 @@ func (m *ForwardHtlcInterceptResponse) Reset() { *m = ForwardHtlcInterce
func (m *ForwardHtlcInterceptResponse) String() string { return proto.CompactTextString(m) }
func (*ForwardHtlcInterceptResponse) ProtoMessage() {}
func (*ForwardHtlcInterceptResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{31}
return fileDescriptor_7a0613f69d37b0a5, []int{33}
}
func (m *ForwardHtlcInterceptResponse) XXX_Unmarshal(b []byte) error {
@@ -2299,7 +2370,7 @@ func (m *UpdateChanStatusRequest) Reset() { *m = UpdateChanStatusRequest
func (m *UpdateChanStatusRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateChanStatusRequest) ProtoMessage() {}
func (*UpdateChanStatusRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{32}
return fileDescriptor_7a0613f69d37b0a5, []int{34}
}
func (m *UpdateChanStatusRequest) XXX_Unmarshal(b []byte) error {
@@ -2344,7 +2415,7 @@ func (m *UpdateChanStatusResponse) Reset() { *m = UpdateChanStatusRespon
func (m *UpdateChanStatusResponse) String() string { return proto.CompactTextString(m) }
func (*UpdateChanStatusResponse) ProtoMessage() {}
func (*UpdateChanStatusResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{33}
return fileDescriptor_7a0613f69d37b0a5, []int{35}
}
func (m *UpdateChanStatusResponse) XXX_Unmarshal(b []byte) error {
@@ -2382,6 +2453,8 @@ func init() {
proto.RegisterType((*ResetMissionControlResponse)(nil), "routerrpc.ResetMissionControlResponse")
proto.RegisterType((*QueryMissionControlRequest)(nil), "routerrpc.QueryMissionControlRequest")
proto.RegisterType((*QueryMissionControlResponse)(nil), "routerrpc.QueryMissionControlResponse")
proto.RegisterType((*XImportMissionControlRequest)(nil), "routerrpc.XImportMissionControlRequest")
proto.RegisterType((*XImportMissionControlResponse)(nil), "routerrpc.XImportMissionControlResponse")
proto.RegisterType((*PairHistory)(nil), "routerrpc.PairHistory")
proto.RegisterType((*PairData)(nil), "routerrpc.PairData")
proto.RegisterType((*GetMissionControlConfigRequest)(nil), "routerrpc.GetMissionControlConfigRequest")
@@ -2412,192 +2485,195 @@ func init() {
func init() { proto.RegisterFile("routerrpc/router.proto", fileDescriptor_7a0613f69d37b0a5) }
var fileDescriptor_7a0613f69d37b0a5 = []byte{
// 2955 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0x5b, 0x77, 0xdb, 0xc6,
0xf1, 0x0f, 0x48, 0x8a, 0x22, 0x87, 0x17, 0x41, 0x2b, 0xd9, 0xe2, 0x9f, 0xf2, 0x45, 0x61, 0x2e,
0xe6, 0xdf, 0x4d, 0x64, 0x47, 0x69, 0x93, 0xb4, 0xb9, 0x34, 0x14, 0x09, 0x59, 0xb0, 0x29, 0x52,
0x59, 0x52, 0x4e, 0x1c, 0x3f, 0x6c, 0x21, 0x72, 0x29, 0xa2, 0x02, 0x01, 0x16, 0x58, 0xda, 0x56,
0x9e, 0xda, 0x9e, 0xd3, 0x73, 0x7a, 0xfa, 0x61, 0xfa, 0x09, 0x7a, 0x4e, 0xfb, 0xd2, 0x97, 0x7e,
0x89, 0xbe, 0xf6, 0x13, 0xf4, 0xb9, 0x67, 0x2f, 0x00, 0x01, 0x8a, 0x92, 0xdd, 0xcb, 0x8b, 0x4d,
0xfc, 0xe6, 0xb7, 0xb3, 0xb3, 0xb3, 0x33, 0xb3, 0xb3, 0x2b, 0xb8, 0xe9, 0x7b, 0x33, 0x46, 0x7d,
0x7f, 0x3a, 0x78, 0x20, 0x7f, 0xed, 0x4e, 0x7d, 0x8f, 0x79, 0x28, 0x1f, 0xe1, 0xd5, 0xbc, 0x3f,
0x1d, 0x48, 0xb4, 0xf6, 0xd7, 0x55, 0x40, 0x3d, 0xea, 0x0e, 0x8f, 0xad, 0x8b, 0x09, 0x75, 0x19,
0xa6, 0xbf, 0x9a, 0xd1, 0x80, 0x21, 0x04, 0x99, 0x21, 0x0d, 0x58, 0x45, 0xdb, 0xd1, 0xea, 0x45,
0x2c, 0x7e, 0x23, 0x1d, 0xd2, 0xd6, 0x84, 0x55, 0x52, 0x3b, 0x5a, 0x3d, 0x8d, 0xf9, 0x4f, 0xf4,
0x7f, 0x90, 0xb3, 0x26, 0x8c, 0x4c, 0x02, 0x8b, 0x55, 0x8a, 0x02, 0x5e, 0xb5, 0x26, 0xec, 0x28,
0xb0, 0x18, 0x7a, 0x1b, 0x8a, 0x53, 0xa9, 0x92, 0x8c, 0xad, 0x60, 0x5c, 0x49, 0x0b, 0x45, 0x05,
0x85, 0x1d, 0x5a, 0xc1, 0x18, 0xd5, 0x41, 0x1f, 0xd9, 0xae, 0xe5, 0x90, 0x81, 0xc3, 0x5e, 0x90,
0x21, 0x75, 0x98, 0x55, 0xc9, 0xec, 0x68, 0xf5, 0x15, 0x5c, 0x16, 0x78, 0xd3, 0x61, 0x2f, 0x5a,
0x1c, 0x8d, 0x2b, 0xb3, 0x86, 0x43, 0xbf, 0xb2, 0x99, 0x50, 0xd6, 0x18, 0x0e, 0x7d, 0x74, 0x0f,
0xd6, 0x42, 0x8a, 0x2f, 0xd7, 0x50, 0x59, 0xd9, 0xd1, 0xea, 0x79, 0x5c, 0x9e, 0x26, 0x57, 0x76,
0x0f, 0xd6, 0x98, 0x3d, 0xa1, 0xde, 0x8c, 0x91, 0x80, 0x0e, 0x3c, 0x77, 0x18, 0x54, 0xb2, 0x72,
0x52, 0x05, 0xf7, 0x24, 0x8a, 0x6a, 0x50, 0x1a, 0x51, 0x4a, 0x1c, 0x7b, 0x62, 0x33, 0xc2, 0x57,
0xb8, 0x2a, 0x56, 0x58, 0x18, 0x51, 0xda, 0xe6, 0x58, 0xcf, 0x62, 0xe8, 0x5d, 0x28, 0xcf, 0x39,
0xc2, 0x0d, 0x25, 0x41, 0x2a, 0x86, 0x24, 0xe1, 0x8b, 0x5d, 0xd0, 0xbd, 0x19, 0x3b, 0xf3, 0x6c,
0xf7, 0x8c, 0x0c, 0xc6, 0x96, 0x4b, 0xec, 0x61, 0x25, 0xb7, 0xa3, 0xd5, 0x33, 0xfb, 0x99, 0x8a,
0xf6, 0x50, 0xc3, 0xe5, 0x50, 0xda, 0x1c, 0x5b, 0xae, 0x39, 0x44, 0xf7, 0x61, 0x7d, 0x91, 0x1f,
0x54, 0x36, 0x76, 0xd2, 0xf5, 0x0c, 0x5e, 0x4b, 0x52, 0x03, 0xf4, 0x3e, 0xac, 0x39, 0x56, 0xc0,
0xc8, 0xd8, 0x9b, 0x92, 0xe9, 0xec, 0xf4, 0x9c, 0x5e, 0x54, 0xca, 0xc2, 0x3b, 0x25, 0x0e, 0x1f,
0x7a, 0xd3, 0x63, 0x01, 0xa2, 0xdb, 0x00, 0xc2, 0xcd, 0xc2, 0xd4, 0x4a, 0x5e, 0xac, 0x38, 0xcf,
0x11, 0x61, 0x26, 0xfa, 0x08, 0x0a, 0x22, 0x3c, 0xc8, 0xd8, 0x76, 0x59, 0x50, 0x81, 0x9d, 0x74,
0xbd, 0xb0, 0xa7, 0xef, 0x3a, 0x2e, 0x8f, 0x14, 0xcc, 0x25, 0x87, 0xb6, 0xcb, 0x30, 0xf8, 0xe1,
0xcf, 0x00, 0x0d, 0x61, 0x83, 0x87, 0x05, 0x19, 0xcc, 0x02, 0xe6, 0x4d, 0x88, 0x4f, 0x07, 0x9e,
0x3f, 0x0c, 0x2a, 0x05, 0x31, 0xf4, 0xc7, 0xbb, 0x51, 0xb4, 0xed, 0x5e, 0x0e, 0xaf, 0xdd, 0x16,
0x0d, 0x58, 0x53, 0x8c, 0xc3, 0x72, 0x98, 0xe1, 0x32, 0xff, 0x02, 0xaf, 0x0f, 0x17, 0x71, 0xf4,
0x01, 0x20, 0xcb, 0x71, 0xbc, 0x97, 0x24, 0xa0, 0xce, 0x88, 0xa8, 0xbd, 0xac, 0xac, 0xed, 0x68,
0xf5, 0x1c, 0xd6, 0x85, 0xa4, 0x47, 0x9d, 0x91, 0x52, 0x8f, 0x3e, 0x81, 0x92, 0xb0, 0x69, 0x44,
0x2d, 0x36, 0xf3, 0x69, 0x50, 0xd1, 0x77, 0xd2, 0xf5, 0xf2, 0xde, 0xba, 0x5a, 0xc8, 0x81, 0x84,
0xf7, 0x6d, 0x86, 0x8b, 0x9c, 0xa7, 0xbe, 0x03, 0xb4, 0x0d, 0xf9, 0x89, 0xf5, 0x8a, 0x4c, 0x2d,
0x9f, 0x05, 0x95, 0xf5, 0x1d, 0xad, 0x5e, 0xc2, 0xb9, 0x89, 0xf5, 0xea, 0x98, 0x7f, 0xa3, 0x5d,
0xd8, 0x70, 0x3d, 0x62, 0xbb, 0x23, 0xc7, 0x3e, 0x1b, 0x33, 0x32, 0x9b, 0x0e, 0x2d, 0x46, 0x83,
0x0a, 0x12, 0x36, 0xac, 0xbb, 0x9e, 0xa9, 0x24, 0x27, 0x52, 0x80, 0x3e, 0x84, 0x0d, 0xae, 0x2c,
0x18, 0x5b, 0xfe, 0x90, 0x04, 0xf6, 0x0f, 0x54, 0x46, 0xc6, 0x0d, 0xbe, 0xe3, 0x58, 0x9f, 0x58,
0xaf, 0x7a, 0x5c, 0xd2, 0xb3, 0x7f, 0xa0, 0x3c, 0x3a, 0xaa, 0x2d, 0xb8, 0xb9, 0xdc, 0x1d, 0x3c,
0xe1, 0xf8, 0x7e, 0x6a, 0x62, 0x20, 0xff, 0x89, 0x36, 0x61, 0xe5, 0x85, 0xe5, 0xcc, 0xa8, 0x48,
0xc2, 0x22, 0x96, 0x1f, 0x3f, 0x4b, 0x7d, 0xa6, 0xd5, 0xc6, 0xb0, 0xd1, 0xf7, 0xad, 0xc1, 0xf9,
0x42, 0x1e, 0x2f, 0xa6, 0xa1, 0x76, 0x39, 0x0d, 0xaf, 0x58, 0x5e, 0xea, 0x8a, 0xe5, 0xd5, 0xbe,
0x82, 0x35, 0x11, 0x10, 0x07, 0x94, 0x5e, 0x57, 0x2d, 0xb6, 0x80, 0xd7, 0x02, 0x91, 0x38, 0xb2,
0x62, 0x64, 0xad, 0x09, 0xcf, 0x99, 0xda, 0x10, 0xf4, 0xf9, 0xf8, 0x60, 0xea, 0xb9, 0x01, 0xe5,
0xa5, 0x80, 0xc7, 0x0b, 0x0f, 0x78, 0x9e, 0x4f, 0xc2, 0x5f, 0x9a, 0x18, 0x55, 0x56, 0xf8, 0x01,
0x15, 0xde, 0xe2, 0xf1, 0xce, 0xf3, 0x94, 0x38, 0xde, 0xe0, 0x9c, 0xd7, 0x0c, 0xeb, 0x42, 0xa9,
0x2f, 0x71, 0xb8, 0xed, 0x0d, 0xce, 0x5b, 0x1c, 0xac, 0x3d, 0x97, 0x65, 0xad, 0xef, 0x89, 0xb9,
0xfe, 0x0d, 0x77, 0xd4, 0x60, 0x45, 0x84, 0xae, 0x50, 0x5b, 0xd8, 0x2b, 0xc6, 0x73, 0x00, 0x4b,
0x51, 0xed, 0x39, 0x6c, 0x24, 0x94, 0xab, 0x55, 0x54, 0x21, 0x37, 0xf5, 0xa9, 0x3d, 0xb1, 0xce,
0xa8, 0xd2, 0x1c, 0x7d, 0xa3, 0x3a, 0xac, 0x8e, 0x2c, 0xdb, 0x99, 0xf9, 0xa1, 0xe2, 0x72, 0x18,
0x93, 0x12, 0xc5, 0xa1, 0xb8, 0x76, 0x0b, 0xaa, 0x98, 0x06, 0x94, 0x1d, 0xd9, 0x41, 0x60, 0x7b,
0x6e, 0xd3, 0x73, 0x99, 0xef, 0x39, 0x6a, 0x05, 0xb5, 0xdb, 0xb0, 0xbd, 0x54, 0x2a, 0x4d, 0xe0,
0x83, 0xbf, 0x99, 0x51, 0xff, 0x62, 0xf9, 0xe0, 0x6f, 0x60, 0x7b, 0xa9, 0x54, 0xd9, 0xff, 0x01,
0xac, 0x4c, 0x2d, 0xdb, 0xe7, 0x7b, 0xcf, 0x73, 0xf8, 0x66, 0x2c, 0x87, 0x8f, 0x2d, 0xdb, 0x3f,
0xb4, 0x03, 0xe6, 0xf9, 0x17, 0x58, 0x92, 0x1e, 0x67, 0x72, 0x9a, 0x9e, 0xaa, 0xfd, 0x41, 0x83,
0x42, 0x4c, 0xc8, 0x33, 0xc9, 0xf5, 0x86, 0x94, 0x8c, 0x7c, 0x6f, 0x12, 0x3a, 0x81, 0x03, 0x07,
0xbe, 0x37, 0xe1, 0x31, 0x21, 0x84, 0xcc, 0x53, 0x01, 0x9c, 0xe5, 0x9f, 0x7d, 0x0f, 0x7d, 0x08,
0xab, 0x63, 0xa9, 0x40, 0x54, 0xd9, 0xc2, 0xde, 0xc6, 0xc2, 0xdc, 0x2d, 0x8b, 0x59, 0x38, 0xe4,
0x3c, 0xce, 0xe4, 0xd2, 0x7a, 0xe6, 0x71, 0x26, 0x97, 0xd1, 0x57, 0x1e, 0x67, 0x72, 0x2b, 0x7a,
0xf6, 0x71, 0x26, 0x97, 0xd5, 0x57, 0x6b, 0xff, 0xd0, 0x20, 0x17, 0xb2, 0xb9, 0x25, 0xdc, 0xa5,
0x84, 0xc7, 0x85, 0x0a, 0xa6, 0x1c, 0x07, 0xfa, 0xf6, 0x84, 0xa2, 0x1d, 0x28, 0x0a, 0x61, 0x32,
0x44, 0x81, 0x63, 0x0d, 0x11, 0xa6, 0xa2, 0xfc, 0x87, 0x0c, 0x11, 0x8f, 0x19, 0x55, 0xfe, 0x25,
0x25, 0x3c, 0xe4, 0x82, 0xd9, 0x60, 0x40, 0x83, 0x40, 0xce, 0xb2, 0x22, 0x29, 0x0a, 0x13, 0x13,
0xbd, 0x0f, 0x6b, 0x21, 0x25, 0x9c, 0x2b, 0x2b, 0xe3, 0x55, 0xc1, 0x6a, 0xba, 0x3a, 0xe8, 0x71,
0xde, 0x64, 0x7e, 0xe0, 0x94, 0xe7, 0x44, 0x3e, 0xa9, 0x5c, 0x7c, 0x6d, 0x07, 0xee, 0x3c, 0x5a,
0x8c, 0x82, 0xa6, 0xe7, 0x8e, 0xec, 0xb3, 0x70, 0xb3, 0xbf, 0x87, 0xbb, 0x57, 0x32, 0xd4, 0x86,
0x7f, 0x0a, 0xd9, 0x81, 0x40, 0x84, 0x7f, 0x0a, 0x7b, 0x77, 0x63, 0x5e, 0x5f, 0x3a, 0x50, 0xd1,
0x6b, 0xcf, 0xe0, 0x4e, 0xef, 0xda, 0xd9, 0xff, 0x73, 0xd5, 0x6f, 0xc3, 0xdd, 0xde, 0xf5, 0x66,
0xd7, 0x7e, 0x9d, 0x82, 0xcd, 0x65, 0x04, 0x7e, 0x70, 0x8e, 0x2d, 0x67, 0x44, 0x1c, 0x7b, 0x44,
0xa3, 0xd3, 0x5d, 0x96, 0xcf, 0x35, 0x2e, 0x68, 0xdb, 0x23, 0x1a, 0x1e, 0xef, 0xf7, 0x60, 0x4d,
0x9c, 0x99, 0xbe, 0x77, 0x6a, 0x9d, 0xda, 0x8e, 0xcd, 0x64, 0x21, 0x49, 0xe1, 0xf2, 0xd8, 0x9b,
0x1e, 0xcf, 0x51, 0x74, 0x13, 0xb2, 0x2f, 0x29, 0x2f, 0x80, 0xa2, 0x87, 0x49, 0x61, 0xf5, 0x85,
0x3e, 0x81, 0xad, 0x89, 0xf5, 0xca, 0x9e, 0xcc, 0x26, 0x64, 0xde, 0x79, 0x04, 0x33, 0x87, 0x05,
0x22, 0x54, 0x4a, 0xf8, 0x86, 0x12, 0x47, 0x25, 0x59, 0x08, 0x51, 0x13, 0xee, 0x4c, 0x6c, 0x57,
0x8c, 0x53, 0x29, 0x4f, 0x7c, 0xea, 0x58, 0xaf, 0x88, 0xed, 0x32, 0xea, 0xbf, 0xb0, 0x1c, 0x11,
0x46, 0x19, 0xbc, 0xad, 0x58, 0x61, 0x81, 0xe0, 0x1c, 0x53, 0x51, 0x6a, 0xbf, 0x84, 0x2d, 0x91,
0xc9, 0x31, 0x43, 0x43, 0xcf, 0xf3, 0xb8, 0xf7, 0xbd, 0x09, 0xe1, 0xa9, 0x15, 0x66, 0x20, 0x07,
0x3a, 0xde, 0x90, 0xf2, 0x0c, 0x64, 0x9e, 0x14, 0xa9, 0x0c, 0x64, 0x9e, 0x10, 0xc4, 0x5b, 0xb9,
0x74, 0xa2, 0x95, 0xab, 0x9d, 0x43, 0xe5, 0xf2, 0x5c, 0x2a, 0x82, 0x76, 0xa0, 0x10, 0xf7, 0x20,
0x9f, 0x4e, 0xc3, 0x71, 0x28, 0x9e, 0xda, 0xa9, 0xd7, 0xa7, 0x76, 0xed, 0x6f, 0x1a, 0xac, 0xef,
0xcf, 0x6c, 0x67, 0x98, 0xa8, 0xdb, 0x71, 0xeb, 0xb4, 0x64, 0xa3, 0xb9, 0xac, 0x8b, 0x4c, 0x2d,
0xed, 0x22, 0x3f, 0x58, 0xd2, 0x86, 0xa5, 0x45, 0x1b, 0x96, 0x5a, 0xd2, 0x84, 0xdd, 0x85, 0xc2,
0xbc, 0xa7, 0xe2, 0x5b, 0x9a, 0xae, 0x17, 0x31, 0x8c, 0xc3, 0x86, 0x2a, 0xb8, 0xd4, 0x94, 0xae,
0x5c, 0x6a, 0x4a, 0x6b, 0x9f, 0x01, 0x8a, 0xaf, 0x45, 0xf9, 0x2c, 0x3a, 0x61, 0xb4, 0xab, 0x4f,
0x98, 0x5b, 0x50, 0xed, 0xcd, 0x4e, 0x83, 0x81, 0x6f, 0x9f, 0xd2, 0x43, 0xe6, 0x0c, 0x8c, 0x17,
0xd4, 0x65, 0x41, 0x98, 0xda, 0xff, 0xcc, 0x40, 0x3e, 0x42, 0xf9, 0x01, 0x6e, 0xbb, 0x03, 0x6f,
0x12, 0xae, 0xcb, 0xa5, 0x0e, 0x5f, 0x9a, 0x8c, 0xfb, 0xf5, 0x50, 0xd4, 0x94, 0x12, 0x73, 0xc8,
0xf9, 0x09, 0x3f, 0x28, 0x7e, 0x4a, 0xf2, 0xe3, 0x6e, 0x90, 0xfc, 0x3a, 0xe8, 0x91, 0xfe, 0x31,
0x73, 0x06, 0x91, 0xdf, 0x70, 0x39, 0xc4, 0xb9, 0x31, 0x92, 0x19, 0x69, 0x0e, 0x99, 0x19, 0xc9,
0x0c, 0x71, 0xc5, 0x7c, 0x1b, 0x8a, 0xbc, 0x62, 0x06, 0xcc, 0x9a, 0x4c, 0x89, 0x1b, 0xa8, 0x90,
0x2f, 0x44, 0x58, 0x27, 0x40, 0x5f, 0x02, 0x50, 0xbe, 0x3e, 0xc2, 0x2e, 0xa6, 0x54, 0x14, 0xcd,
0xf2, 0xde, 0x9d, 0x58, 0xec, 0x44, 0x0e, 0xd8, 0x15, 0xff, 0xf6, 0x2f, 0xa6, 0x14, 0xe7, 0x69,
0xf8, 0x13, 0x7d, 0x05, 0xa5, 0x91, 0xe7, 0xbf, 0xe4, 0x3d, 0x98, 0x00, 0xd5, 0xc1, 0xb2, 0x15,
0xd3, 0x70, 0x20, 0xe5, 0x62, 0xf8, 0xe1, 0x5b, 0xb8, 0x38, 0x8a, 0x7d, 0xa3, 0x27, 0x80, 0xc2,
0xf1, 0xe2, 0x1c, 0x90, 0x4a, 0x72, 0x42, 0xc9, 0xf6, 0x65, 0x25, 0x3c, 0x4b, 0x43, 0x45, 0xfa,
0x68, 0x01, 0x43, 0x9f, 0x43, 0x31, 0xa0, 0x8c, 0x39, 0x54, 0xa9, 0xc9, 0x0b, 0x35, 0x37, 0x13,
0x4d, 0x32, 0x17, 0x87, 0x1a, 0x0a, 0xc1, 0xfc, 0x13, 0xed, 0xc3, 0x9a, 0x63, 0xbb, 0xe7, 0x71,
0x33, 0x40, 0x8c, 0xaf, 0xc4, 0xc6, 0xb7, 0x6d, 0xf7, 0x3c, 0x6e, 0x43, 0xc9, 0x89, 0x03, 0xb5,
0x2f, 0x20, 0x1f, 0x79, 0x09, 0x15, 0x60, 0xf5, 0xa4, 0xf3, 0xa4, 0xd3, 0xfd, 0xb6, 0xa3, 0xbf,
0x85, 0x72, 0x90, 0xe9, 0x19, 0x9d, 0x96, 0xae, 0x71, 0x18, 0x1b, 0x4d, 0xc3, 0x7c, 0x6a, 0xe8,
0x29, 0xfe, 0x71, 0xd0, 0xc5, 0xdf, 0x36, 0x70, 0x4b, 0x4f, 0xef, 0xaf, 0xc2, 0x8a, 0x98, 0xb7,
0xf6, 0x27, 0x0d, 0x72, 0x62, 0x07, 0xdd, 0x91, 0x87, 0x7e, 0x04, 0x51, 0x70, 0x89, 0xe3, 0x8f,
0xb7, 0x64, 0x22, 0xea, 0x4a, 0x38, 0x0a, 0x98, 0xbe, 0xc2, 0x39, 0x39, 0x0a, 0x8d, 0x88, 0x9c,
0x92, 0xe4, 0x50, 0x10, 0x91, 0xef, 0xc7, 0x34, 0x27, 0xaa, 0x52, 0x06, 0xaf, 0x85, 0x82, 0xf0,
0x0c, 0x8e, 0x5f, 0x96, 0x12, 0x67, 0x75, 0xec, 0xb2, 0xa4, 0xb8, 0xb5, 0x4f, 0xa1, 0x18, 0xdf,
0x73, 0x74, 0x0f, 0x32, 0xb6, 0x3b, 0xf2, 0x54, 0x22, 0x6e, 0x2c, 0x04, 0x17, 0x5f, 0x24, 0x16,
0x84, 0x1a, 0x02, 0x7d, 0x71, 0x9f, 0x6b, 0x25, 0x28, 0xc4, 0x36, 0xad, 0xf6, 0x77, 0x0d, 0x4a,
0x89, 0x4d, 0x78, 0x63, 0xed, 0xe8, 0x4b, 0x28, 0xbe, 0xb4, 0x7d, 0x4a, 0xe2, 0x0d, 0x62, 0x79,
0xaf, 0x9a, 0x6c, 0x10, 0xc3, 0xff, 0x9b, 0xde, 0x90, 0xe2, 0x02, 0xe7, 0x2b, 0x00, 0xfd, 0x1c,
0xca, 0xe1, 0x41, 0x32, 0xa4, 0xcc, 0xb2, 0x1d, 0xe1, 0xaa, 0x72, 0x22, 0x3c, 0x14, 0xb7, 0x25,
0xe4, 0xb8, 0x34, 0x8a, 0x7f, 0xa2, 0xf7, 0xe6, 0x0a, 0x02, 0xe6, 0xdb, 0xee, 0x99, 0xf0, 0x5f,
0x3e, 0xa2, 0xf5, 0x04, 0xc8, 0x5b, 0xbd, 0x92, 0x3a, 0xcb, 0x7a, 0xcc, 0x62, 0x33, 0x7e, 0xd3,
0x59, 0x09, 0x98, 0xa5, 0x2a, 0x59, 0x39, 0x91, 0x5b, 0x31, 0x22, 0xc5, 0x92, 0x95, 0xe8, 0x8f,
0x53, 0x97, 0xfa, 0xe3, 0x15, 0x5e, 0x31, 0x64, 0xa1, 0x2d, 0xec, 0x21, 0xb5, 0xf8, 0xc3, 0x7e,
0xbb, 0xd9, 0x60, 0x8c, 0x4e, 0xa6, 0x0c, 0x4b, 0x82, 0xea, 0x7f, 0xbe, 0x02, 0x68, 0xda, 0xfe,
0x60, 0x66, 0xb3, 0x27, 0xf4, 0x82, 0x1f, 0x6b, 0x61, 0x45, 0x97, 0x65, 0x2f, 0x3b, 0x90, 0x55,
0x7c, 0x0b, 0x56, 0xc3, 0x42, 0x24, 0xeb, 0x5b, 0x76, 0x2c, 0x0a, 0x50, 0xed, 0xcf, 0x19, 0xd8,
0x56, 0x5b, 0x2a, 0x77, 0x83, 0x51, 0x7f, 0x40, 0xa7, 0xd1, 0xc5, 0xe9, 0x11, 0x6c, 0xce, 0x8b,
0xaa, 0x9c, 0x88, 0x84, 0x97, 0xb1, 0xc2, 0xde, 0x8d, 0xd8, 0x4a, 0xe7, 0x66, 0x60, 0x14, 0x15,
0xdb, 0xb9, 0x69, 0x0f, 0x63, 0x8a, 0xac, 0x89, 0x37, 0x73, 0x55, 0x88, 0xca, 0x8a, 0x87, 0xe6,
0xe1, 0xcc, 0x45, 0x22, 0xa2, 0xef, 0x41, 0x14, 0xe4, 0x84, 0xbe, 0x9a, 0xda, 0xfe, 0x85, 0xa8,
0x7e, 0xa5, 0x79, 0xb9, 0x35, 0x04, 0x7a, 0xe9, 0x36, 0x93, 0xba, 0x7c, 0x9b, 0xf9, 0x1c, 0xaa,
0x51, 0x76, 0xa8, 0x77, 0x11, 0x3a, 0x8c, 0x4e, 0xbf, 0x55, 0x61, 0xc3, 0x56, 0xc8, 0xc0, 0x21,
0x41, 0x1d, 0x81, 0x0f, 0x61, 0x33, 0x96, 0x5a, 0x73, 0xd3, 0x65, 0x26, 0xa2, 0x79, 0x76, 0xc5,
0x4d, 0x8f, 0x46, 0x28, 0xd3, 0x65, 0x2f, 0x14, 0xd5, 0x7f, 0x65, 0xfa, 0x2f, 0xa0, 0xbc, 0xf0,
0x6e, 0x90, 0x13, 0xfb, 0xfe, 0xd3, 0xcb, 0x95, 0x75, 0xd9, 0xf6, 0xec, 0x2e, 0x79, 0x3c, 0x28,
0x0d, 0x12, 0x0f, 0x07, 0xb7, 0x01, 0x3c, 0xd7, 0xf6, 0x5c, 0x72, 0xea, 0x78, 0xa7, 0xa2, 0xe0,
0x16, 0x71, 0x5e, 0x20, 0xfb, 0x8e, 0x77, 0x5a, 0xfd, 0x1a, 0xd0, 0x7f, 0x79, 0xe3, 0xfe, 0x8b,
0x06, 0xb7, 0x96, 0x9b, 0xa8, 0xce, 0xf9, 0xff, 0x59, 0x08, 0x7d, 0x0e, 0x59, 0x6b, 0xc0, 0x6c,
0xcf, 0x55, 0x95, 0xe1, 0x9d, 0xd8, 0x50, 0x4c, 0x03, 0xcf, 0x79, 0x41, 0x0f, 0x3d, 0x67, 0xa8,
0x8c, 0x69, 0x08, 0x2a, 0x56, 0x43, 0x12, 0x49, 0x97, 0x4e, 0x26, 0x5d, 0xed, 0xb7, 0x1a, 0x6c,
0xc9, 0x6b, 0x3d, 0xdf, 0x71, 0x99, 0xd4, 0x61, 0x02, 0xec, 0x01, 0x88, 0x30, 0x99, 0x7a, 0xb6,
0xcb, 0xa2, 0x1a, 0x26, 0xb3, 0x52, 0xf5, 0x06, 0xc7, 0x5c, 0x84, 0xf3, 0x9c, 0x26, 0x7e, 0xa2,
0x8f, 0x17, 0x0c, 0x8d, 0x9f, 0x93, 0xf3, 0x19, 0x92, 0x06, 0xd6, 0xaa, 0x50, 0xb9, 0x6c, 0x83,
0x74, 0xe1, 0xfd, 0xdf, 0x64, 0xa0, 0x94, 0x28, 0x5d, 0xc9, 0xb3, 0xab, 0x04, 0xf9, 0x4e, 0x97,
0xb4, 0x8c, 0x7e, 0xc3, 0x6c, 0xeb, 0x1a, 0xd2, 0xa1, 0xd8, 0xed, 0x98, 0xdd, 0x0e, 0x69, 0x19,
0xcd, 0x6e, 0x8b, 0x9f, 0x62, 0x37, 0x60, 0xbd, 0x6d, 0x76, 0x9e, 0x90, 0x4e, 0xb7, 0x4f, 0x8c,
0xb6, 0xf9, 0xc8, 0xdc, 0x6f, 0x1b, 0x7a, 0x1a, 0x6d, 0x82, 0xde, 0xed, 0x90, 0xe6, 0x61, 0xc3,
0xec, 0x90, 0xbe, 0x79, 0x64, 0x74, 0x4f, 0xfa, 0x7a, 0x86, 0xa3, 0xbc, 0xdc, 0x10, 0xe3, 0xbb,
0xa6, 0x61, 0xb4, 0x7a, 0xe4, 0xa8, 0xf1, 0x9d, 0xbe, 0x82, 0x2a, 0xb0, 0x69, 0x76, 0x7a, 0x27,
0x07, 0x07, 0x66, 0xd3, 0x34, 0x3a, 0x7d, 0xb2, 0xdf, 0x68, 0x37, 0x3a, 0x4d, 0x43, 0xcf, 0xa2,
0x9b, 0x80, 0xcc, 0x4e, 0xb3, 0x7b, 0x74, 0xdc, 0x36, 0xfa, 0x06, 0x09, 0x4f, 0xcb, 0x55, 0xb4,
0x01, 0x6b, 0x42, 0x4f, 0xa3, 0xd5, 0x22, 0x07, 0x0d, 0xb3, 0x6d, 0xb4, 0xf4, 0x1c, 0xb7, 0x44,
0x31, 0x7a, 0xa4, 0x65, 0xf6, 0x1a, 0xfb, 0x1c, 0xce, 0xf3, 0x39, 0xcd, 0xce, 0xd3, 0xae, 0xd9,
0x34, 0x48, 0x93, 0xab, 0xe5, 0x28, 0x70, 0x72, 0x88, 0x9e, 0x74, 0x5a, 0x06, 0x3e, 0x6e, 0x98,
0x2d, 0xbd, 0x80, 0xb6, 0x61, 0x2b, 0x84, 0x8d, 0xef, 0x8e, 0x4d, 0xfc, 0x8c, 0xf4, 0xbb, 0x5d,
0xd2, 0xeb, 0x76, 0x3b, 0x7a, 0x31, 0xae, 0x89, 0xaf, 0xb6, 0x7b, 0x6c, 0x74, 0xf4, 0x12, 0xda,
0x82, 0x8d, 0xa3, 0xe3, 0x63, 0x12, 0x4a, 0xc2, 0xc5, 0x96, 0x39, 0xbd, 0xd1, 0x6a, 0x61, 0xa3,
0xd7, 0x23, 0x47, 0x66, 0xef, 0xa8, 0xd1, 0x6f, 0x1e, 0xea, 0x6b, 0x7c, 0x49, 0x3d, 0xa3, 0x4f,
0xfa, 0xdd, 0x7e, 0xa3, 0x3d, 0xc7, 0x75, 0x6e, 0xd0, 0x1c, 0xe7, 0x93, 0xb6, 0xbb, 0xdf, 0xea,
0xeb, 0xdc, 0xe1, 0x1c, 0xee, 0x3e, 0x55, 0x26, 0x22, 0xbe, 0x76, 0xb5, 0x3d, 0xe1, 0x9c, 0xfa,
0x06, 0x07, 0xcd, 0xce, 0xd3, 0x46, 0xdb, 0x6c, 0x91, 0x27, 0xc6, 0x33, 0xd1, 0x6d, 0x6c, 0x72,
0x50, 0x5a, 0x46, 0x8e, 0x71, 0xf7, 0x11, 0x37, 0x44, 0xbf, 0x81, 0x10, 0x94, 0x9b, 0x26, 0x6e,
0x9e, 0xb4, 0x1b, 0x98, 0xe0, 0xee, 0x49, 0xdf, 0xd0, 0x6f, 0xde, 0xff, 0xa3, 0x06, 0xc5, 0xf8,
0x69, 0xc2, 0x77, 0xdd, 0xec, 0x90, 0x83, 0xb6, 0xf9, 0xe8, 0xb0, 0x2f, 0x83, 0xa0, 0x77, 0xd2,
0xe4, 0x5b, 0x66, 0xf0, 0x2e, 0x06, 0x41, 0x59, 0x3a, 0x3d, 0x5a, 0x6c, 0x8a, 0xcf, 0xa5, 0xb0,
0x4e, 0x57, 0xe9, 0x4d, 0x73, 0xe3, 0x15, 0x68, 0x60, 0xdc, 0xc5, 0x7a, 0x06, 0xbd, 0x0b, 0x3b,
0x0a, 0xe1, 0xfb, 0x8a, 0xb1, 0xd1, 0xec, 0x93, 0xe3, 0xc6, 0xb3, 0x23, 0xbe, 0xed, 0x32, 0xc8,
0x7a, 0xfa, 0x0a, 0xba, 0x0b, 0xdb, 0x11, 0x6b, 0x59, 0x5c, 0xdc, 0xff, 0x02, 0x2a, 0x57, 0x65,
0x25, 0x02, 0xc8, 0xf6, 0x8c, 0x7e, 0xbf, 0x6d, 0xc8, 0xce, 0xeb, 0x40, 0x06, 0x2e, 0x40, 0x16,
0x1b, 0xbd, 0x93, 0x23, 0x43, 0x4f, 0xdd, 0xff, 0x09, 0xe8, 0x8b, 0xa9, 0xc2, 0xe5, 0x46, 0x87,
0x87, 0x8c, 0xfe, 0x16, 0x4f, 0x00, 0x15, 0x3f, 0xba, 0xc6, 0x55, 0x34, 0x4e, 0xfa, 0x5d, 0x3d,
0xb5, 0xf7, 0xbb, 0x02, 0x64, 0xc5, 0x0d, 0xc2, 0x47, 0x5f, 0x43, 0x29, 0xf6, 0xe4, 0xfa, 0x74,
0x0f, 0xdd, 0xbe, 0xf6, 0x31, 0xb6, 0x1a, 0xbe, 0x44, 0x29, 0xf8, 0xa1, 0x86, 0xf6, 0xa1, 0x1c,
0x7f, 0x4c, 0x7c, 0xba, 0x87, 0xe2, 0x8d, 0xf7, 0x92, 0x77, 0xc6, 0x25, 0x3a, 0x9e, 0x80, 0x6e,
0x04, 0xcc, 0x9e, 0xf0, 0xf3, 0x5f, 0x3d, 0xf7, 0xa1, 0x6a, 0xbc, 0x70, 0x25, 0xdf, 0x10, 0xab,
0xdb, 0x4b, 0x65, 0xaa, 0x94, 0x7e, 0xc3, 0x7b, 0xad, 0xe8, 0xc1, 0xed, 0xd2, 0x82, 0x92, 0xaf,
0x7c, 0xd5, 0x3b, 0x57, 0x89, 0xd5, 0xfb, 0x41, 0xfa, 0xf7, 0x29, 0xbe, 0xc6, 0x52, 0x4c, 0xb6,
0xc4, 0x4b, 0x0b, 0x4a, 0x97, 0x74, 0x24, 0x68, 0x08, 0x1b, 0x4b, 0x1e, 0xe3, 0xd0, 0x7b, 0xc9,
0xfa, 0x7c, 0xc5, 0x53, 0x5e, 0xf5, 0xfd, 0xd7, 0xd1, 0xd4, 0xe2, 0x87, 0xb0, 0xb1, 0xe4, 0xd5,
0x2e, 0x31, 0xcb, 0xd5, 0x6f, 0x7e, 0x89, 0x59, 0xae, 0x7b, 0xfc, 0x9b, 0xc2, 0xd6, 0x15, 0xcf,
0x45, 0xe8, 0xff, 0x63, 0x2a, 0xae, 0x7f, 0x74, 0xaa, 0xde, 0x7f, 0x13, 0xea, 0x7c, 0xc6, 0xde,
0x1b, 0xcc, 0xd8, 0x7b, 0xf3, 0x19, 0x5f, 0xf3, 0x70, 0x84, 0x9e, 0x83, 0xbe, 0xf8, 0x92, 0x81,
0x6a, 0x8b, 0xfe, 0xb9, 0xfc, 0xa4, 0x52, 0x7d, 0xe7, 0x5a, 0x8e, 0x52, 0x6e, 0x02, 0xcc, 0x2f,
0xfb, 0xe8, 0x56, 0x6c, 0xc8, 0xa5, 0xf7, 0x8c, 0xea, 0xed, 0x2b, 0xa4, 0x4a, 0x55, 0x1f, 0x36,
0x96, 0xdc, 0xfe, 0x13, 0x3b, 0x7e, 0xf5, 0xeb, 0x40, 0x75, 0x73, 0xd9, 0x25, 0xf9, 0xa1, 0x86,
0x8e, 0x64, 0x12, 0x85, 0x7f, 0x2b, 0x79, 0x4d, 0x55, 0xa8, 0x2c, 0x6f, 0xe6, 0x67, 0x81, 0x48,
0x9f, 0x87, 0x1a, 0xea, 0x42, 0x31, 0x5e, 0x09, 0x5e, 0x5b, 0x22, 0x5e, 0xab, 0x70, 0x04, 0x6b,
0x89, 0x46, 0xca, 0xf3, 0xd1, 0xbd, 0xd7, 0xb6, 0x83, 0xd2, 0x63, 0x89, 0x28, 0xbf, 0xa6, 0x6f,
0xac, 0xf3, 0x79, 0x9e, 0x83, 0xbe, 0xd8, 0x70, 0x24, 0xa2, 0xe0, 0x8a, 0x8e, 0x28, 0x11, 0x05,
0x57, 0x75, 0x2c, 0xfb, 0x1f, 0x7d, 0xff, 0xe0, 0xcc, 0x66, 0xe3, 0xd9, 0xe9, 0xee, 0xc0, 0x9b,
0x3c, 0x10, 0x7f, 0x38, 0x71, 0x6d, 0xf7, 0xcc, 0xa5, 0xec, 0xa5, 0xe7, 0x9f, 0x3f, 0x70, 0xdc,
0xe1, 0x03, 0x51, 0x47, 0x1e, 0x44, 0xba, 0x4e, 0xb3, 0xe2, 0x2f, 0xb1, 0x1f, 0xff, 0x2b, 0x00,
0x00, 0xff, 0xff, 0xe2, 0xcb, 0x48, 0x96, 0xb9, 0x1d, 0x00, 0x00,
// 2997 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0x4b, 0x77, 0xdb, 0xc8,
0xb1, 0x1e, 0x90, 0x14, 0x45, 0x16, 0x1f, 0x82, 0x5a, 0xb2, 0xc5, 0x4b, 0xf9, 0xa1, 0xc1, 0x3c,
0xcc, 0xeb, 0x3b, 0x23, 0x7b, 0x34, 0xf7, 0xce, 0xcc, 0xbd, 0xf3, 0xb8, 0x43, 0x91, 0x90, 0x05,
0x9b, 0x22, 0x35, 0x4d, 0xca, 0x63, 0x8f, 0x17, 0x08, 0x44, 0x36, 0x45, 0x8c, 0xf0, 0x60, 0x80,
0xa6, 0x6d, 0xcd, 0x2a, 0xc9, 0x2a, 0x27, 0x3f, 0x26, 0xbf, 0x20, 0xe7, 0x24, 0x9b, 0x6c, 0xf2,
0x27, 0xb2, 0xcd, 0x36, 0x9b, 0xac, 0x73, 0xfa, 0x01, 0x10, 0xa0, 0x28, 0xd9, 0x79, 0x6c, 0x24,
0xe0, 0xab, 0xaf, 0xab, 0xab, 0xbb, 0xab, 0xaa, 0x0b, 0x45, 0xb8, 0x19, 0xf8, 0x33, 0x4a, 0x82,
0x60, 0x3a, 0x7c, 0x20, 0x9e, 0x76, 0xa7, 0x81, 0x4f, 0x7d, 0x54, 0x8c, 0xf1, 0x7a, 0x31, 0x98,
0x0e, 0x05, 0xaa, 0xfd, 0x71, 0x15, 0x50, 0x9f, 0x78, 0xa3, 0x63, 0xeb, 0xc2, 0x25, 0x1e, 0xc5,
0xe4, 0xe7, 0x33, 0x12, 0x52, 0x84, 0x20, 0x37, 0x22, 0x21, 0xad, 0x29, 0x3b, 0x4a, 0xa3, 0x8c,
0xf9, 0x33, 0x52, 0x21, 0x6b, 0xb9, 0xb4, 0x96, 0xd9, 0x51, 0x1a, 0x59, 0xcc, 0x1e, 0xd1, 0x7f,
0x40, 0xc1, 0x72, 0xa9, 0xe9, 0x86, 0x16, 0xad, 0x95, 0x39, 0xbc, 0x6a, 0xb9, 0xf4, 0x28, 0xb4,
0x28, 0x7a, 0x17, 0xca, 0x53, 0xa1, 0xd2, 0x9c, 0x58, 0xe1, 0xa4, 0x96, 0xe5, 0x8a, 0x4a, 0x12,
0x3b, 0xb4, 0xc2, 0x09, 0x6a, 0x80, 0x3a, 0xb6, 0x3d, 0xcb, 0x31, 0x87, 0x0e, 0x7d, 0x69, 0x8e,
0x88, 0x43, 0xad, 0x5a, 0x6e, 0x47, 0x69, 0xac, 0xe0, 0x2a, 0xc7, 0x5b, 0x0e, 0x7d, 0xd9, 0x66,
0x68, 0x52, 0x99, 0x35, 0x1a, 0x05, 0xb5, 0xcd, 0x94, 0xb2, 0xe6, 0x68, 0x14, 0xa0, 0x7b, 0xb0,
0x16, 0x51, 0x02, 0xb1, 0x86, 0xda, 0xca, 0x8e, 0xd2, 0x28, 0xe2, 0xea, 0x34, 0xbd, 0xb2, 0x7b,
0xb0, 0x46, 0x6d, 0x97, 0xf8, 0x33, 0x6a, 0x86, 0x64, 0xe8, 0x7b, 0xa3, 0xb0, 0x96, 0x17, 0x93,
0x4a, 0xb8, 0x2f, 0x50, 0xa4, 0x41, 0x65, 0x4c, 0x88, 0xe9, 0xd8, 0xae, 0x4d, 0x4d, 0xb6, 0xc2,
0x55, 0xbe, 0xc2, 0xd2, 0x98, 0x90, 0x0e, 0xc3, 0xfa, 0x16, 0x45, 0xef, 0x43, 0x75, 0xce, 0xe1,
0xdb, 0x50, 0xe1, 0xa4, 0x72, 0x44, 0xe2, 0x7b, 0xb1, 0x0b, 0xaa, 0x3f, 0xa3, 0x67, 0xbe, 0xed,
0x9d, 0x99, 0xc3, 0x89, 0xe5, 0x99, 0xf6, 0xa8, 0x56, 0xd8, 0x51, 0x1a, 0xb9, 0xfd, 0x5c, 0x4d,
0x79, 0xa8, 0xe0, 0x6a, 0x24, 0x6d, 0x4d, 0x2c, 0xcf, 0x18, 0xa1, 0xfb, 0xb0, 0xbe, 0xc8, 0x0f,
0x6b, 0x1b, 0x3b, 0xd9, 0x46, 0x0e, 0xaf, 0xa5, 0xa9, 0x21, 0xfa, 0x10, 0xd6, 0x1c, 0x2b, 0xa4,
0xe6, 0xc4, 0x9f, 0x9a, 0xd3, 0xd9, 0xe9, 0x39, 0xb9, 0xa8, 0x55, 0xf9, 0xee, 0x54, 0x18, 0x7c,
0xe8, 0x4f, 0x8f, 0x39, 0x88, 0x6e, 0x03, 0xf0, 0x6d, 0xe6, 0xa6, 0xd6, 0x8a, 0x7c, 0xc5, 0x45,
0x86, 0x70, 0x33, 0xd1, 0x27, 0x50, 0xe2, 0xee, 0x61, 0x4e, 0x6c, 0x8f, 0x86, 0x35, 0xd8, 0xc9,
0x36, 0x4a, 0x7b, 0xea, 0xae, 0xe3, 0x31, 0x4f, 0xc1, 0x4c, 0x72, 0x68, 0x7b, 0x14, 0x43, 0x10,
0x3d, 0x86, 0x68, 0x04, 0x1b, 0xcc, 0x2d, 0xcc, 0xe1, 0x2c, 0xa4, 0xbe, 0x6b, 0x06, 0x64, 0xe8,
0x07, 0xa3, 0xb0, 0x56, 0xe2, 0x43, 0xff, 0x7b, 0x37, 0xf6, 0xb6, 0xdd, 0xcb, 0xee, 0xb5, 0xdb,
0x26, 0x21, 0x6d, 0xf1, 0x71, 0x58, 0x0c, 0xd3, 0x3d, 0x1a, 0x5c, 0xe0, 0xf5, 0xd1, 0x22, 0x8e,
0x3e, 0x02, 0x64, 0x39, 0x8e, 0xff, 0xca, 0x0c, 0x89, 0x33, 0x36, 0xe5, 0x59, 0xd6, 0xd6, 0x76,
0x94, 0x46, 0x01, 0xab, 0x5c, 0xd2, 0x27, 0xce, 0x58, 0xaa, 0x47, 0x9f, 0x41, 0x85, 0xdb, 0x34,
0x26, 0x16, 0x9d, 0x05, 0x24, 0xac, 0xa9, 0x3b, 0xd9, 0x46, 0x75, 0x6f, 0x5d, 0x2e, 0xe4, 0x40,
0xc0, 0xfb, 0x36, 0xc5, 0x65, 0xc6, 0x93, 0xef, 0x21, 0xda, 0x86, 0xa2, 0x6b, 0xbd, 0x36, 0xa7,
0x56, 0x40, 0xc3, 0xda, 0xfa, 0x8e, 0xd2, 0xa8, 0xe0, 0x82, 0x6b, 0xbd, 0x3e, 0x66, 0xef, 0x68,
0x17, 0x36, 0x3c, 0xdf, 0xb4, 0xbd, 0xb1, 0x63, 0x9f, 0x4d, 0xa8, 0x39, 0x9b, 0x8e, 0x2c, 0x4a,
0xc2, 0x1a, 0xe2, 0x36, 0xac, 0x7b, 0xbe, 0x21, 0x25, 0x27, 0x42, 0x80, 0x3e, 0x86, 0x0d, 0xa6,
0x2c, 0x9c, 0x58, 0xc1, 0xc8, 0x0c, 0xed, 0x9f, 0x88, 0xf0, 0x8c, 0x1b, 0xec, 0xc4, 0xb1, 0xea,
0x5a, 0xaf, 0xfb, 0x4c, 0xd2, 0xb7, 0x7f, 0x22, 0xcc, 0x3b, 0xea, 0x6d, 0xb8, 0xb9, 0x7c, 0x3b,
0x58, 0xc0, 0xb1, 0xf3, 0x54, 0xf8, 0x40, 0xf6, 0x88, 0x36, 0x61, 0xe5, 0xa5, 0xe5, 0xcc, 0x08,
0x0f, 0xc2, 0x32, 0x16, 0x2f, 0xff, 0x97, 0xf9, 0x42, 0xd1, 0x26, 0xb0, 0x31, 0x08, 0xac, 0xe1,
0xf9, 0x42, 0x1c, 0x2f, 0x86, 0xa1, 0x72, 0x39, 0x0c, 0xaf, 0x58, 0x5e, 0xe6, 0x8a, 0xe5, 0x69,
0xdf, 0xc0, 0x1a, 0x77, 0x88, 0x03, 0x42, 0xae, 0xcb, 0x16, 0x5b, 0xc0, 0x72, 0x01, 0x0f, 0x1c,
0x91, 0x31, 0xf2, 0x96, 0xcb, 0x62, 0x46, 0x1b, 0x81, 0x3a, 0x1f, 0x1f, 0x4e, 0x7d, 0x2f, 0x24,
0x2c, 0x15, 0x30, 0x7f, 0x61, 0x0e, 0xcf, 0xe2, 0x89, 0xef, 0x97, 0xc2, 0x47, 0x55, 0x25, 0x7e,
0x40, 0xf8, 0x6e, 0x31, 0x7f, 0x67, 0x71, 0x6a, 0x3a, 0xfe, 0xf0, 0x9c, 0xe5, 0x0c, 0xeb, 0x42,
0xaa, 0xaf, 0x30, 0xb8, 0xe3, 0x0f, 0xcf, 0xdb, 0x0c, 0xd4, 0x5e, 0x88, 0xb4, 0x36, 0xf0, 0xf9,
0x5c, 0xff, 0xc0, 0x76, 0x68, 0xb0, 0xc2, 0x5d, 0x97, 0xab, 0x2d, 0xed, 0x95, 0x93, 0x31, 0x80,
0x85, 0x48, 0x7b, 0x01, 0x1b, 0x29, 0xe5, 0x72, 0x15, 0x75, 0x28, 0x4c, 0x03, 0x62, 0xbb, 0xd6,
0x19, 0x91, 0x9a, 0xe3, 0x77, 0xd4, 0x80, 0xd5, 0xb1, 0x65, 0x3b, 0xb3, 0x20, 0x52, 0x5c, 0x8d,
0x7c, 0x52, 0xa0, 0x38, 0x12, 0x6b, 0xb7, 0xa0, 0x8e, 0x49, 0x48, 0xe8, 0x91, 0x1d, 0x86, 0xb6,
0xef, 0xb5, 0x7c, 0x8f, 0x06, 0xbe, 0x23, 0x57, 0xa0, 0xdd, 0x86, 0xed, 0xa5, 0x52, 0x61, 0x02,
0x1b, 0xfc, 0xdd, 0x8c, 0x04, 0x17, 0xcb, 0x07, 0x7f, 0x07, 0xdb, 0x4b, 0xa5, 0xd2, 0xfe, 0x8f,
0x60, 0x65, 0x6a, 0xd9, 0x01, 0x3b, 0x7b, 0x16, 0xc3, 0x37, 0x13, 0x31, 0x7c, 0x6c, 0xd9, 0xc1,
0xa1, 0x1d, 0x52, 0x3f, 0xb8, 0xc0, 0x82, 0xf4, 0x38, 0x57, 0x50, 0xd4, 0x8c, 0xd6, 0x81, 0x5b,
0xcf, 0x0c, 0x77, 0xea, 0x07, 0xcb, 0xed, 0x9d, 0xeb, 0x54, 0xde, 0x42, 0xa7, 0x76, 0x17, 0x6e,
0x5f, 0xa1, 0x4d, 0xae, 0xef, 0x37, 0x0a, 0x94, 0x12, 0xe3, 0x58, 0xe0, 0x7a, 0xfe, 0x88, 0x98,
0xe3, 0xc0, 0x77, 0xa3, 0x3d, 0x67, 0xc0, 0x41, 0xe0, 0xbb, 0xcc, 0x05, 0xb9, 0x90, 0xfa, 0x32,
0x5e, 0xf2, 0xec, 0x75, 0xe0, 0xa3, 0x8f, 0x61, 0x75, 0x22, 0x14, 0xf0, 0xa4, 0x5e, 0xda, 0xdb,
0x58, 0x30, 0xab, 0x6d, 0x51, 0x0b, 0x47, 0x9c, 0xc7, 0xb9, 0x42, 0x56, 0xcd, 0x3d, 0xce, 0x15,
0x72, 0xea, 0xca, 0xe3, 0x5c, 0x61, 0x45, 0xcd, 0x3f, 0xce, 0x15, 0xf2, 0xea, 0xaa, 0xf6, 0x17,
0x05, 0x0a, 0x11, 0x9b, 0x59, 0xc2, 0x4e, 0xd0, 0x64, 0x6e, 0x28, 0x7d, 0xb7, 0xc0, 0x80, 0x81,
0xed, 0x12, 0xb4, 0x03, 0x65, 0x2e, 0x4c, 0x47, 0x04, 0x30, 0xac, 0xc9, 0xa3, 0x82, 0xdf, 0x36,
0x11, 0x83, 0xbb, 0x7f, 0x4e, 0xde, 0x36, 0x82, 0x12, 0xdd, 0xa9, 0xe1, 0x6c, 0x38, 0x24, 0x61,
0x28, 0x66, 0x59, 0x11, 0x14, 0x89, 0xf1, 0x89, 0x3e, 0x84, 0xb5, 0x88, 0x12, 0xcd, 0x95, 0x17,
0xe1, 0x21, 0x61, 0x39, 0x5d, 0x03, 0xd4, 0x24, 0xcf, 0x9d, 0xdf, 0x6f, 0xd5, 0x39, 0x91, 0x4d,
0x2a, 0x16, 0xaf, 0xed, 0xc0, 0x9d, 0x47, 0x8b, 0x4e, 0xd7, 0xf2, 0xbd, 0xb1, 0x7d, 0x16, 0xf9,
0xd6, 0x0f, 0x70, 0xf7, 0x4a, 0x86, 0xf4, 0xaf, 0xcf, 0x21, 0x3f, 0xe4, 0x08, 0xdf, 0x9f, 0xd2,
0xde, 0xdd, 0xc4, 0xae, 0x2f, 0x1d, 0x28, 0xe9, 0xda, 0x73, 0xb8, 0xd3, 0xbf, 0x76, 0xf6, 0x7f,
0x5e, 0xf5, 0xbb, 0x70, 0xb7, 0x7f, 0xbd, 0xd9, 0xda, 0x2f, 0x32, 0xb0, 0xb9, 0x8c, 0xc0, 0xee,
0xe9, 0x89, 0xe5, 0x8c, 0x4d, 0xc7, 0x1e, 0x93, 0xb8, 0x98, 0x10, 0xd9, 0x7a, 0x8d, 0x09, 0x3a,
0xf6, 0x98, 0x44, 0xd5, 0xc4, 0x3d, 0x58, 0xe3, 0x57, 0x74, 0xe0, 0x9f, 0x5a, 0xa7, 0xb6, 0x63,
0x53, 0x91, 0xb7, 0x32, 0xb8, 0x3a, 0xf1, 0xa7, 0xc7, 0x73, 0x14, 0xdd, 0x84, 0xfc, 0x2b, 0xc2,
0xf2, 0x2d, 0x2f, 0x99, 0x32, 0x58, 0xbe, 0xa1, 0xcf, 0x60, 0xcb, 0xb5, 0x5e, 0xdb, 0xee, 0xcc,
0x35, 0xe7, 0x85, 0x4e, 0x38, 0x73, 0x68, 0xc8, 0x5d, 0xa5, 0x82, 0x6f, 0x48, 0x71, 0x7c, 0x03,
0x70, 0x21, 0x6a, 0xc1, 0x1d, 0xd7, 0xf6, 0xf8, 0x38, 0x99, 0x61, 0xcc, 0x80, 0x38, 0xd6, 0x6b,
0xd3, 0xf6, 0x28, 0x09, 0x5e, 0x5a, 0x0e, 0x77, 0xa3, 0x1c, 0xde, 0x96, 0xac, 0x28, 0x1f, 0x31,
0x8e, 0x21, 0x29, 0xda, 0x8f, 0xb0, 0xc5, 0x13, 0x47, 0xc2, 0xd0, 0x68, 0xe7, 0x99, 0xdf, 0x07,
0xbe, 0x6b, 0xb2, 0xd0, 0x8a, 0x22, 0x90, 0x01, 0x5d, 0x7f, 0x44, 0x58, 0x04, 0x52, 0x5f, 0x88,
0x64, 0x04, 0x52, 0x9f, 0x0b, 0x92, 0x95, 0x63, 0x36, 0x55, 0x39, 0x6a, 0xe7, 0x50, 0xbb, 0x3c,
0x97, 0xf4, 0xa0, 0x1d, 0x28, 0x25, 0x77, 0x90, 0x4d, 0xa7, 0xe0, 0x24, 0x94, 0x0c, 0xed, 0xcc,
0x9b, 0x43, 0x5b, 0xfb, 0x93, 0x02, 0xeb, 0xfb, 0x33, 0xdb, 0x19, 0xa5, 0xae, 0x89, 0xa4, 0x75,
0x4a, 0xba, 0xae, 0x5d, 0x56, 0xb4, 0x66, 0x96, 0x16, 0xad, 0x1f, 0x2d, 0xa9, 0xfa, 0xb2, 0xbc,
0xea, 0xcb, 0x2c, 0xa9, 0xf9, 0xee, 0x42, 0x69, 0x5e, 0xc2, 0xb1, 0x23, 0xcd, 0x36, 0xca, 0x18,
0x26, 0x51, 0xfd, 0x16, 0x5e, 0xaa, 0x81, 0x57, 0x2e, 0xd5, 0xc0, 0xda, 0x17, 0x80, 0x92, 0x6b,
0x91, 0x7b, 0x16, 0x5f, 0x68, 0xca, 0xd5, 0x17, 0xda, 0x2d, 0xa8, 0xf7, 0x67, 0xa7, 0xe1, 0x30,
0xb0, 0x4f, 0xc9, 0x21, 0x75, 0x86, 0xfa, 0x4b, 0xe2, 0xd1, 0x30, 0x0a, 0xed, 0xbf, 0xe5, 0xa0,
0x18, 0xa3, 0xac, 0x5e, 0xb0, 0xbd, 0xa1, 0xef, 0x46, 0xeb, 0xf2, 0x88, 0xc3, 0x96, 0x26, 0xfc,
0x7e, 0x3d, 0x12, 0xb5, 0x84, 0xc4, 0x18, 0x31, 0x7e, 0x6a, 0x1f, 0x24, 0x3f, 0x23, 0xf8, 0xc9,
0x6d, 0x10, 0xfc, 0x06, 0xa8, 0xb1, 0xfe, 0x09, 0x75, 0x86, 0xf1, 0xbe, 0xe1, 0x6a, 0x84, 0x33,
0x63, 0x04, 0x33, 0xd6, 0x1c, 0x31, 0x73, 0x82, 0x19, 0xe1, 0x92, 0xf9, 0x2e, 0x94, 0x59, 0xc6,
0x0c, 0xa9, 0xe5, 0x4e, 0x4d, 0x2f, 0x94, 0x2e, 0x5f, 0x8a, 0xb1, 0x6e, 0x88, 0xbe, 0x06, 0x20,
0x6c, 0x7d, 0x26, 0xbd, 0x98, 0x12, 0x9e, 0x34, 0xab, 0x7b, 0x77, 0x12, 0xbe, 0x13, 0x6f, 0xc0,
0x2e, 0xff, 0x3b, 0xb8, 0x98, 0x12, 0x5c, 0x24, 0xd1, 0x23, 0xfa, 0x06, 0x2a, 0x63, 0x3f, 0x78,
0xc5, 0x4a, 0x3e, 0x0e, 0xca, 0x8b, 0x65, 0x2b, 0xa1, 0xe1, 0x40, 0xc8, 0xf9, 0xf0, 0xc3, 0x77,
0x70, 0x79, 0x9c, 0x78, 0x47, 0x4f, 0x00, 0x45, 0xe3, 0xf9, 0x3d, 0x20, 0x94, 0x14, 0xb8, 0x92,
0xed, 0xcb, 0x4a, 0x58, 0x94, 0x46, 0x8a, 0xd4, 0xf1, 0x02, 0x86, 0xbe, 0x84, 0x72, 0x48, 0x28,
0x75, 0x88, 0x54, 0x53, 0xe4, 0x6a, 0x6e, 0xa6, 0x6a, 0x72, 0x26, 0x8e, 0x34, 0x94, 0xc2, 0xf9,
0x2b, 0xda, 0x87, 0x35, 0xc7, 0xf6, 0xce, 0x93, 0x66, 0x00, 0x1f, 0x5f, 0x4b, 0x8c, 0xef, 0xd8,
0xde, 0x79, 0xd2, 0x86, 0x8a, 0x93, 0x04, 0xb4, 0xaf, 0xa0, 0x18, 0xef, 0x12, 0x2a, 0xc1, 0xea,
0x49, 0xf7, 0x49, 0xb7, 0xf7, 0x7d, 0x57, 0x7d, 0x07, 0x15, 0x20, 0xd7, 0xd7, 0xbb, 0x6d, 0x55,
0x61, 0x30, 0xd6, 0x5b, 0xba, 0xf1, 0x54, 0x57, 0x33, 0xec, 0xe5, 0xa0, 0x87, 0xbf, 0x6f, 0xe2,
0xb6, 0x9a, 0xdd, 0x5f, 0x85, 0x15, 0x3e, 0xaf, 0xf6, 0x3b, 0x05, 0x0a, 0xfc, 0x04, 0xbd, 0xb1,
0x8f, 0xfe, 0x0b, 0x62, 0xe7, 0xe2, 0xd7, 0x1f, 0xab, 0x00, 0xb9, 0xd7, 0x55, 0x70, 0xec, 0x30,
0x03, 0x89, 0x33, 0x72, 0xec, 0x1a, 0x31, 0x39, 0x23, 0xc8, 0x91, 0x20, 0x26, 0xdf, 0x4f, 0x68,
0x4e, 0x65, 0xa5, 0x1c, 0x5e, 0x8b, 0x04, 0xd1, 0x1d, 0x9c, 0xfc, 0x36, 0x4b, 0xdd, 0xd5, 0x89,
0x6f, 0x33, 0xc9, 0xd5, 0x3e, 0x87, 0x72, 0xf2, 0xcc, 0xd1, 0x3d, 0xc8, 0xd9, 0xde, 0xd8, 0x97,
0x81, 0xb8, 0xb1, 0xe0, 0x5c, 0x6c, 0x91, 0x98, 0x13, 0x34, 0x04, 0xea, 0xe2, 0x39, 0x6b, 0x15,
0x28, 0x25, 0x0e, 0x4d, 0xfb, 0xb3, 0x02, 0x95, 0xd4, 0x21, 0xbc, 0xb5, 0x76, 0xf4, 0x35, 0x94,
0x5f, 0xd9, 0x01, 0x31, 0x93, 0xf5, 0x68, 0x75, 0xaf, 0x9e, 0xae, 0x47, 0xa3, 0xff, 0x2d, 0x7f,
0x44, 0x70, 0x89, 0xf1, 0x25, 0x80, 0xfe, 0x1f, 0xaa, 0xd1, 0x45, 0x32, 0x22, 0xd4, 0xb2, 0x1d,
0xbe, 0x55, 0xd5, 0x94, 0x7b, 0x48, 0x6e, 0x9b, 0xcb, 0x71, 0x65, 0x9c, 0x7c, 0x45, 0x1f, 0xcc,
0x15, 0x84, 0x34, 0xb0, 0xbd, 0x33, 0xbe, 0x7f, 0xc5, 0x98, 0xd6, 0xe7, 0x20, 0x2b, 0xf5, 0x2a,
0xf2, 0x2e, 0xeb, 0x53, 0x8b, 0xce, 0xd8, 0x87, 0xd5, 0x4a, 0x48, 0x2d, 0x99, 0xc9, 0xaa, 0xa9,
0xd8, 0x4a, 0x10, 0x09, 0x16, 0xac, 0x54, 0x39, 0x9e, 0xb9, 0x54, 0x8e, 0xaf, 0xb0, 0x8c, 0x21,
0x12, 0x6d, 0x69, 0x0f, 0xc9, 0xc5, 0x1f, 0x0e, 0x3a, 0xad, 0x26, 0xa5, 0xc4, 0x9d, 0x52, 0x2c,
0x08, 0xb2, 0xfe, 0xf9, 0x06, 0xa0, 0x65, 0x07, 0xc3, 0x99, 0x4d, 0x9f, 0x90, 0x0b, 0x76, 0xad,
0x45, 0x19, 0x5d, 0xa4, 0xbd, 0xfc, 0x50, 0x64, 0xf1, 0x2d, 0x58, 0x8d, 0x12, 0x91, 0xc8, 0x6f,
0xf9, 0x09, 0x4f, 0x40, 0xda, 0xef, 0x73, 0xb0, 0x2d, 0x8f, 0x54, 0x9c, 0x06, 0x25, 0xc1, 0x90,
0x4c, 0xe3, 0xef, 0xb4, 0x47, 0xb0, 0x39, 0x4f, 0xaa, 0x62, 0x22, 0x33, 0xfa, 0xf6, 0x2b, 0xed,
0xdd, 0x48, 0xac, 0x74, 0x6e, 0x06, 0x46, 0x71, 0xb2, 0x9d, 0x9b, 0xf6, 0x30, 0xa1, 0xc8, 0x72,
0xfd, 0x99, 0x27, 0x5d, 0x54, 0x64, 0x3c, 0x34, 0x77, 0x67, 0x26, 0xe2, 0x1e, 0x7d, 0x0f, 0x62,
0x27, 0x37, 0xc9, 0xeb, 0xa9, 0x1d, 0x5c, 0xf0, 0xec, 0x57, 0x99, 0xa7, 0x5b, 0x9d, 0xa3, 0x97,
0x3e, 0x9e, 0x32, 0x97, 0x3f, 0x9e, 0xbe, 0x84, 0x7a, 0x1c, 0x1d, 0xb2, 0x0d, 0x43, 0x46, 0xf1,
0xed, 0xb7, 0xca, 0x6d, 0xd8, 0x8a, 0x18, 0x38, 0x22, 0xc8, 0x2b, 0xf0, 0x21, 0x6c, 0x26, 0x42,
0x6b, 0x6e, 0xba, 0x88, 0x44, 0x34, 0x8f, 0xae, 0xa4, 0xe9, 0xf1, 0x08, 0x69, 0xba, 0xa8, 0x85,
0xe2, 0xfc, 0x2f, 0x4d, 0xff, 0x19, 0x54, 0x17, 0xda, 0x14, 0x05, 0x7e, 0xee, 0xff, 0x7b, 0x39,
0xb3, 0x2e, 0x3b, 0x9e, 0xdd, 0x25, 0xbd, 0x8a, 0xca, 0x30, 0xd5, 0xa7, 0xb8, 0x0d, 0xe0, 0x7b,
0xb6, 0xef, 0x99, 0xa7, 0x8e, 0x7f, 0xca, 0x13, 0x6e, 0x19, 0x17, 0x39, 0xb2, 0xef, 0xf8, 0xa7,
0xf5, 0x6f, 0x01, 0xfd, 0x8b, 0x1f, 0xf8, 0x7f, 0x50, 0xe0, 0xd6, 0x72, 0x13, 0xe5, 0x3d, 0xff,
0x6f, 0x73, 0xa1, 0x2f, 0x21, 0x6f, 0x0d, 0xa9, 0xed, 0x7b, 0x32, 0x33, 0xbc, 0x97, 0x18, 0x8a,
0x49, 0xe8, 0x3b, 0x2f, 0xc9, 0xa1, 0xef, 0x8c, 0xa4, 0x31, 0x4d, 0x4e, 0xc5, 0x72, 0x48, 0x2a,
0xe8, 0xb2, 0xe9, 0xa0, 0xd3, 0x7e, 0xa5, 0xc0, 0x96, 0xe8, 0x22, 0xb0, 0x13, 0x17, 0x41, 0x1d,
0x05, 0xc0, 0x1e, 0x00, 0x77, 0x93, 0xa9, 0x6f, 0x7b, 0x34, 0xce, 0x61, 0x22, 0x2a, 0x65, 0x6d,
0x70, 0xcc, 0x44, 0xb8, 0xc8, 0x68, 0xfc, 0x11, 0x7d, 0xba, 0x60, 0x68, 0xf2, 0x9e, 0x9c, 0xcf,
0x90, 0x36, 0x50, 0xab, 0x43, 0xed, 0xb2, 0x0d, 0x62, 0x0b, 0xef, 0xff, 0x32, 0x07, 0x95, 0x54,
0xea, 0x4a, 0xdf, 0x5d, 0x15, 0x28, 0x76, 0x7b, 0x66, 0x5b, 0x1f, 0x34, 0x8d, 0x8e, 0xaa, 0x20,
0x15, 0xca, 0xbd, 0xae, 0xd1, 0xeb, 0x9a, 0x6d, 0xbd, 0xd5, 0x6b, 0xb3, 0x5b, 0xec, 0x06, 0xac,
0x77, 0x8c, 0xee, 0x13, 0xb3, 0xdb, 0x1b, 0x98, 0x7a, 0xc7, 0x78, 0x64, 0xec, 0x77, 0x74, 0x35,
0x8b, 0x36, 0x41, 0xed, 0x75, 0xcd, 0xd6, 0x61, 0xd3, 0xe8, 0x9a, 0x03, 0xe3, 0x48, 0xef, 0x9d,
0x0c, 0xd4, 0x1c, 0x43, 0x59, 0xba, 0x31, 0xf5, 0x67, 0x2d, 0x5d, 0x6f, 0xf7, 0xcd, 0xa3, 0xe6,
0x33, 0x75, 0x05, 0xd5, 0x60, 0xd3, 0xe8, 0xf6, 0x4f, 0x0e, 0x0e, 0x8c, 0x96, 0xa1, 0x77, 0x07,
0xe6, 0x7e, 0xb3, 0xd3, 0xec, 0xb6, 0x74, 0x35, 0x8f, 0x6e, 0x02, 0x32, 0xba, 0xad, 0xde, 0xd1,
0x71, 0x47, 0x1f, 0xe8, 0x66, 0x74, 0x5b, 0xae, 0xa2, 0x0d, 0x58, 0xe3, 0x7a, 0x9a, 0xed, 0xb6,
0x79, 0xd0, 0x34, 0x3a, 0x7a, 0x5b, 0x2d, 0x30, 0x4b, 0x24, 0xa3, 0x6f, 0xb6, 0x8d, 0x7e, 0x73,
0x9f, 0xc1, 0x45, 0x36, 0xa7, 0xd1, 0x7d, 0xda, 0x33, 0x5a, 0xba, 0xd9, 0x62, 0x6a, 0x19, 0x0a,
0x8c, 0x1c, 0xa1, 0x27, 0xdd, 0xb6, 0x8e, 0x8f, 0x9b, 0x46, 0x5b, 0x2d, 0xa1, 0x6d, 0xd8, 0x8a,
0x60, 0xfd, 0xd9, 0xb1, 0x81, 0x9f, 0x9b, 0x83, 0x5e, 0xcf, 0xec, 0xf7, 0x7a, 0x5d, 0xb5, 0x9c,
0xd4, 0xc4, 0x56, 0xdb, 0x3b, 0xd6, 0xbb, 0x6a, 0x05, 0x6d, 0xc1, 0xc6, 0xd1, 0xf1, 0xb1, 0x19,
0x49, 0xa2, 0xc5, 0x56, 0x19, 0xbd, 0xd9, 0x6e, 0x63, 0xbd, 0xdf, 0x37, 0x8f, 0x8c, 0xfe, 0x51,
0x73, 0xd0, 0x3a, 0x54, 0xd7, 0xd8, 0x92, 0xfa, 0xfa, 0xc0, 0x1c, 0xf4, 0x06, 0xcd, 0xce, 0x1c,
0x57, 0x99, 0x41, 0x73, 0x9c, 0x4d, 0xda, 0xe9, 0x7d, 0xaf, 0xae, 0xb3, 0x0d, 0x67, 0x70, 0xef,
0xa9, 0x34, 0x11, 0xb1, 0xb5, 0xcb, 0xe3, 0x89, 0xe6, 0x54, 0x37, 0x18, 0x68, 0x74, 0x9f, 0x36,
0x3b, 0x46, 0xdb, 0x7c, 0xa2, 0x3f, 0xe7, 0xd5, 0xc6, 0x26, 0x03, 0x85, 0x65, 0xe6, 0x31, 0xee,
0x3d, 0x62, 0x86, 0xa8, 0x37, 0x10, 0x82, 0x6a, 0xcb, 0xc0, 0xad, 0x93, 0x4e, 0x13, 0x9b, 0xb8,
0x77, 0x32, 0xd0, 0xd5, 0x9b, 0xf7, 0x7f, 0xab, 0x40, 0x39, 0x79, 0x9b, 0xb0, 0x53, 0x37, 0xba,
0xe6, 0x41, 0xc7, 0x78, 0x74, 0x38, 0x10, 0x4e, 0xd0, 0x3f, 0x69, 0xb1, 0x23, 0xd3, 0x59, 0x15,
0x83, 0xa0, 0x2a, 0x36, 0x3d, 0x5e, 0x6c, 0x86, 0xcd, 0x25, 0xb1, 0x6e, 0x4f, 0xea, 0xcd, 0x32,
0xe3, 0x25, 0xa8, 0x63, 0xdc, 0xc3, 0x6a, 0x0e, 0xbd, 0x0f, 0x3b, 0x12, 0x61, 0xe7, 0x8a, 0xb1,
0xde, 0x1a, 0x98, 0xc7, 0xcd, 0xe7, 0x47, 0xec, 0xd8, 0x85, 0x93, 0xf5, 0xd5, 0x15, 0x74, 0x17,
0xb6, 0x63, 0xd6, 0x32, 0xbf, 0xb8, 0xff, 0x15, 0xd4, 0xae, 0x8a, 0x4a, 0x04, 0x90, 0xef, 0xeb,
0x83, 0x41, 0x47, 0x17, 0x95, 0xd7, 0x81, 0x70, 0x5c, 0x80, 0x3c, 0xd6, 0xfb, 0x27, 0x47, 0xba,
0x9a, 0xb9, 0xff, 0x3f, 0xa0, 0x2e, 0x86, 0x0a, 0x93, 0xeb, 0x5d, 0xe6, 0x32, 0xea, 0x3b, 0x2c,
0x00, 0xa4, 0xff, 0xa8, 0x0a, 0x53, 0xd1, 0x3c, 0x19, 0xf4, 0xd4, 0xcc, 0xde, 0x5f, 0x4b, 0x90,
0xe7, 0x5f, 0x10, 0x01, 0xfa, 0x16, 0x2a, 0x89, 0x0e, 0xef, 0xd3, 0x3d, 0x74, 0xfb, 0xda, 0xde,
0x6f, 0x3d, 0x6a, 0x7c, 0x49, 0xf8, 0xa1, 0x82, 0xf6, 0xa1, 0x9a, 0xec, 0x5d, 0x3e, 0xdd, 0x43,
0xc9, 0xc2, 0x7b, 0x49, 0x5b, 0x73, 0x89, 0x8e, 0x27, 0xa0, 0xea, 0x21, 0xb5, 0x5d, 0x76, 0xff,
0xcb, 0xee, 0x22, 0xaa, 0x27, 0x13, 0x57, 0xba, 0x65, 0x59, 0xdf, 0x5e, 0x2a, 0x93, 0xa9, 0xf4,
0x3b, 0x56, 0x6b, 0xc5, 0xfd, 0xbd, 0x4b, 0x0b, 0x4a, 0x37, 0x15, 0xeb, 0x77, 0xae, 0x12, 0xcb,
0xfe, 0x41, 0xf6, 0xd7, 0x19, 0xb6, 0xc6, 0x4a, 0x42, 0xb6, 0x64, 0x97, 0x16, 0x94, 0x2e, 0xa9,
0x48, 0xd0, 0x08, 0x36, 0x96, 0xf4, 0xfe, 0xd0, 0x07, 0xe9, 0xfc, 0x7c, 0x45, 0xe7, 0xb0, 0xfe,
0xe1, 0x9b, 0x68, 0x72, 0xf1, 0x23, 0xd8, 0x58, 0xd2, 0x24, 0x4c, 0xcd, 0x72, 0x75, 0x8b, 0x31,
0x35, 0xcb, 0x75, 0xbd, 0xc6, 0x1f, 0xe1, 0xc6, 0xd2, 0x4e, 0x1f, 0xba, 0x97, 0x50, 0x70, 0x5d,
0x67, 0xb1, 0xde, 0x78, 0x33, 0x51, 0xce, 0x35, 0x85, 0xad, 0x2b, 0x5a, 0x53, 0xe8, 0x3f, 0x13,
0x4a, 0xae, 0x6f, 0x70, 0xd5, 0xef, 0xbf, 0x0d, 0x75, 0x3e, 0x63, 0xff, 0x2d, 0x66, 0xec, 0xbf,
0xfd, 0x8c, 0x6f, 0x68, 0x52, 0xa1, 0x17, 0xa0, 0x2e, 0x76, 0x4d, 0x90, 0xb6, 0x78, 0x16, 0x97,
0xdb, 0x37, 0xf5, 0xf7, 0xae, 0xe5, 0x48, 0xe5, 0x06, 0xc0, 0xbc, 0xb1, 0x80, 0x6e, 0x25, 0x86,
0x5c, 0xea, 0x9d, 0xd4, 0x6f, 0x5f, 0x21, 0x95, 0xaa, 0x06, 0xb0, 0xb1, 0xa4, 0xd3, 0x90, 0xf2,
0xae, 0xab, 0x3b, 0x11, 0xf5, 0xcd, 0x65, 0x1f, 0xe4, 0x0f, 0x15, 0x74, 0x24, 0x02, 0x36, 0xfa,
0x19, 0xe8, 0x0d, 0x19, 0xa8, 0xb6, 0xfc, 0xc3, 0x61, 0x16, 0xf2, 0x50, 0x7d, 0xa8, 0xa0, 0x1e,
0x94, 0x93, 0x59, 0xe7, 0x8d, 0xe9, 0xe8, 0x8d, 0x0a, 0xc7, 0xb0, 0x96, 0x2a, 0xda, 0xfc, 0x20,
0xe5, 0xe7, 0xd7, 0xd5, 0x75, 0xa9, 0x88, 0xba, 0xa6, 0x46, 0x6d, 0xb0, 0x79, 0x5e, 0x80, 0xba,
0x58, 0xdc, 0xa4, 0xbc, 0xe0, 0x8a, 0xea, 0x2b, 0xe5, 0x05, 0x57, 0x55, 0x47, 0xfb, 0x9f, 0xfc,
0xf0, 0xe0, 0xcc, 0xa6, 0x93, 0xd9, 0xe9, 0xee, 0xd0, 0x77, 0x1f, 0xf0, 0xdf, 0x84, 0x3c, 0xdb,
0x3b, 0xf3, 0x08, 0x7d, 0xe5, 0x07, 0xe7, 0x0f, 0x1c, 0x6f, 0xf4, 0x80, 0xe7, 0xac, 0x07, 0xb1,
0xae, 0xd3, 0x3c, 0xff, 0x91, 0xf9, 0xd3, 0xbf, 0x07, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x50, 0x5a,
0xbb, 0x94, 0x1e, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -2647,6 +2723,12 @@ type RouterClient interface {
//It is a development feature.
QueryMissionControl(ctx context.Context, in *QueryMissionControlRequest, opts ...grpc.CallOption) (*QueryMissionControlResponse, error)
//
//XImportMissionControl is an experimental API that imports the state provided
//to the internal mission control's state, using all results which are more
//recent than our existing values. These values will only be imported
//in-memory, and will not be persisted across restarts.
XImportMissionControl(ctx context.Context, in *XImportMissionControlRequest, opts ...grpc.CallOption) (*XImportMissionControlResponse, error)
//
//GetMissionControlConfig returns mission control's current config.
GetMissionControlConfig(ctx context.Context, in *GetMissionControlConfigRequest, opts ...grpc.CallOption) (*GetMissionControlConfigResponse, error)
//
@@ -2808,6 +2890,15 @@ func (c *routerClient) QueryMissionControl(ctx context.Context, in *QueryMission
return out, nil
}
func (c *routerClient) XImportMissionControl(ctx context.Context, in *XImportMissionControlRequest, opts ...grpc.CallOption) (*XImportMissionControlResponse, error) {
out := new(XImportMissionControlResponse)
err := c.cc.Invoke(ctx, "/routerrpc.Router/XImportMissionControl", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *routerClient) GetMissionControlConfig(ctx context.Context, in *GetMissionControlConfigRequest, opts ...grpc.CallOption) (*GetMissionControlConfigResponse, error) {
out := new(GetMissionControlConfigResponse)
err := c.cc.Invoke(ctx, "/routerrpc.Router/GetMissionControlConfig", in, out, opts...)
@@ -3019,6 +3110,12 @@ type RouterServer interface {
//It is a development feature.
QueryMissionControl(context.Context, *QueryMissionControlRequest) (*QueryMissionControlResponse, error)
//
//XImportMissionControl is an experimental API that imports the state provided
//to the internal mission control's state, using all results which are more
//recent than our existing values. These values will only be imported
//in-memory, and will not be persisted across restarts.
XImportMissionControl(context.Context, *XImportMissionControlRequest) (*XImportMissionControlResponse, error)
//
//GetMissionControlConfig returns mission control's current config.
GetMissionControlConfig(context.Context, *GetMissionControlConfigRequest) (*GetMissionControlConfigResponse, error)
//
@@ -3087,6 +3184,9 @@ func (*UnimplementedRouterServer) ResetMissionControl(ctx context.Context, req *
func (*UnimplementedRouterServer) QueryMissionControl(ctx context.Context, req *QueryMissionControlRequest) (*QueryMissionControlResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method QueryMissionControl not implemented")
}
func (*UnimplementedRouterServer) XImportMissionControl(ctx context.Context, req *XImportMissionControlRequest) (*XImportMissionControlResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method XImportMissionControl not implemented")
}
func (*UnimplementedRouterServer) GetMissionControlConfig(ctx context.Context, req *GetMissionControlConfigRequest) (*GetMissionControlConfigResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetMissionControlConfig not implemented")
}
@@ -3251,6 +3351,24 @@ func _Router_QueryMissionControl_Handler(srv interface{}, ctx context.Context, d
return interceptor(ctx, in, info, handler)
}
func _Router_XImportMissionControl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(XImportMissionControlRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(RouterServer).XImportMissionControl(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/routerrpc.Router/XImportMissionControl",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(RouterServer).XImportMissionControl(ctx, req.(*XImportMissionControlRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Router_GetMissionControlConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetMissionControlConfigRequest)
if err := dec(in); err != nil {
@@ -3454,6 +3572,10 @@ var _Router_serviceDesc = grpc.ServiceDesc{
MethodName: "QueryMissionControl",
Handler: _Router_QueryMissionControl_Handler,
},
{
MethodName: "XImportMissionControl",
Handler: _Router_XImportMissionControl_Handler,
},
{
MethodName: "GetMissionControlConfig",
Handler: _Router_GetMissionControlConfig_Handler,
+78
View File
@@ -222,6 +222,40 @@ func local_request_Router_QueryMissionControl_0(ctx context.Context, marshaler r
}
func request_Router_XImportMissionControl_0(ctx context.Context, marshaler runtime.Marshaler, client RouterClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq XImportMissionControlRequest
var metadata runtime.ServerMetadata
newReader, berr := utilities.IOReaderFactory(req.Body)
if berr != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
}
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := client.XImportMissionControl(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_Router_XImportMissionControl_0(ctx context.Context, marshaler runtime.Marshaler, server RouterServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq XImportMissionControlRequest
var metadata runtime.ServerMetadata
newReader, berr := utilities.IOReaderFactory(req.Body)
if berr != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
}
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := server.XImportMissionControl(ctx, &protoReq)
return msg, metadata, err
}
func request_Router_GetMissionControlConfig_0(ctx context.Context, marshaler runtime.Marshaler, client RouterClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq GetMissionControlConfigRequest
var metadata runtime.ServerMetadata
@@ -488,6 +522,26 @@ func RegisterRouterHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser
})
mux.Handle("POST", pattern_Router_XImportMissionControl_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_Router_XImportMissionControl_0(rctx, inboundMarshaler, server, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_Router_XImportMissionControl_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("GET", pattern_Router_GetMissionControlConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
@@ -716,6 +770,26 @@ func RegisterRouterHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli
})
mux.Handle("POST", pattern_Router_XImportMissionControl_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_Router_XImportMissionControl_0(rctx, inboundMarshaler, client, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_Router_XImportMissionControl_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("GET", pattern_Router_GetMissionControlConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
@@ -812,6 +886,8 @@ var (
pattern_Router_QueryMissionControl_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "router", "mc"}, "", runtime.AssumeColonVerbOpt(true)))
pattern_Router_XImportMissionControl_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "router", "ximporthistory"}, "", runtime.AssumeColonVerbOpt(true)))
pattern_Router_GetMissionControlConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "router", "mccfg"}, "", runtime.AssumeColonVerbOpt(true)))
pattern_Router_QueryProbability_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5, 1, 0, 4, 1, 5, 6}, []string{"v2", "router", "mc", "probability", "from_node", "to_node", "amt_msat"}, "", runtime.AssumeColonVerbOpt(true)))
@@ -834,6 +910,8 @@ var (
forward_Router_QueryMissionControl_0 = runtime.ForwardResponseMessage
forward_Router_XImportMissionControl_0 = runtime.ForwardResponseMessage
forward_Router_GetMissionControlConfig_0 = runtime.ForwardResponseMessage
forward_Router_QueryProbability_0 = runtime.ForwardResponseMessage
+17
View File
@@ -61,6 +61,15 @@ service Router {
rpc QueryMissionControl (QueryMissionControlRequest)
returns (QueryMissionControlResponse);
/*
XImportMissionControl is an experimental API that imports the state provided
to the internal mission control's state, using all results which are more
recent than our existing values. These values will only be imported
in-memory, and will not be persisted across restarts.
*/
rpc XImportMissionControl (XImportMissionControlRequest)
returns (XImportMissionControlResponse);
/*
GetMissionControlConfig returns mission control's current config.
*/
@@ -343,6 +352,14 @@ message QueryMissionControlResponse {
repeated PairHistory pairs = 2;
}
message XImportMissionControlRequest {
// Node pair-level mission control state to be imported.
repeated PairHistory pairs = 1;
}
message XImportMissionControlResponse {
}
// PairHistory contains the mission control state for a particular node pair.
message PairHistory {
// The source node pubkey of the pair.
+48
View File
@@ -361,6 +361,39 @@
"Router"
]
}
},
"/v2/router/ximporthistory": {
"post": {
"summary": "XImportMissionControl is an experimental API that imports the state provided\nto the internal mission control's state, using all results which are more\nrecent than our existing values. These values will only be imported\nin-memory, and will not be persisted across restarts.",
"operationId": "XImportMissionControl",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/routerrpcXImportMissionControlResponse"
}
},
"default": {
"description": "An unexpected error response",
"schema": {
"$ref": "#/definitions/runtimeError"
}
}
},
"parameters": [
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/routerrpcXImportMissionControlRequest"
}
}
],
"tags": [
"Router"
]
}
}
},
"definitions": {
@@ -1479,6 +1512,21 @@
"routerrpcUpdateChanStatusResponse": {
"type": "object"
},
"routerrpcXImportMissionControlRequest": {
"type": "object",
"properties": {
"pairs": {
"type": "array",
"items": {
"$ref": "#/definitions/routerrpcPairHistory"
},
"description": "Node pair-level mission control state to be imported."
}
}
},
"routerrpcXImportMissionControlResponse": {
"type": "object"
},
"runtimeError": {
"type": "object",
"properties": {
+5
View File
@@ -110,6 +110,11 @@ type MissionControl interface {
// state and actual probability estimates.
GetHistorySnapshot() *routing.MissionControlSnapshot
// ImportHistory imports the mission control snapshot to our internal
// state. This import will only be applied in-memory, and will not be
// persisted across restarts.
ImportHistory(*routing.MissionControlSnapshot) error
// GetPairHistorySnapshot returns the stored history for a given node
// pair.
GetPairHistorySnapshot(fromNode,
+157
View File
@@ -81,6 +81,10 @@ var (
Entity: "offchain",
Action: "read",
}},
"/routerrpc.Router/XImportMissionControl": {{
Entity: "offchain",
Action: "write",
}},
"/routerrpc.Router/GetMissionControlConfig": {{
Entity: "offchain",
Action: "read",
@@ -519,6 +523,159 @@ func toRPCPairData(data *routing.TimedPairResult) *PairData {
return &rpcData
}
// XImportMissionControl imports the state provided to our internal mission
// control. Only entries that are fresher than our existing state will be used.
func (s *Server) XImportMissionControl(ctx context.Context,
req *XImportMissionControlRequest) (*XImportMissionControlResponse,
error) {
if len(req.Pairs) == 0 {
return nil, errors.New("at least one pair required for import")
}
snapshot := &routing.MissionControlSnapshot{
Pairs: make(
[]routing.MissionControlPairSnapshot, len(req.Pairs),
),
}
for i, pairResult := range req.Pairs {
pairSnapshot, err := toPairSnapshot(pairResult)
if err != nil {
return nil, err
}
snapshot.Pairs[i] = *pairSnapshot
}
err := s.cfg.RouterBackend.MissionControl.ImportHistory(snapshot)
if err != nil {
return nil, err
}
return &XImportMissionControlResponse{}, nil
}
func toPairSnapshot(pairResult *PairHistory) (*routing.MissionControlPairSnapshot,
error) {
from, err := route.NewVertexFromBytes(pairResult.NodeFrom)
if err != nil {
return nil, err
}
to, err := route.NewVertexFromBytes(pairResult.NodeTo)
if err != nil {
return nil, err
}
pairPrefix := fmt.Sprintf("pair: %v -> %v:", from, to)
if from == to {
return nil, fmt.Errorf("%v source and destination node must "+
"differ", pairPrefix)
}
failAmt, failTime, err := getPair(
lnwire.MilliSatoshi(pairResult.History.FailAmtMsat),
btcutil.Amount(pairResult.History.FailAmtSat),
pairResult.History.FailTime,
)
if err != nil {
return nil, fmt.Errorf("%v invalid failure: %v", pairPrefix,
err)
}
successAmt, successTime, err := getPair(
lnwire.MilliSatoshi(pairResult.History.SuccessAmtMsat),
btcutil.Amount(pairResult.History.SuccessAmtSat),
pairResult.History.SuccessTime,
)
if err != nil {
return nil, fmt.Errorf("%v invalid success: %v", pairPrefix,
err)
}
if successAmt == 0 && failAmt == 0 {
return nil, fmt.Errorf("%v: either success or failure result "+
"required", pairPrefix)
}
pair := routing.NewDirectedNodePair(from, to)
result := &routing.TimedPairResult{
FailAmt: failAmt,
FailTime: failTime,
SuccessAmt: successAmt,
SuccessTime: successTime,
}
return &routing.MissionControlPairSnapshot{
Pair: pair,
TimedPairResult: *result,
}, nil
}
// getPair validates the values provided for a mission control result and
// returns the msat amount and timestamp for it.
func getPair(amtMsat lnwire.MilliSatoshi, amtSat btcutil.Amount,
timestamp int64) (lnwire.MilliSatoshi, time.Time, error) {
amt, err := getMsatPairValue(amtMsat, amtSat)
if err != nil {
return 0, time.Time{}, err
}
var (
timeSet = timestamp != 0
amountSet = amt != 0
)
switch {
case timeSet && amountSet:
return amt, time.Unix(timestamp, 0), nil
case timeSet && !amountSet:
return 0, time.Time{}, errors.New("non-zero timestamp " +
"requires non-zero amount")
case !timeSet && amountSet:
return 0, time.Time{}, errors.New("non-zero amount requires " +
"non-zero timestamp")
default:
return 0, time.Time{}, nil
}
}
// getMsatPairValue checks the msat and sat values set for a pair and ensures
// that the values provided are either the same, or only a single value is set.
func getMsatPairValue(msatValue lnwire.MilliSatoshi,
satValue btcutil.Amount) (lnwire.MilliSatoshi, error) {
// If our msat value converted to sats equals our sat value, we just
// return the msat value, since the values are the same.
if msatValue.ToSatoshis() == satValue {
return msatValue, nil
}
// If we have no msatValue, we can just return our sate value even if
// it is zero, because it's impossible that we have mismatched values.
if msatValue == 0 {
return lnwire.MilliSatoshi(satValue * 1000), nil
}
// Likewise, we can just use msat value if we have no sat value set.
if satValue == 0 {
return msatValue, nil
}
// If our values are non-zero but not equal, we have invalid amounts
// set, so we fail.
return 0, fmt.Errorf("msat: %v and sat: %v values not equal", msatValue,
satValue)
}
// QueryProbability returns the current success probability estimate for a
// given node pair and amount.
func (s *Server) QueryProbability(ctx context.Context,