Merge pull request #3595 from wpaulino/max-cltv-expiry-pathfinding

routing+routerrpc: take max cltv limit into account within path finding
This commit is contained in:
Olaoluwa Osuntokun 2019-10-14 17:29:45 +02:00 committed by GitHub
commit faacd8d5c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 415 additions and 346 deletions

@ -3001,6 +3001,7 @@ var queryRoutesCommand = cli.Command{
Name: "use_mc",
Usage: "use mission control probabilities",
},
cltvLimitFlag,
},
Action: actionDecorator(queryRoutes),
}
@ -3051,6 +3052,7 @@ func queryRoutes(ctx *cli.Context) error {
FeeLimit: feeLimit,
FinalCltvDelta: int32(ctx.Int("final_cltv_delta")),
UseMissionControl: ctx.Bool("use_mc"),
CltvLimit: uint32(ctx.Uint64(cltvLimitFlag.Name)),
}
route, err := client.QueryRoutes(ctxb, req)

@ -39,11 +39,12 @@ const (
// willing to lock its own funds too, could force the funds of this node
// to be locked up for an indefinite (max int32) number of blocks.
//
// The value 1008 corresponds to on average one week worth of blocks and
// is based on the maximum number of hops (20), the default cltv delta
// (40) and some extra margin to account for the other lightning
// implementations.
DefaultMaxOutgoingCltvExpiry = 1008
// The value 2016 corresponds to on average two weeks worth of blocks
// and is based on the maximum number of hops (20), the default CLTV
// delta (40), and some extra margin to account for the other lightning
// implementations and past lnd versions which used to have a default
// CLTV delta of 144.
DefaultMaxOutgoingCltvExpiry = 2016
// DefaultMinLinkFeeUpdateTimeout represents the minimum interval in
// which a link should propose to update its commitment fee rate.

@ -212,8 +212,9 @@ type SendPaymentRequest struct {
//any channel may be used.
OutgoingChanId uint64 `protobuf:"varint,8,opt,name=outgoing_chan_id,json=outgoingChanId,proto3" json:"outgoing_chan_id,omitempty"`
//*
//An optional maximum total time lock for the route. If zero, there is no
//maximum enforced.
//An optional maximum total time lock for the route. This should not exceed
//lnd's `--max-cltv-expiry` setting. If zero, then the value of
//`--max-cltv-expiry` is enforced.
CltvLimit int32 `protobuf:"varint,9,opt,name=cltv_limit,json=cltvLimit,proto3" json:"cltv_limit,omitempty"`
//*
//Optional route hints to reach the destination through private channels.

@ -54,8 +54,9 @@ message SendPaymentRequest {
uint64 outgoing_chan_id = 8;
/**
An optional maximum total time lock for the route. If zero, there is no
maximum enforced.
An optional maximum total time lock for the route. This should not exceed
lnd's `--max-cltv-expiry` setting. If zero, then the value of
`--max-cltv-expiry` is enforced.
*/
int32 cltv_limit = 9;

@ -5,6 +5,7 @@ import (
"encoding/hex"
"errors"
"fmt"
math "math"
"time"
"github.com/btcsuite/btcd/btcec"
@ -55,6 +56,10 @@ type RouterBackend struct {
// Tower is the ControlTower instance that is used to track pending
// payments.
Tower routing.ControlTower
// MaxTotalTimelock is the maximum total time lock a route is allowed to
// have.
MaxTotalTimelock uint32
}
// MissionControl defines the mission control dependencies of routerrpc.
@ -165,6 +170,26 @@ func (r *RouterBackend) QueryRoutes(ctx context.Context,
ignoredPairs[pair] = struct{}{}
}
// Since QueryRoutes allows having a different source other than
// ourselves, we'll only apply our max time lock if we are the source.
maxTotalTimelock := r.MaxTotalTimelock
if sourcePubKey != r.SelfNode {
maxTotalTimelock = math.MaxUint32
}
cltvLimit, err := ValidateCLTVLimit(in.CltvLimit, maxTotalTimelock)
if err != nil {
return nil, err
}
// We need to subtract the final delta before passing it into path
// finding. The optimal path is independent of the final cltv delta and
// the path finding algorithm is unaware of this value.
finalCLTVDelta := uint16(zpay32.DefaultFinalCLTVDelta)
if in.FinalCltvDelta != 0 {
finalCLTVDelta = uint16(in.FinalCltvDelta)
}
cltvLimit -= uint32(finalCLTVDelta)
var destTLV map[uint64][]byte
restrictions := &routing.RestrictParams{
FeeLimit: feeLimit,
@ -192,6 +217,7 @@ func (r *RouterBackend) QueryRoutes(ctx context.Context,
)
},
DestPayloadTLV: len(destTLV) != 0,
CltvLimit: cltvLimit,
}
// If we have any TLV records destined for the final hop, then we'll
@ -205,24 +231,12 @@ func (r *RouterBackend) QueryRoutes(ctx context.Context,
// Query the channel router for a possible path to the destination that
// can carry `in.Amt` satoshis _including_ the total fee required on
// the route.
var (
route *route.Route
findErr error
route, err := r.FindRoute(
sourcePubKey, targetPubKey, amtMSat, restrictions,
destTlvRecords, finalCLTVDelta,
)
if in.FinalCltvDelta == 0 {
route, findErr = r.FindRoute(
sourcePubKey, targetPubKey, amtMSat, restrictions,
destTlvRecords,
)
} else {
route, findErr = r.FindRoute(
sourcePubKey, targetPubKey, amtMSat, restrictions,
destTlvRecords, uint16(in.FinalCltvDelta),
)
}
if findErr != nil {
return nil, findErr
if err != nil {
return nil, err
}
// For each valid route, we'll convert the result into the format
@ -471,11 +485,14 @@ func (r *RouterBackend) extractIntentFromSendRequest(
payIntent.OutgoingChannelID = &rpcPayReq.OutgoingChanId
}
// Take cltv limit from request if set.
if rpcPayReq.CltvLimit != 0 {
cltvLimit := uint32(rpcPayReq.CltvLimit)
payIntent.CltvLimit = &cltvLimit
// Take the CLTV limit from the request if set, otherwise use the max.
cltvLimit, err := ValidateCLTVLimit(
uint32(rpcPayReq.CltvLimit), r.MaxTotalTimelock,
)
if err != nil {
return nil, err
}
payIntent.CltvLimit = cltvLimit
// Take fee limit from request.
payIntent.FeeLimit = lnwire.NewMSatFromSatoshis(
@ -675,3 +692,18 @@ func ValidatePayReqExpiry(payReq *zpay32.Invoice) error {
return nil
}
// ValidateCLTVLimit returns a valid CLTV limit given a value and a maximum. If
// the value exceeds the maximum, then an error is returned. If the value is 0,
// then the maximum is used.
func ValidateCLTVLimit(val, max uint32) (uint32, error) {
switch {
case val == 0:
return max, nil
case val > max:
return 0, fmt.Errorf("total time lock of %v exceeds max "+
"allowed %v", val, max)
default:
return val, nil
}
}

@ -248,11 +248,14 @@ func (s *Server) EstimateRouteFee(ctx context.Context,
feeLimit := lnwire.NewMSatFromSatoshis(btcutil.SatoshiPerBitcoin)
// Finally, we'll query for a route to the destination that can carry
// that target amount, we'll only request a single route.
// that target amount, we'll only request a single route. Set a
// restriction for the default CLTV limit, otherwise we can find a route
// that exceeds it and is useless to us.
route, err := s.cfg.Router.FindRoute(
s.cfg.RouterBackend.SelfNode, destNode, amtMsat,
&routing.RestrictParams{
FeeLimit: feeLimit,
FeeLimit: feeLimit,
CltvLimit: s.cfg.RouterBackend.MaxTotalTimelock,
}, nil,
)
if err != nil {

@ -1052,8 +1052,9 @@ type SendRequest struct {
//any channel may be used.
OutgoingChanId uint64 `protobuf:"varint,9,opt,name=outgoing_chan_id,json=outgoingChanId,proto3" json:"outgoing_chan_id,omitempty"`
//*
//An optional maximum total time lock for the route. If zero, there is no
//maximum enforced.
//An optional maximum total time lock for the route. This should not exceed
//lnd's `--max-cltv-expiry` setting. If zero, then the value of
//`--max-cltv-expiry` is enforced.
CltvLimit uint32 `protobuf:"varint,10,opt,name=cltv_limit,json=cltvLimit,proto3" json:"cltv_limit,omitempty"`
//*
//An optional field that can be used to pass an arbitrary set of TLV records
@ -5069,10 +5070,15 @@ type QueryRoutesRequest struct {
UseMissionControl bool `protobuf:"varint,9,opt,name=use_mission_control,json=useMissionControl,proto3" json:"use_mission_control,omitempty"`
//*
//A list of directed node pairs that will be ignored during path finding.
IgnoredPairs []*NodePair `protobuf:"bytes,10,rep,name=ignored_pairs,json=ignoredPairs,proto3" json:"ignored_pairs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
IgnoredPairs []*NodePair `protobuf:"bytes,10,rep,name=ignored_pairs,json=ignoredPairs,proto3" json:"ignored_pairs,omitempty"`
//*
//An optional maximum total time lock for the route. If the source is empty or
//ourselves, this should not exceed lnd's `--max-cltv-expiry` setting. If
//zero, then the value of `--max-cltv-expiry` is used as the limit.
CltvLimit uint32 `protobuf:"varint,11,opt,name=cltv_limit,json=cltvLimit,proto3" json:"cltv_limit,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *QueryRoutesRequest) Reset() { *m = QueryRoutesRequest{} }
@ -5164,6 +5170,13 @@ func (m *QueryRoutesRequest) GetIgnoredPairs() []*NodePair {
return nil
}
func (m *QueryRoutesRequest) GetCltvLimit() uint32 {
if m != nil {
return m.CltvLimit
}
return 0
}
type NodePair struct {
/// The sending node of the pair.
From []byte `protobuf:"bytes,1,opt,name=from,proto3" json:"from,omitempty"`
@ -9144,13 +9157,13 @@ func init() {
func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) }
var fileDescriptor_77a6da22d6a3feb1 = []byte{
// 8469 bytes of a gzipped FileDescriptorProto
// 8476 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7d, 0x5d, 0x6c, 0x1c, 0x5b,
0xd2, 0x50, 0x7a, 0x7e, 0xec, 0x99, 0x9a, 0xb1, 0x3d, 0x3e, 0x76, 0xec, 0xc9, 0xdc, 0xdc, 0xdc,
0xdc, 0xde, 0x7c, 0x49, 0x36, 0x7b, 0xd7, 0xc9, 0xcd, 0xee, 0x5e, 0xf2, 0xdd, 0xf0, 0xf1, 0xe1,
0xd8, 0x4e, 0x9c, 0x5d, 0x5f, 0xc7, 0xdb, 0x4e, 0x36, 0xec, 0xee, 0x87, 0x66, 0xdb, 0x33, 0xc7,
0x76, 0x6f, 0x66, 0xba, 0x67, 0xbb, 0x7b, 0xec, 0x78, 0x2f, 0x17, 0x09, 0x84, 0x10, 0x02, 0x21,
0xb4, 0xf0, 0x02, 0x08, 0x84, 0xb4, 0xfb, 0x3d, 0xb0, 0xe2, 0x01, 0x78, 0x00, 0x81, 0xf4, 0x49,
0x76, 0x6f, 0x66, 0xba, 0x67, 0xbb, 0x7b, 0xec, 0x78, 0x2f, 0x17, 0x09, 0x84, 0x10, 0x42, 0x42,
0x68, 0xe1, 0x05, 0x10, 0x08, 0x69, 0xf7, 0x7b, 0x60, 0xe1, 0x01, 0x78, 0x00, 0x81, 0xf4, 0x49,
0xdf, 0x23, 0x4f, 0x08, 0xa1, 0xef, 0x8d, 0x07, 0x3e, 0x21, 0x90, 0x60, 0xe1, 0x0d, 0x89, 0x77,
0x54, 0x75, 0x7e, 0xfa, 0x9c, 0xee, 0x9e, 0x24, 0x77, 0x77, 0xe1, 0xc9, 0x73, 0xaa, 0xaa, 0xcf,
0x6f, 0x55, 0x9d, 0xaa, 0x3a, 0x75, 0x8e, 0xa1, 0x19, 0x4f, 0x06, 0x1b, 0x93, 0x38, 0x4a, 0x23,
@ -9250,7 +9263,7 @@ var fileDescriptor_77a6da22d6a3feb1 = []byte{
0xa4, 0x9f, 0xf9, 0xe1, 0x85, 0x9a, 0xab, 0xbd, 0xd2, 0xb9, 0xba, 0x6d, 0x6c, 0x4a, 0x06, 0xf5,
0x97, 0x9d, 0xa8, 0x6a, 0x7e, 0xa2, 0xd8, 0x75, 0x68, 0x5b, 0xdd, 0xad, 0x0b, 0x73, 0x2c, 0xf1,
0xd3, 0x03, 0x1e, 0x3f, 0xba, 0x48, 0xf9, 0x6f, 0x3e, 0x95, 0x37, 0xa1, 0x93, 0x75, 0x5b, 0xce,
0x23, 0x83, 0x1a, 0x32, 0xa6, 0xac, 0x80, 0x7e, 0xbb, 0xff, 0xc8, 0x11, 0x84, 0x5b, 0x51, 0xa0,
0x23, 0x83, 0x1a, 0x32, 0xa6, 0xac, 0x80, 0x7e, 0xbb, 0xff, 0xd0, 0x11, 0x84, 0x5b, 0x51, 0xa0,
0x4d, 0x35, 0x24, 0x44, 0x8b, 0x4f, 0x11, 0xe2, 0xef, 0x99, 0xa6, 0xee, 0x6f, 0x3e, 0x58, 0xd4,
0x89, 0x09, 0x0f, 0x87, 0x7d, 0x7f, 0x34, 0x22, 0x45, 0xdc, 0xf0, 0xe6, 0xb1, 0xbc, 0x39, 0x1a,
0xb9, 0xb7, 0x60, 0xd9, 0xe8, 0xdd, 0x1b, 0xc6, 0xb1, 0x0f, 0x6c, 0x2f, 0x48, 0xd2, 0x17, 0x61,
@ -9290,7 +9303,7 @@ var fileDescriptor_77a6da22d6a3feb1 = []byte{
0x5d, 0x11, 0x9e, 0x4a, 0x01, 0xc1, 0x3e, 0x81, 0x35, 0xc1, 0x11, 0x84, 0x92, 0x76, 0x37, 0x99,
0x09, 0xab, 0x34, 0x23, 0x33, 0xb0, 0x38, 0x95, 0x92, 0x45, 0x0a, 0x1f, 0x5e, 0x16, 0x53, 0x39,
0x03, 0x8d, 0xfd, 0xc3, 0x1e, 0x04, 0x83, 0xbe, 0xa4, 0x40, 0xf1, 0x58, 0xa3, 0x51, 0x14, 0x11,
0xee, 0x3f, 0x71, 0xc4, 0x26, 0x22, 0x05, 0x2e, 0x31, 0xdc, 0x23, 0x21, 0x6a, 0xfd, 0x28, 0x1c,
0xee, 0x3f, 0x76, 0xc4, 0x26, 0x22, 0x05, 0x2e, 0x31, 0xdc, 0x23, 0x21, 0x6a, 0xfd, 0x28, 0x1c,
0x5d, 0x48, 0xe9, 0x03, 0x01, 0x7a, 0x16, 0x8e, 0x2e, 0xd0, 0x40, 0x0f, 0x42, 0x93, 0x44, 0xe8,
0xab, 0xb6, 0x02, 0x12, 0xd1, 0x07, 0xd0, 0x9a, 0x4c, 0x8f, 0x46, 0xc1, 0x40, 0x90, 0x54, 0x45,
0x2d, 0x02, 0x44, 0x04, 0xe8, 0x1b, 0x8a, 0x59, 0x17, 0x14, 0x35, 0xa2, 0x68, 0x49, 0x18, 0x92,
@ -9348,9 +9361,9 @@ var fileDescriptor_77a6da22d6a3feb1 = []byte{
0x7b, 0x8f, 0x1f, 0xa7, 0xee, 0x3e, 0x2c, 0x4b, 0xfd, 0xf7, 0x6c, 0xc2, 0x55, 0xd3, 0xbf, 0x5b,
0x66, 0x47, 0xb4, 0xee, 0xaf, 0xd8, 0x0a, 0x53, 0x9c, 0xf4, 0xd9, 0x94, 0xae, 0x07, 0xcc, 0xd4,
0xa7, 0xb2, 0x42, 0xb9, 0x99, 0xab, 0x58, 0x9f, 0x1c, 0x8e, 0x05, 0xc3, 0xf9, 0x49, 0xa6, 0x83,
0x81, 0x3a, 0xad, 0x6c, 0x78, 0xaa, 0xe8, 0xfe, 0x53, 0x07, 0x56, 0xa8, 0x36, 0x65, 0x09, 0xc9,
0x81, 0x3a, 0xad, 0x6c, 0x78, 0xaa, 0xe8, 0xfe, 0x13, 0x07, 0x56, 0xa8, 0x36, 0x65, 0x09, 0xc9,
0x3d, 0xeb, 0xc1, 0x97, 0xe8, 0xa6, 0x8a, 0xb4, 0x8a, 0xf8, 0xe2, 0x2a, 0xd4, 0xcd, 0x5d, 0x4c,
0x14, 0xbe, 0x7c, 0x5c, 0xa5, 0x96, 0x8f, 0xab, 0xb8, 0x7f, 0xdf, 0x81, 0x65, 0xb1, 0x91, 0x90,
0x14, 0xbe, 0x7c, 0x5c, 0xa5, 0x96, 0x8f, 0xab, 0xb8, 0x7f, 0xcf, 0x81, 0x65, 0xb1, 0x91, 0x90,
0xd5, 0x2c, 0x87, 0xff, 0x67, 0x61, 0x41, 0x58, 0x04, 0x52, 0x2b, 0xc8, 0x8e, 0x66, 0xaa, 0x95,
0xa0, 0x82, 0x78, 0xf7, 0x92, 0x67, 0x13, 0xb3, 0x87, 0x64, 0x95, 0x85, 0x7d, 0x82, 0x96, 0x9c,
0x6b, 0xdb, 0x73, 0xbd, 0x7b, 0xc9, 0x33, 0xc8, 0x1f, 0x35, 0x60, 0x4e, 0xb8, 0x1c, 0xee, 0x13,
@ -9362,7 +9375,7 @@ var fileDescriptor_77a6da22d6a3feb1 = []byte{
0x0d, 0xdb, 0xcb, 0xba, 0x01, 0x0b, 0xea, 0x94, 0xa1, 0x3f, 0xc6, 0xd6, 0xa5, 0x4b, 0x6b, 0x01,
0xd9, 0x1d, 0xe8, 0x28, 0x47, 0x47, 0xbb, 0x72, 0xe2, 0xac, 0xae, 0x00, 0x47, 0xfd, 0x9f, 0x45,
0xd2, 0x5a, 0xd4, 0xd9, 0x0c, 0x40, 0x7e, 0x11, 0x72, 0x48, 0x7f, 0x1a, 0xca, 0xa3, 0x6d, 0x3e,
0x24, 0x67, 0x16, 0xfd, 0xa2, 0x3c, 0xc2, 0xfd, 0xbb, 0x0e, 0x74, 0x70, 0xcd, 0x2c, 0xb6, 0xfc,
0x24, 0x67, 0x16, 0xfd, 0xa2, 0x3c, 0xc2, 0xfd, 0x3b, 0x0e, 0x74, 0x70, 0xcd, 0x2c, 0xb6, 0xfc,
0x14, 0x48, 0x2a, 0xde, 0x91, 0x2b, 0x2d, 0x5a, 0xf6, 0x00, 0x9a, 0x54, 0x8e, 0x26, 0x3c, 0x94,
0x3c, 0xd9, 0xb5, 0x79, 0x32, 0xd3, 0x27, 0xbb, 0x97, 0xbc, 0x8c, 0xd8, 0xe0, 0xc8, 0xff, 0xe0,
0x40, 0x4b, 0xb6, 0xf2, 0x6b, 0x47, 0x6a, 0x7a, 0x46, 0x2e, 0x82, 0xe0, 0xa4, 0x2c, 0xf5, 0xe0,
@ -9397,11 +9410,11 @@ var fileDescriptor_77a6da22d6a3feb1 = []byte{
0x0f, 0x00, 0x32, 0x18, 0xeb, 0x40, 0xfb, 0xd9, 0xc1, 0xce, 0x7e, 0x7f, 0x6b, 0x77, 0x73, 0x7f,
0x7f, 0x67, 0xaf, 0x73, 0x89, 0x31, 0x58, 0xa4, 0x30, 0xdf, 0xb6, 0x86, 0x39, 0x08, 0x93, 0x81,
0x15, 0x05, 0xab, 0xb0, 0x55, 0xe8, 0x3c, 0xdd, 0xcf, 0x41, 0xab, 0x8f, 0x9a, 0x5a, 0x3e, 0xdc,
0x35, 0x58, 0x15, 0xd9, 0xad, 0x8f, 0x04, 0x7b, 0x28, 0xeb, 0xe4, 0x1f, 0x3b, 0x70, 0x39, 0x87,
0x35, 0x58, 0x15, 0xd9, 0xad, 0x8f, 0x04, 0x7b, 0x28, 0xeb, 0xe4, 0x1f, 0x39, 0x70, 0x39, 0x87,
0xc8, 0xd2, 0xb5, 0x84, 0x01, 0x62, 0x5b, 0x25, 0x36, 0x90, 0x0e, 0x11, 0x94, 0xad, 0x99, 0xd3,
0x20, 0x45, 0x04, 0xf2, 0xbc, 0x61, 0x9b, 0xe6, 0x24, 0xa9, 0x0c, 0xe5, 0xae, 0xeb, 0xcc, 0x98,
0x5c, 0xc7, 0x8f, 0x45, 0xd6, 0xac, 0x89, 0xc8, 0x0e, 0x70, 0xed, 0x2e, 0xab, 0x22, 0xba, 0x15,
0x96, 0xb1, 0x63, 0xf7, 0xb7, 0x14, 0xe7, 0xfe, 0xad, 0x2a, 0xb0, 0xef, 0x4e, 0x79, 0x7c, 0x41,
0x96, 0xb1, 0x63, 0xf7, 0xb7, 0x14, 0xe7, 0xfe, 0xd3, 0x2a, 0xb0, 0xef, 0x4e, 0x79, 0x7c, 0x41,
0x39, 0x59, 0x3a, 0x6a, 0xba, 0x9e, 0x8f, 0x09, 0xce, 0x4d, 0xa6, 0x47, 0xdf, 0xe1, 0x17, 0x2a,
0x3b, 0xb1, 0x92, 0x65, 0x27, 0x96, 0x65, 0x08, 0xd6, 0xde, 0x9e, 0x21, 0x58, 0x7f, 0x5b, 0x86,
0xe0, 0x57, 0x60, 0x21, 0x38, 0x09, 0x23, 0x94, 0x79, 0xb4, 0x13, 0x92, 0xee, 0xdc, 0xf5, 0x2a,
@ -9411,270 +9424,270 @@ var fileDescriptor_77a6da22d6a3feb1 = []byte{
0x62, 0xc4, 0x1b, 0xb0, 0x32, 0x4d, 0x78, 0x7f, 0x1c, 0x24, 0x09, 0xee, 0x8e, 0x83, 0x28, 0x4c,
0xe3, 0x68, 0x24, 0xe3, 0x49, 0xcb, 0xd3, 0x84, 0x7f, 0x26, 0x30, 0x5b, 0x02, 0xc1, 0xbe, 0x99,
0x75, 0x69, 0xe2, 0x07, 0x71, 0xd2, 0x05, 0xea, 0x92, 0x1a, 0x29, 0xf6, 0xfb, 0xc0, 0x0f, 0x62,
0xdd, 0x17, 0x2c, 0x24, 0x32, 0x0b, 0x6e, 0x03, 0x1a, 0x0a, 0x8f, 0x5e, 0xec, 0x71, 0x1c, 0x8d,
0x95, 0x17, 0x8b, 0xbf, 0xd9, 0x22, 0x54, 0xd2, 0x48, 0x7a, 0xa0, 0x95, 0x34, 0x72, 0xbf, 0x0f,
0x2d, 0x63, 0x88, 0x32, 0x15, 0x8e, 0x2c, 0x26, 0xe9, 0xfe, 0xd6, 0x84, 0x83, 0x12, 0xf2, 0xd1,
0xd3, 0x21, 0xfb, 0x1a, 0x2c, 0x0f, 0x83, 0x98, 0x53, 0xd6, 0x6b, 0x3f, 0xe6, 0x67, 0x3c, 0x4e,
0x54, 0xa0, 0xa0, 0xa3, 0x11, 0x9e, 0x80, 0xbb, 0x7d, 0x58, 0xb1, 0xf8, 0x42, 0x8b, 0xcd, 0x1c,
0xa5, 0xed, 0xa9, 0x58, 0xa5, 0x9d, 0xd2, 0x27, 0x71, 0xb8, 0xe1, 0xc8, 0x18, 0x47, 0x7f, 0x12,
0x47, 0x47, 0xd4, 0x88, 0xe3, 0x59, 0x30, 0xf7, 0x97, 0x15, 0xa8, 0xee, 0x46, 0x13, 0xf3, 0xd4,
0xc6, 0xb1, 0x4f, 0x6d, 0xa4, 0x55, 0xd8, 0xd7, 0x46, 0x9f, 0xdc, 0xba, 0x2d, 0x20, 0xbb, 0x03,
0x8b, 0xfe, 0x38, 0xed, 0xa7, 0x11, 0x5a, 0xc1, 0xe7, 0x7e, 0x2c, 0xf2, 0xfb, 0xaa, 0xb4, 0xde,
0x39, 0x0c, 0x5b, 0x85, 0xaa, 0x36, 0x66, 0x88, 0x00, 0x8b, 0xe8, 0x82, 0xd1, 0xe9, 0xf6, 0x85,
0x0c, 0x46, 0xca, 0x12, 0x8a, 0xb3, 0xfd, 0xbd, 0xf0, 0x7f, 0xc5, 0x96, 0x54, 0x86, 0x42, 0x0b,
0x15, 0x39, 0x7c, 0x9c, 0x19, 0x7c, 0xba, 0x6c, 0x86, 0xd9, 0x1b, 0x76, 0x98, 0xfd, 0x3a, 0xb4,
0xd2, 0xd1, 0x59, 0x7f, 0xe2, 0x5f, 0x8c, 0x22, 0x7f, 0x28, 0x39, 0xcb, 0x04, 0xb9, 0xbf, 0x72,
0xa0, 0x4e, 0x33, 0x8c, 0x1b, 0xb0, 0xd0, 0x50, 0xfa, 0x68, 0x87, 0x66, 0x6d, 0xc1, 0xcb, 0x83,
0x99, 0x6b, 0x65, 0x69, 0x57, 0xf4, 0x90, 0xcd, 0x4c, 0xed, 0xeb, 0xd0, 0x14, 0x25, 0x9d, 0x71,
0x4c, 0x24, 0x19, 0x90, 0x5d, 0x83, 0xda, 0x69, 0x34, 0x51, 0x3e, 0x0a, 0xa8, 0x53, 0xdc, 0x68,
0xe2, 0x11, 0x3c, 0xeb, 0x0f, 0xd6, 0x27, 0x06, 0x2e, 0xec, 0xc0, 0x3c, 0x18, 0x6d, 0x6f, 0x5d,
0xad, 0x39, 0x91, 0x39, 0xa8, 0xfb, 0x02, 0x96, 0x50, 0x06, 0x8c, 0x50, 0xf7, 0x6c, 0x6d, 0xf4,
0x55, 0xdc, 0xdc, 0x06, 0xa3, 0xe9, 0x90, 0x9b, 0x9e, 0x22, 0x85, 0x32, 0x25, 0x5c, 0xd9, 0x48,
0xee, 0xbf, 0x70, 0x84, 0x6c, 0x61, 0xbd, 0xec, 0x36, 0xd4, 0x50, 0xa7, 0xe4, 0x02, 0x03, 0x3a,
0xd1, 0x03, 0xe9, 0x3c, 0xa2, 0x40, 0x4e, 0xa6, 0x60, 0xa3, 0x59, 0xbb, 0x08, 0x35, 0x66, 0x6e,
0x96, 0x1e, 0x59, 0xce, 0x3b, 0xc9, 0x41, 0xd9, 0x86, 0x71, 0x52, 0x53, 0xb3, 0xf4, 0x94, 0xda,
0x4b, 0x87, 0x27, 0xdc, 0x38, 0xa1, 0xf9, 0xa5, 0x03, 0x0b, 0x56, 0x9f, 0x90, 0x53, 0x46, 0x7e,
0x92, 0xca, 0xc3, 0x76, 0xb9, 0xf2, 0x26, 0xc8, 0xe4, 0xb2, 0x8a, 0xcd, 0x65, 0x3a, 0xe2, 0x5f,
0x35, 0x23, 0xfe, 0xf7, 0xa0, 0x99, 0xa5, 0xe9, 0xdb, 0x9d, 0xc2, 0x16, 0x55, 0xca, 0x4b, 0x46,
0x94, 0xc5, 0x94, 0xeb, 0x46, 0x4c, 0xd9, 0x7d, 0x08, 0x2d, 0x83, 0xde, 0x8c, 0x09, 0x3b, 0x56,
0x4c, 0x58, 0xe7, 0x83, 0x55, 0xb2, 0x7c, 0x30, 0xf7, 0x67, 0x15, 0x58, 0x40, 0xf6, 0x0e, 0xc2,
0x93, 0x83, 0x68, 0x14, 0x0c, 0x2e, 0x88, 0xad, 0x14, 0x27, 0xcb, 0x3d, 0x45, 0xb1, 0xb9, 0x0d,
0x46, 0x91, 0xd3, 0x49, 0xb0, 0x42, 0x3f, 0xe8, 0x32, 0x2a, 0x10, 0x14, 0xbf, 0x23, 0x3f, 0x91,
0x32, 0x29, 0x6d, 0x5a, 0x0b, 0x88, 0x62, 0x8e, 0x00, 0xca, 0xee, 0x1b, 0x07, 0xa3, 0x51, 0x20,
0x68, 0x85, 0xc7, 0x53, 0x86, 0xc2, 0x36, 0x87, 0x41, 0xe2, 0x1f, 0x65, 0xa7, 0x79, 0xba, 0x4c,
0xe1, 0x32, 0xff, 0xb5, 0x11, 0x2e, 0x13, 0xe9, 0xc0, 0x36, 0x30, 0xbf, 0x90, 0xf3, 0x85, 0x85,
0x74, 0xff, 0xb8, 0x02, 0x2d, 0x83, 0x2d, 0xe4, 0x11, 0xb6, 0xad, 0xdb, 0x0d, 0x88, 0xc2, 0x5b,
0xfe, 0xb3, 0x01, 0x61, 0x37, 0xec, 0x16, 0x29, 0x64, 0x4e, 0xc2, 0x6e, 0xb1, 0xcf, 0x55, 0x68,
0x22, 0xdb, 0x7f, 0x4c, 0xce, 0xba, 0xbc, 0x1f, 0xa3, 0x01, 0x0a, 0x7b, 0x9f, 0xb0, 0xf5, 0x0c,
0x4b, 0x80, 0x37, 0x1e, 0x7a, 0x3f, 0x80, 0xb6, 0xac, 0x86, 0xd6, 0x97, 0x06, 0x9c, 0x09, 0x9e,
0xb5, 0xf6, 0x9e, 0x45, 0xa9, 0xbe, 0xbc, 0xaf, 0xbe, 0x6c, 0xbc, 0xed, 0x4b, 0x45, 0xe9, 0x3e,
0xd1, 0xb9, 0x04, 0x4f, 0x62, 0x7f, 0x72, 0xaa, 0x94, 0xc9, 0x3d, 0x58, 0x51, 0x3a, 0x63, 0x1a,
0xfa, 0x61, 0x18, 0x4d, 0xc3, 0x01, 0x57, 0x69, 0x63, 0x65, 0x28, 0x77, 0xa8, 0x93, 0x8c, 0xa9,
0x22, 0x76, 0x07, 0xea, 0xc2, 0x22, 0x11, 0x5b, 0x60, 0xb9, 0xfa, 0x10, 0x24, 0xec, 0x36, 0xd4,
0x85, 0x61, 0x52, 0x99, 0x29, 0xf0, 0x82, 0xc0, 0xbd, 0x03, 0x4b, 0x94, 0xd5, 0x6c, 0xeb, 0x3d,
0x7b, 0x6b, 0x9c, 0x1b, 0x88, 0xbc, 0xe7, 0x55, 0x60, 0xfb, 0x42, 0x9e, 0xcc, 0x13, 0xc1, 0x5f,
0x55, 0xa1, 0x65, 0x80, 0x51, 0x2f, 0xd1, 0x31, 0x4e, 0x7f, 0x18, 0xf8, 0x63, 0x9e, 0xf2, 0x58,
0xca, 0x50, 0x0e, 0x8a, 0x74, 0xfe, 0xd9, 0x49, 0x3f, 0x9a, 0xa6, 0xfd, 0x21, 0x3f, 0x89, 0x39,
0x97, 0xfb, 0x75, 0x0e, 0x8a, 0x74, 0xc8, 0xc5, 0x06, 0x9d, 0x38, 0x78, 0xc9, 0x41, 0xd5, 0xf9,
0x9e, 0x98, 0xa3, 0x5a, 0x76, 0xbe, 0x27, 0x66, 0x24, 0xaf, 0x51, 0xeb, 0x25, 0x1a, 0xf5, 0x13,
0x58, 0x13, 0xba, 0x53, 0x6a, 0x8d, 0x7e, 0x8e, 0xb1, 0x66, 0x60, 0xd9, 0x1d, 0xe8, 0x60, 0x9f,
0x95, 0x58, 0x24, 0xc1, 0x4f, 0x85, 0x6c, 0x39, 0x5e, 0x01, 0x8e, 0xb4, 0x14, 0x74, 0x36, 0x69,
0x45, 0x92, 0x45, 0x01, 0x4e, 0xb4, 0xfe, 0x6b, 0x9b, 0xb6, 0x29, 0x69, 0x73, 0x70, 0xf6, 0x00,
0xd6, 0xc7, 0x7c, 0x18, 0xf8, 0x76, 0x15, 0x14, 0x03, 0x12, 0x99, 0x5e, 0xb3, 0xd0, 0xd8, 0x0a,
0xce, 0xc2, 0x4f, 0xa3, 0xf1, 0x51, 0x20, 0x36, 0x34, 0x11, 0x1e, 0xaf, 0x79, 0x05, 0xb8, 0xbb,
0x00, 0xad, 0xc3, 0x34, 0x9a, 0xa8, 0xa5, 0x5f, 0x84, 0xb6, 0x28, 0xca, 0x24, 0xc1, 0xf7, 0xe0,
0x0a, 0xf1, 0xea, 0xf3, 0x68, 0x12, 0x8d, 0xa2, 0x93, 0x0b, 0xcb, 0xc9, 0xfd, 0xf7, 0x0e, 0xac,
0x58, 0xd8, 0xcc, 0xcb, 0xa5, 0x88, 0x9c, 0xca, 0xee, 0x12, 0xec, 0xbd, 0x6c, 0x6c, 0x07, 0x82,
0x50, 0x1c, 0x7e, 0xbc, 0x90, 0x09, 0x5f, 0x9b, 0xd9, 0x75, 0x05, 0xf5, 0xa1, 0xe0, 0xf5, 0x6e,
0x91, 0xd7, 0xe5, 0xf7, 0xea, 0x22, 0x83, 0xaa, 0xe2, 0xf7, 0x64, 0x4a, 0xcc, 0x50, 0x0e, 0xba,
0x6a, 0xa7, 0x31, 0x98, 0x41, 0x11, 0xd5, 0x83, 0x81, 0x06, 0x26, 0xee, 0xcf, 0x1d, 0x80, 0xac,
0x77, 0x94, 0x48, 0xa1, 0xb7, 0x34, 0x71, 0x1d, 0xd6, 0xd8, 0xbe, 0x3e, 0x84, 0xb6, 0x3e, 0x0b,
0xcf, 0x76, 0xc9, 0x96, 0x82, 0xa1, 0x55, 0x71, 0x0b, 0x96, 0x4e, 0x46, 0xd1, 0x11, 0x59, 0x2f,
0x94, 0x75, 0x9a, 0xc8, 0x54, 0xc9, 0x45, 0x01, 0x7e, 0x2c, 0xa1, 0xd9, 0x96, 0x5a, 0x33, 0xb7,
0xd4, 0xf2, 0x0d, 0xf2, 0x6f, 0x57, 0xf4, 0x81, 0x64, 0x36, 0x13, 0x33, 0x25, 0x9c, 0xdd, 0x2f,
0xa8, 0xf3, 0x19, 0xe7, 0x7f, 0x64, 0xdf, 0x1f, 0xbc, 0x35, 0x3e, 0xfa, 0x10, 0x16, 0x63, 0xa1,
0x2b, 0x95, 0x22, 0xad, 0xbd, 0x41, 0x91, 0x2e, 0xc4, 0xd6, 0x6e, 0xfc, 0x55, 0xe8, 0xf8, 0xc3,
0x33, 0x1e, 0xa7, 0x01, 0xc5, 0x8b, 0xc8, 0x74, 0x12, 0x83, 0x5b, 0x32, 0xe0, 0x64, 0xa1, 0xdc,
0x82, 0x25, 0x99, 0xb4, 0xaa, 0x29, 0xe5, 0xc5, 0xb2, 0x0c, 0x8c, 0x84, 0xee, 0x2f, 0xd4, 0xd9,
0xa7, 0xbd, 0xb2, 0xb3, 0x67, 0xc4, 0x1c, 0x5d, 0x25, 0x37, 0xba, 0xaf, 0xc8, 0x73, 0xc8, 0xa1,
0x0a, 0x4a, 0x55, 0x8d, 0xa4, 0xaa, 0xa1, 0x3c, 0x37, 0xb6, 0xa7, 0xb4, 0xf6, 0x2e, 0x53, 0xea,
0xfe, 0x89, 0x03, 0xf3, 0xbb, 0xd1, 0x64, 0x57, 0xa6, 0x97, 0x91, 0x78, 0xe8, 0x6c, 0x71, 0x55,
0x7c, 0x43, 0xe2, 0x59, 0xa9, 0x05, 0xb2, 0x90, 0xb7, 0x40, 0xfe, 0x3c, 0xbc, 0x47, 0x21, 0xd1,
0x38, 0x9a, 0x44, 0x31, 0x8a, 0xa8, 0x3f, 0x12, 0xe6, 0x46, 0x14, 0xa6, 0xa7, 0x4a, 0x85, 0xbe,
0x89, 0x84, 0xe2, 0x14, 0xe8, 0x7e, 0x0b, 0xcf, 0x45, 0x5a, 0x4c, 0x42, 0xb3, 0x16, 0x11, 0xee,
0xef, 0x42, 0x93, 0xbc, 0x09, 0x1a, 0xd6, 0x47, 0xd0, 0x3c, 0x8d, 0x26, 0xfd, 0xd3, 0x20, 0x4c,
0x95, 0xc8, 0x2f, 0x66, 0x66, 0xfe, 0x2e, 0x4d, 0x88, 0x26, 0x70, 0xff, 0x78, 0x0e, 0xe6, 0x9f,
0x86, 0x67, 0x51, 0x30, 0xa0, 0x73, 0xd6, 0x31, 0x1f, 0x47, 0x2a, 0x77, 0x1e, 0x7f, 0xb3, 0xab,
0x30, 0x4f, 0xc9, 0xa2, 0x13, 0xc1, 0xb4, 0x6d, 0x91, 0x4f, 0x21, 0x41, 0x74, 0xe3, 0x33, 0xbb,
0xf7, 0x26, 0x84, 0xca, 0x80, 0xa0, 0x27, 0x16, 0x9b, 0xf7, 0xd6, 0x64, 0x29, 0xbb, 0x9b, 0x50,
0x37, 0xee, 0x26, 0x60, 0x5b, 0x32, 0x1d, 0x4e, 0xe4, 0x4b, 0x89, 0xb6, 0x24, 0x88, 0xbc, 0xc7,
0x98, 0x8b, 0x90, 0xb6, 0x36, 0xb2, 0xd0, 0x7b, 0x34, 0x81, 0x68, 0x88, 0x89, 0x0f, 0x04, 0x8d,
0xd8, 0x00, 0x4c, 0x10, 0x9a, 0xa2, 0xf9, 0xab, 0x92, 0xe2, 0xaa, 0x6a, 0x1e, 0x8c, 0xfa, 0x7b,
0xc8, 0xb5, 0x9a, 0x15, 0xe3, 0x00, 0x71, 0xb7, 0x2f, 0x0f, 0x37, 0x7c, 0x4e, 0x91, 0xd7, 0xab,
0x7c, 0x4e, 0x64, 0x18, 0x7f, 0x34, 0x3a, 0xf2, 0x07, 0xaf, 0xe8, 0xa6, 0x2c, 0x9d, 0x7c, 0x36,
0x3d, 0x1b, 0x48, 0x49, 0x6d, 0xd9, 0xaa, 0x52, 0xe6, 0x49, 0xcd, 0x33, 0x41, 0xec, 0x3e, 0xb4,
0xc8, 0x17, 0x97, 0xeb, 0xba, 0x48, 0xeb, 0xda, 0x31, 0x9d, 0x75, 0x5a, 0x59, 0x93, 0xc8, 0x3c,
0x03, 0x5e, 0x2a, 0x64, 0xda, 0xfa, 0xc3, 0xa1, 0x3c, 0x3a, 0xef, 0x88, 0xb8, 0x82, 0x06, 0x90,
0xb7, 0x2f, 0x26, 0x4c, 0x10, 0x2c, 0x13, 0x81, 0x05, 0x63, 0xd7, 0xa0, 0x81, 0x1e, 0xde, 0xc4,
0x0f, 0x86, 0x94, 0x6c, 0x22, 0x1c, 0x4d, 0x0d, 0xc3, 0x3a, 0xd4, 0x6f, 0xda, 0x2a, 0x57, 0x68,
0x56, 0x2c, 0x18, 0xce, 0x8d, 0x2e, 0x8f, 0xb3, 0xd4, 0x5c, 0x1b, 0xc8, 0x3e, 0xa6, 0x03, 0xcc,
0x94, 0x53, 0xfe, 0xed, 0xe2, 0xfd, 0xf7, 0xe4, 0x98, 0x25, 0xd3, 0xaa, 0xbf, 0x87, 0x48, 0xe2,
0x09, 0x4a, 0x34, 0xd2, 0x44, 0x0c, 0x79, 0xcd, 0x32, 0xd2, 0x24, 0x29, 0xc5, 0x90, 0x05, 0x81,
0xbb, 0x09, 0x6d, 0xb3, 0x02, 0xd6, 0x80, 0xda, 0xb3, 0x83, 0x9d, 0xfd, 0xce, 0x25, 0xd6, 0x82,
0xf9, 0xc3, 0x9d, 0xe7, 0xcf, 0xf7, 0x76, 0xb6, 0x3b, 0x0e, 0x6b, 0x43, 0x43, 0xe7, 0x2a, 0x56,
0xb0, 0xb4, 0xb9, 0xb5, 0xb5, 0x73, 0xf0, 0x7c, 0x67, 0xbb, 0x53, 0x75, 0xff, 0xb0, 0x02, 0x2d,
0xa3, 0xe6, 0x37, 0xc4, 0x3f, 0xae, 0x01, 0x90, 0xc7, 0x90, 0x65, 0x2c, 0xd4, 0x3c, 0x03, 0x82,
0x1a, 0x51, 0xfb, 0xd2, 0x55, 0x71, 0xc5, 0x4f, 0x95, 0x69, 0xae, 0xe8, 0x2e, 0x9d, 0x19, 0xa6,
0xaf, 0x7b, 0x36, 0x10, 0xf9, 0x48, 0x02, 0x28, 0x6d, 0x4e, 0x48, 0x97, 0x09, 0xc2, 0x75, 0x89,
0x79, 0x12, 0x8d, 0xce, 0xb8, 0x20, 0x11, 0xf6, 0x97, 0x05, 0xc3, 0xb6, 0xa4, 0x7a, 0x31, 0x52,
0x5a, 0xeb, 0x9e, 0x0d, 0x64, 0x5f, 0x57, 0xeb, 0xd2, 0xa0, 0x75, 0x59, 0x2f, 0x4e, 0xb2, 0xb9,
0x26, 0x6e, 0x0a, 0x6c, 0x73, 0x38, 0x94, 0x58, 0xf3, 0xc2, 0x60, 0x6c, 0xde, 0x4e, 0x55, 0x0a,
0xa2, 0x44, 0x48, 0x2b, 0xe5, 0x42, 0xfa, 0x46, 0x56, 0x76, 0x77, 0xa0, 0x75, 0x60, 0xdc, 0x77,
0x25, 0x7d, 0xa5, 0x6e, 0xba, 0x4a, 0x3d, 0x67, 0x40, 0x8c, 0xee, 0x54, 0xcc, 0xee, 0xb8, 0x7f,
0xe8, 0x88, 0x2b, 0x44, 0xba, 0xfb, 0xa2, 0x6d, 0x17, 0xda, 0x3a, 0x08, 0x9b, 0x65, 0x6b, 0x5b,
0x30, 0xa4, 0xa1, 0xae, 0xf4, 0xa3, 0xe3, 0xe3, 0x84, 0xab, 0xdc, 0x4a, 0x0b, 0xa6, 0x0c, 0x45,
0x34, 0x3d, 0x03, 0xd1, 0x42, 0x22, 0x73, 0x2c, 0x0b, 0x70, 0x64, 0x12, 0x19, 0xea, 0x53, 0x59,
0xa5, 0xba, 0xac, 0x93, 0xca, 0xf3, 0xb3, 0x7c, 0x07, 0x1a, 0xba, 0x5e, 0x7b, 0x47, 0x50, 0x94,
0x1a, 0x8f, 0x3b, 0x0f, 0x39, 0x90, 0x56, 0xa7, 0x05, 0xaf, 0x16, 0x11, 0x6c, 0x03, 0xd8, 0x71,
0x10, 0xe7, 0xc9, 0x05, 0xf3, 0x96, 0x60, 0xdc, 0x97, 0xb0, 0xa2, 0xe4, 0xcd, 0xb0, 0x60, 0xed,
0x45, 0x74, 0xde, 0xa6, 0x8f, 0x2a, 0x45, 0x7d, 0xe4, 0xfe, 0x69, 0x15, 0xe6, 0xe5, 0x4a, 0x17,
0xee, 0x4c, 0x8b, 0x75, 0xb6, 0x60, 0xac, 0x6b, 0xdd, 0x8e, 0x23, 0xe5, 0x25, 0x77, 0xa1, 0xc2,
0x3e, 0x53, 0x2d, 0xdb, 0x67, 0x18, 0xd4, 0x26, 0x7e, 0x7a, 0x4a, 0x21, 0x96, 0xa6, 0x47, 0xbf,
0x55, 0x34, 0xb2, 0x6e, 0x47, 0x23, 0xcb, 0x6e, 0x88, 0x0b, 0x13, 0xaa, 0x78, 0x43, 0xfc, 0x2a,
0x34, 0xc5, 0xad, 0xe2, 0x2c, 0xe0, 0x98, 0x01, 0x90, 0x7b, 0x45, 0x81, 0x34, 0x84, 0xbc, 0xac,
0x92, 0x41, 0xbe, 0xc4, 0xce, 0xf6, 0x4d, 0x98, 0x13, 0xb7, 0x25, 0x64, 0xee, 0xec, 0x55, 0x75,
0xca, 0x26, 0xe8, 0xd4, 0x5f, 0x91, 0x84, 0xe3, 0x49, 0x5a, 0xf3, 0xae, 0x65, 0xcb, 0xbe, 0x6b,
0x69, 0xc6, 0x49, 0xdb, 0x76, 0x9c, 0xd4, 0x7d, 0x0c, 0x0b, 0x56, 0x75, 0xa8, 0x59, 0x65, 0xee,
0x6d, 0xe7, 0x12, 0x5b, 0x80, 0xe6, 0xd3, 0xfd, 0xfe, 0xe3, 0xbd, 0xa7, 0x4f, 0x76, 0x9f, 0x77,
0x1c, 0x2c, 0x1e, 0xbe, 0xd8, 0xda, 0xda, 0xd9, 0xd9, 0x26, 0x4d, 0x0b, 0x30, 0xf7, 0x78, 0xf3,
0xe9, 0x1e, 0xe9, 0xd9, 0x6d, 0xc1, 0xdb, 0xb2, 0x2e, 0x7d, 0xb2, 0xf1, 0x75, 0x60, 0xca, 0xc7,
0xa7, 0x1c, 0x9c, 0xc9, 0x88, 0xa7, 0x2a, 0x2d, 0x7c, 0x59, 0x62, 0x9e, 0x6a, 0x84, 0xba, 0xd5,
0x90, 0xd5, 0x92, 0x89, 0x88, 0x9c, 0xa4, 0xbc, 0x88, 0x48, 0x52, 0x4f, 0xe3, 0xdd, 0x1e, 0x74,
0xb7, 0x39, 0xd6, 0xb6, 0x39, 0x1a, 0xe5, 0xba, 0x83, 0x8e, 0x5a, 0x09, 0x4e, 0x7a, 0x71, 0xdf,
0x85, 0xcb, 0x9b, 0x22, 0x03, 0xfc, 0xb7, 0x95, 0x20, 0xe8, 0x76, 0x61, 0x2d, 0x5f, 0xa5, 0x6c,
0xec, 0x31, 0x2c, 0x6f, 0xf3, 0xa3, 0xe9, 0xc9, 0x1e, 0x3f, 0xcb, 0x1a, 0x62, 0x50, 0x4b, 0x4e,
0xa3, 0x73, 0x39, 0x3f, 0xf4, 0x9b, 0xbd, 0x0f, 0x30, 0x42, 0x9a, 0x7e, 0x32, 0xe1, 0x03, 0x75,
0x43, 0x8f, 0x20, 0x87, 0x13, 0x3e, 0x70, 0x3f, 0x01, 0x66, 0xd6, 0x23, 0xe7, 0x0b, 0xed, 0xac,
0xe9, 0x51, 0x3f, 0xb9, 0x48, 0x52, 0x3e, 0x56, 0x57, 0x0f, 0x4d, 0x90, 0x7b, 0x0b, 0xda, 0x07,
0xfe, 0x85, 0xc7, 0x7f, 0x22, 0xdf, 0x0e, 0x58, 0x87, 0xf9, 0x89, 0x7f, 0x81, 0x2c, 0xa8, 0x83,
0xbe, 0x84, 0x76, 0xff, 0x77, 0x05, 0xe6, 0x04, 0x25, 0xd6, 0x3a, 0xe4, 0x49, 0x1a, 0x84, 0x24,
0x69, 0xaa, 0x56, 0x03, 0x54, 0x90, 0xed, 0x4a, 0x89, 0x6c, 0xcb, 0x88, 0x84, 0xba, 0xed, 0x24,
0x05, 0xd8, 0x82, 0xa1, 0xa4, 0x65, 0x99, 0xbe, 0x22, 0x34, 0x98, 0x01, 0x72, 0x27, 0x08, 0x99,
0x35, 0x27, 0xfa, 0xa7, 0xd4, 0x96, 0x14, 0x63, 0x13, 0x54, 0x6a, 0x33, 0xce, 0x0b, 0x69, 0x2f,
0xd8, 0x8c, 0x05, 0xdb, 0xb0, 0xf1, 0x0e, 0xb6, 0xa1, 0x08, 0x53, 0xbc, 0xc9, 0x36, 0x84, 0x77,
0xb0, 0x0d, 0x5d, 0x06, 0x1d, 0xba, 0x46, 0x8d, 0xde, 0x87, 0xe2, 0xdd, 0x7f, 0xe0, 0x40, 0x47,
0x72, 0x91, 0xc6, 0xb1, 0x0f, 0x2d, 0x2f, 0xab, 0xf4, 0x9e, 0xce, 0x0d, 0x58, 0x20, 0xdf, 0x47,
0xab, 0x00, 0x79, 0xae, 0x63, 0x01, 0x71, 0x1c, 0x2a, 0x4f, 0x64, 0x1c, 0x8c, 0xe4, 0xa2, 0x98,
0x20, 0xa5, 0x45, 0x62, 0x5f, 0x66, 0xac, 0x3a, 0x9e, 0x2e, 0xbb, 0x7f, 0xe4, 0xc0, 0xb2, 0xd1,
0x61, 0xc9, 0x85, 0x0f, 0xa1, 0xad, 0x5f, 0x2b, 0xe0, 0x7a, 0x73, 0x5b, 0xb7, 0xc5, 0x26, 0xfb,
0xcc, 0x22, 0xa6, 0xc5, 0xf4, 0x2f, 0xa8, 0x83, 0xc9, 0x74, 0x2c, 0x77, 0x15, 0x13, 0x84, 0x8c,
0x74, 0xce, 0xf9, 0x2b, 0x4d, 0x22, 0xf6, 0x35, 0x0b, 0x46, 0xf1, 0x61, 0xf4, 0xd9, 0x34, 0x51,
0x4d, 0xc6, 0x87, 0x4d, 0xa0, 0xfb, 0x57, 0x2a, 0xb0, 0x22, 0x9c, 0x6f, 0x19, 0xf0, 0xd0, 0x17,
0x46, 0xe7, 0x44, 0x0c, 0x42, 0x48, 0xe4, 0xee, 0x25, 0x4f, 0x96, 0xd9, 0xb7, 0xde, 0x31, 0x60,
0xa0, 0xd3, 0x68, 0x67, 0xac, 0x45, 0xb5, 0x6c, 0x2d, 0xde, 0x30, 0xd3, 0x65, 0xa1, 0xfa, 0x7a,
0x79, 0xa8, 0xfe, 0x9d, 0x42, 0xe3, 0x8f, 0xe6, 0xa1, 0x9e, 0x0c, 0xa2, 0x09, 0x77, 0xd7, 0x60,
0xd5, 0x9e, 0x02, 0xa9, 0xa8, 0x7e, 0xee, 0x40, 0xf7, 0xb1, 0x38, 0x75, 0x0b, 0xc2, 0x93, 0xdd,
0x20, 0x49, 0xa3, 0x58, 0xdf, 0xbe, 0xbf, 0x06, 0x90, 0xa4, 0x7e, 0x2c, 0x0d, 0x5a, 0x19, 0x26,
0xcf, 0x20, 0x38, 0x12, 0x1e, 0x0e, 0x05, 0x56, 0xac, 0xa0, 0x2e, 0x17, 0x4c, 0x2f, 0x19, 0x44,
0xb0, 0x0c, 0x98, 0x9b, 0x22, 0xf9, 0x1c, 0xbb, 0xcc, 0xcf, 0x48, 0xfb, 0x0b, 0xef, 0x3c, 0x07,
0x75, 0xff, 0xa3, 0x03, 0x4b, 0x59, 0x27, 0x29, 0x49, 0xc2, 0xd6, 0x21, 0xd2, 0x6a, 0xc9, 0x74,
0x88, 0x0a, 0xe0, 0x07, 0x68, 0xc6, 0x28, 0x6b, 0x3f, 0x83, 0x90, 0x5c, 0xcb, 0x52, 0x34, 0x55,
0x76, 0xa1, 0x09, 0x12, 0xa9, 0xa4, 0x68, 0x40, 0x49, 0x63, 0x50, 0x96, 0xe8, 0x1a, 0xcf, 0x38,
0xa5, 0xaf, 0xc4, 0x8c, 0xab, 0x22, 0xeb, 0x08, 0x0b, 0x44, 0xbc, 0x44, 0x42, 0xd6, 0x87, 0xb9,
0x33, 0x37, 0xf4, 0xb3, 0x21, 0x62, 0x67, 0xfe, 0x3b, 0x0e, 0x5c, 0x29, 0x99, 0x78, 0x29, 0x5b,
0xdb, 0xb0, 0x7c, 0xac, 0x91, 0x6a, 0x72, 0x84, 0x80, 0xad, 0xa9, 0x53, 0x7e, 0x7b, 0x42, 0xbc,
0xe2, 0x07, 0xda, 0x9c, 0x14, 0xd3, 0x6d, 0x25, 0x6b, 0x17, 0x11, 0xee, 0x01, 0xf4, 0x76, 0x5e,
0xa3, 0xa8, 0x6e, 0x99, 0x4f, 0x9e, 0x29, 0x5e, 0xb8, 0x5f, 0x50, 0x45, 0x6f, 0x0f, 0xf8, 0x1c,
0xc3, 0x82, 0x55, 0x17, 0xfb, 0xc6, 0xbb, 0x56, 0x62, 0x4a, 0x95, 0x5a, 0x2b, 0xf1, 0x66, 0x9b,
0x4a, 0x19, 0x37, 0x40, 0xee, 0x19, 0x2c, 0x7d, 0x36, 0x1d, 0xa5, 0x41, 0xf6, 0x7e, 0x1b, 0xfb,
0x96, 0xfc, 0x88, 0xaa, 0x50, 0x53, 0x57, 0xda, 0x94, 0x49, 0x87, 0x33, 0x36, 0xc6, 0x9a, 0xfa,
0xc5, 0x16, 0x8b, 0x08, 0xf7, 0x0a, 0xac, 0x67, 0x4d, 0x8a, 0xb9, 0x53, 0xea, 0xfc, 0x17, 0x8e,
0xc8, 0x7d, 0xb2, 0x9f, 0x93, 0x63, 0x4f, 0x60, 0x25, 0x09, 0xc2, 0x93, 0x11, 0x37, 0xeb, 0x49,
0xe4, 0x4c, 0x5c, 0xb6, 0xbb, 0x27, 0x9f, 0x9c, 0xf3, 0xca, 0xbe, 0x40, 0x06, 0x29, 0xef, 0x68,
0xc6, 0x20, 0xb9, 0x29, 0x29, 0x1b, 0xc0, 0xb7, 0x61, 0xd1, 0x6e, 0x8c, 0x3d, 0x90, 0xd9, 0xde,
0x59, 0xcf, 0xcc, 0x53, 0x19, 0x9b, 0x33, 0x2c, 0x4a, 0xf7, 0x67, 0x0e, 0x74, 0x3d, 0x8e, 0x6c,
0xcc, 0x8d, 0x46, 0x25, 0xf7, 0x3c, 0x2c, 0x54, 0x3b, 0x7b, 0xc0, 0x3a, 0x8b, 0x5c, 0x8d, 0x75,
0x63, 0xe6, 0xa2, 0xec, 0x5e, 0x2a, 0x19, 0xd5, 0xa3, 0x06, 0xcc, 0xc9, 0xf1, 0xad, 0xc3, 0x65,
0xd9, 0x25, 0xd5, 0x9d, 0x2c, 0xa4, 0x6f, 0x35, 0x6a, 0x85, 0xf4, 0x7b, 0xd0, 0x15, 0xcf, 0x22,
0x98, 0xe3, 0x10, 0x1f, 0xde, 0xf9, 0x02, 0x5a, 0xc6, 0xe3, 0x10, 0x6c, 0x1d, 0x56, 0x5e, 0x3e,
0x7d, 0xbe, 0xbf, 0x73, 0x78, 0xd8, 0x3f, 0x78, 0xf1, 0xe8, 0x3b, 0x3b, 0xdf, 0xef, 0xef, 0x6e,
0x1e, 0xee, 0x76, 0x2e, 0xb1, 0x35, 0x60, 0xfb, 0x3b, 0x87, 0xcf, 0x77, 0xb6, 0x2d, 0xb8, 0xc3,
0xae, 0x41, 0xef, 0xc5, 0xfe, 0x8b, 0xc3, 0x9d, 0xed, 0x7e, 0xd9, 0x77, 0x15, 0xf6, 0x3e, 0x5c,
0x91, 0xf8, 0x92, 0xcf, 0xab, 0x77, 0x1e, 0x42, 0x27, 0xef, 0xe3, 0x5b, 0x11, 0x91, 0x37, 0x85,
0x4e, 0xee, 0xff, 0xac, 0x0a, 0x8b, 0x22, 0x7f, 0x4b, 0x3c, 0x61, 0xc8, 0x63, 0xf6, 0x19, 0xcc,
0xcb, 0xb7, 0x30, 0x99, 0x5a, 0x0c, 0xfb, 0xf5, 0xcd, 0xde, 0x5a, 0x1e, 0x2c, 0x67, 0x70, 0xe5,
0xaf, 0xfe, 0xc9, 0x7f, 0xfb, 0x7b, 0x95, 0x05, 0xd6, 0xba, 0x7b, 0xf6, 0xf1, 0xdd, 0x13, 0x1e,
0x26, 0x58, 0xc7, 0x1f, 0x00, 0x64, 0x2f, 0x3c, 0xb2, 0xae, 0xf6, 0x73, 0x73, 0xcf, 0x5f, 0xf6,
0xae, 0x94, 0x60, 0x64, 0xbd, 0x57, 0xa8, 0xde, 0x15, 0x77, 0x11, 0xeb, 0x0d, 0xc2, 0x20, 0x15,
0xaf, 0x3d, 0x7e, 0xea, 0xdc, 0x61, 0x43, 0x68, 0x9b, 0x6f, 0x2f, 0x32, 0x75, 0xa6, 0x51, 0xf2,
0x7a, 0x64, 0xef, 0xbd, 0x52, 0x9c, 0x5a, 0x7d, 0x6a, 0xe3, 0xb2, 0xdb, 0xc1, 0x36, 0xa6, 0x44,
0x91, 0xb5, 0x32, 0x12, 0x32, 0x91, 0x3d, 0xb1, 0xc8, 0xae, 0x1a, 0x6c, 0x5a, 0x78, 0xe0, 0xb1,
0xf7, 0xfe, 0x0c, 0xac, 0x6c, 0xeb, 0x7d, 0x6a, 0x6b, 0xdd, 0x65, 0xd8, 0xd6, 0x80, 0x68, 0xd4,
0x03, 0x8f, 0x9f, 0x3a, 0x77, 0xee, 0xff, 0x8f, 0x9b, 0xd0, 0xd4, 0x67, 0x9d, 0xec, 0xc7, 0xb0,
0x60, 0x25, 0xd8, 0x31, 0x35, 0x8c, 0xb2, 0x7c, 0xbc, 0xde, 0xd5, 0x72, 0xa4, 0x6c, 0xf8, 0x1a,
0x35, 0xdc, 0x65, 0x6b, 0xd8, 0xb0, 0xcc, 0x50, 0xbb, 0x4b, 0xa9, 0xa2, 0xe2, 0xa6, 0xd9, 0x2b,
0x43, 0xf6, 0x45, 0x63, 0x57, 0xf3, 0xe2, 0x68, 0xb5, 0xf6, 0xfe, 0x0c, 0xac, 0x6c, 0xee, 0x2a,
0x35, 0xb7, 0xc6, 0x56, 0xcd, 0xe6, 0xf4, 0x19, 0x24, 0xa7, 0xeb, 0x95, 0xe6, 0xeb, 0x83, 0xec,
0x7d, 0xcd, 0x58, 0x65, 0xaf, 0x12, 0x6a, 0x16, 0x29, 0x3e, 0x4d, 0xe8, 0x76, 0xa9, 0x29, 0xc6,
0x68, 0xf9, 0xcc, 0xc7, 0x07, 0xd9, 0x11, 0xb4, 0x8c, 0x77, 0x8a, 0xd8, 0x95, 0x99, 0x6f, 0x2a,
0xf5, 0x7a, 0x65, 0xa8, 0xb2, 0xa1, 0x98, 0xf5, 0xdf, 0xc5, 0x4d, 0xfd, 0x87, 0xd0, 0xd4, 0x2f,
0xdf, 0xb0, 0x75, 0xe3, 0x25, 0x22, 0xf3, 0xa5, 0x9e, 0x5e, 0xb7, 0x88, 0x28, 0x63, 0x3e, 0xb3,
0x76, 0x64, 0xbe, 0x97, 0xd0, 0x32, 0x5e, 0xb7, 0xd1, 0x03, 0x28, 0xbe, 0xa0, 0xa3, 0x07, 0x50,
0xf2, 0x18, 0x8e, 0xbb, 0x4c, 0x4d, 0xb4, 0x58, 0x93, 0xf8, 0x3b, 0x7d, 0x1d, 0x25, 0x6c, 0x0f,
0x2e, 0x4b, 0x1d, 0x77, 0xc4, 0xbf, 0xcc, 0x32, 0x94, 0x3c, 0xf8, 0x78, 0xcf, 0x61, 0x0f, 0xa1,
0xa1, 0x1e, 0x31, 0x62, 0x6b, 0xe5, 0x8f, 0x31, 0xf5, 0xd6, 0x0b, 0x70, 0x69, 0xdb, 0x7c, 0x1f,
0x20, 0x7b, 0x4a, 0x47, 0x2b, 0x89, 0xc2, 0xd3, 0x3c, 0x9a, 0x03, 0x8a, 0xef, 0xee, 0xb8, 0x6b,
0x34, 0xc0, 0x0e, 0x23, 0x25, 0x11, 0xf2, 0x73, 0x75, 0x93, 0xfa, 0x47, 0xd0, 0x32, 0x5e, 0xd3,
0xd1, 0xd3, 0x57, 0x7c, 0x89, 0x47, 0x4f, 0x5f, 0xc9, 0xe3, 0x3b, 0x6e, 0x8f, 0x6a, 0x5f, 0x75,
0x97, 0xb0, 0xf6, 0x24, 0x38, 0x09, 0xc7, 0x82, 0x00, 0x17, 0xe8, 0x14, 0x16, 0xac, 0x27, 0x73,
0xb4, 0x84, 0x96, 0x3d, 0xc8, 0xa3, 0x25, 0xb4, 0xf4, 0x95, 0x1d, 0xc5, 0x67, 0xee, 0x32, 0xb6,
0x73, 0x46, 0x24, 0x46, 0x4b, 0x3f, 0x80, 0x96, 0xf1, 0xfc, 0x8d, 0x1e, 0x4b, 0xf1, 0xa5, 0x1d,
0x3d, 0x96, 0xb2, 0xd7, 0x72, 0x56, 0xa9, 0x8d, 0x45, 0x97, 0x58, 0x81, 0xee, 0x04, 0x63, 0xdd,
0x3f, 0x86, 0x45, 0xfb, 0x41, 0x1c, 0x2d, 0xfb, 0xa5, 0x4f, 0xeb, 0x68, 0xd9, 0x9f, 0xf1, 0x8a,
0x8e, 0x64, 0xe9, 0x3b, 0x2b, 0xba, 0x91, 0xbb, 0x9f, 0xcb, 0x4c, 0xa9, 0x2f, 0xd8, 0x77, 0x51,
0xc1, 0xc9, 0x4b, 0xda, 0x6c, 0xdd, 0xe0, 0x5a, 0xf3, 0x2a, 0xb7, 0x96, 0x97, 0xc2, 0x7d, 0x6e,
0x9b, 0x99, 0xc5, 0xad, 0x66, 0xda, 0xb5, 0xe8, 0xb2, 0xb6, 0xb1, 0x6b, 0x99, 0xf7, 0xb9, 0x8d,
0x5d, 0xcb, 0xba, 0xd3, 0x9d, 0xdf, 0xb5, 0xd2, 0x00, 0xeb, 0x08, 0x61, 0x29, 0x77, 0x09, 0x40,
0x4b, 0x45, 0xf9, 0x3d, 0xad, 0xde, 0xb5, 0x37, 0xdf, 0x1d, 0xb0, 0x35, 0x88, 0x52, 0x82, 0x77,
0xd5, 0xad, 0xb8, 0xbf, 0x08, 0x6d, 0xf3, 0x71, 0x0f, 0x66, 0x8a, 0x72, 0xbe, 0xa5, 0xf7, 0x4a,
0x71, 0xf6, 0xe2, 0xb2, 0xb6, 0xd9, 0x0c, 0xfb, 0x1e, 0xac, 0x69, 0x51, 0x37, 0xf3, 0xca, 0x13,
0xf6, 0x41, 0x49, 0xb6, 0xb9, 0x69, 0xf9, 0xf4, 0xae, 0xcc, 0x4c, 0x47, 0xbf, 0xe7, 0x20, 0xd3,
0xd8, 0xaf, 0x26, 0x64, 0x1b, 0x46, 0xd9, 0x63, 0x11, 0xd9, 0x86, 0x51, 0xfa, 0xd4, 0x82, 0x62,
0x1a, 0xb6, 0x62, 0xcd, 0x91, 0x38, 0x64, 0x66, 0x3f, 0x80, 0x25, 0xe3, 0xe6, 0xce, 0xe1, 0x45,
0x38, 0xd0, 0x02, 0x50, 0xbc, 0x54, 0xda, 0x2b, 0xb3, 0xeb, 0xdd, 0x75, 0xaa, 0x7f, 0xd9, 0xb5,
0x26, 0x07, 0x99, 0x7f, 0x0b, 0x5a, 0xe6, 0xad, 0xa0, 0x37, 0xd4, 0xbb, 0x6e, 0xa0, 0xcc, 0x3b,
0x91, 0xf7, 0x1c, 0x76, 0x20, 0x12, 0x8c, 0xf4, 0x2b, 0x8c, 0x51, 0x9c, 0xdf, 0x3e, 0xed, 0xd7,
0x19, 0xf5, 0x42, 0x96, 0xbd, 0xcb, 0x79, 0xdb, 0xb9, 0xe7, 0xb0, 0x7f, 0xe8, 0x40, 0xdb, 0xba,
0xb5, 0x63, 0xa5, 0x6c, 0xe4, 0x7a, 0xd6, 0x35, 0x71, 0x66, 0xd7, 0x5c, 0x8f, 0x86, 0xbd, 0x77,
0xe7, 0xdb, 0xd6, 0xb4, 0x7e, 0x6e, 0x05, 0x8d, 0x36, 0xf2, 0x4f, 0x31, 0x7e, 0x91, 0x27, 0x30,
0xaf, 0xf2, 0x7e, 0x71, 0xcf, 0x61, 0xbf, 0x74, 0x60, 0xd1, 0x0e, 0x75, 0xea, 0xe1, 0x96, 0x06,
0x55, 0xf5, 0xe2, 0xcf, 0x88, 0x8f, 0xfe, 0x80, 0x7a, 0xf9, 0xfc, 0x8e, 0x67, 0xf5, 0x52, 0xbe,
0xd0, 0xf1, 0x9b, 0xf5, 0x96, 0x7d, 0x2a, 0xde, 0x0d, 0x56, 0x07, 0x12, 0xac, 0xf8, 0x82, 0xad,
0x66, 0x18, 0xf3, 0xcd, 0x59, 0x5a, 0x84, 0x1f, 0x89, 0x27, 0x08, 0x55, 0xcc, 0x1c, 0xf9, 0xee,
0x5d, 0xbf, 0x77, 0x6f, 0xd0, 0x98, 0xae, 0xb9, 0x57, 0xac, 0x31, 0xe5, 0x77, 0xf8, 0x4d, 0xd1,
0x3b, 0xf9, 0x5c, 0x6c, 0xb6, 0x45, 0x15, 0x9e, 0x90, 0x9d, 0xdd, 0xc9, 0xb1, 0xe8, 0xa4, 0x24,
0xb7, 0x84, 0xe3, 0x1d, 0xab, 0x71, 0xef, 0x50, 0x5f, 0x6f, 0xb8, 0x1f, 0xcc, 0xec, 0xeb, 0x5d,
0x0a, 0x58, 0x62, 0x8f, 0x0f, 0x00, 0xb2, 0xc3, 0x43, 0x96, 0x3b, 0xbc, 0xd2, 0x2a, 0xa3, 0x78,
0xbe, 0x68, 0x4b, 0xa0, 0x3a, 0xe3, 0xc2, 0x1a, 0x7f, 0x28, 0x14, 0xe0, 0x53, 0x75, 0xec, 0x65,
0x9a, 0x39, 0xf6, 0x29, 0x9f, 0x65, 0xe6, 0xe4, 0xeb, 0xb7, 0xd4, 0x9f, 0x3e, 0x43, 0x7b, 0x01,
0x0b, 0x7b, 0x51, 0xf4, 0x6a, 0x3a, 0xd1, 0x99, 0x15, 0xf6, 0x59, 0xc2, 0xae, 0x9f, 0x9c, 0xf6,
0x72, 0xa3, 0x70, 0xaf, 0x53, 0x55, 0x3d, 0xd6, 0x35, 0xaa, 0xba, 0xfb, 0x79, 0x76, 0x38, 0xf9,
0x05, 0xf3, 0x61, 0x59, 0x6b, 0x55, 0xdd, 0xf1, 0x9e, 0x5d, 0x8d, 0xa5, 0x4b, 0xf3, 0x4d, 0x58,
0xf6, 0xb8, 0xea, 0xed, 0xdd, 0x44, 0xd5, 0x49, 0x3a, 0xa5, 0xbd, 0xcd, 0x07, 0x74, 0x65, 0x81,
0x02, 0xf2, 0x2b, 0x59, 0xc7, 0x75, 0x24, 0xbf, 0xb7, 0x60, 0x01, 0xed, 0x9d, 0x66, 0xe2, 0x5f,
0xc4, 0xfc, 0x27, 0x77, 0x3f, 0x97, 0xa1, 0xfe, 0x2f, 0xd4, 0x4e, 0xa3, 0xce, 0x42, 0xac, 0x9d,
0x26, 0x77, 0x78, 0x62, 0xed, 0x34, 0x85, 0xc3, 0x13, 0x6b, 0xaa, 0xd5, 0x59, 0x0c, 0x1b, 0xc1,
0x72, 0xe1, 0xbc, 0x45, 0x6f, 0x32, 0xb3, 0x4e, 0x69, 0x7a, 0xd7, 0x67, 0x13, 0xd8, 0xad, 0xdd,
0xb1, 0x5b, 0x3b, 0x84, 0x85, 0x6d, 0x2e, 0x26, 0x4b, 0xa4, 0x8e, 0xe6, 0xae, 0x7e, 0x99, 0x89,
0xa9, 0xf9, 0x2d, 0x81, 0x70, 0xb6, 0x29, 0x41, 0x79, 0x9b, 0xec, 0x87, 0xd0, 0x7a, 0xc2, 0x53,
0x95, 0x2b, 0xaa, 0x8d, 0xd9, 0x5c, 0xf2, 0x68, 0xaf, 0x24, 0xd5, 0xd4, 0xe6, 0x19, 0xaa, 0xed,
0x2e, 0x1f, 0x9e, 0x70, 0xa1, 0x9c, 0xfa, 0xc1, 0xf0, 0x0b, 0xf6, 0x17, 0xa8, 0x72, 0x9d, 0x28,
0xbf, 0x66, 0x24, 0xff, 0x99, 0x95, 0x2f, 0xe5, 0xe0, 0x65, 0x35, 0x87, 0xd1, 0x90, 0x1b, 0x46,
0x55, 0x08, 0x2d, 0xe3, 0x42, 0x89, 0x16, 0xa0, 0xe2, 0xe5, 0x23, 0x2d, 0x40, 0x25, 0xf7, 0x4f,
0xdc, 0xdb, 0xd4, 0x8e, 0xcb, 0xae, 0x67, 0xed, 0x88, 0x3b, 0x27, 0x59, 0x4b, 0x77, 0x3f, 0xf7,
0xc7, 0xe9, 0x17, 0xec, 0x25, 0xbd, 0x98, 0x63, 0xe6, 0xc3, 0x66, 0xd6, 0x79, 0x3e, 0x75, 0x56,
0x4f, 0x96, 0x81, 0xb2, 0x2d, 0x76, 0xd1, 0x14, 0xd9, 0x5e, 0xdf, 0x02, 0x38, 0x4c, 0xa3, 0xc9,
0xb6, 0xcf, 0xc7, 0x51, 0x98, 0xe9, 0xda, 0x2c, 0x1b, 0x33, 0xd3, 0x5f, 0x46, 0x4a, 0x26, 0x7b,
0x69, 0xb8, 0x33, 0x56, 0x3a, 0xb1, 0x62, 0xae, 0x99, 0x09, 0x9b, 0x7a, 0x42, 0x4a, 0x92, 0x36,
0xef, 0x39, 0x6c, 0x13, 0x20, 0x3b, 0x70, 0xd3, 0xce, 0x49, 0xe1, 0x2c, 0x4f, 0xab, 0xbd, 0x92,
0xd3, 0xb9, 0x03, 0x68, 0x66, 0x27, 0x38, 0xeb, 0xd9, 0x9d, 0x2c, 0xeb, 0xbc, 0x47, 0xef, 0xe0,
0x85, 0x73, 0x15, 0xb7, 0x43, 0x53, 0x05, 0xac, 0x81, 0x53, 0x45, 0x87, 0x25, 0x01, 0xac, 0x88,
0x0e, 0x6a, 0x03, 0x87, 0x32, 0x09, 0xd5, 0x48, 0x4a, 0xce, 0x36, 0xb4, 0x34, 0x97, 0x06, 0xfd,
0xad, 0x18, 0x0b, 0x72, 0xab, 0xc8, 0x62, 0x44, 0xd5, 0x3c, 0x86, 0xe5, 0x42, 0x54, 0x5a, 0x8b,
0xf4, 0xac, 0x83, 0x02, 0x2d, 0xd2, 0x33, 0x03, 0xda, 0xee, 0x65, 0x6a, 0x72, 0xc9, 0x05, 0xf2,
0xa9, 0xce, 0x83, 0x74, 0x70, 0x8a, 0xcd, 0xfd, 0xc2, 0x81, 0x95, 0x92, 0xa0, 0x33, 0xfb, 0x50,
0xb9, 0xe7, 0x33, 0x03, 0xd2, 0xbd, 0xd2, 0x98, 0xa4, 0x7b, 0x48, 0xed, 0x7c, 0xc6, 0xbe, 0x63,
0x6d, 0x6c, 0x22, 0x1c, 0x28, 0x25, 0xf3, 0x8d, 0x46, 0x45, 0xa9, 0x45, 0xf1, 0x13, 0x58, 0x17,
0x1d, 0xd9, 0x1c, 0x8d, 0x72, 0xf1, 0xd2, 0x6b, 0x85, 0x7f, 0x1d, 0x62, 0xc5, 0x81, 0x7b, 0xb3,
0xff, 0xb5, 0xc8, 0x0c, 0x03, 0x58, 0x74, 0x95, 0x4d, 0xa1, 0x93, 0x8f, 0x41, 0xb2, 0xd9, 0x75,
0xf5, 0x3e, 0xb0, 0x1c, 0xcd, 0x62, 0xdc, 0xd2, 0xfd, 0x1d, 0x6a, 0xec, 0x03, 0xb7, 0x57, 0x36,
0x2f, 0xc2, 0xf7, 0xc4, 0xf5, 0xf8, 0xcb, 0x3a, 0x60, 0x9a, 0x1b, 0xa7, 0x6a, 0x60, 0x56, 0x84,
0x57, 0xbb, 0xba, 0xe5, 0xf1, 0xd6, 0x9b, 0xd4, 0xfc, 0x75, 0xf7, 0xbd, 0xb2, 0xe6, 0x63, 0xf1,
0x89, 0x70, 0x7a, 0xd7, 0xf3, 0x72, 0xad, 0x7a, 0x70, 0xbd, 0x6c, 0xbd, 0x67, 0x7a, 0x2f, 0xb9,
0xb9, 0xbe, 0x74, 0xcf, 0x79, 0x74, 0xeb, 0x07, 0xbf, 0x73, 0x12, 0xa4, 0xa7, 0xd3, 0xa3, 0x8d,
0x41, 0x34, 0xbe, 0x3b, 0x52, 0x41, 0x37, 0x99, 0xf7, 0x7e, 0x77, 0x14, 0x0e, 0xef, 0xd2, 0xf7,
0x47, 0x73, 0xf4, 0x9f, 0x88, 0xbe, 0xf1, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xb9, 0x2d, 0x25,
0xd5, 0xbb, 0x68, 0x00, 0x00,
0xdd, 0x17, 0x2c, 0x24, 0xb9, 0x2c, 0xc7, 0x56, 0x2e, 0xcb, 0x51, 0x26, 0xc9, 0x6d, 0x40, 0x43,
0x7d, 0x8e, 0x4e, 0xee, 0x71, 0x1c, 0x8d, 0x95, 0x93, 0x8b, 0xbf, 0xd9, 0x22, 0x54, 0xd2, 0x48,
0x3a, 0xa8, 0x95, 0x34, 0x72, 0xbf, 0x0f, 0x2d, 0x63, 0x06, 0x64, 0xa6, 0x1c, 0x19, 0x54, 0xd2,
0x3b, 0xae, 0x09, 0xff, 0x25, 0xe4, 0xa3, 0xa7, 0x43, 0xf6, 0x35, 0x58, 0x1e, 0x06, 0x31, 0xa7,
0xa4, 0xd8, 0x7e, 0xcc, 0xcf, 0x78, 0x9c, 0xa8, 0x38, 0x42, 0x47, 0x23, 0x3c, 0x01, 0x77, 0xfb,
0xb0, 0x62, 0xb1, 0x8d, 0x96, 0xaa, 0x39, 0xca, 0xea, 0x53, 0xa1, 0x4c, 0x3b, 0xe3, 0x4f, 0xe2,
0x70, 0x3f, 0x92, 0x21, 0x90, 0xfe, 0x24, 0x8e, 0x8e, 0xa8, 0x11, 0xc7, 0xb3, 0x60, 0xee, 0x2f,
0x2b, 0x50, 0xdd, 0x8d, 0x26, 0xe6, 0xa1, 0x8e, 0x63, 0x1f, 0xea, 0x48, 0xa3, 0xb1, 0xaf, 0x6d,
0x42, 0xb9, 0xb3, 0x5b, 0x40, 0x76, 0x07, 0x16, 0xfd, 0x71, 0xda, 0x4f, 0x23, 0x34, 0x92, 0xcf,
0xfd, 0x58, 0xa4, 0xff, 0x55, 0x89, 0x1d, 0x72, 0x18, 0xb6, 0x0a, 0x55, 0x6d, 0xeb, 0x10, 0x01,
0x16, 0xd1, 0x43, 0xa3, 0xc3, 0xef, 0x0b, 0x19, 0xab, 0x94, 0x25, 0x94, 0x76, 0xfb, 0x7b, 0xe1,
0x1e, 0x8b, 0x1d, 0xab, 0x0c, 0x85, 0x06, 0x2c, 0x0a, 0xc0, 0x38, 0xb3, 0x07, 0x75, 0xd9, 0x8c,
0xc2, 0x37, 0xec, 0x28, 0xfc, 0x75, 0x68, 0xa5, 0xa3, 0xb3, 0xfe, 0xc4, 0xbf, 0x18, 0x45, 0xfe,
0x50, 0x32, 0x9e, 0x09, 0x72, 0x7f, 0xe5, 0x40, 0x9d, 0x66, 0x18, 0xf7, 0x67, 0xa1, 0xc0, 0xf4,
0xc9, 0x0f, 0xcd, 0xda, 0x82, 0x97, 0x07, 0x33, 0xd7, 0x4a, 0xe2, 0xae, 0xe8, 0x21, 0x9b, 0x89,
0xdc, 0xd7, 0xa1, 0x29, 0x4a, 0x3a, 0x21, 0x99, 0x48, 0x32, 0x20, 0xbb, 0x06, 0xb5, 0xd3, 0x68,
0xa2, 0x5c, 0x18, 0x50, 0x87, 0xbc, 0xd1, 0xc4, 0x23, 0x78, 0xd6, 0x1f, 0xac, 0x4f, 0x0c, 0x5c,
0x98, 0x89, 0x79, 0x30, 0x9a, 0xe6, 0xba, 0x5a, 0x73, 0x22, 0x73, 0x50, 0xf7, 0x05, 0x2c, 0xa1,
0x0c, 0x18, 0x91, 0xf0, 0xd9, 0xca, 0xea, 0xab, 0xb8, 0xf7, 0x0d, 0x46, 0xd3, 0x21, 0x37, 0x1d,
0x49, 0x8a, 0x74, 0x4a, 0xb8, 0x32, 0xa1, 0xdc, 0x7f, 0xe1, 0x08, 0xd9, 0xc2, 0x7a, 0xd9, 0x6d,
0xa8, 0xa1, 0xca, 0xc9, 0xc5, 0x0d, 0x74, 0x1e, 0x08, 0xd2, 0x79, 0x44, 0x81, 0x9c, 0x4c, 0xb1,
0x48, 0xb3, 0x76, 0x11, 0x89, 0xcc, 0xbc, 0x30, 0x3d, 0xb2, 0x9c, 0xf3, 0x92, 0x83, 0xb2, 0x0d,
0xe3, 0x20, 0xa7, 0x66, 0xa9, 0x31, 0xb5, 0xd5, 0x0e, 0x4f, 0xb8, 0x71, 0x80, 0xf3, 0x4b, 0x07,
0x16, 0xac, 0x3e, 0x21, 0xa7, 0x8c, 0xfc, 0x24, 0x95, 0x67, 0xf1, 0x72, 0xe5, 0x4d, 0x90, 0xc9,
0x65, 0x15, 0x9b, 0xcb, 0xf4, 0x81, 0x40, 0xd5, 0x3c, 0x10, 0xb8, 0x07, 0xcd, 0x2c, 0x8b, 0xdf,
0xee, 0x14, 0xb6, 0xa8, 0x32, 0x62, 0x32, 0xa2, 0x2c, 0xe4, 0x5c, 0x37, 0x42, 0xce, 0xee, 0x43,
0x68, 0x19, 0xf4, 0x66, 0xc8, 0xd8, 0xb1, 0x42, 0xc6, 0x3a, 0x5d, 0xac, 0x92, 0xa5, 0x8b, 0xb9,
0x3f, 0xab, 0xc0, 0x02, 0xb2, 0x77, 0x10, 0x9e, 0x1c, 0x44, 0xa3, 0x60, 0x70, 0x41, 0x6c, 0xa5,
0x38, 0x59, 0x6e, 0x39, 0x8a, 0xcd, 0x6d, 0x30, 0x8a, 0x9c, 0xce, 0x91, 0x15, 0xfa, 0x41, 0x97,
0x51, 0x81, 0xa0, 0xf8, 0x1d, 0xf9, 0x89, 0x94, 0x49, 0x69, 0xf2, 0x5a, 0x40, 0x14, 0x73, 0x04,
0x50, 0xf2, 0xdf, 0x38, 0x18, 0x8d, 0x02, 0x41, 0x2b, 0x1c, 0xa2, 0x32, 0x14, 0xb6, 0x39, 0x0c,
0x12, 0xff, 0x28, 0x3b, 0xec, 0xd3, 0x65, 0x8a, 0xa6, 0xf9, 0xaf, 0x8d, 0x68, 0x9a, 0xc8, 0x16,
0xb6, 0x81, 0xf9, 0x85, 0x9c, 0x2f, 0x2c, 0xa4, 0xfb, 0xc7, 0x15, 0x68, 0x19, 0x6c, 0x21, 0x4f,
0xb8, 0x6d, 0xdd, 0x6e, 0x40, 0x14, 0xde, 0x72, 0xaf, 0x0d, 0x08, 0xbb, 0x61, 0xb7, 0x48, 0x11,
0x75, 0x12, 0x76, 0x8b, 0x7d, 0xae, 0x42, 0x13, 0xd9, 0xfe, 0x63, 0xf2, 0xe5, 0xe5, 0xf5, 0x19,
0x0d, 0x50, 0xd8, 0xfb, 0x84, 0xad, 0x67, 0x58, 0x02, 0xbc, 0xf1, 0x4c, 0xfc, 0x01, 0xb4, 0x65,
0x35, 0xb4, 0xbe, 0x34, 0xe0, 0x4c, 0xf0, 0xac, 0xb5, 0xf7, 0x2c, 0x4a, 0xf5, 0xe5, 0x7d, 0xf5,
0x65, 0xe3, 0x6d, 0x5f, 0x2a, 0x4a, 0xf7, 0x89, 0x4e, 0x35, 0x78, 0x12, 0xfb, 0x93, 0x53, 0xa5,
0x4c, 0xee, 0xc1, 0x8a, 0xd2, 0x19, 0xd3, 0xd0, 0x0f, 0xc3, 0x68, 0x1a, 0x0e, 0xb8, 0xca, 0x2a,
0x2b, 0x43, 0xb9, 0x43, 0x9d, 0x83, 0x4c, 0x15, 0xb1, 0x3b, 0x50, 0x17, 0x06, 0x8b, 0xd8, 0x02,
0xcb, 0xd5, 0x87, 0x20, 0x61, 0xb7, 0xa1, 0x2e, 0xec, 0x96, 0xca, 0x4c, 0x81, 0x17, 0x04, 0xee,
0x1d, 0x58, 0xa2, 0xa4, 0x67, 0x5b, 0xef, 0xd9, 0x5b, 0xe3, 0xdc, 0x40, 0xa4, 0x45, 0xaf, 0x02,
0xdb, 0x17, 0xf2, 0x64, 0x1e, 0x18, 0xfe, 0xaa, 0x0a, 0x2d, 0x03, 0x8c, 0x7a, 0x89, 0x4e, 0x79,
0xfa, 0xc3, 0xc0, 0x1f, 0xf3, 0x94, 0xc7, 0x52, 0x86, 0x72, 0x50, 0xa4, 0xf3, 0xcf, 0x4e, 0xfa,
0xd1, 0x34, 0xed, 0x0f, 0xf9, 0x49, 0xcc, 0xb9, 0xdc, 0xaf, 0x73, 0x50, 0xa4, 0x43, 0x2e, 0x36,
0xe8, 0xc4, 0xb9, 0x4c, 0x0e, 0xaa, 0x8e, 0xff, 0xc4, 0x1c, 0xd5, 0xb2, 0xe3, 0x3f, 0x31, 0x23,
0x79, 0x8d, 0x5a, 0x2f, 0xd1, 0xa8, 0x9f, 0xc0, 0x9a, 0xd0, 0x9d, 0x52, 0x6b, 0xf4, 0x73, 0x8c,
0x35, 0x03, 0xcb, 0xee, 0x40, 0x07, 0xfb, 0xac, 0xc4, 0x22, 0x09, 0x7e, 0x2a, 0x64, 0xcb, 0xf1,
0x0a, 0x70, 0xa4, 0xa5, 0x98, 0xb4, 0x49, 0x2b, 0x72, 0x30, 0x0a, 0x70, 0xa2, 0xf5, 0x5f, 0xdb,
0xb4, 0x4d, 0x49, 0x9b, 0x83, 0xb3, 0x07, 0xb0, 0x3e, 0xe6, 0xc3, 0xc0, 0xb7, 0xab, 0xa0, 0x10,
0x91, 0x48, 0x04, 0x9b, 0x85, 0xc6, 0x56, 0x70, 0x16, 0x7e, 0x1a, 0x8d, 0x8f, 0x02, 0xb1, 0xa1,
0x89, 0xe8, 0x79, 0xcd, 0x2b, 0xc0, 0xdd, 0x05, 0x68, 0x1d, 0xa6, 0xd1, 0x44, 0x2d, 0xfd, 0x22,
0xb4, 0x45, 0x51, 0xe6, 0x10, 0xbe, 0x07, 0x57, 0x88, 0x57, 0x9f, 0x47, 0x93, 0x68, 0x14, 0x9d,
0x5c, 0x58, 0x3e, 0xf0, 0xbf, 0x77, 0x60, 0xc5, 0xc2, 0x66, 0x4e, 0x30, 0x05, 0xec, 0x54, 0xf2,
0x97, 0x60, 0xef, 0x65, 0x63, 0x3b, 0x10, 0x84, 0xe2, 0x6c, 0xe4, 0x85, 0xcc, 0x07, 0xdb, 0xcc,
0x6e, 0x33, 0xa8, 0x0f, 0x05, 0xaf, 0x77, 0x8b, 0xbc, 0x2e, 0xbf, 0x57, 0xf7, 0x1c, 0x54, 0x15,
0xbf, 0x27, 0x33, 0x66, 0x86, 0x72, 0xd0, 0x55, 0x3b, 0xcb, 0xc1, 0x8c, 0x99, 0xa8, 0x1e, 0x0c,
0x34, 0x30, 0x71, 0x7f, 0xee, 0x00, 0x64, 0xbd, 0xa3, 0x3c, 0x0b, 0xbd, 0xa5, 0x89, 0xdb, 0xb2,
0xc6, 0xf6, 0xf5, 0x21, 0xb4, 0xf5, 0x51, 0x79, 0xb6, 0x4b, 0xb6, 0x14, 0x0c, 0xad, 0x8a, 0x5b,
0xb0, 0x74, 0x32, 0x8a, 0x8e, 0xc8, 0x7a, 0xa1, 0xa4, 0xd4, 0x44, 0x66, 0x52, 0x2e, 0x0a, 0xf0,
0x63, 0x09, 0xcd, 0xb6, 0xd4, 0x9a, 0xb9, 0xa5, 0x96, 0x6f, 0x90, 0x7f, 0xab, 0xa2, 0xcf, 0x2b,
0xb3, 0x99, 0x98, 0x29, 0xe1, 0xec, 0x7e, 0x41, 0x9d, 0xcf, 0x38, 0x1e, 0x24, 0xfb, 0xfe, 0xe0,
0xad, 0xe1, 0xd3, 0x87, 0xb0, 0x18, 0x0b, 0x5d, 0xa9, 0x14, 0x69, 0xed, 0x0d, 0x8a, 0x74, 0x21,
0xb6, 0x76, 0xe3, 0xaf, 0x42, 0xc7, 0x1f, 0x9e, 0xf1, 0x38, 0x0d, 0x28, 0x9c, 0x44, 0xa6, 0x93,
0x18, 0xdc, 0x92, 0x01, 0x27, 0x0b, 0xe5, 0x16, 0x2c, 0xc9, 0x9c, 0x56, 0x4d, 0x29, 0xef, 0x9d,
0x65, 0x60, 0x24, 0x74, 0x7f, 0xa1, 0x8e, 0x46, 0xed, 0x95, 0x9d, 0x3d, 0x23, 0xe6, 0xe8, 0x2a,
0xb9, 0xd1, 0x7d, 0x45, 0x1e, 0x53, 0x0e, 0x55, 0xcc, 0xaa, 0x6a, 0xe4, 0x5c, 0x0d, 0xe5, 0xb1,
0xb2, 0x3d, 0xa5, 0xb5, 0x77, 0x99, 0x52, 0xf7, 0x4f, 0x1c, 0x98, 0xdf, 0x8d, 0x26, 0xbb, 0x32,
0xfb, 0x8c, 0xc4, 0x43, 0x27, 0x93, 0xab, 0xe2, 0x1b, 0xf2, 0xd2, 0x4a, 0x2d, 0x90, 0x85, 0xbc,
0x05, 0xf2, 0xe7, 0xe1, 0x3d, 0x8a, 0x98, 0xc6, 0xd1, 0x24, 0x8a, 0x51, 0x44, 0xfd, 0x91, 0x30,
0x37, 0xa2, 0x30, 0x3d, 0x55, 0x2a, 0xf4, 0x4d, 0x24, 0x14, 0xc6, 0x40, 0xef, 0x52, 0x78, 0x2e,
0xd2, 0x62, 0x12, 0x9a, 0xb5, 0x88, 0x70, 0x7f, 0x17, 0x9a, 0xe4, 0x4d, 0xd0, 0xb0, 0x3e, 0x82,
0xe6, 0x69, 0x34, 0xe9, 0x9f, 0x06, 0x61, 0xaa, 0x44, 0x7e, 0x31, 0x33, 0xf3, 0x77, 0x69, 0x42,
0x34, 0x81, 0xfb, 0xc7, 0x73, 0x30, 0xff, 0x34, 0x3c, 0x8b, 0x82, 0x01, 0x1d, 0xc3, 0x8e, 0xf9,
0x38, 0x52, 0xa9, 0xf5, 0xf8, 0x9b, 0x5d, 0x85, 0x79, 0xca, 0x25, 0x9d, 0x08, 0xa6, 0x6d, 0x8b,
0x74, 0x0b, 0x09, 0xa2, 0x0b, 0xa1, 0xd9, 0xb5, 0x38, 0x21, 0x54, 0x06, 0x04, 0x3d, 0xb1, 0xd8,
0xbc, 0xd6, 0x26, 0x4b, 0xd9, 0xd5, 0x85, 0xba, 0x71, 0x75, 0x01, 0xdb, 0x92, 0xd9, 0x72, 0x22,
0x9d, 0x4a, 0xb4, 0x25, 0x41, 0xe4, 0x3d, 0xc6, 0x5c, 0x44, 0xbc, 0xb5, 0x91, 0x85, 0xde, 0xa3,
0x09, 0x44, 0x43, 0x4c, 0x7c, 0x20, 0x68, 0xc4, 0x06, 0x60, 0x82, 0xd0, 0x14, 0xcd, 0xdf, 0xa4,
0x14, 0x37, 0x59, 0xf3, 0x60, 0xd4, 0xdf, 0x43, 0xae, 0xd5, 0xac, 0x18, 0x07, 0x88, 0xab, 0x7f,
0x79, 0xb8, 0xe1, 0x73, 0x8a, 0xb4, 0x5f, 0xe5, 0x73, 0x22, 0xc3, 0xf8, 0xa3, 0xd1, 0x91, 0x3f,
0x78, 0x45, 0x17, 0x69, 0xe9, 0x60, 0xb4, 0xe9, 0xd9, 0x40, 0xca, 0x79, 0xcb, 0x56, 0x95, 0x12,
0x53, 0x6a, 0x9e, 0x09, 0x62, 0xf7, 0xa1, 0x45, 0xbe, 0xb8, 0x5c, 0xd7, 0x45, 0x5a, 0xd7, 0x8e,
0xe9, 0xac, 0xd3, 0xca, 0x9a, 0x44, 0xe6, 0x11, 0xf1, 0x52, 0x21, 0x11, 0xd7, 0x1f, 0x0e, 0xe5,
0xc9, 0x7a, 0x47, 0xc4, 0x15, 0x34, 0x80, 0xbc, 0x7d, 0x31, 0x61, 0x82, 0x60, 0x99, 0x08, 0x2c,
0x18, 0xbb, 0x06, 0x0d, 0xf4, 0xf0, 0x26, 0x7e, 0x30, 0xa4, 0x5c, 0x14, 0xe1, 0x68, 0x6a, 0x18,
0xd6, 0xa1, 0x7e, 0xd3, 0x56, 0xb9, 0x42, 0xb3, 0x62, 0xc1, 0x70, 0x6e, 0x74, 0x79, 0x9c, 0x65,
0xee, 0xda, 0x40, 0xf6, 0x31, 0x9d, 0x6f, 0xa6, 0x9c, 0xd2, 0x73, 0x17, 0xef, 0xbf, 0x27, 0xc7,
0x2c, 0x99, 0x56, 0xfd, 0x3d, 0x44, 0x12, 0x4f, 0x50, 0xa2, 0x91, 0x26, 0x42, 0xcc, 0x6b, 0x96,
0x91, 0x26, 0x49, 0x29, 0xc4, 0x2c, 0x08, 0xdc, 0x4d, 0x68, 0x9b, 0x15, 0xb0, 0x06, 0xd4, 0x9e,
0x1d, 0xec, 0xec, 0x77, 0x2e, 0xb1, 0x16, 0xcc, 0x1f, 0xee, 0x3c, 0x7f, 0xbe, 0xb7, 0xb3, 0xdd,
0x71, 0x58, 0x1b, 0x1a, 0x3a, 0x95, 0xb1, 0x82, 0xa5, 0xcd, 0xad, 0xad, 0x9d, 0x83, 0xe7, 0x3b,
0xdb, 0x9d, 0xaa, 0xfb, 0x87, 0x15, 0x68, 0x19, 0x35, 0xbf, 0x21, 0xfe, 0x71, 0x0d, 0x80, 0x3c,
0x86, 0x2c, 0xa1, 0xa1, 0xe6, 0x19, 0x10, 0xd4, 0x88, 0xda, 0x97, 0xae, 0x8a, 0x1b, 0x80, 0xaa,
0x4c, 0x73, 0x45, 0x57, 0xed, 0xcc, 0x28, 0x7e, 0xdd, 0xb3, 0x81, 0xc8, 0x47, 0x12, 0x40, 0x59,
0x75, 0x42, 0xba, 0x4c, 0x10, 0xae, 0x4b, 0xcc, 0x93, 0x68, 0x74, 0xc6, 0x05, 0x89, 0xb0, 0xbf,
0x2c, 0x18, 0xb6, 0x25, 0xd5, 0x8b, 0x91, 0xf1, 0x5a, 0xf7, 0x6c, 0x20, 0xfb, 0xba, 0x5a, 0x97,
0x06, 0xad, 0xcb, 0x7a, 0x71, 0x92, 0xcd, 0x35, 0x71, 0x53, 0x60, 0x9b, 0xc3, 0xa1, 0xc4, 0x9a,
0xf7, 0x09, 0x63, 0xf3, 0xf2, 0xaa, 0x52, 0x10, 0x25, 0x42, 0x5a, 0x29, 0x17, 0xd2, 0x37, 0xb2,
0xb2, 0xbb, 0x03, 0xad, 0x03, 0xe3, 0x3a, 0x2c, 0xe9, 0x2b, 0x75, 0x11, 0x56, 0xea, 0x39, 0x03,
0x62, 0x74, 0xa7, 0x62, 0x76, 0xc7, 0xfd, 0x43, 0x47, 0xdc, 0x30, 0xd2, 0xdd, 0x17, 0x6d, 0xbb,
0xd0, 0xd6, 0x31, 0xda, 0x2c, 0x99, 0xdb, 0x82, 0x21, 0x0d, 0x75, 0xa5, 0x1f, 0x1d, 0x1f, 0x27,
0x5c, 0xa5, 0x5e, 0x5a, 0x30, 0x65, 0x28, 0xa2, 0xe9, 0x19, 0x88, 0x16, 0x12, 0x99, 0x82, 0x59,
0x80, 0x23, 0x93, 0xc8, 0x50, 0x9f, 0x4a, 0x3a, 0xd5, 0x65, 0x9d, 0x73, 0x9e, 0x9f, 0xe5, 0x3b,
0xd0, 0xd0, 0xf5, 0xda, 0x3b, 0x82, 0xa2, 0xd4, 0x78, 0xdc, 0x79, 0xc8, 0x81, 0xb4, 0x3a, 0x2d,
0x78, 0xb5, 0x88, 0x60, 0x1b, 0xc0, 0x8e, 0x83, 0x38, 0x4f, 0x2e, 0x98, 0xb7, 0x04, 0xe3, 0xbe,
0x84, 0x15, 0x25, 0x6f, 0x86, 0x05, 0x6b, 0x2f, 0xa2, 0xf3, 0x36, 0x7d, 0x54, 0x29, 0xea, 0x23,
0xf7, 0x4f, 0xab, 0x30, 0x2f, 0x57, 0xba, 0x70, 0xa5, 0x5a, 0xac, 0xb3, 0x05, 0x63, 0x5d, 0xeb,
0xf2, 0x1c, 0x29, 0x2f, 0xb9, 0x0b, 0x15, 0xf6, 0x99, 0x6a, 0xd9, 0x3e, 0xc3, 0xa0, 0x36, 0xf1,
0xd3, 0x53, 0x0a, 0xb1, 0x34, 0x3d, 0xfa, 0xad, 0xa2, 0x91, 0x75, 0x3b, 0x1a, 0x59, 0x76, 0x81,
0x5c, 0x98, 0x50, 0xc5, 0x0b, 0xe4, 0x57, 0xa1, 0x29, 0x2e, 0x1d, 0x67, 0x01, 0xc7, 0x0c, 0x80,
0xdc, 0x2b, 0x0a, 0xa4, 0x21, 0xe4, 0x5d, 0x96, 0x0c, 0xf2, 0x25, 0x76, 0xb6, 0x6f, 0xc2, 0x9c,
0xb8, 0x4c, 0x21, 0x53, 0x6b, 0xaf, 0xaa, 0x43, 0x38, 0x41, 0xa7, 0xfe, 0x8a, 0x1c, 0x1d, 0x4f,
0xd2, 0x9a, 0x57, 0x31, 0x5b, 0xf6, 0x55, 0x4c, 0x33, 0x4e, 0xda, 0xb6, 0xe3, 0xa4, 0xee, 0x63,
0x58, 0xb0, 0xaa, 0x43, 0xcd, 0x2a, 0x53, 0x73, 0x3b, 0x97, 0xd8, 0x02, 0x34, 0x9f, 0xee, 0xf7,
0x1f, 0xef, 0x3d, 0x7d, 0xb2, 0xfb, 0xbc, 0xe3, 0x60, 0xf1, 0xf0, 0xc5, 0xd6, 0xd6, 0xce, 0xce,
0x36, 0x69, 0x5a, 0x80, 0xb9, 0xc7, 0x9b, 0x4f, 0xf7, 0x48, 0xcf, 0x6e, 0x0b, 0xde, 0x96, 0x75,
0xe9, 0x83, 0x8f, 0xaf, 0x03, 0x53, 0x3e, 0x3e, 0xa5, 0xe8, 0x4c, 0x46, 0x3c, 0x55, 0x59, 0xe3,
0xcb, 0x12, 0xf3, 0x54, 0x23, 0xd4, 0xa5, 0x87, 0xac, 0x96, 0x4c, 0x44, 0xe4, 0x24, 0xe5, 0x45,
0x44, 0x92, 0x7a, 0x1a, 0xef, 0xf6, 0xa0, 0xbb, 0xcd, 0xb1, 0xb6, 0xcd, 0xd1, 0x28, 0xd7, 0x1d,
0x74, 0xd4, 0x4a, 0x70, 0xd2, 0x8b, 0xfb, 0x2e, 0x5c, 0xde, 0x14, 0x09, 0xe2, 0xbf, 0xad, 0xfc,
0x41, 0xb7, 0x0b, 0x6b, 0xf9, 0x2a, 0x65, 0x63, 0x8f, 0x61, 0x79, 0x9b, 0x1f, 0x4d, 0x4f, 0xf6,
0xf8, 0x59, 0xd6, 0x10, 0x83, 0x5a, 0x72, 0x1a, 0x9d, 0xcb, 0xf9, 0xa1, 0xdf, 0xec, 0x7d, 0x80,
0x11, 0xd2, 0xf4, 0x93, 0x09, 0x1f, 0xa8, 0x0b, 0x7c, 0x04, 0x39, 0x9c, 0xf0, 0x81, 0xfb, 0x09,
0x30, 0xb3, 0x1e, 0x39, 0x5f, 0x68, 0x67, 0x4d, 0x8f, 0xfa, 0xc9, 0x45, 0x92, 0xf2, 0xb1, 0xba,
0x99, 0x68, 0x82, 0xdc, 0x5b, 0xd0, 0x3e, 0xf0, 0x2f, 0x3c, 0xfe, 0x13, 0xf9, 0xb4, 0xc0, 0x3a,
0xcc, 0x4f, 0xfc, 0x0b, 0x64, 0x41, 0x1d, 0xf4, 0x25, 0xb4, 0xfb, 0xbf, 0x2b, 0x30, 0x27, 0x28,
0xb1, 0xd6, 0x21, 0x4f, 0xd2, 0x20, 0x24, 0x49, 0x53, 0xb5, 0x1a, 0xa0, 0x82, 0x6c, 0x57, 0x4a,
0x64, 0x5b, 0x46, 0x24, 0xd4, 0x65, 0x28, 0x29, 0xc0, 0x16, 0x0c, 0x25, 0x2d, 0x4b, 0x04, 0x16,
0xa1, 0xc1, 0x0c, 0x90, 0x3b, 0x41, 0xc8, 0xac, 0x39, 0xd1, 0x3f, 0xa5, 0xb6, 0xa4, 0x18, 0x9b,
0xa0, 0x52, 0x9b, 0x71, 0x5e, 0x48, 0x7b, 0xc1, 0x66, 0x2c, 0xd8, 0x86, 0x8d, 0x77, 0xb0, 0x0d,
0x45, 0x98, 0xe2, 0x4d, 0xb6, 0x21, 0xbc, 0x83, 0x6d, 0xe8, 0x32, 0xe8, 0xd0, 0x2d, 0x6b, 0xf4,
0x3e, 0x14, 0xef, 0xfe, 0x7d, 0x07, 0x3a, 0x92, 0x8b, 0x34, 0x8e, 0x7d, 0x68, 0x79, 0x59, 0xa5,
0xd7, 0x78, 0x6e, 0xc0, 0x02, 0xf9, 0x3e, 0x5a, 0x05, 0xc8, 0x73, 0x1d, 0x0b, 0x88, 0xe3, 0x50,
0x69, 0x24, 0xe3, 0x60, 0x24, 0x17, 0xc5, 0x04, 0x29, 0x2d, 0x12, 0xfb, 0x32, 0xa1, 0xd5, 0xf1,
0x74, 0xd9, 0xfd, 0x23, 0x07, 0x96, 0x8d, 0x0e, 0x4b, 0x2e, 0x7c, 0x08, 0x6d, 0xfd, 0x98, 0x01,
0xd7, 0x9b, 0xdb, 0xba, 0x2d, 0x36, 0xd9, 0x67, 0x16, 0x31, 0x2d, 0xa6, 0x7f, 0x41, 0x1d, 0x4c,
0xa6, 0x63, 0xb9, 0xab, 0x98, 0x20, 0x64, 0xa4, 0x73, 0xce, 0x5f, 0x69, 0x12, 0xb1, 0xaf, 0x59,
0x30, 0x8a, 0x0f, 0xa3, 0xcf, 0xa6, 0x89, 0x6a, 0x32, 0x3e, 0x6c, 0x02, 0xdd, 0xbf, 0x52, 0x81,
0x15, 0xe1, 0x7c, 0xcb, 0x80, 0x87, 0xbe, 0x4f, 0x3a, 0x27, 0x62, 0x10, 0x42, 0x22, 0x77, 0x2f,
0x79, 0xb2, 0xcc, 0xbe, 0xf5, 0x8e, 0x01, 0x03, 0x9d, 0x65, 0x3b, 0x63, 0x2d, 0xaa, 0x65, 0x6b,
0xf1, 0x86, 0x99, 0x2e, 0x0b, 0xd5, 0xd7, 0xcb, 0x43, 0xf5, 0xef, 0x14, 0x1a, 0x7f, 0x34, 0x0f,
0xf5, 0x64, 0x10, 0x4d, 0xb8, 0xbb, 0x06, 0xab, 0xf6, 0x14, 0x48, 0x45, 0xf5, 0x73, 0x07, 0xba,
0x8f, 0xc5, 0xa9, 0x5b, 0x10, 0x9e, 0xec, 0x06, 0x49, 0x1a, 0xc5, 0xfa, 0x72, 0xfe, 0x35, 0x80,
0x24, 0xf5, 0x63, 0x69, 0xd0, 0xca, 0x30, 0x79, 0x06, 0xc1, 0x91, 0xf0, 0x70, 0x28, 0xb0, 0x62,
0x05, 0x75, 0xb9, 0x60, 0x7a, 0xc9, 0x20, 0x82, 0x65, 0xc0, 0xdc, 0x14, 0xb9, 0xe9, 0xd8, 0x65,
0x7e, 0x46, 0xda, 0x5f, 0x78, 0xe7, 0x39, 0xa8, 0xfb, 0x1f, 0x1d, 0x58, 0xca, 0x3a, 0x49, 0x39,
0x14, 0xb6, 0x0e, 0x91, 0x56, 0x4b, 0xa6, 0x43, 0x54, 0x00, 0x3f, 0x40, 0x33, 0x46, 0x59, 0xfb,
0x19, 0x84, 0xe4, 0x5a, 0x96, 0xa2, 0xa9, 0xb2, 0x0b, 0x4d, 0x90, 0xc8, 0x34, 0x45, 0x03, 0x4a,
0x1a, 0x83, 0xb2, 0x44, 0xb7, 0x7c, 0xc6, 0x29, 0x7d, 0x25, 0x66, 0x5c, 0x15, 0x59, 0x47, 0x58,
0x20, 0xe2, 0xa1, 0x12, 0xb2, 0x3e, 0xcc, 0x9d, 0xb9, 0xa1, 0x5f, 0x15, 0x11, 0x3b, 0xf3, 0xdf,
0x76, 0xe0, 0x4a, 0xc9, 0xc4, 0x4b, 0xd9, 0xda, 0x86, 0xe5, 0x63, 0x8d, 0x54, 0x93, 0x23, 0x04,
0x6c, 0x4d, 0x25, 0x01, 0xd8, 0x13, 0xe2, 0x15, 0x3f, 0xd0, 0xe6, 0xa4, 0x98, 0x6e, 0x2b, 0x97,
0xbb, 0x88, 0x70, 0x0f, 0xa0, 0xb7, 0xf3, 0x1a, 0x45, 0x75, 0xcb, 0x7c, 0x11, 0x4d, 0xf1, 0xc2,
0xfd, 0x82, 0x2a, 0x7a, 0x7b, 0xc0, 0xe7, 0x18, 0x16, 0xac, 0xba, 0xd8, 0x37, 0xde, 0xb5, 0x12,
0x53, 0xaa, 0xd4, 0x5a, 0x89, 0x27, 0xdd, 0x54, 0x46, 0xb9, 0x01, 0x72, 0xcf, 0x60, 0xe9, 0xb3,
0xe9, 0x28, 0x0d, 0xb2, 0xe7, 0xdd, 0xd8, 0xb7, 0xe4, 0x47, 0x54, 0x85, 0x9a, 0xba, 0xd2, 0xa6,
0x4c, 0x3a, 0x9c, 0xb1, 0x31, 0xd6, 0xd4, 0x2f, 0xb6, 0x58, 0x44, 0xb8, 0x57, 0x60, 0x3d, 0x6b,
0x52, 0xcc, 0x9d, 0x52, 0xe7, 0xbf, 0x70, 0x44, 0x6a, 0x94, 0xfd, 0xda, 0x1c, 0x7b, 0x02, 0x2b,
0x49, 0x10, 0x9e, 0x8c, 0xb8, 0x59, 0x4f, 0x22, 0x67, 0xe2, 0xb2, 0xdd, 0x3d, 0xf9, 0x22, 0x9d,
0x57, 0xf6, 0x05, 0x32, 0x48, 0x79, 0x47, 0x33, 0x06, 0xc9, 0x4d, 0x49, 0xd9, 0x00, 0xbe, 0x0d,
0x8b, 0x76, 0x63, 0xec, 0x81, 0x4c, 0x06, 0xcf, 0x7a, 0x66, 0x9e, 0xca, 0xd8, 0x9c, 0x61, 0x51,
0xba, 0x3f, 0x73, 0xa0, 0xeb, 0x71, 0x64, 0x63, 0x6e, 0x34, 0x2a, 0xb9, 0xe7, 0x61, 0xa1, 0xda,
0xd9, 0x03, 0xd6, 0x49, 0xe6, 0x6a, 0xac, 0x1b, 0x33, 0x17, 0x65, 0xf7, 0x52, 0xc9, 0xa8, 0x1e,
0x35, 0x60, 0x4e, 0x8e, 0x6f, 0x1d, 0x2e, 0xcb, 0x2e, 0xa9, 0xee, 0x64, 0x21, 0x7d, 0xab, 0x51,
0x2b, 0xa4, 0xdf, 0x83, 0xae, 0x78, 0x35, 0xc1, 0x1c, 0x87, 0xf8, 0xf0, 0xce, 0x17, 0xd0, 0x32,
0xde, 0x8e, 0x60, 0xeb, 0xb0, 0xf2, 0xf2, 0xe9, 0xf3, 0xfd, 0x9d, 0xc3, 0xc3, 0xfe, 0xc1, 0x8b,
0x47, 0xdf, 0xd9, 0xf9, 0x7e, 0x7f, 0x77, 0xf3, 0x70, 0xb7, 0x73, 0x89, 0xad, 0x01, 0xdb, 0xdf,
0x39, 0x7c, 0xbe, 0xb3, 0x6d, 0xc1, 0x1d, 0x76, 0x0d, 0x7a, 0x2f, 0xf6, 0x5f, 0x1c, 0xee, 0x6c,
0xf7, 0xcb, 0xbe, 0xab, 0xb0, 0xf7, 0xe1, 0x8a, 0xc4, 0x97, 0x7c, 0x5e, 0xbd, 0xf3, 0x10, 0x3a,
0x79, 0x1f, 0xdf, 0x8a, 0x88, 0xbc, 0x29, 0x74, 0x72, 0xff, 0x67, 0x55, 0x58, 0x14, 0xe9, 0x5d,
0xe2, 0x85, 0x43, 0x1e, 0xb3, 0xcf, 0x60, 0x5e, 0x3e, 0x95, 0xc9, 0xd4, 0x62, 0xd8, 0x8f, 0x73,
0xf6, 0xd6, 0xf2, 0x60, 0x39, 0x83, 0x2b, 0x7f, 0xf5, 0x4f, 0xfe, 0xdb, 0xdf, 0xad, 0x2c, 0xb0,
0xd6, 0xdd, 0xb3, 0x8f, 0xef, 0x9e, 0xf0, 0x30, 0xc1, 0x3a, 0xfe, 0x00, 0x20, 0x7b, 0x00, 0x92,
0x75, 0xb5, 0x9f, 0x9b, 0x7b, 0x1d, 0xb3, 0x77, 0xa5, 0x04, 0x23, 0xeb, 0xbd, 0x42, 0xf5, 0xae,
0xb8, 0x8b, 0x58, 0x6f, 0x10, 0x06, 0xa9, 0x78, 0x0c, 0xf2, 0x53, 0xe7, 0x0e, 0x1b, 0x42, 0xdb,
0x7c, 0x9a, 0x91, 0xa9, 0x33, 0x8d, 0x92, 0xc7, 0x25, 0x7b, 0xef, 0x95, 0xe2, 0xd4, 0xea, 0x53,
0x1b, 0x97, 0xdd, 0x0e, 0xb6, 0x31, 0x25, 0x8a, 0xac, 0x95, 0x91, 0x90, 0x89, 0xec, 0x05, 0x46,
0x76, 0xd5, 0x60, 0xd3, 0xc2, 0xfb, 0x8f, 0xbd, 0xf7, 0x67, 0x60, 0x65, 0x5b, 0xef, 0x53, 0x5b,
0xeb, 0x2e, 0xc3, 0xb6, 0x06, 0x44, 0xa3, 0xde, 0x7f, 0xfc, 0xd4, 0xb9, 0x73, 0xff, 0x7f, 0xdc,
0x84, 0xa6, 0x3e, 0xeb, 0x64, 0x3f, 0x86, 0x05, 0x2b, 0xff, 0x8e, 0xa9, 0x61, 0x94, 0xa5, 0xeb,
0xf5, 0xae, 0x96, 0x23, 0x65, 0xc3, 0xd7, 0xa8, 0xe1, 0x2e, 0x5b, 0xc3, 0x86, 0x65, 0x02, 0xdb,
0x5d, 0xca, 0x24, 0x15, 0x17, 0xd1, 0x5e, 0x19, 0xb2, 0x2f, 0x1a, 0xbb, 0x9a, 0x17, 0x47, 0xab,
0xb5, 0xf7, 0x67, 0x60, 0x65, 0x73, 0x57, 0xa9, 0xb9, 0x35, 0xb6, 0x6a, 0x36, 0xa7, 0xcf, 0x20,
0x39, 0xdd, 0xbe, 0x34, 0x1f, 0x27, 0x64, 0xef, 0x6b, 0xc6, 0x2a, 0x7b, 0xb4, 0x50, 0xb3, 0x48,
0xf1, 0xe5, 0x42, 0xb7, 0x4b, 0x4d, 0x31, 0x46, 0xcb, 0x67, 0xbe, 0x4d, 0xc8, 0x8e, 0xa0, 0x65,
0x3c, 0x63, 0xc4, 0xae, 0xcc, 0x7c, 0x72, 0xa9, 0xd7, 0x2b, 0x43, 0x95, 0x0d, 0xc5, 0xac, 0xff,
0x2e, 0x6e, 0xea, 0x3f, 0x84, 0xa6, 0x7e, 0x18, 0x87, 0xad, 0x1b, 0x0f, 0x15, 0x99, 0x0f, 0xf9,
0xf4, 0xba, 0x45, 0x44, 0x19, 0xf3, 0x99, 0xb5, 0x23, 0xf3, 0xbd, 0x84, 0x96, 0xf1, 0xf8, 0x8d,
0x1e, 0x40, 0xf1, 0x81, 0x1d, 0x3d, 0x80, 0x92, 0xb7, 0x72, 0xdc, 0x65, 0x6a, 0xa2, 0xc5, 0x9a,
0xc4, 0xdf, 0xe9, 0xeb, 0x28, 0x61, 0x7b, 0x70, 0x59, 0xea, 0xb8, 0x23, 0xfe, 0x65, 0x96, 0xa1,
0xe4, 0x3d, 0xc8, 0x7b, 0x0e, 0x7b, 0x08, 0x0d, 0xf5, 0xc6, 0x11, 0x5b, 0x2b, 0x7f, 0xab, 0xa9,
0xb7, 0x5e, 0x80, 0x4b, 0xdb, 0xe6, 0xfb, 0x00, 0xd9, 0x4b, 0x3b, 0x5a, 0x49, 0x14, 0x5e, 0xee,
0xd1, 0x1c, 0x50, 0x7c, 0x96, 0xc7, 0x5d, 0xa3, 0x01, 0x76, 0x18, 0x29, 0x89, 0x90, 0x9f, 0xab,
0x8b, 0xd6, 0x3f, 0x82, 0x96, 0xf1, 0xd8, 0x8e, 0x9e, 0xbe, 0xe2, 0x43, 0x3d, 0x7a, 0xfa, 0x4a,
0xde, 0xe6, 0x71, 0x7b, 0x54, 0xfb, 0xaa, 0xbb, 0x84, 0xb5, 0x27, 0xc1, 0x49, 0x38, 0x16, 0x04,
0xb8, 0x40, 0xa7, 0xb0, 0x60, 0xbd, 0xa8, 0xa3, 0x25, 0xb4, 0xec, 0xbd, 0x1e, 0x2d, 0xa1, 0xa5,
0x8f, 0xf0, 0x28, 0x3e, 0x73, 0x97, 0xb1, 0x9d, 0x33, 0x22, 0x31, 0x5a, 0xfa, 0x01, 0xb4, 0x8c,
0xd7, 0x71, 0xf4, 0x58, 0x8a, 0x0f, 0xf1, 0xe8, 0xb1, 0x94, 0x3d, 0xa6, 0xb3, 0x4a, 0x6d, 0x2c,
0xba, 0xc4, 0x0a, 0x74, 0x65, 0x18, 0xeb, 0xfe, 0x31, 0x2c, 0xda, 0xef, 0xe5, 0x68, 0xd9, 0x2f,
0x7d, 0x79, 0x47, 0xcb, 0xfe, 0x8c, 0x47, 0x76, 0x24, 0x4b, 0xdf, 0x59, 0xd1, 0x8d, 0xdc, 0xfd,
0x5c, 0x66, 0x4a, 0x7d, 0xc1, 0xbe, 0x8b, 0x0a, 0x4e, 0xde, 0xe1, 0x66, 0xeb, 0x06, 0xd7, 0x9a,
0x37, 0xbd, 0xb5, 0xbc, 0x14, 0xae, 0x7b, 0xdb, 0xcc, 0x2c, 0x2e, 0x3d, 0xd3, 0xae, 0x45, 0x77,
0xb9, 0x8d, 0x5d, 0xcb, 0xbc, 0xee, 0x6d, 0xec, 0x5a, 0xd6, 0x95, 0xef, 0xfc, 0xae, 0x95, 0x06,
0x58, 0x47, 0x08, 0x4b, 0xb9, 0x3b, 0x02, 0x5a, 0x2a, 0xca, 0xaf, 0x71, 0xf5, 0xae, 0xbd, 0xf9,
0x6a, 0x81, 0xad, 0x41, 0x94, 0x12, 0xbc, 0xab, 0x2e, 0xcd, 0xfd, 0x45, 0x68, 0x9b, 0x6f, 0x7f,
0x30, 0x53, 0x94, 0xf3, 0x2d, 0xbd, 0x57, 0x8a, 0xb3, 0x17, 0x97, 0xb5, 0xcd, 0x66, 0xd8, 0xf7,
0x60, 0x4d, 0x8b, 0xba, 0x99, 0x76, 0x9e, 0xb0, 0x0f, 0x4a, 0x92, 0xd1, 0x4d, 0xcb, 0xa7, 0x77,
0x65, 0x66, 0xb6, 0xfa, 0x3d, 0x07, 0x99, 0xc6, 0x7e, 0x54, 0x21, 0xdb, 0x30, 0xca, 0xde, 0x92,
0xc8, 0x36, 0x8c, 0xd2, 0x97, 0x18, 0x14, 0xd3, 0xb0, 0x15, 0x6b, 0x8e, 0xc4, 0x21, 0x33, 0xfb,
0x01, 0x2c, 0x19, 0x17, 0x7b, 0x0e, 0x2f, 0xc2, 0x81, 0x16, 0x80, 0xe2, 0x9d, 0xd3, 0x5e, 0x99,
0x5d, 0xef, 0xae, 0x53, 0xfd, 0xcb, 0xae, 0x35, 0x39, 0xc8, 0xfc, 0x5b, 0xd0, 0x32, 0x2f, 0x0d,
0xbd, 0xa1, 0xde, 0x75, 0x03, 0x65, 0x5e, 0x99, 0xbc, 0xe7, 0xb0, 0x03, 0x91, 0x60, 0xa4, 0x1f,
0x69, 0x8c, 0xe2, 0xfc, 0xf6, 0x69, 0x3f, 0xde, 0xa8, 0x17, 0xb2, 0xec, 0xd9, 0xce, 0xdb, 0xce,
0x3d, 0x87, 0xfd, 0x03, 0x07, 0xda, 0xd6, 0xa5, 0x1e, 0x2b, 0x65, 0x23, 0xd7, 0xb3, 0xae, 0x89,
0x33, 0xbb, 0xe6, 0x7a, 0x34, 0xec, 0xbd, 0x3b, 0xdf, 0xb6, 0xa6, 0xf5, 0x73, 0x2b, 0x68, 0xb4,
0x91, 0x7f, 0xa9, 0xf1, 0x8b, 0x3c, 0x81, 0x79, 0xd3, 0xf7, 0x8b, 0x7b, 0x0e, 0xfb, 0xa5, 0x03,
0x8b, 0x76, 0xa8, 0x53, 0x0f, 0xb7, 0x34, 0xa8, 0xaa, 0x17, 0x7f, 0x46, 0x7c, 0xf4, 0x07, 0xd4,
0xcb, 0xe7, 0x77, 0x3c, 0xab, 0x97, 0xf2, 0x01, 0x8f, 0xdf, 0xac, 0xb7, 0xec, 0x53, 0xf1, 0xac,
0xb0, 0x3a, 0x90, 0x60, 0xc5, 0x07, 0x6e, 0x35, 0xc3, 0x98, 0x4f, 0xd2, 0xd2, 0x22, 0xfc, 0x48,
0xbc, 0x50, 0xa8, 0x62, 0xe6, 0xc8, 0x77, 0xef, 0xfa, 0xbd, 0x7b, 0x83, 0xc6, 0x74, 0xcd, 0xbd,
0x62, 0x8d, 0x29, 0xbf, 0xc3, 0x6f, 0x8a, 0xde, 0xc9, 0xd7, 0x64, 0xb3, 0x2d, 0xaa, 0xf0, 0xc2,
0xec, 0xec, 0x4e, 0x8e, 0x45, 0x27, 0x25, 0xb9, 0x25, 0x1c, 0xef, 0x58, 0x8d, 0x7b, 0x87, 0xfa,
0x7a, 0xc3, 0xfd, 0x60, 0x66, 0x5f, 0xef, 0x52, 0xc0, 0x12, 0x7b, 0x7c, 0x00, 0x90, 0x1d, 0x1e,
0xb2, 0xdc, 0xe1, 0x95, 0x56, 0x19, 0xc5, 0xf3, 0x45, 0x5b, 0x02, 0xd5, 0x19, 0x17, 0xd6, 0xf8,
0x43, 0xa1, 0x00, 0x9f, 0xaa, 0x63, 0x2f, 0xd3, 0xcc, 0xb1, 0x4f, 0xf9, 0x2c, 0x33, 0x27, 0x5f,
0xbf, 0xa5, 0xfe, 0xf4, 0x19, 0xda, 0x0b, 0x58, 0xd8, 0x8b, 0xa2, 0x57, 0xd3, 0x89, 0xce, 0xac,
0xb0, 0xcf, 0x12, 0x76, 0xfd, 0xe4, 0xb4, 0x97, 0x1b, 0x85, 0x7b, 0x9d, 0xaa, 0xea, 0xb1, 0xae,
0x51, 0xd5, 0xdd, 0xcf, 0xb3, 0xc3, 0xc9, 0x2f, 0x98, 0x0f, 0xcb, 0x5a, 0xab, 0xea, 0x8e, 0xf7,
0xec, 0x6a, 0x2c, 0x5d, 0x9a, 0x6f, 0xc2, 0xb2, 0xc7, 0x55, 0x6f, 0xef, 0x26, 0xaa, 0x4e, 0xd2,
0x29, 0xed, 0x6d, 0x3e, 0xa0, 0x2b, 0x0b, 0x14, 0x90, 0x5f, 0xc9, 0x3a, 0xae, 0x23, 0xf9, 0xbd,
0x05, 0x0b, 0x68, 0xef, 0x34, 0x13, 0xff, 0x22, 0xe6, 0x3f, 0xb9, 0xfb, 0xb9, 0x0c, 0xf5, 0x7f,
0xa1, 0x76, 0x1a, 0x75, 0x16, 0x62, 0xed, 0x34, 0xb9, 0xc3, 0x13, 0x6b, 0xa7, 0x29, 0x1c, 0x9e,
0x58, 0x53, 0xad, 0xce, 0x62, 0xd8, 0x08, 0x96, 0x0b, 0xe7, 0x2d, 0x7a, 0x93, 0x99, 0x75, 0x4a,
0xd3, 0xbb, 0x3e, 0x9b, 0xc0, 0x6e, 0xed, 0x8e, 0xdd, 0xda, 0x21, 0x2c, 0x6c, 0x73, 0x31, 0x59,
0x22, 0x75, 0x34, 0x77, 0x33, 0xcc, 0x4c, 0x4c, 0xcd, 0x6f, 0x09, 0x84, 0xb3, 0x4d, 0x09, 0xca,
0xdb, 0x64, 0x3f, 0x84, 0xd6, 0x13, 0x9e, 0xaa, 0x5c, 0x51, 0x6d, 0xcc, 0xe6, 0x92, 0x47, 0x7b,
0x25, 0xa9, 0xa6, 0x36, 0xcf, 0x50, 0x6d, 0x77, 0xf9, 0xf0, 0x84, 0x0b, 0xe5, 0xd4, 0x0f, 0x86,
0x5f, 0xb0, 0xbf, 0x40, 0x95, 0xeb, 0x44, 0xf9, 0x35, 0x23, 0xf9, 0xcf, 0xac, 0x7c, 0x29, 0x07,
0x2f, 0xab, 0x39, 0x8c, 0x86, 0xdc, 0x30, 0xaa, 0x42, 0x68, 0x19, 0x17, 0x4a, 0xb4, 0x00, 0x15,
0xef, 0x26, 0x69, 0x01, 0x2a, 0xb9, 0x7f, 0xe2, 0xde, 0xa6, 0x76, 0x5c, 0x76, 0x3d, 0x6b, 0x47,
0xdc, 0x39, 0xc9, 0x5a, 0xba, 0xfb, 0xb9, 0x3f, 0x4e, 0xbf, 0x60, 0x2f, 0xe9, 0x41, 0x1d, 0x33,
0x1f, 0x36, 0xb3, 0xce, 0xf3, 0xa9, 0xb3, 0x7a, 0xb2, 0x0c, 0x94, 0x6d, 0xb1, 0x8b, 0xa6, 0xc8,
0xf6, 0xfa, 0x16, 0xc0, 0x61, 0x1a, 0x4d, 0xb6, 0x7d, 0x3e, 0x8e, 0xc2, 0x4c, 0xd7, 0x66, 0xd9,
0x98, 0x99, 0xfe, 0x32, 0x52, 0x32, 0xd9, 0x4b, 0xc3, 0x9d, 0xb1, 0xd2, 0x89, 0x15, 0x73, 0xcd,
0x4c, 0xd8, 0xd4, 0x13, 0x52, 0x92, 0xb4, 0x79, 0xcf, 0x61, 0x9b, 0x00, 0xd9, 0x81, 0x9b, 0x76,
0x4e, 0x0a, 0x67, 0x79, 0x5a, 0xed, 0x95, 0x9c, 0xce, 0x1d, 0x40, 0x33, 0x3b, 0xc1, 0x59, 0xcf,
0xae, 0x6c, 0x59, 0xe7, 0x3d, 0x7a, 0x07, 0x2f, 0x9c, 0xab, 0xb8, 0x1d, 0x9a, 0x2a, 0x60, 0x0d,
0x9c, 0x2a, 0x3a, 0x2c, 0x09, 0x60, 0x45, 0x74, 0x50, 0x1b, 0x38, 0x94, 0x49, 0xa8, 0x46, 0x52,
0x72, 0xb6, 0xa1, 0xa5, 0xb9, 0x34, 0xe8, 0x6f, 0xc5, 0x58, 0x90, 0x5b, 0x45, 0x16, 0x23, 0xaa,
0xe6, 0x31, 0x2c, 0x17, 0xa2, 0xd2, 0x5a, 0xa4, 0x67, 0x1d, 0x14, 0x68, 0x91, 0x9e, 0x19, 0xd0,
0x76, 0x2f, 0x53, 0x93, 0x4b, 0x2e, 0x90, 0x4f, 0x75, 0x1e, 0xa4, 0x83, 0x53, 0x6c, 0xee, 0x17,
0x0e, 0xac, 0x94, 0x04, 0x9d, 0xd9, 0x87, 0xca, 0x3d, 0x9f, 0x19, 0x90, 0xee, 0x95, 0xc6, 0x24,
0xdd, 0x43, 0x6a, 0xe7, 0x33, 0xf6, 0x1d, 0x6b, 0x63, 0x13, 0xe1, 0x40, 0x29, 0x99, 0x6f, 0x34,
0x2a, 0x4a, 0x2d, 0x8a, 0x9f, 0xc0, 0xba, 0xe8, 0xc8, 0xe6, 0x68, 0x94, 0x8b, 0x97, 0x5e, 0x2b,
0xfc, 0x67, 0x11, 0x2b, 0x0e, 0xdc, 0x9b, 0xfd, 0x9f, 0x47, 0x66, 0x18, 0xc0, 0xa2, 0xab, 0x6c,
0x0a, 0x9d, 0x7c, 0x0c, 0x92, 0xcd, 0xae, 0xab, 0xf7, 0x81, 0xe5, 0x68, 0x16, 0xe3, 0x96, 0xee,
0xef, 0x50, 0x63, 0x1f, 0xb8, 0xbd, 0xb2, 0x79, 0x11, 0xbe, 0x27, 0xae, 0xc7, 0x5f, 0xd6, 0x01,
0xd3, 0xdc, 0x38, 0x55, 0x03, 0xb3, 0x22, 0xbc, 0xda, 0xd5, 0x2d, 0x8f, 0xb7, 0xde, 0xa4, 0xe6,
0xaf, 0xbb, 0xef, 0x95, 0x35, 0x1f, 0x8b, 0x4f, 0x84, 0xd3, 0xbb, 0x9e, 0x97, 0x6b, 0xd5, 0x83,
0xeb, 0x65, 0xeb, 0x3d, 0xd3, 0x7b, 0xc9, 0xcd, 0xf5, 0xa5, 0x7b, 0xce, 0xa3, 0x5b, 0x3f, 0xf8,
0x9d, 0x93, 0x20, 0x3d, 0x9d, 0x1e, 0x6d, 0x0c, 0xa2, 0xf1, 0xdd, 0x91, 0x0a, 0xba, 0xc9, 0xbc,
0xf7, 0xbb, 0xa3, 0x70, 0x78, 0x97, 0xbe, 0x3f, 0x9a, 0xa3, 0x7f, 0x54, 0xf4, 0x8d, 0xff, 0x1b,
0x00, 0x00, 0xff, 0xff, 0x8c, 0x9e, 0x6c, 0x70, 0xda, 0x68, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.

@ -888,8 +888,9 @@ message SendRequest {
uint64 outgoing_chan_id = 9;
/**
An optional maximum total time lock for the route. If zero, there is no
maximum enforced.
An optional maximum total time lock for the route. This should not exceed
lnd's `--max-cltv-expiry` setting. If zero, then the value of
`--max-cltv-expiry` is enforced.
*/
uint32 cltv_limit = 10;
@ -1741,6 +1742,13 @@ message QueryRoutesRequest {
A list of directed node pairs that will be ignored during path finding.
*/
repeated NodePair ignored_pairs = 10;
/**
An optional maximum total time lock for the route. If the source is empty or
ourselves, this should not exceed lnd's `--max-cltv-expiry` setting. If
zero, then the value of `--max-cltv-expiry` is used as the limit.
*/
uint32 cltv_limit = 11;
}
message NodePair {

@ -730,6 +730,14 @@
"required": false,
"type": "boolean",
"format": "boolean"
},
{
"name": "cltv_limit",
"description": "* \nAn optional maximum total time lock for the route. If the source is empty or\nourselves, this should not exceed lnd's `--max-cltv-expiry` setting. If\nzero, then the value of `--max-cltv-expiry` is used as the limit.",
"in": "query",
"required": false,
"type": "integer",
"format": "int64"
}
],
"tags": [
@ -3437,7 +3445,7 @@
"cltv_limit": {
"type": "integer",
"format": "int64",
"description": "* \nAn optional maximum total time lock for the route. If zero, there is no\nmaximum enforced."
"description": "* \nAn optional maximum total time lock for the route. This should not exceed\nlnd's `--max-cltv-expiry` setting. If zero, then the value of\n`--max-cltv-expiry` is enforced."
},
"dest_tlv": {
"type": "object",

@ -260,7 +260,7 @@ type RestrictParams struct {
// CltvLimit is the maximum time lock of the route excluding the final
// ctlv. After path finding is complete, the caller needs to increase
// all cltv expiry heights with the required final cltv delta.
CltvLimit *uint32
CltvLimit uint32
// DestPayloadTLV should be set to true if we need to drop off a TLV
// payload at the final hop in order to properly complete this payment
@ -495,8 +495,8 @@ func findPath(g *graphParams, r *RestrictParams, cfg *PathFindingConfig,
incomingCltv := toNodeDist.incomingCltv +
uint32(timeLockDelta)
// Check that we have cltv limit and that we are within it.
if r.CltvLimit != nil && incomingCltv > *r.CltvLimit {
// Check that we are within our CLTV limit.
if incomingCltv > r.CltvLimit {
return
}

@ -54,6 +54,7 @@ var (
noRestrictions = &RestrictParams{
FeeLimit: noFeeLimit,
ProbabilitySource: noProbabilitySource,
CltvLimit: math.MaxUint32,
}
testPathFindingConfig = &PathFindingConfig{}
@ -789,6 +790,7 @@ func testBasicGraphPathFindingCase(t *testing.T, graphInstance *testGraphInstanc
&RestrictParams{
FeeLimit: test.feeLimit,
ProbabilitySource: noProbabilitySource,
CltvLimit: math.MaxUint32,
},
testPathFindingConfig,
sourceNode.PubKeyBytes, target, paymentAmt,
@ -1916,6 +1918,7 @@ func TestRestrictOutgoingChannel(t *testing.T) {
FeeLimit: noFeeLimit,
OutgoingChannelID: &outgoingChannelID,
ProbabilitySource: noProbabilitySource,
CltvLimit: math.MaxUint32,
},
testPathFindingConfig,
sourceVertex, target, paymentAmt,
@ -1942,7 +1945,7 @@ func TestRestrictOutgoingChannel(t *testing.T) {
// TestCltvLimit asserts that a cltv limit is obeyed by the path finding
// algorithm.
func TestCltvLimit(t *testing.T) {
t.Run("no limit", func(t *testing.T) { testCltvLimit(t, 0, 1) })
t.Run("no limit", func(t *testing.T) { testCltvLimit(t, 2016, 1) })
t.Run("no path", func(t *testing.T) { testCltvLimit(t, 50, 0) })
t.Run("force high cost", func(t *testing.T) { testCltvLimit(t, 80, 3) })
}
@ -1998,19 +2001,13 @@ func testCltvLimit(t *testing.T, limit uint32, expectedChannel uint64) {
paymentAmt := lnwire.NewMSatFromSatoshis(100)
target := testGraphInstance.aliasMap["target"]
// Find the best path given the cltv limit.
var cltvLimit *uint32
if limit != 0 {
cltvLimit = &limit
}
path, err := findPath(
&graphParams{
graph: testGraphInstance.graph,
},
&RestrictParams{
FeeLimit: noFeeLimit,
CltvLimit: cltvLimit,
CltvLimit: limit,
ProbabilitySource: noProbabilitySource,
},
testPathFindingConfig,
@ -2195,6 +2192,7 @@ func testProbabilityRouting(t *testing.T, p10, p11, p20, minProbability float64,
&RestrictParams{
FeeLimit: noFeeLimit,
ProbabilitySource: probabilitySource,
CltvLimit: math.MaxUint32,
},
&PathFindingConfig{
PaymentAttemptPenalty: lnwire.NewMSatFromSatoshis(10),

@ -73,15 +73,10 @@ func (p *paymentSession) RequestRoute(payment *LightningPayment,
// does not reject the HTLC if some blocks are mined while it's in-flight.
finalCltvDelta += BlockPadding
// If a route cltv limit was specified, we need to subtract the final
// delta before passing it into path finding. The optimal path is
// independent of the final cltv delta and the path finding algorithm is
// unaware of this value.
var cltvLimit *uint32
if payment.CltvLimit != nil {
limit := *payment.CltvLimit - uint32(finalCltvDelta)
cltvLimit = &limit
}
// We need to subtract the final delta before passing it into path
// finding. The optimal path is independent of the final cltv delta and
// the path finding algorithm is unaware of this value.
cltvLimit := payment.CltvLimit - uint32(finalCltvDelta)
// TODO(roasbeef): sync logic amongst dist sys

@ -20,7 +20,7 @@ func TestRequestRoute(t *testing.T) {
// We expect find path to receive a cltv limit excluding the
// final cltv delta (including the block padding).
if *r.CltvLimit != 22-uint32(BlockPadding) {
if r.CltvLimit != 22-uint32(BlockPadding) {
t.Fatal("wrong cltv limit")
}
@ -58,7 +58,7 @@ func TestRequestRoute(t *testing.T) {
finalCltvDelta := uint16(8)
payment := &LightningPayment{
CltvLimit: &cltvLimit,
CltvLimit: cltvLimit,
FinalCLTVDelta: finalCltvDelta,
}

@ -1560,7 +1560,7 @@ type LightningPayment struct {
// CltvLimit is the maximum time lock that is allowed for attempts to
// complete this payment.
CltvLimit *uint32
CltvLimit uint32
// PaymentHash is the r-hash value to use within the HTLC extended to
// the first hop.

@ -4,6 +4,7 @@ import (
"bytes"
"fmt"
"image/color"
"math"
"math/rand"
"strings"
"sync/atomic"
@ -219,6 +220,7 @@ func TestFindRoutesWithFeeLimit(t *testing.T) {
restrictions := &RestrictParams{
FeeLimit: lnwire.NewMSatFromSatoshis(10),
ProbabilitySource: noProbabilitySource,
CltvLimit: math.MaxUint32,
}
route, err := ctx.router.FindRoute(

@ -501,10 +501,11 @@ func newRPCServer(s *server, macService *macaroons.Service,
return info.NodeKey1Bytes, info.NodeKey2Bytes, nil
},
FindRoute: s.chanRouter.FindRoute,
MissionControl: s.missionControl,
ActiveNetParams: activeNetParams.Params,
Tower: s.controlTower,
FindRoute: s.chanRouter.FindRoute,
MissionControl: s.missionControl,
ActiveNetParams: activeNetParams.Params,
Tower: s.controlTower,
MaxTotalTimelock: cfg.MaxOutgoingCltvExpiry,
}
var (
@ -2940,7 +2941,7 @@ func (r *rpcServer) unmarshallSendToRouteRequest(
type rpcPaymentIntent struct {
msat lnwire.MilliSatoshi
feeLimit lnwire.MilliSatoshi
cltvLimit *uint32
cltvLimit uint32
dest route.Vertex
rHash [32]byte
cltvDelta uint16
@ -2987,10 +2988,14 @@ func extractPaymentIntent(rpcPayReq *rpcPaymentRequest) (rpcPaymentIntent, error
payIntent.outgoingChannelID = &rpcPayReq.OutgoingChanId
}
// Take cltv limit from request if set.
if rpcPayReq.CltvLimit != 0 {
payIntent.cltvLimit = &rpcPayReq.CltvLimit
// Take the CLTV limit from the request if set, otherwise use the max.
cltvLimit, err := routerrpc.ValidateCLTVLimit(
rpcPayReq.CltvLimit, cfg.MaxOutgoingCltvExpiry,
)
if err != nil {
return payIntent, err
}
payIntent.cltvLimit = cltvLimit
if len(rpcPayReq.DestTlv) != 0 {
var err error