Merge pull request #348 from yyforyongyu/344-loop-quote

looprpc: add verbose resp in loop quote
pull/357/head
Carla Kirk-Cohen 3 years ago committed by GitHub
commit d6db6184f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -4,7 +4,6 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/btcsuite/btcutil"
"github.com/lightninglabs/loop" "github.com/lightninglabs/loop"
"github.com/lightninglabs/loop/labels" "github.com/lightninglabs/loop/labels"
"github.com/lightninglabs/loop/looprpc" "github.com/lightninglabs/loop/looprpc"
@ -61,6 +60,7 @@ var (
confTargetFlag, confTargetFlag,
lastHopFlag, lastHopFlag,
labelFlag, labelFlag,
verboseFlag,
}, },
Action: loopIn, Action: loopIn,
} }
@ -109,14 +109,12 @@ func loopIn(ctx *cli.Context) error {
return err return err
} }
quote, err := client.GetLoopInQuote( quoteReq := &looprpc.QuoteRequest{
context.Background(), Amt: int64(amt),
&looprpc.QuoteRequest{ ConfTarget: htlcConfTarget,
Amt: int64(amt), ExternalHtlc: external,
ConfTarget: htlcConfTarget, }
ExternalHtlc: external, quote, err := client.GetLoopInQuote(context.Background(), quoteReq)
},
)
if err != nil { if err != nil {
return err return err
} }
@ -136,9 +134,7 @@ func loopIn(ctx *cli.Context) error {
} }
limits := getInLimits(quote) limits := getInLimits(quote)
err = displayInLimits( err = displayInDetails(quoteReq, quote, ctx.Bool("verbose"))
amt, btcutil.Amount(quote.HtlcPublishFeeSat), limits, external,
)
if err != nil { if err != nil {
return err return err
} }

@ -74,6 +74,7 @@ var loopOutCommand = cli.Command{
"result in a lower swap fee.", "result in a lower swap fee.",
}, },
labelFlag, labelFlag,
verboseFlag,
}, },
Action: loopOut, Action: loopOut,
} }
@ -175,8 +176,8 @@ func loopOut(ctx *cli.Context) error {
ctx.Int64("max_swap_routing_fee"), ctx.Int64("max_swap_routing_fee"),
) )
} }
err = displayOutLimits( err = displayOutDetails(
amt, btcutil.Amount(quote.HtlcSweepFeeSat), limits, warning, limits, warning, quoteReq, quote, ctx.Bool("verbose"),
) )
if err != nil { if err != nil {
return err return err

@ -74,6 +74,27 @@ var (
Usage: "path to macaroon file", Usage: "path to macaroon file",
Value: loopd.DefaultMacaroonPath, Value: loopd.DefaultMacaroonPath,
} }
verboseFlag = cli.BoolFlag{
Name: "verbose, v",
Usage: "show expanded details",
}
)
const (
// satAmtFmt formats a satoshi value into a one line string, intended to
// prettify the terminal output. For Instance,
// fmt.Printf(f, "Estimated on-chain fee:", fee)
// prints out as,
// Estimated on-chain fee: 7262 sat
satAmtFmt = "%-36s %12d sat\n"
// blkFmt formats the number of blocks into a one line string, intended
// to prettify the terminal output. For Instance,
// fmt.Printf(f, "Conf target", target)
// prints out as,
// Conf target: 9 block
blkFmt = "%-36s %12d block\n"
) )
func printJSON(resp interface{}) { func printJSON(resp interface{}) {
@ -246,89 +267,56 @@ func getOutLimits(amt btcutil.Amount,
} }
} }
func displayInLimits(amt, minerFees btcutil.Amount, l *inLimits, func displayInDetails(req *looprpc.QuoteRequest,
externalHtlc bool) error { resp *looprpc.InQuoteResponse, verbose bool) error {
totalSuccessMax := l.maxMinerFee + l.maxSwapFee if req.ExternalHtlc {
if externalHtlc {
fmt.Printf("On-chain fee for external loop in is not " + fmt.Printf("On-chain fee for external loop in is not " +
"included.\nSufficient fees will need to be paid " + "included.\nSufficient fees will need to be paid " +
"when constructing the transaction in the external " + "when constructing the transaction in the external " +
"wallet.\n\n") "wallet.\n\n")
} }
fmt.Printf("Max swap fees for %d sat Loop %v: %d sat\n", amt, swap.TypeIn, printQuoteInResp(req, resp, verbose)
totalSuccessMax)
fmt.Printf("CONTINUE SWAP? (y/n), expand fee detail (x): ") fmt.Printf("\nCONTINUE SWAP? (y/n): ")
var answer string var answer string
fmt.Scanln(&answer) fmt.Scanln(&answer)
if answer == "y" {
switch answer {
case "y":
return nil return nil
case "x":
fmt.Println()
f := "%-36s %d sat\n"
if !externalHtlc {
fmt.Printf(f, "Estimated on-chain HTLC fee:",
minerFees)
}
fmt.Printf(f, "Max swap fee:", l.maxSwapFee)
fmt.Printf("CONTINUE SWAP? (y/n): ")
fmt.Scanln(&answer)
if answer == "y" {
return nil
}
} }
return errors.New("swap canceled") return errors.New("swap canceled")
} }
func displayOutLimits(amt, minerFees btcutil.Amount, l *outLimits, func displayOutDetails(l *outLimits, warning string, req *looprpc.QuoteRequest,
warning string) error { resp *looprpc.OutQuoteResponse, verbose bool) error {
totalSuccessMax := l.maxMinerFee + l.maxSwapFee + l.maxSwapRoutingFee + printQuoteOutResp(req, resp, verbose)
l.maxPrepayRoutingFee
fmt.Printf("Max swap fees for %d sat Loop %v: %d sat\n", amt, swap.TypeOut, // Display fee limits.
totalSuccessMax) if verbose {
fmt.Println()
fmt.Printf(satAmtFmt, "Max on-chain fee:", l.maxMinerFee)
fmt.Printf(satAmtFmt,
"Max off-chain swap routing fee:", l.maxSwapRoutingFee,
)
fmt.Printf(satAmtFmt, "Max off-chain prepay routing fee:",
l.maxPrepayRoutingFee)
}
// show warning
if warning != "" { if warning != "" {
fmt.Println(warning) fmt.Printf("\n%s\n\n", warning)
} }
fmt.Printf("CONTINUE SWAP? (y/n), expand fee detail (x): ") fmt.Printf("CONTINUE SWAP? (y/n): ")
var answer string var answer string
fmt.Scanln(&answer) fmt.Scanln(&answer)
if answer == "y" {
switch answer {
case "y":
return nil return nil
case "x":
fmt.Println()
f := "%-36s %d sat\n"
fmt.Printf(f, "Estimated on-chain sweep fee:", minerFees)
fmt.Printf(f, "Max on-chain sweep fee:", l.maxMinerFee)
fmt.Printf(f, "Max off-chain swap routing fee:",
l.maxSwapRoutingFee)
fmt.Printf(f, "Max no show penalty (prepay):", l.maxPrepayAmt)
fmt.Printf(f, "Max off-chain prepay routing fee:",
l.maxPrepayRoutingFee)
fmt.Printf(f, "Max swap fee:", l.maxSwapFee)
fmt.Printf("CONTINUE SWAP? (y/n): ")
fmt.Scanln(&answer)
if answer == "y" {
return nil
}
} }
return errors.New("swap canceled") return errors.New("swap canceled")

@ -22,7 +22,7 @@ var quoteInCommand = cli.Command{
Usage: "get a quote for the cost of a loop in swap", Usage: "get a quote for the cost of a loop in swap",
ArgsUsage: "amt", ArgsUsage: "amt",
Description: "Allows to determine the cost of a swap up front", Description: "Allows to determine the cost of a swap up front",
Flags: []cli.Flag{confTargetFlag}, Flags: []cli.Flag{confTargetFlag, verboseFlag},
Action: quoteIn, Action: quoteIn,
} }
@ -66,7 +66,7 @@ func quoteIn(ctx *cli.Context) error {
"amount.\n") "amount.\n")
} }
printRespJSON(quoteResp) printQuoteInResp(quoteReq, quoteResp, ctx.Bool("verbose"))
return nil return nil
} }
@ -93,6 +93,7 @@ var quoteOutCommand = cli.Command{
"setting this flag might result in a lower " + "setting this flag might result in a lower " +
"swap fee.", "swap fee.",
}, },
verboseFlag,
}, },
Action: quoteOut, Action: quoteOut,
} }
@ -132,6 +133,68 @@ func quoteOut(ctx *cli.Context) error {
return err return err
} }
printRespJSON(quoteResp) printQuoteOutResp(quoteReq, quoteResp, ctx.Bool("verbose"))
return nil return nil
} }
func printQuoteInResp(req *looprpc.QuoteRequest,
resp *looprpc.InQuoteResponse, verbose bool) {
totalFee := resp.HtlcPublishFeeSat + resp.SwapFeeSat
fmt.Printf(satAmtFmt, "Send on-chain:", req.Amt)
fmt.Printf(satAmtFmt, "Receive off-chain:", req.Amt-totalFee)
switch {
case req.ExternalHtlc && !verbose:
// If it's external then we don't know the miner fee hence the
// total cost.
fmt.Printf(satAmtFmt, "Loop service fee:", resp.SwapFeeSat)
case req.ExternalHtlc && verbose:
fmt.Printf(satAmtFmt, "Loop service fee:", resp.SwapFeeSat)
fmt.Println()
fmt.Printf(blkFmt, "CLTV expiry delta:", resp.CltvDelta)
case verbose:
fmt.Println()
fmt.Printf(
satAmtFmt, "Estimated on-chain fee:",
resp.HtlcPublishFeeSat,
)
fmt.Printf(satAmtFmt, "Loop service fee:", resp.SwapFeeSat)
fmt.Printf(satAmtFmt, "Estimated total fee:", totalFee)
fmt.Println()
fmt.Printf(blkFmt, "Conf target:", resp.ConfTarget)
fmt.Printf(blkFmt, "CLTV expiry delta:", resp.CltvDelta)
default:
fmt.Printf(satAmtFmt, "Estimated total fee:", totalFee)
}
}
func printQuoteOutResp(req *looprpc.QuoteRequest,
resp *looprpc.OutQuoteResponse, verbose bool) {
totalFee := resp.HtlcSweepFeeSat + resp.SwapFeeSat
fmt.Printf(satAmtFmt, "Send off-chain:", req.Amt)
fmt.Printf(satAmtFmt, "Receive on-chain:", req.Amt-totalFee)
if !verbose {
fmt.Printf(satAmtFmt, "Estimated total fee:", totalFee)
return
}
fmt.Println()
fmt.Printf(satAmtFmt, "Estimated on-chain fee:", resp.HtlcSweepFeeSat)
fmt.Printf(satAmtFmt, "Loop service fee:", resp.SwapFeeSat)
fmt.Printf(satAmtFmt, "Estimated total fee:", totalFee)
fmt.Println()
fmt.Printf(satAmtFmt, "No show penalty (prepay):", resp.PrepayAmtSat)
fmt.Printf(blkFmt, "Conf target:", resp.ConfTarget)
fmt.Printf(blkFmt, "CLTV expiry delta:", resp.CltvDelta)
fmt.Printf("%-38s %s\n",
"Publication deadline:",
time.Unix(int64(req.SwapPublicationDeadline), 0),
)
}

@ -433,6 +433,7 @@ func (s *swapClientServer) LoopOutQuote(ctx context.Context,
PrepayAmtSat: int64(quote.PrepayAmount), PrepayAmtSat: int64(quote.PrepayAmount),
SwapFeeSat: int64(quote.SwapFee), SwapFeeSat: int64(quote.SwapFee),
SwapPaymentDest: quote.SwapPaymentDest[:], SwapPaymentDest: quote.SwapPaymentDest[:],
ConfTarget: confTarget,
}, nil }, nil
} }
@ -478,6 +479,7 @@ func (s *swapClientServer) GetLoopInQuote(ctx context.Context,
return &looprpc.InQuoteResponse{ return &looprpc.InQuoteResponse{
HtlcPublishFeeSat: int64(quote.MinerFee), HtlcPublishFeeSat: int64(quote.MinerFee),
SwapFeeSat: int64(quote.SwapFee), SwapFeeSat: int64(quote.SwapFee),
ConfTarget: htlcConfTarget,
}, nil }, nil
} }

@ -1315,7 +1315,10 @@ type InQuoteResponse struct {
HtlcPublishFeeSat int64 `protobuf:"varint,3,opt,name=htlc_publish_fee_sat,json=htlcPublishFeeSat,proto3" json:"htlc_publish_fee_sat,omitempty"` HtlcPublishFeeSat int64 `protobuf:"varint,3,opt,name=htlc_publish_fee_sat,json=htlcPublishFeeSat,proto3" json:"htlc_publish_fee_sat,omitempty"`
// //
//On-chain cltv expiry delta //On-chain cltv expiry delta
CltvDelta int32 `protobuf:"varint,5,opt,name=cltv_delta,json=cltvDelta,proto3" json:"cltv_delta,omitempty"` CltvDelta int32 `protobuf:"varint,5,opt,name=cltv_delta,json=cltvDelta,proto3" json:"cltv_delta,omitempty"`
//
//The confirmation target to be used to publish the on-chain HTLC.
ConfTarget int32 `protobuf:"varint,6,opt,name=conf_target,json=confTarget,proto3" json:"conf_target,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -1367,6 +1370,13 @@ func (m *InQuoteResponse) GetCltvDelta() int32 {
return 0 return 0
} }
func (m *InQuoteResponse) GetConfTarget() int32 {
if m != nil {
return m.ConfTarget
}
return 0
}
type OutQuoteResponse struct { type OutQuoteResponse struct {
// //
//The fee that the swap server is charging for the swap. //The fee that the swap server is charging for the swap.
@ -1384,7 +1394,10 @@ type OutQuoteResponse struct {
SwapPaymentDest []byte `protobuf:"bytes,4,opt,name=swap_payment_dest,json=swapPaymentDest,proto3" json:"swap_payment_dest,omitempty"` SwapPaymentDest []byte `protobuf:"bytes,4,opt,name=swap_payment_dest,json=swapPaymentDest,proto3" json:"swap_payment_dest,omitempty"`
// //
//On-chain cltv expiry delta //On-chain cltv expiry delta
CltvDelta int32 `protobuf:"varint,5,opt,name=cltv_delta,json=cltvDelta,proto3" json:"cltv_delta,omitempty"` CltvDelta int32 `protobuf:"varint,5,opt,name=cltv_delta,json=cltvDelta,proto3" json:"cltv_delta,omitempty"`
//
//The confirmation target to be used for the sweep of the on-chain HTLC.
ConfTarget int32 `protobuf:"varint,6,opt,name=conf_target,json=confTarget,proto3" json:"conf_target,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -1450,6 +1463,13 @@ func (m *OutQuoteResponse) GetCltvDelta() int32 {
return 0 return 0
} }
func (m *OutQuoteResponse) GetConfTarget() int32 {
if m != nil {
return m.ConfTarget
}
return 0
}
type TokensRequest struct { type TokensRequest struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
@ -2227,173 +2247,173 @@ func init() {
func init() { proto.RegisterFile("client.proto", fileDescriptor_014de31d7ac8c57c) } func init() { proto.RegisterFile("client.proto", fileDescriptor_014de31d7ac8c57c) }
var fileDescriptor_014de31d7ac8c57c = []byte{ var fileDescriptor_014de31d7ac8c57c = []byte{
// 2647 bytes of a gzipped FileDescriptorProto // 2653 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x59, 0x4f, 0x73, 0xe3, 0xc6, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x59, 0xcd, 0x6e, 0x23, 0xc7,
0xb1, 0x5f, 0xfe, 0x13, 0xc9, 0x26, 0x48, 0x42, 0xa3, 0x5d, 0x89, 0xa2, 0x65, 0xaf, 0x16, 0xf6, 0x11, 0x5e, 0xfe, 0x93, 0xc5, 0x21, 0x39, 0x6a, 0xed, 0x4a, 0x14, 0x2d, 0x7b, 0xb5, 0x63, 0x6f,
0x3e, 0xcb, 0xb2, 0xbd, 0x7a, 0x96, 0x4f, 0x76, 0xd9, 0xaf, 0x8a, 0xa2, 0xa0, 0x15, 0xd7, 0x12, 0x2c, 0xcb, 0xf6, 0x2a, 0x96, 0x4f, 0x36, 0xec, 0x00, 0x5c, 0x6a, 0xb4, 0xe2, 0x5a, 0x22, 0xe9,
0x49, 0x83, 0xd4, 0xba, 0xf6, 0xd5, 0xab, 0x42, 0x8d, 0xc8, 0xa1, 0x84, 0x32, 0xf1, 0x67, 0x81, 0x21, 0xb5, 0xc6, 0x06, 0x01, 0x06, 0x2d, 0xb2, 0x25, 0x0d, 0xcc, 0xf9, 0xd9, 0x99, 0xe6, 0xae,
0xe1, 0xae, 0x54, 0xae, 0x97, 0x54, 0xa5, 0xca, 0xe7, 0x1c, 0xf2, 0x0d, 0x72, 0xc8, 0x2d, 0xb7, 0x04, 0x23, 0x09, 0x10, 0xc0, 0x4f, 0x90, 0x37, 0xc8, 0x21, 0xb7, 0x00, 0x39, 0xe4, 0x96, 0x57,
0xdc, 0xf2, 0x15, 0x72, 0x4a, 0x72, 0xcb, 0x25, 0x87, 0x5c, 0x72, 0xc8, 0x77, 0x48, 0x4d, 0x0f, 0xc8, 0x2d, 0xb9, 0xe5, 0x92, 0x43, 0x2e, 0x39, 0xe4, 0x94, 0x17, 0x08, 0xba, 0x7a, 0x66, 0x38,
0x00, 0x02, 0x14, 0x29, 0x27, 0x87, 0xdc, 0xc4, 0xee, 0xdf, 0x74, 0x4f, 0xff, 0x9d, 0x6e, 0x08, 0x43, 0x91, 0x72, 0x82, 0x20, 0x37, 0xb1, 0xea, 0xeb, 0xaa, 0xae, 0xdf, 0xae, 0x1a, 0x81, 0x32,
0x94, 0xd1, 0xd4, 0x62, 0x0e, 0x7f, 0xe6, 0xf9, 0x2e, 0x77, 0x49, 0x71, 0xea, 0xba, 0x9e, 0xef, 0x9e, 0x5a, 0xcc, 0xe1, 0x4f, 0x3c, 0xdf, 0xe5, 0x2e, 0x29, 0x4d, 0x5d, 0xd7, 0xf3, 0xbd, 0x71,
0x8d, 0x9a, 0x3b, 0x57, 0xae, 0x7b, 0x35, 0x65, 0x07, 0xd4, 0xb3, 0x0e, 0xa8, 0xe3, 0xb8, 0x9c, 0x6b, 0xfb, 0xd2, 0x75, 0x2f, 0xa7, 0x6c, 0x9f, 0x7a, 0xd6, 0x3e, 0x75, 0x1c, 0x97, 0x53, 0x6e,
0x72, 0xcb, 0x75, 0x02, 0x09, 0xd3, 0x7e, 0x9b, 0x87, 0xda, 0x99, 0xeb, 0x7a, 0xbd, 0x19, 0x37, 0xb9, 0x4e, 0x20, 0x61, 0xda, 0xef, 0xf2, 0x50, 0x3f, 0x71, 0x5d, 0xaf, 0x3f, 0xe3, 0x06, 0x7b,
0xd8, 0xeb, 0x19, 0x0b, 0x38, 0x51, 0x21, 0x47, 0x6d, 0xde, 0xc8, 0xec, 0x66, 0xf6, 0x72, 0x86, 0x35, 0x63, 0x01, 0x27, 0x2a, 0xe4, 0xa8, 0xcd, 0x9b, 0x99, 0x9d, 0xcc, 0x6e, 0xce, 0x10, 0x7f,
0xf8, 0x93, 0x10, 0xc8, 0x8f, 0x59, 0xc0, 0x1b, 0xd9, 0xdd, 0xcc, 0x5e, 0xd9, 0xc0, 0xbf, 0xc9, 0x12, 0x02, 0xf9, 0x09, 0x0b, 0x78, 0x33, 0xbb, 0x93, 0xd9, 0xad, 0x18, 0xf8, 0x37, 0xd9, 0x87,
0x01, 0x3c, 0xb4, 0xe9, 0x8d, 0x19, 0xbc, 0xa5, 0x9e, 0xe9, 0xbb, 0x33, 0x6e, 0x39, 0x57, 0xe6, 0xfb, 0x36, 0xbd, 0x36, 0x83, 0x37, 0xd4, 0x33, 0x7d, 0x77, 0xc6, 0x2d, 0xe7, 0xd2, 0xbc, 0x60,
0x84, 0xb1, 0x46, 0x0e, 0x8f, 0xad, 0xdb, 0xf4, 0x66, 0xf0, 0x96, 0x7a, 0x86, 0xe4, 0x9c, 0x30, 0xac, 0x99, 0xc3, 0x63, 0x6b, 0x36, 0xbd, 0x1e, 0xbe, 0xa1, 0x9e, 0x21, 0x39, 0x47, 0x8c, 0x91,
0x46, 0x3e, 0x87, 0x4d, 0x71, 0xc0, 0xf3, 0x99, 0x47, 0x6f, 0x53, 0x47, 0xf2, 0x78, 0x64, 0xc3, 0x4f, 0x61, 0x43, 0x1c, 0xf0, 0x7c, 0xe6, 0xd1, 0x9b, 0xd4, 0x91, 0x3c, 0x1e, 0x59, 0xb7, 0xe9,
0xa6, 0x37, 0x7d, 0x64, 0x26, 0x0e, 0xed, 0x82, 0x12, 0x6b, 0x11, 0xd0, 0x02, 0x42, 0x21, 0x94, 0xf5, 0x00, 0x99, 0x89, 0x43, 0x3b, 0xa0, 0xc4, 0x5a, 0x04, 0xb4, 0x80, 0x50, 0x08, 0xa5, 0x0b,
0x2e, 0x10, 0x1f, 0x40, 0x2d, 0x21, 0x56, 0x5c, 0x7c, 0x0d, 0x31, 0x4a, 0x2c, 0xae, 0x65, 0x73, 0xc4, 0x7b, 0x50, 0x4f, 0x88, 0x15, 0x17, 0x2f, 0x22, 0x46, 0x89, 0xc5, 0xb5, 0x6d, 0x4e, 0x34,
0xa2, 0x41, 0x55, 0xa0, 0x6c, 0xcb, 0x61, 0x3e, 0x0a, 0x2a, 0x22, 0xa8, 0x62, 0xd3, 0x9b, 0x73, 0xa8, 0x09, 0x94, 0x6d, 0x39, 0xcc, 0x47, 0x41, 0x25, 0x04, 0x55, 0x6d, 0x7a, 0x7d, 0x2a, 0x68,
0x41, 0x13, 0x92, 0x3e, 0x01, 0x55, 0xf8, 0xcc, 0x74, 0x67, 0xdc, 0x1c, 0x5d, 0x53, 0xc7, 0x61, 0x42, 0xd2, 0x47, 0xa0, 0x0a, 0x9f, 0x99, 0xee, 0x8c, 0x9b, 0xe3, 0x2b, 0xea, 0x38, 0x6c, 0xda,
0xd3, 0x46, 0x69, 0x37, 0xb3, 0x97, 0x3f, 0xca, 0x36, 0x32, 0x46, 0x6d, 0x2a, 0xbd, 0xd4, 0x96, 0x2c, 0xef, 0x64, 0x76, 0xf3, 0x4f, 0xb3, 0xcd, 0x8c, 0x51, 0x9f, 0x4a, 0x2f, 0x75, 0x24, 0x87,
0x1c, 0xb2, 0x0f, 0xeb, 0xee, 0x8c, 0x5f, 0xb9, 0xc2, 0x08, 0x81, 0x36, 0x03, 0xc6, 0x1b, 0x95, 0xec, 0xc1, 0x9a, 0x3b, 0xe3, 0x97, 0xae, 0x30, 0x42, 0xa0, 0xcd, 0x80, 0xf1, 0x66, 0x75, 0x27,
0xdd, 0xdc, 0x5e, 0xde, 0xa8, 0x47, 0x0c, 0x81, 0x1d, 0x30, 0x2e, 0xb0, 0xc1, 0x5b, 0xc6, 0x3c, 0xb7, 0x9b, 0x37, 0x1a, 0x11, 0x43, 0x60, 0x87, 0x8c, 0x0b, 0x6c, 0xf0, 0x86, 0x31, 0xcf, 0x1c,
0x73, 0xe4, 0x3a, 0x13, 0x93, 0x53, 0xff, 0x8a, 0xf1, 0x46, 0x79, 0x37, 0xb3, 0x57, 0x30, 0xea, 0xbb, 0xce, 0x85, 0xc9, 0xa9, 0x7f, 0xc9, 0x78, 0xb3, 0xb2, 0x93, 0xd9, 0x2d, 0x18, 0x0d, 0x64,
0xc8, 0x68, 0xbb, 0xce, 0x64, 0x88, 0x64, 0xf2, 0x29, 0x90, 0x6b, 0x3e, 0x1d, 0x21, 0xd4, 0xf2, 0x74, 0x5c, 0xe7, 0x62, 0x84, 0x64, 0xf2, 0x31, 0x90, 0x2b, 0x3e, 0x1d, 0x23, 0xd4, 0xf2, 0x6d,
0x6d, 0x19, 0xac, 0x46, 0x15, 0xc1, 0xeb, 0x82, 0xd3, 0x4e, 0x32, 0xc8, 0x97, 0xb0, 0x8d, 0xce, 0x19, 0xac, 0x66, 0x0d, 0xc1, 0x6b, 0x82, 0xd3, 0x49, 0x32, 0xc8, 0xe7, 0xb0, 0x85, 0xce, 0xf1,
0xf1, 0x66, 0x97, 0x53, 0x6b, 0x84, 0x44, 0x73, 0xcc, 0xe8, 0x78, 0x6a, 0x39, 0xac, 0x01, 0xe2, 0x66, 0xe7, 0x53, 0x6b, 0x8c, 0x44, 0x73, 0xc2, 0xe8, 0x64, 0x6a, 0x39, 0xac, 0x09, 0xe2, 0xf6,
0xf6, 0xc6, 0x96, 0x00, 0xf4, 0xe7, 0xfc, 0xe3, 0x90, 0x4d, 0x1e, 0x42, 0x61, 0x4a, 0x2f, 0xd9, 0xc6, 0xa6, 0x00, 0x0c, 0xe6, 0xfc, 0xc3, 0x90, 0x4d, 0xee, 0x43, 0x61, 0x4a, 0xcf, 0xd9, 0xb4,
0xb4, 0xa1, 0x60, 0x5c, 0xe5, 0x0f, 0xb2, 0x03, 0x65, 0xcb, 0xb1, 0xb8, 0x45, 0xb9, 0xeb, 0x37, 0xa9, 0x60, 0x5c, 0xe5, 0x0f, 0xb2, 0x0d, 0x15, 0xcb, 0xb1, 0xb8, 0x45, 0xb9, 0xeb, 0x37, 0xeb,
0x6a, 0xc8, 0x99, 0x13, 0xb4, 0x1f, 0xb3, 0x50, 0x15, 0xf9, 0xd2, 0x71, 0x56, 0xa7, 0xcb, 0x62, 0xc8, 0x99, 0x13, 0xb4, 0xef, 0xb3, 0x50, 0x13, 0xf9, 0xd2, 0x75, 0x56, 0xa7, 0xcb, 0x62, 0xd0,
0xd0, 0xb2, 0x77, 0x82, 0x76, 0x27, 0x1c, 0xb9, 0xbb, 0xe1, 0xd8, 0x86, 0xd2, 0x94, 0x06, 0xdc, 0xb2, 0xb7, 0x82, 0x76, 0x2b, 0x1c, 0xb9, 0xdb, 0xe1, 0xd8, 0x82, 0xf2, 0x94, 0x06, 0xdc, 0xbc,
0xbc, 0x76, 0x3d, 0xcc, 0x10, 0xc5, 0x28, 0x8a, 0xdf, 0xa7, 0xae, 0x47, 0xde, 0x87, 0x2a, 0xbb, 0x72, 0x3d, 0xcc, 0x10, 0xc5, 0x28, 0x89, 0xdf, 0xc7, 0xae, 0x47, 0xde, 0x85, 0x1a, 0xbb, 0xe6,
0xe1, 0xcc, 0x77, 0xe8, 0xd4, 0x14, 0x2e, 0xc1, 0xb4, 0x28, 0x19, 0x4a, 0x44, 0x3c, 0xe5, 0xd3, 0xcc, 0x77, 0xe8, 0xd4, 0x14, 0x2e, 0xc1, 0xb4, 0x28, 0x1b, 0x4a, 0x44, 0x3c, 0xe6, 0xd3, 0x31,
0x11, 0xd9, 0x03, 0x35, 0x76, 0x64, 0xe4, 0xf3, 0x35, 0x74, 0x63, 0x2d, 0x72, 0x63, 0xe8, 0xf2, 0xd9, 0x05, 0x35, 0x76, 0x64, 0xe4, 0xf3, 0x22, 0xba, 0xb1, 0x1e, 0xb9, 0x31, 0x74, 0x79, 0xec,
0xd8, 0x0f, 0xc5, 0x95, 0x7e, 0x28, 0x2d, 0xfa, 0xe1, 0xef, 0x19, 0x50, 0x30, 0xc1, 0x59, 0xe0, 0x87, 0xd2, 0x4a, 0x3f, 0x94, 0x17, 0xfd, 0xf0, 0x8f, 0x0c, 0x28, 0x98, 0xe0, 0x2c, 0xf0, 0x5c,
0xb9, 0x4e, 0xc0, 0x08, 0x81, 0xac, 0x35, 0x46, 0x2f, 0x94, 0x31, 0x5f, 0xb2, 0xd6, 0x58, 0x98, 0x27, 0x60, 0x84, 0x40, 0xd6, 0x9a, 0xa0, 0x17, 0x2a, 0x98, 0x2f, 0x59, 0x6b, 0x22, 0x4c, 0xb0,
0x60, 0x8d, 0xcd, 0xcb, 0x5b, 0xce, 0x02, 0xb4, 0x50, 0x31, 0x8a, 0xd6, 0xf8, 0x48, 0xfc, 0x24, 0x26, 0xe6, 0xf9, 0x0d, 0x67, 0x01, 0x5a, 0xa8, 0x18, 0x25, 0x6b, 0xf2, 0x54, 0xfc, 0x24, 0x8f,
0x4f, 0x41, 0xc1, 0xdb, 0xd1, 0xf1, 0xd8, 0x67, 0x41, 0x20, 0x4b, 0x0b, 0x0f, 0x56, 0x04, 0xbd, 0x41, 0xc1, 0xdb, 0xd1, 0xc9, 0xc4, 0x67, 0x41, 0x20, 0x4b, 0x0b, 0x0f, 0x56, 0x05, 0xbd, 0x2d,
0x25, 0xc9, 0xe4, 0x19, 0x6c, 0x24, 0x61, 0xa6, 0xe3, 0x1d, 0xbe, 0x0d, 0xae, 0xd1, 0x1f, 0x65, 0xc9, 0xe4, 0x09, 0xac, 0x27, 0x61, 0xa6, 0xe3, 0x1d, 0xbc, 0x09, 0xae, 0xd0, 0x1f, 0x15, 0x99,
0x99, 0x0e, 0x21, 0xb2, 0x8b, 0x0c, 0xf2, 0x49, 0x98, 0x3d, 0x11, 0x5e, 0xc2, 0x0b, 0x08, 0x57, 0x0e, 0x21, 0xb2, 0x87, 0x0c, 0xf2, 0x51, 0x98, 0x3d, 0x11, 0x5e, 0xc2, 0x0b, 0x08, 0x57, 0x13,
0x13, 0xf0, 0x3e, 0xa2, 0x9f, 0x42, 0x2d, 0x60, 0xfe, 0x1b, 0xe6, 0x9b, 0x36, 0x0b, 0x02, 0x7a, 0xf0, 0x01, 0xa2, 0x1f, 0x43, 0x3d, 0x60, 0xfe, 0x6b, 0xe6, 0x9b, 0x36, 0x0b, 0x02, 0x7a, 0xc9,
0xc5, 0xd0, 0x41, 0x65, 0xa3, 0x2a, 0xa9, 0xe7, 0x92, 0xa8, 0xa9, 0x50, 0x3b, 0x77, 0x1d, 0x8b, 0xd0, 0x41, 0x15, 0xa3, 0x26, 0xa9, 0xa7, 0x92, 0xa8, 0xa9, 0x50, 0x3f, 0x75, 0x1d, 0x8b, 0xbb,
0xbb, 0x7e, 0x18, 0x73, 0xed, 0x77, 0x79, 0x00, 0x61, 0xfd, 0x80, 0x53, 0x3e, 0x0b, 0x96, 0x76, 0x7e, 0x18, 0x73, 0xed, 0x0f, 0x79, 0x00, 0x61, 0xfd, 0x90, 0x53, 0x3e, 0x0b, 0x96, 0x76, 0x0c,
0x0c, 0xe1, 0x8d, 0xec, 0x4a, 0x6f, 0x54, 0x16, 0xbd, 0x91, 0xe7, 0xb7, 0x9e, 0x4c, 0x83, 0xda, 0xe1, 0x8d, 0xec, 0x4a, 0x6f, 0x54, 0x17, 0xbd, 0x91, 0xe7, 0x37, 0x9e, 0x4c, 0x83, 0xfa, 0xc1,
0xe1, 0xfa, 0xb3, 0xb0, 0x77, 0x3d, 0x13, 0x3a, 0x86, 0xb7, 0x1e, 0x33, 0x90, 0x4d, 0xf6, 0xa0, 0xda, 0x93, 0xb0, 0x77, 0x3d, 0x11, 0x3a, 0x46, 0x37, 0x1e, 0x33, 0x90, 0x4d, 0x76, 0xa1, 0x10,
0x10, 0x70, 0xca, 0x65, 0xc7, 0xa8, 0x1d, 0x92, 0x14, 0x4e, 0xdc, 0x85, 0x19, 0x12, 0x40, 0xbe, 0x70, 0xca, 0x65, 0xc7, 0xa8, 0x1f, 0x90, 0x14, 0x4e, 0xdc, 0x85, 0x19, 0x12, 0x40, 0xbe, 0x84,
0x86, 0xda, 0x84, 0x5a, 0xd3, 0x99, 0xcf, 0x4c, 0x9f, 0xd1, 0xc0, 0x75, 0x30, 0x93, 0x6b, 0x87, 0xfa, 0x05, 0xb5, 0xa6, 0x33, 0x9f, 0x99, 0x3e, 0xa3, 0x81, 0xeb, 0x60, 0x26, 0xd7, 0x0f, 0x36,
0x9b, 0xf1, 0x91, 0x13, 0xc9, 0x36, 0x90, 0x6b, 0x54, 0x27, 0xc9, 0x9f, 0xe4, 0x43, 0xa8, 0x87, 0xe2, 0x23, 0x47, 0x92, 0x6d, 0x20, 0xd7, 0xa8, 0x5d, 0x24, 0x7f, 0x92, 0xf7, 0xa1, 0x11, 0x86,
0xa1, 0x16, 0xf5, 0xc4, 0x2d, 0x3b, 0xea, 0x3c, 0xb5, 0x39, 0x79, 0x68, 0xd9, 0xe2, 0x46, 0x2a, 0x5a, 0xd4, 0x13, 0xb7, 0xec, 0xa8, 0xf3, 0xd4, 0xe7, 0xe4, 0x91, 0x65, 0x8b, 0x1b, 0xa9, 0x98,
0x26, 0xe9, 0xcc, 0x1b, 0x53, 0xce, 0x24, 0x52, 0xf6, 0x9f, 0x9a, 0xa0, 0x5f, 0x20, 0x19, 0x91, 0xa4, 0x33, 0x6f, 0x42, 0x39, 0x93, 0x48, 0xd9, 0x7f, 0xea, 0x82, 0x7e, 0x86, 0x64, 0x44, 0x2e,
0x8b, 0x01, 0x2f, 0x2e, 0x0f, 0xf8, 0xf2, 0x00, 0x2a, 0x2b, 0x02, 0xb8, 0x22, 0x3d, 0xaa, 0xab, 0x06, 0xbc, 0xb4, 0x3c, 0xe0, 0xcb, 0x03, 0xa8, 0xac, 0x08, 0xe0, 0x8a, 0xf4, 0xa8, 0xad, 0x4a,
0xd2, 0xe3, 0x31, 0x54, 0x46, 0x6e, 0xc0, 0x4d, 0x19, 0x5f, 0xcc, 0xea, 0x9c, 0x01, 0x82, 0x34, 0x8f, 0x87, 0x50, 0x1d, 0xbb, 0x01, 0x37, 0x65, 0x7c, 0x31, 0xab, 0x73, 0x06, 0x08, 0xd2, 0x10,
0x40, 0x0a, 0x79, 0x02, 0x0a, 0x02, 0x5c, 0x67, 0x74, 0x4d, 0x2d, 0x07, 0x9b, 0x54, 0xce, 0xc0, 0x29, 0xe4, 0x11, 0x28, 0x08, 0x70, 0x9d, 0xf1, 0x15, 0xb5, 0x1c, 0x6c, 0x52, 0x39, 0x03, 0x0f,
0x43, 0x3d, 0x49, 0x12, 0xc5, 0x27, 0x21, 0x93, 0x89, 0xc4, 0x80, 0xec, 0xb7, 0x88, 0x09, 0x69, 0xf5, 0x25, 0x49, 0x14, 0x9f, 0x84, 0x5c, 0x5c, 0x48, 0x0c, 0xc8, 0x7e, 0x8b, 0x98, 0x90, 0x36,
0xf3, 0x92, 0xaa, 0x27, 0x4a, 0x4a, 0x23, 0xa0, 0x9e, 0x59, 0x01, 0x17, 0xd1, 0x0a, 0xa2, 0x54, 0x2f, 0xa9, 0x46, 0xa2, 0xa4, 0x34, 0x02, 0xea, 0x89, 0x15, 0x70, 0x11, 0xad, 0x20, 0x4a, 0xa5,
0xfa, 0x1f, 0x58, 0x4f, 0xd0, 0xc2, 0x62, 0xfa, 0x08, 0x0a, 0xa2, 0x7b, 0x04, 0x8d, 0xcc, 0x6e, 0x9f, 0xc0, 0x5a, 0x82, 0x16, 0x16, 0xd3, 0x07, 0x50, 0x10, 0xdd, 0x23, 0x68, 0x66, 0x76, 0x72,
0x6e, 0xaf, 0x72, 0xb8, 0x71, 0x27, 0xd0, 0xb3, 0xc0, 0x90, 0x08, 0xed, 0x09, 0xd4, 0x05, 0xb1, 0xbb, 0xd5, 0x83, 0xf5, 0x5b, 0x81, 0x9e, 0x05, 0x86, 0x44, 0x68, 0x8f, 0xa0, 0x21, 0x88, 0x5d,
0xe3, 0x4c, 0xdc, 0xa8, 0x23, 0xd5, 0xe2, 0x52, 0x54, 0x44, 0xe2, 0x69, 0x35, 0x50, 0x86, 0xcc, 0xe7, 0xc2, 0x8d, 0x3a, 0x52, 0x3d, 0x2e, 0x45, 0x45, 0x24, 0x9e, 0x56, 0x07, 0x65, 0xc4, 0x7c,
0xb7, 0x63, 0x95, 0x3f, 0x87, 0x7a, 0xc7, 0x09, 0x29, 0xa1, 0xc2, 0xff, 0x82, 0xba, 0x6d, 0x39, 0x3b, 0x56, 0xf9, 0x4b, 0x68, 0x74, 0x9d, 0x90, 0x12, 0x2a, 0xfc, 0x11, 0x34, 0x6c, 0xcb, 0x91,
0xb2, 0x65, 0x51, 0xdb, 0x9d, 0x39, 0x3c, 0x0c, 0x78, 0xd5, 0xb6, 0x1c, 0x21, 0xbf, 0x85, 0x44, 0x2d, 0x8b, 0xda, 0xee, 0xcc, 0xe1, 0x61, 0xc0, 0x6b, 0xb6, 0xe5, 0x08, 0xf9, 0x6d, 0x24, 0x22,
0xc4, 0x45, 0xad, 0x2d, 0xc4, 0xad, 0x85, 0x38, 0xd9, 0xdd, 0x24, 0xee, 0x45, 0xbe, 0x94, 0x51, 0x2e, 0x6a, 0x6d, 0x21, 0xae, 0x18, 0xe2, 0x64, 0x77, 0x93, 0xb8, 0xe7, 0xf9, 0x72, 0x46, 0xcd,
0xb3, 0x2f, 0xf2, 0xa5, 0xac, 0x9a, 0x7b, 0x91, 0x2f, 0xe5, 0xd4, 0xfc, 0x8b, 0x7c, 0x29, 0xaf, 0x3e, 0xcf, 0x97, 0xb3, 0x6a, 0xee, 0x79, 0xbe, 0x9c, 0x53, 0xf3, 0xcf, 0xf3, 0xe5, 0xbc, 0x5a,
0x16, 0x5e, 0xe4, 0x4b, 0x45, 0xb5, 0xa4, 0xfd, 0x21, 0x03, 0x6a, 0x6f, 0xc6, 0xff, 0xa3, 0x57, 0x78, 0x9e, 0x2f, 0x97, 0xd4, 0xb2, 0xf6, 0xa7, 0x0c, 0xa8, 0xfd, 0x19, 0xff, 0xbf, 0x5e, 0x01,
0xc0, 0x87, 0xd1, 0x72, 0xcc, 0xd1, 0x94, 0xbf, 0x31, 0xc7, 0x6c, 0xca, 0x29, 0x86, 0xbb, 0x60, 0x1f, 0x46, 0xcb, 0x31, 0xc7, 0x53, 0xfe, 0xda, 0x9c, 0xb0, 0x29, 0xa7, 0x18, 0xee, 0x82, 0xa1,
0x28, 0xb6, 0xe5, 0xb4, 0xa7, 0xfc, 0xcd, 0xb1, 0xa0, 0x45, 0xcf, 0x67, 0x02, 0x55, 0x0e, 0x51, 0xd8, 0x96, 0xd3, 0x99, 0xf2, 0xd7, 0x87, 0x82, 0x16, 0x3d, 0x9f, 0x09, 0x54, 0x25, 0x44, 0xd1,
0xf4, 0x26, 0x46, 0xfd, 0x84, 0x39, 0xbf, 0xce, 0x80, 0xf2, 0xed, 0xcc, 0xe5, 0x6c, 0xf5, 0x93, 0xeb, 0x18, 0xf5, 0x03, 0xe6, 0xfc, 0x26, 0x03, 0xca, 0xd7, 0x33, 0x97, 0xb3, 0xd5, 0x4f, 0x02,
0x80, 0x89, 0x37, 0xef, 0xc3, 0x59, 0xd4, 0x01, 0xa3, 0x79, 0x0f, 0xbe, 0xd3, 0xd2, 0x73, 0x4b, 0x26, 0xde, 0xbc, 0x0f, 0x67, 0x51, 0x07, 0x8c, 0xe7, 0x3d, 0xf8, 0x56, 0x4b, 0xcf, 0x2d, 0x69,
0x5a, 0xfa, 0xbd, 0x8f, 0x5d, 0xfe, 0xde, 0xc7, 0x4e, 0xfb, 0x65, 0x46, 0x44, 0x3d, 0xbc, 0x66, 0xe9, 0x77, 0x3e, 0x76, 0xf9, 0x3b, 0x1f, 0x3b, 0xed, 0xf7, 0x19, 0x11, 0xf5, 0xf0, 0x9a, 0xa1,
0xe8, 0xf2, 0x5d, 0x50, 0xa2, 0x47, 0xca, 0x0c, 0x68, 0x74, 0x61, 0x08, 0xe4, 0x2b, 0x35, 0xa0, 0xcb, 0x77, 0x40, 0x89, 0x1e, 0x29, 0x33, 0xa0, 0xd1, 0x85, 0x21, 0x90, 0xaf, 0xd4, 0x90, 0xe2,
0x38, 0xe5, 0x60, 0x81, 0xa1, 0xc6, 0xe0, 0x3a, 0x46, 0x86, 0x53, 0x8e, 0xe0, 0xf5, 0x25, 0x2b, 0x94, 0x83, 0x05, 0x86, 0x1a, 0x83, 0xab, 0x18, 0x19, 0x4e, 0x39, 0x82, 0x37, 0x90, 0xac, 0xf0,
0x3c, 0xf0, 0x2e, 0x40, 0xc2, 0x97, 0x05, 0xb4, 0xb3, 0x3c, 0x4a, 0x38, 0x52, 0xba, 0x30, 0xaf, 0xc0, 0xdb, 0x00, 0x09, 0x5f, 0x16, 0xd0, 0xce, 0xca, 0x38, 0x76, 0xf7, 0x82, 0x1f, 0x8a, 0x8b,
0x16, 0xb4, 0x3f, 0xca, 0x2c, 0xf8, 0x77, 0xaf, 0xf4, 0x01, 0xd4, 0xe6, 0xc3, 0x0e, 0x62, 0xe4, 0x7e, 0x88, 0x7d, 0x9c, 0x57, 0x0b, 0xda, 0xbf, 0x64, 0x9a, 0xfc, 0xb7, 0x77, 0x7e, 0x0f, 0xea,
0xfb, 0xaa, 0x78, 0xd1, 0xb4, 0x23, 0x50, 0x1f, 0x87, 0x7d, 0x44, 0xce, 0x1d, 0xe9, 0x6b, 0xd7, 0xf3, 0x69, 0x08, 0x31, 0xf2, 0x01, 0x56, 0xbc, 0x68, 0x1c, 0x12, 0xa8, 0x0f, 0xc3, 0x46, 0x23,
0x05, 0x67, 0x20, 0x18, 0xa1, 0x48, 0x9c, 0x4f, 0x84, 0x5f, 0xe9, 0xad, 0xcd, 0x1c, 0x6e, 0xe2, 0x07, 0x93, 0xb4, 0x5d, 0x0d, 0xc1, 0x19, 0x0a, 0x46, 0x28, 0x12, 0x07, 0x18, 0xe1, 0x78, 0x7a,
0xb0, 0x27, 0xdf, 0xdc, 0x3a, 0xfa, 0x53, 0xd2, 0x8f, 0x45, 0x6c, 0xef, 0x37, 0x50, 0xab, 0x43, 0x63, 0x33, 0x87, 0x9b, 0x38, 0x0d, 0xca, 0x47, 0xb9, 0x81, 0x0e, 0x97, 0xf4, 0x43, 0x11, 0xfc,
0x75, 0xe8, 0x7e, 0xcf, 0x9c, 0xb8, 0xd8, 0xbe, 0x82, 0x5a, 0x44, 0x08, 0x4d, 0xdc, 0x87, 0x35, 0xff, 0xd1, 0x03, 0x5a, 0x03, 0x6a, 0x23, 0xf7, 0x5b, 0xe6, 0xc4, 0xe5, 0xfa, 0x05, 0xd4, 0x23,
0x8e, 0x94, 0xb0, 0xba, 0xe7, 0x6d, 0xfc, 0x2c, 0xa0, 0x1c, 0xc1, 0x46, 0x88, 0xd0, 0x7e, 0x9f, 0x42, 0xe8, 0x83, 0x3d, 0x28, 0x72, 0xa4, 0x84, 0xfd, 0x61, 0xfe, 0x10, 0x9c, 0x04, 0x94, 0x23,
0x85, 0x72, 0x4c, 0x15, 0x49, 0x72, 0x49, 0x03, 0x66, 0xda, 0x74, 0x44, 0x7d, 0xd7, 0x75, 0xc2, 0xd8, 0x08, 0x11, 0xda, 0x1f, 0xb3, 0x50, 0x89, 0xa9, 0x22, 0xcd, 0xce, 0x69, 0xc0, 0x4c, 0x9b,
0x1a, 0x57, 0x04, 0xf1, 0x3c, 0xa4, 0x89, 0x16, 0x16, 0xd9, 0x71, 0x4d, 0x83, 0x6b, 0xf4, 0x8e, 0x8e, 0xa9, 0xef, 0xba, 0x4e, 0xd8, 0x25, 0x14, 0x41, 0x3c, 0x0d, 0x69, 0xa2, 0x09, 0x46, 0x86,
0x62, 0x54, 0x42, 0xda, 0x29, 0x0d, 0xae, 0xc9, 0x47, 0xa0, 0x46, 0x10, 0xcf, 0x67, 0x96, 0x2d, 0x5e, 0xd1, 0xe0, 0x0a, 0xdd, 0xa7, 0x18, 0xd5, 0x90, 0x76, 0x4c, 0x83, 0x2b, 0xf2, 0x01, 0xa8,
0x5e, 0x3e, 0xf9, 0x3e, 0xd7, 0x43, 0x7a, 0x3f, 0x24, 0x8b, 0x06, 0x2f, 0x8b, 0xcc, 0xf4, 0xa8, 0x11, 0xc4, 0xf3, 0x99, 0x65, 0x8b, 0xb7, 0x53, 0xbe, 0xf0, 0x8d, 0x90, 0x3e, 0x08, 0xc9, 0xe2,
0x35, 0x36, 0x6d, 0xe1, 0x45, 0x39, 0xaf, 0xd6, 0x24, 0xbd, 0x4f, 0xad, 0xf1, 0x79, 0x40, 0x39, 0x89, 0x90, 0x65, 0x6a, 0x7a, 0xd4, 0x9a, 0x98, 0xb6, 0x70, 0xb3, 0x9c, 0x78, 0xeb, 0x92, 0x3e,
0xf9, 0x0c, 0x1e, 0x25, 0x86, 0xda, 0x04, 0x5c, 0x56, 0x31, 0xf1, 0xe3, 0xa9, 0x36, 0x3e, 0xf2, 0xa0, 0xd6, 0xe4, 0x34, 0xa0, 0x9c, 0x7c, 0x02, 0x0f, 0x12, 0x63, 0x71, 0x02, 0x2e, 0xfb, 0x00,
0x04, 0x14, 0xf1, 0x62, 0x98, 0x23, 0x9f, 0x51, 0xce, 0xc6, 0x61, 0x1d, 0x57, 0x04, 0xad, 0x2d, 0xf1, 0xe3, 0xb9, 0x38, 0x3e, 0xf2, 0x08, 0x14, 0xf1, 0xe6, 0x98, 0x63, 0x9f, 0x51, 0xce, 0x26,
0x49, 0xa4, 0x01, 0x45, 0x76, 0xe3, 0x59, 0x3e, 0x1b, 0xe3, 0x8b, 0x51, 0x32, 0xa2, 0x9f, 0xe2, 0x61, 0x27, 0xa8, 0x0a, 0x5a, 0x47, 0x92, 0x48, 0x13, 0x4a, 0xec, 0xda, 0xb3, 0x7c, 0x36, 0xc1,
0x70, 0xc0, 0x5d, 0x9f, 0x5e, 0x31, 0xd3, 0xa1, 0x36, 0x0b, 0x47, 0x94, 0x4a, 0x48, 0xeb, 0x52, 0x37, 0xa7, 0x6c, 0x44, 0x3f, 0xc5, 0xe1, 0x80, 0xbb, 0x3e, 0xbd, 0x64, 0xa6, 0x43, 0x6d, 0x16,
0x9b, 0x69, 0xef, 0xc0, 0xf6, 0x73, 0xc6, 0xcf, 0xac, 0xd7, 0x33, 0x6b, 0x6c, 0xf1, 0xdb, 0x3e, 0x0e, 0x39, 0xd5, 0x90, 0xd6, 0xa3, 0x36, 0xd3, 0xde, 0x82, 0xad, 0x67, 0x8c, 0x9f, 0x58, 0xaf,
0xf5, 0xe9, 0xbc, 0x0b, 0xfe, 0xb5, 0x00, 0x1b, 0x69, 0x16, 0xe3, 0xcc, 0x17, 0x2f, 0x50, 0xc1, 0x66, 0xd6, 0xc4, 0xe2, 0x37, 0x03, 0xea, 0xd3, 0x79, 0x1f, 0xfd, 0x5b, 0x01, 0xd6, 0xd3, 0x2c,
0x9f, 0x4d, 0x59, 0x14, 0x9d, 0xf9, 0x8b, 0x19, 0x83, 0x8d, 0xd9, 0x94, 0x19, 0x12, 0x44, 0xb6, 0xc6, 0x99, 0x2f, 0xde, 0xb0, 0x82, 0x3f, 0x9b, 0xb2, 0x28, 0x3a, 0xf3, 0x37, 0x37, 0x06, 0x1b,
0xa0, 0x88, 0xd6, 0x7a, 0x76, 0x43, 0xc5, 0x02, 0x5c, 0x9b, 0x30, 0xd6, 0xf7, 0x6c, 0xf2, 0x35, 0xb3, 0x29, 0x33, 0x24, 0x88, 0x6c, 0x42, 0x09, 0xad, 0xf5, 0xec, 0xa6, 0x8a, 0x25, 0x5c, 0xbc,
0xec, 0xcc, 0x73, 0xcf, 0x17, 0x8f, 0x63, 0x40, 0xb9, 0xe9, 0x31, 0xdf, 0x7c, 0x23, 0x46, 0x00, 0x60, 0x6c, 0xe0, 0xd9, 0xe4, 0x4b, 0xd8, 0x9e, 0x27, 0xa7, 0x2f, 0x9e, 0xd7, 0x80, 0x72, 0xd3,
0x0c, 0x0b, 0x96, 0xab, 0x4c, 0x43, 0x83, 0x72, 0x91, 0x8a, 0x7d, 0xe6, 0xbf, 0x14, 0x6c, 0xf2, 0x63, 0xbe, 0xf9, 0x5a, 0x0c, 0x11, 0x18, 0x16, 0x2c, 0x78, 0x99, 0xa7, 0x06, 0xe5, 0x22, 0x57,
0x21, 0xa8, 0xc9, 0x19, 0x12, 0x15, 0xe4, 0xf0, 0x48, 0x75, 0x3e, 0x47, 0x0a, 0x3d, 0x9f, 0x82, 0x07, 0xcc, 0x7f, 0x21, 0xd8, 0xe4, 0x7d, 0x50, 0x93, 0x53, 0x28, 0x2a, 0xc8, 0xe1, 0x91, 0xda,
0x58, 0x1c, 0xcc, 0x94, 0xeb, 0x3d, 0x3b, 0xec, 0x06, 0x42, 0xc6, 0x7c, 0x9b, 0x10, 0xf0, 0x2f, 0x7c, 0x12, 0x15, 0x7a, 0x3e, 0x06, 0xb1, 0x7a, 0x98, 0x29, 0xd7, 0x7b, 0x76, 0xd8, 0x4f, 0x84,
0xa1, 0xb9, 0x7c, 0x0b, 0xc1, 0x53, 0x05, 0x3c, 0xb5, 0xb9, 0x64, 0x13, 0x11, 0x67, 0xd3, 0xab, 0x8c, 0xf9, 0x3e, 0x22, 0xe0, 0x9f, 0x43, 0x6b, 0xf9, 0x1e, 0x83, 0xa7, 0x0a, 0x78, 0x6a, 0x63,
0x86, 0x08, 0xed, 0x1a, 0xe2, 0xe7, 0xab, 0x86, 0x28, 0xa6, 0x8f, 0x60, 0x3d, 0x35, 0xdb, 0x22, 0xc9, 0x2e, 0x23, 0xce, 0xa6, 0x97, 0x15, 0x11, 0xda, 0x22, 0xe2, 0xe7, 0xcb, 0x8a, 0xa8, 0xb6,
0xb0, 0x88, 0xc0, 0x5a, 0x62, 0xbe, 0x8d, 0xeb, 0x6e, 0x71, 0x2f, 0x28, 0x2d, 0xdf, 0x0b, 0x9e, 0x0f, 0x60, 0x2d, 0x35, 0x1d, 0x23, 0xb0, 0x84, 0xc0, 0x7a, 0x62, 0x42, 0x8e, 0x0b, 0x73, 0x71,
0xc1, 0x46, 0x34, 0xd1, 0x5c, 0xd2, 0xd1, 0xf7, 0xee, 0x64, 0x62, 0x06, 0x6c, 0x84, 0xdd, 0x3a, 0xb3, 0x28, 0x2f, 0xdf, 0x2c, 0x9e, 0xc0, 0x7a, 0x34, 0x13, 0x9d, 0xd3, 0xf1, 0xb7, 0xee, 0xc5,
0x6f, 0xac, 0x87, 0xac, 0x23, 0xc9, 0x19, 0xb0, 0x11, 0x69, 0x42, 0x89, 0xce, 0xb8, 0x2b, 0x82, 0x85, 0x19, 0xb0, 0x31, 0xf6, 0xfb, 0xbc, 0xb1, 0x16, 0xb2, 0x9e, 0x4a, 0xce, 0x90, 0x8d, 0x49,
0x87, 0x2f, 0x74, 0xc9, 0x88, 0x7f, 0x0b, 0x59, 0xd1, 0xdf, 0xe6, 0xe5, 0x6c, 0x7c, 0xc5, 0x64, 0x0b, 0xca, 0x74, 0xc6, 0x5d, 0x11, 0x3c, 0x7c, 0xe3, 0xcb, 0x46, 0xfc, 0x5b, 0xc8, 0x8a, 0xfe,
0x1f, 0xa9, 0x48, 0x59, 0x11, 0xeb, 0x08, 0x39, 0xe2, 0x9e, 0x5f, 0xc0, 0xf6, 0x1d, 0x3c, 0xa7, 0x36, 0xcf, 0x67, 0x93, 0x4b, 0x26, 0x1b, 0x4d, 0x55, 0xca, 0x8a, 0x58, 0x4f, 0x91, 0x23, 0xee,
0x3e, 0xc7, 0x1b, 0x28, 0xd2, 0x67, 0x0b, 0xa7, 0x04, 0x5b, 0x5c, 0xe3, 0x63, 0x20, 0x82, 0x63, 0xf9, 0x19, 0x6c, 0xdd, 0xc2, 0x73, 0xea, 0x73, 0xbc, 0x81, 0x22, 0x7d, 0xb6, 0x70, 0x4a, 0xb0,
0x0a, 0x97, 0x58, 0x8e, 0x39, 0x99, 0x5a, 0x57, 0xd7, 0x1c, 0x07, 0x94, 0xbc, 0x51, 0x17, 0x9c, 0xc5, 0x35, 0x3e, 0x04, 0x22, 0x38, 0xa6, 0x70, 0x89, 0xe5, 0x98, 0x17, 0x53, 0xeb, 0xf2, 0x8a,
0x73, 0x7a, 0xd3, 0x71, 0x4e, 0x90, 0xbc, 0xec, 0x09, 0xac, 0x85, 0x31, 0xff, 0xa9, 0x27, 0xb0, 0xe3, 0x88, 0x93, 0x37, 0x1a, 0x82, 0x73, 0x4a, 0xaf, 0xbb, 0xce, 0x11, 0x92, 0x97, 0x3d, 0xa2,
0x9e, 0xca, 0x0d, 0x89, 0xd3, 0xfe, 0x9c, 0x81, 0x6a, 0x2a, 0x6b, 0xb1, 0x7b, 0xc9, 0x05, 0xce, 0xf5, 0x30, 0xe6, 0x3f, 0xf4, 0x88, 0x36, 0x52, 0xb9, 0x21, 0x71, 0xda, 0x5f, 0x32, 0x50, 0x4b,
0x0c, 0x47, 0x84, 0xbc, 0x51, 0x0e, 0x29, 0x9d, 0x31, 0xd9, 0x84, 0x35, 0x6f, 0x76, 0xf9, 0x3d, 0x65, 0x2d, 0xb6, 0x37, 0xb9, 0x02, 0x9a, 0xe1, 0x90, 0x91, 0x37, 0x2a, 0x21, 0xa5, 0x3b, 0x21,
0xbb, 0xc5, 0x4c, 0x50, 0x8c, 0xf0, 0x17, 0x79, 0x16, 0xce, 0xa7, 0x59, 0x1c, 0x22, 0x9b, 0xcb, 0x1b, 0x50, 0xf4, 0x66, 0xe7, 0xdf, 0xb2, 0x1b, 0xcc, 0x04, 0xc5, 0x08, 0x7f, 0x91, 0x27, 0xe1,
0x4b, 0x22, 0x31, 0xa8, 0x7e, 0x0a, 0xc4, 0x72, 0x46, 0xae, 0x2d, 0x72, 0x8b, 0x5f, 0xfb, 0x2c, 0x84, 0x9b, 0xc5, 0x31, 0xb4, 0xb5, 0xbc, 0x24, 0x12, 0xa3, 0xee, 0xc7, 0x40, 0x2c, 0x67, 0xec,
0xb8, 0x76, 0xa7, 0x63, 0xcc, 0xdf, 0xaa, 0xb1, 0x1e, 0x71, 0x86, 0x11, 0x43, 0xc0, 0xe3, 0x5d, 0xda, 0x22, 0xb7, 0xf8, 0x95, 0xcf, 0x82, 0x2b, 0x77, 0x3a, 0xc1, 0xfc, 0xad, 0x19, 0x6b, 0x11,
0x72, 0x0e, 0xcf, 0x4b, 0x78, 0xc4, 0x89, 0xe1, 0xda, 0x2b, 0xd8, 0x1e, 0xac, 0x2a, 0x6b, 0xf2, 0x67, 0x14, 0x31, 0x04, 0x3c, 0xde, 0x46, 0xe7, 0xf0, 0xbc, 0x84, 0x47, 0x9c, 0x18, 0xae, 0xbd,
0x15, 0x80, 0x17, 0x17, 0x33, 0x5a, 0x58, 0x39, 0xdc, 0xb9, 0x7b, 0xe1, 0x79, 0xc1, 0x1b, 0x09, 0x84, 0xad, 0xe1, 0xaa, 0xb2, 0x26, 0x5f, 0x00, 0x78, 0x71, 0x31, 0xa3, 0x85, 0xd5, 0x83, 0xed,
0xbc, 0xb6, 0x03, 0xcd, 0x65, 0xa2, 0x65, 0xe7, 0xd6, 0x1e, 0xc1, 0xc6, 0x60, 0x76, 0x75, 0xc5, 0xdb, 0x17, 0x9e, 0x17, 0xbc, 0x91, 0xc0, 0x6b, 0xdb, 0xd0, 0x5a, 0x26, 0x5a, 0x76, 0x6e, 0xed,
0x16, 0x46, 0x38, 0x1f, 0x94, 0x63, 0x2b, 0x78, 0x3d, 0xa3, 0x53, 0x6b, 0x62, 0xb1, 0xf1, 0xbf, 0x01, 0xac, 0x0f, 0x67, 0x97, 0x97, 0x6c, 0x61, 0x08, 0xf4, 0x41, 0x39, 0xb4, 0x82, 0x57, 0x33,
0xee, 0xe4, 0x5c, 0xca, 0xc9, 0x1f, 0xc3, 0x5a, 0x38, 0xab, 0x4b, 0x37, 0xcf, 0xa7, 0xbe, 0xd6, 0x3a, 0xb5, 0x2e, 0x2c, 0x36, 0xf9, 0xcf, 0x9d, 0x9c, 0x4b, 0x39, 0xf9, 0x43, 0x28, 0x86, 0xd3,
0x8c, 0xbb, 0xe1, 0xa0, 0x1e, 0x42, 0xb4, 0x1f, 0x33, 0xf0, 0x30, 0x7d, 0x97, 0xf0, 0x75, 0x39, 0xbe, 0x74, 0xf3, 0x7c, 0x6e, 0x6c, 0xcf, 0xb8, 0x1b, 0x8e, 0xfa, 0x21, 0x44, 0xfb, 0x3e, 0x03,
0x84, 0x52, 0xb4, 0xc5, 0x87, 0x1d, 0x6c, 0x6b, 0x6e, 0x7d, 0xea, 0x43, 0x87, 0x51, 0x0c, 0x57, 0xf7, 0xd3, 0x77, 0x09, 0x5f, 0x97, 0x03, 0x28, 0x47, 0xdf, 0x01, 0xc2, 0x0e, 0xb6, 0x39, 0xb7,
0x7a, 0xf2, 0x05, 0x28, 0xe3, 0x84, 0x01, 0x8d, 0x2c, 0x9e, 0x7b, 0x14, 0x9f, 0x4b, 0x5a, 0x67, 0x3e, 0xf5, 0xa9, 0xc4, 0x28, 0x85, 0x1f, 0x05, 0xc8, 0x67, 0xa0, 0x4c, 0x12, 0x06, 0x34, 0xb3,
0xa4, 0xa0, 0xfb, 0x4f, 0xa1, 0x14, 0x2d, 0x29, 0x44, 0x81, 0xd2, 0x59, 0xaf, 0xd7, 0x37, 0x7b, 0x78, 0xee, 0x41, 0x7c, 0x2e, 0x69, 0x9d, 0x91, 0x82, 0xee, 0x3d, 0x86, 0x72, 0xb4, 0xe6, 0x10,
0x17, 0x43, 0xf5, 0x01, 0xa9, 0x40, 0x11, 0x7f, 0x75, 0xba, 0x6a, 0x66, 0x3f, 0x80, 0x72, 0xbc, 0x05, 0xca, 0x27, 0xfd, 0xfe, 0xc0, 0xec, 0x9f, 0x8d, 0xd4, 0x7b, 0xa4, 0x0a, 0x25, 0xfc, 0xd5,
0xa3, 0x90, 0x2a, 0x94, 0x3b, 0xdd, 0xce, 0xb0, 0xd3, 0x1a, 0xea, 0xc7, 0xea, 0x03, 0xf2, 0x08, 0xed, 0xa9, 0x99, 0xbd, 0x00, 0x2a, 0xf1, 0x96, 0x43, 0x6a, 0x50, 0xe9, 0xf6, 0xba, 0xa3, 0x6e,
0xd6, 0xfb, 0x86, 0xde, 0x39, 0x6f, 0x3d, 0xd7, 0x4d, 0x43, 0x7f, 0xa9, 0xb7, 0xce, 0xf4, 0x63, 0x7b, 0xa4, 0x1f, 0xaa, 0xf7, 0xc8, 0x03, 0x58, 0x1b, 0x18, 0x7a, 0xf7, 0xb4, 0xfd, 0x4c, 0x37,
0x35, 0x43, 0x08, 0xd4, 0x4e, 0x87, 0x67, 0x6d, 0xb3, 0x7f, 0x71, 0x74, 0xd6, 0x19, 0x9c, 0xea, 0x0d, 0xfd, 0x85, 0xde, 0x3e, 0xd1, 0x0f, 0xd5, 0x0c, 0x21, 0x50, 0x3f, 0x1e, 0x9d, 0x74, 0xcc,
0xc7, 0x6a, 0x56, 0xc8, 0x1c, 0x5c, 0xb4, 0xdb, 0xfa, 0x60, 0xa0, 0xe6, 0x08, 0xc0, 0xda, 0x49, 0xc1, 0xd9, 0xd3, 0x93, 0xee, 0xf0, 0x58, 0x3f, 0x54, 0xb3, 0x42, 0xe6, 0xf0, 0xac, 0xd3, 0xd1,
0xab, 0x23, 0xc0, 0x79, 0xb2, 0x01, 0xf5, 0x4e, 0xf7, 0x65, 0xaf, 0xd3, 0xd6, 0xcd, 0x81, 0x3e, 0x87, 0x43, 0x35, 0x47, 0x00, 0x8a, 0x47, 0xed, 0xae, 0x00, 0xe7, 0xc9, 0x3a, 0x34, 0xba, 0xbd,
0x1c, 0x0a, 0x62, 0x61, 0xff, 0x1f, 0x19, 0xa8, 0xa6, 0xd6, 0x1c, 0xb2, 0x05, 0x1b, 0xe2, 0xc8, 0x17, 0xfd, 0x6e, 0x47, 0x37, 0x87, 0xfa, 0x68, 0x24, 0x88, 0x85, 0xbd, 0x7f, 0x66, 0xa0, 0x96,
0x85, 0x21, 0x34, 0xb5, 0x06, 0xbd, 0xae, 0xd9, 0xed, 0x75, 0x75, 0xf5, 0x01, 0x79, 0x07, 0xb6, 0x5a, 0x94, 0xc8, 0x26, 0xac, 0x8b, 0x23, 0x67, 0x86, 0xd0, 0xd4, 0x1e, 0xf6, 0x7b, 0x66, 0xaf,
0x16, 0x18, 0xbd, 0x93, 0x93, 0xf6, 0x69, 0x4b, 0x5c, 0x9e, 0x34, 0x61, 0x73, 0x81, 0x39, 0xec, 0xdf, 0xd3, 0xd5, 0x7b, 0xe4, 0x2d, 0xd8, 0x5c, 0x60, 0xf4, 0x8f, 0x8e, 0x3a, 0xc7, 0x6d, 0x71,
0x9c, 0xeb, 0xc2, 0xca, 0x2c, 0xd9, 0x85, 0x9d, 0x05, 0xde, 0xe0, 0x3b, 0x5d, 0xef, 0xc7, 0x88, 0x79, 0xd2, 0x82, 0x8d, 0x05, 0xe6, 0xa8, 0x7b, 0xaa, 0x0b, 0x2b, 0xb3, 0x64, 0x07, 0xb6, 0x17,
0x1c, 0x79, 0x0a, 0x4f, 0x16, 0x10, 0x9d, 0xee, 0xe0, 0xe2, 0xe4, 0xa4, 0xd3, 0xee, 0xe8, 0xdd, 0x78, 0xc3, 0x6f, 0x74, 0x7d, 0x10, 0x23, 0x72, 0xe4, 0x31, 0x3c, 0x5a, 0x40, 0x74, 0x7b, 0xc3,
0xa1, 0xf9, 0xb2, 0x75, 0x76, 0xa1, 0xab, 0x79, 0xb2, 0x03, 0x8d, 0x45, 0x25, 0xfa, 0x79, 0xbf, 0xb3, 0xa3, 0xa3, 0x6e, 0xa7, 0xab, 0xf7, 0x46, 0xe6, 0x8b, 0xf6, 0xc9, 0x99, 0xae, 0xe6, 0xc9,
0x67, 0xb4, 0x8c, 0x57, 0x6a, 0x81, 0xbc, 0x0f, 0x8f, 0xef, 0x08, 0x69, 0xf7, 0x0c, 0x43, 0x6f, 0x36, 0x34, 0x17, 0x95, 0xe8, 0xa7, 0x83, 0xbe, 0xd1, 0x36, 0x5e, 0xaa, 0x05, 0xf2, 0x2e, 0x3c,
0x0f, 0xcd, 0xd6, 0x79, 0xef, 0xa2, 0x3b, 0x54, 0xd7, 0xf6, 0x0f, 0xc4, 0x2a, 0xb1, 0x50, 0x90, 0xbc, 0x25, 0xa4, 0xd3, 0x37, 0x0c, 0xbd, 0x33, 0x32, 0xdb, 0xa7, 0xfd, 0xb3, 0xde, 0x48, 0x2d,
0xc2, 0x65, 0x17, 0xdd, 0x6f, 0xba, 0xbd, 0xef, 0xba, 0xea, 0x03, 0xe1, 0xf9, 0xe1, 0xa9, 0xa1, 0xee, 0xed, 0x8b, 0x65, 0x64, 0xa1, 0x20, 0x85, 0xcb, 0xce, 0x7a, 0x5f, 0xf5, 0xfa, 0xdf, 0xf4,
0x0f, 0x4e, 0x7b, 0x67, 0xc7, 0x6a, 0x66, 0xff, 0x37, 0x39, 0x80, 0x79, 0x6e, 0x09, 0xef, 0xb4, 0xd4, 0x7b, 0xc2, 0xf3, 0xa3, 0x63, 0x43, 0x1f, 0x1e, 0xf7, 0x4f, 0x0e, 0xd5, 0xcc, 0xde, 0x6f,
0x2e, 0x86, 0xbd, 0x48, 0xc3, 0xfc, 0x98, 0x06, 0xef, 0x25, 0x19, 0x47, 0x17, 0xc7, 0xcf, 0xf5, 0x73, 0x00, 0xf3, 0xdc, 0x12, 0xde, 0x69, 0x9f, 0x8d, 0xfa, 0x91, 0x86, 0xf9, 0x31, 0x0d, 0xde,
0xa1, 0xd9, 0xed, 0x0d, 0xcd, 0xc1, 0xb0, 0x65, 0x0c, 0x31, 0x5c, 0x4d, 0xd8, 0x4c, 0x62, 0xa4, 0x49, 0x32, 0x9e, 0x9e, 0x1d, 0x3e, 0xd3, 0x47, 0x66, 0xaf, 0x3f, 0x32, 0x87, 0xa3, 0xb6, 0x31,
0x17, 0x4e, 0x74, 0x7d, 0xa0, 0x66, 0xc9, 0x7b, 0xd0, 0x5c, 0x72, 0x5e, 0x3f, 0x6b, 0xf5, 0x07, 0xc2, 0x70, 0xb5, 0x60, 0x23, 0x89, 0x91, 0x5e, 0x38, 0xd2, 0xf5, 0xa1, 0x9a, 0x25, 0xef, 0x40,
0xfa, 0xb1, 0x9a, 0x23, 0xdb, 0xf0, 0x28, 0xc9, 0xef, 0x74, 0xcd, 0x93, 0xb3, 0xce, 0xf3, 0xd3, 0x6b, 0xc9, 0x79, 0xfd, 0xa4, 0x3d, 0x18, 0xea, 0x87, 0x6a, 0x8e, 0x6c, 0xc1, 0x83, 0x24, 0xbf,
0xa1, 0x9a, 0x27, 0x0d, 0x78, 0x98, 0x16, 0xdb, 0x42, 0xa9, 0x6a, 0x61, 0xf1, 0xd0, 0x79, 0xa7, 0xdb, 0x33, 0x8f, 0x4e, 0xba, 0xcf, 0x8e, 0x47, 0x6a, 0x9e, 0x34, 0xe1, 0x7e, 0x5a, 0x6c, 0x1b,
0xab, 0x1b, 0xc8, 0x5a, 0x23, 0x9b, 0x40, 0x92, 0xac, 0xbe, 0xa1, 0xf7, 0x5b, 0xaf, 0xd4, 0x22, 0xa5, 0xaa, 0x85, 0xc5, 0x43, 0xa7, 0xdd, 0x9e, 0x6e, 0x20, 0xab, 0x48, 0x36, 0x80, 0x24, 0x59,
0x79, 0x0c, 0xef, 0x24, 0xe9, 0x91, 0x47, 0x8f, 0x5a, 0xed, 0x6f, 0x7a, 0x27, 0x27, 0x6a, 0x69, 0x03, 0x43, 0x1f, 0xb4, 0x5f, 0xaa, 0x25, 0xf2, 0x10, 0xde, 0x4a, 0xd2, 0x23, 0x8f, 0x3e, 0x6d,
0x51, 0x5b, 0x9c, 0xcd, 0xe5, 0x45, 0xdf, 0x44, 0x99, 0x0d, 0x22, 0x6e, 0x29, 0x46, 0xe7, 0xdb, 0x77, 0xbe, 0xea, 0x1f, 0x1d, 0xa9, 0xe5, 0x45, 0x6d, 0x71, 0x36, 0x57, 0x16, 0x7d, 0x13, 0x65,
0x8b, 0xce, 0x71, 0x67, 0xf8, 0xca, 0xec, 0x7d, 0xa3, 0x56, 0x44, 0xdc, 0x96, 0x58, 0x9e, 0x4c, 0x36, 0x88, 0xb8, 0xa5, 0x18, 0xdd, 0xaf, 0xcf, 0xba, 0x87, 0xdd, 0xd1, 0x4b, 0xb3, 0xff, 0x95,
0x00, 0x55, 0x11, 0x39, 0x94, 0xba, 0x96, 0xae, 0xa7, 0x11, 0xd5, 0xc3, 0xbf, 0x94, 0xe5, 0xf7, 0x5a, 0x15, 0x71, 0x5b, 0x62, 0x79, 0x32, 0x01, 0x54, 0x45, 0xe4, 0x50, 0xea, 0x5a, 0xba, 0x9e,
0x86, 0x36, 0x7e, 0xe1, 0x24, 0x06, 0x14, 0xc3, 0x52, 0x26, 0xab, 0x8a, 0xbb, 0xf9, 0x28, 0xb5, 0x46, 0xd4, 0x0e, 0xfe, 0x5a, 0x91, 0x5f, 0x2c, 0x3a, 0xf8, 0x8d, 0x94, 0x18, 0x50, 0x0a, 0x4b,
0x33, 0xc6, 0x2d, 0x6c, 0xeb, 0x17, 0x7f, 0xfa, 0xdb, 0xaf, 0xb2, 0xeb, 0x9a, 0x72, 0xf0, 0xe6, 0x99, 0xac, 0x2a, 0xee, 0xd6, 0x83, 0xd4, 0xd6, 0x19, 0xb7, 0xb0, 0xcd, 0x5f, 0xfd, 0xf9, 0xef,
0xb3, 0x03, 0x81, 0x38, 0x70, 0x67, 0xfc, 0xcb, 0xcc, 0x3e, 0xe9, 0xc1, 0x9a, 0xfc, 0xae, 0x45, 0xbf, 0xce, 0xae, 0x69, 0xca, 0xfe, 0xeb, 0x4f, 0xf6, 0x05, 0x62, 0xdf, 0x9d, 0xf1, 0xcf, 0x33,
0x36, 0x53, 0x22, 0xe3, 0x0f, 0x5d, 0xab, 0x24, 0x6e, 0xa2, 0x44, 0x55, 0xab, 0xc4, 0x12, 0x2d, 0x7b, 0xa4, 0x0f, 0x45, 0xf9, 0x65, 0x8c, 0x6c, 0xa4, 0x44, 0xc6, 0x9f, 0xca, 0x56, 0x49, 0xdc,
0x47, 0x08, 0xfc, 0x02, 0x8a, 0xe1, 0x57, 0x93, 0xc4, 0x25, 0xd3, 0xdf, 0x51, 0x9a, 0xcb, 0x16, 0x40, 0x89, 0xaa, 0x56, 0x8d, 0x25, 0x5a, 0x8e, 0x10, 0xf8, 0x19, 0x94, 0xc2, 0xef, 0x2e, 0x89,
0xdb, 0xff, 0xce, 0x90, 0xff, 0x85, 0x72, 0xbc, 0x13, 0x93, 0xed, 0x44, 0xf3, 0x4e, 0x37, 0xde, 0x4b, 0xa6, 0xbf, 0xc4, 0xb4, 0x96, 0xad, 0xc6, 0x3f, 0xce, 0x90, 0x9f, 0x42, 0x25, 0xde, 0xaa,
0x66, 0x73, 0x19, 0x2b, 0x7d, 0x2d, 0x52, 0x8b, 0xaf, 0x85, 0xfb, 0x32, 0xb9, 0x90, 0x0d, 0x4b, 0xc9, 0x56, 0xa2, 0x79, 0xa7, 0x1b, 0x6f, 0xab, 0xb5, 0x8c, 0x95, 0xbe, 0x16, 0xa9, 0xc7, 0xd7,
0xec, 0xcb, 0xa4, 0x91, 0x52, 0x9f, 0x58, 0xa1, 0x97, 0x5e, 0x4c, 0x6b, 0xa2, 0xc8, 0x87, 0x84, 0xc2, 0x8d, 0x9b, 0x9c, 0xc9, 0x86, 0x25, 0x36, 0x6e, 0xd2, 0x4c, 0xa9, 0x4f, 0x2c, 0xe1, 0x4b,
0xa4, 0x44, 0x1e, 0xfc, 0x60, 0x8d, 0xff, 0x9f, 0xfc, 0x1f, 0x28, 0x61, 0x00, 0x70, 0xab, 0x25, 0x2f, 0xa6, 0xb5, 0x50, 0xe4, 0x7d, 0x42, 0x52, 0x22, 0xf7, 0xbf, 0xb3, 0x26, 0x3f, 0x27, 0x3f,
0x73, 0x67, 0x25, 0x57, 0xef, 0xe6, 0xdc, 0x98, 0xc5, 0xfd, 0x77, 0x89, 0x74, 0x77, 0xc6, 0x0f, 0x03, 0x25, 0x0c, 0x00, 0xee, 0xc5, 0x64, 0xee, 0xac, 0xe4, 0xf2, 0xde, 0x9a, 0x1b, 0xb3, 0xb8,
0x38, 0x4a, 0xbb, 0x8c, 0xa5, 0xe3, 0xb6, 0x94, 0x90, 0x9e, 0xdc, 0x3b, 0xd3, 0xd2, 0x53, 0x7b, 0x41, 0x2f, 0x91, 0xee, 0xce, 0xf8, 0x3e, 0x47, 0x69, 0xe7, 0xb1, 0x74, 0x5c, 0xa7, 0x12, 0xd2,
0x95, 0xb6, 0x8b, 0xd2, 0x9b, 0xa4, 0x91, 0x92, 0xfe, 0x5a, 0x60, 0x0e, 0x7e, 0xa0, 0x36, 0x17, 0x93, 0x9b, 0x6b, 0x5a, 0x7a, 0x6a, 0xf1, 0xd2, 0x76, 0x50, 0x7a, 0x8b, 0x34, 0x53, 0xd2, 0x5f,
0x16, 0xd4, 0xc4, 0xb0, 0x8c, 0x21, 0xbf, 0xd7, 0x86, 0xb9, 0xd7, 0x16, 0xbe, 0x22, 0x68, 0xdb, 0x09, 0xcc, 0xfe, 0x77, 0xd4, 0xe6, 0xc2, 0x82, 0xba, 0x18, 0x96, 0x31, 0xe4, 0x77, 0xda, 0x30,
0xa8, 0x64, 0x83, 0xac, 0x27, 0x52, 0x21, 0xb6, 0x60, 0x2e, 0xfd, 0x5e, 0x1b, 0x92, 0xd2, 0xd3, 0xf7, 0xda, 0xc2, 0x77, 0x08, 0x6d, 0x0b, 0x95, 0xac, 0x93, 0xb5, 0x44, 0x2a, 0xc4, 0x16, 0xcc,
0x26, 0x3c, 0x46, 0xe9, 0xdb, 0x64, 0x2b, 0x29, 0x3d, 0x69, 0xc1, 0x2b, 0xa8, 0x0a, 0x1d, 0xd1, 0xa5, 0xdf, 0x69, 0x43, 0x52, 0x7a, 0xda, 0x84, 0x87, 0x28, 0x7d, 0x8b, 0x6c, 0x26, 0xa5, 0x27,
0xba, 0x14, 0x24, 0x32, 0x39, 0xb5, 0x93, 0x35, 0xb7, 0xee, 0xd0, 0xd3, 0xd5, 0x41, 0xea, 0xa8, 0x2d, 0x78, 0x09, 0x35, 0xa1, 0x23, 0x5a, 0x97, 0x82, 0x44, 0x26, 0xa7, 0x76, 0xb2, 0xd6, 0xe6,
0x22, 0xa0, 0xfc, 0x40, 0xee, 0x61, 0x84, 0x03, 0xb9, 0xbb, 0x49, 0x10, 0x2d, 0x96, 0xb3, 0x72, 0x2d, 0x7a, 0xba, 0x3a, 0x48, 0x03, 0x55, 0x04, 0x94, 0xef, 0xcb, 0x3d, 0x8c, 0x70, 0x20, 0xb7,
0xcd, 0x68, 0xde, 0x3b, 0x7b, 0x68, 0x3b, 0xa8, 0x70, 0x93, 0x3c, 0x44, 0x85, 0x11, 0xe0, 0xc0, 0x37, 0x09, 0xa2, 0xc5, 0x72, 0x56, 0xae, 0x19, 0xad, 0x3b, 0x67, 0x0f, 0x6d, 0x1b, 0x15, 0x6e,
0x93, 0xf2, 0x7f, 0x06, 0x64, 0x70, 0x9f, 0xd6, 0x95, 0x53, 0x50, 0xf3, 0xfd, 0x7b, 0x31, 0x69, 0x90, 0xfb, 0xa8, 0x30, 0x02, 0xec, 0x7b, 0x52, 0xfe, 0x2f, 0x80, 0x0c, 0xef, 0xd2, 0xba, 0x72,
0x87, 0x6a, 0x4b, 0x95, 0x8b, 0x12, 0x66, 0xa0, 0x24, 0x67, 0x0c, 0x32, 0xb7, 0x65, 0xc9, 0x18, 0x0a, 0x6a, 0xbd, 0x7b, 0x27, 0x26, 0xed, 0x50, 0x6d, 0xa9, 0x72, 0x51, 0xc2, 0x0c, 0x94, 0xe4,
0xd4, 0x7c, 0x77, 0x05, 0x37, 0xd4, 0xd6, 0x40, 0x6d, 0x84, 0xa8, 0x42, 0x9b, 0x98, 0x7c, 0x0f, 0x8c, 0x41, 0xe6, 0xb6, 0x2c, 0x19, 0x83, 0x5a, 0x6f, 0xaf, 0xe0, 0x86, 0xda, 0x9a, 0xa8, 0x8d,
0x02, 0x09, 0xbb, 0x5c, 0xc3, 0x7f, 0xc5, 0x7c, 0xfe, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x10, 0x55, 0x68, 0x13, 0x93, 0xef, 0x7e, 0x20, 0x61, 0xe7, 0x45, 0xfc, 0x67, 0xce, 0xa7, 0xff,
0x41, 0x13, 0xa1, 0xc1, 0x19, 0x00, 0x00, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x0e, 0xbd, 0x2a, 0x6e, 0x03, 0x1a, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.

@ -635,6 +635,11 @@ message InQuoteResponse {
On-chain cltv expiry delta On-chain cltv expiry delta
*/ */
int32 cltv_delta = 5; int32 cltv_delta = 5;
/*
The confirmation target to be used to publish the on-chain HTLC.
*/
int32 conf_target = 6;
} }
message OutQuoteResponse { message OutQuoteResponse {
@ -664,6 +669,11 @@ message OutQuoteResponse {
On-chain cltv expiry delta On-chain cltv expiry delta
*/ */
int32 cltv_delta = 5; int32 cltv_delta = 5;
/*
The confirmation target to be used for the sweep of the on-chain HTLC.
*/
int32 conf_target = 6;
} }
message TokensRequest { message TokensRequest {

@ -466,6 +466,11 @@
"type": "integer", "type": "integer",
"format": "int32", "format": "int32",
"title": "On-chain cltv expiry delta" "title": "On-chain cltv expiry delta"
},
"conf_target": {
"type": "integer",
"format": "int32",
"description": "The confirmation target to be used to publish the on-chain HTLC."
} }
} }
}, },
@ -809,6 +814,11 @@
"type": "integer", "type": "integer",
"format": "int32", "format": "int32",
"title": "On-chain cltv expiry delta" "title": "On-chain cltv expiry delta"
},
"conf_target": {
"type": "integer",
"format": "int32",
"description": "The confirmation target to be used for the sweep of the on-chain HTLC."
} }
} }
}, },

@ -15,7 +15,11 @@ This file tracks release notes for the loop client.
## Next release ## Next release
#### New Features #### New Features
* A new flag, `--verbose`, or `-v`, is added to `loop in`, `loop out` and
`loop quote`. Responses from these commands are also updated to provide more
verbose info, giving users a more intuitive view about money paid
on/off-chain and fees incurred. Use `loop in -v`, `loop out -v`,
`loop quote in -v` or `loop quote out -v` to view the details.
#### Breaking Changes #### Breaking Changes

Loading…
Cancel
Save