From 9b4a4a12da0ca6ab26d8b6c72b3803ef68e53247 Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Tue, 14 Jul 2020 02:10:55 +0530 Subject: [PATCH 01/40] add utils --- x/auth/client/cli/tx_sign.go | 28 +++++++++++++++++++--------- x/auth/client/cli/validate_sigs.go | 14 ++++++++++++++ 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/x/auth/client/cli/tx_sign.go b/x/auth/client/cli/tx_sign.go index f967a5434396..6f03057ce629 100644 --- a/x/auth/client/cli/tx_sign.go +++ b/x/auth/client/cli/tx_sign.go @@ -9,6 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" + clitx "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" authclient "github.com/cosmos/cosmos-sdk/x/auth/client" @@ -197,14 +198,14 @@ func preSignCmd(cmd *cobra.Command, _ []string) { func makeSignCmd(clientCtx client.Context) func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error { - clientCtx, txBldr, tx, err := readStdTxAndInitContexts(clientCtx, cmd, args[0]) + clientCtx, txF, tx, err := readTxAndInitContexts(clientCtx, cmd, args[0]) if err != nil { return err } - stdTx := tx.(types.StdTx) - + txGen := clientCtx.TxGenerator + txBuilder := txGen.NewTxBuilder() // if --signature-only is on, then override --append - var newTx types.StdTx + var newTx sdk.Tx generateSignatureOnly, _ := cmd.Flags().GetBool(flagSigOnly) multisigAddrStr, _ := cmd.Flags().GetString(flagMultisig) @@ -215,21 +216,22 @@ func makeSignCmd(clientCtx client.Context) func(cmd *cobra.Command, args []strin if err != nil { return err } - newTx, err = authclient.SignStdTxWithSignerAddress( - txBldr, clientCtx, multisigAddr, clientCtx.GetFromName(), stdTx, clientCtx.Offline, - ) + + err = clitx.Sign(txBuilder, clientCtx.GetFromName(), tx) generateSignatureOnly = true } else { append, _ := cmd.Flags().GetBool(flagAppend) appendSig := append && !generateSignatureOnly - newTx, err = authclient.SignStdTx(txBldr, clientCtx, clientCtx.GetFromName(), stdTx, appendSig, clientCtx.Offline) + if appendSig { + err = clitx.Sign(txF, clientCtx.GetFromName(), txBuilder) + } } if err != nil { return err } - json, err := getSignatureJSON(clientCtx.Codec, newTx, generateSignatureOnly) + json, err := newGetSignatureJSON(clientCtx.Codec, txGen, txBuilder, newTx, generateSignatureOnly) if err != nil { return err } @@ -258,3 +260,11 @@ func getSignatureJSON(cdc *codec.Codec, newTx types.StdTx, generateSignatureOnly return cdc.MarshalJSON(newTx) } + +func newGetSignatureJSON(cdc *codec.Codec, txGen client.TxGenerator, txBldr client.TxBuilder, newTx sdk.Tx, generateSignatureOnly bool) ([]byte, error) { + if generateSignatureOnly { + return cdc.MarshalJSON(txBldr.GetTx().GetSignatures()) + } + + return txGen.TxEncoder()(newTx) +} diff --git a/x/auth/client/cli/validate_sigs.go b/x/auth/client/cli/validate_sigs.go index 9be473676e08..0b1591e2106a 100644 --- a/x/auth/client/cli/validate_sigs.go +++ b/x/auth/client/cli/validate_sigs.go @@ -9,6 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" sdk "github.com/cosmos/cosmos-sdk/types" authclient "github.com/cosmos/cosmos-sdk/x/auth/client" @@ -134,7 +135,20 @@ func printAndValidateSigs( return success } +func readTxAndInitContexts(clientCtx client.Context, cmd *cobra.Command, filename string) (client.Context, tx.Factory, sdk.Tx, error) { + stdTx, err := authclient.ReadTxFromFile(clientCtx, filename) + if err != nil { + return clientCtx, tx.Factory{}, nil, err + } + + inBuf := bufio.NewReader(cmd.InOrStdin()) + clientCtx = clientCtx.InitWithInput(inBuf) + txFactory := tx.NewFactoryCLI(clientCtx, cmd.Flags()) + + return clientCtx, txFactory, stdTx, nil +} +// deprecated func readStdTxAndInitContexts(clientCtx client.Context, cmd *cobra.Command, filename string) ( client.Context, types.TxBuilder, sdk.Tx, error, ) { From eaeef545fd5acec6e9bf9332686b25e046d6d36c Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Tue, 14 Jul 2020 16:36:13 +0530 Subject: [PATCH 02/40] update sign cmd --- x/auth/client/cli/tx_sign.go | 9 ++++--- x/auth/client/tx.go | 50 +++++++++++++++--------------------- 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/x/auth/client/cli/tx_sign.go b/x/auth/client/cli/tx_sign.go index 6f03057ce629..952006352045 100644 --- a/x/auth/client/cli/tx_sign.go +++ b/x/auth/client/cli/tx_sign.go @@ -9,7 +9,6 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - clitx "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" authclient "github.com/cosmos/cosmos-sdk/x/auth/client" @@ -198,7 +197,7 @@ func preSignCmd(cmd *cobra.Command, _ []string) { func makeSignCmd(clientCtx client.Context) func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error { - clientCtx, txF, tx, err := readTxAndInitContexts(clientCtx, cmd, args[0]) + clientCtx, txF, _, err := readTxAndInitContexts(clientCtx, cmd, args[0]) if err != nil { return err } @@ -217,13 +216,15 @@ func makeSignCmd(clientCtx client.Context) func(cmd *cobra.Command, args []strin return err } - err = clitx.Sign(txBuilder, clientCtx.GetFromName(), tx) + err = authclient.SignStdTxWithSignerAddress( + txF, clientCtx, multisigAddr, clientCtx.GetFromName(), txBuilder, clientCtx.Offline, + ) generateSignatureOnly = true } else { append, _ := cmd.Flags().GetBool(flagAppend) appendSig := append && !generateSignatureOnly if appendSig { - err = clitx.Sign(txF, clientCtx.GetFromName(), txBuilder) + err = authclient.SignStdTx(txF, clientCtx, clientCtx.GetFromName(), txBuilder, appendSig, clientCtx.Offline) } } diff --git a/x/auth/client/tx.go b/x/auth/client/tx.go index bafdf3b74daf..e648f3109fa0 100644 --- a/x/auth/client/tx.go +++ b/x/auth/client/tx.go @@ -14,6 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/input" + "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -166,56 +167,45 @@ func PrintUnsignedStdTx(txBldr authtypes.TxBuilder, clientCtx client.Context, ms // SignStdTx appends a signature to a StdTx and returns a copy of it. If appendSig // is false, it replaces the signatures already attached with the new signature. // Don't perform online validation or lookups if offline is true. -func SignStdTx( - txBldr authtypes.TxBuilder, clientCtx client.Context, name string, - stdTx authtypes.StdTx, appendSig bool, offline bool, -) (authtypes.StdTx, error) { - - var signedStdTx authtypes.StdTx - - info, err := txBldr.Keybase().Key(name) +func SignStdTx(txFactory tx.Factory, clientCtx client.Context, name string, + stdTx client.TxBuilder, appendSig bool, offline bool) error { + info, err := txFactory.Keybase().Key(name) if err != nil { - return signedStdTx, err + return err } - - addr := info.GetPubKey().Address() - - // check whether the address is a signer - if !isTxSigner(sdk.AccAddress(addr), stdTx.GetSigners()) { - return signedStdTx, fmt.Errorf("%s: %s", sdkerrors.ErrorInvalidSigner, name) + addr := sdk.AccAddress(info.GetPubKey().Address()) + if !isTxSigner(sdk.AccAddress(addr), stdTx.GetTx().(authtypes.StdTx).GetSigners()) { + return fmt.Errorf("%s: %s", sdkerrors.ErrorInvalidSigner, name) } - if !offline { - txBldr, err = populateAccountFromState(txBldr, clientCtx, sdk.AccAddress(addr)) + txFactory, err = populateAccountFromState(txFactory, clientCtx, sdk.AccAddress(addr)) if err != nil { - return signedStdTx, err + return err } } - return txBldr.SignStdTx(name, stdTx, appendSig) + return tx.Sign(txFactory, name, stdTx) } // SignStdTxWithSignerAddress attaches a signature to a StdTx and returns a copy of a it. // Don't perform online validation or lookups if offline is true, else // populate account and sequence numbers from a foreign account. -func SignStdTxWithSignerAddress( - txBldr authtypes.TxBuilder, clientCtx client.Context, - addr sdk.AccAddress, name string, stdTx authtypes.StdTx, offline bool, -) (signedStdTx authtypes.StdTx, err error) { +func SignStdTxWithSignerAddress(txFactory tx.Factory, clientCtx client.Context, addr sdk.AccAddress, + name string, txBuilder client.TxBuilder, offline bool) (err error) { // check whether the address is a signer - if !isTxSigner(addr, stdTx.GetSigners()) { - return signedStdTx, fmt.Errorf("%s: %s", sdkerrors.ErrorInvalidSigner, name) + if !isTxSigner(addr, txBuilder.GetTx().GetSigners()) { + return fmt.Errorf("%s: %s", sdkerrors.ErrorInvalidSigner, name) } if !offline { - txBldr, err = populateAccountFromState(txBldr, clientCtx, addr) + txFactory, err = populateAccountFromState(txFactory, clientCtx, addr) if err != nil { - return signedStdTx, err + return err } } - return txBldr.SignStdTx(name, stdTx, false) + return tx.Sign(txFactory, name, txBuilder) } // Read and decode a StdTx from the given filename. Can pass "-" to read from stdin. @@ -270,8 +260,8 @@ func (bs *BatchScanner) Scan() bool { } func populateAccountFromState( - txBldr authtypes.TxBuilder, clientCtx client.Context, addr sdk.AccAddress, -) (authtypes.TxBuilder, error) { + txBldr tx.Factory, clientCtx client.Context, addr sdk.AccAddress, +) (tx.Factory, error) { num, seq, err := clientCtx.AccountRetriever.GetAccountNumberSequence(clientCtx, addr) if err != nil { From 5abd7f1bb520c814547e06630f48b6622d9aab3f Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Tue, 14 Jul 2020 18:51:27 +0530 Subject: [PATCH 03/40] update multisign cmd --- x/auth/client/cli/tx_multisign.go | 64 +++++++----- x/auth/client/cli/tx_sign.go | 155 +++++++++++++++--------------- 2 files changed, 119 insertions(+), 100 deletions(-) diff --git a/x/auth/client/cli/tx_multisign.go b/x/auth/client/cli/tx_multisign.go index 48227e6caf55..686dffbbefa4 100644 --- a/x/auth/client/cli/tx_multisign.go +++ b/x/auth/client/cli/tx_multisign.go @@ -11,13 +11,15 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/errors" + signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" "github.com/cosmos/cosmos-sdk/version" authclient "github.com/cosmos/cosmos-sdk/x/auth/client" + "github.com/cosmos/cosmos-sdk/x/auth/signing" "github.com/cosmos/cosmos-sdk/x/auth/types" ) @@ -60,8 +62,7 @@ func makeMultiSignCmd(clientCtx client.Context) func(cmd *cobra.Command, args [] return func(cmd *cobra.Command, args []string) (err error) { clientCtx = clientCtx.Init() cdc := clientCtx.Codec - tx, err := authclient.ReadTxFromFile(clientCtx, args[0]) - stdTx := tx.(types.StdTx) + stdTx, err := authclient.ReadTxFromFile(clientCtx, args[0]) if err != nil { return } @@ -85,9 +86,10 @@ func makeMultiSignCmd(clientCtx client.Context) func(cmd *cobra.Command, args [] multisigPub := multisigInfo.GetPubKey().(multisig.PubKeyMultisigThreshold) multisigSig := multisig.NewMultisig(len(multisigPub.PubKeys)) - txBldr, err := types.NewTxBuilderFromFlags(inBuf, cmd.Flags(), homeDir) + clientCtx = clientCtx.InitWithInput(inBuf) + txFactory := tx.NewFactoryCLI(clientCtx, cmd.Flags()) if err != nil { - return errors.Wrap(err, "error creating tx builder from flags") + return errors.Wrap(err, "error creating stdTx builder from flags") } if !clientCtx.Offline { @@ -96,31 +98,34 @@ func makeMultiSignCmd(clientCtx client.Context) func(cmd *cobra.Command, args [] return err } - txBldr = txBldr.WithAccountNumber(accnum).WithSequence(seq) + txFactory = txFactory.WithAccountNumber(accnum).WithSequence(seq) } + feeTx := stdTx.(sdk.FeeTx) + fee := types.StdFee{ + Amount: feeTx.GetFee(), + Gas: feeTx.GetGas(), + } + memoTx := stdTx.(sdk.TxWithMemo) + // read each signature and add it to the multisig if valid for i := 2; i < len(args); i++ { - stdSig, err := readAndUnmarshalStdSignature(cdc, args[i]) + stdSig, err := readAndUnmarshalStdSignature(clientCtx, args[i]) if err != nil { return err } - // Validate each signature - sigBytes := types.StdSignBytes( - txBldr.ChainID(), txBldr.AccountNumber(), txBldr.Sequence(), - stdTx.Fee, stdTx.GetMsgs(), stdTx.GetMemo(), - ) - if ok := stdSig.GetPubKey().VerifyBytes(sigBytes, stdSig.Signature); !ok { - return fmt.Errorf("couldn't verify signature") + signingData := signing.SignerData{ + ChainID: txFactory.ChainID(), + AccountNumber: txFactory.AccountNumber(), + AccountSequence: txFactory.Sequence(), } - - sigV2, err := types.StdSignatureToSignatureV2(cdc, stdSig) + err = signing.VerifySignature(stdSig.PubKey, signingData, stdSig.Data, clientCtx.TxGenerator.SignModeHandler(), stdTx) if err != nil { - return nil + return fmt.Errorf("couldn't verify signature") } - if err := multisig.AddSignatureV2(multisigSig, sigV2, multisigPub.PubKeys); err != nil { + if err := multisig.AddSignatureV2(multisigSig, stdSig, multisigPub.PubKeys); err != nil { return err } } @@ -130,11 +135,26 @@ func makeMultiSignCmd(clientCtx client.Context) func(cmd *cobra.Command, args [] return err } - newStdSig := types.StdSignature{Signature: sigBz, PubKey: multisigPub.Bytes()} //nolint:staticcheck - newTx := types.NewStdTx(stdTx.GetMsgs(), stdTx.Fee, []types.StdSignature{newStdSig}, stdTx.GetMemo()) //nolint:staticcheck + newStdSig := types.StdSignature{Signature: sigBz, PubKey: multisigPub.Bytes()} //nolint:staticcheck + newTx := types.NewStdTx(stdTx.GetMsgs(), fee, []types.StdSignature{newStdSig}, memoTx.GetMemo()) //nolint:staticcheck var json []byte + txBuilder := clientCtx.TxGenerator.NewTxBuilder() + if err != nil { + return err + } + + sigBldr := signingtypes.SignatureV2{ + PubKey: multisigPub, + Data: multisigSig, + } + + err = txBuilder.SetSignatures(sigBldr) + + if err != nil { + return err + } sigOnly, _ := cmd.Flags().GetBool(flagSigOnly) if sigOnly { json, err = cdc.MarshalJSON(newTx.Signatures[0]) @@ -163,12 +183,12 @@ func makeMultiSignCmd(clientCtx client.Context) func(cmd *cobra.Command, args [] } } -func readAndUnmarshalStdSignature(cdc *codec.Codec, filename string) (stdSig types.StdSignature, err error) { //nolint:staticcheck +func readAndUnmarshalStdSignature(clientCtx client.Context, filename string) (stdSig signingtypes.SignatureV2, err error) { //nolint:staticcheck var bytes []byte if bytes, err = ioutil.ReadFile(filename); err != nil { return } - if err = cdc.UnmarshalJSON(bytes, &stdSig); err != nil { + if err = clientCtx.JSONMarshaler.UnmarshalJSON(bytes, &stdSig); err != nil { return } return diff --git a/x/auth/client/cli/tx_sign.go b/x/auth/client/cli/tx_sign.go index 952006352045..2a4859c0b8c0 100644 --- a/x/auth/client/cli/tx_sign.go +++ b/x/auth/client/cli/tx_sign.go @@ -1,7 +1,6 @@ package cli import ( - "bufio" "fmt" "os" @@ -58,79 +57,80 @@ account key. It implies --signature-only. } func makeSignBatchCmd(cdc *codec.Codec) func(cmd *cobra.Command, args []string) error { - return func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - clientCtx := client.GetClientContextFromCmd(cmd) - - txBldr, err := types.NewTxBuilderFromFlags(inBuf, cmd.Flags(), clientCtx.HomeDir) - if err != nil { - return err - } - - generateSignatureOnly, _ := cmd.Flags().GetBool(flagSigOnly) - - var ( - multisigAddr sdk.AccAddress - infile = os.Stdin - ) - - // validate multisig address if there's any - if ms, _ := cmd.Flags().GetString(flagMultisig); ms != "" { - multisigAddr, err = sdk.AccAddressFromBech32(ms) - if err != nil { - return err - } - } - - // prepare output document - closeFunc, err := setOutputFile(cmd) - if err != nil { - return err - } - - defer closeFunc() - clientCtx.WithOutput(cmd.OutOrStdout()) - - if args[0] != "-" { - infile, err = os.Open(args[0]) - if err != nil { - return err - } - } - - scanner := authclient.NewBatchScanner(cdc, infile) - - for sequence := txBldr.Sequence(); scanner.Scan(); sequence++ { - var stdTx types.StdTx - - unsignedStdTx := scanner.StdTx() - txBldr = txBldr.WithSequence(sequence) - - if multisigAddr.Empty() { - homeDir, _ := cmd.Flags().GetString(flags.FlagFrom) - stdTx, err = authclient.SignStdTx(txBldr, clientCtx, homeDir, unsignedStdTx, false, true) - } else { - stdTx, err = authclient.SignStdTxWithSignerAddress(txBldr, clientCtx, multisigAddr, clientCtx.GetFromName(), unsignedStdTx, true) - } - - if err != nil { - return err - } - - json, err := getSignatureJSON(cdc, stdTx, generateSignatureOnly) - if err != nil { - return err - } - - cmd.Printf("%s\n", json) - } - - if err := scanner.UnmarshalErr(); err != nil { - return err - } - - return scanner.Err() - } + return nil + // return func(cmd *cobra.Command, args []string) error { + // inBuf := bufio.NewReader(cmd.InOrStdin()) + // clientCtx := client.GetClientContextFromCmd(cmd) + // + // txBldr, err := types.NewTxBuilderFromFlags(inBuf, cmd.Flags(), clientCtx.HomeDir) + // if err != nil { + // return err + // } + // + // generateSignatureOnly, _ := cmd.Flags().GetBool(flagSigOnly) + // + // var ( + // multisigAddr sdk.AccAddress + // infile = os.Stdin + // ) + // + // // validate multisig address if there's any + // if ms, _ := cmd.Flags().GetString(flagMultisig); ms != "" { + // multisigAddr, err = sdk.AccAddressFromBech32(ms) + // if err != nil { + // return err + // } + // } + // + // // prepare output document + // closeFunc, err := setOutputFile(cmd) + // if err != nil { + // return err + // } + // + // defer closeFunc() + // clientCtx.WithOutput(cmd.OutOrStdout()) + // + // if args[0] != "-" { + // infile, err = os.Open(args[0]) + // if err != nil { + // return err + // } + // } + // + // scanner := authclient.NewBatchScanner(cdc, infile) + // + // for sequence := txBldr.Sequence(); scanner.Scan(); sequence++ { + // var stdTx types.StdTx + // + // unsignedStdTx := scanner.StdTx() + // txBldr = txBldr.WithSequence(sequence) + // + // if multisigAddr.Empty() { + // homeDir, _ := cmd.Flags().GetString(flags.FlagFrom) + // stdTx, err = authclient.SignStdTx(txBldr, clientCtx, homeDir, unsignedStdTx, false, true) + // } else { + // stdTx, err = authclient.SignStdTxWithSignerAddress(txBldr, clientCtx, multisigAddr, clientCtx.GetFromName(), unsignedStdTx, true) + // } + // + // if err != nil { + // return err + // } + // + // json, err := getSignatureJSON(cdc, stdTx, generateSignatureOnly) + // if err != nil { + // return err + // } + // + // cmd.Printf("%s\n", json) + // } + // + // if err := scanner.UnmarshalErr(); err != nil { + // return err + // } + // + // return scanner.Err() + // } } func setOutputFile(cmd *cobra.Command) (func(), error) { @@ -197,14 +197,13 @@ func preSignCmd(cmd *cobra.Command, _ []string) { func makeSignCmd(clientCtx client.Context) func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error { - clientCtx, txF, _, err := readTxAndInitContexts(clientCtx, cmd, args[0]) + clientCtx, txF, newTx, err := readTxAndInitContexts(clientCtx, cmd, args[0]) if err != nil { return err } txGen := clientCtx.TxGenerator txBuilder := txGen.NewTxBuilder() // if --signature-only is on, then override --append - var newTx sdk.Tx generateSignatureOnly, _ := cmd.Flags().GetBool(flagSigOnly) multisigAddrStr, _ := cmd.Flags().GetString(flagMultisig) @@ -232,7 +231,7 @@ func makeSignCmd(clientCtx client.Context) func(cmd *cobra.Command, args []strin return err } - json, err := newGetSignatureJSON(clientCtx.Codec, txGen, txBuilder, newTx, generateSignatureOnly) + json, err := newGetSignatureJSON(clientCtx.JSONMarshaler, txGen, txBuilder, newTx, generateSignatureOnly) if err != nil { return err } @@ -262,7 +261,7 @@ func getSignatureJSON(cdc *codec.Codec, newTx types.StdTx, generateSignatureOnly return cdc.MarshalJSON(newTx) } -func newGetSignatureJSON(cdc *codec.Codec, txGen client.TxGenerator, txBldr client.TxBuilder, newTx sdk.Tx, generateSignatureOnly bool) ([]byte, error) { +func newGetSignatureJSON(cdc codec.JSONMarshaler, txGen client.TxGenerator, txBldr client.TxBuilder, newTx sdk.Tx, generateSignatureOnly bool) ([]byte, error) { if generateSignatureOnly { return cdc.MarshalJSON(txBldr.GetTx().GetSignatures()) } From c2b4cc7505896d3992b502e1e259e07e6ec15767 Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Tue, 14 Jul 2020 20:30:49 +0530 Subject: [PATCH 04/40] update sign batch cmd --- simapp/simd/cmd/root.go | 2 +- x/auth/client/cli/tx_sign.go | 154 +++++++++++++++++------------------ x/auth/client/tx.go | 8 +- 3 files changed, 82 insertions(+), 82 deletions(-) diff --git a/simapp/simd/cmd/root.go b/simapp/simd/cmd/root.go index d29ba512351f..7a3cac52b827 100644 --- a/simapp/simd/cmd/root.go +++ b/simapp/simd/cmd/root.go @@ -130,7 +130,7 @@ func txCommand() *cobra.Command { cmd.AddCommand( authcmd.GetSignCommand(initClientCtx), - authcmd.GetSignBatchCommand(encodingConfig.Amino), + authcmd.GetSignBatchCommand(initClientCtx), authcmd.GetMultiSignCommand(initClientCtx), authcmd.GetValidateSignaturesCommand(initClientCtx), flags.LineBreak, diff --git a/x/auth/client/cli/tx_sign.go b/x/auth/client/cli/tx_sign.go index 2a4859c0b8c0..7c45dd56a2ba 100644 --- a/x/auth/client/cli/tx_sign.go +++ b/x/auth/client/cli/tx_sign.go @@ -1,6 +1,7 @@ package cli import ( + "bufio" "fmt" "os" @@ -8,6 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" authclient "github.com/cosmos/cosmos-sdk/x/auth/client" @@ -21,7 +23,7 @@ const ( ) // GetSignBatchCommand returns the transaction sign-batch command. -func GetSignBatchCommand(codec *codec.Codec) *cobra.Command { +func GetSignBatchCommand(clientCtx client.Context) *cobra.Command { cmd := &cobra.Command{ Use: "sign-batch [file]", Short: "Sign transaction batch files", @@ -43,7 +45,7 @@ The --multisig= flag generates a signature on behalf of a multisig account key. It implies --signature-only. `, PreRun: preSignCmd, - RunE: makeSignBatchCmd(codec), + RunE: makeSignBatchCmd(clientCtx), Args: cobra.ExactArgs(1), } @@ -56,81 +58,79 @@ account key. It implies --signature-only. return cmd } -func makeSignBatchCmd(cdc *codec.Codec) func(cmd *cobra.Command, args []string) error { - return nil - // return func(cmd *cobra.Command, args []string) error { - // inBuf := bufio.NewReader(cmd.InOrStdin()) - // clientCtx := client.GetClientContextFromCmd(cmd) - // - // txBldr, err := types.NewTxBuilderFromFlags(inBuf, cmd.Flags(), clientCtx.HomeDir) - // if err != nil { - // return err - // } - // - // generateSignatureOnly, _ := cmd.Flags().GetBool(flagSigOnly) - // - // var ( - // multisigAddr sdk.AccAddress - // infile = os.Stdin - // ) - // - // // validate multisig address if there's any - // if ms, _ := cmd.Flags().GetString(flagMultisig); ms != "" { - // multisigAddr, err = sdk.AccAddressFromBech32(ms) - // if err != nil { - // return err - // } - // } - // - // // prepare output document - // closeFunc, err := setOutputFile(cmd) - // if err != nil { - // return err - // } - // - // defer closeFunc() - // clientCtx.WithOutput(cmd.OutOrStdout()) - // - // if args[0] != "-" { - // infile, err = os.Open(args[0]) - // if err != nil { - // return err - // } - // } - // - // scanner := authclient.NewBatchScanner(cdc, infile) - // - // for sequence := txBldr.Sequence(); scanner.Scan(); sequence++ { - // var stdTx types.StdTx - // - // unsignedStdTx := scanner.StdTx() - // txBldr = txBldr.WithSequence(sequence) - // - // if multisigAddr.Empty() { - // homeDir, _ := cmd.Flags().GetString(flags.FlagFrom) - // stdTx, err = authclient.SignStdTx(txBldr, clientCtx, homeDir, unsignedStdTx, false, true) - // } else { - // stdTx, err = authclient.SignStdTxWithSignerAddress(txBldr, clientCtx, multisigAddr, clientCtx.GetFromName(), unsignedStdTx, true) - // } - // - // if err != nil { - // return err - // } - // - // json, err := getSignatureJSON(cdc, stdTx, generateSignatureOnly) - // if err != nil { - // return err - // } - // - // cmd.Printf("%s\n", json) - // } - // - // if err := scanner.UnmarshalErr(); err != nil { - // return err - // } - // - // return scanner.Err() - // } +func makeSignBatchCmd(clientCtx client.Context) func(cmd *cobra.Command, args []string) error { + return func(cmd *cobra.Command, args []string) error { + inBuf := bufio.NewReader(cmd.InOrStdin()) + clientCtx = clientCtx.InitWithInput(inBuf) + txFactory := tx.NewFactoryCLI(clientCtx, cmd.Flags()) + + txGen := clientCtx.TxGenerator + txBuilder := txGen.NewTxBuilder() + var err error + generateSignatureOnly, _ := cmd.Flags().GetBool(flagSigOnly) + + var ( + multisigAddr sdk.AccAddress + infile = os.Stdin + ) + + // validate multisig address if there's any + if ms, _ := cmd.Flags().GetString(flagMultisig); ms != "" { + multisigAddr, err = sdk.AccAddressFromBech32(ms) + if err != nil { + return err + } + } + + // prepare output document + closeFunc, err := setOutputFile(cmd) + if err != nil { + return err + } + + defer closeFunc() + clientCtx.WithOutput(cmd.OutOrStdout()) + + if args[0] != "-" { + infile, err = os.Open(args[0]) + if err != nil { + return err + } + } + + scanner := authclient.NewBatchScanner(clientCtx.JSONMarshaler, infile) + + for sequence := txFactory.Sequence(); scanner.Scan(); sequence++ { + var stdTx types.StdTx + + unsignedStdTx := scanner.StdTx() + txFactory = txFactory.WithSequence(sequence) + + if multisigAddr.Empty() { + homeDir, _ := cmd.Flags().GetString(flags.FlagFrom) + err = authclient.SignStdTx(txFactory, clientCtx, homeDir, txBuilder, false, true) + } else { + err = authclient.SignStdTxWithSignerAddress(txFactory, clientCtx, multisigAddr, clientCtx.GetFromName(), txBuilder, true) + } + + if err != nil { + return err + } + + json, err := newGetSignatureJSON(clientCtx.JSONMarshaler, txGen, txBuilder, stdTx, generateSignatureOnly) + if err != nil { + return err + } + + cmd.Printf("%s\n", json) + } + + if err := scanner.UnmarshalErr(); err != nil { + return err + } + + return scanner.Err() + } } func setOutputFile(cmd *cobra.Command) (func(), error) { diff --git a/x/auth/client/tx.go b/x/auth/client/tx.go index e648f3109fa0..2e29aec1dfe4 100644 --- a/x/auth/client/tx.go +++ b/x/auth/client/tx.go @@ -226,7 +226,7 @@ func ReadTxFromFile(ctx client.Context, filename string) (tx sdk.Tx, err error) } // NewBatchScanner returns a new BatchScanner to read newline-delimited StdTx transactions from r. -func NewBatchScanner(cdc *codec.Codec, r io.Reader) *BatchScanner { +func NewBatchScanner(cdc codec.JSONMarshaler, r io.Reader) *BatchScanner { return &BatchScanner{Scanner: bufio.NewScanner(r), cdc: cdc} } @@ -234,13 +234,13 @@ func NewBatchScanner(cdc *codec.Codec, r io.Reader) *BatchScanner { // of newline-delimited JSON encoded StdTx. type BatchScanner struct { *bufio.Scanner - stdTx authtypes.StdTx - cdc *codec.Codec + stdTx sdk.Tx + cdc codec.JSONMarshaler unmarshalErr error } // StdTx returns the most recent StdTx unmarshalled by a call to Scan. -func (bs BatchScanner) StdTx() authtypes.StdTx { return bs.stdTx } +func (bs BatchScanner) StdTx() sdk.Tx { return bs.stdTx } // UnmarshalErr returns the first unmarshalling error that was encountered by the scanner. func (bs BatchScanner) UnmarshalErr() error { return bs.unmarshalErr } From d1eb8c1141ef8383353597002a53ee58654a49a0 Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Wed, 15 Jul 2020 16:37:56 +0530 Subject: [PATCH 05/40] update genutil cmd --- x/auth/client/cli/tx_sign.go | 11 ++++++----- x/auth/client/tx.go | 14 +++++++------- x/genutil/client/cli/gentx.go | 14 ++++++++------ x/staking/client/cli/tx.go | 3 +-- 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/x/auth/client/cli/tx_sign.go b/x/auth/client/cli/tx_sign.go index f76c3a7c9cce..2459147b2086 100644 --- a/x/auth/client/cli/tx_sign.go +++ b/x/auth/client/cli/tx_sign.go @@ -112,12 +112,12 @@ func makeSignBatchCmd() func(cmd *cobra.Command, args []string) error { homeDir, _ := cmd.Flags().GetString(flags.FlagFrom) err = authclient.SignStdTx(txFactory, clientCtx, homeDir, txBuilder, false, true) from, _ := cmd.Flags().GetString(flags.FlagFrom) - _, fromName, err := client.GetFromFields(txBldr.Keybase(), from, clientCtx.GenerateOnly) + _, fromName, err := client.GetFromFields(txFactory.Keybase(), from, clientCtx.GenerateOnly) if err != nil { return fmt.Errorf("error getting account from keybase: %w", err) } - stdTx, err = authclient.SignStdTx(txBldr, clientCtx, fromName, unsignedStdTx, false, true) + err = authclient.SignStdTx(txFactory, clientCtx, fromName, txBuilder, false, true) if err != nil { return err } @@ -212,19 +212,20 @@ func makeSignCmd() func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error { clientCtx := client.GetClientContextFromCmd(cmd) - clientCtx, txBldr, tx, err := readStdTxAndInitContexts(clientCtx, cmd, args[0]) clientCtx, txF, newTx, err := readTxAndInitContexts(clientCtx, cmd, args[0]) if err != nil { return err } txGen := clientCtx.TxGenerator txBuilder := txGen.NewTxBuilder() + txFactory := tx.NewFactoryCLI(clientCtx, cmd.Flags()) + // if --signature-only is on, then override --append generateSignatureOnly, _ := cmd.Flags().GetBool(flagSigOnly) multisigAddrStr, _ := cmd.Flags().GetString(flagMultisig) from, _ := cmd.Flags().GetString(flags.FlagFrom) - _, fromName, err := client.GetFromFields(txBldr.Keybase(), from, clientCtx.GenerateOnly) + _, fromName, err := client.GetFromFields(txFactory.Keybase(), from, clientCtx.GenerateOnly) if err != nil { return fmt.Errorf("error getting account from keybase: %w", err) } @@ -238,7 +239,7 @@ func makeSignCmd() func(cmd *cobra.Command, args []string) error { } err = authclient.SignStdTxWithSignerAddress( - txF, clientCtx, multisigAddr, clientCtx.GetFromName(), txBuilder, clientCtx.Offline, + txF, clientCtx, multisigAddr, fromName, txBuilder, clientCtx.Offline, ) generateSignatureOnly = true } else { diff --git a/x/auth/client/tx.go b/x/auth/client/tx.go index 2e29aec1dfe4..02af9568bfac 100644 --- a/x/auth/client/tx.go +++ b/x/auth/client/tx.go @@ -43,7 +43,7 @@ func (gr GasEstimateResponse) String() string { // the provided context has generate-only enabled, the tx will only be printed // to STDOUT in a fully offline manner. Otherwise, the tx will be signed and // broadcasted. -func GenerateOrBroadcastMsgs(clientCtx client.Context, txBldr authtypes.TxBuilder, msgs []sdk.Msg) error { +func GenerateOrBroadcastMsgs(clientCtx client.Context, txBldr tx.Factory, msgs []sdk.Msg) error { if clientCtx.GenerateOnly { return PrintUnsignedStdTx(txBldr, clientCtx, msgs) } @@ -56,7 +56,7 @@ func GenerateOrBroadcastMsgs(clientCtx client.Context, txBldr authtypes.TxBuilde // QueryContext. It ensures that the account exists, has a proper number and // sequence set. In addition, it builds and signs a transaction with the // supplied messages. Finally, it broadcasts the signed transaction to a node. -func CompleteAndBroadcastTxCLI(txBldr authtypes.TxBuilder, clientCtx client.Context, msgs []sdk.Msg) error { +func CompleteAndBroadcastTxCLI(txBldr tx.Factory, clientCtx client.Context, msgs []sdk.Msg) error { txBldr, err := PrepareTxBuilder(txBldr, clientCtx) if err != nil { return err @@ -116,7 +116,7 @@ func CompleteAndBroadcastTxCLI(txBldr authtypes.TxBuilder, clientCtx client.Cont // EnrichWithGas calculates the gas estimate that would be consumed by the // transaction and set the transaction's respective value accordingly. -func EnrichWithGas(txBldr authtypes.TxBuilder, clientCtx client.Context, msgs []sdk.Msg) (authtypes.TxBuilder, error) { +func EnrichWithGas(txBldr tx.Factory, clientCtx client.Context, msgs []sdk.Msg) (tx.Factory, error) { _, adjusted, err := simulateMsgs(txBldr, clientCtx, msgs) if err != nil { return txBldr, err @@ -149,7 +149,7 @@ func CalculateGas( } // PrintUnsignedStdTx builds an unsigned StdTx and prints it to os.Stdout. -func PrintUnsignedStdTx(txBldr authtypes.TxBuilder, clientCtx client.Context, msgs []sdk.Msg) error { +func PrintUnsignedStdTx(txBldr tx.Factory, clientCtx client.Context, msgs []sdk.Msg) error { stdTx, err := buildUnsignedStdTxOffline(txBldr, clientCtx, msgs) if err != nil { return err @@ -284,7 +284,7 @@ func GetTxEncoder(cdc *codec.Codec) (encoder sdk.TxEncoder) { // simulateMsgs simulates the transaction and returns the simulation response and // the adjusted gas value. -func simulateMsgs(txBldr authtypes.TxBuilder, clientCtx client.Context, msgs []sdk.Msg) (sdk.SimulationResponse, uint64, error) { +func simulateMsgs(txBldr tx.Factory, clientCtx client.Context, msgs []sdk.Msg) (sdk.SimulationResponse, uint64, error) { txBytes, err := txBldr.BuildTxForSim(msgs) if err != nil { return sdk.SimulationResponse{}, 0, err @@ -307,7 +307,7 @@ func parseQueryResponse(bz []byte) (sdk.SimulationResponse, error) { } // PrepareTxBuilder populates a TxBuilder in preparation for the build of a Tx. -func PrepareTxBuilder(txBldr authtypes.TxBuilder, clientCtx client.Context) (authtypes.TxBuilder, error) { +func PrepareTxBuilder(txBldr tx.Factory, clientCtx client.Context) (tx.Factory, error) { from := clientCtx.GetFromAddress() accGetter := clientCtx.AccountRetriever if err := accGetter.EnsureExists(clientCtx, from); err != nil { @@ -334,7 +334,7 @@ func PrepareTxBuilder(txBldr authtypes.TxBuilder, clientCtx client.Context) (aut return txBldr, nil } -func buildUnsignedStdTxOffline(txBldr authtypes.TxBuilder, clientCtx client.Context, msgs []sdk.Msg) (stdTx authtypes.StdTx, err error) { +func buildUnsignedStdTxOffline(txBldr tx.Factory, clientCtx client.Context, msgs []sdk.Msg) (stdTx authtypes.StdTx, err error) { if txBldr.SimulateAndExecute() { if clientCtx.Offline { return stdTx, errors.New("cannot estimate gas in offline mode") diff --git a/x/genutil/client/cli/gentx.go b/x/genutil/client/cli/gentx.go index f7ae4992d7a1..eb036918b69d 100644 --- a/x/genutil/client/cli/gentx.go +++ b/x/genutil/client/cli/gentx.go @@ -17,6 +17,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/cosmos/cosmos-sdk/server" @@ -133,16 +134,17 @@ $ %s gentx my-key-name --home=/path/to/home/dir --keyring-backend=os --chain-id= return errors.Wrap(err, "failed to validate account in genesis") } - txBldr, err := authtypes.NewTxBuilderFromFlags(inBuf, cmd.Flags(), clientCtx.HomeDir) + txFactory := tx.NewFactoryCLI(clientCtx, cmd.Flags()) if err != nil { return errors.Wrap(err, "error creating tx builder") } - txBldr = txBldr.WithTxEncoder(authclient.GetTxEncoder(clientCtx.Codec)) + txGen := clientCtx.TxGenerator + txBuilder := txGen.NewTxBuilder() clientCtx = clientCtx.WithInput(inBuf).WithFromAddress(key.GetAddress()) // create a 'create-validator' message - txBldr, msg, err := cli.BuildCreateValidatorMsg(clientCtx, createValCfg, txBldr, true) + txBldr, msg, err := cli.BuildCreateValidatorMsg(clientCtx, createValCfg, txFactory, true) if err != nil { return errors.Wrap(err, "failed to build create-validator message") } @@ -167,7 +169,7 @@ $ %s gentx my-key-name --home=/path/to/home/dir --keyring-backend=os --chain-id= } // sign the transaction and write it to the output file - signedTx, err := authclient.SignStdTx(txBldr, clientCtx, name, stdTx, false, true) + err := authclient.SignStdTx(txFactory, clientCtx, name, txBuilder, false, true) if err != nil { return errors.Wrap(err, "failed to sign std tx") } @@ -180,7 +182,7 @@ $ %s gentx my-key-name --home=/path/to/home/dir --keyring-backend=os --chain-id= } } - if err := writeSignedGenTx(cdc, outputDocument, signedTx); err != nil { + if err := writeSignedGenTx(cdc, outputDocument, stdTx); err != nil { return errors.Wrap(err, "failed to write signed gen tx") } @@ -219,7 +221,7 @@ func readUnsignedGenTxFile(cdc codec.JSONMarshaler, r io.Reader) (authtypes.StdT return stdTx, err } -func writeSignedGenTx(cdc codec.JSONMarshaler, outputDocument string, tx authtypes.StdTx) error { +func writeSignedGenTx(cdc codec.JSONMarshaler, outputDocument string, tx sdk.Tx) error { outputFile, err := os.OpenFile(outputDocument, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0644) if err != nil { return err diff --git a/x/staking/client/cli/tx.go b/x/staking/client/cli/tx.go index bdad214cbc04..4058fa44954d 100644 --- a/x/staking/client/cli/tx.go +++ b/x/staking/client/cli/tx.go @@ -14,7 +14,6 @@ import ( "github.com/cosmos/cosmos-sdk/client/tx" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/version" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -491,7 +490,7 @@ func PrepareConfigForTxCreateValidator(flagSet *flag.FlagSet, moniker, nodeID, c } // BuildCreateValidatorMsg makes a new MsgCreateValidator. -func BuildCreateValidatorMsg(clientCtx client.Context, config TxCreateValidatorConfig, txBldr authtypes.TxBuilder, generateOnly bool) (authtypes.TxBuilder, sdk.Msg, error) { +func BuildCreateValidatorMsg(clientCtx client.Context, config TxCreateValidatorConfig, txBldr tx.Factory, generateOnly bool) (tx.Factory, sdk.Msg, error) { amounstStr := config.Amount amount, err := sdk.ParseCoin(amounstStr) From 2d5335be3925d0fe206aeb75bad57575d554cdae Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Thu, 16 Jul 2020 18:23:22 +0530 Subject: [PATCH 06/40] add wrap tx builder --- client/tx_generator.go | 2 +- types/tx/tx.go | 68 +++++++++++++++++++++++++++++++ x/auth/client/cli/tx_multisign.go | 4 -- x/auth/client/cli/tx_sign.go | 10 ++++- x/auth/client/rest.go | 2 +- x/auth/client/tx.go | 22 ++++++++++ x/auth/tx/generator.go | 15 +++++++ x/auth/types/client_tx.go | 15 +++++++ x/genutil/client/cli/gentx.go | 2 +- 9 files changed, 131 insertions(+), 9 deletions(-) create mode 100644 types/tx/tx.go diff --git a/client/tx_generator.go b/client/tx_generator.go index 6718a603defa..83392710b97d 100644 --- a/client/tx_generator.go +++ b/client/tx_generator.go @@ -13,7 +13,7 @@ type ( TxGenerator interface { NewTxBuilder() TxBuilder SignModeHandler() signing.SignModeHandler - + WrapTxBuilder(sdk.Tx) (TxBuilder, error) TxEncoder() sdk.TxEncoder TxDecoder() sdk.TxDecoder TxJSONEncoder() sdk.TxEncoder diff --git a/types/tx/tx.go b/types/tx/tx.go new file mode 100644 index 000000000000..4484ffc42bc1 --- /dev/null +++ b/types/tx/tx.go @@ -0,0 +1,68 @@ +package tx + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" +) + +func (tx *Tx) GetMsgs() []sdk.Msg { + anys := tx.Body.Messages + res := make([]sdk.Msg, len(anys)) + for i, any := range anys { + msg := any.GetCachedValue().(sdk.Msg) + res[i] = msg + } + return res +} + +func (tx *Tx) ValidateBasic() error { + sigs := tx.GetSignatures() + + if tx.GetGas() > authtypes.MaxGasWanted { + return sdkerrors.Wrapf( + sdkerrors.ErrInvalidRequest, + "invalid gas supplied; %d > %d", tx.GetGas(), authtypes.MaxGasWanted, + ) + } + if tx.GetFee().IsAnyNegative() { + return sdkerrors.Wrapf( + sdkerrors.ErrInsufficientFee, + "invalid fee provided: %s", tx.GetFee(), + ) + } + if len(sigs) == 0 { + return sdkerrors.ErrNoSignatures + } + if len(sigs) != len(tx.GetSigners()) { + return sdkerrors.Wrapf( + sdkerrors.ErrUnauthorized, + "wrong number of signers; expected %d, got %d", tx.GetSigners(), len(sigs), + ) + } + + return nil +} + +func (m *Tx) GetGas() uint64 { + return m.AuthInfo.Fee.GasLimit +} + +func (m *Tx) GetFee() sdk.Coins { + return m.AuthInfo.Fee.Amount +} + +func (m *Tx) GetSigners() []sdk.AccAddress { + var signers []sdk.AccAddress + seen := map[string]bool{} + + for _, msg := range m.GetMsgs() { + for _, addr := range msg.GetSigners() { + if !seen[addr.String()] { + signers = append(signers, addr) + seen[addr.String()] = true + } + } + } + return signers +} diff --git a/x/auth/client/cli/tx_multisign.go b/x/auth/client/cli/tx_multisign.go index 491c0f9add55..013eadce76e4 100644 --- a/x/auth/client/cli/tx_multisign.go +++ b/x/auth/client/cli/tx_multisign.go @@ -15,7 +15,6 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/errors" signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" "github.com/cosmos/cosmos-sdk/version" authclient "github.com/cosmos/cosmos-sdk/x/auth/client" @@ -88,9 +87,6 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { multisigSig := multisig.NewMultisig(len(multisigPub.PubKeys)) clientCtx = clientCtx.InitWithInput(inBuf) txFactory := tx.NewFactoryCLI(clientCtx, cmd.Flags()) - if err != nil { - return errors.Wrap(err, "error creating stdTx builder from flags") - } if !clientCtx.Offline { accnum, seq, err := types.NewAccountRetriever(clientCtx.JSONMarshaler).GetAccountNumberSequence(clientCtx, multisigInfo.GetAddress()) diff --git a/x/auth/client/cli/tx_sign.go b/x/auth/client/cli/tx_sign.go index 2459147b2086..8ce5c2151f41 100644 --- a/x/auth/client/cli/tx_sign.go +++ b/x/auth/client/cli/tx_sign.go @@ -67,7 +67,6 @@ func makeSignBatchCmd() func(cmd *cobra.Command, args []string) error { txFactory := tx.NewFactoryCLI(clientCtx, cmd.Flags()) txGen := clientCtx.TxGenerator - txBuilder := txGen.NewTxBuilder() var err error generateSignatureOnly, _ := cmd.Flags().GetBool(flagSigOnly) @@ -107,6 +106,10 @@ func makeSignBatchCmd() func(cmd *cobra.Command, args []string) error { unsignedStdTx := scanner.StdTx() txFactory = txFactory.WithSequence(sequence) + txBuilder, err := clientCtx.TxGenerator.WrapTxBuilder(unsignedStdTx) + if err != nil { + return err + } if multisigAddr.Empty() { homeDir, _ := cmd.Flags().GetString(flags.FlagFrom) @@ -217,7 +220,10 @@ func makeSignCmd() func(cmd *cobra.Command, args []string) error { return err } txGen := clientCtx.TxGenerator - txBuilder := txGen.NewTxBuilder() + txBuilder, err := clientCtx.TxGenerator.WrapTxBuilder(newTx) + if err != nil { + return err + } txFactory := tx.NewFactoryCLI(clientCtx, cmd.Flags()) // if --signature-only is on, then override --append diff --git a/x/auth/client/rest.go b/x/auth/client/rest.go index 1d52f0384bd7..abbb4bee86c4 100644 --- a/x/auth/client/rest.go +++ b/x/auth/client/rest.go @@ -35,7 +35,7 @@ func WriteGenerateStdTxResponse(w http.ResponseWriter, clientCtx client.Context, return } - txBldr, err = EnrichWithGas(txBldr, clientCtx, msgs) + txBldr, err = OldEnrichWithGas(txBldr, clientCtx, msgs) if rest.CheckInternalServerError(w, err) { return } diff --git a/x/auth/client/tx.go b/x/auth/client/tx.go index 02af9568bfac..29a91132f07e 100644 --- a/x/auth/client/tx.go +++ b/x/auth/client/tx.go @@ -125,6 +125,17 @@ func EnrichWithGas(txBldr tx.Factory, clientCtx client.Context, msgs []sdk.Msg) return txBldr.WithGas(adjusted), nil } +// EnrichWithGas calculates the gas estimate that would be consumed by the +// transaction and set the transaction's respective value accordingly. +func OldEnrichWithGas(txBldr authtypes.TxBuilder, clientCtx client.Context, msgs []sdk.Msg) (authtypes.TxBuilder, error) { + _, adjusted, err := oldSimulateMsgs(txBldr, clientCtx, msgs) + if err != nil { + return txBldr, err + } + + return txBldr.WithGas(adjusted), nil +} + // CalculateGas simulates the execution of a transaction and returns // the simulation response obtained by the query and the adjusted gas amount. func CalculateGas( @@ -293,6 +304,17 @@ func simulateMsgs(txBldr tx.Factory, clientCtx client.Context, msgs []sdk.Msg) ( return CalculateGas(clientCtx.QueryWithData, clientCtx.Codec, txBytes, txBldr.GasAdjustment()) } +// simulateMsgs simulates the transaction and returns the simulation response and +// the adjusted gas value. +func oldSimulateMsgs(txBldr authtypes.TxBuilder, clientCtx client.Context, msgs []sdk.Msg) (sdk.SimulationResponse, uint64, error) { + txBytes, err := txBldr.BuildTxForSim(msgs) + if err != nil { + return sdk.SimulationResponse{}, 0, err + } + + return CalculateGas(clientCtx.QueryWithData, clientCtx.Codec, txBytes, txBldr.GasAdjustment()) +} + func adjustGasEstimate(estimate uint64, adjustment float64) uint64 { return uint64(adjustment * float64(estimate)) } diff --git a/x/auth/tx/generator.go b/x/auth/tx/generator.go index de54b017b974..6905af41fbc5 100644 --- a/x/auth/tx/generator.go +++ b/x/auth/tx/generator.go @@ -1,10 +1,13 @@ package tx import ( + "fmt" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/tx" "github.com/cosmos/cosmos-sdk/x/auth/signing" ) @@ -31,6 +34,18 @@ func NewTxGenerator(marshaler codec.Marshaler, pubkeyCodec types.PublicKeyCodec, } } +func (g generator) WrapTxBuilder(newTx sdk.Tx) (client.TxBuilder, error) { + stdTx, ok := newTx.(*tx.Tx) + if !ok { + return nil, fmt.Errorf("expected %T, got %T", &tx.Tx{}, newTx) + } + return &builder{ + tx: stdTx, + marshaler: g.marshaler, + pubkeyCodec: g.pubkeyCodec, + }, nil +} + func (g generator) NewTxBuilder() client.TxBuilder { return newBuilder(g.marshaler, g.pubkeyCodec) } diff --git a/x/auth/types/client_tx.go b/x/auth/types/client_tx.go index 3175cc89cf53..3d4232a69456 100644 --- a/x/auth/types/client_tx.go +++ b/x/auth/types/client_tx.go @@ -1,6 +1,10 @@ package types import ( + "fmt" + + "github.com/tendermint/tendermint/types" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/legacy" @@ -86,6 +90,17 @@ func (s StdTxGenerator) NewTxBuilder() client.TxBuilder { } } +func (s StdTxGenerator) WrapTxBuilder(newTx sdk.Tx) (client.TxBuilder, error) { + stdTx, ok := newTx.(StdTx) + if !ok { + return nil, fmt.Errorf("expected %T, got %T", &types.Tx{}, newTx) + } + return &StdTxBuilder{ + StdTx: stdTx, + cdc: s.Cdc, + }, nil +} + // MarshalTx implements TxGenerator.MarshalTx func (s StdTxGenerator) TxEncoder() sdk.TxEncoder { return DefaultTxEncoder(s.Cdc) diff --git a/x/genutil/client/cli/gentx.go b/x/genutil/client/cli/gentx.go index eb036918b69d..520348d6a9f5 100644 --- a/x/genutil/client/cli/gentx.go +++ b/x/genutil/client/cli/gentx.go @@ -169,7 +169,7 @@ $ %s gentx my-key-name --home=/path/to/home/dir --keyring-backend=os --chain-id= } // sign the transaction and write it to the output file - err := authclient.SignStdTx(txFactory, clientCtx, name, txBuilder, false, true) + err = authclient.SignStdTx(txFactory, clientCtx, name, txBuilder, false, true) if err != nil { return errors.Wrap(err, "failed to sign std tx") } From 688e9cdeeae073d43f83eeeb792ffe840340f4f5 Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Sun, 19 Jul 2020 21:36:21 +0530 Subject: [PATCH 07/40] update gentx cli --- x/auth/client/rest.go | 2 +- x/auth/client/tx.go | 143 ++---------------------------------------- 2 files changed, 7 insertions(+), 138 deletions(-) diff --git a/x/auth/client/rest.go b/x/auth/client/rest.go index abbb4bee86c4..1d52f0384bd7 100644 --- a/x/auth/client/rest.go +++ b/x/auth/client/rest.go @@ -35,7 +35,7 @@ func WriteGenerateStdTxResponse(w http.ResponseWriter, clientCtx client.Context, return } - txBldr, err = OldEnrichWithGas(txBldr, clientCtx, msgs) + txBldr, err = EnrichWithGas(txBldr, clientCtx, msgs) if rest.CheckInternalServerError(w, err) { return } diff --git a/x/auth/client/tx.go b/x/auth/client/tx.go index 29a91132f07e..9a3a3b88fb62 100644 --- a/x/auth/client/tx.go +++ b/x/auth/client/tx.go @@ -10,10 +10,8 @@ import ( "strings" "github.com/gogo/protobuf/jsonpb" - "github.com/pkg/errors" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/input" "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" @@ -39,84 +37,9 @@ func (gr GasEstimateResponse) String() string { return fmt.Sprintf("gas estimate: %d", gr.GasEstimate) } -// GenerateOrBroadcastMsgs creates a StdTx given a series of messages. If -// the provided context has generate-only enabled, the tx will only be printed -// to STDOUT in a fully offline manner. Otherwise, the tx will be signed and -// broadcasted. -func GenerateOrBroadcastMsgs(clientCtx client.Context, txBldr tx.Factory, msgs []sdk.Msg) error { - if clientCtx.GenerateOnly { - return PrintUnsignedStdTx(txBldr, clientCtx, msgs) - } - - return CompleteAndBroadcastTxCLI(txBldr, clientCtx, msgs) -} - -// CompleteAndBroadcastTxCLI implements a utility function that facilitates -// sending a series of messages in a signed transaction given a TxBuilder and a -// QueryContext. It ensures that the account exists, has a proper number and -// sequence set. In addition, it builds and signs a transaction with the -// supplied messages. Finally, it broadcasts the signed transaction to a node. -func CompleteAndBroadcastTxCLI(txBldr tx.Factory, clientCtx client.Context, msgs []sdk.Msg) error { - txBldr, err := PrepareTxBuilder(txBldr, clientCtx) - if err != nil { - return err - } - - fromName := clientCtx.GetFromName() - - if txBldr.SimulateAndExecute() || clientCtx.Simulate { - txBldr, err = EnrichWithGas(txBldr, clientCtx, msgs) - if err != nil { - return err - } - - gasEst := GasEstimateResponse{GasEstimate: txBldr.Gas()} - _, _ = fmt.Fprintf(os.Stderr, "%s\n", gasEst.String()) - } - - if clientCtx.Simulate { - return nil - } - - if !clientCtx.SkipConfirm { - stdSignMsg, err := txBldr.BuildSignMsg(msgs) - if err != nil { - return err - } - - json, err := clientCtx.JSONMarshaler.MarshalJSON(stdSignMsg) - if err != nil { - return err - } - - _, _ = fmt.Fprintf(os.Stderr, "%s\n\n", json) - - buf := bufio.NewReader(os.Stdin) - ok, err := input.GetConfirmation("confirm transaction before signing and broadcasting", buf, os.Stderr) - if err != nil || !ok { - _, _ = fmt.Fprintf(os.Stderr, "%s\n", "cancelled transaction") - return err - } - } - - // build and sign the transaction - txBytes, err := txBldr.BuildAndSign(fromName, msgs) - if err != nil { - return err - } - - // broadcast to a Tendermint node - res, err := clientCtx.BroadcastTx(txBytes) - if err != nil { - return err - } - - return clientCtx.PrintOutput(res) -} - // EnrichWithGas calculates the gas estimate that would be consumed by the // transaction and set the transaction's respective value accordingly. -func EnrichWithGas(txBldr tx.Factory, clientCtx client.Context, msgs []sdk.Msg) (tx.Factory, error) { +func EnrichWithGas(txBldr authtypes.TxBuilder, clientCtx client.Context, msgs []sdk.Msg) (authtypes.TxBuilder, error) { _, adjusted, err := simulateMsgs(txBldr, clientCtx, msgs) if err != nil { return txBldr, err @@ -125,17 +48,6 @@ func EnrichWithGas(txBldr tx.Factory, clientCtx client.Context, msgs []sdk.Msg) return txBldr.WithGas(adjusted), nil } -// EnrichWithGas calculates the gas estimate that would be consumed by the -// transaction and set the transaction's respective value accordingly. -func OldEnrichWithGas(txBldr authtypes.TxBuilder, clientCtx client.Context, msgs []sdk.Msg) (authtypes.TxBuilder, error) { - _, adjusted, err := oldSimulateMsgs(txBldr, clientCtx, msgs) - if err != nil { - return txBldr, err - } - - return txBldr.WithGas(adjusted), nil -} - // CalculateGas simulates the execution of a transaction and returns // the simulation response obtained by the query and the adjusted gas amount. func CalculateGas( @@ -161,18 +73,8 @@ func CalculateGas( // PrintUnsignedStdTx builds an unsigned StdTx and prints it to os.Stdout. func PrintUnsignedStdTx(txBldr tx.Factory, clientCtx client.Context, msgs []sdk.Msg) error { - stdTx, err := buildUnsignedStdTxOffline(txBldr, clientCtx, msgs) - if err != nil { - return err - } - - json, err := clientCtx.JSONMarshaler.MarshalJSON(stdTx) - if err != nil { - return err - } - - _, _ = fmt.Fprintf(clientCtx.Output, "%s\n", json) - return nil + err := tx.GenerateOrBroadcastTxWithFactory(clientCtx, txBldr, msgs...) + return err } // SignStdTx appends a signature to a StdTx and returns a copy of it. If appendSig @@ -185,11 +87,11 @@ func SignStdTx(txFactory tx.Factory, clientCtx client.Context, name string, return err } addr := sdk.AccAddress(info.GetPubKey().Address()) - if !isTxSigner(sdk.AccAddress(addr), stdTx.GetTx().(authtypes.StdTx).GetSigners()) { + if !isTxSigner(addr, stdTx.GetTx().(authtypes.StdTx).GetSigners()) { return fmt.Errorf("%s: %s", sdkerrors.ErrorInvalidSigner, name) } if !offline { - txFactory, err = populateAccountFromState(txFactory, clientCtx, sdk.AccAddress(addr)) + txFactory, err = populateAccountFromState(txFactory, clientCtx, addr) if err != nil { return err } @@ -295,18 +197,7 @@ func GetTxEncoder(cdc *codec.Codec) (encoder sdk.TxEncoder) { // simulateMsgs simulates the transaction and returns the simulation response and // the adjusted gas value. -func simulateMsgs(txBldr tx.Factory, clientCtx client.Context, msgs []sdk.Msg) (sdk.SimulationResponse, uint64, error) { - txBytes, err := txBldr.BuildTxForSim(msgs) - if err != nil { - return sdk.SimulationResponse{}, 0, err - } - - return CalculateGas(clientCtx.QueryWithData, clientCtx.Codec, txBytes, txBldr.GasAdjustment()) -} - -// simulateMsgs simulates the transaction and returns the simulation response and -// the adjusted gas value. -func oldSimulateMsgs(txBldr authtypes.TxBuilder, clientCtx client.Context, msgs []sdk.Msg) (sdk.SimulationResponse, uint64, error) { +func simulateMsgs(txBldr authtypes.TxBuilder, clientCtx client.Context, msgs []sdk.Msg) (sdk.SimulationResponse, uint64, error) { txBytes, err := txBldr.BuildTxForSim(msgs) if err != nil { return sdk.SimulationResponse{}, 0, err @@ -356,28 +247,6 @@ func PrepareTxBuilder(txBldr tx.Factory, clientCtx client.Context) (tx.Factory, return txBldr, nil } -func buildUnsignedStdTxOffline(txBldr tx.Factory, clientCtx client.Context, msgs []sdk.Msg) (stdTx authtypes.StdTx, err error) { - if txBldr.SimulateAndExecute() { - if clientCtx.Offline { - return stdTx, errors.New("cannot estimate gas in offline mode") - } - - txBldr, err = EnrichWithGas(txBldr, clientCtx, msgs) - if err != nil { - return stdTx, err - } - - _, _ = fmt.Fprintf(os.Stderr, "estimated gas = %v\n", txBldr.Gas()) - } - - stdSignMsg, err := txBldr.BuildSignMsg(msgs) - if err != nil { - return stdTx, err - } - - return authtypes.NewStdTx(stdSignMsg.Msgs, stdSignMsg.Fee, nil, stdSignMsg.Memo), nil -} - func isTxSigner(user sdk.AccAddress, signers []sdk.AccAddress) bool { for _, s := range signers { if bytes.Equal(user.Bytes(), s.Bytes()) { From 64f7aaf95b35aa78f18d5d1d11efc70747501fba Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Mon, 20 Jul 2020 00:31:25 +0530 Subject: [PATCH 08/40] update validate sigs cmd --- crypto/types/multisig/pubkey.go | 3 + crypto/types/multisig/threshold_pubkey.go | 5 ++ x/auth/client/cli/tx_multisign.go | 2 +- x/auth/client/cli/validate_sigs.go | 78 ++++++----------------- 4 files changed, 30 insertions(+), 58 deletions(-) diff --git a/crypto/types/multisig/pubkey.go b/crypto/types/multisig/pubkey.go index a3935a4bb4d4..51d432f59ca7 100644 --- a/crypto/types/multisig/pubkey.go +++ b/crypto/types/multisig/pubkey.go @@ -17,6 +17,9 @@ type PubKey interface { // GetPubKeys returns the crypto.PubKey's nested within the multi-sig PubKey GetPubKeys() []crypto.PubKey + + // GetThreshold returns the threshold number of signatures that must be obtained to verify a signature. + GetThreshold() uint } // GetSignBytesFunc defines a function type which returns sign bytes for a given SignMode or an error. diff --git a/crypto/types/multisig/threshold_pubkey.go b/crypto/types/multisig/threshold_pubkey.go index 911843e35cc1..44fc48b6ede1 100644 --- a/crypto/types/multisig/threshold_pubkey.go +++ b/crypto/types/multisig/threshold_pubkey.go @@ -154,3 +154,8 @@ func (pk PubKeyMultisigThreshold) Equals(other crypto.PubKey) bool { } return true } + +// GetThreshold implements the PubKey.GetThreshold method +func (pk PubKeyMultisigThreshold) GetThreshold() uint { + return pk.K +} diff --git a/x/auth/client/cli/tx_multisign.go b/x/auth/client/cli/tx_multisign.go index 013eadce76e4..04ad605926fa 100644 --- a/x/auth/client/cli/tx_multisign.go +++ b/x/auth/client/cli/tx_multisign.go @@ -179,7 +179,7 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { } } -func readAndUnmarshalStdSignature(clientCtx client.Context, filename string) (stdSig signingtypes.SignatureV2, err error) { //nolint:staticcheck +func readAndUnmarshalStdSignature(clientCtx client.Context, filename string) (stdSig signingtypes.SignatureV2, err error) { var bytes []byte if bytes, err = ioutil.ReadFile(filename); err != nil { return diff --git a/x/auth/client/cli/validate_sigs.go b/x/auth/client/cli/validate_sigs.go index 2a1d758ac2ce..b871b95c8223 100644 --- a/x/auth/client/cli/validate_sigs.go +++ b/x/auth/client/cli/validate_sigs.go @@ -3,17 +3,15 @@ package cli import ( "bufio" "fmt" - "strings" "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/client/tx" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" sdk "github.com/cosmos/cosmos-sdk/types" authclient "github.com/cosmos/cosmos-sdk/x/auth/client" - "github.com/cosmos/cosmos-sdk/x/auth/types" + authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" ) func GetValidateSignaturesCommand() *cobra.Command { @@ -42,11 +40,10 @@ transaction will be not be performed as that will require RPC communication with func makeValidateSignaturesCmd() func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error { clientCtx := client.GetClientContextFromCmd(cmd) - clientCtx, txBldr, tx, err := readStdTxAndInitContexts(clientCtx, cmd, args[0]) + clientCtx, txBldr, stdTx, err := readTxAndInitContexts(clientCtx, cmd, args[0]) if err != nil { return err } - stdTx := tx.(types.StdTx) if !printAndValidateSigs(cmd, clientCtx, txBldr.ChainID(), stdTx, clientCtx.Offline) { return fmt.Errorf("signatures validation failed") @@ -60,17 +57,22 @@ func makeValidateSignaturesCmd() func(cmd *cobra.Command, args []string) error { // expected signers. In addition, if offline has not been supplied, the signature is // verified over the transaction sign bytes. Returns false if the validation fails. func printAndValidateSigs( - cmd *cobra.Command, clientCtx client.Context, chainID string, stdTx types.StdTx, offline bool, + cmd *cobra.Command, clientCtx client.Context, chainID string, tx sdk.Tx, offline bool, ) bool { - cmd.Println("Signers:") - signers := stdTx.GetSigners() + sigTx := tx.(authsigning.SigVerifiableTx) + signModeHandler := clientCtx.TxGenerator.SignModeHandler() + cmd.Println("Signers:") + signers := sigTx.GetSigners() for i, signer := range signers { cmd.Printf(" %v: %v\n", i, signer.String()) } success := true - sigs := stdTx.Signatures + sigs, err := sigTx.GetSignaturesV2() + if err != nil { + panic(err) + } cmd.Println("") cmd.Println("Signatures:") @@ -80,9 +82,10 @@ func printAndValidateSigs( for i, sig := range sigs { var ( + pubKey = sig.PubKey multiSigHeader string multiSigMsg string - sigAddr = sdk.AccAddress(sig.GetPubKey().Address()) + sigAddr = sdk.AccAddress(pubKey.Address()) sigSanity = "OK" ) @@ -94,40 +97,21 @@ func printAndValidateSigs( // Validate the actual signature over the transaction bytes since we can // reach out to a full node to query accounts. if !offline && success { - acc, err := types.NewAccountRetriever(clientCtx.JSONMarshaler).GetAccount(clientCtx, sigAddr) + accNum, accSeq, err := clientCtx.AccountRetriever.GetAccountNumberSequence(clientCtx, sigAddr) if err != nil { cmd.Printf("failed to get account: %s\n", sigAddr) return false } - sigBytes := types.StdSignBytes( - chainID, acc.GetAccountNumber(), acc.GetSequence(), - stdTx.Fee, stdTx.GetMsgs(), stdTx.GetMemo(), - ) - - if ok := sig.GetPubKey().VerifyBytes(sigBytes, sig.Signature); !ok { - sigSanity = "ERROR: signature invalid" - success = false + signingData := authsigning.SignerData{ + ChainID: chainID, + AccountNumber: accNum, + AccountSequence: accSeq, } - } - - multiPK, ok := sig.GetPubKey().(multisig.PubKeyMultisigThreshold) - if ok { - var multiSig multisig.AminoMultisignature - clientCtx.Codec.MustUnmarshalBinaryBare(sig.Signature, &multiSig) - - var b strings.Builder - b.WriteString("\n MultiSig Signatures:\n") - - for i := 0; i < multiSig.BitArray.Count(); i++ { - if multiSig.BitArray.GetIndex(i) { - addr := sdk.AccAddress(multiPK.PubKeys[i].Address().Bytes()) - b.WriteString(fmt.Sprintf(" %d: %s (weight: %d)\n", i, addr, 1)) - } + err = authsigning.VerifySignature(pubKey, signingData, sig.Data, signModeHandler, sigTx) + if err != nil { + return false } - - multiSigHeader = fmt.Sprintf(" [multisig threshold: %d/%d]", multiPK.K, len(multiPK.PubKeys)) - multiSigMsg = b.String() } cmd.Printf(" %d: %s\t\t\t[%s]%s%s\n", i, sigAddr.String(), sigSanity, multiSigHeader, multiSigMsg) @@ -149,23 +133,3 @@ func readTxAndInitContexts(clientCtx client.Context, cmd *cobra.Command, filenam return clientCtx, txFactory, stdTx, nil } - -// deprecated -func readStdTxAndInitContexts(clientCtx client.Context, cmd *cobra.Command, filename string) ( - client.Context, types.TxBuilder, sdk.Tx, error, -) { - stdTx, err := authclient.ReadTxFromFile(clientCtx, filename) - if err != nil { - return client.Context{}, types.TxBuilder{}, types.StdTx{}, err - } - - inBuf := bufio.NewReader(cmd.InOrStdin()) - clientCtx = clientCtx.WithInput(inBuf) - - txBldr, err := types.NewTxBuilderFromFlags(inBuf, cmd.Flags(), clientCtx.HomeDir) - if err != nil { - return client.Context{}, types.TxBuilder{}, types.StdTx{}, err - } - - return clientCtx, txBldr, stdTx, nil -} From 987af3778e75e288eb55cb6a458a0d5b749df8d9 Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Mon, 20 Jul 2020 00:34:11 +0530 Subject: [PATCH 09/40] fix lint --- types/tx/tx.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/types/tx/tx.go b/types/tx/tx.go index 4484ffc42bc1..e87c7fa3d551 100644 --- a/types/tx/tx.go +++ b/types/tx/tx.go @@ -6,8 +6,8 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) -func (tx *Tx) GetMsgs() []sdk.Msg { - anys := tx.Body.Messages +func (m *Tx) GetMsgs() []sdk.Msg { + anys := m.Body.Messages res := make([]sdk.Msg, len(anys)) for i, any := range anys { msg := any.GetCachedValue().(sdk.Msg) @@ -16,28 +16,28 @@ func (tx *Tx) GetMsgs() []sdk.Msg { return res } -func (tx *Tx) ValidateBasic() error { - sigs := tx.GetSignatures() +func (m *Tx) ValidateBasic() error { + sigs := m.GetSignatures() - if tx.GetGas() > authtypes.MaxGasWanted { + if m.GetGas() > authtypes.MaxGasWanted { return sdkerrors.Wrapf( sdkerrors.ErrInvalidRequest, - "invalid gas supplied; %d > %d", tx.GetGas(), authtypes.MaxGasWanted, + "invalid gas supplied; %d > %d", m.GetGas(), authtypes.MaxGasWanted, ) } - if tx.GetFee().IsAnyNegative() { + if m.GetFee().IsAnyNegative() { return sdkerrors.Wrapf( sdkerrors.ErrInsufficientFee, - "invalid fee provided: %s", tx.GetFee(), + "invalid fee provided: %s", m.GetFee(), ) } if len(sigs) == 0 { return sdkerrors.ErrNoSignatures } - if len(sigs) != len(tx.GetSigners()) { + if len(sigs) != len(m.GetSigners()) { return sdkerrors.Wrapf( sdkerrors.ErrUnauthorized, - "wrong number of signers; expected %d, got %d", tx.GetSigners(), len(sigs), + "wrong number of signers; expected %d, got %d", m.GetSigners(), len(sigs), ) } From 167df15c098f123f0b97d1a779aa107693ac4a83 Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Mon, 20 Jul 2020 02:47:47 +0530 Subject: [PATCH 10/40] add flag reader to cli --- x/auth/client/cli/tx_multisign.go | 4 ++ x/auth/client/cli/tx_sign.go | 27 +++++----- x/auth/client/cli/validate_sigs.go | 5 ++ x/auth/client/tx.go | 8 ++- x/auth/client/tx_test.go | 87 +++++++++++++++--------------- 5 files changed, 72 insertions(+), 59 deletions(-) diff --git a/x/auth/client/cli/tx_multisign.go b/x/auth/client/cli/tx_multisign.go index 04ad605926fa..dc2f49853dbb 100644 --- a/x/auth/client/cli/tx_multisign.go +++ b/x/auth/client/cli/tx_multisign.go @@ -61,6 +61,10 @@ recommended to set such parameters manually. func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) (err error) { clientCtx := client.GetClientContextFromCmd(cmd) + clientCtx, err = client.ReadTxCommandFlags(clientCtx, cmd.Flags()) + if err != nil { + return err + } cdc := clientCtx.Codec stdTx, err := authclient.ReadTxFromFile(clientCtx, args[0]) if err != nil { diff --git a/x/auth/client/cli/tx_sign.go b/x/auth/client/cli/tx_sign.go index 8ce5c2151f41..4126c69c3223 100644 --- a/x/auth/client/cli/tx_sign.go +++ b/x/auth/client/cli/tx_sign.go @@ -62,12 +62,15 @@ account key. It implies --signature-only. func makeSignBatchCmd() func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error { clientCtx := client.GetClientContextFromCmd(cmd) + clientCtx, err := client.ReadTxCommandFlags(clientCtx, cmd.Flags()) + if err != nil { + return err + } inBuf := bufio.NewReader(cmd.InOrStdin()) clientCtx = clientCtx.InitWithInput(inBuf) txFactory := tx.NewFactoryCLI(clientCtx, cmd.Flags()) txGen := clientCtx.TxGenerator - var err error generateSignatureOnly, _ := cmd.Flags().GetBool(flagSigOnly) var ( @@ -98,8 +101,8 @@ func makeSignBatchCmd() func(cmd *cobra.Command, args []string) error { return err } } - - scanner := authclient.NewBatchScanner(clientCtx.JSONMarshaler, infile) + marhsaler := clientCtx.JSONMarshaler.(codec.Marshaler) + scanner := authclient.NewBatchScanner(marhsaler, infile, txGen) for sequence := txFactory.Sequence(); scanner.Scan(); sequence++ { var stdTx types.StdTx @@ -132,7 +135,7 @@ func makeSignBatchCmd() func(cmd *cobra.Command, args []string) error { return err } - json, err := newGetSignatureJSON(clientCtx.JSONMarshaler, txGen, txBuilder, stdTx, generateSignatureOnly) + json, err := getSignatureJSON(clientCtx.JSONMarshaler, txGen, txBuilder, stdTx, generateSignatureOnly) if err != nil { return err } @@ -214,6 +217,10 @@ func preSignCmd(cmd *cobra.Command, _ []string) { func makeSignCmd() func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error { clientCtx := client.GetClientContextFromCmd(cmd) + clientCtx, err := client.ReadTxCommandFlags(clientCtx, cmd.Flags()) + if err != nil { + return err + } clientCtx, txF, newTx, err := readTxAndInitContexts(clientCtx, cmd, args[0]) if err != nil { @@ -259,7 +266,7 @@ func makeSignCmd() func(cmd *cobra.Command, args []string) error { return err } - json, err := newGetSignatureJSON(clientCtx.JSONMarshaler, txGen, txBuilder, newTx, generateSignatureOnly) + json, err := getSignatureJSON(clientCtx.JSONMarshaler, txGen, txBuilder, newTx, generateSignatureOnly) if err != nil { return err } @@ -281,15 +288,7 @@ func makeSignCmd() func(cmd *cobra.Command, args []string) error { } } -func getSignatureJSON(cdc codec.JSONMarshaler, newTx types.StdTx, generateSignatureOnly bool) ([]byte, error) { - if generateSignatureOnly { - return cdc.MarshalJSON(newTx.Signatures[0]) - } - - return cdc.MarshalJSON(newTx) -} - -func newGetSignatureJSON(cdc codec.JSONMarshaler, txGen client.TxGenerator, txBldr client.TxBuilder, newTx sdk.Tx, generateSignatureOnly bool) ([]byte, error) { +func getSignatureJSON(cdc codec.JSONMarshaler, txGen client.TxGenerator, txBldr client.TxBuilder, newTx sdk.Tx, generateSignatureOnly bool) ([]byte, error) { if generateSignatureOnly { return cdc.MarshalJSON(txBldr.GetTx().GetSignatures()) } diff --git a/x/auth/client/cli/validate_sigs.go b/x/auth/client/cli/validate_sigs.go index b871b95c8223..b9b9c6d5e9f7 100644 --- a/x/auth/client/cli/validate_sigs.go +++ b/x/auth/client/cli/validate_sigs.go @@ -40,6 +40,11 @@ transaction will be not be performed as that will require RPC communication with func makeValidateSignaturesCmd() func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error { clientCtx := client.GetClientContextFromCmd(cmd) + clientCtx, err := client.ReadTxCommandFlags(clientCtx, cmd.Flags()) + if err != nil { + return err + } + clientCtx, txBldr, stdTx, err := readTxAndInitContexts(clientCtx, cmd, args[0]) if err != nil { return err diff --git a/x/auth/client/tx.go b/x/auth/client/tx.go index 9a3a3b88fb62..9d863635c6b8 100644 --- a/x/auth/client/tx.go +++ b/x/auth/client/tx.go @@ -139,7 +139,7 @@ func ReadTxFromFile(ctx client.Context, filename string) (tx sdk.Tx, err error) } // NewBatchScanner returns a new BatchScanner to read newline-delimited StdTx transactions from r. -func NewBatchScanner(cdc codec.JSONMarshaler, r io.Reader) *BatchScanner { +func NewBatchScanner(cdc codec.JSONMarshaler, r io.Reader, txG client.TxGenerator) *BatchScanner { return &BatchScanner{Scanner: bufio.NewScanner(r), cdc: cdc} } @@ -147,6 +147,7 @@ func NewBatchScanner(cdc codec.JSONMarshaler, r io.Reader) *BatchScanner { // of newline-delimited JSON encoded StdTx. type BatchScanner struct { *bufio.Scanner + txG client.TxGenerator stdTx sdk.Tx cdc codec.JSONMarshaler unmarshalErr error @@ -164,7 +165,10 @@ func (bs *BatchScanner) Scan() bool { return false } - if err := bs.cdc.UnmarshalJSON(bs.Bytes(), &bs.stdTx); err != nil && bs.unmarshalErr == nil { + var err error + txD := bs.txG.TxJSONDecoder() + bs.stdTx, err = txD(bs.Bytes()) + if err != nil && bs.unmarshalErr == nil { bs.unmarshalErr = err return false } diff --git a/x/auth/client/tx_test.go b/x/auth/client/tx_test.go index e5d7fd3088d2..b82f2e6d9846 100644 --- a/x/auth/client/tx_test.go +++ b/x/auth/client/tx_test.go @@ -151,6 +151,8 @@ func TestBatchScanner_Scan(t *testing.T) { t.Parallel() cdc := codec.New() sdk.RegisterCodec(cdc) + encodingConfig := simappparams.MakeEncodingConfig() + txGen := encodingConfig.TxGenerator batch1 := `{"msg":[],"fee":{"amount":[{"denom":"atom","amount":"150"}],"gas":"50000"},"signatures":[],"memo":"foomemo"} {"msg":[],"fee":{"amount":[{"denom":"atom","amount":"150"}],"gas":"10000"},"signatures":[],"memo":"foomemo"} @@ -182,12 +184,11 @@ malformed for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { - scanner, i := NewBatchScanner(cdc, strings.NewReader(tt.batch)), 0 + scanner, i := NewBatchScanner(cdc, strings.NewReader(tt.batch), txGen), 0 for scanner.Scan() { _ = scanner.StdTx() i++ } - require.Equal(t, tt.wantScannerError, scanner.Err() != nil) require.Equal(t, tt.wantUnmarshalError, scanner.UnmarshalErr() != nil) require.Equal(t, tt.numTxs, i) @@ -206,47 +207,47 @@ func compareEncoders(t *testing.T, expected sdk.TxEncoder, actual sdk.TxEncoder) require.Equal(t, defaultEncoderBytes, encoderBytes) } -func TestPrepareTxBuilder(t *testing.T) { - cdc := makeCodec() - - encodingConfig := simappparams.MakeEncodingConfig() - sdk.RegisterCodec(encodingConfig.Amino) - - fromAddr := sdk.AccAddress("test-addr0000000000") - fromAddrStr := fromAddr.String() - - var accNum uint64 = 10 - var accSeq uint64 = 17 - - txGen := encodingConfig.TxGenerator - clientCtx := client.Context{} - clientCtx = clientCtx. - WithTxGenerator(txGen). - WithJSONMarshaler(encodingConfig.Marshaler). - WithAccountRetriever(client.TestAccountRetriever{Accounts: map[string]struct { - Address sdk.AccAddress - Num uint64 - Seq uint64 - }{ - fromAddrStr: { - Address: fromAddr, - Num: accNum, - Seq: accSeq, - }, - }}). - WithFromAddress(fromAddr) - - bldr := authtypes.NewTxBuilder( - authtypes.DefaultTxEncoder(cdc), 0, 0, - 200000, 1.1, false, "test-chain", - "test-builder", sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1))), - sdk.DecCoins{sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, sdk.NewDecWithPrec(10000, sdk.Precision))}) - - bldr, err := PrepareTxBuilder(bldr, clientCtx) - require.NoError(t, err) - require.Equal(t, accNum, bldr.AccountNumber()) - require.Equal(t, accSeq, bldr.Sequence()) -} +// func TestPrepareTxBuilder(t *testing.T) { +// cdc := makeCodec() +// +// encodingConfig := simappparams.MakeEncodingConfig() +// sdk.RegisterCodec(encodingConfig.Amino) +// +// fromAddr := sdk.AccAddress("test-addr0000000000") +// fromAddrStr := fromAddr.String() +// +// var accNum uint64 = 10 +// var accSeq uint64 = 17 +// +// txGen := encodingConfig.TxGenerator +// clientCtx := client.Context{} +// clientCtx = clientCtx. +// WithTxGenerator(txGen). +// WithJSONMarshaler(encodingConfig.Marshaler). +// WithAccountRetriever(client.TestAccountRetriever{Accounts: map[string]struct { +// Address sdk.AccAddress +// Num uint64 +// Seq uint64 +// }{ +// fromAddrStr: { +// Address: fromAddr, +// Num: accNum, +// Seq: accSeq, +// }, +// }}). +// WithFromAddress(fromAddr) +// +// bldr := tx.NewFactoryCLI(clientCtx, ) +// authtypes.DefaultTxEncoder(cdc), 0, 0, +// 200000, 1.1, false, "test-chain", +// "test-builder", sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1))), +// sdk.DecCoins{sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, sdk.NewDecWithPrec(10000, sdk.Precision))}) +// +// bldr, err := PrepareTxBuilder(bldr, clientCtx) +// require.NoError(t, err) +// require.Equal(t, accNum, bldr.AccountNumber()) +// require.Equal(t, accSeq, bldr.Sequence()) +// } func makeCodec() *codec.Codec { var cdc = codec.New() From 8f8273475eb955fda7b7cc5cefb9421e2a26f2c8 Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Mon, 20 Jul 2020 03:25:13 +0530 Subject: [PATCH 11/40] update marshaler for batchscan --- x/auth/client/cli/tx_sign.go | 2 +- x/auth/client/tx.go | 10 ++++++---- x/auth/client/tx_test.go | 3 +-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/x/auth/client/cli/tx_sign.go b/x/auth/client/cli/tx_sign.go index 4126c69c3223..1d46f0391795 100644 --- a/x/auth/client/cli/tx_sign.go +++ b/x/auth/client/cli/tx_sign.go @@ -102,7 +102,7 @@ func makeSignBatchCmd() func(cmd *cobra.Command, args []string) error { } } marhsaler := clientCtx.JSONMarshaler.(codec.Marshaler) - scanner := authclient.NewBatchScanner(marhsaler, infile, txGen) + scanner := authclient.NewBatchScanner(marhsaler, infile) for sequence := txFactory.Sequence(); scanner.Scan(); sequence++ { var stdTx types.StdTx diff --git a/x/auth/client/tx.go b/x/auth/client/tx.go index 9d863635c6b8..db6a0c2e0700 100644 --- a/x/auth/client/tx.go +++ b/x/auth/client/tx.go @@ -14,8 +14,10 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/std" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) @@ -139,7 +141,7 @@ func ReadTxFromFile(ctx client.Context, filename string) (tx sdk.Tx, err error) } // NewBatchScanner returns a new BatchScanner to read newline-delimited StdTx transactions from r. -func NewBatchScanner(cdc codec.JSONMarshaler, r io.Reader, txG client.TxGenerator) *BatchScanner { +func NewBatchScanner(cdc codec.Marshaler, r io.Reader) *BatchScanner { return &BatchScanner{Scanner: bufio.NewScanner(r), cdc: cdc} } @@ -147,9 +149,8 @@ func NewBatchScanner(cdc codec.JSONMarshaler, r io.Reader, txG client.TxGenerato // of newline-delimited JSON encoded StdTx. type BatchScanner struct { *bufio.Scanner - txG client.TxGenerator stdTx sdk.Tx - cdc codec.JSONMarshaler + cdc codec.Marshaler unmarshalErr error } @@ -165,8 +166,9 @@ func (bs *BatchScanner) Scan() bool { return false } + pubKeyCdc := std.DefaultPublicKeyCodec{} var err error - txD := bs.txG.TxJSONDecoder() + txD := authtx.DefaultJSONTxDecoder(bs.cdc, pubKeyCdc) bs.stdTx, err = txD(bs.Bytes()) if err != nil && bs.unmarshalErr == nil { bs.unmarshalErr = err diff --git a/x/auth/client/tx_test.go b/x/auth/client/tx_test.go index b82f2e6d9846..8ba817dfe474 100644 --- a/x/auth/client/tx_test.go +++ b/x/auth/client/tx_test.go @@ -152,7 +152,6 @@ func TestBatchScanner_Scan(t *testing.T) { cdc := codec.New() sdk.RegisterCodec(cdc) encodingConfig := simappparams.MakeEncodingConfig() - txGen := encodingConfig.TxGenerator batch1 := `{"msg":[],"fee":{"amount":[{"denom":"atom","amount":"150"}],"gas":"50000"},"signatures":[],"memo":"foomemo"} {"msg":[],"fee":{"amount":[{"denom":"atom","amount":"150"}],"gas":"10000"},"signatures":[],"memo":"foomemo"} @@ -184,7 +183,7 @@ malformed for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { - scanner, i := NewBatchScanner(cdc, strings.NewReader(tt.batch), txGen), 0 + scanner, i := NewBatchScanner(encodingConfig.Marshaler, strings.NewReader(tt.batch)), 0 for scanner.Scan() { _ = scanner.StdTx() i++ From baebff4823ba303734138469a0222599c6c0d84e Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Mon, 20 Jul 2020 03:44:49 +0530 Subject: [PATCH 12/40] add register query server --- x/auth/module.go | 4 +++- x/mint/module.go | 4 +++- x/staking/module.go | 5 ++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/x/auth/module.go b/x/auth/module.go index bd4ebc027a82..3fbe28604ecc 100644 --- a/x/auth/module.go +++ b/x/auth/module.go @@ -118,7 +118,9 @@ func (am AppModule) NewQuerierHandler() sdk.Querier { return keeper.NewQuerier(am.accountKeeper) } -func (am AppModule) RegisterQueryService(grpc.Server) {} +func (am AppModule) RegisterQueryService(server grpc.Server) { + types.RegisterQueryServer(server, am.accountKeeper) +} // InitGenesis performs genesis initialization for the auth module. It returns // no validator updates. diff --git a/x/mint/module.go b/x/mint/module.go index 39c549280eb8..e85c5e256492 100644 --- a/x/mint/module.go +++ b/x/mint/module.go @@ -113,7 +113,9 @@ func (am AppModule) NewQuerierHandler() sdk.Querier { return keeper.NewQuerier(am.keeper) } -func (am AppModule) RegisterQueryService(grpc.Server) {} +func (am AppModule) RegisterQueryService(server grpc.Server) { + types.RegisterQueryServer(server, am.keeper) +} // InitGenesis performs genesis initialization for the mint module. It returns // no validator updates. diff --git a/x/staking/module.go b/x/staking/module.go index 77a66a8ca907..319d748db43e 100644 --- a/x/staking/module.go +++ b/x/staking/module.go @@ -121,7 +121,10 @@ func (am AppModule) NewQuerierHandler() sdk.Querier { return keeper.NewQuerier(am.keeper) } -func (am AppModule) RegisterQueryService(grpc.Server) {} +func (am AppModule) RegisterQueryService(server grpc.Server) { + querier := keeper.Querier{Keeper: am.keeper} + types.RegisterQueryServer(server, querier) +} // InitGenesis performs genesis initialization for the staking module. It returns // no validator updates. From 57c8798c6bfc9bdccfda3bbed77af4bc18537002 Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Tue, 21 Jul 2020 01:33:05 +0530 Subject: [PATCH 13/40] update to master --- x/auth/client/cli/tx_multisign.go | 9 ++-- x/auth/client/cli/tx_sign.go | 18 +++---- x/auth/client/cli/validate_sigs.go | 5 +- x/auth/client/tx_test.go | 76 ++++++++++++++---------------- x/genutil/client/cli/gentx.go | 2 +- 5 files changed, 47 insertions(+), 63 deletions(-) diff --git a/x/auth/client/cli/tx_multisign.go b/x/auth/client/cli/tx_multisign.go index dc2f49853dbb..252072624724 100644 --- a/x/auth/client/cli/tx_multisign.go +++ b/x/auth/client/cli/tx_multisign.go @@ -89,7 +89,6 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { multisigPub := multisigInfo.GetPubKey().(multisig.PubKeyMultisigThreshold) multisigSig := multisig.NewMultisig(len(multisigPub.PubKeys)) - clientCtx = clientCtx.InitWithInput(inBuf) txFactory := tx.NewFactoryCLI(clientCtx, cmd.Flags()) if !clientCtx.Offline { @@ -120,7 +119,7 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { AccountNumber: txFactory.AccountNumber(), AccountSequence: txFactory.Sequence(), } - err = signing.VerifySignature(stdSig.PubKey, signingData, stdSig.Data, clientCtx.TxGenerator.SignModeHandler(), stdTx) + err = signing.VerifySignature(stdSig.PubKey, signingData, stdSig.Data, clientCtx.TxConfig.SignModeHandler(), stdTx) if err != nil { return fmt.Errorf("couldn't verify signature") } @@ -135,12 +134,12 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { return err } - newStdSig := types.StdSignature{Signature: sigBz, PubKey: multisigPub.Bytes()} //nolint:staticcheck - newTx := types.NewStdTx(stdTx.GetMsgs(), fee, []types.StdSignature{newStdSig}, memoTx.GetMemo()) //nolint:staticcheck + newStdSig := types.StdSignature{Signature: sigBz, PubKey: multisigPub.Bytes()} // nolint:staticcheck + newTx := types.NewStdTx(stdTx.GetMsgs(), fee, []types.StdSignature{newStdSig}, memoTx.GetMemo()) // nolint:staticcheck var json []byte - txBuilder := clientCtx.TxGenerator.NewTxBuilder() + txBuilder := clientCtx.TxConfig.NewTxBuilder() if err != nil { return err } diff --git a/x/auth/client/cli/tx_sign.go b/x/auth/client/cli/tx_sign.go index 1d46f0391795..7c99db83f406 100644 --- a/x/auth/client/cli/tx_sign.go +++ b/x/auth/client/cli/tx_sign.go @@ -1,7 +1,6 @@ package cli import ( - "bufio" "fmt" "os" @@ -13,7 +12,6 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" authclient "github.com/cosmos/cosmos-sdk/x/auth/client" - "github.com/cosmos/cosmos-sdk/x/auth/types" ) const ( @@ -66,11 +64,9 @@ func makeSignBatchCmd() func(cmd *cobra.Command, args []string) error { if err != nil { return err } - inBuf := bufio.NewReader(cmd.InOrStdin()) - clientCtx = clientCtx.InitWithInput(inBuf) txFactory := tx.NewFactoryCLI(clientCtx, cmd.Flags()) - txGen := clientCtx.TxGenerator + txGen := clientCtx.TxConfig generateSignatureOnly, _ := cmd.Flags().GetBool(flagSigOnly) var ( @@ -105,11 +101,9 @@ func makeSignBatchCmd() func(cmd *cobra.Command, args []string) error { scanner := authclient.NewBatchScanner(marhsaler, infile) for sequence := txFactory.Sequence(); scanner.Scan(); sequence++ { - var stdTx types.StdTx - unsignedStdTx := scanner.StdTx() txFactory = txFactory.WithSequence(sequence) - txBuilder, err := clientCtx.TxGenerator.WrapTxBuilder(unsignedStdTx) + txBuilder, err := clientCtx.TxConfig.WrapTxBuilder(unsignedStdTx) if err != nil { return err } @@ -135,7 +129,7 @@ func makeSignBatchCmd() func(cmd *cobra.Command, args []string) error { return err } - json, err := getSignatureJSON(clientCtx.JSONMarshaler, txGen, txBuilder, stdTx, generateSignatureOnly) + json, err := getSignatureJSON(clientCtx.JSONMarshaler, txGen, txBuilder, unsignedStdTx, generateSignatureOnly) if err != nil { return err } @@ -226,8 +220,8 @@ func makeSignCmd() func(cmd *cobra.Command, args []string) error { if err != nil { return err } - txGen := clientCtx.TxGenerator - txBuilder, err := clientCtx.TxGenerator.WrapTxBuilder(newTx) + txGen := clientCtx.TxConfig + txBuilder, err := clientCtx.TxConfig.WrapTxBuilder(newTx) if err != nil { return err } @@ -288,7 +282,7 @@ func makeSignCmd() func(cmd *cobra.Command, args []string) error { } } -func getSignatureJSON(cdc codec.JSONMarshaler, txGen client.TxGenerator, txBldr client.TxBuilder, newTx sdk.Tx, generateSignatureOnly bool) ([]byte, error) { +func getSignatureJSON(cdc codec.JSONMarshaler, txGen client.TxConfig, txBldr client.TxBuilder, newTx sdk.Tx, generateSignatureOnly bool) ([]byte, error) { if generateSignatureOnly { return cdc.MarshalJSON(txBldr.GetTx().GetSignatures()) } diff --git a/x/auth/client/cli/validate_sigs.go b/x/auth/client/cli/validate_sigs.go index b9b9c6d5e9f7..d3258a6d07ff 100644 --- a/x/auth/client/cli/validate_sigs.go +++ b/x/auth/client/cli/validate_sigs.go @@ -1,7 +1,6 @@ package cli import ( - "bufio" "fmt" "github.com/spf13/cobra" @@ -65,7 +64,7 @@ func printAndValidateSigs( cmd *cobra.Command, clientCtx client.Context, chainID string, tx sdk.Tx, offline bool, ) bool { sigTx := tx.(authsigning.SigVerifiableTx) - signModeHandler := clientCtx.TxGenerator.SignModeHandler() + signModeHandler := clientCtx.TxConfig.SignModeHandler() cmd.Println("Signers:") signers := sigTx.GetSigners() @@ -132,8 +131,6 @@ func readTxAndInitContexts(clientCtx client.Context, cmd *cobra.Command, filenam return clientCtx, tx.Factory{}, nil, err } - inBuf := bufio.NewReader(cmd.InOrStdin()) - clientCtx = clientCtx.InitWithInput(inBuf) txFactory := tx.NewFactoryCLI(clientCtx, cmd.Flags()) return clientCtx, txFactory, stdTx, nil diff --git a/x/auth/client/tx_test.go b/x/auth/client/tx_test.go index 032aac9c5d70..e501a18d3fb2 100644 --- a/x/auth/client/tx_test.go +++ b/x/auth/client/tx_test.go @@ -206,47 +206,41 @@ func compareEncoders(t *testing.T, expected sdk.TxEncoder, actual sdk.TxEncoder) require.Equal(t, defaultEncoderBytes, encoderBytes) } -func TestPrepareTxBuilder(t *testing.T) { - cdc := makeCodec() - - encodingConfig := simappparams.MakeEncodingConfig() - sdk.RegisterCodec(encodingConfig.Amino) - - fromAddr := sdk.AccAddress("test-addr0000000000") - fromAddrStr := fromAddr.String() - - var accNum uint64 = 10 - var accSeq uint64 = 17 - - txGen := encodingConfig.TxConfig - clientCtx := client.Context{} - clientCtx = clientCtx. - WithTxConfig(txGen). - WithJSONMarshaler(encodingConfig.Marshaler). - WithAccountRetriever(client.TestAccountRetriever{Accounts: map[string]struct { - Address sdk.AccAddress - Num uint64 - Seq uint64 - }{ - fromAddrStr: { - Address: fromAddr, - Num: accNum, - Seq: accSeq, - }, - }}). - WithFromAddress(fromAddr) - - bldr := authtypes.NewTxBuilder( - authtypes.DefaultTxEncoder(cdc), 0, 0, - 200000, 1.1, false, "test-chain", - "test-builder", sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1))), - sdk.DecCoins{sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, sdk.NewDecWithPrec(10000, sdk.Precision))}) - - bldr, err := PrepareTxBuilder(bldr, clientCtx) - require.NoError(t, err) - require.Equal(t, accNum, bldr.AccountNumber()) - require.Equal(t, accSeq, bldr.Sequence()) -} +// func TestPrepareTxBuilder(t *testing.T) { +// encodingConfig := simappparams.MakeEncodingConfig() +// sdk.RegisterCodec(encodingConfig.Amino) +// +// fromAddr := sdk.AccAddress("test-addr0000000000") +// fromAddrStr := fromAddr.String() +// +// var accNum uint64 = 10 +// var accSeq uint64 = 17 +// +// txGen := encodingConfig.TxConfig +// clientCtx := client.Context{} +// clientCtx = clientCtx. +// WithTxConfig(txGen). +// WithJSONMarshaler(encodingConfig.Marshaler). +// WithAccountRetriever(client.TestAccountRetriever{Accounts: map[string]struct { +// Address sdk.AccAddress +// Num uint64 +// Seq uint64 +// }{ +// fromAddrStr: { +// Address: fromAddr, +// Num: accNum, +// Seq: accSeq, +// }, +// }}). +// WithFromAddress(fromAddr) +// +// txFactory := tx.NewFactoryCLI(clientCtx, nil) +// +// bldr, err := PrepareTxBuilder(txFactory, clientCtx) +// require.NoError(t, err) +// require.Equal(t, accNum, bldr.AccountNumber()) +// require.Equal(t, accSeq, bldr.Sequence()) +// } func makeCodec() *codec.Codec { var cdc = codec.New() diff --git a/x/genutil/client/cli/gentx.go b/x/genutil/client/cli/gentx.go index 93c9451b0439..c825cc4865d9 100644 --- a/x/genutil/client/cli/gentx.go +++ b/x/genutil/client/cli/gentx.go @@ -139,7 +139,7 @@ $ %s gentx my-key-name --home=/path/to/home/dir --keyring-backend=os --chain-id= return errors.Wrap(err, "error creating tx builder") } - txGen := clientCtx.TxGenerator + txGen := clientCtx.TxConfig txBuilder := txGen.NewTxBuilder() clientCtx = clientCtx.WithInput(inBuf).WithFromAddress(key.GetAddress()) From 39bc7f45ae1502d2b5fceb51e7313c9a96f8c81d Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Tue, 21 Jul 2020 02:45:09 +0530 Subject: [PATCH 14/40] remove depricated methods --- x/auth/client/cli/cli_test.go | 4 ++-- x/auth/client/cli/tx_multisign.go | 23 +++----------------- x/auth/client/tx.go | 28 ------------------------ x/auth/client/tx_test.go | 36 ------------------------------- 4 files changed, 5 insertions(+), 86 deletions(-) diff --git a/x/auth/client/cli/cli_test.go b/x/auth/client/cli/cli_test.go index 714050dfdd89..694d00330a8e 100644 --- a/x/auth/client/cli/cli_test.go +++ b/x/auth/client/cli/cli_test.go @@ -73,10 +73,10 @@ func (s *IntegrationTestSuite) TestCLIValidateSignatures() { ) s.Require().NoError(err) - var tx types.StdTx + var tx sdk.Tx err = val.ClientCtx.JSONMarshaler.UnmarshalJSON(res.Bytes(), &tx) s.Require().NoError(err) - + s.T().Log(res.String()) // write unsigned tx to file unsignedTx, cleanup := testutil.WriteToNewTempFile(s.T(), res.String()) defer cleanup() diff --git a/x/auth/client/cli/tx_multisign.go b/x/auth/client/cli/tx_multisign.go index 252072624724..fd08f08c5f3a 100644 --- a/x/auth/client/cli/tx_multisign.go +++ b/x/auth/client/cli/tx_multisign.go @@ -65,7 +65,6 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { if err != nil { return err } - cdc := clientCtx.Codec stdTx, err := authclient.ReadTxFromFile(clientCtx, args[0]) if err != nil { return @@ -100,13 +99,6 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { txFactory = txFactory.WithAccountNumber(accnum).WithSequence(seq) } - feeTx := stdTx.(sdk.FeeTx) - fee := types.StdFee{ - Amount: feeTx.GetFee(), - Gas: feeTx.GetGas(), - } - memoTx := stdTx.(sdk.TxWithMemo) - // read each signature and add it to the multisig if valid for i := 2; i < len(args); i++ { stdSig, err := readAndUnmarshalStdSignature(clientCtx, args[i]) @@ -128,18 +120,9 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { return err } } - - sigBz, err := types.SignatureDataToAminoSignature(cdc, multisigSig) - if err != nil { - return err - } - - newStdSig := types.StdSignature{Signature: sigBz, PubKey: multisigPub.Bytes()} // nolint:staticcheck - newTx := types.NewStdTx(stdTx.GetMsgs(), fee, []types.StdSignature{newStdSig}, memoTx.GetMemo()) // nolint:staticcheck - var json []byte - txBuilder := clientCtx.TxConfig.NewTxBuilder() + txBuilder, err := clientCtx.TxConfig.WrapTxBuilder(stdTx) if err != nil { return err } @@ -156,9 +139,9 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { } sigOnly, _ := cmd.Flags().GetBool(flagSigOnly) if sigOnly { - json, err = cdc.MarshalJSON(newTx.Signatures[0]) + json, err = clientCtx.JSONMarshaler.MarshalJSON(multisigSig.Signatures[0]) } else { - json, err = cdc.MarshalJSON(newTx) + json, err = clientCtx.JSONMarshaler.MarshalJSON(txBuilder.GetTx()) } if err != nil { diff --git a/x/auth/client/tx.go b/x/auth/client/tx.go index 992f8e19d03e..f06da01246c1 100644 --- a/x/auth/client/tx.go +++ b/x/auth/client/tx.go @@ -225,34 +225,6 @@ func parseQueryResponse(bz []byte) (sdk.SimulationResponse, error) { return simRes, nil } -// PrepareTxBuilder populates a TxBuilder in preparation for the build of a Tx. -func PrepareTxBuilder(txBldr tx.Factory, clientCtx client.Context) (tx.Factory, error) { - from := clientCtx.GetFromAddress() - accGetter := clientCtx.AccountRetriever - if err := accGetter.EnsureExists(clientCtx, from); err != nil { - return txBldr, err - } - - txbldrAccNum, txbldrAccSeq := txBldr.AccountNumber(), txBldr.Sequence() - // TODO: (ref #1903) Allow for user supplied account number without - // automatically doing a manual lookup. - if txbldrAccNum == 0 || txbldrAccSeq == 0 { - num, seq, err := accGetter.GetAccountNumberSequence(clientCtx, from) - if err != nil { - return txBldr, err - } - - if txbldrAccNum == 0 { - txBldr = txBldr.WithAccountNumber(num) - } - if txbldrAccSeq == 0 { - txBldr = txBldr.WithSequence(seq) - } - } - - return txBldr, nil -} - func isTxSigner(user sdk.AccAddress, signers []sdk.AccAddress) bool { for _, s := range signers { if bytes.Equal(user.Bytes(), s.Bytes()) { diff --git a/x/auth/client/tx_test.go b/x/auth/client/tx_test.go index e501a18d3fb2..a8cf4bef1e0a 100644 --- a/x/auth/client/tx_test.go +++ b/x/auth/client/tx_test.go @@ -206,42 +206,6 @@ func compareEncoders(t *testing.T, expected sdk.TxEncoder, actual sdk.TxEncoder) require.Equal(t, defaultEncoderBytes, encoderBytes) } -// func TestPrepareTxBuilder(t *testing.T) { -// encodingConfig := simappparams.MakeEncodingConfig() -// sdk.RegisterCodec(encodingConfig.Amino) -// -// fromAddr := sdk.AccAddress("test-addr0000000000") -// fromAddrStr := fromAddr.String() -// -// var accNum uint64 = 10 -// var accSeq uint64 = 17 -// -// txGen := encodingConfig.TxConfig -// clientCtx := client.Context{} -// clientCtx = clientCtx. -// WithTxConfig(txGen). -// WithJSONMarshaler(encodingConfig.Marshaler). -// WithAccountRetriever(client.TestAccountRetriever{Accounts: map[string]struct { -// Address sdk.AccAddress -// Num uint64 -// Seq uint64 -// }{ -// fromAddrStr: { -// Address: fromAddr, -// Num: accNum, -// Seq: accSeq, -// }, -// }}). -// WithFromAddress(fromAddr) -// -// txFactory := tx.NewFactoryCLI(clientCtx, nil) -// -// bldr, err := PrepareTxBuilder(txFactory, clientCtx) -// require.NoError(t, err) -// require.Equal(t, accNum, bldr.AccountNumber()) -// require.Equal(t, accSeq, bldr.Sequence()) -// } - func makeCodec() *codec.Codec { var cdc = codec.New() sdk.RegisterCodec(cdc) From 012e3209c19612356e112a40b5985fdc08a50153 Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Wed, 22 Jul 2020 03:32:54 +0530 Subject: [PATCH 15/40] fix keyring issue --- x/auth/client/cli/tx_sign.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x/auth/client/cli/tx_sign.go b/x/auth/client/cli/tx_sign.go index 7c99db83f406..b7738281b8a2 100644 --- a/x/auth/client/cli/tx_sign.go +++ b/x/auth/client/cli/tx_sign.go @@ -107,7 +107,6 @@ func makeSignBatchCmd() func(cmd *cobra.Command, args []string) error { if err != nil { return err } - if multisigAddr.Empty() { homeDir, _ := cmd.Flags().GetString(flags.FlagFrom) err = authclient.SignStdTx(txFactory, clientCtx, homeDir, txBuilder, false, true) @@ -215,6 +214,7 @@ func makeSignCmd() func(cmd *cobra.Command, args []string) error { if err != nil { return err } + txFactory := tx.NewFactoryCLI(clientCtx, cmd.Flags()) clientCtx, txF, newTx, err := readTxAndInitContexts(clientCtx, cmd, args[0]) if err != nil { @@ -225,7 +225,6 @@ func makeSignCmd() func(cmd *cobra.Command, args []string) error { if err != nil { return err } - txFactory := tx.NewFactoryCLI(clientCtx, cmd.Flags()) // if --signature-only is on, then override --append generateSignatureOnly, _ := cmd.Flags().GetBool(flagSigOnly) From 3dec8f7f7f395aa056eb5365d84341b9d837baaf Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Fri, 24 Jul 2020 00:33:46 +0530 Subject: [PATCH 16/40] update wraptx --- x/auth/client/tx.go | 2 +- x/auth/tx/generator.go | 9 +++------ x/auth/types/client_tx.go | 7 ++----- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/x/auth/client/tx.go b/x/auth/client/tx.go index f06da01246c1..2354a932e44e 100644 --- a/x/auth/client/tx.go +++ b/x/auth/client/tx.go @@ -89,7 +89,7 @@ func SignStdTx(txFactory tx.Factory, clientCtx client.Context, name string, return err } addr := sdk.AccAddress(info.GetPubKey().Address()) - if !isTxSigner(addr, stdTx.GetTx().(authtypes.StdTx).GetSigners()) { + if !isTxSigner(addr, stdTx.GetTx().GetSigners()) { return fmt.Errorf("%s: %s", sdkerrors.ErrorInvalidSigner, name) } if !offline { diff --git a/x/auth/tx/generator.go b/x/auth/tx/generator.go index 6d9232a4a7fe..0382077b85e2 100644 --- a/x/auth/tx/generator.go +++ b/x/auth/tx/generator.go @@ -35,15 +35,12 @@ func NewTxConfig(marshaler codec.Marshaler, pubkeyCodec types.PublicKeyCodec, si } func (g generator) WrapTxBuilder(newTx sdk.Tx) (client.TxBuilder, error) { - stdTx, ok := newTx.(*tx.Tx) + newBuilder, ok := newTx.(client.TxBuilder) if !ok { return nil, fmt.Errorf("expected %T, got %T", &tx.Tx{}, newTx) } - return &builder{ - tx: stdTx, - marshaler: g.marshaler, - pubkeyCodec: g.pubkeyCodec, - }, nil + + return newBuilder, nil } func (g generator) NewTxBuilder() client.TxBuilder { diff --git a/x/auth/types/client_tx.go b/x/auth/types/client_tx.go index 2e0a13dbdddc..213758534b81 100644 --- a/x/auth/types/client_tx.go +++ b/x/auth/types/client_tx.go @@ -97,14 +97,11 @@ func (s StdTxConfig) NewTxBuilder() client.TxBuilder { } func (s StdTxConfig) WrapTxBuilder(newTx sdk.Tx) (client.TxBuilder, error) { - stdTx, ok := newTx.(StdTx) + stdTx, ok := newTx.(client.TxBuilder) if !ok { return nil, fmt.Errorf("expected %T, got %T", &types.Tx{}, newTx) } - return &StdTxBuilder{ - StdTx: stdTx, - cdc: s.Cdc, - }, nil + return stdTx, nil } // MarshalTx implements TxConfig.MarshalTx From ff733fce2b7dcee4d6ade87ddc4ba09da41d4de4 Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Fri, 24 Jul 2020 14:52:05 +0530 Subject: [PATCH 17/40] Fix batch scan --- Makefile | 4 +-- crypto/types/codec.go | 7 +++++ testutil/network/network.go | 16 +++++++---- x/auth/client/cli/cli_test.go | 54 +++++++++++++++++------------------ x/auth/client/cli/tx_sign.go | 3 +- x/auth/client/tx.go | 15 ++++------ x/auth/client/tx_test.go | 11 +++++-- 7 files changed, 62 insertions(+), 48 deletions(-) diff --git a/Makefile b/Makefile index 29a7526175e8..7df6363ac1e5 100644 --- a/Makefile +++ b/Makefile @@ -185,10 +185,10 @@ test-ledger: test-ledger-mock test-unit: test-unit-amino # TODO switch test-unit-proto to be default here after proto Tx is fully tested test-unit-proto: - @VERSION=$(VERSION) go test -mod=readonly ./... -tags='ledger test_ledger_mock test_proto' + @VERSION=$(VERSION) go test -mod=readonly ./x/auth/client/cli/cli_test.go -tags='ledger test_ledger_mock test_proto' test-unit-amino: - @VERSION=$(VERSION) go test -mod=readonly ./... -tags='ledger test_ledger_mock' + @VERSION=$(VERSION) go test -mod=readonly ./x/auth/client/cli/cli_test.go -tags='ledger test_ledger_mock' test-race: @VERSION=$(VERSION) go test -mod=readonly -race $(PACKAGES_NOSIMULATION) diff --git a/crypto/types/codec.go b/crypto/types/codec.go index 2796d71744b3..55d892c07f1b 100644 --- a/crypto/types/codec.go +++ b/crypto/types/codec.go @@ -1,6 +1,7 @@ package types import ( + "github.com/tendermint/go-amino" "github.com/tendermint/tendermint/crypto" ) @@ -13,3 +14,9 @@ type PublicKeyCodec interface { // Decode decodes a crypto.PubKey from a protobuf PublicKey or returns an error Decode(key *PublicKey) (crypto.PubKey, error) } + +var Cdc = amino.NewCodec() + +func init() { + Cdc.RegisterInterface((*isPublicKey_Sum)(nil), nil) +} diff --git a/testutil/network/network.go b/testutil/network/network.go index 9c6621bc0f3d..800abce235cb 100644 --- a/testutil/network/network.go +++ b/testutil/network/network.go @@ -26,6 +26,7 @@ import ( "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" clientkeys "github.com/cosmos/cosmos-sdk/client/keys" + "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/cosmos/cosmos-sdk/server" @@ -278,16 +279,21 @@ func New(t *testing.T, cfg Config) *Network { require.NoError(t, err) memo := fmt.Sprintf("%s@%s:%s", nodeIDs[i], p2pURL.Hostname(), p2pURL.Port()) - tx := authtypes.NewStdTx([]sdk.Msg{createValMsg}, authtypes.StdFee{}, []authtypes.StdSignature{}, memo) //nolint:staticcheck // SA1019: authtypes.StdFee is deprecated - txBldr := authtypes.TxBuilder{}. + txBuilder := cfg.TxConfig.NewTxBuilder() + err = txBuilder.SetMsgs(createValMsg) + require.NoError(t, err) + txBuilder.SetMemo(memo) + txFactory := tx.Factory{} + txFactory = txFactory. WithChainID(cfg.ChainID). WithMemo(memo). - WithKeybase(kb) + WithKeybase(kb). + WithTxConfig(cfg.TxConfig) - signedTx, err := txBldr.SignStdTx(nodeDirName, tx, false) + err = tx.Sign(txFactory, nodeDirName, txBuilder) require.NoError(t, err) - txBz, err := cfg.Codec.MarshalJSON(signedTx) + txBz, err := cfg.TxConfig.TxJSONEncoder()(txBuilder.GetTx()) require.NoError(t, err) require.NoError(t, writeFile(fmt.Sprintf("%v.json", nodeDirName), gentxsDir, txBz)) diff --git a/x/auth/client/cli/cli_test.go b/x/auth/client/cli/cli_test.go index c4dbdc890d40..90f5e5c2f729 100644 --- a/x/auth/client/cli/cli_test.go +++ b/x/auth/client/cli/cli_test.go @@ -1,10 +1,9 @@ +// +build test_proto + package cli_test import ( - "context" "fmt" - "io/ioutil" - "path/filepath" "strings" "testing" @@ -135,6 +134,7 @@ func (s *IntegrationTestSuite) TestCLISignBatch() { // sign-batch file res, err = authtest.TxSignBatchExec(val.ClientCtx, val.Address, filename.Name(), fmt.Sprintf("--%s=%s", flags.FlagChainID, val.ClientCtx.ChainID)) s.Require().NoError(err) + s.T().Log(res.String()) s.Require().Equal(3, len(strings.Split(strings.Trim(res.String(), "\n"), "\n"))) // sign-batch file @@ -626,30 +626,30 @@ func TestGetBroadcastCommand_OfflineFlag(t *testing.T) { require.EqualError(t, cmd.Execute(), "cannot broadcast tx during offline mode") } -func TestGetBroadcastCommand_WithoutOfflineFlag(t *testing.T) { - clientCtx := client.Context{} - clientCtx = clientCtx.WithTxConfig(simappparams.MakeEncodingConfig().TxConfig) - - ctx := context.Background() - ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) - - cmd := authcli.GetBroadcastCommand() - - testDir, cleanFunc := testutil.NewTestCaseDir(t) - t.Cleanup(cleanFunc) - - // Create new file with tx - txContents := []byte("{\"type\":\"cosmos-sdk/StdTx\",\"value\":{\"msg\":[{\"type\":\"cosmos-sdk/MsgSend\",\"value\":{\"from_address\":\"cosmos1cxlt8kznps92fwu3j6npahx4mjfutydyene2qw\",\"to_address\":\"cosmos1wc8mpr8m3sy3ap3j7fsgqfzx36um05pystems4\",\"amount\":[{\"denom\":\"stake\",\"amount\":\"10000\"}]}}],\"fee\":{\"amount\":[],\"gas\":\"200000\"},\"signatures\":null,\"memo\":\"\"}}") - txFileName := filepath.Join(testDir, "tx.json") - err := ioutil.WriteFile(txFileName, txContents, 0644) - require.NoError(t, err) - - cmd.SetArgs([]string{txFileName}) - err = cmd.ExecuteContext(ctx) - - // We test it tries to broadcast but we set unsupported tx to get the error. - require.EqualError(t, err, "unsupported return type ; supported types: sync, async, block") -} +// func TestGetBroadcastCommand_WithoutOfflineFlag(t *testing.T) { +// clientCtx := client.Context{} +// clientCtx = clientCtx.WithTxConfig(simappparams.MakeEncodingConfig().TxConfig) +// +// ctx := context.Background() +// ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) +// +// cmd := authcli.GetBroadcastCommand() +// +// testDir, cleanFunc := testutil.NewTestCaseDir(t) +// t.Cleanup(cleanFunc) +// +// // Create new file with tx +// txContents := []byte("{\"type\":\"cosmos-sdk/StdTx\",\"value\":{\"msg\":[{\"type\":\"cosmos-sdk/MsgSend\",\"value\":{\"from_address\":\"cosmos1cxlt8kznps92fwu3j6npahx4mjfutydyene2qw\",\"to_address\":\"cosmos1wc8mpr8m3sy3ap3j7fsgqfzx36um05pystems4\",\"amount\":[{\"denom\":\"stake\",\"amount\":\"10000\"}]}}],\"fee\":{\"amount\":[],\"gas\":\"200000\"},\"signatures\":null,\"memo\":\"\"}}") +// txFileName := filepath.Join(testDir, "tx.json") +// err := ioutil.WriteFile(txFileName, txContents, 0644) +// require.NoError(t, err) +// +// cmd.SetArgs([]string{txFileName}) +// err = cmd.ExecuteContext(ctx) +// +// // We test it tries to broadcast but we set unsupported tx to get the error. +// require.EqualError(t, err, "unsupported return type ; supported types: sync, async, block") +// } func TestIntegrationTestSuite(t *testing.T) { suite.Run(t, new(IntegrationTestSuite)) diff --git a/x/auth/client/cli/tx_sign.go b/x/auth/client/cli/tx_sign.go index b7738281b8a2..d00b335bf508 100644 --- a/x/auth/client/cli/tx_sign.go +++ b/x/auth/client/cli/tx_sign.go @@ -97,8 +97,7 @@ func makeSignBatchCmd() func(cmd *cobra.Command, args []string) error { return err } } - marhsaler := clientCtx.JSONMarshaler.(codec.Marshaler) - scanner := authclient.NewBatchScanner(marhsaler, infile) + scanner := authclient.NewBatchScanner(clientCtx.TxConfig, infile) for sequence := txFactory.Sequence(); scanner.Scan(); sequence++ { unsignedStdTx := scanner.StdTx() diff --git a/x/auth/client/tx.go b/x/auth/client/tx.go index 2354a932e44e..44fa4a444132 100644 --- a/x/auth/client/tx.go +++ b/x/auth/client/tx.go @@ -14,10 +14,8 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/std" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) @@ -141,16 +139,17 @@ func ReadTxFromFile(ctx client.Context, filename string) (tx sdk.Tx, err error) } // NewBatchScanner returns a new BatchScanner to read newline-delimited StdTx transactions from r. -func NewBatchScanner(cdc codec.Marshaler, r io.Reader) *BatchScanner { - return &BatchScanner{Scanner: bufio.NewScanner(r), cdc: cdc} +func NewBatchScanner(cfg client.TxConfig, r io.Reader) *BatchScanner { + return &BatchScanner{Scanner: bufio.NewScanner(r), cfg: cfg} } // BatchScanner provides a convenient interface for reading batch data such as a file // of newline-delimited JSON encoded StdTx. type BatchScanner struct { *bufio.Scanner + builder client.TxBuilder stdTx sdk.Tx - cdc codec.Marshaler + cfg client.TxConfig unmarshalErr error } @@ -166,10 +165,8 @@ func (bs *BatchScanner) Scan() bool { return false } - pubKeyCdc := std.DefaultPublicKeyCodec{} - var err error - txD := authtx.DefaultJSONTxDecoder(bs.cdc, pubKeyCdc) - bs.stdTx, err = txD(bs.Bytes()) + tx, err := bs.cfg.TxJSONDecoder()(bs.Bytes()) + bs.stdTx = tx if err != nil && bs.unmarshalErr == nil { bs.unmarshalErr = err return false diff --git a/x/auth/client/tx_test.go b/x/auth/client/tx_test.go index a8cf4bef1e0a..091347be5c50 100644 --- a/x/auth/client/tx_test.go +++ b/x/auth/client/tx_test.go @@ -6,6 +6,7 @@ import ( "strings" "testing" + "github.com/cosmos/cosmos-sdk/std" "github.com/cosmos/cosmos-sdk/testutil" "github.com/cosmos/cosmos-sdk/testutil/testdata" @@ -149,9 +150,12 @@ func TestReadStdTxFromFile(t *testing.T) { func TestBatchScanner_Scan(t *testing.T) { t.Parallel() - cdc := codec.New() - sdk.RegisterCodec(cdc) encodingConfig := simappparams.MakeEncodingConfig() + std.RegisterCodec(encodingConfig.Amino) + + txGen := encodingConfig.TxConfig + clientCtx := client.Context{} + clientCtx = clientCtx.WithTxConfig(txGen) batch1 := `{"msg":[],"fee":{"amount":[{"denom":"atom","amount":"150"}],"gas":"50000"},"signatures":[],"memo":"foomemo"} {"msg":[],"fee":{"amount":[{"denom":"atom","amount":"150"}],"gas":"10000"},"signatures":[],"memo":"foomemo"} @@ -183,11 +187,12 @@ malformed for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { - scanner, i := NewBatchScanner(encodingConfig.Marshaler, strings.NewReader(tt.batch)), 0 + scanner, i := NewBatchScanner(clientCtx.TxConfig, strings.NewReader(tt.batch)), 0 for scanner.Scan() { _ = scanner.StdTx() i++ } + t.Log(scanner.stdTx) require.Equal(t, tt.wantScannerError, scanner.Err() != nil) require.Equal(t, tt.wantUnmarshalError, scanner.UnmarshalErr() != nil) require.Equal(t, tt.numTxs, i) From 30bca252a803c4c58b3e07d57480b31465228119 Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Fri, 24 Jul 2020 15:09:34 +0530 Subject: [PATCH 18/40] fix register interfaces issue --- x/auth/tx/builder.go | 19 +++++++++++++------ x/auth/tx/builder_test.go | 5 ++--- x/auth/tx/decoder.go | 12 +++++++----- x/auth/tx/encoder.go | 11 ++++++----- x/auth/tx/generator.go | 14 +++++++------- 5 files changed, 35 insertions(+), 26 deletions(-) diff --git a/x/auth/tx/builder.go b/x/auth/tx/builder.go index 7df625aa7515..ebb9cfa75180 100644 --- a/x/auth/tx/builder.go +++ b/x/auth/tx/builder.go @@ -3,6 +3,8 @@ package tx import ( "fmt" + "github.com/golang/protobuf/proto" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/x/auth/signing/direct" @@ -16,7 +18,6 @@ import ( "github.com/tendermint/tendermint/crypto" - "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -37,7 +38,6 @@ type builder struct { // or decoded from AuthInfo when GetPubKey's was called pubKeys []crypto.PubKey - marshaler codec.Marshaler pubkeyCodec types.PublicKeyCodec } @@ -47,7 +47,7 @@ var ( _ direct.ProtoTx = &builder{} ) -func newBuilder(marshaler codec.Marshaler, pubkeyCodec types.PublicKeyCodec) *builder { +func newBuilder(pubkeyCodec types.PublicKeyCodec) *builder { return &builder{ tx: &tx.Tx{ Body: &tx.TxBody{}, @@ -55,7 +55,6 @@ func newBuilder(marshaler codec.Marshaler, pubkeyCodec types.PublicKeyCodec) *bu Fee: &tx.Fee{}, }, }, - marshaler: marshaler, pubkeyCodec: pubkeyCodec, } } @@ -131,7 +130,11 @@ func (t *builder) GetBodyBytes() []byte { // this method should always return the correct bytes. Note that after // decoding bodyBz is derived from TxRaw so that it matches what was // transmitted over the wire - t.bodyBz = t.marshaler.MustMarshalBinaryBare(t.tx.Body) + var err error + t.bodyBz, err = proto.Marshal(t.tx.Body) + if err != nil { + panic(err) + } } return t.bodyBz } @@ -143,7 +146,11 @@ func (t *builder) GetAuthInfoBytes() []byte { // this method should always return the correct bytes. Note that after // decoding authInfoBz is derived from TxRaw so that it matches what was // transmitted over the wire - t.authInfoBz = t.marshaler.MustMarshalBinaryBare(t.tx.AuthInfo) + var err error + t.authInfoBz, err = proto.Marshal(t.tx.AuthInfo) + if err != nil { + panic(err) + } } return t.authInfoBz } diff --git a/x/auth/tx/builder_test.go b/x/auth/tx/builder_test.go index 136078fa762d..c115f474ac83 100644 --- a/x/auth/tx/builder_test.go +++ b/x/auth/tx/builder_test.go @@ -22,7 +22,7 @@ func TestTxBuilder(t *testing.T) { _, pubkey, addr := testdata.KeyTestPubAddr() marshaler := codec.NewHybridCodec(codec.New(), codectypes.NewInterfaceRegistry()) - tx := newBuilder(marshaler, std.DefaultPublicKeyCodec{}) + tx := newBuilder(std.DefaultPublicKeyCodec{}) cdc := std.DefaultPublicKeyCodec{} @@ -125,8 +125,7 @@ func TestBuilderValidateBasic(t *testing.T) { // require to fail validation upon invalid fee badFeeAmount := testdata.NewTestFeeAmount() badFeeAmount[0].Amount = sdk.NewInt(-5) - marshaler := codec.NewHybridCodec(codec.New(), codectypes.NewInterfaceRegistry()) - bldr := newBuilder(marshaler, std.DefaultPublicKeyCodec{}) + bldr := newBuilder(std.DefaultPublicKeyCodec{}) var sig1, sig2 signing.SignatureV2 sig1 = signing.SignatureV2{ diff --git a/x/auth/tx/decoder.go b/x/auth/tx/decoder.go index 8ce3b06fa66e..e229c1f35b85 100644 --- a/x/auth/tx/decoder.go +++ b/x/auth/tx/decoder.go @@ -3,15 +3,18 @@ package tx import ( "github.com/tendermint/tendermint/crypto" + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/types/tx" - "github.com/cosmos/cosmos-sdk/codec" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" ) // DefaultTxDecoder returns a default protobuf TxDecoder using the provided Marshaler and PublicKeyCodec -func DefaultTxDecoder(cdc codec.Marshaler, keyCodec cryptotypes.PublicKeyCodec) sdk.TxDecoder { +func DefaultTxDecoder(anyUnpacker types.AnyUnpacker, keyCodec cryptotypes.PublicKeyCodec) sdk.TxDecoder { + cdc := codec.NewProtoCodec(anyUnpacker) return func(txBytes []byte) (sdk.Tx, error) { var raw tx.TxRaw err := cdc.UnmarshalBinaryBare(txBytes, &raw) @@ -35,14 +38,14 @@ func DefaultTxDecoder(cdc codec.Marshaler, keyCodec cryptotypes.PublicKeyCodec) bodyBz: raw.BodyBytes, authInfoBz: raw.AuthInfoBytes, pubKeys: pks, - marshaler: cdc, pubkeyCodec: keyCodec, }, nil } } // DefaultTxDecoder returns a default protobuf JSON TxDecoder using the provided Marshaler and PublicKeyCodec -func DefaultJSONTxDecoder(cdc codec.Marshaler, keyCodec cryptotypes.PublicKeyCodec) sdk.TxDecoder { +func DefaultJSONTxDecoder(anyUnpacker types.AnyUnpacker, keyCodec cryptotypes.PublicKeyCodec) sdk.TxDecoder { + cdc := codec.NewProtoCodec(anyUnpacker) return func(txBytes []byte) (sdk.Tx, error) { var theTx tx.Tx err := cdc.UnmarshalJSON(txBytes, &theTx) @@ -58,7 +61,6 @@ func DefaultJSONTxDecoder(cdc codec.Marshaler, keyCodec cryptotypes.PublicKeyCod return &builder{ tx: &theTx, pubKeys: pks, - marshaler: cdc, pubkeyCodec: keyCodec, }, nil } diff --git a/x/auth/tx/encoder.go b/x/auth/tx/encoder.go index 3c39a20a61fd..ae2c60f6a0d6 100644 --- a/x/auth/tx/encoder.go +++ b/x/auth/tx/encoder.go @@ -3,13 +3,14 @@ package tx import ( "fmt" - "github.com/cosmos/cosmos-sdk/codec" + "github.com/golang/protobuf/proto" + "github.com/cosmos/cosmos-sdk/types" txtypes "github.com/cosmos/cosmos-sdk/types/tx" ) // DefaultTxEncoder returns a default protobuf TxEncoder using the provided Marshaler -func DefaultTxEncoder(marshaler codec.Marshaler) types.TxEncoder { +func DefaultTxEncoder() types.TxEncoder { return func(tx types.Tx) ([]byte, error) { wrapper, ok := tx.(*builder) if !ok { @@ -22,18 +23,18 @@ func DefaultTxEncoder(marshaler codec.Marshaler) types.TxEncoder { Signatures: wrapper.tx.Signatures, } - return marshaler.MarshalBinaryBare(raw) + return proto.Marshal(raw) } } // DefaultTxEncoder returns a default protobuf JSON TxEncoder using the provided Marshaler -func DefaultJSONTxEncoder(marshaler codec.Marshaler) types.TxEncoder { +func DefaultJSONTxEncoder() types.TxEncoder { return func(tx types.Tx) ([]byte, error) { wrapper, ok := tx.(*builder) if !ok { return nil, fmt.Errorf("expected %T, got %T", &builder{}, tx) } - return marshaler.MarshalJSON(wrapper.tx) + return proto.Marshal(wrapper.tx) } } diff --git a/x/auth/tx/generator.go b/x/auth/tx/generator.go index 0382077b85e2..6f260a87d7d6 100644 --- a/x/auth/tx/generator.go +++ b/x/auth/tx/generator.go @@ -5,6 +5,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/tx" @@ -22,15 +23,14 @@ type generator struct { } // NewTxConfig returns a new protobuf TxConfig using the provided Marshaler, PublicKeyCodec and SignModeHandler. -func NewTxConfig(marshaler codec.Marshaler, pubkeyCodec types.PublicKeyCodec, signModeHandler signing.SignModeHandler) client.TxConfig { +func NewTxConfig(anyUnpacker codectypes.AnyUnpacker, pubkeyCodec types.PublicKeyCodec, signModeHandler signing.SignModeHandler) client.TxConfig { return &generator{ - marshaler: marshaler, pubkeyCodec: pubkeyCodec, handler: signModeHandler, - decoder: DefaultTxDecoder(marshaler, pubkeyCodec), - encoder: DefaultTxEncoder(marshaler), - jsonDecoder: DefaultJSONTxDecoder(marshaler, pubkeyCodec), - jsonEncoder: DefaultJSONTxEncoder(marshaler), + decoder: DefaultTxDecoder(anyUnpacker, pubkeyCodec), + encoder: DefaultTxEncoder(), + jsonDecoder: DefaultJSONTxDecoder(anyUnpacker, pubkeyCodec), + jsonEncoder: DefaultJSONTxEncoder(), } } @@ -44,7 +44,7 @@ func (g generator) WrapTxBuilder(newTx sdk.Tx) (client.TxBuilder, error) { } func (g generator) NewTxBuilder() client.TxBuilder { - return newBuilder(g.marshaler, g.pubkeyCodec) + return newBuilder(g.pubkeyCodec) } func (g generator) SignModeHandler() signing.SignModeHandler { From 695b77d11ac5c471e4989508e4854a2b5cbc3453 Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Mon, 27 Jul 2020 19:35:29 +0530 Subject: [PATCH 19/40] update printOutput --- client/context.go | 5 +- crypto/types/codec.go | 7 --- types/tx/tx.go | 68 --------------------- x/auth/client/cli/cli_test.go | 112 ++++++++++++++++++---------------- x/auth/client/cli/tx_sign.go | 24 +++++++- 5 files changed, 83 insertions(+), 133 deletions(-) delete mode 100644 types/tx/tx.go diff --git a/client/context.go b/client/context.go index 5580853e3027..4dfa15d3989a 100644 --- a/client/context.go +++ b/client/context.go @@ -8,7 +8,7 @@ import ( "github.com/pkg/errors" rpcclient "github.com/tendermint/tendermint/rpc/client" rpchttp "github.com/tendermint/tendermint/rpc/client/http" - yaml "gopkg.in/yaml.v2" + "gopkg.in/yaml.v2" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" @@ -200,7 +200,8 @@ func (ctx Context) WithInterfaceRegistry(interfaceRegistry codectypes.InterfaceR // will be JSON encoded using ctx.JSONMarshaler. An error is returned upon failure. func (ctx Context) PrintOutput(toPrint interface{}) error { // always serialize JSON initially because proto json can't be directly YAML encoded - out, err := ctx.JSONMarshaler.MarshalJSON(toPrint) + builder := toPrint.(TxBuilder) + out, err := ctx.TxConfig.TxJSONEncoder()(builder.GetTx()) if err != nil { return err } diff --git a/crypto/types/codec.go b/crypto/types/codec.go index 55d892c07f1b..2796d71744b3 100644 --- a/crypto/types/codec.go +++ b/crypto/types/codec.go @@ -1,7 +1,6 @@ package types import ( - "github.com/tendermint/go-amino" "github.com/tendermint/tendermint/crypto" ) @@ -14,9 +13,3 @@ type PublicKeyCodec interface { // Decode decodes a crypto.PubKey from a protobuf PublicKey or returns an error Decode(key *PublicKey) (crypto.PubKey, error) } - -var Cdc = amino.NewCodec() - -func init() { - Cdc.RegisterInterface((*isPublicKey_Sum)(nil), nil) -} diff --git a/types/tx/tx.go b/types/tx/tx.go deleted file mode 100644 index e87c7fa3d551..000000000000 --- a/types/tx/tx.go +++ /dev/null @@ -1,68 +0,0 @@ -package tx - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" -) - -func (m *Tx) GetMsgs() []sdk.Msg { - anys := m.Body.Messages - res := make([]sdk.Msg, len(anys)) - for i, any := range anys { - msg := any.GetCachedValue().(sdk.Msg) - res[i] = msg - } - return res -} - -func (m *Tx) ValidateBasic() error { - sigs := m.GetSignatures() - - if m.GetGas() > authtypes.MaxGasWanted { - return sdkerrors.Wrapf( - sdkerrors.ErrInvalidRequest, - "invalid gas supplied; %d > %d", m.GetGas(), authtypes.MaxGasWanted, - ) - } - if m.GetFee().IsAnyNegative() { - return sdkerrors.Wrapf( - sdkerrors.ErrInsufficientFee, - "invalid fee provided: %s", m.GetFee(), - ) - } - if len(sigs) == 0 { - return sdkerrors.ErrNoSignatures - } - if len(sigs) != len(m.GetSigners()) { - return sdkerrors.Wrapf( - sdkerrors.ErrUnauthorized, - "wrong number of signers; expected %d, got %d", m.GetSigners(), len(sigs), - ) - } - - return nil -} - -func (m *Tx) GetGas() uint64 { - return m.AuthInfo.Fee.GasLimit -} - -func (m *Tx) GetFee() sdk.Coins { - return m.AuthInfo.Fee.Amount -} - -func (m *Tx) GetSigners() []sdk.AccAddress { - var signers []sdk.AccAddress - seen := map[string]bool{} - - for _, msg := range m.GetMsgs() { - for _, addr := range msg.GetSigners() { - if !seen[addr.String()] { - signers = append(signers, addr) - seen[addr.String()] = true - } - } - } - return signers -} diff --git a/x/auth/client/cli/cli_test.go b/x/auth/client/cli/cli_test.go index 90f5e5c2f729..0fb4c59c4884 100644 --- a/x/auth/client/cli/cli_test.go +++ b/x/auth/client/cli/cli_test.go @@ -3,7 +3,10 @@ package cli_test import ( + "context" "fmt" + "io/ioutil" + "path/filepath" "strings" "testing" @@ -13,7 +16,6 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec" codec2 "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" @@ -25,7 +27,6 @@ import ( authcli "github.com/cosmos/cosmos-sdk/x/auth/client/cli" authtest "github.com/cosmos/cosmos-sdk/x/auth/client/testutil" "github.com/cosmos/cosmos-sdk/x/auth/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" bankcli "github.com/cosmos/cosmos-sdk/x/bank/client/testutil" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" ) @@ -72,10 +73,8 @@ func (s *IntegrationTestSuite) TestCLIValidateSignatures() { ) s.Require().NoError(err) - var tx sdk.Tx - err = val.ClientCtx.JSONMarshaler.UnmarshalJSON(res.Bytes(), &tx) + tx, err := val.ClientCtx.TxConfig.TxJSONDecoder()(res.Bytes()) s.Require().NoError(err) - s.T().Log(res.String()) // write unsigned tx to file unsignedTx, cleanup := testutil.WriteToNewTempFile(s.T(), res.String()) defer cleanup() @@ -134,7 +133,6 @@ func (s *IntegrationTestSuite) TestCLISignBatch() { // sign-batch file res, err = authtest.TxSignBatchExec(val.ClientCtx, val.Address, filename.Name(), fmt.Sprintf("--%s=%s", flags.FlagChainID, val.ClientCtx.ChainID)) s.Require().NoError(err) - s.T().Log(res.String()) s.Require().Equal(3, len(strings.Split(strings.Trim(res.String(), "\n"), "\n"))) // sign-batch file @@ -147,11 +145,11 @@ func (s *IntegrationTestSuite) TestCLISignBatch() { defer cleanup2() res, err = authtest.TxSignBatchExec(val.ClientCtx, val.Address, malformedFile.Name(), fmt.Sprintf("--%s=%s", flags.FlagChainID, val.ClientCtx.ChainID)) - s.Require().EqualError(err, "cannot parse disfix JSON wrapper: invalid character 'm' looking for beginning of value") + s.Require().EqualError(err, "invalid character 'm' looking for beginning of value") // Sign batch malformed tx file signature only. res, err = authtest.TxSignBatchExec(val.ClientCtx, val.Address, malformedFile.Name(), fmt.Sprintf("--%s=%s", flags.FlagChainID, val.ClientCtx.ChainID), "--signature-only") - s.Require().EqualError(err, "cannot parse disfix JSON wrapper: invalid character 'm' looking for beginning of value") + s.Require().EqualError(err, "invalid character 'm' looking for beginning of value") } func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() { @@ -176,10 +174,11 @@ func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() { ) s.Require().NoError(err) - normalGeneratedStdTx := unmarshalStdTx(s.T(), val1.ClientCtx.JSONMarshaler, normalGeneratedTx.String()) - s.Require().Equal(normalGeneratedStdTx.Fee.Gas, uint64(flags.DefaultGasLimit)) - s.Require().Equal(len(normalGeneratedStdTx.Msgs), 1) - s.Require().Equal(0, len(normalGeneratedStdTx.GetSignatures())) + normalGeneratedStdTx := unmarshalStdTx(s.T(), val1.ClientCtx.TxConfig, normalGeneratedTx.Bytes()) + txBuilder, err := val1.ClientCtx.TxConfig.WrapTxBuilder(normalGeneratedStdTx) + s.Require().Equal(txBuilder.GetTx().GetGas(), uint64(flags.DefaultGasLimit)) + s.Require().Equal(len(txBuilder.GetTx().GetMsgs()), 1) + s.Require().Equal(0, len(txBuilder.GetTx().GetSignatures())) // Test generate sendTx with --gas=$amount limitedGasGeneratedTx, err := bankcli.MsgSendExec( @@ -197,10 +196,12 @@ func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() { ) s.Require().NoError(err) - limitedGasStdTx := unmarshalStdTx(s.T(), val1.ClientCtx.JSONMarshaler, limitedGasGeneratedTx.String()) - s.Require().Equal(limitedGasStdTx.Fee.Gas, uint64(100)) - s.Require().Equal(len(limitedGasStdTx.Msgs), 1) - s.Require().Equal(0, len(limitedGasStdTx.GetSignatures())) + limitedGasStdTx := unmarshalStdTx(s.T(), val1.ClientCtx.TxConfig, limitedGasGeneratedTx.Bytes()) + txBuilder, err = val1.ClientCtx.TxConfig.WrapTxBuilder(limitedGasStdTx) + s.Require().NotNil(txBuilder) + s.Require().Equal(txBuilder.GetTx().GetGas(), uint64(100)) + s.Require().Equal(len(txBuilder.GetTx().GetMsgs()), 1) + s.Require().Equal(0, len(txBuilder.GetTx().GetSignatures())) // Test generate sendTx, estimate gas finalGeneratedTx, err := bankcli.MsgSendExec( @@ -218,9 +219,10 @@ func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() { ) s.Require().NoError(err) - finalStdTx := unmarshalStdTx(s.T(), val1.ClientCtx.JSONMarshaler, finalGeneratedTx.String()) - s.Require().Equal(uint64(flags.DefaultGasLimit), finalStdTx.Fee.Gas) - s.Require().Equal(len(finalStdTx.Msgs), 1) + finalStdTx := unmarshalStdTx(s.T(), val1.ClientCtx.TxConfig, finalGeneratedTx.Bytes()) + txBuilder, err = val1.ClientCtx.TxConfig.WrapTxBuilder(finalStdTx) + s.Require().Equal(uint64(flags.DefaultGasLimit), txBuilder.GetTx().GetGas()) + s.Require().Equal(len(finalStdTx.GetMsgs()), 1) // Write the output to disk unsignedTxFile, cleanup := testutil.WriteToNewTempFile(s.T(), finalGeneratedTx.String()) @@ -245,11 +247,13 @@ func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() { // Sign transaction signedTx, err := authtest.TxSignExec(val1.ClientCtx, val1.Address, unsignedTxFile.Name()) s.Require().NoError(err) - - signedFinalTx := unmarshalStdTx(s.T(), val1.ClientCtx.JSONMarshaler, signedTx.String()) - s.Require().Equal(len(signedFinalTx.Msgs), 1) - s.Require().Equal(1, len(signedFinalTx.GetSignatures())) - s.Require().Equal(val1.Address.String(), signedFinalTx.GetSigners()[0].String()) + s.T().Log(signedTx.String()) + signedFinalTx := unmarshalStdTx(s.T(), val1.ClientCtx.TxConfig, signedTx.Bytes()) + txBuilder, err = val1.ClientCtx.TxConfig.WrapTxBuilder(signedFinalTx) + s.Require().Error(err) + s.Require().Equal(len(txBuilder.GetTx().GetMsgs()), 1) + s.Require().Equal(1, len(txBuilder.GetTx().GetSignatures())) + s.Require().Equal(val1.Address.String(), txBuilder.GetTx().GetSigners()[0].String()) // Write the output to disk signedTxFile, cleanup2 := testutil.WriteToNewTempFile(s.T(), signedTx.String()) @@ -412,8 +416,9 @@ func (s *IntegrationTestSuite) TestCLIEncode() { decodedTx, err := authtest.TxDecodeExec(val1.ClientCtx, trimmedBase64) s.Require().NoError(err) - theTx := unmarshalStdTx(s.T(), val1.ClientCtx.JSONMarshaler, decodedTx.String()) - s.Require().Equal("deadbeef", theTx.Memo) + theTx := unmarshalStdTx(s.T(), val1.ClientCtx.TxConfig, decodedTx.Bytes()) + txBuilder, err := val1.ClientCtx.TxConfig.WrapTxBuilder(theTx) + s.Require().Equal("deadbeef", txBuilder.GetTx().GetMemo()) } func (s *IntegrationTestSuite) TestCLIMultisignSortSignatures() { @@ -514,7 +519,6 @@ func (s *IntegrationTestSuite) TestCLIMultisignSortSignatures() { } func (s *IntegrationTestSuite) TestCLIMultisign() { - s.T().SkipNow() val1 := s.network.Validators[0] codec := codec2.New() @@ -626,36 +630,38 @@ func TestGetBroadcastCommand_OfflineFlag(t *testing.T) { require.EqualError(t, cmd.Execute(), "cannot broadcast tx during offline mode") } -// func TestGetBroadcastCommand_WithoutOfflineFlag(t *testing.T) { -// clientCtx := client.Context{} -// clientCtx = clientCtx.WithTxConfig(simappparams.MakeEncodingConfig().TxConfig) -// -// ctx := context.Background() -// ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) -// -// cmd := authcli.GetBroadcastCommand() -// -// testDir, cleanFunc := testutil.NewTestCaseDir(t) -// t.Cleanup(cleanFunc) -// -// // Create new file with tx -// txContents := []byte("{\"type\":\"cosmos-sdk/StdTx\",\"value\":{\"msg\":[{\"type\":\"cosmos-sdk/MsgSend\",\"value\":{\"from_address\":\"cosmos1cxlt8kznps92fwu3j6npahx4mjfutydyene2qw\",\"to_address\":\"cosmos1wc8mpr8m3sy3ap3j7fsgqfzx36um05pystems4\",\"amount\":[{\"denom\":\"stake\",\"amount\":\"10000\"}]}}],\"fee\":{\"amount\":[],\"gas\":\"200000\"},\"signatures\":null,\"memo\":\"\"}}") -// txFileName := filepath.Join(testDir, "tx.json") -// err := ioutil.WriteFile(txFileName, txContents, 0644) -// require.NoError(t, err) -// -// cmd.SetArgs([]string{txFileName}) -// err = cmd.ExecuteContext(ctx) -// -// // We test it tries to broadcast but we set unsupported tx to get the error. -// require.EqualError(t, err, "unsupported return type ; supported types: sync, async, block") -// } +func TestGetBroadcastCommand_WithoutOfflineFlag(t *testing.T) { + clientCtx := client.Context{} + clientCtx = clientCtx.WithTxConfig(simappparams.MakeEncodingConfig().TxConfig) + + ctx := context.Background() + ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) + + cmd := authcli.GetBroadcastCommand() + + testDir, cleanFunc := testutil.NewTestCaseDir(t) + t.Cleanup(cleanFunc) + + // Create new file with tx + // TODO: Update this to tx + txContents := []byte("{\"type\":\"cosmos-sdk/StdTx\",\"value\":{\"msg\":[{\"type\":\"cosmos-sdk/MsgSend\",\"value\":{\"from_address\":\"cosmos1cxlt8kznps92fwu3j6npahx4mjfutydyene2qw\",\"to_address\":\"cosmos1wc8mpr8m3sy3ap3j7fsgqfzx36um05pystems4\",\"amount\":[{\"denom\":\"stake\",\"amount\":\"10000\"}]}}],\"fee\":{\"amount\":[],\"gas\":\"200000\"},\"signatures\":null,\"memo\":\"\"}}") + txFileName := filepath.Join(testDir, "tx.json") + err := ioutil.WriteFile(txFileName, txContents, 0644) + require.NoError(t, err) + + cmd.SetArgs([]string{txFileName}) + err = cmd.ExecuteContext(ctx) + + // We test it tries to broadcast but we set unsupported tx to get the error. + require.EqualError(t, err, "unsupported return type ; supported types: sync, async, block") +} func TestIntegrationTestSuite(t *testing.T) { suite.Run(t, new(IntegrationTestSuite)) } -func unmarshalStdTx(t require.TestingT, c codec.JSONMarshaler, s string) (stdTx authtypes.StdTx) { - require.Nil(t, c.UnmarshalJSON([]byte(s), &stdTx)) +func unmarshalStdTx(t require.TestingT, txConfig client.TxConfig, b []byte) (stdTx sdk.Tx) { + stdTx, err := txConfig.TxJSONDecoder()(b) + require.NoError(t, err) return stdTx } diff --git a/x/auth/client/cli/tx_sign.go b/x/auth/client/cli/tx_sign.go index d00b335bf508..0e2fefe1fbce 100644 --- a/x/auth/client/cli/tx_sign.go +++ b/x/auth/client/cli/tx_sign.go @@ -107,14 +107,11 @@ func makeSignBatchCmd() func(cmd *cobra.Command, args []string) error { return err } if multisigAddr.Empty() { - homeDir, _ := cmd.Flags().GetString(flags.FlagFrom) - err = authclient.SignStdTx(txFactory, clientCtx, homeDir, txBuilder, false, true) from, _ := cmd.Flags().GetString(flags.FlagFrom) _, fromName, err := client.GetFromFields(txFactory.Keybase(), from, clientCtx.GenerateOnly) if err != nil { return fmt.Errorf("error getting account from keybase: %w", err) } - err = authclient.SignStdTx(txFactory, clientCtx, fromName, txBuilder, false, true) if err != nil { return err @@ -287,3 +284,24 @@ func getSignatureJSON(cdc codec.JSONMarshaler, txGen client.TxConfig, txBldr cli return txGen.TxEncoder()(newTx) } + +// func getSignatureJSON(cdc codec.JSONMarshaler, newTx authsigning.SigVerifiableTx, indent, generateSignatureOnly bool) ([]byte, error) { +// switch generateSignatureOnly { +// case true: +// sigData, err := newTx.GetSignatureData() +// pubKeys := newTx.GetPubKeys() +// if err != nil { +// return nil, err +// } +// return getSignatureBuilderJSON(cdc, client.SignatureBuilder{ +// PubKey: pubKeys[0], +// Data: sigData[0], +// }, indent) +// default: +// panic("TODO") +// } +// } +// +// func getSignatureBuilderJSON(cdc codec.JSONMarshaler, sigBuilder client.SignatureBuilder, indent bool) ([]byte, error) { +// +// } From 4be2e51b80d3c672bc58f9472f1ce902bedb24bf Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Mon, 27 Jul 2020 20:45:03 +0530 Subject: [PATCH 20/40] Update Validate Sigs test --- x/auth/client/cli/cli_test.go | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/x/auth/client/cli/cli_test.go b/x/auth/client/cli/cli_test.go index 0fb4c59c4884..65ed4507381b 100644 --- a/x/auth/client/cli/cli_test.go +++ b/x/auth/client/cli/cli_test.go @@ -26,7 +26,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authcli "github.com/cosmos/cosmos-sdk/x/auth/client/cli" authtest "github.com/cosmos/cosmos-sdk/x/auth/client/testutil" - "github.com/cosmos/cosmos-sdk/x/auth/types" bankcli "github.com/cosmos/cosmos-sdk/x/bank/client/testutil" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" ) @@ -73,27 +72,24 @@ func (s *IntegrationTestSuite) TestCLIValidateSignatures() { ) s.Require().NoError(err) - tx, err := val.ClientCtx.TxConfig.TxJSONDecoder()(res.Bytes()) - s.Require().NoError(err) // write unsigned tx to file unsignedTx, cleanup := testutil.WriteToNewTempFile(s.T(), res.String()) defer cleanup() res, err = authtest.TxSignExec(val.ClientCtx, val.Address, unsignedTx.Name()) s.Require().NoError(err) - - var signedTx types.StdTx - err = val.ClientCtx.JSONMarshaler.UnmarshalJSON(res.Bytes(), &signedTx) + s.T().Log(res.String()) + signedTx, err := val.ClientCtx.TxConfig.TxJSONDecoder()(res.Bytes()) s.Require().NoError(err) signedTxFile, cleanup := testutil.WriteToNewTempFile(s.T(), res.String()) defer cleanup() - + txBuilder, err := val.ClientCtx.TxConfig.WrapTxBuilder(signedTx) res, err = authtest.TxValidateSignaturesExec(val.ClientCtx, signedTxFile.Name()) s.Require().NoError(err) - signedTx.Memo = "MODIFIED STD TX" - bz, err := val.ClientCtx.JSONMarshaler.MarshalJSON(signedTx) + txBuilder.SetMemo("MODIFIED STD TX") + bz, err := val.ClientCtx.TxConfig.TxJSONEncoder()(signedTx) s.Require().NoError(err) modifiedTxFile, cleanup := testutil.WriteToNewTempFile(s.T(), string(bz)) From 6d3297efee8a87dcaa17f297e318f8ca90af0698 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Mon, 27 Jul 2020 14:22:10 -0400 Subject: [PATCH 21/40] WIP on signature JSON --- Makefile | 4 +- client/context.go | 5 +- client/tx_generator.go | 2 + proto/cosmos/tx/sig_desc.proto | 52 + types/tx/sig_desc.pb.go | 1374 ++++++++++++++++++++ types/tx/signing/signature.go | 4 +- x/auth/client/cli/cli_test.go | 2 - x/auth/client/cli/tx_sign.go | 44 +- x/auth/client/tx.go | 9 +- x/auth/tx/generator.go | 13 +- x/auth/tx/sigs.go | 104 ++ x/auth/types/client_tx.go | 58 +- x/auth/types/stdtx.go | 27 + x/genutil/client/cli/gentx.go | 2 +- x/ibc/03-connection/types/connection.pb.go | 143 +- x/staking/module.go | 5 +- x/staking/types/staking.pb.go | 1185 ++++++++--------- 17 files changed, 2294 insertions(+), 739 deletions(-) create mode 100644 proto/cosmos/tx/sig_desc.proto create mode 100644 types/tx/sig_desc.pb.go diff --git a/Makefile b/Makefile index 7df6363ac1e5..29a7526175e8 100644 --- a/Makefile +++ b/Makefile @@ -185,10 +185,10 @@ test-ledger: test-ledger-mock test-unit: test-unit-amino # TODO switch test-unit-proto to be default here after proto Tx is fully tested test-unit-proto: - @VERSION=$(VERSION) go test -mod=readonly ./x/auth/client/cli/cli_test.go -tags='ledger test_ledger_mock test_proto' + @VERSION=$(VERSION) go test -mod=readonly ./... -tags='ledger test_ledger_mock test_proto' test-unit-amino: - @VERSION=$(VERSION) go test -mod=readonly ./x/auth/client/cli/cli_test.go -tags='ledger test_ledger_mock' + @VERSION=$(VERSION) go test -mod=readonly ./... -tags='ledger test_ledger_mock' test-race: @VERSION=$(VERSION) go test -mod=readonly -race $(PACKAGES_NOSIMULATION) diff --git a/client/context.go b/client/context.go index 4dfa15d3989a..5580853e3027 100644 --- a/client/context.go +++ b/client/context.go @@ -8,7 +8,7 @@ import ( "github.com/pkg/errors" rpcclient "github.com/tendermint/tendermint/rpc/client" rpchttp "github.com/tendermint/tendermint/rpc/client/http" - "gopkg.in/yaml.v2" + yaml "gopkg.in/yaml.v2" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" @@ -200,8 +200,7 @@ func (ctx Context) WithInterfaceRegistry(interfaceRegistry codectypes.InterfaceR // will be JSON encoded using ctx.JSONMarshaler. An error is returned upon failure. func (ctx Context) PrintOutput(toPrint interface{}) error { // always serialize JSON initially because proto json can't be directly YAML encoded - builder := toPrint.(TxBuilder) - out, err := ctx.TxConfig.TxJSONEncoder()(builder.GetTx()) + out, err := ctx.JSONMarshaler.MarshalJSON(toPrint) if err != nil { return err } diff --git a/client/tx_generator.go b/client/tx_generator.go index 2452b45ddebf..b5cf811978f7 100644 --- a/client/tx_generator.go +++ b/client/tx_generator.go @@ -14,6 +14,8 @@ type ( TxDecoder() sdk.TxDecoder TxJSONEncoder() sdk.TxEncoder TxJSONDecoder() sdk.TxDecoder + MarshalSignatureJSON([]signingtypes.SignatureV2) ([]byte, error) + UnmarshalSignatureJSON([]byte) ([]signingtypes.SignatureV2, error) } // TxConfig defines an interface a client can utilize to generate an diff --git a/proto/cosmos/tx/sig_desc.proto b/proto/cosmos/tx/sig_desc.proto new file mode 100644 index 000000000000..4d232632dc63 --- /dev/null +++ b/proto/cosmos/tx/sig_desc.proto @@ -0,0 +1,52 @@ +syntax = "proto3"; +package cosmos.tx; + +import "cosmos/crypto/crypto.proto"; +import "cosmos/tx/signing/signing.proto"; + +option go_package = "github.com/cosmos/cosmos-sdk/types/tx"; + + +// SignatureDescriptors wraps multiple SignatureDescriptor's +message SignatureDescriptors { + repeated SignatureDescriptor signatures = 1; +} + +// SignatureDescriptor is a convenience type which represents the full data for a +// signature including the public key of the signer, signing modes and the signature itself +message SignatureDescriptor { + // public_key is the public key of the signer + cosmos.crypto.PublicKey public_key = 1; + + // data represents the signature data + Data data = 2; + + message Data { + // sum is the oneof that specifies whether this represents single or multi-signature data + oneof sum { + // single represents a single signer + Single single = 1; + + // multi represents a multisig signer + Multi multi = 2; + } + + // Single is the signature data for a single signer + message Single { + // mode is the signing mode of the single signer + cosmos.tx.signing.SignMode mode = 1; + + // signature is the raw signature bytes + bytes signature = 2; + } + + // Multi is the signature data for a multisig public key + message Multi { + // bitarray specifies which keys within the multisig are signing + cosmos.crypto.CompactBitArray bitarray = 1; + + // signatures is the signatures of the multi-signature + repeated Data signatures = 2; + } + } +} \ No newline at end of file diff --git a/types/tx/sig_desc.pb.go b/types/tx/sig_desc.pb.go new file mode 100644 index 000000000000..16bc861e4f89 --- /dev/null +++ b/types/tx/sig_desc.pb.go @@ -0,0 +1,1374 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: cosmos/tx/sig_desc.proto + +package tx + +import ( + fmt "fmt" + types "github.com/cosmos/cosmos-sdk/crypto/types" + signing "github.com/cosmos/cosmos-sdk/types/tx/signing" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// SignatureDescriptors wraps multiple SignatureDescriptor's +type SignatureDescriptors struct { + Signatures []*SignatureDescriptor `protobuf:"bytes,1,rep,name=signatures,proto3" json:"signatures,omitempty"` +} + +func (m *SignatureDescriptors) Reset() { *m = SignatureDescriptors{} } +func (m *SignatureDescriptors) String() string { return proto.CompactTextString(m) } +func (*SignatureDescriptors) ProtoMessage() {} +func (*SignatureDescriptors) Descriptor() ([]byte, []int) { + return fileDescriptor_d560eb6bd3d62ef7, []int{0} +} +func (m *SignatureDescriptors) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SignatureDescriptors) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SignatureDescriptors.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SignatureDescriptors) XXX_Merge(src proto.Message) { + xxx_messageInfo_SignatureDescriptors.Merge(m, src) +} +func (m *SignatureDescriptors) XXX_Size() int { + return m.Size() +} +func (m *SignatureDescriptors) XXX_DiscardUnknown() { + xxx_messageInfo_SignatureDescriptors.DiscardUnknown(m) +} + +var xxx_messageInfo_SignatureDescriptors proto.InternalMessageInfo + +func (m *SignatureDescriptors) GetSignatures() []*SignatureDescriptor { + if m != nil { + return m.Signatures + } + return nil +} + +// SignatureDescriptor is a convenience type which represents the full data for a +// signature including the public key of the signer, signing modes and the signature itself +type SignatureDescriptor struct { + // public_key is the public key of the signer + PublicKey *types.PublicKey `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + // data represents the signature data + Data *SignatureDescriptor_Data `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` +} + +func (m *SignatureDescriptor) Reset() { *m = SignatureDescriptor{} } +func (m *SignatureDescriptor) String() string { return proto.CompactTextString(m) } +func (*SignatureDescriptor) ProtoMessage() {} +func (*SignatureDescriptor) Descriptor() ([]byte, []int) { + return fileDescriptor_d560eb6bd3d62ef7, []int{1} +} +func (m *SignatureDescriptor) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SignatureDescriptor) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SignatureDescriptor.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SignatureDescriptor) XXX_Merge(src proto.Message) { + xxx_messageInfo_SignatureDescriptor.Merge(m, src) +} +func (m *SignatureDescriptor) XXX_Size() int { + return m.Size() +} +func (m *SignatureDescriptor) XXX_DiscardUnknown() { + xxx_messageInfo_SignatureDescriptor.DiscardUnknown(m) +} + +var xxx_messageInfo_SignatureDescriptor proto.InternalMessageInfo + +func (m *SignatureDescriptor) GetPublicKey() *types.PublicKey { + if m != nil { + return m.PublicKey + } + return nil +} + +func (m *SignatureDescriptor) GetData() *SignatureDescriptor_Data { + if m != nil { + return m.Data + } + return nil +} + +type SignatureDescriptor_Data struct { + // sum is the oneof that specifies whether this represents single or multi-signature data + // + // Types that are valid to be assigned to Sum: + // *SignatureDescriptor_Data_Single_ + // *SignatureDescriptor_Data_Multi_ + Sum isSignatureDescriptor_Data_Sum `protobuf_oneof:"sum"` +} + +func (m *SignatureDescriptor_Data) Reset() { *m = SignatureDescriptor_Data{} } +func (m *SignatureDescriptor_Data) String() string { return proto.CompactTextString(m) } +func (*SignatureDescriptor_Data) ProtoMessage() {} +func (*SignatureDescriptor_Data) Descriptor() ([]byte, []int) { + return fileDescriptor_d560eb6bd3d62ef7, []int{1, 0} +} +func (m *SignatureDescriptor_Data) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SignatureDescriptor_Data) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SignatureDescriptor_Data.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SignatureDescriptor_Data) XXX_Merge(src proto.Message) { + xxx_messageInfo_SignatureDescriptor_Data.Merge(m, src) +} +func (m *SignatureDescriptor_Data) XXX_Size() int { + return m.Size() +} +func (m *SignatureDescriptor_Data) XXX_DiscardUnknown() { + xxx_messageInfo_SignatureDescriptor_Data.DiscardUnknown(m) +} + +var xxx_messageInfo_SignatureDescriptor_Data proto.InternalMessageInfo + +type isSignatureDescriptor_Data_Sum interface { + isSignatureDescriptor_Data_Sum() + MarshalTo([]byte) (int, error) + Size() int +} + +type SignatureDescriptor_Data_Single_ struct { + Single *SignatureDescriptor_Data_Single `protobuf:"bytes,1,opt,name=single,proto3,oneof" json:"single,omitempty"` +} +type SignatureDescriptor_Data_Multi_ struct { + Multi *SignatureDescriptor_Data_Multi `protobuf:"bytes,2,opt,name=multi,proto3,oneof" json:"multi,omitempty"` +} + +func (*SignatureDescriptor_Data_Single_) isSignatureDescriptor_Data_Sum() {} +func (*SignatureDescriptor_Data_Multi_) isSignatureDescriptor_Data_Sum() {} + +func (m *SignatureDescriptor_Data) GetSum() isSignatureDescriptor_Data_Sum { + if m != nil { + return m.Sum + } + return nil +} + +func (m *SignatureDescriptor_Data) GetSingle() *SignatureDescriptor_Data_Single { + if x, ok := m.GetSum().(*SignatureDescriptor_Data_Single_); ok { + return x.Single + } + return nil +} + +func (m *SignatureDescriptor_Data) GetMulti() *SignatureDescriptor_Data_Multi { + if x, ok := m.GetSum().(*SignatureDescriptor_Data_Multi_); ok { + return x.Multi + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*SignatureDescriptor_Data) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*SignatureDescriptor_Data_Single_)(nil), + (*SignatureDescriptor_Data_Multi_)(nil), + } +} + +// Single is the signature data for a single signer +type SignatureDescriptor_Data_Single struct { + // mode is the signing mode of the single signer + Mode signing.SignMode `protobuf:"varint,1,opt,name=mode,proto3,enum=cosmos.tx.signing.SignMode" json:"mode,omitempty"` + // signature is the raw signature bytes + Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` +} + +func (m *SignatureDescriptor_Data_Single) Reset() { *m = SignatureDescriptor_Data_Single{} } +func (m *SignatureDescriptor_Data_Single) String() string { return proto.CompactTextString(m) } +func (*SignatureDescriptor_Data_Single) ProtoMessage() {} +func (*SignatureDescriptor_Data_Single) Descriptor() ([]byte, []int) { + return fileDescriptor_d560eb6bd3d62ef7, []int{1, 0, 0} +} +func (m *SignatureDescriptor_Data_Single) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SignatureDescriptor_Data_Single) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SignatureDescriptor_Data_Single.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SignatureDescriptor_Data_Single) XXX_Merge(src proto.Message) { + xxx_messageInfo_SignatureDescriptor_Data_Single.Merge(m, src) +} +func (m *SignatureDescriptor_Data_Single) XXX_Size() int { + return m.Size() +} +func (m *SignatureDescriptor_Data_Single) XXX_DiscardUnknown() { + xxx_messageInfo_SignatureDescriptor_Data_Single.DiscardUnknown(m) +} + +var xxx_messageInfo_SignatureDescriptor_Data_Single proto.InternalMessageInfo + +func (m *SignatureDescriptor_Data_Single) GetMode() signing.SignMode { + if m != nil { + return m.Mode + } + return signing.SignMode_SIGN_MODE_UNSPECIFIED +} + +func (m *SignatureDescriptor_Data_Single) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +// Multi is the signature data for a multisig public key +type SignatureDescriptor_Data_Multi struct { + // bitarray specifies which keys within the multisig are signing + Bitarray *types.CompactBitArray `protobuf:"bytes,1,opt,name=bitarray,proto3" json:"bitarray,omitempty"` + // signatures is the signatures of the multi-signature + Signatures []*SignatureDescriptor_Data `protobuf:"bytes,2,rep,name=signatures,proto3" json:"signatures,omitempty"` +} + +func (m *SignatureDescriptor_Data_Multi) Reset() { *m = SignatureDescriptor_Data_Multi{} } +func (m *SignatureDescriptor_Data_Multi) String() string { return proto.CompactTextString(m) } +func (*SignatureDescriptor_Data_Multi) ProtoMessage() {} +func (*SignatureDescriptor_Data_Multi) Descriptor() ([]byte, []int) { + return fileDescriptor_d560eb6bd3d62ef7, []int{1, 0, 1} +} +func (m *SignatureDescriptor_Data_Multi) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SignatureDescriptor_Data_Multi) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SignatureDescriptor_Data_Multi.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SignatureDescriptor_Data_Multi) XXX_Merge(src proto.Message) { + xxx_messageInfo_SignatureDescriptor_Data_Multi.Merge(m, src) +} +func (m *SignatureDescriptor_Data_Multi) XXX_Size() int { + return m.Size() +} +func (m *SignatureDescriptor_Data_Multi) XXX_DiscardUnknown() { + xxx_messageInfo_SignatureDescriptor_Data_Multi.DiscardUnknown(m) +} + +var xxx_messageInfo_SignatureDescriptor_Data_Multi proto.InternalMessageInfo + +func (m *SignatureDescriptor_Data_Multi) GetBitarray() *types.CompactBitArray { + if m != nil { + return m.Bitarray + } + return nil +} + +func (m *SignatureDescriptor_Data_Multi) GetSignatures() []*SignatureDescriptor_Data { + if m != nil { + return m.Signatures + } + return nil +} + +func init() { + proto.RegisterType((*SignatureDescriptors)(nil), "cosmos.tx.SignatureDescriptors") + proto.RegisterType((*SignatureDescriptor)(nil), "cosmos.tx.SignatureDescriptor") + proto.RegisterType((*SignatureDescriptor_Data)(nil), "cosmos.tx.SignatureDescriptor.Data") + proto.RegisterType((*SignatureDescriptor_Data_Single)(nil), "cosmos.tx.SignatureDescriptor.Data.Single") + proto.RegisterType((*SignatureDescriptor_Data_Multi)(nil), "cosmos.tx.SignatureDescriptor.Data.Multi") +} + +func init() { proto.RegisterFile("cosmos/tx/sig_desc.proto", fileDescriptor_d560eb6bd3d62ef7) } + +var fileDescriptor_d560eb6bd3d62ef7 = []byte{ + // 409 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xcf, 0xeb, 0xd3, 0x40, + 0x10, 0xc5, 0x93, 0x7e, 0xd3, 0x62, 0xa7, 0xe2, 0x61, 0xf5, 0x10, 0xa2, 0xac, 0xa5, 0x22, 0x54, + 0xc1, 0x04, 0xea, 0xa1, 0xe0, 0x41, 0xe9, 0x8f, 0x43, 0x41, 0x0a, 0xb2, 0x05, 0x05, 0x2f, 0x65, + 0x93, 0x2c, 0x71, 0x69, 0x93, 0x0d, 0xd9, 0x0d, 0x34, 0x77, 0x0f, 0x1e, 0xfd, 0xb3, 0x3c, 0xf6, + 0xe8, 0x51, 0xda, 0xff, 0xc2, 0x93, 0x64, 0x93, 0xd4, 0x56, 0x8a, 0xf4, 0x34, 0xed, 0xe6, 0x7d, + 0xde, 0x3c, 0x66, 0x06, 0xec, 0x40, 0xc8, 0x58, 0x48, 0x4f, 0xed, 0x3c, 0xc9, 0xa3, 0x75, 0xc8, + 0x64, 0xe0, 0xa6, 0x99, 0x50, 0x02, 0x75, 0xab, 0x2f, 0xae, 0xda, 0x39, 0x4e, 0x2d, 0x0a, 0xb2, + 0x22, 0x55, 0xa2, 0x2e, 0x95, 0xcc, 0x79, 0x7a, 0x61, 0x90, 0xf0, 0x24, 0x6a, 0x6a, 0x25, 0x18, + 0x7c, 0x84, 0x47, 0x2b, 0x1e, 0x25, 0x54, 0xe5, 0x19, 0x9b, 0x33, 0x19, 0x64, 0x3c, 0x55, 0x22, + 0x93, 0xe8, 0x2d, 0x80, 0x6c, 0xde, 0xa5, 0x6d, 0xf6, 0xef, 0x86, 0xbd, 0x11, 0x76, 0x4f, 0x4d, + 0xdd, 0x2b, 0x10, 0x39, 0x23, 0x06, 0x5f, 0x2d, 0x78, 0x78, 0x45, 0x83, 0xc6, 0x00, 0x69, 0xee, + 0x6f, 0x79, 0xb0, 0xde, 0xb0, 0xc2, 0x36, 0xfb, 0xe6, 0xb0, 0x37, 0xb2, 0x1b, 0xdf, 0x3a, 0xfa, + 0x07, 0x2d, 0x78, 0xcf, 0x0a, 0xd2, 0x4d, 0x9b, 0x9f, 0x68, 0x0c, 0x56, 0x48, 0x15, 0xb5, 0x5b, + 0x1a, 0x79, 0xf6, 0xff, 0x28, 0xee, 0x9c, 0x2a, 0x4a, 0x34, 0xe0, 0xfc, 0x6e, 0x81, 0x55, 0xfe, + 0x45, 0x73, 0xe8, 0x48, 0x9e, 0x44, 0x5b, 0x56, 0xb7, 0x7d, 0x79, 0x83, 0x87, 0xbb, 0xd2, 0xc4, + 0xc2, 0x20, 0x35, 0x8b, 0x26, 0xd0, 0x8e, 0xf3, 0xad, 0xe2, 0x75, 0x90, 0x17, 0xb7, 0x98, 0x2c, + 0x4b, 0x60, 0x61, 0x90, 0x8a, 0x74, 0x3e, 0x41, 0xa7, 0xb2, 0x45, 0x1e, 0x58, 0xb1, 0x08, 0xab, + 0x40, 0x0f, 0x46, 0x8f, 0xcf, 0xbc, 0x9a, 0x2d, 0x95, 0x9e, 0x4b, 0x11, 0x32, 0xa2, 0x85, 0xe8, + 0x09, 0x74, 0x4f, 0x43, 0xd6, 0x09, 0xee, 0x93, 0xbf, 0x0f, 0xce, 0x37, 0x13, 0xda, 0xba, 0x17, + 0x7a, 0x03, 0xf7, 0x7c, 0xae, 0x68, 0x96, 0xd1, 0x66, 0xc8, 0xf8, 0x9f, 0x21, 0xcf, 0x44, 0x9c, + 0xd2, 0x40, 0x4d, 0xb9, 0x9a, 0x94, 0x2a, 0x72, 0xd2, 0xa3, 0xd9, 0xc5, 0xea, 0x5b, 0x7a, 0xf5, + 0x37, 0xcd, 0xfb, 0x0c, 0x9b, 0xb6, 0xe1, 0x4e, 0xe6, 0xf1, 0xf4, 0xdd, 0x8f, 0x03, 0x36, 0xf7, + 0x07, 0x6c, 0xfe, 0x3a, 0x60, 0xf3, 0xfb, 0x11, 0x1b, 0xfb, 0x23, 0x36, 0x7e, 0x1e, 0xb1, 0xf1, + 0xf9, 0x79, 0xc4, 0xd5, 0x97, 0xdc, 0x77, 0x03, 0x11, 0x7b, 0xcd, 0x01, 0xeb, 0xf2, 0x4a, 0x86, + 0x1b, 0x4f, 0x15, 0x29, 0x2b, 0xaf, 0xd6, 0xef, 0xe8, 0x33, 0x7d, 0xfd, 0x27, 0x00, 0x00, 0xff, + 0xff, 0x10, 0xb1, 0xf1, 0xc8, 0x0a, 0x03, 0x00, 0x00, +} + +func (m *SignatureDescriptors) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SignatureDescriptors) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SignatureDescriptors) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Signatures) > 0 { + for iNdEx := len(m.Signatures) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Signatures[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSigDesc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *SignatureDescriptor) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SignatureDescriptor) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SignatureDescriptor) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Data != nil { + { + size, err := m.Data.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSigDesc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.PublicKey != nil { + { + size, err := m.PublicKey.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSigDesc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SignatureDescriptor_Data) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SignatureDescriptor_Data) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SignatureDescriptor_Data) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Sum != nil { + { + size := m.Sum.Size() + i -= size + if _, err := m.Sum.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + return len(dAtA) - i, nil +} + +func (m *SignatureDescriptor_Data_Single_) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SignatureDescriptor_Data_Single_) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Single != nil { + { + size, err := m.Single.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSigDesc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} +func (m *SignatureDescriptor_Data_Multi_) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SignatureDescriptor_Data_Multi_) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Multi != nil { + { + size, err := m.Multi.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSigDesc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} +func (m *SignatureDescriptor_Data_Single) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SignatureDescriptor_Data_Single) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SignatureDescriptor_Data_Single) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Signature) > 0 { + i -= len(m.Signature) + copy(dAtA[i:], m.Signature) + i = encodeVarintSigDesc(dAtA, i, uint64(len(m.Signature))) + i-- + dAtA[i] = 0x12 + } + if m.Mode != 0 { + i = encodeVarintSigDesc(dAtA, i, uint64(m.Mode)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *SignatureDescriptor_Data_Multi) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SignatureDescriptor_Data_Multi) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SignatureDescriptor_Data_Multi) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Signatures) > 0 { + for iNdEx := len(m.Signatures) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Signatures[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSigDesc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if m.Bitarray != nil { + { + size, err := m.Bitarray.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSigDesc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintSigDesc(dAtA []byte, offset int, v uint64) int { + offset -= sovSigDesc(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *SignatureDescriptors) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Signatures) > 0 { + for _, e := range m.Signatures { + l = e.Size() + n += 1 + l + sovSigDesc(uint64(l)) + } + } + return n +} + +func (m *SignatureDescriptor) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PublicKey != nil { + l = m.PublicKey.Size() + n += 1 + l + sovSigDesc(uint64(l)) + } + if m.Data != nil { + l = m.Data.Size() + n += 1 + l + sovSigDesc(uint64(l)) + } + return n +} + +func (m *SignatureDescriptor_Data) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Sum != nil { + n += m.Sum.Size() + } + return n +} + +func (m *SignatureDescriptor_Data_Single_) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Single != nil { + l = m.Single.Size() + n += 1 + l + sovSigDesc(uint64(l)) + } + return n +} +func (m *SignatureDescriptor_Data_Multi_) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Multi != nil { + l = m.Multi.Size() + n += 1 + l + sovSigDesc(uint64(l)) + } + return n +} +func (m *SignatureDescriptor_Data_Single) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Mode != 0 { + n += 1 + sovSigDesc(uint64(m.Mode)) + } + l = len(m.Signature) + if l > 0 { + n += 1 + l + sovSigDesc(uint64(l)) + } + return n +} + +func (m *SignatureDescriptor_Data_Multi) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Bitarray != nil { + l = m.Bitarray.Size() + n += 1 + l + sovSigDesc(uint64(l)) + } + if len(m.Signatures) > 0 { + for _, e := range m.Signatures { + l = e.Size() + n += 1 + l + sovSigDesc(uint64(l)) + } + } + return n +} + +func sovSigDesc(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozSigDesc(x uint64) (n int) { + return sovSigDesc(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *SignatureDescriptors) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigDesc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SignatureDescriptors: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SignatureDescriptors: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signatures", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigDesc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSigDesc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSigDesc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signatures = append(m.Signatures, &SignatureDescriptor{}) + if err := m.Signatures[len(m.Signatures)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSigDesc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthSigDesc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthSigDesc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SignatureDescriptor) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigDesc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SignatureDescriptor: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SignatureDescriptor: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigDesc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSigDesc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSigDesc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.PublicKey == nil { + m.PublicKey = &types.PublicKey{} + } + if err := m.PublicKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigDesc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSigDesc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSigDesc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Data == nil { + m.Data = &SignatureDescriptor_Data{} + } + if err := m.Data.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSigDesc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthSigDesc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthSigDesc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SignatureDescriptor_Data) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigDesc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Data: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Data: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Single", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigDesc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSigDesc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSigDesc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SignatureDescriptor_Data_Single{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Sum = &SignatureDescriptor_Data_Single_{v} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Multi", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigDesc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSigDesc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSigDesc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SignatureDescriptor_Data_Multi{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Sum = &SignatureDescriptor_Data_Multi_{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSigDesc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthSigDesc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthSigDesc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SignatureDescriptor_Data_Single) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigDesc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Single: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Single: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Mode", wireType) + } + m.Mode = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigDesc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Mode |= signing.SignMode(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigDesc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthSigDesc + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthSigDesc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signature = append(m.Signature[:0], dAtA[iNdEx:postIndex]...) + if m.Signature == nil { + m.Signature = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSigDesc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthSigDesc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthSigDesc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SignatureDescriptor_Data_Multi) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigDesc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Multi: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Multi: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Bitarray", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigDesc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSigDesc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSigDesc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Bitarray == nil { + m.Bitarray = &types.CompactBitArray{} + } + if err := m.Bitarray.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signatures", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigDesc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSigDesc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSigDesc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signatures = append(m.Signatures, &SignatureDescriptor_Data{}) + if err := m.Signatures[len(m.Signatures)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSigDesc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthSigDesc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthSigDesc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipSigDesc(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSigDesc + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSigDesc + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSigDesc + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthSigDesc + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupSigDesc + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthSigDesc + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthSigDesc = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowSigDesc = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupSigDesc = fmt.Errorf("proto: unexpected end of group") +) diff --git a/types/tx/signing/signature.go b/types/tx/signing/signature.go index 47744de28433..e05fa41ab301 100644 --- a/types/tx/signing/signature.go +++ b/types/tx/signing/signature.go @@ -1,6 +1,8 @@ package signing -import "github.com/tendermint/tendermint/crypto" +import ( + "github.com/tendermint/tendermint/crypto" +) // SignatureV2 is a convenience type that is easier to use in application logic // than the protobuf SignerInfo's and raw signature bytes. It goes beyond the diff --git a/x/auth/client/cli/cli_test.go b/x/auth/client/cli/cli_test.go index 65ed4507381b..28afd3d33884 100644 --- a/x/auth/client/cli/cli_test.go +++ b/x/auth/client/cli/cli_test.go @@ -1,5 +1,3 @@ -// +build test_proto - package cli_test import ( diff --git a/x/auth/client/cli/tx_sign.go b/x/auth/client/cli/tx_sign.go index 0e2fefe1fbce..4094c7b4f572 100644 --- a/x/auth/client/cli/tx_sign.go +++ b/x/auth/client/cli/tx_sign.go @@ -9,7 +9,6 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/client/tx" - "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" authclient "github.com/cosmos/cosmos-sdk/x/auth/client" ) @@ -112,19 +111,19 @@ func makeSignBatchCmd() func(cmd *cobra.Command, args []string) error { if err != nil { return fmt.Errorf("error getting account from keybase: %w", err) } - err = authclient.SignStdTx(txFactory, clientCtx, fromName, txBuilder, false, true) + err = authclient.SignTx(txFactory, clientCtx, fromName, txBuilder, true) if err != nil { return err } } else { - err = authclient.SignStdTxWithSignerAddress(txFactory, clientCtx, multisigAddr, clientCtx.GetFromName(), txBuilder, true) + err = authclient.SignTxWithSignerAddress(txFactory, clientCtx, multisigAddr, clientCtx.GetFromName(), txBuilder, true) } if err != nil { return err } - json, err := getSignatureJSON(clientCtx.JSONMarshaler, txGen, txBuilder, unsignedStdTx, generateSignatureOnly) + json, err := getSignatureJSON(txGen, txBuilder, unsignedStdTx, generateSignatureOnly) if err != nil { return err } @@ -240,7 +239,7 @@ func makeSignCmd() func(cmd *cobra.Command, args []string) error { return err } - err = authclient.SignStdTxWithSignerAddress( + err = authclient.SignTxWithSignerAddress( txF, clientCtx, multisigAddr, fromName, txBuilder, clientCtx.Offline, ) generateSignatureOnly = true @@ -248,14 +247,14 @@ func makeSignCmd() func(cmd *cobra.Command, args []string) error { append, _ := cmd.Flags().GetBool(flagAppend) appendSig := append && !generateSignatureOnly if appendSig { - err = authclient.SignStdTx(txF, clientCtx, clientCtx.GetFromName(), txBuilder, appendSig, clientCtx.Offline) + err = authclient.SignTx(txF, clientCtx, clientCtx.GetFromName(), txBuilder, clientCtx.Offline) } } if err != nil { return err } - json, err := getSignatureJSON(clientCtx.JSONMarshaler, txGen, txBuilder, newTx, generateSignatureOnly) + json, err := getSignatureJSON(txGen, txBuilder, newTx, generateSignatureOnly) if err != nil { return err } @@ -277,31 +276,14 @@ func makeSignCmd() func(cmd *cobra.Command, args []string) error { } } -func getSignatureJSON(cdc codec.JSONMarshaler, txGen client.TxConfig, txBldr client.TxBuilder, newTx sdk.Tx, generateSignatureOnly bool) ([]byte, error) { +func getSignatureJSON(txConfig client.TxConfig, txBldr client.TxBuilder, newTx sdk.Tx, generateSignatureOnly bool) ([]byte, error) { if generateSignatureOnly { - return cdc.MarshalJSON(txBldr.GetTx().GetSignatures()) + sigs, err := txBldr.GetTx().GetSignaturesV2() + if err != nil { + return nil, err + } + return txConfig.MarshalSignatureJSON(sigs) } - return txGen.TxEncoder()(newTx) + return txConfig.TxEncoder()(newTx) } - -// func getSignatureJSON(cdc codec.JSONMarshaler, newTx authsigning.SigVerifiableTx, indent, generateSignatureOnly bool) ([]byte, error) { -// switch generateSignatureOnly { -// case true: -// sigData, err := newTx.GetSignatureData() -// pubKeys := newTx.GetPubKeys() -// if err != nil { -// return nil, err -// } -// return getSignatureBuilderJSON(cdc, client.SignatureBuilder{ -// PubKey: pubKeys[0], -// Data: sigData[0], -// }, indent) -// default: -// panic("TODO") -// } -// } -// -// func getSignatureBuilderJSON(cdc codec.JSONMarshaler, sigBuilder client.SignatureBuilder, indent bool) ([]byte, error) { -// -// } diff --git a/x/auth/client/tx.go b/x/auth/client/tx.go index 44fa4a444132..f36c4ecfcb9d 100644 --- a/x/auth/client/tx.go +++ b/x/auth/client/tx.go @@ -77,11 +77,10 @@ func PrintUnsignedStdTx(txBldr tx.Factory, clientCtx client.Context, msgs []sdk. return err } -// SignStdTx appends a signature to a StdTx and returns a copy of it. If appendSig +// SignTx appends a signature to a transaction. If appendSig // is false, it replaces the signatures already attached with the new signature. // Don't perform online validation or lookups if offline is true. -func SignStdTx(txFactory tx.Factory, clientCtx client.Context, name string, - stdTx client.TxBuilder, appendSig bool, offline bool) error { +func SignTx(txFactory tx.Factory, clientCtx client.Context, name string, stdTx client.TxBuilder, offline bool) error { info, err := txFactory.Keybase().Key(name) if err != nil { return err @@ -100,10 +99,10 @@ func SignStdTx(txFactory tx.Factory, clientCtx client.Context, name string, return tx.Sign(txFactory, name, stdTx) } -// SignStdTxWithSignerAddress attaches a signature to a StdTx and returns a copy of a it. +// SignTxWithSignerAddress attaches a signature to a transaction. // Don't perform online validation or lookups if offline is true, else // populate account and sequence numbers from a foreign account. -func SignStdTxWithSignerAddress(txFactory tx.Factory, clientCtx client.Context, addr sdk.AccAddress, +func SignTxWithSignerAddress(txFactory tx.Factory, clientCtx client.Context, addr sdk.AccAddress, name string, txBuilder client.TxBuilder, offline bool) (err error) { // check whether the address is a signer diff --git a/x/auth/tx/generator.go b/x/auth/tx/generator.go index f70ddaafca7f..04d6896e5b36 100644 --- a/x/auth/tx/generator.go +++ b/x/auth/tx/generator.go @@ -3,8 +3,9 @@ package tx import ( "fmt" + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/client" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/signing" @@ -17,17 +18,19 @@ type generator struct { encoder sdk.TxEncoder jsonDecoder sdk.TxDecoder jsonEncoder sdk.TxEncoder + protoCodec *codec.ProtoCodec } -// NewTxConfig returns a new protobuf TxConfig using the provided Marshaler, PublicKeyCodec and SignModeHandler. -func NewTxConfig(anyUnpacker codectypes.AnyUnpacker, pubkeyCodec types.PublicKeyCodec, signModeHandler signing.SignModeHandler) client.TxConfig { +// NewTxConfig returns a new protobuf TxConfig using the provided ProtoCodec, PublicKeyCodec and SignModeHandler. +func NewTxConfig(protoCodec *codec.ProtoCodec, pubkeyCodec types.PublicKeyCodec, signModeHandler signing.SignModeHandler) client.TxConfig { return &generator{ pubkeyCodec: pubkeyCodec, handler: signModeHandler, - decoder: DefaultTxDecoder(anyUnpacker, pubkeyCodec), + decoder: DefaultTxDecoder(protoCodec, pubkeyCodec), encoder: DefaultTxEncoder(), - jsonDecoder: DefaultJSONTxDecoder(anyUnpacker, pubkeyCodec), + jsonDecoder: DefaultJSONTxDecoder(protoCodec, pubkeyCodec), jsonEncoder: DefaultJSONTxEncoder(), + protoCodec: protoCodec, } } diff --git a/x/auth/tx/sigs.go b/x/auth/tx/sigs.go index 2752fa8da4c3..d318fa8fa7f9 100644 --- a/x/auth/tx/sigs.go +++ b/x/auth/tx/sigs.go @@ -3,6 +3,8 @@ package tx import ( "fmt" + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/types/tx" "github.com/cosmos/cosmos-sdk/types/tx/signing" @@ -102,3 +104,105 @@ func decodeMultisignatures(bz []byte) ([][]byte, error) { } return multisig.Signatures, nil } + +func (g generator) MarshalSignatureJSON(sigs []signing.SignatureV2) ([]byte, error) { + descs := make([]*tx.SignatureDescriptor, len(sigs)) + + for i, sig := range sigs { + publicKey, err := g.pubkeyCodec.Encode(sig.PubKey) + if err != nil { + return nil, err + } + + descData := sigDataToSigDescData(sig.Data) + + descs[i] = &tx.SignatureDescriptor{ + PublicKey: publicKey, + Data: descData, + } + } + + toJson := &tx.SignatureDescriptors{Signatures: descs} + + return codec.ProtoMarshalJSON(toJson) +} + +func sigDataToSigDescData(data signing.SignatureData) *tx.SignatureDescriptor_Data { + switch data := data.(type) { + case *signing.SingleSignatureData: + return &tx.SignatureDescriptor_Data{ + Sum: &tx.SignatureDescriptor_Data_Single_{ + Single: &tx.SignatureDescriptor_Data_Single{ + Mode: data.SignMode, + Signature: data.Signature, + }, + }, + } + case *signing.MultiSignatureData: + descDatas := make([]*tx.SignatureDescriptor_Data, len(data.Signatures)) + + for j, d := range data.Signatures { + descDatas[j] = sigDataToSigDescData(d) + } + + return &tx.SignatureDescriptor_Data{ + Sum: &tx.SignatureDescriptor_Data_Multi_{ + Multi: &tx.SignatureDescriptor_Data_Multi{ + Bitarray: data.BitArray, + Signatures: descDatas, + }, + }, + } + default: + panic(fmt.Errorf("unexpected case %+v", data)) + } +} + +func (g generator) UnmarshalSignatureJSON(bz []byte) ([]signing.SignatureV2, error) { + var sigDescs tx.SignatureDescriptors + err := g.protoCodec.UnmarshalJSON(bz, &sigDescs) + if err != nil { + return nil, err + } + + sigs := make([]signing.SignatureV2, len(sigDescs.Signatures)) + for i, desc := range sigDescs.Signatures { + pubKey, err := g.pubkeyCodec.Decode(desc.PublicKey) + if err != nil { + return nil, err + } + + data := sigDescDataToSigData(desc.Data) + + sigs[i] = signing.SignatureV2{ + PubKey: pubKey, + Data: data, + } + } + + return sigs, nil +} + +func sigDescDataToSigData(descData *tx.SignatureDescriptor_Data) signing.SignatureData { + switch descData := descData.Sum.(type) { + case *tx.SignatureDescriptor_Data_Single_: + return &signing.SingleSignatureData{ + SignMode: descData.Single.Mode, + Signature: descData.Single.Signature, + } + case *tx.SignatureDescriptor_Data_Multi_: + multi := descData.Multi + datas := make([]signing.SignatureData, len(multi.Signatures)) + + for j, d := range multi.Signatures { + datas[j] = sigDescDataToSigData(d) + } + + return &signing.MultiSignatureData{ + BitArray: multi.Bitarray, + Signatures: datas, + } + default: + panic(fmt.Errorf("unexpected case %+v", descData)) + } +} diff --git a/x/auth/types/client_tx.go b/x/auth/types/client_tx.go index b0f8fc613bcd..f31c8b86258b 100644 --- a/x/auth/types/client_tx.go +++ b/x/auth/types/client_tx.go @@ -5,7 +5,6 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/codec/legacy" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/tx/signing" authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" @@ -37,29 +36,12 @@ func (s *StdTxBuilder) SetSignatures(signatures ...signing.SignatureV2) error { sigs := make([]StdSignature, len(signatures)) for i, sig := range signatures { - var pubKeyBz []byte - - pubKey := sig.PubKey - if pubKey != nil { - pubKeyBz = pubKey.Bytes() + stdSig, err := SignatureV2ToStdSignature(s.cdc, sig) + if err != nil { + return err } - var ( - sigBz []byte - err error - ) - - if sig.Data != nil { - sigBz, err = SignatureDataToAminoSignature(legacy.Cdc, sig.Data) - if err != nil { - return err - } - } - - sigs[i] = StdSignature{ - PubKey: pubKeyBz, - Signature: sigBz, - } + sigs[i] = stdSig } s.Signatures = sigs @@ -122,6 +104,38 @@ func (s StdTxConfig) TxJSONDecoder() sdk.TxDecoder { return DefaultJSONTxDecoder(s.Cdc) } +func (s StdTxConfig) MarshalSignatureJSON(sigs []signing.SignatureV2) ([]byte, error) { + stdSigs := make([]StdSignature, len(sigs)) + for i, sig := range sigs { + stdSig, err := SignatureV2ToStdSignature(s.Cdc, sig) + if err != nil { + return nil, err + } + + stdSigs[i] = stdSig + } + return s.Cdc.MarshalJSON(stdSigs) +} + +func (s StdTxConfig) UnmarshalSignatureJSON(bz []byte) ([]signing.SignatureV2, error) { + var stdSigs []StdSignature + err := s.Cdc.UnmarshalJSON(bz, &stdSigs) + if err != nil { + return nil, err + } + + sigs := make([]signing.SignatureV2, len(stdSigs)) + for i, stdSig := range stdSigs { + sig, err := StdSignatureToSignatureV2(s.Cdc, stdSig) + if err != nil { + return nil, err + } + sigs[i] = sig + } + + return sigs, nil +} + func (s StdTxConfig) SignModeHandler() authsigning.SignModeHandler { return LegacyAminoJSONHandler{} } diff --git a/x/auth/types/stdtx.go b/x/auth/types/stdtx.go index 589e494285c8..d8402c06cb2d 100644 --- a/x/auth/types/stdtx.go +++ b/x/auth/types/stdtx.go @@ -395,6 +395,33 @@ func StdSignatureToSignatureV2(cdc *codec.Codec, sig StdSignature) (signing.Sign }, nil } +// SignatureV2ToStdSignature converts a SignatureV2 to a StdSignature +func SignatureV2ToStdSignature(cdc *codec.Codec, sig signing.SignatureV2) (StdSignature, error) { + var pubKeyBz []byte + + pubKey := sig.PubKey + if pubKey != nil { + pubKeyBz = pubKey.Bytes() + } + + var ( + sigBz []byte + err error + ) + + if sig.Data != nil { + sigBz, err = SignatureDataToAminoSignature(cdc, sig.Data) + if err != nil { + return StdSignature{}, err + } + } + + return StdSignature{ + PubKey: pubKeyBz, + Signature: sigBz, + }, nil +} + func pubKeySigToSigData(cdc *codec.Codec, key crypto.PubKey, sig []byte) (signing.SignatureData, error) { multiPK, ok := key.(multisig.PubKey) if !ok { diff --git a/x/genutil/client/cli/gentx.go b/x/genutil/client/cli/gentx.go index c5a914f94858..55709874b32b 100644 --- a/x/genutil/client/cli/gentx.go +++ b/x/genutil/client/cli/gentx.go @@ -169,7 +169,7 @@ $ %s gentx my-key-name --home=/path/to/home/dir --keyring-backend=os --chain-id= } // sign the transaction and write it to the output file - err = authclient.SignStdTx(txFactory, clientCtx, name, txBuilder, false, true) + err = authclient.SignTx(txFactory, clientCtx, name, txBuilder, true) if err != nil { return errors.Wrap(err, "failed to sign std tx") } diff --git a/x/ibc/03-connection/types/connection.pb.go b/x/ibc/03-connection/types/connection.pb.go index 61399616e592..9c8edd03e898 100644 --- a/x/ibc/03-connection/types/connection.pb.go +++ b/x/ibc/03-connection/types/connection.pb.go @@ -419,14 +419,14 @@ func (m *MsgConnectionOpenConfirm) GetSigner() github_com_cosmos_cosmos_sdk_type // a connection between two chains. type ConnectionEnd struct { // client associated with this connection. - ClientID string `protobuf:"bytes,2,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty" yaml:"client_id"` + ClientID string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty" yaml:"client_id"` // IBC version which can be utilised to determine encodings or protocols for // channels or packets utilising this connection - Versions []string `protobuf:"bytes,3,rep,name=versions,proto3" json:"versions,omitempty"` + Versions []string `protobuf:"bytes,2,rep,name=versions,proto3" json:"versions,omitempty"` // current state of the connection end. - State State `protobuf:"varint,4,opt,name=state,proto3,enum=ibc.connection.State" json:"state,omitempty"` + State State `protobuf:"varint,3,opt,name=state,proto3,enum=ibc.connection.State" json:"state,omitempty"` // counterparty chain associated with this connection. - Counterparty Counterparty `protobuf:"bytes,5,opt,name=counterparty,proto3" json:"counterparty"` + Counterparty Counterparty `protobuf:"bytes,4,opt,name=counterparty,proto3" json:"counterparty"` } func (m *ConnectionEnd) Reset() { *m = ConnectionEnd{} } @@ -716,65 +716,66 @@ func init() { func init() { proto.RegisterFile("ibc/connection/connection.proto", fileDescriptor_3bf62bacf5a27ee9) } var fileDescriptor_3bf62bacf5a27ee9 = []byte{ - // 926 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x56, 0xcd, 0x6e, 0xdb, 0x46, - 0x10, 0x16, 0x29, 0xea, 0x6f, 0x2c, 0xdb, 0x0a, 0x23, 0x37, 0x84, 0x1a, 0x90, 0x2c, 0x73, 0x11, - 0x5a, 0x58, 0x6a, 0x92, 0x22, 0x07, 0x03, 0x3d, 0x48, 0xb2, 0x8c, 0x12, 0xad, 0x1d, 0x81, 0x96, - 0x0b, 0x34, 0x17, 0x41, 0x26, 0x57, 0xf2, 0x42, 0x16, 0x29, 0x90, 0xeb, 0x22, 0x7e, 0x83, 0xc0, - 0xa7, 0xf6, 0xd8, 0x83, 0x81, 0x02, 0x79, 0x89, 0x3e, 0x41, 0x91, 0x63, 0x8e, 0x3d, 0x11, 0x85, - 0x8c, 0xbe, 0x80, 0xd0, 0x53, 0x4f, 0x05, 0x77, 0xf9, 0x27, 0xdb, 0x68, 0x91, 0xca, 0x87, 0xc2, - 0x27, 0xcd, 0xcf, 0xb7, 0xb3, 0x33, 0xf3, 0x8d, 0x86, 0x0b, 0x0a, 0x3e, 0x36, 0x9b, 0xa6, 0x63, - 0xdb, 0xc8, 0x24, 0xd8, 0xb1, 0x53, 0x62, 0x63, 0xe6, 0x3a, 0xc4, 0x11, 0x37, 0xf0, 0xb1, 0xd9, - 0x48, 0xac, 0xb5, 0xea, 0xd8, 0x19, 0x3b, 0xd4, 0xd5, 0x0c, 0x24, 0x86, 0xaa, 0x85, 0x61, 0xa6, - 0x53, 0x4c, 0xa6, 0xc8, 0x26, 0x29, 0x91, 0x01, 0xb4, 0x5f, 0x78, 0xd8, 0xda, 0xf7, 0xc6, 0x9d, - 0x38, 0xd0, 0xcb, 0x19, 0xb2, 0x75, 0x1b, 0x13, 0xf1, 0x4b, 0x28, 0x99, 0xa7, 0x18, 0xd9, 0x64, - 0x80, 0x2d, 0x89, 0x53, 0xb9, 0x7a, 0xa9, 0xad, 0xce, 0x7d, 0xa5, 0xd8, 0xa1, 0x46, 0x7d, 0x77, - 0xe1, 0x2b, 0x95, 0xf3, 0xe1, 0xf4, 0x74, 0x47, 0x8b, 0x61, 0x9a, 0x51, 0x64, 0xb2, 0x6e, 0x89, - 0xfb, 0xb0, 0x9e, 0x64, 0x17, 0x84, 0xe0, 0x69, 0x88, 0xfa, 0xdc, 0x57, 0xca, 0xc9, 0x6d, 0x34, - 0x4c, 0x35, 0x0c, 0x93, 0x86, 0x6b, 0x46, 0x39, 0xd1, 0x75, 0x4b, 0xdc, 0x83, 0xb2, 0xe9, 0x9c, - 0xd9, 0x04, 0xb9, 0xb3, 0xa1, 0x4b, 0xce, 0xa5, 0xac, 0xca, 0xd5, 0xd7, 0x9e, 0x3d, 0x6e, 0x2c, - 0x77, 0xa1, 0xd1, 0x49, 0x61, 0xda, 0xc2, 0x3b, 0x5f, 0xc9, 0x18, 0x4b, 0xe7, 0x44, 0x1d, 0xf2, - 0x1e, 0x1e, 0xdb, 0xc8, 0x95, 0x04, 0x95, 0xab, 0x97, 0xdb, 0x4f, 0xff, 0xf2, 0x95, 0xed, 0x31, - 0x26, 0x27, 0x67, 0xc7, 0x0d, 0xd3, 0x99, 0x36, 0x4d, 0xc7, 0x9b, 0x3a, 0x5e, 0xf8, 0xb3, 0xed, - 0x59, 0x93, 0x26, 0x39, 0x9f, 0x21, 0xaf, 0xd1, 0x32, 0xcd, 0x96, 0x65, 0xb9, 0xc8, 0xf3, 0x8c, - 0x30, 0x80, 0xf6, 0xa7, 0x00, 0xd5, 0x1b, 0xad, 0xeb, 0xbb, 0xe7, 0xf7, 0xb4, 0x73, 0x47, 0xb0, - 0x95, 0xd6, 0x07, 0xdf, 0x23, 0xd7, 0xc3, 0x8e, 0xed, 0x49, 0x82, 0x9a, 0x0d, 0x2a, 0x5c, 0xf8, - 0xca, 0xe3, 0x28, 0x9d, 0x5b, 0x60, 0x9a, 0x51, 0x4d, 0xdb, 0xbf, 0x0d, 0xcd, 0xe2, 0x17, 0x00, - 0x33, 0xd7, 0x71, 0x46, 0x03, 0x6c, 0x63, 0x22, 0xe5, 0x28, 0x29, 0x5b, 0x0b, 0x5f, 0x79, 0xc0, - 0x62, 0x25, 0x3e, 0xcd, 0x28, 0x51, 0x85, 0x0e, 0xe7, 0x27, 0x50, 0x66, 0x9e, 0x13, 0x84, 0xc7, - 0x27, 0x44, 0xca, 0xab, 0x5c, 0x5d, 0x30, 0xd6, 0xa8, 0xed, 0x2b, 0x6a, 0x12, 0x3b, 0xb0, 0xc9, - 0x20, 0xa6, 0x63, 0x7b, 0xc8, 0xf6, 0xce, 0x3c, 0xa9, 0x40, 0xa3, 0xd7, 0x16, 0xbe, 0xf2, 0x51, - 0x3a, 0x7a, 0x0c, 0xd0, 0x8c, 0x0d, 0x6a, 0xe9, 0x44, 0x06, 0x71, 0x0f, 0x2a, 0xb1, 0x37, 0xba, - 0xab, 0x18, 0xdc, 0xd5, 0xfe, 0x78, 0xe1, 0x2b, 0x8f, 0xe2, 0xf6, 0x2f, 0x21, 0x34, 0x63, 0x33, - 0x36, 0x85, 0xc9, 0x24, 0x63, 0x57, 0x5a, 0x75, 0xec, 0x7e, 0xcd, 0xde, 0x32, 0x76, 0x2d, 0x73, - 0x72, 0x73, 0x6e, 0xb8, 0x95, 0xe6, 0x46, 0x82, 0x42, 0xc8, 0x1d, 0x1b, 0x40, 0x23, 0x52, 0xc5, - 0xa7, 0xc0, 0x98, 0x18, 0x10, 0x97, 0x8d, 0x53, 0xb9, 0x5d, 0x4d, 0x66, 0x3a, 0x76, 0x69, 0x46, - 0x91, 0xca, 0xc1, 0x5f, 0x62, 0xe7, 0x1a, 0x5f, 0x02, 0xed, 0xe1, 0xa3, 0x85, 0xaf, 0x3c, 0x4c, - 0x9f, 0x8a, 0xfa, 0xf7, 0x6f, 0x44, 0xe6, 0xee, 0x84, 0xc8, 0xfc, 0x4a, 0x44, 0x16, 0x56, 0x25, - 0xf2, 0x2d, 0x0f, 0xd2, 0x0d, 0x22, 0x3b, 0x8e, 0x3d, 0xc2, 0xee, 0xf4, 0xae, 0xc9, 0x8c, 0x29, - 0x1b, 0x9a, 0x13, 0x4a, 0xe7, 0x2d, 0x94, 0x0d, 0xcd, 0x49, 0x44, 0x59, 0x30, 0x4e, 0xd7, 0x29, - 0xcb, 0x7e, 0x00, 0x65, 0x77, 0xb8, 0x65, 0xff, 0xe0, 0x60, 0x3d, 0x29, 0xb8, 0x6b, 0x5b, 0xcb, - 0xeb, 0x95, 0xff, 0xe0, 0xf5, 0x5a, 0x83, 0x62, 0xbc, 0xba, 0xb2, 0xc1, 0xea, 0x32, 0x62, 0x5d, - 0xfc, 0x0c, 0x72, 0x1e, 0x19, 0x12, 0x44, 0xd3, 0xde, 0x78, 0xb6, 0x75, 0x7d, 0x49, 0x1e, 0x06, - 0x4e, 0x83, 0x61, 0x6e, 0x2c, 0xd6, 0xdc, 0x7f, 0x5b, 0xac, 0x3b, 0xc2, 0x9b, 0x9f, 0x95, 0x8c, - 0xf6, 0x23, 0x0f, 0x55, 0xdd, 0x42, 0x36, 0xc1, 0x23, 0x8c, 0xac, 0xa4, 0x62, 0xf1, 0x09, 0xf0, - 0x31, 0xfd, 0x0f, 0xe7, 0xbe, 0xc2, 0xd3, 0x0a, 0x4b, 0xac, 0xc2, 0xa0, 0x34, 0x1e, 0xdf, 0xd7, - 0x9e, 0xf8, 0x1c, 0x94, 0xd3, 0xd0, 0xff, 0xd9, 0x97, 0x75, 0x07, 0xf2, 0x33, 0x17, 0x8d, 0xf0, - 0xeb, 0x6b, 0xdf, 0xd4, 0xf8, 0x89, 0xb5, 0x8f, 0xdc, 0xc9, 0x29, 0xea, 0x51, 0x4c, 0x58, 0x66, - 0x78, 0x22, 0x2c, 0xf0, 0x09, 0xac, 0xb1, 0xd4, 0x7b, 0x43, 0x72, 0xe2, 0x89, 0x55, 0xc8, 0xcd, - 0x02, 0x41, 0xe2, 0x28, 0x07, 0x4c, 0xd1, 0x46, 0xb0, 0x99, 0x24, 0xc7, 0x80, 0x2b, 0xf6, 0x21, - 0xbe, 0x87, 0x4f, 0xdf, 0xf3, 0x35, 0x14, 0xc2, 0xaf, 0xb2, 0x28, 0x03, 0xe0, 0x68, 0x16, 0x5d, - 0x76, 0x81, 0x91, 0xb2, 0x04, 0xf3, 0x32, 0x42, 0x43, 0x72, 0xe6, 0xa2, 0x28, 0x46, 0xac, 0xb3, - 0xca, 0x3e, 0xfd, 0x89, 0x83, 0x1c, 0x9d, 0x0c, 0xf1, 0x05, 0x28, 0x87, 0xfd, 0x56, 0xbf, 0x3b, - 0x38, 0x3a, 0xd0, 0x0f, 0xf4, 0xbe, 0xde, 0xfa, 0x46, 0x7f, 0xd5, 0xdd, 0x1d, 0x1c, 0x1d, 0x1c, - 0xf6, 0xba, 0x1d, 0x7d, 0x4f, 0xef, 0xee, 0x56, 0x32, 0xb5, 0x07, 0x17, 0x97, 0xea, 0xfa, 0x12, - 0x40, 0x94, 0x00, 0xd8, 0xb9, 0xc0, 0x58, 0xe1, 0x6a, 0xc5, 0x8b, 0x4b, 0x55, 0x08, 0x64, 0x51, - 0x86, 0x75, 0xe6, 0xe9, 0x1b, 0xdf, 0xbd, 0xec, 0x75, 0x0f, 0x2a, 0x7c, 0x6d, 0xed, 0xe2, 0x52, - 0x2d, 0x84, 0x6a, 0x72, 0x92, 0x3a, 0xb3, 0xec, 0x64, 0x20, 0xd7, 0x84, 0x37, 0x6f, 0xe5, 0x4c, - 0xbb, 0xf7, 0x6e, 0x2e, 0x73, 0xef, 0xe7, 0x32, 0xf7, 0xfb, 0x5c, 0xe6, 0x7e, 0xb8, 0x92, 0x33, - 0xef, 0xaf, 0xe4, 0xcc, 0x6f, 0x57, 0x72, 0xe6, 0xd5, 0x8b, 0x7f, 0xdc, 0x51, 0xaf, 0x9b, 0xc1, - 0x6b, 0xfa, 0xf3, 0xe7, 0xdb, 0xa9, 0x77, 0x39, 0xdd, 0x5b, 0xc7, 0x79, 0xfa, 0x98, 0x7e, 0xfe, - 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x2c, 0xb0, 0xb2, 0x80, 0xb6, 0x0b, 0x00, 0x00, + // 936 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x56, 0x4f, 0x6f, 0xe3, 0x44, + 0x14, 0x8f, 0x1d, 0xe7, 0xdf, 0x6b, 0xda, 0x66, 0xbd, 0x29, 0x6b, 0x85, 0x95, 0x6d, 0xbc, 0x97, + 0x08, 0xd4, 0x84, 0xdd, 0x45, 0x7b, 0xa8, 0xc4, 0x21, 0x49, 0x53, 0x61, 0x41, 0xbb, 0x91, 0x9b, + 0x22, 0xb1, 0x97, 0x28, 0xb5, 0x27, 0xe9, 0x28, 0x8d, 0x1d, 0xd9, 0x53, 0xb4, 0xfd, 0x06, 0xab, + 0x9e, 0xe0, 0xc8, 0xa1, 0x12, 0xd2, 0x7e, 0x09, 0x3e, 0x01, 0xda, 0xe3, 0x1e, 0x39, 0x59, 0x28, + 0x15, 0x5f, 0x20, 0xe2, 0xc4, 0x09, 0x79, 0xc6, 0xb1, 0xdd, 0xb4, 0x80, 0xa8, 0x7b, 0x40, 0x9c, + 0xf2, 0xfe, 0xfc, 0xe6, 0xbd, 0x79, 0xef, 0xf7, 0xf2, 0x3c, 0xa0, 0xe0, 0x63, 0xb3, 0x69, 0x3a, + 0xb6, 0x8d, 0x4c, 0x82, 0x1d, 0x3b, 0x21, 0x36, 0x66, 0xae, 0x43, 0x1c, 0x71, 0x03, 0x1f, 0x9b, + 0x8d, 0xd8, 0x5a, 0xab, 0x8e, 0x9d, 0xb1, 0x43, 0x5d, 0xcd, 0x40, 0x62, 0xa8, 0x5a, 0x18, 0x66, + 0x3a, 0xc5, 0x64, 0x8a, 0x6c, 0x92, 0x10, 0x19, 0x40, 0xfb, 0x89, 0x87, 0xad, 0x7d, 0x6f, 0xdc, + 0x89, 0x02, 0xbd, 0x9c, 0x21, 0x5b, 0xb7, 0x31, 0x11, 0x3f, 0x87, 0x92, 0x79, 0x8a, 0x91, 0x4d, + 0x06, 0xd8, 0x92, 0x38, 0x95, 0xab, 0x97, 0xda, 0xea, 0xdc, 0x57, 0x8a, 0x1d, 0x6a, 0xd4, 0x77, + 0x17, 0xbe, 0x52, 0x39, 0x1f, 0x4e, 0x4f, 0x77, 0xb4, 0x08, 0xa6, 0x19, 0x45, 0x26, 0xeb, 0x96, + 0xb8, 0x0f, 0xeb, 0xf1, 0xed, 0x82, 0x10, 0x3c, 0x0d, 0x51, 0x9f, 0xfb, 0x4a, 0x39, 0xce, 0x46, + 0xc3, 0x54, 0xc3, 0x30, 0x49, 0xb8, 0x66, 0x94, 0x63, 0x5d, 0xb7, 0xc4, 0x3d, 0x28, 0x9b, 0xce, + 0x99, 0x4d, 0x90, 0x3b, 0x1b, 0xba, 0xe4, 0x5c, 0xca, 0xaa, 0x5c, 0x7d, 0xed, 0xd9, 0xe3, 0xc6, + 0xf5, 0x2e, 0x34, 0x3a, 0x09, 0x4c, 0x5b, 0x78, 0xe7, 0x2b, 0x19, 0xe3, 0xda, 0x39, 0x51, 0x87, + 0xbc, 0x87, 0xc7, 0x36, 0x72, 0x25, 0x41, 0xe5, 0xea, 0xe5, 0xf6, 0xd3, 0x3f, 0x7c, 0x65, 0x7b, + 0x8c, 0xc9, 0xc9, 0xd9, 0x71, 0xc3, 0x74, 0xa6, 0x4d, 0xd3, 0xf1, 0xa6, 0x8e, 0x17, 0xfe, 0x6c, + 0x7b, 0xd6, 0xa4, 0x49, 0xce, 0x67, 0xc8, 0x6b, 0xb4, 0x4c, 0xb3, 0x65, 0x59, 0x2e, 0xf2, 0x3c, + 0x23, 0x0c, 0xa0, 0xfd, 0x2e, 0x40, 0xf5, 0x46, 0xeb, 0xfa, 0xee, 0xf9, 0xff, 0xb4, 0x73, 0x47, + 0xb0, 0x95, 0xd4, 0x07, 0xdf, 0x22, 0xd7, 0xc3, 0x8e, 0xed, 0x49, 0x82, 0x9a, 0x0d, 0x2a, 0x5c, + 0xf8, 0xca, 0xe3, 0xe5, 0x75, 0x6e, 0x81, 0x69, 0x46, 0x35, 0x69, 0xff, 0x3a, 0x34, 0x8b, 0x9f, + 0x01, 0xcc, 0x5c, 0xc7, 0x19, 0x0d, 0xb0, 0x8d, 0x89, 0x94, 0xa3, 0xa4, 0x6c, 0x2d, 0x7c, 0xe5, + 0x01, 0x8b, 0x15, 0xfb, 0x34, 0xa3, 0x44, 0x15, 0x3a, 0x9c, 0x1f, 0x41, 0x99, 0x79, 0x4e, 0x10, + 0x1e, 0x9f, 0x10, 0x29, 0xaf, 0x72, 0x75, 0xc1, 0x58, 0xa3, 0xb6, 0x2f, 0xa8, 0x49, 0xec, 0xc0, + 0x26, 0x83, 0x98, 0x8e, 0xed, 0x21, 0xdb, 0x3b, 0xf3, 0xa4, 0x02, 0x8d, 0x5e, 0x5b, 0xf8, 0xca, + 0x07, 0xc9, 0xe8, 0x11, 0x40, 0x33, 0x36, 0xa8, 0xa5, 0xb3, 0x34, 0x88, 0x7b, 0x50, 0x89, 0xbc, + 0xcb, 0x5c, 0xc5, 0x20, 0x57, 0xfb, 0xc3, 0x85, 0xaf, 0x3c, 0x8a, 0xda, 0x7f, 0x0d, 0xa1, 0x19, + 0x9b, 0x91, 0x29, 0xbc, 0x4c, 0x3c, 0x76, 0xa5, 0xb4, 0x63, 0xf7, 0x73, 0xf6, 0x96, 0xb1, 0x6b, + 0x99, 0x93, 0x9b, 0x73, 0xc3, 0xa5, 0x9a, 0x1b, 0x09, 0x0a, 0x21, 0x77, 0x6c, 0x00, 0x8d, 0xa5, + 0x2a, 0x3e, 0x05, 0xc6, 0xc4, 0x80, 0xb8, 0x6c, 0x9c, 0xca, 0xed, 0x6a, 0x3c, 0xd3, 0x91, 0x4b, + 0x33, 0x8a, 0x54, 0x0e, 0xfe, 0x12, 0x3b, 0x2b, 0x7c, 0x09, 0xb4, 0x87, 0x8f, 0x16, 0xbe, 0xf2, + 0x30, 0x79, 0x6a, 0xd9, 0xbf, 0x7f, 0x22, 0x32, 0x77, 0x2f, 0x44, 0xe6, 0x53, 0x11, 0x59, 0x48, + 0x4b, 0xe4, 0x5b, 0x1e, 0xa4, 0x1b, 0x44, 0x76, 0x1c, 0x7b, 0x84, 0xdd, 0xe9, 0x7d, 0x93, 0x19, + 0x51, 0x36, 0x34, 0x27, 0x94, 0xce, 0x5b, 0x28, 0x1b, 0x9a, 0x93, 0x25, 0x65, 0xc1, 0x38, 0xad, + 0x52, 0x96, 0xfd, 0x17, 0x94, 0xdd, 0xe3, 0x96, 0xfd, 0x8d, 0x83, 0xf5, 0xb8, 0xe0, 0xae, 0x6d, + 0xa5, 0x5d, 0xaf, 0x35, 0x28, 0x46, 0xab, 0x8b, 0x0f, 0x56, 0x97, 0x11, 0xe9, 0xe2, 0x27, 0x90, + 0xf3, 0xc8, 0x90, 0x20, 0x5a, 0xec, 0xc6, 0xb3, 0xad, 0xd5, 0x25, 0x79, 0x18, 0x38, 0x0d, 0x86, + 0xb9, 0xb1, 0x58, 0x85, 0xbb, 0x2d, 0xd6, 0x1d, 0xe1, 0xcd, 0x8f, 0x4a, 0x46, 0xfb, 0x9e, 0x87, + 0xaa, 0x6e, 0x21, 0x9b, 0xe0, 0x11, 0x46, 0x56, 0x5c, 0xb1, 0xf8, 0x04, 0xf8, 0xa8, 0xce, 0x87, + 0x73, 0x5f, 0xe1, 0x69, 0x85, 0x25, 0x56, 0x61, 0x50, 0x1a, 0x8f, 0x57, 0x7a, 0xc2, 0xa7, 0xea, + 0x49, 0xf6, 0xaf, 0x7a, 0x22, 0xdc, 0xa1, 0x27, 0xb9, 0x54, 0x3d, 0xf1, 0x39, 0x28, 0x27, 0xa1, + 0xff, 0xb1, 0x2f, 0xeb, 0x0e, 0xe4, 0x67, 0x2e, 0x1a, 0xe1, 0xd7, 0x2b, 0xdf, 0xd4, 0xe8, 0x89, + 0xb5, 0x8f, 0xdc, 0xc9, 0x29, 0xea, 0x51, 0x4c, 0x58, 0x66, 0x78, 0x22, 0x2c, 0xf0, 0x09, 0xac, + 0xb1, 0xab, 0xf7, 0x86, 0xe4, 0xc4, 0x13, 0xab, 0x90, 0x9b, 0x05, 0x82, 0xc4, 0x51, 0x0e, 0x98, + 0xa2, 0x8d, 0x60, 0x33, 0xbe, 0x1c, 0x03, 0xa6, 0xec, 0x43, 0x94, 0x87, 0x4f, 0xe6, 0xf9, 0x12, + 0x0a, 0xe1, 0x57, 0x59, 0x94, 0x01, 0xf0, 0x72, 0x16, 0x5d, 0x96, 0xc0, 0x48, 0x58, 0x82, 0x79, + 0x19, 0xa1, 0x21, 0x39, 0x73, 0x51, 0xf4, 0x1f, 0x5a, 0xea, 0xac, 0xb2, 0x8f, 0x7f, 0xe0, 0x20, + 0x47, 0x27, 0x43, 0x7c, 0x01, 0xca, 0x61, 0xbf, 0xd5, 0xef, 0x0e, 0x8e, 0x0e, 0xf4, 0x03, 0xbd, + 0xaf, 0xb7, 0xbe, 0xd2, 0x5f, 0x75, 0x77, 0x07, 0x47, 0x07, 0x87, 0xbd, 0x6e, 0x47, 0xdf, 0xd3, + 0xbb, 0xbb, 0x95, 0x4c, 0xed, 0xc1, 0xc5, 0xa5, 0xba, 0x7e, 0x0d, 0x20, 0x4a, 0x00, 0xec, 0x5c, + 0x60, 0xac, 0x70, 0xb5, 0xe2, 0xc5, 0xa5, 0x2a, 0x04, 0xb2, 0x28, 0xc3, 0x3a, 0xf3, 0xf4, 0x8d, + 0x6f, 0x5e, 0xf6, 0xba, 0x07, 0x15, 0xbe, 0xb6, 0x76, 0x71, 0xa9, 0x16, 0x42, 0x35, 0x3e, 0x49, + 0x9d, 0x59, 0x76, 0x32, 0x90, 0x6b, 0xc2, 0x9b, 0xb7, 0x72, 0xa6, 0xdd, 0x7b, 0x37, 0x97, 0xb9, + 0xf7, 0x73, 0x99, 0xfb, 0x75, 0x2e, 0x73, 0xdf, 0x5d, 0xc9, 0x99, 0xf7, 0x57, 0x72, 0xe6, 0x97, + 0x2b, 0x39, 0xf3, 0xea, 0xc5, 0xdf, 0xee, 0xa8, 0xd7, 0xcd, 0xe0, 0x35, 0xfd, 0xe9, 0xf3, 0xed, + 0xc4, 0xbb, 0x9c, 0xee, 0xad, 0xe3, 0x3c, 0x7d, 0x4c, 0x3f, 0xff, 0x33, 0x00, 0x00, 0xff, 0xff, + 0x7a, 0xce, 0x37, 0x62, 0xb6, 0x0b, 0x00, 0x00, } func (m *MsgConnectionOpenInit) Marshal() (dAtA []byte, err error) { @@ -1064,11 +1065,11 @@ func (m *ConnectionEnd) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintConnection(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x2a + dAtA[i] = 0x22 if m.State != 0 { i = encodeVarintConnection(dAtA, i, uint64(m.State)) i-- - dAtA[i] = 0x20 + dAtA[i] = 0x18 } if len(m.Versions) > 0 { for iNdEx := len(m.Versions) - 1; iNdEx >= 0; iNdEx-- { @@ -1076,7 +1077,7 @@ func (m *ConnectionEnd) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Versions[iNdEx]) i = encodeVarintConnection(dAtA, i, uint64(len(m.Versions[iNdEx]))) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x12 } } if len(m.ClientID) > 0 { @@ -1084,7 +1085,7 @@ func (m *ConnectionEnd) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.ClientID) i = encodeVarintConnection(dAtA, i, uint64(len(m.ClientID))) i-- - dAtA[i] = 0x12 + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -2537,7 +2538,7 @@ func (m *ConnectionEnd) Unmarshal(dAtA []byte) error { return fmt.Errorf("proto: ConnectionEnd: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 2: + case 1: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ClientID", wireType) } @@ -2569,7 +2570,7 @@ func (m *ConnectionEnd) Unmarshal(dAtA []byte) error { } m.ClientID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Versions", wireType) } @@ -2601,7 +2602,7 @@ func (m *ConnectionEnd) Unmarshal(dAtA []byte) error { } m.Versions = append(m.Versions, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 4: + case 3: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } @@ -2620,7 +2621,7 @@ func (m *ConnectionEnd) Unmarshal(dAtA []byte) error { break } } - case 5: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Counterparty", wireType) } diff --git a/x/staking/module.go b/x/staking/module.go index dffecd95ed01..84dc2c582613 100644 --- a/x/staking/module.go +++ b/x/staking/module.go @@ -129,10 +129,7 @@ func (am AppModule) LegacyQuerierHandler(legacyQuerierCdc codec.JSONMarshaler) s // RegisterQueryService registers a GRPC query service to respond to the // module-specific GRPC queries. -func (am AppModule) RegisterQueryService(server grpc.Server) { - querier := keeper.Querier{Keeper: am.keeper} - types.RegisterQueryServer(server, querier) -} +func (am AppModule) RegisterQueryService(grpc.Server) {} // InitGenesis performs genesis initialization for the staking module. It returns // no validator updates. diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index f8a27b46f098..ee5ae15259cc 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -1569,599 +1569,600 @@ func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_ func StakingDescription() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { d := &github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet{} var gzipped = []byte{ - // 9459 bytes of a gzipped FileDescriptorSet + // 9483 bytes of a gzipped FileDescriptorSet 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xc7, - 0x75, 0x18, 0xf6, 0x03, 0x8b, 0xdd, 0xb7, 0x8b, 0xc5, 0xa2, 0x81, 0xbb, 0xdb, 0x5b, 0x92, 0xb7, - 0xc7, 0x39, 0x7e, 0xe0, 0xf8, 0x81, 0xa3, 0x4e, 0xfc, 0xdc, 0xa3, 0x48, 0x61, 0x01, 0xdc, 0x1d, - 0x48, 0xe0, 0x0e, 0x1c, 0x00, 0x47, 0x8a, 0xb2, 0x3d, 0x1e, 0xcc, 0x36, 0x16, 0x43, 0xec, 0xce, - 0x2c, 0x67, 0x66, 0xef, 0x00, 0x96, 0x52, 0xc5, 0x94, 0x64, 0x4b, 0x72, 0x64, 0x4b, 0x71, 0x1c, - 0x87, 0x96, 0x25, 0x99, 0x52, 0x2a, 0x91, 0xa3, 0x24, 0xfe, 0x48, 0x1c, 0x7d, 0xd8, 0xf9, 0xa1, - 0xaa, 0x7c, 0x58, 0xa9, 0x72, 0xa5, 0xa4, 0xc4, 0x49, 0xb9, 0x52, 0x29, 0xd8, 0x22, 0x55, 0x65, - 0x45, 0x61, 0x12, 0xe5, 0x42, 0xbb, 0x5c, 0xd2, 0x8f, 0xb8, 0xfa, 0x6b, 0xbe, 0x76, 0x16, 0x33, - 0x38, 0x1e, 0x29, 0xba, 0xa4, 0x5f, 0xd8, 0x7e, 0xfd, 0xde, 0xeb, 0xee, 0xd7, 0xaf, 0xdf, 0x7b, - 0xfd, 0xba, 0x7b, 0x00, 0x5f, 0x4a, 0xc3, 0x6d, 0x9a, 0x69, 0x77, 0x4d, 0xfb, 0xcc, 0x8b, 0x7d, - 0x6c, 0xed, 0x9d, 0xe9, 0xa9, 0x6d, 0xdd, 0x50, 0x1d, 0xdd, 0x34, 0x66, 0x7b, 0x96, 0xe9, 0x98, - 0xa8, 0xc4, 0xaa, 0x67, 0x69, 0xb5, 0x64, 0x40, 0x71, 0x55, 0x6d, 0x63, 0x19, 0xbf, 0xd8, 0xc7, - 0xb6, 0x83, 0x2a, 0x90, 0xd9, 0xc1, 0x7b, 0xd5, 0xd4, 0xc9, 0xd4, 0x4c, 0x49, 0x26, 0x3f, 0xd1, - 0x51, 0xc8, 0x99, 0x5b, 0x5b, 0x36, 0x76, 0xaa, 0xe9, 0x93, 0xa9, 0x99, 0xac, 0xcc, 0x4b, 0x68, - 0x1a, 0x46, 0x3b, 0x7a, 0x57, 0x77, 0xaa, 0x19, 0x0a, 0x66, 0x05, 0x54, 0x87, 0xa2, 0x66, 0xf6, - 0x0d, 0x47, 0x71, 0x4c, 0x47, 0xed, 0x54, 0xb3, 0x27, 0x53, 0x33, 0x79, 0x19, 0x28, 0x68, 0x9d, - 0x40, 0xa4, 0x27, 0xa1, 0xc4, 0xda, 0xb3, 0x7b, 0xa6, 0x61, 0x63, 0x74, 0x1c, 0xf2, 0x06, 0xde, - 0x75, 0x14, 0xaf, 0xd5, 0x31, 0x52, 0x7e, 0x1a, 0xef, 0x91, 0x16, 0x18, 0x17, 0xd6, 0x30, 0x2b, - 0x34, 0x9b, 0xdf, 0x78, 0xed, 0x44, 0xea, 0x9b, 0xaf, 0x9d, 0x48, 0xfd, 0xd9, 0x6b, 0x27, 0x52, - 0x9f, 0x7a, 0xfd, 0xc4, 0xc8, 0x37, 0x5f, 0x3f, 0x31, 0xf2, 0x27, 0xaf, 0x9f, 0x18, 0x79, 0x7e, - 0xa6, 0xad, 0x3b, 0xdb, 0xfd, 0xcd, 0x59, 0xcd, 0xec, 0x9e, 0xe1, 0x22, 0x60, 0x7f, 0xee, 0xb7, - 0x5b, 0x3b, 0x67, 0x9c, 0xbd, 0x1e, 0xe6, 0x32, 0xd9, 0xcc, 0x51, 0x49, 0xbc, 0x17, 0x7e, 0xfd, - 0x1c, 0x9c, 0x6c, 0x9b, 0x66, 0xbb, 0x83, 0xcf, 0x50, 0xc8, 0x66, 0x7f, 0xeb, 0x4c, 0x0b, 0xdb, - 0x9a, 0xa5, 0xf7, 0x1c, 0xd3, 0xe2, 0xf2, 0x9a, 0x60, 0x18, 0xb3, 0x02, 0x43, 0x5a, 0x81, 0xc9, - 0xf3, 0x7a, 0x07, 0x2f, 0xb8, 0x88, 0x6b, 0xd8, 0x41, 0x8f, 0x42, 0x76, 0x4b, 0xef, 0xe0, 0x6a, - 0xea, 0x64, 0x66, 0xa6, 0x78, 0xf6, 0x8e, 0xd9, 0x10, 0xd1, 0x6c, 0x90, 0x62, 0x95, 0x80, 0x65, - 0x4a, 0x21, 0x7d, 0x27, 0x0b, 0x53, 0x11, 0xb5, 0x08, 0x41, 0xd6, 0x50, 0xbb, 0x98, 0x4a, 0xa5, - 0x20, 0xd3, 0xdf, 0xa8, 0x0a, 0x63, 0x3d, 0x55, 0xdb, 0x51, 0xdb, 0x98, 0x0a, 0xa5, 0x20, 0x8b, - 0x22, 0x3a, 0x01, 0xd0, 0xc2, 0x3d, 0x6c, 0xb4, 0xb0, 0xa1, 0xed, 0x55, 0x33, 0x27, 0x33, 0x33, - 0x05, 0xd9, 0x07, 0x41, 0xf7, 0xc2, 0x64, 0xaf, 0xbf, 0xd9, 0xd1, 0x35, 0xc5, 0x87, 0x06, 0x27, - 0x33, 0x33, 0xa3, 0x72, 0x85, 0x55, 0x2c, 0x78, 0xc8, 0x77, 0xc3, 0xc4, 0x35, 0xac, 0xee, 0xf8, - 0x51, 0x8b, 0x14, 0xb5, 0x4c, 0xc0, 0x3e, 0xc4, 0x79, 0x28, 0x75, 0xb1, 0x6d, 0xab, 0x6d, 0xac, - 0x10, 0xf9, 0x56, 0xb3, 0x74, 0xf4, 0x27, 0x07, 0x46, 0x1f, 0x1e, 0x79, 0x91, 0x53, 0xad, 0xef, - 0xf5, 0x30, 0x9a, 0x83, 0x02, 0x36, 0xfa, 0x5d, 0xc6, 0x61, 0x74, 0x88, 0xfc, 0x16, 0x8d, 0x7e, - 0x37, 0xcc, 0x25, 0x4f, 0xc8, 0x38, 0x8b, 0x31, 0x1b, 0x5b, 0x57, 0x75, 0x0d, 0x57, 0x73, 0x94, - 0xc1, 0xdd, 0x03, 0x0c, 0xd6, 0x58, 0x7d, 0x98, 0x87, 0xa0, 0x43, 0xf3, 0x50, 0xc0, 0xbb, 0x0e, - 0x36, 0x6c, 0xdd, 0x34, 0xaa, 0x63, 0x94, 0xc9, 0x9d, 0x11, 0xb3, 0x88, 0x3b, 0xad, 0x30, 0x0b, - 0x8f, 0x0e, 0x3d, 0x0c, 0x63, 0x66, 0x8f, 0xac, 0x35, 0xbb, 0x9a, 0x3f, 0x99, 0x9a, 0x29, 0x9e, - 0xbd, 0x35, 0x52, 0x11, 0x2e, 0x33, 0x1c, 0x59, 0x20, 0xa3, 0x25, 0xa8, 0xd8, 0x66, 0xdf, 0xd2, - 0xb0, 0xa2, 0x99, 0x2d, 0xac, 0xe8, 0xc6, 0x96, 0x59, 0x2d, 0x50, 0x06, 0xf5, 0xc1, 0x81, 0x50, - 0xc4, 0x79, 0xb3, 0x85, 0x97, 0x8c, 0x2d, 0x53, 0x2e, 0xdb, 0x81, 0x32, 0x59, 0xaf, 0xf6, 0x9e, - 0xe1, 0xa8, 0xbb, 0xd5, 0x12, 0xd5, 0x10, 0x5e, 0x92, 0xbe, 0x96, 0x83, 0x89, 0x24, 0x2a, 0x76, - 0x0e, 0x46, 0xb7, 0xc8, 0x28, 0xab, 0xe9, 0xc3, 0xc8, 0x80, 0xd1, 0x04, 0x85, 0x98, 0xbb, 0x41, - 0x21, 0xce, 0x41, 0xd1, 0xc0, 0xb6, 0x83, 0x5b, 0x4c, 0x23, 0x32, 0x09, 0x75, 0x0a, 0x18, 0xd1, - 0xa0, 0x4a, 0x65, 0x6f, 0x48, 0xa5, 0x9e, 0x83, 0x09, 0xb7, 0x4b, 0x8a, 0xa5, 0x1a, 0x6d, 0xa1, - 0x9b, 0x67, 0xe2, 0x7a, 0x32, 0xbb, 0x28, 0xe8, 0x64, 0x42, 0x26, 0x97, 0x71, 0xa0, 0x8c, 0x16, - 0x00, 0x4c, 0x03, 0x9b, 0x5b, 0x4a, 0x0b, 0x6b, 0x9d, 0x6a, 0x7e, 0x88, 0x94, 0x2e, 0x13, 0x94, - 0x01, 0x29, 0x99, 0x0c, 0xaa, 0x75, 0xd0, 0x63, 0x9e, 0xaa, 0x8d, 0x0d, 0xd1, 0x94, 0x15, 0xb6, - 0xc8, 0x06, 0xb4, 0x6d, 0x03, 0xca, 0x16, 0x26, 0x7a, 0x8f, 0x5b, 0x7c, 0x64, 0x05, 0xda, 0x89, - 0xd9, 0xd8, 0x91, 0xc9, 0x9c, 0x8c, 0x0d, 0x6c, 0xdc, 0xf2, 0x17, 0xd1, 0x29, 0x70, 0x01, 0x0a, - 0x55, 0x2b, 0xa0, 0x56, 0xa8, 0x24, 0x80, 0x97, 0xd4, 0x2e, 0xae, 0xbd, 0x04, 0xe5, 0xa0, 0x78, - 0x88, 0x99, 0xb7, 0x1d, 0xd5, 0x72, 0xa8, 0x16, 0x8e, 0xca, 0xac, 0x40, 0x1c, 0x11, 0x36, 0x5a, - 0xd4, 0xca, 0x8d, 0xca, 0xe4, 0x27, 0x7a, 0xbf, 0x37, 0xe0, 0x0c, 0x1d, 0xf0, 0x5d, 0x83, 0x33, - 0x1a, 0xe0, 0x1c, 0x1e, 0x77, 0xed, 0x11, 0x18, 0x0f, 0x0c, 0x20, 0x69, 0xd3, 0xd2, 0x87, 0xe0, - 0x48, 0x24, 0x6b, 0xf4, 0x1c, 0x4c, 0xf7, 0x0d, 0xdd, 0x70, 0xb0, 0xd5, 0xb3, 0x30, 0xd1, 0x58, - 0xd6, 0x54, 0xf5, 0xcf, 0xc7, 0x86, 0xe8, 0xdc, 0x86, 0x1f, 0x9b, 0x71, 0x91, 0xa7, 0xfa, 0x83, - 0xc0, 0x7b, 0x0a, 0xf9, 0xef, 0x8e, 0x55, 0x5e, 0x7e, 0xf9, 0xe5, 0x97, 0xd3, 0xd2, 0x2b, 0x39, - 0x98, 0x8e, 0x5a, 0x33, 0x91, 0xcb, 0xf7, 0x28, 0xe4, 0x8c, 0x7e, 0x77, 0x13, 0x5b, 0x54, 0x48, - 0xa3, 0x32, 0x2f, 0xa1, 0x39, 0x18, 0xed, 0xa8, 0x9b, 0x98, 0xb9, 0xe4, 0xf2, 0xd9, 0x7b, 0x13, - 0xad, 0xca, 0xd9, 0x65, 0x42, 0x22, 0x33, 0x4a, 0xf4, 0x04, 0x64, 0xb9, 0x89, 0x26, 0x1c, 0xee, - 0x49, 0xc6, 0x81, 0xac, 0x25, 0x99, 0xd2, 0xa1, 0x5b, 0xa0, 0x40, 0xfe, 0x32, 0xdd, 0xc8, 0xd1, - 0x3e, 0xe7, 0x09, 0x80, 0xe8, 0x05, 0xaa, 0x41, 0x9e, 0x2e, 0x93, 0x16, 0x16, 0xae, 0xcd, 0x2d, - 0x13, 0xc5, 0x6a, 0xe1, 0x2d, 0xb5, 0xdf, 0x71, 0x94, 0xab, 0x6a, 0xa7, 0x8f, 0xa9, 0xc2, 0x17, - 0xe4, 0x12, 0x07, 0x5e, 0x21, 0x30, 0x12, 0x79, 0xb0, 0x55, 0xa5, 0x1b, 0x2d, 0xbc, 0x4b, 0xad, - 0xe7, 0xa8, 0xcc, 0x16, 0xda, 0x12, 0x81, 0x90, 0xe6, 0x5f, 0xb0, 0x4d, 0x43, 0xa8, 0x26, 0x6d, - 0x82, 0x00, 0x68, 0xf3, 0x8f, 0x84, 0x0d, 0xf7, 0x6d, 0xd1, 0xc3, 0x0b, 0xeb, 0x94, 0xf4, 0xe5, - 0x34, 0x64, 0xa9, 0xbd, 0x98, 0x80, 0xe2, 0xfa, 0x07, 0x56, 0x17, 0x95, 0x85, 0xcb, 0x1b, 0xcd, - 0xe5, 0xc5, 0x4a, 0x0a, 0x95, 0x01, 0x28, 0xe0, 0xfc, 0xf2, 0xe5, 0xb9, 0xf5, 0x4a, 0xda, 0x2d, - 0x2f, 0x5d, 0x5a, 0x7f, 0xf8, 0xc1, 0x4a, 0xc6, 0x25, 0xd8, 0x60, 0x80, 0xac, 0x1f, 0xe1, 0xbd, - 0x67, 0x2b, 0xa3, 0xa8, 0x02, 0x25, 0xc6, 0x60, 0xe9, 0xb9, 0xc5, 0x85, 0x87, 0x1f, 0xac, 0xe4, - 0x82, 0x90, 0xf7, 0x9e, 0xad, 0x8c, 0xa1, 0x71, 0x28, 0x50, 0x48, 0xf3, 0xf2, 0xe5, 0xe5, 0x4a, - 0xde, 0xe5, 0xb9, 0xb6, 0x2e, 0x2f, 0x5d, 0xba, 0x50, 0x29, 0xb8, 0x3c, 0x2f, 0xc8, 0x97, 0x37, - 0x56, 0x2b, 0xe0, 0x72, 0x58, 0x59, 0x5c, 0x5b, 0x9b, 0xbb, 0xb0, 0x58, 0x29, 0xba, 0x18, 0xcd, - 0x0f, 0xac, 0x2f, 0xae, 0x55, 0x4a, 0x81, 0x6e, 0xbd, 0xf7, 0x6c, 0x65, 0xdc, 0x6d, 0x62, 0xf1, - 0xd2, 0xc6, 0x4a, 0xa5, 0x8c, 0x26, 0x61, 0x9c, 0x35, 0x21, 0x3a, 0x31, 0x11, 0x02, 0x3d, 0xfc, - 0x60, 0xa5, 0xe2, 0x75, 0x84, 0x71, 0x99, 0x0c, 0x00, 0x1e, 0x7e, 0xb0, 0x82, 0xa4, 0x79, 0x18, - 0xa5, 0xda, 0x85, 0x10, 0x94, 0x97, 0xe7, 0x9a, 0x8b, 0xcb, 0xca, 0xe5, 0xd5, 0xf5, 0xa5, 0xcb, - 0x97, 0xe6, 0x96, 0x2b, 0x29, 0x0f, 0x26, 0x2f, 0x3e, 0xb3, 0xb1, 0x24, 0x2f, 0x2e, 0x54, 0xd2, - 0x7e, 0xd8, 0xea, 0xe2, 0xdc, 0xfa, 0xe2, 0x42, 0x25, 0x23, 0x69, 0x30, 0x1d, 0x65, 0x27, 0x23, - 0x57, 0x86, 0x6f, 0x8a, 0xd3, 0x43, 0xa6, 0x98, 0xf2, 0x1a, 0x98, 0xe2, 0xd7, 0xd3, 0x30, 0x15, - 0xe1, 0x2b, 0x22, 0x1b, 0x79, 0x12, 0x46, 0x99, 0x8a, 0x32, 0xef, 0x79, 0x3a, 0xd2, 0xe9, 0x50, - 0x85, 0x1d, 0xf0, 0xa0, 0x94, 0xce, 0x1f, 0x41, 0x64, 0x86, 0x44, 0x10, 0x84, 0xc5, 0x80, 0x4d, - 0xff, 0xe9, 0x01, 0x9b, 0xce, 0xdc, 0xde, 0xc3, 0x49, 0xdc, 0x1e, 0x85, 0x1d, 0xce, 0xb6, 0x8f, - 0x46, 0xd8, 0xf6, 0x73, 0x30, 0x39, 0xc0, 0x28, 0xb1, 0x8d, 0xfd, 0x70, 0x0a, 0xaa, 0xc3, 0x84, - 0x13, 0x63, 0xe9, 0xd2, 0x01, 0x4b, 0x77, 0x2e, 0x2c, 0xc1, 0xdb, 0x87, 0x4f, 0xc2, 0xc0, 0x5c, - 0x7f, 0x31, 0x05, 0x47, 0xa3, 0x23, 0xc5, 0xc8, 0x3e, 0x3c, 0x01, 0xb9, 0x2e, 0x76, 0xb6, 0x4d, - 0x11, 0x2d, 0xdd, 0x15, 0xe1, 0x83, 0x49, 0x75, 0x78, 0xb2, 0x39, 0x95, 0xdf, 0x89, 0x67, 0x86, - 0x85, 0x7b, 0xac, 0x37, 0x03, 0x3d, 0xfd, 0x78, 0x1a, 0x8e, 0x44, 0x32, 0x8f, 0xec, 0xe8, 0x6d, - 0x00, 0xba, 0xd1, 0xeb, 0x3b, 0x2c, 0x22, 0x62, 0x06, 0xb6, 0x40, 0x21, 0xd4, 0x78, 0x11, 0xe3, - 0xd9, 0x77, 0xdc, 0xfa, 0x0c, 0xad, 0x07, 0x06, 0xa2, 0x08, 0x8f, 0x7a, 0x1d, 0xcd, 0xd2, 0x8e, - 0x9e, 0x18, 0x32, 0xd2, 0x01, 0xc5, 0x7c, 0x00, 0x2a, 0x5a, 0x47, 0xc7, 0x86, 0xa3, 0xd8, 0x8e, - 0x85, 0xd5, 0xae, 0x6e, 0xb4, 0xa9, 0x07, 0xc9, 0x37, 0x46, 0xb7, 0xd4, 0x8e, 0x8d, 0xe5, 0x09, - 0x56, 0xbd, 0x26, 0x6a, 0x09, 0x05, 0x55, 0x20, 0xcb, 0x47, 0x91, 0x0b, 0x50, 0xb0, 0x6a, 0x97, - 0x42, 0xfa, 0xe5, 0x02, 0x14, 0x7d, 0x71, 0x35, 0xba, 0x1d, 0x4a, 0x2f, 0xa8, 0x57, 0x55, 0x45, - 0xec, 0x95, 0x98, 0x24, 0x8a, 0x04, 0xb6, 0xca, 0xf7, 0x4b, 0x0f, 0xc0, 0x34, 0x45, 0x31, 0xfb, - 0x0e, 0xb6, 0x14, 0xad, 0xa3, 0xda, 0x36, 0x15, 0x5a, 0x9e, 0xa2, 0x22, 0x52, 0x77, 0x99, 0x54, - 0xcd, 0x8b, 0x1a, 0xf4, 0x10, 0x4c, 0x51, 0x8a, 0x6e, 0xbf, 0xe3, 0xe8, 0xbd, 0x0e, 0x56, 0xc8, - 0xee, 0xcd, 0xa6, 0x9e, 0xc4, 0xed, 0xd9, 0x24, 0xc1, 0x58, 0xe1, 0x08, 0xa4, 0x47, 0x36, 0x5a, - 0x80, 0xdb, 0x28, 0x59, 0x1b, 0x1b, 0xd8, 0x52, 0x1d, 0xac, 0xe0, 0x17, 0xfb, 0x6a, 0xc7, 0x56, - 0x54, 0xa3, 0xa5, 0x6c, 0xab, 0xf6, 0x76, 0x75, 0x9a, 0x30, 0x68, 0xa6, 0xab, 0x29, 0xf9, 0x38, - 0x41, 0xbc, 0xc0, 0xf1, 0x16, 0x29, 0xda, 0x9c, 0xd1, 0xba, 0xa8, 0xda, 0xdb, 0xa8, 0x01, 0x47, - 0x29, 0x17, 0xdb, 0xb1, 0x74, 0xa3, 0xad, 0x68, 0xdb, 0x58, 0xdb, 0x51, 0xfa, 0xce, 0xd6, 0xa3, - 0xd5, 0x5b, 0xfc, 0xed, 0xd3, 0x1e, 0xae, 0x51, 0x9c, 0x79, 0x82, 0xb2, 0xe1, 0x6c, 0x3d, 0x8a, - 0xd6, 0xa0, 0x44, 0x26, 0xa3, 0xab, 0xbf, 0x84, 0x95, 0x2d, 0xd3, 0xa2, 0xae, 0xb1, 0x1c, 0x61, - 0x9a, 0x7c, 0x12, 0x9c, 0xbd, 0xcc, 0x09, 0x56, 0xcc, 0x16, 0x6e, 0x8c, 0xae, 0xad, 0x2e, 0x2e, - 0x2e, 0xc8, 0x45, 0xc1, 0xe5, 0xbc, 0x69, 0x11, 0x85, 0x6a, 0x9b, 0xae, 0x80, 0x8b, 0x4c, 0xa1, - 0xda, 0xa6, 0x10, 0xef, 0x43, 0x30, 0xa5, 0x69, 0x6c, 0xcc, 0xba, 0xa6, 0xf0, 0x3d, 0x96, 0x5d, - 0xad, 0x04, 0x84, 0xa5, 0x69, 0x17, 0x18, 0x02, 0xd7, 0x71, 0x1b, 0x3d, 0x06, 0x47, 0x3c, 0x61, - 0xf9, 0x09, 0x27, 0x07, 0x46, 0x19, 0x26, 0x7d, 0x08, 0xa6, 0x7a, 0x7b, 0x83, 0x84, 0x28, 0xd0, - 0x62, 0x6f, 0x2f, 0x4c, 0xf6, 0x08, 0x4c, 0xf7, 0xb6, 0x7b, 0x83, 0x74, 0xf7, 0xf8, 0xe9, 0x50, - 0x6f, 0xbb, 0x17, 0x26, 0xbc, 0x93, 0x6e, 0xb8, 0x2d, 0xac, 0xa9, 0x0e, 0x6e, 0x55, 0x8f, 0xf9, - 0xd1, 0x7d, 0x15, 0xe8, 0x0c, 0x54, 0x34, 0x4d, 0xc1, 0x86, 0xba, 0xd9, 0xc1, 0x8a, 0x6a, 0x61, - 0x43, 0xb5, 0xab, 0x75, 0x3f, 0x72, 0x59, 0xd3, 0x16, 0x69, 0xed, 0x1c, 0xad, 0x44, 0xf7, 0xc0, - 0xa4, 0xb9, 0xf9, 0x82, 0xc6, 0x54, 0x52, 0xe9, 0x59, 0x78, 0x4b, 0xdf, 0xad, 0xde, 0x41, 0xe5, - 0x3b, 0x41, 0x2a, 0xa8, 0x42, 0xae, 0x52, 0x30, 0x3a, 0x0d, 0x15, 0xcd, 0xde, 0x56, 0xad, 0x1e, - 0xb5, 0xc9, 0x76, 0x4f, 0xd5, 0x70, 0xf5, 0x4e, 0x86, 0xca, 0xe0, 0x97, 0x04, 0x98, 0x2c, 0x09, - 0xfb, 0x9a, 0xbe, 0xe5, 0x08, 0x8e, 0x77, 0xb3, 0x25, 0x41, 0x61, 0x9c, 0xdb, 0x0c, 0x54, 0x88, - 0x28, 0x02, 0x0d, 0xcf, 0x50, 0xb4, 0x72, 0x6f, 0xbb, 0xe7, 0x6f, 0xf7, 0x14, 0x8c, 0x13, 0x4c, - 0xaf, 0xd1, 0xd3, 0x2c, 0x20, 0xeb, 0x6d, 0xfb, 0x5a, 0x7c, 0x10, 0x8e, 0x12, 0xa4, 0x2e, 0x76, - 0xd4, 0x96, 0xea, 0xa8, 0x3e, 0xec, 0xfb, 0x28, 0x36, 0x91, 0xfb, 0x0a, 0xaf, 0x0c, 0xf4, 0xd3, - 0xea, 0x6f, 0xee, 0xb9, 0x9a, 0x75, 0x3f, 0xeb, 0x27, 0x81, 0x09, 0xdd, 0x7a, 0xdb, 0x82, 0x6e, - 0xa9, 0x01, 0x25, 0xbf, 0xe2, 0xa3, 0x02, 0x30, 0xd5, 0xaf, 0xa4, 0x48, 0x14, 0x34, 0x7f, 0x79, - 0x81, 0xc4, 0x2f, 0xcf, 0x2f, 0x56, 0xd2, 0x24, 0x8e, 0x5a, 0x5e, 0x5a, 0x5f, 0x54, 0xe4, 0x8d, - 0x4b, 0xeb, 0x4b, 0x2b, 0x8b, 0x95, 0x8c, 0x2f, 0x60, 0x7f, 0x2a, 0x9b, 0xbf, 0xab, 0x72, 0xb7, - 0xf4, 0xad, 0x34, 0x94, 0x83, 0x3b, 0x30, 0xf4, 0x38, 0x1c, 0x13, 0xe9, 0x12, 0x1b, 0x3b, 0xca, - 0x35, 0xdd, 0xa2, 0x2b, 0xb2, 0xab, 0x32, 0xef, 0xe8, 0xea, 0xc4, 0x34, 0xc7, 0x5a, 0xc3, 0xce, - 0xb3, 0xba, 0x45, 0xd6, 0x5b, 0x57, 0x75, 0xd0, 0x32, 0xd4, 0x0d, 0x53, 0xb1, 0x1d, 0xd5, 0x68, - 0xa9, 0x56, 0x4b, 0xf1, 0x12, 0x55, 0x8a, 0xaa, 0x69, 0xd8, 0xb6, 0x4d, 0xe6, 0x09, 0x5d, 0x2e, - 0xb7, 0x1a, 0xe6, 0x1a, 0x47, 0xf6, 0x5c, 0xc4, 0x1c, 0x47, 0x0d, 0xe9, 0x6f, 0x66, 0x98, 0xfe, - 0xde, 0x02, 0x85, 0xae, 0xda, 0x53, 0xb0, 0xe1, 0x58, 0x7b, 0x34, 0xee, 0xce, 0xcb, 0xf9, 0xae, - 0xda, 0x5b, 0x24, 0xe5, 0x77, 0x64, 0xfb, 0xf3, 0x54, 0x36, 0x9f, 0xaf, 0x14, 0x9e, 0xca, 0xe6, - 0x0b, 0x15, 0x90, 0x5e, 0xcb, 0x40, 0xc9, 0x1f, 0x87, 0x93, 0x6d, 0x8d, 0x46, 0x5d, 0x56, 0x8a, - 0x1a, 0xb5, 0x53, 0x07, 0x46, 0xed, 0xb3, 0xf3, 0xc4, 0x97, 0x35, 0x72, 0x2c, 0x3a, 0x96, 0x19, - 0x25, 0x89, 0x23, 0x88, 0xb2, 0x61, 0x16, 0x8d, 0xe4, 0x65, 0x5e, 0x42, 0x17, 0x20, 0xf7, 0x82, - 0x4d, 0x79, 0xe7, 0x28, 0xef, 0x3b, 0x0e, 0xe6, 0xfd, 0xd4, 0x1a, 0x65, 0x5e, 0x78, 0x6a, 0x4d, - 0xb9, 0x74, 0x59, 0x5e, 0x99, 0x5b, 0x96, 0x39, 0x39, 0x3a, 0x0e, 0xd9, 0x8e, 0xfa, 0xd2, 0x5e, - 0xd0, 0xeb, 0x51, 0x50, 0xd2, 0x49, 0x38, 0x0e, 0xd9, 0x6b, 0x58, 0xdd, 0x09, 0xfa, 0x1a, 0x0a, - 0x7a, 0x1b, 0x17, 0xc3, 0x19, 0x18, 0xa5, 0xf2, 0x42, 0x00, 0x5c, 0x62, 0x95, 0x11, 0x94, 0x87, - 0xec, 0xfc, 0x65, 0x99, 0x2c, 0x88, 0x0a, 0x94, 0x18, 0x54, 0x59, 0x5d, 0x5a, 0x9c, 0x5f, 0xac, - 0xa4, 0xa5, 0x87, 0x20, 0xc7, 0x84, 0x40, 0x16, 0x8b, 0x2b, 0x86, 0xca, 0x08, 0x2f, 0x72, 0x1e, - 0x29, 0x51, 0xbb, 0xb1, 0xd2, 0x5c, 0x94, 0x2b, 0xe9, 0xe0, 0x54, 0x67, 0x2b, 0xa3, 0x92, 0x0d, - 0x25, 0x7f, 0x20, 0xfe, 0xce, 0x6c, 0xb2, 0xbf, 0x9e, 0x82, 0xa2, 0x2f, 0xb0, 0x26, 0x11, 0x91, - 0xda, 0xe9, 0x98, 0xd7, 0x14, 0xb5, 0xa3, 0xab, 0x36, 0x57, 0x0d, 0xa0, 0xa0, 0x39, 0x02, 0x49, - 0x3a, 0x75, 0xef, 0xd0, 0x12, 0x19, 0xad, 0xe4, 0xa4, 0xcf, 0xa5, 0xa0, 0x12, 0x8e, 0x6c, 0x43, - 0xdd, 0x4c, 0xfd, 0x28, 0xbb, 0x29, 0x7d, 0x26, 0x05, 0xe5, 0x60, 0x38, 0x1b, 0xea, 0xde, 0xed, - 0x3f, 0xd2, 0xee, 0xfd, 0x59, 0x1a, 0xc6, 0x03, 0x41, 0x6c, 0xd2, 0xde, 0xbd, 0x08, 0x93, 0x7a, - 0x0b, 0x77, 0x7b, 0xa6, 0x83, 0x0d, 0x6d, 0x4f, 0xe9, 0xe0, 0xab, 0xb8, 0x53, 0x95, 0xa8, 0xd1, - 0x38, 0x73, 0x70, 0x98, 0x3c, 0xbb, 0xe4, 0xd1, 0x2d, 0x13, 0xb2, 0xc6, 0xd4, 0xd2, 0xc2, 0xe2, - 0xca, 0xea, 0xe5, 0xf5, 0xc5, 0x4b, 0xf3, 0x1f, 0x50, 0x36, 0x2e, 0x3d, 0x7d, 0xe9, 0xf2, 0xb3, - 0x97, 0xe4, 0x8a, 0x1e, 0x42, 0x7b, 0x1b, 0x97, 0xfd, 0x2a, 0x54, 0xc2, 0x9d, 0x42, 0xc7, 0x20, - 0xaa, 0x5b, 0x95, 0x11, 0x34, 0x05, 0x13, 0x97, 0x2e, 0x2b, 0x6b, 0x4b, 0x0b, 0x8b, 0xca, 0xe2, - 0xf9, 0xf3, 0x8b, 0xf3, 0xeb, 0x6b, 0x2c, 0xf1, 0xe1, 0x62, 0xaf, 0x07, 0x16, 0xb8, 0xf4, 0xe9, - 0x0c, 0x4c, 0x45, 0xf4, 0x04, 0xcd, 0xf1, 0x2d, 0x0b, 0xdb, 0x45, 0xdd, 0x9f, 0xa4, 0xf7, 0xb3, - 0x24, 0x66, 0x58, 0x55, 0x2d, 0x87, 0xef, 0x70, 0x4e, 0x03, 0x91, 0x92, 0xe1, 0xe8, 0x5b, 0x3a, - 0xb6, 0x78, 0x9e, 0x88, 0xed, 0x63, 0x26, 0x3c, 0x38, 0x4b, 0x15, 0xdd, 0x07, 0xa8, 0x67, 0xda, - 0xba, 0xa3, 0x5f, 0xc5, 0x8a, 0x6e, 0x88, 0xa4, 0x52, 0x96, 0x9e, 0x32, 0x55, 0x44, 0xcd, 0x92, - 0xe1, 0xb8, 0xd8, 0x06, 0x6e, 0xab, 0x21, 0x6c, 0x62, 0xcc, 0x33, 0x72, 0x45, 0xd4, 0xb8, 0xd8, - 0xb7, 0x43, 0xa9, 0x65, 0xf6, 0x49, 0xb0, 0xc7, 0xf0, 0x88, 0xef, 0x48, 0xc9, 0x45, 0x06, 0x73, - 0x51, 0x78, 0x18, 0xef, 0x65, 0xb3, 0x4a, 0x72, 0x91, 0xc1, 0x18, 0xca, 0xdd, 0x30, 0xa1, 0xb6, - 0xdb, 0x16, 0x61, 0x2e, 0x18, 0xb1, 0x8d, 0x49, 0xd9, 0x05, 0x53, 0xc4, 0xda, 0x53, 0x90, 0x17, - 0x72, 0x20, 0xae, 0x9a, 0x48, 0x42, 0xe9, 0xb1, 0xdd, 0x76, 0x7a, 0xa6, 0x20, 0xe7, 0x0d, 0x51, - 0x79, 0x3b, 0x94, 0x74, 0x5b, 0xf1, 0x92, 0xf3, 0xe9, 0x93, 0xe9, 0x99, 0xbc, 0x5c, 0xd4, 0x6d, - 0x37, 0xb1, 0x29, 0x7d, 0x31, 0x0d, 0xe5, 0xe0, 0xe1, 0x02, 0x5a, 0x80, 0x7c, 0xc7, 0xd4, 0xe8, - 0xe9, 0x21, 0x3f, 0xd9, 0x9a, 0x89, 0x39, 0x8f, 0x98, 0x5d, 0xe6, 0xf8, 0xb2, 0x4b, 0x59, 0xfb, - 0x8f, 0x29, 0xc8, 0x0b, 0x30, 0x3a, 0x0a, 0xd9, 0x9e, 0xea, 0x6c, 0x53, 0x76, 0xa3, 0xcd, 0x74, - 0x25, 0x25, 0xd3, 0x32, 0x81, 0xdb, 0x3d, 0xd5, 0xa0, 0x2a, 0xc0, 0xe1, 0xa4, 0x4c, 0xe6, 0xb5, - 0x83, 0xd5, 0x16, 0xdd, 0xf5, 0x98, 0xdd, 0x2e, 0x36, 0x1c, 0x5b, 0xcc, 0x2b, 0x87, 0xcf, 0x73, - 0x30, 0xba, 0x17, 0x26, 0x1d, 0x4b, 0xd5, 0x3b, 0x01, 0xdc, 0x2c, 0xc5, 0xad, 0x88, 0x0a, 0x17, - 0xb9, 0x01, 0xc7, 0x05, 0xdf, 0x16, 0x76, 0x54, 0x6d, 0x1b, 0xb7, 0x3c, 0xa2, 0x1c, 0xcd, 0x6e, - 0x1c, 0xe3, 0x08, 0x0b, 0xbc, 0x5e, 0xd0, 0x4a, 0xdf, 0x4a, 0xc1, 0xa4, 0xd8, 0xa7, 0xb5, 0x5c, - 0x61, 0xad, 0x00, 0xa8, 0x86, 0x61, 0x3a, 0x7e, 0x71, 0x0d, 0xaa, 0xf2, 0x00, 0xdd, 0xec, 0x9c, - 0x4b, 0x24, 0xfb, 0x18, 0xd4, 0xba, 0x00, 0x5e, 0xcd, 0x50, 0xb1, 0xd5, 0xa1, 0xc8, 0x4f, 0x8e, - 0xe8, 0xf1, 0x23, 0xdb, 0xd9, 0x03, 0x03, 0x91, 0x0d, 0x1d, 0x9a, 0x86, 0xd1, 0x4d, 0xdc, 0xd6, - 0x0d, 0x9e, 0x0f, 0x66, 0x05, 0x91, 0x7f, 0xc9, 0xba, 0xf9, 0x97, 0xe6, 0x27, 0x53, 0x30, 0xa5, - 0x99, 0xdd, 0x70, 0x7f, 0x9b, 0x95, 0x50, 0x7a, 0xc1, 0xbe, 0x98, 0x7a, 0xfe, 0x09, 0xdf, 0x49, - 0x6b, 0xdb, 0xec, 0xa8, 0x46, 0xdb, 0x3b, 0x3f, 0xa5, 0x3f, 0xb4, 0xfb, 0xdb, 0xd8, 0xb8, 0xbf, - 0x6d, 0xfa, 0x4e, 0x53, 0xcf, 0x79, 0x3f, 0xff, 0x2a, 0x95, 0xfa, 0x42, 0x3a, 0x73, 0x61, 0xb5, - 0xf9, 0xa5, 0x74, 0xed, 0x02, 0x6b, 0x6e, 0x55, 0x88, 0x47, 0xc6, 0x5b, 0x1d, 0xac, 0x91, 0x21, - 0xc3, 0xf7, 0xee, 0x85, 0xe9, 0xb6, 0xd9, 0x36, 0x29, 0xc7, 0x33, 0xe4, 0x17, 0x3f, 0x91, 0x2d, - 0xb8, 0xd0, 0x5a, 0xec, 0xf1, 0x6d, 0xe3, 0x12, 0x4c, 0x71, 0x64, 0x85, 0x1e, 0x09, 0xb1, 0x8d, - 0x0d, 0x3a, 0x30, 0xad, 0x56, 0xfd, 0xdd, 0xef, 0x50, 0x87, 0x2e, 0x4f, 0x72, 0x52, 0x52, 0xc7, - 0xf6, 0x3e, 0x0d, 0x19, 0x8e, 0x04, 0xf8, 0xb1, 0x65, 0x8b, 0xad, 0x18, 0x8e, 0xff, 0x8e, 0x73, - 0x9c, 0xf2, 0x71, 0x5c, 0xe3, 0xa4, 0x8d, 0x79, 0x18, 0x3f, 0x0c, 0xaf, 0x7f, 0xcf, 0x79, 0x95, - 0xb0, 0x9f, 0xc9, 0x05, 0x98, 0xa0, 0x4c, 0xb4, 0xbe, 0xed, 0x98, 0x5d, 0x6a, 0x13, 0x0f, 0x66, - 0xf3, 0x87, 0xdf, 0x61, 0xeb, 0xa8, 0x4c, 0xc8, 0xe6, 0x5d, 0xaa, 0x46, 0x03, 0xe8, 0x29, 0x58, - 0x0b, 0x6b, 0x9d, 0x18, 0x0e, 0xdf, 0xe0, 0x1d, 0x71, 0xf1, 0x1b, 0x57, 0x60, 0x9a, 0xfc, 0xa6, - 0x26, 0xcb, 0xdf, 0x93, 0xf8, 0x1c, 0x5c, 0xf5, 0x5b, 0x1f, 0x66, 0x4b, 0x75, 0xca, 0x65, 0xe0, - 0xeb, 0x93, 0x6f, 0x16, 0xdb, 0xd8, 0x71, 0xb0, 0x65, 0x2b, 0x6a, 0x27, 0xaa, 0x7b, 0xbe, 0x24, - 0x46, 0xf5, 0xd7, 0xde, 0x08, 0xce, 0xe2, 0x05, 0x46, 0x39, 0xd7, 0xe9, 0x34, 0x36, 0xe0, 0x58, - 0x84, 0x56, 0x24, 0xe0, 0xf9, 0x69, 0xce, 0x73, 0x7a, 0x40, 0x33, 0x08, 0xdb, 0x55, 0x10, 0x70, - 0x77, 0x2e, 0x13, 0xf0, 0xfc, 0x75, 0xce, 0x13, 0x71, 0x5a, 0x31, 0xa5, 0x84, 0xe3, 0x53, 0x30, - 0x79, 0x15, 0x5b, 0x9b, 0xa6, 0xcd, 0x13, 0x47, 0x09, 0xd8, 0x7d, 0x86, 0xb3, 0x9b, 0xe0, 0x84, - 0x34, 0x93, 0x44, 0x78, 0x3d, 0x06, 0xf9, 0x2d, 0x55, 0xc3, 0x09, 0x58, 0x7c, 0x96, 0xb3, 0x18, - 0x23, 0xf8, 0x84, 0x74, 0x0e, 0x4a, 0x6d, 0x93, 0x7b, 0xad, 0x78, 0xf2, 0xcf, 0x71, 0xf2, 0xa2, - 0xa0, 0xe1, 0x2c, 0x7a, 0x66, 0xaf, 0xdf, 0x21, 0x2e, 0x2d, 0x9e, 0xc5, 0x6f, 0x08, 0x16, 0x82, - 0x86, 0xb3, 0x38, 0x84, 0x58, 0x5f, 0x15, 0x2c, 0x6c, 0x9f, 0x3c, 0x9f, 0x84, 0xa2, 0x69, 0x74, - 0xf6, 0x4c, 0x23, 0x49, 0x27, 0x3e, 0xcf, 0x39, 0x00, 0x27, 0x21, 0x0c, 0xce, 0x41, 0x21, 0xe9, - 0x44, 0xfc, 0xa3, 0x37, 0xc4, 0xf2, 0x10, 0x33, 0x70, 0x01, 0x26, 0x84, 0x81, 0xd2, 0x4d, 0x23, - 0x01, 0x8b, 0x7f, 0xcc, 0x59, 0x94, 0x7d, 0x64, 0x7c, 0x18, 0x0e, 0xb6, 0x9d, 0x36, 0x4e, 0xc2, - 0xe4, 0x8b, 0x62, 0x18, 0x9c, 0x84, 0x8b, 0x72, 0x13, 0x1b, 0xda, 0x76, 0x32, 0x0e, 0xbf, 0x29, - 0x44, 0x29, 0x68, 0x08, 0x8b, 0x79, 0x18, 0xef, 0xaa, 0x96, 0xbd, 0xad, 0x76, 0x12, 0x4d, 0xc7, - 0x3f, 0xe1, 0x3c, 0x4a, 0x2e, 0x11, 0x97, 0x48, 0xdf, 0x38, 0x0c, 0x9b, 0x2f, 0x09, 0x89, 0xf8, - 0xc8, 0xf8, 0xd2, 0xb3, 0x1d, 0x9a, 0x65, 0x3b, 0x0c, 0xb7, 0x7f, 0x2a, 0x96, 0x1e, 0xa3, 0x5d, - 0xf1, 0x73, 0x3c, 0x07, 0x05, 0x5b, 0x7f, 0x29, 0x11, 0x9b, 0x7f, 0x26, 0x66, 0x9a, 0x12, 0x10, - 0xe2, 0x0f, 0xc0, 0xf1, 0x48, 0x37, 0x91, 0x80, 0xd9, 0x3f, 0xe7, 0xcc, 0x8e, 0x46, 0xb8, 0x0a, - 0x6e, 0x12, 0x0e, 0xcb, 0xf2, 0xb7, 0x84, 0x49, 0xc0, 0x21, 0x5e, 0xab, 0x64, 0x1f, 0x61, 0xab, - 0x5b, 0x87, 0x93, 0xda, 0x6f, 0x0b, 0xa9, 0x31, 0xda, 0x80, 0xd4, 0xd6, 0xe1, 0x28, 0xe7, 0x78, - 0xb8, 0x79, 0xfd, 0x1d, 0x61, 0x58, 0x19, 0xf5, 0x46, 0x70, 0x76, 0x3f, 0x08, 0x35, 0x57, 0x9c, - 0x22, 0x60, 0xb5, 0x95, 0xae, 0xda, 0x4b, 0xc0, 0xf9, 0x77, 0x39, 0x67, 0x61, 0xf1, 0xdd, 0x88, - 0xd7, 0x5e, 0x51, 0x7b, 0x84, 0xf9, 0x73, 0x50, 0x15, 0xcc, 0xfb, 0x86, 0x85, 0x35, 0xb3, 0x6d, - 0xe8, 0x2f, 0xe1, 0x56, 0x02, 0xd6, 0xff, 0x22, 0x34, 0x55, 0x1b, 0x3e, 0x72, 0xc2, 0x79, 0x09, - 0x2a, 0x6e, 0xac, 0xa2, 0xe8, 0xdd, 0x9e, 0x69, 0x39, 0x31, 0x1c, 0xff, 0xa5, 0x98, 0x29, 0x97, - 0x6e, 0x89, 0x92, 0x35, 0x16, 0xa1, 0x4c, 0x8b, 0x49, 0x55, 0xf2, 0xf7, 0x38, 0xa3, 0x71, 0x8f, - 0x8a, 0x1b, 0x0e, 0xcd, 0xec, 0xf6, 0x54, 0x2b, 0x89, 0xfd, 0xfb, 0x57, 0xc2, 0x70, 0x70, 0x12, - 0x6e, 0x38, 0x9c, 0xbd, 0x1e, 0x26, 0xde, 0x3e, 0x01, 0x87, 0x2f, 0x0b, 0xc3, 0x21, 0x68, 0x38, - 0x0b, 0x11, 0x30, 0x24, 0x60, 0xf1, 0x15, 0xc1, 0x42, 0xd0, 0x10, 0x16, 0xcf, 0x78, 0x8e, 0xd6, - 0xc2, 0x6d, 0xdd, 0x76, 0x2c, 0x16, 0x26, 0x1f, 0xcc, 0xea, 0xab, 0x6f, 0x04, 0x83, 0x30, 0xd9, - 0x47, 0x4a, 0x2c, 0x11, 0x4f, 0xbb, 0xd2, 0x5d, 0x54, 0x7c, 0xc7, 0xbe, 0x26, 0x2c, 0x91, 0x8f, - 0x8c, 0xf4, 0xcd, 0x17, 0x21, 0x12, 0xb1, 0x6b, 0x64, 0xef, 0x90, 0x80, 0xdd, 0xef, 0x87, 0x3a, - 0xb7, 0x26, 0x68, 0x09, 0x4f, 0x5f, 0xfc, 0xd3, 0x37, 0x76, 0xf0, 0x5e, 0x22, 0xed, 0xfc, 0x83, - 0x50, 0xfc, 0xb3, 0xc1, 0x28, 0x99, 0x0d, 0x99, 0x08, 0xc5, 0x53, 0x28, 0xee, 0xfe, 0x50, 0xf5, - 0x6f, 0xbf, 0xc9, 0xc7, 0x1b, 0x0c, 0xa7, 0x1a, 0xcb, 0x44, 0xc9, 0x83, 0x41, 0x4f, 0x3c, 0xb3, - 0x0f, 0xbf, 0xe9, 0xea, 0x79, 0x20, 0xe6, 0x69, 0x9c, 0x87, 0xf1, 0x40, 0xc0, 0x13, 0xcf, 0xea, - 0x23, 0x9c, 0x55, 0xc9, 0x1f, 0xef, 0x34, 0x1e, 0x82, 0x2c, 0x09, 0x5e, 0xe2, 0xc9, 0x7f, 0x8e, - 0x93, 0x53, 0xf4, 0xc6, 0xfb, 0x20, 0x2f, 0x82, 0x96, 0x78, 0xd2, 0x9f, 0xe7, 0xa4, 0x2e, 0x09, - 0x21, 0x17, 0x01, 0x4b, 0x3c, 0xf9, 0x47, 0x05, 0xb9, 0x20, 0x21, 0xe4, 0xc9, 0x45, 0xf8, 0xf5, - 0xbf, 0x93, 0xe5, 0x4e, 0x47, 0xc8, 0xee, 0x1c, 0x8c, 0xf1, 0x48, 0x25, 0x9e, 0xfa, 0xe3, 0xbc, - 0x71, 0x41, 0xd1, 0x78, 0x04, 0x46, 0x13, 0x0a, 0xfc, 0x17, 0x39, 0x29, 0xc3, 0x6f, 0xcc, 0x43, - 0xd1, 0x17, 0x9d, 0xc4, 0x93, 0xff, 0x12, 0x27, 0xf7, 0x53, 0x91, 0xae, 0xf3, 0xe8, 0x24, 0x9e, - 0xc1, 0x27, 0x45, 0xd7, 0x39, 0x05, 0x11, 0x9b, 0x08, 0x4c, 0xe2, 0xa9, 0x3f, 0x25, 0xa4, 0x2e, - 0x48, 0x1a, 0x4f, 0x42, 0xc1, 0x75, 0x36, 0xf1, 0xf4, 0x7f, 0x97, 0xd3, 0x7b, 0x34, 0x44, 0x02, - 0x3e, 0x67, 0x17, 0xcf, 0xe2, 0x97, 0x85, 0x04, 0x7c, 0x54, 0x64, 0x19, 0x85, 0x03, 0x98, 0x78, - 0x4e, 0x7f, 0x4f, 0x2c, 0xa3, 0x50, 0xfc, 0x42, 0x66, 0x93, 0xda, 0xfc, 0x78, 0x16, 0xbf, 0x22, - 0x66, 0x93, 0xe2, 0x93, 0x6e, 0x84, 0x23, 0x82, 0x78, 0x1e, 0xff, 0x40, 0x74, 0x23, 0x14, 0x10, - 0x34, 0x56, 0x01, 0x0d, 0x46, 0x03, 0xf1, 0xfc, 0x5e, 0xe1, 0xfc, 0x26, 0x07, 0x82, 0x81, 0xc6, - 0xb3, 0x70, 0x34, 0x3a, 0x12, 0x88, 0xe7, 0xfa, 0x6b, 0x6f, 0x86, 0xf6, 0x6e, 0xfe, 0x40, 0xa0, - 0xb1, 0xee, 0xb9, 0x14, 0x7f, 0x14, 0x10, 0xcf, 0xf6, 0xd3, 0x6f, 0x06, 0x0d, 0xb7, 0x3f, 0x08, - 0x68, 0xcc, 0x01, 0x78, 0x0e, 0x38, 0x9e, 0xd7, 0x67, 0x38, 0x2f, 0x1f, 0x11, 0x59, 0x1a, 0xdc, - 0xff, 0xc6, 0xd3, 0x7f, 0x56, 0x2c, 0x0d, 0x4e, 0x41, 0x96, 0x86, 0x70, 0xbd, 0xf1, 0xd4, 0x9f, - 0x13, 0x4b, 0x43, 0x90, 0x10, 0xcd, 0xf6, 0x79, 0xb7, 0x78, 0x0e, 0x9f, 0x17, 0x9a, 0xed, 0xa3, - 0x6a, 0x5c, 0x82, 0xc9, 0x01, 0x87, 0x18, 0xcf, 0xea, 0x0b, 0x9c, 0x55, 0x25, 0xec, 0x0f, 0xfd, - 0xce, 0x8b, 0x3b, 0xc3, 0x78, 0x6e, 0xff, 0x30, 0xe4, 0xbc, 0xb8, 0x2f, 0x6c, 0x9c, 0x83, 0xbc, - 0xd1, 0xef, 0x74, 0xc8, 0xe2, 0x41, 0x07, 0xdf, 0xf9, 0xab, 0xfe, 0x8f, 0x1f, 0x72, 0xe9, 0x08, - 0x82, 0xc6, 0x43, 0x30, 0x8a, 0xbb, 0x9b, 0xb8, 0x15, 0x47, 0xf9, 0xbd, 0x1f, 0x0a, 0x83, 0x49, - 0xb0, 0x1b, 0x4f, 0x02, 0xb0, 0xd4, 0x08, 0x3d, 0x1e, 0x8c, 0xa1, 0xfd, 0x9f, 0x3f, 0xe4, 0xb7, - 0x71, 0x3c, 0x12, 0x8f, 0x01, 0xbb, 0xdb, 0x73, 0x30, 0x83, 0x37, 0x82, 0x0c, 0xe8, 0x8c, 0x3c, - 0x06, 0x63, 0x2f, 0xd8, 0xa6, 0xe1, 0xa8, 0xed, 0x38, 0xea, 0xff, 0xc5, 0xa9, 0x05, 0x3e, 0x11, - 0x58, 0xd7, 0xb4, 0xb0, 0xa3, 0xb6, 0xed, 0x38, 0xda, 0xff, 0xcd, 0x69, 0x5d, 0x02, 0x42, 0xac, - 0xa9, 0xb6, 0x93, 0x64, 0xdc, 0xff, 0x47, 0x10, 0x0b, 0x02, 0xd2, 0x69, 0xf2, 0x7b, 0x07, 0xef, - 0xc5, 0xd1, 0x7e, 0x5f, 0x74, 0x9a, 0xe3, 0x37, 0xde, 0x07, 0x05, 0xf2, 0x93, 0x5d, 0xb1, 0x8b, - 0x21, 0xfe, 0xbf, 0x9c, 0xd8, 0xa3, 0x20, 0x2d, 0xdb, 0x4e, 0xcb, 0xd1, 0xe3, 0x85, 0x7d, 0x9d, - 0xcf, 0xb4, 0xc0, 0x6f, 0xcc, 0x41, 0xd1, 0x76, 0x5a, 0xad, 0x3e, 0x8f, 0x4f, 0x63, 0xc8, 0xff, - 0xdf, 0x0f, 0xdd, 0x94, 0x85, 0x4b, 0x43, 0x66, 0xfb, 0xda, 0x8e, 0xd3, 0x33, 0xe9, 0x11, 0x48, - 0x1c, 0x87, 0x37, 0x39, 0x07, 0x1f, 0x49, 0x63, 0x1e, 0x4a, 0x64, 0x2c, 0x16, 0xee, 0x61, 0x7a, - 0x5e, 0x15, 0xc3, 0xe2, 0x2f, 0xb8, 0x00, 0x02, 0x44, 0xcd, 0x9f, 0x1e, 0xf6, 0xee, 0x26, 0x3a, - 0x6d, 0x0c, 0x17, 0xcc, 0x0b, 0x26, 0x4b, 0x18, 0x3f, 0x2f, 0x05, 0xd2, 0xc5, 0x6d, 0xd3, 0xcb, - 0xd6, 0xba, 0x9b, 0x1c, 0xf8, 0xfd, 0x34, 0xdc, 0x49, 0xaf, 0xfb, 0x5a, 0x5d, 0xdd, 0x70, 0xce, - 0x68, 0xd6, 0x5e, 0xcf, 0x31, 0xcf, 0x74, 0xb1, 0xb5, 0xd3, 0xc1, 0xfc, 0x0f, 0xcf, 0xfe, 0x56, - 0x3d, 0xb4, 0x59, 0x86, 0x36, 0xcb, 0xea, 0x6b, 0x91, 0xd9, 0x62, 0x69, 0x1e, 0xc6, 0x56, 0x2d, - 0xd3, 0xdc, 0xba, 0xdc, 0x43, 0x88, 0xdf, 0x60, 0xe6, 0x37, 0xe3, 0xa8, 0x1a, 0xf2, 0x17, 0x4f, - 0x69, 0xef, 0xc5, 0x13, 0x82, 0x6c, 0x4b, 0x75, 0x54, 0x9a, 0x30, 0x2f, 0xc9, 0xf4, 0xb7, 0xd4, - 0x84, 0x51, 0xca, 0x04, 0x3d, 0x06, 0x19, 0xb3, 0x67, 0xf3, 0xec, 0xfe, 0xed, 0xb3, 0xc3, 0xfa, - 0x32, 0xcb, 0x9b, 0x6c, 0x66, 0xbf, 0xb1, 0x5f, 0x1f, 0x91, 0x09, 0x4d, 0x73, 0xf5, 0xaf, 0xbe, - 0x7d, 0x22, 0xf5, 0x9b, 0xaf, 0x9d, 0x48, 0x0d, 0x7d, 0xc1, 0x34, 0xeb, 0x13, 0x94, 0x4f, 0x18, - 0xc3, 0xe4, 0xe2, 0xbe, 0x63, 0xfa, 0x85, 0x34, 0x9c, 0xf0, 0x21, 0x75, 0xf4, 0x4d, 0xfb, 0xcc, - 0xce, 0x55, 0xf6, 0xe4, 0x89, 0x4b, 0x0d, 0xf9, 0x7a, 0x4a, 0xea, 0x67, 0x77, 0xae, 0x0e, 0x91, - 0xd7, 0x2c, 0x64, 0x57, 0x55, 0xdd, 0x8a, 0x78, 0x0a, 0x36, 0xed, 0x5d, 0x6e, 0x25, 0x30, 0x56, - 0x90, 0xce, 0x42, 0xfe, 0xe9, 0xa5, 0x87, 0x1f, 0x4c, 0x42, 0x93, 0xe1, 0x34, 0x4d, 0x59, 0x88, - 0xe2, 0xab, 0x11, 0xe2, 0xf8, 0xfa, 0xeb, 0x27, 0x52, 0x91, 0x8f, 0xba, 0xa2, 0x45, 0xc2, 0x47, - 0xeb, 0x0a, 0xe3, 0x53, 0x69, 0xa8, 0x87, 0x4f, 0x05, 0xc8, 0x52, 0xb4, 0x1d, 0xb5, 0xdb, 0x1b, - 0xf6, 0xa6, 0xeb, 0x1c, 0x14, 0xd6, 0x05, 0x0e, 0xaa, 0xc2, 0x98, 0x8d, 0x35, 0xd3, 0x68, 0xd9, - 0x74, 0x24, 0x19, 0x59, 0x14, 0xc9, 0x68, 0x0c, 0xd5, 0x30, 0x6d, 0x7e, 0xe5, 0x94, 0x15, 0x9a, - 0xbf, 0x9a, 0x3a, 0xdc, 0xda, 0x28, 0xbb, 0x4d, 0xd1, 0x05, 0xb2, 0x9a, 0x7a, 0xfe, 0xde, 0x83, - 0x0e, 0x54, 0xd8, 0xcb, 0x35, 0x77, 0x08, 0xbe, 0xd3, 0x93, 0x13, 0xe1, 0xd3, 0x93, 0x67, 0x71, - 0xa7, 0xf3, 0xb4, 0x61, 0x5e, 0x33, 0xd6, 0x09, 0x8d, 0x2b, 0x92, 0x4f, 0xa4, 0xe1, 0xc4, 0xc0, - 0x41, 0x09, 0x37, 0x2f, 0xc3, 0x24, 0xd2, 0x80, 0xfc, 0x82, 0xb0, 0x5a, 0x87, 0x15, 0xc8, 0xaf, - 0x1c, 0x52, 0x20, 0xe3, 0xa2, 0x25, 0x21, 0x8f, 0x7b, 0xe2, 0xe5, 0x21, 0xfa, 0x7f, 0x03, 0xe2, - 0xf8, 0xc8, 0x13, 0x70, 0xbb, 0x4f, 0x81, 0xd4, 0x4d, 0x4d, 0xe7, 0xcf, 0x03, 0xfd, 0x2b, 0xe6, - 0x88, 0x6f, 0xc5, 0x10, 0x94, 0x59, 0x5a, 0x19, 0xbd, 0x68, 0x6a, 0xc9, 0x6c, 0x57, 0x2d, 0x66, - 0x95, 0xd6, 0xe2, 0x14, 0xb7, 0x16, 0x33, 0x8d, 0xd2, 0x5f, 0x8e, 0xc2, 0x98, 0x78, 0xcb, 0xf9, - 0x28, 0x64, 0xb1, 0xb6, 0x6d, 0xf2, 0xdb, 0xee, 0xd2, 0x6c, 0xe4, 0x78, 0x66, 0x39, 0xf6, 0xa2, - 0xb6, 0x6d, 0x5e, 0x1c, 0x91, 0x29, 0x05, 0x7d, 0x03, 0xd6, 0xe9, 0xdb, 0xdb, 0xfc, 0x52, 0xf2, - 0xa9, 0x83, 0x49, 0xcf, 0x13, 0xd4, 0x8b, 0x23, 0x32, 0xa3, 0x21, 0xcd, 0xd2, 0xf7, 0x6b, 0xd9, - 0x24, 0xcd, 0x2e, 0x19, 0x5b, 0xb4, 0x59, 0x42, 0x81, 0x2e, 0x02, 0xd8, 0xd8, 0x11, 0x57, 0x19, - 0x46, 0x29, 0xfd, 0xdd, 0x07, 0xd3, 0xaf, 0x61, 0x87, 0xb9, 0xad, 0x8b, 0x23, 0x72, 0xc1, 0x16, - 0x05, 0xc2, 0x49, 0x37, 0x74, 0x47, 0xd1, 0xb6, 0x55, 0xdd, 0xa0, 0x67, 0xf0, 0xb1, 0x9c, 0x96, - 0x0c, 0xdd, 0x99, 0x27, 0xe8, 0x84, 0x93, 0x2e, 0x0a, 0x44, 0x14, 0xf4, 0xcd, 0x28, 0x7f, 0x64, - 0x15, 0x23, 0x8a, 0x67, 0x08, 0x2a, 0x11, 0x05, 0xa5, 0x41, 0x4f, 0x43, 0x91, 0x1e, 0xb7, 0x2a, - 0x9b, 0x1d, 0x53, 0xdb, 0xe1, 0x2f, 0x4b, 0x66, 0x0e, 0x66, 0xd1, 0x24, 0x04, 0x4d, 0x82, 0x7f, - 0x71, 0x44, 0x86, 0x4d, 0xb7, 0x84, 0x9a, 0x90, 0x67, 0xd7, 0x7e, 0x9d, 0x5d, 0xfe, 0x36, 0xf0, - 0xce, 0x83, 0x39, 0xd1, 0x1b, 0xc0, 0xeb, 0xbb, 0x17, 0x47, 0xe4, 0x31, 0x8d, 0xfd, 0x44, 0x8b, - 0x50, 0xc0, 0x46, 0x8b, 0x77, 0xa7, 0xc8, 0x5f, 0x51, 0x1d, 0xac, 0x17, 0x46, 0x4b, 0x74, 0x26, - 0x8f, 0xf9, 0x6f, 0xf4, 0x04, 0xe4, 0x34, 0xb3, 0xdb, 0xd5, 0x1d, 0xfa, 0xc6, 0xb0, 0x78, 0xf6, - 0x8e, 0x98, 0x8e, 0x50, 0xdc, 0x8b, 0x23, 0x32, 0xa7, 0x22, 0xd3, 0xd3, 0xc2, 0x1d, 0xfd, 0x2a, - 0xb6, 0xc8, 0x60, 0xa6, 0x92, 0x4c, 0xcf, 0x02, 0xc3, 0xa7, 0xc3, 0x29, 0xb4, 0x44, 0xa1, 0x39, - 0xc6, 0xdd, 0x8b, 0x74, 0x37, 0x14, 0x7d, 0x9a, 0x4c, 0x2c, 0x16, 0xdf, 0x81, 0x70, 0x67, 0x2f, - 0x8a, 0x52, 0x19, 0x4a, 0x7e, 0xbd, 0x95, 0xba, 0x2e, 0x21, 0x3d, 0xc4, 0xaf, 0xc2, 0xd8, 0x55, - 0x6c, 0xd9, 0xec, 0x04, 0x9f, 0x12, 0xf2, 0x22, 0x3a, 0x05, 0xe3, 0x54, 0x6e, 0x8a, 0xa8, 0x67, - 0xcf, 0x92, 0x4b, 0x14, 0x78, 0x85, 0x23, 0xd5, 0xa1, 0xd8, 0x3b, 0xdb, 0x73, 0x51, 0xd8, 0xdb, - 0x68, 0xe8, 0x9d, 0xed, 0x71, 0x04, 0xa9, 0x01, 0x95, 0xb0, 0xea, 0xfa, 0xbd, 0x66, 0x21, 0xc2, - 0x6b, 0x16, 0x84, 0xa7, 0xfd, 0x9d, 0xb4, 0x4b, 0xec, 0x6a, 0x2b, 0x59, 0x6e, 0xc4, 0x48, 0x50, - 0xea, 0xe2, 0xd9, 0xda, 0x40, 0x68, 0xe7, 0xfa, 0x9a, 0x66, 0x9e, 0x84, 0x22, 0x9f, 0xfa, 0xd3, - 0x7a, 0x4a, 0xa6, 0x14, 0xe8, 0x38, 0x51, 0x28, 0x55, 0x37, 0x14, 0xbd, 0x25, 0x5e, 0x13, 0xd3, - 0xf2, 0x52, 0x0b, 0x3d, 0x03, 0x15, 0xcd, 0x34, 0x6c, 0x6c, 0xd8, 0x7d, 0x5b, 0xe9, 0xa9, 0x96, - 0xda, 0xf5, 0x1e, 0xdd, 0x45, 0x4f, 0xd3, 0xbc, 0x40, 0x5f, 0xa5, 0xd8, 0xf2, 0x84, 0x16, 0x04, - 0xa0, 0x65, 0x80, 0xab, 0x6a, 0x47, 0x6f, 0xa9, 0x8e, 0x69, 0xd9, 0xfc, 0x71, 0xca, 0x30, 0x66, - 0x57, 0x04, 0xe2, 0x46, 0xaf, 0xa5, 0x3a, 0x98, 0x07, 0x51, 0x3e, 0x7a, 0x74, 0x17, 0x4c, 0xa8, - 0xbd, 0x9e, 0x62, 0x3b, 0xaa, 0x83, 0x95, 0xcd, 0x3d, 0x07, 0xdb, 0xd4, 0x5e, 0x94, 0xe4, 0x71, - 0xb5, 0xd7, 0x5b, 0x23, 0xd0, 0x26, 0x01, 0x4a, 0x2d, 0x77, 0xb6, 0xe9, 0xd2, 0x74, 0x63, 0xbb, - 0x94, 0x17, 0xdb, 0x11, 0x18, 0xbd, 0x5a, 0xc1, 0x64, 0x20, 0x6e, 0xa3, 0xe4, 0xb6, 0xb1, 0xde, - 0xde, 0x66, 0xcf, 0xdb, 0x33, 0x32, 0x2f, 0x91, 0x89, 0xe9, 0x59, 0xe6, 0x55, 0xcc, 0x5f, 0xb6, - 0xb3, 0x82, 0xf4, 0xf7, 0xd3, 0x30, 0x39, 0xb0, 0x7c, 0x09, 0x5f, 0x7a, 0xc1, 0x9f, 0xb7, 0x45, - 0x7e, 0xa3, 0x73, 0x84, 0xaf, 0xda, 0xe2, 0x8f, 0x56, 0x8a, 0x67, 0x6f, 0x1b, 0x22, 0x81, 0x8b, - 0x14, 0x89, 0x0f, 0x9c, 0x93, 0xa0, 0x0d, 0xa8, 0x74, 0x54, 0xdb, 0x51, 0xd8, 0x2a, 0x62, 0xaf, - 0x84, 0x33, 0x07, 0x5a, 0x82, 0x65, 0x55, 0xac, 0x3e, 0xa2, 0xdc, 0x9c, 0x5d, 0xb9, 0x13, 0x80, - 0xa2, 0xe7, 0x60, 0x7a, 0x73, 0xef, 0x25, 0xd5, 0x70, 0x74, 0x83, 0x5e, 0x36, 0x0a, 0xce, 0x51, - 0x7d, 0x08, 0xeb, 0xc5, 0xab, 0x7a, 0x0b, 0x1b, 0x9a, 0x98, 0x9c, 0x29, 0x97, 0x85, 0x3b, 0x79, - 0xb6, 0xf4, 0x1c, 0x94, 0x83, 0xb6, 0x08, 0x95, 0x21, 0xed, 0xec, 0x72, 0x89, 0xa4, 0x9d, 0x5d, - 0xf4, 0x30, 0x8f, 0xc8, 0xd3, 0xf4, 0xb6, 0xdc, 0x30, 0x67, 0xc1, 0xa9, 0xbd, 0xb7, 0x84, 0x92, - 0xe4, 0xae, 0x04, 0xd7, 0x30, 0x84, 0x79, 0x4b, 0xa7, 0x61, 0x22, 0x64, 0xc4, 0x7c, 0xd3, 0x9a, - 0xf2, 0x4f, 0xab, 0x34, 0x01, 0xe3, 0x01, 0x5b, 0x25, 0xfd, 0x51, 0x0e, 0xf2, 0xee, 0x37, 0x0a, - 0x2e, 0x42, 0x01, 0xef, 0x6a, 0xb8, 0xe7, 0x08, 0xab, 0x70, 0x90, 0x11, 0x67, 0x34, 0x8b, 0x02, - 0x9f, 0x98, 0x2b, 0x97, 0x18, 0x3d, 0x16, 0x70, 0xc9, 0xa7, 0xe2, 0x98, 0xf8, 0x7d, 0xf2, 0xe3, - 0x41, 0x9f, 0x7c, 0x47, 0x0c, 0x6d, 0xc8, 0x29, 0x3f, 0x16, 0x70, 0xca, 0x71, 0x0d, 0x07, 0xbc, - 0xf2, 0x52, 0x84, 0x57, 0x8e, 0x1b, 0xfe, 0x10, 0xb7, 0xbc, 0x14, 0xe1, 0x96, 0x67, 0x62, 0xfb, - 0x12, 0xe9, 0x97, 0x1f, 0x0f, 0xfa, 0xe5, 0x38, 0x71, 0x84, 0x1c, 0xf3, 0x72, 0x94, 0x63, 0x3e, - 0x1d, 0xc3, 0x63, 0xa8, 0x67, 0x9e, 0x1f, 0xf0, 0xcc, 0x77, 0xc5, 0xb0, 0x8a, 0x70, 0xcd, 0x4b, - 0x01, 0x9f, 0x08, 0x89, 0x64, 0x13, 0xed, 0x14, 0xd1, 0xf9, 0x41, 0x2f, 0x7f, 0x77, 0x9c, 0xaa, - 0x45, 0xb9, 0xf9, 0x27, 0x43, 0x6e, 0xfe, 0xce, 0xb8, 0x51, 0x85, 0xfc, 0xbc, 0xe7, 0x9d, 0x4f, - 0x13, 0xfb, 0x18, 0x5a, 0x19, 0xc4, 0x96, 0x62, 0xcb, 0x32, 0x2d, 0xee, 0xf8, 0x58, 0x41, 0x9a, - 0x21, 0x16, 0xdb, 0xd3, 0xff, 0x03, 0x3c, 0x39, 0x5d, 0xb4, 0x3e, 0x6d, 0x97, 0xbe, 0x9a, 0xf2, - 0x68, 0xa9, 0x65, 0xf3, 0x5b, 0xfb, 0x02, 0xb7, 0xf6, 0x3e, 0x07, 0x9f, 0x0e, 0x3a, 0xf8, 0x3a, - 0x14, 0x89, 0x4f, 0x09, 0xf9, 0x6e, 0xb5, 0x27, 0x7c, 0x37, 0xba, 0x07, 0x26, 0xa9, 0xfd, 0x65, - 0x61, 0x00, 0x37, 0x24, 0x59, 0x6a, 0x48, 0x26, 0x48, 0x05, 0x93, 0x20, 0x73, 0x14, 0xf7, 0xc3, - 0x94, 0x0f, 0x97, 0xf0, 0xa5, 0xbe, 0x80, 0x39, 0xa9, 0x8a, 0x8b, 0x3d, 0xd7, 0xeb, 0x5d, 0x54, - 0xed, 0x6d, 0x69, 0xc5, 0x13, 0x90, 0x17, 0x17, 0x20, 0xc8, 0x6a, 0x66, 0x8b, 0x8d, 0x7b, 0x5c, - 0xa6, 0xbf, 0x49, 0xac, 0xd0, 0x31, 0xdb, 0xfc, 0x06, 0x24, 0xf9, 0x49, 0xb0, 0xdc, 0xa5, 0x5d, - 0x60, 0x6b, 0x56, 0xfa, 0xbd, 0x94, 0xc7, 0xcf, 0x0b, 0x15, 0xa2, 0xbc, 0x7a, 0xea, 0x66, 0x7a, - 0xf5, 0xf4, 0x5b, 0xf3, 0xea, 0xd2, 0x9b, 0x29, 0x6f, 0x4a, 0x5d, 0x7f, 0x7d, 0x63, 0x22, 0x20, - 0xda, 0xc5, 0x5e, 0x82, 0xb3, 0x9b, 0xba, 0xac, 0x20, 0x42, 0xad, 0x5c, 0x44, 0x82, 0x62, 0xcc, - 0x97, 0xd4, 0x40, 0x0f, 0x51, 0x3f, 0x6f, 0x6e, 0x71, 0xd3, 0x50, 0x8f, 0x49, 0xf4, 0xc8, 0x0c, - 0xdb, 0xe7, 0x5f, 0x0a, 0x81, 0xb0, 0xe1, 0x56, 0x28, 0x90, 0xae, 0xb3, 0xe7, 0x4f, 0xc0, 0xd3, - 0x8b, 0x02, 0x20, 0xb5, 0x00, 0x0d, 0xda, 0x18, 0x74, 0x09, 0x72, 0xf8, 0x2a, 0xbd, 0x8d, 0xca, - 0x92, 0x4d, 0xb7, 0x0e, 0x75, 0xc4, 0xd8, 0x70, 0x9a, 0x55, 0x22, 0xcc, 0xef, 0xed, 0xd7, 0x2b, - 0x8c, 0xe6, 0x3e, 0xb3, 0xab, 0x3b, 0xb8, 0xdb, 0x73, 0xf6, 0x64, 0xce, 0x45, 0xfa, 0x68, 0x9a, - 0xf8, 0xc3, 0x80, 0xfd, 0x89, 0x14, 0xaf, 0x58, 0x34, 0x69, 0x5f, 0x88, 0x94, 0x4c, 0xe4, 0xb7, - 0x01, 0xb4, 0x55, 0x5b, 0xb9, 0xa6, 0x1a, 0x0e, 0x6e, 0x71, 0xb9, 0x17, 0xda, 0xaa, 0xfd, 0x2c, - 0x05, 0x90, 0x78, 0x93, 0x54, 0xf7, 0x6d, 0xdc, 0xa2, 0x13, 0x90, 0x91, 0xc7, 0xda, 0xaa, 0xbd, - 0x61, 0xe3, 0x96, 0x6f, 0xac, 0x63, 0x37, 0x63, 0xac, 0x41, 0x79, 0xe7, 0xc3, 0xf2, 0xfe, 0x78, - 0xda, 0x5b, 0x1d, 0x5e, 0xf8, 0xf0, 0xe3, 0x29, 0x8b, 0xcf, 0xd2, 0x3d, 0x45, 0xd0, 0x09, 0xa0, - 0x0f, 0xc0, 0xa4, 0xbb, 0x2a, 0x95, 0x3e, 0x5d, 0xad, 0x42, 0x0b, 0x0f, 0xb7, 0xb8, 0x2b, 0x57, - 0x83, 0x60, 0x1b, 0xfd, 0x0c, 0x1c, 0x0b, 0xd9, 0x20, 0xb7, 0x81, 0xf4, 0xa1, 0x4c, 0xd1, 0x91, - 0xa0, 0x29, 0x12, 0xfc, 0x3d, 0xe9, 0x65, 0x6e, 0xca, 0xaa, 0xb9, 0x83, 0x84, 0xb0, 0x7e, 0xf7, - 0x16, 0xa5, 0x13, 0xd2, 0x1f, 0xa7, 0x60, 0x22, 0xd4, 0x41, 0xf4, 0x28, 0x8c, 0x32, 0x0f, 0x9c, - 0x3a, 0x30, 0x11, 0x42, 0x25, 0xce, 0xc7, 0xc4, 0x08, 0xd0, 0x1c, 0xe4, 0x31, 0x8f, 0xae, 0xb9, - 0x50, 0xee, 0x8c, 0x09, 0xc2, 0x39, 0xbd, 0x4b, 0x86, 0x16, 0xa0, 0xe0, 0x8a, 0x3e, 0x66, 0xe7, - 0xe6, 0xce, 0x1c, 0x67, 0xe2, 0x11, 0x4a, 0xf3, 0x50, 0xf4, 0x75, 0x8f, 0xbd, 0x05, 0xdc, 0xe5, - 0xdb, 0x2d, 0x16, 0x40, 0xe7, 0xbb, 0xea, 0x2e, 0xdd, 0x69, 0xa1, 0x63, 0x30, 0x46, 0x2a, 0xdb, - 0xfc, 0xb1, 0x54, 0x46, 0xce, 0x75, 0xd5, 0xdd, 0x0b, 0xaa, 0x2d, 0x7d, 0x22, 0x05, 0xe5, 0x60, - 0x3f, 0xd1, 0xbd, 0x80, 0x08, 0xae, 0xda, 0xc6, 0x8a, 0xd1, 0xef, 0x32, 0x1f, 0x29, 0x38, 0x4e, - 0x74, 0xd5, 0xdd, 0xb9, 0x36, 0xbe, 0xd4, 0xef, 0xd2, 0xa6, 0x6d, 0xb4, 0x02, 0x15, 0x81, 0x2c, - 0x92, 0x5d, 0x5c, 0x2a, 0xc7, 0x07, 0xbf, 0x57, 0xc3, 0x11, 0xd8, 0x5e, 0xf7, 0x15, 0xb2, 0xd7, - 0x2d, 0x33, 0x7e, 0xa2, 0x46, 0x7a, 0x08, 0x26, 0x42, 0x23, 0x46, 0x12, 0x8c, 0xf7, 0xfa, 0x9b, - 0xca, 0x0e, 0xde, 0xa3, 0xcf, 0xdf, 0x99, 0xaa, 0x17, 0xe4, 0x62, 0xaf, 0xbf, 0xf9, 0x34, 0xde, - 0xa3, 0xb9, 0x43, 0x49, 0x83, 0x72, 0x70, 0x33, 0x45, 0x1c, 0x87, 0x65, 0xf6, 0x8d, 0x96, 0xf8, - 0xb0, 0x01, 0x2d, 0xa0, 0x73, 0x30, 0x7a, 0xd5, 0x64, 0xda, 0x7c, 0xd0, 0xee, 0xe9, 0x8a, 0xe9, - 0x60, 0xdf, 0x96, 0x8c, 0xd1, 0x48, 0x36, 0x8c, 0x52, 0xbd, 0x8c, 0x3c, 0xa8, 0xb8, 0x02, 0xa0, - 0x3a, 0x8e, 0xa5, 0x6f, 0xf6, 0x3d, 0xf6, 0xd5, 0xd9, 0xc1, 0xb4, 0xfe, 0xec, 0xaa, 0xaa, 0x5b, - 0xcd, 0x5b, 0xb9, 0x66, 0x4f, 0x7b, 0x34, 0x3e, 0xed, 0xf6, 0x71, 0x92, 0xde, 0xc8, 0x42, 0x8e, - 0x6d, 0x37, 0xd1, 0x13, 0xc1, 0xe4, 0x47, 0xf1, 0xec, 0x89, 0x61, 0xdd, 0x67, 0x58, 0xbc, 0xf7, - 0x6e, 0x04, 0x75, 0x57, 0x38, 0xa3, 0xd0, 0x2c, 0xbe, 0xb6, 0x5f, 0x1f, 0xa3, 0xd1, 0xc7, 0xd2, - 0x82, 0x97, 0x5e, 0x18, 0xb6, 0xbb, 0x16, 0xb9, 0x8c, 0xec, 0xa1, 0x73, 0x19, 0x17, 0x61, 0xdc, - 0x17, 0x6e, 0xe9, 0x2d, 0xbe, 0x4f, 0x39, 0x71, 0xd0, 0xa2, 0x5b, 0x5a, 0xe0, 0xfd, 0x2f, 0xba, - 0xe1, 0xd8, 0x52, 0x0b, 0xcd, 0x04, 0x37, 0xd9, 0x34, 0x6a, 0x63, 0xe1, 0x82, 0x6f, 0xdf, 0x4c, - 0xdf, 0xe4, 0xdf, 0x02, 0x05, 0xfa, 0xb0, 0x99, 0xa2, 0xb0, 0xe8, 0x21, 0x4f, 0x00, 0xb4, 0xf2, - 0x6e, 0x98, 0xf0, 0x02, 0x1b, 0x86, 0x92, 0x67, 0x5c, 0x3c, 0x30, 0x45, 0x7c, 0x00, 0xa6, 0xe9, - 0x07, 0xf0, 0xc2, 0xd8, 0x05, 0x8a, 0x8d, 0x48, 0xdd, 0x95, 0x20, 0xc5, 0x9d, 0x50, 0xf6, 0x4c, - 0x28, 0xc5, 0x05, 0x96, 0xfa, 0x70, 0xa1, 0x14, 0xed, 0x38, 0xe4, 0xdd, 0xb0, 0xb3, 0xc8, 0xbe, - 0xac, 0xa7, 0xb2, 0x68, 0xd3, 0x0d, 0x64, 0x2d, 0x6c, 0xf7, 0x3b, 0x0e, 0x67, 0x52, 0xa2, 0x38, - 0x34, 0x90, 0x95, 0x19, 0x9c, 0xe2, 0x9e, 0x82, 0x71, 0x61, 0x55, 0x18, 0xde, 0x38, 0xc5, 0x2b, - 0x09, 0x20, 0x45, 0x3a, 0x0d, 0x95, 0x9e, 0x65, 0xf6, 0x4c, 0x1b, 0x5b, 0x8a, 0xda, 0x6a, 0x59, - 0xd8, 0xb6, 0xab, 0x65, 0xc6, 0x4f, 0xc0, 0xe7, 0x18, 0x58, 0x7a, 0x0f, 0x8c, 0x89, 0x78, 0x7a, - 0x1a, 0x46, 0x9b, 0xae, 0x85, 0xcc, 0xca, 0xac, 0x40, 0xfc, 0xeb, 0x5c, 0xaf, 0xc7, 0xb3, 0x6b, - 0xe4, 0xa7, 0xd4, 0x81, 0x31, 0x3e, 0x61, 0x91, 0x39, 0x95, 0x15, 0x28, 0xf5, 0x54, 0x8b, 0x0c, - 0xc3, 0x9f, 0x59, 0x19, 0xb6, 0x23, 0x5c, 0x55, 0x2d, 0x67, 0x0d, 0x3b, 0x81, 0x04, 0x4b, 0x91, - 0xd2, 0x33, 0x90, 0xf4, 0x18, 0x8c, 0x07, 0x70, 0xbc, 0xef, 0x10, 0xf2, 0x85, 0x4e, 0x0b, 0x6e, - 0x4f, 0xd2, 0x5e, 0x4f, 0xa4, 0x73, 0x50, 0x70, 0xe7, 0x8a, 0x6c, 0x34, 0x84, 0x28, 0xf8, 0x87, - 0x0d, 0x79, 0x91, 0x26, 0x91, 0xcc, 0x6b, 0xfc, 0x13, 0x4d, 0x19, 0x99, 0x15, 0x24, 0xec, 0x33, - 0x4c, 0xcc, 0x9b, 0xa1, 0xc7, 0x61, 0x8c, 0x1b, 0x26, 0xbe, 0x1e, 0x87, 0xa5, 0x8b, 0x56, 0xa9, - 0xa5, 0x12, 0xe9, 0x22, 0x66, 0xb7, 0xbc, 0x66, 0xd2, 0xfe, 0x66, 0x3e, 0x04, 0x79, 0x61, 0x7c, - 0x82, 0x5e, 0x82, 0xb5, 0x70, 0x32, 0xce, 0x4b, 0xf0, 0x46, 0x3c, 0x42, 0xa2, 0x4d, 0xb6, 0xde, - 0x36, 0x70, 0x4b, 0xf1, 0x96, 0x20, 0x7f, 0x30, 0x3b, 0xc1, 0x2a, 0x96, 0xc5, 0xfa, 0x92, 0x1e, - 0x80, 0x1c, 0xeb, 0x6b, 0xa4, 0x89, 0x8b, 0x72, 0xad, 0xdf, 0x49, 0x41, 0x5e, 0xb8, 0x8f, 0x48, - 0xa2, 0xc0, 0x20, 0xd2, 0x37, 0x3a, 0x88, 0x9b, 0x6f, 0x92, 0xee, 0x03, 0x44, 0x35, 0x45, 0xb9, - 0x6a, 0x3a, 0xba, 0xd1, 0x56, 0xd8, 0x5c, 0xf0, 0x77, 0x83, 0xb4, 0xe6, 0x0a, 0xad, 0x58, 0x25, - 0xf0, 0x7b, 0x4e, 0x41, 0xd1, 0x97, 0xe5, 0x42, 0x63, 0x90, 0xb9, 0x84, 0xaf, 0x55, 0x46, 0x50, - 0x11, 0xc6, 0x64, 0x4c, 0x73, 0x04, 0x95, 0xd4, 0xd9, 0x37, 0xc6, 0x60, 0x62, 0xae, 0x39, 0xbf, - 0x34, 0xd7, 0xeb, 0x75, 0x74, 0xfe, 0x9e, 0xee, 0x32, 0x64, 0xe9, 0x3e, 0x39, 0xc1, 0xf9, 0x4e, - 0x2d, 0x49, 0xc2, 0x09, 0xc9, 0x30, 0x4a, 0xb7, 0xd3, 0x28, 0xc9, 0xb1, 0x4f, 0x2d, 0x51, 0x1e, - 0x8a, 0x74, 0x92, 0x2a, 0x5c, 0x82, 0xd3, 0xa0, 0x5a, 0x92, 0xe4, 0x14, 0xfa, 0x19, 0x28, 0x78, - 0xfb, 0xe4, 0xa4, 0x67, 0x44, 0xb5, 0xc4, 0x69, 0x2b, 0xc2, 0xdf, 0xdb, 0x19, 0x24, 0x3d, 0x9a, - 0xa8, 0x25, 0xce, 0xd7, 0xa0, 0xe7, 0x60, 0x4c, 0xec, 0xc1, 0x92, 0x9d, 0xe2, 0xd4, 0x12, 0xa6, - 0x94, 0xc8, 0xf4, 0xb1, 0xad, 0x73, 0x92, 0xa3, 0xaa, 0x5a, 0xa2, 0xbc, 0x19, 0xda, 0x80, 0x1c, - 0x0f, 0x7e, 0x13, 0x9d, 0xf4, 0xd4, 0x92, 0x25, 0x8a, 0x88, 0x90, 0xbd, 0xe4, 0x44, 0xd2, 0xe3, - 0xb9, 0x5a, 0xe2, 0x84, 0x21, 0x52, 0x01, 0x7c, 0xfb, 0xe9, 0xc4, 0xe7, 0x6e, 0xb5, 0xe4, 0x89, - 0x40, 0xf4, 0x41, 0xc8, 0xbb, 0xbb, 0xa6, 0x84, 0x27, 0x69, 0xb5, 0xa4, 0xb9, 0xb8, 0xe6, 0x46, - 0xe2, 0x5b, 0x12, 0xf7, 0xc6, 0xde, 0x92, 0xf0, 0x0e, 0xb9, 0xdd, 0x63, 0xf0, 0xbf, 0x48, 0xc1, - 0xf1, 0xf0, 0x71, 0xb2, 0x6a, 0xec, 0x0d, 0xb9, 0x10, 0x30, 0xe4, 0xb6, 0xc8, 0xe3, 0x90, 0x99, - 0x33, 0xf6, 0x48, 0xb0, 0x41, 0xbf, 0xed, 0xd7, 0xb7, 0x3a, 0x22, 0x4d, 0x47, 0xca, 0x1b, 0x56, - 0x27, 0xfa, 0xd6, 0x48, 0x23, 0xfb, 0xfd, 0xcf, 0xd7, 0x47, 0x9a, 0x3b, 0x11, 0xa3, 0x8a, 0xb9, - 0x2b, 0x90, 0x9f, 0x33, 0xf6, 0xc4, 0x35, 0x81, 0x51, 0x3a, 0xa0, 0xc3, 0x1e, 0xff, 0xbf, 0x5e, - 0x22, 0x9c, 0x7d, 0xdf, 0x07, 0xe6, 0x23, 0xce, 0xb1, 0xd2, 0x90, 0x13, 0xfe, 0xf8, 0x1b, 0x03, - 0xb5, 0xe1, 0xd2, 0x94, 0x2e, 0x40, 0x76, 0xde, 0xd4, 0x69, 0xc8, 0xd3, 0xc2, 0x86, 0xd9, 0x15, - 0x39, 0x4f, 0x5a, 0x40, 0xa7, 0x20, 0xa7, 0x76, 0xcd, 0xbe, 0xe1, 0x88, 0xa8, 0x99, 0xb8, 0x92, - 0xff, 0xb6, 0x5f, 0xcf, 0x2c, 0x19, 0x8e, 0xcc, 0xab, 0x1a, 0xd9, 0xef, 0xbe, 0x5a, 0x4f, 0x49, - 0x4f, 0xc1, 0xd8, 0x02, 0xd6, 0x6e, 0x84, 0xd7, 0x02, 0xd6, 0x42, 0xbc, 0x4e, 0x43, 0x7e, 0xc9, - 0x70, 0xd8, 0x47, 0xc3, 0x6e, 0x83, 0x8c, 0x6e, 0xb0, 0x63, 0x91, 0x50, 0xfb, 0x04, 0x4e, 0x50, - 0x17, 0xb0, 0xe6, 0xa2, 0xb6, 0xb0, 0x16, 0x46, 0x25, 0xec, 0x09, 0x5c, 0x6a, 0x42, 0xe9, 0x8a, - 0xda, 0xe1, 0xe1, 0x1e, 0xb6, 0xd1, 0x7d, 0x50, 0x50, 0x45, 0x81, 0xee, 0xac, 0x4a, 0xcd, 0xf2, - 0x0f, 0xf6, 0xeb, 0xe0, 0x21, 0xc9, 0x1e, 0x42, 0x23, 0xfb, 0xf2, 0x7f, 0x3f, 0x99, 0x92, 0x4c, - 0x18, 0xbb, 0xa0, 0xda, 0xd4, 0xd2, 0x3f, 0x18, 0x48, 0xa4, 0xd0, 0x48, 0xb1, 0x79, 0xe4, 0xfa, - 0x7e, 0x7d, 0x72, 0x4f, 0xed, 0x76, 0x1a, 0x92, 0x57, 0x27, 0xf9, 0xf3, 0x2b, 0xb3, 0xbe, 0xfc, - 0x0a, 0x8d, 0x24, 0x9b, 0x53, 0xd7, 0xf7, 0xeb, 0x13, 0x1e, 0x0d, 0xa9, 0x91, 0xdc, 0xa4, 0x8b, - 0xd4, 0x83, 0x1c, 0x0b, 0x7a, 0x23, 0x4f, 0x08, 0x79, 0xca, 0x27, 0xed, 0xa5, 0x7c, 0x1a, 0x87, - 0x4a, 0x33, 0xf0, 0xb8, 0x8c, 0x51, 0x34, 0xb2, 0x1f, 0x7b, 0xb5, 0x3e, 0x22, 0x59, 0x80, 0xd6, - 0xf4, 0x6e, 0xbf, 0xc3, 0x1e, 0x7e, 0x8b, 0xa3, 0xa6, 0x07, 0x59, 0xbf, 0x69, 0x3a, 0x89, 0x05, - 0x64, 0x13, 0xb3, 0x5c, 0x49, 0xb9, 0x40, 0x58, 0x9c, 0xf1, 0xcd, 0xfd, 0x7a, 0x8a, 0xf6, 0x9e, - 0xca, 0xe8, 0x2e, 0xc8, 0xb1, 0x50, 0x9e, 0xc7, 0x3f, 0x65, 0x41, 0xc3, 0xc6, 0x24, 0xf3, 0x5a, - 0xe9, 0x09, 0x18, 0x5b, 0xb1, 0xdb, 0x0b, 0x64, 0x48, 0xc7, 0x21, 0xdf, 0xb5, 0xdb, 0x8a, 0x2f, - 0x9a, 0x1a, 0xeb, 0xda, 0xed, 0xf5, 0x21, 0x51, 0x18, 0x9f, 0x96, 0xf7, 0x42, 0x6e, 0x7d, 0x97, - 0x92, 0x9f, 0x72, 0xa5, 0x94, 0xf1, 0xf7, 0x91, 0x73, 0x0f, 0x10, 0x7d, 0x24, 0x03, 0xb0, 0xbe, - 0xeb, 0x8e, 0x70, 0xc8, 0x11, 0x1c, 0x92, 0x20, 0xe7, 0xec, 0xba, 0x11, 0x75, 0xa1, 0x09, 0xaf, - 0xed, 0xd7, 0x73, 0xeb, 0xbb, 0x64, 0x7b, 0x21, 0xf3, 0x9a, 0x60, 0x2a, 0x2b, 0x13, 0x4a, 0x65, - 0xb9, 0x09, 0xbc, 0x6c, 0x44, 0x02, 0x6f, 0xd4, 0x77, 0x02, 0x70, 0x0c, 0xc6, 0x2c, 0xf5, 0x9a, - 0x42, 0x66, 0x94, 0x7d, 0x85, 0x34, 0x67, 0xa9, 0xd7, 0x96, 0xcd, 0x36, 0x9a, 0x87, 0x6c, 0xc7, - 0x6c, 0x8b, 0xbc, 0xdb, 0x51, 0x31, 0x28, 0x12, 0x71, 0xf1, 0xdb, 0xc4, 0xcb, 0x66, 0xbb, 0x79, - 0x8c, 0xc8, 0xff, 0x4b, 0x7f, 0x5a, 0x9f, 0x08, 0xc2, 0x6d, 0x99, 0x12, 0xbb, 0xc9, 0xc0, 0xfc, - 0xd0, 0x64, 0x60, 0xe1, 0xa0, 0x64, 0x20, 0x04, 0x93, 0x81, 0x77, 0xd0, 0x33, 0x4d, 0x76, 0x86, - 0x33, 0x3d, 0x10, 0x7c, 0xce, 0x19, 0x7b, 0xf4, 0x14, 0xf5, 0x56, 0x28, 0xb8, 0x17, 0x85, 0xf8, - 0x67, 0x9f, 0x3d, 0x00, 0xd7, 0xb7, 0x8f, 0xa5, 0xa0, 0x1c, 0xec, 0x31, 0xcd, 0xe7, 0xd8, 0x6d, - 0xfe, 0xc1, 0x54, 0x96, 0xf6, 0x24, 0x4a, 0xb1, 0x24, 0x32, 0xe5, 0x21, 0x9d, 0x9f, 0x0b, 0xe9, - 0xfc, 0x94, 0x10, 0x10, 0x7b, 0xbb, 0xc3, 0x54, 0x7d, 0x9a, 0x4b, 0xa7, 0xe4, 0x03, 0xda, 0x9e, - 0xea, 0x53, 0x8d, 0xf8, 0x59, 0x28, 0xfa, 0x6a, 0x23, 0x83, 0xfa, 0x47, 0x22, 0x92, 0x1d, 0x93, - 0xee, 0x84, 0x88, 0x1a, 0x71, 0x84, 0xe0, 0xa1, 0xba, 0x8a, 0x5a, 0x70, 0x91, 0x92, 0x5e, 0xaf, - 0x68, 0x2e, 0xfc, 0xc9, 0xb7, 0x4f, 0x8c, 0xbc, 0xfc, 0xda, 0x89, 0x91, 0xa1, 0xf7, 0x33, 0xa5, - 0xf8, 0x2f, 0xcc, 0xbb, 0x5e, 0xe6, 0xe3, 0xef, 0x87, 0x5b, 0x39, 0x8e, 0xed, 0xa8, 0x3b, 0xba, - 0xd1, 0x16, 0x7f, 0xb9, 0xbb, 0x29, 0xf3, 0xd1, 0x70, 0xe8, 0x8d, 0xbb, 0x9d, 0xb7, 0x7a, 0x69, - 0xac, 0x16, 0xe5, 0x0d, 0xa5, 0xfd, 0x2c, 0xa0, 0x15, 0xbb, 0x3d, 0x6f, 0x61, 0xf6, 0xb1, 0x11, - 0xbe, 0x4f, 0x0a, 0x3e, 0xf6, 0xe1, 0x36, 0xea, 0x96, 0xd9, 0xe0, 0x58, 0xdc, 0xef, 0x46, 0x7b, - 0x39, 0xa2, 0xc0, 0x13, 0xa1, 0x45, 0x00, 0x9a, 0x5e, 0xb1, 0x6d, 0x2f, 0x99, 0x57, 0x0f, 0xf3, - 0x98, 0x77, 0x31, 0x64, 0xd5, 0xc1, 0xb6, 0x98, 0x6b, 0x8f, 0x10, 0x7d, 0x08, 0xa6, 0xba, 0xba, - 0xa1, 0xd8, 0xb8, 0xb3, 0xa5, 0xb4, 0x70, 0x87, 0x7e, 0x8a, 0x85, 0x1f, 0xdc, 0x15, 0x9a, 0xcb, - 0xdc, 0x31, 0xdd, 0x15, 0x3f, 0x67, 0xb3, 0x4b, 0x86, 0x73, 0x7d, 0xbf, 0x5e, 0x63, 0xde, 0x21, - 0x82, 0xa5, 0x24, 0x4f, 0x76, 0x75, 0x63, 0x0d, 0x77, 0xb6, 0x16, 0x5c, 0x18, 0x7a, 0x09, 0x26, - 0x39, 0x86, 0xe9, 0x25, 0x3d, 0x88, 0xed, 0x29, 0x35, 0x57, 0xae, 0xef, 0xd7, 0xab, 0x8c, 0xdb, - 0x00, 0x8a, 0xf4, 0x83, 0xfd, 0xfa, 0xfd, 0x09, 0xfa, 0x34, 0xa7, 0x69, 0xc2, 0x3d, 0x56, 0x5c, - 0x26, 0x1c, 0x42, 0xda, 0xf6, 0x12, 0xf4, 0xa2, 0xed, 0xd1, 0x70, 0xdb, 0x03, 0x28, 0x49, 0xdb, - 0xf6, 0xb9, 0x66, 0x2f, 0x83, 0x2f, 0xda, 0x3e, 0x0a, 0xb9, 0x5e, 0x7f, 0x53, 0x9c, 0xa2, 0x15, - 0x64, 0x5e, 0x42, 0x33, 0xfe, 0x83, 0xb4, 0xe2, 0xd9, 0x92, 0x98, 0x4f, 0x12, 0xab, 0xb8, 0x69, - 0x4e, 0x16, 0xfb, 0xd1, 0xe8, 0xe3, 0xab, 0x19, 0xa8, 0xac, 0xd8, 0xed, 0xc5, 0x96, 0xee, 0xdc, - 0x64, 0xf5, 0xea, 0x45, 0x49, 0x87, 0x7a, 0xb3, 0xe6, 0xfc, 0xf5, 0xfd, 0x7a, 0x99, 0x49, 0xe7, - 0x66, 0xca, 0xa4, 0x0b, 0x13, 0x9e, 0x5e, 0x2a, 0x96, 0xea, 0x70, 0xf7, 0xd4, 0x5c, 0x48, 0xa8, - 0x81, 0x0b, 0x58, 0xbb, 0xbe, 0x5f, 0x3f, 0xca, 0x7a, 0x16, 0x62, 0x25, 0xc9, 0x65, 0x2d, 0xb0, - 0x16, 0xd0, 0x6e, 0xb4, 0xe2, 0xd3, 0xf3, 0xa7, 0xe6, 0xc5, 0xb7, 0x51, 0xe9, 0xf9, 0xd4, 0x7d, - 0x25, 0x0d, 0x45, 0xe2, 0xea, 0x19, 0x1c, 0x47, 0x2f, 0x85, 0xd4, 0x8f, 0x70, 0x29, 0xa4, 0xdf, - 0x99, 0xa5, 0x70, 0x8f, 0x1b, 0x6b, 0x67, 0x86, 0xea, 0x7c, 0x30, 0xe4, 0xfe, 0x4f, 0x19, 0x6a, - 0x55, 0xe9, 0x0e, 0x52, 0xc6, 0xad, 0x77, 0x83, 0x00, 0x7f, 0x2e, 0x05, 0x47, 0x3c, 0xf1, 0xd8, - 0x96, 0x16, 0x92, 0xe2, 0x33, 0xd7, 0xf7, 0xeb, 0xb7, 0x86, 0xa5, 0xe8, 0x43, 0xbb, 0x01, 0x49, - 0x4e, 0xb9, 0x8c, 0xd6, 0x2c, 0x2d, 0xba, 0x1f, 0x2d, 0xdb, 0x71, 0xfb, 0x91, 0x19, 0xde, 0x0f, - 0x1f, 0xda, 0x5b, 0xea, 0xc7, 0x82, 0xed, 0x0c, 0x4e, 0x6a, 0x36, 0xe1, 0xa4, 0x7e, 0x2d, 0x0d, - 0xe3, 0x2b, 0x76, 0x7b, 0xc3, 0x68, 0xfd, 0x64, 0x41, 0x1c, 0x76, 0x41, 0x7c, 0x22, 0x05, 0xe5, - 0x8b, 0xba, 0xed, 0x98, 0x96, 0xae, 0xa9, 0x1d, 0xba, 0x9b, 0xf1, 0xee, 0x48, 0xa6, 0x0e, 0x7f, - 0x47, 0xf2, 0x11, 0xc8, 0x5d, 0x55, 0x3b, 0xec, 0xdf, 0x15, 0x65, 0xe8, 0x19, 0x61, 0xc8, 0x77, - 0x84, 0x73, 0xc0, 0x1c, 0x9d, 0x77, 0xe7, 0xb7, 0xd3, 0x30, 0x11, 0x0a, 0x3c, 0x50, 0x13, 0xb2, - 0xd4, 0xa2, 0xb3, 0x0d, 0xef, 0xec, 0x21, 0xe2, 0x0a, 0xb2, 0x27, 0xa6, 0xb4, 0xe8, 0xa7, 0x20, - 0xdf, 0x55, 0x77, 0x99, 0x67, 0x60, 0xfb, 0x9b, 0xb9, 0xc3, 0xf1, 0xf1, 0x76, 0xaf, 0x82, 0x8f, - 0x24, 0x8f, 0x75, 0xd5, 0x5d, 0xea, 0x0f, 0x7a, 0x30, 0x41, 0xa0, 0xda, 0xb6, 0x6a, 0xb4, 0xb1, - 0xdf, 0xfd, 0x5c, 0x3c, 0x74, 0x23, 0x47, 0xbd, 0x46, 0x7c, 0xec, 0x24, 0x79, 0xbc, 0xab, 0xee, - 0xce, 0x53, 0x00, 0x69, 0xb1, 0x91, 0x7f, 0xe5, 0xd5, 0xfa, 0x08, 0x95, 0xd8, 0x7f, 0x48, 0x01, - 0x78, 0x12, 0x43, 0xeb, 0x50, 0x09, 0xb9, 0x2f, 0x71, 0xc7, 0x28, 0x36, 0xc0, 0xf3, 0x36, 0xb6, - 0x13, 0x5a, 0x68, 0x0a, 0x3e, 0x08, 0x45, 0x76, 0x4b, 0x40, 0xa1, 0xc9, 0xf8, 0x74, 0x6c, 0x32, - 0xfe, 0x04, 0xe1, 0x75, 0x7d, 0xbf, 0x8e, 0xd8, 0x70, 0x7c, 0xc4, 0x12, 0x4d, 0xd1, 0x03, 0x83, - 0x10, 0x82, 0xe0, 0x58, 0x8a, 0xbe, 0xd8, 0x82, 0xde, 0x3d, 0x33, 0x0d, 0x7d, 0x07, 0x5b, 0xee, - 0x1e, 0x99, 0x15, 0x51, 0x0d, 0xf2, 0xec, 0xab, 0x82, 0xce, 0x9e, 0xf8, 0x77, 0x15, 0xa2, 0x4c, - 0xa8, 0xae, 0xe1, 0x4d, 0x5b, 0x17, 0xb3, 0x20, 0x8b, 0x22, 0x3a, 0x0f, 0x15, 0x1b, 0x6b, 0x7d, - 0x4b, 0x77, 0xf6, 0x14, 0xcd, 0x34, 0x1c, 0x55, 0x73, 0xb8, 0xd3, 0xbe, 0xe5, 0xfa, 0x7e, 0xfd, - 0x18, 0xeb, 0x6b, 0x18, 0x43, 0x92, 0x27, 0x04, 0x68, 0x9e, 0x41, 0x48, 0x0b, 0x2d, 0xec, 0xa8, - 0x7a, 0xc7, 0xe6, 0x1b, 0x5b, 0x51, 0xf4, 0x8d, 0xe5, 0xb7, 0xc6, 0xfc, 0x87, 0x51, 0xd7, 0xa0, - 0x62, 0xf6, 0xb0, 0x15, 0x61, 0x8f, 0x96, 0xbd, 0x96, 0xc3, 0x18, 0x37, 0x60, 0x12, 0x26, 0x04, - 0x0f, 0x61, 0x11, 0xce, 0x07, 0xee, 0x9c, 0xb1, 0xb8, 0x31, 0x1d, 0x1e, 0x72, 0x18, 0x43, 0xf2, - 0x5f, 0x34, 0x63, 0xd1, 0xe5, 0x51, 0xc8, 0xbd, 0xa0, 0xea, 0x1d, 0xf1, 0xa9, 0x55, 0x99, 0x97, - 0xd0, 0x12, 0xe4, 0x6c, 0x47, 0x75, 0xfa, 0x2c, 0xf4, 0x1e, 0x6d, 0xbe, 0x27, 0x61, 0x9f, 0x9b, - 0xa6, 0xd1, 0x5a, 0xa3, 0x84, 0x32, 0x67, 0x80, 0xce, 0x43, 0xce, 0x31, 0x77, 0xb0, 0xc1, 0x85, - 0x7a, 0xa8, 0x95, 0x4e, 0x13, 0x75, 0x8c, 0x1a, 0x39, 0xe0, 0x19, 0x65, 0xc5, 0xde, 0x56, 0x2d, - 0x6c, 0xb3, 0x50, 0xb9, 0xb9, 0x74, 0xe8, 0xe5, 0x78, 0x2c, 0xec, 0x29, 0x18, 0x3f, 0x49, 0x9e, - 0x70, 0x41, 0x6b, 0x14, 0x12, 0x8e, 0x9c, 0xc7, 0x6e, 0x28, 0x72, 0x3e, 0x0f, 0x95, 0xbe, 0xb1, - 0x69, 0x1a, 0xf4, 0xb3, 0x88, 0x3c, 0x4d, 0x93, 0x3f, 0x99, 0x9a, 0xc9, 0xf8, 0x67, 0x2b, 0x8c, - 0x21, 0xc9, 0x13, 0x2e, 0x88, 0xdf, 0x7e, 0x6c, 0x41, 0xd9, 0xc3, 0xa2, 0x4b, 0xb6, 0x10, 0xbb, - 0x64, 0x6f, 0xe7, 0x4b, 0xf6, 0x48, 0xb8, 0x15, 0x6f, 0xd5, 0x8e, 0xbb, 0x40, 0x42, 0x86, 0xde, - 0x1f, 0xd8, 0x46, 0x02, 0x6f, 0x61, 0xa8, 0x95, 0x49, 0xbe, 0x83, 0x2c, 0xbe, 0x23, 0x3b, 0xc8, - 0x46, 0xe9, 0x63, 0xaf, 0xd6, 0x47, 0xdc, 0x05, 0xfb, 0x0b, 0x69, 0xc8, 0x2d, 0x5c, 0xa1, 0xcf, - 0x28, 0x7f, 0x4c, 0xc3, 0x07, 0x9f, 0xf5, 0x7a, 0x1f, 0x8c, 0x31, 0x59, 0xd8, 0xe8, 0x2c, 0x8c, - 0xf6, 0xc8, 0x0f, 0x9e, 0x6b, 0x3c, 0x3a, 0xa0, 0xd2, 0x14, 0x4f, 0xec, 0x30, 0x29, 0xaa, 0xf4, - 0x85, 0x0c, 0xc0, 0xc2, 0x95, 0x2b, 0xeb, 0x96, 0xde, 0xeb, 0x60, 0xe7, 0x27, 0xe1, 0xf5, 0xbb, - 0x27, 0xbc, 0xf6, 0xcd, 0xf1, 0xd3, 0x50, 0xf4, 0xe6, 0xc8, 0x46, 0x8f, 0x43, 0xde, 0xe1, 0xbf, - 0xf9, 0x54, 0xd7, 0x06, 0xa7, 0x5a, 0xa0, 0xf3, 0xe9, 0x76, 0x29, 0xa4, 0xff, 0x9a, 0x06, 0x88, - 0x4b, 0xce, 0xfc, 0x18, 0x04, 0xe0, 0xe7, 0x21, 0xc7, 0x3d, 0x4e, 0xe6, 0x86, 0xa2, 0x55, 0x4e, - 0xed, 0x9b, 0xa5, 0x6f, 0xa7, 0x61, 0x6a, 0x43, 0x98, 0xdd, 0x9f, 0x48, 0x18, 0x5d, 0x84, 0x31, - 0x6c, 0x38, 0x96, 0x8e, 0x45, 0x1a, 0x7c, 0x26, 0xac, 0xa5, 0x11, 0xd2, 0xa2, 0xff, 0x2e, 0x41, - 0xdc, 0x96, 0xe3, 0xe4, 0x3e, 0x19, 0x7f, 0x32, 0x03, 0xd5, 0x61, 0x54, 0x68, 0x1e, 0x26, 0x34, - 0x0b, 0x53, 0x80, 0xe2, 0x3f, 0x39, 0x69, 0xd6, 0x7c, 0x19, 0xa3, 0x20, 0x82, 0x24, 0x97, 0x05, - 0x84, 0x3b, 0xe4, 0x36, 0x4d, 0x50, 0x91, 0xa5, 0x42, 0xb0, 0x12, 0x06, 0xd1, 0x12, 0xf7, 0xc8, - 0x5e, 0x5a, 0xca, 0xcf, 0x80, 0xb9, 0xe4, 0xb2, 0x07, 0xa5, 0x3e, 0xf9, 0x45, 0x98, 0xd0, 0x0d, - 0xdd, 0xd1, 0xd5, 0x8e, 0xb2, 0xa9, 0x76, 0x54, 0x43, 0xbb, 0x91, 0xad, 0x08, 0xf3, 0xa6, 0xbc, - 0xd9, 0x10, 0x3b, 0x49, 0x2e, 0x73, 0x48, 0x93, 0x01, 0xc8, 0x8c, 0x88, 0xa6, 0xb2, 0x37, 0x14, - 0xb8, 0x09, 0x72, 0xdf, 0x8c, 0xfc, 0x62, 0x06, 0x26, 0xdd, 0xfc, 0xcc, 0x4f, 0xa6, 0x22, 0xe9, - 0x54, 0xac, 0x00, 0x30, 0x03, 0x42, 0x3c, 0xc7, 0x0d, 0xcc, 0x06, 0x31, 0x41, 0x05, 0xc6, 0x61, - 0xc1, 0x76, 0x7c, 0xf3, 0xf1, 0xe7, 0x19, 0x28, 0xf9, 0xe7, 0xe3, 0x27, 0x2e, 0xfd, 0x5d, 0x94, - 0x31, 0x9b, 0xf3, 0x4c, 0x62, 0x96, 0x7f, 0x17, 0x25, 0x64, 0x12, 0x07, 0x96, 0xd2, 0x70, 0x5b, - 0xf8, 0x97, 0x69, 0xc8, 0xf1, 0x7b, 0xd9, 0xda, 0xc0, 0x2e, 0x22, 0x15, 0x77, 0xef, 0xfb, 0xe0, - 0x4d, 0xc4, 0x2b, 0x91, 0x9b, 0x88, 0x72, 0x57, 0xdd, 0x55, 0x02, 0xaf, 0x98, 0x52, 0x33, 0xe3, - 0xcd, 0xe3, 0x1e, 0x97, 0x60, 0x3d, 0xcb, 0x85, 0x78, 0x77, 0x72, 0xd1, 0x23, 0x50, 0x24, 0x18, - 0x9e, 0x57, 0x20, 0xe4, 0x47, 0xbd, 0xe4, 0x83, 0xaf, 0x52, 0x92, 0xa1, 0xab, 0xee, 0x2e, 0xb2, - 0x02, 0x5a, 0x06, 0xb4, 0xed, 0xa6, 0xbe, 0x14, 0x4f, 0x84, 0x84, 0xfe, 0xb6, 0xeb, 0xfb, 0xf5, - 0xe3, 0x8c, 0x7e, 0x10, 0x47, 0x92, 0x27, 0x3d, 0xa0, 0xe0, 0xf6, 0x20, 0x00, 0x19, 0x97, 0xc2, - 0xee, 0x84, 0xb0, 0x2d, 0xac, 0xef, 0xa2, 0x84, 0x57, 0x27, 0xc9, 0x05, 0x52, 0x58, 0x20, 0xbf, - 0x7d, 0x82, 0xff, 0xa5, 0x14, 0x20, 0xcf, 0xf7, 0xb8, 0xe7, 0xf5, 0xef, 0xa7, 0xef, 0x12, 0xc5, - 0xce, 0x28, 0x15, 0xbd, 0xc9, 0xf2, 0xe8, 0xc4, 0x26, 0xcb, 0xb7, 0x54, 0xef, 0xf3, 0xec, 0x73, - 0x7a, 0x68, 0x56, 0x30, 0xc2, 0x06, 0xff, 0x9b, 0x14, 0x1c, 0x1f, 0x50, 0x1c, 0xb7, 0x5f, 0x57, - 0x00, 0x59, 0xbe, 0x4a, 0xfe, 0x1f, 0x8a, 0x52, 0xfc, 0x3f, 0xfe, 0x25, 0xd4, 0xbf, 0x49, 0x6b, - 0xc0, 0xc6, 0xdf, 0x3c, 0x6f, 0xc2, 0x33, 0x8a, 0x29, 0x98, 0xf6, 0x37, 0xef, 0x0e, 0xe0, 0x3c, - 0x94, 0xfc, 0xad, 0xf3, 0xae, 0xdf, 0x7a, 0x50, 0xd7, 0x79, 0xaf, 0x03, 0x74, 0x68, 0xc9, 0x5b, - 0x7d, 0xe2, 0x9f, 0x4e, 0xc6, 0x8d, 0xde, 0xbd, 0xc8, 0x16, 0x5a, 0x85, 0xac, 0xc7, 0xff, 0x3f, - 0x05, 0xd9, 0x55, 0xd3, 0xec, 0x20, 0x13, 0x26, 0x0d, 0xd3, 0x51, 0x88, 0xb2, 0xe0, 0x96, 0xc2, - 0x73, 0x23, 0x2c, 0x0b, 0x3a, 0x7f, 0x38, 0xa1, 0x7c, 0x6f, 0xbf, 0x3e, 0xc8, 0x4a, 0x9e, 0x30, - 0x4c, 0xa7, 0x49, 0x21, 0xeb, 0x2c, 0x73, 0xf2, 0x21, 0x18, 0x0f, 0x36, 0xc6, 0x32, 0x45, 0xcf, - 0x1e, 0xba, 0xb1, 0x20, 0x9b, 0xeb, 0xfb, 0xf5, 0x69, 0x6f, 0x11, 0xb8, 0x60, 0x49, 0x2e, 0x6d, - 0xfa, 0x5a, 0x6f, 0xe4, 0xc9, 0xe8, 0xbf, 0xff, 0x6a, 0x3d, 0xd5, 0x3c, 0x3f, 0xf4, 0x06, 0xc0, - 0x7d, 0x07, 0x76, 0x61, 0xd7, 0x3d, 0xea, 0x0f, 0xde, 0x05, 0xf8, 0xee, 0x19, 0xa8, 0x85, 0xee, - 0x02, 0xd0, 0x77, 0xc8, 0x43, 0x6e, 0x02, 0x1c, 0xfc, 0x0f, 0xfc, 0x87, 0x5c, 0x14, 0x38, 0xf0, - 0xb2, 0x81, 0xb4, 0x03, 0x47, 0xe9, 0x55, 0x4e, 0xcf, 0x6c, 0x89, 0xaf, 0xc4, 0x1c, 0x75, 0x13, - 0x68, 0x29, 0xfe, 0xff, 0xc2, 0x59, 0x36, 0xec, 0x31, 0x00, 0xaf, 0x65, 0xf7, 0xc1, 0x0d, 0xef, - 0x29, 0xeb, 0x3d, 0xfb, 0x47, 0xfe, 0x94, 0x8d, 0xec, 0x43, 0x96, 0x7e, 0x35, 0x05, 0xc7, 0x06, - 0x5a, 0xe3, 0x5a, 0xff, 0x64, 0xe0, 0xc1, 0x68, 0x2a, 0x59, 0x8e, 0xde, 0xff, 0xe5, 0x87, 0x46, - 0x44, 0xbf, 0x6a, 0x51, 0xfd, 0x62, 0x0d, 0x06, 0x3a, 0xf6, 0x22, 0x1c, 0x09, 0xf6, 0x4b, 0x08, - 0xe1, 0x39, 0x28, 0x07, 0x77, 0x0b, 0x3c, 0x94, 0x78, 0xcf, 0xe1, 0x3d, 0xe4, 0x78, 0x60, 0xc7, - 0x20, 0x3d, 0x1b, 0x16, 0xbc, 0x2b, 0x89, 0xf7, 0x0d, 0x5e, 0xbe, 0x8f, 0x15, 0x84, 0xef, 0x6d, - 0xd6, 0x57, 0x52, 0x70, 0x32, 0xc8, 0xd9, 0x33, 0xc2, 0xf6, 0xdb, 0x3e, 0xae, 0xb7, 0xa2, 0x1e, - 0xff, 0x39, 0x05, 0xb7, 0x1f, 0xd0, 0x73, 0x2e, 0x1e, 0x0b, 0xa6, 0x7d, 0xd6, 0xdd, 0xe2, 0x60, - 0xa1, 0x32, 0xd2, 0x70, 0x0f, 0xe4, 0x1a, 0xb7, 0x5b, 0xf8, 0x55, 0xa4, 0xa9, 0xc1, 0x3a, 0x5b, - 0x9e, 0x1a, 0xb4, 0xc8, 0x6f, 0x4d, 0xb7, 0xbe, 0x9e, 0x82, 0xd3, 0xc1, 0x51, 0x45, 0xec, 0xe8, - 0xde, 0xdd, 0x13, 0xf3, 0x6f, 0x53, 0x70, 0x4f, 0x92, 0x21, 0xf0, 0x19, 0x7a, 0x1e, 0xa6, 0xbc, - 0xf8, 0x2a, 0x3c, 0x41, 0xa7, 0x12, 0xec, 0x8a, 0xb9, 0x52, 0x23, 0x97, 0xcb, 0xcd, 0x99, 0x89, - 0x3f, 0x4a, 0xf1, 0x35, 0xe7, 0x9f, 0x77, 0x57, 0xec, 0xc1, 0x2d, 0xc1, 0x21, 0xc5, 0xee, 0xdb, - 0x16, 0x8c, 0x07, 0xb6, 0x05, 0x11, 0x13, 0x9a, 0xbe, 0x49, 0x16, 0xe4, 0xe7, 0x85, 0x35, 0x8d, - 0x08, 0xce, 0x76, 0x60, 0x2a, 0x62, 0x91, 0xb8, 0x2f, 0x4e, 0xe3, 0xd7, 0xc8, 0xd1, 0x1f, 0xec, - 0xd7, 0x23, 0xa2, 0x3e, 0x19, 0x0d, 0x2e, 0x0f, 0xe9, 0xbf, 0xa4, 0xa0, 0x4e, 0x3b, 0x12, 0x31, - 0x95, 0x7f, 0x93, 0x05, 0x8c, 0xb9, 0x21, 0x8d, 0x1c, 0x16, 0x17, 0xf4, 0x1c, 0xe4, 0x98, 0x96, - 0x72, 0xd9, 0x1e, 0x42, 0xbd, 0x39, 0xa1, 0x67, 0xb0, 0x17, 0xc4, 0xb8, 0xa2, 0xed, 0xc2, 0xdb, - 0x24, 0xbf, 0xb7, 0x60, 0x17, 0xfe, 0xb5, 0x30, 0xd8, 0xd1, 0x3d, 0xe7, 0x22, 0xfa, 0xe0, 0x5b, - 0x36, 0xd8, 0xfc, 0x4b, 0x42, 0x6f, 0x9b, 0x65, 0x76, 0xbb, 0x1f, 0x63, 0x99, 0xdf, 0x7d, 0x33, - 0xe0, 0x5a, 0xe6, 0x98, 0x21, 0xbc, 0xcb, 0x2d, 0xf3, 0xf5, 0x34, 0x1c, 0xa7, 0xc3, 0xf0, 0xef, - 0x48, 0xde, 0x01, 0xc9, 0x2b, 0x80, 0x6c, 0x4b, 0x53, 0x6e, 0x96, 0xfd, 0xa8, 0xd8, 0x96, 0x76, - 0x25, 0xe0, 0x74, 0x15, 0x40, 0x2d, 0xdb, 0x09, 0x37, 0x90, 0xb9, 0xe1, 0x06, 0x5a, 0xb6, 0x73, - 0xe5, 0x00, 0xaf, 0x9e, 0x3d, 0x8c, 0xee, 0xfc, 0x41, 0x0a, 0x6a, 0x51, 0x42, 0xe7, 0xba, 0xa2, - 0xc2, 0xd1, 0xc0, 0x3e, 0x3a, 0xac, 0x2e, 0x77, 0x1c, 0xb4, 0x9b, 0x0c, 0x2d, 0xdd, 0x23, 0x16, - 0xbe, 0xd9, 0x8b, 0xf7, 0xcb, 0xc2, 0xe9, 0xb8, 0x9a, 0x3f, 0xb8, 0x85, 0x79, 0x57, 0x2e, 0xd9, - 0xdf, 0x18, 0x30, 0xf7, 0xef, 0xb6, 0xdd, 0xd0, 0x1f, 0xa7, 0xe0, 0xc4, 0x90, 0x1e, 0xfe, 0x4d, - 0x76, 0xe7, 0x3f, 0x3b, 0x54, 0x61, 0x6e, 0xd6, 0xd6, 0xeb, 0x41, 0xbe, 0xa0, 0x82, 0xf7, 0xd6, - 0x7c, 0x1b, 0xea, 0xc8, 0x6f, 0xcc, 0x3d, 0x03, 0xb7, 0x44, 0x52, 0xf1, 0x3e, 0x9d, 0x85, 0xec, - 0xb6, 0x6e, 0x3b, 0xee, 0x87, 0x17, 0x42, 0xdd, 0x09, 0x51, 0x51, 0x5c, 0x09, 0x41, 0x85, 0xb2, - 0x5c, 0x35, 0xcd, 0x0e, 0x6f, 0x5e, 0x9a, 0x87, 0x49, 0x1f, 0x8c, 0x33, 0x9f, 0x85, 0x6c, 0xcf, - 0x34, 0x3b, 0x9c, 0xf9, 0x74, 0x98, 0x39, 0xc1, 0xe5, 0xc3, 0xa4, 0x78, 0xd2, 0x34, 0x20, 0xc6, - 0x84, 0x7d, 0x12, 0x84, 0xb3, 0xfe, 0x68, 0x0a, 0xa6, 0x02, 0x60, 0xf7, 0xd1, 0x52, 0x2e, 0xf0, - 0x35, 0xa9, 0x81, 0x23, 0x7a, 0x86, 0xef, 0x3e, 0x4f, 0x67, 0xd9, 0xdd, 0xb7, 0xa0, 0xba, 0x67, - 0xff, 0xb0, 0x24, 0x5e, 0xb9, 0x2a, 0x00, 0xbe, 0x54, 0xec, 0x5d, 0xe1, 0x96, 0xa3, 0x93, 0x1e, - 0xb5, 0xbb, 0x63, 0xf1, 0x78, 0xcc, 0x3b, 0x82, 0x7e, 0xca, 0x7f, 0x8d, 0xea, 0xce, 0x83, 0xe9, - 0x04, 0xfb, 0xbb, 0xe2, 0xd0, 0x5c, 0xee, 0x7f, 0x0b, 0xa6, 0xa3, 0x76, 0xc1, 0xe8, 0x81, 0x83, - 0x39, 0x0c, 0xc6, 0x2d, 0xb5, 0xf7, 0x1c, 0x82, 0xc2, 0x6d, 0xfe, 0x95, 0x14, 0xdc, 0x76, 0xe0, - 0x66, 0x0f, 0x3d, 0x76, 0x30, 0xdb, 0x03, 0x22, 0xa9, 0x5a, 0xe3, 0x46, 0x48, 0xdd, 0xae, 0x29, - 0x81, 0xf3, 0xfc, 0x68, 0x89, 0x0e, 0xec, 0x3f, 0x86, 0x4c, 0xec, 0x60, 0xac, 0x29, 0x8d, 0xa0, - 0x97, 0xa2, 0xcf, 0xb5, 0xcf, 0x44, 0x72, 0x18, 0xbe, 0xe5, 0xa9, 0x3d, 0x90, 0x9c, 0xc0, 0x3f, - 0xed, 0x51, 0xb1, 0xf4, 0x90, 0x69, 0x3f, 0x60, 0xc3, 0x30, 0x64, 0xda, 0x0f, 0x0a, 0xd4, 0xf9, - 0xb4, 0x1f, 0x18, 0x49, 0x0e, 0x99, 0xf6, 0x24, 0x01, 0xf4, 0x90, 0x69, 0x4f, 0x14, 0xb8, 0x4a, - 0x23, 0x68, 0x1b, 0xc6, 0x03, 0x71, 0x0a, 0x3a, 0x1d, 0xc9, 0x2e, 0x2a, 0x80, 0xac, 0xdd, 0x93, - 0x04, 0xd5, 0x3f, 0xff, 0x11, 0xae, 0x79, 0xc8, 0xfc, 0x0f, 0x8f, 0x3e, 0x6a, 0x0f, 0x24, 0x27, - 0x70, 0xdb, 0xbe, 0xe6, 0x1e, 0xb5, 0xf8, 0x10, 0xd0, 0x6c, 0x42, 0x4e, 0xa2, 0xe5, 0x33, 0x89, - 0xf1, 0xdd, 0x86, 0x77, 0x06, 0x6e, 0x5b, 0x47, 0x0b, 0x2d, 0xd2, 0xb5, 0xd5, 0xee, 0x4d, 0x84, - 0xeb, 0x36, 0xb6, 0xc2, 0xcf, 0x11, 0x4e, 0x46, 0x92, 0xf9, 0x9c, 0x56, 0xed, 0xf6, 0x03, 0x30, - 0x5c, 0x76, 0x6b, 0xee, 0xc1, 0xa0, 0x14, 0x8d, 0xee, 0x77, 0x56, 0xb5, 0x53, 0x07, 0xe2, 0x08, - 0xa6, 0x37, 0x3b, 0xd5, 0xff, 0xd7, 0x01, 0x00, 0x00, 0xff, 0xff, 0x6c, 0x4d, 0xac, 0xd7, 0x80, - 0x97, 0x00, 0x00, + 0x75, 0x18, 0xf6, 0x03, 0xfb, 0xf1, 0x76, 0xb1, 0xbb, 0x18, 0xe0, 0x70, 0x7b, 0x4b, 0x12, 0x7b, + 0x9c, 0x23, 0x79, 0x38, 0x7e, 0xe0, 0xa8, 0x13, 0xbf, 0x6e, 0x8f, 0x22, 0x85, 0x05, 0x70, 0x77, + 0x20, 0x81, 0x03, 0x38, 0x00, 0x8e, 0x14, 0x65, 0x7b, 0x3c, 0x98, 0x6d, 0x2c, 0x86, 0xd8, 0x9d, + 0x59, 0xce, 0xcc, 0xde, 0x01, 0x2c, 0xa5, 0x8a, 0x29, 0xc9, 0x96, 0xe4, 0xc8, 0x96, 0x9c, 0x38, + 0x8e, 0xac, 0x48, 0x32, 0xa5, 0x54, 0x22, 0x47, 0x49, 0xfc, 0x91, 0x38, 0xfa, 0xb0, 0xf3, 0x43, + 0x29, 0x27, 0xb1, 0x52, 0xe5, 0x4a, 0x49, 0x89, 0x93, 0x72, 0xa5, 0x52, 0xb0, 0x45, 0xaa, 0xca, + 0x8a, 0xc2, 0x24, 0xca, 0x85, 0x76, 0xb9, 0xa4, 0x1f, 0x49, 0xf5, 0xd7, 0x7c, 0xed, 0x2c, 0x66, + 0x70, 0x3c, 0x52, 0x74, 0x89, 0xbf, 0xb0, 0xfd, 0xfa, 0xbd, 0xd7, 0xdd, 0xaf, 0x5f, 0xbf, 0xf7, + 0xfa, 0x75, 0xf7, 0x00, 0xbe, 0x9c, 0x84, 0x3b, 0x54, 0xc3, 0xea, 0x1a, 0xd6, 0xd9, 0x17, 0xfb, + 0xc8, 0xdc, 0x3f, 0xdb, 0x53, 0xda, 0x9a, 0xae, 0xd8, 0x9a, 0xa1, 0xcf, 0xf6, 0x4c, 0xc3, 0x36, + 0x84, 0x22, 0xad, 0x9e, 0x25, 0xd5, 0xa2, 0x0e, 0x85, 0x35, 0xa5, 0x8d, 0x24, 0xf4, 0x62, 0x1f, + 0x59, 0xb6, 0x50, 0x81, 0xd4, 0x2e, 0xda, 0xaf, 0x26, 0x4e, 0x26, 0x66, 0x8a, 0x12, 0xfe, 0x29, + 0x4c, 0x41, 0xc6, 0xd8, 0xde, 0xb6, 0x90, 0x5d, 0x4d, 0x9e, 0x4c, 0xcc, 0xa4, 0x25, 0x56, 0x12, + 0x26, 0x61, 0xb4, 0xa3, 0x75, 0x35, 0xbb, 0x9a, 0x22, 0x60, 0x5a, 0x10, 0xea, 0x50, 0x50, 0x8d, + 0xbe, 0x6e, 0xcb, 0xb6, 0x61, 0x2b, 0x9d, 0x6a, 0xfa, 0x64, 0x62, 0x26, 0x27, 0x01, 0x01, 0x6d, + 0x60, 0x88, 0xf8, 0x24, 0x14, 0x69, 0x7b, 0x56, 0xcf, 0xd0, 0x2d, 0x24, 0x9c, 0x80, 0x9c, 0x8e, + 0xf6, 0x6c, 0xd9, 0x6d, 0x35, 0x8b, 0xcb, 0x4f, 0xa3, 0x7d, 0xdc, 0x02, 0xe5, 0x42, 0x1b, 0xa6, + 0x85, 0x66, 0xf3, 0x9b, 0xaf, 0x4e, 0x27, 0xbe, 0xf5, 0xea, 0x74, 0xe2, 0xcf, 0x5e, 0x9d, 0x4e, + 0x7c, 0xea, 0xb5, 0xe9, 0x91, 0x6f, 0xbd, 0x36, 0x3d, 0xf2, 0x27, 0xaf, 0x4d, 0x8f, 0x3c, 0x3f, + 0xd3, 0xd6, 0xec, 0x9d, 0xfe, 0xd6, 0xac, 0x6a, 0x74, 0xcf, 0x32, 0x11, 0xd0, 0x3f, 0x0f, 0x58, + 0xad, 0xdd, 0xb3, 0xf6, 0x7e, 0x0f, 0x31, 0x99, 0x6c, 0x65, 0x88, 0x24, 0xde, 0x0b, 0x7f, 0x70, + 0x01, 0x4e, 0xb6, 0x0d, 0xa3, 0xdd, 0x41, 0x67, 0x09, 0x64, 0xab, 0xbf, 0x7d, 0xb6, 0x85, 0x2c, + 0xd5, 0xd4, 0x7a, 0xb6, 0x61, 0x32, 0x79, 0x95, 0x29, 0xc6, 0x2c, 0xc7, 0x10, 0x57, 0x60, 0xfc, + 0xa2, 0xd6, 0x41, 0x0b, 0x0e, 0xe2, 0x3a, 0xb2, 0x85, 0xc7, 0x20, 0xbd, 0xad, 0x75, 0x50, 0x35, + 0x71, 0x32, 0x35, 0x53, 0x38, 0x77, 0xd7, 0x6c, 0x80, 0x68, 0xd6, 0x4f, 0xb1, 0x86, 0xc1, 0x12, + 0xa1, 0x10, 0xbf, 0x9b, 0x86, 0x89, 0x90, 0x5a, 0x41, 0x80, 0xb4, 0xae, 0x74, 0x11, 0x91, 0x4a, + 0x5e, 0x22, 0xbf, 0x85, 0x2a, 0x64, 0x7b, 0x8a, 0xba, 0xab, 0xb4, 0x11, 0x11, 0x4a, 0x5e, 0xe2, + 0x45, 0x61, 0x1a, 0xa0, 0x85, 0x7a, 0x48, 0x6f, 0x21, 0x5d, 0xdd, 0xaf, 0xa6, 0x4e, 0xa6, 0x66, + 0xf2, 0x92, 0x07, 0x22, 0xdc, 0x07, 0xe3, 0xbd, 0xfe, 0x56, 0x47, 0x53, 0x65, 0x0f, 0x1a, 0x9c, + 0x4c, 0xcd, 0x8c, 0x4a, 0x15, 0x5a, 0xb1, 0xe0, 0x22, 0x9f, 0x86, 0xf2, 0x75, 0xa4, 0xec, 0x7a, + 0x51, 0x0b, 0x04, 0xb5, 0x84, 0xc1, 0x1e, 0xc4, 0x79, 0x28, 0x76, 0x91, 0x65, 0x29, 0x6d, 0x24, + 0x63, 0xf9, 0x56, 0xd3, 0x64, 0xf4, 0x27, 0x07, 0x46, 0x1f, 0x1c, 0x79, 0x81, 0x51, 0x6d, 0xec, + 0xf7, 0x90, 0x30, 0x07, 0x79, 0xa4, 0xf7, 0xbb, 0x94, 0xc3, 0xe8, 0x10, 0xf9, 0x2d, 0xea, 0xfd, + 0x6e, 0x90, 0x4b, 0x0e, 0x93, 0x31, 0x16, 0x59, 0x0b, 0x99, 0xd7, 0x34, 0x15, 0x55, 0x33, 0x84, + 0xc1, 0xe9, 0x01, 0x06, 0xeb, 0xb4, 0x3e, 0xc8, 0x83, 0xd3, 0x09, 0xf3, 0x90, 0x47, 0x7b, 0x36, + 0xd2, 0x2d, 0xcd, 0xd0, 0xab, 0x59, 0xc2, 0xe4, 0xee, 0x90, 0x59, 0x44, 0x9d, 0x56, 0x90, 0x85, + 0x4b, 0x27, 0x3c, 0x02, 0x59, 0xa3, 0x87, 0xd7, 0x9a, 0x55, 0xcd, 0x9d, 0x4c, 0xcc, 0x14, 0xce, + 0xdd, 0x1e, 0xaa, 0x08, 0xab, 0x14, 0x47, 0xe2, 0xc8, 0xc2, 0x12, 0x54, 0x2c, 0xa3, 0x6f, 0xaa, + 0x48, 0x56, 0x8d, 0x16, 0x92, 0x35, 0x7d, 0xdb, 0xa8, 0xe6, 0x09, 0x83, 0xfa, 0xe0, 0x40, 0x08, + 0xe2, 0xbc, 0xd1, 0x42, 0x4b, 0xfa, 0xb6, 0x21, 0x95, 0x2c, 0x5f, 0x19, 0xaf, 0x57, 0x6b, 0x5f, + 0xb7, 0x95, 0xbd, 0x6a, 0x91, 0x68, 0x08, 0x2b, 0x89, 0x5f, 0xcf, 0x40, 0x39, 0x8e, 0x8a, 0x5d, + 0x80, 0xd1, 0x6d, 0x3c, 0xca, 0x6a, 0xf2, 0x28, 0x32, 0xa0, 0x34, 0x7e, 0x21, 0x66, 0x6e, 0x52, + 0x88, 0x73, 0x50, 0xd0, 0x91, 0x65, 0xa3, 0x16, 0xd5, 0x88, 0x54, 0x4c, 0x9d, 0x02, 0x4a, 0x34, + 0xa8, 0x52, 0xe9, 0x9b, 0x52, 0xa9, 0xe7, 0xa0, 0xec, 0x74, 0x49, 0x36, 0x15, 0xbd, 0xcd, 0x75, + 0xf3, 0x6c, 0x54, 0x4f, 0x66, 0x17, 0x39, 0x9d, 0x84, 0xc9, 0xa4, 0x12, 0xf2, 0x95, 0x85, 0x05, + 0x00, 0x43, 0x47, 0xc6, 0xb6, 0xdc, 0x42, 0x6a, 0xa7, 0x9a, 0x1b, 0x22, 0xa5, 0x55, 0x8c, 0x32, + 0x20, 0x25, 0x83, 0x42, 0xd5, 0x8e, 0x70, 0xde, 0x55, 0xb5, 0xec, 0x10, 0x4d, 0x59, 0xa1, 0x8b, + 0x6c, 0x40, 0xdb, 0x36, 0xa1, 0x64, 0x22, 0xac, 0xf7, 0xa8, 0xc5, 0x46, 0x96, 0x27, 0x9d, 0x98, + 0x8d, 0x1c, 0x99, 0xc4, 0xc8, 0xe8, 0xc0, 0xc6, 0x4c, 0x6f, 0x51, 0x38, 0x05, 0x0e, 0x40, 0x26, + 0x6a, 0x05, 0xc4, 0x0a, 0x15, 0x39, 0xf0, 0x8a, 0xd2, 0x45, 0xb5, 0x97, 0xa0, 0xe4, 0x17, 0x0f, + 0x36, 0xf3, 0x96, 0xad, 0x98, 0x36, 0xd1, 0xc2, 0x51, 0x89, 0x16, 0xb0, 0x23, 0x42, 0x7a, 0x8b, + 0x58, 0xb9, 0x51, 0x09, 0xff, 0x14, 0xde, 0xef, 0x0e, 0x38, 0x45, 0x06, 0x7c, 0xcf, 0xe0, 0x8c, + 0xfa, 0x38, 0x07, 0xc7, 0x5d, 0x7b, 0x14, 0xc6, 0x7c, 0x03, 0x88, 0xdb, 0xb4, 0xf8, 0x21, 0x38, + 0x16, 0xca, 0x5a, 0x78, 0x0e, 0x26, 0xfb, 0xba, 0xa6, 0xdb, 0xc8, 0xec, 0x99, 0x08, 0x6b, 0x2c, + 0x6d, 0xaa, 0xfa, 0xe7, 0xd9, 0x21, 0x3a, 0xb7, 0xe9, 0xc5, 0xa6, 0x5c, 0xa4, 0x89, 0xfe, 0x20, + 0xf0, 0xde, 0x7c, 0xee, 0x7b, 0xd9, 0xca, 0xcb, 0x2f, 0xbf, 0xfc, 0x72, 0x52, 0xfc, 0xd7, 0x19, + 0x98, 0x0c, 0x5b, 0x33, 0xa1, 0xcb, 0x77, 0x0a, 0x32, 0x7a, 0xbf, 0xbb, 0x85, 0x4c, 0x22, 0xa4, + 0x51, 0x89, 0x95, 0x84, 0x39, 0x18, 0xed, 0x28, 0x5b, 0x88, 0xba, 0xe4, 0xd2, 0xb9, 0xfb, 0x62, + 0xad, 0xca, 0xd9, 0x65, 0x4c, 0x22, 0x51, 0x4a, 0xe1, 0x09, 0x48, 0x33, 0x13, 0x8d, 0x39, 0xdc, + 0x1b, 0x8f, 0x03, 0x5e, 0x4b, 0x12, 0xa1, 0x13, 0x6e, 0x83, 0x3c, 0xfe, 0x4b, 0x75, 0x23, 0x43, + 0xfa, 0x9c, 0xc3, 0x00, 0xac, 0x17, 0x42, 0x0d, 0x72, 0x64, 0x99, 0xb4, 0x10, 0x77, 0x6d, 0x4e, + 0x19, 0x2b, 0x56, 0x0b, 0x6d, 0x2b, 0xfd, 0x8e, 0x2d, 0x5f, 0x53, 0x3a, 0x7d, 0x44, 0x14, 0x3e, + 0x2f, 0x15, 0x19, 0xf0, 0x2a, 0x86, 0xe1, 0xc8, 0x83, 0xae, 0x2a, 0x4d, 0x6f, 0xa1, 0x3d, 0x62, + 0x3d, 0x47, 0x25, 0xba, 0xd0, 0x96, 0x30, 0x04, 0x37, 0xff, 0x82, 0x65, 0xe8, 0x5c, 0x35, 0x49, + 0x13, 0x18, 0x40, 0x9a, 0x7f, 0x34, 0x68, 0xb8, 0xef, 0x08, 0x1f, 0xde, 0xc0, 0x5a, 0x3a, 0x0d, + 0x65, 0x1a, 0x4c, 0xb0, 0xa9, 0x57, 0x3a, 0xd5, 0x71, 0x12, 0xf4, 0x94, 0x28, 0x78, 0x95, 0x41, + 0xc5, 0xaf, 0x24, 0x21, 0x4d, 0x0c, 0x4b, 0x19, 0x0a, 0x1b, 0x1f, 0x58, 0x5b, 0x94, 0x17, 0x56, + 0x37, 0x9b, 0xcb, 0x8b, 0x95, 0x84, 0x50, 0x02, 0x20, 0x80, 0x8b, 0xcb, 0xab, 0x73, 0x1b, 0x95, + 0xa4, 0x53, 0x5e, 0xba, 0xb2, 0xf1, 0xc8, 0x43, 0x95, 0x94, 0x43, 0xb0, 0x49, 0x01, 0x69, 0x2f, + 0xc2, 0x7b, 0xcf, 0x55, 0x46, 0x85, 0x0a, 0x14, 0x29, 0x83, 0xa5, 0xe7, 0x16, 0x17, 0x1e, 0x79, + 0xa8, 0x92, 0xf1, 0x43, 0xde, 0x7b, 0xae, 0x92, 0x15, 0xc6, 0x20, 0x4f, 0x20, 0xcd, 0xd5, 0xd5, + 0xe5, 0x4a, 0xce, 0xe1, 0xb9, 0xbe, 0x21, 0x2d, 0x5d, 0xb9, 0x54, 0xc9, 0x3b, 0x3c, 0x2f, 0x49, + 0xab, 0x9b, 0x6b, 0x15, 0x70, 0x38, 0xac, 0x2c, 0xae, 0xaf, 0xcf, 0x5d, 0x5a, 0xac, 0x14, 0x1c, + 0x8c, 0xe6, 0x07, 0x36, 0x16, 0xd7, 0x2b, 0x45, 0x5f, 0xb7, 0xde, 0x7b, 0xae, 0x32, 0xe6, 0x34, + 0xb1, 0x78, 0x65, 0x73, 0xa5, 0x52, 0x12, 0xc6, 0x61, 0x8c, 0x36, 0xc1, 0x3b, 0x51, 0x0e, 0x80, + 0x1e, 0x79, 0xa8, 0x52, 0x71, 0x3b, 0x42, 0xb9, 0x8c, 0xfb, 0x00, 0x8f, 0x3c, 0x54, 0x11, 0xc4, + 0x79, 0x18, 0x25, 0x6a, 0x28, 0x08, 0x50, 0x5a, 0x9e, 0x6b, 0x2e, 0x2e, 0xcb, 0xab, 0x6b, 0x1b, + 0x4b, 0xab, 0x57, 0xe6, 0x96, 0x2b, 0x09, 0x17, 0x26, 0x2d, 0x3e, 0xb3, 0xb9, 0x24, 0x2d, 0x2e, + 0x54, 0x92, 0x5e, 0xd8, 0xda, 0xe2, 0xdc, 0xc6, 0xe2, 0x42, 0x25, 0x25, 0xaa, 0x30, 0x19, 0x66, + 0x50, 0x43, 0x97, 0x90, 0x47, 0x17, 0x92, 0x43, 0x74, 0x81, 0xf0, 0x0a, 0xea, 0x82, 0xf8, 0x5a, + 0x12, 0x26, 0x42, 0x9c, 0x4a, 0x68, 0x23, 0x4f, 0xc2, 0x28, 0xd5, 0x65, 0xea, 0x66, 0xcf, 0x84, + 0x7a, 0x27, 0xa2, 0xd9, 0x03, 0xae, 0x96, 0xd0, 0x79, 0x43, 0x8d, 0xd4, 0x90, 0x50, 0x03, 0xb3, + 0x18, 0x50, 0xd8, 0x9f, 0x1e, 0x30, 0xfe, 0xd4, 0x3f, 0x3e, 0x12, 0xc7, 0x3f, 0x12, 0xd8, 0xd1, + 0x9c, 0xc0, 0x68, 0x88, 0x13, 0xb8, 0x00, 0xe3, 0x03, 0x8c, 0x62, 0x1b, 0xe3, 0x0f, 0x27, 0xa0, + 0x3a, 0x4c, 0x38, 0x11, 0x26, 0x31, 0xe9, 0x33, 0x89, 0x17, 0x82, 0x12, 0xbc, 0x73, 0xf8, 0x24, + 0x0c, 0xcc, 0xf5, 0x97, 0x12, 0x30, 0x15, 0x1e, 0x52, 0x86, 0xf6, 0xe1, 0x09, 0xc8, 0x74, 0x91, + 0xbd, 0x63, 0xf0, 0xb0, 0xea, 0x9e, 0x10, 0x67, 0x8d, 0xab, 0x83, 0x93, 0xcd, 0xa8, 0xbc, 0xde, + 0x3e, 0x35, 0x2c, 0x2e, 0xa4, 0xbd, 0x19, 0xe8, 0xe9, 0xc7, 0x93, 0x70, 0x2c, 0x94, 0x79, 0x68, + 0x47, 0xef, 0x00, 0xd0, 0xf4, 0x5e, 0xdf, 0xa6, 0xa1, 0x13, 0xb5, 0xc4, 0x79, 0x02, 0x21, 0xc6, + 0x0b, 0x5b, 0xd9, 0xbe, 0xed, 0xd4, 0xa7, 0x48, 0x3d, 0x50, 0x10, 0x41, 0x78, 0xcc, 0xed, 0x68, + 0x9a, 0x74, 0x74, 0x7a, 0xc8, 0x48, 0x07, 0x14, 0xf3, 0x41, 0xa8, 0xa8, 0x1d, 0x0d, 0xe9, 0xb6, + 0x6c, 0xd9, 0x26, 0x52, 0xba, 0x9a, 0xde, 0x26, 0xae, 0x26, 0xd7, 0x18, 0xdd, 0x56, 0x3a, 0x16, + 0x92, 0xca, 0xb4, 0x7a, 0x9d, 0xd7, 0x62, 0x0a, 0xa2, 0x40, 0xa6, 0x87, 0x22, 0xe3, 0xa3, 0xa0, + 0xd5, 0x0e, 0x85, 0xf8, 0xcb, 0x79, 0x28, 0x78, 0x02, 0x70, 0xe1, 0x4e, 0x28, 0xbe, 0xa0, 0x5c, + 0x53, 0x64, 0xbe, 0xa9, 0xa2, 0x92, 0x28, 0x60, 0xd8, 0x1a, 0xdb, 0x58, 0x3d, 0x08, 0x93, 0x04, + 0xc5, 0xe8, 0xdb, 0xc8, 0x94, 0xd5, 0x8e, 0x62, 0x59, 0x44, 0x68, 0x39, 0x82, 0x2a, 0xe0, 0xba, + 0x55, 0x5c, 0x35, 0xcf, 0x6b, 0x84, 0x87, 0x61, 0x82, 0x50, 0x74, 0xfb, 0x1d, 0x5b, 0xeb, 0x75, + 0x90, 0x8c, 0xb7, 0x79, 0x16, 0x71, 0x39, 0x4e, 0xcf, 0xc6, 0x31, 0xc6, 0x0a, 0x43, 0xc0, 0x3d, + 0xb2, 0x84, 0x05, 0xb8, 0x83, 0x90, 0xb5, 0x91, 0x8e, 0x4c, 0xc5, 0x46, 0x32, 0x7a, 0xb1, 0xaf, + 0x74, 0x2c, 0x59, 0xd1, 0x5b, 0xf2, 0x8e, 0x62, 0xed, 0x54, 0x27, 0x31, 0x83, 0x66, 0xb2, 0x9a, + 0x90, 0x4e, 0x60, 0xc4, 0x4b, 0x0c, 0x6f, 0x91, 0xa0, 0xcd, 0xe9, 0xad, 0xcb, 0x8a, 0xb5, 0x23, + 0x34, 0x60, 0x8a, 0x70, 0xb1, 0x6c, 0x53, 0xd3, 0xdb, 0xb2, 0xba, 0x83, 0xd4, 0x5d, 0xb9, 0x6f, + 0x6f, 0x3f, 0x56, 0xbd, 0xcd, 0xdb, 0x3e, 0xe9, 0xe1, 0x3a, 0xc1, 0x99, 0xc7, 0x28, 0x9b, 0xf6, + 0xf6, 0x63, 0xc2, 0x3a, 0x14, 0xf1, 0x64, 0x74, 0xb5, 0x97, 0x90, 0xbc, 0x6d, 0x98, 0xc4, 0x87, + 0x96, 0x42, 0x4c, 0x93, 0x47, 0x82, 0xb3, 0xab, 0x8c, 0x60, 0xc5, 0x68, 0xa1, 0xc6, 0xe8, 0xfa, + 0xda, 0xe2, 0xe2, 0x82, 0x54, 0xe0, 0x5c, 0x2e, 0x1a, 0x26, 0x56, 0xa8, 0xb6, 0xe1, 0x08, 0xb8, + 0x40, 0x15, 0xaa, 0x6d, 0x70, 0xf1, 0x3e, 0x0c, 0x13, 0xaa, 0x4a, 0xc7, 0xac, 0xa9, 0x32, 0xdb, + 0x8c, 0x59, 0xd5, 0x8a, 0x4f, 0x58, 0xaa, 0x7a, 0x89, 0x22, 0x30, 0x1d, 0xb7, 0x84, 0xf3, 0x70, + 0xcc, 0x15, 0x96, 0x97, 0x70, 0x7c, 0x60, 0x94, 0x41, 0xd2, 0x87, 0x61, 0xa2, 0xb7, 0x3f, 0x48, + 0x28, 0xf8, 0x5a, 0xec, 0xed, 0x07, 0xc9, 0x1e, 0x85, 0xc9, 0xde, 0x4e, 0x6f, 0x90, 0xee, 0x5e, + 0x2f, 0x9d, 0xd0, 0xdb, 0xe9, 0x05, 0x09, 0xef, 0x26, 0x3b, 0x73, 0x13, 0xa9, 0x8a, 0x8d, 0x5a, + 0xd5, 0xe3, 0x5e, 0x74, 0x4f, 0x85, 0x30, 0x0b, 0x15, 0x55, 0x95, 0x91, 0xae, 0x6c, 0x75, 0x90, + 0xac, 0x98, 0x48, 0x57, 0xac, 0x6a, 0x9d, 0x20, 0xa7, 0x6d, 0xb3, 0x8f, 0xa4, 0x92, 0xaa, 0x2e, + 0x92, 0xca, 0x39, 0x52, 0x27, 0xdc, 0x0b, 0xe3, 0xc6, 0xd6, 0x0b, 0x2a, 0xd5, 0x48, 0xb9, 0x67, + 0xa2, 0x6d, 0x6d, 0xaf, 0x7a, 0x17, 0x11, 0x6f, 0x19, 0x57, 0x10, 0x7d, 0x5c, 0x23, 0x60, 0xe1, + 0x0c, 0x54, 0x54, 0x6b, 0x47, 0x31, 0x7b, 0xc4, 0x24, 0x5b, 0x3d, 0x45, 0x45, 0xd5, 0xbb, 0x29, + 0x2a, 0x85, 0x5f, 0xe1, 0x60, 0xbc, 0x22, 0xac, 0xeb, 0xda, 0xb6, 0xcd, 0x39, 0x9e, 0xa6, 0x2b, + 0x82, 0xc0, 0x18, 0xb7, 0x19, 0xa8, 0x60, 0x49, 0xf8, 0x1a, 0x9e, 0x21, 0x68, 0xa5, 0xde, 0x4e, + 0xcf, 0xdb, 0xee, 0x29, 0x18, 0xc3, 0x98, 0x6e, 0xa3, 0x67, 0x68, 0xe0, 0xd6, 0xdb, 0xf1, 0xb4, + 0xf8, 0x10, 0x4c, 0x61, 0xa4, 0x2e, 0xb2, 0x95, 0x96, 0x62, 0x2b, 0x1e, 0xec, 0xfb, 0x09, 0x36, + 0x16, 0xfb, 0x0a, 0xab, 0xf4, 0xf5, 0xd3, 0xec, 0x6f, 0xed, 0x3b, 0x8a, 0xf5, 0x00, 0xed, 0x27, + 0x86, 0x71, 0xd5, 0x7a, 0xcb, 0x82, 0x73, 0xb1, 0x01, 0x45, 0xaf, 0xde, 0x0b, 0x79, 0xa0, 0x9a, + 0x5f, 0x49, 0xe0, 0x20, 0x68, 0x7e, 0x75, 0x01, 0x87, 0x2f, 0xcf, 0x2f, 0x56, 0x92, 0x38, 0x8c, + 0x5a, 0x5e, 0xda, 0x58, 0x94, 0xa5, 0xcd, 0x2b, 0x1b, 0x4b, 0x2b, 0x8b, 0x95, 0x94, 0x27, 0xb0, + 0x7f, 0x2a, 0x9d, 0xbb, 0xa7, 0x72, 0x5a, 0xfc, 0x76, 0x12, 0x4a, 0xfe, 0x9d, 0x9a, 0xf0, 0x38, + 0x1c, 0xe7, 0x69, 0x15, 0x0b, 0xd9, 0xf2, 0x75, 0xcd, 0x24, 0x0b, 0xb2, 0xab, 0x50, 0xe7, 0xe8, + 0xe8, 0xcf, 0x24, 0xc3, 0x5a, 0x47, 0xf6, 0xb3, 0x9a, 0x89, 0x97, 0x5b, 0x57, 0xb1, 0x85, 0x65, + 0xa8, 0xeb, 0x86, 0x6c, 0xd9, 0x8a, 0xde, 0x52, 0xcc, 0x96, 0xec, 0x26, 0xb4, 0x64, 0x45, 0x55, + 0x91, 0x65, 0x19, 0xd4, 0x11, 0x3a, 0x5c, 0x6e, 0xd7, 0x8d, 0x75, 0x86, 0xec, 0x7a, 0x88, 0x39, + 0x86, 0x1a, 0x50, 0xdf, 0xd4, 0x30, 0xf5, 0xbd, 0x0d, 0xf2, 0x5d, 0xa5, 0x27, 0x23, 0xdd, 0x36, + 0xf7, 0x49, 0x7c, 0x9e, 0x93, 0x72, 0x5d, 0xa5, 0xb7, 0x88, 0xcb, 0x6f, 0xcb, 0x36, 0xe9, 0xa9, + 0x74, 0x2e, 0x57, 0xc9, 0x3f, 0x95, 0xce, 0xe5, 0x2b, 0x20, 0xbe, 0x9a, 0x82, 0xa2, 0x37, 0x5e, + 0xc7, 0xdb, 0x1f, 0x95, 0x78, 0xac, 0x04, 0xb1, 0x69, 0xa7, 0x0e, 0x8d, 0xee, 0x67, 0xe7, 0xb1, + 0x2b, 0x6b, 0x64, 0x68, 0x70, 0x2c, 0x51, 0x4a, 0x1c, 0x46, 0x60, 0x65, 0x43, 0x34, 0x18, 0xc9, + 0x49, 0xac, 0x24, 0x5c, 0x82, 0xcc, 0x0b, 0x16, 0xe1, 0x9d, 0x21, 0xbc, 0xef, 0x3a, 0x9c, 0xf7, + 0x53, 0xeb, 0x84, 0x79, 0xfe, 0xa9, 0x75, 0xf9, 0xca, 0xaa, 0xb4, 0x32, 0xb7, 0x2c, 0x31, 0x72, + 0xe1, 0x04, 0xa4, 0x3b, 0xca, 0x4b, 0xfb, 0x7e, 0xa7, 0x47, 0x40, 0x71, 0x27, 0xe1, 0x04, 0xa4, + 0xaf, 0x23, 0x65, 0xd7, 0xef, 0x6a, 0x08, 0xe8, 0x2d, 0x5c, 0x0c, 0x67, 0x61, 0x94, 0xc8, 0x4b, + 0x00, 0x60, 0x12, 0xab, 0x8c, 0x08, 0x39, 0x48, 0xcf, 0xaf, 0x4a, 0x78, 0x41, 0x54, 0xa0, 0x48, + 0xa1, 0xf2, 0xda, 0xd2, 0xe2, 0xfc, 0x62, 0x25, 0x29, 0x3e, 0x0c, 0x19, 0x2a, 0x04, 0xbc, 0x58, + 0x1c, 0x31, 0x54, 0x46, 0x58, 0x91, 0xf1, 0x48, 0xf0, 0xda, 0xcd, 0x95, 0xe6, 0xa2, 0x54, 0x49, + 0xfa, 0xa7, 0x3a, 0x5d, 0x19, 0x15, 0x2d, 0x28, 0x7a, 0xe3, 0xf0, 0xb7, 0x67, 0x33, 0xfe, 0x8d, + 0x04, 0x14, 0x3c, 0x71, 0x35, 0x0e, 0x88, 0x94, 0x4e, 0xc7, 0xb8, 0x2e, 0x2b, 0x1d, 0x4d, 0xb1, + 0x98, 0x6a, 0x00, 0x01, 0xcd, 0x61, 0x48, 0xdc, 0xa9, 0x7b, 0x9b, 0x96, 0xc8, 0x68, 0x25, 0x23, + 0x7e, 0x3e, 0x01, 0x95, 0x60, 0x60, 0x1b, 0xe8, 0x66, 0xe2, 0xc7, 0xd9, 0x4d, 0xf1, 0xb3, 0x09, + 0x28, 0xf9, 0xa3, 0xd9, 0x40, 0xf7, 0xee, 0xfc, 0xb1, 0x76, 0xef, 0xcf, 0x92, 0x30, 0xe6, 0x8b, + 0x61, 0xe3, 0xf6, 0xee, 0x45, 0x18, 0xd7, 0x5a, 0xa8, 0xdb, 0x33, 0x6c, 0xa4, 0xab, 0xfb, 0x72, + 0x07, 0x5d, 0x43, 0x9d, 0xaa, 0x48, 0x8c, 0xc6, 0xd9, 0xc3, 0xa3, 0xe4, 0xd9, 0x25, 0x97, 0x6e, + 0x19, 0x93, 0x35, 0x26, 0x96, 0x16, 0x16, 0x57, 0xd6, 0x56, 0x37, 0x16, 0xaf, 0xcc, 0x7f, 0x40, + 0xde, 0xbc, 0xf2, 0xf4, 0x95, 0xd5, 0x67, 0xaf, 0x48, 0x15, 0x2d, 0x80, 0xf6, 0x16, 0x2e, 0xfb, + 0x35, 0xa8, 0x04, 0x3b, 0x25, 0x1c, 0x87, 0xb0, 0x6e, 0x55, 0x46, 0x84, 0x09, 0x28, 0x5f, 0x59, + 0x95, 0xd7, 0x97, 0x16, 0x16, 0xe5, 0xc5, 0x8b, 0x17, 0x17, 0xe7, 0x37, 0xd6, 0x69, 0xde, 0xc3, + 0xc1, 0xde, 0xf0, 0x2d, 0x70, 0xf1, 0x33, 0x29, 0x98, 0x08, 0xe9, 0x89, 0x30, 0xc7, 0x76, 0x2c, + 0x74, 0x13, 0xf5, 0x40, 0x9c, 0xde, 0xcf, 0xe2, 0x98, 0x61, 0x4d, 0x31, 0x6d, 0xb6, 0xc1, 0x39, + 0x03, 0x58, 0x4a, 0xba, 0xad, 0x6d, 0x6b, 0xc8, 0x64, 0xf9, 0x24, 0xba, 0x8d, 0x29, 0xbb, 0x70, + 0x9a, 0x52, 0xba, 0x1f, 0x84, 0x9e, 0x61, 0x69, 0xb6, 0x76, 0x0d, 0xc9, 0x9a, 0xce, 0x93, 0x4f, + 0x69, 0x72, 0x1a, 0x55, 0xe1, 0x35, 0x4b, 0xba, 0xed, 0x60, 0xeb, 0xa8, 0xad, 0x04, 0xb0, 0xb1, + 0x31, 0x4f, 0x49, 0x15, 0x5e, 0xe3, 0x60, 0xdf, 0x09, 0xc5, 0x96, 0xd1, 0xc7, 0xb1, 0x1e, 0xc5, + 0xc3, 0xbe, 0x23, 0x21, 0x15, 0x28, 0xcc, 0x41, 0x61, 0x51, 0xbc, 0x9b, 0xf5, 0x2a, 0x4a, 0x05, + 0x0a, 0xa3, 0x28, 0xa7, 0xa1, 0xac, 0xb4, 0xdb, 0x26, 0x66, 0xce, 0x19, 0xd1, 0x7d, 0x49, 0xc9, + 0x01, 0x13, 0xc4, 0xda, 0x53, 0x90, 0xe3, 0x72, 0xc0, 0xae, 0x1a, 0x4b, 0x42, 0xee, 0xd1, 0xcd, + 0x76, 0x72, 0x26, 0x2f, 0xe5, 0x74, 0x5e, 0x79, 0x27, 0x14, 0x35, 0x4b, 0x76, 0x93, 0xf8, 0xc9, + 0x93, 0xc9, 0x99, 0x9c, 0x54, 0xd0, 0x2c, 0x27, 0x01, 0x2a, 0x7e, 0x29, 0x09, 0x25, 0xff, 0x21, + 0x84, 0xb0, 0x00, 0xb9, 0x8e, 0xa1, 0x92, 0x53, 0x46, 0x76, 0x02, 0x36, 0x13, 0x71, 0x6e, 0x31, + 0xbb, 0xcc, 0xf0, 0x25, 0x87, 0xb2, 0xf6, 0x1f, 0x12, 0x90, 0xe3, 0x60, 0x61, 0x0a, 0xd2, 0x3d, + 0xc5, 0xde, 0x21, 0xec, 0x46, 0x9b, 0xc9, 0x4a, 0x42, 0x22, 0x65, 0x0c, 0xb7, 0x7a, 0x8a, 0x4e, + 0x54, 0x80, 0xc1, 0x71, 0x19, 0xcf, 0x6b, 0x07, 0x29, 0x2d, 0xb2, 0xe9, 0x31, 0xba, 0x5d, 0xa4, + 0xdb, 0x16, 0x9f, 0x57, 0x06, 0x9f, 0x67, 0x60, 0xe1, 0x3e, 0x18, 0xb7, 0x4d, 0x45, 0xeb, 0xf8, + 0x70, 0xd3, 0x04, 0xb7, 0xc2, 0x2b, 0x1c, 0xe4, 0x06, 0x9c, 0xe0, 0x7c, 0x5b, 0xc8, 0x56, 0xd4, + 0x1d, 0xd4, 0x72, 0x89, 0x32, 0x24, 0xb9, 0x71, 0x9c, 0x21, 0x2c, 0xb0, 0x7a, 0x4e, 0x2b, 0x7e, + 0x3b, 0x01, 0xe3, 0x7c, 0x9b, 0xd6, 0x72, 0x84, 0xb5, 0x02, 0xa0, 0xe8, 0xba, 0x61, 0x7b, 0xc5, + 0x35, 0xa8, 0xca, 0x03, 0x74, 0xb3, 0x73, 0x0e, 0x91, 0xe4, 0x61, 0x50, 0xeb, 0x02, 0xb8, 0x35, + 0x43, 0xc5, 0x56, 0x87, 0x02, 0x3b, 0x61, 0x22, 0xc7, 0x94, 0x74, 0x63, 0x0f, 0x14, 0x84, 0xf7, + 0x73, 0xc2, 0x24, 0x8c, 0x6e, 0xa1, 0xb6, 0xa6, 0xb3, 0xbc, 0x31, 0x2d, 0xf0, 0xf4, 0x4b, 0xda, + 0x49, 0xbf, 0x34, 0x3f, 0x99, 0x80, 0x09, 0xd5, 0xe8, 0x06, 0xfb, 0xdb, 0xac, 0x04, 0xb2, 0x0b, + 0xd6, 0xe5, 0xc4, 0xf3, 0x4f, 0x78, 0x4e, 0x64, 0xdb, 0x46, 0x47, 0xd1, 0xdb, 0xee, 0x39, 0x2b, + 0xf9, 0xa1, 0x3e, 0xd0, 0x46, 0xfa, 0x03, 0x6d, 0xc3, 0x73, 0xea, 0x7a, 0xc1, 0xfd, 0xf9, 0x57, + 0x89, 0xc4, 0x17, 0x93, 0xa9, 0x4b, 0x6b, 0xcd, 0x2f, 0x27, 0x6b, 0x97, 0x68, 0x73, 0x6b, 0x5c, + 0x3c, 0x12, 0xda, 0xee, 0x20, 0x15, 0x0f, 0x19, 0xbe, 0x7f, 0x1f, 0x4c, 0xb6, 0x8d, 0xb6, 0x41, + 0x38, 0x9e, 0xc5, 0xbf, 0xd8, 0xc9, 0x6d, 0xde, 0x81, 0xd6, 0x22, 0x8f, 0x79, 0x1b, 0x57, 0x60, + 0x82, 0x21, 0xcb, 0xe4, 0xe8, 0x88, 0x6e, 0x6c, 0x84, 0x43, 0xb3, 0x6a, 0xd5, 0xdf, 0xf9, 0x2e, + 0x71, 0xe8, 0xd2, 0x38, 0x23, 0xc5, 0x75, 0x74, 0xef, 0xd3, 0x90, 0xe0, 0x98, 0x8f, 0x1f, 0x5d, + 0xb6, 0xc8, 0x8c, 0xe0, 0xf8, 0x6f, 0x19, 0xc7, 0x09, 0x0f, 0xc7, 0x75, 0x46, 0xda, 0x98, 0x87, + 0xb1, 0xa3, 0xf0, 0xfa, 0x77, 0x8c, 0x57, 0x11, 0x79, 0x99, 0x5c, 0x82, 0x32, 0x61, 0xa2, 0xf6, + 0x2d, 0xdb, 0xe8, 0x12, 0x9b, 0x78, 0x38, 0x9b, 0x3f, 0xfc, 0x2e, 0x5d, 0x47, 0x25, 0x4c, 0x36, + 0xef, 0x50, 0x35, 0x1a, 0x40, 0x4e, 0xcb, 0x5a, 0x48, 0xed, 0x44, 0x70, 0xf8, 0x26, 0xeb, 0x88, + 0x83, 0xdf, 0xb8, 0x0a, 0x93, 0xf8, 0x37, 0x31, 0x59, 0xde, 0x9e, 0x44, 0xa7, 0xe0, 0xaa, 0xdf, + 0xfe, 0x30, 0x5d, 0xaa, 0x13, 0x0e, 0x03, 0x4f, 0x9f, 0x3c, 0xb3, 0xd8, 0x46, 0xb6, 0x8d, 0x4c, + 0x4b, 0x56, 0x3a, 0x61, 0xdd, 0xf3, 0xe4, 0x30, 0xaa, 0xbf, 0xf6, 0xba, 0x7f, 0x16, 0x2f, 0x51, + 0xca, 0xb9, 0x4e, 0xa7, 0xb1, 0x09, 0xc7, 0x43, 0xb4, 0x22, 0x06, 0xcf, 0xcf, 0x30, 0x9e, 0x93, + 0x03, 0x9a, 0x81, 0xd9, 0xae, 0x01, 0x87, 0x3b, 0x73, 0x19, 0x83, 0xe7, 0xdf, 0x67, 0x3c, 0x05, + 0x46, 0xcb, 0xa7, 0x14, 0x73, 0x7c, 0x0a, 0xc6, 0xaf, 0x21, 0x73, 0xcb, 0xb0, 0x58, 0xde, 0x28, + 0x06, 0xbb, 0xcf, 0x32, 0x76, 0x65, 0x46, 0x48, 0x12, 0x49, 0x98, 0xd7, 0x79, 0xc8, 0x6d, 0x2b, + 0x2a, 0x8a, 0xc1, 0xe2, 0x73, 0x8c, 0x45, 0x16, 0xe3, 0x63, 0xd2, 0x39, 0x28, 0xb6, 0x0d, 0xe6, + 0xb5, 0xa2, 0xc9, 0x3f, 0xcf, 0xc8, 0x0b, 0x9c, 0x86, 0xb1, 0xe8, 0x19, 0xbd, 0x7e, 0x07, 0xbb, + 0xb4, 0x68, 0x16, 0xbf, 0xce, 0x59, 0x70, 0x1a, 0xc6, 0xe2, 0x08, 0x62, 0x7d, 0x85, 0xb3, 0xb0, + 0x3c, 0xf2, 0x7c, 0x12, 0x0a, 0x86, 0xde, 0xd9, 0x37, 0xf4, 0x38, 0x9d, 0xf8, 0x02, 0xe3, 0x00, + 0x8c, 0x04, 0x33, 0xb8, 0x00, 0xf9, 0xb8, 0x13, 0xf1, 0x0f, 0x5f, 0xe7, 0xcb, 0x83, 0xcf, 0xc0, + 0x25, 0x28, 0x73, 0x03, 0xa5, 0x19, 0x7a, 0x0c, 0x16, 0xff, 0x88, 0xb1, 0x28, 0x79, 0xc8, 0xd8, + 0x30, 0x6c, 0x64, 0xd9, 0x6d, 0x14, 0x87, 0xc9, 0x97, 0xf8, 0x30, 0x18, 0x09, 0x13, 0xe5, 0x16, + 0xd2, 0xd5, 0x9d, 0x78, 0x1c, 0x7e, 0x83, 0x8b, 0x92, 0xd3, 0x60, 0x16, 0xf3, 0x30, 0xd6, 0x55, + 0x4c, 0x6b, 0x47, 0xe9, 0xc4, 0x9a, 0x8e, 0x7f, 0xcc, 0x78, 0x14, 0x1d, 0x22, 0x26, 0x91, 0xbe, + 0x7e, 0x14, 0x36, 0x5f, 0xe6, 0x12, 0xf1, 0x90, 0xb1, 0xa5, 0x67, 0xd9, 0x24, 0xc9, 0x76, 0x14, + 0x6e, 0xff, 0x84, 0x2f, 0x3d, 0x4a, 0xbb, 0xe2, 0xe5, 0x78, 0x01, 0xf2, 0x96, 0xf6, 0x52, 0x2c, + 0x36, 0xff, 0x94, 0xcf, 0x34, 0x21, 0xc0, 0xc4, 0x1f, 0x80, 0x13, 0xa1, 0x6e, 0x22, 0x06, 0xb3, + 0x7f, 0xc6, 0x98, 0x4d, 0x85, 0xb8, 0x0a, 0x66, 0x12, 0x8e, 0xca, 0xf2, 0x37, 0xb9, 0x49, 0x40, + 0x01, 0x5e, 0x6b, 0x78, 0x1f, 0x61, 0x29, 0xdb, 0x47, 0x93, 0xda, 0x6f, 0x71, 0xa9, 0x51, 0x5a, + 0x9f, 0xd4, 0x36, 0x60, 0x8a, 0x71, 0x3c, 0xda, 0xbc, 0xfe, 0x36, 0x37, 0xac, 0x94, 0x7a, 0xd3, + 0x3f, 0xbb, 0x1f, 0x84, 0x9a, 0x23, 0x4e, 0x1e, 0xb0, 0x5a, 0x72, 0x57, 0xe9, 0xc5, 0xe0, 0xfc, + 0x3b, 0x8c, 0x33, 0xb7, 0xf8, 0x4e, 0xc4, 0x6b, 0xad, 0x28, 0x3d, 0xcc, 0xfc, 0x39, 0xa8, 0x72, + 0xe6, 0x7d, 0xdd, 0x44, 0xaa, 0xd1, 0xd6, 0xb5, 0x97, 0x50, 0x2b, 0x06, 0xeb, 0x7f, 0x1e, 0x98, + 0xaa, 0x4d, 0x0f, 0x39, 0xe6, 0xbc, 0x04, 0x15, 0x27, 0x56, 0x91, 0xb5, 0x6e, 0xcf, 0x30, 0xed, + 0x08, 0x8e, 0xff, 0x82, 0xcf, 0x94, 0x43, 0xb7, 0x44, 0xc8, 0x1a, 0x8b, 0x40, 0x4f, 0x9e, 0xe3, + 0xaa, 0xe4, 0xef, 0x32, 0x46, 0x63, 0x2e, 0x15, 0x33, 0x1c, 0xaa, 0xd1, 0xed, 0x29, 0x66, 0x1c, + 0xfb, 0xf7, 0x2f, 0xb9, 0xe1, 0x60, 0x24, 0xcc, 0x70, 0xd8, 0xfb, 0x3d, 0x84, 0xbd, 0x7d, 0x0c, + 0x0e, 0x5f, 0xe1, 0x86, 0x83, 0xd3, 0x30, 0x16, 0x3c, 0x60, 0x88, 0xc1, 0xe2, 0xab, 0x9c, 0x05, + 0xa7, 0xc1, 0x2c, 0x9e, 0x71, 0x1d, 0xad, 0x89, 0xda, 0x9a, 0x65, 0x9b, 0x34, 0x4c, 0x3e, 0x9c, + 0xd5, 0xd7, 0x5e, 0xf7, 0x07, 0x61, 0x92, 0x87, 0x14, 0x5b, 0x22, 0x96, 0x76, 0x25, 0xbb, 0xa8, + 0xe8, 0x8e, 0x7d, 0x9d, 0x5b, 0x22, 0x0f, 0x19, 0xee, 0x9b, 0x27, 0x42, 0xc4, 0x62, 0x57, 0xf1, + 0xde, 0x21, 0x06, 0xbb, 0xdf, 0x0b, 0x74, 0x6e, 0x9d, 0xd3, 0x62, 0x9e, 0x9e, 0xf8, 0xa7, 0xaf, + 0xef, 0xa2, 0xfd, 0x58, 0xda, 0xf9, 0xfb, 0x81, 0xf8, 0x67, 0x93, 0x52, 0x52, 0x1b, 0x52, 0x0e, + 0xc4, 0x53, 0x42, 0xd4, 0x3d, 0xa3, 0xea, 0xdf, 0x7c, 0x83, 0x8d, 0xd7, 0x1f, 0x4e, 0x35, 0x96, + 0xb1, 0x92, 0xfb, 0x83, 0x9e, 0x68, 0x66, 0x1f, 0x7e, 0xc3, 0xd1, 0x73, 0x5f, 0xcc, 0xd3, 0xb8, + 0x08, 0x63, 0xbe, 0x80, 0x27, 0x9a, 0xd5, 0x47, 0x18, 0xab, 0xa2, 0x37, 0xde, 0x69, 0x3c, 0x0c, + 0x69, 0x1c, 0xbc, 0x44, 0x93, 0xff, 0x1c, 0x23, 0x27, 0xe8, 0x8d, 0xf7, 0x41, 0x8e, 0x07, 0x2d, + 0xd1, 0xa4, 0x3f, 0xcf, 0x48, 0x1d, 0x12, 0x4c, 0xce, 0x03, 0x96, 0x68, 0xf2, 0x8f, 0x72, 0x72, + 0x4e, 0x82, 0xc9, 0xe3, 0x8b, 0xf0, 0x1b, 0x7f, 0x2b, 0xcd, 0x9c, 0x0e, 0x97, 0xdd, 0x05, 0xc8, + 0xb2, 0x48, 0x25, 0x9a, 0xfa, 0xe3, 0xac, 0x71, 0x4e, 0xd1, 0x78, 0x14, 0x46, 0x63, 0x0a, 0xfc, + 0x17, 0x19, 0x29, 0xc5, 0x6f, 0xcc, 0x43, 0xc1, 0x13, 0x9d, 0x44, 0x93, 0xff, 0x12, 0x23, 0xf7, + 0x52, 0xe1, 0xae, 0xb3, 0xe8, 0x24, 0x9a, 0xc1, 0x27, 0x79, 0xd7, 0x19, 0x05, 0x16, 0x1b, 0x0f, + 0x4c, 0xa2, 0xa9, 0x3f, 0xc5, 0xa5, 0xce, 0x49, 0x1a, 0x4f, 0x42, 0xde, 0x71, 0x36, 0xd1, 0xf4, + 0xbf, 0xcc, 0xe8, 0x5d, 0x1a, 0x2c, 0x01, 0x8f, 0xb3, 0x8b, 0x66, 0xf1, 0xb7, 0xb9, 0x04, 0x3c, + 0x54, 0x78, 0x19, 0x05, 0x03, 0x98, 0x68, 0x4e, 0x7f, 0x87, 0x2f, 0xa3, 0x40, 0xfc, 0x82, 0x67, + 0x93, 0xd8, 0xfc, 0x68, 0x16, 0xbf, 0xc2, 0x67, 0x93, 0xe0, 0xe3, 0x6e, 0x04, 0x23, 0x82, 0x68, + 0x1e, 0x7f, 0x8f, 0x77, 0x23, 0x10, 0x10, 0x34, 0xd6, 0x40, 0x18, 0x8c, 0x06, 0xa2, 0xf9, 0x7d, + 0x9a, 0xf1, 0x1b, 0x1f, 0x08, 0x06, 0x1a, 0xcf, 0xc2, 0x54, 0x78, 0x24, 0x10, 0xcd, 0xf5, 0xd7, + 0xde, 0x08, 0xec, 0xdd, 0xbc, 0x81, 0x40, 0x63, 0xc3, 0x75, 0x29, 0xde, 0x28, 0x20, 0x9a, 0xed, + 0x67, 0xde, 0xf0, 0x1b, 0x6e, 0x6f, 0x10, 0xd0, 0x98, 0x03, 0x70, 0x1d, 0x70, 0x34, 0xaf, 0xcf, + 0x32, 0x5e, 0x1e, 0x22, 0xbc, 0x34, 0x98, 0xff, 0x8d, 0xa6, 0xff, 0x1c, 0x5f, 0x1a, 0x8c, 0x02, + 0x2f, 0x0d, 0xee, 0x7a, 0xa3, 0xa9, 0x3f, 0xcf, 0x97, 0x06, 0x27, 0xc1, 0x9a, 0xed, 0xf1, 0x6e, + 0xd1, 0x1c, 0xbe, 0xc0, 0x35, 0xdb, 0x43, 0xd5, 0xb8, 0x02, 0xe3, 0x03, 0x0e, 0x31, 0x9a, 0xd5, + 0x17, 0x19, 0xab, 0x4a, 0xd0, 0x1f, 0x7a, 0x9d, 0x17, 0x73, 0x86, 0xd1, 0xdc, 0xfe, 0x41, 0xc0, + 0x79, 0x31, 0x5f, 0xd8, 0xb8, 0x00, 0x39, 0xbd, 0xdf, 0xe9, 0xe0, 0xc5, 0x23, 0x1c, 0x7e, 0x37, + 0xb0, 0xfa, 0xdf, 0x7f, 0xc4, 0xa4, 0xc3, 0x09, 0x1a, 0x0f, 0xc3, 0x28, 0xea, 0x6e, 0xa1, 0x56, + 0x14, 0xe5, 0xf7, 0x7f, 0xc4, 0x0d, 0x26, 0xc6, 0x6e, 0x3c, 0x09, 0x40, 0x53, 0x23, 0xe4, 0x78, + 0x30, 0x82, 0xf6, 0x7f, 0xfc, 0x88, 0x5d, 0xc6, 0x71, 0x49, 0x5c, 0x06, 0xf4, 0x6a, 0xcf, 0xe1, + 0x0c, 0x5e, 0xf7, 0x33, 0x20, 0x33, 0x72, 0x1e, 0xb2, 0x2f, 0x58, 0x86, 0x6e, 0x2b, 0xed, 0x28, + 0xea, 0xff, 0xc9, 0xa8, 0x39, 0x3e, 0x16, 0x58, 0xd7, 0x30, 0x91, 0xad, 0xb4, 0xad, 0x28, 0xda, + 0xff, 0xc5, 0x68, 0x1d, 0x02, 0x4c, 0xac, 0x2a, 0x96, 0x1d, 0x67, 0xdc, 0xff, 0x9b, 0x13, 0x73, + 0x02, 0xdc, 0x69, 0xfc, 0x7b, 0x17, 0xed, 0x47, 0xd1, 0xfe, 0x80, 0x77, 0x9a, 0xe1, 0x37, 0xde, + 0x07, 0x79, 0xfc, 0x93, 0xde, 0xb0, 0x8b, 0x20, 0xfe, 0x3f, 0x8c, 0xd8, 0xa5, 0xc0, 0x2d, 0x5b, + 0x76, 0xcb, 0xd6, 0xa2, 0x85, 0x7d, 0x83, 0xcd, 0x34, 0xc7, 0x6f, 0xcc, 0x41, 0xc1, 0xb2, 0x5b, + 0xad, 0x3e, 0x8b, 0x4f, 0x23, 0xc8, 0xff, 0xef, 0x8f, 0x9c, 0x94, 0x85, 0x43, 0x83, 0x67, 0xfb, + 0xfa, 0xae, 0xdd, 0x33, 0xc8, 0x11, 0x48, 0x14, 0x87, 0x37, 0x18, 0x07, 0x0f, 0x49, 0x63, 0x1e, + 0x8a, 0x78, 0x2c, 0x26, 0xea, 0x21, 0x72, 0x5e, 0x15, 0xc1, 0xe2, 0x2f, 0x98, 0x00, 0x7c, 0x44, + 0xcd, 0x9f, 0x1e, 0xf6, 0x3e, 0x27, 0x3c, 0x6d, 0x0c, 0x97, 0x8c, 0x4b, 0x06, 0x4d, 0x18, 0x3f, + 0x2f, 0xfa, 0xd2, 0xc5, 0x6d, 0xc3, 0xcd, 0xd6, 0x3a, 0x9b, 0x1c, 0xf8, 0xbd, 0x24, 0xdc, 0x4d, + 0xae, 0x05, 0x9b, 0x5d, 0x4d, 0xb7, 0xcf, 0xaa, 0xe6, 0x7e, 0xcf, 0x36, 0xce, 0x76, 0x91, 0xb9, + 0xdb, 0x41, 0xec, 0x0f, 0xcb, 0xfe, 0x56, 0x5d, 0xb4, 0x59, 0x8a, 0x36, 0x4b, 0xeb, 0x6b, 0xa1, + 0xd9, 0x62, 0x71, 0x1e, 0xb2, 0x6b, 0xa6, 0x61, 0x6c, 0xaf, 0xf6, 0x04, 0x81, 0xdd, 0x74, 0x66, + 0x17, 0xe3, 0x88, 0x1a, 0xb2, 0x97, 0x51, 0x49, 0xf7, 0x65, 0x94, 0x00, 0xe9, 0x96, 0x62, 0x2b, + 0x24, 0x61, 0x5e, 0x94, 0xc8, 0x6f, 0xb1, 0x09, 0xa3, 0x84, 0x89, 0x70, 0x1e, 0x52, 0x46, 0xcf, + 0x62, 0xd9, 0xfd, 0x3b, 0x67, 0x87, 0xf5, 0x65, 0x96, 0x35, 0xd9, 0x4c, 0x7f, 0xf3, 0xa0, 0x3e, + 0x22, 0x61, 0x9a, 0xe6, 0xda, 0x5f, 0x7d, 0x67, 0x3a, 0xf1, 0x1b, 0xaf, 0x4e, 0x27, 0x86, 0xbe, + 0x74, 0x9a, 0xf5, 0x08, 0xca, 0x23, 0x8c, 0x61, 0x72, 0x71, 0xde, 0x3b, 0xfd, 0x42, 0x12, 0xa6, + 0x3d, 0x48, 0x1d, 0x6d, 0xcb, 0x3a, 0xbb, 0x7b, 0x8d, 0x3e, 0x8d, 0x62, 0x52, 0x13, 0x3c, 0x3d, + 0xc5, 0xf5, 0xb3, 0xbb, 0xd7, 0x86, 0xc8, 0x6b, 0x16, 0xd2, 0x6b, 0x8a, 0x66, 0x86, 0x3c, 0x19, + 0x9b, 0x74, 0xef, 0xb6, 0x62, 0x18, 0x2d, 0x88, 0xe7, 0x20, 0xf7, 0xf4, 0xd2, 0x23, 0x0f, 0xc5, + 0xa1, 0x49, 0x31, 0x9a, 0xa6, 0xc4, 0x45, 0xf1, 0xb5, 0x10, 0x71, 0x7c, 0xe3, 0xb5, 0xe9, 0x44, + 0xe8, 0xe3, 0xaf, 0x70, 0x91, 0xb0, 0xd1, 0x3a, 0xc2, 0xf8, 0x54, 0x12, 0xea, 0xc1, 0x53, 0x01, + 0xbc, 0x14, 0x2d, 0x5b, 0xe9, 0xf6, 0x86, 0xbd, 0xfd, 0xba, 0x00, 0xf9, 0x0d, 0x8e, 0x23, 0x54, + 0x21, 0x6b, 0x21, 0xd5, 0xd0, 0x5b, 0x16, 0x19, 0x49, 0x4a, 0xe2, 0x45, 0x3c, 0x1a, 0x5d, 0xd1, + 0x0d, 0x8b, 0xdd, 0x38, 0xa5, 0x85, 0xe6, 0xaf, 0x26, 0x8e, 0xb6, 0x36, 0x4a, 0x4e, 0x53, 0x64, + 0x81, 0xac, 0x25, 0x9e, 0xbf, 0xef, 0xb0, 0x03, 0x15, 0xfa, 0xc2, 0xcd, 0x19, 0x82, 0xe7, 0xf4, + 0x64, 0x3a, 0x78, 0x7a, 0xf2, 0x2c, 0xea, 0x74, 0x9e, 0xd6, 0x8d, 0xeb, 0xfa, 0x06, 0xa6, 0x71, + 0x44, 0xf2, 0x89, 0x24, 0x4c, 0x0f, 0x1c, 0x94, 0x30, 0xf3, 0x32, 0x4c, 0x22, 0x0d, 0xc8, 0x2d, + 0x70, 0xab, 0x75, 0x54, 0x81, 0xfc, 0xca, 0x11, 0x05, 0x32, 0xc6, 0x5b, 0xe2, 0xf2, 0xb8, 0x37, + 0x5a, 0x1e, 0xbc, 0xff, 0x37, 0x21, 0x8e, 0x8f, 0x3c, 0x01, 0x77, 0x7a, 0x14, 0x48, 0xd9, 0x52, + 0x35, 0xf6, 0x8c, 0xd0, 0xbb, 0x62, 0x8e, 0x79, 0x56, 0x0c, 0x46, 0x99, 0x25, 0x95, 0xe1, 0x8b, + 0xa6, 0x16, 0xcf, 0x76, 0xd5, 0x22, 0x56, 0x69, 0x2d, 0x4a, 0x71, 0x6b, 0x11, 0xd3, 0x28, 0xfe, + 0xe5, 0x28, 0x64, 0xf9, 0x9b, 0xcf, 0xc7, 0x20, 0x8d, 0xd4, 0x1d, 0x83, 0x5d, 0x76, 0x17, 0x67, + 0x43, 0xc7, 0x33, 0xcb, 0xb0, 0x17, 0xd5, 0x1d, 0xe3, 0xf2, 0x88, 0x44, 0x28, 0xc8, 0x5b, 0xb1, + 0x4e, 0xdf, 0xda, 0x61, 0x77, 0x92, 0x4f, 0x1d, 0x4e, 0x7a, 0x11, 0xa3, 0x5e, 0x1e, 0x91, 0x28, + 0x0d, 0x6e, 0x96, 0xbc, 0x73, 0x4b, 0xc7, 0x69, 0x76, 0x49, 0xdf, 0x26, 0xcd, 0x62, 0x0a, 0xe1, + 0x32, 0x80, 0x85, 0x6c, 0x7e, 0x95, 0x61, 0x94, 0xd0, 0x9f, 0x3e, 0x9c, 0x7e, 0x1d, 0xd9, 0xd4, + 0x6d, 0x5d, 0x1e, 0x91, 0xf2, 0x16, 0x2f, 0x60, 0x4e, 0x9a, 0xae, 0xd9, 0xb2, 0xba, 0xa3, 0x68, + 0x3a, 0x39, 0x83, 0x8f, 0xe4, 0xb4, 0xa4, 0x6b, 0xf6, 0x3c, 0x46, 0xc7, 0x9c, 0x34, 0x5e, 0xc0, + 0xa2, 0x20, 0x6f, 0x4b, 0xd9, 0x63, 0xac, 0x08, 0x51, 0x3c, 0x83, 0x51, 0xb1, 0x28, 0x08, 0x8d, + 0xf0, 0x34, 0x14, 0xc8, 0x71, 0xab, 0xbc, 0xd5, 0x31, 0xd4, 0x5d, 0xf6, 0x02, 0x65, 0xe6, 0x70, + 0x16, 0x4d, 0x4c, 0xd0, 0xc4, 0xf8, 0x97, 0x47, 0x24, 0xd8, 0x72, 0x4a, 0x42, 0x13, 0x72, 0xf4, + 0xd6, 0xaf, 0xbd, 0xc7, 0xde, 0x10, 0xde, 0x7d, 0x38, 0x27, 0x72, 0x01, 0x78, 0x63, 0xef, 0xf2, + 0x88, 0x94, 0x55, 0xe9, 0x4f, 0x61, 0x11, 0xf2, 0x48, 0x6f, 0xb1, 0xee, 0x14, 0xd8, 0x6b, 0xab, + 0xc3, 0xf5, 0x42, 0x6f, 0xf1, 0xce, 0xe4, 0x10, 0xfb, 0x2d, 0x3c, 0x01, 0x19, 0xd5, 0xe8, 0x76, + 0x35, 0x9b, 0xbc, 0x45, 0x2c, 0x9c, 0xbb, 0x2b, 0xa2, 0x23, 0x04, 0xf7, 0xf2, 0x88, 0xc4, 0xa8, + 0xf0, 0xf4, 0xb4, 0x50, 0x47, 0xbb, 0x86, 0x4c, 0x3c, 0x98, 0x89, 0x38, 0xd3, 0xb3, 0x40, 0xf1, + 0xc9, 0x70, 0xf2, 0x2d, 0x5e, 0x68, 0x66, 0x99, 0x7b, 0x11, 0x4f, 0x43, 0xc1, 0xa3, 0xc9, 0xd8, + 0x62, 0xb1, 0x1d, 0x08, 0x73, 0xf6, 0xbc, 0x28, 0x96, 0xa0, 0xe8, 0xd5, 0x5b, 0xb1, 0xeb, 0x10, + 0x92, 0x43, 0xfc, 0x2a, 0x64, 0xaf, 0x21, 0xd3, 0xa2, 0x27, 0xf8, 0x84, 0x90, 0x15, 0x85, 0x53, + 0x30, 0x46, 0xe4, 0x26, 0xf3, 0x7a, 0xfa, 0x7c, 0xb9, 0x48, 0x80, 0x57, 0x19, 0x52, 0x1d, 0x0a, + 0xbd, 0x73, 0x3d, 0x07, 0x85, 0xbe, 0xa1, 0x86, 0xde, 0xb9, 0x1e, 0x43, 0x10, 0x1b, 0x50, 0x09, + 0xaa, 0xae, 0xd7, 0x6b, 0xe6, 0x43, 0xbc, 0x66, 0x9e, 0x7b, 0xda, 0xdf, 0x4e, 0x3a, 0xc4, 0x8e, + 0xb6, 0xe2, 0xe5, 0x86, 0x8d, 0x04, 0xa1, 0x2e, 0x9c, 0xab, 0x0d, 0x84, 0x76, 0x8e, 0xaf, 0x69, + 0xe6, 0x70, 0x28, 0xf2, 0xa9, 0x3f, 0xad, 0x27, 0x24, 0x42, 0x21, 0x9c, 0xc0, 0x0a, 0xa5, 0x68, + 0xba, 0xac, 0xb5, 0xf8, 0xab, 0x63, 0x52, 0x5e, 0x6a, 0x09, 0xcf, 0x40, 0x45, 0x35, 0x74, 0x0b, + 0xe9, 0x56, 0xdf, 0x92, 0x7b, 0x8a, 0xa9, 0x74, 0xdd, 0xc7, 0x79, 0xe1, 0xd3, 0x34, 0xcf, 0xd1, + 0xd7, 0x08, 0xb6, 0x54, 0x56, 0xfd, 0x00, 0x61, 0x19, 0xe0, 0x9a, 0xd2, 0xd1, 0x5a, 0x8a, 0x6d, + 0x98, 0x16, 0x7b, 0x9b, 0x32, 0x8c, 0xd9, 0x55, 0x8e, 0xb8, 0xd9, 0x6b, 0x29, 0x36, 0x62, 0x41, + 0x94, 0x87, 0x5e, 0xb8, 0x07, 0xca, 0x4a, 0xaf, 0x27, 0x5b, 0xb6, 0x62, 0x23, 0x79, 0x6b, 0xdf, + 0x46, 0x16, 0xb1, 0x17, 0x45, 0x69, 0x4c, 0xe9, 0xf5, 0xd6, 0x31, 0xb4, 0x89, 0x81, 0x62, 0xcb, + 0x99, 0x6d, 0xb2, 0x34, 0x9d, 0xd8, 0x2e, 0xe1, 0xc6, 0x76, 0x18, 0x46, 0xae, 0x56, 0x50, 0x19, + 0xf0, 0xdb, 0x28, 0x99, 0x1d, 0xa4, 0xb5, 0x77, 0xe8, 0x33, 0xf8, 0x94, 0xc4, 0x4a, 0x78, 0x62, + 0x7a, 0xa6, 0x71, 0x0d, 0xb1, 0x17, 0xf0, 0xb4, 0x20, 0xfe, 0xdd, 0x24, 0x8c, 0x0f, 0x2c, 0x5f, + 0xcc, 0x97, 0xdc, 0xef, 0x67, 0x6d, 0xe1, 0xdf, 0xc2, 0x05, 0xcc, 0x57, 0x69, 0xb1, 0x37, 0x2b, + 0x85, 0x73, 0x77, 0x0c, 0x91, 0xc0, 0x65, 0x82, 0xc4, 0x06, 0xce, 0x48, 0x84, 0x4d, 0xa8, 0x74, + 0x14, 0xcb, 0x96, 0xe9, 0x2a, 0xa2, 0xaf, 0x89, 0x53, 0x87, 0x5a, 0x82, 0x65, 0x85, 0xaf, 0x3e, + 0xac, 0xdc, 0x8c, 0x5d, 0xa9, 0xe3, 0x83, 0x0a, 0xcf, 0xc1, 0xe4, 0xd6, 0xfe, 0x4b, 0x8a, 0x6e, + 0x6b, 0x3a, 0xb9, 0x6c, 0xe4, 0x9f, 0xa3, 0xfa, 0x10, 0xd6, 0x8b, 0xd7, 0xb4, 0x16, 0xd2, 0x55, + 0x3e, 0x39, 0x13, 0x0e, 0x0b, 0x67, 0xf2, 0x2c, 0xf1, 0x39, 0x28, 0xf9, 0x6d, 0x91, 0x50, 0x82, + 0xa4, 0xbd, 0xc7, 0x24, 0x92, 0xb4, 0xf7, 0x84, 0x47, 0x58, 0x44, 0x9e, 0x24, 0xb7, 0xe5, 0x86, + 0x39, 0x0b, 0x46, 0xed, 0xbe, 0x39, 0x14, 0x45, 0x67, 0x25, 0x38, 0x86, 0x21, 0xc8, 0x5b, 0x3c, + 0x03, 0xe5, 0x80, 0x11, 0xf3, 0x4c, 0x6b, 0xc2, 0x3b, 0xad, 0x62, 0x19, 0xc6, 0x7c, 0xb6, 0x4a, + 0xfc, 0xa3, 0x0c, 0xe4, 0x9c, 0x6f, 0x19, 0x5c, 0x86, 0x3c, 0xda, 0x53, 0x51, 0xcf, 0xe6, 0x56, + 0xe1, 0x30, 0x23, 0x4e, 0x69, 0x16, 0x39, 0x3e, 0x36, 0x57, 0x0e, 0xb1, 0x70, 0xde, 0xe7, 0x92, + 0x4f, 0x45, 0x31, 0xf1, 0xfa, 0xe4, 0xc7, 0xfd, 0x3e, 0xf9, 0xae, 0x08, 0xda, 0x80, 0x53, 0x3e, + 0xef, 0x73, 0xca, 0x51, 0x0d, 0xfb, 0xbc, 0xf2, 0x52, 0x88, 0x57, 0x8e, 0x1a, 0xfe, 0x10, 0xb7, + 0xbc, 0x14, 0xe2, 0x96, 0x67, 0x22, 0xfb, 0x12, 0xea, 0x97, 0x1f, 0xf7, 0xfb, 0xe5, 0x28, 0x71, + 0x04, 0x1c, 0xf3, 0x72, 0x98, 0x63, 0x3e, 0x13, 0xc1, 0x63, 0xa8, 0x67, 0x9e, 0x1f, 0xf0, 0xcc, + 0xf7, 0x44, 0xb0, 0x0a, 0x71, 0xcd, 0x4b, 0x3e, 0x9f, 0x08, 0xb1, 0x64, 0x13, 0xee, 0x14, 0x85, + 0x8b, 0x83, 0x5e, 0xfe, 0x74, 0x94, 0xaa, 0x85, 0xb9, 0xf9, 0x27, 0x03, 0x6e, 0xfe, 0xee, 0xa8, + 0x51, 0x05, 0xfc, 0xbc, 0xeb, 0x9d, 0xcf, 0x60, 0xfb, 0x18, 0x58, 0x19, 0xd8, 0x96, 0x22, 0xd3, + 0x34, 0x4c, 0xe6, 0xf8, 0x68, 0x41, 0x9c, 0xc1, 0x16, 0xdb, 0xd5, 0xff, 0x43, 0x3c, 0x39, 0x59, + 0xb4, 0x1e, 0x6d, 0x17, 0xbf, 0x96, 0x70, 0x69, 0x89, 0x65, 0xf3, 0x5a, 0xfb, 0x3c, 0xb3, 0xf6, + 0x1e, 0x07, 0x9f, 0xf4, 0x3b, 0xf8, 0x3a, 0x14, 0xb0, 0x4f, 0x09, 0xf8, 0x6e, 0xa5, 0xc7, 0x7d, + 0xb7, 0x70, 0x2f, 0x8c, 0x13, 0xfb, 0x4b, 0xc3, 0x00, 0x66, 0x48, 0xd2, 0xc4, 0x90, 0x94, 0x71, + 0x05, 0x95, 0x20, 0x75, 0x14, 0x0f, 0xc0, 0x84, 0x07, 0x17, 0xf3, 0x25, 0xbe, 0x80, 0x3a, 0xa9, + 0x8a, 0x83, 0x3d, 0xd7, 0xeb, 0x5d, 0x56, 0xac, 0x1d, 0x71, 0xc5, 0x15, 0x90, 0x1b, 0x17, 0x08, + 0x90, 0x56, 0x8d, 0x16, 0x1d, 0xf7, 0x98, 0x44, 0x7e, 0xe3, 0x58, 0xa1, 0x63, 0xb4, 0xd9, 0x0d, + 0x48, 0xfc, 0x13, 0x63, 0x39, 0x4b, 0x3b, 0x4f, 0xd7, 0xac, 0xf8, 0xbb, 0x09, 0x97, 0x9f, 0x1b, + 0x2a, 0x84, 0x79, 0xf5, 0xc4, 0xad, 0xf4, 0xea, 0xc9, 0x37, 0xe7, 0xd5, 0xc5, 0x37, 0x12, 0xee, + 0x94, 0x3a, 0xfe, 0xfa, 0xe6, 0x44, 0x80, 0xb5, 0x8b, 0xbe, 0x18, 0xa7, 0x37, 0x75, 0x69, 0x81, + 0x87, 0x5a, 0x99, 0x90, 0x04, 0x45, 0xd6, 0x93, 0xd4, 0x10, 0x1e, 0x26, 0x7e, 0xde, 0xd8, 0x66, + 0xa6, 0xa1, 0x1e, 0x91, 0xe8, 0x91, 0x28, 0xb6, 0xc7, 0xbf, 0xe4, 0x7d, 0x61, 0xc3, 0xed, 0x90, + 0xc7, 0x5d, 0xa7, 0xcf, 0x9f, 0x80, 0xa5, 0x17, 0x39, 0x40, 0x6c, 0x81, 0x30, 0x68, 0x63, 0x84, + 0x2b, 0x90, 0x41, 0xd7, 0xc8, 0x6d, 0x54, 0x9a, 0x6c, 0xba, 0x7d, 0xa8, 0x23, 0x46, 0xba, 0xdd, + 0xac, 0x62, 0x61, 0x7e, 0xff, 0xa0, 0x5e, 0xa1, 0x34, 0xf7, 0x1b, 0x5d, 0xcd, 0x46, 0xdd, 0x9e, + 0xbd, 0x2f, 0x31, 0x2e, 0xe2, 0x47, 0x93, 0xd8, 0x1f, 0xfa, 0xec, 0x4f, 0xa8, 0x78, 0xf9, 0xa2, + 0x49, 0x7a, 0x42, 0xa4, 0x78, 0x22, 0xbf, 0x03, 0xa0, 0xad, 0x58, 0xf2, 0x75, 0x45, 0xb7, 0x51, + 0x8b, 0xc9, 0x3d, 0xdf, 0x56, 0xac, 0x67, 0x09, 0x00, 0xc7, 0x9b, 0xb8, 0xba, 0x6f, 0xa1, 0x16, + 0x99, 0x80, 0x94, 0x94, 0x6d, 0x2b, 0xd6, 0xa6, 0x85, 0x5a, 0x9e, 0xb1, 0x66, 0x6f, 0xc5, 0x58, + 0xfd, 0xf2, 0xce, 0x05, 0xe5, 0xfd, 0xf1, 0xa4, 0xbb, 0x3a, 0xdc, 0xf0, 0xe1, 0x27, 0x53, 0x16, + 0x9f, 0x23, 0x7b, 0x0a, 0xbf, 0x13, 0x10, 0x3e, 0x00, 0xe3, 0xce, 0xaa, 0x94, 0xfb, 0x64, 0xb5, + 0x72, 0x2d, 0x3c, 0xda, 0xe2, 0xae, 0x5c, 0xf3, 0x83, 0x2d, 0xe1, 0x67, 0xe0, 0x78, 0xc0, 0x06, + 0x39, 0x0d, 0x24, 0x8f, 0x64, 0x8a, 0x8e, 0xf9, 0x4d, 0x11, 0xe7, 0xef, 0x4a, 0x2f, 0x75, 0x4b, + 0x56, 0xcd, 0x5d, 0x38, 0x84, 0xf5, 0xba, 0xb7, 0x30, 0x9d, 0x10, 0xff, 0x38, 0x01, 0xe5, 0x40, + 0x07, 0x85, 0xc7, 0x60, 0x94, 0x7a, 0xe0, 0xc4, 0xa1, 0x89, 0x10, 0x22, 0x71, 0x36, 0x26, 0x4a, + 0x20, 0xcc, 0x41, 0x0e, 0xb1, 0xe8, 0x9a, 0x09, 0xe5, 0xee, 0x88, 0x20, 0x9c, 0xd1, 0x3b, 0x64, + 0xc2, 0x02, 0xe4, 0x1d, 0xd1, 0x47, 0xec, 0xdc, 0x9c, 0x99, 0x63, 0x4c, 0x5c, 0x42, 0x71, 0x1e, + 0x0a, 0x9e, 0xee, 0xd1, 0xb7, 0x80, 0x7b, 0x6c, 0xbb, 0x45, 0x03, 0xe8, 0x5c, 0x57, 0xd9, 0x23, + 0x3b, 0x2d, 0xe1, 0x38, 0x64, 0x71, 0x65, 0x9b, 0x3d, 0x96, 0x4a, 0x49, 0x99, 0xae, 0xb2, 0x77, + 0x49, 0xb1, 0xc4, 0x4f, 0x24, 0xa0, 0xe4, 0xef, 0xa7, 0x70, 0x1f, 0x08, 0x18, 0x57, 0x69, 0x23, + 0x59, 0xef, 0x77, 0xa9, 0x8f, 0xe4, 0x1c, 0xcb, 0x5d, 0x65, 0x6f, 0xae, 0x8d, 0xae, 0xf4, 0xbb, + 0xa4, 0x69, 0x4b, 0x58, 0x81, 0x0a, 0x47, 0xe6, 0xc9, 0x2e, 0x26, 0x95, 0x13, 0x83, 0xdf, 0xb5, + 0x61, 0x08, 0x74, 0xaf, 0xfb, 0x69, 0xbc, 0xd7, 0x2d, 0x51, 0x7e, 0xbc, 0x46, 0x7c, 0x18, 0xca, + 0x81, 0x11, 0x0b, 0x22, 0x8c, 0xf5, 0xfa, 0x5b, 0xf2, 0x2e, 0xda, 0x27, 0xaf, 0xdf, 0xa9, 0xaa, + 0xe7, 0xa5, 0x42, 0xaf, 0xbf, 0xf5, 0x34, 0xda, 0x27, 0xb9, 0x43, 0x51, 0x85, 0x92, 0x7f, 0x33, + 0x85, 0x1d, 0x87, 0x69, 0xf4, 0xf5, 0x16, 0xff, 0xae, 0x01, 0x29, 0x08, 0x17, 0x60, 0xf4, 0x9a, + 0x41, 0xb5, 0xf9, 0xb0, 0xdd, 0xd3, 0x55, 0xc3, 0x46, 0x9e, 0x2d, 0x19, 0xa5, 0x11, 0x2d, 0x18, + 0x25, 0x7a, 0x19, 0x7a, 0x50, 0x71, 0x15, 0x40, 0xb1, 0x6d, 0x53, 0xdb, 0xea, 0xbb, 0xec, 0xab, + 0xb3, 0x83, 0x69, 0xfd, 0xd9, 0x35, 0x45, 0x33, 0x9b, 0xb7, 0x33, 0xcd, 0x9e, 0x74, 0x69, 0x3c, + 0xda, 0xed, 0xe1, 0x24, 0xbe, 0x9e, 0x86, 0x0c, 0xdd, 0x6e, 0x0a, 0x4f, 0xf8, 0x93, 0x1f, 0x85, + 0x73, 0xd3, 0xc3, 0xba, 0x4f, 0xb1, 0x58, 0xef, 0x9d, 0x08, 0xea, 0x9e, 0x60, 0x46, 0xa1, 0x59, + 0x78, 0xf5, 0xa0, 0x9e, 0x25, 0xd1, 0xc7, 0xd2, 0x82, 0x9b, 0x5e, 0x18, 0xb6, 0xbb, 0xe6, 0xb9, + 0x8c, 0xf4, 0x91, 0x73, 0x19, 0x97, 0x61, 0xcc, 0x13, 0x6e, 0x69, 0x2d, 0xb6, 0x4f, 0x99, 0x3e, + 0x6c, 0xd1, 0x2d, 0x2d, 0xb0, 0xfe, 0x17, 0x9c, 0x70, 0x6c, 0xa9, 0x25, 0xcc, 0xf8, 0x37, 0xd9, + 0x24, 0x6a, 0xa3, 0xe1, 0x82, 0x67, 0xdf, 0x4c, 0x9e, 0xe4, 0xdf, 0x06, 0x79, 0xf2, 0xb0, 0x99, + 0xa0, 0xd0, 0xe8, 0x21, 0x87, 0x01, 0xa4, 0xf2, 0x34, 0x94, 0xdd, 0xc0, 0x86, 0xa2, 0xe4, 0x28, + 0x17, 0x17, 0x4c, 0x10, 0x1f, 0x84, 0x49, 0xf2, 0xa1, 0xbc, 0x20, 0x76, 0x9e, 0x60, 0x0b, 0xb8, + 0xee, 0xaa, 0x9f, 0xe2, 0x6e, 0x28, 0xb9, 0x26, 0x94, 0xe0, 0x02, 0x4d, 0x7d, 0x38, 0x50, 0x82, + 0x76, 0x02, 0x72, 0x4e, 0xd8, 0x59, 0xa0, 0x5f, 0xe0, 0x53, 0x68, 0xb4, 0xe9, 0x04, 0xb2, 0x26, + 0xb2, 0xfa, 0x1d, 0x9b, 0x31, 0x29, 0x12, 0x1c, 0x12, 0xc8, 0x4a, 0x14, 0x4e, 0x70, 0x4f, 0xc1, + 0x18, 0xb7, 0x2a, 0x14, 0x6f, 0x8c, 0xe0, 0x15, 0x39, 0x90, 0x20, 0x9d, 0x81, 0x4a, 0xcf, 0x34, + 0x7a, 0x86, 0x85, 0x4c, 0x59, 0x69, 0xb5, 0x4c, 0x64, 0x59, 0xd5, 0x12, 0xe5, 0xc7, 0xe1, 0x73, + 0x14, 0x2c, 0xbe, 0x07, 0xb2, 0x3c, 0x9e, 0x9e, 0x84, 0xd1, 0xa6, 0x63, 0x21, 0xd3, 0x12, 0x2d, + 0x60, 0xff, 0x3a, 0xd7, 0xeb, 0xb1, 0xec, 0x1a, 0xfe, 0x29, 0x76, 0x20, 0xcb, 0x26, 0x2c, 0x34, + 0xa7, 0xb2, 0x02, 0xc5, 0x9e, 0x62, 0xe2, 0x61, 0x78, 0x33, 0x2b, 0xc3, 0x76, 0x84, 0x6b, 0x8a, + 0x69, 0xaf, 0x23, 0xdb, 0x97, 0x60, 0x29, 0x10, 0x7a, 0x0a, 0x12, 0xcf, 0xc3, 0x98, 0x0f, 0xc7, + 0xfd, 0x5e, 0x21, 0x5b, 0xe8, 0xa4, 0xe0, 0xf4, 0x24, 0xe9, 0xf6, 0x44, 0xbc, 0x00, 0x79, 0x67, + 0xae, 0xf0, 0x46, 0x83, 0x8b, 0x82, 0x7d, 0x00, 0x91, 0x15, 0x49, 0x12, 0xc9, 0xb8, 0xce, 0x3e, + 0xe5, 0x94, 0x92, 0x68, 0x41, 0x44, 0x1e, 0xc3, 0x44, 0xbd, 0x99, 0xf0, 0x38, 0x64, 0x99, 0x61, + 0x62, 0xeb, 0x71, 0x58, 0xba, 0x68, 0x8d, 0x58, 0x2a, 0x9e, 0x2e, 0xa2, 0x76, 0xcb, 0x6d, 0x26, + 0xe9, 0x6d, 0xe6, 0x43, 0x90, 0xe3, 0xc6, 0xc7, 0xef, 0x25, 0x68, 0x0b, 0x27, 0xa3, 0xbc, 0x04, + 0x6b, 0xc4, 0x25, 0xc4, 0xda, 0x64, 0x69, 0x6d, 0x1d, 0xb5, 0x64, 0x77, 0x09, 0xb2, 0x07, 0xb3, + 0x65, 0x5a, 0xb1, 0xcc, 0xd7, 0x97, 0xf8, 0x20, 0x64, 0x68, 0x5f, 0x43, 0x4d, 0x5c, 0x98, 0x6b, + 0xfd, 0x6e, 0x02, 0x72, 0xdc, 0x7d, 0x84, 0x12, 0xf9, 0x06, 0x91, 0xbc, 0xd9, 0x41, 0xdc, 0x7a, + 0x93, 0x74, 0x3f, 0x08, 0x44, 0x53, 0xe4, 0x6b, 0x86, 0xad, 0xe9, 0x6d, 0x99, 0xce, 0x05, 0x7b, + 0x37, 0x48, 0x6a, 0xae, 0x92, 0x8a, 0x35, 0x0c, 0xbf, 0xf7, 0x14, 0x14, 0x3c, 0x59, 0x2e, 0x21, + 0x0b, 0xa9, 0x2b, 0xe8, 0x7a, 0x65, 0x44, 0x28, 0x40, 0x56, 0x42, 0x24, 0x47, 0x50, 0x49, 0x9c, + 0x7b, 0x3d, 0x0b, 0xe5, 0xb9, 0xe6, 0xfc, 0xd2, 0x5c, 0xaf, 0xd7, 0xd1, 0xd8, 0x7b, 0xba, 0x55, + 0x48, 0x93, 0x7d, 0x72, 0x8c, 0xf3, 0x9d, 0x5a, 0x9c, 0x84, 0x93, 0x20, 0xc1, 0x28, 0xd9, 0x4e, + 0x0b, 0x71, 0x8e, 0x7d, 0x6a, 0xb1, 0xf2, 0x50, 0xb8, 0x93, 0x44, 0xe1, 0x62, 0x9c, 0x06, 0xd5, + 0xe2, 0x24, 0xa7, 0x84, 0x9f, 0x81, 0xbc, 0xbb, 0x4f, 0x8e, 0x7b, 0x46, 0x54, 0x8b, 0x9d, 0xb6, + 0xc2, 0xfc, 0xdd, 0x9d, 0x41, 0xdc, 0xa3, 0x89, 0x5a, 0xec, 0x7c, 0x8d, 0xf0, 0x1c, 0x64, 0xf9, + 0x1e, 0x2c, 0xde, 0x29, 0x4e, 0x2d, 0x66, 0x4a, 0x09, 0x4f, 0x1f, 0xdd, 0x3a, 0xc7, 0x39, 0xaa, + 0xaa, 0xc5, 0xca, 0x9b, 0x09, 0x9b, 0x90, 0x61, 0xc1, 0x6f, 0xac, 0x93, 0x9e, 0x5a, 0xbc, 0x44, + 0x11, 0x16, 0xb2, 0x9b, 0x9c, 0x88, 0x7b, 0x3c, 0x57, 0x8b, 0x9d, 0x30, 0x14, 0x14, 0x00, 0xcf, + 0x7e, 0x3a, 0xf6, 0xb9, 0x5b, 0x2d, 0x7e, 0x22, 0x50, 0xf8, 0x20, 0xe4, 0x9c, 0x5d, 0x53, 0xcc, + 0x93, 0xb4, 0x5a, 0xdc, 0x5c, 0x5c, 0x73, 0x33, 0xf6, 0x2d, 0x89, 0xfb, 0x22, 0x6f, 0x49, 0xb8, + 0x87, 0xdc, 0xce, 0x31, 0xf8, 0x5f, 0x24, 0xe0, 0x44, 0xf0, 0x38, 0x59, 0xd1, 0xf7, 0x87, 0x5c, + 0x08, 0x18, 0x72, 0x5b, 0xe4, 0x71, 0x48, 0xcd, 0xe9, 0xfb, 0x38, 0xd8, 0x20, 0xdf, 0x00, 0xec, + 0x9b, 0x1d, 0x9e, 0xa6, 0xc3, 0xe5, 0x4d, 0xb3, 0x13, 0x7e, 0x6b, 0xa4, 0x91, 0xfe, 0xc1, 0x17, + 0xea, 0x23, 0xcd, 0xdd, 0x90, 0x51, 0x45, 0xdc, 0x15, 0xc8, 0xcd, 0xe9, 0xfb, 0xfc, 0x9a, 0xc0, + 0x28, 0x19, 0xd0, 0x51, 0x8f, 0xff, 0x5f, 0x2b, 0x62, 0xce, 0x9e, 0xef, 0x08, 0xb3, 0x11, 0x67, + 0x68, 0x69, 0xc8, 0x09, 0x7f, 0xf4, 0x8d, 0x81, 0xda, 0x70, 0x69, 0x8a, 0x97, 0x20, 0x3d, 0x6f, + 0x68, 0x24, 0xe4, 0x69, 0x21, 0xdd, 0xe8, 0xf2, 0x9c, 0x27, 0x29, 0x08, 0xa7, 0x20, 0xa3, 0x74, + 0x8d, 0xbe, 0x6e, 0xf3, 0xa8, 0x19, 0xbb, 0x92, 0xff, 0x7a, 0x50, 0x4f, 0x2d, 0xe9, 0xb6, 0xc4, + 0xaa, 0x1a, 0xe9, 0xef, 0xbd, 0x52, 0x4f, 0x88, 0x4f, 0x41, 0x76, 0x01, 0xa9, 0x37, 0xc3, 0x6b, + 0x01, 0xa9, 0x01, 0x5e, 0x67, 0x20, 0xb7, 0xa4, 0xdb, 0xf4, 0x9b, 0x61, 0x77, 0x40, 0x4a, 0xd3, + 0xe9, 0xb1, 0x48, 0xa0, 0x7d, 0x0c, 0xc7, 0xa8, 0x0b, 0x48, 0x75, 0x50, 0x5b, 0x48, 0x0d, 0xa2, + 0x62, 0xf6, 0x18, 0x2e, 0x36, 0xa1, 0x78, 0x55, 0xe9, 0xb0, 0x70, 0x0f, 0x59, 0xc2, 0xfd, 0x90, + 0x57, 0x78, 0x81, 0xec, 0xac, 0x8a, 0xcd, 0xd2, 0x0f, 0x0f, 0xea, 0xe0, 0x22, 0x49, 0x2e, 0x42, + 0x23, 0xfd, 0xf2, 0x7f, 0x3b, 0x99, 0x10, 0x0d, 0xc8, 0x5e, 0x52, 0x2c, 0x62, 0xe9, 0x1f, 0xf2, + 0x25, 0x52, 0x48, 0xa4, 0xd8, 0x3c, 0x76, 0xe3, 0xa0, 0x3e, 0xbe, 0xaf, 0x74, 0x3b, 0x0d, 0xd1, + 0xad, 0x13, 0xbd, 0xf9, 0x95, 0x59, 0x4f, 0x7e, 0x85, 0x44, 0x92, 0xcd, 0x89, 0x1b, 0x07, 0xf5, + 0xb2, 0x4b, 0x83, 0x6b, 0x44, 0x27, 0xe9, 0x22, 0xf6, 0x20, 0x43, 0x83, 0xde, 0xd0, 0x13, 0x42, + 0x96, 0xf2, 0x49, 0xba, 0x29, 0x9f, 0xc6, 0x91, 0xd2, 0x0c, 0x2c, 0x2e, 0xa3, 0x14, 0x8d, 0xf4, + 0xc7, 0x5e, 0xa9, 0x8f, 0x88, 0x26, 0x08, 0xeb, 0x5a, 0xb7, 0xdf, 0xa1, 0x0f, 0xbf, 0xf9, 0x51, + 0xd3, 0x43, 0xb4, 0xdf, 0x24, 0x9d, 0x44, 0x03, 0xb2, 0xf2, 0x2c, 0x53, 0x52, 0x26, 0x10, 0x1a, + 0x67, 0x7c, 0xeb, 0xa0, 0x9e, 0x20, 0xbd, 0x27, 0x32, 0xba, 0x07, 0x32, 0x34, 0x94, 0x67, 0xf1, + 0x4f, 0x89, 0xd3, 0xd0, 0x31, 0x49, 0xac, 0x56, 0x7c, 0x02, 0xb2, 0x2b, 0x56, 0x7b, 0x01, 0x0f, + 0xe9, 0x04, 0xe4, 0xba, 0x56, 0x5b, 0xf6, 0x44, 0x53, 0xd9, 0xae, 0xd5, 0xde, 0x18, 0x12, 0x85, + 0xb1, 0x69, 0x79, 0x2f, 0x64, 0x36, 0xf6, 0x08, 0xf9, 0x29, 0x47, 0x4a, 0x29, 0x6f, 0x1f, 0x19, + 0x77, 0x1f, 0xd1, 0x47, 0x52, 0x00, 0x1b, 0x7b, 0xce, 0x08, 0x87, 0x1c, 0xc1, 0x09, 0x22, 0x64, + 0xec, 0x3d, 0x27, 0xa2, 0xce, 0x37, 0xe1, 0xd5, 0x83, 0x7a, 0x66, 0x63, 0x0f, 0x6f, 0x2f, 0x24, + 0x56, 0xe3, 0x4f, 0x65, 0xa5, 0x02, 0xa9, 0x2c, 0x27, 0x81, 0x97, 0x0e, 0x49, 0xe0, 0x8d, 0x7a, + 0x4e, 0x00, 0x8e, 0x43, 0xd6, 0x54, 0xae, 0xcb, 0x78, 0x46, 0xe9, 0xd7, 0x4a, 0x33, 0xa6, 0x72, + 0x7d, 0xd9, 0x68, 0x0b, 0xf3, 0x90, 0xee, 0x18, 0x6d, 0x9e, 0x77, 0x9b, 0xe2, 0x83, 0xc2, 0x11, + 0x17, 0xbb, 0x4d, 0xbc, 0x6c, 0xb4, 0x9b, 0xc7, 0xb1, 0xfc, 0xbf, 0xfc, 0xa7, 0xf5, 0xb2, 0x1f, + 0x6e, 0x49, 0x84, 0xd8, 0x49, 0x06, 0xe6, 0x86, 0x26, 0x03, 0xf3, 0x87, 0x25, 0x03, 0xc1, 0x9f, + 0x0c, 0xbc, 0x8b, 0x9c, 0x69, 0xd2, 0x33, 0x9c, 0xc9, 0x81, 0xe0, 0x73, 0x4e, 0xdf, 0x27, 0xa7, + 0xa8, 0xb7, 0x43, 0xde, 0xb9, 0x28, 0xc4, 0x3e, 0x0f, 0xed, 0x02, 0x98, 0xbe, 0x7d, 0x2c, 0x01, + 0x25, 0x7f, 0x8f, 0x49, 0x3e, 0xc7, 0x6a, 0xb3, 0x0f, 0xab, 0xd2, 0xb4, 0x27, 0x56, 0x8a, 0x25, + 0x9e, 0x29, 0x0f, 0xe8, 0xfc, 0x5c, 0x40, 0xe7, 0x27, 0xb8, 0x80, 0xe8, 0xdb, 0x1d, 0xaa, 0xea, + 0x93, 0x4c, 0x3a, 0x45, 0x0f, 0xd0, 0x72, 0x55, 0x9f, 0x68, 0xc4, 0xcf, 0x42, 0xc1, 0x53, 0x1b, + 0x1a, 0xd4, 0x3f, 0x1a, 0x92, 0xec, 0x18, 0x77, 0x26, 0x84, 0xd7, 0xf0, 0x23, 0x04, 0x17, 0xd5, + 0x51, 0xd4, 0xbc, 0x83, 0x14, 0xf7, 0x7a, 0x45, 0x73, 0xe1, 0x4f, 0xbe, 0x33, 0x3d, 0xf2, 0xf2, + 0xab, 0xd3, 0x23, 0x43, 0xef, 0x67, 0x8a, 0xd1, 0x5f, 0xa2, 0x77, 0xbc, 0xcc, 0xc7, 0xdf, 0x0f, + 0xb7, 0x33, 0x1c, 0xcb, 0x56, 0x76, 0x35, 0xbd, 0xcd, 0xff, 0x32, 0x77, 0x53, 0x62, 0xa3, 0x61, + 0xd0, 0x9b, 0x77, 0x3b, 0x6f, 0xf6, 0xd2, 0x58, 0x2d, 0xcc, 0x1b, 0x8a, 0x07, 0x69, 0x10, 0x56, + 0xac, 0xf6, 0xbc, 0x89, 0xe8, 0xc7, 0x46, 0xd8, 0x3e, 0xc9, 0xff, 0xd8, 0x87, 0xd9, 0xa8, 0xdb, + 0x66, 0xfd, 0x63, 0x71, 0xbe, 0x2f, 0xed, 0xe6, 0x88, 0x7c, 0x4f, 0x84, 0x16, 0x01, 0x48, 0x7a, + 0xc5, 0xb2, 0xdc, 0x64, 0x5e, 0x3d, 0xc8, 0x63, 0xde, 0xc1, 0x90, 0x14, 0x1b, 0x59, 0x7c, 0xae, + 0x5d, 0x42, 0xe1, 0x43, 0x30, 0xd1, 0xd5, 0x74, 0xd9, 0x42, 0x9d, 0x6d, 0xb9, 0x85, 0x3a, 0xe4, + 0x53, 0x2c, 0xec, 0xe0, 0x2e, 0xdf, 0x5c, 0x66, 0x8e, 0xe9, 0x9e, 0xe8, 0x39, 0x9b, 0x5d, 0xd2, + 0xed, 0x1b, 0x07, 0xf5, 0x1a, 0xf5, 0x0e, 0x21, 0x2c, 0x45, 0x69, 0xbc, 0xab, 0xe9, 0xeb, 0xa8, + 0xb3, 0xbd, 0xe0, 0xc0, 0x84, 0x97, 0x60, 0x9c, 0x61, 0x18, 0x6e, 0xd2, 0x03, 0xdb, 0x9e, 0x62, + 0x73, 0xe5, 0xc6, 0x41, 0xbd, 0x4a, 0xb9, 0x0d, 0xa0, 0x88, 0x3f, 0x3c, 0xa8, 0x3f, 0x10, 0xa3, + 0x4f, 0x73, 0xaa, 0xca, 0xdd, 0x63, 0xc5, 0x61, 0xc2, 0x20, 0xb8, 0x6d, 0x37, 0x41, 0xcf, 0xdb, + 0x1e, 0x0d, 0xb6, 0x3d, 0x80, 0x12, 0xb7, 0x6d, 0x8f, 0x6b, 0x76, 0x33, 0xf8, 0xbc, 0xed, 0x29, + 0xc8, 0xf4, 0xfa, 0x5b, 0xfc, 0x14, 0x2d, 0x2f, 0xb1, 0x92, 0x30, 0xe3, 0x3d, 0x48, 0x2b, 0x9c, + 0x2b, 0xf2, 0xf9, 0xc4, 0xb1, 0x8a, 0x93, 0xe6, 0xa4, 0xb1, 0x1f, 0x89, 0x3e, 0xbe, 0x96, 0x82, + 0xca, 0x8a, 0xd5, 0x5e, 0x6c, 0x69, 0xf6, 0x2d, 0x56, 0xaf, 0x5e, 0x98, 0x74, 0x88, 0x37, 0x6b, + 0xce, 0xdf, 0x38, 0xa8, 0x97, 0xa8, 0x74, 0x6e, 0xa5, 0x4c, 0xba, 0x50, 0x76, 0xf5, 0x52, 0x36, + 0x15, 0x9b, 0xb9, 0xa7, 0xe6, 0x42, 0x4c, 0x0d, 0x5c, 0x40, 0xea, 0x8d, 0x83, 0xfa, 0x14, 0xed, + 0x59, 0x80, 0x95, 0x28, 0x95, 0x54, 0xdf, 0x5a, 0x10, 0xf6, 0xc2, 0x15, 0x9f, 0x9c, 0x3f, 0x35, + 0x2f, 0xbf, 0x85, 0x4a, 0xcf, 0xa6, 0xee, 0xab, 0x49, 0x28, 0x60, 0x57, 0x4f, 0xe1, 0x28, 0x7c, + 0x29, 0x24, 0x7e, 0x8c, 0x4b, 0x21, 0xf9, 0xf6, 0x2c, 0x85, 0x7b, 0x9d, 0x58, 0x3b, 0x35, 0x54, + 0xe7, 0xfd, 0x21, 0xf7, 0x7f, 0x4c, 0x11, 0xab, 0x4a, 0x76, 0x90, 0x12, 0x6a, 0xbd, 0x13, 0x04, + 0xf8, 0x73, 0x09, 0x38, 0xe6, 0x8a, 0xc7, 0x32, 0xd5, 0x80, 0x14, 0x9f, 0xb9, 0x71, 0x50, 0xbf, + 0x3d, 0x28, 0x45, 0x0f, 0xda, 0x4d, 0x48, 0x72, 0xc2, 0x61, 0xb4, 0x6e, 0xaa, 0xe1, 0xfd, 0x68, + 0x59, 0xb6, 0xd3, 0x8f, 0xd4, 0xf0, 0x7e, 0x78, 0xd0, 0xde, 0x54, 0x3f, 0x16, 0x2c, 0x7b, 0x70, + 0x52, 0xd3, 0x31, 0x27, 0xf5, 0xeb, 0x49, 0x18, 0x5b, 0xb1, 0xda, 0x9b, 0x7a, 0xeb, 0xdd, 0x05, + 0x71, 0xd4, 0x05, 0xf1, 0x89, 0x04, 0x94, 0x2e, 0x6b, 0x96, 0x6d, 0x98, 0x9a, 0xaa, 0x74, 0xc8, + 0x6e, 0xc6, 0xbd, 0x23, 0x99, 0x38, 0xfa, 0x1d, 0xc9, 0x47, 0x21, 0x73, 0x4d, 0xe9, 0xd0, 0x7f, + 0x6b, 0x94, 0x22, 0x67, 0x84, 0x01, 0xdf, 0x11, 0xcc, 0x01, 0x33, 0x74, 0xd6, 0x9d, 0xdf, 0x4a, + 0x42, 0x39, 0x10, 0x78, 0x08, 0x4d, 0x48, 0x13, 0x8b, 0x4e, 0x37, 0xbc, 0xb3, 0x47, 0x88, 0x2b, + 0xf0, 0x9e, 0x98, 0xd0, 0x0a, 0x3f, 0x05, 0xb9, 0xae, 0xb2, 0x47, 0x3d, 0x03, 0xdd, 0xdf, 0xcc, + 0x1d, 0x8d, 0x8f, 0xbb, 0x7b, 0xe5, 0x7c, 0x44, 0x29, 0xdb, 0x55, 0xf6, 0x88, 0x3f, 0xe8, 0x41, + 0x19, 0x43, 0xd5, 0x1d, 0x45, 0x6f, 0x23, 0xaf, 0xfb, 0xb9, 0x7c, 0xe4, 0x46, 0xa6, 0xdc, 0x46, + 0x3c, 0xec, 0x44, 0x69, 0xac, 0xab, 0xec, 0xcd, 0x13, 0x00, 0x6e, 0xb1, 0x91, 0xfb, 0xf4, 0x2b, + 0xf5, 0x11, 0x22, 0xb1, 0x7f, 0x9f, 0x00, 0x70, 0x25, 0x26, 0x6c, 0x40, 0x25, 0xe0, 0xbe, 0xf8, + 0x1d, 0xa3, 0xc8, 0x00, 0xcf, 0xdd, 0xd8, 0x96, 0xd5, 0xc0, 0x14, 0x7c, 0x10, 0x0a, 0xf4, 0x96, + 0x80, 0x4c, 0x92, 0xf1, 0xc9, 0xc8, 0x64, 0xfc, 0x34, 0xe6, 0x75, 0xe3, 0xa0, 0x2e, 0xd0, 0xe1, + 0x78, 0x88, 0x45, 0x92, 0xa2, 0x07, 0x0a, 0xc1, 0x04, 0xfe, 0xb1, 0x14, 0x3c, 0xb1, 0x05, 0xb9, + 0x7b, 0x66, 0xe8, 0xda, 0x2e, 0x32, 0x9d, 0x3d, 0x32, 0x2d, 0x0a, 0x35, 0xc8, 0xd1, 0xaf, 0x0a, + 0xda, 0xfb, 0xfc, 0xdf, 0x5a, 0xf0, 0x32, 0xa6, 0xba, 0x8e, 0xb6, 0x2c, 0x8d, 0xcf, 0x82, 0xc4, + 0x8b, 0xc2, 0x45, 0xa8, 0x58, 0x48, 0xed, 0x9b, 0x9a, 0xbd, 0x2f, 0xab, 0x86, 0x6e, 0x2b, 0xaa, + 0xcd, 0x9c, 0xf6, 0x6d, 0x37, 0x0e, 0xea, 0xc7, 0x69, 0x5f, 0x83, 0x18, 0xa2, 0x54, 0xe6, 0xa0, + 0x79, 0x0a, 0xc1, 0x2d, 0xb4, 0x90, 0xad, 0x68, 0x1d, 0x8b, 0x6d, 0x6c, 0x79, 0xd1, 0x33, 0x96, + 0xdf, 0xcc, 0x7a, 0x0f, 0xa3, 0xae, 0x43, 0xc5, 0xe8, 0x21, 0x33, 0xc4, 0x1e, 0x2d, 0xbb, 0x2d, + 0x07, 0x31, 0x6e, 0xc2, 0x24, 0x94, 0x39, 0x0f, 0x6e, 0x11, 0x2e, 0xfa, 0xee, 0x9c, 0xd1, 0xb8, + 0x31, 0x19, 0x1c, 0x72, 0x10, 0x43, 0xf4, 0x5e, 0x34, 0xa3, 0xd1, 0xe5, 0x14, 0x64, 0x5e, 0x50, + 0xb4, 0x0e, 0xff, 0xd4, 0xaa, 0xc4, 0x4a, 0xc2, 0x12, 0x64, 0x2c, 0x5b, 0xb1, 0xfb, 0x34, 0xf4, + 0x1e, 0x6d, 0xbe, 0x27, 0x66, 0x9f, 0x9b, 0x86, 0xde, 0x5a, 0x27, 0x84, 0x12, 0x63, 0x20, 0x5c, + 0x84, 0x8c, 0x6d, 0xec, 0x22, 0x9d, 0x09, 0xf5, 0x48, 0x2b, 0x9d, 0x24, 0xea, 0x28, 0xb5, 0x60, + 0x83, 0x6b, 0x94, 0x65, 0x6b, 0x47, 0x31, 0x91, 0x45, 0x43, 0xe5, 0xe6, 0xd2, 0x91, 0x97, 0xe3, + 0xf1, 0xa0, 0xa7, 0xa0, 0xfc, 0x44, 0xa9, 0xec, 0x80, 0xd6, 0x09, 0x24, 0x18, 0x39, 0x67, 0x6f, + 0x2a, 0x72, 0xbe, 0x08, 0x95, 0xbe, 0xbe, 0x65, 0xe8, 0xe4, 0xb3, 0x88, 0x2c, 0x4d, 0x93, 0x3b, + 0x99, 0x98, 0x49, 0x79, 0x67, 0x2b, 0x88, 0x21, 0x4a, 0x65, 0x07, 0xc4, 0x6e, 0x3f, 0xb6, 0xa0, + 0xe4, 0x62, 0x91, 0x25, 0x9b, 0x8f, 0x5c, 0xb2, 0x77, 0xb2, 0x25, 0x7b, 0x2c, 0xd8, 0x8a, 0xbb, + 0x6a, 0xc7, 0x1c, 0x20, 0x26, 0x13, 0xde, 0xef, 0xdb, 0x46, 0x02, 0x6b, 0x61, 0xa8, 0x95, 0x89, + 0xbf, 0x83, 0x2c, 0xbc, 0x2d, 0x3b, 0xc8, 0x46, 0xf1, 0x63, 0xaf, 0xd4, 0x47, 0x9c, 0x05, 0xfb, + 0x0b, 0x49, 0xc8, 0x2c, 0x5c, 0x25, 0xcf, 0x28, 0x7f, 0x42, 0xc3, 0x07, 0x8f, 0xf5, 0x7a, 0x1f, + 0x64, 0xa9, 0x2c, 0x2c, 0xe1, 0x1c, 0x8c, 0xf6, 0xf0, 0x0f, 0x96, 0x6b, 0x9c, 0x1a, 0x50, 0x69, + 0x82, 0xc7, 0x77, 0x98, 0x04, 0x55, 0xfc, 0x62, 0x0a, 0x60, 0xe1, 0xea, 0xd5, 0x0d, 0x53, 0xeb, + 0x75, 0x90, 0xfd, 0x6e, 0x78, 0xfd, 0xce, 0x09, 0xaf, 0x3d, 0x73, 0xfc, 0x34, 0x14, 0xdc, 0x39, + 0xb2, 0x84, 0xc7, 0x21, 0x67, 0xb3, 0xdf, 0x6c, 0xaa, 0x6b, 0x83, 0x53, 0xcd, 0xd1, 0xd9, 0x74, + 0x3b, 0x14, 0xe2, 0x7f, 0x49, 0x02, 0x44, 0x25, 0x67, 0x7e, 0x02, 0x02, 0xf0, 0x8b, 0x90, 0x61, + 0x1e, 0x27, 0x75, 0x53, 0xd1, 0x2a, 0xa3, 0xf6, 0xcc, 0xd2, 0x77, 0x92, 0x30, 0xb1, 0xc9, 0xcd, + 0xee, 0xbb, 0x12, 0x16, 0x2e, 0x43, 0x16, 0xe9, 0xb6, 0xa9, 0x21, 0x9e, 0x06, 0x9f, 0x09, 0x6a, + 0x69, 0x88, 0xb4, 0xc8, 0xbf, 0x4b, 0xe0, 0xb7, 0xe5, 0x18, 0xb9, 0x47, 0xc6, 0x9f, 0x4c, 0x41, + 0x75, 0x18, 0x95, 0x30, 0x0f, 0x65, 0xd5, 0x44, 0x04, 0x20, 0x7b, 0x4f, 0x4e, 0x9a, 0x35, 0x4f, + 0xc6, 0xc8, 0x8f, 0x20, 0x4a, 0x25, 0x0e, 0x61, 0x0e, 0xb9, 0x4d, 0x12, 0x54, 0x78, 0xa9, 0x60, + 0xac, 0x98, 0x41, 0xb4, 0xc8, 0x3c, 0xb2, 0x9b, 0x96, 0xf2, 0x32, 0xa0, 0x2e, 0xb9, 0xe4, 0x42, + 0x89, 0x4f, 0x7e, 0x11, 0xca, 0x9a, 0xae, 0xd9, 0x9a, 0xd2, 0x91, 0xb7, 0x94, 0x8e, 0xa2, 0xab, + 0x37, 0xb3, 0x15, 0xa1, 0xde, 0x94, 0x35, 0x1b, 0x60, 0x27, 0x4a, 0x25, 0x06, 0x69, 0x52, 0x00, + 0x9e, 0x11, 0xde, 0x54, 0xfa, 0xa6, 0x02, 0x37, 0x4e, 0xee, 0x99, 0x91, 0x5f, 0x4c, 0xc1, 0xb8, + 0x93, 0x9f, 0x79, 0x77, 0x2a, 0xe2, 0x4e, 0xc5, 0x0a, 0x00, 0x35, 0x20, 0xd8, 0x73, 0xdc, 0xc4, + 0x6c, 0x60, 0x13, 0x94, 0xa7, 0x1c, 0x16, 0x2c, 0xdb, 0x33, 0x1f, 0x7f, 0x9e, 0x82, 0xa2, 0x77, + 0x3e, 0xde, 0x75, 0xe9, 0xef, 0xa0, 0x8c, 0xd9, 0x9c, 0x6b, 0x12, 0xd3, 0xec, 0xbb, 0x28, 0x01, + 0x93, 0x38, 0xb0, 0x94, 0x86, 0xdb, 0xc2, 0xbf, 0x4c, 0x42, 0x86, 0xdd, 0xcb, 0x56, 0x07, 0x76, + 0x11, 0x89, 0xa8, 0x7b, 0xdf, 0x87, 0x6f, 0x22, 0x3e, 0x1d, 0xba, 0x89, 0x28, 0x75, 0x95, 0x3d, + 0xd9, 0xf7, 0x8a, 0x29, 0x31, 0x33, 0xd6, 0x3c, 0xe1, 0x72, 0xf1, 0xd7, 0xd3, 0x5c, 0x88, 0x7b, + 0x27, 0x57, 0x78, 0x14, 0x0a, 0x18, 0xc3, 0xf5, 0x0a, 0x98, 0x7c, 0xca, 0x4d, 0x3e, 0x78, 0x2a, + 0x45, 0x09, 0xba, 0xca, 0xde, 0x22, 0x2d, 0x08, 0xcb, 0x20, 0xec, 0x38, 0xa9, 0x2f, 0xd9, 0x15, + 0x21, 0xa6, 0xbf, 0xe3, 0xc6, 0x41, 0xfd, 0x04, 0xa5, 0x1f, 0xc4, 0x11, 0xa5, 0x71, 0x17, 0xc8, + 0xb9, 0x3d, 0x04, 0x80, 0xc7, 0x25, 0xd3, 0x3b, 0x21, 0x74, 0x0b, 0xeb, 0xb9, 0x28, 0xe1, 0xd6, + 0x89, 0x52, 0x1e, 0x17, 0x16, 0xf0, 0x6f, 0x8f, 0xe0, 0x7f, 0x29, 0x01, 0x82, 0xeb, 0x7b, 0x9c, + 0xf3, 0xfa, 0xf7, 0x93, 0x77, 0x89, 0x7c, 0x67, 0x94, 0x08, 0xdf, 0x64, 0xb9, 0x74, 0x7c, 0x93, + 0xe5, 0x59, 0xaa, 0xf7, 0xbb, 0xf6, 0x39, 0x39, 0x34, 0x2b, 0x18, 0x62, 0x83, 0xff, 0x20, 0x01, + 0x27, 0x06, 0x14, 0xc7, 0xe9, 0xd7, 0x55, 0x10, 0x4c, 0x4f, 0x25, 0xfb, 0x0f, 0x45, 0x09, 0xf6, + 0x0f, 0xff, 0x62, 0xea, 0xdf, 0xb8, 0x39, 0x60, 0xe3, 0x6f, 0x9d, 0x37, 0x61, 0x19, 0xc5, 0x04, + 0x4c, 0x7a, 0x9b, 0x77, 0x06, 0x70, 0x11, 0x8a, 0xde, 0xd6, 0x59, 0xd7, 0x6f, 0x3f, 0xac, 0xeb, + 0xac, 0xd7, 0x3e, 0x3a, 0x61, 0xc9, 0x5d, 0x7d, 0xfc, 0x7f, 0x4e, 0x46, 0x8d, 0xde, 0xb9, 0xc8, + 0x16, 0x58, 0x85, 0xb4, 0xc7, 0xff, 0x2f, 0x01, 0xe9, 0x35, 0xc3, 0xe8, 0x08, 0x06, 0x8c, 0xeb, + 0x86, 0x2d, 0x63, 0x65, 0x41, 0x2d, 0x99, 0xe5, 0x46, 0x68, 0x16, 0x74, 0xfe, 0x68, 0x42, 0xf9, + 0xfe, 0x41, 0x7d, 0x90, 0x95, 0x54, 0xd6, 0x0d, 0xbb, 0x49, 0x20, 0x1b, 0x34, 0x73, 0xf2, 0x21, + 0x18, 0xf3, 0x37, 0x46, 0x33, 0x45, 0xcf, 0x1e, 0xb9, 0x31, 0x3f, 0x9b, 0x1b, 0x07, 0xf5, 0x49, + 0x77, 0x11, 0x38, 0x60, 0x51, 0x2a, 0x6e, 0x79, 0x5a, 0x6f, 0xe4, 0xf0, 0xe8, 0x7f, 0xf0, 0x4a, + 0x3d, 0xd1, 0xbc, 0x38, 0xf4, 0x06, 0xc0, 0xfd, 0x87, 0x76, 0x61, 0xcf, 0x39, 0xea, 0xf7, 0xdf, + 0x05, 0xf8, 0xde, 0x59, 0xa8, 0x05, 0xee, 0x02, 0x90, 0x77, 0xc8, 0x43, 0x6e, 0x02, 0x1c, 0xfe, + 0x8f, 0xfe, 0x87, 0x5c, 0x14, 0x38, 0xf4, 0xb2, 0x81, 0xb8, 0x0b, 0x53, 0xe4, 0x2a, 0xa7, 0x6b, + 0xb6, 0xf8, 0x57, 0x62, 0xa6, 0x9c, 0x04, 0x5a, 0x82, 0xfd, 0x5f, 0x71, 0x9a, 0x0d, 0x3b, 0x0f, + 0xe0, 0xb6, 0xec, 0x3c, 0xb8, 0x61, 0x3d, 0xa5, 0xbd, 0xa7, 0xff, 0xf0, 0x9f, 0xb0, 0x91, 0x3c, + 0xc8, 0xe2, 0xaf, 0x26, 0xe0, 0xf8, 0x40, 0x6b, 0x4c, 0xeb, 0x9f, 0xf4, 0x3d, 0x18, 0x4d, 0xc4, + 0xcb, 0xd1, 0x7b, 0xbf, 0xfc, 0xd0, 0x08, 0xe9, 0x57, 0x2d, 0xac, 0x5f, 0xb4, 0x41, 0x5f, 0xc7, + 0x5e, 0x84, 0x63, 0xfe, 0x7e, 0x71, 0x21, 0x3c, 0x07, 0x25, 0xff, 0x6e, 0x81, 0x85, 0x12, 0xef, + 0x39, 0xba, 0x87, 0x1c, 0xf3, 0xed, 0x18, 0xc4, 0x67, 0x83, 0x82, 0x77, 0x24, 0xf1, 0xbe, 0xc1, + 0xcb, 0xf7, 0x91, 0x82, 0xf0, 0xbc, 0xcd, 0xfa, 0x6a, 0x02, 0x4e, 0xfa, 0x39, 0xbb, 0x46, 0xd8, + 0x7a, 0xcb, 0xc7, 0xf5, 0x66, 0xd4, 0xe3, 0x3f, 0x25, 0xe0, 0xce, 0x43, 0x7a, 0xce, 0xc4, 0x63, + 0xc2, 0xa4, 0xc7, 0xba, 0x9b, 0x0c, 0xcc, 0x55, 0x46, 0x1c, 0xee, 0x81, 0x1c, 0xe3, 0x76, 0x1b, + 0xbb, 0x8a, 0x34, 0x31, 0x58, 0x67, 0x49, 0x13, 0x83, 0x16, 0xf9, 0xcd, 0xe9, 0xd6, 0x37, 0x12, + 0x70, 0xc6, 0x3f, 0xaa, 0x90, 0x1d, 0xdd, 0x3b, 0x7b, 0x62, 0xfe, 0x4d, 0x02, 0xee, 0x8d, 0x33, + 0x04, 0x36, 0x43, 0xcf, 0xc3, 0x84, 0x1b, 0x5f, 0x05, 0x27, 0xe8, 0x54, 0x8c, 0x5d, 0x31, 0x53, + 0x6a, 0xc1, 0xe1, 0x72, 0x6b, 0x66, 0xe2, 0x8f, 0x12, 0x6c, 0xcd, 0x79, 0xe7, 0xdd, 0x11, 0xbb, + 0x7f, 0x4b, 0x70, 0x44, 0xb1, 0x7b, 0xb6, 0x05, 0x63, 0xbe, 0x6d, 0x41, 0xc8, 0x84, 0x26, 0x6f, + 0x91, 0x05, 0xf9, 0x79, 0x6e, 0x4d, 0x43, 0x82, 0xb3, 0x5d, 0x98, 0x08, 0x59, 0x24, 0xce, 0x8b, + 0xd3, 0xe8, 0x35, 0x32, 0xf5, 0xc3, 0x83, 0x7a, 0x48, 0xd4, 0x27, 0x09, 0x83, 0xcb, 0x43, 0xfc, + 0xcf, 0x09, 0xa8, 0x93, 0x8e, 0x84, 0x4c, 0xe5, 0x5f, 0x67, 0x01, 0x23, 0x66, 0x48, 0x43, 0x87, + 0xc5, 0x04, 0x3d, 0x07, 0x19, 0xaa, 0xa5, 0x4c, 0xb6, 0x47, 0x50, 0x6f, 0x46, 0xe8, 0x1a, 0xec, + 0x05, 0x3e, 0xae, 0x70, 0xbb, 0xf0, 0x16, 0xc9, 0xef, 0x4d, 0xd8, 0x85, 0x7f, 0xc5, 0x0d, 0x76, + 0x78, 0xcf, 0x99, 0x88, 0x3e, 0xf8, 0xa6, 0x0d, 0x36, 0xfb, 0x92, 0xd0, 0x5b, 0x66, 0x99, 0x9d, + 0xee, 0x47, 0x58, 0xe6, 0x77, 0xde, 0x0c, 0x38, 0x96, 0x39, 0x62, 0x08, 0xef, 0x70, 0xcb, 0x7c, + 0x23, 0x09, 0x27, 0xc8, 0x30, 0xbc, 0x3b, 0x92, 0xb7, 0x41, 0xf2, 0x32, 0x08, 0x96, 0xa9, 0xca, + 0xb7, 0xca, 0x7e, 0x54, 0x2c, 0x53, 0xbd, 0xea, 0x73, 0xba, 0x32, 0x08, 0x2d, 0xcb, 0x0e, 0x36, + 0x90, 0xba, 0xe9, 0x06, 0x5a, 0x96, 0x7d, 0xf5, 0x10, 0xaf, 0x9e, 0x3e, 0x8a, 0xee, 0xfc, 0x7e, + 0x02, 0x6a, 0x61, 0x42, 0x67, 0xba, 0xa2, 0xc0, 0x94, 0x6f, 0x1f, 0x1d, 0x54, 0x97, 0xbb, 0x0e, + 0xdb, 0x4d, 0x06, 0x96, 0xee, 0x31, 0x13, 0xdd, 0xea, 0xc5, 0xfb, 0x15, 0xee, 0x74, 0x1c, 0xcd, + 0x1f, 0xdc, 0xc2, 0xbc, 0x23, 0x97, 0xec, 0xaf, 0x0f, 0x98, 0xfb, 0x77, 0xda, 0x6e, 0xe8, 0x8f, + 0x13, 0x30, 0x3d, 0xa4, 0x87, 0x7f, 0x9d, 0xdd, 0xf9, 0xcf, 0x0e, 0x55, 0x98, 0x5b, 0xb5, 0xf5, + 0x7a, 0x88, 0x2d, 0x28, 0xff, 0xbd, 0x35, 0xcf, 0x86, 0x3a, 0xf4, 0x1b, 0x73, 0xcf, 0xc0, 0x6d, + 0xa1, 0x54, 0xac, 0x4f, 0xe7, 0x20, 0xbd, 0xa3, 0x59, 0xb6, 0xf3, 0xe1, 0x85, 0x40, 0x77, 0x02, + 0x54, 0x04, 0x57, 0x14, 0xa0, 0x42, 0x58, 0xae, 0x19, 0x46, 0x87, 0x35, 0x2f, 0xce, 0xc3, 0xb8, + 0x07, 0xc6, 0x98, 0xcf, 0x42, 0xba, 0x67, 0x18, 0x1d, 0xc6, 0x7c, 0x32, 0xc8, 0x1c, 0xe3, 0xb2, + 0x61, 0x12, 0x3c, 0x71, 0x12, 0x04, 0xca, 0x84, 0x7e, 0x12, 0x84, 0xb1, 0xfe, 0x68, 0x02, 0x26, + 0x7c, 0x60, 0xe7, 0xd1, 0x52, 0xc6, 0xf7, 0x35, 0xa9, 0x81, 0x23, 0x7a, 0x8a, 0xef, 0x3c, 0x4f, + 0xa7, 0xd9, 0xdd, 0x37, 0xa1, 0xba, 0xe7, 0xfe, 0xb0, 0xc8, 0x5f, 0xb9, 0xca, 0x00, 0x9e, 0x54, + 0xec, 0x3d, 0xc1, 0x96, 0xc3, 0x93, 0x1e, 0xb5, 0xd3, 0x91, 0x78, 0x2c, 0xe6, 0x1d, 0x11, 0x7e, + 0xca, 0x7b, 0x8d, 0xea, 0xee, 0xc3, 0xe9, 0x38, 0xfb, 0x7b, 0xa2, 0xd0, 0x1c, 0xee, 0x7f, 0x03, + 0x26, 0xc3, 0x76, 0xc1, 0xc2, 0x83, 0x87, 0x73, 0x18, 0x8c, 0x5b, 0x6a, 0xef, 0x39, 0x02, 0x85, + 0xd3, 0xfc, 0xa7, 0x13, 0x70, 0xc7, 0xa1, 0x9b, 0x3d, 0xe1, 0xfc, 0xe1, 0x6c, 0x0f, 0x89, 0xa4, + 0x6a, 0x8d, 0x9b, 0x21, 0x75, 0xba, 0x26, 0xfb, 0xce, 0xf3, 0xc3, 0x25, 0x3a, 0xb0, 0xff, 0x18, + 0x32, 0xb1, 0x83, 0xb1, 0xa6, 0x38, 0x22, 0xbc, 0x14, 0x7e, 0xae, 0x7d, 0x36, 0x94, 0xc3, 0xf0, + 0x2d, 0x4f, 0xed, 0xc1, 0xf8, 0x04, 0xde, 0x69, 0x0f, 0x8b, 0xa5, 0x87, 0x4c, 0xfb, 0x21, 0x1b, + 0x86, 0x21, 0xd3, 0x7e, 0x58, 0xa0, 0xce, 0xa6, 0xfd, 0xd0, 0x48, 0x72, 0xc8, 0xb4, 0xc7, 0x09, + 0xa0, 0x87, 0x4c, 0x7b, 0xac, 0xc0, 0x55, 0x1c, 0x11, 0x76, 0x60, 0xcc, 0x17, 0xa7, 0x08, 0x67, + 0x42, 0xd9, 0x85, 0x05, 0x90, 0xb5, 0x7b, 0xe3, 0xa0, 0x7a, 0xe7, 0x3f, 0xc4, 0x35, 0x0f, 0x99, + 0xff, 0xe1, 0xd1, 0x47, 0xed, 0xc1, 0xf8, 0x04, 0x4e, 0xdb, 0xd7, 0x9d, 0xa3, 0x16, 0x0f, 0x82, + 0x30, 0x1b, 0x93, 0x13, 0x6f, 0xf9, 0x6c, 0x6c, 0x7c, 0xa7, 0xe1, 0xdd, 0x81, 0xdb, 0xd6, 0xe1, + 0x42, 0x0b, 0x75, 0x6d, 0xb5, 0xfb, 0x62, 0xe1, 0x3a, 0x8d, 0xad, 0xb0, 0x73, 0x84, 0x93, 0xa1, + 0x64, 0x1e, 0xa7, 0x55, 0xbb, 0xf3, 0x10, 0x0c, 0x87, 0xdd, 0xba, 0x73, 0x30, 0x28, 0x86, 0xa3, + 0x7b, 0x9d, 0x55, 0xed, 0xd4, 0xa1, 0x38, 0x9c, 0xe9, 0xad, 0x4e, 0xf5, 0xff, 0xff, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xbb, 0x30, 0x47, 0x73, 0xa8, 0x97, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) From 819aa66ce4e8f96c223f893eb2ec615c66fcf04f Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Mon, 27 Jul 2020 14:33:47 -0400 Subject: [PATCH 22/40] Cleanup --- codec/proto_codec.go | 4 +++- proto/cosmos/tx/sig_desc.proto | 6 ++++-- simapp/params/proto.go | 6 +++--- types/tx/signing/signature.go | 4 +--- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/codec/proto_codec.go b/codec/proto_codec.go index 2a2befc33261..d92d3eb66654 100644 --- a/codec/proto_codec.go +++ b/codec/proto_codec.go @@ -17,7 +17,9 @@ type ProtoCodec struct { anyUnpacker types.AnyUnpacker } -func NewProtoCodec(anyUnpacker types.AnyUnpacker) Marshaler { +var _ Marshaler = &ProtoCodec{} + +func NewProtoCodec(anyUnpacker types.AnyUnpacker) *ProtoCodec { return &ProtoCodec{anyUnpacker: anyUnpacker} } diff --git a/proto/cosmos/tx/sig_desc.proto b/proto/cosmos/tx/sig_desc.proto index 4d232632dc63..05b69b09b02d 100644 --- a/proto/cosmos/tx/sig_desc.proto +++ b/proto/cosmos/tx/sig_desc.proto @@ -7,13 +7,15 @@ import "cosmos/tx/signing/signing.proto"; option go_package = "github.com/cosmos/cosmos-sdk/types/tx"; -// SignatureDescriptors wraps multiple SignatureDescriptor's +// SignatureDescriptors wraps multiple SignatureDescriptor's. message SignatureDescriptors { + // signatures are the signature descriptors repeated SignatureDescriptor signatures = 1; } // SignatureDescriptor is a convenience type which represents the full data for a -// signature including the public key of the signer, signing modes and the signature itself +// signature including the public key of the signer, signing modes and the signature +// itself. It is primarily used for coordinating signatures between clients. message SignatureDescriptor { // public_key is the public key of the signer cosmos.crypto.PublicKey public_key = 1; diff --git a/simapp/params/proto.go b/simapp/params/proto.go index a5c859ada421..97e282ba3426 100644 --- a/simapp/params/proto.go +++ b/simapp/params/proto.go @@ -14,12 +14,12 @@ import ( func MakeEncodingConfig() EncodingConfig { cdc := codec.New() interfaceRegistry := types.NewInterfaceRegistry() - marshaler := codec.NewHybridCodec(cdc, interfaceRegistry) - txGen := tx.NewTxConfig(interfaceRegistry, std.DefaultPublicKeyCodec{}, tx.DefaultSignModeHandler()) + protoCodec := codec.NewProtoCodec(interfaceRegistry) + txGen := tx.NewTxConfig(protoCodec, std.DefaultPublicKeyCodec{}, tx.DefaultSignModeHandler()) return EncodingConfig{ InterfaceRegistry: interfaceRegistry, - Marshaler: marshaler, + Marshaler: protoCodec, TxConfig: txGen, Amino: cdc, } diff --git a/types/tx/signing/signature.go b/types/tx/signing/signature.go index e05fa41ab301..47744de28433 100644 --- a/types/tx/signing/signature.go +++ b/types/tx/signing/signature.go @@ -1,8 +1,6 @@ package signing -import ( - "github.com/tendermint/tendermint/crypto" -) +import "github.com/tendermint/tendermint/crypto" // SignatureV2 is a convenience type that is easier to use in application logic // than the protobuf SignerInfo's and raw signature bytes. It goes beyond the From 07f22b20f09d7894ce42043e4ed31b72fb813e6e Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Mon, 27 Jul 2020 14:46:03 -0400 Subject: [PATCH 23/40] Cleanup --- proto/cosmos/tx/sig_desc.proto | 54 - proto/cosmos/tx/signing/signing.proto | 48 + types/tx/sig_desc.pb.go | 1359 +----------------------- types/tx/signing/signature.go | 61 +- types/tx/signing/signing.pb.go | 1366 ++++++++++++++++++++++++- x/auth/tx/sigs.go | 67 +- 6 files changed, 1476 insertions(+), 1479 deletions(-) delete mode 100644 proto/cosmos/tx/sig_desc.proto diff --git a/proto/cosmos/tx/sig_desc.proto b/proto/cosmos/tx/sig_desc.proto deleted file mode 100644 index 05b69b09b02d..000000000000 --- a/proto/cosmos/tx/sig_desc.proto +++ /dev/null @@ -1,54 +0,0 @@ -syntax = "proto3"; -package cosmos.tx; - -import "cosmos/crypto/crypto.proto"; -import "cosmos/tx/signing/signing.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/types/tx"; - - -// SignatureDescriptors wraps multiple SignatureDescriptor's. -message SignatureDescriptors { - // signatures are the signature descriptors - repeated SignatureDescriptor signatures = 1; -} - -// SignatureDescriptor is a convenience type which represents the full data for a -// signature including the public key of the signer, signing modes and the signature -// itself. It is primarily used for coordinating signatures between clients. -message SignatureDescriptor { - // public_key is the public key of the signer - cosmos.crypto.PublicKey public_key = 1; - - // data represents the signature data - Data data = 2; - - message Data { - // sum is the oneof that specifies whether this represents single or multi-signature data - oneof sum { - // single represents a single signer - Single single = 1; - - // multi represents a multisig signer - Multi multi = 2; - } - - // Single is the signature data for a single signer - message Single { - // mode is the signing mode of the single signer - cosmos.tx.signing.SignMode mode = 1; - - // signature is the raw signature bytes - bytes signature = 2; - } - - // Multi is the signature data for a multisig public key - message Multi { - // bitarray specifies which keys within the multisig are signing - cosmos.crypto.CompactBitArray bitarray = 1; - - // signatures is the signatures of the multi-signature - repeated Data signatures = 2; - } - } -} \ No newline at end of file diff --git a/proto/cosmos/tx/signing/signing.proto b/proto/cosmos/tx/signing/signing.proto index c4536e09a5bf..0b4ac176e3c1 100644 --- a/proto/cosmos/tx/signing/signing.proto +++ b/proto/cosmos/tx/signing/signing.proto @@ -1,6 +1,8 @@ syntax = "proto3"; package cosmos.tx.signing; +import "cosmos/crypto/crypto.proto"; + option go_package = "github.com/cosmos/cosmos-sdk/types/tx/signing"; // SignMode represents a signing mode with its own security guarantees @@ -20,3 +22,49 @@ enum SignMode { // Amino JSON and will be removed in the future SIGN_MODE_LEGACY_AMINO_JSON = 127; } + +// SignatureDescriptors wraps multiple SignatureDescriptor's. +message SignatureDescriptors { + // signatures are the signature descriptors + repeated SignatureDescriptor signatures = 1; +} + +// SignatureDescriptor is a convenience type which represents the full data for a +// signature including the public key of the signer, signing modes and the signature +// itself. It is primarily used for coordinating signatures between clients. +message SignatureDescriptor { + // public_key is the public key of the signer + cosmos.crypto.PublicKey public_key = 1; + + // data represents the signature data + Data data = 2; + + message Data { + // sum is the oneof that specifies whether this represents single or multi-signature data + oneof sum { + // single represents a single signer + Single single = 1; + + // multi represents a multisig signer + Multi multi = 2; + } + + // Single is the signature data for a single signer + message Single { + // mode is the signing mode of the single signer + cosmos.tx.signing.SignMode mode = 1; + + // signature is the raw signature bytes + bytes signature = 2; + } + + // Multi is the signature data for a multisig public key + message Multi { + // bitarray specifies which keys within the multisig are signing + cosmos.crypto.CompactBitArray bitarray = 1; + + // signatures is the signatures of the multi-signature + repeated Data signatures = 2; + } + } +} diff --git a/types/tx/sig_desc.pb.go b/types/tx/sig_desc.pb.go index 16bc861e4f89..4270c8a6d588 100644 --- a/types/tx/sig_desc.pb.go +++ b/types/tx/sig_desc.pb.go @@ -5,12 +5,9 @@ package tx import ( fmt "fmt" - types "github.com/cosmos/cosmos-sdk/crypto/types" - signing "github.com/cosmos/cosmos-sdk/types/tx/signing" + _ "github.com/cosmos/cosmos-sdk/types/tx/signing" proto "github.com/gogo/protobuf/proto" - io "io" math "math" - math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -24,1351 +21,17 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -// SignatureDescriptors wraps multiple SignatureDescriptor's -type SignatureDescriptors struct { - Signatures []*SignatureDescriptor `protobuf:"bytes,1,rep,name=signatures,proto3" json:"signatures,omitempty"` -} - -func (m *SignatureDescriptors) Reset() { *m = SignatureDescriptors{} } -func (m *SignatureDescriptors) String() string { return proto.CompactTextString(m) } -func (*SignatureDescriptors) ProtoMessage() {} -func (*SignatureDescriptors) Descriptor() ([]byte, []int) { - return fileDescriptor_d560eb6bd3d62ef7, []int{0} -} -func (m *SignatureDescriptors) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SignatureDescriptors) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SignatureDescriptors.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *SignatureDescriptors) XXX_Merge(src proto.Message) { - xxx_messageInfo_SignatureDescriptors.Merge(m, src) -} -func (m *SignatureDescriptors) XXX_Size() int { - return m.Size() -} -func (m *SignatureDescriptors) XXX_DiscardUnknown() { - xxx_messageInfo_SignatureDescriptors.DiscardUnknown(m) -} - -var xxx_messageInfo_SignatureDescriptors proto.InternalMessageInfo - -func (m *SignatureDescriptors) GetSignatures() []*SignatureDescriptor { - if m != nil { - return m.Signatures - } - return nil -} - -// SignatureDescriptor is a convenience type which represents the full data for a -// signature including the public key of the signer, signing modes and the signature itself -type SignatureDescriptor struct { - // public_key is the public key of the signer - PublicKey *types.PublicKey `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` - // data represents the signature data - Data *SignatureDescriptor_Data `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` -} - -func (m *SignatureDescriptor) Reset() { *m = SignatureDescriptor{} } -func (m *SignatureDescriptor) String() string { return proto.CompactTextString(m) } -func (*SignatureDescriptor) ProtoMessage() {} -func (*SignatureDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_d560eb6bd3d62ef7, []int{1} -} -func (m *SignatureDescriptor) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SignatureDescriptor) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SignatureDescriptor.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *SignatureDescriptor) XXX_Merge(src proto.Message) { - xxx_messageInfo_SignatureDescriptor.Merge(m, src) -} -func (m *SignatureDescriptor) XXX_Size() int { - return m.Size() -} -func (m *SignatureDescriptor) XXX_DiscardUnknown() { - xxx_messageInfo_SignatureDescriptor.DiscardUnknown(m) -} - -var xxx_messageInfo_SignatureDescriptor proto.InternalMessageInfo - -func (m *SignatureDescriptor) GetPublicKey() *types.PublicKey { - if m != nil { - return m.PublicKey - } - return nil -} - -func (m *SignatureDescriptor) GetData() *SignatureDescriptor_Data { - if m != nil { - return m.Data - } - return nil -} - -type SignatureDescriptor_Data struct { - // sum is the oneof that specifies whether this represents single or multi-signature data - // - // Types that are valid to be assigned to Sum: - // *SignatureDescriptor_Data_Single_ - // *SignatureDescriptor_Data_Multi_ - Sum isSignatureDescriptor_Data_Sum `protobuf_oneof:"sum"` -} - -func (m *SignatureDescriptor_Data) Reset() { *m = SignatureDescriptor_Data{} } -func (m *SignatureDescriptor_Data) String() string { return proto.CompactTextString(m) } -func (*SignatureDescriptor_Data) ProtoMessage() {} -func (*SignatureDescriptor_Data) Descriptor() ([]byte, []int) { - return fileDescriptor_d560eb6bd3d62ef7, []int{1, 0} -} -func (m *SignatureDescriptor_Data) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SignatureDescriptor_Data) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SignatureDescriptor_Data.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *SignatureDescriptor_Data) XXX_Merge(src proto.Message) { - xxx_messageInfo_SignatureDescriptor_Data.Merge(m, src) -} -func (m *SignatureDescriptor_Data) XXX_Size() int { - return m.Size() -} -func (m *SignatureDescriptor_Data) XXX_DiscardUnknown() { - xxx_messageInfo_SignatureDescriptor_Data.DiscardUnknown(m) -} - -var xxx_messageInfo_SignatureDescriptor_Data proto.InternalMessageInfo - -type isSignatureDescriptor_Data_Sum interface { - isSignatureDescriptor_Data_Sum() - MarshalTo([]byte) (int, error) - Size() int -} - -type SignatureDescriptor_Data_Single_ struct { - Single *SignatureDescriptor_Data_Single `protobuf:"bytes,1,opt,name=single,proto3,oneof" json:"single,omitempty"` -} -type SignatureDescriptor_Data_Multi_ struct { - Multi *SignatureDescriptor_Data_Multi `protobuf:"bytes,2,opt,name=multi,proto3,oneof" json:"multi,omitempty"` -} - -func (*SignatureDescriptor_Data_Single_) isSignatureDescriptor_Data_Sum() {} -func (*SignatureDescriptor_Data_Multi_) isSignatureDescriptor_Data_Sum() {} - -func (m *SignatureDescriptor_Data) GetSum() isSignatureDescriptor_Data_Sum { - if m != nil { - return m.Sum - } - return nil -} - -func (m *SignatureDescriptor_Data) GetSingle() *SignatureDescriptor_Data_Single { - if x, ok := m.GetSum().(*SignatureDescriptor_Data_Single_); ok { - return x.Single - } - return nil -} - -func (m *SignatureDescriptor_Data) GetMulti() *SignatureDescriptor_Data_Multi { - if x, ok := m.GetSum().(*SignatureDescriptor_Data_Multi_); ok { - return x.Multi - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*SignatureDescriptor_Data) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*SignatureDescriptor_Data_Single_)(nil), - (*SignatureDescriptor_Data_Multi_)(nil), - } -} - -// Single is the signature data for a single signer -type SignatureDescriptor_Data_Single struct { - // mode is the signing mode of the single signer - Mode signing.SignMode `protobuf:"varint,1,opt,name=mode,proto3,enum=cosmos.tx.signing.SignMode" json:"mode,omitempty"` - // signature is the raw signature bytes - Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` -} - -func (m *SignatureDescriptor_Data_Single) Reset() { *m = SignatureDescriptor_Data_Single{} } -func (m *SignatureDescriptor_Data_Single) String() string { return proto.CompactTextString(m) } -func (*SignatureDescriptor_Data_Single) ProtoMessage() {} -func (*SignatureDescriptor_Data_Single) Descriptor() ([]byte, []int) { - return fileDescriptor_d560eb6bd3d62ef7, []int{1, 0, 0} -} -func (m *SignatureDescriptor_Data_Single) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SignatureDescriptor_Data_Single) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SignatureDescriptor_Data_Single.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *SignatureDescriptor_Data_Single) XXX_Merge(src proto.Message) { - xxx_messageInfo_SignatureDescriptor_Data_Single.Merge(m, src) -} -func (m *SignatureDescriptor_Data_Single) XXX_Size() int { - return m.Size() -} -func (m *SignatureDescriptor_Data_Single) XXX_DiscardUnknown() { - xxx_messageInfo_SignatureDescriptor_Data_Single.DiscardUnknown(m) -} - -var xxx_messageInfo_SignatureDescriptor_Data_Single proto.InternalMessageInfo - -func (m *SignatureDescriptor_Data_Single) GetMode() signing.SignMode { - if m != nil { - return m.Mode - } - return signing.SignMode_SIGN_MODE_UNSPECIFIED -} - -func (m *SignatureDescriptor_Data_Single) GetSignature() []byte { - if m != nil { - return m.Signature - } - return nil -} - -// Multi is the signature data for a multisig public key -type SignatureDescriptor_Data_Multi struct { - // bitarray specifies which keys within the multisig are signing - Bitarray *types.CompactBitArray `protobuf:"bytes,1,opt,name=bitarray,proto3" json:"bitarray,omitempty"` - // signatures is the signatures of the multi-signature - Signatures []*SignatureDescriptor_Data `protobuf:"bytes,2,rep,name=signatures,proto3" json:"signatures,omitempty"` -} - -func (m *SignatureDescriptor_Data_Multi) Reset() { *m = SignatureDescriptor_Data_Multi{} } -func (m *SignatureDescriptor_Data_Multi) String() string { return proto.CompactTextString(m) } -func (*SignatureDescriptor_Data_Multi) ProtoMessage() {} -func (*SignatureDescriptor_Data_Multi) Descriptor() ([]byte, []int) { - return fileDescriptor_d560eb6bd3d62ef7, []int{1, 0, 1} -} -func (m *SignatureDescriptor_Data_Multi) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SignatureDescriptor_Data_Multi) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SignatureDescriptor_Data_Multi.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *SignatureDescriptor_Data_Multi) XXX_Merge(src proto.Message) { - xxx_messageInfo_SignatureDescriptor_Data_Multi.Merge(m, src) -} -func (m *SignatureDescriptor_Data_Multi) XXX_Size() int { - return m.Size() -} -func (m *SignatureDescriptor_Data_Multi) XXX_DiscardUnknown() { - xxx_messageInfo_SignatureDescriptor_Data_Multi.DiscardUnknown(m) -} - -var xxx_messageInfo_SignatureDescriptor_Data_Multi proto.InternalMessageInfo - -func (m *SignatureDescriptor_Data_Multi) GetBitarray() *types.CompactBitArray { - if m != nil { - return m.Bitarray - } - return nil -} - -func (m *SignatureDescriptor_Data_Multi) GetSignatures() []*SignatureDescriptor_Data { - if m != nil { - return m.Signatures - } - return nil -} - -func init() { - proto.RegisterType((*SignatureDescriptors)(nil), "cosmos.tx.SignatureDescriptors") - proto.RegisterType((*SignatureDescriptor)(nil), "cosmos.tx.SignatureDescriptor") - proto.RegisterType((*SignatureDescriptor_Data)(nil), "cosmos.tx.SignatureDescriptor.Data") - proto.RegisterType((*SignatureDescriptor_Data_Single)(nil), "cosmos.tx.SignatureDescriptor.Data.Single") - proto.RegisterType((*SignatureDescriptor_Data_Multi)(nil), "cosmos.tx.SignatureDescriptor.Data.Multi") -} - func init() { proto.RegisterFile("cosmos/tx/sig_desc.proto", fileDescriptor_d560eb6bd3d62ef7) } var fileDescriptor_d560eb6bd3d62ef7 = []byte{ - // 409 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xcf, 0xeb, 0xd3, 0x40, - 0x10, 0xc5, 0x93, 0x7e, 0xd3, 0x62, 0xa7, 0xe2, 0x61, 0xf5, 0x10, 0xa2, 0xac, 0xa5, 0x22, 0x54, - 0xc1, 0x04, 0xea, 0xa1, 0xe0, 0x41, 0xe9, 0x8f, 0x43, 0x41, 0x0a, 0xb2, 0x05, 0x05, 0x2f, 0x65, - 0x93, 0x2c, 0x71, 0x69, 0x93, 0x0d, 0xd9, 0x0d, 0x34, 0x77, 0x0f, 0x1e, 0xfd, 0xb3, 0x3c, 0xf6, - 0xe8, 0x51, 0xda, 0xff, 0xc2, 0x93, 0x64, 0x93, 0xd4, 0x56, 0x8a, 0xf4, 0x34, 0xed, 0xe6, 0x7d, - 0xde, 0x3c, 0x66, 0x06, 0xec, 0x40, 0xc8, 0x58, 0x48, 0x4f, 0xed, 0x3c, 0xc9, 0xa3, 0x75, 0xc8, - 0x64, 0xe0, 0xa6, 0x99, 0x50, 0x02, 0x75, 0xab, 0x2f, 0xae, 0xda, 0x39, 0x4e, 0x2d, 0x0a, 0xb2, - 0x22, 0x55, 0xa2, 0x2e, 0x95, 0xcc, 0x79, 0x7a, 0x61, 0x90, 0xf0, 0x24, 0x6a, 0x6a, 0x25, 0x18, - 0x7c, 0x84, 0x47, 0x2b, 0x1e, 0x25, 0x54, 0xe5, 0x19, 0x9b, 0x33, 0x19, 0x64, 0x3c, 0x55, 0x22, - 0x93, 0xe8, 0x2d, 0x80, 0x6c, 0xde, 0xa5, 0x6d, 0xf6, 0xef, 0x86, 0xbd, 0x11, 0x76, 0x4f, 0x4d, - 0xdd, 0x2b, 0x10, 0x39, 0x23, 0x06, 0x5f, 0x2d, 0x78, 0x78, 0x45, 0x83, 0xc6, 0x00, 0x69, 0xee, - 0x6f, 0x79, 0xb0, 0xde, 0xb0, 0xc2, 0x36, 0xfb, 0xe6, 0xb0, 0x37, 0xb2, 0x1b, 0xdf, 0x3a, 0xfa, - 0x07, 0x2d, 0x78, 0xcf, 0x0a, 0xd2, 0x4d, 0x9b, 0x9f, 0x68, 0x0c, 0x56, 0x48, 0x15, 0xb5, 0x5b, - 0x1a, 0x79, 0xf6, 0xff, 0x28, 0xee, 0x9c, 0x2a, 0x4a, 0x34, 0xe0, 0xfc, 0x6e, 0x81, 0x55, 0xfe, - 0x45, 0x73, 0xe8, 0x48, 0x9e, 0x44, 0x5b, 0x56, 0xb7, 0x7d, 0x79, 0x83, 0x87, 0xbb, 0xd2, 0xc4, - 0xc2, 0x20, 0x35, 0x8b, 0x26, 0xd0, 0x8e, 0xf3, 0xad, 0xe2, 0x75, 0x90, 0x17, 0xb7, 0x98, 0x2c, - 0x4b, 0x60, 0x61, 0x90, 0x8a, 0x74, 0x3e, 0x41, 0xa7, 0xb2, 0x45, 0x1e, 0x58, 0xb1, 0x08, 0xab, - 0x40, 0x0f, 0x46, 0x8f, 0xcf, 0xbc, 0x9a, 0x2d, 0x95, 0x9e, 0x4b, 0x11, 0x32, 0xa2, 0x85, 0xe8, - 0x09, 0x74, 0x4f, 0x43, 0xd6, 0x09, 0xee, 0x93, 0xbf, 0x0f, 0xce, 0x37, 0x13, 0xda, 0xba, 0x17, - 0x7a, 0x03, 0xf7, 0x7c, 0xae, 0x68, 0x96, 0xd1, 0x66, 0xc8, 0xf8, 0x9f, 0x21, 0xcf, 0x44, 0x9c, - 0xd2, 0x40, 0x4d, 0xb9, 0x9a, 0x94, 0x2a, 0x72, 0xd2, 0xa3, 0xd9, 0xc5, 0xea, 0x5b, 0x7a, 0xf5, - 0x37, 0xcd, 0xfb, 0x0c, 0x9b, 0xb6, 0xe1, 0x4e, 0xe6, 0xf1, 0xf4, 0xdd, 0x8f, 0x03, 0x36, 0xf7, - 0x07, 0x6c, 0xfe, 0x3a, 0x60, 0xf3, 0xfb, 0x11, 0x1b, 0xfb, 0x23, 0x36, 0x7e, 0x1e, 0xb1, 0xf1, - 0xf9, 0x79, 0xc4, 0xd5, 0x97, 0xdc, 0x77, 0x03, 0x11, 0x7b, 0xcd, 0x01, 0xeb, 0xf2, 0x4a, 0x86, - 0x1b, 0x4f, 0x15, 0x29, 0x2b, 0xaf, 0xd6, 0xef, 0xe8, 0x33, 0x7d, 0xfd, 0x27, 0x00, 0x00, 0xff, - 0xff, 0x10, 0xb1, 0xf1, 0xc8, 0x0a, 0x03, 0x00, 0x00, -} - -func (m *SignatureDescriptors) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SignatureDescriptors) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SignatureDescriptors) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Signatures) > 0 { - for iNdEx := len(m.Signatures) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Signatures[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSigDesc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *SignatureDescriptor) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SignatureDescriptor) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SignatureDescriptor) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Data != nil { - { - size, err := m.Data.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSigDesc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.PublicKey != nil { - { - size, err := m.PublicKey.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSigDesc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *SignatureDescriptor_Data) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SignatureDescriptor_Data) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SignatureDescriptor_Data) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Sum != nil { - { - size := m.Sum.Size() - i -= size - if _, err := m.Sum.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - return len(dAtA) - i, nil -} - -func (m *SignatureDescriptor_Data_Single_) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SignatureDescriptor_Data_Single_) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Single != nil { - { - size, err := m.Single.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSigDesc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} -func (m *SignatureDescriptor_Data_Multi_) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SignatureDescriptor_Data_Multi_) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Multi != nil { - { - size, err := m.Multi.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSigDesc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} -func (m *SignatureDescriptor_Data_Single) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SignatureDescriptor_Data_Single) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SignatureDescriptor_Data_Single) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Signature) > 0 { - i -= len(m.Signature) - copy(dAtA[i:], m.Signature) - i = encodeVarintSigDesc(dAtA, i, uint64(len(m.Signature))) - i-- - dAtA[i] = 0x12 - } - if m.Mode != 0 { - i = encodeVarintSigDesc(dAtA, i, uint64(m.Mode)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *SignatureDescriptor_Data_Multi) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SignatureDescriptor_Data_Multi) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SignatureDescriptor_Data_Multi) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Signatures) > 0 { - for iNdEx := len(m.Signatures) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Signatures[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSigDesc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if m.Bitarray != nil { - { - size, err := m.Bitarray.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSigDesc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintSigDesc(dAtA []byte, offset int, v uint64) int { - offset -= sovSigDesc(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *SignatureDescriptors) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Signatures) > 0 { - for _, e := range m.Signatures { - l = e.Size() - n += 1 + l + sovSigDesc(uint64(l)) - } - } - return n -} - -func (m *SignatureDescriptor) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PublicKey != nil { - l = m.PublicKey.Size() - n += 1 + l + sovSigDesc(uint64(l)) - } - if m.Data != nil { - l = m.Data.Size() - n += 1 + l + sovSigDesc(uint64(l)) - } - return n -} - -func (m *SignatureDescriptor_Data) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Sum != nil { - n += m.Sum.Size() - } - return n -} - -func (m *SignatureDescriptor_Data_Single_) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Single != nil { - l = m.Single.Size() - n += 1 + l + sovSigDesc(uint64(l)) - } - return n -} -func (m *SignatureDescriptor_Data_Multi_) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Multi != nil { - l = m.Multi.Size() - n += 1 + l + sovSigDesc(uint64(l)) - } - return n -} -func (m *SignatureDescriptor_Data_Single) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Mode != 0 { - n += 1 + sovSigDesc(uint64(m.Mode)) - } - l = len(m.Signature) - if l > 0 { - n += 1 + l + sovSigDesc(uint64(l)) - } - return n + // 129 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x48, 0xce, 0x2f, 0xce, + 0xcd, 0x2f, 0xd6, 0x2f, 0xa9, 0xd0, 0x2f, 0xce, 0x4c, 0x8f, 0x4f, 0x49, 0x2d, 0x4e, 0xd6, 0x2b, + 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x84, 0xc8, 0xe8, 0x95, 0x54, 0x48, 0xc9, 0xa3, 0x28, 0xca, + 0xcb, 0xcc, 0x4b, 0x87, 0xd1, 0x10, 0xb5, 0x4e, 0xf6, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, + 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, 0x0c, 0x17, 0x1e, 0xcb, 0x31, 0xdc, 0x78, + 0x2c, 0xc7, 0x10, 0xa5, 0x9a, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, 0xab, 0x0f, + 0x35, 0x05, 0x42, 0xe9, 0x16, 0xa7, 0x64, 0xeb, 0x97, 0x54, 0x16, 0xa4, 0x82, 0x8c, 0x4d, 0x62, + 0x03, 0x9b, 0x63, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x86, 0x8a, 0xa4, 0x8a, 0x8f, 0x00, 0x00, + 0x00, } - -func (m *SignatureDescriptor_Data_Multi) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Bitarray != nil { - l = m.Bitarray.Size() - n += 1 + l + sovSigDesc(uint64(l)) - } - if len(m.Signatures) > 0 { - for _, e := range m.Signatures { - l = e.Size() - n += 1 + l + sovSigDesc(uint64(l)) - } - } - return n -} - -func sovSigDesc(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozSigDesc(x uint64) (n int) { - return sovSigDesc(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *SignatureDescriptors) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSigDesc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: SignatureDescriptors: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SignatureDescriptors: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Signatures", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSigDesc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSigDesc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSigDesc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Signatures = append(m.Signatures, &SignatureDescriptor{}) - if err := m.Signatures[len(m.Signatures)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSigDesc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthSigDesc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthSigDesc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SignatureDescriptor) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSigDesc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: SignatureDescriptor: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SignatureDescriptor: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSigDesc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSigDesc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSigDesc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.PublicKey == nil { - m.PublicKey = &types.PublicKey{} - } - if err := m.PublicKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSigDesc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSigDesc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSigDesc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Data == nil { - m.Data = &SignatureDescriptor_Data{} - } - if err := m.Data.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSigDesc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthSigDesc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthSigDesc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SignatureDescriptor_Data) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSigDesc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Data: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Data: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Single", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSigDesc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSigDesc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSigDesc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &SignatureDescriptor_Data_Single{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &SignatureDescriptor_Data_Single_{v} - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Multi", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSigDesc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSigDesc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSigDesc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &SignatureDescriptor_Data_Multi{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &SignatureDescriptor_Data_Multi_{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSigDesc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthSigDesc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthSigDesc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SignatureDescriptor_Data_Single) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSigDesc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Single: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Single: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Mode", wireType) - } - m.Mode = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSigDesc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Mode |= signing.SignMode(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSigDesc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthSigDesc - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthSigDesc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Signature = append(m.Signature[:0], dAtA[iNdEx:postIndex]...) - if m.Signature == nil { - m.Signature = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSigDesc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthSigDesc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthSigDesc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SignatureDescriptor_Data_Multi) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSigDesc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Multi: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Multi: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Bitarray", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSigDesc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSigDesc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSigDesc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Bitarray == nil { - m.Bitarray = &types.CompactBitArray{} - } - if err := m.Bitarray.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Signatures", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSigDesc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSigDesc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSigDesc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Signatures = append(m.Signatures, &SignatureDescriptor_Data{}) - if err := m.Signatures[len(m.Signatures)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSigDesc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthSigDesc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthSigDesc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipSigDesc(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowSigDesc - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowSigDesc - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowSigDesc - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthSigDesc - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupSigDesc - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthSigDesc - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthSigDesc = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowSigDesc = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupSigDesc = fmt.Errorf("proto: unexpected end of group") -) diff --git a/types/tx/signing/signature.go b/types/tx/signing/signature.go index 47744de28433..0af02d85bd11 100644 --- a/types/tx/signing/signature.go +++ b/types/tx/signing/signature.go @@ -1,6 +1,10 @@ package signing -import "github.com/tendermint/tendermint/crypto" +import ( + "fmt" + + "github.com/tendermint/tendermint/crypto" +) // SignatureV2 is a convenience type that is easier to use in application logic // than the protobuf SignerInfo's and raw signature bytes. It goes beyond the @@ -15,3 +19,58 @@ type SignatureV2 struct { // the signatures themselves for either single or multi-signatures. Data SignatureData } + +func SignatureDataToSignatureDescriptorData(data SignatureData) *SignatureDescriptor_Data { + switch data := data.(type) { + case *SingleSignatureData: + return &SignatureDescriptor_Data{ + Sum: &SignatureDescriptor_Data_Single_{ + Single: &SignatureDescriptor_Data_Single{ + Mode: data.SignMode, + Signature: data.Signature, + }, + }, + } + case *MultiSignatureData: + descDatas := make([]*SignatureDescriptor_Data, len(data.Signatures)) + + for j, d := range data.Signatures { + descDatas[j] = SignatureDataToSignatureDescriptorData(d) + } + + return &SignatureDescriptor_Data{ + Sum: &SignatureDescriptor_Data_Multi_{ + Multi: &SignatureDescriptor_Data_Multi{ + Bitarray: data.BitArray, + Signatures: descDatas, + }, + }, + } + default: + panic(fmt.Errorf("unexpected case %+v", data)) + } +} + +func SignatureDescriptorDataToSignatureData(descData *SignatureDescriptor_Data) SignatureData { + switch descData := descData.Sum.(type) { + case *SignatureDescriptor_Data_Single_: + return &SingleSignatureData{ + SignMode: descData.Single.Mode, + Signature: descData.Single.Signature, + } + case *SignatureDescriptor_Data_Multi_: + multi := descData.Multi + datas := make([]SignatureData, len(multi.Signatures)) + + for j, d := range multi.Signatures { + datas[j] = SignatureDescriptorDataToSignatureData(d) + } + + return &MultiSignatureData{ + BitArray: multi.Bitarray, + Signatures: datas, + } + default: + panic(fmt.Errorf("unexpected case %+v", descData)) + } +} diff --git a/types/tx/signing/signing.pb.go b/types/tx/signing/signing.pb.go index 26943a171b47..f8c817e7efa0 100644 --- a/types/tx/signing/signing.pb.go +++ b/types/tx/signing/signing.pb.go @@ -5,8 +5,11 @@ package signing import ( fmt "fmt" + types "github.com/cosmos/cosmos-sdk/crypto/types" proto "github.com/gogo/protobuf/proto" + io "io" math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -59,26 +62,1359 @@ func (SignMode) EnumDescriptor() ([]byte, []int) { return fileDescriptor_8a04324e5f3729bf, []int{0} } +// SignatureDescriptors wraps multiple SignatureDescriptor's. +type SignatureDescriptors struct { + // signatures are the signature descriptors + Signatures []*SignatureDescriptor `protobuf:"bytes,1,rep,name=signatures,proto3" json:"signatures,omitempty"` +} + +func (m *SignatureDescriptors) Reset() { *m = SignatureDescriptors{} } +func (m *SignatureDescriptors) String() string { return proto.CompactTextString(m) } +func (*SignatureDescriptors) ProtoMessage() {} +func (*SignatureDescriptors) Descriptor() ([]byte, []int) { + return fileDescriptor_8a04324e5f3729bf, []int{0} +} +func (m *SignatureDescriptors) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SignatureDescriptors) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SignatureDescriptors.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SignatureDescriptors) XXX_Merge(src proto.Message) { + xxx_messageInfo_SignatureDescriptors.Merge(m, src) +} +func (m *SignatureDescriptors) XXX_Size() int { + return m.Size() +} +func (m *SignatureDescriptors) XXX_DiscardUnknown() { + xxx_messageInfo_SignatureDescriptors.DiscardUnknown(m) +} + +var xxx_messageInfo_SignatureDescriptors proto.InternalMessageInfo + +func (m *SignatureDescriptors) GetSignatures() []*SignatureDescriptor { + if m != nil { + return m.Signatures + } + return nil +} + +// SignatureDescriptor is a convenience type which represents the full data for a +// signature including the public key of the signer, signing modes and the signature +// itself. It is primarily used for coordinating signatures between clients. +type SignatureDescriptor struct { + // public_key is the public key of the signer + PublicKey *types.PublicKey `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + // data represents the signature data + Data *SignatureDescriptor_Data `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` +} + +func (m *SignatureDescriptor) Reset() { *m = SignatureDescriptor{} } +func (m *SignatureDescriptor) String() string { return proto.CompactTextString(m) } +func (*SignatureDescriptor) ProtoMessage() {} +func (*SignatureDescriptor) Descriptor() ([]byte, []int) { + return fileDescriptor_8a04324e5f3729bf, []int{1} +} +func (m *SignatureDescriptor) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SignatureDescriptor) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SignatureDescriptor.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SignatureDescriptor) XXX_Merge(src proto.Message) { + xxx_messageInfo_SignatureDescriptor.Merge(m, src) +} +func (m *SignatureDescriptor) XXX_Size() int { + return m.Size() +} +func (m *SignatureDescriptor) XXX_DiscardUnknown() { + xxx_messageInfo_SignatureDescriptor.DiscardUnknown(m) +} + +var xxx_messageInfo_SignatureDescriptor proto.InternalMessageInfo + +func (m *SignatureDescriptor) GetPublicKey() *types.PublicKey { + if m != nil { + return m.PublicKey + } + return nil +} + +func (m *SignatureDescriptor) GetData() *SignatureDescriptor_Data { + if m != nil { + return m.Data + } + return nil +} + +type SignatureDescriptor_Data struct { + // sum is the oneof that specifies whether this represents single or multi-signature data + // + // Types that are valid to be assigned to Sum: + // *SignatureDescriptor_Data_Single_ + // *SignatureDescriptor_Data_Multi_ + Sum isSignatureDescriptor_Data_Sum `protobuf_oneof:"sum"` +} + +func (m *SignatureDescriptor_Data) Reset() { *m = SignatureDescriptor_Data{} } +func (m *SignatureDescriptor_Data) String() string { return proto.CompactTextString(m) } +func (*SignatureDescriptor_Data) ProtoMessage() {} +func (*SignatureDescriptor_Data) Descriptor() ([]byte, []int) { + return fileDescriptor_8a04324e5f3729bf, []int{1, 0} +} +func (m *SignatureDescriptor_Data) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SignatureDescriptor_Data) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SignatureDescriptor_Data.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SignatureDescriptor_Data) XXX_Merge(src proto.Message) { + xxx_messageInfo_SignatureDescriptor_Data.Merge(m, src) +} +func (m *SignatureDescriptor_Data) XXX_Size() int { + return m.Size() +} +func (m *SignatureDescriptor_Data) XXX_DiscardUnknown() { + xxx_messageInfo_SignatureDescriptor_Data.DiscardUnknown(m) +} + +var xxx_messageInfo_SignatureDescriptor_Data proto.InternalMessageInfo + +type isSignatureDescriptor_Data_Sum interface { + isSignatureDescriptor_Data_Sum() + MarshalTo([]byte) (int, error) + Size() int +} + +type SignatureDescriptor_Data_Single_ struct { + Single *SignatureDescriptor_Data_Single `protobuf:"bytes,1,opt,name=single,proto3,oneof" json:"single,omitempty"` +} +type SignatureDescriptor_Data_Multi_ struct { + Multi *SignatureDescriptor_Data_Multi `protobuf:"bytes,2,opt,name=multi,proto3,oneof" json:"multi,omitempty"` +} + +func (*SignatureDescriptor_Data_Single_) isSignatureDescriptor_Data_Sum() {} +func (*SignatureDescriptor_Data_Multi_) isSignatureDescriptor_Data_Sum() {} + +func (m *SignatureDescriptor_Data) GetSum() isSignatureDescriptor_Data_Sum { + if m != nil { + return m.Sum + } + return nil +} + +func (m *SignatureDescriptor_Data) GetSingle() *SignatureDescriptor_Data_Single { + if x, ok := m.GetSum().(*SignatureDescriptor_Data_Single_); ok { + return x.Single + } + return nil +} + +func (m *SignatureDescriptor_Data) GetMulti() *SignatureDescriptor_Data_Multi { + if x, ok := m.GetSum().(*SignatureDescriptor_Data_Multi_); ok { + return x.Multi + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*SignatureDescriptor_Data) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*SignatureDescriptor_Data_Single_)(nil), + (*SignatureDescriptor_Data_Multi_)(nil), + } +} + +// Single is the signature data for a single signer +type SignatureDescriptor_Data_Single struct { + // mode is the signing mode of the single signer + Mode SignMode `protobuf:"varint,1,opt,name=mode,proto3,enum=cosmos.tx.signing.SignMode" json:"mode,omitempty"` + // signature is the raw signature bytes + Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` +} + +func (m *SignatureDescriptor_Data_Single) Reset() { *m = SignatureDescriptor_Data_Single{} } +func (m *SignatureDescriptor_Data_Single) String() string { return proto.CompactTextString(m) } +func (*SignatureDescriptor_Data_Single) ProtoMessage() {} +func (*SignatureDescriptor_Data_Single) Descriptor() ([]byte, []int) { + return fileDescriptor_8a04324e5f3729bf, []int{1, 0, 0} +} +func (m *SignatureDescriptor_Data_Single) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SignatureDescriptor_Data_Single) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SignatureDescriptor_Data_Single.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SignatureDescriptor_Data_Single) XXX_Merge(src proto.Message) { + xxx_messageInfo_SignatureDescriptor_Data_Single.Merge(m, src) +} +func (m *SignatureDescriptor_Data_Single) XXX_Size() int { + return m.Size() +} +func (m *SignatureDescriptor_Data_Single) XXX_DiscardUnknown() { + xxx_messageInfo_SignatureDescriptor_Data_Single.DiscardUnknown(m) +} + +var xxx_messageInfo_SignatureDescriptor_Data_Single proto.InternalMessageInfo + +func (m *SignatureDescriptor_Data_Single) GetMode() SignMode { + if m != nil { + return m.Mode + } + return SignMode_SIGN_MODE_UNSPECIFIED +} + +func (m *SignatureDescriptor_Data_Single) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +// Multi is the signature data for a multisig public key +type SignatureDescriptor_Data_Multi struct { + // bitarray specifies which keys within the multisig are signing + Bitarray *types.CompactBitArray `protobuf:"bytes,1,opt,name=bitarray,proto3" json:"bitarray,omitempty"` + // signatures is the signatures of the multi-signature + Signatures []*SignatureDescriptor_Data `protobuf:"bytes,2,rep,name=signatures,proto3" json:"signatures,omitempty"` +} + +func (m *SignatureDescriptor_Data_Multi) Reset() { *m = SignatureDescriptor_Data_Multi{} } +func (m *SignatureDescriptor_Data_Multi) String() string { return proto.CompactTextString(m) } +func (*SignatureDescriptor_Data_Multi) ProtoMessage() {} +func (*SignatureDescriptor_Data_Multi) Descriptor() ([]byte, []int) { + return fileDescriptor_8a04324e5f3729bf, []int{1, 0, 1} +} +func (m *SignatureDescriptor_Data_Multi) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SignatureDescriptor_Data_Multi) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SignatureDescriptor_Data_Multi.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SignatureDescriptor_Data_Multi) XXX_Merge(src proto.Message) { + xxx_messageInfo_SignatureDescriptor_Data_Multi.Merge(m, src) +} +func (m *SignatureDescriptor_Data_Multi) XXX_Size() int { + return m.Size() +} +func (m *SignatureDescriptor_Data_Multi) XXX_DiscardUnknown() { + xxx_messageInfo_SignatureDescriptor_Data_Multi.DiscardUnknown(m) +} + +var xxx_messageInfo_SignatureDescriptor_Data_Multi proto.InternalMessageInfo + +func (m *SignatureDescriptor_Data_Multi) GetBitarray() *types.CompactBitArray { + if m != nil { + return m.Bitarray + } + return nil +} + +func (m *SignatureDescriptor_Data_Multi) GetSignatures() []*SignatureDescriptor_Data { + if m != nil { + return m.Signatures + } + return nil +} + func init() { proto.RegisterEnum("cosmos.tx.signing.SignMode", SignMode_name, SignMode_value) + proto.RegisterType((*SignatureDescriptors)(nil), "cosmos.tx.signing.SignatureDescriptors") + proto.RegisterType((*SignatureDescriptor)(nil), "cosmos.tx.signing.SignatureDescriptor") + proto.RegisterType((*SignatureDescriptor_Data)(nil), "cosmos.tx.signing.SignatureDescriptor.Data") + proto.RegisterType((*SignatureDescriptor_Data_Single)(nil), "cosmos.tx.signing.SignatureDescriptor.Data.Single") + proto.RegisterType((*SignatureDescriptor_Data_Multi)(nil), "cosmos.tx.signing.SignatureDescriptor.Data.Multi") } func init() { proto.RegisterFile("cosmos/tx/signing/signing.proto", fileDescriptor_8a04324e5f3729bf) } var fileDescriptor_8a04324e5f3729bf = []byte{ - // 214 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4f, 0xce, 0x2f, 0xce, - 0xcd, 0x2f, 0xd6, 0x2f, 0xa9, 0xd0, 0x2f, 0xce, 0x4c, 0xcf, 0xcb, 0xcc, 0x4b, 0x87, 0xd1, 0x7a, - 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x82, 0x10, 0x05, 0x7a, 0x25, 0x15, 0x7a, 0x50, 0x09, 0xad, - 0x62, 0x2e, 0x8e, 0xe0, 0xcc, 0xf4, 0x3c, 0xdf, 0xfc, 0x94, 0x54, 0x21, 0x49, 0x2e, 0xd1, 0x60, - 0x4f, 0x77, 0xbf, 0x78, 0x5f, 0x7f, 0x17, 0xd7, 0xf8, 0x50, 0xbf, 0xe0, 0x00, 0x57, 0x67, 0x4f, - 0x37, 0x4f, 0x57, 0x17, 0x01, 0x06, 0x21, 0x11, 0x2e, 0x01, 0x84, 0x94, 0x8b, 0x67, 0x90, 0xab, - 0x73, 0x88, 0x00, 0xa3, 0x90, 0x28, 0x97, 0x20, 0x42, 0x34, 0xc4, 0x35, 0x22, 0x24, 0xd4, 0xd1, - 0x47, 0x80, 0x49, 0x48, 0x9e, 0x4b, 0x1a, 0x21, 0xec, 0xe3, 0xea, 0xee, 0xe8, 0x1c, 0x19, 0xef, - 0xe8, 0xeb, 0xe9, 0xe7, 0x1f, 0xef, 0x15, 0xec, 0xef, 0x27, 0x50, 0xef, 0xe4, 0x7e, 0xe2, 0x91, - 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, - 0xb1, 0x1c, 0xc3, 0x8d, 0xc7, 0x72, 0x0c, 0x51, 0xba, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, - 0xc9, 0xf9, 0xb9, 0xfa, 0x50, 0xdf, 0x40, 0x28, 0xdd, 0xe2, 0x94, 0x6c, 0xfd, 0x92, 0xca, 0x82, - 0x54, 0x64, 0xef, 0x25, 0xb1, 0x81, 0xfd, 0x65, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0xe1, 0x92, - 0x08, 0x61, 0xfa, 0x00, 0x00, 0x00, + // 487 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0xcb, 0x6e, 0xd3, 0x40, + 0x14, 0xb5, 0x9b, 0x87, 0xda, 0x5b, 0x84, 0xdc, 0xa1, 0x95, 0x82, 0x8b, 0xdc, 0xaa, 0x0b, 0x54, + 0x81, 0x6a, 0x8b, 0xb0, 0x40, 0x62, 0x83, 0x92, 0xd8, 0x4d, 0x4d, 0xf3, 0xa8, 0xc6, 0xa9, 0x78, + 0x2c, 0xb0, 0x1c, 0xc7, 0x32, 0xa3, 0xc6, 0x19, 0xcb, 0x33, 0x96, 0x9a, 0x15, 0xbf, 0x50, 0xf1, + 0x0d, 0x7c, 0x0c, 0xcb, 0x2e, 0x59, 0xa2, 0xe4, 0x47, 0x50, 0xc6, 0x76, 0x13, 0xa0, 0x48, 0x64, + 0x75, 0xed, 0x33, 0xe7, 0x9c, 0x39, 0xbe, 0xbe, 0x17, 0x0e, 0x7c, 0xca, 0x22, 0xca, 0x0c, 0x7e, + 0x6d, 0x30, 0x12, 0x4e, 0xc8, 0x24, 0x2c, 0xaa, 0x1e, 0x27, 0x94, 0x53, 0xb4, 0x93, 0x11, 0x74, + 0x7e, 0xad, 0xe7, 0x07, 0xaa, 0x9a, 0x6b, 0xfc, 0x64, 0x1a, 0x73, 0x9a, 0x97, 0x8c, 0x7e, 0xf4, + 0x09, 0x76, 0x1d, 0x12, 0x4e, 0x3c, 0x9e, 0x26, 0x81, 0x19, 0x30, 0x3f, 0x21, 0x31, 0xa7, 0x09, + 0x43, 0xa7, 0x00, 0xac, 0xc0, 0x59, 0x4d, 0x3e, 0x2c, 0x1d, 0x6f, 0xd7, 0x9f, 0xea, 0x7f, 0x79, + 0xeb, 0xf7, 0x88, 0xf1, 0x8a, 0xf2, 0xe8, 0x5b, 0x19, 0x1e, 0xdd, 0xc3, 0x41, 0xaf, 0x00, 0xe2, + 0x74, 0x38, 0x26, 0xbe, 0x7b, 0x15, 0x4c, 0x6b, 0xf2, 0xa1, 0x7c, 0xbc, 0x5d, 0xaf, 0x15, 0xfe, + 0x79, 0xc2, 0x0b, 0x41, 0x38, 0x0f, 0xa6, 0x78, 0x2b, 0x2e, 0x1e, 0xd1, 0x1b, 0x28, 0x8f, 0x3c, + 0xee, 0xd5, 0x36, 0x84, 0xe4, 0xf9, 0xff, 0x45, 0xd2, 0x4d, 0x8f, 0x7b, 0x58, 0x08, 0xd5, 0xaf, + 0x25, 0x28, 0x2f, 0x5e, 0x51, 0x07, 0xaa, 0x8c, 0x4c, 0xc2, 0x71, 0x90, 0x5f, 0x5f, 0x5f, 0xc3, + 0x4b, 0x77, 0x84, 0xf2, 0x4c, 0xc2, 0xb9, 0x07, 0xb2, 0xa1, 0x12, 0xa5, 0x63, 0x4e, 0xf2, 0x60, + 0x2f, 0xd6, 0x31, 0xeb, 0x2e, 0x84, 0x67, 0x12, 0xce, 0x1c, 0xd4, 0x77, 0x50, 0xcd, 0xec, 0x91, + 0x01, 0xe5, 0x88, 0x8e, 0xb2, 0x80, 0x0f, 0xeb, 0xfb, 0xff, 0xf0, 0xec, 0xd2, 0x51, 0x80, 0x05, + 0x11, 0x3d, 0x81, 0xad, 0xbb, 0xe6, 0x8b, 0x24, 0x0f, 0xf0, 0x12, 0x50, 0x6f, 0x64, 0xa8, 0x88, + 0xbb, 0xd0, 0x6b, 0xd8, 0x1c, 0x12, 0xee, 0x25, 0x89, 0x57, 0x34, 0x5f, 0xfb, 0xa3, 0xf9, 0x2d, + 0x1a, 0xc5, 0x9e, 0xcf, 0x9b, 0x84, 0x37, 0x16, 0x2c, 0x7c, 0xc7, 0x47, 0xe7, 0xbf, 0x8d, 0xc6, + 0x86, 0x18, 0x8d, 0xb5, 0xfe, 0xc3, 0x8a, 0xbc, 0x59, 0x81, 0x12, 0x4b, 0xa3, 0x67, 0x0c, 0x36, + 0x8b, 0x2f, 0x41, 0x8f, 0x61, 0xcf, 0xb1, 0xdb, 0x3d, 0xb7, 0xdb, 0x37, 0x2d, 0xf7, 0xb2, 0xe7, + 0x5c, 0x58, 0x2d, 0xfb, 0xd4, 0xb6, 0x4c, 0x45, 0x42, 0xbb, 0xa0, 0x2c, 0x8f, 0x4c, 0x1b, 0x5b, + 0xad, 0x81, 0x22, 0xa3, 0x3d, 0xd8, 0x59, 0xa2, 0x03, 0xeb, 0xfd, 0xe0, 0xb2, 0xd1, 0x51, 0x36, + 0xd0, 0x01, 0xec, 0x2f, 0xe1, 0x8e, 0xd5, 0x6e, 0xb4, 0x3e, 0xb8, 0x8d, 0xae, 0xdd, 0xeb, 0xbb, + 0x6f, 0x9d, 0x7e, 0x4f, 0xf9, 0xd2, 0x6c, 0x7f, 0x9f, 0x69, 0xf2, 0xed, 0x4c, 0x93, 0x7f, 0xce, + 0x34, 0xf9, 0x66, 0xae, 0x49, 0xb7, 0x73, 0x4d, 0xfa, 0x31, 0xd7, 0xa4, 0x8f, 0x27, 0x21, 0xe1, + 0x9f, 0xd3, 0xa1, 0xee, 0xd3, 0xc8, 0x28, 0x96, 0x47, 0x94, 0x13, 0x36, 0xba, 0x32, 0xf8, 0x34, + 0x0e, 0x56, 0x37, 0x70, 0x58, 0x15, 0xbb, 0xf4, 0xf2, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0x82, + 0x8c, 0xaa, 0x54, 0x9d, 0x03, 0x00, 0x00, +} + +func (m *SignatureDescriptors) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SignatureDescriptors) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SignatureDescriptors) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Signatures) > 0 { + for iNdEx := len(m.Signatures) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Signatures[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSigning(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *SignatureDescriptor) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SignatureDescriptor) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SignatureDescriptor) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Data != nil { + { + size, err := m.Data.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSigning(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.PublicKey != nil { + { + size, err := m.PublicKey.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSigning(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SignatureDescriptor_Data) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SignatureDescriptor_Data) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SignatureDescriptor_Data) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Sum != nil { + { + size := m.Sum.Size() + i -= size + if _, err := m.Sum.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + return len(dAtA) - i, nil +} + +func (m *SignatureDescriptor_Data_Single_) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SignatureDescriptor_Data_Single_) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Single != nil { + { + size, err := m.Single.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSigning(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} +func (m *SignatureDescriptor_Data_Multi_) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SignatureDescriptor_Data_Multi_) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Multi != nil { + { + size, err := m.Multi.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSigning(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} +func (m *SignatureDescriptor_Data_Single) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SignatureDescriptor_Data_Single) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SignatureDescriptor_Data_Single) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Signature) > 0 { + i -= len(m.Signature) + copy(dAtA[i:], m.Signature) + i = encodeVarintSigning(dAtA, i, uint64(len(m.Signature))) + i-- + dAtA[i] = 0x12 + } + if m.Mode != 0 { + i = encodeVarintSigning(dAtA, i, uint64(m.Mode)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *SignatureDescriptor_Data_Multi) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SignatureDescriptor_Data_Multi) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SignatureDescriptor_Data_Multi) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Signatures) > 0 { + for iNdEx := len(m.Signatures) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Signatures[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSigning(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if m.Bitarray != nil { + { + size, err := m.Bitarray.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSigning(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintSigning(dAtA []byte, offset int, v uint64) int { + offset -= sovSigning(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *SignatureDescriptors) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Signatures) > 0 { + for _, e := range m.Signatures { + l = e.Size() + n += 1 + l + sovSigning(uint64(l)) + } + } + return n +} + +func (m *SignatureDescriptor) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PublicKey != nil { + l = m.PublicKey.Size() + n += 1 + l + sovSigning(uint64(l)) + } + if m.Data != nil { + l = m.Data.Size() + n += 1 + l + sovSigning(uint64(l)) + } + return n +} + +func (m *SignatureDescriptor_Data) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Sum != nil { + n += m.Sum.Size() + } + return n +} + +func (m *SignatureDescriptor_Data_Single_) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Single != nil { + l = m.Single.Size() + n += 1 + l + sovSigning(uint64(l)) + } + return n +} +func (m *SignatureDescriptor_Data_Multi_) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Multi != nil { + l = m.Multi.Size() + n += 1 + l + sovSigning(uint64(l)) + } + return n +} +func (m *SignatureDescriptor_Data_Single) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Mode != 0 { + n += 1 + sovSigning(uint64(m.Mode)) + } + l = len(m.Signature) + if l > 0 { + n += 1 + l + sovSigning(uint64(l)) + } + return n } + +func (m *SignatureDescriptor_Data_Multi) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Bitarray != nil { + l = m.Bitarray.Size() + n += 1 + l + sovSigning(uint64(l)) + } + if len(m.Signatures) > 0 { + for _, e := range m.Signatures { + l = e.Size() + n += 1 + l + sovSigning(uint64(l)) + } + } + return n +} + +func sovSigning(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozSigning(x uint64) (n int) { + return sovSigning(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *SignatureDescriptors) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigning + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SignatureDescriptors: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SignatureDescriptors: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signatures", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigning + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSigning + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSigning + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signatures = append(m.Signatures, &SignatureDescriptor{}) + if err := m.Signatures[len(m.Signatures)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSigning(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthSigning + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthSigning + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SignatureDescriptor) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigning + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SignatureDescriptor: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SignatureDescriptor: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigning + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSigning + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSigning + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.PublicKey == nil { + m.PublicKey = &types.PublicKey{} + } + if err := m.PublicKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigning + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSigning + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSigning + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Data == nil { + m.Data = &SignatureDescriptor_Data{} + } + if err := m.Data.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSigning(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthSigning + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthSigning + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SignatureDescriptor_Data) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigning + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Data: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Data: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Single", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigning + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSigning + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSigning + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SignatureDescriptor_Data_Single{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Sum = &SignatureDescriptor_Data_Single_{v} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Multi", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigning + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSigning + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSigning + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SignatureDescriptor_Data_Multi{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Sum = &SignatureDescriptor_Data_Multi_{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSigning(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthSigning + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthSigning + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SignatureDescriptor_Data_Single) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigning + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Single: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Single: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Mode", wireType) + } + m.Mode = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigning + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Mode |= SignMode(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigning + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthSigning + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthSigning + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signature = append(m.Signature[:0], dAtA[iNdEx:postIndex]...) + if m.Signature == nil { + m.Signature = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSigning(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthSigning + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthSigning + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SignatureDescriptor_Data_Multi) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigning + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Multi: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Multi: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Bitarray", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigning + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSigning + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSigning + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Bitarray == nil { + m.Bitarray = &types.CompactBitArray{} + } + if err := m.Bitarray.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signatures", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSigning + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSigning + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSigning + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signatures = append(m.Signatures, &SignatureDescriptor_Data{}) + if err := m.Signatures[len(m.Signatures)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSigning(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthSigning + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthSigning + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipSigning(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSigning + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSigning + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSigning + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthSigning + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupSigning + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthSigning + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthSigning = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowSigning = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupSigning = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/auth/tx/sigs.go b/x/auth/tx/sigs.go index d318fa8fa7f9..7b24939538f0 100644 --- a/x/auth/tx/sigs.go +++ b/x/auth/tx/sigs.go @@ -106,7 +106,7 @@ func decodeMultisignatures(bz []byte) ([][]byte, error) { } func (g generator) MarshalSignatureJSON(sigs []signing.SignatureV2) ([]byte, error) { - descs := make([]*tx.SignatureDescriptor, len(sigs)) + descs := make([]*signing.SignatureDescriptor, len(sigs)) for i, sig := range sigs { publicKey, err := g.pubkeyCodec.Encode(sig.PubKey) @@ -114,52 +114,21 @@ func (g generator) MarshalSignatureJSON(sigs []signing.SignatureV2) ([]byte, err return nil, err } - descData := sigDataToSigDescData(sig.Data) + descData := signing.SignatureDataToSignatureDescriptorData(sig.Data) - descs[i] = &tx.SignatureDescriptor{ + descs[i] = &signing.SignatureDescriptor{ PublicKey: publicKey, Data: descData, } } - toJson := &tx.SignatureDescriptors{Signatures: descs} + toJson := &signing.SignatureDescriptors{Signatures: descs} return codec.ProtoMarshalJSON(toJson) } -func sigDataToSigDescData(data signing.SignatureData) *tx.SignatureDescriptor_Data { - switch data := data.(type) { - case *signing.SingleSignatureData: - return &tx.SignatureDescriptor_Data{ - Sum: &tx.SignatureDescriptor_Data_Single_{ - Single: &tx.SignatureDescriptor_Data_Single{ - Mode: data.SignMode, - Signature: data.Signature, - }, - }, - } - case *signing.MultiSignatureData: - descDatas := make([]*tx.SignatureDescriptor_Data, len(data.Signatures)) - - for j, d := range data.Signatures { - descDatas[j] = sigDataToSigDescData(d) - } - - return &tx.SignatureDescriptor_Data{ - Sum: &tx.SignatureDescriptor_Data_Multi_{ - Multi: &tx.SignatureDescriptor_Data_Multi{ - Bitarray: data.BitArray, - Signatures: descDatas, - }, - }, - } - default: - panic(fmt.Errorf("unexpected case %+v", data)) - } -} - func (g generator) UnmarshalSignatureJSON(bz []byte) ([]signing.SignatureV2, error) { - var sigDescs tx.SignatureDescriptors + var sigDescs signing.SignatureDescriptors err := g.protoCodec.UnmarshalJSON(bz, &sigDescs) if err != nil { return nil, err @@ -172,7 +141,7 @@ func (g generator) UnmarshalSignatureJSON(bz []byte) ([]signing.SignatureV2, err return nil, err } - data := sigDescDataToSigData(desc.Data) + data := signing.SignatureDescriptorDataToSignatureData(desc.Data) sigs[i] = signing.SignatureV2{ PubKey: pubKey, @@ -182,27 +151,3 @@ func (g generator) UnmarshalSignatureJSON(bz []byte) ([]signing.SignatureV2, err return sigs, nil } - -func sigDescDataToSigData(descData *tx.SignatureDescriptor_Data) signing.SignatureData { - switch descData := descData.Sum.(type) { - case *tx.SignatureDescriptor_Data_Single_: - return &signing.SingleSignatureData{ - SignMode: descData.Single.Mode, - Signature: descData.Single.Signature, - } - case *tx.SignatureDescriptor_Data_Multi_: - multi := descData.Multi - datas := make([]signing.SignatureData, len(multi.Signatures)) - - for j, d := range multi.Signatures { - datas[j] = sigDescDataToSigData(d) - } - - return &signing.MultiSignatureData{ - BitArray: multi.Bitarray, - Signatures: datas, - } - default: - panic(fmt.Errorf("unexpected case %+v", descData)) - } -} From e004e1b5702d287ba6006e20fabd3377e01c75b1 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Mon, 27 Jul 2020 16:10:56 -0400 Subject: [PATCH 24/40] Test fixes --- client/cmd.go | 50 ++++++++++++++++++++---------- types/tx/signing/signature.go | 6 ++++ x/auth/client/cli/cli_test.go | 45 +++++++++++++++------------ x/auth/client/cli/tx_multisign.go | 50 ++++++++++++++---------------- x/auth/client/cli/tx_sign.go | 18 ++++++----- x/auth/client/cli/validate_sigs.go | 1 + x/auth/client/tx.go | 8 ++--- x/auth/client/tx_test.go | 4 +-- 8 files changed, 104 insertions(+), 78 deletions(-) diff --git a/client/cmd.go b/client/cmd.go index 688a81bea09e..e62ffad699b9 100644 --- a/client/cmd.go +++ b/client/cmd.go @@ -148,31 +148,47 @@ func ReadTxCommandFlags(clientCtx Context, flagSet *pflag.FlagSet) (Context, err return clientCtx, err } - genOnly, _ := flagSet.GetBool(flags.FlagGenerateOnly) - clientCtx = clientCtx.WithGenerateOnly(genOnly) + if flagSet.Changed(flags.FlagGenerateOnly) { + genOnly, _ := flagSet.GetBool(flags.FlagGenerateOnly) + clientCtx = clientCtx.WithGenerateOnly(genOnly) - dryRun, _ := flagSet.GetBool(flags.FlagDryRun) - clientCtx = clientCtx.WithSimulation(dryRun) + } - offline, _ := flagSet.GetBool(flags.FlagOffline) - clientCtx = clientCtx.WithOffline(offline) + if flagSet.Changed(flags.FlagDryRun) { + dryRun, _ := flagSet.GetBool(flags.FlagDryRun) + clientCtx = clientCtx.WithSimulation(dryRun) + } - useLedger, _ := flagSet.GetBool(flags.FlagUseLedger) - clientCtx = clientCtx.WithUseLedger(useLedger) + if flagSet.Changed(flags.FlagOffline) { + offline, _ := flagSet.GetBool(flags.FlagOffline) + clientCtx = clientCtx.WithOffline(offline) + } - bMode, _ := flagSet.GetString(flags.FlagBroadcastMode) - clientCtx = clientCtx.WithBroadcastMode(bMode) + if flagSet.Changed(flags.FlagUseLedger) { + useLedger, _ := flagSet.GetBool(flags.FlagUseLedger) + clientCtx = clientCtx.WithUseLedger(useLedger) + } - skipConfirm, _ := flagSet.GetBool(flags.FlagSkipConfirmation) - clientCtx = clientCtx.WithSkipConfirmation(skipConfirm) + if flagSet.Changed(flags.FlagBroadcastMode) { + bMode, _ := flagSet.GetString(flags.FlagBroadcastMode) + clientCtx = clientCtx.WithBroadcastMode(bMode) + } + + if flagSet.Changed(flags.FlagSkipConfirmation) { + skipConfirm, _ := flagSet.GetBool(flags.FlagSkipConfirmation) + clientCtx = clientCtx.WithSkipConfirmation(skipConfirm) - from, _ := flagSet.GetString(flags.FlagFrom) - fromAddr, fromName, err := GetFromFields(clientCtx.Keyring, from, clientCtx.GenerateOnly) - if err != nil { - return clientCtx, err } - clientCtx = clientCtx.WithFrom(from).WithFromAddress(fromAddr).WithFromName(fromName) + if flagSet.Changed(flags.FlagFrom) { + from, _ := flagSet.GetString(flags.FlagFrom) + fromAddr, fromName, err := GetFromFields(clientCtx.Keyring, from, clientCtx.GenerateOnly) + if err != nil { + return clientCtx, err + } + + clientCtx = clientCtx.WithFrom(from).WithFromAddress(fromAddr).WithFromName(fromName) + } return clientCtx, nil } diff --git a/types/tx/signing/signature.go b/types/tx/signing/signature.go index 0af02d85bd11..0e5112ba41d4 100644 --- a/types/tx/signing/signature.go +++ b/types/tx/signing/signature.go @@ -20,6 +20,9 @@ type SignatureV2 struct { Data SignatureData } +// SignatureDataToSignatureDescriptorData converts a SignatureData to SignatureDescriptor_Data. +// SignatureDescriptor_Data is considered an encoding type whereas SignatureData is used for +// business logic. func SignatureDataToSignatureDescriptorData(data SignatureData) *SignatureDescriptor_Data { switch data := data.(type) { case *SingleSignatureData: @@ -51,6 +54,9 @@ func SignatureDataToSignatureDescriptorData(data SignatureData) *SignatureDescri } } +// SignatureDescriptorDataToSignatureData converts a SignatureDescriptor_Data to SignatureData. +// SignatureDescriptor_Data is considered an encoding type whereas SignatureData is used for +// business logic. func SignatureDescriptorDataToSignatureData(descData *SignatureDescriptor_Data) SignatureData { switch descData := descData.Sum.(type) { case *SignatureDescriptor_Data_Single_: diff --git a/x/auth/client/cli/cli_test.go b/x/auth/client/cli/cli_test.go index 28afd3d33884..da792813ad26 100644 --- a/x/auth/client/cli/cli_test.go +++ b/x/auth/client/cli/cli_test.go @@ -86,8 +86,8 @@ func (s *IntegrationTestSuite) TestCLIValidateSignatures() { res, err = authtest.TxValidateSignaturesExec(val.ClientCtx, signedTxFile.Name()) s.Require().NoError(err) - txBuilder.SetMemo("MODIFIED STD TX") - bz, err := val.ClientCtx.TxConfig.TxJSONEncoder()(signedTx) + txBuilder.SetMemo("MODIFIED TX") + bz, err := val.ClientCtx.TxConfig.TxJSONEncoder()(txBuilder.GetTx()) s.Require().NoError(err) modifiedTxFile, cleanup := testutil.WriteToNewTempFile(s.T(), string(bz)) @@ -139,11 +139,11 @@ func (s *IntegrationTestSuite) TestCLISignBatch() { defer cleanup2() res, err = authtest.TxSignBatchExec(val.ClientCtx, val.Address, malformedFile.Name(), fmt.Sprintf("--%s=%s", flags.FlagChainID, val.ClientCtx.ChainID)) - s.Require().EqualError(err, "invalid character 'm' looking for beginning of value") + s.Require().Error(err) // Sign batch malformed tx file signature only. res, err = authtest.TxSignBatchExec(val.ClientCtx, val.Address, malformedFile.Name(), fmt.Sprintf("--%s=%s", flags.FlagChainID, val.ClientCtx.ChainID), "--signature-only") - s.Require().EqualError(err, "invalid character 'm' looking for beginning of value") + s.Require().Error(err) } func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() { @@ -168,8 +168,12 @@ func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() { ) s.Require().NoError(err) - normalGeneratedStdTx := unmarshalStdTx(s.T(), val1.ClientCtx.TxConfig, normalGeneratedTx.Bytes()) - txBuilder, err := val1.ClientCtx.TxConfig.WrapTxBuilder(normalGeneratedStdTx) + txCfg := val1.ClientCtx.TxConfig + + normalGeneratedStdTx, err := txCfg.TxJSONDecoder()(normalGeneratedTx.Bytes()) + s.Require().NoError(err) + txBuilder, err := txCfg.WrapTxBuilder(normalGeneratedStdTx) + s.Require().NoError(err) s.Require().Equal(txBuilder.GetTx().GetGas(), uint64(flags.DefaultGasLimit)) s.Require().Equal(len(txBuilder.GetTx().GetMsgs()), 1) s.Require().Equal(0, len(txBuilder.GetTx().GetSignatures())) @@ -190,9 +194,10 @@ func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() { ) s.Require().NoError(err) - limitedGasStdTx := unmarshalStdTx(s.T(), val1.ClientCtx.TxConfig, limitedGasGeneratedTx.Bytes()) - txBuilder, err = val1.ClientCtx.TxConfig.WrapTxBuilder(limitedGasStdTx) - s.Require().NotNil(txBuilder) + limitedGasStdTx, err := txCfg.TxJSONDecoder()(limitedGasGeneratedTx.Bytes()) + s.Require().NoError(err) + txBuilder, err = txCfg.WrapTxBuilder(limitedGasStdTx) + s.Require().NoError(err) s.Require().Equal(txBuilder.GetTx().GetGas(), uint64(100)) s.Require().Equal(len(txBuilder.GetTx().GetMsgs()), 1) s.Require().Equal(0, len(txBuilder.GetTx().GetSignatures())) @@ -213,8 +218,10 @@ func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() { ) s.Require().NoError(err) - finalStdTx := unmarshalStdTx(s.T(), val1.ClientCtx.TxConfig, finalGeneratedTx.Bytes()) - txBuilder, err = val1.ClientCtx.TxConfig.WrapTxBuilder(finalStdTx) + finalStdTx, err := txCfg.TxJSONDecoder()(finalGeneratedTx.Bytes()) + s.Require().NoError(err) + txBuilder, err = txCfg.WrapTxBuilder(finalStdTx) + s.Require().NoError(err) s.Require().Equal(uint64(flags.DefaultGasLimit), txBuilder.GetTx().GetGas()) s.Require().Equal(len(finalStdTx.GetMsgs()), 1) @@ -242,9 +249,10 @@ func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() { signedTx, err := authtest.TxSignExec(val1.ClientCtx, val1.Address, unsignedTxFile.Name()) s.Require().NoError(err) s.T().Log(signedTx.String()) - signedFinalTx := unmarshalStdTx(s.T(), val1.ClientCtx.TxConfig, signedTx.Bytes()) + signedFinalTx, err := txCfg.TxJSONDecoder()(signedTx.Bytes()) + s.Require().NoError(err) txBuilder, err = val1.ClientCtx.TxConfig.WrapTxBuilder(signedFinalTx) - s.Require().Error(err) + s.Require().NoError(err) s.Require().Equal(len(txBuilder.GetTx().GetMsgs()), 1) s.Require().Equal(1, len(txBuilder.GetTx().GetSignatures())) s.Require().Equal(val1.Address.String(), txBuilder.GetTx().GetSigners()[0].String()) @@ -410,8 +418,11 @@ func (s *IntegrationTestSuite) TestCLIEncode() { decodedTx, err := authtest.TxDecodeExec(val1.ClientCtx, trimmedBase64) s.Require().NoError(err) - theTx := unmarshalStdTx(s.T(), val1.ClientCtx.TxConfig, decodedTx.Bytes()) + txCfg := val1.ClientCtx.TxConfig + theTx, err := txCfg.TxJSONDecoder()(decodedTx.Bytes()) + s.Require().NoError(err) txBuilder, err := val1.ClientCtx.TxConfig.WrapTxBuilder(theTx) + s.Require().NoError(err) s.Require().Equal("deadbeef", txBuilder.GetTx().GetMemo()) } @@ -653,9 +664,3 @@ func TestGetBroadcastCommand_WithoutOfflineFlag(t *testing.T) { func TestIntegrationTestSuite(t *testing.T) { suite.Run(t, new(IntegrationTestSuite)) } - -func unmarshalStdTx(t require.TestingT, txConfig client.TxConfig, b []byte) (stdTx sdk.Tx) { - stdTx, err := txConfig.TxJSONDecoder()(b) - require.NoError(t, err) - return stdTx -} diff --git a/x/auth/client/cli/tx_multisign.go b/x/auth/client/cli/tx_multisign.go index fd08f08c5f3a..70f8f89140d4 100644 --- a/x/auth/client/cli/tx_multisign.go +++ b/x/auth/client/cli/tx_multisign.go @@ -65,11 +65,17 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { if err != nil { return err } - stdTx, err := authclient.ReadTxFromFile(clientCtx, args[0]) + + parsedTx, err := authclient.ReadTxFromFile(clientCtx, args[0]) if err != nil { return } + txBuilder, err := clientCtx.TxConfig.WrapTxBuilder(parsedTx) + if err != nil { + return err + } + backend, _ := cmd.Flags().GetString(flags.FlagKeyringBackend) inBuf := bufio.NewReader(cmd.InOrStdin()) @@ -101,7 +107,7 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { // read each signature and add it to the multisig if valid for i := 2; i < len(args); i++ { - stdSig, err := readAndUnmarshalStdSignature(clientCtx, args[i]) + sigs, err := unmarshalSignatureJSON(clientCtx, args[i]) if err != nil { return err } @@ -111,39 +117,32 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { AccountNumber: txFactory.AccountNumber(), AccountSequence: txFactory.Sequence(), } - err = signing.VerifySignature(stdSig.PubKey, signingData, stdSig.Data, clientCtx.TxConfig.SignModeHandler(), stdTx) - if err != nil { - return fmt.Errorf("couldn't verify signature") - } - if err := multisig.AddSignatureV2(multisigSig, stdSig, multisigPub.PubKeys); err != nil { - return err - } - } - var json []byte + for _, sig := range sigs { + err = signing.VerifySignature(sig.PubKey, signingData, sig.Data, clientCtx.TxConfig.SignModeHandler(), txBuilder.GetTx()) + if err != nil { + return fmt.Errorf("couldn't verify signature") + } - txBuilder, err := clientCtx.TxConfig.WrapTxBuilder(stdTx) - if err != nil { - return err + if err := multisig.AddSignatureV2(multisigSig, sig, multisigPub.PubKeys); err != nil { + return err + } + } } - sigBldr := signingtypes.SignatureV2{ + sigV2 := signingtypes.SignatureV2{ PubKey: multisigPub, Data: multisigSig, } - err = txBuilder.SetSignatures(sigBldr) - + err = txBuilder.SetSignatures(sigV2) if err != nil { return err } + sigOnly, _ := cmd.Flags().GetBool(flagSigOnly) - if sigOnly { - json, err = clientCtx.JSONMarshaler.MarshalJSON(multisigSig.Signatures[0]) - } else { - json, err = clientCtx.JSONMarshaler.MarshalJSON(txBuilder.GetTx()) - } + json, err := marshalSignatureJSON(clientCtx.TxConfig, txBuilder, sigOnly) if err != nil { return err } @@ -165,13 +164,10 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { } } -func readAndUnmarshalStdSignature(clientCtx client.Context, filename string) (stdSig signingtypes.SignatureV2, err error) { +func unmarshalSignatureJSON(clientCtx client.Context, filename string) (sigs []signingtypes.SignatureV2, err error) { var bytes []byte if bytes, err = ioutil.ReadFile(filename); err != nil { return } - if err = clientCtx.JSONMarshaler.UnmarshalJSON(bytes, &stdSig); err != nil { - return - } - return + return clientCtx.TxConfig.UnmarshalSignatureJSON(bytes) } diff --git a/x/auth/client/cli/tx_sign.go b/x/auth/client/cli/tx_sign.go index 4094c7b4f572..8b2d9ccbfc81 100644 --- a/x/auth/client/cli/tx_sign.go +++ b/x/auth/client/cli/tx_sign.go @@ -99,7 +99,7 @@ func makeSignBatchCmd() func(cmd *cobra.Command, args []string) error { scanner := authclient.NewBatchScanner(clientCtx.TxConfig, infile) for sequence := txFactory.Sequence(); scanner.Scan(); sequence++ { - unsignedStdTx := scanner.StdTx() + unsignedStdTx := scanner.Tx() txFactory = txFactory.WithSequence(sequence) txBuilder, err := clientCtx.TxConfig.WrapTxBuilder(unsignedStdTx) if err != nil { @@ -123,7 +123,7 @@ func makeSignBatchCmd() func(cmd *cobra.Command, args []string) error { return err } - json, err := getSignatureJSON(txGen, txBuilder, unsignedStdTx, generateSignatureOnly) + json, err := marshalSignatureJSON(txGen, txBuilder, generateSignatureOnly) if err != nil { return err } @@ -244,8 +244,8 @@ func makeSignCmd() func(cmd *cobra.Command, args []string) error { ) generateSignatureOnly = true } else { - append, _ := cmd.Flags().GetBool(flagAppend) - appendSig := append && !generateSignatureOnly + flagAppend, _ := cmd.Flags().GetBool(flagAppend) + appendSig := flagAppend && !generateSignatureOnly if appendSig { err = authclient.SignTx(txF, clientCtx, clientCtx.GetFromName(), txBuilder, clientCtx.Offline) } @@ -254,7 +254,7 @@ func makeSignCmd() func(cmd *cobra.Command, args []string) error { return err } - json, err := getSignatureJSON(txGen, txBuilder, newTx, generateSignatureOnly) + json, err := marshalSignatureJSON(txGen, txBuilder, generateSignatureOnly) if err != nil { return err } @@ -276,14 +276,16 @@ func makeSignCmd() func(cmd *cobra.Command, args []string) error { } } -func getSignatureJSON(txConfig client.TxConfig, txBldr client.TxBuilder, newTx sdk.Tx, generateSignatureOnly bool) ([]byte, error) { +func marshalSignatureJSON(txConfig client.TxConfig, txBldr client.TxBuilder, generateSignatureOnly bool) ([]byte, error) { + parsedTx := txBldr.GetTx() + if generateSignatureOnly { - sigs, err := txBldr.GetTx().GetSignaturesV2() + sigs, err := parsedTx.GetSignaturesV2() if err != nil { return nil, err } return txConfig.MarshalSignatureJSON(sigs) } - return txConfig.TxEncoder()(newTx) + return txConfig.TxJSONEncoder()(parsedTx) } diff --git a/x/auth/client/cli/validate_sigs.go b/x/auth/client/cli/validate_sigs.go index d3258a6d07ff..3d1c50b8115a 100644 --- a/x/auth/client/cli/validate_sigs.go +++ b/x/auth/client/cli/validate_sigs.go @@ -125,6 +125,7 @@ func printAndValidateSigs( return success } + func readTxAndInitContexts(clientCtx client.Context, cmd *cobra.Command, filename string) (client.Context, tx.Factory, sdk.Tx, error) { stdTx, err := authclient.ReadTxFromFile(clientCtx, filename) if err != nil { diff --git a/x/auth/client/tx.go b/x/auth/client/tx.go index f36c4ecfcb9d..3868020905c7 100644 --- a/x/auth/client/tx.go +++ b/x/auth/client/tx.go @@ -147,13 +147,13 @@ func NewBatchScanner(cfg client.TxConfig, r io.Reader) *BatchScanner { type BatchScanner struct { *bufio.Scanner builder client.TxBuilder - stdTx sdk.Tx + theTx sdk.Tx cfg client.TxConfig unmarshalErr error } -// StdTx returns the most recent StdTx unmarshalled by a call to Scan. -func (bs BatchScanner) StdTx() sdk.Tx { return bs.stdTx } +// Tx returns the most recent Tx unmarshalled by a call to Scan. +func (bs BatchScanner) Tx() sdk.Tx { return bs.theTx } // UnmarshalErr returns the first unmarshalling error that was encountered by the scanner. func (bs BatchScanner) UnmarshalErr() error { return bs.unmarshalErr } @@ -165,7 +165,7 @@ func (bs *BatchScanner) Scan() bool { } tx, err := bs.cfg.TxJSONDecoder()(bs.Bytes()) - bs.stdTx = tx + bs.theTx = tx if err != nil && bs.unmarshalErr == nil { bs.unmarshalErr = err return false diff --git a/x/auth/client/tx_test.go b/x/auth/client/tx_test.go index 091347be5c50..b3af17af76d4 100644 --- a/x/auth/client/tx_test.go +++ b/x/auth/client/tx_test.go @@ -189,10 +189,10 @@ malformed t.Run(tt.name, func(t *testing.T) { scanner, i := NewBatchScanner(clientCtx.TxConfig, strings.NewReader(tt.batch)), 0 for scanner.Scan() { - _ = scanner.StdTx() + _ = scanner.Tx() i++ } - t.Log(scanner.stdTx) + t.Log(scanner.theTx) require.Equal(t, tt.wantScannerError, scanner.Err() != nil) require.Equal(t, tt.wantUnmarshalError, scanner.UnmarshalErr() != nil) require.Equal(t, tt.numTxs, i) From 1fe808818d98dcfecfa48a9876a45a8ea93c33d3 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Mon, 27 Jul 2020 16:34:21 -0400 Subject: [PATCH 25/40] Test fixes --- x/auth/client/cli/cli_test.go | 19 ++++++++++++++----- x/auth/client/cli/decode.go | 9 ++++++++- x/auth/client/cli/encode.go | 12 +++--------- x/auth/client/cli/encode_test.go | 24 ++++++++++++++---------- 4 files changed, 39 insertions(+), 25 deletions(-) diff --git a/x/auth/client/cli/cli_test.go b/x/auth/client/cli/cli_test.go index da792813ad26..b3d32eed2499 100644 --- a/x/auth/client/cli/cli_test.go +++ b/x/auth/client/cli/cli_test.go @@ -18,7 +18,7 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" - simappparams "github.com/cosmos/cosmos-sdk/simapp/params" + "github.com/cosmos/cosmos-sdk/simapp" "github.com/cosmos/cosmos-sdk/testutil" "github.com/cosmos/cosmos-sdk/testutil/network" sdk "github.com/cosmos/cosmos-sdk/types" @@ -626,7 +626,7 @@ func (s *IntegrationTestSuite) TestCLIMultisign() { func TestGetBroadcastCommand_OfflineFlag(t *testing.T) { clientCtx := client.Context{}.WithOffline(true) - clientCtx = clientCtx.WithTxConfig(simappparams.MakeEncodingConfig().TxConfig) + clientCtx = clientCtx.WithTxConfig(simapp.MakeEncodingConfig().TxConfig) cmd := authcli.GetBroadcastCommand() _ = testutil.ApplyMockIODiscardOutErr(cmd) @@ -637,7 +637,8 @@ func TestGetBroadcastCommand_OfflineFlag(t *testing.T) { func TestGetBroadcastCommand_WithoutOfflineFlag(t *testing.T) { clientCtx := client.Context{} - clientCtx = clientCtx.WithTxConfig(simappparams.MakeEncodingConfig().TxConfig) + txCfg := simapp.MakeEncodingConfig().TxConfig + clientCtx = clientCtx.WithTxConfig(txCfg) ctx := context.Background() ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) @@ -649,9 +650,17 @@ func TestGetBroadcastCommand_WithoutOfflineFlag(t *testing.T) { // Create new file with tx // TODO: Update this to tx - txContents := []byte("{\"type\":\"cosmos-sdk/StdTx\",\"value\":{\"msg\":[{\"type\":\"cosmos-sdk/MsgSend\",\"value\":{\"from_address\":\"cosmos1cxlt8kznps92fwu3j6npahx4mjfutydyene2qw\",\"to_address\":\"cosmos1wc8mpr8m3sy3ap3j7fsgqfzx36um05pystems4\",\"amount\":[{\"denom\":\"stake\",\"amount\":\"10000\"}]}}],\"fee\":{\"amount\":[],\"gas\":\"200000\"},\"signatures\":null,\"memo\":\"\"}}") + builder := txCfg.NewTxBuilder() + builder.SetGasLimit(200000) + from, err := sdk.AccAddressFromBech32("cosmos1cxlt8kznps92fwu3j6npahx4mjfutydyene2qw") + require.NoError(t, err) + to, err := sdk.AccAddressFromBech32("cosmos1cxlt8kznps92fwu3j6npahx4mjfutydyene2qw") + require.NoError(t, err) + err = builder.SetMsgs(banktypes.NewMsgSend(from, to, sdk.Coins{sdk.NewInt64Coin("stake", 10000)})) + require.NoError(t, err) + txContents, err := txCfg.TxJSONEncoder()(builder.GetTx()) txFileName := filepath.Join(testDir, "tx.json") - err := ioutil.WriteFile(txFileName, txContents, 0644) + err = ioutil.WriteFile(txFileName, txContents, 0644) require.NoError(t, err) cmd.SetArgs([]string{txFileName}) diff --git a/x/auth/client/cli/decode.go b/x/auth/client/cli/decode.go index 513b23d45eb9..c78af476f9e6 100644 --- a/x/auth/client/cli/decode.go +++ b/x/auth/client/cli/decode.go @@ -37,7 +37,14 @@ func GetDecodeCommand() *cobra.Command { return err } - return clientCtx.PrintOutput(tx) + json, err := clientCtx.TxConfig.TxJSONEncoder()(tx) + if err != nil { + return err + } + + cmd.Printf("%s\n", json) + + return nil }, } diff --git a/x/auth/client/cli/encode.go b/x/auth/client/cli/encode.go index 73fcfb450af1..d7279d09b1c1 100644 --- a/x/auth/client/cli/encode.go +++ b/x/auth/client/cli/encode.go @@ -10,13 +10,6 @@ import ( authclient "github.com/cosmos/cosmos-sdk/x/auth/client" ) -// txEncodeRespStr implements a simple Stringer wrapper for a encoded tx. -type txEncodeRespStr string - -func (txr txEncodeRespStr) String() string { - return string(txr) -} - // GetEncodeCommand returns the encode command to take a JSONified transaction and turn it into // Amino-serialized bytes func GetEncodeCommand() *cobra.Command { @@ -44,8 +37,9 @@ If you supply a dash (-) argument in place of an input filename, the command rea // base64 encode the encoded tx bytes txBytesBase64 := base64.StdEncoding.EncodeToString(txBytes) - response := txEncodeRespStr(txBytesBase64) - return clientCtx.PrintOutput(response) + cmd.Printf("%s\n", txBytesBase64) + + return nil }, } diff --git a/x/auth/client/cli/encode_test.go b/x/auth/client/cli/encode_test.go index 2458b5532157..8b245af985f3 100644 --- a/x/auth/client/cli/encode_test.go +++ b/x/auth/client/cli/encode_test.go @@ -23,15 +23,17 @@ func TestGetCommandEncode(t *testing.T) { authtypes.RegisterCodec(encodingConfig.Amino) sdk.RegisterCodec(encodingConfig.Amino) - txGen := encodingConfig.TxConfig + txCfg := encodingConfig.TxConfig // Build a test transaction - fee := authtypes.NewStdFee(50000, sdk.Coins{sdk.NewInt64Coin("atom", 150)}) - stdTx := authtypes.NewStdTx([]sdk.Msg{}, fee, []authtypes.StdSignature{}, "foomemo") - JSONEncoded, err := txGen.TxJSONEncoder()(stdTx) + builder := txCfg.NewTxBuilder() + builder.SetGasLimit(50000) + builder.SetFeeAmount(sdk.Coins{sdk.NewInt64Coin("atom", 150)}) + builder.SetMemo("foomemo") + jsonEncoded, err := txCfg.TxJSONEncoder()(builder.GetTx()) require.NoError(t, err) - txFile, cleanup := testutil.WriteToNewTempFile(t, string(JSONEncoded)) + txFile, cleanup := testutil.WriteToNewTempFile(t, string(jsonEncoded)) txFileName := txFile.Name() t.Cleanup(cleanup) @@ -58,15 +60,17 @@ func TestGetCommandDecode(t *testing.T) { sdk.RegisterCodec(encodingConfig.Amino) - txGen := encodingConfig.TxConfig - clientCtx = clientCtx.WithTxConfig(txGen) + txCfg := encodingConfig.TxConfig + clientCtx = clientCtx.WithTxConfig(txCfg) // Build a test transaction - fee := authtypes.NewStdFee(50000, sdk.Coins{sdk.NewInt64Coin("atom", 150)}) - stdTx := authtypes.NewStdTx([]sdk.Msg{}, fee, []authtypes.StdSignature{}, "foomemo") + builder := txCfg.NewTxBuilder() + builder.SetGasLimit(50000) + builder.SetFeeAmount(sdk.Coins{sdk.NewInt64Coin("atom", 150)}) + builder.SetMemo("foomemo") // Encode transaction - txBytes, err := clientCtx.TxConfig.TxEncoder()(stdTx) + txBytes, err := clientCtx.TxConfig.TxEncoder()(builder.GetTx()) require.NoError(t, err) // Convert the transaction into base64 encoded string From 88bdb62a554ae42dda84a353052950eacafac0fd Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Mon, 27 Jul 2020 17:54:21 -0400 Subject: [PATCH 26/40] Fixes --- client/context.go | 11 +++++++++++ client/tx/tx.go | 7 ++++++- x/auth/client/cli/cli_test.go | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/client/context.go b/client/context.go index 5580853e3027..21e5a29ac79a 100644 --- a/client/context.go +++ b/client/context.go @@ -195,6 +195,17 @@ func (ctx Context) WithInterfaceRegistry(interfaceRegistry codectypes.InterfaceR return ctx } +// PrintString prints the raw string to ctx.Output or os.Stdout +func (ctx Context) PrintString(str string) error { + writer := ctx.Output + if writer == nil { + writer = os.Stdout + } + + _, err := writer.Write([]byte(str)) + return err +} + // PrintOutput outputs toPrint to the ctx.Output based on ctx.OutputFormat which is // either text or json. If text, toPrint will be YAML encoded. Otherwise, toPrint // will be JSON encoded using ctx.JSONMarshaler. An error is returned upon failure. diff --git a/client/tx/tx.go b/client/tx/tx.go index 27c11a5f58ca..8a8d734e19fc 100644 --- a/client/tx/tx.go +++ b/client/tx/tx.go @@ -63,7 +63,12 @@ func GenerateTx(clientCtx client.Context, txf Factory, msgs ...sdk.Msg) error { return err } - return clientCtx.PrintOutput(tx.GetTx()) + json, err := clientCtx.TxConfig.TxJSONEncoder()(tx.GetTx()) + if err != nil { + return err + } + + return clientCtx.PrintString(fmt.Sprintf("%s\n", json)) } // BroadcastTx attempts to generate, sign and broadcast a transaction with the diff --git a/x/auth/client/cli/cli_test.go b/x/auth/client/cli/cli_test.go index b3d32eed2499..d7c84ba7628d 100644 --- a/x/auth/client/cli/cli_test.go +++ b/x/auth/client/cli/cli_test.go @@ -408,7 +408,7 @@ func (s *IntegrationTestSuite) TestCLIEncode() { savedTxFile, cleanup := testutil.WriteToNewTempFile(s.T(), normalGeneratedTx.String()) defer cleanup() - // Enconde + // Encode encodeExec, err := authtest.TxEncodeExec(val1.ClientCtx, savedTxFile.Name()) s.Require().NoError(err) From 9f04601418652736f8a5a69170e5d053f1b80d45 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Mon, 27 Jul 2020 23:07:06 -0400 Subject: [PATCH 27/40] WIP on tests --- client/tx/factory.go | 10 ++++++++++ simapp/params/proto.go | 10 +++++----- x/auth/client/cli/tx_sign.go | 5 +++++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/client/tx/factory.go b/client/tx/factory.go index 779daadd5402..d75cc87afa16 100644 --- a/client/tx/factory.go +++ b/client/tx/factory.go @@ -172,3 +172,13 @@ func (f Factory) WithSimulateAndExecute(sim bool) Factory { f.simulateAndExecute = sim return f } + +func (f Factory) SignMode() signing.SignMode { + return f.signMode +} + +// WithSignMode returns a copy of the Factory with an updated sign mode value. +func (f Factory) WithSignMode(mode signing.SignMode) Factory { + f.signMode = mode + return f +} diff --git a/simapp/params/proto.go b/simapp/params/proto.go index 97e282ba3426..1de96d4a490d 100644 --- a/simapp/params/proto.go +++ b/simapp/params/proto.go @@ -12,15 +12,15 @@ import ( // MakeEncodingConfig creates an EncodingConfig for an amino based test configuration. func MakeEncodingConfig() EncodingConfig { - cdc := codec.New() + amino := codec.New() interfaceRegistry := types.NewInterfaceRegistry() - protoCodec := codec.NewProtoCodec(interfaceRegistry) - txGen := tx.NewTxConfig(protoCodec, std.DefaultPublicKeyCodec{}, tx.DefaultSignModeHandler()) + marshaler := codec.NewHybridCodec(amino, interfaceRegistry) + txGen := tx.NewTxConfig(codec.NewProtoCodec(interfaceRegistry), std.DefaultPublicKeyCodec{}, tx.DefaultSignModeHandler()) return EncodingConfig{ InterfaceRegistry: interfaceRegistry, - Marshaler: protoCodec, + Marshaler: marshaler, TxConfig: txGen, - Amino: cdc, + Amino: amino, } } diff --git a/x/auth/client/cli/tx_sign.go b/x/auth/client/cli/tx_sign.go index 8b2d9ccbfc81..faea232600a6 100644 --- a/x/auth/client/cli/tx_sign.go +++ b/x/auth/client/cli/tx_sign.go @@ -4,6 +4,8 @@ import ( "fmt" "os" + "github.com/cosmos/cosmos-sdk/types/tx/signing" + "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" @@ -212,6 +214,9 @@ func makeSignCmd() func(cmd *cobra.Command, args []string) error { txFactory := tx.NewFactoryCLI(clientCtx, cmd.Flags()) clientCtx, txF, newTx, err := readTxAndInitContexts(clientCtx, cmd, args[0]) + if txF.SignMode() == signing.SignMode_SIGN_MODE_UNSPECIFIED { + txF = txF.WithSignMode(signing.SignMode_SIGN_MODE_LEGACY_AMINO_JSON) + } if err != nil { return err } From 72d3982285262b3925feed6d27885ff188b4fdbf Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Wed, 29 Jul 2020 01:13:35 +0530 Subject: [PATCH 28/40] Fix gov tests --- x/gov/client/cli/cli_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/x/gov/client/cli/cli_test.go b/x/gov/client/cli/cli_test.go index 0b707fe012f9..9c387992b344 100644 --- a/x/gov/client/cli/cli_test.go +++ b/x/gov/client/cli/cli_test.go @@ -109,6 +109,7 @@ func (s *IntegrationTestSuite) TestNewCmdSubmitProposal() { fmt.Sprintf("--%s=%s", cli.FlagProposal, validPropFile.Name()), fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), }, false, &sdk.TxResponse{}, 0, @@ -122,6 +123,7 @@ func (s *IntegrationTestSuite) TestNewCmdSubmitProposal() { fmt.Sprintf("--%s=%s", cli.FlagDeposit, sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(5431)).String()), fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), }, false, &sdk.TxResponse{}, 0, From 28bbc0f99b80c73be5a02b3589ddfd3b759e6eb8 Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Wed, 29 Jul 2020 01:30:31 +0530 Subject: [PATCH 29/40] fix lint --- proto/cosmos/tx/signing/signing.proto | 2 +- x/auth/client/tx.go | 1 - x/auth/tx/sigs.go | 4 ++-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/proto/cosmos/tx/signing/signing.proto b/proto/cosmos/tx/signing/signing.proto index 0b4ac176e3c1..a813882995fd 100644 --- a/proto/cosmos/tx/signing/signing.proto +++ b/proto/cosmos/tx/signing/signing.proto @@ -36,9 +36,9 @@ message SignatureDescriptor { // public_key is the public key of the signer cosmos.crypto.PublicKey public_key = 1; - // data represents the signature data Data data = 2; + // Data represents signature data message Data { // sum is the oneof that specifies whether this represents single or multi-signature data oneof sum { diff --git a/x/auth/client/tx.go b/x/auth/client/tx.go index 3868020905c7..079da7df32fb 100644 --- a/x/auth/client/tx.go +++ b/x/auth/client/tx.go @@ -146,7 +146,6 @@ func NewBatchScanner(cfg client.TxConfig, r io.Reader) *BatchScanner { // of newline-delimited JSON encoded StdTx. type BatchScanner struct { *bufio.Scanner - builder client.TxBuilder theTx sdk.Tx cfg client.TxConfig unmarshalErr error diff --git a/x/auth/tx/sigs.go b/x/auth/tx/sigs.go index 7b24939538f0..fc29d25703aa 100644 --- a/x/auth/tx/sigs.go +++ b/x/auth/tx/sigs.go @@ -122,9 +122,9 @@ func (g generator) MarshalSignatureJSON(sigs []signing.SignatureV2) ([]byte, err } } - toJson := &signing.SignatureDescriptors{Signatures: descs} + toJSON := &signing.SignatureDescriptors{Signatures: descs} - return codec.ProtoMarshalJSON(toJson) + return codec.ProtoMarshalJSON(toJSON) } func (g generator) UnmarshalSignatureJSON(bz []byte) ([]signing.SignatureV2, error) { From 62ff121ce0c8c9115f4837a0ca963292d4827615 Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Wed, 29 Jul 2020 02:47:54 +0530 Subject: [PATCH 30/40] fix MultiSign tests --- x/auth/client/cli/cli_test.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/x/auth/client/cli/cli_test.go b/x/auth/client/cli/cli_test.go index d7c84ba7628d..d46ddada72a5 100644 --- a/x/auth/client/cli/cli_test.go +++ b/x/auth/client/cli/cli_test.go @@ -309,7 +309,6 @@ func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() { } func (s *IntegrationTestSuite) TestCLIMultisignInsufficientCosigners() { - s.T().SkipNow() // TODO check encoding. val1 := s.network.Validators[0] codec := codec2.New() @@ -380,7 +379,7 @@ func (s *IntegrationTestSuite) TestCLIMultisignInsufficientCosigners() { defer cleanup3() exec, err := authtest.TxValidateSignaturesExec(val1.ClientCtx, multiSigWith1SignatureFile.Name()) - s.Require().NoError(err) + s.Require().Error(err) fmt.Printf("%s", exec) } @@ -427,7 +426,6 @@ func (s *IntegrationTestSuite) TestCLIEncode() { } func (s *IntegrationTestSuite) TestCLIMultisignSortSignatures() { - s.T().SkipNow() val1 := s.network.Validators[0] codec := codec2.New() From 6c1a0fa6136a01470beea1c2edbd0dfb64cd0f43 Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Wed, 29 Jul 2020 05:06:29 +0530 Subject: [PATCH 31/40] fix tests --- x/auth/client/cli/cli_test.go | 68 ++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 24 deletions(-) diff --git a/x/auth/client/cli/cli_test.go b/x/auth/client/cli/cli_test.go index d46ddada72a5..5dbf84cddacc 100644 --- a/x/auth/client/cli/cli_test.go +++ b/x/auth/client/cli/cli_test.go @@ -44,7 +44,21 @@ func (s *IntegrationTestSuite) SetupSuite() { s.cfg = cfg s.network = network.New(s.T(), cfg) - _, err := s.network.WaitForHeight(1) + kb := s.network.Validators[0].ClientCtx.Keyring + _, _, err := kb.NewMnemonic("newAccount", keyring.English, sdk.FullFundraiserPath, hd.Secp256k1) + s.Require().NoError(err) + + account1, _, err := kb.NewMnemonic("newAccount1", keyring.English, sdk.FullFundraiserPath, hd.Secp256k1) + s.Require().NoError(err) + + account2, _, err := kb.NewMnemonic("newAccount2", keyring.English, sdk.FullFundraiserPath, hd.Secp256k1) + s.Require().NoError(err) + + multi := multisig.NewPubKeyMultisigThreshold(2, []tmcrypto.PubKey{account1.GetPubKey(), account2.GetPubKey()}) + _, err = kb.SaveMultisig("multi", multi) + s.Require().NoError(err) + + _, err = s.network.WaitForHeight(1) s.Require().NoError(err) } @@ -76,7 +90,6 @@ func (s *IntegrationTestSuite) TestCLIValidateSignatures() { res, err = authtest.TxSignExec(val.ClientCtx, val.Address, unsignedTx.Name()) s.Require().NoError(err) - s.T().Log(res.String()) signedTx, err := val.ClientCtx.TxConfig.TxJSONDecoder()(res.Bytes()) s.Require().NoError(err) @@ -149,7 +162,7 @@ func (s *IntegrationTestSuite) TestCLISignBatch() { func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() { val1 := s.network.Validators[0] - account, _, err := val1.ClientCtx.Keyring.NewMnemonic("newAccount", keyring.English, sdk.FullFundraiserPath, hd.Secp256k1) + account, err := val1.ClientCtx.Keyring.Key("newAccount") s.Require().NoError(err) sendTokens := sdk.TokensFromConsensusPower(10) @@ -202,6 +215,14 @@ func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() { s.Require().Equal(len(txBuilder.GetTx().GetMsgs()), 1) s.Require().Equal(0, len(txBuilder.GetTx().GetSignatures())) + resp, err := bankcli.QueryBalancesExec(val1.ClientCtx, val1.Address) + s.Require().NoError(err) + + var coins sdk.Coins + err = val1.ClientCtx.JSONMarshaler.UnmarshalJSON(resp.Bytes(), &coins) + s.Require().NoError(err) + startTokens := coins.AmountOf(s.cfg.BondDenom) + // Test generate sendTx, estimate gas finalGeneratedTx, err := bankcli.MsgSendExec( val1.ClientCtx, @@ -267,11 +288,9 @@ func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() { s.Require().True(strings.Contains(res.String(), "[OK]")) // Ensure foo has right amount of funds - startTokens := sdk.TokensFromConsensusPower(400) - resp, err := bankcli.QueryBalancesExec(val1.ClientCtx, val1.Address) + resp, err = bankcli.QueryBalancesExec(val1.ClientCtx, val1.Address) s.Require().NoError(err) - var coins sdk.Coins err = val1.ClientCtx.JSONMarshaler.UnmarshalJSON(resp.Bytes(), &coins) s.Require().NoError(err) s.Require().Equal(startTokens, coins.AmountOf(s.cfg.BondDenom)) @@ -305,7 +324,6 @@ func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() { err = val1.ClientCtx.JSONMarshaler.UnmarshalJSON(resp.Bytes(), &coins) s.Require().NoError(err) - s.Require().Equal(sdk.NewInt(389999990), coins.AmountOf(s.cfg.BondDenom)) } func (s *IntegrationTestSuite) TestCLIMultisignInsufficientCosigners() { @@ -317,14 +335,10 @@ func (s *IntegrationTestSuite) TestCLIMultisignInsufficientCosigners() { val1.ClientCtx.Codec = codec // Generate 2 accounts and a multisig. - account1, _, err := val1.ClientCtx.Keyring.NewMnemonic("newAccount1", keyring.English, sdk.FullFundraiserPath, hd.Secp256k1) + account1, err := val1.ClientCtx.Keyring.Key("newAccount1") s.Require().NoError(err) - account2, _, err := val1.ClientCtx.Keyring.NewMnemonic("newAccount2", keyring.English, sdk.FullFundraiserPath, hd.Secp256k1) - s.Require().NoError(err) - - multi := multisig.NewPubKeyMultisigThreshold(2, []tmcrypto.PubKey{account1.GetPubKey(), account2.GetPubKey()}) - multisigInfo, err := val1.ClientCtx.Keyring.SaveMultisig("multi", multi) + multisigInfo, err := val1.ClientCtx.Keyring.Key("multi") s.Require().NoError(err) // Send coins from validator to multisig. @@ -434,16 +448,23 @@ func (s *IntegrationTestSuite) TestCLIMultisignSortSignatures() { val1.ClientCtx.Codec = codec // Generate 2 accounts and a multisig. - account1, _, err := val1.ClientCtx.Keyring.NewMnemonic("newAccount1", keyring.English, sdk.FullFundraiserPath, hd.Secp256k1) + account1, err := val1.ClientCtx.Keyring.Key("newAccount1") s.Require().NoError(err) - account2, _, err := val1.ClientCtx.Keyring.NewMnemonic("newAccount2", keyring.English, sdk.FullFundraiserPath, hd.Secp256k1) + account2, err := val1.ClientCtx.Keyring.Key("newAccount2") s.Require().NoError(err) - multi := multisig.NewPubKeyMultisigThreshold(2, []tmcrypto.PubKey{account1.GetPubKey(), account2.GetPubKey()}) - multisigInfo, err := val1.ClientCtx.Keyring.SaveMultisig("multi", multi) + multisigInfo, err := val1.ClientCtx.Keyring.Key("multi") s.Require().NoError(err) + resp, err := bankcli.QueryBalancesExec(val1.ClientCtx, multisigInfo.GetAddress()) + s.Require().NoError(err) + + var coins sdk.Coins + err = val1.ClientCtx.JSONMarshaler.UnmarshalJSON(resp.Bytes(), &coins) + s.Require().NoError(err) + intialBal := coins.AmountOf(s.cfg.BondDenom).Uint64() + // Send coins from validator to multisig. sendTokens := sdk.NewInt64Coin(s.cfg.BondDenom, 10) _, err = bankcli.MsgSendExec( @@ -462,13 +483,13 @@ func (s *IntegrationTestSuite) TestCLIMultisignSortSignatures() { s.Require().NoError(s.network.WaitForNextBlock()) - resp, err := bankcli.QueryBalancesExec(val1.ClientCtx, multisigInfo.GetAddress()) + resp, err = bankcli.QueryBalancesExec(val1.ClientCtx, multisigInfo.GetAddress()) s.Require().NoError(err) - var coins sdk.Coins err = val1.ClientCtx.JSONMarshaler.UnmarshalJSON(resp.Bytes(), &coins) s.Require().NoError(err) - s.Require().Equal(sendTokens.Amount, coins.AmountOf(s.cfg.BondDenom)) + + s.Require().Equal(sendTokens.Amount.Uint64(), coins.AmountOf(s.cfg.BondDenom).Uint64()-intialBal) // Generate multisig transaction. multiGeneratedTx, err := bankcli.MsgSendExec( @@ -530,14 +551,13 @@ func (s *IntegrationTestSuite) TestCLIMultisign() { val1.ClientCtx.Codec = codec // Generate 2 accounts and a multisig. - account1, _, err := val1.ClientCtx.Keyring.NewMnemonic("newAccount1", keyring.English, sdk.FullFundraiserPath, hd.Secp256k1) + account1, err := val1.ClientCtx.Keyring.Key("newAccount1") s.Require().NoError(err) - account2, _, err := val1.ClientCtx.Keyring.NewMnemonic("newAccount2", keyring.English, sdk.FullFundraiserPath, hd.Secp256k1) + account2, err := val1.ClientCtx.Keyring.Key("newAccount2") s.Require().NoError(err) - multi := multisig.NewPubKeyMultisigThreshold(2, []tmcrypto.PubKey{account1.GetPubKey(), account2.GetPubKey()}) - multisigInfo, err := val1.ClientCtx.Keyring.SaveMultisig("multi", multi) + multisigInfo, err := val1.ClientCtx.Keyring.Key("multi") s.Require().NoError(err) // Send coins from validator to multisig. From 29dab69e455ea11bf9900bbccc5d9fd805d5fa43 Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Wed, 29 Jul 2020 05:28:40 +0530 Subject: [PATCH 32/40] refactor tests --- x/auth/client/cli/cli_test.go | 37 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/x/auth/client/cli/cli_test.go b/x/auth/client/cli/cli_test.go index 5dbf84cddacc..728a7c911e7a 100644 --- a/x/auth/client/cli/cli_test.go +++ b/x/auth/client/cli/cli_test.go @@ -165,15 +165,13 @@ func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() { account, err := val1.ClientCtx.Keyring.Key("newAccount") s.Require().NoError(err) - sendTokens := sdk.TokensFromConsensusPower(10) + sendTokens := sdk.NewCoin(s.cfg.BondDenom, sdk.TokensFromConsensusPower(10)) normalGeneratedTx, err := bankcli.MsgSendExec( val1.ClientCtx, val1.Address, account.GetAddress(), - sdk.NewCoins( - sdk.NewCoin(s.cfg.BondDenom, sendTokens), - ), + sdk.NewCoins(sendTokens), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), @@ -196,9 +194,7 @@ func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() { val1.ClientCtx, val1.Address, account.GetAddress(), - sdk.NewCoins( - sdk.NewCoin(s.cfg.BondDenom, sendTokens), - ), + sdk.NewCoins(sendTokens), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), @@ -228,9 +224,7 @@ func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() { val1.ClientCtx, val1.Address, account.GetAddress(), - sdk.NewCoins( - sdk.NewCoin(s.cfg.BondDenom, sendTokens), - ), + sdk.NewCoins(sendTokens), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), @@ -269,7 +263,6 @@ func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() { // Sign transaction signedTx, err := authtest.TxSignExec(val1.ClientCtx, val1.Address, unsignedTxFile.Name()) s.Require().NoError(err) - s.T().Log(signedTx.String()) signedFinalTx, err := txCfg.TxJSONDecoder()(signedTx.Bytes()) s.Require().NoError(err) txBuilder, err = val1.ClientCtx.TxConfig.WrapTxBuilder(signedFinalTx) @@ -316,7 +309,7 @@ func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() { err = val1.ClientCtx.JSONMarshaler.UnmarshalJSON(resp.Bytes(), &coins) s.Require().NoError(err) - s.Require().Equal(sendTokens, coins.AmountOf(s.cfg.BondDenom)) + s.Require().Equal(sendTokens.Amount, coins.AmountOf(s.cfg.BondDenom)) // Ensure origin account state resp, err = bankcli.QueryBalancesExec(val1.ClientCtx, val1.Address) @@ -401,15 +394,13 @@ func (s *IntegrationTestSuite) TestCLIMultisignInsufficientCosigners() { func (s *IntegrationTestSuite) TestCLIEncode() { val1 := s.network.Validators[0] - sendTokens := sdk.TokensFromConsensusPower(10) + sendTokens := sdk.NewCoin(s.cfg.BondDenom, sdk.TokensFromConsensusPower(10)) normalGeneratedTx, err := bankcli.MsgSendExec( val1.ClientCtx, val1.Address, val1.Address, - sdk.NewCoins( - sdk.NewCoin(s.cfg.BondDenom, sendTokens), - ), + sdk.NewCoins(sendTokens), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), @@ -463,7 +454,7 @@ func (s *IntegrationTestSuite) TestCLIMultisignSortSignatures() { var coins sdk.Coins err = val1.ClientCtx.JSONMarshaler.UnmarshalJSON(resp.Bytes(), &coins) s.Require().NoError(err) - intialBal := coins.AmountOf(s.cfg.BondDenom).Uint64() + intialCoins := coins // Send coins from validator to multisig. sendTokens := sdk.NewInt64Coin(s.cfg.BondDenom, 10) @@ -471,9 +462,7 @@ func (s *IntegrationTestSuite) TestCLIMultisignSortSignatures() { val1.ClientCtx, val1.Address, multisigInfo.GetAddress(), - sdk.NewCoins( - sendTokens, - ), + sdk.NewCoins(sendTokens), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), @@ -488,8 +477,8 @@ func (s *IntegrationTestSuite) TestCLIMultisignSortSignatures() { err = val1.ClientCtx.JSONMarshaler.UnmarshalJSON(resp.Bytes(), &coins) s.Require().NoError(err) - - s.Require().Equal(sendTokens.Amount.Uint64(), coins.AmountOf(s.cfg.BondDenom).Uint64()-intialBal) + diff, _ := coins.SafeSub(intialCoins) + s.Require().Equal(sendTokens.Amount, diff.AmountOf(s.cfg.BondDenom)) // Generate multisig transaction. multiGeneratedTx, err := bankcli.MsgSendExec( @@ -566,9 +555,7 @@ func (s *IntegrationTestSuite) TestCLIMultisign() { val1.ClientCtx, val1.Address, multisigInfo.GetAddress(), - sdk.NewCoins( - sendTokens, - ), + sdk.NewCoins(sendTokens), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), From 750c5acfb6a921169c277a3ef825458f74727f44 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Tue, 28 Jul 2020 21:52:12 -0400 Subject: [PATCH 33/40] Cleanup --- client/tx/factory.go | 1 + x/auth/client/cli/cli_test.go | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/client/tx/factory.go b/client/tx/factory.go index d75cc87afa16..5e8749cc7111 100644 --- a/client/tx/factory.go +++ b/client/tx/factory.go @@ -173,6 +173,7 @@ func (f Factory) WithSimulateAndExecute(sim bool) Factory { return f } +// SignMode returns the sign mode configured in the Factory func (f Factory) SignMode() signing.SignMode { return f.signMode } diff --git a/x/auth/client/cli/cli_test.go b/x/auth/client/cli/cli_test.go index 728a7c911e7a..9a48497f776d 100644 --- a/x/auth/client/cli/cli_test.go +++ b/x/auth/client/cli/cli_test.go @@ -654,7 +654,6 @@ func TestGetBroadcastCommand_WithoutOfflineFlag(t *testing.T) { t.Cleanup(cleanFunc) // Create new file with tx - // TODO: Update this to tx builder := txCfg.NewTxBuilder() builder.SetGasLimit(200000) from, err := sdk.AccAddressFromBech32("cosmos1cxlt8kznps92fwu3j6npahx4mjfutydyene2qw") From 77713288f39685593a514dd0f4b1533b88627d11 Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Thu, 30 Jul 2020 00:02:46 +0530 Subject: [PATCH 34/40] Address review comments --- x/auth/client/cli/decode.go | 6 +++--- x/auth/client/cli/tx_multisign.go | 4 ++-- x/auth/client/cli/tx_sign.go | 24 ++++++++++++------------ 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/x/auth/client/cli/decode.go b/x/auth/client/cli/decode.go index c78af476f9e6..2a8764f1f6e3 100644 --- a/x/auth/client/cli/decode.go +++ b/x/auth/client/cli/decode.go @@ -3,6 +3,7 @@ package cli import ( "encoding/base64" "encoding/hex" + "fmt" "github.com/spf13/cobra" @@ -42,9 +43,8 @@ func GetDecodeCommand() *cobra.Command { return err } - cmd.Printf("%s\n", json) - - return nil + err = clientCtx.PrintString(fmt.Sprintf("%s\n", json)) + return err }, } diff --git a/x/auth/client/cli/tx_multisign.go b/x/auth/client/cli/tx_multisign.go index 70f8f89140d4..c2895108fe4d 100644 --- a/x/auth/client/cli/tx_multisign.go +++ b/x/auth/client/cli/tx_multisign.go @@ -159,8 +159,8 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { } defer fp.Close() - fmt.Fprintf(fp, "%s\n", json) - return + err = clientCtx.PrintString(fmt.Sprintf("%s\n", json)) + return err } } diff --git a/x/auth/client/cli/tx_sign.go b/x/auth/client/cli/tx_sign.go index faea232600a6..9d9fd47415f6 100644 --- a/x/auth/client/cli/tx_sign.go +++ b/x/auth/client/cli/tx_sign.go @@ -67,7 +67,7 @@ func makeSignBatchCmd() func(cmd *cobra.Command, args []string) error { } txFactory := tx.NewFactoryCLI(clientCtx, cmd.Flags()) - txGen := clientCtx.TxConfig + txCfg := clientCtx.TxConfig generateSignatureOnly, _ := cmd.Flags().GetBool(flagSigOnly) var ( @@ -98,12 +98,12 @@ func makeSignBatchCmd() func(cmd *cobra.Command, args []string) error { return err } } - scanner := authclient.NewBatchScanner(clientCtx.TxConfig, infile) + scanner := authclient.NewBatchScanner(txCfg, infile) for sequence := txFactory.Sequence(); scanner.Scan(); sequence++ { unsignedStdTx := scanner.Tx() txFactory = txFactory.WithSequence(sequence) - txBuilder, err := clientCtx.TxConfig.WrapTxBuilder(unsignedStdTx) + txBuilder, err := txCfg.WrapTxBuilder(unsignedStdTx) if err != nil { return err } @@ -125,7 +125,7 @@ func makeSignBatchCmd() func(cmd *cobra.Command, args []string) error { return err } - json, err := marshalSignatureJSON(txGen, txBuilder, generateSignatureOnly) + json, err := marshalSignatureJSON(txCfg, txBuilder, generateSignatureOnly) if err != nil { return err } @@ -214,14 +214,14 @@ func makeSignCmd() func(cmd *cobra.Command, args []string) error { txFactory := tx.NewFactoryCLI(clientCtx, cmd.Flags()) clientCtx, txF, newTx, err := readTxAndInitContexts(clientCtx, cmd, args[0]) - if txF.SignMode() == signing.SignMode_SIGN_MODE_UNSPECIFIED { - txF = txF.WithSignMode(signing.SignMode_SIGN_MODE_LEGACY_AMINO_JSON) - } if err != nil { return err } - txGen := clientCtx.TxConfig - txBuilder, err := clientCtx.TxConfig.WrapTxBuilder(newTx) + if txF.SignMode() == signing.SignMode_SIGN_MODE_UNSPECIFIED { + txF = txF.WithSignMode(signing.SignMode_SIGN_MODE_LEGACY_AMINO_JSON) + } + txCfg := clientCtx.TxConfig + txBuilder, err := txCfg.WrapTxBuilder(newTx) if err != nil { return err } @@ -259,7 +259,7 @@ func makeSignCmd() func(cmd *cobra.Command, args []string) error { return err } - json, err := marshalSignatureJSON(txGen, txBuilder, generateSignatureOnly) + json, err := marshalSignatureJSON(txCfg, txBuilder, generateSignatureOnly) if err != nil { return err } @@ -276,8 +276,8 @@ func makeSignCmd() func(cmd *cobra.Command, args []string) error { } defer fp.Close() - fmt.Fprintf(fp, "%s\n", json) - return nil + err = clientCtx.PrintString(fmt.Sprintf("%s\n", json)) + return err } } From 423cbcbd4a3f6009880db3d0dd6d84e43f014aaa Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Thu, 30 Jul 2020 00:04:38 +0530 Subject: [PATCH 35/40] Update encode --- x/auth/client/cli/encode.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/auth/client/cli/encode.go b/x/auth/client/cli/encode.go index d7279d09b1c1..b00950565053 100644 --- a/x/auth/client/cli/encode.go +++ b/x/auth/client/cli/encode.go @@ -2,6 +2,7 @@ package cli import ( "encoding/base64" + "fmt" "github.com/spf13/cobra" @@ -37,8 +38,7 @@ If you supply a dash (-) argument in place of an input filename, the command rea // base64 encode the encoded tx bytes txBytesBase64 := base64.StdEncoding.EncodeToString(txBytes) - cmd.Printf("%s\n", txBytesBase64) - + err = clientCtx.PrintString(fmt.Sprintf("%s\n", txBytesBase64)) return nil }, } From 0136c113b03d5d9a08911d84c776c6a8a5f41685 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Wed, 29 Jul 2020 14:57:31 -0400 Subject: [PATCH 36/40] Test fix --- codec/proto_codec_test.go | 2 +- go.sum | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/codec/proto_codec_test.go b/codec/proto_codec_test.go index fd1fc7a23558..522c80c4e8e5 100644 --- a/codec/proto_codec_test.go +++ b/codec/proto_codec_test.go @@ -204,7 +204,7 @@ func mustAny(msg proto.Message) *types.Any { } func BenchmarkProtoCodecMarshalBinaryLengthPrefixed(b *testing.B) { - var pCdc = codec.NewProtoCodec(types.NewInterfaceRegistry()).(*codec.ProtoCodec) + var pCdc = codec.NewProtoCodec(types.NewInterfaceRegistry()) var msg = &testdata.HasAnimal{ X: 1000, Animal: mustAny(&testdata.HasAnimal{ diff --git a/go.sum b/go.sum index b3d075b7647d..a79943ce319c 100644 --- a/go.sum +++ b/go.sum @@ -168,8 +168,6 @@ github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4er github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -646,7 +644,6 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20u golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 h1:ogLJMz+qpzav7lGMh10LMvAkM/fAoGlaiiHYiFYdm80= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= @@ -772,7 +769,5 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= From 2073e3f62636b5287d1d3c9119b709ede13a7632 Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Thu, 30 Jul 2020 01:42:16 +0530 Subject: [PATCH 37/40] Rename SignData func --- types/tx/signing/signature.go | 12 ++++++------ x/auth/tx/sigs.go | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/types/tx/signing/signature.go b/types/tx/signing/signature.go index 0e5112ba41d4..bfe832a5b1ea 100644 --- a/types/tx/signing/signature.go +++ b/types/tx/signing/signature.go @@ -20,10 +20,10 @@ type SignatureV2 struct { Data SignatureData } -// SignatureDataToSignatureDescriptorData converts a SignatureData to SignatureDescriptor_Data. +// SignatureDataToProto converts a SignatureData to SignatureDescriptor_Data. // SignatureDescriptor_Data is considered an encoding type whereas SignatureData is used for // business logic. -func SignatureDataToSignatureDescriptorData(data SignatureData) *SignatureDescriptor_Data { +func SignatureDataToProto(data SignatureData) *SignatureDescriptor_Data { switch data := data.(type) { case *SingleSignatureData: return &SignatureDescriptor_Data{ @@ -38,7 +38,7 @@ func SignatureDataToSignatureDescriptorData(data SignatureData) *SignatureDescri descDatas := make([]*SignatureDescriptor_Data, len(data.Signatures)) for j, d := range data.Signatures { - descDatas[j] = SignatureDataToSignatureDescriptorData(d) + descDatas[j] = SignatureDataToProto(d) } return &SignatureDescriptor_Data{ @@ -54,10 +54,10 @@ func SignatureDataToSignatureDescriptorData(data SignatureData) *SignatureDescri } } -// SignatureDescriptorDataToSignatureData converts a SignatureDescriptor_Data to SignatureData. +// SignatureDataFromProto converts a SignatureDescriptor_Data to SignatureData. // SignatureDescriptor_Data is considered an encoding type whereas SignatureData is used for // business logic. -func SignatureDescriptorDataToSignatureData(descData *SignatureDescriptor_Data) SignatureData { +func SignatureDataFromProto(descData *SignatureDescriptor_Data) SignatureData { switch descData := descData.Sum.(type) { case *SignatureDescriptor_Data_Single_: return &SingleSignatureData{ @@ -69,7 +69,7 @@ func SignatureDescriptorDataToSignatureData(descData *SignatureDescriptor_Data) datas := make([]SignatureData, len(multi.Signatures)) for j, d := range multi.Signatures { - datas[j] = SignatureDescriptorDataToSignatureData(d) + datas[j] = SignatureDataFromProto(d) } return &MultiSignatureData{ diff --git a/x/auth/tx/sigs.go b/x/auth/tx/sigs.go index fc29d25703aa..1d13277f37f5 100644 --- a/x/auth/tx/sigs.go +++ b/x/auth/tx/sigs.go @@ -114,7 +114,7 @@ func (g generator) MarshalSignatureJSON(sigs []signing.SignatureV2) ([]byte, err return nil, err } - descData := signing.SignatureDataToSignatureDescriptorData(sig.Data) + descData := signing.SignatureDataToProto(sig.Data) descs[i] = &signing.SignatureDescriptor{ PublicKey: publicKey, @@ -141,7 +141,7 @@ func (g generator) UnmarshalSignatureJSON(bz []byte) ([]signing.SignatureV2, err return nil, err } - data := signing.SignatureDescriptorDataToSignatureData(desc.Data) + data := signing.SignatureDataFromProto(desc.Data) sigs[i] = signing.SignatureV2{ PubKey: pubKey, From af89c169127c19d4d5017b00675040c94fbeb15e Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Thu, 30 Jul 2020 01:42:46 +0530 Subject: [PATCH 38/40] Fix lint --- x/auth/client/cli/encode.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/auth/client/cli/encode.go b/x/auth/client/cli/encode.go index b00950565053..0ef8bcef9301 100644 --- a/x/auth/client/cli/encode.go +++ b/x/auth/client/cli/encode.go @@ -39,7 +39,7 @@ If you supply a dash (-) argument in place of an input filename, the command rea txBytesBase64 := base64.StdEncoding.EncodeToString(txBytes) err = clientCtx.PrintString(fmt.Sprintf("%s\n", txBytesBase64)) - return nil + return err }, } From c6a7353fc1c02bda720499de08d8a72238986845 Mon Sep 17 00:00:00 2001 From: sahith-narahari Date: Thu, 30 Jul 2020 02:17:06 +0530 Subject: [PATCH 39/40] Fix lint --- x/auth/client/cli/decode.go | 3 +-- x/auth/client/cli/encode.go | 3 +-- x/auth/client/cli/tx_multisign.go | 17 ++++++++++------- x/auth/client/cli/tx_sign.go | 6 ++---- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/x/auth/client/cli/decode.go b/x/auth/client/cli/decode.go index 2a8764f1f6e3..b83e8e405969 100644 --- a/x/auth/client/cli/decode.go +++ b/x/auth/client/cli/decode.go @@ -43,8 +43,7 @@ func GetDecodeCommand() *cobra.Command { return err } - err = clientCtx.PrintString(fmt.Sprintf("%s\n", json)) - return err + return clientCtx.PrintString(fmt.Sprintf("%s\n", json)) }, } diff --git a/x/auth/client/cli/encode.go b/x/auth/client/cli/encode.go index 0ef8bcef9301..92db2e0a8171 100644 --- a/x/auth/client/cli/encode.go +++ b/x/auth/client/cli/encode.go @@ -38,8 +38,7 @@ If you supply a dash (-) argument in place of an input filename, the command rea // base64 encode the encoded tx bytes txBytesBase64 := base64.StdEncoding.EncodeToString(txBytes) - err = clientCtx.PrintString(fmt.Sprintf("%s\n", txBytesBase64)) - return err + return clientCtx.PrintString(fmt.Sprintf("%s\n", txBytesBase64)) }, } diff --git a/x/auth/client/cli/tx_multisign.go b/x/auth/client/cli/tx_multisign.go index c2895108fe4d..39c28e28391a 100644 --- a/x/auth/client/cli/tx_multisign.go +++ b/x/auth/client/cli/tx_multisign.go @@ -71,7 +71,13 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { return } - txBuilder, err := clientCtx.TxConfig.WrapTxBuilder(parsedTx) + txFactory := tx.NewFactoryCLI(clientCtx, cmd.Flags()) + if txFactory.SignMode() == signingtypes.SignMode_SIGN_MODE_UNSPECIFIED { + txFactory = txFactory.WithSignMode(signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON) + } + + txCfg := clientCtx.TxConfig + txBuilder, err := txCfg.WrapTxBuilder(parsedTx) if err != nil { return err } @@ -94,8 +100,6 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { multisigPub := multisigInfo.GetPubKey().(multisig.PubKeyMultisigThreshold) multisigSig := multisig.NewMultisig(len(multisigPub.PubKeys)) - txFactory := tx.NewFactoryCLI(clientCtx, cmd.Flags()) - if !clientCtx.Offline { accnum, seq, err := types.NewAccountRetriever(clientCtx.JSONMarshaler).GetAccountNumberSequence(clientCtx, multisigInfo.GetAddress()) if err != nil { @@ -119,7 +123,7 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { } for _, sig := range sigs { - err = signing.VerifySignature(sig.PubKey, signingData, sig.Data, clientCtx.TxConfig.SignModeHandler(), txBuilder.GetTx()) + err = signing.VerifySignature(sig.PubKey, signingData, sig.Data, txCfg.SignModeHandler(), txBuilder.GetTx()) if err != nil { return fmt.Errorf("couldn't verify signature") } @@ -142,7 +146,7 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { sigOnly, _ := cmd.Flags().GetBool(flagSigOnly) - json, err := marshalSignatureJSON(clientCtx.TxConfig, txBuilder, sigOnly) + json, err := marshalSignatureJSON(txCfg, txBuilder, sigOnly) if err != nil { return err } @@ -159,8 +163,7 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { } defer fp.Close() - err = clientCtx.PrintString(fmt.Sprintf("%s\n", json)) - return err + return clientCtx.PrintString(fmt.Sprintf("%s\n", json)) } } diff --git a/x/auth/client/cli/tx_sign.go b/x/auth/client/cli/tx_sign.go index 9d9fd47415f6..423968b628b7 100644 --- a/x/auth/client/cli/tx_sign.go +++ b/x/auth/client/cli/tx_sign.go @@ -4,14 +4,13 @@ import ( "fmt" "os" - "github.com/cosmos/cosmos-sdk/types/tx/signing" - "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/client/tx" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/tx/signing" authclient "github.com/cosmos/cosmos-sdk/x/auth/client" ) @@ -276,8 +275,7 @@ func makeSignCmd() func(cmd *cobra.Command, args []string) error { } defer fp.Close() - err = clientCtx.PrintString(fmt.Sprintf("%s\n", json)) - return err + return clientCtx.PrintString(fmt.Sprintf("%s\n", json)) } } From ecf067916e11f769f7deba2e9f1a8061ee3fdbac Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Wed, 29 Jul 2020 17:10:00 -0400 Subject: [PATCH 40/40] Revert ReadTxCommandFlags --- client/cmd.go | 50 ++++++++++++----------------------- x/auth/client/cli/cli_test.go | 3 +-- 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/client/cmd.go b/client/cmd.go index e62ffad699b9..688a81bea09e 100644 --- a/client/cmd.go +++ b/client/cmd.go @@ -148,47 +148,31 @@ func ReadTxCommandFlags(clientCtx Context, flagSet *pflag.FlagSet) (Context, err return clientCtx, err } - if flagSet.Changed(flags.FlagGenerateOnly) { - genOnly, _ := flagSet.GetBool(flags.FlagGenerateOnly) - clientCtx = clientCtx.WithGenerateOnly(genOnly) + genOnly, _ := flagSet.GetBool(flags.FlagGenerateOnly) + clientCtx = clientCtx.WithGenerateOnly(genOnly) - } + dryRun, _ := flagSet.GetBool(flags.FlagDryRun) + clientCtx = clientCtx.WithSimulation(dryRun) - if flagSet.Changed(flags.FlagDryRun) { - dryRun, _ := flagSet.GetBool(flags.FlagDryRun) - clientCtx = clientCtx.WithSimulation(dryRun) - } + offline, _ := flagSet.GetBool(flags.FlagOffline) + clientCtx = clientCtx.WithOffline(offline) - if flagSet.Changed(flags.FlagOffline) { - offline, _ := flagSet.GetBool(flags.FlagOffline) - clientCtx = clientCtx.WithOffline(offline) - } + useLedger, _ := flagSet.GetBool(flags.FlagUseLedger) + clientCtx = clientCtx.WithUseLedger(useLedger) - if flagSet.Changed(flags.FlagUseLedger) { - useLedger, _ := flagSet.GetBool(flags.FlagUseLedger) - clientCtx = clientCtx.WithUseLedger(useLedger) - } + bMode, _ := flagSet.GetString(flags.FlagBroadcastMode) + clientCtx = clientCtx.WithBroadcastMode(bMode) - if flagSet.Changed(flags.FlagBroadcastMode) { - bMode, _ := flagSet.GetString(flags.FlagBroadcastMode) - clientCtx = clientCtx.WithBroadcastMode(bMode) - } - - if flagSet.Changed(flags.FlagSkipConfirmation) { - skipConfirm, _ := flagSet.GetBool(flags.FlagSkipConfirmation) - clientCtx = clientCtx.WithSkipConfirmation(skipConfirm) + skipConfirm, _ := flagSet.GetBool(flags.FlagSkipConfirmation) + clientCtx = clientCtx.WithSkipConfirmation(skipConfirm) + from, _ := flagSet.GetString(flags.FlagFrom) + fromAddr, fromName, err := GetFromFields(clientCtx.Keyring, from, clientCtx.GenerateOnly) + if err != nil { + return clientCtx, err } - if flagSet.Changed(flags.FlagFrom) { - from, _ := flagSet.GetString(flags.FlagFrom) - fromAddr, fromName, err := GetFromFields(clientCtx.Keyring, from, clientCtx.GenerateOnly) - if err != nil { - return clientCtx, err - } - - clientCtx = clientCtx.WithFrom(from).WithFromAddress(fromAddr).WithFromName(fromName) - } + clientCtx = clientCtx.WithFrom(from).WithFromAddress(fromAddr).WithFromName(fromName) return clientCtx, nil } diff --git a/x/auth/client/cli/cli_test.go b/x/auth/client/cli/cli_test.go index 9a48497f776d..df41fc44346f 100644 --- a/x/auth/client/cli/cli_test.go +++ b/x/auth/client/cli/cli_test.go @@ -607,8 +607,7 @@ func (s *IntegrationTestSuite) TestCLIMultisign() { defer cleanup3() // Does not work in offline mode. - val1.ClientCtx.Offline = true - _, err = authtest.TxMultiSignExec(val1.ClientCtx, multisigInfo.GetName(), multiGeneratedTxFile.Name(), sign1File.Name(), sign2File.Name()) + _, err = authtest.TxMultiSignExec(val1.ClientCtx, multisigInfo.GetName(), multiGeneratedTxFile.Name(), "--offline", sign1File.Name(), sign2File.Name()) s.Require().EqualError(err, "couldn't verify signature") val1.ClientCtx.Offline = false