Merge pull request #179 from carlaKC/loopin-addconftarget

loopin: allow user to configure confirmation target
pull/183/head
Carla Kirk-Cohen 4 years ago committed by GitHub
commit 97403b9c1e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

3
.gitignore vendored

@ -24,6 +24,9 @@ _testmain.go
*.test
*.prof
/loop-debug
/loopd-debug
output*.log
loop

@ -18,7 +18,7 @@ sudo: required
script:
- export GO111MODULE=on
- make lint unit
- make lint unit build
after_script:
- echo "Uploading to termbin.com..." && find *.log | xargs -I{} sh -c "cat {} | nc termbin.com 9999 | xargs -r0 printf '{} uploaded to %s'"

@ -3,6 +3,11 @@ PKG := github.com/lightninglabs/loop
GOTEST := GO111MODULE=on go test -v
GO_BIN := ${GOPATH}/bin
GOBUILD := GO111MODULE=on go build -v
GOINSTALL := GO111MODULE=on go install -v
COMMIT := $(shell git describe --abbrev=40 --dirty)
LDFLAGS := -ldflags "-X $(PKG)/build.Commit=$(COMMIT)"
GOFILES_NOVENDOR = $(shell find . -type f -name '*.go' -not -path "./vendor/*")
GOLIST := go list $(PKG)/... | grep -v '/vendor/'
@ -33,4 +38,18 @@ fmt:
lint: $(LINT_BIN)
@$(call print, "Linting source.")
$(LINT)
$(LINT)
# ============
# INSTALLATION
# ============
build:
@$(call print, "Building debug loop and loopd.")
$(GOBUILD) -o loop-debug $(LDFLAGS) $(PKG)/cmd/loop
$(GOBUILD) -o loopd-debug $(LDFLAGS) $(PKG)/cmd/loopd
install:
@$(call print, "Installing loop and loopd.")
$(GOINSTALL) $(LDFLAGS) $(PKG)/cmd/loop
$(GOINSTALL) $(LDFLAGS) $(PKG)/cmd/loopd

@ -195,8 +195,9 @@ DESCRIPTION:
Send the amount in satoshis specified by the amt argument off-chain.
OPTIONS:
--amt value the amount in satoshis to loop in (default: 0)
--external expect htlc to be published externally
--amt value the amount in satoshis to loop in (default: 0)
--external expect htlc to be published externally
--conf_target the confirmation target for the on chain htlc, if not being published externally
```
The `--external` argument allows the on-chain HTLC transacting to be published

@ -18,12 +18,29 @@ var (
Usage: "the pubkey of the last hop to use for this swap",
}
confTargetFlag = cli.Uint64Flag{
Name: "conf_target",
Usage: "the target number of blocks the on-chain " +
"htlc broadcast by the swap client should " +
"confirm within",
}
loopInCommand = cli.Command{
Name: "in",
Usage: "perform an on-chain to off-chain swap (loop in)",
ArgsUsage: "amt",
Description: `
Send the amount in satoshis specified by the amt argument off-chain.`,
Send the amount in satoshis specified by the amt argument
off-chain.
By default the swap client will create and broadcast the
on-chain htlc. The fee priority of this transaction can
optionally be set using the conf_target flag.
The external flag can be set to publish the on chain htlc
independently. Note that this flag cannot be set with the
conf_target flag.
`,
Flags: []cli.Flag{
cli.Uint64Flag{
Name: "amt",
@ -33,6 +50,7 @@ var (
Name: "external",
Usage: "expect htlc to be published externally",
},
confTargetFlag,
lastHopFlag,
},
Action: loopIn,
@ -66,10 +84,21 @@ func loopIn(ctx *cli.Context) error {
defer cleanup()
external := ctx.Bool("external")
htlcConfTarget := int32(ctx.Uint64(confTargetFlag.Name))
// External and confirmation target are mutually exclusive; either the
// on chain htlc is being externally broadcast, or we are creating the
// on chain htlc with a desired confirmation target. Fail if both are
// set.
if external && htlcConfTarget != 0 {
return fmt.Errorf("external and conf_target both set")
}
quote, err := client.GetLoopInQuote(
context.Background(),
&looprpc.QuoteRequest{
Amt: int64(amt),
ConfTarget: htlcConfTarget,
ExternalHtlc: external,
},
)
@ -96,10 +125,11 @@ func loopIn(ctx *cli.Context) error {
}
req := &looprpc.LoopInRequest{
Amt: int64(amt),
MaxMinerFee: int64(limits.maxMinerFee),
MaxSwapFee: int64(limits.maxSwapFee),
ExternalHtlc: external,
Amt: int64(amt),
MaxMinerFee: int64(limits.maxMinerFee),
MaxSwapFee: int64(limits.maxSwapFee),
ExternalHtlc: external,
HtlcConfTarget: htlcConfTarget,
}
if ctx.IsSet(lastHopFlag.Name) {

@ -22,16 +22,8 @@ var quoteInCommand = cli.Command{
Usage: "get a quote for the cost of a loop in swap",
ArgsUsage: "amt",
Description: "Allows to determine the cost of a swap up front",
Flags: []cli.Flag{
cli.Uint64Flag{
Name: "conf_target",
Usage: "the number of blocks from the swap " +
"initiation height that the on-chain HTLC " +
"should be swept within in a Loop Out",
Value: 6,
},
},
Action: quoteIn,
Flags: []cli.Flag{confTargetFlag},
Action: quoteIn,
}
func quoteIn(ctx *cli.Context) error {
@ -89,7 +81,7 @@ var quoteOutCommand = cli.Command{
Usage: "the number of blocks from the swap " +
"initiation height that the on-chain HTLC " +
"should be swept within in a Loop Out",
Value: 6,
Value: uint64(loop.DefaultSweepConfTarget),
},
cli.BoolFlag{
Name: "fast",

@ -14,10 +14,7 @@ import (
"github.com/lightningnetwork/lnd/build"
)
const (
defaultConfTarget = int32(6)
defaultConfigFilename = "loopd.conf"
)
const defaultConfigFilename = "loopd.conf"
// RPCConfig holds optional options that can be used to make the loop daemon
// communicate on custom connections.

@ -361,9 +361,16 @@ func (s *swapClientServer) GetLoopInQuote(ctx context.Context,
log.Infof("Loop in quote request received")
htlcConfTarget, err := validateLoopInRequest(
req.ConfTarget, req.ExternalHtlc,
)
if err != nil {
return nil, err
}
quote, err := s.impl.LoopInQuote(ctx, &loop.LoopInQuoteRequest{
Amount: btcutil.Amount(req.Amt),
HtlcConfTarget: defaultConfTarget,
HtlcConfTarget: htlcConfTarget,
ExternalHtlc: req.ExternalHtlc,
})
if err != nil {
@ -381,11 +388,18 @@ func (s *swapClientServer) LoopIn(ctx context.Context,
log.Infof("Loop in request received")
htlcConfTarget, err := validateLoopInRequest(
in.HtlcConfTarget, in.ExternalHtlc,
)
if err != nil {
return nil, err
}
req := &loop.LoopInRequest{
Amount: btcutil.Amount(in.Amt),
MaxMinerFee: btcutil.Amount(in.MaxMinerFee),
MaxSwapFee: btcutil.Amount(in.MaxSwapFee),
HtlcConfTarget: defaultConfTarget,
HtlcConfTarget: htlcConfTarget,
ExternalHtlc: in.ExternalHtlc,
}
if in.LastHop != nil {
@ -477,6 +491,9 @@ func (s *swapClientServer) processStatusUpdates(mainCtx context.Context) {
// isn't specified (0 value), then the default target is used.
func validateConfTarget(target, defaultTarget int32) (int32, error) {
switch {
case target == 0:
return defaultTarget, nil
// Ensure the target respects our minimum threshold.
case target < minConfTarget:
return 0, fmt.Errorf("a confirmation target of at least %v "+
@ -486,3 +503,22 @@ func validateConfTarget(target, defaultTarget int32) (int32, error) {
return target, nil
}
}
// validateLoopInRequest fails if the mutually exclusive conf target and
// external parameters are both set.
func validateLoopInRequest(htlcConfTarget int32, external bool) (int32, error) {
// If the htlc is going to be externally set, the htlcConfTarget should
// not be set, because it has no relevance when the htlc is external.
if external && htlcConfTarget != 0 {
return 0, errors.New("external and htlc conf target cannot " +
"both be set")
}
// If the htlc is being externally published, we do not need to set a
// confirmation target.
if external {
return 0, nil
}
return validateConfTarget(htlcConfTarget, loop.DefaultHtlcConfTarget)
}

@ -0,0 +1,145 @@
package loopd
import (
"testing"
"github.com/lightninglabs/loop"
)
// TestValidateConfTarget tests all failure and success cases for our conf
// target validation function, including the case where we replace a zero
// target with the default provided.
func TestValidateConfTarget(t *testing.T) {
const (
// Various input confirmation values for tests.
zeroConf int32 = 0
oneConf int32 = 1
twoConf int32 = 2
fiveConf int32 = 5
// defaultConf is the default confirmation target we use for
// all tests.
defaultConf = 6
)
tests := []struct {
name string
confTarget int32
expectedTarget int32
expectErr bool
}{
{
name: "zero conf, get default",
confTarget: zeroConf,
expectedTarget: defaultConf,
expectErr: false,
},
{
name: "one conf, get error",
confTarget: oneConf,
expectErr: true,
},
{
name: "two conf, ok",
confTarget: twoConf,
expectedTarget: twoConf,
expectErr: false,
},
{
name: "five conf, ok",
confTarget: fiveConf,
expectedTarget: fiveConf,
expectErr: false,
},
}
for _, test := range tests {
test := test
t.Run(test.name, func(t *testing.T) {
target, err := validateConfTarget(
test.confTarget, defaultConf,
)
haveErr := err != nil
if haveErr != test.expectErr {
t.Fatalf("expected err: %v, got: %v",
test.expectErr, err)
}
if target != test.expectedTarget {
t.Fatalf("expected: %v, got: %v",
test.expectedTarget, target)
}
})
}
}
// TestValidateLoopInRequest tests validation of loop in requests.
func TestValidateLoopInRequest(t *testing.T) {
tests := []struct {
name string
external bool
confTarget int32
expectErr bool
expectedTarget int32
}{
{
name: "external and htlc conf set",
external: true,
confTarget: 1,
expectErr: true,
expectedTarget: 0,
},
{
name: "external and no conf",
external: true,
confTarget: 0,
expectErr: false,
expectedTarget: 0,
},
{
name: "not external, zero conf",
external: false,
confTarget: 0,
expectErr: false,
expectedTarget: loop.DefaultHtlcConfTarget,
},
{
name: "not external, bad conf",
external: false,
confTarget: 1,
expectErr: true,
expectedTarget: 0,
},
{
name: "not external, ok conf",
external: false,
confTarget: 5,
expectErr: false,
expectedTarget: 5,
},
}
for _, test := range tests {
test := test
t.Run(test.name, func(t *testing.T) {
external := test.external
conf, err := validateLoopInRequest(
test.confTarget, external,
)
haveErr := err != nil
if haveErr != test.expectErr {
t.Fatalf("expected err: %v, got: %v",
test.expectErr, err)
}
if conf != test.expectedTarget {
t.Fatalf("expected: %v, got: %v",
test.expectedTarget, conf)
}
})
}
}

@ -26,6 +26,10 @@ var (
// when sweeping on-chain HTLCs.
DefaultSweepConfTarget int32 = 6
// DefaultHtlcConfTarget is the default confirmation target we'll use
// for on-chain htlcs published by the swap client for Loop In.
DefaultHtlcConfTarget int32 = 6
// DefaultSweepConfTargetDelta is the delta of blocks from a Loop Out
// swap's expiration height at which we begin to use the default sweep
// confirmation target.

@ -291,7 +291,10 @@ type LoopInRequest struct {
//*
//If external_htlc is true, we expect the htlc to be published by an external
//actor.
ExternalHtlc bool `protobuf:"varint,5,opt,name=external_htlc,json=externalHtlc,proto3" json:"external_htlc,omitempty"`
ExternalHtlc bool `protobuf:"varint,5,opt,name=external_htlc,json=externalHtlc,proto3" json:"external_htlc,omitempty"`
//*
//The number of blocks that the on chain htlc should confirm within.
HtlcConfTarget int32 `protobuf:"varint,6,opt,name=htlc_conf_target,json=htlcConfTarget,proto3" json:"htlc_conf_target,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -357,6 +360,13 @@ func (m *LoopInRequest) GetExternalHtlc() bool {
return false
}
func (m *LoopInRequest) GetHtlcConfTarget() int32 {
if m != nil {
return m.HtlcConfTarget
}
return 0
}
type SwapResponse struct {
//*
//Swap identifier to track status in the update stream that is returned from
@ -1170,97 +1180,98 @@ func init() {
func init() { proto.RegisterFile("client.proto", fileDescriptor_014de31d7ac8c57c) }
var fileDescriptor_014de31d7ac8c57c = []byte{
// 1435 bytes of a gzipped FileDescriptorProto
// 1448 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xcb, 0x6e, 0xdb, 0x46,
0x14, 0x0d, 0x25, 0xd9, 0x92, 0xae, 0x28, 0x8a, 0x1e, 0x27, 0xb6, 0xac, 0x36, 0x88, 0xc3, 0x36,
0xad, 0xe3, 0x45, 0xd4, 0x38, 0xab, 0x06, 0x45, 0x01, 0x47, 0x56, 0x62, 0x19, 0x7e, 0x95, 0x92,
0x03, 0x24, 0x1b, 0x66, 0x2c, 0x8e, 0x2d, 0xa2, 0x22, 0x87, 0xe1, 0x8c, 0x12, 0x1b, 0x41, 0x36,
0xfd, 0x85, 0xee, 0xba, 0xec, 0xa6, 0xeb, 0xae, 0xfb, 0x19, 0xfd, 0x85, 0x7e, 0x42, 0xb7, 0x05,
0x8a, 0x79, 0x88, 0x22, 0x2d, 0x3b, 0x8b, 0xec, 0xc4, 0x33, 0x67, 0xce, 0x5c, 0xde, 0xc7, 0x19,
0x0a, 0xcc, 0xe1, 0x38, 0x20, 0x11, 0x7f, 0x14, 0x27, 0x94, 0x53, 0x54, 0x1e, 0x53, 0x1a, 0x27,
0xf1, 0xb0, 0xf5, 0xe5, 0x39, 0xa5, 0xe7, 0x63, 0xd2, 0xc6, 0x71, 0xd0, 0xc6, 0x51, 0x44, 0x39,
0xe6, 0x01, 0x8d, 0x98, 0xa2, 0x39, 0xbf, 0x15, 0xc1, 0xda, 0xa7, 0x34, 0x3e, 0x9a, 0x70, 0x97,
0xbc, 0x9d, 0x10, 0xc6, 0x91, 0x0d, 0x45, 0x1c, 0xf2, 0xa6, 0xb1, 0x6e, 0x6c, 0x14, 0x5d, 0xf1,
0x13, 0x21, 0x28, 0xf9, 0x84, 0xf1, 0x66, 0x61, 0xdd, 0xd8, 0xa8, 0xba, 0xf2, 0x37, 0x6a, 0xc3,
0xed, 0x10, 0x5f, 0x78, 0xec, 0x3d, 0x8e, 0xbd, 0x84, 0x4e, 0x78, 0x10, 0x9d, 0x7b, 0x67, 0x84,
0x34, 0x8b, 0x72, 0xdb, 0x52, 0x88, 0x2f, 0xfa, 0xef, 0x71, 0xec, 0xaa, 0x95, 0xe7, 0x84, 0xa0,
0x27, 0xb0, 0x22, 0x36, 0xc4, 0x09, 0x89, 0xf1, 0x65, 0x6e, 0x4b, 0x49, 0x6e, 0x59, 0x0e, 0xf1,
0xc5, 0xb1, 0x5c, 0xcc, 0x6c, 0x5a, 0x07, 0x33, 0x3d, 0x45, 0x50, 0x17, 0x24, 0x15, 0xb4, 0xba,
0x60, 0x7c, 0x0d, 0x56, 0x46, 0x56, 0x04, 0xbe, 0x28, 0x39, 0x66, 0x2a, 0xb7, 0x1d, 0x72, 0xe4,
0x40, 0x5d, 0xb0, 0xc2, 0x20, 0x22, 0x89, 0x14, 0x2a, 0x4b, 0x52, 0x2d, 0xc4, 0x17, 0x07, 0x02,
0x13, 0x4a, 0x1b, 0x60, 0x8b, 0x9c, 0x79, 0x74, 0xc2, 0xbd, 0xe1, 0x08, 0x47, 0x11, 0x19, 0x37,
0x2b, 0xeb, 0xc6, 0x46, 0xc9, 0xb5, 0xc6, 0x2a, 0x43, 0x1d, 0x85, 0xa2, 0x4d, 0x58, 0x62, 0xef,
0x09, 0x89, 0xbd, 0x21, 0x8d, 0xce, 0x3c, 0x8e, 0x93, 0x73, 0xc2, 0x9b, 0xd5, 0x75, 0x63, 0x63,
0xc1, 0x6d, 0xc8, 0x85, 0x0e, 0x8d, 0xce, 0x06, 0x12, 0x46, 0x4f, 0x61, 0x4d, 0x46, 0x1f, 0x4f,
0x4e, 0xc7, 0xc1, 0x50, 0xe6, 0xde, 0xf3, 0x09, 0xf6, 0xc7, 0x41, 0x44, 0x9a, 0x20, 0xe5, 0x57,
0x05, 0xe1, 0x78, 0xb6, 0xbe, 0xa3, 0x97, 0x9d, 0x3f, 0x0c, 0xa8, 0x8b, 0xe2, 0xf4, 0xa2, 0x9b,
0x6b, 0x73, 0x35, 0x43, 0x85, 0xb9, 0x0c, 0xcd, 0xbd, 0x7b, 0x71, 0xfe, 0xdd, 0xd7, 0xa0, 0x32,
0xc6, 0x8c, 0x7b, 0x23, 0x1a, 0xcb, 0x72, 0x98, 0x6e, 0x59, 0x3c, 0xef, 0xd2, 0x18, 0x7d, 0x05,
0x75, 0x72, 0xc1, 0x49, 0x12, 0xe1, 0xb1, 0x37, 0xe2, 0xe3, 0xa1, 0xac, 0x41, 0xc5, 0x35, 0xa7,
0xe0, 0x2e, 0x1f, 0x0f, 0x9d, 0x37, 0x60, 0xca, 0x72, 0x13, 0x16, 0xd3, 0x88, 0x11, 0x84, 0xa0,
0x10, 0xf8, 0x32, 0xcc, 0xea, 0xb3, 0x42, 0xd3, 0x70, 0x0b, 0x81, 0x2f, 0xce, 0x08, 0x7c, 0xef,
0xf4, 0x92, 0x13, 0x26, 0x43, 0x30, 0xdd, 0x72, 0xe0, 0x3f, 0x13, 0x8f, 0xe8, 0x3e, 0x98, 0x42,
0xda, 0xc3, 0xbe, 0x9f, 0x10, 0xc6, 0x74, 0xa3, 0xd5, 0x04, 0xb6, 0xad, 0x20, 0xc7, 0x06, 0xeb,
0x80, 0x46, 0x01, 0xa7, 0x89, 0xce, 0x85, 0xf3, 0x5f, 0x01, 0x40, 0x1c, 0xda, 0xe7, 0x98, 0x4f,
0xd8, 0xb5, 0x6d, 0x2b, 0x82, 0x28, 0xdc, 0x18, 0x44, 0x2d, 0x1f, 0xc4, 0x03, 0x28, 0xf1, 0xcb,
0x58, 0xa5, 0xc7, 0xda, 0x5a, 0x7a, 0xa4, 0x07, 0xe8, 0x91, 0x38, 0x63, 0x70, 0x19, 0x13, 0x57,
0x2e, 0xa3, 0x0d, 0x58, 0x60, 0x1c, 0x73, 0xd5, 0xb6, 0xd6, 0x16, 0xca, 0xf1, 0x44, 0x2c, 0xc4,
0x55, 0x04, 0xf4, 0x2d, 0x34, 0x82, 0x28, 0xe0, 0x81, 0x2a, 0x3a, 0x0f, 0xc2, 0x69, 0xff, 0x5a,
0x33, 0x78, 0x10, 0x84, 0xaa, 0xf3, 0x44, 0xf6, 0x27, 0xb1, 0x8f, 0x39, 0x51, 0x4c, 0xd5, 0xc5,
0x96, 0xc0, 0x4f, 0x24, 0x2c, 0x99, 0x57, 0x13, 0x55, 0x9e, 0x4b, 0x14, 0xba, 0x07, 0xb5, 0x21,
0x65, 0xdc, 0x63, 0x24, 0x79, 0x47, 0x12, 0xd9, 0xc1, 0x45, 0x17, 0x04, 0xd4, 0x97, 0x88, 0xd0,
0x90, 0x04, 0x1a, 0x0d, 0x47, 0x38, 0x88, 0x64, 0xe3, 0x16, 0x5d, 0xb9, 0xe9, 0x48, 0x41, 0xa2,
0xe6, 0x8a, 0x72, 0x76, 0xa6, 0x38, 0xa0, 0x66, 0x4a, 0x72, 0x34, 0xe6, 0x20, 0xb0, 0xf7, 0x03,
0xc6, 0xc5, 0x6b, 0xb3, 0x69, 0x4d, 0x7e, 0x84, 0xa5, 0x0c, 0xa6, 0x9b, 0xe1, 0x21, 0x2c, 0x88,
0xf6, 0x64, 0x4d, 0x63, 0xbd, 0xb8, 0x51, 0xdb, 0x5a, 0x9e, 0xcb, 0xd8, 0x84, 0xb9, 0x8a, 0xe1,
0xdc, 0x87, 0x86, 0x00, 0x7b, 0xd1, 0x19, 0x9d, 0xb6, 0xbc, 0x95, 0xb6, 0x92, 0x29, 0x2a, 0xe8,
0x58, 0x60, 0x0e, 0x48, 0x12, 0xa6, 0x47, 0x7e, 0x84, 0xba, 0x7e, 0xd6, 0xc7, 0x7d, 0x03, 0x8d,
0x30, 0x88, 0xd4, 0x44, 0xe0, 0x90, 0x4e, 0x22, 0xae, 0xd3, 0x5e, 0x0f, 0x83, 0x48, 0xa8, 0x6f,
0x4b, 0x50, 0xf2, 0xa6, 0x93, 0xa3, 0x79, 0x8b, 0x9a, 0xa7, 0x86, 0x47, 0xf1, 0xf6, 0x4a, 0x15,
0xc3, 0x2e, 0xec, 0x95, 0x2a, 0x05, 0xbb, 0xb8, 0x57, 0xaa, 0x14, 0xed, 0xd2, 0x5e, 0xa9, 0x52,
0xb2, 0x17, 0xf6, 0x4a, 0x95, 0xb2, 0x5d, 0x71, 0x7e, 0x37, 0xc0, 0xfc, 0x69, 0x42, 0x39, 0xb9,
0x79, 0x44, 0x65, 0x45, 0x66, 0x46, 0x51, 0x90, 0x46, 0x01, 0xc3, 0x99, 0x47, 0xcc, 0x8d, 0x58,
0x71, 0x7e, 0xc4, 0x3e, 0x6d, 0x24, 0xa5, 0x4f, 0x1b, 0xc9, 0x9f, 0x06, 0xd4, 0x75, 0x90, 0x3a,
0x49, 0x6b, 0x50, 0x49, 0x2d, 0x43, 0x85, 0x5a, 0x66, 0xda, 0x2f, 0xee, 0x02, 0x64, 0xdc, 0x54,
0xf9, 0x49, 0x35, 0x4e, 0xad, 0xf4, 0x0b, 0xa8, 0x5e, 0xb5, 0x92, 0x4a, 0x38, 0xf5, 0x11, 0xe9,
0x8c, 0x22, 0x48, 0x7c, 0x19, 0x92, 0x88, 0x7b, 0xf2, 0xda, 0x50, 0x86, 0xd2, 0x90, 0xc1, 0x29,
0x7c, 0x47, 0x24, 0xea, 0x2e, 0xc0, 0x70, 0xcc, 0xdf, 0x79, 0x3e, 0x19, 0x73, 0x2c, 0x4b, 0xb4,
0xe0, 0x56, 0x05, 0xb2, 0x23, 0x00, 0xa7, 0x01, 0xf5, 0x01, 0xfd, 0x99, 0x44, 0x69, 0xa1, 0x7f,
0x00, 0x6b, 0x0a, 0xe8, 0x97, 0xd8, 0x84, 0x45, 0x2e, 0x11, 0xdd, 0x59, 0xb3, 0x59, 0xdc, 0x67,
0x98, 0x4b, 0xb2, 0xab, 0x19, 0xce, 0x5f, 0x05, 0xa8, 0xa6, 0xa8, 0xc8, 0xf8, 0x29, 0x66, 0xc4,
0x0b, 0xf1, 0x10, 0x27, 0x94, 0x46, 0xba, 0xbf, 0x4c, 0x01, 0x1e, 0x68, 0x4c, 0x0c, 0xca, 0xf4,
0x3d, 0x46, 0x98, 0x8d, 0x64, 0x2a, 0x4c, 0xb7, 0xa6, 0xb1, 0x5d, 0xcc, 0x46, 0xe8, 0x21, 0xd8,
0x53, 0x4a, 0x9c, 0x90, 0x20, 0xc4, 0xe7, 0x44, 0x7b, 0x5b, 0x43, 0xe3, 0xc7, 0x1a, 0x16, 0x43,
0xae, 0xba, 0xcc, 0x8b, 0x71, 0xe0, 0x7b, 0x21, 0xc3, 0x5c, 0xdf, 0x7c, 0x96, 0xc2, 0x8f, 0x71,
0xe0, 0x1f, 0x30, 0xcc, 0xd1, 0x63, 0xb8, 0x93, 0xb9, 0x1e, 0x33, 0x74, 0xd5, 0xc6, 0x28, 0x49,
0xef, 0xc7, 0x74, 0xcb, 0x7d, 0x30, 0x85, 0x6b, 0x78, 0xc3, 0x84, 0x60, 0x4e, 0x7c, 0xdd, 0xc8,
0x35, 0x81, 0x75, 0x14, 0x84, 0x9a, 0x50, 0x26, 0x17, 0x71, 0x90, 0x10, 0x5f, 0xba, 0x46, 0xc5,
0x9d, 0x3e, 0x8a, 0xcd, 0x8c, 0xd3, 0x04, 0x9f, 0x13, 0x2f, 0xc2, 0x21, 0x91, 0x96, 0x51, 0x75,
0x6b, 0x1a, 0x3b, 0xc4, 0x21, 0xd9, 0x7c, 0x00, 0x95, 0xa9, 0x0d, 0x22, 0x13, 0x2a, 0xfb, 0x47,
0x47, 0xc7, 0xde, 0xd1, 0xc9, 0xc0, 0xbe, 0x85, 0x6a, 0x50, 0x96, 0x4f, 0xbd, 0x43, 0xdb, 0xd8,
0x64, 0x50, 0x4d, 0x5d, 0x10, 0xd5, 0xa1, 0xda, 0x3b, 0xec, 0x0d, 0x7a, 0xdb, 0x83, 0xee, 0x8e,
0x7d, 0x0b, 0xdd, 0x81, 0xa5, 0x63, 0xb7, 0xdb, 0x3b, 0xd8, 0x7e, 0xd1, 0xf5, 0xdc, 0xee, 0xcb,
0xee, 0xf6, 0x7e, 0x77, 0xc7, 0x36, 0x10, 0x02, 0x6b, 0x77, 0xb0, 0xdf, 0xf1, 0x8e, 0x4f, 0x9e,
0xed, 0xf7, 0xfa, 0xbb, 0xdd, 0x1d, 0xbb, 0x20, 0x34, 0xfb, 0x27, 0x9d, 0x4e, 0xb7, 0xdf, 0xb7,
0x8b, 0x08, 0x60, 0xf1, 0xf9, 0x76, 0x4f, 0x90, 0x4b, 0x68, 0x19, 0x1a, 0xbd, 0xc3, 0x97, 0x47,
0xbd, 0x4e, 0xd7, 0xeb, 0x77, 0x07, 0x03, 0x01, 0x2e, 0x6c, 0xfd, 0xbb, 0xa8, 0xee, 0x81, 0x8e,
0xfc, 0xfc, 0x41, 0x2e, 0x94, 0xf5, 0x07, 0x0d, 0x5a, 0x9d, 0xf5, 0x43, 0xee, 0x13, 0xa7, 0x75,
0x27, 0x67, 0x41, 0xd3, 0x7e, 0x72, 0x56, 0x7f, 0xf9, 0xfb, 0x9f, 0x5f, 0x0b, 0x4b, 0x8e, 0xd9,
0x7e, 0xf7, 0xb8, 0x2d, 0x18, 0x6d, 0x3a, 0xe1, 0x4f, 0x8d, 0x4d, 0x74, 0x04, 0x8b, 0xea, 0x1e,
0x46, 0x2b, 0x39, 0xc9, 0xf4, 0x62, 0xbe, 0x49, 0x71, 0x45, 0x2a, 0xda, 0x4e, 0x2d, 0x55, 0x0c,
0x22, 0x21, 0xf8, 0x3d, 0x94, 0xf5, 0x6d, 0x96, 0x09, 0x32, 0x7f, 0xbf, 0xb5, 0xae, 0xf3, 0xc9,
0xef, 0x0c, 0xf4, 0x1a, 0xaa, 0xa9, 0xc5, 0xa2, 0xb5, 0x59, 0x38, 0x57, 0xac, 0xb8, 0xd5, 0xba,
0x6e, 0x29, 0x1f, 0x16, 0xb2, 0xd2, 0xb0, 0xa4, 0xfd, 0xa2, 0x13, 0x55, 0x66, 0x61, 0xbf, 0xa8,
0x99, 0x3b, 0x3e, 0xe3, 0xc8, 0xd7, 0x06, 0xe6, 0xb4, 0xa4, 0xe4, 0x6d, 0x84, 0x72, 0x92, 0xed,
0x0f, 0x81, 0xff, 0x11, 0xbd, 0x02, 0x53, 0x17, 0x40, 0x3a, 0x35, 0x9a, 0x25, 0x2b, 0xeb, 0xe4,
0xad, 0x95, 0xab, 0xb0, 0x8e, 0x76, 0x5e, 0x9a, 0x4e, 0x78, 0x9b, 0x4b, 0x29, 0x2f, 0x95, 0x96,
0xfe, 0x96, 0x91, 0xce, 0x9a, 0x72, 0x46, 0x3a, 0x67, 0x83, 0xce, 0xba, 0x94, 0x6e, 0xa1, 0x66,
0x4e, 0xfa, 0xad, 0xe0, 0xb4, 0x3f, 0xe0, 0x90, 0x7f, 0x44, 0xaf, 0xc1, 0x7a, 0x41, 0xb8, 0x2a,
0xf6, 0x67, 0x45, 0xbf, 0x26, 0x8f, 0x58, 0x46, 0x4b, 0x99, 0x16, 0xd0, 0xc1, 0xbf, 0xc9, 0x68,
0x7f, 0x56, 0xf8, 0xf7, 0xa4, 0xf6, 0x1a, 0x5a, 0xcd, 0x6a, 0x67, 0xa3, 0x7f, 0x05, 0x75, 0x71,
0xc2, 0xd4, 0xf7, 0x58, 0xa6, 0x7f, 0x73, 0xe6, 0xda, 0x5a, 0x9d, 0xc3, 0xf3, 0x33, 0x81, 0x1a,
0xf2, 0x08, 0x86, 0x79, 0x5b, 0x19, 0xea, 0xe9, 0xa2, 0xfc, 0x03, 0xf1, 0xe4, 0xff, 0x00, 0x00,
0x00, 0xff, 0xff, 0x47, 0xdd, 0x3b, 0x05, 0x77, 0x0c, 0x00, 0x00,
0x14, 0x0d, 0x25, 0x59, 0x8f, 0x2b, 0x8a, 0xa2, 0xc7, 0x89, 0x2d, 0xab, 0x0d, 0xe2, 0xb0, 0x4d,
0xeb, 0x78, 0x11, 0x35, 0xce, 0xaa, 0x41, 0x51, 0xc0, 0x91, 0x95, 0x58, 0x86, 0x5f, 0xa5, 0xe4,
0x00, 0xc9, 0x86, 0x19, 0x8b, 0x63, 0x9b, 0xa8, 0xc8, 0x61, 0x38, 0xa3, 0xc4, 0x46, 0x90, 0x4d,
0x7f, 0xa1, 0xbb, 0x2e, 0xfb, 0x07, 0x5d, 0xf7, 0x2b, 0x8a, 0xfe, 0x42, 0x3f, 0xa1, 0xdb, 0x02,
0xc5, 0x3c, 0x44, 0x91, 0x96, 0x9d, 0x45, 0x76, 0xe6, 0x99, 0x33, 0x67, 0xee, 0xdc, 0xc7, 0x19,
0x19, 0xcc, 0xd1, 0x38, 0x20, 0x11, 0x7f, 0x14, 0x27, 0x94, 0x53, 0x54, 0x19, 0x53, 0x1a, 0x27,
0xf1, 0xa8, 0xfd, 0xe5, 0x19, 0xa5, 0x67, 0x63, 0xd2, 0xc1, 0x71, 0xd0, 0xc1, 0x51, 0x44, 0x39,
0xe6, 0x01, 0x8d, 0x98, 0xa2, 0x39, 0xbf, 0x15, 0xc1, 0xda, 0xa3, 0x34, 0x3e, 0x9c, 0x70, 0x97,
0xbc, 0x9d, 0x10, 0xc6, 0x91, 0x0d, 0x45, 0x1c, 0xf2, 0x96, 0xb1, 0x66, 0xac, 0x17, 0x5d, 0xf1,
0x27, 0x42, 0x50, 0xf2, 0x09, 0xe3, 0xad, 0xc2, 0x9a, 0xb1, 0x5e, 0x73, 0xe5, 0xdf, 0xa8, 0x03,
0xb7, 0x43, 0x7c, 0xe1, 0xb1, 0xf7, 0x38, 0xf6, 0x12, 0x3a, 0xe1, 0x41, 0x74, 0xe6, 0x9d, 0x12,
0xd2, 0x2a, 0xca, 0x6d, 0x8b, 0x21, 0xbe, 0x18, 0xbc, 0xc7, 0xb1, 0xab, 0x56, 0x9e, 0x13, 0x82,
0x9e, 0xc0, 0xb2, 0xd8, 0x10, 0x27, 0x24, 0xc6, 0x97, 0xb9, 0x2d, 0x25, 0xb9, 0x65, 0x29, 0xc4,
0x17, 0x47, 0x72, 0x31, 0xb3, 0x69, 0x0d, 0xcc, 0xf4, 0x14, 0x41, 0x5d, 0x90, 0x54, 0xd0, 0xea,
0x82, 0xf1, 0x35, 0x58, 0x19, 0x59, 0x11, 0x78, 0x59, 0x72, 0xcc, 0x54, 0x6e, 0x2b, 0xe4, 0xc8,
0x81, 0x86, 0x60, 0x85, 0x41, 0x44, 0x12, 0x29, 0x54, 0x91, 0xa4, 0x7a, 0x88, 0x2f, 0xf6, 0x05,
0x26, 0x94, 0xd6, 0xc1, 0x16, 0x39, 0xf3, 0xe8, 0x84, 0x7b, 0xa3, 0x73, 0x1c, 0x45, 0x64, 0xdc,
0xaa, 0xae, 0x19, 0xeb, 0x25, 0xd7, 0x1a, 0xab, 0x0c, 0x75, 0x15, 0x8a, 0x36, 0x60, 0x91, 0xbd,
0x27, 0x24, 0xf6, 0x46, 0x34, 0x3a, 0xf5, 0x38, 0x4e, 0xce, 0x08, 0x6f, 0xd5, 0xd6, 0x8c, 0xf5,
0x05, 0xb7, 0x29, 0x17, 0xba, 0x34, 0x3a, 0x1d, 0x4a, 0x18, 0x3d, 0x85, 0x55, 0x19, 0x7d, 0x3c,
0x39, 0x19, 0x07, 0x23, 0x99, 0x7b, 0xcf, 0x27, 0xd8, 0x1f, 0x07, 0x11, 0x69, 0x81, 0x94, 0x5f,
0x11, 0x84, 0xa3, 0xd9, 0xfa, 0xb6, 0x5e, 0x76, 0xfe, 0x32, 0xa0, 0x21, 0x8a, 0xd3, 0x8f, 0x6e,
0xae, 0xcd, 0xd5, 0x0c, 0x15, 0xe6, 0x32, 0x34, 0x77, 0xf7, 0xe2, 0xfc, 0xdd, 0x57, 0xa1, 0x3a,
0xc6, 0x8c, 0x7b, 0xe7, 0x34, 0x96, 0xe5, 0x30, 0xdd, 0x8a, 0xf8, 0xde, 0xa1, 0x31, 0xfa, 0x0a,
0x1a, 0xe4, 0x82, 0x93, 0x24, 0xc2, 0x63, 0xef, 0x9c, 0x8f, 0x47, 0xb2, 0x06, 0x55, 0xd7, 0x9c,
0x82, 0x3b, 0x7c, 0x3c, 0x12, 0xb9, 0x13, 0x6b, 0xb9, 0x84, 0x94, 0x65, 0x42, 0x2c, 0x81, 0xcf,
0xf2, 0xe1, 0xbc, 0x01, 0x53, 0x36, 0x06, 0x61, 0x31, 0x8d, 0x18, 0x41, 0x08, 0x0a, 0x81, 0x2f,
0x2f, 0x54, 0x7b, 0x56, 0x68, 0x19, 0x6e, 0x21, 0xf0, 0x45, 0x34, 0x81, 0xef, 0x9d, 0x5c, 0x72,
0xc2, 0x64, 0xb0, 0xa6, 0x5b, 0x09, 0xfc, 0x67, 0xe2, 0x13, 0xdd, 0x07, 0x53, 0x1e, 0x84, 0x7d,
0x3f, 0x21, 0x8c, 0xe9, 0x96, 0xac, 0x0b, 0x6c, 0x4b, 0x41, 0x8e, 0x0d, 0xd6, 0x3e, 0x8d, 0x02,
0x4e, 0x13, 0x9d, 0x35, 0xe7, 0xbf, 0x02, 0x80, 0x38, 0x74, 0xc0, 0x31, 0x9f, 0xb0, 0x6b, 0x1b,
0x5c, 0x04, 0x51, 0xb8, 0x31, 0x88, 0x7a, 0x3e, 0x88, 0x07, 0x50, 0xe2, 0x97, 0xb1, 0x4a, 0xa4,
0xb5, 0xb9, 0xf8, 0x48, 0x8f, 0xda, 0x23, 0x71, 0xc6, 0xf0, 0x32, 0x26, 0xae, 0x5c, 0x46, 0xeb,
0xb0, 0xc0, 0x38, 0xe6, 0xaa, 0xc1, 0xad, 0x4d, 0x94, 0xe3, 0x89, 0x58, 0x88, 0xab, 0x08, 0xe8,
0x5b, 0x68, 0x06, 0x51, 0xc0, 0x03, 0xd5, 0x1e, 0x3c, 0x08, 0xa7, 0x9d, 0x6e, 0xcd, 0xe0, 0x61,
0x10, 0xaa, 0x1e, 0x15, 0x75, 0x9a, 0xc4, 0x3e, 0xe6, 0x44, 0x31, 0x55, 0xbf, 0x5b, 0x02, 0x3f,
0x96, 0xb0, 0x64, 0x5e, 0x4d, 0x54, 0x65, 0x2e, 0x51, 0xe8, 0x1e, 0xd4, 0x47, 0x94, 0x71, 0x8f,
0x91, 0xe4, 0x1d, 0x49, 0x64, 0xaf, 0x17, 0x5d, 0x10, 0xd0, 0x40, 0x22, 0x42, 0x43, 0x12, 0x68,
0x34, 0x3a, 0xc7, 0x41, 0x24, 0x5b, 0xbc, 0xe8, 0xca, 0x4d, 0x87, 0x0a, 0x12, 0xdd, 0xa1, 0x28,
0xa7, 0xa7, 0x8a, 0x03, 0x6a, 0xfa, 0x24, 0x47, 0x63, 0x0e, 0x02, 0x7b, 0x2f, 0x60, 0x5c, 0x5c,
0x9b, 0x4d, 0x6b, 0xf2, 0x23, 0x2c, 0x66, 0x30, 0xdd, 0x0c, 0x0f, 0x61, 0x41, 0x34, 0x32, 0x6b,
0x19, 0x6b, 0xc5, 0xf5, 0xfa, 0xe6, 0xd2, 0x5c, 0xc6, 0x26, 0xcc, 0x55, 0x0c, 0xe7, 0x3e, 0x34,
0x05, 0xd8, 0x8f, 0x4e, 0xe9, 0x74, 0x38, 0xac, 0xb4, 0x95, 0x4c, 0x51, 0x41, 0xc7, 0x02, 0x73,
0x48, 0x92, 0x30, 0x3d, 0xf2, 0x23, 0x34, 0xf4, 0xb7, 0x3e, 0xee, 0x1b, 0x68, 0x86, 0x41, 0xa4,
0x66, 0x07, 0x87, 0x74, 0x12, 0x71, 0x9d, 0xf6, 0x46, 0x18, 0x44, 0x42, 0x7d, 0x4b, 0x82, 0x92,
0x37, 0x9d, 0x31, 0xcd, 0x2b, 0x6b, 0x9e, 0x1a, 0x33, 0xc5, 0xdb, 0x2d, 0x55, 0x0d, 0xbb, 0xb0,
0x5b, 0xaa, 0x16, 0xec, 0xe2, 0x6e, 0xa9, 0x5a, 0xb4, 0x4b, 0xbb, 0xa5, 0x6a, 0xc9, 0x5e, 0xd8,
0x2d, 0x55, 0x2b, 0x76, 0xd5, 0xf9, 0xdd, 0x00, 0xf3, 0xa7, 0x09, 0xe5, 0xe4, 0xe6, 0x61, 0x96,
0x15, 0x99, 0x4d, 0x50, 0x41, 0x4e, 0x10, 0x8c, 0x66, 0x6e, 0x32, 0x37, 0x8c, 0xc5, 0x6b, 0x86,
0xf1, 0x93, 0x96, 0x53, 0xfa, 0xb4, 0xe5, 0xfc, 0x61, 0x40, 0x43, 0x07, 0xa9, 0x93, 0xb4, 0x0a,
0xd5, 0xd4, 0x5c, 0x54, 0xa8, 0x15, 0xa6, 0x9d, 0xe5, 0x2e, 0x40, 0xc6, 0x77, 0x95, 0xf3, 0xd4,
0xe2, 0xd4, 0x74, 0xbf, 0x80, 0xda, 0x55, 0xd3, 0xa9, 0x86, 0x53, 0xc7, 0x91, 0x1e, 0x2a, 0x82,
0xc4, 0x97, 0x21, 0x89, 0xb8, 0x27, 0x1f, 0x18, 0x65, 0x3d, 0x4d, 0x19, 0x9c, 0xc2, 0xb7, 0x45,
0xa2, 0xee, 0x02, 0x8c, 0xc6, 0xfc, 0x9d, 0xe7, 0x93, 0x31, 0xc7, 0xb2, 0x44, 0x0b, 0x6e, 0x4d,
0x20, 0xdb, 0x02, 0x70, 0x9a, 0xd0, 0x18, 0xd2, 0x9f, 0x49, 0x94, 0x16, 0xfa, 0x07, 0xb0, 0xa6,
0x80, 0xbe, 0xc4, 0x06, 0x94, 0xb9, 0x44, 0x74, 0x67, 0xcd, 0x66, 0x71, 0x8f, 0x61, 0x2e, 0xc9,
0xae, 0x66, 0x38, 0x7f, 0x16, 0xa0, 0x96, 0xa2, 0x22, 0xe3, 0x27, 0x98, 0x11, 0x2f, 0xc4, 0x23,
0x9c, 0x50, 0x1a, 0xe9, 0xfe, 0x32, 0x05, 0xb8, 0xaf, 0x31, 0x31, 0x28, 0xd3, 0x7b, 0x9c, 0x63,
0x76, 0x2e, 0x53, 0x61, 0xba, 0x75, 0x8d, 0xed, 0x60, 0x76, 0x8e, 0x1e, 0x82, 0x3d, 0xa5, 0xc4,
0x09, 0x09, 0x42, 0x7c, 0x46, 0xb4, 0xb7, 0x35, 0x35, 0x7e, 0xa4, 0x61, 0x31, 0xe4, 0xaa, 0xcb,
0xbc, 0x18, 0x07, 0xbe, 0x17, 0x32, 0xcc, 0xf5, 0x1b, 0x69, 0x29, 0xfc, 0x08, 0x07, 0xfe, 0x3e,
0xc3, 0x1c, 0x3d, 0x86, 0x3b, 0x99, 0x87, 0x34, 0x43, 0x57, 0x6d, 0x8c, 0x92, 0xf4, 0x25, 0x4d,
0xb7, 0xdc, 0x07, 0x53, 0xb8, 0x86, 0x37, 0x4a, 0x08, 0xe6, 0xc4, 0xd7, 0x8d, 0x5c, 0x17, 0x58,
0x57, 0x41, 0xa8, 0x05, 0x15, 0x72, 0x11, 0x07, 0x09, 0xf1, 0xa5, 0x6b, 0x54, 0xdd, 0xe9, 0xa7,
0xd8, 0xcc, 0x38, 0x4d, 0xf0, 0x19, 0xf1, 0x22, 0x1c, 0x12, 0x69, 0x19, 0x35, 0xb7, 0xae, 0xb1,
0x03, 0x1c, 0x92, 0x8d, 0x07, 0x50, 0x9d, 0xda, 0x20, 0x32, 0xa1, 0xba, 0x77, 0x78, 0x78, 0xe4,
0x1d, 0x1e, 0x0f, 0xed, 0x5b, 0xa8, 0x0e, 0x15, 0xf9, 0xd5, 0x3f, 0xb0, 0x8d, 0x0d, 0x06, 0xb5,
0xd4, 0x05, 0x51, 0x03, 0x6a, 0xfd, 0x83, 0xfe, 0xb0, 0xbf, 0x35, 0xec, 0x6d, 0xdb, 0xb7, 0xd0,
0x1d, 0x58, 0x3c, 0x72, 0x7b, 0xfd, 0xfd, 0xad, 0x17, 0x3d, 0xcf, 0xed, 0xbd, 0xec, 0x6d, 0xed,
0xf5, 0xb6, 0x6d, 0x03, 0x21, 0xb0, 0x76, 0x86, 0x7b, 0x5d, 0xef, 0xe8, 0xf8, 0xd9, 0x5e, 0x7f,
0xb0, 0xd3, 0xdb, 0xb6, 0x0b, 0x42, 0x73, 0x70, 0xdc, 0xed, 0xf6, 0x06, 0x03, 0xbb, 0x88, 0x00,
0xca, 0xcf, 0xb7, 0xfa, 0x82, 0x5c, 0x42, 0x4b, 0xd0, 0xec, 0x1f, 0xbc, 0x3c, 0xec, 0x77, 0x7b,
0xde, 0xa0, 0x37, 0x1c, 0x0a, 0x70, 0x61, 0xf3, 0xdf, 0xb2, 0x7a, 0x07, 0xba, 0xf2, 0x87, 0x12,
0x72, 0xa1, 0xa2, 0x7f, 0xfa, 0xa0, 0x95, 0x59, 0x3f, 0xe4, 0x7e, 0x0c, 0xb5, 0xef, 0xe4, 0x2c,
0x68, 0xda, 0x4f, 0xce, 0xca, 0x2f, 0x7f, 0xff, 0xf3, 0x6b, 0x61, 0xd1, 0x31, 0x3b, 0xef, 0x1e,
0x77, 0x04, 0xa3, 0x43, 0x27, 0xfc, 0xa9, 0xb1, 0x81, 0x0e, 0xa1, 0xac, 0x5e, 0x6c, 0xb4, 0x9c,
0x93, 0x4c, 0x9f, 0xf0, 0x9b, 0x14, 0x97, 0xa5, 0xa2, 0xed, 0xd4, 0x53, 0xc5, 0x20, 0x12, 0x82,
0xdf, 0x43, 0x45, 0xbf, 0x66, 0x99, 0x20, 0xf3, 0xef, 0x5b, 0xfb, 0x3a, 0x9f, 0xfc, 0xce, 0x40,
0xaf, 0xa1, 0x96, 0x5a, 0x2c, 0x5a, 0x9d, 0x85, 0x73, 0xc5, 0x8a, 0xdb, 0xed, 0xeb, 0x96, 0xf2,
0x61, 0x21, 0x2b, 0x0d, 0x4b, 0xda, 0x2f, 0x3a, 0x56, 0x65, 0x16, 0xf6, 0x8b, 0x5a, 0xb9, 0xe3,
0x33, 0x8e, 0x7c, 0x6d, 0x60, 0x4e, 0x5b, 0x4a, 0xde, 0x46, 0x28, 0x27, 0xd9, 0xf9, 0x10, 0xf8,
0x1f, 0xd1, 0x2b, 0x30, 0x75, 0x01, 0xa4, 0x53, 0xa3, 0x59, 0xb2, 0xb2, 0x4e, 0xde, 0x5e, 0xbe,
0x0a, 0xeb, 0x68, 0xe7, 0xa5, 0xe9, 0x84, 0x77, 0xb8, 0x94, 0xf2, 0x52, 0x69, 0xe9, 0x6f, 0x19,
0xe9, 0xac, 0x29, 0x67, 0xa4, 0x73, 0x36, 0xe8, 0xac, 0x49, 0xe9, 0x36, 0x6a, 0xe5, 0xa4, 0xdf,
0x0a, 0x4e, 0xe7, 0x03, 0x0e, 0xf9, 0x47, 0xf4, 0x1a, 0xac, 0x17, 0x84, 0xab, 0x62, 0x7f, 0x56,
0xf4, 0xab, 0xf2, 0x88, 0x25, 0xb4, 0x98, 0x69, 0x01, 0x1d, 0xfc, 0x9b, 0x8c, 0xf6, 0x67, 0x85,
0x7f, 0x4f, 0x6a, 0xaf, 0xa2, 0x95, 0xac, 0x76, 0x36, 0xfa, 0x57, 0xd0, 0x10, 0x27, 0x4c, 0x7d,
0x8f, 0x65, 0xfa, 0x37, 0x67, 0xae, 0xed, 0x95, 0x39, 0x3c, 0x3f, 0x13, 0xa8, 0x29, 0x8f, 0x60,
0x98, 0x77, 0x94, 0xa1, 0x9e, 0x94, 0xe5, 0xbf, 0x1a, 0x4f, 0xfe, 0x0f, 0x00, 0x00, 0xff, 0xff,
0xc7, 0x1e, 0x66, 0x37, 0xa1, 0x0c, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.

@ -219,6 +219,11 @@ message LoopInRequest {
actor.
*/
bool external_htlc = 5;
/**
The number of blocks that the on chain htlc should confirm within.
*/
int32 htlc_conf_target = 6;
}
message SwapResponse {

@ -307,6 +307,11 @@
"type": "boolean",
"format": "boolean",
"description": "*\nIf external_htlc is true, we expect the htlc to be published by an external\nactor."
},
"htlc_conf_target": {
"type": "integer",
"format": "int32",
"description": "*\nThe number of blocks that the on chain htlc should confirm within."
}
}
},

Loading…
Cancel
Save