Merge pull request #3972 from joostjager/notify-htlc-arrival

routing: extend trackpayment with htlc events
This commit is contained in:
Olaoluwa Osuntokun 2020-04-08 15:22:18 -07:00 committed by GitHub
commit 3ad7ab223e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 1599 additions and 1490 deletions

@ -186,38 +186,39 @@ func (p *PaymentControl) InitPayment(paymentHash lntypes.Hash,
// RegisterAttempt atomically records the provided HTLCAttemptInfo to the // RegisterAttempt atomically records the provided HTLCAttemptInfo to the
// DB. // DB.
func (p *PaymentControl) RegisterAttempt(paymentHash lntypes.Hash, func (p *PaymentControl) RegisterAttempt(paymentHash lntypes.Hash,
attempt *HTLCAttemptInfo) error { attempt *HTLCAttemptInfo) (*MPPayment, error) {
// Serialize the information before opening the db transaction. // Serialize the information before opening the db transaction.
var a bytes.Buffer var a bytes.Buffer
err := serializeHTLCAttemptInfo(&a, attempt) err := serializeHTLCAttemptInfo(&a, attempt)
if err != nil { if err != nil {
return err return nil, err
} }
htlcInfoBytes := a.Bytes() htlcInfoBytes := a.Bytes()
htlcIDBytes := make([]byte, 8) htlcIDBytes := make([]byte, 8)
binary.BigEndian.PutUint64(htlcIDBytes, attempt.AttemptID) binary.BigEndian.PutUint64(htlcIDBytes, attempt.AttemptID)
return kvdb.Batch(p.db.Backend, func(tx kvdb.RwTx) error { var payment *MPPayment
err = kvdb.Batch(p.db.Backend, func(tx kvdb.RwTx) error {
bucket, err := fetchPaymentBucketUpdate(tx, paymentHash) bucket, err := fetchPaymentBucketUpdate(tx, paymentHash)
if err != nil { if err != nil {
return err return err
} }
payment, err := fetchPayment(bucket) p, err := fetchPayment(bucket)
if err != nil { if err != nil {
return err return err
} }
// Ensure the payment is in-flight. // Ensure the payment is in-flight.
if err := ensureInFlight(payment); err != nil { if err := ensureInFlight(p); err != nil {
return err return err
} }
// We cannot register a new attempt if the payment already has // We cannot register a new attempt if the payment already has
// reached a terminal condition: // reached a terminal condition:
settle, fail := payment.TerminalInfo() settle, fail := p.TerminalInfo()
if settle != nil || fail != nil { if settle != nil || fail != nil {
return ErrPaymentTerminal return ErrPaymentTerminal
} }
@ -225,7 +226,7 @@ func (p *PaymentControl) RegisterAttempt(paymentHash lntypes.Hash,
// Make sure any existing shards match the new one with regards // Make sure any existing shards match the new one with regards
// to MPP options. // to MPP options.
mpp := attempt.Route.FinalHop().MPP mpp := attempt.Route.FinalHop().MPP
for _, h := range payment.InFlightHTLCs() { for _, h := range p.InFlightHTLCs() {
hMpp := h.Route.FinalHop().MPP hMpp := h.Route.FinalHop().MPP
switch { switch {
@ -258,13 +259,13 @@ func (p *PaymentControl) RegisterAttempt(paymentHash lntypes.Hash,
// If this is a non-MPP attempt, it must match the total amount // If this is a non-MPP attempt, it must match the total amount
// exactly. // exactly.
amt := attempt.Route.ReceiverAmt() amt := attempt.Route.ReceiverAmt()
if mpp == nil && amt != payment.Info.Value { if mpp == nil && amt != p.Info.Value {
return ErrValueMismatch return ErrValueMismatch
} }
// Ensure we aren't sending more than the total payment amount. // Ensure we aren't sending more than the total payment amount.
sentAmt, _ := payment.SentAmt() sentAmt, _ := p.SentAmt()
if sentAmt+amt > payment.Info.Value { if sentAmt+amt > p.Info.Value {
return ErrValueExceedsAmt return ErrValueExceedsAmt
} }
@ -282,8 +283,20 @@ func (p *PaymentControl) RegisterAttempt(paymentHash lntypes.Hash,
return err return err
} }
return htlcBucket.Put(htlcAttemptInfoKey, htlcInfoBytes) err = htlcBucket.Put(htlcAttemptInfoKey, htlcInfoBytes)
if err != nil {
return err
}
// Retrieve attempt info for the notification.
payment, err = fetchPayment(bucket)
return err
}) })
if err != nil {
return nil, err
}
return payment, err
} }
// SettleAttempt marks the given attempt settled with the preimage. If this is // SettleAttempt marks the given attempt settled with the preimage. If this is
@ -307,16 +320,15 @@ func (p *PaymentControl) SettleAttempt(hash lntypes.Hash,
// FailAttempt marks the given payment attempt failed. // FailAttempt marks the given payment attempt failed.
func (p *PaymentControl) FailAttempt(hash lntypes.Hash, func (p *PaymentControl) FailAttempt(hash lntypes.Hash,
attemptID uint64, failInfo *HTLCFailInfo) error { attemptID uint64, failInfo *HTLCFailInfo) (*MPPayment, error) {
var b bytes.Buffer var b bytes.Buffer
if err := serializeHTLCFailInfo(&b, failInfo); err != nil { if err := serializeHTLCFailInfo(&b, failInfo); err != nil {
return err return nil, err
} }
failBytes := b.Bytes() failBytes := b.Bytes()
_, err := p.updateHtlcKey(hash, attemptID, htlcFailInfoKey, failBytes) return p.updateHtlcKey(hash, attemptID, htlcFailInfoKey, failBytes)
return err
} }
// updateHtlcKey updates a database key for the specified htlc. // updateHtlcKey updates a database key for the specified htlc.

@ -117,13 +117,13 @@ func TestPaymentControlSwitchFail(t *testing.T) {
// Record a new attempt. In this test scenario, the attempt fails. // Record a new attempt. In this test scenario, the attempt fails.
// However, this is not communicated to control tower in the current // However, this is not communicated to control tower in the current
// implementation. It only registers the initiation of the attempt. // implementation. It only registers the initiation of the attempt.
err = pControl.RegisterAttempt(info.PaymentHash, attempt) _, err = pControl.RegisterAttempt(info.PaymentHash, attempt)
if err != nil { if err != nil {
t.Fatalf("unable to register attempt: %v", err) t.Fatalf("unable to register attempt: %v", err)
} }
htlcReason := HTLCFailUnreadable htlcReason := HTLCFailUnreadable
err = pControl.FailAttempt( _, err = pControl.FailAttempt(
info.PaymentHash, attempt.AttemptID, info.PaymentHash, attempt.AttemptID,
&HTLCFailInfo{ &HTLCFailInfo{
Reason: htlcReason, Reason: htlcReason,
@ -143,7 +143,7 @@ func TestPaymentControlSwitchFail(t *testing.T) {
// Record another attempt. // Record another attempt.
attempt.AttemptID = 1 attempt.AttemptID = 1
err = pControl.RegisterAttempt(info.PaymentHash, attempt) _, err = pControl.RegisterAttempt(info.PaymentHash, attempt)
if err != nil { if err != nil {
t.Fatalf("unable to send htlc message: %v", err) t.Fatalf("unable to send htlc message: %v", err)
} }
@ -236,7 +236,7 @@ func TestPaymentControlSwitchDoubleSend(t *testing.T) {
} }
// Record an attempt. // Record an attempt.
err = pControl.RegisterAttempt(info.PaymentHash, attempt) _, err = pControl.RegisterAttempt(info.PaymentHash, attempt)
if err != nil { if err != nil {
t.Fatalf("unable to send htlc message: %v", err) t.Fatalf("unable to send htlc message: %v", err)
} }
@ -375,7 +375,7 @@ func TestPaymentControlDeleteNonInFligt(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("unable to send htlc message: %v", err) t.Fatalf("unable to send htlc message: %v", err)
} }
err = pControl.RegisterAttempt(info.PaymentHash, attempt) _, err = pControl.RegisterAttempt(info.PaymentHash, attempt)
if err != nil { if err != nil {
t.Fatalf("unable to send htlc message: %v", err) t.Fatalf("unable to send htlc message: %v", err)
} }
@ -387,7 +387,7 @@ func TestPaymentControlDeleteNonInFligt(t *testing.T) {
if p.failed { if p.failed {
// Fail the payment attempt. // Fail the payment attempt.
htlcFailure := HTLCFailUnreadable htlcFailure := HTLCFailUnreadable
err := pControl.FailAttempt( _, err := pControl.FailAttempt(
info.PaymentHash, attempt.AttemptID, info.PaymentHash, attempt.AttemptID,
&HTLCFailInfo{ &HTLCFailInfo{
Reason: htlcFailure, Reason: htlcFailure,
@ -520,7 +520,7 @@ func TestPaymentControlMultiShard(t *testing.T) {
a.AttemptID = i a.AttemptID = i
attempts = append(attempts, &a) attempts = append(attempts, &a)
err = pControl.RegisterAttempt(info.PaymentHash, &a) _, err = pControl.RegisterAttempt(info.PaymentHash, &a)
if err != nil { if err != nil {
t.Fatalf("unable to send htlc message: %v", err) t.Fatalf("unable to send htlc message: %v", err)
} }
@ -541,7 +541,7 @@ func TestPaymentControlMultiShard(t *testing.T) {
// will be too large. // will be too large.
b := *attempt b := *attempt
b.AttemptID = 3 b.AttemptID = 3
err = pControl.RegisterAttempt(info.PaymentHash, &b) _, err = pControl.RegisterAttempt(info.PaymentHash, &b)
if err != ErrValueExceedsAmt { if err != ErrValueExceedsAmt {
t.Fatalf("expected ErrValueExceedsAmt, got: %v", t.Fatalf("expected ErrValueExceedsAmt, got: %v",
err) err)
@ -550,7 +550,7 @@ func TestPaymentControlMultiShard(t *testing.T) {
// Fail the second attempt. // Fail the second attempt.
a := attempts[1] a := attempts[1]
htlcFail := HTLCFailUnreadable htlcFail := HTLCFailUnreadable
err = pControl.FailAttempt( _, err = pControl.FailAttempt(
info.PaymentHash, a.AttemptID, info.PaymentHash, a.AttemptID,
&HTLCFailInfo{ &HTLCFailInfo{
Reason: htlcFail, Reason: htlcFail,
@ -596,7 +596,7 @@ func TestPaymentControlMultiShard(t *testing.T) {
t, pControl, info.PaymentHash, info, nil, htlc, t, pControl, info.PaymentHash, info, nil, htlc,
) )
} else { } else {
err := pControl.FailAttempt( _, err := pControl.FailAttempt(
info.PaymentHash, a.AttemptID, info.PaymentHash, a.AttemptID,
&HTLCFailInfo{ &HTLCFailInfo{
Reason: htlcFail, Reason: htlcFail,
@ -634,7 +634,7 @@ func TestPaymentControlMultiShard(t *testing.T) {
// that the payment has reached a terminal condition. // that the payment has reached a terminal condition.
b = *attempt b = *attempt
b.AttemptID = 3 b.AttemptID = 3
err = pControl.RegisterAttempt(info.PaymentHash, &b) _, err = pControl.RegisterAttempt(info.PaymentHash, &b)
if err != ErrPaymentTerminal { if err != ErrPaymentTerminal {
t.Fatalf("expected ErrPaymentTerminal, got: %v", err) t.Fatalf("expected ErrPaymentTerminal, got: %v", err)
} }
@ -666,7 +666,7 @@ func TestPaymentControlMultiShard(t *testing.T) {
) )
} else { } else {
// Fail the attempt. // Fail the attempt.
err := pControl.FailAttempt( _, err := pControl.FailAttempt(
info.PaymentHash, a.AttemptID, info.PaymentHash, a.AttemptID,
&HTLCFailInfo{ &HTLCFailInfo{
Reason: htlcFail, Reason: htlcFail,
@ -708,7 +708,7 @@ func TestPaymentControlMultiShard(t *testing.T) {
assertPaymentStatus(t, pControl, info.PaymentHash, finalStatus) assertPaymentStatus(t, pControl, info.PaymentHash, finalStatus)
// Finally assert we cannot register more attempts. // Finally assert we cannot register more attempts.
err = pControl.RegisterAttempt(info.PaymentHash, &b) _, err = pControl.RegisterAttempt(info.PaymentHash, &b)
if err != expRegErr { if err != expRegErr {
t.Fatalf("expected error %v, got: %v", expRegErr, err) t.Fatalf("expected error %v, got: %v", expRegErr, err)
} }
@ -756,7 +756,7 @@ func TestPaymentControlMPPRecordValidation(t *testing.T) {
info.Value, [32]byte{1}, info.Value, [32]byte{1},
) )
err = pControl.RegisterAttempt(info.PaymentHash, attempt) _, err = pControl.RegisterAttempt(info.PaymentHash, attempt)
if err != nil { if err != nil {
t.Fatalf("unable to send htlc message: %v", err) t.Fatalf("unable to send htlc message: %v", err)
} }
@ -765,7 +765,7 @@ func TestPaymentControlMPPRecordValidation(t *testing.T) {
b := *attempt b := *attempt
b.AttemptID = 1 b.AttemptID = 1
b.Route.FinalHop().MPP = nil b.Route.FinalHop().MPP = nil
err = pControl.RegisterAttempt(info.PaymentHash, &b) _, err = pControl.RegisterAttempt(info.PaymentHash, &b)
if err != ErrMPPayment { if err != ErrMPPayment {
t.Fatalf("expected ErrMPPayment, got: %v", err) t.Fatalf("expected ErrMPPayment, got: %v", err)
} }
@ -774,7 +774,7 @@ func TestPaymentControlMPPRecordValidation(t *testing.T) {
b.Route.FinalHop().MPP = record.NewMPP( b.Route.FinalHop().MPP = record.NewMPP(
info.Value, [32]byte{2}, info.Value, [32]byte{2},
) )
err = pControl.RegisterAttempt(info.PaymentHash, &b) _, err = pControl.RegisterAttempt(info.PaymentHash, &b)
if err != ErrMPPPaymentAddrMismatch { if err != ErrMPPPaymentAddrMismatch {
t.Fatalf("expected ErrMPPPaymentAddrMismatch, got: %v", err) t.Fatalf("expected ErrMPPPaymentAddrMismatch, got: %v", err)
} }
@ -783,7 +783,7 @@ func TestPaymentControlMPPRecordValidation(t *testing.T) {
b.Route.FinalHop().MPP = record.NewMPP( b.Route.FinalHop().MPP = record.NewMPP(
info.Value/2, [32]byte{1}, info.Value/2, [32]byte{1},
) )
err = pControl.RegisterAttempt(info.PaymentHash, &b) _, err = pControl.RegisterAttempt(info.PaymentHash, &b)
if err != ErrMPPTotalAmountMismatch { if err != ErrMPPTotalAmountMismatch {
t.Fatalf("expected ErrMPPTotalAmountMismatch, got: %v", err) t.Fatalf("expected ErrMPPTotalAmountMismatch, got: %v", err)
} }
@ -801,7 +801,7 @@ func TestPaymentControlMPPRecordValidation(t *testing.T) {
} }
attempt.Route.FinalHop().MPP = nil attempt.Route.FinalHop().MPP = nil
err = pControl.RegisterAttempt(info.PaymentHash, attempt) _, err = pControl.RegisterAttempt(info.PaymentHash, attempt)
if err != nil { if err != nil {
t.Fatalf("unable to send htlc message: %v", err) t.Fatalf("unable to send htlc message: %v", err)
} }
@ -813,7 +813,7 @@ func TestPaymentControlMPPRecordValidation(t *testing.T) {
info.Value, [32]byte{1}, info.Value, [32]byte{1},
) )
err = pControl.RegisterAttempt(info.PaymentHash, &b) _, err = pControl.RegisterAttempt(info.PaymentHash, &b)
if err != ErrNonMPPayment { if err != ErrNonMPPayment {
t.Fatalf("expected ErrNonMPPayment, got: %v", err) t.Fatalf("expected ErrNonMPPayment, got: %v", err)
} }

@ -46,6 +46,12 @@ var (
"<hex_value>,.. For example: --data 3438382=0a21ff. " + "<hex_value>,.. For example: --data 3438382=0a21ff. " +
"Custom record ids start from 65536.", "Custom record ids start from 65536.",
} }
showInflightFlag = cli.BoolFlag{
Name: "show_inflight",
Usage: "if set, intermediate payment state updates will be " +
"displayed",
}
) )
// paymentFlags returns common flags for sendpayment and payinvoice. // paymentFlags returns common flags for sendpayment and payinvoice.
@ -82,7 +88,7 @@ func paymentFlags() []cli.Flag {
Name: "allow_self_payment", Name: "allow_self_payment",
Usage: "allow sending a circular payment to self", Usage: "allow sending a circular payment to self",
}, },
dataFlag, dataFlag, showInflightFlag,
} }
} }
@ -382,6 +388,8 @@ func sendPaymentRequest(ctx *cli.Context,
req.FeeLimitSat = feeLimit req.FeeLimitSat = feeLimit
showInflight := ctx.Bool(showInflightFlag.Name)
stream, err := routerClient.SendPayment(context.Background(), req) stream, err := routerClient.SendPayment(context.Background(), req)
if err != nil { if err != nil {
return err return err
@ -393,18 +401,22 @@ func sendPaymentRequest(ctx *cli.Context,
return err return err
} }
if status.State != routerrpc.PaymentState_IN_FLIGHT { if status.Status != lnrpc.Payment_IN_FLIGHT {
printRespJSON(status) printRespJSON(status)
// If we get a payment error back, we pass an error up // If we get a payment error back, we pass an error up
// to main which eventually calls fatal() and returns // to main which eventually calls fatal() and returns
// with a non-zero exit code. // with a non-zero exit code.
if status.State != routerrpc.PaymentState_SUCCEEDED { if status.Status != lnrpc.Payment_SUCCEEDED {
return errors.New(status.State.String()) return errors.New(status.Status.String())
} }
return nil return nil
} }
if showInflight {
printRespJSON(status)
}
} }
} }
@ -454,7 +466,7 @@ func trackPayment(ctx *cli.Context) error {
printRespJSON(status) printRespJSON(status)
if status.State != routerrpc.PaymentState_IN_FLIGHT { if status.Status != lnrpc.Payment_IN_FLIGHT {
return nil return nil
} }
} }

@ -23,62 +23,6 @@ var _ = math.Inf
// proto package needs to be updated. // proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
type PaymentState int32
const (
//*
//Payment is still in flight.
PaymentState_IN_FLIGHT PaymentState = 0
//*
//Payment completed successfully.
PaymentState_SUCCEEDED PaymentState = 1
//*
//There are more routes to try, but the payment timeout was exceeded.
PaymentState_FAILED_TIMEOUT PaymentState = 2
//*
//All possible routes were tried and failed permanently. Or were no
//routes to the destination at all.
PaymentState_FAILED_NO_ROUTE PaymentState = 3
//*
//A non-recoverable error has occured.
PaymentState_FAILED_ERROR PaymentState = 4
//*
//Payment details incorrect (unknown hash, invalid amt or
//invalid final cltv delta)
PaymentState_FAILED_INCORRECT_PAYMENT_DETAILS PaymentState = 5
//*
//Insufficient local balance.
PaymentState_FAILED_INSUFFICIENT_BALANCE PaymentState = 6
)
var PaymentState_name = map[int32]string{
0: "IN_FLIGHT",
1: "SUCCEEDED",
2: "FAILED_TIMEOUT",
3: "FAILED_NO_ROUTE",
4: "FAILED_ERROR",
5: "FAILED_INCORRECT_PAYMENT_DETAILS",
6: "FAILED_INSUFFICIENT_BALANCE",
}
var PaymentState_value = map[string]int32{
"IN_FLIGHT": 0,
"SUCCEEDED": 1,
"FAILED_TIMEOUT": 2,
"FAILED_NO_ROUTE": 3,
"FAILED_ERROR": 4,
"FAILED_INCORRECT_PAYMENT_DETAILS": 5,
"FAILED_INSUFFICIENT_BALANCE": 6,
}
func (x PaymentState) String() string {
return proto.EnumName(PaymentState_name, int32(x))
}
func (PaymentState) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{0}
}
type FailureDetail int32 type FailureDetail int32
const ( const (
@ -164,7 +108,7 @@ func (x FailureDetail) String() string {
} }
func (FailureDetail) EnumDescriptor() ([]byte, []int) { func (FailureDetail) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{1} return fileDescriptor_7a0613f69d37b0a5, []int{0}
} }
type HtlcEvent_EventType int32 type HtlcEvent_EventType int32
@ -195,7 +139,7 @@ func (x HtlcEvent_EventType) String() string {
} }
func (HtlcEvent_EventType) EnumDescriptor() ([]byte, []int) { func (HtlcEvent_EventType) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{18, 0} return fileDescriptor_7a0613f69d37b0a5, []int{17, 0}
} }
type SendPaymentRequest struct { type SendPaymentRequest struct {
@ -460,66 +404,6 @@ func (m *TrackPaymentRequest) GetPaymentHash() []byte {
return nil return nil
} }
type PaymentStatus struct {
/// Current state the payment is in.
State PaymentState `protobuf:"varint,1,opt,name=state,proto3,enum=routerrpc.PaymentState" json:"state,omitempty"`
//*
//The pre-image of the payment when state is SUCCEEDED.
Preimage []byte `protobuf:"bytes,2,opt,name=preimage,proto3" json:"preimage,omitempty"`
//*
//The HTLCs made in attempt to settle the payment.
Htlcs []*lnrpc.HTLCAttempt `protobuf:"bytes,4,rep,name=htlcs,proto3" json:"htlcs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
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{2}
}
func (m *PaymentStatus) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PaymentStatus.Unmarshal(m, b)
}
func (m *PaymentStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_PaymentStatus.Marshal(b, m, deterministic)
}
func (m *PaymentStatus) XXX_Merge(src proto.Message) {
xxx_messageInfo_PaymentStatus.Merge(m, src)
}
func (m *PaymentStatus) XXX_Size() int {
return xxx_messageInfo_PaymentStatus.Size(m)
}
func (m *PaymentStatus) XXX_DiscardUnknown() {
xxx_messageInfo_PaymentStatus.DiscardUnknown(m)
}
var xxx_messageInfo_PaymentStatus proto.InternalMessageInfo
func (m *PaymentStatus) GetState() PaymentState {
if m != nil {
return m.State
}
return PaymentState_IN_FLIGHT
}
func (m *PaymentStatus) GetPreimage() []byte {
if m != nil {
return m.Preimage
}
return nil
}
func (m *PaymentStatus) GetHtlcs() []*lnrpc.HTLCAttempt {
if m != nil {
return m.Htlcs
}
return nil
}
type RouteFeeRequest struct { type RouteFeeRequest struct {
//* //*
//The destination once wishes to obtain a routing fee quote to. //The destination once wishes to obtain a routing fee quote to.
@ -536,7 +420,7 @@ func (m *RouteFeeRequest) Reset() { *m = RouteFeeRequest{} }
func (m *RouteFeeRequest) String() string { return proto.CompactTextString(m) } func (m *RouteFeeRequest) String() string { return proto.CompactTextString(m) }
func (*RouteFeeRequest) ProtoMessage() {} func (*RouteFeeRequest) ProtoMessage() {}
func (*RouteFeeRequest) Descriptor() ([]byte, []int) { func (*RouteFeeRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{3} return fileDescriptor_7a0613f69d37b0a5, []int{2}
} }
func (m *RouteFeeRequest) XXX_Unmarshal(b []byte) error { func (m *RouteFeeRequest) XXX_Unmarshal(b []byte) error {
@ -590,7 +474,7 @@ func (m *RouteFeeResponse) Reset() { *m = RouteFeeResponse{} }
func (m *RouteFeeResponse) String() string { return proto.CompactTextString(m) } func (m *RouteFeeResponse) String() string { return proto.CompactTextString(m) }
func (*RouteFeeResponse) ProtoMessage() {} func (*RouteFeeResponse) ProtoMessage() {}
func (*RouteFeeResponse) Descriptor() ([]byte, []int) { func (*RouteFeeResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{4} return fileDescriptor_7a0613f69d37b0a5, []int{3}
} }
func (m *RouteFeeResponse) XXX_Unmarshal(b []byte) error { func (m *RouteFeeResponse) XXX_Unmarshal(b []byte) error {
@ -639,7 +523,7 @@ func (m *SendToRouteRequest) Reset() { *m = SendToRouteRequest{} }
func (m *SendToRouteRequest) String() string { return proto.CompactTextString(m) } func (m *SendToRouteRequest) String() string { return proto.CompactTextString(m) }
func (*SendToRouteRequest) ProtoMessage() {} func (*SendToRouteRequest) ProtoMessage() {}
func (*SendToRouteRequest) Descriptor() ([]byte, []int) { func (*SendToRouteRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{5} return fileDescriptor_7a0613f69d37b0a5, []int{4}
} }
func (m *SendToRouteRequest) XXX_Unmarshal(b []byte) error { func (m *SendToRouteRequest) XXX_Unmarshal(b []byte) error {
@ -688,7 +572,7 @@ func (m *SendToRouteResponse) Reset() { *m = SendToRouteResponse{} }
func (m *SendToRouteResponse) String() string { return proto.CompactTextString(m) } func (m *SendToRouteResponse) String() string { return proto.CompactTextString(m) }
func (*SendToRouteResponse) ProtoMessage() {} func (*SendToRouteResponse) ProtoMessage() {}
func (*SendToRouteResponse) Descriptor() ([]byte, []int) { func (*SendToRouteResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{6} return fileDescriptor_7a0613f69d37b0a5, []int{5}
} }
func (m *SendToRouteResponse) XXX_Unmarshal(b []byte) error { func (m *SendToRouteResponse) XXX_Unmarshal(b []byte) error {
@ -733,7 +617,7 @@ func (m *ResetMissionControlRequest) Reset() { *m = ResetMissionControlR
func (m *ResetMissionControlRequest) String() string { return proto.CompactTextString(m) } func (m *ResetMissionControlRequest) String() string { return proto.CompactTextString(m) }
func (*ResetMissionControlRequest) ProtoMessage() {} func (*ResetMissionControlRequest) ProtoMessage() {}
func (*ResetMissionControlRequest) Descriptor() ([]byte, []int) { func (*ResetMissionControlRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{7} return fileDescriptor_7a0613f69d37b0a5, []int{6}
} }
func (m *ResetMissionControlRequest) XXX_Unmarshal(b []byte) error { func (m *ResetMissionControlRequest) XXX_Unmarshal(b []byte) error {
@ -764,7 +648,7 @@ func (m *ResetMissionControlResponse) Reset() { *m = ResetMissionControl
func (m *ResetMissionControlResponse) String() string { return proto.CompactTextString(m) } func (m *ResetMissionControlResponse) String() string { return proto.CompactTextString(m) }
func (*ResetMissionControlResponse) ProtoMessage() {} func (*ResetMissionControlResponse) ProtoMessage() {}
func (*ResetMissionControlResponse) Descriptor() ([]byte, []int) { func (*ResetMissionControlResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{8} return fileDescriptor_7a0613f69d37b0a5, []int{7}
} }
func (m *ResetMissionControlResponse) XXX_Unmarshal(b []byte) error { func (m *ResetMissionControlResponse) XXX_Unmarshal(b []byte) error {
@ -795,7 +679,7 @@ func (m *QueryMissionControlRequest) Reset() { *m = QueryMissionControlR
func (m *QueryMissionControlRequest) String() string { return proto.CompactTextString(m) } func (m *QueryMissionControlRequest) String() string { return proto.CompactTextString(m) }
func (*QueryMissionControlRequest) ProtoMessage() {} func (*QueryMissionControlRequest) ProtoMessage() {}
func (*QueryMissionControlRequest) Descriptor() ([]byte, []int) { func (*QueryMissionControlRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{9} return fileDescriptor_7a0613f69d37b0a5, []int{8}
} }
func (m *QueryMissionControlRequest) XXX_Unmarshal(b []byte) error { func (m *QueryMissionControlRequest) XXX_Unmarshal(b []byte) error {
@ -829,7 +713,7 @@ func (m *QueryMissionControlResponse) Reset() { *m = QueryMissionControl
func (m *QueryMissionControlResponse) String() string { return proto.CompactTextString(m) } func (m *QueryMissionControlResponse) String() string { return proto.CompactTextString(m) }
func (*QueryMissionControlResponse) ProtoMessage() {} func (*QueryMissionControlResponse) ProtoMessage() {}
func (*QueryMissionControlResponse) Descriptor() ([]byte, []int) { func (*QueryMissionControlResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{10} return fileDescriptor_7a0613f69d37b0a5, []int{9}
} }
func (m *QueryMissionControlResponse) XXX_Unmarshal(b []byte) error { func (m *QueryMissionControlResponse) XXX_Unmarshal(b []byte) error {
@ -873,7 +757,7 @@ func (m *PairHistory) Reset() { *m = PairHistory{} }
func (m *PairHistory) String() string { return proto.CompactTextString(m) } func (m *PairHistory) String() string { return proto.CompactTextString(m) }
func (*PairHistory) ProtoMessage() {} func (*PairHistory) ProtoMessage() {}
func (*PairHistory) Descriptor() ([]byte, []int) { func (*PairHistory) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{11} return fileDescriptor_7a0613f69d37b0a5, []int{10}
} }
func (m *PairHistory) XXX_Unmarshal(b []byte) error { func (m *PairHistory) XXX_Unmarshal(b []byte) error {
@ -941,7 +825,7 @@ func (m *PairData) Reset() { *m = PairData{} }
func (m *PairData) String() string { return proto.CompactTextString(m) } func (m *PairData) String() string { return proto.CompactTextString(m) }
func (*PairData) ProtoMessage() {} func (*PairData) ProtoMessage() {}
func (*PairData) Descriptor() ([]byte, []int) { func (*PairData) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{12} return fileDescriptor_7a0613f69d37b0a5, []int{11}
} }
func (m *PairData) XXX_Unmarshal(b []byte) error { func (m *PairData) XXX_Unmarshal(b []byte) error {
@ -1020,7 +904,7 @@ func (m *QueryProbabilityRequest) Reset() { *m = QueryProbabilityRequest
func (m *QueryProbabilityRequest) String() string { return proto.CompactTextString(m) } func (m *QueryProbabilityRequest) String() string { return proto.CompactTextString(m) }
func (*QueryProbabilityRequest) ProtoMessage() {} func (*QueryProbabilityRequest) ProtoMessage() {}
func (*QueryProbabilityRequest) Descriptor() ([]byte, []int) { func (*QueryProbabilityRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{13} return fileDescriptor_7a0613f69d37b0a5, []int{12}
} }
func (m *QueryProbabilityRequest) XXX_Unmarshal(b []byte) error { func (m *QueryProbabilityRequest) XXX_Unmarshal(b []byte) error {
@ -1076,7 +960,7 @@ func (m *QueryProbabilityResponse) Reset() { *m = QueryProbabilityRespon
func (m *QueryProbabilityResponse) String() string { return proto.CompactTextString(m) } func (m *QueryProbabilityResponse) String() string { return proto.CompactTextString(m) }
func (*QueryProbabilityResponse) ProtoMessage() {} func (*QueryProbabilityResponse) ProtoMessage() {}
func (*QueryProbabilityResponse) Descriptor() ([]byte, []int) { func (*QueryProbabilityResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{14} return fileDescriptor_7a0613f69d37b0a5, []int{13}
} }
func (m *QueryProbabilityResponse) XXX_Unmarshal(b []byte) error { func (m *QueryProbabilityResponse) XXX_Unmarshal(b []byte) error {
@ -1137,7 +1021,7 @@ func (m *BuildRouteRequest) Reset() { *m = BuildRouteRequest{} }
func (m *BuildRouteRequest) String() string { return proto.CompactTextString(m) } func (m *BuildRouteRequest) String() string { return proto.CompactTextString(m) }
func (*BuildRouteRequest) ProtoMessage() {} func (*BuildRouteRequest) ProtoMessage() {}
func (*BuildRouteRequest) Descriptor() ([]byte, []int) { func (*BuildRouteRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{15} return fileDescriptor_7a0613f69d37b0a5, []int{14}
} }
func (m *BuildRouteRequest) XXX_Unmarshal(b []byte) error { func (m *BuildRouteRequest) XXX_Unmarshal(b []byte) error {
@ -1199,7 +1083,7 @@ func (m *BuildRouteResponse) Reset() { *m = BuildRouteResponse{} }
func (m *BuildRouteResponse) String() string { return proto.CompactTextString(m) } func (m *BuildRouteResponse) String() string { return proto.CompactTextString(m) }
func (*BuildRouteResponse) ProtoMessage() {} func (*BuildRouteResponse) ProtoMessage() {}
func (*BuildRouteResponse) Descriptor() ([]byte, []int) { func (*BuildRouteResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{16} return fileDescriptor_7a0613f69d37b0a5, []int{15}
} }
func (m *BuildRouteResponse) XXX_Unmarshal(b []byte) error { func (m *BuildRouteResponse) XXX_Unmarshal(b []byte) error {
@ -1237,7 +1121,7 @@ func (m *SubscribeHtlcEventsRequest) Reset() { *m = SubscribeHtlcEventsR
func (m *SubscribeHtlcEventsRequest) String() string { return proto.CompactTextString(m) } func (m *SubscribeHtlcEventsRequest) String() string { return proto.CompactTextString(m) }
func (*SubscribeHtlcEventsRequest) ProtoMessage() {} func (*SubscribeHtlcEventsRequest) ProtoMessage() {}
func (*SubscribeHtlcEventsRequest) Descriptor() ([]byte, []int) { func (*SubscribeHtlcEventsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{17} return fileDescriptor_7a0613f69d37b0a5, []int{16}
} }
func (m *SubscribeHtlcEventsRequest) XXX_Unmarshal(b []byte) error { func (m *SubscribeHtlcEventsRequest) XXX_Unmarshal(b []byte) error {
@ -1304,7 +1188,7 @@ func (m *HtlcEvent) Reset() { *m = HtlcEvent{} }
func (m *HtlcEvent) String() string { return proto.CompactTextString(m) } func (m *HtlcEvent) String() string { return proto.CompactTextString(m) }
func (*HtlcEvent) ProtoMessage() {} func (*HtlcEvent) ProtoMessage() {}
func (*HtlcEvent) Descriptor() ([]byte, []int) { func (*HtlcEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{18} return fileDescriptor_7a0613f69d37b0a5, []int{17}
} }
func (m *HtlcEvent) XXX_Unmarshal(b []byte) error { func (m *HtlcEvent) XXX_Unmarshal(b []byte) error {
@ -1458,7 +1342,7 @@ func (m *HtlcInfo) Reset() { *m = HtlcInfo{} }
func (m *HtlcInfo) String() string { return proto.CompactTextString(m) } func (m *HtlcInfo) String() string { return proto.CompactTextString(m) }
func (*HtlcInfo) ProtoMessage() {} func (*HtlcInfo) ProtoMessage() {}
func (*HtlcInfo) Descriptor() ([]byte, []int) { func (*HtlcInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{19} return fileDescriptor_7a0613f69d37b0a5, []int{18}
} }
func (m *HtlcInfo) XXX_Unmarshal(b []byte) error { func (m *HtlcInfo) XXX_Unmarshal(b []byte) error {
@ -1519,7 +1403,7 @@ func (m *ForwardEvent) Reset() { *m = ForwardEvent{} }
func (m *ForwardEvent) String() string { return proto.CompactTextString(m) } func (m *ForwardEvent) String() string { return proto.CompactTextString(m) }
func (*ForwardEvent) ProtoMessage() {} func (*ForwardEvent) ProtoMessage() {}
func (*ForwardEvent) Descriptor() ([]byte, []int) { func (*ForwardEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{20} return fileDescriptor_7a0613f69d37b0a5, []int{19}
} }
func (m *ForwardEvent) XXX_Unmarshal(b []byte) error { func (m *ForwardEvent) XXX_Unmarshal(b []byte) error {
@ -1557,7 +1441,7 @@ func (m *ForwardFailEvent) Reset() { *m = ForwardFailEvent{} }
func (m *ForwardFailEvent) String() string { return proto.CompactTextString(m) } func (m *ForwardFailEvent) String() string { return proto.CompactTextString(m) }
func (*ForwardFailEvent) ProtoMessage() {} func (*ForwardFailEvent) ProtoMessage() {}
func (*ForwardFailEvent) Descriptor() ([]byte, []int) { func (*ForwardFailEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{21} return fileDescriptor_7a0613f69d37b0a5, []int{20}
} }
func (m *ForwardFailEvent) XXX_Unmarshal(b []byte) error { func (m *ForwardFailEvent) XXX_Unmarshal(b []byte) error {
@ -1588,7 +1472,7 @@ func (m *SettleEvent) Reset() { *m = SettleEvent{} }
func (m *SettleEvent) String() string { return proto.CompactTextString(m) } func (m *SettleEvent) String() string { return proto.CompactTextString(m) }
func (*SettleEvent) ProtoMessage() {} func (*SettleEvent) ProtoMessage() {}
func (*SettleEvent) Descriptor() ([]byte, []int) { func (*SettleEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{22} return fileDescriptor_7a0613f69d37b0a5, []int{21}
} }
func (m *SettleEvent) XXX_Unmarshal(b []byte) error { func (m *SettleEvent) XXX_Unmarshal(b []byte) error {
@ -1630,7 +1514,7 @@ func (m *LinkFailEvent) Reset() { *m = LinkFailEvent{} }
func (m *LinkFailEvent) String() string { return proto.CompactTextString(m) } func (m *LinkFailEvent) String() string { return proto.CompactTextString(m) }
func (*LinkFailEvent) ProtoMessage() {} func (*LinkFailEvent) ProtoMessage() {}
func (*LinkFailEvent) Descriptor() ([]byte, []int) { func (*LinkFailEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{23} return fileDescriptor_7a0613f69d37b0a5, []int{22}
} }
func (m *LinkFailEvent) XXX_Unmarshal(b []byte) error { func (m *LinkFailEvent) XXX_Unmarshal(b []byte) error {
@ -1680,13 +1564,11 @@ func (m *LinkFailEvent) GetFailureString() string {
} }
func init() { func init() {
proto.RegisterEnum("routerrpc.PaymentState", PaymentState_name, PaymentState_value)
proto.RegisterEnum("routerrpc.FailureDetail", FailureDetail_name, FailureDetail_value) proto.RegisterEnum("routerrpc.FailureDetail", FailureDetail_name, FailureDetail_value)
proto.RegisterEnum("routerrpc.HtlcEvent_EventType", HtlcEvent_EventType_name, HtlcEvent_EventType_value) proto.RegisterEnum("routerrpc.HtlcEvent_EventType", HtlcEvent_EventType_name, HtlcEvent_EventType_value)
proto.RegisterType((*SendPaymentRequest)(nil), "routerrpc.SendPaymentRequest") proto.RegisterType((*SendPaymentRequest)(nil), "routerrpc.SendPaymentRequest")
proto.RegisterMapType((map[uint64][]byte)(nil), "routerrpc.SendPaymentRequest.DestCustomRecordsEntry") proto.RegisterMapType((map[uint64][]byte)(nil), "routerrpc.SendPaymentRequest.DestCustomRecordsEntry")
proto.RegisterType((*TrackPaymentRequest)(nil), "routerrpc.TrackPaymentRequest") proto.RegisterType((*TrackPaymentRequest)(nil), "routerrpc.TrackPaymentRequest")
proto.RegisterType((*PaymentStatus)(nil), "routerrpc.PaymentStatus")
proto.RegisterType((*RouteFeeRequest)(nil), "routerrpc.RouteFeeRequest") proto.RegisterType((*RouteFeeRequest)(nil), "routerrpc.RouteFeeRequest")
proto.RegisterType((*RouteFeeResponse)(nil), "routerrpc.RouteFeeResponse") proto.RegisterType((*RouteFeeResponse)(nil), "routerrpc.RouteFeeResponse")
proto.RegisterType((*SendToRouteRequest)(nil), "routerrpc.SendToRouteRequest") proto.RegisterType((*SendToRouteRequest)(nil), "routerrpc.SendToRouteRequest")
@ -1713,142 +1595,134 @@ func init() {
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{
// 2150 bytes of a gzipped FileDescriptorProto // 2017 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x58, 0xdd, 0x72, 0xdb, 0xb8, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x58, 0x5d, 0x77, 0xdb, 0x48,
0x15, 0x0e, 0x6d, 0xca, 0x96, 0x8e, 0x7e, 0x4c, 0x43, 0x59, 0x47, 0x95, 0x93, 0x5d, 0x2d, 0xbb, 0x19, 0x5e, 0xc5, 0x72, 0x62, 0xbf, 0xfe, 0x52, 0xc6, 0xdd, 0xd4, 0x38, 0xed, 0xe2, 0x15, 0x6c,
0x9b, 0x68, 0xd2, 0xac, 0x9d, 0x75, 0x3b, 0x6d, 0xa6, 0xed, 0x6e, 0x47, 0x96, 0xe8, 0x88, 0x8e, 0xeb, 0x53, 0x4a, 0xd2, 0x0d, 0x1c, 0xe8, 0x01, 0xb6, 0xe0, 0x58, 0xca, 0x46, 0x8d, 0x23, 0x79,
0x4c, 0x6a, 0x21, 0x3a, 0x3f, 0xcd, 0x05, 0x86, 0x96, 0x20, 0x8b, 0x35, 0x45, 0xaa, 0x24, 0x94, 0xc7, 0x4e, 0xdb, 0xa5, 0x17, 0x73, 0x14, 0x7b, 0x1c, 0x8b, 0xc8, 0x92, 0x91, 0xc6, 0xed, 0xc9,
0x8c, 0x2f, 0x3b, 0xbd, 0xeb, 0x8b, 0xf4, 0xae, 0x4f, 0xd0, 0x77, 0xe9, 0x6d, 0x9f, 0xa0, 0xd3, 0x25, 0xb7, 0xfc, 0x11, 0xfe, 0x04, 0xff, 0x85, 0x5b, 0xee, 0xb8, 0xe3, 0x70, 0xc9, 0x99, 0x91,
0xcb, 0x1d, 0x80, 0xa0, 0x44, 0xd9, 0x72, 0x76, 0x6f, 0x12, 0xf1, 0x3b, 0x1f, 0x0e, 0xce, 0x39, 0xc6, 0x96, 0x13, 0xa7, 0xbb, 0x37, 0x89, 0xf4, 0xbc, 0xcf, 0xbc, 0x1f, 0xf3, 0x3e, 0xf3, 0x21,
0xf8, 0x80, 0x03, 0x18, 0xf6, 0xa2, 0x70, 0xce, 0x68, 0x14, 0xcd, 0x86, 0x87, 0xc9, 0xaf, 0x83, 0xc3, 0x5e, 0x14, 0x2e, 0x18, 0x8d, 0xa2, 0xf9, 0xe8, 0x30, 0x79, 0x3a, 0x98, 0x47, 0x21, 0x0b,
0x59, 0x14, 0xb2, 0x10, 0x15, 0x16, 0x78, 0xbd, 0x10, 0xcd, 0x86, 0x09, 0xaa, 0xff, 0x3f, 0x07, 0x51, 0x71, 0x89, 0x37, 0x8b, 0xd1, 0x7c, 0x94, 0xa0, 0xfa, 0xff, 0xf2, 0x80, 0x06, 0x34, 0x18,
0x68, 0x40, 0x83, 0x51, 0xdf, 0xbd, 0x9e, 0xd2, 0x80, 0x61, 0xfa, 0xd7, 0x39, 0x8d, 0x19, 0x42, 0xf7, 0xdd, 0x9b, 0x19, 0x0d, 0x18, 0xa6, 0x7f, 0x5d, 0xd0, 0x98, 0x21, 0x04, 0xea, 0x98, 0xc6,
0xa0, 0x8e, 0x68, 0xcc, 0x6a, 0x4a, 0x43, 0x69, 0x96, 0xb0, 0xf8, 0x8d, 0x34, 0xd8, 0x74, 0xa7, 0xac, 0xa1, 0xb4, 0x94, 0x76, 0x19, 0x8b, 0x67, 0xa4, 0x41, 0xce, 0x9d, 0xb1, 0xc6, 0x56, 0x4b,
0xac, 0xb6, 0xd1, 0x50, 0x9a, 0x9b, 0x98, 0xff, 0x44, 0xbf, 0x80, 0xbc, 0x3b, 0x65, 0x64, 0x1a, 0x69, 0xe7, 0x30, 0x7f, 0x44, 0x3f, 0x81, 0x82, 0x3b, 0x63, 0x64, 0x16, 0xbb, 0xac, 0x51, 0x16,
0xbb, 0xac, 0x56, 0x12, 0xf0, 0xb6, 0x3b, 0x65, 0x67, 0xb1, 0xcb, 0xd0, 0x97, 0x50, 0x9a, 0x25, 0xf0, 0x8e, 0x3b, 0x63, 0xe7, 0xb1, 0xcb, 0xd0, 0x97, 0x50, 0x9e, 0x27, 0x2e, 0xc9, 0xd4, 0x8d,
0x2e, 0xc9, 0xc4, 0x8d, 0x27, 0xb5, 0x4d, 0xe1, 0xa8, 0x28, 0xb1, 0xae, 0x1b, 0x4f, 0x50, 0x13, 0xa7, 0x8d, 0x9c, 0x70, 0x54, 0x4a, 0xb1, 0x53, 0x37, 0x9e, 0xa2, 0x36, 0x68, 0x13, 0x2f, 0x70,
0xb4, 0xb1, 0x17, 0xb8, 0x3e, 0x19, 0xfa, 0xec, 0x03, 0x19, 0x51, 0x9f, 0xb9, 0x35, 0xb5, 0xa1, 0x7d, 0x32, 0xf2, 0xd9, 0x07, 0x32, 0xa6, 0x3e, 0x73, 0x1b, 0x6a, 0x4b, 0x69, 0xe7, 0x71, 0x55,
0x34, 0x73, 0xb8, 0x22, 0xf0, 0xb6, 0xcf, 0x3e, 0x74, 0x38, 0x8a, 0x9e, 0xc0, 0x4e, 0xea, 0x2c, 0xe0, 0x5d, 0x9f, 0x7d, 0x30, 0x38, 0x8a, 0x9e, 0x42, 0x4d, 0x3a, 0x8b, 0x92, 0x04, 0x1b, 0xf9,
0x4a, 0x02, 0xac, 0xe5, 0x1a, 0x4a, 0xb3, 0x80, 0x2b, 0xb3, 0xd5, 0xb0, 0x9f, 0xc0, 0x0e, 0xf3, 0x96, 0xd2, 0x2e, 0xe2, 0xea, 0x7c, 0x3d, 0xed, 0xa7, 0x50, 0x63, 0xde, 0x8c, 0x86, 0x0b, 0x46,
0xa6, 0x34, 0x9c, 0x33, 0x12, 0xd3, 0x61, 0x18, 0x8c, 0xe2, 0xda, 0x56, 0xe2, 0x51, 0xc2, 0x83, 0x62, 0x3a, 0x0a, 0x83, 0x71, 0xdc, 0xd8, 0x4e, 0x3c, 0xa6, 0xf0, 0x20, 0x41, 0x91, 0x0e, 0x95,
0x04, 0x45, 0x3a, 0x94, 0xc7, 0x94, 0x12, 0xdf, 0x9b, 0x7a, 0x8c, 0xf0, 0xf0, 0xb7, 0x45, 0xf8, 0x09, 0xa5, 0xc4, 0xf7, 0x66, 0x1e, 0x23, 0x3c, 0xfd, 0x1d, 0x91, 0x7e, 0x69, 0x42, 0x69, 0x8f,
0xc5, 0x31, 0xa5, 0x3d, 0x8e, 0x0d, 0x5c, 0x86, 0xbe, 0x82, 0xca, 0x92, 0x23, 0x72, 0x2c, 0x0b, 0x63, 0x03, 0x97, 0xa1, 0x9f, 0x43, 0x75, 0xc5, 0x11, 0x35, 0x56, 0x04, 0xa9, 0x2c, 0x49, 0xa2,
0x52, 0x29, 0x25, 0x89, 0x44, 0x9f, 0x81, 0x16, 0xce, 0xd9, 0x65, 0xe8, 0x05, 0x97, 0x64, 0x38, 0xd0, 0xe7, 0xa0, 0x85, 0x0b, 0x76, 0x15, 0x7a, 0xc1, 0x15, 0x19, 0x4d, 0xdd, 0x80, 0x78, 0xe3,
0x71, 0x03, 0xe2, 0x8d, 0x6a, 0xf9, 0x86, 0xd2, 0x54, 0x8f, 0x37, 0x9e, 0x2b, 0xb8, 0x92, 0xda, 0x46, 0xa1, 0xa5, 0xb4, 0xd5, 0xe3, 0xad, 0x17, 0x0a, 0xae, 0x4a, 0x5b, 0x77, 0xea, 0x06, 0xd6,
0xda, 0x13, 0x37, 0x30, 0x47, 0xe8, 0x31, 0xec, 0xf8, 0x6e, 0xcc, 0xc8, 0x24, 0x9c, 0x91, 0xd9, 0x18, 0x3d, 0x81, 0x9a, 0xef, 0xc6, 0x8c, 0x4c, 0xc3, 0x39, 0x99, 0x2f, 0x2e, 0xaf, 0xe9, 0x4d,
0xfc, 0xe2, 0x8a, 0x5e, 0xd7, 0x2a, 0xa2, 0x32, 0x65, 0x0e, 0x77, 0xc3, 0x59, 0x5f, 0x80, 0xe8, 0xa3, 0x2a, 0x66, 0xa6, 0xc2, 0xe1, 0xd3, 0x70, 0xde, 0x17, 0x20, 0x7a, 0x0c, 0x20, 0x66, 0x45,
0x11, 0x80, 0xa8, 0x8a, 0x98, 0xbc, 0x56, 0x10, 0x39, 0x14, 0x38, 0x22, 0x26, 0x46, 0xdf, 0x42, 0x04, 0x6f, 0x14, 0x45, 0x0d, 0x45, 0x8e, 0x88, 0xc0, 0xe8, 0x6b, 0x28, 0x89, 0x6e, 0x92, 0xa9,
0x51, 0xac, 0x26, 0x99, 0x78, 0x01, 0x8b, 0x6b, 0xd0, 0xd8, 0x6c, 0x16, 0x8f, 0xb4, 0x03, 0x3f, 0x17, 0xb0, 0xb8, 0x01, 0xad, 0x5c, 0xbb, 0x74, 0xa4, 0x1d, 0xf8, 0x01, 0x6f, 0x2c, 0xe6, 0x96,
0xe0, 0x0b, 0x8b, 0xb9, 0xa5, 0xeb, 0x05, 0x0c, 0x43, 0x94, 0xfe, 0x8c, 0xd1, 0x08, 0xaa, 0x7c, 0x53, 0x2f, 0x60, 0x18, 0x22, 0xf9, 0x18, 0xa3, 0x31, 0xd4, 0x79, 0x17, 0xc9, 0x68, 0x11, 0xb3,
0x15, 0xc9, 0x70, 0x1e, 0xb3, 0x70, 0x4a, 0x22, 0x3a, 0x0c, 0xa3, 0x51, 0x5c, 0x2b, 0x8a, 0xa1, 0x70, 0x46, 0x22, 0x3a, 0x0a, 0xa3, 0x71, 0xdc, 0x28, 0x89, 0xa1, 0xbf, 0x3e, 0x58, 0x8a, 0xe3,
0xbf, 0x39, 0x58, 0x88, 0xe3, 0xe0, 0xb6, 0x1a, 0x0e, 0x3a, 0x34, 0x66, 0x6d, 0x31, 0x0e, 0x27, 0xe0, 0xae, 0x1a, 0x0e, 0x0c, 0x1a, 0xb3, 0xae, 0x18, 0x87, 0x93, 0x61, 0x66, 0xc0, 0xa2, 0x1b,
0xc3, 0x8c, 0x80, 0x45, 0xd7, 0x78, 0x77, 0x74, 0x13, 0x47, 0xcf, 0x00, 0xb9, 0xbe, 0x1f, 0x7e, 0xbc, 0x3b, 0xbe, 0x8d, 0xa3, 0xe7, 0x80, 0x5c, 0xdf, 0x0f, 0x3f, 0x92, 0x98, 0xfa, 0x13, 0x92,
0x24, 0x31, 0xf5, 0xc7, 0x44, 0xae, 0x4e, 0x6d, 0xa7, 0xa1, 0x34, 0xf3, 0x58, 0x13, 0x96, 0x01, 0x76, 0xa7, 0x51, 0x6b, 0x29, 0xed, 0x02, 0xd6, 0x84, 0x65, 0x40, 0xfd, 0x49, 0xea, 0x1e, 0xfd,
0xf5, 0xc7, 0xd2, 0x3d, 0xfa, 0x2d, 0x94, 0x45, 0x4c, 0x63, 0xea, 0xb2, 0x79, 0x44, 0xe3, 0x9a, 0x06, 0x2a, 0x22, 0xa7, 0x09, 0x75, 0xd9, 0x22, 0xa2, 0x71, 0x43, 0x6b, 0xe5, 0xda, 0xd5, 0xa3,
0xd6, 0xd8, 0x6c, 0x56, 0x8e, 0x76, 0x65, 0x22, 0x27, 0x09, 0x7c, 0xec, 0x31, 0x5c, 0xe2, 0x3c, 0xdd, 0xb4, 0x90, 0x93, 0x04, 0x3e, 0xf6, 0x18, 0x2e, 0x73, 0x5e, 0xfa, 0x1e, 0x37, 0x0d, 0xd8,
0xf9, 0x1d, 0xd7, 0x3b, 0xb0, 0xb7, 0x3e, 0x24, 0xae, 0x51, 0x5e, 0x53, 0x2e, 0x5b, 0x15, 0xf3, 0xdb, 0x9c, 0x12, 0xd7, 0x28, 0x9f, 0x53, 0x2e, 0x5b, 0x15, 0xf3, 0x47, 0xf4, 0x00, 0xf2, 0x1f,
0x9f, 0xe8, 0x3e, 0xe4, 0x3e, 0xb8, 0xfe, 0x9c, 0x0a, 0xdd, 0x96, 0x70, 0xf2, 0xf1, 0xfb, 0x8d, 0x5c, 0x7f, 0x41, 0x85, 0x6e, 0xcb, 0x38, 0x79, 0xf9, 0xdd, 0xd6, 0x4b, 0x45, 0x7f, 0x09, 0xf5,
0x17, 0x8a, 0xfe, 0x02, 0xaa, 0x4e, 0xe4, 0x0e, 0xaf, 0x6e, 0x48, 0xff, 0xa6, 0x72, 0x95, 0x5b, 0x61, 0xe4, 0x8e, 0xae, 0x6f, 0x49, 0xff, 0xb6, 0x72, 0x95, 0x3b, 0xca, 0xd5, 0x5f, 0x41, 0x4d,
0xca, 0xd5, 0xff, 0xa1, 0x40, 0x59, 0x8e, 0x1a, 0x30, 0x97, 0xcd, 0x63, 0xf4, 0x0d, 0xe4, 0x62, 0x4c, 0xf2, 0x09, 0xa5, 0x9f, 0x5a, 0x30, 0x0f, 0x81, 0x2f, 0x07, 0x21, 0xaf, 0x64, 0xd1, 0x6c,
0xe6, 0x32, 0x2a, 0xd8, 0x95, 0xa3, 0x07, 0x99, 0x7a, 0x66, 0x88, 0x14, 0x27, 0x2c, 0x54, 0x87, 0xbb, 0x33, 0xae, 0x2c, 0x7d, 0x0c, 0xda, 0x6a, 0x7c, 0x3c, 0x0f, 0x83, 0x98, 0xf2, 0xd5, 0xc0,
0xfc, 0x2c, 0xa2, 0xde, 0xd4, 0xbd, 0x4c, 0xe3, 0x5a, 0x7c, 0xa3, 0x26, 0xe4, 0x26, 0xcc, 0x1f, 0x7b, 0xc0, 0x65, 0xc4, 0x55, 0x27, 0xf4, 0xa6, 0x88, 0x51, 0xd5, 0x14, 0x3f, 0xa1, 0x54, 0x28,
0xc6, 0x35, 0x55, 0x2c, 0x0d, 0x92, 0xc5, 0xe8, 0x3a, 0xbd, 0x76, 0x8b, 0x31, 0x3a, 0x9d, 0x31, 0xee, 0x49, 0x22, 0x72, 0xe2, 0x87, 0xa3, 0x6b, 0xbe, 0x6c, 0xdc, 0x9b, 0xd4, 0x7d, 0x85, 0xc3,
0x9c, 0x10, 0x4e, 0xd5, 0xfc, 0xa6, 0xa6, 0xea, 0xdf, 0xc3, 0x8e, 0x58, 0xf1, 0x13, 0x4a, 0x3f, 0xbd, 0x70, 0x74, 0x6d, 0x70, 0x50, 0x7f, 0x9f, 0xac, 0xec, 0x61, 0x28, 0x62, 0xfd, 0xf8, 0xf2,
0xb5, 0x7b, 0x1f, 0x00, 0xdf, 0x9b, 0x42, 0xeb, 0xc9, 0x0e, 0xde, 0x72, 0xa7, 0x5c, 0xe6, 0xfa, 0x90, 0x0e, 0x79, 0x21, 0x07, 0xe1, 0xb6, 0x74, 0x54, 0xce, 0xea, 0x0a, 0x27, 0x26, 0xfd, 0x3d,
0x08, 0xb4, 0xe5, 0xf8, 0x78, 0x16, 0x06, 0x31, 0x8f, 0x41, 0xe3, 0x09, 0x70, 0x4d, 0xf3, 0x2d, 0xd4, 0xd7, 0x9c, 0xa7, 0x55, 0x34, 0xa1, 0x30, 0x8f, 0xa8, 0x37, 0x73, 0xaf, 0x68, 0xea, 0x79,
0x20, 0xc4, 0xaf, 0x88, 0x51, 0x15, 0x89, 0x9f, 0x50, 0x2a, 0xe4, 0xff, 0x38, 0xd9, 0x71, 0xc4, 0xf9, 0x8e, 0xda, 0xb0, 0x33, 0x71, 0x3d, 0x7f, 0x11, 0x49, 0xc7, 0x55, 0xd9, 0xe7, 0x04, 0xc5,
0x0f, 0x87, 0x57, 0x7c, 0x0f, 0xbb, 0xd7, 0xd2, 0x7d, 0x99, 0xc3, 0xbd, 0x70, 0x78, 0xd5, 0xe1, 0xd2, 0xac, 0x3f, 0x82, 0x26, 0xa6, 0x31, 0x65, 0xe7, 0x5e, 0x1c, 0x7b, 0x61, 0xd0, 0x0d, 0x03,
0xa0, 0xfe, 0x3e, 0x39, 0x66, 0x9c, 0x50, 0xcc, 0xf5, 0xf3, 0x6b, 0x8d, 0x74, 0xc8, 0x89, 0x5a, 0x16, 0x85, 0x7e, 0x5a, 0x81, 0xfe, 0x18, 0xf6, 0x37, 0x5a, 0x93, 0x14, 0xf8, 0xe0, 0xef, 0x16,
0x0a, 0xb7, 0xc5, 0xa3, 0x52, 0x56, 0xe4, 0x38, 0x31, 0xe9, 0xef, 0xa1, 0xba, 0xe2, 0x5c, 0x66, 0x34, 0xba, 0xd9, 0x3c, 0xf8, 0x3b, 0xd8, 0xdf, 0x68, 0x4d, 0xf3, 0x7f, 0x0e, 0xf9, 0xb9, 0xeb,
0x91, 0xad, 0xb2, 0x72, 0xab, 0xca, 0xdb, 0x63, 0xd7, 0xf3, 0xe7, 0x51, 0xea, 0xb8, 0x92, 0x8a, 0x45, 0x71, 0x63, 0x4b, 0xac, 0x8b, 0xbd, 0xcc, 0xba, 0xe8, 0xbb, 0x5e, 0x74, 0xea, 0xc5, 0x2c,
0x2e, 0x41, 0x71, 0x6a, 0xd6, 0x1f, 0x42, 0x1d, 0xd3, 0x98, 0xb2, 0x33, 0x2f, 0x8e, 0xbd, 0x30, 0x8c, 0x6e, 0x70, 0x42, 0x7a, 0xad, 0x16, 0x14, 0x6d, 0x4b, 0xff, 0xbb, 0x02, 0xa5, 0x8c, 0x11,
0x68, 0x87, 0x01, 0x8b, 0x42, 0x5f, 0x66, 0xa0, 0x3f, 0x82, 0xfd, 0xb5, 0xd6, 0x24, 0x04, 0x3e, 0xed, 0x43, 0x31, 0x08, 0xc7, 0x94, 0x4c, 0xa2, 0x70, 0x26, 0x27, 0x81, 0x03, 0x27, 0x51, 0x38,
0xf8, 0x87, 0x39, 0x8d, 0xae, 0xd7, 0x0f, 0xfe, 0x01, 0xf6, 0xd7, 0x5a, 0x65, 0xfc, 0xcf, 0x20, 0xe3, 0x9a, 0x10, 0x46, 0x16, 0xa6, 0x82, 0xdc, 0xe6, 0xaf, 0xc3, 0x10, 0xfd, 0x12, 0x76, 0xa6,
0x37, 0x73, 0xbd, 0x28, 0xae, 0x6d, 0x08, 0x25, 0xec, 0xad, 0x88, 0xca, 0x8b, 0xba, 0x5e, 0xcc, 0x89, 0x03, 0xb1, 0x17, 0x95, 0x8e, 0xea, 0xb7, 0x62, 0x1b, 0x2e, 0x73, 0xb1, 0xe4, 0xbc, 0x56,
0xc2, 0xe8, 0x1a, 0x27, 0xa4, 0x53, 0x35, 0xaf, 0x68, 0x1b, 0x5c, 0x9a, 0xc5, 0x8c, 0x11, 0xed, 0x0b, 0x39, 0x4d, 0x7d, 0xad, 0x16, 0x54, 0x2d, 0xff, 0x5a, 0x2d, 0xe4, 0xb5, 0xed, 0xd7, 0x6a,
0x43, 0x21, 0x08, 0x47, 0x94, 0x8c, 0xa3, 0x70, 0x9a, 0x16, 0x81, 0x03, 0x27, 0x51, 0x38, 0xe5, 0x61, 0x5b, 0xdb, 0xd1, 0xff, 0xad, 0x40, 0x41, 0xb2, 0x79, 0x26, 0x7c, 0x4a, 0x09, 0xd7, 0x45,
0x9a, 0x10, 0x46, 0x16, 0x4a, 0x15, 0x6e, 0xf1, 0x4f, 0x27, 0x44, 0xdf, 0xc0, 0xf6, 0x24, 0x71, 0x2a, 0xa6, 0x02, 0x07, 0x86, 0xde, 0x8c, 0xa2, 0x16, 0x94, 0x85, 0x71, 0x5d, 0xa2, 0xc0, 0xb1,
0x20, 0x0e, 0xc6, 0xe2, 0x51, 0xf5, 0xc6, 0xdc, 0x1d, 0x97, 0xb9, 0x38, 0xe5, 0x24, 0x42, 0x3c, 0x8e, 0x90, 0xa9, 0xd8, 0x24, 0x25, 0x43, 0xe8, 0x51, 0x4d, 0x37, 0xc9, 0x84, 0x22, 0xf7, 0xf9,
0x55, 0xf3, 0xaa, 0x96, 0x3b, 0x55, 0xf3, 0x39, 0x6d, 0xeb, 0x54, 0xcd, 0x6f, 0x69, 0xdb, 0xfa, 0x78, 0x31, 0x1a, 0xd1, 0x38, 0x4e, 0xa2, 0xe4, 0x13, 0x4a, 0x8a, 0x89, 0x40, 0x4f, 0xa0, 0x26,
0x7f, 0x15, 0xc8, 0xa7, 0x6c, 0x1e, 0x09, 0x2f, 0x29, 0xe1, 0xba, 0x90, 0x62, 0xca, 0x73, 0xc0, 0x29, 0x32, 0xd6, 0x76, 0xa2, 0xd7, 0x14, 0x4e, 0xc3, 0xb5, 0x41, 0xcb, 0xf2, 0x66, 0xab, 0x6d,
0xf1, 0xa6, 0x14, 0x35, 0xa0, 0x24, 0x8c, 0xab, 0x12, 0x05, 0x8e, 0xb5, 0x84, 0x4c, 0xc5, 0x89, 0xb9, 0xba, 0x22, 0xf2, 0xa0, 0x49, 0xf1, 0xfa, 0x5f, 0xe0, 0xa1, 0x68, 0x65, 0x3f, 0x0a, 0x2f,
0x9d, 0x32, 0x84, 0x1e, 0x55, 0x79, 0x62, 0x27, 0x94, 0xb4, 0xe9, 0xc4, 0xf3, 0xe1, 0x90, 0xc6, 0xdd, 0x4b, 0xcf, 0xf7, 0xd8, 0x8d, 0x14, 0x39, 0x2f, 0x3c, 0x0a, 0x67, 0x84, 0xcf, 0xad, 0x6c,
0x71, 0x32, 0x4b, 0x2e, 0xa1, 0x48, 0x4c, 0x4c, 0xf4, 0x18, 0x76, 0x52, 0x4a, 0x3a, 0xd7, 0x56, 0x01, 0x07, 0xec, 0x70, 0x4c, 0x79, 0x0b, 0x58, 0x98, 0x98, 0xd2, 0x16, 0xb0, 0x50, 0x18, 0xb2,
0xa2, 0x57, 0x09, 0xcb, 0xe9, 0x9a, 0xa0, 0x65, 0x79, 0xd3, 0x65, 0x8f, 0xa8, 0x2c, 0x89, 0x7c, 0xc7, 0x59, 0x6e, 0xed, 0x38, 0xd3, 0xaf, 0xa1, 0x71, 0x37, 0x56, 0xaa, 0x99, 0x16, 0x94, 0xe6,
0x52, 0xb9, 0x0b, 0xff, 0x02, 0x0f, 0xc4, 0x52, 0xf6, 0xa3, 0xf0, 0xc2, 0xbd, 0xf0, 0x7c, 0x8f, 0x2b, 0x58, 0x84, 0x53, 0x70, 0x16, 0xca, 0xf6, 0x76, 0xeb, 0x87, 0x7b, 0xab, 0xff, 0x43, 0x81,
0x5d, 0xa7, 0x22, 0xe7, 0x89, 0x47, 0xe1, 0x94, 0xf0, 0xda, 0xa6, 0x4b, 0xc0, 0x01, 0x2b, 0x1c, 0xdd, 0xe3, 0x85, 0xe7, 0x8f, 0xd7, 0x16, 0x6e, 0x36, 0x3b, 0x65, 0xfd, 0xb0, 0xdd, 0x74, 0x92,
0x51, 0xbe, 0x04, 0x2c, 0x4c, 0x4c, 0x72, 0x09, 0x58, 0x28, 0x0c, 0xd9, 0xde, 0xba, 0xb9, 0xd2, 0x6e, 0x6d, 0x3c, 0x49, 0x37, 0x9d, 0x56, 0xb9, 0x7b, 0x4f, 0xab, 0x9f, 0x42, 0x69, 0x75, 0x50,
0x5b, 0xf5, 0x2b, 0xa8, 0xdd, 0x9e, 0x4b, 0x6a, 0xa6, 0x01, 0xc5, 0xd9, 0x12, 0x16, 0xd3, 0x29, 0xc5, 0x0d, 0xb5, 0x95, 0x6b, 0x97, 0x31, 0x4c, 0xe5, 0x29, 0x15, 0xeb, 0x2f, 0x01, 0x65, 0x13,
0x38, 0x0b, 0x65, 0xd7, 0x76, 0xe3, 0xa7, 0xd7, 0x56, 0xff, 0xa7, 0x02, 0xbb, 0xc7, 0x73, 0xcf, 0x4d, 0x27, 0x64, 0xb9, 0x7f, 0x28, 0xf7, 0xef, 0x1f, 0x8f, 0xa0, 0x39, 0x58, 0x5c, 0xc6, 0xa3,
0x1f, 0xad, 0x6c, 0xdc, 0x6c, 0x74, 0xca, 0x6a, 0xe7, 0x5f, 0xd7, 0xd6, 0x37, 0xd6, 0xb6, 0xf5, 0xc8, 0xbb, 0xa4, 0xa7, 0xcc, 0x1f, 0x99, 0x1f, 0x68, 0xc0, 0x62, 0xb9, 0x4a, 0xff, 0xab, 0x42,
0x75, 0xad, 0x73, 0xf3, 0xce, 0xd6, 0xf9, 0x05, 0x14, 0x97, 0x5d, 0x33, 0x39, 0x1d, 0x4b, 0x18, 0x71, 0x89, 0xa2, 0x03, 0xa8, 0x7b, 0xc1, 0x28, 0x9c, 0xc9, 0xa4, 0x03, 0xea, 0xf3, 0xbc, 0x93,
0x26, 0x69, 0xcb, 0x8c, 0xf5, 0x17, 0x80, 0xb2, 0x81, 0xca, 0x82, 0x2c, 0xce, 0x0f, 0xe5, 0xee, 0x4d, 0x7e, 0x57, 0x9a, 0xba, 0x89, 0xc5, 0x1a, 0x73, 0xfe, 0x5a, 0x91, 0x29, 0x7f, 0x2b, 0xe1,
0xf3, 0xe3, 0x21, 0xd4, 0x07, 0xf3, 0x8b, 0x78, 0x18, 0x79, 0x17, 0xb4, 0xcb, 0xfc, 0xa1, 0xf1, 0x67, 0x6b, 0x4c, 0xf8, 0x6d, 0xd0, 0x96, 0xfe, 0xa7, 0xcc, 0x1f, 0x2d, 0x27, 0x05, 0x57, 0x25,
0x81, 0x06, 0x2c, 0x4e, 0x77, 0xe9, 0xff, 0x54, 0x28, 0x2c, 0x50, 0x74, 0x00, 0x55, 0x2f, 0x18, 0xce, 0x93, 0x49, 0x98, 0x4b, 0xcf, 0x92, 0xa9, 0x26, 0x4c, 0x89, 0xa7, 0xcc, 0x2f, 0xa1, 0xcc,
0x86, 0xd3, 0x34, 0xe8, 0x80, 0xfa, 0x3c, 0xee, 0xa4, 0xe3, 0xec, 0xa6, 0xa6, 0x76, 0x62, 0x31, 0xd7, 0x43, 0xcc, 0xdc, 0xd9, 0x9c, 0x04, 0xb1, 0x58, 0x17, 0x2a, 0x2e, 0x2d, 0x31, 0x3b, 0x46,
0x47, 0x9c, 0xbf, 0x92, 0xa4, 0xe4, 0x6f, 0x24, 0xfc, 0x6c, 0x8e, 0x09, 0xbf, 0x09, 0xda, 0xc2, 0xdf, 0x00, 0x50, 0x5e, 0x1f, 0x61, 0x37, 0x73, 0x2a, 0x96, 0x44, 0xf5, 0xe8, 0x8b, 0x8c, 0x30,
0x3f, 0x3f, 0xe6, 0x17, 0x45, 0xc1, 0x95, 0x14, 0xe7, 0xc1, 0x24, 0xcc, 0x85, 0xe7, 0x94, 0xa9, 0x96, 0x13, 0x70, 0x20, 0xfe, 0x0e, 0x6f, 0xe6, 0x14, 0x17, 0xa9, 0x7c, 0x44, 0xaf, 0xa0, 0x32,
0x26, 0xcc, 0x14, 0x97, 0xcc, 0x2f, 0xa1, 0xc4, 0xf7, 0x43, 0xcc, 0xdc, 0xe9, 0x8c, 0x04, 0xb1, 0x09, 0xa3, 0x8f, 0x6e, 0x34, 0x26, 0x02, 0x4c, 0xb7, 0x8d, 0x87, 0x19, 0x0f, 0x27, 0x89, 0x5d,
0xd8, 0x17, 0x2a, 0x2e, 0x2e, 0x30, 0x2b, 0x46, 0xdf, 0x01, 0x50, 0x9e, 0x1f, 0x61, 0xd7, 0x33, 0x0c, 0x3f, 0xfd, 0x0c, 0x97, 0x27, 0x99, 0x77, 0x74, 0x06, 0x48, 0x8e, 0x17, 0xab, 0x3c, 0x71,
0x2a, 0xb6, 0x44, 0xe5, 0xe8, 0xf3, 0x8c, 0x30, 0x16, 0x05, 0x38, 0x10, 0xff, 0x3a, 0xd7, 0x33, 0x52, 0x10, 0x4e, 0xf6, 0xef, 0x3a, 0xe1, 0x9b, 0xb4, 0x74, 0xa4, 0x4d, 0x6e, 0x61, 0xe8, 0xf7,
0x8a, 0x0b, 0x34, 0xfd, 0x89, 0xbe, 0x87, 0xf2, 0x38, 0x8c, 0x3e, 0xba, 0xd1, 0x88, 0x08, 0x50, 0x50, 0x8e, 0x29, 0x63, 0x3e, 0x4d, 0xdd, 0x14, 0x85, 0x9b, 0xbd, 0xb5, 0x6b, 0x05, 0x37, 0x4b,
0x1e, 0x1b, 0xd9, 0x3e, 0x78, 0x92, 0xd8, 0xc5, 0xf0, 0xee, 0x3d, 0x5c, 0x1a, 0x67, 0xbe, 0xd1, 0x0f, 0xa5, 0x78, 0xf5, 0x8a, 0x8e, 0xa1, 0xe6, 0x7b, 0xc1, 0x75, 0x36, 0x0d, 0x10, 0xe3, 0x1b,
0x2b, 0x40, 0xe9, 0x78, 0xb1, 0xcb, 0x13, 0x27, 0x79, 0xe1, 0x64, 0xff, 0xb6, 0x13, 0x7e, 0x48, 0x99, 0xf1, 0x3d, 0x2f, 0xb8, 0xce, 0xe6, 0x50, 0xf1, 0xb3, 0x80, 0xfe, 0x07, 0x28, 0x2e, 0x67,
0xa7, 0x8e, 0xb4, 0xf1, 0x0d, 0x0c, 0xfd, 0x01, 0x4a, 0x31, 0x65, 0xcc, 0xa7, 0xd2, 0x4d, 0x41, 0x09, 0x95, 0x60, 0xe7, 0xc2, 0x3e, 0xb3, 0x9d, 0xb7, 0xb6, 0xf6, 0x19, 0x2a, 0x80, 0x3a, 0x30,
0xb8, 0xd9, 0x5b, 0xb9, 0xe3, 0x70, 0x73, 0xea, 0xa1, 0x18, 0x2f, 0x3f, 0xd1, 0x31, 0xec, 0xf8, 0x6d, 0x43, 0x53, 0x38, 0x8c, 0xcd, 0xae, 0x69, 0xbd, 0x31, 0xb5, 0x2d, 0xfe, 0x72, 0xe2, 0xe0,
0x5e, 0x70, 0x95, 0x0d, 0x03, 0xc4, 0xf8, 0x5a, 0x66, 0x7c, 0xcf, 0x0b, 0xae, 0xb2, 0x31, 0x94, 0xb7, 0x1d, 0x6c, 0x68, 0xb9, 0xe3, 0x1d, 0xc8, 0x8b, 0xb8, 0xfa, 0x3f, 0x15, 0x28, 0x88, 0x0e,
0xfd, 0x2c, 0xa0, 0xff, 0x11, 0x0a, 0x8b, 0x2a, 0xa1, 0x22, 0x6c, 0x9f, 0x5b, 0xaf, 0x2c, 0xfb, 0x06, 0x93, 0x10, 0xfd, 0x02, 0x96, 0xe2, 0x12, 0x9b, 0x1b, 0x3f, 0x70, 0x85, 0xea, 0x2a, 0x78,
0x8d, 0xa5, 0xdd, 0x43, 0x79, 0x50, 0x07, 0x86, 0xd5, 0xd1, 0x14, 0x0e, 0x63, 0xa3, 0x6d, 0x98, 0x29, 0x98, 0x61, 0x8a, 0x73, 0xf2, 0x52, 0x1a, 0x4b, 0xf2, 0x56, 0x42, 0x96, 0x86, 0x25, 0xf9,
0xaf, 0x0d, 0x6d, 0x83, 0x7f, 0x9c, 0xd8, 0xf8, 0x4d, 0x0b, 0x77, 0xb4, 0xcd, 0xe3, 0x6d, 0xc8, 0x59, 0xc6, 0xf3, 0xda, 0x96, 0xa3, 0xe2, 0x9a, 0x34, 0xc8, 0x1d, 0xf6, 0x59, 0xc6, 0xf1, 0xda,
0x89, 0x79, 0xf5, 0x7f, 0x2b, 0x90, 0x17, 0x2b, 0x18, 0x8c, 0x43, 0xf4, 0x2b, 0x58, 0x88, 0x4b, 0x4e, 0xac, 0xe2, 0x9a, 0x34, 0xa4, 0x5c, 0xfd, 0xb7, 0x50, 0xce, 0xf6, 0x1c, 0x3d, 0x05, 0xd5,
0x1c, 0x6e, 0xbc, 0xe1, 0x0a, 0xd5, 0x95, 0xf1, 0x42, 0x30, 0x8e, 0xc4, 0x39, 0x79, 0x21, 0x8d, 0x0b, 0x26, 0x61, 0xba, 0x10, 0xeb, 0xb7, 0xc4, 0xc5, 0x8b, 0xc4, 0x82, 0xa0, 0x23, 0xd0, 0x6e,
0x05, 0x79, 0x23, 0x21, 0xa7, 0x86, 0x05, 0xf9, 0x69, 0xc6, 0xf3, 0xca, 0x91, 0xa3, 0xe2, 0x9d, 0xf7, 0x59, 0xaf, 0x40, 0x29, 0xd3, 0x34, 0xfd, 0x5f, 0x0a, 0x54, 0xd6, 0x9a, 0xf0, 0xa3, 0xbd,
0xd4, 0x90, 0x9e, 0xb0, 0x4f, 0x33, 0x8e, 0x57, 0x4e, 0x62, 0x15, 0xef, 0xa4, 0x06, 0xc9, 0xd5, 0xa3, 0x6f, 0xa0, 0xfc, 0xd1, 0x8b, 0x28, 0xc9, 0x1e, 0xff, 0xd5, 0xa3, 0xe6, 0xfa, 0xf1, 0x2f,
0x7f, 0x07, 0xa5, 0xec, 0x9a, 0xa3, 0x27, 0xa0, 0x7a, 0xc1, 0x38, 0x94, 0x1b, 0xb1, 0x7a, 0x43, 0xff, 0x77, 0xc3, 0x31, 0xc5, 0x25, 0xce, 0x4f, 0x01, 0xf4, 0x47, 0xa8, 0xa6, 0x23, 0xc9, 0x98,
0x5c, 0x3c, 0x49, 0x2c, 0x08, 0x3a, 0x02, 0xed, 0xe6, 0x3a, 0xeb, 0x65, 0x28, 0x66, 0x16, 0x4d, 0x32, 0xd7, 0xf3, 0xc5, 0x54, 0x55, 0xd7, 0xe4, 0x91, 0x72, 0x0d, 0x61, 0xc7, 0x95, 0x49, 0xf6,
0xff, 0x8f, 0x02, 0xe5, 0x95, 0x45, 0xf8, 0xd9, 0xde, 0xd1, 0x77, 0x50, 0xfa, 0xe8, 0x45, 0x94, 0x15, 0x7d, 0xb5, 0x72, 0x10, 0xb3, 0xc8, 0x0b, 0xae, 0xc4, 0xfc, 0x15, 0x97, 0xb4, 0x81, 0x00,
0x64, 0xdb, 0x7f, 0xe5, 0xa8, 0xbe, 0xda, 0xfe, 0xd3, 0xff, 0xdb, 0xe1, 0x88, 0xe2, 0x22, 0xe7, 0x9f, 0xfd, 0x4d, 0x85, 0xca, 0x9a, 0x9f, 0x75, 0x21, 0x55, 0xa0, 0x68, 0x3b, 0xc4, 0x30, 0x87,
0x4b, 0x00, 0xfd, 0x09, 0x2a, 0x72, 0x24, 0x19, 0x51, 0xe6, 0x7a, 0xbe, 0x28, 0x55, 0x65, 0x45, 0x1d, 0xab, 0xa7, 0x29, 0x48, 0x83, 0xb2, 0x63, 0x5b, 0x8e, 0x4d, 0x0c, 0xb3, 0xeb, 0x18, 0x5c,
0x1e, 0x92, 0xdb, 0x11, 0x76, 0x5c, 0x1e, 0x67, 0x3f, 0xd1, 0xd7, 0x4b, 0x07, 0x31, 0x8b, 0xbc, 0x52, 0x9f, 0xc3, 0x6e, 0xcf, 0xb2, 0xcf, 0x88, 0xed, 0x0c, 0x89, 0xd9, 0xb3, 0xbe, 0xb5, 0x8e,
0xe0, 0x52, 0xd4, 0xaf, 0xb0, 0xa0, 0x0d, 0x04, 0xf8, 0xf4, 0x5f, 0x0a, 0x94, 0xb2, 0x57, 0x47, 0x7b, 0xa6, 0x96, 0x43, 0x0f, 0x40, 0x73, 0x6c, 0xd2, 0x3d, 0xed, 0x58, 0x36, 0x19, 0x5a, 0xe7,
0x54, 0x86, 0x82, 0x69, 0x91, 0x93, 0x9e, 0xf9, 0xb2, 0xeb, 0x68, 0xf7, 0xf8, 0xe7, 0xe0, 0xbc, 0xa6, 0x73, 0x31, 0xd4, 0x54, 0x8e, 0x9e, 0x0e, 0x7b, 0x5d, 0x62, 0xbe, 0xeb, 0x9a, 0xa6, 0x31,
0xdd, 0x36, 0x8c, 0x8e, 0xc1, 0xe5, 0x84, 0xa0, 0x72, 0xd2, 0x32, 0x7b, 0x46, 0x87, 0x38, 0xe6, 0x20, 0xe7, 0x9d, 0x77, 0x5a, 0x1e, 0x35, 0xe0, 0x81, 0x65, 0x0f, 0x2e, 0x4e, 0x4e, 0xac, 0xae,
0x99, 0x61, 0x9f, 0x3b, 0xda, 0x06, 0xaa, 0xc2, 0x8e, 0xc4, 0x2c, 0x9b, 0x60, 0xfb, 0xdc, 0x31, 0x65, 0xda, 0x43, 0x72, 0xdc, 0xe9, 0x75, 0xec, 0xae, 0xa9, 0x6d, 0xa3, 0x3d, 0x40, 0x96, 0xdd,
0xb4, 0x4d, 0xa4, 0x41, 0x49, 0x82, 0x06, 0xc6, 0x36, 0xd6, 0x54, 0xf4, 0x15, 0x34, 0x24, 0x62, 0x75, 0xce, 0xfb, 0x3d, 0x73, 0x68, 0x12, 0x29, 0xdd, 0x1d, 0x54, 0x87, 0x9a, 0xf0, 0xd3, 0x31,
0x5a, 0x6d, 0x1b, 0x63, 0xa3, 0xed, 0x90, 0x7e, 0xeb, 0xdd, 0x99, 0x61, 0x39, 0xa4, 0x63, 0x38, 0x0c, 0x72, 0xd2, 0xb1, 0x7a, 0xa6, 0xa1, 0x15, 0x78, 0x26, 0x29, 0x63, 0x40, 0x0c, 0x6b, 0xd0,
0x2d, 0xb3, 0x37, 0xd0, 0x72, 0xe8, 0x0b, 0xd8, 0x5f, 0xb0, 0x06, 0xe7, 0x27, 0x27, 0x66, 0xdb, 0x39, 0xe6, 0x70, 0x91, 0xc7, 0xb4, 0xec, 0x37, 0x8e, 0xd5, 0x35, 0x49, 0x97, 0xbb, 0xe5, 0x28,
0xe4, 0x84, 0xe3, 0x56, 0xaf, 0x65, 0xb5, 0x0d, 0x6d, 0xeb, 0xe9, 0xdf, 0x54, 0x28, 0xaf, 0x24, 0x70, 0xb2, 0x44, 0x2f, 0x6c, 0xc3, 0xc4, 0xfd, 0x8e, 0x65, 0x68, 0x25, 0xb4, 0x0f, 0x0f, 0x25,
0xbe, 0xaa, 0xfc, 0x32, 0x14, 0x2c, 0x5b, 0xfa, 0xd3, 0x14, 0x1e, 0x86, 0x6d, 0x99, 0xb6, 0x45, 0x6c, 0xbe, 0xeb, 0x5b, 0xf8, 0x7b, 0x32, 0x74, 0x1c, 0x32, 0x70, 0x1c, 0x5b, 0x2b, 0x67, 0x3d,
0x3a, 0x46, 0xdb, 0xee, 0xf0, 0x3d, 0xf0, 0x19, 0xec, 0xf6, 0x4c, 0xeb, 0x15, 0xb1, 0x6c, 0x87, 0xf1, 0x6a, 0x9d, 0xbe, 0x69, 0x6b, 0x15, 0xf4, 0x10, 0xea, 0xe7, 0xfd, 0x3e, 0x91, 0x16, 0x59,
0x18, 0x3d, 0xf3, 0xa5, 0x79, 0xdc, 0xe3, 0xf1, 0xde, 0x07, 0xcd, 0xb6, 0x48, 0xbb, 0xdb, 0x32, 0x6c, 0x95, 0xd3, 0x3b, 0x86, 0x81, 0xcd, 0xc1, 0x80, 0x9c, 0x5b, 0x83, 0xf3, 0xce, 0xb0, 0x7b,
0xad, 0x45, 0x6a, 0x2a, 0x47, 0xf9, 0x85, 0x98, 0x18, 0x6f, 0x79, 0x05, 0x06, 0xe4, 0xac, 0xf5, 0xaa, 0xd5, 0x78, 0x49, 0x03, 0x73, 0x48, 0x86, 0xce, 0xb0, 0xd3, 0x5b, 0xe1, 0x1a, 0x4f, 0x68,
0x56, 0xcb, 0xa1, 0x1a, 0xdc, 0x5f, 0x1f, 0x1c, 0xda, 0x03, 0xc4, 0x93, 0x3b, 0xeb, 0xf7, 0x0c, 0x85, 0xf3, 0xa0, 0x3d, 0xe7, 0xad, 0xb6, 0xcb, 0x27, 0x9c, 0xc3, 0xce, 0x9b, 0x34, 0x45, 0xc4,
0xc7, 0x20, 0xe9, 0x5e, 0xdb, 0xe6, 0x25, 0x12, 0x7e, 0x5a, 0x9d, 0x0e, 0x49, 0xd2, 0xd3, 0xf2, 0x6b, 0x4f, 0xdb, 0x23, 0x63, 0x6a, 0x75, 0x0e, 0x5a, 0xf6, 0x9b, 0x4e, 0xcf, 0x32, 0xc8, 0x99,
0x3c, 0x12, 0xc9, 0x18, 0x90, 0x8e, 0x39, 0x68, 0x1d, 0x73, 0xb8, 0xc0, 0xe7, 0x34, 0xad, 0xd7, 0xf9, 0xbd, 0x58, 0xfa, 0x0f, 0x38, 0x98, 0x64, 0x46, 0xfa, 0xd8, 0xf9, 0x96, 0x27, 0xa2, 0x7d,
0xb6, 0xd9, 0x36, 0x48, 0x9b, 0xbb, 0xe5, 0x28, 0x70, 0x72, 0x8a, 0x9e, 0x5b, 0x1d, 0x03, 0xf7, 0x8e, 0x10, 0x54, 0xbb, 0x16, 0xee, 0x5e, 0xf4, 0x3a, 0x98, 0x60, 0xe7, 0x62, 0x68, 0x6a, 0x7b,
0x5b, 0x66, 0x47, 0x2b, 0xa2, 0x7d, 0x78, 0x90, 0xc2, 0xc6, 0xdb, 0xbe, 0x89, 0xdf, 0x11, 0xc7, 0x47, 0xff, 0xc9, 0xc3, 0xb6, 0x38, 0xa8, 0x22, 0xf4, 0x8a, 0xeb, 0x7f, 0xf9, 0x2d, 0x84, 0x1e,
0xb6, 0xc9, 0xc0, 0xb6, 0x2d, 0xad, 0x94, 0xf5, 0xc4, 0xb3, 0xb5, 0xfb, 0x86, 0xa5, 0x95, 0xd1, 0x7f, 0xf2, 0x1b, 0xa9, 0x29, 0x2f, 0xb3, 0x29, 0xfc, 0x42, 0x41, 0x7f, 0x82, 0x72, 0xf6, 0xfb,
0x03, 0xa8, 0x9e, 0xf5, 0xfb, 0x24, 0xb5, 0xa4, 0xc9, 0x56, 0x38, 0xbd, 0xd5, 0xe9, 0x60, 0x63, 0x02, 0x65, 0xf7, 0xf6, 0x0d, 0x1f, 0x1e, 0x1b, 0x3c, 0x9c, 0x81, 0x66, 0xc6, 0xcc, 0x9b, 0xb9,
0x30, 0x20, 0x67, 0xe6, 0xe0, 0xac, 0xe5, 0xb4, 0xbb, 0xda, 0x0e, 0x4f, 0x69, 0x60, 0x38, 0xc4, 0x8c, 0xca, 0xef, 0x05, 0xd4, 0xcc, 0x78, 0xb9, 0xf5, 0x11, 0xd2, 0xdc, 0xdf, 0x68, 0x4b, 0x4f,
0xb1, 0x9d, 0x56, 0x6f, 0x89, 0x6b, 0x3c, 0xa0, 0x25, 0xce, 0x27, 0xed, 0xd9, 0x6f, 0xb4, 0x5d, 0xe5, 0x5e, 0x52, 0x4e, 0x7a, 0x63, 0xbf, 0x53, 0xce, 0xfa, 0x67, 0x42, 0xf3, 0x8b, 0xfb, 0xcc,
0x5e, 0x70, 0x0e, 0xdb, 0xaf, 0x65, 0x88, 0x88, 0xe7, 0x2e, 0x97, 0x27, 0x9d, 0x53, 0xab, 0x72, 0xa9, 0xb7, 0x31, 0xd4, 0x37, 0x5c, 0xc2, 0xd1, 0x57, 0xd9, 0x0c, 0xee, 0xbd, 0xc2, 0x37, 0x9f,
0xd0, 0xb4, 0x5e, 0xb7, 0x7a, 0x66, 0x87, 0xbc, 0x32, 0xde, 0x89, 0xb3, 0xea, 0x3e, 0x07, 0x93, 0xfc, 0x10, 0x6d, 0x15, 0x65, 0xc3, 0x6d, 0x7d, 0x2d, 0xca, 0xfd, 0x77, 0xfd, 0xb5, 0x28, 0x9f,
0xc8, 0x48, 0x1f, 0xdb, 0x2f, 0x79, 0x20, 0xda, 0x67, 0x5c, 0x71, 0x6d, 0x13, 0xb7, 0xcf, 0x7b, 0xba, 0xf4, 0xbf, 0x07, 0xed, 0xf6, 0xe5, 0x0e, 0xe9, 0xb7, 0xc7, 0xde, 0xbd, 0x65, 0x36, 0x7f,
0x2d, 0x2c, 0xc5, 0xb5, 0x77, 0xf4, 0xf7, 0x2d, 0xd8, 0x12, 0x9d, 0x35, 0x42, 0x5d, 0xbe, 0x61, 0xf6, 0x49, 0x4e, 0xea, 0xdc, 0x02, 0x58, 0x5d, 0x91, 0xd0, 0xa3, 0xcc, 0x90, 0x3b, 0x57, 0xbc,
0x17, 0x2f, 0x49, 0xf4, 0xe8, 0x93, 0x2f, 0xcc, 0x7a, 0x6d, 0xfd, 0x83, 0x69, 0x1e, 0x3f, 0x57, 0xe6, 0xe3, 0x7b, 0xac, 0xa9, 0xab, 0x21, 0xd4, 0x37, 0xdc, 0x99, 0xd6, 0x66, 0xe3, 0xfe, 0x3b,
0xd0, 0x29, 0x94, 0xb2, 0xef, 0x34, 0x94, 0x6d, 0x4b, 0x6b, 0x1e, 0x70, 0x9f, 0xf4, 0xf5, 0x0a, 0x55, 0xf3, 0xc1, 0xa6, 0xab, 0xc5, 0x0b, 0xe5, 0xf8, 0xeb, 0x3f, 0x1f, 0x5e, 0x79, 0x6c, 0xba,
0x34, 0x23, 0x66, 0xde, 0x94, 0xbf, 0xc5, 0xe4, 0xa3, 0x07, 0xd5, 0x33, 0xfc, 0x1b, 0x2f, 0xa9, 0xb8, 0x3c, 0x18, 0x85, 0xb3, 0x43, 0xdf, 0xbb, 0x9a, 0xb2, 0xc0, 0x0b, 0xae, 0x02, 0xca, 0x3e,
0xfa, 0xfe, 0x5a, 0x9b, 0xbc, 0x5a, 0xf4, 0x92, 0x14, 0xe5, 0xb3, 0xe3, 0x56, 0x8a, 0xab, 0x6f, 0x86, 0xd1, 0xf5, 0xa1, 0x1f, 0x8c, 0x0f, 0x85, 0x2e, 0x0f, 0x97, 0xc3, 0x2f, 0xb7, 0xc5, 0x6f,
0x9d, 0xfa, 0xe7, 0x77, 0x99, 0xa5, 0xb7, 0x11, 0x54, 0xd7, 0xbc, 0x24, 0xd0, 0xd7, 0xd9, 0x08, 0x47, 0xbf, 0xfa, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x74, 0xbe, 0x98, 0x4d, 0x6b, 0x12, 0x00,
0xee, 0x7c, 0x87, 0xd4, 0x1f, 0xff, 0x14, 0x6d, 0x39, 0xcb, 0x9a, 0x27, 0xc7, 0xca, 0x2c, 0x77, 0x00,
0x3f, 0x58, 0x56, 0x66, 0xf9, 0xd4, 0xcb, 0xe5, 0x3d, 0x68, 0x37, 0x6f, 0xa8, 0x48, 0xbf, 0x39,
0xf6, 0xf6, 0x55, 0xb9, 0xfe, 0xcb, 0x4f, 0x72, 0xa4, 0x73, 0x13, 0x60, 0x79, 0xcf, 0x43, 0x0f,
0x33, 0x43, 0x6e, 0xdd, 0x53, 0xeb, 0x8f, 0xee, 0xb0, 0x4a, 0x57, 0x0e, 0x54, 0xd7, 0x5c, 0xfc,
0x56, 0xaa, 0x71, 0xf7, 0xc5, 0xb0, 0x7e, 0x7f, 0xdd, 0xfd, 0xe8, 0xb9, 0x72, 0xfc, 0xed, 0x9f,
0x0f, 0x2f, 0x3d, 0x36, 0x99, 0x5f, 0x1c, 0x0c, 0xc3, 0xe9, 0xa1, 0xef, 0x5d, 0x4e, 0x58, 0xe0,
0x05, 0x97, 0x01, 0x65, 0x1f, 0xc3, 0xe8, 0xea, 0xd0, 0x0f, 0x46, 0x87, 0xa2, 0xd9, 0x1c, 0x2e,
0x86, 0x5f, 0x6c, 0x89, 0xbf, 0xc6, 0xfd, 0xfa, 0xc7, 0x00, 0x00, 0x00, 0xff, 0xff, 0xaf, 0x84,
0xd2, 0x59, 0xbd, 0x13, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -1866,7 +1740,7 @@ type RouterClient interface {
//* //*
//SendPayment attempts to route a payment described by the passed //SendPayment attempts to route a payment described by the passed
//PaymentRequest to the final destination. The call returns a stream of //PaymentRequest to the final destination. The call returns a stream of
//payment status updates. //payment updates.
SendPayment(ctx context.Context, in *SendPaymentRequest, opts ...grpc.CallOption) (Router_SendPaymentClient, error) SendPayment(ctx context.Context, in *SendPaymentRequest, opts ...grpc.CallOption) (Router_SendPaymentClient, error)
//* //*
//TrackPayment returns an update stream for the payment identified by the //TrackPayment returns an update stream for the payment identified by the
@ -1928,7 +1802,7 @@ func (c *routerClient) SendPayment(ctx context.Context, in *SendPaymentRequest,
} }
type Router_SendPaymentClient interface { type Router_SendPaymentClient interface {
Recv() (*PaymentStatus, error) Recv() (*lnrpc.Payment, error)
grpc.ClientStream grpc.ClientStream
} }
@ -1936,8 +1810,8 @@ type routerSendPaymentClient struct {
grpc.ClientStream grpc.ClientStream
} }
func (x *routerSendPaymentClient) Recv() (*PaymentStatus, error) { func (x *routerSendPaymentClient) Recv() (*lnrpc.Payment, error) {
m := new(PaymentStatus) m := new(lnrpc.Payment)
if err := x.ClientStream.RecvMsg(m); err != nil { if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err return nil, err
} }
@ -1960,7 +1834,7 @@ func (c *routerClient) TrackPayment(ctx context.Context, in *TrackPaymentRequest
} }
type Router_TrackPaymentClient interface { type Router_TrackPaymentClient interface {
Recv() (*PaymentStatus, error) Recv() (*lnrpc.Payment, error)
grpc.ClientStream grpc.ClientStream
} }
@ -1968,8 +1842,8 @@ type routerTrackPaymentClient struct {
grpc.ClientStream grpc.ClientStream
} }
func (x *routerTrackPaymentClient) Recv() (*PaymentStatus, error) { func (x *routerTrackPaymentClient) Recv() (*lnrpc.Payment, error) {
m := new(PaymentStatus) m := new(lnrpc.Payment)
if err := x.ClientStream.RecvMsg(m); err != nil { if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err return nil, err
} }
@ -2067,7 +1941,7 @@ type RouterServer interface {
//* //*
//SendPayment attempts to route a payment described by the passed //SendPayment attempts to route a payment described by the passed
//PaymentRequest to the final destination. The call returns a stream of //PaymentRequest to the final destination. The call returns a stream of
//payment status updates. //payment updates.
SendPayment(*SendPaymentRequest, Router_SendPaymentServer) error SendPayment(*SendPaymentRequest, Router_SendPaymentServer) error
//* //*
//TrackPayment returns an update stream for the payment identified by the //TrackPayment returns an update stream for the payment identified by the
@ -2118,7 +1992,7 @@ func _Router_SendPayment_Handler(srv interface{}, stream grpc.ServerStream) erro
} }
type Router_SendPaymentServer interface { type Router_SendPaymentServer interface {
Send(*PaymentStatus) error Send(*lnrpc.Payment) error
grpc.ServerStream grpc.ServerStream
} }
@ -2126,7 +2000,7 @@ type routerSendPaymentServer struct {
grpc.ServerStream grpc.ServerStream
} }
func (x *routerSendPaymentServer) Send(m *PaymentStatus) error { func (x *routerSendPaymentServer) Send(m *lnrpc.Payment) error {
return x.ServerStream.SendMsg(m) return x.ServerStream.SendMsg(m)
} }
@ -2139,7 +2013,7 @@ func _Router_TrackPayment_Handler(srv interface{}, stream grpc.ServerStream) err
} }
type Router_TrackPaymentServer interface { type Router_TrackPaymentServer interface {
Send(*PaymentStatus) error Send(*lnrpc.Payment) error
grpc.ServerStream grpc.ServerStream
} }
@ -2147,7 +2021,7 @@ type routerTrackPaymentServer struct {
grpc.ServerStream grpc.ServerStream
} }
func (x *routerTrackPaymentServer) Send(m *PaymentStatus) error { func (x *routerTrackPaymentServer) Send(m *lnrpc.Payment) error {
return x.ServerStream.SendMsg(m) return x.ServerStream.SendMsg(m)
} }

@ -121,62 +121,6 @@ message TrackPaymentRequest {
bytes payment_hash = 1; bytes payment_hash = 1;
} }
enum PaymentState {
/**
Payment is still in flight.
*/
IN_FLIGHT = 0;
/**
Payment completed successfully.
*/
SUCCEEDED = 1;
/**
There are more routes to try, but the payment timeout was exceeded.
*/
FAILED_TIMEOUT = 2;
/**
All possible routes were tried and failed permanently. Or were no
routes to the destination at all.
*/
FAILED_NO_ROUTE = 3;
/**
A non-recoverable error has occured.
*/
FAILED_ERROR = 4;
/**
Payment details incorrect (unknown hash, invalid amt or
invalid final cltv delta)
*/
FAILED_INCORRECT_PAYMENT_DETAILS = 5;
/**
Insufficient local balance.
*/
FAILED_INSUFFICIENT_BALANCE = 6;
}
message PaymentStatus {
/// Current state the payment is in.
PaymentState state = 1;
/**
The pre-image of the payment when state is SUCCEEDED.
*/
bytes preimage = 2;
reserved 3;
/**
The HTLCs made in attempt to settle the payment.
*/
repeated lnrpc.HTLCAttempt htlcs = 4;
}
message RouteFeeRequest { message RouteFeeRequest {
/** /**
The destination once wishes to obtain a routing fee quote to. The destination once wishes to obtain a routing fee quote to.
@ -465,15 +409,15 @@ service Router {
/** /**
SendPayment attempts to route a payment described by the passed SendPayment attempts to route a payment described by the passed
PaymentRequest to the final destination. The call returns a stream of PaymentRequest to the final destination. The call returns a stream of
payment status updates. payment updates.
*/ */
rpc SendPayment (SendPaymentRequest) returns (stream PaymentStatus); rpc SendPayment (SendPaymentRequest) returns (stream lnrpc.Payment);
/** /**
TrackPayment returns an update stream for the payment identified by the TrackPayment returns an update stream for the payment identified by the
payment hash. payment hash.
*/ */
rpc TrackPayment (TrackPaymentRequest) returns (stream PaymentStatus); rpc TrackPayment (TrackPaymentRequest) returns (stream lnrpc.Payment);
/** /**
EstimateRouteFee allows callers to obtain a lower bound w.r.t how much it EstimateRouteFee allows callers to obtain a lower bound w.r.t how much it

@ -1094,3 +1094,131 @@ func marshallChannelUpdate(update *lnwire.ChannelUpdate) *lnrpc.ChannelUpdate {
ExtraOpaqueData: update.ExtraOpaqueData, ExtraOpaqueData: update.ExtraOpaqueData,
} }
} }
// MarshallPayment marshall a payment to its rpc representation.
func (r *RouterBackend) MarshallPayment(payment *channeldb.MPPayment) (
*lnrpc.Payment, error) {
// Fetch the payment's route and preimage. If no HTLC was
// successful, an empty route and preimage will be used.
var (
route route.Route
preimage lntypes.Preimage
)
for _, htlc := range payment.HTLCs {
// Display the last route attempted.
route = htlc.Route
// If any of the htlcs have settled, extract a valid
// preimage.
if htlc.Settle != nil {
preimage = htlc.Settle.Preimage
}
}
// Encode the hops from the successful route, if any.
path := make([]string, len(route.Hops))
for i, hop := range route.Hops {
path[i] = hex.EncodeToString(hop.PubKeyBytes[:])
}
msatValue := int64(payment.Info.Value)
satValue := int64(payment.Info.Value.ToSatoshis())
status, err := convertPaymentStatus(payment.Status)
if err != nil {
return nil, err
}
htlcs := make([]*lnrpc.HTLCAttempt, 0, len(payment.HTLCs))
for _, dbHTLC := range payment.HTLCs {
htlc, err := r.MarshalHTLCAttempt(dbHTLC)
if err != nil {
return nil, err
}
htlcs = append(htlcs, htlc)
}
paymentHash := payment.Info.PaymentHash
creationTimeNS := MarshalTimeNano(payment.Info.CreationTime)
failureReason, err := marshallPaymentFailureReason(
payment.FailureReason,
)
if err != nil {
return nil, err
}
return &lnrpc.Payment{
PaymentHash: hex.EncodeToString(paymentHash[:]),
Value: satValue,
ValueMsat: msatValue,
ValueSat: satValue,
CreationDate: payment.Info.CreationTime.Unix(),
CreationTimeNs: creationTimeNS,
Path: path,
Fee: int64(route.TotalFees().ToSatoshis()),
FeeSat: int64(route.TotalFees().ToSatoshis()),
FeeMsat: int64(route.TotalFees()),
PaymentPreimage: hex.EncodeToString(preimage[:]),
PaymentRequest: string(payment.Info.PaymentRequest),
Status: status,
Htlcs: htlcs,
PaymentIndex: payment.SequenceNum,
FailureReason: failureReason,
}, nil
}
// convertPaymentStatus converts a channeldb.PaymentStatus to the type expected
// by the RPC.
func convertPaymentStatus(dbStatus channeldb.PaymentStatus) (
lnrpc.Payment_PaymentStatus, error) {
switch dbStatus {
case channeldb.StatusUnknown:
return lnrpc.Payment_UNKNOWN, nil
case channeldb.StatusInFlight:
return lnrpc.Payment_IN_FLIGHT, nil
case channeldb.StatusSucceeded:
return lnrpc.Payment_SUCCEEDED, nil
case channeldb.StatusFailed:
return lnrpc.Payment_FAILED, nil
default:
return 0, fmt.Errorf("unhandled payment status %v", dbStatus)
}
}
// marshallPaymentFailureReason marshalls the failure reason to the corresponding rpc
// type.
func marshallPaymentFailureReason(reason *channeldb.FailureReason) (
lnrpc.PaymentFailureReason, error) {
if reason == nil {
return lnrpc.PaymentFailureReason_FAILURE_REASON_NONE, nil
}
switch *reason {
case channeldb.FailureReasonTimeout:
return lnrpc.PaymentFailureReason_FAILURE_REASON_TIMEOUT, nil
case channeldb.FailureReasonNoRoute:
return lnrpc.PaymentFailureReason_FAILURE_REASON_NO_ROUTE, nil
case channeldb.FailureReasonError:
return lnrpc.PaymentFailureReason_FAILURE_REASON_ERROR, nil
case channeldb.FailureReasonPaymentDetails:
return lnrpc.PaymentFailureReason_FAILURE_REASON_INCORRECT_PAYMENT_DETAILS, nil
case channeldb.FailureReasonInsufficientBalance:
return lnrpc.PaymentFailureReason_FAILURE_REASON_INSUFFICIENT_BALANCE, nil
}
return 0, errors.New("unknown failure reason")
}

@ -441,7 +441,7 @@ func (s *Server) trackPayment(paymentHash lntypes.Hash,
router := s.cfg.RouterBackend router := s.cfg.RouterBackend
// Subscribe to the outcome of this payment. // Subscribe to the outcome of this payment.
inFlight, resultChan, err := router.Tower.SubscribePayment( subscription, err := router.Tower.SubscribePayment(
paymentHash, paymentHash,
) )
switch { switch {
@ -450,95 +450,37 @@ func (s *Server) trackPayment(paymentHash lntypes.Hash,
case err != nil: case err != nil:
return err return err
} }
defer subscription.Close()
// If it is in flight, send a state update to the client. Payment status // Stream updates back to the client. The first update is always the
// update streams are expected to always send the current payment state // current state of the payment.
// immediately. for {
if inFlight { select {
err = stream.Send(&PaymentStatus{ case item, ok := <-subscription.Updates:
State: PaymentState_IN_FLIGHT, if !ok {
}) // No more payment updates.
if err != nil { return nil
return err
}
}
// Wait for the outcome of the payment. For payments that have
// completed, the result should already be waiting on the channel.
select {
case result := <-resultChan:
// Marshall result to rpc type.
var status PaymentStatus
if result.Success {
log.Debugf("Payment %v successfully completed",
paymentHash)
status.State = PaymentState_SUCCEEDED
status.Preimage = result.Preimage[:]
} else {
state, err := marshallFailureReason(
result.FailureReason,
)
if err != nil {
return err
} }
status.State = state result := item.(*channeldb.MPPayment)
} rpcPayment, err := router.MarshallPayment(result)
// Marshal our list of HTLCs that have been tried for this
// payment.
htlcs := make([]*lnrpc.HTLCAttempt, 0, len(result.HTLCs))
for _, dbHtlc := range result.HTLCs {
htlc, err := router.MarshalHTLCAttempt(dbHtlc)
if err != nil { if err != nil {
return err return err
} }
htlcs = append(htlcs, htlc) // Send event to the client.
err = stream.Send(rpcPayment)
if err != nil {
return err
}
case <-s.quit:
return errServerShuttingDown
case <-stream.Context().Done():
log.Debugf("Payment status stream %v canceled", paymentHash)
return stream.Context().Err()
} }
status.Htlcs = htlcs
// Send event to the client.
err = stream.Send(&status)
if err != nil {
return err
}
case <-s.quit:
return errServerShuttingDown
case <-stream.Context().Done():
log.Debugf("Payment status stream %v canceled", paymentHash)
return stream.Context().Err()
} }
return nil
}
// marshallFailureReason marshalls the failure reason to the corresponding rpc
// type.
func marshallFailureReason(reason channeldb.FailureReason) (
PaymentState, error) {
switch reason {
case channeldb.FailureReasonTimeout:
return PaymentState_FAILED_TIMEOUT, nil
case channeldb.FailureReasonNoRoute:
return PaymentState_FAILED_NO_ROUTE, nil
case channeldb.FailureReasonError:
return PaymentState_FAILED_ERROR, nil
case channeldb.FailureReasonPaymentDetails:
return PaymentState_FAILED_INCORRECT_PAYMENT_DETAILS, nil
case channeldb.FailureReasonInsufficientBalance:
return PaymentState_FAILED_INSUFFICIENT_BALANCE, nil
}
return 0, errors.New("unknown failure reason")
} }
// BuildRoute builds a route from a list of hop addresses. // BuildRoute builds a route from a list of hop addresses.

@ -188,6 +188,57 @@ func (InvoiceHTLCState) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{4} return fileDescriptor_77a6da22d6a3feb1, []int{4}
} }
type PaymentFailureReason int32
const (
//*
//Payment isn't failed (yet).
PaymentFailureReason_FAILURE_REASON_NONE PaymentFailureReason = 0
//*
//There are more routes to try, but the payment timeout was exceeded.
PaymentFailureReason_FAILURE_REASON_TIMEOUT PaymentFailureReason = 1
//*
//All possible routes were tried and failed permanently. Or were no
//routes to the destination at all.
PaymentFailureReason_FAILURE_REASON_NO_ROUTE PaymentFailureReason = 2
//*
//A non-recoverable error has occured.
PaymentFailureReason_FAILURE_REASON_ERROR PaymentFailureReason = 3
//*
//Payment details incorrect (unknown hash, invalid amt or
//invalid final cltv delta)
PaymentFailureReason_FAILURE_REASON_INCORRECT_PAYMENT_DETAILS PaymentFailureReason = 4
//*
//Insufficient local balance.
PaymentFailureReason_FAILURE_REASON_INSUFFICIENT_BALANCE PaymentFailureReason = 5
)
var PaymentFailureReason_name = map[int32]string{
0: "FAILURE_REASON_NONE",
1: "FAILURE_REASON_TIMEOUT",
2: "FAILURE_REASON_NO_ROUTE",
3: "FAILURE_REASON_ERROR",
4: "FAILURE_REASON_INCORRECT_PAYMENT_DETAILS",
5: "FAILURE_REASON_INSUFFICIENT_BALANCE",
}
var PaymentFailureReason_value = map[string]int32{
"FAILURE_REASON_NONE": 0,
"FAILURE_REASON_TIMEOUT": 1,
"FAILURE_REASON_NO_ROUTE": 2,
"FAILURE_REASON_ERROR": 3,
"FAILURE_REASON_INCORRECT_PAYMENT_DETAILS": 4,
"FAILURE_REASON_INSUFFICIENT_BALANCE": 5,
}
func (x PaymentFailureReason) String() string {
return proto.EnumName(PaymentFailureReason_name, int32(x))
}
func (PaymentFailureReason) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{5}
}
type FeatureBit int32 type FeatureBit int32
const ( const (
@ -255,7 +306,7 @@ func (x FeatureBit) String() string {
} }
func (FeatureBit) EnumDescriptor() ([]byte, []int) { func (FeatureBit) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{5} return fileDescriptor_77a6da22d6a3feb1, []int{6}
} }
type ChannelCloseSummary_ClosureType int32 type ChannelCloseSummary_ClosureType int32
@ -9504,10 +9555,11 @@ type Payment struct {
//The creation index of this payment. Each payment can be uniquely identified //The creation index of this payment. Each payment can be uniquely identified
//by this index, which may not strictly increment by 1 for payments made in //by this index, which may not strictly increment by 1 for payments made in
//older versions of lnd. //older versions of lnd.
PaymentIndex uint64 `protobuf:"varint,15,opt,name=payment_index,json=paymentIndex,proto3" json:"payment_index,omitempty"` PaymentIndex uint64 `protobuf:"varint,15,opt,name=payment_index,json=paymentIndex,proto3" json:"payment_index,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` FailureReason PaymentFailureReason `protobuf:"varint,16,opt,name=failure_reason,json=failureReason,proto3,enum=lnrpc.PaymentFailureReason" json:"failure_reason,omitempty"`
XXX_unrecognized []byte `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
} }
func (m *Payment) Reset() { *m = Payment{} } func (m *Payment) Reset() { *m = Payment{} }
@ -9644,6 +9696,13 @@ func (m *Payment) GetPaymentIndex() uint64 {
return 0 return 0
} }
func (m *Payment) GetFailureReason() PaymentFailureReason {
if m != nil {
return m.FailureReason
}
return PaymentFailureReason_FAILURE_REASON_NONE
}
type HTLCAttempt struct { type HTLCAttempt struct {
/// The status of the HTLC. /// The status of the HTLC.
Status HTLCAttempt_HTLCStatus `protobuf:"varint,1,opt,name=status,proto3,enum=lnrpc.HTLCAttempt_HTLCStatus" json:"status,omitempty"` Status HTLCAttempt_HTLCStatus `protobuf:"varint,1,opt,name=status,proto3,enum=lnrpc.HTLCAttempt_HTLCStatus" json:"status,omitempty"`
@ -11759,6 +11818,7 @@ func init() {
proto.RegisterEnum("lnrpc.Initiator", Initiator_name, Initiator_value) proto.RegisterEnum("lnrpc.Initiator", Initiator_name, Initiator_value)
proto.RegisterEnum("lnrpc.NodeMetricType", NodeMetricType_name, NodeMetricType_value) proto.RegisterEnum("lnrpc.NodeMetricType", NodeMetricType_name, NodeMetricType_value)
proto.RegisterEnum("lnrpc.InvoiceHTLCState", InvoiceHTLCState_name, InvoiceHTLCState_value) proto.RegisterEnum("lnrpc.InvoiceHTLCState", InvoiceHTLCState_name, InvoiceHTLCState_value)
proto.RegisterEnum("lnrpc.PaymentFailureReason", PaymentFailureReason_name, PaymentFailureReason_value)
proto.RegisterEnum("lnrpc.FeatureBit", FeatureBit_name, FeatureBit_value) proto.RegisterEnum("lnrpc.FeatureBit", FeatureBit_name, FeatureBit_value)
proto.RegisterEnum("lnrpc.ChannelCloseSummary_ClosureType", ChannelCloseSummary_ClosureType_name, ChannelCloseSummary_ClosureType_value) proto.RegisterEnum("lnrpc.ChannelCloseSummary_ClosureType", ChannelCloseSummary_ClosureType_name, ChannelCloseSummary_ClosureType_value)
proto.RegisterEnum("lnrpc.Peer_SyncType", Peer_SyncType_name, Peer_SyncType_value) proto.RegisterEnum("lnrpc.Peer_SyncType", Peer_SyncType_name, Peer_SyncType_value)
@ -11948,754 +12008,760 @@ 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{
// 11938 bytes of a gzipped FileDescriptorProto // 12041 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0xbd, 0x69, 0x6c, 0x24, 0x49, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0xbd, 0x5b, 0x6c, 0x24, 0x49,
0x76, 0x18, 0xdc, 0x75, 0xb1, 0xaa, 0x5e, 0x1d, 0x2c, 0x06, 0xaf, 0x6a, 0x76, 0xf7, 0x74, 0x4f, 0x76, 0x18, 0xda, 0xf5, 0x22, 0xab, 0x4e, 0x3d, 0x58, 0x0c, 0xbe, 0xaa, 0xd9, 0xdd, 0xd3, 0x3d,
0xce, 0xec, 0x4c, 0x4f, 0xcf, 0x2e, 0xbb, 0xa7, 0x77, 0x7b, 0x66, 0x77, 0xe6, 0xd3, 0x6a, 0x8b, 0x39, 0xb3, 0xd3, 0xbd, 0x3d, 0xb3, 0xec, 0x9e, 0xde, 0xed, 0x99, 0xdd, 0x99, 0xab, 0xd5, 0x16,
0x64, 0xb1, 0x59, 0xdb, 0xbc, 0x26, 0xab, 0x38, 0xa3, 0x5e, 0x1d, 0xb9, 0xc9, 0xaa, 0x20, 0x99, 0xc9, 0x62, 0xb3, 0xb6, 0xc9, 0x22, 0x27, 0xab, 0x38, 0xa3, 0x59, 0x3d, 0x72, 0x93, 0x55, 0x41,
0xea, 0xaa, 0xcc, 0x9a, 0xcc, 0x2c, 0x1e, 0xbb, 0x98, 0xef, 0x87, 0x61, 0x1b, 0x82, 0x61, 0x1b, 0x32, 0xd5, 0x55, 0x99, 0x35, 0x99, 0x59, 0x7c, 0xec, 0x62, 0xee, 0x87, 0x61, 0x1b, 0x82, 0x61,
0x10, 0x6c, 0x19, 0xb0, 0x2c, 0xc1, 0x87, 0x60, 0x1b, 0x86, 0x01, 0x41, 0x80, 0xe4, 0x1f, 0x06, 0x1b, 0x10, 0x6c, 0x19, 0xb0, 0x2c, 0xc1, 0x0f, 0xc1, 0x36, 0x0c, 0x03, 0x82, 0x00, 0xc9, 0x1f,
0xfc, 0x5f, 0x7f, 0x7c, 0xc0, 0x90, 0x0c, 0x18, 0x86, 0x20, 0xc0, 0xb0, 0x2d, 0xff, 0x33, 0x04, 0x06, 0xfc, 0xaf, 0x1f, 0x3f, 0x60, 0x48, 0xfe, 0xb0, 0x21, 0x08, 0x30, 0x6c, 0xcb, 0x7f, 0x86,
0xf8, 0xb7, 0x01, 0x23, 0xde, 0x8b, 0xc8, 0x8c, 0xac, 0x4a, 0x76, 0xf7, 0xec, 0xae, 0xf7, 0x0f, 0x00, 0x7f, 0x1b, 0x30, 0xe2, 0x9c, 0x88, 0xcc, 0xc8, 0xaa, 0x64, 0x77, 0xcf, 0xee, 0x7a, 0x7f,
0x59, 0xf9, 0xe2, 0xc5, 0xfd, 0xe2, 0xc5, 0xbb, 0x22, 0x02, 0xca, 0xfe, 0xb8, 0xbf, 0x3e, 0xf6, 0xc8, 0xca, 0x13, 0x27, 0xde, 0x27, 0x4e, 0x9c, 0x57, 0x44, 0x40, 0xc9, 0x1f, 0xf7, 0x37, 0xc6,
0xbd, 0xd0, 0x63, 0x85, 0xa1, 0xeb, 0x8f, 0xfb, 0x6b, 0xb7, 0x4f, 0x3d, 0xef, 0x74, 0xc8, 0x1f, 0xbe, 0x17, 0x7a, 0xac, 0x30, 0x74, 0xfd, 0x71, 0x7f, 0xfd, 0xf6, 0xa9, 0xe7, 0x9d, 0x0e, 0xf9,
0xda, 0x63, 0xe7, 0xa1, 0xed, 0xba, 0x5e, 0x68, 0x87, 0x8e, 0xe7, 0x06, 0x84, 0x64, 0xfc, 0x10, 0x23, 0x7b, 0xec, 0x3c, 0xb2, 0x5d, 0xd7, 0x0b, 0xed, 0xd0, 0xf1, 0xdc, 0x80, 0x90, 0x8c, 0x1f,
0xea, 0x4f, 0xb9, 0xdb, 0xe5, 0x7c, 0x60, 0xf2, 0x2f, 0x26, 0x3c, 0x08, 0xd9, 0xfb, 0xb0, 0x60, 0x42, 0xed, 0x19, 0x77, 0xbb, 0x9c, 0x0f, 0x4c, 0xfe, 0xc5, 0x84, 0x07, 0x21, 0x7b, 0x17, 0x16,
0xf3, 0x1f, 0x71, 0x3e, 0xb0, 0xc6, 0x76, 0x10, 0x8c, 0xcf, 0x7c, 0x3b, 0xe0, 0xcd, 0xcc, 0xbd, 0x6d, 0xfe, 0x23, 0xce, 0x07, 0xd6, 0xd8, 0x0e, 0x82, 0xf1, 0x99, 0x6f, 0x07, 0xbc, 0x91, 0xb9,
0xcc, 0xfd, 0xaa, 0xd9, 0xa0, 0x84, 0xc3, 0x08, 0xce, 0xde, 0x84, 0x6a, 0x20, 0x50, 0xb9, 0x1b, 0x97, 0x79, 0x50, 0x31, 0xeb, 0x94, 0x70, 0x18, 0xc1, 0xd9, 0x9b, 0x50, 0x09, 0x04, 0x2a, 0x77,
0xfa, 0xde, 0xf8, 0xaa, 0x99, 0x45, 0xbc, 0x8a, 0x80, 0xb5, 0x09, 0x64, 0x0c, 0x61, 0x3e, 0xaa, 0x43, 0xdf, 0x1b, 0x5f, 0x35, 0xb2, 0x88, 0x57, 0x16, 0xb0, 0x16, 0x81, 0x8c, 0x21, 0x2c, 0x44,
0x21, 0x18, 0x7b, 0x6e, 0xc0, 0xd9, 0x23, 0x58, 0xea, 0x3b, 0xe3, 0x33, 0xee, 0x5b, 0x98, 0x79, 0x35, 0x04, 0x63, 0xcf, 0x0d, 0x38, 0x7b, 0x0c, 0xcb, 0x7d, 0x67, 0x7c, 0xc6, 0x7d, 0x0b, 0x33,
0xe4, 0xf2, 0x91, 0xe7, 0x3a, 0xfd, 0x66, 0xe6, 0x5e, 0xee, 0x7e, 0xd9, 0x64, 0x94, 0x26, 0x72, 0x8f, 0x5c, 0x3e, 0xf2, 0x5c, 0xa7, 0xdf, 0xc8, 0xdc, 0xcb, 0x3d, 0x28, 0x99, 0x8c, 0xd2, 0x44,
0xec, 0xc9, 0x14, 0xf6, 0x2e, 0xcc, 0x73, 0x97, 0xe0, 0x7c, 0x80, 0xb9, 0x64, 0x55, 0xf5, 0x18, 0x8e, 0x7d, 0x99, 0xc2, 0xee, 0xc3, 0x02, 0x77, 0x09, 0xce, 0x07, 0x98, 0x4b, 0x56, 0x55, 0x8b,
0x2c, 0x32, 0x18, 0xbf, 0x91, 0x85, 0x85, 0x8e, 0xeb, 0x84, 0x9f, 0xdb, 0xc3, 0x21, 0x0f, 0x55, 0xc1, 0x22, 0x83, 0xf1, 0x1b, 0x59, 0x58, 0x6c, 0xbb, 0x4e, 0xf8, 0x99, 0x3d, 0x1c, 0xf2, 0x50,
0x9f, 0xde, 0x85, 0xf9, 0x0b, 0x04, 0x60, 0x9f, 0x2e, 0x3c, 0x7f, 0x20, 0x7b, 0x54, 0x27, 0xf0, 0xf5, 0xe9, 0x3e, 0x2c, 0x5c, 0x20, 0x00, 0xfb, 0x74, 0xe1, 0xf9, 0x03, 0xd9, 0xa3, 0x1a, 0x81,
0xa1, 0x84, 0x5e, 0xdb, 0xb2, 0xec, 0xb5, 0x2d, 0x4b, 0x1d, 0xae, 0xdc, 0x35, 0xc3, 0xf5, 0x2e, 0x0f, 0x25, 0xf4, 0xda, 0x96, 0x65, 0xaf, 0x6d, 0x59, 0xea, 0x70, 0xe5, 0xae, 0x19, 0xae, 0xfb,
0xcc, 0xfb, 0xbc, 0xef, 0x9d, 0x73, 0xff, 0xca, 0xba, 0x70, 0xdc, 0x81, 0x77, 0xd1, 0xcc, 0xdf, 0xb0, 0xe0, 0xf3, 0xbe, 0x77, 0xce, 0xfd, 0x2b, 0xeb, 0xc2, 0x71, 0x07, 0xde, 0x45, 0x23, 0x7f,
0xcb, 0xdc, 0x2f, 0x98, 0x75, 0x05, 0xfe, 0x1c, 0xa1, 0x6c, 0x03, 0xe6, 0xfb, 0x67, 0xb6, 0xeb, 0x2f, 0xf3, 0xa0, 0x60, 0xd6, 0x14, 0xf8, 0x33, 0x84, 0xb2, 0x4d, 0x58, 0xe8, 0x9f, 0xd9, 0xae,
0xf2, 0xa1, 0x75, 0x6c, 0xf7, 0x5f, 0x4c, 0xc6, 0x41, 0xb3, 0x70, 0x2f, 0x73, 0xbf, 0xf2, 0xf8, 0xcb, 0x87, 0xd6, 0xb1, 0xdd, 0x7f, 0x31, 0x19, 0x07, 0x8d, 0xc2, 0xbd, 0xcc, 0x83, 0xf2, 0x93,
0xe6, 0x3a, 0xce, 0xea, 0xfa, 0xe6, 0x99, 0xed, 0x6e, 0x60, 0x4a, 0xd7, 0xb5, 0xc7, 0xc1, 0x99, 0x9b, 0x1b, 0x38, 0xab, 0x1b, 0x5b, 0x67, 0xb6, 0xbb, 0x89, 0x29, 0x5d, 0xd7, 0x1e, 0x07, 0x67,
0x17, 0x9a, 0x75, 0x99, 0x83, 0xc0, 0x81, 0xb1, 0x04, 0x4c, 0x1f, 0x09, 0x1a, 0x7b, 0xe3, 0x5f, 0x5e, 0x68, 0xd6, 0x64, 0x0e, 0x02, 0x07, 0xc6, 0x32, 0x30, 0x7d, 0x24, 0x68, 0xec, 0x8d, 0x7f,
0x66, 0x60, 0xf1, 0xc8, 0x1d, 0x7a, 0xfd, 0x17, 0x3f, 0xe1, 0x10, 0xa5, 0xf4, 0x21, 0xfb, 0xba, 0x99, 0x81, 0xa5, 0x23, 0x77, 0xe8, 0xf5, 0x5f, 0xfc, 0x84, 0x43, 0x94, 0xd2, 0x87, 0xec, 0xeb,
0x7d, 0xc8, 0x7d, 0xd5, 0x3e, 0xac, 0xc0, 0x52, 0xb2, 0xb1, 0xb2, 0x17, 0x1c, 0x96, 0x45, 0xee, 0xf6, 0x21, 0xf7, 0x55, 0xfb, 0xb0, 0x0a, 0xcb, 0xc9, 0xc6, 0xca, 0x5e, 0x70, 0x58, 0x11, 0xb9,
0x53, 0xae, 0x9a, 0xa5, 0xba, 0xf1, 0x1e, 0x34, 0xfa, 0x13, 0xdf, 0xe7, 0xee, 0x4c, 0x3f, 0xe6, 0x4f, 0xb9, 0x6a, 0x96, 0xea, 0xc6, 0xd7, 0xa1, 0xde, 0x9f, 0xf8, 0x3e, 0x77, 0x67, 0xfa, 0xb1,
0x25, 0x3c, 0xea, 0xc8, 0x9b, 0x50, 0x75, 0xf9, 0x45, 0x8c, 0x26, 0x69, 0xd7, 0xe5, 0x17, 0x0a, 0x20, 0xe1, 0x51, 0x47, 0xde, 0x84, 0x8a, 0xcb, 0x2f, 0x62, 0x34, 0x49, 0xbb, 0x2e, 0xbf, 0x50,
0xc5, 0x68, 0xc2, 0xca, 0x74, 0x35, 0xb2, 0x01, 0x7f, 0x91, 0x81, 0xfc, 0x51, 0x78, 0xe9, 0xb1, 0x28, 0x46, 0x03, 0x56, 0xa7, 0xab, 0x91, 0x0d, 0xf8, 0x8b, 0x0c, 0xe4, 0x8f, 0xc2, 0x4b, 0x8f,
0x27, 0x50, 0xb5, 0x07, 0x03, 0x9f, 0x07, 0x81, 0x15, 0x5e, 0x8d, 0x69, 0xa5, 0xd4, 0x1f, 0x33, 0x3d, 0x85, 0x8a, 0x3d, 0x18, 0xf8, 0x3c, 0x08, 0xac, 0xf0, 0x6a, 0x4c, 0x2b, 0xa5, 0xf6, 0x84,
0xd9, 0xc5, 0x16, 0x25, 0xf5, 0xae, 0xc6, 0xdc, 0xac, 0xd8, 0xf1, 0x07, 0x6b, 0x42, 0x51, 0x7e, 0xc9, 0x2e, 0x36, 0x29, 0xa9, 0x77, 0x35, 0xe6, 0x66, 0xd9, 0x8e, 0x3f, 0x58, 0x03, 0xe6, 0xe5,
0x62, 0xbd, 0x65, 0x53, 0x7d, 0xb2, 0x3b, 0x00, 0xf6, 0xc8, 0x9b, 0xb8, 0xa1, 0x15, 0xd8, 0x21, 0x27, 0xd6, 0x5b, 0x32, 0xd5, 0x27, 0xbb, 0x03, 0x60, 0x8f, 0xbc, 0x89, 0x1b, 0x5a, 0x81, 0x1d,
0x8e, 0x58, 0xce, 0x2c, 0x13, 0xa4, 0x6b, 0x87, 0xec, 0x16, 0x94, 0xc7, 0x2f, 0xac, 0xa0, 0xef, 0xe2, 0x88, 0xe5, 0xcc, 0x12, 0x41, 0xba, 0x76, 0xc8, 0x6e, 0x41, 0x69, 0xfc, 0xc2, 0x0a, 0xfa,
0x3b, 0xe3, 0x10, 0x89, 0xa7, 0x6c, 0x96, 0xc6, 0x2f, 0xba, 0xf8, 0xcd, 0xde, 0x87, 0x92, 0x37, 0xbe, 0x33, 0x0e, 0x91, 0x78, 0x4a, 0x66, 0x71, 0xfc, 0xa2, 0x8b, 0xdf, 0xec, 0x5d, 0x28, 0x7a,
0x09, 0xc7, 0x9e, 0xe3, 0x86, 0x92, 0x5e, 0xe6, 0x65, 0x43, 0x0e, 0x26, 0xe1, 0xa1, 0x00, 0x9b, 0x93, 0x70, 0xec, 0x39, 0x6e, 0x28, 0xe9, 0x65, 0x41, 0x36, 0xe4, 0x60, 0x12, 0x1e, 0x0a, 0xb0,
0x11, 0x02, 0x7b, 0x1b, 0x6a, 0x7d, 0xcf, 0x3d, 0x71, 0xfc, 0x11, 0x71, 0x84, 0xe6, 0x1c, 0xd6, 0x19, 0x21, 0xb0, 0xb7, 0xa1, 0xda, 0xf7, 0xdc, 0x13, 0xc7, 0x1f, 0x11, 0x47, 0x68, 0xcc, 0x61,
0x95, 0x04, 0x1a, 0x7f, 0x90, 0x85, 0x4a, 0xcf, 0xb7, 0xdd, 0xc0, 0xee, 0x0b, 0x00, 0x5b, 0x85, 0x5d, 0x49, 0xa0, 0xf1, 0x07, 0x59, 0x28, 0xf7, 0x7c, 0xdb, 0x0d, 0xec, 0xbe, 0x00, 0xb0, 0x35,
0x62, 0x78, 0x69, 0x9d, 0xd9, 0xc1, 0x19, 0x76, 0xb5, 0x6c, 0xce, 0x85, 0x97, 0x3b, 0x76, 0x70, 0x98, 0x0f, 0x2f, 0xad, 0x33, 0x3b, 0x38, 0xc3, 0xae, 0x96, 0xcc, 0xb9, 0xf0, 0x72, 0xd7, 0x0e,
0xc6, 0x56, 0x60, 0x8e, 0x5a, 0x89, 0x1d, 0xca, 0x99, 0xf2, 0x4b, 0x2c, 0x10, 0x77, 0x32, 0xb2, 0xce, 0xd8, 0x2a, 0xcc, 0x51, 0x2b, 0xb1, 0x43, 0x39, 0x53, 0x7e, 0x89, 0x05, 0xe2, 0x4e, 0x46,
0x92, 0x55, 0xe5, 0x90, 0x62, 0x1a, 0xee, 0x64, 0xb4, 0xa9, 0xc3, 0x45, 0xe7, 0x8f, 0xc5, 0x74, 0x56, 0xb2, 0xaa, 0x1c, 0x52, 0x4c, 0xdd, 0x9d, 0x8c, 0xb6, 0x74, 0xb8, 0xe8, 0xfc, 0xb1, 0x98,
0x53, 0x05, 0xd4, 0xbd, 0x32, 0x42, 0xb0, 0x8e, 0x37, 0xa1, 0x2a, 0x93, 0xb9, 0x73, 0x7a, 0x46, 0x6e, 0xaa, 0x80, 0xba, 0x57, 0x42, 0x08, 0xd6, 0xf1, 0x26, 0x54, 0x64, 0x32, 0x77, 0x4e, 0xcf,
0x7d, 0x2c, 0x98, 0x15, 0x42, 0x40, 0x90, 0x28, 0x21, 0x74, 0x46, 0xdc, 0x0a, 0x42, 0x7b, 0x34, 0xa8, 0x8f, 0x05, 0xb3, 0x4c, 0x08, 0x08, 0x12, 0x25, 0x84, 0xce, 0x88, 0x5b, 0x41, 0x68, 0x8f,
0x96, 0x5d, 0x2a, 0x0b, 0x48, 0x57, 0x00, 0x30, 0xd9, 0x0b, 0xed, 0xa1, 0x75, 0xc2, 0x79, 0xd0, 0xc6, 0xb2, 0x4b, 0x25, 0x01, 0xe9, 0x0a, 0x00, 0x26, 0x7b, 0xa1, 0x3d, 0xb4, 0x4e, 0x38, 0x0f,
0x2c, 0xca, 0x64, 0x01, 0xd9, 0xe6, 0x3c, 0x60, 0x5f, 0x83, 0xfa, 0x80, 0x07, 0xa1, 0x25, 0x27, 0x1a, 0xf3, 0x32, 0x59, 0x40, 0x76, 0x38, 0x0f, 0xd8, 0xd7, 0xa0, 0x36, 0xe0, 0x41, 0x68, 0xc9,
0x83, 0x07, 0xcd, 0x12, 0xae, 0xfc, 0x9a, 0x80, 0xb6, 0x14, 0x90, 0xdd, 0x06, 0xf0, 0xed, 0x0b, 0xc9, 0xe0, 0x41, 0xa3, 0x88, 0x2b, 0xbf, 0x2a, 0xa0, 0x4d, 0x05, 0x64, 0xb7, 0x01, 0x7c, 0xfb,
0x4b, 0x0c, 0x04, 0xbf, 0x6c, 0x96, 0x69, 0x16, 0x7c, 0xfb, 0xa2, 0x77, 0xb9, 0xc3, 0x2f, 0x05, 0xc2, 0x12, 0x03, 0xc1, 0x2f, 0x1b, 0x25, 0x9a, 0x05, 0xdf, 0xbe, 0xe8, 0x5d, 0xee, 0xf2, 0x4b,
0xd5, 0x3c, 0xe5, 0xa1, 0x36, 0x68, 0x81, 0xa4, 0x4e, 0x63, 0x17, 0x98, 0x06, 0xde, 0xe2, 0xa1, 0x41, 0x35, 0xcf, 0x78, 0xa8, 0x0d, 0x5a, 0x20, 0xa9, 0xd3, 0xd8, 0x03, 0xa6, 0x81, 0xb7, 0x79,
0xed, 0x0c, 0x03, 0xf6, 0x21, 0x54, 0x43, 0x0d, 0x19, 0xd9, 0x60, 0x25, 0x22, 0x21, 0x2d, 0x83, 0x68, 0x3b, 0xc3, 0x80, 0x7d, 0x00, 0x95, 0x50, 0x43, 0x46, 0x36, 0x58, 0x8e, 0x48, 0x48, 0xcb,
0x99, 0xc0, 0x33, 0xce, 0xa0, 0xb4, 0xcd, 0xf9, 0xae, 0x33, 0x72, 0x42, 0xb6, 0x02, 0x85, 0x13, 0x60, 0x26, 0xf0, 0x8c, 0x33, 0x28, 0xee, 0x70, 0xbe, 0xe7, 0x8c, 0x9c, 0x90, 0xad, 0x42, 0xe1,
0xe7, 0x92, 0x13, 0xb1, 0xe7, 0x76, 0x6e, 0x98, 0xf4, 0xc9, 0xee, 0x02, 0xe0, 0x0f, 0x6b, 0x14, 0xc4, 0xb9, 0xe4, 0x44, 0xec, 0xb9, 0xdd, 0x1b, 0x26, 0x7d, 0xb2, 0xbb, 0x00, 0xf8, 0xc3, 0x1a,
0x51, 0xd3, 0xce, 0x0d, 0xb3, 0x8c, 0xb0, 0xbd, 0xc0, 0x0e, 0xd9, 0x1a, 0x14, 0xc7, 0xdc, 0xef, 0x45, 0xd4, 0xb4, 0x7b, 0xc3, 0x2c, 0x21, 0x6c, 0x3f, 0xb0, 0x43, 0xb6, 0x0e, 0xf3, 0x63, 0xee,
0x73, 0x35, 0x6f, 0x3b, 0x37, 0x4c, 0x05, 0xd8, 0x28, 0x42, 0x61, 0x28, 0x4a, 0x37, 0xfe, 0xb8, 0xf7, 0xb9, 0x9a, 0xb7, 0xdd, 0x1b, 0xa6, 0x02, 0x6c, 0xce, 0x43, 0x61, 0x28, 0x4a, 0x37, 0xfe,
0x00, 0x95, 0x2e, 0x77, 0xa3, 0x55, 0xc6, 0x20, 0x2f, 0x06, 0x44, 0xae, 0x2c, 0xfc, 0xcd, 0xde, 0xb8, 0x00, 0xe5, 0x2e, 0x77, 0xa3, 0x55, 0xc6, 0x20, 0x2f, 0x06, 0x44, 0xae, 0x2c, 0xfc, 0xcd,
0x82, 0x0a, 0x0e, 0x5d, 0x10, 0xfa, 0x8e, 0x7b, 0x4a, 0x54, 0xbd, 0x91, 0x6d, 0x66, 0x4c, 0x10, 0xde, 0x82, 0x32, 0x0e, 0x5d, 0x10, 0xfa, 0x8e, 0x7b, 0x4a, 0x54, 0xbd, 0x99, 0x6d, 0x64, 0x4c,
0xe0, 0x2e, 0x42, 0x59, 0x03, 0x72, 0xf6, 0x48, 0x51, 0xb5, 0xf8, 0xc9, 0x6e, 0x42, 0xc9, 0x1e, 0x10, 0xe0, 0x2e, 0x42, 0x59, 0x1d, 0x72, 0xf6, 0x48, 0x51, 0xb5, 0xf8, 0xc9, 0x6e, 0x42, 0xd1,
0x85, 0xd4, 0xbc, 0x2a, 0x82, 0x8b, 0xf6, 0x28, 0xc4, 0xa6, 0xbd, 0x09, 0xd5, 0xb1, 0x7d, 0x35, 0x1e, 0x85, 0xd4, 0xbc, 0x0a, 0x82, 0xe7, 0xed, 0x51, 0x88, 0x4d, 0x7b, 0x13, 0x2a, 0x63, 0xfb,
0x12, 0x6b, 0x39, 0x22, 0x87, 0xaa, 0x59, 0x91, 0x30, 0x24, 0x88, 0xc7, 0xb0, 0xa8, 0xa3, 0xa8, 0x6a, 0x24, 0xd6, 0x72, 0x44, 0x0e, 0x15, 0xb3, 0x2c, 0x61, 0x48, 0x10, 0x4f, 0x60, 0x49, 0x47,
0xca, 0x0b, 0x51, 0xe5, 0x0b, 0x1a, 0xb6, 0x6c, 0xc3, 0xbb, 0x30, 0xaf, 0xf2, 0xf8, 0xd4, 0x1f, 0x51, 0x95, 0x17, 0xa2, 0xca, 0x17, 0x35, 0x6c, 0xd9, 0x86, 0xfb, 0xb0, 0xa0, 0xf2, 0xf8, 0xd4,
0x24, 0x93, 0xb2, 0x59, 0x97, 0x60, 0xd5, 0xcb, 0xfb, 0xd0, 0x38, 0x71, 0x5c, 0x7b, 0x68, 0xf5, 0x1f, 0x24, 0x93, 0x92, 0x59, 0x93, 0x60, 0xd5, 0xcb, 0x07, 0x50, 0x3f, 0x71, 0x5c, 0x7b, 0x68,
0x87, 0xe1, 0xb9, 0x35, 0xe0, 0xc3, 0xd0, 0x46, 0x8a, 0x29, 0x98, 0x75, 0x84, 0x6f, 0x0e, 0xc3, 0xf5, 0x87, 0xe1, 0xb9, 0x35, 0xe0, 0xc3, 0xd0, 0x46, 0x8a, 0x29, 0x98, 0x35, 0x84, 0x6f, 0x0d,
0xf3, 0x2d, 0x01, 0x65, 0x5f, 0x87, 0xf2, 0x09, 0xe7, 0x16, 0x0e, 0x56, 0xb3, 0x94, 0x58, 0x78, 0xc3, 0xf3, 0x6d, 0x01, 0x65, 0xef, 0x41, 0xe9, 0x84, 0x73, 0x0b, 0x07, 0xab, 0x51, 0x4c, 0x2c,
0x6a, 0x86, 0xcc, 0xd2, 0x89, 0x9a, 0xab, 0xaf, 0x43, 0xc3, 0x9b, 0x84, 0xa7, 0x9e, 0xe3, 0x9e, 0x3c, 0x35, 0x43, 0x66, 0xf1, 0x44, 0xcd, 0xd5, 0x7b, 0x50, 0xf7, 0x26, 0xe1, 0xa9, 0xe7, 0xb8,
0x5a, 0x82, 0xdf, 0x59, 0xce, 0x00, 0x69, 0x28, 0xbf, 0x91, 0x7d, 0x94, 0x31, 0xeb, 0x2a, 0x4d, 0xa7, 0x96, 0xe0, 0x77, 0x96, 0x33, 0x40, 0x1a, 0xca, 0x6f, 0x66, 0x1f, 0x67, 0xcc, 0x9a, 0x4a,
0x70, 0x9e, 0xce, 0x80, 0xbd, 0x03, 0xf3, 0x43, 0x3b, 0x08, 0xad, 0x33, 0x6f, 0x6c, 0x8d, 0x27, 0x13, 0x9c, 0xa7, 0x3d, 0x60, 0xef, 0xc0, 0xc2, 0xd0, 0x0e, 0x42, 0xeb, 0xcc, 0x1b, 0x5b, 0xe3,
0xc7, 0x2f, 0xf8, 0x55, 0xb3, 0x86, 0x03, 0x51, 0x13, 0xe0, 0x1d, 0x6f, 0x7c, 0x88, 0x40, 0x41, 0xc9, 0xf1, 0x0b, 0x7e, 0xd5, 0xa8, 0xe2, 0x40, 0x54, 0x05, 0x78, 0xd7, 0x1b, 0x1f, 0x22, 0x50,
0xd9, 0xd8, 0x4e, 0x6a, 0x04, 0xdc, 0xcb, 0xdc, 0xaf, 0x99, 0x65, 0x01, 0xa1, 0x4a, 0x9f, 0xc3, 0x50, 0x36, 0xb6, 0x93, 0x1a, 0x01, 0xf7, 0x32, 0x0f, 0xaa, 0x66, 0x49, 0x40, 0xa8, 0xd2, 0xcf,
0x22, 0x4e, 0x4f, 0x7f, 0x12, 0x84, 0xde, 0xc8, 0x12, 0xbc, 0xda, 0x1f, 0x04, 0xcd, 0x0a, 0xd2, 0x61, 0x09, 0xa7, 0xa7, 0x3f, 0x09, 0x42, 0x6f, 0x64, 0x09, 0x5e, 0xed, 0x0f, 0x82, 0x46, 0x19,
0xda, 0x7b, 0xb2, 0xb1, 0xda, 0x1c, 0xaf, 0x6f, 0xf1, 0x20, 0xdc, 0x44, 0x64, 0x93, 0x70, 0xc5, 0x69, 0xed, 0xeb, 0xb2, 0xb1, 0xda, 0x1c, 0x6f, 0x6c, 0xf3, 0x20, 0xdc, 0x42, 0x64, 0x93, 0x70,
0x86, 0x7e, 0x65, 0x2e, 0x0c, 0xa6, 0xe1, 0xec, 0xeb, 0xc0, 0xec, 0xe1, 0xd0, 0xbb, 0xb0, 0x02, 0xc5, 0x86, 0x7e, 0x65, 0x2e, 0x0e, 0xa6, 0xe1, 0xec, 0x3d, 0x60, 0xf6, 0x70, 0xe8, 0x5d, 0x58,
0x3e, 0x3c, 0xb1, 0xe4, 0x20, 0x36, 0xeb, 0xf7, 0x32, 0xf7, 0x4b, 0x66, 0x03, 0x53, 0xba, 0x7c, 0x01, 0x1f, 0x9e, 0x58, 0x72, 0x10, 0x1b, 0xb5, 0x7b, 0x99, 0x07, 0x45, 0xb3, 0x8e, 0x29, 0x5d,
0x78, 0x72, 0x48, 0x70, 0xf6, 0x21, 0xe0, 0x62, 0xb2, 0x4e, 0xb8, 0x1d, 0x4e, 0x7c, 0x1e, 0x34, 0x3e, 0x3c, 0x39, 0x24, 0x38, 0xfb, 0x00, 0x70, 0x31, 0x59, 0x27, 0xdc, 0x0e, 0x27, 0x3e, 0x0f,
0xe7, 0xef, 0xe5, 0xee, 0xd7, 0x1f, 0x2f, 0x44, 0xe3, 0x85, 0xe0, 0x0d, 0x27, 0x34, 0xab, 0x02, 0x1a, 0x0b, 0xf7, 0x72, 0x0f, 0x6a, 0x4f, 0x16, 0xa3, 0xf1, 0x42, 0xf0, 0xa6, 0x13, 0x9a, 0x15,
0x4f, 0x7e, 0x07, 0x6b, 0x5b, 0xb0, 0x92, 0xde, 0x24, 0x41, 0x54, 0x62, 0x54, 0x04, 0x31, 0xe6, 0x81, 0x27, 0xbf, 0x83, 0xf5, 0x6d, 0x58, 0x4d, 0x6f, 0x92, 0x20, 0x2a, 0x31, 0x2a, 0x82, 0x18,
0x4d, 0xf1, 0x93, 0x2d, 0x41, 0xe1, 0xdc, 0x1e, 0x4e, 0xb8, 0xe4, 0xe9, 0xf4, 0xf1, 0x71, 0xf6, 0xf3, 0xa6, 0xf8, 0xc9, 0x96, 0xa1, 0x70, 0x6e, 0x0f, 0x27, 0x5c, 0xf2, 0x74, 0xfa, 0xf8, 0x28,
0xdb, 0x19, 0xe3, 0x8f, 0x32, 0x50, 0xa5, 0x5e, 0x4a, 0x59, 0xe4, 0x2d, 0xa8, 0x29, 0x6a, 0xe0, 0xfb, 0xed, 0x8c, 0xf1, 0x47, 0x19, 0xa8, 0x50, 0x2f, 0xa5, 0x2c, 0xf2, 0x16, 0x54, 0x15, 0x35,
0xbe, 0xef, 0xf9, 0x92, 0xab, 0x29, 0xca, 0x6b, 0x0b, 0x98, 0xd8, 0x55, 0x14, 0xd2, 0xd8, 0xe7, 0x70, 0xdf, 0xf7, 0x7c, 0xc9, 0xd5, 0x14, 0xe5, 0xb5, 0x04, 0x4c, 0xec, 0x2a, 0x0a, 0x69, 0xec,
0xce, 0xc8, 0x3e, 0x55, 0x45, 0x2b, 0x52, 0x3a, 0x94, 0x60, 0xf6, 0x41, 0x5c, 0x9e, 0xef, 0x4d, 0x73, 0x67, 0x64, 0x9f, 0xaa, 0xa2, 0x15, 0x29, 0x1d, 0x4a, 0x30, 0x7b, 0x3f, 0x2e, 0xcf, 0xf7,
0x42, 0x2e, 0xf7, 0xbc, 0xaa, 0xec, 0x9e, 0x29, 0x60, 0x51, 0xe9, 0xf8, 0xf5, 0x1a, 0x74, 0x6e, 0x26, 0x21, 0x97, 0x7b, 0x5e, 0x45, 0x76, 0xcf, 0x14, 0xb0, 0xa8, 0x74, 0xfc, 0x7a, 0x0d, 0x3a,
0xfc, 0x56, 0x06, 0x98, 0x68, 0x76, 0xcf, 0xa3, 0x02, 0x24, 0x85, 0x4e, 0xe7, 0xcc, 0xbc, 0xf6, 0x37, 0x7e, 0x2b, 0x03, 0x4c, 0x34, 0xbb, 0xe7, 0x51, 0x01, 0x92, 0x42, 0xa7, 0x73, 0x66, 0x5e,
0x0a, 0xc9, 0xbe, 0x6c, 0x85, 0x18, 0x50, 0xa0, 0xb6, 0xe7, 0x53, 0xda, 0x4e, 0x49, 0xdf, 0xcf, 0x7b, 0x85, 0x64, 0x5f, 0xb6, 0x42, 0x0c, 0x28, 0x50, 0xdb, 0xf3, 0x29, 0x6d, 0xa7, 0xa4, 0xef,
0x97, 0x72, 0x8d, 0xbc, 0xf1, 0x5f, 0x72, 0xb0, 0xb4, 0x49, 0x5b, 0x76, 0xab, 0xdf, 0xe7, 0xe3, 0xe7, 0x8b, 0xb9, 0x7a, 0xde, 0xf8, 0x2f, 0x39, 0x58, 0xde, 0xa2, 0x2d, 0xbb, 0xd9, 0xef, 0xf3,
0x68, 0xed, 0xdc, 0x85, 0x8a, 0xeb, 0x0d, 0xb8, 0xa2, 0x58, 0x6a, 0x18, 0x08, 0x90, 0x46, 0xae, 0x71, 0xb4, 0x76, 0xee, 0x42, 0xd9, 0xf5, 0x06, 0x5c, 0x51, 0x2c, 0x35, 0x0c, 0x04, 0x48, 0x23,
0x67, 0xb6, 0xe3, 0x52, 0xc3, 0x69, 0x30, 0xcb, 0x08, 0xc1, 0x66, 0xbf, 0x03, 0xf3, 0x63, 0xee, 0xd7, 0x33, 0xdb, 0x71, 0xa9, 0xe1, 0x34, 0x98, 0x25, 0x84, 0x60, 0xb3, 0xdf, 0x81, 0x85, 0x31,
0x0e, 0xf4, 0x25, 0x42, 0x42, 0x55, 0x4d, 0x82, 0xe5, 0xea, 0xb8, 0x0b, 0x95, 0x93, 0x09, 0xe1, 0x77, 0x07, 0xfa, 0x12, 0x21, 0xa1, 0xaa, 0x2a, 0xc1, 0x72, 0x75, 0xdc, 0x85, 0xf2, 0xc9, 0x84,
0x09, 0xc6, 0x92, 0x47, 0x1a, 0x00, 0x09, 0x6a, 0x11, 0x7f, 0x19, 0x4f, 0x82, 0x33, 0x4c, 0x2d, 0xf0, 0x04, 0x63, 0xc9, 0x23, 0x0d, 0x80, 0x04, 0x35, 0x89, 0xbf, 0x8c, 0x27, 0xc1, 0x19, 0xa6,
0x60, 0x6a, 0x51, 0x7c, 0x8b, 0xa4, 0x3b, 0x00, 0x83, 0x49, 0x10, 0xca, 0x15, 0x33, 0x87, 0x89, 0x16, 0x30, 0x75, 0x5e, 0x7c, 0x8b, 0xa4, 0x3b, 0x00, 0x83, 0x49, 0x10, 0xca, 0x15, 0x33, 0x87,
0x65, 0x01, 0xa1, 0x15, 0xf3, 0x0d, 0x58, 0x1c, 0xd9, 0x97, 0x16, 0xd2, 0x8e, 0xe5, 0xb8, 0xd6, 0x89, 0x25, 0x01, 0xa1, 0x15, 0xf3, 0x0d, 0x58, 0x1a, 0xd9, 0x97, 0x16, 0xd2, 0x8e, 0xe5, 0xb8,
0xc9, 0x10, 0xf7, 0x9c, 0x22, 0xe2, 0x35, 0x46, 0xf6, 0xe5, 0x67, 0x22, 0xa5, 0xe3, 0x6e, 0x23, 0xd6, 0xc9, 0x10, 0xf7, 0x9c, 0x79, 0xc4, 0xab, 0x8f, 0xec, 0xcb, 0x4f, 0x45, 0x4a, 0xdb, 0xdd,
0x5c, 0xb0, 0x15, 0x25, 0xee, 0xf8, 0x3c, 0xe0, 0xfe, 0x39, 0x47, 0x4e, 0x90, 0x8f, 0x64, 0x1a, 0x41, 0xb8, 0x60, 0x2b, 0x4a, 0xdc, 0xf1, 0x79, 0xc0, 0xfd, 0x73, 0x8e, 0x9c, 0x20, 0x1f, 0xc9,
0x93, 0xa0, 0xa2, 0x45, 0x23, 0xd1, 0xef, 0x70, 0xd8, 0xa7, 0x65, 0x6f, 0x16, 0x47, 0x8e, 0xbb, 0x34, 0x26, 0x41, 0x45, 0x8b, 0x46, 0xa2, 0xdf, 0xe1, 0xb0, 0x4f, 0xcb, 0xde, 0x9c, 0x1f, 0x39,
0x13, 0x0e, 0xfb, 0x62, 0x5f, 0x11, 0x7c, 0x64, 0xcc, 0x7d, 0xeb, 0xc5, 0x05, 0xae, 0xe1, 0x3c, 0xee, 0x6e, 0x38, 0xec, 0x8b, 0x7d, 0x45, 0xf0, 0x91, 0x31, 0xf7, 0xad, 0x17, 0x17, 0xb8, 0x86,
0xf2, 0x8d, 0x43, 0xee, 0x3f, 0xbb, 0x10, 0x5b, 0x7f, 0x3f, 0x40, 0x46, 0x64, 0x5f, 0x35, 0x2b, 0xf3, 0xc8, 0x37, 0x0e, 0xb9, 0xff, 0xfc, 0x42, 0x6c, 0xfd, 0xfd, 0x00, 0x19, 0x91, 0x7d, 0xd5,
0xb8, 0xc0, 0x4b, 0xfd, 0x40, 0xb0, 0x20, 0xfb, 0x4a, 0x2c, 0x42, 0xd1, 0x5a, 0x1b, 0x67, 0x81, 0x28, 0xe3, 0x02, 0x2f, 0xf6, 0x03, 0xc1, 0x82, 0xec, 0x2b, 0xb1, 0x08, 0x45, 0x6b, 0x6d, 0x9c,
0x0f, 0xb0, 0xf8, 0x00, 0x39, 0x6a, 0x0d, 0x1b, 0xdb, 0x92, 0x09, 0xa2, 0x9e, 0x40, 0x50, 0xbd, 0x05, 0x3e, 0xc0, 0xe2, 0x03, 0xe4, 0xa8, 0x55, 0x6c, 0x6c, 0x53, 0x26, 0x88, 0x7a, 0x02, 0x41,
0x6a, 0xec, 0xc9, 0xd0, 0x3e, 0x0d, 0x90, 0xa5, 0xd4, 0xcc, 0xaa, 0x04, 0x6e, 0x0b, 0x98, 0xf1, 0xf5, 0xaa, 0xb1, 0x27, 0x43, 0xfb, 0x34, 0x40, 0x96, 0x52, 0x35, 0x2b, 0x12, 0xb8, 0x23, 0x60,
0x39, 0x09, 0x59, 0xda, 0xdc, 0xca, 0x35, 0x23, 0xb6, 0x7a, 0x84, 0xe0, 0xbc, 0x96, 0x4c, 0xf9, 0xc6, 0x67, 0x24, 0x64, 0x69, 0x73, 0x2b, 0xd7, 0x8c, 0xd8, 0xea, 0x11, 0x82, 0xf3, 0x5a, 0x34,
0x95, 0x36, 0x69, 0xd9, 0x94, 0x49, 0x33, 0x7e, 0x37, 0x03, 0x55, 0x59, 0x32, 0x0a, 0x25, 0x6c, 0xe5, 0x57, 0xda, 0xa4, 0x65, 0x53, 0x26, 0xcd, 0xf8, 0xdd, 0x0c, 0x54, 0x64, 0xc9, 0x28, 0x94,
0x1d, 0x98, 0x9a, 0xc5, 0xf0, 0xd2, 0x19, 0x58, 0xc7, 0x57, 0x21, 0x0f, 0x88, 0x68, 0x76, 0x6e, 0xb0, 0x0d, 0x60, 0x6a, 0x16, 0xc3, 0x4b, 0x67, 0x60, 0x1d, 0x5f, 0x85, 0x3c, 0x20, 0xa2, 0xd9,
0x98, 0x0d, 0x99, 0xd6, 0xbb, 0x74, 0x06, 0x1b, 0x22, 0x85, 0x3d, 0x80, 0x46, 0x02, 0x3f, 0x08, 0xbd, 0x61, 0xd6, 0x65, 0x5a, 0xef, 0xd2, 0x19, 0x6c, 0x8a, 0x14, 0xf6, 0x10, 0xea, 0x09, 0xfc,
0x7d, 0xa2, 0xe8, 0x9d, 0x1b, 0x66, 0x5d, 0xc3, 0xee, 0x86, 0xbe, 0x58, 0x23, 0x42, 0xe4, 0x99, 0x20, 0xf4, 0x89, 0xa2, 0x77, 0x6f, 0x98, 0x35, 0x0d, 0xbb, 0x1b, 0xfa, 0x62, 0x8d, 0x08, 0x91,
0x84, 0x96, 0xe3, 0x0e, 0xf8, 0x25, 0x92, 0x51, 0xcd, 0xac, 0x10, 0xac, 0x23, 0x40, 0x1b, 0x75, 0x67, 0x12, 0x5a, 0x8e, 0x3b, 0xe0, 0x97, 0x48, 0x46, 0x55, 0xb3, 0x4c, 0xb0, 0xb6, 0x00, 0x6d,
0xa8, 0xea, 0xc5, 0x19, 0xa7, 0x50, 0x52, 0xf2, 0x12, 0x0a, 0x0c, 0x53, 0x4d, 0x32, 0xcb, 0x61, 0xd6, 0xa0, 0xa2, 0x17, 0x67, 0x9c, 0x42, 0x51, 0xc9, 0x4b, 0x28, 0x30, 0x4c, 0x35, 0xc9, 0x2c,
0xd4, 0x92, 0x9b, 0x50, 0x4a, 0xb6, 0xc0, 0x2c, 0x86, 0xaf, 0x5d, 0xb1, 0xf1, 0x5d, 0x68, 0xec, 0x85, 0x51, 0x4b, 0x6e, 0x42, 0x31, 0xd9, 0x02, 0x73, 0x3e, 0x7c, 0xed, 0x8a, 0x8d, 0xef, 0x42,
0x0a, 0xe2, 0x71, 0x05, 0xb1, 0x4a, 0xf9, 0x6f, 0x05, 0xe6, 0xb4, 0x45, 0x53, 0x36, 0xe5, 0x97, 0x7d, 0x4f, 0x10, 0x8f, 0x2b, 0x88, 0x55, 0xca, 0x7f, 0xab, 0x30, 0xa7, 0x2d, 0x9a, 0x92, 0x29,
0xd8, 0x73, 0xcf, 0xbc, 0x20, 0x94, 0xb5, 0xe0, 0x6f, 0xe3, 0x8f, 0x33, 0xc0, 0xda, 0x41, 0xe8, 0xbf, 0xc4, 0x9e, 0x7b, 0xe6, 0x05, 0xa1, 0xac, 0x05, 0x7f, 0x1b, 0x7f, 0x9c, 0x01, 0xd6, 0x0a,
0x8c, 0xec, 0x90, 0x6f, 0xf3, 0x88, 0x2d, 0x1c, 0x40, 0x55, 0x94, 0xd6, 0xf3, 0x5a, 0x24, 0x90, 0x42, 0x67, 0x64, 0x87, 0x7c, 0x87, 0x47, 0x6c, 0xe1, 0x00, 0x2a, 0xa2, 0xb4, 0x9e, 0xd7, 0x24,
0x91, 0x40, 0xf1, 0xbe, 0x5c, 0xc6, 0xb3, 0x19, 0xd6, 0x75, 0x6c, 0x62, 0xf3, 0x89, 0x02, 0xc4, 0x81, 0x8c, 0x04, 0x8a, 0x77, 0xe5, 0x32, 0x9e, 0xcd, 0xb0, 0xa1, 0x63, 0x13, 0x9b, 0x4f, 0x14,
0x2a, 0x0b, 0x6d, 0xff, 0x94, 0x87, 0x28, 0xc6, 0x49, 0x79, 0x1f, 0x08, 0x24, 0x04, 0xb8, 0xb5, 0x20, 0x56, 0x59, 0x68, 0xfb, 0xa7, 0x3c, 0x44, 0x31, 0x4e, 0xca, 0xfb, 0x40, 0x20, 0x21, 0xc0,
0x5f, 0x84, 0x85, 0x99, 0x32, 0x74, 0xbe, 0x5c, 0x4e, 0xe1, 0xcb, 0x39, 0x9d, 0x2f, 0x5b, 0xb0, 0xad, 0xff, 0x22, 0x2c, 0xce, 0x94, 0xa1, 0xf3, 0xe5, 0x52, 0x0a, 0x5f, 0xce, 0xe9, 0x7c, 0xd9,
0x98, 0x68, 0x97, 0xa4, 0xb4, 0x55, 0x28, 0x8a, 0x05, 0x21, 0x84, 0x83, 0x0c, 0x49, 0x95, 0x27, 0x82, 0xa5, 0x44, 0xbb, 0x24, 0xa5, 0xad, 0xc1, 0xbc, 0x58, 0x10, 0x42, 0x38, 0xc8, 0x90, 0x54,
0x9c, 0x0b, 0x31, 0xf8, 0x21, 0x2c, 0x9d, 0x70, 0xee, 0xdb, 0x21, 0x26, 0xe2, 0x8a, 0x11, 0x33, 0x79, 0xc2, 0xb9, 0x10, 0x83, 0x1f, 0xc1, 0xf2, 0x09, 0xe7, 0xbe, 0x1d, 0x62, 0x22, 0xae, 0x18,
0x24, 0x0b, 0x5e, 0x90, 0x69, 0x5d, 0x3b, 0x3c, 0xe4, 0xbe, 0x98, 0x29, 0xe3, 0xbf, 0x65, 0x60, 0x31, 0x43, 0xb2, 0xe0, 0x45, 0x99, 0xd6, 0xb5, 0xc3, 0x43, 0xee, 0x8b, 0x99, 0x32, 0xfe, 0x5b,
0x5e, 0x70, 0xd0, 0x3d, 0xdb, 0xbd, 0x52, 0xe3, 0xb4, 0x9b, 0x3a, 0x4e, 0xf7, 0xb5, 0xcd, 0x50, 0x06, 0x16, 0x04, 0x07, 0xdd, 0xb7, 0xdd, 0x2b, 0x35, 0x4e, 0x7b, 0xa9, 0xe3, 0xf4, 0x40, 0xdb,
0xc3, 0xfe, 0xaa, 0x83, 0x94, 0x9b, 0x1e, 0x24, 0x76, 0x0f, 0xaa, 0x89, 0xb6, 0x16, 0xb0, 0xad, 0x0c, 0x35, 0xec, 0xaf, 0x3a, 0x48, 0xb9, 0xe9, 0x41, 0x62, 0xf7, 0xa0, 0x92, 0x68, 0x6b, 0x01,
0x10, 0x44, 0x8d, 0xfc, 0xe9, 0x87, 0xf1, 0x1d, 0x68, 0xc4, 0xcd, 0x96, 0x63, 0xc8, 0x20, 0x2f, 0xdb, 0x0a, 0x41, 0xd4, 0xc8, 0x9f, 0x7e, 0x18, 0xdf, 0x81, 0x7a, 0xdc, 0x6c, 0x39, 0x86, 0x0c,
0x48, 0x52, 0x16, 0x80, 0xbf, 0x8d, 0xdf, 0xc9, 0x10, 0xe2, 0xa6, 0xe7, 0x44, 0xd2, 0xa9, 0x40, 0xf2, 0x82, 0x24, 0x65, 0x01, 0xf8, 0xdb, 0xf8, 0x9d, 0x0c, 0x21, 0x6e, 0x79, 0x4e, 0x24, 0x9d,
0x14, 0x72, 0xaf, 0x42, 0x14, 0xbf, 0xaf, 0x95, 0xea, 0x7f, 0xfa, 0xce, 0x8a, 0xa5, 0x13, 0x70, 0x0a, 0x44, 0x21, 0xf7, 0x2a, 0x44, 0xf1, 0xfb, 0x5a, 0xa9, 0xfe, 0xa7, 0xef, 0xac, 0x58, 0x3a,
0x77, 0x60, 0xd9, 0xc3, 0x21, 0x32, 0xdf, 0x92, 0x59, 0x14, 0xdf, 0xad, 0xe1, 0xd0, 0x78, 0x17, 0x01, 0x77, 0x07, 0x96, 0x3d, 0x1c, 0x22, 0xf3, 0x2d, 0x9a, 0xf3, 0xe2, 0xbb, 0x39, 0x1c, 0x1a,
0x16, 0xb4, 0xd6, 0xbd, 0xa4, 0x1f, 0xfb, 0xc0, 0x76, 0x9d, 0x20, 0x3c, 0x72, 0x83, 0xb1, 0x26, 0xf7, 0x61, 0x51, 0x6b, 0xdd, 0x4b, 0xfa, 0xd1, 0x01, 0xb6, 0xe7, 0x04, 0xe1, 0x91, 0x1b, 0x8c,
0xb8, 0xdd, 0x82, 0xb2, 0xe0, 0xb0, 0xa2, 0x65, 0xb4, 0x64, 0x0b, 0xa6, 0x60, 0xb9, 0xa2, 0x5d, 0x35, 0xc1, 0xed, 0x16, 0x94, 0x04, 0x87, 0x15, 0x2d, 0xa3, 0x25, 0x5b, 0x30, 0x05, 0xcb, 0x15,
0x01, 0x26, 0xda, 0x97, 0x32, 0x31, 0x2b, 0x13, 0xed, 0x4b, 0x4c, 0x34, 0xbe, 0x0d, 0x8b, 0x89, 0xed, 0x0a, 0x30, 0xd1, 0xbe, 0x94, 0x89, 0x59, 0x99, 0x68, 0x5f, 0x62, 0xa2, 0xf1, 0x6d, 0x58,
0xf2, 0x64, 0xd5, 0x6f, 0x42, 0x61, 0x12, 0x5e, 0x7a, 0x4a, 0x34, 0xaf, 0x48, 0x0a, 0x11, 0x0a, 0x4a, 0x94, 0x27, 0xab, 0x7e, 0x13, 0x0a, 0x93, 0xf0, 0xd2, 0x53, 0xa2, 0x79, 0x59, 0x52, 0x88,
0xa0, 0x49, 0x29, 0xc6, 0x27, 0xb0, 0xb0, 0xcf, 0x2f, 0xe4, 0x22, 0x56, 0x0d, 0x79, 0x07, 0xf2, 0x50, 0x00, 0x4d, 0x4a, 0x31, 0x3e, 0x86, 0xc5, 0x0e, 0xbf, 0x90, 0x8b, 0x58, 0x35, 0xe4, 0x1d,
0xaf, 0x50, 0x0a, 0x31, 0xdd, 0x58, 0x07, 0xa6, 0x67, 0x96, 0xb5, 0x6a, 0x3a, 0x62, 0x26, 0xa1, 0xc8, 0xbf, 0x42, 0x29, 0xc4, 0x74, 0x63, 0x03, 0x98, 0x9e, 0x59, 0xd6, 0xaa, 0xe9, 0x88, 0x99,
0x23, 0x1a, 0xef, 0x00, 0xeb, 0x3a, 0xa7, 0xee, 0x1e, 0x0f, 0x02, 0xfb, 0x34, 0x5a, 0xf6, 0x0d, 0x84, 0x8e, 0x68, 0xbc, 0x03, 0xac, 0xeb, 0x9c, 0xba, 0xfb, 0x3c, 0x08, 0xec, 0xd3, 0x68, 0xd9,
0xc8, 0x8d, 0x82, 0x53, 0xc9, 0xa3, 0xc4, 0x4f, 0xe3, 0x9b, 0xb0, 0x98, 0xc0, 0x93, 0x05, 0xdf, 0xd7, 0x21, 0x37, 0x0a, 0x4e, 0x25, 0x8f, 0x12, 0x3f, 0x8d, 0x6f, 0xc2, 0x52, 0x02, 0x4f, 0x16,
0x86, 0x72, 0xe0, 0x9c, 0xba, 0x28, 0x58, 0xc9, 0xa2, 0x63, 0x80, 0xb1, 0x0d, 0x4b, 0x9f, 0x71, 0x7c, 0x1b, 0x4a, 0x81, 0x73, 0xea, 0xa2, 0x60, 0x25, 0x8b, 0x8e, 0x01, 0xc6, 0x0e, 0x2c, 0x7f,
0xdf, 0x39, 0xb9, 0x7a, 0x55, 0xf1, 0xc9, 0x72, 0xb2, 0xd3, 0xe5, 0xb4, 0x61, 0x79, 0xaa, 0x1c, 0xca, 0x7d, 0xe7, 0xe4, 0xea, 0x55, 0xc5, 0x27, 0xcb, 0xc9, 0x4e, 0x97, 0xd3, 0x82, 0x95, 0xa9,
0x59, 0x3d, 0x91, 0xaf, 0x9c, 0xc9, 0x92, 0x49, 0x1f, 0x1a, 0xdf, 0xcb, 0xea, 0x7c, 0xcf, 0x38, 0x72, 0x64, 0xf5, 0x44, 0xbe, 0x72, 0x26, 0x8b, 0x26, 0x7d, 0x68, 0x7c, 0x2f, 0xab, 0xf3, 0x3d,
0x02, 0xb6, 0xe9, 0xb9, 0x2e, 0xef, 0x87, 0x87, 0x9c, 0xfb, 0xb1, 0x95, 0x2a, 0xa6, 0xd5, 0xca, 0xe3, 0x08, 0xd8, 0x96, 0xe7, 0xba, 0xbc, 0x1f, 0x1e, 0x72, 0xee, 0xc7, 0x56, 0xaa, 0x98, 0x56,
0xe3, 0x55, 0x39, 0xb2, 0xd3, 0xcc, 0x54, 0x12, 0x31, 0x83, 0xfc, 0x98, 0xfb, 0x23, 0x2c, 0xb8, 0xcb, 0x4f, 0xd6, 0xe4, 0xc8, 0x4e, 0x33, 0x53, 0x49, 0xc4, 0x0c, 0xf2, 0x63, 0xee, 0x8f, 0xb0,
0x64, 0xe2, 0x6f, 0x63, 0x19, 0x16, 0x13, 0xc5, 0x4a, 0xbd, 0xfe, 0x11, 0x2c, 0x6f, 0x39, 0x41, 0xe0, 0xa2, 0x89, 0xbf, 0x8d, 0x15, 0x58, 0x4a, 0x14, 0x2b, 0xf5, 0xfa, 0xc7, 0xb0, 0xb2, 0xed,
0x7f, 0xb6, 0xc2, 0x55, 0x28, 0x8e, 0x27, 0xc7, 0x56, 0x92, 0x2f, 0x3f, 0xe3, 0x57, 0x42, 0xdb, 0x04, 0xfd, 0xd9, 0x0a, 0xd7, 0x60, 0x7e, 0x3c, 0x39, 0xb6, 0x92, 0x7c, 0xf9, 0x39, 0xbf, 0x12,
0x9b, 0xce, 0x21, 0xcb, 0xfa, 0xab, 0x19, 0xc8, 0xef, 0xf4, 0x76, 0x37, 0xd9, 0x1a, 0x94, 0x1c, 0xda, 0xde, 0x74, 0x0e, 0x59, 0xd6, 0x5f, 0xcd, 0x40, 0x7e, 0xb7, 0xb7, 0xb7, 0xc5, 0xd6, 0xa1,
0xb7, 0xef, 0x8d, 0x84, 0xe0, 0x45, 0x7d, 0x8e, 0xbe, 0xaf, 0x5d, 0x60, 0xb7, 0xa0, 0x8c, 0xf2, 0xe8, 0xb8, 0x7d, 0x6f, 0x24, 0x04, 0x2f, 0xea, 0x73, 0xf4, 0x7d, 0xed, 0x02, 0xbb, 0x05, 0x25,
0x9a, 0x50, 0x6d, 0xa5, 0xe8, 0x53, 0x12, 0x80, 0x5d, 0xaf, 0xff, 0x42, 0xe8, 0xd4, 0xfc, 0x72, 0x94, 0xd7, 0x84, 0x6a, 0x2b, 0x45, 0x9f, 0xa2, 0x00, 0xec, 0x79, 0xfd, 0x17, 0x42, 0xa7, 0xe6,
0xec, 0xf8, 0xa8, 0x35, 0x2b, 0x65, 0x38, 0x4f, 0x7b, 0x7d, 0x9c, 0x40, 0x1a, 0xb1, 0xf1, 0xaf, 0x97, 0x63, 0xc7, 0x47, 0xad, 0x59, 0x29, 0xc3, 0x79, 0xda, 0xeb, 0xe3, 0x04, 0xd2, 0x88, 0x8d,
0x4b, 0x50, 0x94, 0xbb, 0x2d, 0xed, 0xdc, 0xa1, 0x73, 0xce, 0xe3, 0x9d, 0x5b, 0x7c, 0x09, 0x79, 0x7f, 0x5d, 0x84, 0x79, 0xb9, 0xdb, 0xd2, 0xce, 0x1d, 0x3a, 0xe7, 0x3c, 0xde, 0xb9, 0xc5, 0x97,
0xc0, 0xe7, 0x23, 0x2f, 0x8c, 0x04, 0x36, 0x9a, 0x83, 0x2a, 0x01, 0xa5, 0xc8, 0xa6, 0x09, 0x0d, 0x90, 0x07, 0x7c, 0x3e, 0xf2, 0xc2, 0x48, 0x60, 0xa3, 0x39, 0xa8, 0x10, 0x50, 0x8a, 0x6c, 0x9a,
0x64, 0x62, 0xc8, 0x11, 0x52, 0x5f, 0xdf, 0xca, 0x6f, 0x41, 0x51, 0xed, 0xfd, 0xf9, 0x48, 0xa7, 0xd0, 0x40, 0x26, 0x86, 0x1c, 0x21, 0xf5, 0xf5, 0xad, 0xfc, 0x16, 0xcc, 0xab, 0xbd, 0x3f, 0x1f,
0x99, 0xeb, 0x93, 0xb4, 0xb6, 0x06, 0xa5, 0xbe, 0x3d, 0xb6, 0xfb, 0x4e, 0x78, 0x25, 0x19, 0x42, 0xe9, 0x34, 0x73, 0x7d, 0x92, 0xd6, 0xd6, 0xa1, 0xd8, 0xb7, 0xc7, 0x76, 0xdf, 0x09, 0xaf, 0x24,
0xf4, 0x2d, 0x4a, 0x1f, 0x7a, 0x7d, 0x7b, 0x68, 0x1d, 0xdb, 0x43, 0xdb, 0xed, 0x73, 0xa9, 0xbb, 0x43, 0x88, 0xbe, 0x45, 0xe9, 0x43, 0xaf, 0x6f, 0x0f, 0xad, 0x63, 0x7b, 0x68, 0xbb, 0x7d, 0x2e,
0x57, 0x11, 0xb8, 0x41, 0x30, 0xa1, 0x9f, 0xcb, 0x76, 0x2a, 0x2c, 0x52, 0xe1, 0x65, 0xeb, 0x15, 0x75, 0xf7, 0x0a, 0x02, 0x37, 0x09, 0x26, 0xf4, 0x73, 0xd9, 0x4e, 0x85, 0x45, 0x2a, 0xbc, 0x6c,
0x9a, 0x10, 0x2e, 0xbd, 0xd1, 0xc8, 0x11, 0x5a, 0x06, 0x89, 0x61, 0x39, 0xb3, 0x4c, 0x90, 0x6d, 0xbd, 0x42, 0x13, 0xc2, 0xa5, 0x37, 0x1a, 0x39, 0x42, 0xcb, 0x20, 0x31, 0x2c, 0x67, 0x96, 0x08,
0x8e, 0xbd, 0x95, 0xc9, 0x17, 0x34, 0x74, 0x65, 0xaa, 0x8a, 0x80, 0x9f, 0x93, 0x21, 0x61, 0x56, 0xb2, 0xc3, 0xb1, 0xb7, 0x32, 0xf9, 0x82, 0x86, 0xae, 0x44, 0x55, 0x11, 0xf0, 0x33, 0x32, 0x24,
0x16, 0xcb, 0x69, 0xb2, 0xd8, 0xfb, 0xb0, 0x30, 0x71, 0x03, 0x1e, 0x86, 0x43, 0x3e, 0x88, 0xda, 0xcc, 0xca, 0x62, 0x39, 0x4d, 0x16, 0x7b, 0x17, 0x16, 0x27, 0x6e, 0xc0, 0xc3, 0x70, 0xc8, 0x07,
0x52, 0x41, 0xa4, 0x46, 0x94, 0xa0, 0x9a, 0xb3, 0x0e, 0x8b, 0x64, 0x74, 0x08, 0xec, 0xd0, 0x0b, 0x51, 0x5b, 0xca, 0x88, 0x54, 0x8f, 0x12, 0x54, 0x73, 0x36, 0x60, 0x89, 0x8c, 0x0e, 0x81, 0x1d,
0xce, 0x9c, 0xc0, 0x0a, 0x84, 0x86, 0x44, 0xea, 0xee, 0x02, 0x26, 0x75, 0x65, 0x4a, 0x97, 0x54, 0x7a, 0xc1, 0x99, 0x13, 0x58, 0x81, 0xd0, 0x90, 0x48, 0xdd, 0x5d, 0xc4, 0xa4, 0xae, 0x4c, 0xe9,
0xa4, 0xd5, 0x29, 0x7c, 0x9f, 0xf7, 0xb9, 0x73, 0xce, 0x07, 0x28, 0xa7, 0xe5, 0xcc, 0xe5, 0x44, 0x92, 0x8a, 0xb4, 0x36, 0x85, 0xef, 0xf3, 0x3e, 0x77, 0xce, 0xf9, 0x00, 0xe5, 0xb4, 0x9c, 0xb9,
0x1e, 0x53, 0x26, 0xa2, 0xd0, 0x3d, 0x19, 0x59, 0x93, 0xf1, 0xc0, 0x16, 0xc2, 0x4a, 0x9d, 0x84, 0x92, 0xc8, 0x63, 0xca, 0x44, 0x14, 0xba, 0x27, 0x23, 0x6b, 0x32, 0x1e, 0xd8, 0x42, 0x58, 0xa9,
0x61, 0x77, 0x32, 0x3a, 0x22, 0x08, 0x7b, 0x04, 0x4a, 0x12, 0x93, 0xf2, 0xe1, 0x7c, 0x82, 0x9f, 0x91, 0x30, 0xec, 0x4e, 0x46, 0x47, 0x04, 0x61, 0x8f, 0x41, 0x49, 0x62, 0x52, 0x3e, 0x5c, 0x48,
0x09, 0x62, 0x35, 0xab, 0x12, 0x83, 0x04, 0xc5, 0x84, 0xcc, 0xd9, 0x98, 0x92, 0x39, 0x9b, 0x50, 0xf0, 0x33, 0x41, 0xac, 0x66, 0x45, 0x62, 0x90, 0xa0, 0x98, 0x90, 0x39, 0xeb, 0x53, 0x32, 0x67,
0x1c, 0xfb, 0xce, 0xb9, 0x1d, 0xf2, 0xe6, 0x02, 0x31, 0x70, 0xf9, 0x29, 0x38, 0x83, 0xe3, 0x3a, 0x03, 0xe6, 0xc7, 0xbe, 0x73, 0x6e, 0x87, 0xbc, 0xb1, 0x48, 0x0c, 0x5c, 0x7e, 0x0a, 0xce, 0xe0,
0xa1, 0x63, 0x87, 0x9e, 0xdf, 0x64, 0x98, 0x16, 0x03, 0xd8, 0x03, 0x58, 0x40, 0x1a, 0x09, 0x42, 0xb8, 0x4e, 0xe8, 0xd8, 0xa1, 0xe7, 0x37, 0x18, 0xa6, 0xc5, 0x00, 0xf6, 0x10, 0x16, 0x91, 0x46,
0x3b, 0x9c, 0x04, 0x52, 0x02, 0x5d, 0x44, 0x62, 0x42, 0x19, 0xba, 0x8b, 0x70, 0x14, 0x42, 0xd9, 0x82, 0xd0, 0x0e, 0x27, 0x81, 0x94, 0x40, 0x97, 0x90, 0x98, 0x50, 0x86, 0xee, 0x22, 0x1c, 0x85,
0x37, 0x61, 0x85, 0xc8, 0x02, 0x73, 0x48, 0xc9, 0x1a, 0x05, 0x82, 0x25, 0x1c, 0x8a, 0x45, 0x4c, 0x50, 0xf6, 0x4d, 0x58, 0x25, 0xb2, 0xc0, 0x1c, 0x52, 0xb2, 0x46, 0x81, 0x60, 0x19, 0x87, 0x62,
0x15, 0xf4, 0x2d, 0xe5, 0x6b, 0x21, 0x1d, 0x3c, 0x81, 0x55, 0x49, 0x26, 0x33, 0xb9, 0x96, 0x31, 0x09, 0x53, 0x05, 0x7d, 0x4b, 0xf9, 0x5a, 0x48, 0x07, 0x4f, 0x61, 0x4d, 0x92, 0xc9, 0x4c, 0xae,
0xd7, 0x12, 0x25, 0x4f, 0x65, 0x5b, 0x87, 0x05, 0xd1, 0x24, 0xa7, 0x6f, 0xc9, 0xdc, 0x62, 0x25, 0x15, 0xcc, 0xb5, 0x4c, 0xc9, 0x53, 0xd9, 0x36, 0x60, 0x51, 0x34, 0xc9, 0xe9, 0x5b, 0x32, 0xb7,
0xac, 0x88, 0xd6, 0xa3, 0xa6, 0x34, 0x4f, 0x89, 0x26, 0xa6, 0x3d, 0xe3, 0x57, 0xec, 0xbb, 0x30, 0x58, 0x09, 0xab, 0xa2, 0xf5, 0xa8, 0x29, 0x2d, 0x50, 0xa2, 0x89, 0x69, 0xcf, 0xf9, 0x15, 0xfb,
0x4f, 0x24, 0x83, 0xea, 0x15, 0x72, 0xfa, 0x35, 0xe4, 0xf4, 0xcb, 0xca, 0xc2, 0x19, 0xa5, 0x22, 0x2e, 0x2c, 0x10, 0xc9, 0xa0, 0x7a, 0x85, 0x9c, 0x7e, 0x1d, 0x39, 0xfd, 0x8a, 0xb2, 0x70, 0x46,
0xb3, 0xaf, 0xf7, 0x13, 0xdf, 0x62, 0x39, 0x0c, 0x9d, 0x13, 0x1e, 0x3a, 0x23, 0xde, 0x5c, 0x25, 0xa9, 0xc8, 0xec, 0x6b, 0xfd, 0xc4, 0xb7, 0x58, 0x0e, 0x43, 0xe7, 0x84, 0x87, 0xce, 0x88, 0x37,
0x02, 0x53, 0xdf, 0x62, 0xa5, 0x4e, 0xc6, 0x98, 0xd2, 0x24, 0xbe, 0x40, 0x5f, 0x48, 0xbb, 0x43, 0xd6, 0x88, 0xc0, 0xd4, 0xb7, 0x58, 0xa9, 0x93, 0x31, 0xa6, 0x34, 0x88, 0x2f, 0xd0, 0x17, 0xd2,
0x2f, 0xe0, 0xca, 0x44, 0xd5, 0xbc, 0x29, 0x17, 0xa1, 0x00, 0x2a, 0x19, 0x52, 0x08, 0xe2, 0xa4, 0xee, 0xd0, 0x0b, 0xb8, 0x32, 0x51, 0x35, 0x6e, 0xca, 0x45, 0x28, 0x80, 0x4a, 0x86, 0x14, 0x82,
0xf4, 0x44, 0x86, 0xc4, 0x5b, 0x48, 0x0c, 0x35, 0xd2, 0x7d, 0x94, 0x31, 0x51, 0xec, 0xe2, 0x67, 0x38, 0x29, 0x3d, 0x91, 0x21, 0xf1, 0x16, 0x12, 0x43, 0x95, 0x74, 0x1f, 0x65, 0x4c, 0x14, 0xbb,
0xf6, 0x85, 0xe2, 0x20, 0xb7, 0x71, 0x7e, 0x41, 0x80, 0x24, 0xef, 0xf8, 0xc3, 0x0c, 0x6d, 0x88, 0xf8, 0x99, 0x7d, 0xa1, 0x38, 0xc8, 0x6d, 0x9c, 0x5f, 0x10, 0x20, 0xc9, 0x3b, 0xfe, 0x30, 0x43,
0x92, 0x7f, 0x04, 0x9a, 0x7a, 0x47, 0x9c, 0xc3, 0xf2, 0xdc, 0xe1, 0x95, 0x64, 0x26, 0x40, 0xa0, 0x1b, 0xa2, 0xe4, 0x1f, 0x81, 0xa6, 0xde, 0x11, 0xe7, 0xb0, 0x3c, 0x77, 0x78, 0x25, 0x99, 0x09,
0x03, 0x77, 0x88, 0xab, 0xd9, 0x71, 0x75, 0x14, 0xe2, 0xbd, 0x55, 0x05, 0x44, 0xa4, 0xbb, 0x50, 0x10, 0xe8, 0xc0, 0x1d, 0xe2, 0x6a, 0x76, 0x5c, 0x1d, 0x85, 0x78, 0x6f, 0x45, 0x01, 0x11, 0xe9,
0x19, 0x4f, 0x8e, 0x87, 0x4e, 0x9f, 0x50, 0x72, 0x54, 0x0a, 0x81, 0x10, 0x41, 0xe8, 0xb7, 0x44, 0x2e, 0x94, 0xc7, 0x93, 0xe3, 0xa1, 0xd3, 0x27, 0x94, 0x1c, 0x95, 0x42, 0x20, 0x44, 0x10, 0xfa,
0x51, 0x84, 0x91, 0x47, 0x8c, 0x8a, 0x84, 0x21, 0x0a, 0xf2, 0x76, 0xee, 0x23, 0x3b, 0xa9, 0x9a, 0x2d, 0x51, 0x14, 0x61, 0xe4, 0x11, 0xa3, 0x2c, 0x61, 0x88, 0x82, 0xbc, 0x9d, 0xfb, 0xc8, 0x4e,
0xf8, 0xdb, 0xd8, 0x80, 0xa5, 0x64, 0xa3, 0xe5, 0xc6, 0xf3, 0x00, 0x4a, 0x92, 0x57, 0x29, 0xc3, 0x2a, 0x26, 0xfe, 0x36, 0x36, 0x61, 0x39, 0xd9, 0x68, 0xb9, 0xf1, 0x3c, 0x84, 0xa2, 0xe4, 0x55,
0x47, 0x5d, 0x33, 0x45, 0x0b, 0x15, 0x2d, 0x4a, 0x37, 0x7e, 0xaf, 0x00, 0x8b, 0x12, 0xba, 0x29, 0xca, 0xf0, 0x51, 0xd3, 0x4c, 0xd1, 0x42, 0x45, 0x8b, 0xd2, 0x8d, 0xdf, 0x2b, 0xc0, 0x92, 0x84,
0x86, 0xb6, 0x3b, 0x19, 0x8d, 0x6c, 0x3f, 0x85, 0x09, 0x66, 0x5e, 0xce, 0x04, 0xb3, 0x33, 0x4c, 0x6e, 0x89, 0xa1, 0xed, 0x4e, 0x46, 0x23, 0xdb, 0x4f, 0x61, 0x82, 0x99, 0x97, 0x33, 0xc1, 0xec,
0x30, 0xa9, 0xf9, 0x12, 0x0f, 0x4d, 0x6a, 0xbe, 0x62, 0x2e, 0x49, 0x19, 0xd1, 0xed, 0xa0, 0x35, 0x0c, 0x13, 0x4c, 0x6a, 0xbe, 0xc4, 0x43, 0x93, 0x9a, 0xaf, 0x98, 0x4b, 0x52, 0x46, 0x74, 0x3b,
0x09, 0xee, 0x91, 0xbd, 0x75, 0x86, 0x65, 0x17, 0x52, 0x58, 0xb6, 0xce, 0x70, 0xe7, 0xa6, 0x18, 0x68, 0x55, 0x82, 0x7b, 0x64, 0x6f, 0x9d, 0x61, 0xd9, 0x85, 0x14, 0x96, 0xad, 0x33, 0xdc, 0xb9,
0xee, 0x9b, 0x40, 0x44, 0xa3, 0x66, 0xbf, 0x48, 0xfa, 0x09, 0xc2, 0xa4, 0x31, 0xf5, 0x5d, 0x98, 0x29, 0x86, 0xfb, 0x26, 0x10, 0xd1, 0xa8, 0xd9, 0x9f, 0x27, 0xfd, 0x04, 0x61, 0xd2, 0x98, 0x7a,
0x9f, 0xe6, 0x71, 0xc4, 0x4c, 0xeb, 0x29, 0x1c, 0xce, 0x19, 0x71, 0xdc, 0xad, 0x34, 0xe4, 0xb2, 0x1f, 0x16, 0xa6, 0x79, 0x1c, 0x31, 0xd3, 0x5a, 0x0a, 0x87, 0x73, 0x46, 0x1c, 0x77, 0x2b, 0x0d,
0xe4, 0x70, 0xce, 0x88, 0xef, 0x62, 0x8a, 0xc2, 0x6f, 0x03, 0x50, 0xdd, 0xb8, 0x68, 0x00, 0x17, 0xb9, 0x24, 0x39, 0x9c, 0x33, 0xe2, 0x7b, 0x98, 0xa2, 0xf0, 0x5b, 0x00, 0x54, 0x37, 0x2e, 0x1a,
0xcd, 0x3b, 0xc9, 0xb9, 0xd0, 0x47, 0x7d, 0x5d, 0x7c, 0x4c, 0x7c, 0x8e, 0xab, 0xa8, 0x8c, 0x39, 0xc0, 0x45, 0xf3, 0x4e, 0x72, 0x2e, 0xf4, 0x51, 0xdf, 0x10, 0x1f, 0x13, 0x9f, 0xe3, 0x2a, 0x2a,
0x71, 0x01, 0x7d, 0x04, 0x75, 0x6f, 0xcc, 0x5d, 0x2b, 0xe6, 0x35, 0x15, 0x2c, 0xaa, 0x21, 0x8b, 0x61, 0x4e, 0x5c, 0x40, 0x1f, 0x42, 0xcd, 0x1b, 0x73, 0xd7, 0x8a, 0x79, 0x4d, 0x19, 0x8b, 0xaa,
0xea, 0x28, 0xb8, 0x59, 0x13, 0x78, 0xd1, 0x27, 0xfb, 0x0e, 0x0d, 0x32, 0xd7, 0x72, 0x56, 0xaf, 0xcb, 0xa2, 0xda, 0x0a, 0x6e, 0x56, 0x05, 0x5e, 0xf4, 0xc9, 0xbe, 0x43, 0x83, 0xcc, 0xb5, 0x9c,
0xc9, 0x59, 0x47, 0xc4, 0xe8, 0xdb, 0xf8, 0x1b, 0x19, 0xa8, 0x68, 0xcd, 0x61, 0xcb, 0xb0, 0xb0, 0x95, 0x6b, 0x72, 0xd6, 0x10, 0x31, 0xfa, 0x36, 0xfe, 0x46, 0x06, 0xca, 0x5a, 0x73, 0xd8, 0x0a,
0x79, 0x70, 0x70, 0xd8, 0x36, 0x5b, 0xbd, 0xce, 0x67, 0x6d, 0x6b, 0x73, 0xf7, 0xa0, 0xdb, 0x6e, 0x2c, 0x6e, 0x1d, 0x1c, 0x1c, 0xb6, 0xcc, 0x66, 0xaf, 0xfd, 0x69, 0xcb, 0xda, 0xda, 0x3b, 0xe8,
0xdc, 0x10, 0xe0, 0xdd, 0x83, 0xcd, 0xd6, 0xae, 0xb5, 0x7d, 0x60, 0x6e, 0x2a, 0x70, 0x86, 0xad, 0xb6, 0xea, 0x37, 0x04, 0x78, 0xef, 0x60, 0xab, 0xb9, 0x67, 0xed, 0x1c, 0x98, 0x5b, 0x0a, 0x9c,
0x00, 0x33, 0xdb, 0x7b, 0x07, 0xbd, 0x76, 0x02, 0x9e, 0x65, 0x0d, 0xa8, 0x6e, 0x98, 0xed, 0xd6, 0x61, 0xab, 0xc0, 0xcc, 0xd6, 0xfe, 0x41, 0xaf, 0x95, 0x80, 0x67, 0x59, 0x1d, 0x2a, 0x9b, 0x66,
0xe6, 0x8e, 0x84, 0xe4, 0xd8, 0x12, 0x34, 0xb6, 0x8f, 0xf6, 0xb7, 0x3a, 0xfb, 0x4f, 0xad, 0xcd, 0xab, 0xb9, 0xb5, 0x2b, 0x21, 0x39, 0xb6, 0x0c, 0xf5, 0x9d, 0xa3, 0xce, 0x76, 0xbb, 0xf3, 0xcc,
0xd6, 0xfe, 0x66, 0x7b, 0xb7, 0xbd, 0xd5, 0xc8, 0xb3, 0x1a, 0x94, 0x5b, 0x1b, 0xad, 0xfd, 0xad, 0xda, 0x6a, 0x76, 0xb6, 0x5a, 0x7b, 0xad, 0xed, 0x7a, 0x9e, 0x55, 0xa1, 0xd4, 0xdc, 0x6c, 0x76,
0x83, 0xfd, 0xf6, 0x56, 0xa3, 0x60, 0xfc, 0x79, 0x06, 0x96, 0x71, 0xa0, 0x06, 0xd3, 0x2b, 0xf4, 0xb6, 0x0f, 0x3a, 0xad, 0xed, 0x7a, 0xc1, 0xf8, 0xf3, 0x0c, 0xac, 0xe0, 0x40, 0x0d, 0xa6, 0x57,
0x1e, 0x54, 0xfa, 0x9e, 0x37, 0x16, 0x6a, 0x50, 0xbc, 0xdd, 0xeb, 0x20, 0xb1, 0xfa, 0x88, 0xb3, 0xe8, 0x3d, 0x28, 0xf7, 0x3d, 0x6f, 0x2c, 0xd4, 0xa0, 0x78, 0xbb, 0xd7, 0x41, 0x62, 0xf5, 0x11,
0x9e, 0x78, 0x7e, 0x9f, 0xcb, 0x05, 0x0a, 0x08, 0xda, 0x16, 0x10, 0x41, 0x20, 0x92, 0xc2, 0x08, 0x67, 0x3d, 0xf1, 0xfc, 0x3e, 0x97, 0x0b, 0x14, 0x10, 0xb4, 0x23, 0x20, 0x82, 0x40, 0x24, 0x85,
0x83, 0xd6, 0x67, 0x85, 0x60, 0x84, 0xb2, 0x02, 0x73, 0xc7, 0x3e, 0xb7, 0xfb, 0x67, 0x72, 0x69, 0x11, 0x06, 0xad, 0xcf, 0x32, 0xc1, 0x08, 0x65, 0x15, 0xe6, 0x8e, 0x7d, 0x6e, 0xf7, 0xcf, 0xe4,
0xca, 0x2f, 0xf6, 0x5e, 0xac, 0xa0, 0xf7, 0xc5, 0x84, 0x0f, 0xf9, 0x00, 0xe9, 0xb3, 0x64, 0xce, 0xd2, 0x94, 0x5f, 0xec, 0xeb, 0xb1, 0x82, 0xde, 0x17, 0x13, 0x3e, 0xe4, 0x03, 0xa4, 0xcf, 0xa2,
0x4b, 0xf8, 0xa6, 0x04, 0x8b, 0xad, 0xc2, 0x3e, 0xb6, 0xdd, 0x81, 0xe7, 0xf2, 0x81, 0xd4, 0x03, 0xb9, 0x20, 0xe1, 0x5b, 0x12, 0x2c, 0xb6, 0x0a, 0xfb, 0xd8, 0x76, 0x07, 0x9e, 0xcb, 0x07, 0x52,
0x62, 0x80, 0x71, 0x08, 0x2b, 0xd3, 0xfd, 0x93, 0x8b, 0xf9, 0x43, 0x6d, 0x31, 0x93, 0x58, 0xbe, 0x0f, 0x88, 0x01, 0xc6, 0x21, 0xac, 0x4e, 0xf7, 0x4f, 0x2e, 0xe6, 0x0f, 0xb4, 0xc5, 0x4c, 0x62,
0x76, 0x3d, 0x01, 0x69, 0x0b, 0xfb, 0x6f, 0xe5, 0x21, 0x2f, 0xc4, 0xb4, 0x6b, 0x25, 0x3a, 0x5d, 0xf9, 0xfa, 0xf5, 0x04, 0xa4, 0x2d, 0xec, 0xbf, 0x95, 0x87, 0xbc, 0x10, 0xd3, 0xae, 0x95, 0xe8,
0xee, 0xce, 0xcd, 0xf8, 0x66, 0xd0, 0x0e, 0x40, 0xfb, 0x37, 0x19, 0x9b, 0xca, 0x08, 0xc1, 0x7d, 0x74, 0xb9, 0x3b, 0x37, 0xe3, 0x9b, 0x41, 0x3b, 0x00, 0xed, 0xdf, 0x64, 0x6c, 0x2a, 0x21, 0x04,
0x3b, 0x4a, 0xf6, 0x79, 0xff, 0x5c, 0x5a, 0x9b, 0x28, 0xd9, 0xe4, 0xfd, 0x73, 0x54, 0x78, 0xec, 0xf7, 0xed, 0x28, 0xd9, 0xe7, 0xfd, 0x73, 0x69, 0x6d, 0xa2, 0x64, 0x93, 0xf7, 0xcf, 0x51, 0xe1,
0x90, 0xf2, 0xd2, 0x62, 0x2c, 0x06, 0x76, 0x88, 0x39, 0x65, 0x12, 0xe6, 0x2b, 0x46, 0x49, 0x98, 0xb1, 0x43, 0xca, 0x4b, 0x8b, 0x71, 0x3e, 0xb0, 0x43, 0xcc, 0x29, 0x93, 0x30, 0xdf, 0x7c, 0x94,
0xab, 0x09, 0x45, 0xc7, 0x3d, 0xf6, 0x26, 0xee, 0x00, 0xd7, 0x5e, 0xc9, 0x54, 0x9f, 0xe8, 0x0a, 0x84, 0xb9, 0x1a, 0x30, 0xef, 0xb8, 0xc7, 0xde, 0xc4, 0x1d, 0xe0, 0xda, 0x2b, 0x9a, 0xea, 0x13,
0x42, 0x36, 0x21, 0x76, 0x09, 0x5a, 0x6a, 0x25, 0x01, 0xe8, 0x89, 0x7d, 0xe2, 0x03, 0x28, 0x07, 0x5d, 0x41, 0xc8, 0x26, 0xc4, 0x2e, 0x41, 0x4b, 0xad, 0x28, 0x00, 0x3d, 0xb1, 0x4f, 0xbc, 0x0f,
0x57, 0x6e, 0x5f, 0x5f, 0x60, 0x4b, 0x72, 0x7c, 0x44, 0xef, 0xd7, 0xbb, 0x57, 0x6e, 0x1f, 0x97, 0xa5, 0xe0, 0xca, 0xed, 0xeb, 0x0b, 0x6c, 0x59, 0x8e, 0x8f, 0xe8, 0xfd, 0x46, 0xf7, 0xca, 0xed,
0x53, 0x29, 0x90, 0xbf, 0xd8, 0x13, 0x28, 0x45, 0x46, 0x59, 0x62, 0x8f, 0x37, 0xf5, 0x1c, 0xca, 0xe3, 0x72, 0x2a, 0x06, 0xf2, 0x17, 0x7b, 0x0a, 0xc5, 0xc8, 0x28, 0x4b, 0xec, 0xf1, 0xa6, 0x9e,
0x12, 0x4b, 0xba, 0x6f, 0x84, 0xca, 0x1e, 0xc2, 0x1c, 0x5a, 0x4e, 0x83, 0x66, 0x15, 0x33, 0x29, 0x43, 0x59, 0x62, 0x49, 0xf7, 0x8d, 0x50, 0xd9, 0x23, 0x98, 0x43, 0xcb, 0x69, 0xd0, 0xa8, 0x60,
0x61, 0x5c, 0x34, 0x03, 0xbd, 0x30, 0x7c, 0x80, 0x56, 0x54, 0x53, 0xa2, 0xad, 0x3d, 0x83, 0x5a, 0x26, 0x25, 0x8c, 0x8b, 0x66, 0xa0, 0x17, 0x86, 0x0f, 0xd0, 0x8a, 0x6a, 0x4a, 0xb4, 0xf5, 0xe7,
0xa2, 0x2c, 0x5d, 0xc3, 0xad, 0x91, 0x86, 0xfb, 0xb6, 0xae, 0xe1, 0xc6, 0x6c, 0x5a, 0x66, 0xd3, 0x50, 0x4d, 0x94, 0xa5, 0x6b, 0xb8, 0x55, 0xd2, 0x70, 0xdf, 0xd6, 0x35, 0xdc, 0x98, 0x4d, 0xcb,
0x35, 0xde, 0x5f, 0x84, 0x92, 0xea, 0x8a, 0x58, 0x44, 0x47, 0xfb, 0xcf, 0xf6, 0x0f, 0x3e, 0xdf, 0x6c, 0xba, 0xc6, 0xfb, 0x8b, 0x50, 0x54, 0x5d, 0x11, 0x8b, 0xe8, 0xa8, 0xf3, 0xbc, 0x73, 0xf0,
0xb7, 0xba, 0xcf, 0xf7, 0x37, 0x1b, 0x37, 0xd8, 0x3c, 0x54, 0x5a, 0x9b, 0xb8, 0x2e, 0x11, 0x90, 0x59, 0xc7, 0xea, 0x7e, 0xde, 0xd9, 0xaa, 0xdf, 0x60, 0x0b, 0x50, 0x6e, 0x6e, 0xe1, 0xba, 0x44,
0x11, 0x28, 0x87, 0xad, 0x6e, 0x37, 0x82, 0x64, 0x8d, 0x6d, 0x68, 0x4c, 0xb7, 0x54, 0xd0, 0x64, 0x40, 0x46, 0xa0, 0x1c, 0x36, 0xbb, 0xdd, 0x08, 0x92, 0x35, 0x76, 0xa0, 0x3e, 0xdd, 0x52, 0x41,
0xa8, 0x60, 0xd2, 0xae, 0x1c, 0x03, 0x84, 0xfe, 0x42, 0xa6, 0x62, 0x12, 0x92, 0xe9, 0xc3, 0x78, 0x93, 0xa1, 0x82, 0x49, 0xbb, 0x72, 0x0c, 0x10, 0xfa, 0x0b, 0x99, 0x8a, 0x49, 0x48, 0xa6, 0x0f,
0x02, 0x0d, 0xb1, 0xe9, 0x88, 0xa1, 0x0a, 0x34, 0xfb, 0xec, 0x50, 0x08, 0x5e, 0xba, 0x6d, 0xb9, 0xe3, 0x29, 0xd4, 0xc5, 0xa6, 0x23, 0x86, 0x2a, 0xd0, 0xec, 0xb3, 0x43, 0x21, 0x78, 0xe9, 0xb6,
0x64, 0x56, 0x08, 0x86, 0x55, 0x19, 0x1f, 0xc2, 0x82, 0x96, 0x2d, 0xd6, 0x37, 0xc5, 0x46, 0x36, 0xe5, 0xa2, 0x59, 0x26, 0x18, 0x56, 0x65, 0x7c, 0x00, 0x8b, 0x5a, 0xb6, 0x58, 0xdf, 0x14, 0x1b,
0xad, 0x6f, 0xa2, 0x76, 0x41, 0x29, 0xc6, 0x2a, 0x2c, 0x8b, 0xcf, 0xf6, 0x39, 0x77, 0xc3, 0xee, 0xd9, 0xb4, 0xbe, 0x89, 0xda, 0x05, 0xa5, 0x18, 0x6b, 0xb0, 0x22, 0x3e, 0x5b, 0xe7, 0xdc, 0x0d,
0xe4, 0x98, 0x1c, 0x82, 0x8e, 0xe7, 0x0a, 0xad, 0xa3, 0x1c, 0xa5, 0x5c, 0x4f, 0xe4, 0xeb, 0x52, 0xbb, 0x93, 0x63, 0x72, 0x08, 0x3a, 0x9e, 0x2b, 0xb4, 0x8e, 0x52, 0x94, 0x72, 0x3d, 0x91, 0x6f,
0x35, 0xcd, 0x22, 0x69, 0xac, 0x69, 0x35, 0x60, 0xc6, 0x75, 0xfc, 0x9b, 0x50, 0x51, 0xcb, 0x11, 0x48, 0xd5, 0x34, 0x8b, 0xa4, 0xb1, 0xae, 0xd5, 0x80, 0x19, 0x37, 0xf0, 0x6f, 0x42, 0x45, 0x2d,
0x48, 0x0c, 0xeb, 0x61, 0xbb, 0x6d, 0x5a, 0x07, 0xfb, 0xbb, 0x9d, 0x7d, 0xc1, 0xed, 0xc4, 0xb0, 0x45, 0x20, 0x31, 0xac, 0x87, 0xad, 0x96, 0x69, 0x1d, 0x74, 0xf6, 0xda, 0x1d, 0xc1, 0xed, 0xc4,
0x22, 0x60, 0x7b, 0x1b, 0x21, 0x19, 0xa3, 0x01, 0xf5, 0xa7, 0x3c, 0xec, 0xb8, 0x27, 0x9e, 0x72, 0xb0, 0x22, 0x60, 0x67, 0x07, 0x21, 0x19, 0xa3, 0x0e, 0xb5, 0x67, 0x3c, 0x6c, 0xbb, 0x27, 0x9e,
0x7e, 0xfd, 0x45, 0x01, 0xe6, 0x23, 0x50, 0xac, 0xe2, 0x9e, 0x73, 0x3f, 0x70, 0x3c, 0x17, 0xa5, 0x72, 0x7e, 0xfd, 0x45, 0x01, 0x16, 0x22, 0x50, 0xac, 0xe2, 0x9e, 0x73, 0x3f, 0x70, 0x3c, 0x17,
0xd5, 0xb2, 0xa9, 0x3e, 0xc5, 0xd6, 0xe3, 0x0c, 0xb8, 0x1b, 0x3a, 0xe1, 0x95, 0x95, 0xb0, 0x87, 0xa5, 0xd5, 0x92, 0xa9, 0x3e, 0xc5, 0xd6, 0xe3, 0x0c, 0xb8, 0x1b, 0x3a, 0xe1, 0x95, 0x95, 0xb0,
0xd5, 0x15, 0x58, 0x6e, 0x71, 0x4b, 0x50, 0xb0, 0x87, 0x8e, 0xad, 0xfc, 0xa8, 0xf4, 0x21, 0xa0, 0x87, 0xd5, 0x14, 0x58, 0x6e, 0x71, 0xcb, 0x50, 0xb0, 0x87, 0x8e, 0xad, 0xfc, 0xa8, 0xf4, 0x21,
0x7d, 0x6f, 0xe8, 0xf9, 0x28, 0x98, 0x96, 0x4d, 0xfa, 0x60, 0x8f, 0x60, 0x49, 0x08, 0xc8, 0xba, 0xa0, 0x7d, 0x6f, 0xe8, 0xf9, 0x28, 0x98, 0x96, 0x4c, 0xfa, 0x60, 0x8f, 0x61, 0x59, 0x08, 0xc8,
0x91, 0x12, 0xf9, 0x07, 0x99, 0xe6, 0x98, 0x3b, 0x19, 0x1d, 0xc6, 0x86, 0x4a, 0x91, 0x22, 0x36, 0xba, 0x91, 0x12, 0xf9, 0x07, 0x99, 0xe6, 0x98, 0x3b, 0x19, 0x1d, 0xc6, 0x86, 0x4a, 0x91, 0x22,
0x36, 0x91, 0x43, 0x4a, 0x32, 0x51, 0x06, 0xd2, 0xb5, 0x16, 0xdc, 0xc9, 0xa8, 0x85, 0x29, 0x11, 0x36, 0x36, 0x91, 0x43, 0x4a, 0x32, 0x51, 0x06, 0xd2, 0xb5, 0x16, 0xdd, 0xc9, 0xa8, 0x89, 0x29,
0xfe, 0x63, 0x58, 0x16, 0xf8, 0x91, 0xec, 0x13, 0xe5, 0x98, 0xc7, 0x1c, 0xa2, 0xb0, 0x8e, 0x4c, 0x11, 0xfe, 0x13, 0x58, 0x11, 0xf8, 0x91, 0xec, 0x13, 0xe5, 0x58, 0xc0, 0x1c, 0xa2, 0xb0, 0xb6,
0x8b, 0xf2, 0xdc, 0x82, 0x32, 0xb5, 0x4a, 0xcc, 0x78, 0x81, 0x64, 0x6c, 0x6c, 0x0a, 0xf7, 0x83, 0x4c, 0x8b, 0xf2, 0xdc, 0x82, 0x12, 0xb5, 0x4a, 0xcc, 0x78, 0x81, 0x64, 0x6c, 0x6c, 0x0a, 0xf7,
0x19, 0x97, 0xe7, 0x1c, 0xed, 0xd2, 0x53, 0x2e, 0x4f, 0xcd, 0x69, 0x5a, 0x9a, 0x76, 0x9a, 0x3e, 0x83, 0x19, 0x97, 0xe7, 0x1c, 0xed, 0xd2, 0x53, 0x2e, 0x4f, 0xcd, 0x69, 0x5a, 0x9c, 0x76, 0x9a,
0x86, 0xe5, 0x63, 0x41, 0x82, 0x67, 0xdc, 0x1e, 0x70, 0xdf, 0x8a, 0x09, 0x9b, 0x74, 0x89, 0x45, 0x3e, 0x81, 0x95, 0x63, 0x41, 0x82, 0x67, 0xdc, 0x1e, 0x70, 0xdf, 0x8a, 0x09, 0x9b, 0x74, 0x89,
0x91, 0xb8, 0x83, 0x69, 0xd1, 0x3a, 0x10, 0x42, 0x88, 0x60, 0x0b, 0x7c, 0x60, 0x85, 0x9e, 0x85, 0x25, 0x91, 0xb8, 0x8b, 0x69, 0xd1, 0x3a, 0x10, 0x42, 0x88, 0x60, 0x0b, 0x7c, 0x60, 0x85, 0x9e,
0xb2, 0x09, 0x32, 0x98, 0x92, 0x59, 0x23, 0x70, 0xcf, 0xdb, 0x14, 0xc0, 0x24, 0xde, 0xa9, 0x6f, 0x85, 0xb2, 0x09, 0x32, 0x98, 0xa2, 0x59, 0x25, 0x70, 0xcf, 0xdb, 0x12, 0xc0, 0x24, 0xde, 0xa9,
0x8f, 0xcf, 0xa4, 0xb4, 0x1f, 0xe1, 0x3d, 0x15, 0x40, 0x76, 0x1b, 0x8a, 0x82, 0xe4, 0x5d, 0x4e, 0x6f, 0x8f, 0xcf, 0xa4, 0xb4, 0x1f, 0xe1, 0x3d, 0x13, 0x40, 0x76, 0x1b, 0xe6, 0x05, 0xc9, 0xbb,
0x9e, 0x29, 0x92, 0xa7, 0x15, 0x88, 0xbd, 0x0d, 0x73, 0x58, 0x47, 0xd0, 0x6c, 0x20, 0xbd, 0x57, 0x9c, 0x3c, 0x53, 0x24, 0x4f, 0x2b, 0x10, 0x7b, 0x1b, 0xe6, 0xb0, 0x8e, 0xa0, 0x51, 0x47, 0x7a,
0x63, 0x46, 0xee, 0xb8, 0xa6, 0x4c, 0x13, 0x92, 0xde, 0xc4, 0x77, 0x88, 0xcb, 0x94, 0x4d, 0xfc, 0xaf, 0xc4, 0x8c, 0xdc, 0x71, 0x4d, 0x99, 0x26, 0x24, 0xbd, 0x89, 0xef, 0x10, 0x97, 0x29, 0x99,
0xcd, 0xbe, 0xa7, 0xb1, 0xac, 0x45, 0xcc, 0xfb, 0xb6, 0xcc, 0x3b, 0x45, 0x69, 0xd7, 0x71, 0xaf, 0xf8, 0x9b, 0x7d, 0x4f, 0x63, 0x59, 0x4b, 0x98, 0xf7, 0x6d, 0x99, 0x77, 0x8a, 0xd2, 0xae, 0xe3,
0x9f, 0x29, 0x33, 0xfa, 0x7e, 0xbe, 0x54, 0x69, 0x54, 0x8d, 0x8f, 0xa0, 0x40, 0xa3, 0x23, 0x88, 0x5e, 0x3f, 0x53, 0x66, 0xf4, 0xfd, 0x7c, 0xb1, 0x5c, 0xaf, 0x18, 0x1f, 0x42, 0x81, 0x46, 0x47,
0x10, 0xc7, 0x2e, 0x23, 0x89, 0x10, 0xa1, 0x4d, 0x28, 0xba, 0x3c, 0xbc, 0xf0, 0xfc, 0x17, 0xca, 0x10, 0x21, 0x8e, 0x5d, 0x46, 0x12, 0x21, 0x42, 0x1b, 0x30, 0xef, 0xf2, 0xf0, 0xc2, 0xf3, 0x5f,
0x62, 0x2c, 0x3f, 0x8d, 0x1f, 0xa1, 0xa9, 0x23, 0x72, 0x87, 0x93, 0xd6, 0x26, 0xc8, 0x83, 0xa6, 0x28, 0x8b, 0xb1, 0xfc, 0x34, 0x7e, 0x84, 0xa6, 0x8e, 0xc8, 0x1d, 0x4e, 0x5a, 0x9b, 0x20, 0x0f,
0x37, 0x38, 0xb3, 0xa5, 0xf5, 0xa5, 0x84, 0x80, 0xee, 0x99, 0x3d, 0x43, 0x1e, 0xd9, 0x59, 0x8f, 0x9a, 0xde, 0xe0, 0xcc, 0x96, 0xd6, 0x97, 0x22, 0x02, 0xba, 0x67, 0xf6, 0x0c, 0x79, 0x64, 0x67,
0xf8, 0xdb, 0x50, 0x57, 0x0e, 0xf8, 0xc0, 0x1a, 0xf2, 0x93, 0x50, 0x92, 0x7b, 0x55, 0x7a, 0xdf, 0x3d, 0xe2, 0x6f, 0x43, 0x4d, 0x39, 0xe0, 0x03, 0x6b, 0xc8, 0x4f, 0x42, 0x49, 0xee, 0x15, 0xe9,
0x83, 0x5d, 0x7e, 0x12, 0x1a, 0x7b, 0xb0, 0x20, 0x09, 0xf2, 0x60, 0xcc, 0x55, 0xd5, 0xdf, 0x4e, 0x7d, 0x0f, 0xf6, 0xf8, 0x49, 0x68, 0xec, 0xc3, 0xa2, 0x24, 0xc8, 0x83, 0x31, 0x57, 0x55, 0x7f,
0x13, 0x76, 0x2b, 0x8f, 0x17, 0x93, 0x1b, 0x2d, 0x05, 0x16, 0x24, 0x24, 0x60, 0xe3, 0x53, 0x60, 0x3b, 0x4d, 0xd8, 0x2d, 0x3f, 0x59, 0x4a, 0x6e, 0xb4, 0x14, 0x58, 0x90, 0x90, 0x80, 0x8d, 0x4f,
0xfa, 0x36, 0x2c, 0xcb, 0x93, 0x22, 0xa7, 0x32, 0xb4, 0x2b, 0x7f, 0x55, 0x24, 0xd8, 0x3a, 0x03, 0x80, 0xe9, 0xdb, 0xb0, 0x2c, 0x4f, 0x8a, 0x9c, 0xca, 0xd0, 0xae, 0xfc, 0x55, 0x91, 0x60, 0xeb,
0x31, 0x3a, 0xc1, 0xa4, 0xdf, 0x57, 0x81, 0x11, 0x25, 0x53, 0x7d, 0x1a, 0x7f, 0x92, 0x81, 0x45, 0x0c, 0xc4, 0xe8, 0x04, 0x93, 0x7e, 0x5f, 0x05, 0x46, 0x14, 0x4d, 0xf5, 0x69, 0xfc, 0x49, 0x06,
0x2c, 0x4c, 0x09, 0xeb, 0x92, 0xc9, 0xfe, 0xc4, 0x8d, 0x14, 0xf3, 0xa3, 0xcb, 0x3e, 0xf4, 0xf1, 0x96, 0xb0, 0x30, 0x25, 0xac, 0x4b, 0x26, 0xfb, 0x13, 0x37, 0x52, 0xcc, 0x8f, 0x2e, 0xfb, 0xd0,
0xd5, 0x4d, 0x9b, 0xf9, 0x19, 0xd3, 0xe6, 0x7b, 0xd0, 0x18, 0xf0, 0xa1, 0x83, 0x31, 0x32, 0x4a, 0xc7, 0x57, 0x37, 0x6d, 0xe6, 0x67, 0x4c, 0x9b, 0x5f, 0x87, 0xfa, 0x80, 0x0f, 0x1d, 0x8c, 0x91,
0x94, 0x20, 0xf1, 0x7c, 0x5e, 0xc1, 0xa5, 0xaa, 0x66, 0xfc, 0xbd, 0x0c, 0x2c, 0x90, 0xa4, 0x82, 0x51, 0xa2, 0x04, 0x89, 0xe7, 0x0b, 0x0a, 0x2e, 0x55, 0x35, 0xe3, 0xef, 0x65, 0x60, 0x91, 0x24,
0x4a, 0xaf, 0x1c, 0xa8, 0x4f, 0x94, 0x96, 0x27, 0x59, 0x95, 0xec, 0x53, 0xbc, 0x83, 0x23, 0x94, 0x15, 0x54, 0x7a, 0xe5, 0x40, 0x7d, 0xac, 0xb4, 0x3c, 0xc9, 0xaa, 0x64, 0x9f, 0xe2, 0x1d, 0x1c,
0x90, 0x77, 0x6e, 0x48, 0xed, 0x4f, 0x42, 0xd9, 0xc7, 0xa8, 0x60, 0xb8, 0x16, 0x02, 0x53, 0x62, 0xa1, 0x84, 0xbc, 0x7b, 0x43, 0x6a, 0x7f, 0x12, 0xca, 0x3e, 0x42, 0x05, 0xc3, 0xb5, 0x10, 0x98,
0x6e, 0x92, 0x93, 0xb2, 0x73, 0x03, 0xb5, 0x0f, 0x17, 0x41, 0x1b, 0x25, 0xa1, 0x76, 0x0a, 0xb0, 0x12, 0x73, 0x93, 0x9c, 0x94, 0xdd, 0x1b, 0xa8, 0x7d, 0xb8, 0x08, 0xda, 0x2c, 0x0a, 0xb5, 0x53,
0xb1, 0x0d, 0xb5, 0x44, 0x35, 0x09, 0xfb, 0x6b, 0x95, 0xec, 0xaf, 0x33, 0x3e, 0x8e, 0xec, 0xac, 0x80, 0x8d, 0x1d, 0xa8, 0x26, 0xaa, 0x49, 0xd8, 0x5f, 0x2b, 0x64, 0x7f, 0x9d, 0xf1, 0x71, 0x64,
0x8f, 0xe3, 0x0a, 0x16, 0x4d, 0x6e, 0x0f, 0xae, 0xb6, 0x3d, 0xff, 0x30, 0x38, 0x0e, 0xb7, 0x49, 0x67, 0x7d, 0x1c, 0x57, 0xb0, 0x64, 0x72, 0x7b, 0x70, 0xb5, 0xe3, 0xf9, 0x87, 0xc1, 0x71, 0xb8,
0xfc, 0x13, 0xfc, 0x3d, 0x72, 0xdc, 0x25, 0x8c, 0x9c, 0xca, 0x7f, 0xa3, 0x74, 0xd9, 0xaf, 0x41, 0x43, 0xe2, 0x9f, 0xe0, 0xef, 0x91, 0xe3, 0x2e, 0x61, 0xe4, 0x54, 0xfe, 0x1b, 0xa5, 0xcb, 0x7e,
0x3d, 0xf6, 0xf0, 0x69, 0x86, 0xb2, 0x5a, 0xe4, 0xe4, 0x43, 0x7b, 0x99, 0xd0, 0x03, 0x83, 0xe3, 0x0d, 0x6a, 0xb1, 0x87, 0x4f, 0x33, 0x94, 0x55, 0x23, 0x27, 0x1f, 0xda, 0xcb, 0x84, 0x1e, 0x18,
0x50, 0x9a, 0xca, 0xf0, 0xb7, 0xf1, 0xd7, 0xf2, 0xc0, 0x04, 0x35, 0x4f, 0x11, 0xcc, 0x94, 0x6f, 0x1c, 0x87, 0xd2, 0x54, 0x86, 0xbf, 0x8d, 0xbf, 0x96, 0x07, 0x26, 0xa8, 0x79, 0x8a, 0x60, 0xa6,
0x32, 0x3b, 0xe3, 0x9b, 0x7c, 0x04, 0x4c, 0x43, 0x50, 0x2e, 0xd3, 0x5c, 0xe4, 0x32, 0x6d, 0xc4, 0x7c, 0x93, 0xd9, 0x19, 0xdf, 0xe4, 0x63, 0x60, 0x1a, 0x82, 0x72, 0x99, 0xe6, 0x22, 0x97, 0x69,
0xb8, 0xd2, 0x63, 0xfa, 0x08, 0x96, 0xa4, 0x2c, 0x9d, 0x6c, 0x2a, 0x91, 0x06, 0x23, 0xa1, 0x3a, 0x3d, 0xc6, 0x95, 0x1e, 0xd3, 0xc7, 0xb0, 0x2c, 0x65, 0xe9, 0x64, 0x53, 0x89, 0x34, 0x18, 0x09,
0xd1, 0x5e, 0xe5, 0x97, 0x14, 0xba, 0x39, 0x99, 0xc2, 0xd0, 0x2f, 0xa9, 0xb4, 0x72, 0x8d, 0x00, 0xd5, 0x89, 0xf6, 0x2a, 0xbf, 0xa4, 0xd0, 0xcd, 0xc9, 0x14, 0x86, 0x7e, 0x49, 0xa5, 0x95, 0x6b,
0xe7, 0x5e, 0x49, 0x80, 0xc5, 0x19, 0x02, 0xd4, 0x2c, 0x33, 0xa5, 0xa4, 0x65, 0xc6, 0x80, 0x9a, 0x04, 0x38, 0xf7, 0x4a, 0x02, 0x9c, 0x9f, 0x21, 0x40, 0xcd, 0x32, 0x53, 0x4c, 0x5a, 0x66, 0x0c,
0xf2, 0x3e, 0x52, 0xd0, 0x05, 0x09, 0x8e, 0x15, 0xe9, 0x82, 0xc4, 0xc0, 0x8b, 0xfb, 0xd0, 0x50, 0xa8, 0x2a, 0xef, 0x23, 0x05, 0x5d, 0x90, 0xe0, 0x58, 0x96, 0x2e, 0x48, 0x0c, 0xbc, 0x78, 0x00,
0xe6, 0x93, 0xc8, 0xf6, 0x43, 0x01, 0x05, 0xd2, 0xfa, 0xb6, 0xa9, 0x2c, 0x40, 0x09, 0x4b, 0x7b, 0x75, 0x65, 0x3e, 0x89, 0x6c, 0x3f, 0x14, 0x50, 0x20, 0xad, 0x6f, 0x5b, 0xca, 0x02, 0x94, 0xb0,
0x65, 0xca, 0xd2, 0xfe, 0x3e, 0x2c, 0x04, 0x82, 0x7e, 0xad, 0x89, 0x2b, 0xa3, 0x7f, 0xf8, 0x00, 0xb4, 0x97, 0xa7, 0x2c, 0xed, 0xef, 0xc2, 0x62, 0x20, 0xe8, 0xd7, 0x9a, 0xb8, 0x32, 0xfa, 0x87,
0xd5, 0xac, 0x92, 0xd9, 0xc0, 0x84, 0xa3, 0x18, 0x3e, 0x6b, 0xd7, 0xa8, 0xa5, 0xd8, 0x35, 0x9e, 0x0f, 0x50, 0xcd, 0x2a, 0x9a, 0x75, 0x4c, 0x38, 0x8a, 0xe1, 0xb3, 0x76, 0x8d, 0x6a, 0x8a, 0x5d,
0xc4, 0x8e, 0xba, 0xe0, 0xcc, 0x19, 0xa1, 0xcc, 0x10, 0x47, 0xca, 0xc8, 0x01, 0xee, 0x9e, 0x39, 0xe3, 0x69, 0xec, 0xa8, 0x0b, 0xce, 0x9c, 0x11, 0xca, 0x0c, 0x71, 0xa4, 0x8c, 0x1c, 0xe0, 0xee,
0x23, 0x53, 0x79, 0x85, 0xc5, 0x87, 0xf1, 0xbf, 0x33, 0xd0, 0x10, 0x74, 0x90, 0x58, 0x62, 0xdf, 0x99, 0x33, 0x32, 0x95, 0x57, 0x58, 0x7c, 0x18, 0xff, 0x3b, 0x03, 0x75, 0x41, 0x07, 0x89, 0x25,
0x01, 0x64, 0x06, 0xaf, 0xb9, 0xc2, 0x2a, 0x02, 0x57, 0x2d, 0xb0, 0x8f, 0x00, 0x57, 0x8c, 0x25, 0xf6, 0x1d, 0x40, 0x66, 0xf0, 0x9a, 0x2b, 0xac, 0x2c, 0x70, 0xd5, 0x02, 0xfb, 0x10, 0x70, 0xc5,
0x74, 0x4a, 0xb9, 0xbe, 0x9a, 0xc9, 0xf5, 0x15, 0xf3, 0xd0, 0x9d, 0x1b, 0xa4, 0x7b, 0x08, 0x08, 0x58, 0x42, 0xa7, 0x94, 0xeb, 0xab, 0x91, 0x5c, 0x5f, 0x31, 0x0f, 0xdd, 0xbd, 0x41, 0xba, 0x87,
0xfb, 0x0e, 0x94, 0x05, 0x61, 0x22, 0x95, 0xc8, 0x00, 0x2d, 0x25, 0x79, 0xa5, 0xac, 0x11, 0x91, 0x80, 0xb0, 0xef, 0x40, 0x49, 0x10, 0x26, 0x52, 0x89, 0x0c, 0xd0, 0x52, 0x92, 0x57, 0xca, 0x1a,
0x75, 0x2c, 0x3f, 0xd3, 0x7c, 0xab, 0xf9, 0x14, 0xdf, 0xaa, 0xb6, 0x80, 0x77, 0x00, 0x9e, 0xf1, 0x11, 0x59, 0xc7, 0xf2, 0x33, 0xcd, 0xb7, 0x9a, 0x4f, 0xf1, 0xad, 0x6a, 0x0b, 0x78, 0x17, 0xe0,
0xab, 0x5d, 0xaf, 0x8f, 0x1a, 0xef, 0x1d, 0x00, 0x41, 0xcb, 0x27, 0xf6, 0xc8, 0x91, 0x06, 0x9b, 0x39, 0xbf, 0xda, 0xf3, 0xfa, 0xa8, 0xf1, 0xde, 0x01, 0x10, 0xb4, 0x7c, 0x62, 0x8f, 0x1c, 0x69,
0x82, 0x59, 0x7e, 0xc1, 0xaf, 0xb6, 0x11, 0x20, 0x26, 0x52, 0x24, 0xc7, 0xab, 0xb8, 0x60, 0x96, 0xb0, 0x29, 0x98, 0xa5, 0x17, 0xfc, 0x6a, 0x07, 0x01, 0x62, 0x22, 0x45, 0x72, 0xbc, 0x8a, 0x0b,
0x5e, 0xf0, 0x2b, 0x5a, 0xc2, 0x16, 0xd4, 0x9e, 0xf1, 0xab, 0x2d, 0x4e, 0x42, 0xa6, 0xe7, 0x0b, 0x66, 0xf1, 0x05, 0xbf, 0xa2, 0x25, 0x6c, 0x41, 0xf5, 0x39, 0xbf, 0xda, 0xe6, 0x24, 0x64, 0x7a,
0x22, 0xf2, 0xed, 0x0b, 0x21, 0x55, 0x26, 0xfc, 0xa2, 0x15, 0xdf, 0xbe, 0x78, 0xc6, 0xaf, 0x94, 0xbe, 0x20, 0x22, 0xdf, 0xbe, 0x10, 0x52, 0x65, 0xc2, 0x2f, 0x5a, 0xf6, 0xed, 0x8b, 0xe7, 0xfc,
0x8f, 0xb6, 0x28, 0xd2, 0x87, 0x5e, 0x5f, 0xee, 0x9b, 0x2a, 0xc2, 0x23, 0x6e, 0x94, 0x39, 0xf7, 0x4a, 0xf9, 0x68, 0xe7, 0x45, 0xfa, 0xd0, 0xeb, 0xcb, 0x7d, 0x53, 0x45, 0x78, 0xc4, 0x8d, 0x32,
0x02, 0x7f, 0x1b, 0x7f, 0x99, 0x81, 0x9a, 0x68, 0x3f, 0xb2, 0x65, 0x31, 0x65, 0x2a, 0x50, 0x28, 0xe7, 0x5e, 0xe0, 0x6f, 0xe3, 0x2f, 0x33, 0x50, 0x15, 0xed, 0x47, 0xb6, 0x2c, 0xa6, 0x4c, 0x05,
0x13, 0x07, 0x0a, 0x3d, 0x96, 0x5c, 0x8d, 0x78, 0x7c, 0xf6, 0x7a, 0x1e, 0x8f, 0x73, 0x43, 0x0c, 0x0a, 0x65, 0xe2, 0x40, 0xa1, 0x27, 0x92, 0xab, 0x11, 0x8f, 0xcf, 0x5e, 0xcf, 0xe3, 0x71, 0x6e,
0xfe, 0x03, 0x28, 0xd3, 0xb2, 0x14, 0xeb, 0x3c, 0x97, 0x98, 0xe0, 0x44, 0x87, 0xcc, 0x12, 0xa2, 0x88, 0xc1, 0xbf, 0x0f, 0x25, 0x5a, 0x96, 0x62, 0x9d, 0xe7, 0x12, 0x13, 0x9c, 0xe8, 0x90, 0x59,
0x3d, 0xa3, 0xb8, 0x04, 0xcd, 0xf8, 0x47, 0x43, 0x5c, 0xf6, 0x23, 0x93, 0x5f, 0xca, 0x34, 0x14, 0x44, 0xb4, 0xe7, 0x14, 0x97, 0xa0, 0x19, 0xff, 0x68, 0x88, 0x4b, 0x7e, 0x64, 0xf2, 0x4b, 0x99,
0xae, 0x89, 0x4b, 0xd0, 0x2d, 0x6b, 0x73, 0x33, 0x96, 0xb5, 0x03, 0x28, 0x89, 0xa9, 0xc6, 0xce, 0x86, 0xc2, 0x35, 0x71, 0x09, 0xba, 0x65, 0x6d, 0x6e, 0xc6, 0xb2, 0x76, 0x00, 0x45, 0x31, 0xd5,
0xa6, 0x14, 0x9a, 0x49, 0x2b, 0x54, 0x48, 0x02, 0xb6, 0xd8, 0x14, 0x04, 0xa3, 0xcb, 0x4a, 0x49, 0xd8, 0xd9, 0x94, 0x42, 0x33, 0x69, 0x85, 0x0a, 0x49, 0xc0, 0x16, 0x9b, 0x82, 0x60, 0x74, 0x59,
0xc0, 0x0e, 0xf8, 0x21, 0x32, 0xbb, 0x0c, 0x54, 0xb4, 0x15, 0x80, 0xc6, 0xc9, 0x68, 0xbc, 0x68, 0x29, 0x09, 0xd8, 0x01, 0x3f, 0x44, 0x66, 0x97, 0x81, 0xb2, 0xb6, 0x02, 0xd0, 0x38, 0x19, 0x8d,
0xb9, 0x24, 0x49, 0x3c, 0x31, 0xe0, 0x3b, 0x37, 0xcc, 0x5a, 0x3f, 0x31, 0x03, 0xeb, 0x92, 0x56, 0x17, 0x2d, 0x97, 0x24, 0x89, 0x27, 0x06, 0x7c, 0xf7, 0x86, 0x59, 0xed, 0x27, 0x66, 0x60, 0x43,
0x31, 0x67, 0x36, 0x11, 0xd3, 0xa4, 0x1a, 0xae, 0x08, 0x54, 0xfc, 0xde, 0x98, 0x83, 0xbc, 0x40, 0xd2, 0x2a, 0xe6, 0xcc, 0x26, 0x62, 0x9a, 0x54, 0xc3, 0x15, 0x81, 0x8a, 0xdf, 0x9b, 0x73, 0x90,
0x35, 0x3e, 0x81, 0x05, 0xad, 0x19, 0xa4, 0xe6, 0xbf, 0x6e, 0x0f, 0x8d, 0x5f, 0x89, 0x32, 0x8b, 0x17, 0xa8, 0xc6, 0xc7, 0xb0, 0xa8, 0x35, 0x83, 0xd4, 0xfc, 0xd7, 0xed, 0xa1, 0xf1, 0x2b, 0x51,
0x3a, 0xc8, 0x7d, 0xa4, 0x62, 0x3c, 0xf8, 0x80, 0x3a, 0x2e, 0x63, 0x49, 0x08, 0x24, 0xd0, 0x5e, 0x66, 0x51, 0x07, 0xb9, 0x8f, 0x54, 0x8c, 0x07, 0x1f, 0x50, 0xc7, 0x65, 0x2c, 0x09, 0x81, 0x04,
0x3b, 0xee, 0xe0, 0xd7, 0x60, 0x51, 0x2b, 0x7d, 0xdb, 0x71, 0xed, 0xa1, 0xf3, 0x23, 0xdc, 0xf0, 0xda, 0x6b, 0xc7, 0x1d, 0xfc, 0x1a, 0x2c, 0x69, 0xa5, 0xef, 0x38, 0xae, 0x3d, 0x74, 0x7e, 0x84,
0x03, 0xe7, 0xd4, 0x9d, 0x2a, 0x9f, 0x40, 0x5f, 0xa9, 0xfc, 0xbf, 0x9f, 0x85, 0x25, 0x59, 0x01, 0x1b, 0x7e, 0xe0, 0x9c, 0xba, 0x53, 0xe5, 0x13, 0xe8, 0x2b, 0x95, 0xff, 0xf7, 0xb3, 0xb0, 0x2c,
0x46, 0xed, 0x39, 0x42, 0x8a, 0xdb, 0x0b, 0x4e, 0xd9, 0x77, 0xa0, 0x26, 0xc6, 0xc6, 0xf2, 0xf9, 0x2b, 0xc0, 0xa8, 0x3d, 0x47, 0x48, 0x71, 0xfb, 0xc1, 0x29, 0xfb, 0x0e, 0x54, 0xc5, 0xd8, 0x58,
0xa9, 0x13, 0x84, 0x5c, 0xb9, 0xad, 0x52, 0x18, 0x97, 0xd8, 0xcc, 0x05, 0xaa, 0x29, 0x31, 0xd9, 0x3e, 0x3f, 0x75, 0x82, 0x90, 0x2b, 0xb7, 0x55, 0x0a, 0xe3, 0x12, 0x9b, 0xb9, 0x40, 0x35, 0x25,
0x27, 0x50, 0xc1, 0xac, 0x64, 0x46, 0x91, 0x13, 0xd1, 0x9c, 0xcd, 0x48, 0x03, 0xbd, 0x73, 0xc3, 0x26, 0xfb, 0x18, 0xca, 0x98, 0x95, 0xcc, 0x28, 0x72, 0x22, 0x1a, 0xb3, 0x19, 0x69, 0xa0, 0x77,
0x84, 0x20, 0x1e, 0xf6, 0x4f, 0xa0, 0x82, 0x73, 0x78, 0x8e, 0x03, 0x39, 0xc5, 0xaa, 0x66, 0x06, 0x6f, 0x98, 0x10, 0xc4, 0xc3, 0xfe, 0x31, 0x94, 0x71, 0x0e, 0xcf, 0x71, 0x20, 0xa7, 0x58, 0xd5,
0x5a, 0x64, 0x1e, 0xc7, 0xc3, 0xde, 0x82, 0x1a, 0x31, 0x2b, 0x39, 0x4e, 0x32, 0x1a, 0x68, 0x6d, 0xcc, 0x40, 0x8b, 0xcc, 0xe3, 0x78, 0xd8, 0x9b, 0x50, 0x25, 0x66, 0x25, 0xc7, 0x49, 0x46, 0x03,
0x36, 0xbb, 0x1a, 0x49, 0xd1, 0xf8, 0xb1, 0xf6, 0xbd, 0x51, 0x86, 0x62, 0xe8, 0x3b, 0xa7, 0xa7, 0xad, 0xcf, 0x66, 0x57, 0x23, 0x29, 0x1a, 0x3f, 0xd6, 0xbe, 0x37, 0x4b, 0x30, 0x1f, 0xfa, 0xce,
0xdc, 0x37, 0x56, 0xa2, 0xa1, 0x11, 0x5c, 0x98, 0x77, 0x43, 0x3e, 0x16, 0xb2, 0xb9, 0xf1, 0x6f, 0xe9, 0x29, 0xf7, 0x8d, 0xd5, 0x68, 0x68, 0x04, 0x17, 0xe6, 0xdd, 0x90, 0x8f, 0x85, 0x6c, 0x6e,
0x33, 0x50, 0x91, 0x7c, 0xf5, 0x27, 0xf6, 0x95, 0xad, 0x69, 0x61, 0xaf, 0x64, 0xb1, 0x89, 0xa3, 0xfc, 0xdb, 0x0c, 0x94, 0x25, 0x5f, 0xfd, 0x89, 0x7d, 0x65, 0xeb, 0x5a, 0xd8, 0x2b, 0x59, 0x6c,
0x5c, 0xdf, 0x85, 0xf9, 0x91, 0x90, 0xd3, 0x85, 0x1e, 0x99, 0x70, 0x94, 0xd5, 0x15, 0x58, 0x8a, 0xe2, 0x28, 0xd7, 0xfb, 0xb0, 0x30, 0x12, 0x72, 0xba, 0xd0, 0x23, 0x13, 0x8e, 0xb2, 0x9a, 0x02,
0xc9, 0xeb, 0xb0, 0x88, 0x52, 0x73, 0x60, 0x85, 0xce, 0xd0, 0x52, 0x89, 0x32, 0xc4, 0x74, 0x81, 0x4b, 0x31, 0x79, 0x03, 0x96, 0x50, 0x6a, 0x0e, 0xac, 0xd0, 0x19, 0x5a, 0x2a, 0x51, 0x86, 0x98,
0x92, 0x7a, 0xce, 0x70, 0x4f, 0x26, 0x08, 0xe1, 0x31, 0x08, 0xed, 0x53, 0x2e, 0xd7, 0x36, 0x7d, 0x2e, 0x52, 0x52, 0xcf, 0x19, 0xee, 0xcb, 0x04, 0x21, 0x3c, 0x06, 0xa1, 0x7d, 0xca, 0xe5, 0xda,
0x18, 0x4d, 0x58, 0x99, 0x52, 0x21, 0x95, 0xfa, 0xfb, 0x7f, 0x16, 0x60, 0x75, 0x26, 0x49, 0xaa, 0xa6, 0x0f, 0xa3, 0x01, 0xab, 0x53, 0x2a, 0xa4, 0x52, 0x7f, 0xff, 0xcf, 0x22, 0xac, 0xcd, 0x24,
0xc1, 0x91, 0x83, 0x68, 0xe8, 0x8c, 0x8e, 0xbd, 0xc8, 0x7c, 0x9a, 0xd1, 0x1c, 0x44, 0xbb, 0x22, 0x49, 0x35, 0x38, 0x72, 0x10, 0x0d, 0x9d, 0xd1, 0xb1, 0x17, 0x99, 0x4f, 0x33, 0x9a, 0x83, 0x68,
0x45, 0x99, 0x4f, 0x39, 0x2c, 0x2b, 0x82, 0x44, 0xfb, 0x67, 0xa4, 0x65, 0x66, 0x51, 0x07, 0xfa, 0x4f, 0xa4, 0x28, 0xf3, 0x29, 0x87, 0x15, 0x45, 0x90, 0x68, 0xff, 0x8c, 0xb4, 0xcc, 0x2c, 0xea,
0x20, 0xb9, 0x89, 0x4d, 0x57, 0xa7, 0xe0, 0xba, 0x68, 0xb4, 0x38, 0x9e, 0x81, 0x05, 0xec, 0xd7, 0x40, 0xef, 0x27, 0x37, 0xb1, 0xe9, 0xea, 0x14, 0x5c, 0x17, 0x8d, 0x96, 0xc6, 0x33, 0xb0, 0x80,
0xa1, 0x19, 0xd1, 0xbd, 0x14, 0xdb, 0x35, 0x95, 0x59, 0xd4, 0xf4, 0xf5, 0x57, 0xd4, 0x94, 0xb0, 0xfd, 0x3a, 0x34, 0x22, 0xba, 0x97, 0x62, 0xbb, 0xa6, 0x32, 0x8b, 0x9a, 0xde, 0x7b, 0x45, 0x4d,
0xdd, 0xa1, 0xec, 0xb4, 0xa2, 0x96, 0x0c, 0x15, 0x18, 0xd5, 0x75, 0x0e, 0x6f, 0xa8, 0xba, 0x50, 0x09, 0xdb, 0x1d, 0xca, 0x4e, 0xab, 0x6a, 0xc9, 0x50, 0x81, 0x51, 0x5d, 0xe7, 0xf0, 0x86, 0xaa,
0x0c, 0x9f, 0xad, 0x31, 0xff, 0x5a, 0x7d, 0x43, 0xbb, 0x64, 0xa2, 0x5a, 0xf3, 0x96, 0x2c, 0x38, 0x0b, 0xc5, 0xf0, 0xd9, 0x1a, 0xf3, 0xaf, 0xd5, 0x37, 0xb4, 0x4b, 0x26, 0xaa, 0x35, 0x6f, 0xc9,
0x4a, 0xd2, 0xeb, 0x3d, 0x83, 0x95, 0x0b, 0xdb, 0x09, 0x55, 0x1f, 0x35, 0x8d, 0xbd, 0x80, 0xf5, 0x82, 0xa3, 0x24, 0xbd, 0xde, 0x33, 0x58, 0xbd, 0xb0, 0x9d, 0x50, 0xf5, 0x51, 0xd3, 0xd8, 0x0b,
0x3d, 0x7e, 0x45, 0x7d, 0x9f, 0x53, 0xe6, 0x84, 0x62, 0xb2, 0x74, 0x31, 0x0b, 0x0c, 0xd6, 0xfe, 0x58, 0xdf, 0x93, 0x57, 0xd4, 0xf7, 0x19, 0x65, 0x4e, 0x28, 0x26, 0xcb, 0x17, 0xb3, 0xc0, 0x60,
0x71, 0x0e, 0xea, 0xc9, 0x52, 0x04, 0x63, 0x91, 0x9b, 0x8d, 0x92, 0x37, 0xa5, 0x10, 0x2c, 0x4d, 0xfd, 0x1f, 0xe7, 0xa0, 0x96, 0x2c, 0x45, 0x30, 0x16, 0xb9, 0xd9, 0x28, 0x79, 0x53, 0x0a, 0xc1,
0xfb, 0xfb, 0x24, 0x67, 0xce, 0x3a, 0x1d, 0xb2, 0x29, 0x4e, 0x07, 0xdd, 0xd6, 0x9f, 0x7b, 0x95, 0xd2, 0xb4, 0xdf, 0x21, 0x39, 0x73, 0xd6, 0xe9, 0x90, 0x4d, 0x71, 0x3a, 0xe8, 0xb6, 0xfe, 0xdc,
0x73, 0x35, 0xff, 0x5a, 0xce, 0xd5, 0x42, 0x9a, 0x73, 0xf5, 0x7a, 0x8f, 0xdc, 0xdc, 0x4f, 0xe4, 0xab, 0x9c, 0xab, 0xf9, 0xd7, 0x72, 0xae, 0x16, 0xd2, 0x9c, 0xab, 0xd7, 0x7b, 0xe4, 0xe6, 0x7e,
0x91, 0x2b, 0xbe, 0xd4, 0x23, 0xa7, 0xf9, 0x11, 0x4b, 0xd7, 0x58, 0xe8, 0x35, 0xcf, 0x62, 0x8a, 0x22, 0x8f, 0xdc, 0xfc, 0x4b, 0x3d, 0x72, 0x9a, 0x1f, 0xb1, 0x78, 0x8d, 0x85, 0x5e, 0xf3, 0x2c,
0x47, 0xae, 0xfc, 0x15, 0x3c, 0x72, 0x6b, 0x7f, 0x99, 0x01, 0x36, 0xbb, 0x3a, 0xd8, 0x53, 0xf2, 0xa6, 0x78, 0xe4, 0x4a, 0x5f, 0xc1, 0x23, 0xb7, 0xfe, 0x97, 0x19, 0x60, 0xb3, 0xab, 0x83, 0x3d,
0xe7, 0xb8, 0x7c, 0x28, 0x39, 0xf7, 0x37, 0x5e, 0x6f, 0x85, 0x29, 0x82, 0x50, 0xb9, 0xd9, 0x43, 0x23, 0x7f, 0x8e, 0xcb, 0x87, 0x92, 0x73, 0x7f, 0xe3, 0xf5, 0x56, 0x98, 0x22, 0x08, 0x95, 0x9b,
0x58, 0xd4, 0x03, 0xe1, 0x75, 0xad, 0xbd, 0x66, 0x32, 0x3d, 0x29, 0xb6, 0xed, 0x68, 0x9e, 0xec, 0x3d, 0x82, 0x25, 0x3d, 0x10, 0x5e, 0xd7, 0xda, 0xab, 0x26, 0xd3, 0x93, 0x62, 0xdb, 0x8e, 0xe6,
0xfc, 0x2b, 0x3d, 0xd9, 0x85, 0x57, 0x7a, 0xb2, 0xe7, 0x92, 0x9e, 0xec, 0xb5, 0xff, 0x98, 0x81, 0xc9, 0xce, 0xbf, 0xd2, 0x93, 0x5d, 0x78, 0xa5, 0x27, 0x7b, 0x2e, 0xe9, 0xc9, 0x5e, 0xff, 0x8f,
0xc5, 0x14, 0x22, 0xfe, 0xd9, 0xf5, 0x59, 0xd0, 0x5e, 0x82, 0xad, 0x65, 0x25, 0xed, 0xe9, 0x1c, 0x19, 0x58, 0x4a, 0x21, 0xe2, 0x9f, 0x5d, 0x9f, 0x05, 0xed, 0x25, 0xd8, 0x5a, 0x56, 0xd2, 0x9e,
0x6d, 0x17, 0x2a, 0xf1, 0x54, 0xa8, 0x83, 0x22, 0x0f, 0x5e, 0xc5, 0x5d, 0xe2, 0x1c, 0xa6, 0x9e, 0xce, 0xd1, 0xf6, 0xa0, 0x1c, 0x4f, 0x85, 0x3a, 0x28, 0xf2, 0xf0, 0x55, 0xdc, 0x25, 0xce, 0x61,
0x7d, 0xed, 0xf7, 0xb2, 0x50, 0xd1, 0x12, 0xc5, 0x28, 0x12, 0xc9, 0x6a, 0x01, 0x44, 0x24, 0x19, 0xea, 0xd9, 0xd7, 0x7f, 0x2f, 0x0b, 0x65, 0x2d, 0x51, 0x8c, 0x22, 0x91, 0xac, 0x16, 0x40, 0x44,
0xa2, 0xcd, 0xe1, 0x2e, 0x48, 0xa7, 0x06, 0xa5, 0xd3, 0xe2, 0x92, 0x62, 0x20, 0x22, 0xac, 0xc3, 0x92, 0x21, 0xda, 0x1c, 0xee, 0x82, 0x74, 0x6a, 0x50, 0x3a, 0x2d, 0x2e, 0x29, 0x06, 0x22, 0xc2,
0xa2, 0xf2, 0xb5, 0xf1, 0x38, 0x4e, 0x50, 0xee, 0x35, 0x0b, 0xd2, 0xe3, 0xc6, 0xa3, 0xb0, 0x43, 0x06, 0x2c, 0x29, 0x5f, 0x1b, 0x8f, 0xe3, 0x04, 0xe5, 0x5e, 0xb3, 0x28, 0x3d, 0x6e, 0x3c, 0x0a,
0xf6, 0x50, 0xa9, 0x83, 0xf1, 0xdc, 0x21, 0xa9, 0x93, 0xc7, 0x60, 0x81, 0x16, 0x88, 0x9a, 0x44, 0x3b, 0x64, 0x8f, 0x94, 0x3a, 0x18, 0xcf, 0x1d, 0x92, 0x3a, 0x79, 0x0c, 0x16, 0x69, 0x81, 0xa8,
0x41, 0xe7, 0x1f, 0xc0, 0xb2, 0x5a, 0x1e, 0xc9, 0x1c, 0xe4, 0x44, 0x60, 0x72, 0x71, 0xe8, 0x59, 0x49, 0x14, 0x74, 0xfe, 0x3e, 0xac, 0xa8, 0xe5, 0x91, 0xcc, 0x41, 0x4e, 0x04, 0x26, 0x17, 0x87,
0xbe, 0x07, 0x77, 0xa6, 0xda, 0x34, 0x95, 0x95, 0x02, 0x5a, 0x6f, 0x26, 0x5a, 0xa7, 0x97, 0xb0, 0x9e, 0xe5, 0x7b, 0x70, 0x67, 0xaa, 0x4d, 0x53, 0x59, 0x29, 0xa0, 0xf5, 0x66, 0xa2, 0x75, 0x7a,
0xf6, 0x63, 0xa8, 0x25, 0x18, 0xe5, 0xcf, 0x6e, 0xca, 0xa7, 0xed, 0x3c, 0x34, 0xa2, 0xba, 0x9d, 0x09, 0xeb, 0x3f, 0x86, 0x6a, 0x82, 0x51, 0xfe, 0xec, 0xa6, 0x7c, 0xda, 0xce, 0x43, 0x23, 0xaa,
0x67, 0xed, 0x7f, 0xe5, 0x80, 0xcd, 0xf2, 0xea, 0x9f, 0x67, 0x13, 0x66, 0x09, 0x33, 0x97, 0x42, 0xdb, 0x79, 0xd6, 0xff, 0x57, 0x0e, 0xd8, 0x2c, 0xaf, 0xfe, 0x79, 0x36, 0x61, 0x96, 0x30, 0x73,
0x98, 0xff, 0xcf, 0xe4, 0x87, 0xf7, 0x61, 0x41, 0x1e, 0x98, 0xd2, 0x1c, 0xa6, 0xb4, 0x38, 0x1b, 0x29, 0x84, 0xf9, 0xff, 0x4c, 0x7e, 0x78, 0x17, 0x16, 0xe5, 0x81, 0x29, 0xcd, 0x61, 0x4a, 0x8b,
0x51, 0x82, 0x6a, 0xc5, 0x47, 0xd3, 0x81, 0x1b, 0xa5, 0xc4, 0x19, 0x11, 0x4d, 0x80, 0x9a, 0x8a, 0xb3, 0x1e, 0x25, 0xa8, 0x56, 0x7c, 0x38, 0x1d, 0xb8, 0x51, 0x4c, 0x9c, 0x11, 0xd1, 0x04, 0xa8,
0xdf, 0x38, 0x82, 0x39, 0xdb, 0xed, 0x9f, 0x79, 0xbe, 0xe4, 0x83, 0xbf, 0xf0, 0x95, 0xb7, 0xcf, 0xa9, 0xf8, 0x8d, 0x23, 0x98, 0xb3, 0xdd, 0xfe, 0x99, 0xe7, 0x4b, 0x3e, 0xf8, 0x0b, 0x5f, 0x79,
0xf5, 0x16, 0xe6, 0x47, 0xa9, 0xcd, 0x94, 0x85, 0x19, 0x1f, 0x40, 0x45, 0x03, 0xb3, 0x32, 0x14, 0xfb, 0xdc, 0x68, 0x62, 0x7e, 0x94, 0xda, 0x4c, 0x59, 0x98, 0xf1, 0x3e, 0x94, 0x35, 0x30, 0x2b,
0x76, 0x3b, 0x7b, 0x1b, 0x07, 0x8d, 0x1b, 0xac, 0x06, 0x65, 0xb3, 0xbd, 0x79, 0xf0, 0x59, 0xdb, 0x41, 0x61, 0xaf, 0xbd, 0xbf, 0x79, 0x50, 0xbf, 0xc1, 0xaa, 0x50, 0x32, 0x5b, 0x5b, 0x07, 0x9f,
0x6c, 0x6f, 0x35, 0x32, 0xac, 0x04, 0xf9, 0xdd, 0x83, 0x6e, 0xaf, 0x91, 0x35, 0xd6, 0xa0, 0x29, 0xb6, 0xcc, 0xd6, 0x76, 0x3d, 0xc3, 0x8a, 0x90, 0xdf, 0x3b, 0xe8, 0xf6, 0xea, 0x59, 0x63, 0x1d,
0x4b, 0x9c, 0xf5, 0x59, 0xfc, 0x56, 0x3e, 0x32, 0x17, 0x62, 0xa2, 0x54, 0xd1, 0xbf, 0x09, 0x55, 0x1a, 0xb2, 0xc4, 0x59, 0x9f, 0xc5, 0x6f, 0xe5, 0x23, 0x73, 0x21, 0x26, 0x4a, 0x15, 0xfd, 0x9b,
0x5d, 0xbc, 0x91, 0x14, 0x31, 0xe5, 0xb3, 0x17, 0xca, 0xb9, 0xa7, 0xf1, 0xea, 0x4d, 0x20, 0x8f, 0x50, 0xd1, 0xc5, 0x1b, 0x49, 0x11, 0x53, 0x3e, 0x7b, 0xa1, 0x9c, 0x7b, 0x1a, 0xaf, 0xde, 0x02,
0xed, 0x20, 0xca, 0x96, 0x4d, 0xc8, 0xad, 0x29, 0xde, 0x41, 0x54, 0x7e, 0x12, 0x64, 0xf8, 0xff, 0xf2, 0xd8, 0x0e, 0xa2, 0x6c, 0xd9, 0x84, 0xdc, 0x9a, 0xe2, 0x1d, 0x44, 0xe5, 0x27, 0x41, 0x86,
0x41, 0x3d, 0x69, 0xc0, 0x97, 0x1c, 0x29, 0x4d, 0xe1, 0x14, 0xb9, 0x13, 0x16, 0x7d, 0xf6, 0x3d, 0xff, 0x1f, 0xd4, 0x92, 0x06, 0x7c, 0xc9, 0x91, 0xd2, 0x14, 0x4e, 0x91, 0x3b, 0x61, 0xd1, 0x67,
0x68, 0x4c, 0x3b, 0x00, 0xa4, 0xf0, 0x7c, 0x4d, 0xfe, 0x79, 0x27, 0xe9, 0x13, 0x60, 0x3b, 0xb0, 0xdf, 0x83, 0xfa, 0xb4, 0x03, 0x40, 0x0a, 0xcf, 0xd7, 0xe4, 0x5f, 0x70, 0x92, 0x3e, 0x01, 0xb6,
0x94, 0x26, 0xe0, 0x21, 0x7d, 0x5c, 0x6f, 0xa4, 0x60, 0xb3, 0x42, 0x1c, 0xfb, 0xb6, 0xf4, 0xf3, 0x0b, 0xcb, 0x69, 0x02, 0x1e, 0xd2, 0xc7, 0xf5, 0x46, 0x0a, 0x36, 0x2b, 0xc4, 0xb1, 0x6f, 0x4b,
0x14, 0x70, 0xfa, 0xdf, 0x4e, 0xd6, 0xaf, 0x0d, 0xf6, 0x3a, 0xfd, 0xd3, 0x3c, 0x3e, 0xe7, 0x00, 0x3f, 0x4f, 0x01, 0xa7, 0xff, 0xed, 0x64, 0xfd, 0xda, 0x60, 0x6f, 0xd0, 0x3f, 0xcd, 0xe3, 0x73,
0x31, 0x8c, 0x35, 0xa0, 0x7a, 0x70, 0xd8, 0xde, 0xb7, 0x36, 0x77, 0x5a, 0xfb, 0xfb, 0xed, 0xdd, 0x0e, 0x10, 0xc3, 0x58, 0x1d, 0x2a, 0x07, 0x87, 0xad, 0x8e, 0xb5, 0xb5, 0xdb, 0xec, 0x74, 0x5a,
0xc6, 0x0d, 0xc6, 0xa0, 0x8e, 0xbe, 0xea, 0xad, 0x08, 0x96, 0x11, 0x30, 0xe9, 0x6f, 0x53, 0xb0, 0x7b, 0xf5, 0x1b, 0x8c, 0x41, 0x0d, 0x7d, 0xd5, 0xdb, 0x11, 0x2c, 0x23, 0x60, 0xd2, 0xdf, 0xa6,
0x2c, 0x5b, 0x82, 0x46, 0x67, 0x7f, 0x0a, 0x9a, 0x63, 0x4d, 0x58, 0x3a, 0x6c, 0x93, 0x7b, 0x3b, 0x60, 0x59, 0xb6, 0x0c, 0xf5, 0x76, 0x67, 0x0a, 0x9a, 0x63, 0x0d, 0x58, 0x3e, 0x6c, 0x91, 0x7b,
0x51, 0x6e, 0x5e, 0x28, 0x0d, 0xb2, 0xbb, 0x42, 0x69, 0xa0, 0x83, 0x7f, 0x72, 0x1d, 0x28, 0x59, 0x3b, 0x51, 0x6e, 0x5e, 0x28, 0x0d, 0xb2, 0xbb, 0x42, 0x69, 0xa0, 0x83, 0x7f, 0x72, 0x1d, 0x28,
0xfa, 0xb7, 0x33, 0xb0, 0x3c, 0x95, 0x10, 0x1f, 0xe7, 0x20, 0x49, 0x3a, 0x29, 0x43, 0x57, 0x11, 0x59, 0xfa, 0xb7, 0x33, 0xb0, 0x32, 0x95, 0x10, 0x1f, 0xe7, 0x20, 0x49, 0x3a, 0x29, 0x43, 0x57,
0xa8, 0x56, 0xd3, 0xfb, 0xb0, 0x10, 0x19, 0x9e, 0xa6, 0x76, 0xa5, 0x46, 0x94, 0xa0, 0x90, 0x1f, 0x10, 0xa8, 0x56, 0xd3, 0xbb, 0xb0, 0x18, 0x19, 0x9e, 0xa6, 0x76, 0xa5, 0x7a, 0x94, 0xa0, 0x90,
0xc2, 0xa2, 0x66, 0xbf, 0x9a, 0xe2, 0x15, 0x4c, 0x4b, 0x92, 0x19, 0x8c, 0xd5, 0x28, 0x6c, 0x7e, 0x1f, 0xc1, 0x92, 0x66, 0xbf, 0x9a, 0xe2, 0x15, 0x4c, 0x4b, 0x92, 0x19, 0x8c, 0xb5, 0x28, 0x6c,
0xaa, 0xd5, 0x03, 0x3a, 0x4d, 0xa8, 0x27, 0xc4, 0x6e, 0xb0, 0x64, 0x7b, 0xd5, 0x27, 0x7b, 0x34, 0x7e, 0xaa, 0xd5, 0x03, 0x3a, 0x4d, 0xa8, 0x27, 0xc4, 0x6e, 0xb0, 0x64, 0x7b, 0xd5, 0x27, 0x7b,
0x45, 0x08, 0xc9, 0xd6, 0xea, 0x13, 0xae, 0xaa, 0xff, 0xfd, 0x39, 0x60, 0x9f, 0x4e, 0xb8, 0x7f, 0x3c, 0x45, 0x08, 0xc9, 0xd6, 0xea, 0x13, 0xae, 0xaa, 0xff, 0xfd, 0x39, 0x60, 0x9f, 0x4c, 0xb8,
0x85, 0xc7, 0x35, 0x82, 0x57, 0xc5, 0x2f, 0x2a, 0x4b, 0x4b, 0xf6, 0xb5, 0x8e, 0x64, 0xa5, 0x1d, 0x7f, 0x85, 0xc7, 0x35, 0x82, 0x57, 0xc5, 0x2f, 0x2a, 0x4b, 0x4b, 0xf6, 0xb5, 0x8e, 0x64, 0xa5,
0x89, 0xca, 0xbf, 0xfa, 0x48, 0x54, 0xe1, 0x55, 0x47, 0xa2, 0xde, 0x82, 0x9a, 0x73, 0xea, 0x7a, 0x1d, 0x89, 0xca, 0xbf, 0xfa, 0x48, 0x54, 0xe1, 0x55, 0x47, 0xa2, 0xde, 0x82, 0xaa, 0x73, 0xea,
0x82, 0x15, 0x0a, 0x49, 0x38, 0x68, 0xce, 0xdd, 0xcb, 0xdd, 0xaf, 0x9a, 0x55, 0x09, 0x14, 0x72, 0x7a, 0x82, 0x15, 0x0a, 0x49, 0x38, 0x68, 0xcc, 0xdd, 0xcb, 0x3d, 0xa8, 0x98, 0x15, 0x09, 0x14,
0x70, 0xc0, 0x3e, 0x89, 0x91, 0xf8, 0xe0, 0x14, 0x8f, 0xef, 0xe9, 0x4c, 0xb0, 0x3d, 0x38, 0xe5, 0x72, 0x70, 0xc0, 0x3e, 0x8e, 0x91, 0xf8, 0xe0, 0x14, 0x8f, 0xef, 0xe9, 0x4c, 0xb0, 0x35, 0x38,
0xd2, 0xb0, 0x84, 0x9a, 0x86, 0xca, 0x2c, 0xe0, 0x01, 0x7b, 0x1b, 0xea, 0x81, 0x37, 0x11, 0x8a, 0xe5, 0xd2, 0xb0, 0x84, 0x9a, 0x86, 0xca, 0x2c, 0xe0, 0x01, 0x7b, 0x1b, 0x6a, 0x81, 0x37, 0x11,
0x85, 0x1a, 0x06, 0x72, 0x94, 0x55, 0x09, 0x7a, 0xa8, 0xbc, 0xa2, 0x8b, 0x93, 0x80, 0x5b, 0x23, 0x8a, 0x85, 0x1a, 0x06, 0x72, 0x94, 0x55, 0x08, 0x7a, 0xa8, 0xbc, 0xa2, 0x4b, 0x93, 0x80, 0x5b,
0x27, 0x08, 0x84, 0x78, 0xd6, 0xf7, 0xdc, 0xd0, 0xf7, 0x86, 0xd2, 0xf7, 0xb5, 0x30, 0x09, 0xf8, 0x23, 0x27, 0x08, 0x84, 0x78, 0xd6, 0xf7, 0xdc, 0xd0, 0xf7, 0x86, 0xd2, 0xf7, 0xb5, 0x38, 0x09,
0x1e, 0xa5, 0x6c, 0x52, 0x02, 0xfb, 0x56, 0xdc, 0xa4, 0xb1, 0xed, 0xf8, 0x41, 0x13, 0xb0, 0x49, 0xf8, 0x3e, 0xa5, 0x6c, 0x51, 0x02, 0xfb, 0x56, 0xdc, 0xa4, 0xb1, 0xed, 0xf8, 0x41, 0x03, 0xb0,
0xaa, 0xa7, 0x28, 0xbf, 0xdb, 0x8e, 0x1f, 0xb5, 0x45, 0x7c, 0x04, 0x53, 0x47, 0xb5, 0x2a, 0xd3, 0x49, 0xaa, 0xa7, 0x28, 0xbf, 0xdb, 0x8e, 0x1f, 0xb5, 0x45, 0x7c, 0x04, 0x53, 0x47, 0xb5, 0xca,
0x47, 0xb5, 0x7e, 0x98, 0x7e, 0x54, 0xab, 0x86, 0x45, 0x3f, 0x92, 0x45, 0xcf, 0x4e, 0xf1, 0x57, 0xd3, 0x47, 0xb5, 0x7e, 0x98, 0x7e, 0x54, 0xab, 0x8a, 0x45, 0x3f, 0x96, 0x45, 0xcf, 0x4e, 0xf1,
0x3a, 0xb1, 0x35, 0x7b, 0x02, 0xad, 0xfe, 0x55, 0x4e, 0xa0, 0xcd, 0xa7, 0x9d, 0x40, 0xfb, 0x00, 0x57, 0x3a, 0xb1, 0x35, 0x7b, 0x02, 0xad, 0xf6, 0x55, 0x4e, 0xa0, 0x2d, 0xa4, 0x9d, 0x40, 0x7b,
0x2a, 0x78, 0x36, 0xc8, 0x3a, 0x73, 0x84, 0x0c, 0x47, 0xbe, 0xbc, 0x86, 0x7e, 0x78, 0x68, 0xc7, 0x1f, 0xca, 0x78, 0x36, 0xc8, 0x3a, 0x73, 0x84, 0x0c, 0x47, 0xbe, 0xbc, 0xba, 0x7e, 0x78, 0x68,
0x71, 0x43, 0x13, 0x7c, 0xf5, 0x33, 0x98, 0x3d, 0x0c, 0xb6, 0xf0, 0x73, 0x3c, 0x0c, 0x26, 0xcf, 0xd7, 0x71, 0x43, 0x13, 0x7c, 0xf5, 0x33, 0x98, 0x3d, 0x0c, 0xb6, 0xf8, 0x73, 0x3c, 0x0c, 0x26,
0x30, 0xad, 0x43, 0x49, 0xcd, 0x13, 0x63, 0x90, 0x3f, 0xf1, 0xbd, 0x91, 0xf2, 0x71, 0x88, 0xdf, 0xcf, 0x30, 0x6d, 0x40, 0x51, 0xcd, 0x13, 0x63, 0x90, 0x3f, 0xf1, 0xbd, 0x91, 0xf2, 0x71, 0x88,
0xac, 0x0e, 0xd9, 0xd0, 0x93, 0x99, 0xb3, 0xa1, 0x67, 0xfc, 0x2a, 0x54, 0x34, 0x52, 0x63, 0x6f, 0xdf, 0xac, 0x06, 0xd9, 0xd0, 0x93, 0x99, 0xb3, 0xa1, 0x67, 0xfc, 0x2a, 0x94, 0x35, 0x52, 0x63,
0x92, 0x5d, 0x52, 0xe8, 0x66, 0x52, 0xb6, 0xa4, 0x51, 0x2c, 0x4b, 0x68, 0x67, 0x20, 0xf8, 0xcd, 0x6f, 0x92, 0x5d, 0x52, 0xe8, 0x66, 0x52, 0xb6, 0xa4, 0x51, 0x2c, 0x49, 0x68, 0x7b, 0x20, 0xf8,
0xc0, 0xf1, 0x39, 0x1e, 0xdb, 0xb4, 0x7c, 0x7e, 0xce, 0xfd, 0x40, 0xf9, 0x9c, 0x1a, 0x51, 0x82, 0xcd, 0xc0, 0xf1, 0x39, 0x1e, 0xdb, 0xb4, 0x7c, 0x7e, 0xce, 0xfd, 0x40, 0xf9, 0x9c, 0xea, 0x51,
0x49, 0x70, 0xe3, 0xd7, 0x60, 0x31, 0x31, 0xb7, 0x92, 0x45, 0xbc, 0x0d, 0x73, 0x38, 0x6e, 0x2a, 0x82, 0x49, 0x70, 0xe3, 0xd7, 0x60, 0x29, 0x31, 0xb7, 0x92, 0x45, 0xbc, 0x0d, 0x73, 0x38, 0x6e,
0x26, 0x20, 0x79, 0x28, 0x4b, 0xa6, 0xe1, 0x79, 0x7c, 0x72, 0x97, 0x59, 0x63, 0xdf, 0x3b, 0xc6, 0x2a, 0x26, 0x20, 0x79, 0x28, 0x4b, 0xa6, 0xe1, 0x79, 0x7c, 0x72, 0x97, 0x59, 0x63, 0xdf, 0x3b,
0x4a, 0x32, 0x66, 0x45, 0xc2, 0x0e, 0x7d, 0xef, 0xd8, 0xf8, 0xb3, 0x1c, 0xe4, 0x76, 0xbc, 0xb1, 0xc6, 0x4a, 0x32, 0x66, 0x59, 0xc2, 0x0e, 0x7d, 0xef, 0xd8, 0xf8, 0xb3, 0x1c, 0xe4, 0x76, 0xbd,
0x1e, 0xa3, 0x96, 0x99, 0x89, 0x51, 0x93, 0x0a, 0xa7, 0x15, 0x29, 0x94, 0x52, 0x66, 0x47, 0x47, 0xb1, 0x1e, 0xa3, 0x96, 0x99, 0x89, 0x51, 0x93, 0x0a, 0xa7, 0x15, 0x29, 0x94, 0x52, 0x66, 0x47,
0x91, 0x52, 0x2a, 0xef, 0x43, 0x5d, 0xf0, 0x89, 0xd0, 0x13, 0x1a, 0xfb, 0x85, 0xed, 0x93, 0x40, 0x47, 0x91, 0x52, 0x2a, 0x1f, 0x40, 0x4d, 0xf0, 0x89, 0xd0, 0x13, 0x1a, 0xfb, 0x85, 0xed, 0x93,
0x9c, 0xa3, 0xc5, 0x67, 0x8f, 0xc2, 0x9e, 0xb7, 0x4d, 0x70, 0xb6, 0x04, 0xb9, 0x48, 0x7d, 0xc1, 0x40, 0x9c, 0xa3, 0xc5, 0x67, 0x8f, 0xc2, 0x9e, 0xb7, 0x43, 0x70, 0xb6, 0x0c, 0xb9, 0x48, 0x7d,
0x64, 0xf1, 0xc9, 0x56, 0x60, 0x0e, 0x83, 0x95, 0xaf, 0xa4, 0xd3, 0x5b, 0x7e, 0xb1, 0x6f, 0xc0, 0xc1, 0x64, 0xf1, 0xc9, 0x56, 0x61, 0x0e, 0x83, 0x95, 0xaf, 0xa4, 0xd3, 0x5b, 0x7e, 0xb1, 0x6f,
0x62, 0xb2, 0x5c, 0x62, 0x45, 0x52, 0x36, 0xd2, 0x0b, 0x46, 0x9e, 0x74, 0x13, 0x04, 0x1f, 0x21, 0xc0, 0x52, 0xb2, 0x5c, 0x62, 0x45, 0x52, 0x36, 0xd2, 0x0b, 0x46, 0x9e, 0x74, 0x13, 0x04, 0x1f,
0x1c, 0x19, 0x3b, 0x73, 0xc2, 0x39, 0x26, 0x69, 0x4c, 0xaf, 0x94, 0x60, 0x7a, 0x77, 0xa1, 0x12, 0x21, 0x1c, 0x19, 0x3b, 0x73, 0xc2, 0x39, 0x26, 0x69, 0x4c, 0xaf, 0x98, 0x60, 0x7a, 0x77, 0xa1,
0x0e, 0xcf, 0xad, 0xb1, 0x7d, 0x35, 0xf4, 0xec, 0x81, 0x5c, 0xdf, 0x10, 0x0e, 0xcf, 0x0f, 0x09, 0x1c, 0x0e, 0xcf, 0xad, 0xb1, 0x7d, 0x35, 0xf4, 0xec, 0x81, 0x5c, 0xdf, 0x10, 0x0e, 0xcf, 0x0f,
0xc2, 0x1e, 0x02, 0x8c, 0xc6, 0x63, 0xb9, 0xf6, 0xd0, 0xf9, 0x11, 0x93, 0xf2, 0xde, 0xe1, 0x21, 0x09, 0xc2, 0x1e, 0x01, 0x8c, 0xc6, 0x63, 0xb9, 0xf6, 0xd0, 0xf9, 0x11, 0x93, 0xf2, 0xfe, 0xe1,
0x91, 0x9c, 0x59, 0x1e, 0x8d, 0xc7, 0xf4, 0x93, 0x6d, 0x41, 0x3d, 0xf5, 0x68, 0xe5, 0x1d, 0x15, 0x21, 0x91, 0x9c, 0x59, 0x1a, 0x8d, 0xc7, 0xf4, 0x93, 0x6d, 0x43, 0x2d, 0xf5, 0x68, 0xe5, 0x1d,
0x5b, 0xeb, 0x8d, 0xd7, 0x53, 0x16, 0x67, 0xad, 0xaf, 0xc3, 0xd6, 0xbe, 0x07, 0xec, 0xa7, 0x3c, 0x15, 0x5b, 0xeb, 0x8d, 0x37, 0x52, 0x16, 0x67, 0xb5, 0xaf, 0xc3, 0xd6, 0xbf, 0x07, 0xec, 0xa7,
0xe0, 0xd8, 0x83, 0x72, 0xd4, 0x3e, 0xfd, 0x7c, 0x20, 0x46, 0xcb, 0x57, 0x12, 0xe7, 0x03, 0x5b, 0x3c, 0xe0, 0xd8, 0x83, 0x52, 0xd4, 0x3e, 0xfd, 0x7c, 0x20, 0x46, 0xcb, 0x97, 0x13, 0xe7, 0x03,
0x83, 0x81, 0x2f, 0xf8, 0x22, 0x6d, 0x98, 0x11, 0xcb, 0x07, 0x6d, 0xc7, 0x6c, 0x11, 0xdf, 0x37, 0x9b, 0x83, 0x81, 0x2f, 0xf8, 0x22, 0x6d, 0x98, 0x11, 0xcb, 0x07, 0x6d, 0xc7, 0x6c, 0x12, 0xdf,
0xfe, 0x6b, 0x06, 0x0a, 0x74, 0x58, 0xf1, 0x1d, 0x98, 0x27, 0xfc, 0x28, 0xde, 0x4f, 0xba, 0xca, 0x37, 0xfe, 0x6b, 0x06, 0x0a, 0x74, 0x58, 0xf1, 0x1d, 0x58, 0x20, 0xfc, 0x28, 0xde, 0x4f, 0xba,
0x69, 0xdf, 0xed, 0xc9, 0x50, 0x3f, 0xb1, 0x2c, 0xb4, 0x83, 0xd6, 0xd9, 0x68, 0xe6, 0xb5, 0xc3, 0xca, 0x69, 0xdf, 0xed, 0xc9, 0x50, 0x3f, 0xb1, 0x2c, 0xb4, 0x83, 0xd6, 0xd9, 0x68, 0xe6, 0xb5,
0xd6, 0x77, 0xa1, 0x1c, 0x55, 0xad, 0x91, 0x4e, 0x49, 0xd5, 0xcc, 0xde, 0x80, 0xfc, 0x99, 0x37, 0xc3, 0xd6, 0x77, 0xa1, 0x14, 0x55, 0xad, 0x91, 0x4e, 0x51, 0xd5, 0xcc, 0xde, 0x80, 0xfc, 0x99,
0x56, 0x96, 0x1f, 0x88, 0x47, 0xd2, 0x44, 0x78, 0xdc, 0x16, 0x51, 0x07, 0x35, 0x5e, 0x5a, 0x2c, 0x37, 0x56, 0x96, 0x1f, 0x88, 0x47, 0xd2, 0x44, 0x78, 0xdc, 0x16, 0x51, 0x07, 0x35, 0x5e, 0x5a,
0xa2, 0x4a, 0x90, 0x0c, 0x66, 0xfb, 0x38, 0x97, 0xd2, 0xc7, 0x23, 0x98, 0x17, 0x7c, 0x40, 0x0b, 0x2c, 0xa2, 0x4a, 0x90, 0x0c, 0x66, 0xfb, 0x38, 0x97, 0xd2, 0xc7, 0x23, 0x58, 0x10, 0x7c, 0x40,
0x59, 0xb9, 0x7e, 0xd3, 0x7c, 0x4f, 0x48, 0x78, 0xfd, 0xe1, 0x64, 0xc0, 0x75, 0xdb, 0x1b, 0xc6, 0x0b, 0x59, 0xb9, 0x7e, 0xd3, 0xfc, 0xba, 0x90, 0xf0, 0xfa, 0xc3, 0xc9, 0x80, 0xeb, 0xb6, 0x37,
0xb7, 0x49, 0xb8, 0x92, 0xac, 0x8d, 0xdf, 0xcf, 0x10, 0x7f, 0x11, 0xe5, 0xb2, 0xfb, 0x90, 0x17, 0x8c, 0x6f, 0x93, 0x70, 0x25, 0x59, 0x1b, 0xbf, 0x9f, 0x21, 0xfe, 0x22, 0xca, 0x65, 0x0f, 0x20,
0xfb, 0xdb, 0x94, 0x25, 0x3e, 0x3a, 0xb6, 0x20, 0xf0, 0x4c, 0xc4, 0xc0, 0xdb, 0x09, 0x26, 0xa3, 0x2f, 0xf6, 0xb7, 0x29, 0x4b, 0x7c, 0x74, 0x6c, 0x41, 0xe0, 0x99, 0x88, 0x81, 0xb7, 0x13, 0x4c,
0x64, 0xe9, 0x35, 0xb3, 0xe2, 0x4e, 0x46, 0x91, 0xe9, 0xea, 0x6b, 0xaa, 0x5b, 0x53, 0x66, 0x1f, 0x46, 0xc9, 0xd2, 0xab, 0x66, 0xd9, 0x9d, 0x8c, 0x22, 0xd3, 0xd5, 0xd7, 0x54, 0xb7, 0xa6, 0xcc,
0xea, 0x7d, 0xb4, 0x4c, 0xd7, 0xb5, 0x40, 0xb9, 0x7c, 0x62, 0xc7, 0x54, 0x52, 0xe0, 0xe0, 0x94, 0x3e, 0xd4, 0xfb, 0x68, 0x99, 0x6e, 0x68, 0x81, 0x72, 0xf9, 0xc4, 0x8e, 0xa9, 0xa4, 0xc0, 0xc1,
0x6b, 0x01, 0x72, 0x7f, 0x94, 0x85, 0x5a, 0xa2, 0x45, 0x18, 0x29, 0x28, 0x36, 0x00, 0x72, 0x2c, 0x29, 0xd7, 0x02, 0xe4, 0xfe, 0x28, 0x0b, 0xd5, 0x44, 0x8b, 0x30, 0x52, 0x50, 0x6c, 0x00, 0xe4,
0xc9, 0xf9, 0x06, 0x01, 0x92, 0x82, 0xba, 0x36, 0x4e, 0xd9, 0xc4, 0x38, 0x45, 0xc1, 0x39, 0x39, 0x58, 0x92, 0xf3, 0x0d, 0x02, 0x24, 0x05, 0x75, 0x6d, 0x9c, 0xb2, 0x89, 0x71, 0x8a, 0x82, 0x73,
0x3d, 0x38, 0xe7, 0x11, 0x94, 0xe3, 0x03, 0xf6, 0xc9, 0x26, 0x89, 0xfa, 0xd4, 0xe1, 0x8d, 0x18, 0x72, 0x7a, 0x70, 0xce, 0x63, 0x28, 0xc5, 0x07, 0xec, 0x93, 0x4d, 0x12, 0xf5, 0xa9, 0xc3, 0x1b,
0x29, 0x0e, 0xe7, 0x29, 0xe8, 0xe1, 0x3c, 0xdf, 0xd5, 0xa2, 0x3f, 0xe6, 0xb0, 0x18, 0x23, 0x6d, 0x31, 0x52, 0x1c, 0xce, 0x53, 0xd0, 0xc3, 0x79, 0xbe, 0xab, 0x45, 0x7f, 0xcc, 0x61, 0x31, 0x46,
0x44, 0x7f, 0x2e, 0xb1, 0x1f, 0xc6, 0x27, 0x50, 0xd1, 0x1a, 0xaf, 0x47, 0x79, 0x64, 0x12, 0x51, 0xda, 0x88, 0xfe, 0x5c, 0x62, 0x3f, 0x8c, 0x8f, 0xa1, 0xac, 0x35, 0x5e, 0x8f, 0xf2, 0xc8, 0x24,
0x1e, 0xd1, 0x31, 0xab, 0x6c, 0x7c, 0xcc, 0xca, 0xf8, 0xeb, 0x59, 0xa8, 0x89, 0xf5, 0xe5, 0xb8, 0xa2, 0x3c, 0xa2, 0x63, 0x56, 0xd9, 0xf8, 0x98, 0x95, 0xf1, 0xd7, 0xb3, 0x50, 0x15, 0xeb, 0xcb,
0xa7, 0x87, 0xde, 0xd0, 0xe9, 0xa3, 0xa3, 0x29, 0x5a, 0x61, 0x52, 0xd0, 0x52, 0xeb, 0x4c, 0x2e, 0x71, 0x4f, 0x0f, 0xbd, 0xa1, 0xd3, 0x47, 0x47, 0x53, 0xb4, 0xc2, 0xa4, 0xa0, 0xa5, 0xd6, 0x99,
0x31, 0x92, 0xb3, 0xf4, 0xd3, 0xa4, 0xc4, 0xa4, 0xa3, 0xd3, 0xa4, 0x06, 0xd4, 0x04, 0x63, 0x44, 0x5c, 0x62, 0x24, 0x67, 0xe9, 0xa7, 0x49, 0x89, 0x49, 0x47, 0xa7, 0x49, 0x0d, 0xa8, 0x0a, 0xc6,
0x97, 0x51, 0x7c, 0xfc, 0xdf, 0xac, 0x9c, 0x70, 0xbe, 0x61, 0x07, 0xc4, 0x21, 0xbf, 0x01, 0x8b, 0x88, 0x2e, 0xa3, 0xf8, 0xf8, 0xbf, 0x59, 0x3e, 0xe1, 0x7c, 0xd3, 0x0e, 0x88, 0x43, 0x7e, 0x03,
0x02, 0x07, 0x0f, 0xd2, 0x8d, 0x9c, 0xe1, 0xd0, 0x21, 0x4c, 0x32, 0x34, 0x35, 0x4e, 0x38, 0x37, 0x96, 0x04, 0x0e, 0x1e, 0xa4, 0x1b, 0x39, 0xc3, 0xa1, 0x43, 0x98, 0x64, 0x68, 0xaa, 0x9f, 0x70,
0xed, 0x90, 0xef, 0x89, 0x04, 0x79, 0x5b, 0x40, 0x69, 0xe0, 0x04, 0xf6, 0x71, 0x1c, 0xcf, 0x19, 0x6e, 0xda, 0x21, 0xdf, 0x17, 0x09, 0xf2, 0xb6, 0x80, 0xe2, 0xc0, 0x09, 0xec, 0xe3, 0x38, 0x9e,
0x7d, 0xa3, 0x67, 0xd9, 0xbe, 0xd4, 0x3c, 0xcb, 0x64, 0x80, 0xa8, 0x8c, 0xec, 0xcb, 0xc8, 0xb3, 0x33, 0xfa, 0x46, 0xcf, 0xb2, 0x7d, 0xa9, 0x79, 0x96, 0xc9, 0x00, 0x51, 0x1e, 0xd9, 0x97, 0x91,
0x3c, 0x45, 0x49, 0xc5, 0x69, 0x4a, 0x32, 0xfe, 0x4d, 0x16, 0x2a, 0x1a, 0x59, 0xbe, 0xce, 0xee, 0x67, 0x79, 0x8a, 0x92, 0xe6, 0xa7, 0x29, 0xc9, 0xf8, 0x37, 0x59, 0x28, 0x6b, 0x64, 0xf9, 0x3a,
0x7a, 0x67, 0xc6, 0x31, 0x58, 0xd6, 0x7d, 0x80, 0x6f, 0x25, 0xab, 0xc4, 0xd8, 0x17, 0xba, 0x97, 0xbb, 0xeb, 0x9d, 0x19, 0xc7, 0x60, 0x49, 0xf7, 0x01, 0xbe, 0x95, 0xac, 0x12, 0x63, 0x5f, 0xe8,
0x40, 0x23, 0xe0, 0x5b, 0x50, 0x16, 0xab, 0xee, 0x03, 0x34, 0xc1, 0xca, 0x5b, 0x35, 0x10, 0x70, 0x5e, 0x02, 0x8d, 0x80, 0x6f, 0x41, 0x49, 0xac, 0xba, 0xf7, 0xd1, 0x04, 0x2b, 0x6f, 0xd5, 0x40,
0x38, 0x39, 0x56, 0x89, 0x8f, 0x31, 0xb1, 0x10, 0x27, 0x3e, 0x16, 0x89, 0x2f, 0x8b, 0xb0, 0xfe, 0xc0, 0xe1, 0xe4, 0x58, 0x25, 0x3e, 0xc1, 0xc4, 0x42, 0x9c, 0xf8, 0x44, 0x24, 0xbe, 0x2c, 0xc2,
0x08, 0xaa, 0xb2, 0x54, 0x9c, 0x53, 0xec, 0x6e, 0xbc, 0xea, 0x13, 0xf3, 0x6d, 0x56, 0xa8, 0x3a, 0xfa, 0x43, 0xa8, 0xc8, 0x52, 0x71, 0x4e, 0xb1, 0xbb, 0xf1, 0xaa, 0x4f, 0xcc, 0xb7, 0x59, 0xa6,
0x9a, 0x7c, 0x99, 0xf1, 0xb1, 0xca, 0x58, 0x7a, 0x55, 0xc6, 0xc7, 0xf4, 0x61, 0x6c, 0x47, 0x41, 0xea, 0x68, 0xf2, 0x65, 0xc6, 0x27, 0x2a, 0x63, 0xf1, 0x55, 0x19, 0x9f, 0xd0, 0x87, 0xb1, 0x13,
0xeb, 0x18, 0x77, 0xa5, 0xf8, 0xd8, 0x43, 0x58, 0x54, 0xec, 0x6a, 0xe2, 0xda, 0xae, 0xeb, 0x4d, 0x05, 0xad, 0x63, 0xdc, 0x95, 0xe2, 0x63, 0x8f, 0x60, 0x49, 0xb1, 0xab, 0x89, 0x6b, 0xbb, 0xae,
0xdc, 0x3e, 0x57, 0xe7, 0xaf, 0x98, 0x4c, 0x3a, 0x8a, 0x53, 0x8c, 0x41, 0x74, 0x40, 0x97, 0xe2, 0x37, 0x71, 0xfb, 0x5c, 0x9d, 0xbf, 0x62, 0x32, 0xe9, 0x28, 0x4e, 0x31, 0x06, 0xd1, 0x01, 0x5d,
0xb7, 0x1e, 0x40, 0x81, 0xe4, 0x72, 0x12, 0x3e, 0xd2, 0x19, 0x17, 0xa1, 0xb0, 0xfb, 0x50, 0x20, 0x8a, 0xdf, 0x7a, 0x08, 0x05, 0x92, 0xcb, 0x49, 0xf8, 0x48, 0x67, 0x5c, 0x84, 0xc2, 0x1e, 0x40,
0xf1, 0x3c, 0x7b, 0x2d, 0xb3, 0x21, 0x04, 0xa3, 0x05, 0x4c, 0x64, 0xdc, 0xe3, 0xa1, 0xef, 0xf4, 0x81, 0xc4, 0xf3, 0xec, 0xb5, 0xcc, 0x86, 0x10, 0x8c, 0x26, 0x30, 0x91, 0x71, 0x9f, 0x87, 0xbe,
0x83, 0xf8, 0x68, 0x57, 0x41, 0xe8, 0x9f, 0x54, 0x57, 0x6c, 0xb9, 0x8d, 0x31, 0x51, 0x47, 0x25, 0xd3, 0x0f, 0xe2, 0xa3, 0x5d, 0x05, 0xa1, 0x7f, 0x52, 0x5d, 0xb1, 0xe5, 0x36, 0xc6, 0x44, 0x1d,
0x1c, 0xb1, 0x31, 0x2d, 0x26, 0xca, 0x90, 0xe2, 0xd2, 0x10, 0x56, 0x8e, 0x79, 0x78, 0xc1, 0xb9, 0x95, 0x70, 0xc4, 0xc6, 0xb4, 0x94, 0x28, 0x43, 0x8a, 0x4b, 0x43, 0x58, 0x3d, 0xe6, 0xe1, 0x05,
0xeb, 0x0a, 0x61, 0xa8, 0xcf, 0xdd, 0xd0, 0xb7, 0x87, 0x62, 0x92, 0xa8, 0x07, 0x4f, 0x66, 0x4a, 0xe7, 0xae, 0x2b, 0x84, 0xa1, 0x3e, 0x77, 0x43, 0xdf, 0x1e, 0x8a, 0x49, 0xa2, 0x1e, 0x3c, 0x9d,
0x8d, 0x6d, 0x20, 0x1b, 0x71, 0xc6, 0xcd, 0x28, 0x1f, 0xf1, 0x8e, 0xe5, 0xe3, 0xb4, 0xb4, 0xb5, 0x29, 0x35, 0xb6, 0x81, 0x6c, 0xc6, 0x19, 0xb7, 0xa2, 0x7c, 0xc4, 0x3b, 0x56, 0x8e, 0xd3, 0xd2,
0x5f, 0x81, 0xb5, 0xeb, 0x33, 0xa5, 0x1c, 0xe0, 0xbc, 0x9f, 0xe4, 0x2a, 0x91, 0x1f, 0x70, 0xe8, 0xd6, 0x7f, 0x05, 0xd6, 0xaf, 0xcf, 0x94, 0x72, 0x80, 0xf3, 0x41, 0x92, 0xab, 0x44, 0x7e, 0xc0,
0xd9, 0x21, 0xb5, 0x46, 0xe7, 0x2c, 0xfb, 0x50, 0xd1, 0x52, 0xe2, 0xbd, 0x3f, 0x83, 0xc2, 0x1d, 0xa1, 0x67, 0x87, 0xd4, 0x1a, 0x9d, 0xb3, 0x74, 0xa0, 0xac, 0xa5, 0xc4, 0x7b, 0x7f, 0x06, 0x85,
0x7d, 0x88, 0x1d, 0xc9, 0xf5, 0xfc, 0x11, 0xfa, 0xdd, 0x06, 0x56, 0x5c, 0x7a, 0xc6, 0x9c, 0x8f, 0x3b, 0xfa, 0x10, 0x3b, 0x92, 0xeb, 0xf9, 0x23, 0xf4, 0xbb, 0x0d, 0xac, 0xb8, 0xf4, 0x8c, 0xb9,
0xe1, 0x78, 0x62, 0xdd, 0x58, 0x87, 0x79, 0x94, 0xec, 0xb5, 0x8d, 0xee, 0x65, 0xc2, 0xa0, 0xb1, 0x10, 0xc3, 0xf1, 0xc4, 0xba, 0xb1, 0x01, 0x0b, 0x28, 0xd9, 0x6b, 0x1b, 0xdd, 0xcb, 0x84, 0x41,
0x04, 0x6c, 0x9f, 0x78, 0x97, 0x1e, 0xce, 0xf9, 0x9f, 0x72, 0x50, 0xd1, 0xc0, 0x62, 0x37, 0xc2, 0x63, 0x19, 0x58, 0x87, 0x78, 0x97, 0x1e, 0xce, 0xf9, 0x9f, 0x72, 0x50, 0xd6, 0xc0, 0x62, 0x37,
0x00, 0x40, 0x6b, 0xe0, 0xd8, 0x23, 0xae, 0x9c, 0x9c, 0x35, 0xb3, 0x86, 0xd0, 0x2d, 0x09, 0x14, 0xc2, 0x00, 0x40, 0x6b, 0xe0, 0xd8, 0x23, 0xae, 0x9c, 0x9c, 0x55, 0xb3, 0x8a, 0xd0, 0x6d, 0x09,
0x7b, 0xb1, 0x7d, 0x7e, 0x6a, 0x79, 0x93, 0xd0, 0x1a, 0xf0, 0x53, 0x9f, 0xab, 0x56, 0x56, 0xed, 0x14, 0x7b, 0xb1, 0x7d, 0x7e, 0x6a, 0x79, 0x93, 0xd0, 0x1a, 0xf0, 0x53, 0x9f, 0xab, 0x56, 0x56,
0xf3, 0xd3, 0x83, 0x49, 0xb8, 0x85, 0x30, 0x81, 0x25, 0x78, 0x89, 0x86, 0x25, 0x63, 0xd6, 0x46, 0xec, 0xf3, 0xd3, 0x83, 0x49, 0xb8, 0x8d, 0x30, 0x81, 0x25, 0x78, 0x89, 0x86, 0x25, 0x63, 0xd6,
0xf6, 0x65, 0x8c, 0x25, 0x03, 0x27, 0x89, 0x32, 0xf3, 0x51, 0xe0, 0x24, 0x69, 0x8b, 0xd3, 0x1b, 0x46, 0xf6, 0x65, 0x8c, 0x25, 0x03, 0x27, 0x89, 0x32, 0xf3, 0x51, 0xe0, 0x24, 0x69, 0x8b, 0xd3,
0x68, 0x61, 0x76, 0x03, 0xfd, 0x16, 0xac, 0xd0, 0x06, 0x2a, 0x59, 0xb3, 0x35, 0xb5, 0x92, 0x97, 0x1b, 0x68, 0x61, 0x76, 0x03, 0xfd, 0x16, 0xac, 0xd2, 0x06, 0x2a, 0x59, 0xb3, 0x35, 0xb5, 0x92,
0x30, 0x55, 0x76, 0x52, 0x13, 0x7b, 0x1b, 0xa2, 0x07, 0x8a, 0x2d, 0x05, 0xce, 0x8f, 0x88, 0x91, 0x97, 0x31, 0x55, 0x76, 0x52, 0x13, 0x7b, 0xeb, 0xa2, 0x07, 0x8a, 0x2d, 0x05, 0xce, 0x8f, 0x88,
0x65, 0x4c, 0xd1, 0x33, 0x59, 0x78, 0xd7, 0xf9, 0x11, 0x17, 0x98, 0x18, 0x1d, 0xa3, 0x63, 0xca, 0x91, 0x65, 0x4c, 0xd1, 0x33, 0x59, 0x78, 0xd7, 0xf9, 0x11, 0x17, 0x98, 0x18, 0x1d, 0xa3, 0x63,
0xf3, 0x13, 0x23, 0xc7, 0x9d, 0xc6, 0xb4, 0x2f, 0x93, 0x98, 0x65, 0x89, 0x69, 0x5f, 0xea, 0x98, 0xca, 0xf3, 0x13, 0x23, 0xc7, 0x9d, 0xc6, 0xb4, 0x2f, 0x93, 0x98, 0x25, 0x89, 0x69, 0x5f, 0xea,
0x4f, 0x60, 0x75, 0xc4, 0x07, 0x8e, 0x9d, 0x2c, 0xd6, 0x8a, 0x05, 0xb7, 0x25, 0x4a, 0xd6, 0xf2, 0x98, 0x4f, 0x61, 0x6d, 0xc4, 0x07, 0x8e, 0x9d, 0x2c, 0xd6, 0x8a, 0x05, 0xb7, 0x65, 0x4a, 0xd6,
0x74, 0x49, 0x71, 0x17, 0xa3, 0xf1, 0x23, 0x6f, 0x74, 0xec, 0x90, 0xcc, 0x42, 0xf1, 0x3a, 0x79, 0xf2, 0x74, 0x49, 0x71, 0x17, 0xa3, 0xf1, 0x23, 0x6f, 0x74, 0xec, 0x90, 0xcc, 0x42, 0xf1, 0x3a,
0xb3, 0xee, 0x4e, 0x46, 0x3f, 0x40, 0xb0, 0xc8, 0x12, 0x18, 0x35, 0xa8, 0x74, 0x43, 0x6f, 0xac, 0x79, 0xb3, 0xe6, 0x4e, 0x46, 0x3f, 0x40, 0xb0, 0xc8, 0x12, 0x18, 0x55, 0x28, 0x77, 0x43, 0x6f,
0xa6, 0xb9, 0x0e, 0x55, 0xfa, 0x94, 0x87, 0x1a, 0x6f, 0xc1, 0x4d, 0x64, 0x09, 0x3d, 0x6f, 0xec, 0xac, 0xa6, 0xb9, 0x06, 0x15, 0xfa, 0x94, 0x87, 0x1a, 0x6f, 0xc1, 0x4d, 0x64, 0x09, 0x3d, 0x6f,
0x0d, 0xbd, 0xd3, 0xab, 0x84, 0x1d, 0xef, 0xdf, 0x65, 0x60, 0x31, 0x91, 0x2a, 0xd9, 0xeb, 0xb7, 0xec, 0x0d, 0xbd, 0xd3, 0xab, 0x84, 0x1d, 0xef, 0xdf, 0x65, 0x60, 0x29, 0x91, 0x2a, 0xd9, 0xeb,
0x88, 0x9f, 0x45, 0x27, 0xd3, 0x68, 0x0d, 0x2e, 0x68, 0x6b, 0x90, 0x10, 0x89, 0x99, 0xa9, 0xd3, 0xb7, 0x88, 0x9f, 0x45, 0x27, 0xd3, 0x68, 0x0d, 0x2e, 0x6a, 0x6b, 0x90, 0x10, 0x89, 0x99, 0xa9,
0x6a, 0xad, 0xf8, 0x46, 0x05, 0x95, 0x91, 0x58, 0x4a, 0x73, 0x96, 0xa5, 0xc8, 0xfc, 0xea, 0xae, 0xd3, 0x6a, 0xcd, 0xf8, 0x46, 0x05, 0x95, 0x91, 0x58, 0x4a, 0x63, 0x96, 0xa5, 0xc8, 0xfc, 0xea,
0x05, 0x55, 0xc4, 0x2f, 0xc8, 0x33, 0x2e, 0x03, 0xd9, 0xe5, 0x5c, 0xf2, 0xa0, 0x80, 0x6e, 0xf3, 0xae, 0x05, 0x55, 0xc4, 0x2f, 0xc8, 0x33, 0x2e, 0x03, 0xd9, 0xe5, 0x5c, 0xf2, 0xa0, 0x80, 0x6e,
0x53, 0x2d, 0x88, 0x0d, 0x81, 0x81, 0xf1, 0x4f, 0x32, 0x00, 0x71, 0xeb, 0xf0, 0xa8, 0x42, 0x24, 0xf3, 0x53, 0x2d, 0x88, 0x0d, 0x81, 0x81, 0xf1, 0x4f, 0x32, 0x00, 0x71, 0xeb, 0xf0, 0xa8, 0x42,
0xb7, 0xd0, 0x65, 0x65, 0x9a, 0x8c, 0xf2, 0x26, 0x54, 0xa3, 0x88, 0xe5, 0x58, 0x12, 0xaa, 0x28, 0x24, 0xb7, 0xd0, 0x65, 0x65, 0x9a, 0x8c, 0xf2, 0x26, 0x54, 0xa2, 0x88, 0xe5, 0x58, 0x12, 0x2a,
0x98, 0x10, 0x87, 0xde, 0x85, 0xf9, 0xd3, 0xa1, 0x77, 0x8c, 0x12, 0xab, 0x94, 0x5b, 0x28, 0x5e, 0x2b, 0x98, 0x10, 0x87, 0xee, 0xc3, 0xc2, 0xe9, 0xd0, 0x3b, 0x46, 0x89, 0x55, 0xca, 0x2d, 0x14,
0xad, 0x4e, 0x60, 0x25, 0x8d, 0xc4, 0x72, 0x53, 0x3e, 0x35, 0xa8, 0x59, 0x97, 0x82, 0x8c, 0xdf, 0xaf, 0x56, 0x23, 0xb0, 0x92, 0x46, 0x62, 0xb9, 0x29, 0x9f, 0x1a, 0xd4, 0xac, 0x4b, 0x41, 0xc6,
0xcc, 0x46, 0xa1, 0x9b, 0xf1, 0x48, 0xbc, 0x5c, 0xbd, 0xfb, 0x49, 0x62, 0x69, 0x5e, 0xe6, 0x5e, 0x6f, 0x66, 0xa3, 0xd0, 0xcd, 0x78, 0x24, 0x5e, 0xae, 0xde, 0xfd, 0x24, 0xb1, 0x34, 0x2f, 0x73,
0xfc, 0x04, 0xea, 0x3e, 0x6d, 0x4a, 0x6a, 0xc7, 0xca, 0xbf, 0x64, 0xc7, 0xaa, 0xf9, 0x09, 0x49, 0x2f, 0x7e, 0x0c, 0x35, 0x9f, 0x36, 0x25, 0xb5, 0x63, 0xe5, 0x5f, 0xb2, 0x63, 0x55, 0xfd, 0x84,
0xe7, 0x3d, 0x68, 0xd8, 0x83, 0x73, 0xee, 0x87, 0x0e, 0x5a, 0xeb, 0x51, 0x3e, 0x96, 0xc1, 0x92, 0xa4, 0xf3, 0x75, 0xa8, 0xdb, 0x83, 0x73, 0xee, 0x87, 0x0e, 0x5a, 0xeb, 0x51, 0x3e, 0x96, 0xc1,
0x1a, 0x1c, 0x05, 0xd1, 0x77, 0x61, 0x5e, 0x1e, 0xb4, 0x8d, 0x30, 0xe5, 0xd5, 0x3d, 0x31, 0x58, 0x92, 0x1a, 0x1c, 0x05, 0xd1, 0xfb, 0xb0, 0x20, 0x0f, 0xda, 0x46, 0x98, 0xf2, 0xea, 0x9e, 0x18,
0x20, 0x1a, 0xff, 0x5c, 0xc5, 0x8a, 0x26, 0x67, 0xf7, 0xe5, 0xa3, 0xa2, 0xf7, 0x30, 0x3b, 0xeb, 0x2c, 0x10, 0x8d, 0x7f, 0xae, 0x62, 0x45, 0x93, 0xb3, 0xfb, 0xf2, 0x51, 0xd1, 0x7b, 0x98, 0x9d,
0x40, 0x95, 0x84, 0x24, 0x9d, 0x00, 0x92, 0x1f, 0x11, 0x50, 0xba, 0x00, 0x92, 0xc3, 0x9a, 0x7f, 0x75, 0xa0, 0x4a, 0x42, 0x92, 0x4e, 0x00, 0xc9, 0x8f, 0x08, 0x28, 0x5d, 0x00, 0xc9, 0x61, 0xcd,
0x9d, 0x61, 0x35, 0xfe, 0x43, 0x06, 0x8a, 0x3b, 0xde, 0x78, 0xc7, 0xa1, 0x60, 0x7d, 0x5c, 0x26, 0xbf, 0xce, 0xb0, 0x1a, 0xff, 0x21, 0x03, 0xf3, 0xbb, 0xde, 0x78, 0xd7, 0xa1, 0x60, 0x7d, 0x5c,
0x91, 0x8f, 0x6a, 0x4e, 0x7c, 0x62, 0xe0, 0xcf, 0x4b, 0xce, 0x93, 0xa5, 0x8a, 0x79, 0xb5, 0xa4, 0x26, 0x91, 0x8f, 0x6a, 0x4e, 0x7c, 0x62, 0xe0, 0xcf, 0x4b, 0xce, 0x93, 0xa5, 0x8a, 0x79, 0xd5,
0x98, 0xf7, 0x5d, 0xb8, 0x85, 0x2e, 0x40, 0xdf, 0x1b, 0x7b, 0xbe, 0x58, 0xaa, 0xf6, 0x90, 0xc4, 0xa4, 0x98, 0xf7, 0x5d, 0xb8, 0x85, 0x2e, 0x40, 0xdf, 0x1b, 0x7b, 0xbe, 0x58, 0xaa, 0xf6, 0x90,
0x3d, 0xcf, 0x0d, 0xcf, 0x14, 0xef, 0xbc, 0x79, 0xc2, 0xf9, 0xa1, 0x86, 0xb1, 0x17, 0x21, 0xe0, 0xc4, 0x3d, 0xcf, 0x0d, 0xcf, 0x14, 0xef, 0xbc, 0x79, 0xc2, 0xf9, 0xa1, 0x86, 0xb1, 0x1f, 0x21,
0x89, 0xcd, 0x61, 0x78, 0x6e, 0x91, 0x86, 0x2e, 0xe5, 0x51, 0xe2, 0xa8, 0xf3, 0x22, 0xa1, 0x8d, 0xe0, 0x89, 0xcd, 0x61, 0x78, 0x6e, 0x91, 0x86, 0x2e, 0xe5, 0x51, 0xe2, 0xa8, 0x0b, 0x22, 0xa1,
0x70, 0x94, 0x48, 0x8d, 0x6f, 0x43, 0x39, 0x32, 0xf6, 0xb0, 0xf7, 0xa1, 0x7c, 0xe6, 0x8d, 0xa5, 0x85, 0x70, 0x94, 0x48, 0x8d, 0x6f, 0x43, 0x29, 0x32, 0xf6, 0xb0, 0x77, 0xa1, 0x74, 0xe6, 0x8d,
0x45, 0x28, 0x93, 0x38, 0x73, 0x27, 0x7b, 0x6d, 0x96, 0xce, 0xe8, 0x47, 0x60, 0xfc, 0x59, 0x11, 0xa5, 0x45, 0x28, 0x93, 0x38, 0x73, 0x27, 0x7b, 0x6d, 0x16, 0xcf, 0xe8, 0x47, 0x60, 0xfc, 0xd9,
0x8a, 0x1d, 0xf7, 0xdc, 0x73, 0xfa, 0x18, 0x6d, 0x3a, 0xe2, 0x23, 0x4f, 0x9d, 0xf6, 0x17, 0xbf, 0x3c, 0xcc, 0xb7, 0xdd, 0x73, 0xcf, 0xe9, 0x63, 0xb4, 0xe9, 0x88, 0x8f, 0x3c, 0x75, 0xda, 0x5f,
0x31, 0x36, 0x2b, 0xbe, 0x80, 0x27, 0x27, 0x63, 0xb3, 0xa2, 0xab, 0x77, 0x96, 0x61, 0xce, 0xd7, 0xfc, 0xc6, 0xd8, 0xac, 0xf8, 0x02, 0x9e, 0x9c, 0x8c, 0xcd, 0x8a, 0xae, 0xde, 0x59, 0x81, 0x39,
0x6f, 0xd0, 0x29, 0xf8, 0x18, 0xff, 0x1e, 0xed, 0x97, 0x05, 0xed, 0xb6, 0x04, 0x51, 0x16, 0xdd, 0x5f, 0xbf, 0x41, 0xa7, 0xe0, 0x63, 0xfc, 0x7b, 0xb4, 0x5f, 0x16, 0xb4, 0xdb, 0x12, 0x44, 0x59,
0xec, 0x82, 0x43, 0x46, 0xa7, 0x2f, 0xcb, 0x08, 0xc1, 0x01, 0xbb, 0x0d, 0x45, 0x79, 0xc4, 0x8d, 0x74, 0xb3, 0x0b, 0x0e, 0x19, 0x9d, 0xbe, 0x2c, 0x21, 0x04, 0x07, 0xec, 0x36, 0xcc, 0xcb, 0x23,
0xce, 0x24, 0x51, 0xc0, 0xba, 0x04, 0x21, 0x35, 0xf8, 0x9c, 0x5c, 0xb8, 0x91, 0x20, 0x9b, 0x33, 0x6e, 0x74, 0x26, 0x89, 0x02, 0xd6, 0x25, 0x08, 0xa9, 0xc1, 0xe7, 0xe4, 0xc2, 0x8d, 0x04, 0xd9,
0xab, 0x0a, 0xb8, 0x25, 0x68, 0xed, 0x2e, 0x54, 0x08, 0x9f, 0x50, 0x4a, 0x32, 0x48, 0x13, 0x41, 0x9c, 0x59, 0x51, 0xc0, 0x6d, 0x41, 0x6b, 0x77, 0xa1, 0x4c, 0xf8, 0x84, 0x52, 0x94, 0x41, 0x9a,
0x88, 0x90, 0x72, 0x11, 0x55, 0x39, 0xf5, 0x22, 0x2a, 0x0c, 0x27, 0x8e, 0xb8, 0x2c, 0x75, 0x11, 0x08, 0x42, 0x84, 0x94, 0x8b, 0xa8, 0x4a, 0xa9, 0x17, 0x51, 0x61, 0x38, 0x71, 0xc4, 0x65, 0xa9,
0xe8, 0xfa, 0x21, 0x0d, 0xae, 0x6e, 0x61, 0x93, 0x36, 0x15, 0x3a, 0x8c, 0xac, 0x6c, 0x2a, 0x6f, 0x8b, 0x40, 0xd7, 0x0f, 0x69, 0x70, 0x75, 0x0b, 0x9b, 0xb4, 0xa9, 0xd0, 0x61, 0x64, 0x65, 0x53,
0x41, 0xed, 0xc4, 0x1e, 0x0e, 0x8f, 0xed, 0xfe, 0x0b, 0x32, 0x05, 0x54, 0xc9, 0xfa, 0xa9, 0x80, 0x79, 0x0b, 0xaa, 0x27, 0xf6, 0x70, 0x78, 0x6c, 0xf7, 0x5f, 0x90, 0x29, 0xa0, 0x42, 0xd6, 0x4f,
0x68, 0x0b, 0xb8, 0x0b, 0x15, 0x6d, 0x96, 0x31, 0x02, 0x33, 0x6f, 0x42, 0x3c, 0xbf, 0xd3, 0x16, 0x05, 0x44, 0x5b, 0xc0, 0x5d, 0x28, 0x6b, 0xb3, 0x8c, 0x11, 0x98, 0x79, 0x13, 0xe2, 0xf9, 0x9d,
0xbe, 0xfa, 0x6b, 0x58, 0xf8, 0xb4, 0x48, 0xd4, 0xf9, 0x64, 0x24, 0xea, 0x2d, 0xe4, 0xa6, 0x32, 0xb6, 0xf0, 0xd5, 0x5e, 0xc3, 0xc2, 0xa7, 0x45, 0xa2, 0x2e, 0x24, 0x23, 0x51, 0x6f, 0x21, 0x37,
0xe4, 0xb0, 0x41, 0x77, 0xdd, 0xd8, 0x83, 0x01, 0x86, 0x1c, 0xd2, 0xc5, 0x92, 0x38, 0x78, 0x94, 0x95, 0x21, 0x87, 0x75, 0xba, 0xeb, 0xc6, 0x1e, 0x0c, 0x30, 0xe4, 0x90, 0x2e, 0x96, 0xc4, 0xc1,
0xbe, 0x40, 0xba, 0x04, 0xc1, 0x08, 0xe5, 0x0e, 0x99, 0xa9, 0xc7, 0xb6, 0x33, 0xc0, 0x43, 0x07, 0xa3, 0xf4, 0x45, 0xd2, 0x25, 0x08, 0x46, 0x28, 0x77, 0xc8, 0x4c, 0x3d, 0xb6, 0x9d, 0x01, 0x1e,
0x64, 0x3d, 0x28, 0xda, 0xa3, 0xf0, 0xd0, 0x76, 0x06, 0xec, 0x1e, 0x54, 0x55, 0x32, 0xee, 0x8e, 0x3a, 0x20, 0xeb, 0xc1, 0xbc, 0x3d, 0x0a, 0x0f, 0x6d, 0x67, 0xc0, 0xee, 0x41, 0x45, 0x25, 0xe3,
0x8b, 0x34, 0xfe, 0x32, 0x59, 0xec, 0x89, 0x06, 0xd4, 0x22, 0x8c, 0x51, 0x7c, 0xa2, 0xb8, 0x22, 0xee, 0xb8, 0x44, 0xe3, 0x2f, 0x93, 0xc5, 0x9e, 0x68, 0x40, 0x35, 0xc2, 0x18, 0xc5, 0x27, 0x8a,
0x51, 0x90, 0x0e, 0x3e, 0xc0, 0x28, 0x9f, 0x90, 0xe3, 0xb9, 0xe1, 0xfa, 0xe3, 0x5b, 0x51, 0xf0, 0xcb, 0x12, 0x05, 0xe9, 0xe0, 0x7d, 0x8c, 0xf2, 0x09, 0x39, 0x9e, 0x1b, 0xae, 0x3d, 0xb9, 0x15,
0x01, 0x52, 0xa9, 0xfa, 0x4f, 0xce, 0x31, 0xc2, 0x14, 0xc2, 0x1d, 0xf9, 0xe8, 0x56, 0x12, 0xf2, 0x05, 0x1f, 0x20, 0x95, 0xaa, 0xff, 0xe4, 0x1c, 0x23, 0x4c, 0x21, 0xdc, 0x91, 0x8f, 0x6e, 0x35,
0xaf, 0x44, 0x45, 0x1f, 0x1d, 0x21, 0xb0, 0x6f, 0x6b, 0xfa, 0x6b, 0x13, 0x91, 0x6f, 0x4f, 0x95, 0x21, 0xff, 0x4a, 0x54, 0xf4, 0xd1, 0x11, 0x02, 0xfb, 0xb6, 0xa6, 0xbf, 0x36, 0x10, 0xf9, 0xf6,
0x7f, 0xdd, 0x99, 0xab, 0x3b, 0x00, 0x4e, 0x20, 0x76, 0x99, 0x80, 0xbb, 0x03, 0x3c, 0x02, 0x5c, 0x54, 0xf9, 0xd7, 0x9d, 0xb9, 0xba, 0x03, 0xe0, 0x04, 0x62, 0x97, 0x09, 0xb8, 0x3b, 0xc0, 0x23,
0x32, 0xcb, 0x4e, 0xf0, 0x8c, 0x00, 0x3f, 0x5b, 0xc5, 0xb6, 0x05, 0x55, 0xbd, 0x9b, 0xac, 0x04, 0xc0, 0x45, 0xb3, 0xe4, 0x04, 0xcf, 0x09, 0xf0, 0xb3, 0x55, 0x6c, 0x9b, 0x50, 0xd1, 0xbb, 0xc9,
0xf9, 0x83, 0xc3, 0xf6, 0x7e, 0xe3, 0x06, 0xab, 0x40, 0xb1, 0xdb, 0xee, 0xf5, 0x76, 0xd1, 0xd3, 0x8a, 0x90, 0x3f, 0x38, 0x6c, 0x75, 0xea, 0x37, 0x58, 0x19, 0xe6, 0xbb, 0xad, 0x5e, 0x6f, 0x0f,
0x57, 0x85, 0x52, 0x74, 0x4e, 0x31, 0x2b, 0xbe, 0x5a, 0x9b, 0x9b, 0xed, 0xc3, 0x5e, 0x7b, 0xab, 0x3d, 0x7d, 0x15, 0x28, 0x46, 0xe7, 0x14, 0xb3, 0xe2, 0xab, 0xb9, 0xb5, 0xd5, 0x3a, 0xec, 0xb5,
0x91, 0xfb, 0x7e, 0xbe, 0x94, 0x6d, 0xe4, 0x8c, 0x3f, 0xcf, 0x41, 0x45, 0x1b, 0x85, 0x97, 0x33, 0xb6, 0xeb, 0xb9, 0xef, 0xe7, 0x8b, 0xd9, 0x7a, 0xce, 0xf8, 0xf3, 0x1c, 0x94, 0xb5, 0x51, 0x78,
0xe3, 0x3b, 0x00, 0xa8, 0x49, 0xc6, 0x11, 0xa9, 0x79, 0xb3, 0x2c, 0x20, 0x34, 0xf9, 0xba, 0x8f, 0x39, 0x33, 0xbe, 0x03, 0x80, 0x9a, 0x64, 0x1c, 0x91, 0x9a, 0x37, 0x4b, 0x02, 0x42, 0x93, 0xaf,
0x22, 0x47, 0x97, 0x28, 0x29, 0x1f, 0xc5, 0x5b, 0x50, 0xa3, 0xfb, 0x88, 0x74, 0x7f, 0x6d, 0xc1, 0xfb, 0x28, 0x72, 0x74, 0x89, 0x92, 0xf2, 0x51, 0xbc, 0x05, 0x55, 0xba, 0x8f, 0x48, 0xf7, 0xd7,
0xac, 0x12, 0x50, 0xb2, 0x6a, 0x3c, 0xc0, 0x8c, 0x48, 0x78, 0x7a, 0x4e, 0xde, 0x4e, 0x42, 0x20, 0x16, 0xcc, 0x0a, 0x01, 0x25, 0xab, 0xc6, 0x03, 0xcc, 0x88, 0x84, 0xa7, 0xe7, 0xe4, 0xed, 0x24,
0x3c, 0x3f, 0x87, 0x87, 0x1f, 0x03, 0x6f, 0x78, 0xce, 0x09, 0x83, 0x24, 0xc2, 0x8a, 0x84, 0xf5, 0x04, 0xc2, 0xf3, 0x73, 0x78, 0xf8, 0x31, 0xf0, 0x86, 0xe7, 0x9c, 0x30, 0x48, 0x22, 0x2c, 0x4b,
0xe4, 0x51, 0x6c, 0xc9, 0x0f, 0xb5, 0x13, 0xb4, 0x05, 0xb3, 0x4a, 0x40, 0x59, 0xd1, 0x37, 0x14, 0x58, 0x4f, 0x1e, 0xc5, 0x96, 0xfc, 0x50, 0x3b, 0x41, 0x5b, 0x30, 0x2b, 0x04, 0x94, 0x15, 0x7d,
0x01, 0x51, 0xf4, 0xca, 0xea, 0x2c, 0x35, 0x24, 0x88, 0x67, 0x77, 0xc6, 0x8c, 0x58, 0x46, 0xc2, 0x43, 0x11, 0x10, 0x45, 0xaf, 0xac, 0xcd, 0x52, 0x43, 0x82, 0x78, 0xf6, 0x66, 0xcc, 0x88, 0x25,
0xf8, 0xda, 0x6c, 0xbe, 0x57, 0x9b, 0x13, 0xd9, 0xfb, 0xc0, 0x46, 0xe3, 0xb1, 0x95, 0x62, 0xe0, 0x24, 0x8c, 0xaf, 0xcd, 0xe6, 0x7b, 0xb5, 0x39, 0x91, 0xbd, 0x0b, 0x6c, 0x34, 0x1e, 0x5b, 0x29,
0xcb, 0x9b, 0xf3, 0xa3, 0xf1, 0xb8, 0xa7, 0xd9, 0xbf, 0x7e, 0x06, 0xb6, 0xc7, 0x2f, 0x80, 0xb5, 0x06, 0xbe, 0xbc, 0xb9, 0x30, 0x1a, 0x8f, 0x7b, 0x9a, 0xfd, 0xeb, 0x67, 0x60, 0x7b, 0xfc, 0x02,
0xc4, 0x02, 0xc6, 0x26, 0x46, 0xaa, 0x58, 0xcc, 0x96, 0x33, 0x3a, 0x5b, 0x4e, 0xe1, 0x7e, 0xd9, 0x58, 0x53, 0x2c, 0x60, 0x6c, 0x62, 0xa4, 0x8a, 0xc5, 0x6c, 0x39, 0xa3, 0xb3, 0xe5, 0x14, 0xee,
0x54, 0xee, 0xf7, 0x32, 0x3e, 0x61, 0x6c, 0x43, 0xe5, 0x50, 0xbb, 0xed, 0xec, 0x9e, 0xd8, 0x21, 0x97, 0x4d, 0xe5, 0x7e, 0x2f, 0xe3, 0x13, 0xc6, 0x0e, 0x94, 0x0f, 0xb5, 0xdb, 0xce, 0xee, 0x89,
0xd4, 0x3d, 0x67, 0xb4, 0x77, 0x90, 0x4d, 0xd1, 0x97, 0xd7, 0x9b, 0x69, 0xad, 0xc9, 0x6a, 0xad, 0x1d, 0x42, 0xdd, 0x73, 0x46, 0x7b, 0x07, 0xd9, 0x14, 0x7d, 0x79, 0xbd, 0x99, 0xd6, 0x9a, 0xac,
0x31, 0xfe, 0x51, 0x86, 0x6e, 0x92, 0x89, 0x1a, 0x1f, 0x5f, 0xb0, 0xa6, 0xdc, 0x6f, 0xf1, 0x41, 0xd6, 0x1a, 0xe3, 0x1f, 0x65, 0xe8, 0x26, 0x99, 0xa8, 0xf1, 0xf1, 0x05, 0x6b, 0xca, 0xfd, 0x16,
0xf7, 0x8a, 0x72, 0xbb, 0xc9, 0x33, 0xea, 0xd8, 0x34, 0xcb, 0x3b, 0x39, 0x09, 0xb8, 0x8a, 0xf1, 0x1f, 0x74, 0x2f, 0x2b, 0xb7, 0x9b, 0x3c, 0xa3, 0x8e, 0x4d, 0xb3, 0xbc, 0x93, 0x93, 0x80, 0xab,
0xa8, 0x20, 0xec, 0x00, 0x41, 0x4a, 0xf8, 0x16, 0x12, 0xbe, 0x43, 0xe5, 0x07, 0x32, 0xb0, 0x43, 0x18, 0x8f, 0x32, 0xc2, 0x0e, 0x10, 0xa4, 0x84, 0x6f, 0x21, 0xe1, 0x3b, 0x54, 0x7e, 0x20, 0x03,
0x08, 0xdf, 0x7b, 0xf6, 0xa5, 0xac, 0x35, 0x10, 0x22, 0x88, 0xf4, 0x0f, 0xa8, 0xb3, 0xb0, 0xd1, 0x3b, 0x84, 0xf0, 0xbd, 0x6f, 0x5f, 0xca, 0x5a, 0x03, 0x21, 0x82, 0x48, 0xff, 0x80, 0x3a, 0x0b,
0xb7, 0xf1, 0x0f, 0xe4, 0x59, 0xfc, 0xe9, 0xf1, 0x7d, 0x00, 0xa5, 0xa8, 0xd4, 0xe4, 0x0e, 0xab, 0x1b, 0x7d, 0x1b, 0xff, 0x40, 0x9e, 0xc5, 0x9f, 0x1e, 0xdf, 0x87, 0x50, 0x8c, 0x4a, 0x4d, 0xee,
0x30, 0xa3, 0x74, 0xb1, 0x8f, 0xa3, 0x31, 0x24, 0xd1, 0x62, 0x5a, 0x5c, 0xe8, 0xe3, 0xe9, 0x68, 0xb0, 0x0a, 0x33, 0x4a, 0x17, 0xfb, 0x38, 0x1a, 0x43, 0x12, 0x2d, 0xa6, 0xc5, 0x85, 0x3e, 0x9e,
0xad, 0xfe, 0x3a, 0xb0, 0x13, 0xc7, 0x9f, 0x46, 0xa6, 0xc5, 0xd6, 0xc0, 0x14, 0x0d, 0xdb, 0x38, 0xb6, 0xd6, 0xea, 0xf7, 0x80, 0x9d, 0x38, 0xfe, 0x34, 0x32, 0x2d, 0xb6, 0x3a, 0xa6, 0x68, 0xd8,
0x82, 0x45, 0xc5, 0x25, 0x34, 0x8d, 0x20, 0x39, 0x79, 0x99, 0x57, 0x30, 0xf9, 0xec, 0x0c, 0x93, 0xc6, 0x11, 0x2c, 0x29, 0x2e, 0xa1, 0x69, 0x04, 0xc9, 0xc9, 0xcb, 0xbc, 0x82, 0xc9, 0x67, 0x67,
0x37, 0xfe, 0x73, 0x1e, 0x8a, 0xea, 0xe6, 0xc0, 0xb4, 0xdb, 0xee, 0xca, 0xc9, 0xdb, 0xee, 0x9a, 0x98, 0xbc, 0xf1, 0x3b, 0x05, 0x98, 0x57, 0x37, 0x07, 0xa6, 0xdd, 0x76, 0x57, 0x4a, 0xde, 0x76,
0x89, 0x9b, 0x91, 0x70, 0xea, 0xe5, 0x7e, 0xff, 0xee, 0xf4, 0x96, 0xad, 0xf9, 0x2a, 0x12, 0xdb, 0xd7, 0x48, 0xdc, 0x8c, 0x84, 0x53, 0x2f, 0xf7, 0xfb, 0xfb, 0xd3, 0x5b, 0xb6, 0xe6, 0xab, 0x48,
0xf6, 0x0a, 0xe4, 0xc7, 0x76, 0x78, 0x86, 0x76, 0x49, 0x22, 0x1e, 0xfc, 0x56, 0x3e, 0x8c, 0x42, 0x6c, 0xdb, 0xab, 0x90, 0x1f, 0xdb, 0xe1, 0x19, 0xda, 0x25, 0x89, 0x78, 0xf0, 0x5b, 0xf9, 0x30,
0xd2, 0x87, 0x91, 0x76, 0x33, 0x20, 0x89, 0xa4, 0x33, 0x37, 0x03, 0xde, 0x02, 0x92, 0x2f, 0xb4, 0x0a, 0x49, 0x1f, 0x46, 0xda, 0xcd, 0x80, 0x24, 0x92, 0xce, 0xdc, 0x0c, 0x78, 0x0b, 0x48, 0xbe,
0xa0, 0xb7, 0x12, 0x02, 0xc4, 0x5e, 0x94, 0x14, 0x47, 0x4a, 0xd3, 0xe2, 0xc8, 0x6b, 0x8b, 0x0a, 0xd0, 0x82, 0xde, 0x8a, 0x08, 0x10, 0x7b, 0x51, 0x52, 0x1c, 0x29, 0x4e, 0x8b, 0x23, 0xaf, 0x2d,
0xdf, 0x82, 0x39, 0xba, 0x55, 0x43, 0x9e, 0xf9, 0x55, 0x1b, 0x8a, 0x1c, 0x43, 0xf5, 0x9f, 0x4e, 0x2a, 0x7c, 0x0b, 0xe6, 0xe8, 0x56, 0x0d, 0x79, 0xe6, 0x57, 0x6d, 0x28, 0x72, 0x0c, 0xd5, 0x7f,
0x42, 0x98, 0x12, 0x57, 0xbf, 0x66, 0xab, 0x92, 0xb8, 0x66, 0x4b, 0xf7, 0xad, 0x54, 0x93, 0xbe, 0x3a, 0x09, 0x61, 0x4a, 0x5c, 0xfd, 0x9a, 0xad, 0x72, 0xe2, 0x9a, 0x2d, 0xdd, 0xb7, 0x52, 0x49,
0x95, 0xfb, 0xd0, 0x88, 0x06, 0x14, 0x2d, 0x95, 0x6e, 0x20, 0x4f, 0x14, 0xd6, 0x15, 0x5c, 0x70, 0xfa, 0x56, 0x1e, 0x40, 0x3d, 0x1a, 0x50, 0xb4, 0x54, 0xba, 0x81, 0x3c, 0x51, 0x58, 0x53, 0x70,
0xc9, 0xfd, 0x20, 0xde, 0x10, 0xeb, 0x89, 0x0d, 0x51, 0xf0, 0xb0, 0x56, 0x18, 0xf2, 0xd1, 0x38, 0xc1, 0x25, 0x3b, 0x41, 0xbc, 0x21, 0xd6, 0x12, 0x1b, 0xa2, 0xe0, 0x61, 0xcd, 0x30, 0xe4, 0xa3,
0x54, 0x1b, 0xa2, 0x76, 0x19, 0x23, 0x51, 0xc4, 0x3c, 0x52, 0x84, 0x9a, 0x76, 0xb5, 0xe4, 0x6b, 0x71, 0xa8, 0x36, 0x44, 0xed, 0x32, 0x46, 0xa2, 0x88, 0x05, 0xa4, 0x08, 0x35, 0xed, 0x44, 0x35,
0x89, 0x5e, 0x88, 0x6d, 0x48, 0x1e, 0xfb, 0xa5, 0xf8, 0x93, 0xce, 0xbe, 0xb5, 0xbd, 0xdb, 0x79, 0x9b, 0x50, 0x3b, 0xb1, 0x9d, 0xe1, 0xc4, 0xe7, 0x96, 0xcf, 0xed, 0xc0, 0x73, 0x91, 0x29, 0xc4,
0xba, 0xd3, 0x6b, 0x64, 0xc4, 0x67, 0xf7, 0x68, 0x73, 0xb3, 0xdd, 0xde, 0xc2, 0x6d, 0x09, 0x60, 0x7b, 0xb3, 0xec, 0xe2, 0x0e, 0xe1, 0x98, 0x88, 0x62, 0x56, 0x4f, 0xf4, 0x4f, 0x3c, 0xdc, 0xa4,
0x6e, 0xbb, 0xd5, 0x11, 0x5b, 0x54, 0xce, 0xf8, 0xed, 0x2c, 0x54, 0xb4, 0x36, 0xb0, 0x27, 0xd1, 0x8f, 0x84, 0xd8, 0xca, 0xe4, 0xd1, 0x61, 0x8a, 0x61, 0x69, 0x77, 0xac, 0x9d, 0xbd, 0xf6, 0xb3,
0xd0, 0xd1, 0x75, 0x4d, 0x77, 0x66, 0xdb, 0xb9, 0xae, 0xf8, 0xb5, 0x36, 0x76, 0xd1, 0x65, 0x89, 0xdd, 0x5e, 0x3d, 0x23, 0x3e, 0xbb, 0x47, 0x5b, 0x5b, 0xad, 0xd6, 0x36, 0x6e, 0x6d, 0x00, 0x73,
0xd9, 0x6b, 0x2f, 0x4b, 0x64, 0xef, 0xc0, 0xbc, 0x4d, 0x25, 0x44, 0x43, 0x25, 0x4d, 0xf5, 0x12, 0x3b, 0xcd, 0xb6, 0xd8, 0xe6, 0x72, 0xc6, 0x6f, 0x67, 0xa1, 0xac, 0xf5, 0x83, 0x3d, 0x8d, 0x86,
0x2c, 0x47, 0x0a, 0xe3, 0x41, 0xe3, 0x4d, 0x47, 0xe0, 0xe5, 0x55, 0x08, 0x66, 0xb4, 0xef, 0xe0, 0x9f, 0xae, 0x7c, 0xba, 0x33, 0xdb, 0xd7, 0x0d, 0xc5, 0xf3, 0xb5, 0xf1, 0x8f, 0x2e, 0x5c, 0xcc,
0x88, 0x16, 0x4f, 0x6c, 0x67, 0x38, 0xf1, 0xb9, 0x74, 0xad, 0x47, 0xdb, 0x37, 0x41, 0x4d, 0x95, 0x5e, 0x7b, 0xe1, 0x22, 0x7b, 0x07, 0x16, 0x6c, 0x2a, 0x21, 0x1a, 0x6e, 0x69, 0xee, 0x97, 0x60,
0x6c, 0x7c, 0x08, 0x10, 0xb7, 0x39, 0x39, 0x38, 0x37, 0x92, 0x83, 0x93, 0xd1, 0x06, 0x27, 0x6b, 0x39, 0xda, 0x18, 0x53, 0x1a, 0x6f, 0x5c, 0x02, 0x2f, 0xaf, 0xc2, 0x38, 0xa3, 0xbd, 0x0b, 0x67,
0xfc, 0x33, 0xc9, 0x6c, 0xe4, 0x48, 0x47, 0xc6, 0xb9, 0x6f, 0x80, 0x32, 0x17, 0x5a, 0x18, 0x96, 0x65, 0x5e, 0x8e, 0x89, 0x74, 0xcf, 0x47, 0x22, 0x80, 0x1c, 0x29, 0x95, 0x6c, 0x7c, 0x00, 0x10,
0x3d, 0x1e, 0xf2, 0x50, 0xdd, 0x2e, 0xb0, 0x20, 0x53, 0x3a, 0x51, 0xc2, 0x0c, 0x73, 0xcc, 0xce, 0xb7, 0x39, 0x39, 0x38, 0x37, 0x92, 0x83, 0x93, 0xd1, 0x06, 0x27, 0x6b, 0xfc, 0x33, 0xc9, 0xb0,
0x32, 0xc7, 0x37, 0xa1, 0x2a, 0x18, 0xa3, 0x9c, 0xe2, 0x40, 0x32, 0x98, 0xca, 0xc8, 0xbe, 0x54, 0xe4, 0x48, 0x47, 0x06, 0xbe, 0x6f, 0x80, 0x32, 0x39, 0x5a, 0x18, 0xda, 0x3d, 0x1e, 0xf2, 0x50,
0x75, 0x27, 0xb8, 0x62, 0x7e, 0x8a, 0x2b, 0xfe, 0x4e, 0x86, 0x2e, 0xfb, 0x88, 0x1b, 0x1a, 0xb3, 0xdd, 0x50, 0xb0, 0x28, 0x53, 0xda, 0x51, 0xc2, 0x0c, 0x83, 0xcd, 0xce, 0x32, 0xd8, 0x37, 0xa1,
0xc5, 0xa8, 0xcc, 0x24, 0x5b, 0x94, 0xa8, 0x66, 0x94, 0x7e, 0x0d, 0xab, 0xcb, 0xa6, 0xb3, 0xba, 0x22, 0x98, 0xab, 0x24, 0x93, 0x40, 0x32, 0xa9, 0xf2, 0xc8, 0xbe, 0x54, 0x75, 0x27, 0x38, 0x6b,
0x74, 0x26, 0x9a, 0x4b, 0x65, 0xa2, 0xc6, 0x1a, 0x34, 0xb7, 0xb8, 0x18, 0x8a, 0xd6, 0x70, 0x38, 0x7e, 0x8a, 0xb3, 0xfe, 0x4e, 0x86, 0x2e, 0x0c, 0x89, 0x1b, 0x1a, 0xb3, 0xd6, 0xa8, 0xcc, 0x24,
0x35, 0x96, 0xc6, 0x2d, 0xb8, 0x99, 0x92, 0x26, 0xed, 0x2c, 0x9f, 0xc2, 0x72, 0x8b, 0x6e, 0x41, 0x6b, 0x95, 0xa8, 0x66, 0x94, 0x7e, 0x0d, 0xbb, 0xcc, 0xa6, 0xb3, 0xcb, 0x74, 0x46, 0x9c, 0x4b,
0xf8, 0x59, 0x1d, 0x77, 0x34, 0x9a, 0xb0, 0x32, 0x5d, 0xa4, 0xac, 0x6c, 0x1b, 0x16, 0xb6, 0xf8, 0x65, 0xc4, 0xc6, 0x3a, 0x34, 0xb6, 0xb9, 0x18, 0x8a, 0xe6, 0x70, 0x38, 0x35, 0x96, 0xc6, 0x2d,
0xf1, 0xe4, 0x74, 0x97, 0x9f, 0xc7, 0x15, 0x31, 0xc8, 0x07, 0x67, 0xde, 0x85, 0x9c, 0x5c, 0xfc, 0xb8, 0x99, 0x92, 0x26, 0x6d, 0x35, 0x9f, 0xc0, 0x4a, 0x93, 0x6e, 0x52, 0xf8, 0x59, 0x1d, 0x99,
0x8d, 0x81, 0x94, 0x02, 0xc7, 0x0a, 0xc6, 0xbc, 0xaf, 0x6c, 0xed, 0x08, 0xe9, 0x8e, 0x79, 0xdf, 0x34, 0x1a, 0xb0, 0x3a, 0x5d, 0xa4, 0xac, 0x6c, 0x07, 0x16, 0xb7, 0xf9, 0xf1, 0xe4, 0x74, 0x8f,
0x78, 0x02, 0x4c, 0x2f, 0x47, 0xce, 0x84, 0x50, 0x84, 0x26, 0xc7, 0x56, 0x70, 0x15, 0x84, 0x7c, 0x9f, 0xc7, 0x15, 0x31, 0xc8, 0x07, 0x67, 0xde, 0x85, 0x9c, 0x5c, 0xfc, 0x8d, 0xc1, 0x98, 0x02,
0xa4, 0x8e, 0xf9, 0x41, 0x30, 0x39, 0xee, 0x12, 0xc4, 0x78, 0x17, 0xaa, 0x87, 0xf6, 0x95, 0xc9, 0xc7, 0x0a, 0xc6, 0xbc, 0xaf, 0xec, 0xf5, 0x08, 0xe9, 0x8e, 0x79, 0xdf, 0x78, 0x0a, 0x4c, 0x2f,
0xbf, 0x90, 0xa7, 0xe9, 0x56, 0xa1, 0x38, 0xb6, 0xaf, 0x04, 0xa7, 0x8b, 0xdc, 0x6e, 0x98, 0x6c, 0x47, 0xce, 0x84, 0x50, 0xa6, 0x26, 0xc7, 0x56, 0x70, 0x15, 0x84, 0x7c, 0xa4, 0x8e, 0x0a, 0x42,
0xfc, 0x41, 0x1e, 0xe6, 0x08, 0x93, 0xdd, 0xa3, 0xeb, 0x86, 0x1d, 0x17, 0x39, 0x8d, 0xda, 0x0b, 0x30, 0x39, 0xee, 0x12, 0xc4, 0xb8, 0x0f, 0x95, 0x43, 0xfb, 0xca, 0xe4, 0x5f, 0xc8, 0x13, 0x79,
0x34, 0xd0, 0xcc, 0x76, 0x91, 0x9d, 0xdd, 0x2e, 0xa4, 0x8d, 0x50, 0x5d, 0xb3, 0xa4, 0x1c, 0x24, 0x6b, 0x30, 0x3f, 0xb6, 0xaf, 0x04, 0xb7, 0x8c, 0x5c, 0x77, 0x98, 0x6c, 0xfc, 0x41, 0x1e, 0xe6,
0xee, 0x64, 0xa4, 0xee, 0x56, 0x4a, 0x5e, 0x05, 0x90, 0x8f, 0xaf, 0x93, 0xa6, 0x73, 0xd2, 0x49, 0x08, 0x93, 0xdd, 0xa3, 0x2b, 0x8b, 0x1d, 0x17, 0xb9, 0x95, 0xda, 0x4f, 0x34, 0xd0, 0xcc, 0x96,
0x17, 0x76, 0xac, 0x6e, 0x51, 0xeb, 0xd4, 0x2e, 0x28, 0x77, 0x04, 0x1d, 0x94, 0xaa, 0xd3, 0x15, 0x93, 0x9d, 0xdd, 0x72, 0xa4, 0x9d, 0x51, 0x5d, 0xd5, 0xa4, 0x9c, 0x2c, 0xee, 0x64, 0xa4, 0xee,
0xd5, 0x11, 0xd1, 0xa4, 0x4e, 0x37, 0xa3, 0xbb, 0x95, 0x5e, 0xad, 0xbb, 0x91, 0xf1, 0xf0, 0x25, 0x67, 0x4a, 0x5e, 0x27, 0x90, 0x8f, 0xaf, 0xa4, 0xa6, 0xb3, 0xd6, 0x49, 0x37, 0x78, 0xac, 0xb2,
0xba, 0x1b, 0xbc, 0x86, 0xee, 0xf6, 0x1a, 0xee, 0xe3, 0x9b, 0x50, 0x42, 0xd1, 0x46, 0xdb, 0x20, 0x51, 0xeb, 0xd4, 0x4e, 0x2a, 0x77, 0x15, 0x1d, 0x94, 0xaa, 0x17, 0xce, 0xab, 0x63, 0xa6, 0x49,
0x84, 0x48, 0x23, 0x36, 0x88, 0x8f, 0x34, 0xed, 0x86, 0x62, 0x57, 0x6e, 0xc5, 0x0b, 0xd0, 0xe4, 0xbd, 0x70, 0x46, 0xff, 0x2b, 0xbe, 0x5a, 0xff, 0x23, 0x03, 0xe4, 0x4b, 0xf4, 0x3f, 0x78, 0x0d,
0x5f, 0xfc, 0x7c, 0xdc, 0x72, 0xcf, 0xa1, 0x28, 0xa1, 0x82, 0xa0, 0x5d, 0x7b, 0xa4, 0x6e, 0xaa, 0xfd, 0xef, 0x35, 0x5c, 0xd0, 0x37, 0xa1, 0x88, 0xe2, 0x91, 0xb6, 0xc9, 0x08, 0xb1, 0x48, 0x6c,
0xc3, 0xdf, 0x62, 0xd8, 0xf0, 0x7a, 0xad, 0x2f, 0x26, 0x8e, 0xcf, 0x07, 0xea, 0x0a, 0x22, 0x07, 0x32, 0x1f, 0x6a, 0x1a, 0x12, 0xc5, 0xbf, 0x68, 0x5c, 0xde, 0xe4, 0x5f, 0xfc, 0x7c, 0x5c, 0x7b,
0xd7, 0xa8, 0x80, 0x88, 0x0e, 0x0a, 0x4d, 0xcb, 0xf5, 0x2e, 0x5c, 0xc9, 0x7b, 0x8a, 0x4e, 0xf0, 0x9f, 0xc3, 0xbc, 0x84, 0x0a, 0x82, 0x76, 0xed, 0x91, 0xba, 0xed, 0x0e, 0x7f, 0x8b, 0x61, 0xc3,
0x4c, 0x7c, 0x1a, 0x0c, 0x1a, 0x78, 0x57, 0xe5, 0xd8, 0xf3, 0xd5, 0xfe, 0x6b, 0xfc, 0x61, 0x06, 0x2b, 0xba, 0xbe, 0x98, 0x38, 0x3e, 0x1f, 0xa8, 0x6b, 0x8c, 0x1c, 0x5c, 0xa3, 0x02, 0x22, 0x3a,
0x1a, 0x72, 0x75, 0x45, 0x69, 0xba, 0xa2, 0x53, 0xb8, 0x2e, 0xd4, 0xe2, 0xe5, 0x17, 0x0a, 0x19, 0x28, 0xb4, 0x35, 0xd7, 0xbb, 0x70, 0x25, 0xef, 0x99, 0x77, 0x82, 0xe7, 0xe2, 0xd3, 0x60, 0x50,
0x50, 0x43, 0xfb, 0x4e, 0xb4, 0x19, 0x93, 0x7d, 0xaa, 0x22, 0x80, 0xdb, 0x72, 0x43, 0x7e, 0x03, 0xc7, 0xfb, 0x2e, 0xc7, 0x9e, 0xaf, 0xf6, 0x70, 0xe3, 0x0f, 0x33, 0x50, 0x97, 0xab, 0x2b, 0x4a,
0x2a, 0x2a, 0xcc, 0x7b, 0xe4, 0x0c, 0xd5, 0xcd, 0xf1, 0x14, 0xe7, 0xbd, 0xe7, 0x0c, 0xd5, 0x5e, 0xd3, 0x95, 0xa5, 0xc2, 0x75, 0xe1, 0x1a, 0x2f, 0xbf, 0x94, 0xc8, 0x80, 0x2a, 0xda, 0x88, 0xa2,
0xee, 0xdb, 0xf2, 0xc8, 0x72, 0x06, 0xf7, 0x72, 0xd3, 0x0e, 0xb9, 0xf1, 0xaf, 0x32, 0xb0, 0xa0, 0x0d, 0x9d, 0x6c, 0x5c, 0x65, 0x01, 0xdc, 0x91, 0x9b, 0xfa, 0x1b, 0x50, 0x56, 0xa1, 0xe2, 0x23,
0x75, 0x45, 0xae, 0xdb, 0x8f, 0xa1, 0x1a, 0x5d, 0x12, 0xcb, 0x23, 0xe1, 0x72, 0x35, 0xc9, 0x68, 0x67, 0xa8, 0x6e, 0x9f, 0xa7, 0x58, 0xf1, 0x7d, 0x67, 0xa8, 0xe4, 0x01, 0xdf, 0x96, 0xc7, 0x9e,
0xe2, 0x6c, 0x95, 0x7e, 0x04, 0x09, 0x44, 0x63, 0x06, 0xf6, 0x15, 0xc5, 0x22, 0x4f, 0x46, 0x4a, 0x33, 0x28, 0x0f, 0x98, 0x76, 0xc8, 0x8d, 0x7f, 0x95, 0x81, 0x45, 0xad, 0x2b, 0x72, 0xdd, 0x7e,
0x7f, 0x1b, 0xd8, 0x57, 0xdb, 0x9c, 0x77, 0x27, 0x23, 0xa1, 0x9d, 0x5f, 0x70, 0xfe, 0x22, 0x42, 0x04, 0x95, 0xe8, 0xa2, 0x59, 0x1e, 0x09, 0xa8, 0x6b, 0x49, 0x46, 0x13, 0x67, 0x2b, 0xf7, 0x23,
0x20, 0xf6, 0x09, 0x02, 0x26, 0x31, 0x0c, 0xa8, 0x8d, 0x3c, 0x37, 0x3c, 0x8b, 0x50, 0xa4, 0x60, 0x48, 0x20, 0x1a, 0x33, 0xb0, 0xaf, 0x28, 0x9e, 0x79, 0x32, 0x52, 0x3a, 0xe0, 0xc0, 0xbe, 0xda,
0x8d, 0x40, 0xc2, 0x31, 0xfe, 0x34, 0x0b, 0x8b, 0x64, 0x45, 0x94, 0xd6, 0x5b, 0xc9, 0xba, 0x9a, 0xe1, 0xbc, 0x3b, 0x19, 0x09, 0x0d, 0xff, 0x82, 0xf3, 0x17, 0x11, 0x02, 0xb1, 0x4f, 0x10, 0x30,
0x30, 0x47, 0x06, 0x55, 0x62, 0x5e, 0x3b, 0x37, 0x4c, 0xf9, 0xcd, 0xbe, 0xf5, 0x9a, 0x96, 0x4f, 0x89, 0x61, 0x40, 0x75, 0xe4, 0xb9, 0xe1, 0x59, 0x84, 0x22, 0x85, 0x73, 0x04, 0x12, 0x8e, 0xf1,
0x75, 0x2a, 0xfa, 0x9a, 0xe1, 0xcf, 0xcd, 0x0e, 0xff, 0xf5, 0xc3, 0x9b, 0xe6, 0xcb, 0x2d, 0xa4, 0xa7, 0x59, 0x58, 0x22, 0x4b, 0xa4, 0xb4, 0x00, 0x4b, 0xd6, 0xd5, 0x80, 0x39, 0x32, 0xca, 0x12,
0xf9, 0x72, 0x5f, 0xc7, 0x83, 0x3a, 0x73, 0x7e, 0xb7, 0x28, 0x71, 0xb4, 0xf3, 0xbb, 0x4f, 0x60, 0xf3, 0xda, 0xbd, 0x61, 0xca, 0x6f, 0xf6, 0xad, 0xd7, 0xb4, 0x9e, 0xaa, 0x93, 0xd5, 0xd7, 0x0c,
0x35, 0x81, 0x83, 0xdc, 0xda, 0x39, 0x71, 0xb8, 0xba, 0x42, 0x66, 0x49, 0xc3, 0xee, 0xaa, 0xb4, 0x7f, 0x6e, 0x76, 0xf8, 0xaf, 0x1f, 0xde, 0x34, 0x7f, 0x70, 0x21, 0xcd, 0x1f, 0xfc, 0x3a, 0x5e,
0x8d, 0x22, 0x14, 0x82, 0xbe, 0x37, 0xe6, 0xc6, 0x0a, 0x2c, 0x25, 0x47, 0x55, 0x6e, 0x13, 0xbf, 0xd8, 0x99, 0x33, 0xc0, 0xf3, 0x12, 0x47, 0x3b, 0x03, 0xfc, 0x14, 0xd6, 0x12, 0x38, 0xc8, 0xad,
0x9b, 0x81, 0xa6, 0x8c, 0xbc, 0x71, 0xdc, 0xd3, 0x1d, 0x27, 0x08, 0x3d, 0x3f, 0xba, 0x4c, 0xf5, 0x9d, 0x13, 0x87, 0xab, 0x6b, 0x68, 0x96, 0x35, 0xec, 0xae, 0x4a, 0xdb, 0x9c, 0x87, 0x42, 0xd0,
0x0e, 0x40, 0x10, 0xda, 0xbe, 0x54, 0xa8, 0xe5, 0xa5, 0x29, 0x08, 0x41, 0x65, 0xf9, 0x26, 0x94, 0xf7, 0xc6, 0xdc, 0x58, 0x85, 0xe5, 0xe4, 0xa8, 0xca, 0x6d, 0xe2, 0x77, 0x33, 0xd0, 0x90, 0xd1,
0xb8, 0x3b, 0xa0, 0x44, 0xa2, 0x86, 0x22, 0x77, 0x07, 0x4a, 0xd5, 0x9e, 0xd9, 0x4a, 0x6b, 0x49, 0x3b, 0x8e, 0x7b, 0xba, 0xeb, 0x04, 0xa1, 0xe7, 0x47, 0x17, 0xb2, 0xde, 0x01, 0x08, 0x42, 0xdb,
0x21, 0x41, 0xde, 0x61, 0x20, 0x46, 0x87, 0x9f, 0xe3, 0x96, 0x9e, 0x8f, 0xee, 0x30, 0xd8, 0xb3, 0x97, 0x4a, 0xb9, 0xbc, 0x78, 0x05, 0x21, 0xa8, 0x70, 0xdf, 0x84, 0x22, 0x77, 0x07, 0x94, 0x48,
0x2f, 0x31, 0x8e, 0x35, 0x30, 0xfe, 0x6e, 0x16, 0xe6, 0xe3, 0xf6, 0xd1, 0x05, 0x28, 0x2f, 0xbf, 0xd4, 0x30, 0xcf, 0xdd, 0x81, 0x52, 0xd7, 0x67, 0xb6, 0xd2, 0x6a, 0x52, 0x48, 0x90, 0xf7, 0x20,
0xca, 0xe5, 0x9e, 0x24, 0x07, 0x47, 0xa8, 0x28, 0x9a, 0x6d, 0xb5, 0x44, 0x8b, 0xb3, 0xe3, 0x32, 0x88, 0xd1, 0xe1, 0xe7, 0xb8, 0xa5, 0xe7, 0xa3, 0x7b, 0x10, 0xf6, 0xed, 0x4b, 0x8c, 0x85, 0x0d,
0x03, 0x2a, 0x0a, 0xc3, 0x9b, 0x84, 0xda, 0x9d, 0x86, 0x65, 0x42, 0x39, 0x98, 0x84, 0x42, 0xa7, 0x8c, 0xbf, 0x9b, 0x85, 0x85, 0xb8, 0x7d, 0x74, 0x89, 0xca, 0xcb, 0xaf, 0x83, 0xb9, 0x27, 0xc9,
0x14, 0xca, 0xb5, 0xe3, 0x4a, 0xad, 0xae, 0x60, 0x8f, 0xc2, 0x0e, 0x3e, 0x95, 0x20, 0xc0, 0x22, 0xc1, 0x11, 0x6a, 0x8e, 0x66, 0x9f, 0x2d, 0xd2, 0xe2, 0x6c, 0xbb, 0xcc, 0x80, 0xb2, 0xc2, 0xf0,
0x1b, 0x4d, 0xa4, 0xc0, 0x12, 0xf8, 0x0d, 0x52, 0x25, 0x68, 0xe6, 0x50, 0x8d, 0xd0, 0xe5, 0x6c, 0x26, 0xa1, 0x76, 0x2f, 0x62, 0x89, 0x50, 0x0e, 0x26, 0xa1, 0xd0, 0x4b, 0x85, 0x82, 0xee, 0xb8,
0xba, 0x35, 0x3a, 0x92, 0xb3, 0xdf, 0x80, 0x0a, 0x15, 0x1e, 0x1f, 0xd7, 0xce, 0x9b, 0x65, 0xac, 0x52, 0x33, 0x2c, 0xd8, 0xa3, 0xb0, 0x8d, 0xcf, 0x2d, 0x08, 0xb0, 0xc8, 0x46, 0x13, 0x29, 0xb0,
0x01, 0xd3, 0xa5, 0x9d, 0xcb, 0x9b, 0x24, 0xb4, 0x7b, 0xa0, 0xaa, 0x30, 0xb0, 0xe5, 0x6f, 0x66, 0x04, 0x7e, 0x9d, 0xd4, 0x11, 0x9a, 0x39, 0x54, 0x45, 0x74, 0x59, 0x9d, 0x6e, 0x9e, 0x8e, 0x64,
0xe0, 0x66, 0xca, 0xb4, 0xc9, 0x55, 0xbe, 0x09, 0x0b, 0x27, 0x51, 0xa2, 0x1a, 0x5d, 0x5a, 0xea, 0xf5, 0x37, 0xa0, 0x4c, 0x85, 0xc7, 0x47, 0xbe, 0xf3, 0x66, 0x09, 0x6b, 0xc0, 0x74, 0x69, 0x2b,
0x2b, 0x8a, 0xad, 0x26, 0xc7, 0xd4, 0x6c, 0x9c, 0x24, 0x01, 0xb1, 0x5e, 0x49, 0x33, 0x98, 0xb8, 0xf3, 0x26, 0x09, 0x0b, 0x01, 0x50, 0x55, 0x18, 0x1c, 0xf3, 0x37, 0x33, 0x70, 0x33, 0x65, 0xda,
0x0c, 0x00, 0x45, 0x22, 0x9a, 0x46, 0x92, 0xdf, 0x0f, 0x61, 0xad, 0x7d, 0x29, 0x38, 0xc6, 0xa6, 0xe4, 0x2a, 0xdf, 0x82, 0xc5, 0x93, 0x28, 0x51, 0x8d, 0x2e, 0x2d, 0xf5, 0x55, 0xc5, 0x56, 0x93,
0xfe, 0xd6, 0x87, 0x22, 0xa3, 0xa4, 0x0d, 0x3d, 0xf3, 0x5a, 0x36, 0xf4, 0x01, 0x9d, 0x1e, 0x8e, 0x63, 0x6a, 0xd6, 0x4f, 0x92, 0x80, 0x58, 0x37, 0xa5, 0x19, 0x4c, 0x5c, 0x28, 0x80, 0x22, 0x11,
0xca, 0xfa, 0x49, 0x0a, 0xc1, 0x0d, 0x54, 0xe4, 0xa1, 0xb7, 0x4a, 0xd4, 0xad, 0x00, 0xfd, 0xe8, 0x4d, 0x23, 0xa9, 0x85, 0x87, 0xb0, 0xde, 0xba, 0x14, 0x1c, 0x63, 0x4b, 0x7f, 0x2f, 0x44, 0x91,
0x8d, 0x12, 0x23, 0x80, 0xf9, 0xbd, 0xc9, 0x30, 0x74, 0xe2, 0x67, 0x4b, 0xd8, 0xb7, 0x64, 0x1e, 0x51, 0xd2, 0x0e, 0x9f, 0x79, 0x2d, 0x3b, 0xfc, 0x80, 0x4e, 0x20, 0x47, 0x65, 0xfd, 0x24, 0x85,
0xac, 0x47, 0x8d, 0x5a, 0x6a, 0x45, 0x10, 0x55, 0x84, 0x83, 0x35, 0x12, 0x05, 0x59, 0xb3, 0xf5, 0xe0, 0x06, 0x2a, 0xf2, 0xd0, 0x7b, 0x27, 0xea, 0x66, 0x81, 0x7e, 0xf4, 0xce, 0x89, 0x11, 0xc0,
0xcd, 0x8f, 0x92, 0x35, 0x18, 0x37, 0x61, 0x35, 0xfe, 0xa2, 0x61, 0x53, 0x5b, 0xcd, 0x3f, 0xcc, 0xc2, 0xfe, 0x64, 0x18, 0x3a, 0xf1, 0xd3, 0x27, 0xec, 0x5b, 0x32, 0x0f, 0xd6, 0xa3, 0x46, 0x2d,
0x50, 0xd0, 0x7c, 0xf2, 0x09, 0x15, 0xd6, 0x86, 0xc5, 0xc0, 0x71, 0x4f, 0x87, 0x5c, 0x2f, 0x3e, 0xb5, 0x22, 0x88, 0x2a, 0xc2, 0xc1, 0x1a, 0x89, 0x82, 0xac, 0xd9, 0xfa, 0x16, 0x46, 0xc9, 0x1a,
0x90, 0x83, 0xb0, 0x9c, 0x6c, 0x9b, 0x7c, 0x66, 0xc5, 0x5c, 0xa0, 0x1c, 0x71, 0x69, 0x01, 0xdb, 0x8c, 0x9b, 0xb0, 0x16, 0x7f, 0xd1, 0xb0, 0xa9, 0xad, 0xe6, 0x1f, 0x66, 0x28, 0xf0, 0x3e, 0xf9,
0xb8, 0xae, 0x91, 0x31, 0x59, 0x4c, 0x8d, 0xc6, 0x6c, 0xe3, 0x3b, 0x50, 0x4f, 0x56, 0xc4, 0x3e, 0x0c, 0x0b, 0x6b, 0xc1, 0x52, 0xe0, 0xb8, 0xa7, 0x43, 0xae, 0x17, 0x1f, 0xc8, 0x41, 0x58, 0x49,
0x92, 0x87, 0xee, 0xe3, 0x56, 0xe5, 0xa6, 0x4e, 0x24, 0xc7, 0x04, 0x51, 0x89, 0xc7, 0x3e, 0x30, 0xb6, 0x4d, 0x3e, 0xd5, 0x62, 0x2e, 0x52, 0x8e, 0xb8, 0xb4, 0x80, 0x6d, 0x5e, 0xd7, 0xc8, 0x98,
0xfe, 0x76, 0x06, 0x9a, 0x26, 0x17, 0x94, 0xab, 0xb5, 0x52, 0xd1, 0xcc, 0xc7, 0x33, 0xa5, 0x5e, 0x2c, 0xa6, 0x46, 0x63, 0xb6, 0xf1, 0x6d, 0xa8, 0x25, 0x2b, 0x62, 0x1f, 0xca, 0x83, 0xfb, 0x71,
0xdf, 0x57, 0x75, 0x96, 0x5f, 0xb5, 0xe8, 0xeb, 0xd7, 0x4e, 0xc6, 0xce, 0x8d, 0x99, 0x1e, 0x6d, 0xab, 0x72, 0x53, 0xa7, 0x9a, 0x63, 0x82, 0x28, 0xc7, 0x63, 0x1f, 0x18, 0x7f, 0x3b, 0x03, 0x0d,
0x94, 0x60, 0x8e, 0x50, 0x8c, 0x55, 0x58, 0x96, 0xed, 0x51, 0x6d, 0x89, 0x1d, 0xa4, 0x89, 0x1a, 0x93, 0x0b, 0xca, 0xd5, 0x5a, 0xa9, 0x68, 0xe6, 0xa3, 0x99, 0x52, 0xaf, 0xef, 0xab, 0xba, 0x0f,
0x13, 0x0e, 0xd2, 0x35, 0x68, 0xd2, 0xe9, 0x5a, 0xbd, 0x13, 0x32, 0xe3, 0x16, 0xb0, 0x3d, 0xbb, 0x40, 0xb5, 0xe8, 0xbd, 0x6b, 0x27, 0x63, 0xf7, 0xc6, 0x4c, 0x8f, 0x36, 0x8b, 0x30, 0x47, 0x28,
0x6f, 0xfb, 0x9e, 0xe7, 0x1e, 0x72, 0x5f, 0x86, 0x20, 0xa3, 0x84, 0x89, 0xfe, 0x43, 0x25, 0x0a, 0xc6, 0x1a, 0xac, 0xc8, 0xf6, 0xa8, 0xb6, 0xc4, 0x4e, 0xd6, 0x44, 0x8d, 0x09, 0x27, 0xeb, 0x3a,
0xd3, 0x97, 0xba, 0xc9, 0xd5, 0x73, 0x55, 0xc4, 0x15, 0x7d, 0x19, 0x26, 0x2c, 0x6e, 0xd8, 0x2f, 0x34, 0xe8, 0x84, 0xae, 0xde, 0x09, 0x99, 0x71, 0x1b, 0xd8, 0xbe, 0xdd, 0xb7, 0x7d, 0xcf, 0x73,
0xb8, 0x2a, 0x49, 0x0d, 0xd1, 0x27, 0x50, 0x19, 0x47, 0x85, 0xaa, 0x71, 0x57, 0x97, 0x82, 0xcc, 0x0f, 0xb9, 0x2f, 0xc3, 0x98, 0x51, 0xc2, 0x44, 0x1f, 0xa4, 0x12, 0x85, 0xe9, 0x4b, 0xdd, 0x06,
0x56, 0x6b, 0xea, 0xd8, 0xc6, 0x63, 0x58, 0x4a, 0x96, 0x29, 0x59, 0xc7, 0x1a, 0x94, 0x46, 0x12, 0xeb, 0xb9, 0x2a, 0x6a, 0x8b, 0xbe, 0x0c, 0x13, 0x96, 0x36, 0xed, 0x17, 0x5c, 0x95, 0xa4, 0x86,
0x26, 0x5b, 0x17, 0x7d, 0x1b, 0xbf, 0x55, 0x82, 0xa2, 0xd4, 0x46, 0xd9, 0x3a, 0xe4, 0xfb, 0x2a, 0xe8, 0x63, 0x28, 0x8f, 0xa3, 0x42, 0xd5, 0xb8, 0xab, 0x8b, 0x45, 0x66, 0xab, 0x35, 0x75, 0x6c,
0xea, 0x2d, 0xbe, 0x6b, 0x4a, 0xa6, 0xaa, 0xff, 0x9b, 0x18, 0xfb, 0x26, 0xf0, 0xd8, 0x27, 0x50, 0xe3, 0x09, 0x2c, 0x27, 0xcb, 0x94, 0xac, 0x63, 0x1d, 0x8a, 0x23, 0x09, 0x93, 0xad, 0x8b, 0xbe,
0x4f, 0x3a, 0x7e, 0xa7, 0xce, 0xee, 0x27, 0x3d, 0xb6, 0xb5, 0xfe, 0x94, 0x8b, 0xaf, 0x1c, 0x6f, 0x8d, 0xdf, 0x2a, 0xc2, 0xbc, 0xd4, 0x46, 0xd9, 0x06, 0xe4, 0xfb, 0x2a, 0x72, 0x2e, 0xbe, 0xaf,
0x8e, 0x24, 0x33, 0x94, 0xce, 0xb4, 0xdd, 0xd3, 0x73, 0x85, 0xbc, 0x1d, 0x9c, 0xd9, 0xd6, 0xe3, 0x4a, 0xa6, 0xaa, 0xff, 0x5b, 0x18, 0x3f, 0x27, 0xf0, 0xd8, 0xc7, 0x50, 0x4b, 0x3a, 0x8f, 0xa7,
0x27, 0x1f, 0xca, 0xc3, 0xfb, 0x15, 0x04, 0x76, 0xcf, 0xec, 0xc7, 0x4f, 0x3e, 0x9c, 0x96, 0xa4, 0xce, 0xff, 0x27, 0xbd, 0xbe, 0xd5, 0xfe, 0x94, 0x9b, 0xb0, 0x14, 0x6f, 0x8e, 0x24, 0x33, 0x14,
0xe5, 0xd1, 0x7d, 0x4d, 0x92, 0x5e, 0x82, 0x02, 0x5d, 0x59, 0x4a, 0xe1, 0x4b, 0xf4, 0xc1, 0x1e, 0xcf, 0xb4, 0xdd, 0xd3, 0x73, 0x85, 0xbc, 0x1d, 0x9c, 0xd9, 0xd6, 0x93, 0xa7, 0x1f, 0xc8, 0x0b,
0xc1, 0x92, 0x54, 0xba, 0x2d, 0x19, 0x68, 0x4e, 0x5c, 0xb0, 0x44, 0x67, 0xfb, 0x64, 0x5a, 0x17, 0x00, 0xca, 0x08, 0xec, 0x9e, 0xd9, 0x4f, 0x9e, 0x7e, 0x30, 0x2d, 0x49, 0xcb, 0xe3, 0xff, 0x9a,
0x93, 0xc8, 0xfc, 0xb5, 0x02, 0x73, 0x67, 0xf1, 0xfd, 0xb3, 0x35, 0x53, 0x7e, 0x19, 0x7f, 0x5a, 0x24, 0xbd, 0x0c, 0x05, 0xba, 0xf6, 0x94, 0x42, 0xa0, 0xe8, 0x83, 0x3d, 0x86, 0x65, 0x65, 0xda,
0x80, 0x8a, 0x36, 0x28, 0xac, 0x0a, 0x25, 0xb3, 0xdd, 0x6d, 0x9b, 0x9f, 0xb5, 0xb7, 0x1a, 0x37, 0x90, 0xc1, 0xea, 0xc4, 0x05, 0x8b, 0x74, 0x3e, 0x50, 0xa6, 0x75, 0x31, 0x89, 0x8c, 0x21, 0xab,
0xd8, 0x7d, 0x78, 0xbb, 0xb3, 0xbf, 0x79, 0x60, 0x9a, 0xed, 0xcd, 0x9e, 0x75, 0x60, 0x5a, 0xea, 0x30, 0x77, 0x16, 0xdf, 0x61, 0x5b, 0x35, 0xe5, 0x97, 0xf1, 0xa7, 0x05, 0x28, 0x6b, 0x83, 0xc2,
0xc6, 0xb3, 0xc3, 0xd6, 0xf3, 0xbd, 0xf6, 0x7e, 0xcf, 0xda, 0x6a, 0xf7, 0x5a, 0x9d, 0xdd, 0x6e, 0x2a, 0x50, 0x34, 0x5b, 0xdd, 0x96, 0xf9, 0x69, 0x6b, 0xbb, 0x7e, 0x83, 0x3d, 0x80, 0xb7, 0xdb,
0x23, 0xc3, 0x6e, 0x43, 0x33, 0xc6, 0x54, 0xc9, 0xad, 0xbd, 0x83, 0xa3, 0xfd, 0x5e, 0x23, 0xcb, 0x9d, 0xad, 0x03, 0xd3, 0x6c, 0x6d, 0xf5, 0xac, 0x03, 0xd3, 0x52, 0xb7, 0xa6, 0x1d, 0x36, 0x3f,
0xee, 0xc2, 0xad, 0xed, 0xce, 0x7e, 0x6b, 0xd7, 0x8a, 0x71, 0x36, 0x77, 0x7b, 0x9f, 0x59, 0xed, 0xdf, 0x6f, 0x75, 0x7a, 0xd6, 0x76, 0xab, 0xd7, 0x6c, 0xef, 0x75, 0xeb, 0x19, 0x76, 0x1b, 0x1a,
0x5f, 0x3a, 0xec, 0x98, 0xcf, 0x1b, 0xb9, 0x34, 0x84, 0x9d, 0xde, 0xee, 0xa6, 0x2a, 0x21, 0xcf, 0x31, 0xa6, 0x4a, 0x6e, 0xee, 0x1f, 0x1c, 0x75, 0x7a, 0xf5, 0x2c, 0xbb, 0x0b, 0xb7, 0x76, 0xda,
0x6e, 0xc2, 0x32, 0x21, 0x50, 0x16, 0xab, 0x77, 0x70, 0x60, 0x75, 0x0f, 0x0e, 0xf6, 0x1b, 0x05, 0x9d, 0xe6, 0x9e, 0x15, 0xe3, 0x6c, 0xed, 0xf5, 0x3e, 0xb5, 0x5a, 0xbf, 0x74, 0xd8, 0x36, 0x3f,
0xb6, 0x00, 0xb5, 0xce, 0xfe, 0x67, 0xad, 0xdd, 0xce, 0x96, 0x65, 0xb6, 0x5b, 0xbb, 0x7b, 0x8d, 0xaf, 0xe7, 0xd2, 0x10, 0x76, 0x7b, 0x7b, 0x5b, 0xaa, 0x84, 0x3c, 0xbb, 0x09, 0x2b, 0x84, 0x40,
0x39, 0xb6, 0x08, 0xf3, 0xd3, 0x78, 0x45, 0x51, 0x84, 0xc2, 0x3b, 0xd8, 0xef, 0x1c, 0xec, 0x5b, 0x59, 0xac, 0xde, 0xc1, 0x81, 0xd5, 0x3d, 0x38, 0xe8, 0xd4, 0x0b, 0x6c, 0x11, 0xaa, 0xed, 0xce,
0x9f, 0xb5, 0xcd, 0x6e, 0xe7, 0x60, 0xbf, 0x51, 0x62, 0x2b, 0xc0, 0x92, 0x49, 0x3b, 0x7b, 0xad, 0xa7, 0xcd, 0xbd, 0xf6, 0xb6, 0x65, 0xb6, 0x9a, 0x7b, 0xfb, 0xf5, 0x39, 0xb6, 0x04, 0x0b, 0xd3,
0xcd, 0x46, 0x99, 0x2d, 0xc3, 0x42, 0x12, 0xfe, 0xac, 0xfd, 0xbc, 0x01, 0xac, 0x09, 0x4b, 0xd4, 0x78, 0xf3, 0xa2, 0x08, 0x85, 0x77, 0xd0, 0x69, 0x1f, 0x74, 0xac, 0x4f, 0x5b, 0x66, 0xb7, 0x7d,
0x30, 0x6b, 0xa3, 0xbd, 0x7b, 0xf0, 0xb9, 0xb5, 0xd7, 0xd9, 0xef, 0xec, 0x1d, 0xed, 0x35, 0x2a, 0xd0, 0xa9, 0x17, 0xd9, 0x2a, 0xb0, 0x64, 0xd2, 0xee, 0x7e, 0x73, 0xab, 0x5e, 0x62, 0x2b, 0xb0,
0x78, 0x91, 0x62, 0xbb, 0x6d, 0x75, 0xf6, 0xbb, 0x47, 0xdb, 0xdb, 0x9d, 0xcd, 0x4e, 0x7b, 0xbf, 0x98, 0x84, 0x3f, 0x6f, 0x7d, 0x5e, 0x07, 0xd6, 0x80, 0x65, 0x6a, 0x98, 0xb5, 0xd9, 0xda, 0x3b,
0xd7, 0xa8, 0x52, 0xcd, 0x69, 0x1d, 0xaf, 0x89, 0x0c, 0xf2, 0x34, 0x8a, 0xb5, 0xd5, 0xe9, 0xb6, 0xf8, 0xcc, 0xda, 0x6f, 0x77, 0xda, 0xfb, 0x47, 0xfb, 0xf5, 0x32, 0x5e, 0xc6, 0xd8, 0x6a, 0x59,
0x36, 0x76, 0xdb, 0x5b, 0x8d, 0x3a, 0xbb, 0x03, 0x37, 0x7b, 0xed, 0xbd, 0xc3, 0x03, 0xb3, 0x65, 0xed, 0x4e, 0xf7, 0x68, 0x67, 0xa7, 0xbd, 0xd5, 0x6e, 0x75, 0x7a, 0xf5, 0x0a, 0xd5, 0x9c, 0xd6,
0x3e, 0x57, 0xa7, 0x55, 0xac, 0xed, 0x56, 0x67, 0xf7, 0xc8, 0x6c, 0x37, 0xe6, 0xd9, 0x9b, 0x70, 0xf1, 0xaa, 0xc8, 0x20, 0x4f, 0xb4, 0x58, 0xdb, 0xed, 0x6e, 0x73, 0x73, 0xaf, 0xb5, 0x5d, 0xaf,
0xc7, 0x6c, 0x7f, 0x7a, 0xd4, 0x31, 0xdb, 0x5b, 0xd6, 0xfe, 0xc1, 0x56, 0xdb, 0xda, 0x6e, 0xb7, 0xb1, 0x3b, 0x70, 0xb3, 0xd7, 0xda, 0x3f, 0x3c, 0x30, 0x9b, 0xe6, 0xe7, 0xea, 0xc4, 0x8b, 0xb5,
0x7a, 0x47, 0x66, 0xdb, 0xda, 0xeb, 0x74, 0xbb, 0x9d, 0xfd, 0xa7, 0x8d, 0x06, 0x7b, 0x1b, 0xee, 0xd3, 0x6c, 0xef, 0x1d, 0x99, 0xad, 0xfa, 0x02, 0x7b, 0x13, 0xee, 0x98, 0xad, 0x4f, 0x8e, 0xda,
0x45, 0x28, 0x51, 0x01, 0x53, 0x58, 0x0b, 0xa2, 0x7f, 0x6a, 0x4a, 0xf7, 0xdb, 0xbf, 0xd4, 0xb3, 0x66, 0x6b, 0xdb, 0xea, 0x1c, 0x6c, 0xb7, 0xac, 0x9d, 0x56, 0xb3, 0x77, 0x64, 0xb6, 0xac, 0xfd,
0x0e, 0xdb, 0x6d, 0xb3, 0xc1, 0xd8, 0x1a, 0xac, 0xc4, 0xd5, 0x53, 0x05, 0xb2, 0xee, 0x45, 0x91, 0x76, 0xb7, 0xdb, 0xee, 0x3c, 0xab, 0xd7, 0xd9, 0xdb, 0x70, 0x2f, 0x42, 0x89, 0x0a, 0x98, 0xc2,
0x76, 0xd8, 0x36, 0xf7, 0x5a, 0xfb, 0x62, 0x82, 0x13, 0x69, 0x4b, 0xa2, 0xd9, 0x71, 0xda, 0x74, 0x5a, 0x14, 0xfd, 0x53, 0x53, 0xda, 0x69, 0xfd, 0x52, 0xcf, 0x3a, 0x6c, 0xb5, 0xcc, 0x3a, 0x63,
0xb3, 0x97, 0x19, 0x83, 0xba, 0x36, 0x2b, 0xdb, 0x2d, 0xb3, 0xb1, 0xc2, 0xe6, 0xa1, 0xb2, 0x77, 0xeb, 0xb0, 0x1a, 0x57, 0x4f, 0x15, 0xc8, 0xba, 0x97, 0x44, 0xda, 0x61, 0xcb, 0xdc, 0x6f, 0x76,
0x78, 0x68, 0xf5, 0x3a, 0x7b, 0xed, 0x83, 0xa3, 0x5e, 0x63, 0x95, 0x2d, 0x43, 0xa3, 0xb3, 0xdf, 0xc4, 0x04, 0x27, 0xd2, 0x96, 0x45, 0xb3, 0xe3, 0xb4, 0xe9, 0x66, 0xaf, 0x30, 0x06, 0x35, 0x6d,
0x6b, 0x9b, 0x62, 0xae, 0x55, 0xd6, 0xff, 0x51, 0x64, 0x4b, 0x30, 0xaf, 0x5a, 0xaa, 0xa0, 0x7f, 0x56, 0x76, 0x9a, 0x66, 0x7d, 0x95, 0x2d, 0x40, 0x79, 0xff, 0xf0, 0xd0, 0xea, 0xb5, 0xf7, 0x5b,
0x51, 0x64, 0xab, 0xc0, 0x8e, 0xf6, 0xcd, 0x76, 0x6b, 0x4b, 0x0c, 0x5c, 0x94, 0xf0, 0x3f, 0x8b, 0x07, 0x47, 0xbd, 0xfa, 0x1a, 0x5b, 0x81, 0x7a, 0xbb, 0xd3, 0x6b, 0x99, 0x62, 0xae, 0x55, 0xd6,
0xd2, 0x09, 0xf4, 0x87, 0xb9, 0x68, 0xb3, 0x8e, 0xa3, 0x2a, 0x92, 0xb7, 0x91, 0x57, 0xb5, 0x5b, 0xff, 0x31, 0xcf, 0x96, 0x61, 0x41, 0xb5, 0x54, 0x41, 0xff, 0x62, 0x9e, 0xad, 0x01, 0x3b, 0xea,
0xc4, 0x5f, 0xf5, 0x4e, 0x88, 0xa6, 0x5a, 0xe5, 0x66, 0x54, 0xab, 0x19, 0xdd, 0xbd, 0xa6, 0xcb, 0x98, 0xad, 0xe6, 0xb6, 0x18, 0xb8, 0x28, 0xe1, 0x7f, 0xce, 0x4b, 0x47, 0xd2, 0x1f, 0xe6, 0xa2,
0x7e, 0x6f, 0x41, 0x6d, 0x44, 0x37, 0x93, 0xcb, 0x1b, 0x88, 0x41, 0x86, 0x18, 0x11, 0x90, 0xae, 0xcd, 0x3a, 0x8e, 0xcc, 0x48, 0xde, 0x68, 0x5e, 0xd1, 0x6e, 0x22, 0x7f, 0xd5, 0x5b, 0x23, 0x9a,
0x1f, 0x9e, 0x79, 0x28, 0xa3, 0x30, 0xfb, 0x50, 0x46, 0x9a, 0x7c, 0x3f, 0x97, 0x26, 0xdf, 0x3f, 0x6a, 0x95, 0x9b, 0x51, 0xad, 0x66, 0x74, 0xf7, 0xaa, 0x2e, 0xfb, 0xbd, 0x05, 0xd5, 0x11, 0xdd,
0x80, 0x05, 0x62, 0x4d, 0x8e, 0xeb, 0x8c, 0x94, 0xd6, 0x4c, 0x52, 0xe0, 0x3c, 0xb2, 0x28, 0x82, 0x6e, 0x2e, 0x6f, 0x31, 0x06, 0x19, 0xa6, 0x44, 0x40, 0xba, 0xc2, 0x78, 0xe6, 0xb1, 0x8d, 0xc2,
0x2b, 0x75, 0x42, 0xa9, 0x1c, 0x92, 0x85, 0x14, 0xa5, 0xb6, 0x91, 0xd0, 0x34, 0x88, 0x73, 0x44, 0xec, 0x63, 0x1b, 0x69, 0xf2, 0xfd, 0x5c, 0x9a, 0x7c, 0xff, 0x10, 0x16, 0x89, 0x35, 0x39, 0xae,
0x9a, 0x46, 0x54, 0x83, 0x7d, 0x19, 0xd7, 0x50, 0xd1, 0x6a, 0x20, 0x38, 0xd6, 0xf0, 0x00, 0x16, 0x33, 0x52, 0x5a, 0x33, 0x49, 0x81, 0x0b, 0xc8, 0xa2, 0x08, 0xae, 0xd4, 0x09, 0xa5, 0x72, 0x48,
0xf8, 0x65, 0xe8, 0xdb, 0x96, 0x37, 0xb6, 0xbf, 0x98, 0xa0, 0x97, 0xda, 0x46, 0x1d, 0xbe, 0x6a, 0x16, 0x32, 0x2f, 0xb5, 0x8d, 0x84, 0xa6, 0x41, 0x9c, 0x23, 0xd2, 0x34, 0xa2, 0x1a, 0xec, 0xcb,
0xce, 0x63, 0xc2, 0x01, 0xc2, 0xb7, 0xec, 0xd0, 0x7e, 0xf0, 0x25, 0x54, 0xb4, 0x5b, 0xeb, 0xd9, 0xb8, 0x86, 0xb2, 0x56, 0x03, 0xc1, 0xb1, 0x86, 0x87, 0xb0, 0xc8, 0x2f, 0x43, 0xdf, 0xb6, 0xbc,
0x2a, 0x2c, 0x7e, 0xde, 0xe9, 0xed, 0xb7, 0xbb, 0x5d, 0xeb, 0xf0, 0x68, 0xe3, 0x59, 0xfb, 0xb9, 0xb1, 0xfd, 0xc5, 0x04, 0x3d, 0xdd, 0x36, 0xea, 0xf0, 0x15, 0x73, 0x01, 0x13, 0x0e, 0x10, 0xbe,
0xb5, 0xd3, 0xea, 0xee, 0x34, 0x6e, 0x88, 0x45, 0xbb, 0xdf, 0xee, 0xf6, 0xda, 0x5b, 0x09, 0x78, 0x6d, 0x87, 0xf6, 0xc3, 0x2f, 0xa1, 0xac, 0xdd, 0x7c, 0xcf, 0xd6, 0x60, 0xe9, 0xb3, 0x76, 0xaf,
0x86, 0xbd, 0x01, 0x6b, 0x47, 0xfb, 0x47, 0xdd, 0xf6, 0x96, 0x95, 0x96, 0x2f, 0x2b, 0xa8, 0x54, 0xd3, 0xea, 0x76, 0xad, 0xc3, 0xa3, 0xcd, 0xe7, 0xad, 0xcf, 0xad, 0xdd, 0x66, 0x77, 0xb7, 0x7e,
0xa6, 0xa7, 0x64, 0xcf, 0x3d, 0xf8, 0x35, 0xa8, 0x27, 0x0f, 0x6e, 0x33, 0x80, 0xb9, 0xdd, 0xf6, 0x43, 0x2c, 0xda, 0x4e, 0xab, 0xdb, 0x6b, 0x6d, 0x27, 0xe0, 0x19, 0xf6, 0x06, 0xac, 0x1f, 0x75,
0xd3, 0xd6, 0xe6, 0x73, 0xba, 0x6a, 0xb5, 0xdb, 0x6b, 0xf5, 0x3a, 0x9b, 0x96, 0xbc, 0x5a, 0x55, 0x8e, 0xba, 0xad, 0x6d, 0x2b, 0x2d, 0x5f, 0x56, 0x50, 0xa9, 0x4c, 0x4f, 0xc9, 0x9e, 0x7b, 0xf8,
0x70, 0x84, 0x0c, 0xab, 0x40, 0xb1, 0xb5, 0xbf, 0xb9, 0x73, 0x60, 0x76, 0x1b, 0x59, 0x76, 0x1b, 0x6b, 0x50, 0x4b, 0x1e, 0xfe, 0x66, 0x00, 0x73, 0x7b, 0xad, 0x67, 0xcd, 0xad, 0xcf, 0xe9, 0xba,
0x56, 0x15, 0xad, 0x6e, 0x1e, 0xec, 0xed, 0x75, 0x7a, 0xc8, 0x0c, 0x7b, 0xcf, 0x0f, 0x05, 0x69, 0xd6, 0x6e, 0xaf, 0xd9, 0x6b, 0x6f, 0x59, 0xf2, 0x7a, 0x56, 0xc1, 0x11, 0x32, 0xac, 0x0c, 0xf3,
0x3e, 0xb0, 0xa1, 0x1c, 0xdf, 0x0d, 0x8b, 0x0c, 0xa6, 0xd3, 0xeb, 0xb4, 0x7a, 0x31, 0x77, 0x6d, 0xcd, 0xce, 0xd6, 0xee, 0x81, 0xd9, 0xad, 0x67, 0xd9, 0x6d, 0x58, 0x53, 0xb4, 0xba, 0x75, 0xb0,
0xdc, 0x10, 0xfc, 0x2b, 0x06, 0xe3, 0xd5, 0xae, 0x8d, 0x0c, 0x9d, 0x6d, 0x53, 0x40, 0xaa, 0xbd, 0xbf, 0xdf, 0xee, 0x21, 0x33, 0xec, 0x7d, 0x7e, 0x28, 0x48, 0xf3, 0xa1, 0x0d, 0xa5, 0xf8, 0x7e,
0x91, 0x15, 0x8b, 0x2a, 0x86, 0x6e, 0x1c, 0xf4, 0x44, 0x17, 0xbe, 0x03, 0xf5, 0x64, 0x04, 0x63, 0x59, 0x64, 0x30, 0xed, 0x5e, 0xbb, 0xd9, 0x8b, 0xb9, 0x6b, 0xfd, 0x86, 0xe0, 0x5f, 0x31, 0x18,
0xd2, 0x6c, 0xbd, 0x06, 0x2b, 0x1b, 0xed, 0xde, 0xe7, 0xed, 0xf6, 0x3e, 0x8e, 0xce, 0x66, 0x7b, 0xaf, 0x87, 0xad, 0x67, 0xe8, 0x7c, 0x9c, 0x02, 0x52, 0xed, 0xf5, 0xac, 0x58, 0x54, 0x31, 0x74,
0xbf, 0x67, 0xb6, 0x76, 0x3b, 0xbd, 0xe7, 0x8d, 0xcc, 0x83, 0x4f, 0xa0, 0x31, 0xed, 0x2e, 0x4c, 0xf3, 0xa0, 0x27, 0xba, 0xf0, 0x1d, 0xa8, 0x25, 0xa3, 0x20, 0x93, 0x66, 0xeb, 0x75, 0x58, 0xdd,
0xf8, 0x57, 0x5f, 0xe6, 0x88, 0x7d, 0xf0, 0x4f, 0x73, 0x00, 0xf1, 0x31, 0x1a, 0xc1, 0x26, 0xb7, 0x6c, 0xf5, 0x3e, 0x6b, 0xb5, 0x3a, 0x38, 0x3a, 0x5b, 0xad, 0x4e, 0xcf, 0x6c, 0xee, 0xb5, 0x7b,
0x5a, 0xbd, 0xd6, 0xee, 0x81, 0x98, 0x02, 0xf3, 0xa0, 0x27, 0xb8, 0x9f, 0xd9, 0xfe, 0xb4, 0x71, 0x9f, 0xd7, 0x33, 0x0f, 0x3f, 0x86, 0xfa, 0xb4, 0xcb, 0x31, 0xe1, 0xa3, 0x7d, 0x99, 0x33, 0xf7,
0x23, 0x35, 0xe5, 0xe0, 0xb0, 0xd7, 0xc8, 0x88, 0xd9, 0xa6, 0xee, 0xec, 0x5a, 0xe6, 0xc1, 0x51, 0xe1, 0x7f, 0xce, 0xc0, 0x72, 0x9a, 0x55, 0x5d, 0xcc, 0xa1, 0x5c, 0x9c, 0x82, 0x45, 0x77, 0x0f,
0x67, 0xff, 0x29, 0x5d, 0x9d, 0x89, 0x3b, 0xc4, 0xd1, 0xe1, 0xb6, 0x79, 0xb0, 0xdf, 0xb3, 0xba, 0x3a, 0x56, 0xe7, 0x00, 0xef, 0x83, 0x5c, 0x87, 0xd5, 0xa9, 0x04, 0xc5, 0x09, 0x32, 0xec, 0x16,
0x3b, 0x47, 0xbd, 0x2d, 0xbc, 0x78, 0x73, 0xd3, 0xec, 0x1c, 0x52, 0x99, 0xf9, 0x97, 0x21, 0x88, 0xac, 0xcd, 0x64, 0xb2, 0xcc, 0x83, 0x23, 0xec, 0x76, 0x03, 0x96, 0xa7, 0x12, 0x5b, 0xa6, 0x79,
0xa2, 0x0b, 0x82, 0x5e, 0x9e, 0x1e, 0x74, 0xbb, 0x9d, 0x43, 0xeb, 0xd3, 0xa3, 0xb6, 0xd9, 0x69, 0x60, 0xd6, 0x73, 0xec, 0x3d, 0x78, 0x30, 0x95, 0x32, 0xbb, 0x31, 0xa9, 0x7d, 0x2b, 0xcf, 0xee,
0x77, 0x31, 0xe3, 0x5c, 0x0a, 0x5c, 0xe0, 0x17, 0xc5, 0xbe, 0xd2, 0xdb, 0xfd, 0x4c, 0x32, 0x7e, 0xc3, 0x5b, 0x33, 0xd8, 0x31, 0xef, 0xb6, 0x36, 0x9b, 0x7b, 0xa2, 0x7b, 0xf5, 0xc2, 0xc3, 0x7f,
0x81, 0x5a, 0x4a, 0x82, 0x04, 0x56, 0x59, 0x0c, 0xa6, 0xe0, 0x9c, 0x29, 0x25, 0xc3, 0x35, 0x69, 0x9a, 0x03, 0x88, 0x8f, 0x19, 0x89, 0xfa, 0xb7, 0x9b, 0xbd, 0xe6, 0xde, 0x81, 0x20, 0x2f, 0xf3,
0x22, 0x5f, 0x45, 0xec, 0x09, 0x33, 0x84, 0x84, 0xd9, 0xaa, 0xe9, 0x49, 0x22, 0x17, 0x6e, 0x17, 0xa0, 0x27, 0x4a, 0x37, 0x5b, 0x9f, 0xd4, 0x6f, 0xa4, 0xa6, 0x1c, 0x1c, 0x8a, 0x0e, 0xad, 0xc1,
0xd1, 0xe6, 0xba, 0xb5, 0x65, 0x62, 0x86, 0xfa, 0x0c, 0x54, 0xe0, 0xce, 0x8b, 0x89, 0x12, 0xac, 0x12, 0x4d, 0xd5, 0x9e, 0xe8, 0x46, 0xbb, 0xf3, 0x8c, 0xae, 0x16, 0xc5, 0xdd, 0xef, 0xe8, 0x70,
0x55, 0xa0, 0x34, 0xd4, 0x87, 0x48, 0x59, 0x78, 0xfc, 0x9b, 0x39, 0xa8, 0xd3, 0x91, 0x46, 0x7a, 0xc7, 0x3c, 0xe8, 0xf4, 0xac, 0xee, 0xee, 0x51, 0x6f, 0x1b, 0x2f, 0x26, 0xdd, 0x32, 0xdb, 0x87,
0xf0, 0x90, 0xfb, 0x6c, 0x0f, 0x8a, 0xf2, 0xe5, 0x4c, 0xb6, 0x1c, 0xdd, 0x6a, 0xa8, 0xbf, 0xd5, 0x54, 0x66, 0xfe, 0x65, 0x08, 0xa2, 0xe8, 0x82, 0x58, 0x0b, 0xcf, 0x0e, 0xba, 0xdd, 0xf6, 0xa1,
0xb9, 0xb6, 0x32, 0x0d, 0x96, 0xa2, 0xe4, 0xe2, 0x5f, 0xf9, 0x93, 0xff, 0xfe, 0x77, 0xb2, 0x35, 0xf5, 0xc9, 0x51, 0xcb, 0x6c, 0xb7, 0xba, 0x98, 0x71, 0x2e, 0x05, 0x2e, 0xf0, 0xe7, 0xc5, 0x9e,
0x56, 0x79, 0x78, 0xfe, 0xc1, 0xc3, 0x53, 0xee, 0x06, 0xa2, 0x8c, 0x5f, 0x01, 0x88, 0xdf, 0x83, 0xd9, 0xdb, 0xfb, 0x54, 0x6e, 0x6a, 0x02, 0xb5, 0x98, 0x04, 0x09, 0xac, 0x92, 0x98, 0x1d, 0xb1,
0x64, 0x4d, 0xed, 0x1a, 0x85, 0xc4, 0x4b, 0x90, 0x6b, 0x37, 0x53, 0x52, 0x64, 0xb9, 0x37, 0xb1, 0x2b, 0xa4, 0x94, 0x0c, 0xd7, 0xa4, 0x89, 0x7c, 0x65, 0xb1, 0xdf, 0xcd, 0x2c, 0x12, 0xcc, 0x56,
0xdc, 0x45, 0xa3, 0x2e, 0xca, 0x75, 0x5c, 0x27, 0xa4, 0xb7, 0x21, 0x3f, 0xce, 0x3c, 0x60, 0x03, 0x49, 0x4f, 0x12, 0xb9, 0x70, 0x2b, 0x8c, 0x04, 0x87, 0xed, 0x6d, 0x13, 0x33, 0xd4, 0x66, 0xa0,
0xa8, 0xea, 0x2f, 0x35, 0x32, 0x25, 0xe5, 0xa5, 0xbc, 0x35, 0xb9, 0x76, 0x2b, 0x35, 0x4d, 0xc9, 0x02, 0x77, 0x41, 0x10, 0xa1, 0xd8, 0x36, 0x04, 0x4a, 0x5d, 0x7d, 0x88, 0x94, 0xc5, 0x27, 0xbf,
0xcf, 0x58, 0xc7, 0xb2, 0xd1, 0x10, 0x75, 0x4c, 0x10, 0x23, 0xae, 0x65, 0x48, 0x1a, 0x45, 0xfc, 0x99, 0x83, 0x1a, 0x1d, 0xf9, 0xa4, 0x07, 0x21, 0xb9, 0xcf, 0xf6, 0x61, 0x5e, 0xbe, 0x2c, 0xca,
0x20, 0x23, 0xbb, 0xad, 0xc9, 0x84, 0x33, 0xcf, 0x41, 0xae, 0xdd, 0xb9, 0x26, 0x55, 0xd6, 0x75, 0x56, 0xa2, 0x5b, 0x1f, 0xf5, 0xb7, 0x4c, 0xd7, 0x57, 0xa7, 0xc1, 0x52, 0x4c, 0x5e, 0xfa, 0x2b,
0x07, 0xeb, 0x5a, 0x35, 0x98, 0xa8, 0xab, 0x8f, 0x38, 0xea, 0x39, 0xc8, 0x8f, 0x33, 0x0f, 0x1e, 0x7f, 0xf2, 0xdf, 0xff, 0x4e, 0xb6, 0xca, 0xca, 0x8f, 0xce, 0xdf, 0x7f, 0x74, 0xca, 0xdd, 0x40,
0xff, 0xfb, 0xf7, 0xa0, 0x1c, 0x85, 0x38, 0xb3, 0x5f, 0x87, 0x5a, 0xe2, 0xcc, 0x29, 0x53, 0xdd, 0x94, 0xf1, 0x2b, 0x00, 0xf1, 0x7b, 0x99, 0xac, 0xa1, 0x5d, 0x33, 0x91, 0x78, 0x29, 0x73, 0xfd,
0x48, 0x3b, 0xa2, 0xba, 0x76, 0x3b, 0x3d, 0x51, 0x56, 0xfc, 0x06, 0x56, 0xdc, 0x64, 0x2b, 0xa2, 0x66, 0x4a, 0x8a, 0x2c, 0xf7, 0x26, 0x96, 0xbb, 0x64, 0xd4, 0x44, 0xb9, 0x8e, 0xeb, 0x84, 0xf4,
0x62, 0x79, 0xa6, 0xf3, 0x21, 0x9e, 0x11, 0xa7, 0x3b, 0x22, 0x5f, 0x68, 0x9a, 0x13, 0x55, 0x76, 0x76, 0xe6, 0x47, 0x99, 0x87, 0x6c, 0x00, 0x15, 0xfd, 0x25, 0x4b, 0xa6, 0x24, 0xd8, 0x94, 0xb7,
0x7b, 0x5a, 0x9b, 0x49, 0xd4, 0x76, 0xe7, 0x9a, 0x54, 0x59, 0xdd, 0x6d, 0xac, 0x6e, 0x85, 0x2d, 0x38, 0xd7, 0x6f, 0xa5, 0xa6, 0x29, 0xdd, 0x00, 0xeb, 0x58, 0x31, 0xea, 0xa2, 0x8e, 0x09, 0x62,
0xe9, 0xd5, 0xa9, 0xc8, 0x58, 0xc6, 0xf1, 0x5e, 0x56, 0xfd, 0xbd, 0x42, 0x76, 0x27, 0xbe, 0x45, 0xc4, 0xb5, 0x0c, 0x49, 0x5b, 0x8a, 0x1f, 0xac, 0x64, 0xb7, 0x35, 0x79, 0x77, 0xe6, 0xb9, 0xcc,
0x33, 0xe5, 0x1d, 0xc3, 0x88, 0x44, 0x66, 0x1f, 0x33, 0x34, 0x9a, 0x58, 0x15, 0x63, 0x38, 0x7d, 0xf5, 0x3b, 0xd7, 0xa4, 0xca, 0xba, 0xee, 0x60, 0x5d, 0x6b, 0x06, 0x13, 0x75, 0xf5, 0x11, 0x47,
0xfa, 0x73, 0x85, 0xec, 0x18, 0x2a, 0xda, 0x13, 0x3f, 0xec, 0xe6, 0xb5, 0xcf, 0x11, 0xad, 0xad, 0x3d, 0x97, 0xf9, 0x51, 0xe6, 0xe1, 0x93, 0x7f, 0xff, 0x75, 0x28, 0x45, 0x21, 0xe0, 0xec, 0xd7,
0xa5, 0x25, 0xa5, 0x75, 0x45, 0x2f, 0xff, 0xe1, 0x09, 0xe7, 0xec, 0x97, 0xa1, 0x1c, 0x3d, 0x1c, 0xa1, 0x9a, 0x38, 0x93, 0xcb, 0x54, 0x37, 0xd2, 0x8e, 0xf0, 0xae, 0xdf, 0x4e, 0x4f, 0x94, 0x15,
0xc3, 0x56, 0xb5, 0x87, 0x7c, 0xf4, 0x87, 0x6e, 0xd6, 0x9a, 0xb3, 0x09, 0x69, 0xc4, 0xa7, 0x97, 0xbf, 0x81, 0x15, 0x37, 0xd8, 0xaa, 0xa8, 0x58, 0x9e, 0x79, 0x7d, 0x84, 0x67, 0xe8, 0xe9, 0x0e,
0x2e, 0x88, 0xef, 0x73, 0xa8, 0x68, 0x8f, 0xc3, 0x44, 0x1d, 0x98, 0x7d, 0x80, 0x26, 0xea, 0x40, 0xcd, 0x17, 0x9a, 0x56, 0x48, 0x95, 0xdd, 0x9e, 0xd6, 0xd4, 0x12, 0xb5, 0xdd, 0xb9, 0x26, 0x55,
0xca, 0x5b, 0x32, 0xc6, 0x02, 0x56, 0x51, 0x61, 0x65, 0xa4, 0xef, 0xf0, 0xd2, 0x0b, 0xd8, 0x2e, 0x56, 0x77, 0x1b, 0xab, 0x5b, 0x65, 0xcb, 0x7a, 0x75, 0x2a, 0x72, 0x98, 0x71, 0xbc, 0xb7, 0x56,
0x2c, 0x4b, 0x2d, 0xf1, 0x98, 0x7f, 0x95, 0x69, 0x48, 0x79, 0x22, 0xf2, 0x51, 0x86, 0x7d, 0x02, 0x7f, 0xcf, 0x91, 0xdd, 0x89, 0x6f, 0x19, 0x4d, 0x79, 0xe7, 0x31, 0x22, 0x91, 0xd9, 0xc7, 0x1e,
0x25, 0xf5, 0x06, 0x10, 0x5b, 0x49, 0x7f, 0xcb, 0x68, 0x6d, 0x75, 0x06, 0x2e, 0x55, 0xba, 0xe7, 0x8d, 0x06, 0x56, 0xc5, 0x18, 0x4e, 0x9f, 0xfe, 0x9c, 0x23, 0x3b, 0x86, 0xb2, 0xf6, 0x04, 0x12,
0x00, 0xf1, 0x4b, 0x34, 0x11, 0x93, 0x98, 0x79, 0xd9, 0x26, 0xa2, 0x80, 0xd9, 0x67, 0x6b, 0x8c, 0xbb, 0x79, 0xed, 0x73, 0x4d, 0xeb, 0xeb, 0x69, 0x49, 0x69, 0x5d, 0xd1, 0xcb, 0x7f, 0x74, 0xc2,
0x15, 0xec, 0x60, 0x83, 0x21, 0x93, 0x70, 0xf9, 0x85, 0xba, 0x3c, 0xfb, 0x87, 0x50, 0xd1, 0x1e, 0x39, 0xfb, 0x65, 0x28, 0x45, 0x0f, 0xeb, 0xb0, 0x35, 0xed, 0xa1, 0x23, 0xfd, 0x21, 0xa0, 0xf5,
0xa3, 0x89, 0x86, 0x6f, 0xf6, 0x21, 0x9b, 0x68, 0xf8, 0x52, 0xde, 0xae, 0x31, 0xd6, 0xb0, 0xf4, 0xc6, 0x6c, 0x42, 0x1a, 0xf1, 0xe9, 0xa5, 0x0b, 0xe2, 0xfb, 0x0c, 0xca, 0xda, 0xe3, 0x39, 0x51,
0x25, 0x63, 0x5e, 0x94, 0x2e, 0xc4, 0x44, 0x29, 0xae, 0x89, 0x09, 0x3a, 0x83, 0x5a, 0xe2, 0xc5, 0x07, 0x66, 0x1f, 0xe8, 0x89, 0x3a, 0x90, 0xf2, 0xd6, 0x8e, 0xb1, 0x88, 0x55, 0x94, 0x59, 0x09,
0x99, 0x68, 0x85, 0xa6, 0xbd, 0x67, 0x13, 0xad, 0xd0, 0xd4, 0x47, 0x6a, 0x14, 0x9d, 0x19, 0x0b, 0xe9, 0x3b, 0xbc, 0xf4, 0x02, 0xb6, 0x07, 0x2b, 0x52, 0x03, 0x3e, 0xe6, 0x5f, 0x65, 0x1a, 0x52,
0xa2, 0x1e, 0xba, 0x3f, 0x4b, 0xab, 0xe9, 0x07, 0x50, 0xd1, 0x5e, 0x8f, 0x89, 0xfa, 0x32, 0xfb, 0x9e, 0xd0, 0x7c, 0x9c, 0x61, 0x1f, 0x43, 0x51, 0xbd, 0x91, 0xc4, 0x56, 0xd3, 0xdf, 0x7a, 0x5a,
0x50, 0x4d, 0xd4, 0x97, 0xb4, 0xc7, 0x66, 0x96, 0xb0, 0x8e, 0xba, 0x81, 0xa4, 0x80, 0xd7, 0xff, 0x5f, 0x9b, 0x81, 0x4b, 0x75, 0xf5, 0x73, 0x80, 0xf8, 0xa5, 0x9e, 0x88, 0x49, 0xcc, 0xbc, 0xfc,
0x8a, 0xb2, 0x7f, 0x1d, 0xea, 0xc9, 0x07, 0x65, 0xa2, 0xb5, 0x9f, 0xfa, 0x32, 0x4d, 0xb4, 0xf6, 0x13, 0x51, 0xc0, 0xec, 0xb3, 0x3e, 0xc6, 0x2a, 0x76, 0xb0, 0xce, 0x90, 0x49, 0xb8, 0xfc, 0x42,
0xaf, 0x79, 0x85, 0x46, 0x92, 0xf4, 0x83, 0xc5, 0xa8, 0x92, 0x87, 0x3f, 0x96, 0x87, 0xb5, 0xbe, 0x5d, 0x2e, 0xfe, 0x43, 0x28, 0x6b, 0x8f, 0xf5, 0x44, 0xc3, 0x37, 0xfb, 0xd0, 0x4f, 0x34, 0x7c,
0x64, 0x9f, 0x0a, 0x06, 0x27, 0x6f, 0x9f, 0x66, 0xab, 0x1a, 0xd5, 0xea, 0xd7, 0x58, 0x47, 0xeb, 0x29, 0x6f, 0xfb, 0x18, 0xeb, 0x58, 0xfa, 0xb2, 0xb1, 0x20, 0x4a, 0x17, 0x22, 0xb0, 0x14, 0x45,
0x65, 0xe6, 0xa2, 0xea, 0x24, 0x31, 0x63, 0xe1, 0xec, 0x29, 0x2c, 0x46, 0xc4, 0x1c, 0x5d, 0x27, 0xc5, 0x04, 0x9d, 0x41, 0x35, 0xf1, 0x22, 0x4f, 0xb4, 0x42, 0xd3, 0xde, 0xfb, 0x89, 0x56, 0x68,
0x1d, 0x44, 0x7d, 0x48, 0xbd, 0xb4, 0x7a, 0xad, 0x31, 0x9d, 0xfa, 0x28, 0x43, 0xdb, 0x1f, 0x5e, 0xea, 0x23, 0x3e, 0x8a, 0xce, 0x8c, 0x45, 0x51, 0x0f, 0xdd, 0x2f, 0xa6, 0xd5, 0xf4, 0x03, 0x28,
0xe2, 0xab, 0x6d, 0x7f, 0xfa, 0x8d, 0xd2, 0xda, 0xf6, 0x97, 0xb8, 0xeb, 0x77, 0x7a, 0xfb, 0x0b, 0x6b, 0xaf, 0xeb, 0x44, 0x7d, 0x99, 0x7d, 0xc8, 0x27, 0xea, 0x4b, 0xda, 0x63, 0x3c, 0xcb, 0x58,
0x1d, 0x51, 0x86, 0x0b, 0xf3, 0xd3, 0x97, 0x3b, 0xdf, 0xb9, 0xee, 0x32, 0x0c, 0x2a, 0xfe, 0x8d, 0x47, 0xcd, 0x40, 0x52, 0xc0, 0xeb, 0x91, 0x45, 0xd9, 0xbf, 0x0e, 0xb5, 0xe4, 0x83, 0x3b, 0xd1,
0x97, 0xdf, 0x95, 0x91, 0x64, 0x45, 0x8a, 0x9b, 0x3e, 0x94, 0xb1, 0x41, 0xec, 0x57, 0xa1, 0xaa, 0xda, 0x4f, 0x7d, 0xb9, 0x27, 0x5a, 0xfb, 0xd7, 0xbc, 0xd2, 0x23, 0x49, 0xfa, 0xe1, 0x52, 0x54,
0x3f, 0x42, 0xc1, 0x74, 0x9e, 0x30, 0x5d, 0xd3, 0xad, 0xd4, 0xb4, 0x24, 0x95, 0xb0, 0xaa, 0x5e, 0xc9, 0xa3, 0x1f, 0xcb, 0xc3, 0x6c, 0x5f, 0xb2, 0x4f, 0x04, 0x83, 0x93, 0xb7, 0x73, 0xb3, 0x35,
0x0d, 0xfb, 0x0c, 0x56, 0xa2, 0x61, 0xd6, 0x6f, 0x73, 0x08, 0xd8, 0xdd, 0x94, 0x3b, 0x1e, 0x12, 0x8d, 0x6a, 0xf5, 0x6b, 0xbe, 0xa3, 0xf5, 0x32, 0x73, 0x91, 0x77, 0x92, 0x98, 0xb1, 0x70, 0xf6,
0x83, 0x7d, 0xf3, 0xda, 0x4b, 0x20, 0x1e, 0x65, 0x04, 0xf5, 0x25, 0x2f, 0xdc, 0x8f, 0x77, 0x9e, 0x0c, 0x96, 0x22, 0x62, 0x8e, 0xae, 0xdb, 0x0e, 0xa2, 0x3e, 0xa4, 0x5e, 0xea, 0xbd, 0x5e, 0x9f,
0xb4, 0x77, 0x06, 0xe2, 0x9d, 0x27, 0xf5, 0x96, 0x7e, 0x45, 0x7d, 0x6c, 0x31, 0x31, 0x46, 0x14, 0x4e, 0x7d, 0x9c, 0xa1, 0xed, 0x0f, 0x2f, 0x39, 0xd6, 0xb6, 0x3f, 0xfd, 0xc6, 0x6d, 0x6d, 0xfb,
0x35, 0xcd, 0x7e, 0x00, 0xf3, 0xda, 0x55, 0x15, 0xdd, 0x2b, 0xb7, 0x1f, 0xad, 0xa4, 0xd9, 0x6b, 0x4b, 0xdc, 0x85, 0x3c, 0xbd, 0xfd, 0x85, 0x8e, 0x28, 0xc3, 0x85, 0x85, 0xe9, 0xcb, 0xaf, 0xef,
0x5b, 0xd7, 0xd2, 0xec, 0xaa, 0xc6, 0x2a, 0x96, 0xbf, 0x60, 0x24, 0x06, 0x47, 0xac, 0xa2, 0x4d, 0x5c, 0x77, 0x59, 0x08, 0x15, 0xff, 0xc6, 0xcb, 0xef, 0x12, 0x49, 0xb2, 0x22, 0xc5, 0x4d, 0x1f,
0xa8, 0xe8, 0xd7, 0x60, 0xbc, 0xa4, 0xdc, 0x55, 0x2d, 0x49, 0xbf, 0x21, 0xf4, 0x51, 0x86, 0xed, 0xc9, 0xd8, 0x29, 0xf6, 0xab, 0x50, 0xd1, 0x1f, 0xe9, 0x60, 0x3a, 0x4f, 0x98, 0xae, 0xe9, 0x56,
0x42, 0x63, 0xfa, 0xd2, 0xba, 0x88, 0xa7, 0xa4, 0x5d, 0xf4, 0xb7, 0x36, 0x95, 0x98, 0xb8, 0xea, 0x6a, 0x5a, 0x92, 0x4a, 0x58, 0x45, 0xaf, 0x86, 0x7d, 0x0a, 0xab, 0xd1, 0x30, 0xeb, 0xb7, 0x5d,
0x8e, 0x1d, 0xd2, 0xb9, 0x9b, 0xe8, 0x3d, 0x45, 0xcf, 0x9f, 0xde, 0xd5, 0x93, 0xef, 0x2c, 0x46, 0x04, 0xec, 0x6e, 0xca, 0x1d, 0x18, 0x89, 0xc1, 0xbe, 0x79, 0xed, 0x25, 0x19, 0x8f, 0x33, 0x82,
0xa5, 0xa5, 0xbd, 0xb0, 0x79, 0x3f, 0xf3, 0x28, 0xc3, 0x7e, 0x3b, 0x03, 0xd5, 0xc4, 0xa5, 0x4d, 0xfa, 0x92, 0x0f, 0x12, 0xc4, 0x3b, 0x4f, 0xda, 0x3b, 0x0c, 0xf1, 0xce, 0x93, 0xfa, 0x8a, 0x81,
0x89, 0x93, 0x0d, 0x53, 0xfd, 0x6c, 0xea, 0x69, 0x7a, 0x47, 0x0d, 0x13, 0x07, 0x71, 0xf7, 0xc1, 0xa2, 0x3e, 0xb6, 0x94, 0x18, 0x23, 0x8a, 0x2a, 0x67, 0x3f, 0x80, 0x05, 0xed, 0x2a, 0x8f, 0xee,
0xf7, 0x13, 0x93, 0xf4, 0xe3, 0x84, 0x5b, 0x72, 0x7d, 0xfa, 0xc1, 0xc5, 0x2f, 0xa7, 0x11, 0xf4, 0x95, 0xdb, 0x8f, 0x56, 0xd2, 0xec, 0xb5, 0xb6, 0xeb, 0x69, 0x36, 0x63, 0x63, 0x0d, 0xcb, 0x5f,
0x8b, 0x80, 0xbf, 0x7c, 0x94, 0x61, 0xff, 0x22, 0x03, 0xf5, 0x64, 0xbc, 0x41, 0xd4, 0xdd, 0xd4, 0x34, 0x12, 0x83, 0x23, 0x56, 0xd1, 0x16, 0x94, 0xf5, 0x6b, 0x42, 0x5e, 0x52, 0xee, 0x9a, 0x96,
0xc8, 0x86, 0x88, 0x94, 0xae, 0x09, 0x52, 0xf8, 0x01, 0xb6, 0xb2, 0xf7, 0xc0, 0x4c, 0xb4, 0x52, 0xa4, 0xdf, 0xa0, 0xfa, 0x38, 0xc3, 0xf6, 0xa0, 0x3e, 0x7d, 0xa9, 0x5f, 0xc4, 0x53, 0xd2, 0x2e,
0x3e, 0x15, 0xf1, 0xd3, 0xb5, 0x96, 0xfd, 0x22, 0xbd, 0x6f, 0xac, 0x22, 0xcd, 0xd8, 0xec, 0x7b, 0x42, 0x5c, 0x9f, 0x4a, 0x4c, 0x5c, 0x05, 0xc8, 0x0e, 0xe9, 0x5c, 0x52, 0xf4, 0xde, 0xa4, 0xe7,
0xb8, 0x11, 0xf9, 0xe9, 0xaf, 0xc7, 0x1a, 0xb9, 0xdf, 0xc8, 0x66, 0x70, 0x26, 0x7e, 0x48, 0xaf, 0x4f, 0xef, 0xea, 0xc9, 0x77, 0x28, 0xa3, 0xd2, 0xd2, 0x5e, 0x20, 0x7d, 0x90, 0x79, 0x9c, 0x61,
0x0b, 0xaa, 0xc0, 0x24, 0x41, 0xca, 0xaf, 0x5d, 0xc8, 0xdb, 0xd8, 0xb1, 0x37, 0x8c, 0x9b, 0x89, 0xbf, 0x9d, 0x81, 0x4a, 0xe2, 0x52, 0xab, 0xc4, 0xc9, 0x8f, 0xa9, 0x7e, 0x36, 0xf4, 0x34, 0xbd,
0x8e, 0x4d, 0x4b, 0x1f, 0x2d, 0x6a, 0xa2, 0x7c, 0x01, 0x36, 0xde, 0x3e, 0x67, 0x5e, 0x85, 0x4d, 0xa3, 0x86, 0x89, 0x83, 0xb8, 0xf7, 0xf0, 0xfb, 0x89, 0x49, 0xfa, 0x71, 0xc2, 0xe5, 0xba, 0x31,
0xad, 0x04, 0x1b, 0x39, 0xa2, 0x46, 0x4a, 0xf4, 0xc4, 0x7a, 0x7b, 0xcd, 0x62, 0x8c, 0x07, 0xd8, 0xfd, 0x20, 0xe5, 0x97, 0xd3, 0x08, 0xfa, 0x45, 0xc9, 0x5f, 0x3e, 0xce, 0xb0, 0x7f, 0x91, 0x81,
0xd6, 0xb7, 0x8d, 0xbb, 0xd7, 0xb6, 0xf5, 0x21, 0x06, 0x10, 0x88, 0x16, 0x1f, 0x02, 0xc4, 0xe1, 0x5a, 0x32, 0x96, 0x22, 0xea, 0x6e, 0x6a, 0xd4, 0x46, 0x44, 0x4a, 0xd7, 0x04, 0x60, 0xfc, 0x00,
0xa0, 0x6c, 0x2a, 0x28, 0x31, 0xe2, 0x42, 0xb3, 0x11, 0xa3, 0xc9, 0x45, 0xad, 0x62, 0x17, 0x45, 0x5b, 0xd9, 0x7b, 0x68, 0x26, 0x5a, 0x29, 0x9f, 0xd2, 0xf8, 0xe9, 0x5a, 0xcb, 0x7e, 0x91, 0xde,
0x89, 0xbf, 0x4c, 0x3c, 0x35, 0x0a, 0x97, 0xd4, 0x45, 0xb0, 0x64, 0xe4, 0x66, 0x42, 0x04, 0x9b, 0x7f, 0x56, 0x91, 0x78, 0x6c, 0xf6, 0xbd, 0xe0, 0x88, 0xfc, 0xf4, 0xd7, 0x75, 0x8d, 0xdc, 0x6f,
0x2e, 0x3f, 0xc1, 0x51, 0xa3, 0xd8, 0xc8, 0x23, 0xa8, 0xed, 0x7a, 0xde, 0x8b, 0xc9, 0x38, 0x3a, 0x64, 0x33, 0x38, 0x13, 0x3f, 0xa4, 0xd7, 0x17, 0x55, 0xd0, 0x95, 0x20, 0xe5, 0xd7, 0x2e, 0xe4,
0x82, 0x90, 0x8c, 0x17, 0xda, 0xb1, 0x83, 0xb3, 0xb5, 0xa9, 0x5e, 0x18, 0xf7, 0xb0, 0xa8, 0x35, 0x6d, 0xec, 0xd8, 0x1b, 0xc6, 0xcd, 0x44, 0xc7, 0xa6, 0xa5, 0x8f, 0x26, 0x35, 0x51, 0xbe, 0x90,
0xd6, 0xd4, 0x8a, 0x7a, 0xf8, 0xe3, 0x38, 0x06, 0xf5, 0x4b, 0x66, 0xc3, 0x42, 0xc4, 0xa8, 0xe3, 0x1b, 0x6f, 0x9f, 0x33, 0xaf, 0xe6, 0xa6, 0x56, 0x82, 0x8d, 0x1c, 0x51, 0x23, 0x25, 0x7a, 0x62,
0x38, 0xcf, 0x64, 0x31, 0x09, 0xf6, 0x3c, 0x5d, 0x45, 0x42, 0x57, 0x50, 0xad, 0x7d, 0x18, 0xa8, 0xbd, 0xbd, 0x66, 0x31, 0xc6, 0x43, 0x6c, 0xeb, 0xdb, 0xc6, 0xdd, 0x6b, 0xdb, 0xfa, 0x08, 0x83,
0x32, 0x1f, 0x65, 0xd8, 0x21, 0x54, 0xb7, 0x78, 0x1f, 0xef, 0xb0, 0xc0, 0xd8, 0x98, 0xc5, 0x44, 0x23, 0x44, 0x8b, 0x0f, 0x01, 0xe2, 0x70, 0x59, 0x36, 0x15, 0xb4, 0x19, 0x71, 0xa1, 0xd9, 0x88,
0x9c, 0x05, 0x05, 0xd5, 0xac, 0xd5, 0x12, 0xc0, 0xe4, 0xe6, 0x35, 0xb6, 0xaf, 0x7c, 0xfe, 0xc5, 0xda, 0xe4, 0xa2, 0x56, 0xb1, 0x9d, 0xa2, 0xc4, 0x5f, 0x26, 0x9e, 0x1a, 0x85, 0x93, 0xea, 0x22,
0xc3, 0x1f, 0xcb, 0xa8, 0x9b, 0x2f, 0xd5, 0xe6, 0x15, 0x47, 0x60, 0xe9, 0x12, 0x40, 0x32, 0x8c, 0x58, 0x32, 0xb2, 0x35, 0x21, 0x82, 0x4d, 0x97, 0x9f, 0xe0, 0xa8, 0x51, 0xec, 0xe8, 0x11, 0x54,
0x29, 0xb1, 0x79, 0xcd, 0x84, 0x31, 0x25, 0x86, 0x3a, 0x8a, 0xb7, 0x1a, 0xc2, 0xc2, 0x4c, 0xe4, 0xf7, 0x3c, 0xef, 0xc5, 0x64, 0x1c, 0x1d, 0xd1, 0x48, 0xc6, 0x42, 0xed, 0xda, 0xc1, 0xd9, 0xfa,
0x53, 0xb4, 0x6f, 0x5d, 0x17, 0x2f, 0xb5, 0x76, 0xef, 0x7a, 0x84, 0x64, 0x6d, 0x0f, 0x92, 0xb5, 0x54, 0x2f, 0x8c, 0x7b, 0x58, 0xd4, 0x3a, 0x6b, 0x68, 0x45, 0x3d, 0xfa, 0x71, 0x1c, 0xa3, 0xfb,
0x75, 0xa1, 0x46, 0x57, 0xfd, 0x1e, 0x73, 0x3a, 0xcd, 0x3a, 0x75, 0x15, 0x94, 0x7e, 0x54, 0x76, 0x25, 0xb3, 0x61, 0x31, 0x62, 0xd4, 0x71, 0x1c, 0x6c, 0xb2, 0x98, 0x04, 0x7b, 0x9e, 0xae, 0x22,
0x7a, 0x97, 0xc1, 0xb4, 0xa4, 0x98, 0x83, 0xe7, 0x19, 0xd9, 0x09, 0xbe, 0x6f, 0xa1, 0x1d, 0x1f, 0xa1, 0x2b, 0xa8, 0xd6, 0x3e, 0x0a, 0x54, 0x99, 0x8f, 0x33, 0xec, 0x10, 0x2a, 0xdb, 0xbc, 0x8f,
0x8d, 0x88, 0x71, 0xf6, 0x48, 0x6b, 0x44, 0x8c, 0x29, 0xa7, 0x4d, 0x95, 0x0e, 0xca, 0x96, 0xa3, 0x77, 0x7c, 0x60, 0xdc, 0xcf, 0x52, 0x22, 0x86, 0x84, 0x02, 0x86, 0xd6, 0xab, 0x09, 0x60, 0x72,
0xb2, 0x1f, 0xba, 0xde, 0x80, 0x8f, 0x64, 0xa9, 0xbf, 0x0c, 0x95, 0xa7, 0x3c, 0x54, 0xe7, 0x35, 0xf3, 0x1a, 0xdb, 0x57, 0x3e, 0xff, 0xe2, 0xd1, 0x8f, 0x65, 0x44, 0xd1, 0x97, 0x6a, 0xf3, 0x8a,
0x23, 0x81, 0x7e, 0xea, 0x00, 0xe7, 0x5a, 0xca, 0x29, 0xdb, 0x24, 0x6d, 0x52, 0xc9, 0x7c, 0x70, 0xa3, 0xcb, 0x74, 0x09, 0x20, 0x19, 0xa2, 0x95, 0xd8, 0xbc, 0x66, 0x42, 0xb4, 0x12, 0x43, 0x1d,
0xca, 0x89, 0x13, 0x5a, 0xce, 0xe0, 0x4b, 0xf6, 0x4b, 0x58, 0x78, 0x74, 0x3b, 0xc1, 0x8a, 0xd6, 0xc5, 0x92, 0x0d, 0x61, 0x71, 0x26, 0xaa, 0x2b, 0xda, 0xb7, 0xae, 0x8b, 0x05, 0x5b, 0xbf, 0x77,
0x4c, 0xbd, 0xf0, 0xf9, 0x29, 0x78, 0x5a, 0xc9, 0xa2, 0xcd, 0x9a, 0x60, 0xe9, 0x42, 0x45, 0xbb, 0x3d, 0x42, 0xb2, 0xb6, 0x87, 0xc9, 0xda, 0xba, 0x50, 0xa5, 0xab, 0x90, 0x8f, 0x39, 0x9d, 0xf6,
0xc5, 0x24, 0x1a, 0x9b, 0xd9, 0x5b, 0x6b, 0xa2, 0xb1, 0x49, 0xb9, 0xf4, 0xc4, 0xb8, 0x8f, 0xf5, 0x9d, 0xba, 0x2a, 0x4b, 0x3f, 0x4a, 0x3c, 0xbd, 0xcb, 0x60, 0x5a, 0x52, 0xcc, 0xc1, 0xf3, 0x9e,
0x18, 0xec, 0x5e, 0x5c, 0x0f, 0x5d, 0x74, 0x12, 0xd7, 0xf4, 0xf0, 0xc7, 0xf6, 0x28, 0xfc, 0x92, 0xec, 0x04, 0xdf, 0xff, 0xd0, 0x8e, 0xd7, 0x46, 0xc4, 0x38, 0x7b, 0xe4, 0x37, 0x22, 0xc6, 0x94,
0x7d, 0x4e, 0xd3, 0xa1, 0x9d, 0x47, 0x8d, 0x35, 0x94, 0xe9, 0xa3, 0xab, 0xd1, 0x60, 0x69, 0x49, 0xd3, 0xb8, 0x4a, 0x07, 0x65, 0x2b, 0x51, 0xd9, 0x8f, 0x5c, 0x6f, 0xc0, 0x47, 0xb2, 0xd4, 0x5f,
0x49, 0xad, 0x85, 0xaa, 0x42, 0xb1, 0xf1, 0x09, 0x40, 0x37, 0xf4, 0xc6, 0x5b, 0x36, 0x1f, 0x79, 0x86, 0xf2, 0x33, 0x1e, 0xaa, 0xf3, 0xac, 0x91, 0x40, 0x3f, 0x75, 0xc0, 0x75, 0x3d, 0xe5, 0x14,
0x6e, 0xcc, 0xd3, 0xe3, 0x13, 0x92, 0x31, 0x9f, 0xd4, 0x8e, 0x49, 0xb2, 0xcf, 0x35, 0x95, 0x2e, 0x72, 0x92, 0x36, 0xa9, 0x64, 0x3e, 0x38, 0xe5, 0xc4, 0x09, 0x2d, 0x67, 0xf0, 0x25, 0xfb, 0x25,
0x71, 0x92, 0x5a, 0x11, 0xf1, 0xb5, 0x87, 0x28, 0xa3, 0x01, 0x49, 0x39, 0x48, 0xf9, 0x28, 0xc3, 0x2c, 0x3c, 0xba, 0xbd, 0x61, 0x55, 0x6b, 0xa6, 0x5e, 0xf8, 0xc2, 0x14, 0x3c, 0xad, 0x64, 0xd1,
0x5a, 0x00, 0x71, 0x88, 0x5d, 0xa4, 0xa0, 0xcd, 0x44, 0xef, 0x45, 0xec, 0x35, 0x25, 0x1e, 0xef, 0x66, 0x4d, 0xb0, 0x74, 0xa1, 0xac, 0xdd, 0xf2, 0x12, 0x8d, 0xcd, 0xec, 0xad, 0x3e, 0xd1, 0xd8,
0x10, 0xca, 0x71, 0x6c, 0xd2, 0x6a, 0x7c, 0x29, 0x53, 0x22, 0x92, 0x29, 0x12, 0x17, 0x66, 0xe2, 0xa4, 0x5c, 0x0a, 0x63, 0x3c, 0xc0, 0x7a, 0x0c, 0x76, 0x2f, 0xae, 0x87, 0x2e, 0x82, 0x89, 0x6b,
0x82, 0x8c, 0x06, 0x0e, 0x15, 0xb0, 0x92, 0x18, 0xaa, 0x13, 0xce, 0x03, 0xe6, 0xc0, 0x22, 0x35, 0x7a, 0xf4, 0x63, 0x7b, 0x14, 0x7e, 0xc9, 0x3e, 0xa3, 0xe9, 0xd0, 0xce, 0xeb, 0xc6, 0x1a, 0xca,
0x30, 0x92, 0xcd, 0xf0, 0x64, 0x5f, 0xf4, 0xaa, 0xcc, 0x6c, 0x88, 0x4e, 0xc4, 0x35, 0x52, 0x03, 0xf4, 0xd1, 0xde, 0x68, 0xb0, 0xb4, 0xa4, 0xa4, 0xd6, 0x42, 0x55, 0xa1, 0xd8, 0xf8, 0x14, 0xa0,
0x4d, 0x12, 0x76, 0x26, 0x41, 0xad, 0x74, 0xaa, 0x50, 0x6c, 0x01, 0x23, 0x58, 0x98, 0x89, 0x65, 0x1b, 0x7a, 0xe3, 0x6d, 0x9b, 0x8f, 0x3c, 0x37, 0xe6, 0xe9, 0xf1, 0x09, 0xd2, 0x98, 0x4f, 0x6a,
0x88, 0x58, 0xc7, 0x75, 0xc1, 0x29, 0x11, 0xeb, 0xb8, 0x36, 0x0c, 0xc2, 0x58, 0xc6, 0x2a, 0xe7, 0xc7, 0x48, 0xd9, 0x67, 0x9a, 0x4a, 0x97, 0x38, 0x69, 0xae, 0x88, 0xf8, 0xda, 0x43, 0xa6, 0xd1,
0x0d, 0x40, 0xbd, 0xf2, 0xc2, 0x09, 0xfb, 0x67, 0xa2, 0xba, 0xdf, 0xcb, 0xc0, 0x62, 0x4a, 0xb4, 0x80, 0xa4, 0x1c, 0x34, 0x7d, 0x9c, 0x61, 0x4d, 0x80, 0x38, 0x7c, 0x30, 0x52, 0xd0, 0x66, 0x22,
0x02, 0x7b, 0x53, 0x99, 0x28, 0xae, 0x8d, 0x64, 0x58, 0x4b, 0xf5, 0x6a, 0x1b, 0x5d, 0xac, 0x67, 0x13, 0x23, 0xf6, 0x9a, 0x12, 0x6b, 0x78, 0x08, 0xa5, 0x38, 0xee, 0x6a, 0x2d, 0xbe, 0xb4, 0x2a,
0x8f, 0x3d, 0x4b, 0x6c, 0xa0, 0xe4, 0x54, 0x96, 0x2b, 0xf3, 0xa5, 0x12, 0x4c, 0xaa, 0xf8, 0xf2, 0x11, 0xa5, 0x15, 0x89, 0x0b, 0x33, 0x31, 0x4f, 0x46, 0x1d, 0x87, 0x0a, 0x58, 0x51, 0x0c, 0xd5,
0x05, 0xac, 0x52, 0x43, 0x5a, 0xc3, 0xe1, 0x94, 0xc7, 0xfd, 0x0d, 0xad, 0x15, 0x29, 0x51, 0x04, 0x09, 0xe7, 0x01, 0x73, 0x60, 0x89, 0x1a, 0x18, 0xc9, 0x66, 0x78, 0xf2, 0x31, 0x7a, 0x75, 0x67,
0x09, 0x65, 0x20, 0x19, 0x49, 0x70, 0x8d, 0xec, 0x4e, 0x4d, 0x65, 0x13, 0x68, 0x4c, 0x7b, 0xb2, 0x36, 0xfc, 0x28, 0xe2, 0x1a, 0xa9, 0x41, 0x34, 0x09, 0x3b, 0x93, 0xa0, 0x56, 0x3a, 0x75, 0x29,
0xd9, 0xf5, 0x65, 0xad, 0xdd, 0x4d, 0x28, 0xdb, 0x29, 0xde, 0xef, 0xaf, 0x61, 0x65, 0x77, 0x8d, 0xb6, 0x80, 0x11, 0x2c, 0xce, 0xc4, 0x69, 0x44, 0xac, 0xe3, 0xba, 0xc0, 0x9b, 0x88, 0x75, 0x5c,
0xb5, 0xb4, 0x71, 0x21, 0xfd, 0x5b, 0xcc, 0xc7, 0xff, 0x1f, 0xb9, 0xdd, 0xa7, 0xfa, 0x79, 0x37, 0x1b, 0xe2, 0x61, 0xac, 0x60, 0x95, 0x0b, 0x06, 0xa0, 0x5e, 0x79, 0xe1, 0x84, 0xfd, 0x33, 0x51,
0xba, 0x47, 0x3f, 0x3d, 0x48, 0x20, 0x52, 0xf7, 0xd3, 0xbd, 0xf6, 0xef, 0x60, 0xf5, 0xf7, 0x8c, 0xdd, 0xef, 0x65, 0x60, 0x29, 0x25, 0x12, 0x83, 0xbd, 0xa9, 0x4c, 0x14, 0xd7, 0x46, 0x69, 0xac,
0x5b, 0x69, 0xd5, 0xfb, 0x94, 0x85, 0x14, 0xff, 0xd5, 0xe9, 0x75, 0xad, 0x5a, 0x70, 0x2f, 0x6d, 0xa7, 0x7a, 0xec, 0x8d, 0x2e, 0xd6, 0xb3, 0xcf, 0x9e, 0x27, 0x36, 0x50, 0x72, 0x98, 0xcb, 0x95,
0xbe, 0xaf, 0x55, 0xbc, 0xa6, 0xc6, 0xfa, 0x06, 0xca, 0x90, 0x55, 0xdd, 0xcd, 0x1e, 0x2d, 0x9f, 0xf9, 0x52, 0x09, 0x26, 0x55, 0x7c, 0xf9, 0x02, 0xd6, 0xa8, 0x21, 0xcd, 0xe1, 0x70, 0x2a, 0x9a,
0x14, 0x7f, 0x7e, 0xb4, 0x7c, 0xd2, 0xfc, 0xf2, 0x49, 0xf9, 0x49, 0x79, 0xe4, 0x3f, 0xce, 0x3c, 0xe0, 0x0d, 0xad, 0x15, 0x29, 0x11, 0x12, 0x09, 0x65, 0x20, 0x19, 0x25, 0x71, 0x8d, 0xec, 0x4e,
0xd8, 0x78, 0xf7, 0x07, 0x5f, 0x3b, 0x75, 0xc2, 0xb3, 0xc9, 0xf1, 0x7a, 0xdf, 0x1b, 0x3d, 0x1c, 0x4d, 0x65, 0x13, 0xa8, 0x4f, 0x7b, 0xe9, 0xd9, 0xf5, 0x65, 0xad, 0xdf, 0x4d, 0x28, 0xdb, 0x29,
0x2a, 0xd3, 0xa6, 0x3c, 0xfe, 0xfe, 0x70, 0xe8, 0x0e, 0x1e, 0x62, 0xb1, 0xc7, 0x73, 0x63, 0xdf, 0x9e, 0xfd, 0xaf, 0x61, 0x65, 0x77, 0x8d, 0xf5, 0xb4, 0x71, 0x21, 0xfd, 0x5b, 0xcc, 0xc7, 0xff,
0x0b, 0xbd, 0x6f, 0xfe, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x84, 0x24, 0xba, 0xa4, 0x4f, 0x8a, 0x1f, 0x85, 0x14, 0x4c, 0xf5, 0xf3, 0x6e, 0xf4, 0xce, 0x40, 0x7a, 0x00, 0x44, 0xa4, 0xee, 0xa7,
0x00, 0x00, 0x47, 0x24, 0xbc, 0x83, 0xd5, 0xdf, 0x33, 0x6e, 0xa5, 0x55, 0xef, 0x53, 0x16, 0x52, 0xfc, 0xd7,
0xa6, 0xd7, 0xb5, 0x6a, 0xc1, 0xbd, 0xb4, 0xf9, 0xbe, 0x56, 0xf1, 0x9a, 0x1a, 0xeb, 0x1b, 0x28,
0x43, 0x56, 0xf4, 0x10, 0x82, 0x68, 0xf9, 0xa4, 0xc4, 0x2a, 0x44, 0xcb, 0x27, 0x2d, 0xe6, 0x20,
0x29, 0x3f, 0xa9, 0x68, 0x83, 0x8f, 0x32, 0x0f, 0x37, 0xef, 0xff, 0xe0, 0x6b, 0xa7, 0x4e, 0x78,
0x36, 0x39, 0xde, 0xe8, 0x7b, 0xa3, 0x47, 0x43, 0x65, 0xda, 0x94, 0xd7, 0x03, 0x3c, 0x1a, 0xba,
0x83, 0x47, 0x58, 0xec, 0xf1, 0xdc, 0xd8, 0xf7, 0x42, 0xef, 0x9b, 0xff, 0x37, 0x00, 0x00, 0xff,
0xff, 0x40, 0x26, 0x50, 0x15, 0x6f, 0x8b, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.

@ -3053,6 +3053,40 @@ message InvoiceSubscription {
uint64 settle_index = 2; uint64 settle_index = 2;
} }
enum PaymentFailureReason {
/**
Payment isn't failed (yet).
*/
FAILURE_REASON_NONE = 0;
/**
There are more routes to try, but the payment timeout was exceeded.
*/
FAILURE_REASON_TIMEOUT = 1;
/**
All possible routes were tried and failed permanently. Or were no
routes to the destination at all.
*/
FAILURE_REASON_NO_ROUTE = 2;
/**
A non-recoverable error has occured.
*/
FAILURE_REASON_ERROR = 3;
/**
Payment details incorrect (unknown hash, invalid amt or
invalid final cltv delta)
*/
FAILURE_REASON_INCORRECT_PAYMENT_DETAILS = 4;
/**
Insufficient local balance.
*/
FAILURE_REASON_INSUFFICIENT_BALANCE = 5;
}
message Payment { message Payment {
/// The payment hash /// The payment hash
string payment_hash = 1; string payment_hash = 1;
@ -3109,6 +3143,8 @@ message Payment {
older versions of lnd. older versions of lnd.
*/ */
uint64 payment_index = 15; uint64 payment_index = 15;
PaymentFailureReason failure_reason = 16;
} }
message HTLCAttempt { message HTLCAttempt {

@ -3996,9 +3996,25 @@
"type": "string", "type": "string",
"format": "uint64", "format": "uint64",
"description": "*\nThe creation index of this payment. Each payment can be uniquely identified\nby this index, which may not strictly increment by 1 for payments made in\nolder versions of lnd." "description": "*\nThe creation index of this payment. Each payment can be uniquely identified\nby this index, which may not strictly increment by 1 for payments made in\nolder versions of lnd."
},
"failure_reason": {
"$ref": "#/definitions/lnrpcPaymentFailureReason"
} }
} }
}, },
"lnrpcPaymentFailureReason": {
"type": "string",
"enum": [
"FAILURE_REASON_NONE",
"FAILURE_REASON_TIMEOUT",
"FAILURE_REASON_NO_ROUTE",
"FAILURE_REASON_ERROR",
"FAILURE_REASON_INCORRECT_PAYMENT_DETAILS",
"FAILURE_REASON_INSUFFICIENT_BALANCE"
],
"default": "FAILURE_REASON_NONE",
"description": " - FAILURE_REASON_NONE: *\nPayment isn't failed (yet).\n - FAILURE_REASON_TIMEOUT: *\nThere are more routes to try, but the payment timeout was exceeded.\n - FAILURE_REASON_NO_ROUTE: *\nAll possible routes were tried and failed permanently. Or were no\nroutes to the destination at all.\n - FAILURE_REASON_ERROR: *\nA non-recoverable error has occured.\n - FAILURE_REASON_INCORRECT_PAYMENT_DETAILS: *\nPayment details incorrect (unknown hash, invalid amt or\ninvalid final cltv delta)\n - FAILURE_REASON_INSUFFICIENT_BALANCE: *\nInsufficient local balance."
},
"lnrpcPeer": { "lnrpcPeer": {
"type": "object", "type": "object",
"properties": { "properties": {

@ -14271,13 +14271,13 @@ func testHoldInvoicePersistence(net *lntest.NetworkHarness, t *harnessTest) {
// Wait for inlight status update. // Wait for inlight status update.
for _, payStream := range paymentStreams { for _, payStream := range paymentStreams {
status, err := payStream.Recv() payment, err := payStream.Recv()
if err != nil { if err != nil {
t.Fatalf("Failed receiving status update: %v", err) t.Fatalf("Failed receiving status update: %v", err)
} }
if status.State != routerrpc.PaymentState_IN_FLIGHT { if payment.Status != lnrpc.Payment_IN_FLIGHT {
t.Fatalf("state not in flight: %v", status.State) t.Fatalf("state not in flight: %v", payment.Status)
} }
} }
@ -14355,7 +14355,7 @@ func testHoldInvoicePersistence(net *lntest.NetworkHarness, t *harnessTest) {
// Now after a restart, we must re-track the payments. We set up a // Now after a restart, we must re-track the payments. We set up a
// goroutine for each to track thir status updates. // goroutine for each to track thir status updates.
var ( var (
statusUpdates []chan *routerrpc.PaymentStatus statusUpdates []chan *lnrpc.Payment
wg sync.WaitGroup wg sync.WaitGroup
quit = make(chan struct{}) quit = make(chan struct{})
) )
@ -14377,20 +14377,20 @@ func testHoldInvoicePersistence(net *lntest.NetworkHarness, t *harnessTest) {
} }
// We set up a channel where we'll forward any status update. // We set up a channel where we'll forward any status update.
upd := make(chan *routerrpc.PaymentStatus) upd := make(chan *lnrpc.Payment)
wg.Add(1) wg.Add(1)
go func() { go func() {
defer wg.Done() defer wg.Done()
for { for {
status, err := payStream.Recv() payment, err := payStream.Recv()
if err != nil { if err != nil {
close(upd) close(upd)
return return
} }
select { select {
case upd <- status: case upd <- payment:
case <-quit: case <-quit:
return return
} }
@ -14400,17 +14400,17 @@ func testHoldInvoicePersistence(net *lntest.NetworkHarness, t *harnessTest) {
statusUpdates = append(statusUpdates, upd) statusUpdates = append(statusUpdates, upd)
} }
// Wait for the infligt status update. // Wait for the in-flight status update.
for _, upd := range statusUpdates { for _, upd := range statusUpdates {
select { select {
case status, ok := <-upd: case payment, ok := <-upd:
if !ok { if !ok {
t.Fatalf("failed getting status update") t.Fatalf("failed getting payment update")
} }
if status.State != routerrpc.PaymentState_IN_FLIGHT { if payment.Status != lnrpc.Payment_IN_FLIGHT {
t.Fatalf("state not in in flight: %v", t.Fatalf("state not in in flight: %v",
status.State) payment.Status)
} }
case <-time.After(5 * time.Second): case <-time.After(5 * time.Second):
t.Fatalf("in flight status not recevied") t.Fatalf("in flight status not recevied")
@ -14439,25 +14439,38 @@ func testHoldInvoicePersistence(net *lntest.NetworkHarness, t *harnessTest) {
// Make sure we get the expected status update. // Make sure we get the expected status update.
for i, upd := range statusUpdates { for i, upd := range statusUpdates {
select { // Read until the payment is in a terminal state.
case status, ok := <-upd: var payment *lnrpc.Payment
if !ok { for payment == nil {
t.Fatalf("failed getting status update") select {
} case p, ok := <-upd:
if !ok {
t.Fatalf("failed getting payment update")
}
if i%2 == 0 { if p.Status == lnrpc.Payment_IN_FLIGHT {
if status.State != routerrpc.PaymentState_SUCCEEDED { continue
t.Fatalf("state not suceeded : %v",
status.State)
}
} else {
if status.State != routerrpc.PaymentState_FAILED_INCORRECT_PAYMENT_DETAILS {
t.Fatalf("state not failed: %v",
status.State)
} }
payment = p
case <-time.After(5 * time.Second):
t.Fatalf("in flight status not recevied")
}
}
// Assert terminal payment state.
if i%2 == 0 {
if payment.Status != lnrpc.Payment_SUCCEEDED {
t.Fatalf("state not suceeded : %v",
payment.Status)
}
} else {
if payment.FailureReason !=
lnrpc.PaymentFailureReason_FAILURE_REASON_INCORRECT_PAYMENT_DETAILS {
t.Fatalf("state not failed: %v",
payment.FailureReason)
} }
case <-time.After(5 * time.Second):
t.Fatalf("in flight status not recevied")
} }
} }

90
multimutex/hash_mutex.go Normal file

@ -0,0 +1,90 @@
package multimutex
import (
"fmt"
"sync"
"github.com/lightningnetwork/lnd/lntypes"
)
// HashMutex is a struct that keeps track of a set of mutexes with a given hash.
// It can be used for making sure only one goroutine gets given the mutex per
// hash.
type HashMutex struct {
// mutexes is a map of hashes to a cntMutex. The cntMutex for
// a given hash will hold the mutex to be used by all
// callers requesting access for the hash, in addition to
// the count of callers.
mutexes map[lntypes.Hash]*cntMutex
// mapMtx is used to give synchronize concurrent access
// to the mutexes map.
mapMtx sync.Mutex
}
// NewHashMutex creates a new Mutex.
func NewHashMutex() *HashMutex {
return &HashMutex{
mutexes: make(map[lntypes.Hash]*cntMutex),
}
}
// Lock locks the mutex by the given hash. If the mutex is already
// locked by this hash, Lock blocks until the mutex is available.
func (c *HashMutex) Lock(hash lntypes.Hash) {
c.mapMtx.Lock()
mtx, ok := c.mutexes[hash]
if ok {
// If the mutex already existed in the map, we
// increment its counter, to indicate that there
// now is one more goroutine waiting for it.
mtx.cnt++
} else {
// If it was not in the map, it means no other
// goroutine has locked the mutex for this hash,
// and we can create a new mutex with count 1
// and add it to the map.
mtx = &cntMutex{
cnt: 1,
}
c.mutexes[hash] = mtx
}
c.mapMtx.Unlock()
// Acquire the mutex for this hash.
mtx.Lock()
}
// Unlock unlocks the mutex by the given hash. It is a run-time
// error if the mutex is not locked by the hash on entry to Unlock.
func (c *HashMutex) Unlock(hash lntypes.Hash) {
// Since we are done with all the work for this
// update, we update the map to reflect that.
c.mapMtx.Lock()
mtx, ok := c.mutexes[hash]
if !ok {
// The mutex not existing in the map means
// an unlock for an hash not currently locked
// was attempted.
panic(fmt.Sprintf("double unlock for hash %v",
hash))
}
// Decrement the counter. If the count goes to
// zero, it means this caller was the last one
// to wait for the mutex, and we can delete it
// from the map. We can do this safely since we
// are under the mapMtx, meaning that all other
// goroutines waiting for the mutex already
// have incremented it, or will create a new
// mutex when they get the mapMtx.
mtx.cnt--
if mtx.cnt == 0 {
delete(c.mutexes, hash)
}
c.mapMtx.Unlock()
// Unlock the mutex for this hash.
mtx.Unlock()
}

@ -58,6 +58,7 @@ func (cq *ConcurrentQueue) start() {
go func() { go func() {
defer cq.wg.Done() defer cq.wg.Done()
readLoop:
for { for {
nextElement := cq.overflow.Front() nextElement := cq.overflow.Front()
if nextElement == nil { if nextElement == nil {
@ -65,7 +66,10 @@ func (cq *ConcurrentQueue) start() {
// directly to the output channel. If output channel is full // directly to the output channel. If output channel is full
// though, push to overflow. // though, push to overflow.
select { select {
case item := <-cq.chanIn: case item, ok := <-cq.chanIn:
if !ok {
break readLoop
}
select { select {
case cq.chanOut <- item: case cq.chanOut <- item:
// Optimistically push directly to chanOut // Optimistically push directly to chanOut
@ -79,7 +83,10 @@ func (cq *ConcurrentQueue) start() {
// Overflow queue is not empty, so any new items get pushed to // Overflow queue is not empty, so any new items get pushed to
// the back to preserve order. // the back to preserve order.
select { select {
case item := <-cq.chanIn: case item, ok := <-cq.chanIn:
if !ok {
break readLoop
}
cq.overflow.PushBack(item) cq.overflow.PushBack(item)
case cq.chanOut <- nextElement.Value: case cq.chanOut <- nextElement.Value:
cq.overflow.Remove(nextElement) cq.overflow.Remove(nextElement)
@ -88,6 +95,22 @@ func (cq *ConcurrentQueue) start() {
} }
} }
} }
// Incoming channel has been closed. Empty overflow queue into
// the outgoing channel.
nextElement := cq.overflow.Front()
for nextElement != nil {
select {
case cq.chanOut <- nextElement.Value:
cq.overflow.Remove(nextElement)
case <-cq.quit:
return
}
nextElement = cq.overflow.Front()
}
// Close outgoing channel.
close(cq.chanOut)
}() }()
} }

@ -63,3 +63,25 @@ func TestConcurrentQueueIdempotentStop(t *testing.T) {
testQueueAddDrain(t, 100, 1, 10, 1000, 1000) testQueueAddDrain(t, 100, 1, 10, 1000, 1000)
} }
// TestQueueCloseIncoming tests that the queue properly handles an incoming
// channel that is closed.
func TestQueueCloseIncoming(t *testing.T) {
t.Parallel()
queue := queue.NewConcurrentQueue(10)
queue.Start()
queue.ChanIn() <- 1
close(queue.ChanIn())
item := <-queue.ChanOut()
if item.(int) != 1 {
t.Fatalf("unexpected item")
}
_, ok := <-queue.ChanOut()
if ok {
t.Fatalf("expected outgoing channel being closed")
}
}

@ -1,11 +1,12 @@
package routing package routing
import ( import (
"errors"
"sync" "sync"
"github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/channeldb"
"github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lntypes"
"github.com/lightningnetwork/lnd/multimutex"
"github.com/lightningnetwork/lnd/queue"
) )
// ControlTower tracks all outgoing payments made, whose primary purpose is to // ControlTower tracks all outgoing payments made, whose primary purpose is to
@ -50,29 +51,43 @@ type ControlTower interface {
FetchInFlightPayments() ([]*channeldb.InFlightPayment, error) FetchInFlightPayments() ([]*channeldb.InFlightPayment, error)
// SubscribePayment subscribes to updates for the payment with the given // SubscribePayment subscribes to updates for the payment with the given
// hash. It returns a boolean indicating whether the payment is still in // hash. A first update with the current state of the payment is always
// flight and a channel that provides the final outcome of the payment. // sent out immediately.
SubscribePayment(paymentHash lntypes.Hash) (bool, chan PaymentResult, SubscribePayment(paymentHash lntypes.Hash) (*ControlTowerSubscriber,
error) error)
} }
// PaymentResult is the struct describing the events received by payment // ControlTowerSubscriber contains the state for a payment update subscriber.
// subscribers. type ControlTowerSubscriber struct {
type PaymentResult struct { // Updates is the channel over which *channeldb.MPPayment updates can be
// Success indicates whether the payment was successful. // received.
Success bool Updates <-chan interface{}
// Preimage is the preimage of a successful payment. This serves as a queue *queue.ConcurrentQueue
// proof of payment. It is only set for successful payments. quit chan struct{}
Preimage lntypes.Preimage }
// FailureReason is a failure reason code indicating the reason the // newControlTowerSubscriber instantiates a new subscriber state object.
// payment failed. It is only set for failed payments. func newControlTowerSubscriber() *ControlTowerSubscriber {
FailureReason channeldb.FailureReason // Create a queue for payment updates.
queue := queue.NewConcurrentQueue(20)
queue.Start()
// HTLCs is a list of HTLCs that have been attempted in order to settle return &ControlTowerSubscriber{
// the payment. Updates: queue.ChanOut(),
HTLCs []channeldb.HTLCAttempt queue: queue,
quit: make(chan struct{}),
}
}
// Close signals that the subscriber is no longer interested in updates.
func (s *ControlTowerSubscriber) Close() {
// Close quit channel so that any pending writes to the queue are
// cancelled.
close(s.quit)
// Stop the queue goroutine so that it won't leak.
s.queue.Stop()
} }
// controlTower is persistent implementation of ControlTower to restrict // controlTower is persistent implementation of ControlTower to restrict
@ -80,15 +95,21 @@ type PaymentResult struct {
type controlTower struct { type controlTower struct {
db *channeldb.PaymentControl db *channeldb.PaymentControl
subscribers map[lntypes.Hash][]chan PaymentResult subscribers map[lntypes.Hash][]*ControlTowerSubscriber
subscribersMtx sync.Mutex subscribersMtx sync.Mutex
// paymentsMtx provides synchronization on the payment level to ensure
// that no race conditions occur in between updating the database and
// sending a notification.
paymentsMtx *multimutex.HashMutex
} }
// NewControlTower creates a new instance of the controlTower. // NewControlTower creates a new instance of the controlTower.
func NewControlTower(db *channeldb.PaymentControl) ControlTower { func NewControlTower(db *channeldb.PaymentControl) ControlTower {
return &controlTower{ return &controlTower{
db: db, db: db,
subscribers: make(map[lntypes.Hash][]chan PaymentResult), subscribers: make(map[lntypes.Hash][]*ControlTowerSubscriber),
paymentsMtx: multimutex.NewHashMutex(),
} }
} }
@ -107,7 +128,18 @@ func (p *controlTower) InitPayment(paymentHash lntypes.Hash,
func (p *controlTower) RegisterAttempt(paymentHash lntypes.Hash, func (p *controlTower) RegisterAttempt(paymentHash lntypes.Hash,
attempt *channeldb.HTLCAttemptInfo) error { attempt *channeldb.HTLCAttemptInfo) error {
return p.db.RegisterAttempt(paymentHash, attempt) p.paymentsMtx.Lock(paymentHash)
defer p.paymentsMtx.Unlock(paymentHash)
payment, err := p.db.RegisterAttempt(paymentHash, attempt)
if err != nil {
return err
}
// Notify subscribers of the attempt registration.
p.notifySubscribers(paymentHash, payment)
return nil
} }
// SettleAttempt marks the given attempt settled with the preimage. If // SettleAttempt marks the given attempt settled with the preimage. If
@ -116,15 +148,16 @@ func (p *controlTower) RegisterAttempt(paymentHash lntypes.Hash,
func (p *controlTower) SettleAttempt(paymentHash lntypes.Hash, func (p *controlTower) SettleAttempt(paymentHash lntypes.Hash,
attemptID uint64, settleInfo *channeldb.HTLCSettleInfo) error { attemptID uint64, settleInfo *channeldb.HTLCSettleInfo) error {
p.paymentsMtx.Lock(paymentHash)
defer p.paymentsMtx.Unlock(paymentHash)
payment, err := p.db.SettleAttempt(paymentHash, attemptID, settleInfo) payment, err := p.db.SettleAttempt(paymentHash, attemptID, settleInfo)
if err != nil { if err != nil {
return err return err
} }
// Notify subscribers of success event. // Notify subscribers of success event.
p.notifyFinalEvent( p.notifySubscribers(paymentHash, payment)
paymentHash, createSuccessResult(payment.HTLCs),
)
return nil return nil
} }
@ -133,7 +166,18 @@ func (p *controlTower) SettleAttempt(paymentHash lntypes.Hash,
func (p *controlTower) FailAttempt(paymentHash lntypes.Hash, func (p *controlTower) FailAttempt(paymentHash lntypes.Hash,
attemptID uint64, failInfo *channeldb.HTLCFailInfo) error { attemptID uint64, failInfo *channeldb.HTLCFailInfo) error {
return p.db.FailAttempt(paymentHash, attemptID, failInfo) p.paymentsMtx.Lock(paymentHash)
defer p.paymentsMtx.Unlock(paymentHash)
payment, err := p.db.FailAttempt(paymentHash, attemptID, failInfo)
if err != nil {
return err
}
// Notify subscribers of failed attempt.
p.notifySubscribers(paymentHash, payment)
return nil
} }
// FetchPayment fetches the payment corresponding to the given payment hash. // FetchPayment fetches the payment corresponding to the given payment hash.
@ -143,35 +187,6 @@ func (p *controlTower) FetchPayment(paymentHash lntypes.Hash) (
return p.db.FetchPayment(paymentHash) return p.db.FetchPayment(paymentHash)
} }
// createSuccessResult creates a success result to send to subscribers.
func createSuccessResult(htlcs []channeldb.HTLCAttempt) *PaymentResult {
// Extract any preimage from the list of HTLCs.
var preimage lntypes.Preimage
for _, htlc := range htlcs {
if htlc.Settle != nil {
preimage = htlc.Settle.Preimage
break
}
}
return &PaymentResult{
Success: true,
Preimage: preimage,
HTLCs: htlcs,
}
}
// createFailResult creates a failed result to send to subscribers.
func createFailedResult(htlcs []channeldb.HTLCAttempt,
reason channeldb.FailureReason) *PaymentResult {
return &PaymentResult{
Success: false,
FailureReason: reason,
HTLCs: htlcs,
}
}
// Fail transitions a payment into the Failed state, and records the reason the // Fail transitions a payment into the Failed state, and records the reason the
// payment failed. After invoking this method, InitPayment should return nil on // payment failed. After invoking this method, InitPayment should return nil on
// its next call for this payment hash, allowing the switch to make a // its next call for this payment hash, allowing the switch to make a
@ -179,17 +194,16 @@ func createFailedResult(htlcs []channeldb.HTLCAttempt,
func (p *controlTower) Fail(paymentHash lntypes.Hash, func (p *controlTower) Fail(paymentHash lntypes.Hash,
reason channeldb.FailureReason) error { reason channeldb.FailureReason) error {
p.paymentsMtx.Lock(paymentHash)
defer p.paymentsMtx.Unlock(paymentHash)
payment, err := p.db.Fail(paymentHash, reason) payment, err := p.db.Fail(paymentHash, reason)
if err != nil { if err != nil {
return err return err
} }
// Notify subscribers of fail event. // Notify subscribers of fail event.
p.notifyFinalEvent( p.notifySubscribers(paymentHash, payment)
paymentHash, createFailedResult(
payment.HTLCs, reason,
),
)
return nil return nil
} }
@ -199,86 +213,81 @@ func (p *controlTower) FetchInFlightPayments() ([]*channeldb.InFlightPayment, er
return p.db.FetchInFlightPayments() return p.db.FetchInFlightPayments()
} }
// SubscribePayment subscribes to updates for the payment with the given hash. // SubscribePayment subscribes to updates for the payment with the given hash. A
// It returns a boolean indicating whether the payment is still in flight and a // first update with the current state of the payment is always sent out
// channel that provides the final outcome of the payment. // immediately.
func (p *controlTower) SubscribePayment(paymentHash lntypes.Hash) ( func (p *controlTower) SubscribePayment(paymentHash lntypes.Hash) (
bool, chan PaymentResult, error) { *ControlTowerSubscriber, error) {
// Create a channel with buffer size 1. For every payment there will be // Take lock before querying the db to prevent missing or duplicating an
// exactly one event sent. // update.
c := make(chan PaymentResult, 1) p.paymentsMtx.Lock(paymentHash)
defer p.paymentsMtx.Unlock(paymentHash)
// Take lock before querying the db to prevent this scenario:
// FetchPayment returns us an in-flight state -> payment succeeds, but
// there is no subscriber to notify yet -> we add ourselves as a
// subscriber -> ... we will never receive a notification.
p.subscribersMtx.Lock()
defer p.subscribersMtx.Unlock()
payment, err := p.db.FetchPayment(paymentHash) payment, err := p.db.FetchPayment(paymentHash)
if err != nil { if err != nil {
return false, nil, err return nil, err
} }
var event PaymentResult subscriber := newControlTowerSubscriber()
switch payment.Status { // Always write current payment state to the channel.
subscriber.queue.ChanIn() <- payment
// Payment is currently in flight. Register this subscriber and // Payment is currently in flight. Register this subscriber for further
// return without writing a result to the channel yet. // updates. Otherwise this update is the final update and the incoming
case channeldb.StatusInFlight: // channel can be closed. This will close the queue's outgoing channel
// when all updates have been written.
if payment.Status == channeldb.StatusInFlight {
p.subscribersMtx.Lock()
p.subscribers[paymentHash] = append( p.subscribers[paymentHash] = append(
p.subscribers[paymentHash], c, p.subscribers[paymentHash], subscriber,
) )
p.subscribersMtx.Unlock()
return true, c, nil } else {
close(subscriber.queue.ChanIn())
// Payment already succeeded. It is not necessary to register as
// a subscriber, because we can send the result on the channel
// immediately.
case channeldb.StatusSucceeded:
event = *createSuccessResult(payment.HTLCs)
// Payment already failed. It is not necessary to register as a
// subscriber, because we can send the result on the channel
// immediately.
case channeldb.StatusFailed:
event = *createFailedResult(
payment.HTLCs, *payment.FailureReason,
)
default:
return false, nil, errors.New("unknown payment status")
} }
// Write immediate result to the channel. return subscriber, nil
c <- event
close(c)
return false, c, nil
} }
// notifyFinalEvent sends a final payment event to all subscribers of this // notifySubscribers sends a final payment event to all subscribers of this
// payment. The channel will be closed after this. // payment. The channel will be closed after this. Note that this function must
func (p *controlTower) notifyFinalEvent(paymentHash lntypes.Hash, // be executed atomically (by means of a lock) with the database update to
event *PaymentResult) { // guarantuee consistency of the notifications.
func (p *controlTower) notifySubscribers(paymentHash lntypes.Hash,
event *channeldb.MPPayment) {
// Get all subscribers for this hash. As there is only a single outcome, // Get all subscribers for this payment.
// the subscriber list can be cleared.
p.subscribersMtx.Lock() p.subscribersMtx.Lock()
list, ok := p.subscribers[paymentHash] list, ok := p.subscribers[paymentHash]
if !ok { if !ok {
p.subscribersMtx.Unlock() p.subscribersMtx.Unlock()
return return
} }
delete(p.subscribers, paymentHash)
// If the payment reached a terminal state, the subscriber list can be
// cleared. There won't be any more updates.
terminal := event.Status != channeldb.StatusInFlight
if terminal {
delete(p.subscribers, paymentHash)
}
p.subscribersMtx.Unlock() p.subscribersMtx.Unlock()
// Notify all subscribers of the event. The subscriber channel is // Notify all subscribers of the event.
// buffered, so it cannot block here.
for _, subscriber := range list { for _, subscriber := range list {
subscriber <- *event select {
close(subscriber) case subscriber.queue.ChanIn() <- event:
// If this event is the last, close the incoming channel
// of the queue. This will signal the subscriber that
// there won't be any more updates.
if terminal {
close(subscriber.queue.ChanIn())
}
// If subscriber disappeared, skip notification. For further
// notifications, we'll keep skipping over this subscriber.
case <-subscriber.quit:
}
} }
} }

@ -55,7 +55,7 @@ func TestControlTowerSubscribeUnknown(t *testing.T) {
pControl := NewControlTower(channeldb.NewPaymentControl(db)) pControl := NewControlTower(channeldb.NewPaymentControl(db))
// Subscription should fail when the payment is not known. // Subscription should fail when the payment is not known.
_, _, err = pControl.SubscribePayment(lntypes.Hash{1}) _, err = pControl.SubscribePayment(lntypes.Hash{1})
if err != channeldb.ErrPaymentNotInitiated { if err != channeldb.ErrPaymentNotInitiated {
t.Fatal("expected subscribe to fail for unknown payment") t.Fatal("expected subscribe to fail for unknown payment")
} }
@ -86,13 +86,10 @@ func TestControlTowerSubscribeSuccess(t *testing.T) {
// Subscription should succeed and immediately report the InFlight // Subscription should succeed and immediately report the InFlight
// status. // status.
inFlight, subscriber1, err := pControl.SubscribePayment(info.PaymentHash) subscriber1, err := pControl.SubscribePayment(info.PaymentHash)
if err != nil { if err != nil {
t.Fatalf("expected subscribe to succeed, but got: %v", err) t.Fatalf("expected subscribe to succeed, but got: %v", err)
} }
if !inFlight {
t.Fatalf("unexpected payment to be in flight")
}
// Register an attempt. // Register an attempt.
err = pControl.RegisterAttempt(info.PaymentHash, attempt) err = pControl.RegisterAttempt(info.PaymentHash, attempt)
@ -101,13 +98,10 @@ func TestControlTowerSubscribeSuccess(t *testing.T) {
} }
// Register a second subscriber after the first attempt has started. // Register a second subscriber after the first attempt has started.
inFlight, subscriber2, err := pControl.SubscribePayment(info.PaymentHash) subscriber2, err := pControl.SubscribePayment(info.PaymentHash)
if err != nil { if err != nil {
t.Fatalf("expected subscribe to succeed, but got: %v", err) t.Fatalf("expected subscribe to succeed, but got: %v", err)
} }
if !inFlight {
t.Fatalf("unexpected payment to be in flight")
}
// Mark the payment as successful. // Mark the payment as successful.
err = pControl.SettleAttempt( err = pControl.SettleAttempt(
@ -121,32 +115,33 @@ func TestControlTowerSubscribeSuccess(t *testing.T) {
} }
// Register a third subscriber after the payment succeeded. // Register a third subscriber after the payment succeeded.
inFlight, subscriber3, err := pControl.SubscribePayment(info.PaymentHash) subscriber3, err := pControl.SubscribePayment(info.PaymentHash)
if err != nil { if err != nil {
t.Fatalf("expected subscribe to succeed, but got: %v", err) t.Fatalf("expected subscribe to succeed, but got: %v", err)
} }
if inFlight {
t.Fatalf("expected payment to be finished")
}
// We expect all subscribers to now report the final outcome followed by // We expect all subscribers to now report the final outcome followed by
// no other events. // no other events.
subscribers := []chan PaymentResult{ subscribers := []*ControlTowerSubscriber{
subscriber1, subscriber2, subscriber3, subscriber1, subscriber2, subscriber3,
} }
for _, s := range subscribers { for _, s := range subscribers {
var result PaymentResult var result *channeldb.MPPayment
select { for result == nil || result.Status == channeldb.StatusInFlight {
case result = <-s: select {
case <-time.After(testTimeout): case item := <-s.Updates:
t.Fatal("timeout waiting for payment result") result = item.(*channeldb.MPPayment)
case <-time.After(testTimeout):
t.Fatal("timeout waiting for payment result")
}
} }
if !result.Success { if result.Status != channeldb.StatusSucceeded {
t.Fatal("unexpected payment state") t.Fatal("unexpected payment state")
} }
if result.Preimage != preimg { settle, _ := result.TerminalInfo()
if settle.Preimage != preimg {
t.Fatal("unexpected preimage") t.Fatal("unexpected preimage")
} }
if len(result.HTLCs) != 1 { if len(result.HTLCs) != 1 {
@ -161,7 +156,7 @@ func TestControlTowerSubscribeSuccess(t *testing.T) {
// After the final event, we expect the channel to be closed. // After the final event, we expect the channel to be closed.
select { select {
case _, ok := <-s: case _, ok := <-s.Updates:
if ok { if ok {
t.Fatal("expected channel to be closed") t.Fatal("expected channel to be closed")
} }
@ -204,7 +199,7 @@ func testPaymentControlSubscribeFail(t *testing.T, registerAttempt bool) {
} }
// Subscription should succeed. // Subscription should succeed.
_, subscriber1, err := pControl.SubscribePayment(info.PaymentHash) subscriber1, err := pControl.SubscribePayment(info.PaymentHash)
if err != nil { if err != nil {
t.Fatalf("expected subscribe to succeed, but got: %v", err) t.Fatalf("expected subscribe to succeed, but got: %v", err)
} }
@ -235,29 +230,29 @@ func testPaymentControlSubscribeFail(t *testing.T, registerAttempt bool) {
} }
// Register a second subscriber after the payment failed. // Register a second subscriber after the payment failed.
inFlight, subscriber2, err := pControl.SubscribePayment(info.PaymentHash) subscriber2, err := pControl.SubscribePayment(info.PaymentHash)
if err != nil { if err != nil {
t.Fatalf("expected subscribe to succeed, but got: %v", err) t.Fatalf("expected subscribe to succeed, but got: %v", err)
} }
if inFlight {
t.Fatalf("expected payment to be finished")
}
// We expect all subscribers to now report the final outcome followed by // We expect all subscribers to now report the final outcome followed by
// no other events. // no other events.
subscribers := []chan PaymentResult{ subscribers := []*ControlTowerSubscriber{
subscriber1, subscriber2, subscriber1, subscriber2,
} }
for _, s := range subscribers { for _, s := range subscribers {
var result PaymentResult var result *channeldb.MPPayment
select { for result == nil || result.Status == channeldb.StatusInFlight {
case result = <-s: select {
case <-time.After(testTimeout): case item := <-s.Updates:
t.Fatal("timeout waiting for payment result") result = item.(*channeldb.MPPayment)
case <-time.After(testTimeout):
t.Fatal("timeout waiting for payment result")
}
} }
if result.Success { if result.Status == channeldb.StatusSucceeded {
t.Fatal("unexpected payment state") t.Fatal("unexpected payment state")
} }
@ -282,13 +277,13 @@ func testPaymentControlSubscribeFail(t *testing.T, registerAttempt bool) {
len(result.HTLCs)) len(result.HTLCs))
} }
if result.FailureReason != channeldb.FailureReasonTimeout { if *result.FailureReason != channeldb.FailureReasonTimeout {
t.Fatal("unexpected failure reason") t.Fatal("unexpected failure reason")
} }
// After the final event, we expect the channel to be closed. // After the final event, we expect the channel to be closed.
select { select {
case _, ok := <-s: case _, ok := <-s.Updates:
if ok { if ok {
t.Fatal("expected channel to be closed") t.Fatal("expected channel to be closed")
} }

@ -457,7 +457,7 @@ func (m *mockControlTower) FetchInFlightPayments() (
} }
func (m *mockControlTower) SubscribePayment(paymentHash lntypes.Hash) ( func (m *mockControlTower) SubscribePayment(paymentHash lntypes.Hash) (
bool, chan PaymentResult, error) { *ControlTowerSubscriber, error) {
return false, nil, errors.New("not implemented") return nil, errors.New("not implemented")
} }

@ -207,7 +207,7 @@ func (p *paymentLifecycle) resumePayment() ([32]byte, *route.Route, error) {
uint32(state.numShardsInFlight), uint32(p.currentHeight), uint32(state.numShardsInFlight), uint32(p.currentHeight),
) )
if err != nil { if err != nil {
log.Warnf("Failed to find route for payment %x: %v", log.Warnf("Failed to find route for payment %v: %v",
p.paymentHash, err) p.paymentHash, err)
routeErr, ok := err.(noRouteError) routeErr, ok := err.(noRouteError)
@ -489,7 +489,7 @@ func (p *shardHandler) collectResult(attempt *channeldb.HTLCAttemptInfo) (
// case we can safely send a new payment attempt, and wait for its // case we can safely send a new payment attempt, and wait for its
// result to be available. // result to be available.
case err == htlcswitch.ErrPaymentIDNotFound: case err == htlcswitch.ErrPaymentIDNotFound:
log.Debugf("Payment ID %v for hash %x not found in "+ log.Debugf("Payment ID %v for hash %v not found in "+
"the Switch, retrying.", attempt.AttemptID, "the Switch, retrying.", attempt.AttemptID,
p.paymentHash) p.paymentHash)
@ -544,7 +544,7 @@ func (p *shardHandler) collectResult(attempt *channeldb.HTLCAttemptInfo) (
} }
// We successfully got a payment result back from the switch. // We successfully got a payment result back from the switch.
log.Debugf("Payment %x succeeded with pid=%v", log.Debugf("Payment %v succeeded with pid=%v",
p.paymentHash, attempt.AttemptID) p.paymentHash, attempt.AttemptID)
// Report success to mission control. // Report success to mission control.
@ -637,7 +637,7 @@ func (p *shardHandler) sendPaymentAttempt(
attempt *channeldb.HTLCAttemptInfo, firstHop lnwire.ShortChannelID, attempt *channeldb.HTLCAttemptInfo, firstHop lnwire.ShortChannelID,
htlcAdd *lnwire.UpdateAddHTLC) error { htlcAdd *lnwire.UpdateAddHTLC) error {
log.Tracef("Attempting to send payment %x (pid=%v), "+ log.Tracef("Attempting to send payment %v (pid=%v), "+
"using route: %v", p.paymentHash, attempt.AttemptID, "using route: %v", p.paymentHash, attempt.AttemptID,
newLogClosure(func() string { newLogClosure(func() string {
return spew.Sdump(attempt.Route) return spew.Sdump(attempt.Route)
@ -653,12 +653,12 @@ func (p *shardHandler) sendPaymentAttempt(
) )
if err != nil { if err != nil {
log.Errorf("Failed sending attempt %d for payment "+ log.Errorf("Failed sending attempt %d for payment "+
"%x to switch: %v", attempt.AttemptID, "%v to switch: %v", attempt.AttemptID,
p.paymentHash, err) p.paymentHash, err)
return err return err
} }
log.Debugf("Payment %x (pid=%v) successfully sent to switch, route: %v", log.Debugf("Payment %v (pid=%v) successfully sent to switch, route: %v",
p.paymentHash, attempt.AttemptID, &attempt.Route) p.paymentHash, attempt.AttemptID, &attempt.Route)
return nil return nil
@ -678,7 +678,7 @@ func (p *shardHandler) handleSendError(attempt *channeldb.HTLCAttemptInfo,
return nil return nil
} }
log.Debugf("Payment %x failed: final_outcome=%v, raw_err=%v", log.Debugf("Payment %v failed: final_outcome=%v, raw_err=%v",
p.paymentHash, *reason, sendErr) p.paymentHash, *reason, sendErr)
err := p.router.cfg.Control.Fail(p.paymentHash, *reason) err := p.router.cfg.Control.Fail(p.paymentHash, *reason)

@ -5184,94 +5184,21 @@ func (r *rpcServer) ListPayments(ctx context.Context,
} }
for _, payment := range paymentsQuerySlice.Payments { for _, payment := range paymentsQuerySlice.Payments {
// Fetch the payment's route and preimage. If no HTLC was payment := payment
// successful, an empty route and preimage will be used.
var (
route route.Route
preimage lntypes.Preimage
)
for _, htlc := range payment.HTLCs {
// Display the last route attempted.
route = htlc.Route
// If any of the htlcs have settled, extract a valid rpcPayment, err := r.routerBackend.MarshallPayment(&payment)
// preimage.
if htlc.Settle != nil {
preimage = htlc.Settle.Preimage
}
}
// Encode the hops from the successful route, if any.
path := make([]string, len(route.Hops))
for i, hop := range route.Hops {
path[i] = hex.EncodeToString(hop.PubKeyBytes[:])
}
msatValue := int64(payment.Info.Value)
satValue := int64(payment.Info.Value.ToSatoshis())
status, err := convertPaymentStatus(payment.Status)
if err != nil { if err != nil {
return nil, err return nil, err
} }
htlcs := make([]*lnrpc.HTLCAttempt, 0, len(payment.HTLCs)) paymentsResp.Payments = append(
for _, dbHTLC := range payment.HTLCs { paymentsResp.Payments, rpcPayment,
htlc, err := r.routerBackend.MarshalHTLCAttempt(dbHTLC) )
if err != nil {
return nil, err
}
htlcs = append(htlcs, htlc)
}
paymentHash := payment.Info.PaymentHash
creationTimeNS := routerrpc.MarshalTimeNano(payment.Info.CreationTime)
paymentsResp.Payments = append(paymentsResp.Payments, &lnrpc.Payment{
PaymentHash: hex.EncodeToString(paymentHash[:]),
Value: satValue,
ValueMsat: msatValue,
ValueSat: satValue,
CreationDate: payment.Info.CreationTime.Unix(),
CreationTimeNs: creationTimeNS,
Path: path,
Fee: int64(route.TotalFees().ToSatoshis()),
FeeSat: int64(route.TotalFees().ToSatoshis()),
FeeMsat: int64(route.TotalFees()),
PaymentPreimage: hex.EncodeToString(preimage[:]),
PaymentRequest: string(payment.Info.PaymentRequest),
Status: status,
Htlcs: htlcs,
PaymentIndex: payment.SequenceNum,
})
} }
return paymentsResp, nil return paymentsResp, nil
} }
// convertPaymentStatus converts a channeldb.PaymentStatus to the type expected
// by the RPC.
func convertPaymentStatus(dbStatus channeldb.PaymentStatus) (
lnrpc.Payment_PaymentStatus, error) {
switch dbStatus {
case channeldb.StatusUnknown:
return lnrpc.Payment_UNKNOWN, nil
case channeldb.StatusInFlight:
return lnrpc.Payment_IN_FLIGHT, nil
case channeldb.StatusSucceeded:
return lnrpc.Payment_SUCCEEDED, nil
case channeldb.StatusFailed:
return lnrpc.Payment_FAILED, nil
default:
return 0, fmt.Errorf("unhandled payment status %v", dbStatus)
}
}
// DeleteAllPayments deletes all outgoing payments from DB. // DeleteAllPayments deletes all outgoing payments from DB.
func (r *rpcServer) DeleteAllPayments(ctx context.Context, func (r *rpcServer) DeleteAllPayments(ctx context.Context,
_ *lnrpc.DeleteAllPaymentsRequest) (*lnrpc.DeleteAllPaymentsResponse, error) { _ *lnrpc.DeleteAllPaymentsRequest) (*lnrpc.DeleteAllPaymentsResponse, error) {