@bitgo-beta/abstract-utxo 1.6.1-alpha.419 → 1.6.1-alpha.420
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{src → cjs/src}/abstractUtxoCoin.d.ts +12 -23
- package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -0
- package/dist/cjs/src/abstractUtxoCoin.js +639 -0
- package/dist/cjs/src/address/fixedScript.d.ts.map +1 -0
- package/dist/cjs/src/address/fixedScript.js +150 -0
- package/dist/cjs/src/address/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/address/index.js +1 -1
- package/dist/cjs/src/config.d.ts.map +1 -0
- package/dist/cjs/src/config.js +14 -0
- package/dist/cjs/src/descriptor/NamedDescriptor.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/NamedDescriptor.js +79 -0
- package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.js +66 -0
- package/dist/cjs/src/descriptor/builder/builder.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/builder/builder.js +37 -0
- package/dist/cjs/src/descriptor/builder/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/descriptor/builder/index.js +1 -1
- package/dist/cjs/src/descriptor/builder/parse.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/builder/parse.js +116 -0
- package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.js +41 -0
- package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/createWallet/createDescriptors.js +33 -0
- package/dist/cjs/src/descriptor/createWallet/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/descriptor/createWallet/index.js +1 -1
- package/dist/cjs/src/descriptor/descriptorWallet.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/descriptorWallet.js +54 -0
- package/dist/cjs/src/descriptor/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/descriptor/index.js +1 -1
- package/dist/cjs/src/descriptor/validatePolicy.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/validatePolicy.js +92 -0
- package/dist/cjs/src/impl/bch/bch.d.ts.map +1 -0
- package/dist/cjs/src/impl/bch/bch.js +70 -0
- package/dist/cjs/src/impl/bch/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/bch/index.js +1 -1
- package/dist/cjs/src/impl/bch/tbch.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/bch/tbch.js +1 -1
- package/dist/cjs/src/impl/bcha/bcha.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/bcha/bcha.js +1 -1
- package/dist/cjs/src/impl/bcha/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/bcha/index.js +1 -1
- package/dist/cjs/src/impl/bcha/tbcha.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/bcha/tbcha.js +1 -1
- package/dist/cjs/src/impl/bsv/bsv.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/bsv/bsv.js +1 -1
- package/dist/cjs/src/impl/bsv/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/bsv/index.js +1 -1
- package/dist/cjs/src/impl/bsv/tbsv.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/bsv/tbsv.js +1 -1
- package/dist/cjs/src/impl/btc/btc.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/btc/btc.js +1 -1
- package/dist/cjs/src/impl/btc/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/btc/index.js +1 -1
- package/dist/cjs/src/impl/btc/inscriptionBuilder.d.ts.map +1 -0
- package/dist/cjs/src/impl/btc/inscriptionBuilder.js +183 -0
- package/dist/cjs/src/impl/btc/tbtc.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/btc/tbtc.js +1 -1
- package/dist/cjs/src/impl/btc/tbtc4.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/btc/tbtc4.js +1 -1
- package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/btc/tbtcbgsig.js +1 -1
- package/dist/cjs/src/impl/btc/tbtcsig.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/btc/tbtcsig.js +1 -1
- package/dist/cjs/src/impl/btg/btg.d.ts.map +1 -0
- package/dist/{src/impl/dash/dash.js → cjs/src/impl/btg/btg.js} +6 -6
- package/dist/cjs/src/impl/btg/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/btg/index.js +1 -1
- package/dist/cjs/src/impl/dash/dash.d.ts.map +1 -0
- package/dist/cjs/src/impl/dash/dash.js +48 -0
- package/dist/cjs/src/impl/dash/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/dash/index.js +1 -1
- package/dist/cjs/src/impl/dash/tdash.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/dash/tdash.js +1 -1
- package/dist/{src → cjs/src}/impl/doge/doge.d.ts +3 -2
- package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -0
- package/dist/cjs/src/impl/doge/doge.js +79 -0
- package/dist/cjs/src/impl/doge/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/doge/index.js +1 -1
- package/dist/cjs/src/impl/doge/tdoge.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/doge/tdoge.js +1 -1
- package/dist/cjs/src/impl/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/index.js +1 -1
- package/dist/cjs/src/impl/ltc/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/ltc/index.js +1 -1
- package/dist/cjs/src/impl/ltc/ltc.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/ltc/ltc.js +1 -1
- package/dist/cjs/src/impl/ltc/tltc.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/ltc/tltc.js +1 -1
- package/dist/cjs/src/impl/zec/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/zec/index.js +1 -1
- package/dist/cjs/src/impl/zec/tzec.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/zec/tzec.js +1 -1
- package/dist/cjs/src/impl/zec/zec.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/zec/zec.js +1 -1
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/index.js +1 -1
- package/dist/cjs/src/keychains.d.ts.map +1 -0
- package/dist/cjs/src/keychains.js +104 -0
- package/dist/cjs/src/names.d.ts.map +1 -0
- package/dist/cjs/src/names.js +214 -0
- package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.d.ts.map +1 -0
- package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.js +26 -0
- package/dist/cjs/src/offlineVault/OfflineVaultSignable.d.ts.map +1 -0
- package/dist/cjs/src/offlineVault/OfflineVaultSignable.js +55 -0
- package/dist/cjs/src/offlineVault/TransactionExplanation.d.ts.map +1 -0
- package/dist/cjs/src/offlineVault/TransactionExplanation.js +16 -0
- package/dist/cjs/src/offlineVault/descriptor/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/offlineVault/descriptor/index.js +1 -1
- package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts.map +1 -0
- package/dist/cjs/src/offlineVault/descriptor/transaction.js +80 -0
- package/dist/cjs/src/offlineVault/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/offlineVault/index.js +1 -1
- package/dist/cjs/src/recovery/RecoveryProvider.d.ts.map +1 -0
- package/dist/cjs/src/recovery/RecoveryProvider.js +22 -0
- package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -0
- package/dist/cjs/src/recovery/backupKeyRecovery.js +370 -0
- package/dist/cjs/src/recovery/baseApi.d.ts.map +1 -0
- package/dist/cjs/src/recovery/baseApi.js +73 -0
- package/dist/cjs/src/recovery/coingeckoApi.d.ts.map +1 -0
- package/dist/cjs/src/recovery/coingeckoApi.js +44 -0
- package/dist/cjs/src/recovery/crossChainRecovery.d.ts.map +1 -0
- package/dist/cjs/src/recovery/crossChainRecovery.js +364 -0
- package/dist/cjs/src/recovery/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/recovery/index.js +1 -1
- package/dist/cjs/src/recovery/mempoolApi.d.ts.map +1 -0
- package/dist/cjs/src/recovery/mempoolApi.js +36 -0
- package/dist/{src → cjs/src}/replayProtection.d.ts +1 -0
- package/dist/cjs/src/replayProtection.d.ts.map +1 -0
- package/dist/cjs/src/replayProtection.js +58 -0
- package/dist/cjs/src/sign.d.ts.map +1 -0
- package/dist/cjs/src/sign.js +205 -0
- package/dist/cjs/src/transaction/bip322.d.ts.map +1 -0
- package/dist/cjs/src/transaction/bip322.js +125 -0
- package/dist/cjs/src/transaction/common/verifyPayGoAmount.d.ts.map +1 -0
- package/dist/cjs/src/transaction/common/verifyPayGoAmount.js +3 -0
- package/dist/{src → cjs/src}/transaction/descriptor/explainPsbt.d.ts +2 -2
- package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/explainPsbt.js +80 -0
- package/dist/cjs/src/transaction/descriptor/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/transaction/descriptor/index.js +1 -1
- package/dist/cjs/src/transaction/descriptor/parse.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/parse.js +116 -0
- package/dist/cjs/src/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/parseToAmountType.js +60 -0
- package/dist/cjs/src/transaction/descriptor/recipient.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/recipient.js +3 -0
- package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/signPsbt.js +43 -0
- package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/verifyTransaction.js +108 -0
- package/dist/{src → cjs/src}/transaction/explainTransaction.d.ts +4 -3
- package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/explainTransaction.js +88 -0
- package/dist/cjs/src/transaction/fetchInputs.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fetchInputs.js +109 -0
- package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts +10 -0
- package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.js +43 -0
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +63 -0
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +321 -0
- package/dist/{src → cjs/src}/transaction/fixedScript/index.d.ts +1 -0
- package/dist/cjs/src/transaction/fixedScript/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/transaction/fixedScript/index.js +4 -2
- package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/parseOutput.js +213 -0
- package/dist/{src → cjs/src}/transaction/fixedScript/parseTransaction.d.ts +1 -1
- package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/parseTransaction.js +203 -0
- package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/signTransaction.js +101 -0
- package/dist/cjs/src/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/verifyTransaction.js +198 -0
- package/dist/cjs/src/transaction/getPayGoVerificationPubkey.d.ts.map +1 -0
- package/dist/{src → cjs/src}/transaction/getPayGoVerificationPubkey.js +1 -1
- package/dist/cjs/src/transaction/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/transaction/index.js +1 -1
- package/dist/cjs/src/transaction/outputDifference.d.ts.map +1 -0
- package/dist/cjs/src/transaction/outputDifference.js +47 -0
- package/dist/cjs/src/transaction/parseTransaction.d.ts.map +1 -0
- package/dist/{src → cjs/src}/transaction/parseTransaction.js +1 -1
- package/dist/cjs/src/transaction/recipient.d.ts.map +1 -0
- package/dist/cjs/src/transaction/recipient.js +88 -0
- package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/signTransaction.js +102 -0
- package/dist/cjs/src/transaction/verifyTransaction.d.ts.map +1 -0
- package/dist/{src → cjs/src}/transaction/verifyTransaction.js +1 -1
- package/dist/cjs/src/verifyKey.d.ts.map +1 -0
- package/dist/cjs/src/verifyKey.js +164 -0
- package/dist/cjs/src/wallet.d.ts.map +1 -0
- package/dist/cjs/src/wallet.js +8 -0
- package/dist/cjs/test/integration/impl/bch/bch.d.ts +2 -0
- package/dist/cjs/test/integration/impl/bch/bch.d.ts.map +1 -0
- package/dist/cjs/test/integration/impl/bch/bch.js +74 -0
- package/dist/cjs/test/unit/address.d.ts +2 -0
- package/dist/cjs/test/unit/address.d.ts.map +1 -0
- package/dist/cjs/test/unit/address.js +182 -0
- package/dist/cjs/test/unit/bip322.d.ts +2 -0
- package/dist/cjs/test/unit/bip322.d.ts.map +1 -0
- package/dist/cjs/test/unit/bip322.js +45 -0
- package/dist/cjs/test/unit/coins.d.ts +2 -0
- package/dist/cjs/test/unit/coins.d.ts.map +1 -0
- package/dist/cjs/test/unit/coins.js +97 -0
- package/dist/cjs/test/unit/customChangeWallet.d.ts +2 -0
- package/dist/cjs/test/unit/customChangeWallet.d.ts.map +1 -0
- package/dist/cjs/test/unit/customChangeWallet.js +154 -0
- package/dist/cjs/test/unit/customSigner.d.ts +3 -0
- package/dist/cjs/test/unit/customSigner.d.ts.map +1 -0
- package/dist/cjs/test/unit/customSigner.js +108 -0
- package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts +2 -0
- package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts.map +1 -0
- package/dist/cjs/test/unit/descriptor/NamedDescriptor.js +18 -0
- package/dist/cjs/test/unit/descriptor/builder.d.ts +2 -0
- package/dist/cjs/test/unit/descriptor/builder.d.ts.map +1 -0
- package/dist/cjs/test/unit/descriptor/builder.js +72 -0
- package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts +2 -0
- package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
- package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.js +20 -0
- package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts +2 -0
- package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts.map +1 -0
- package/dist/cjs/test/unit/descriptor/descriptorWallet.js +28 -0
- package/dist/cjs/test/unit/descriptorAddress.d.ts +3 -0
- package/dist/cjs/test/unit/descriptorAddress.d.ts.map +1 -0
- package/dist/cjs/test/unit/descriptorAddress.js +102 -0
- package/dist/cjs/test/unit/explainTransaction.d.ts +2 -0
- package/dist/cjs/test/unit/explainTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/explainTransaction.js +74 -0
- package/dist/cjs/test/unit/fixtures/bip322/fixtures.d.ts +15 -0
- package/dist/cjs/test/unit/fixtures/bip322/fixtures.d.ts.map +1 -0
- package/dist/cjs/test/unit/fixtures/bip322/fixtures.js +51 -0
- package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts +4 -0
- package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts.map +1 -0
- package/dist/cjs/test/unit/fixtures/psbtHexProof.js +9 -0
- package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts +2 -0
- package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/bch/unit/bch.js +138 -0
- package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/bcha/unit/index.js +47 -0
- package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/bsv/unit/index.js +32 -0
- package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts +2 -0
- package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/btc/unit/btc.js +220 -0
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts +4 -0
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.js +10 -0
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.js +18 -0
- package/dist/cjs/test/unit/impl/btg/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/btg/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/btg/unit/index.js +29 -0
- package/dist/cjs/test/unit/impl/dash/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/dash/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/dash/unit/index.js +32 -0
- package/dist/cjs/test/unit/impl/doge/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/doge/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/doge/unit/index.js +32 -0
- package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/ltc/unit/index.js +39 -0
- package/dist/cjs/test/unit/impl/zec/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/zec/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/zec/unit/index.js +29 -0
- package/dist/cjs/test/unit/keySignatures.d.ts +2 -0
- package/dist/cjs/test/unit/keySignatures.d.ts.map +1 -0
- package/dist/cjs/test/unit/keySignatures.js +54 -0
- package/dist/cjs/test/unit/keychains.d.ts +2 -0
- package/dist/cjs/test/unit/keychains.d.ts.map +1 -0
- package/dist/cjs/test/unit/keychains.js +49 -0
- package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts +2 -0
- package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts.map +1 -0
- package/dist/cjs/test/unit/offlineVault/halfSigned.js +124 -0
- package/dist/cjs/test/unit/parseTransaction.d.ts +2 -0
- package/dist/cjs/test/unit/parseTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/parseTransaction.js +125 -0
- package/dist/cjs/test/unit/prebuildAndSign.d.ts +6 -0
- package/dist/cjs/test/unit/prebuildAndSign.d.ts.map +1 -0
- package/dist/cjs/test/unit/prebuildAndSign.js +270 -0
- package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts +2 -0
- package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts.map +1 -0
- package/dist/cjs/test/unit/recovery/backupKeyRecovery.js +285 -0
- package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts +2 -0
- package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts.map +1 -0
- package/dist/cjs/test/unit/recovery/crossChainRecovery.js +283 -0
- package/dist/cjs/test/unit/recovery/mock.d.ts +30 -0
- package/dist/cjs/test/unit/recovery/mock.d.ts.map +1 -0
- package/dist/cjs/test/unit/recovery/mock.js +138 -0
- package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.js +30 -0
- package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts +6 -0
- package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.js +17 -0
- package/dist/cjs/test/unit/transaction/descriptor/outputDifference.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/descriptor/outputDifference.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/descriptor/outputDifference.js +76 -0
- package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/descriptor/parse.js +135 -0
- package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/descriptor/sign.js +32 -0
- package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.js +48 -0
- package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.js +108 -0
- package/dist/cjs/test/unit/transaction.d.ts +2 -0
- package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction.js +501 -0
- package/dist/cjs/test/unit/txFormat.d.ts +30 -0
- package/dist/cjs/test/unit/txFormat.d.ts.map +1 -0
- package/dist/cjs/test/unit/txFormat.js +162 -0
- package/dist/cjs/test/unit/util/fixtures.d.ts +14 -0
- package/dist/cjs/test/unit/util/fixtures.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/fixtures.js +102 -0
- package/dist/cjs/test/unit/util/index.d.ts +7 -0
- package/dist/cjs/test/unit/util/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/index.js +23 -0
- package/dist/cjs/test/unit/util/keychains.d.ts +26 -0
- package/dist/cjs/test/unit/util/keychains.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/keychains.js +72 -0
- package/dist/cjs/test/unit/util/nockBitGo.d.ts +3 -0
- package/dist/cjs/test/unit/util/nockBitGo.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/nockBitGo.js +11 -0
- package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts +8 -0
- package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/nockIndexerAPI.js +56 -0
- package/dist/cjs/test/unit/util/transaction.d.ts +24 -0
- package/dist/cjs/test/unit/util/transaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/transaction.js +107 -0
- package/dist/cjs/test/unit/util/unspents.d.ts +13 -0
- package/dist/cjs/test/unit/util/unspents.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/unspents.js +106 -0
- package/dist/cjs/test/unit/util/utxoCoins.d.ts +8 -0
- package/dist/cjs/test/unit/util/utxoCoins.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/utxoCoins.js +95 -0
- package/dist/cjs/test/unit/util/wallet.d.ts +4 -0
- package/dist/cjs/test/unit/util/wallet.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/wallet.js +9 -0
- package/dist/cjs/test/unit/verifyTransaction.d.ts +2 -0
- package/dist/cjs/test/unit/verifyTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/verifyTransaction.js +327 -0
- package/dist/cjs/test/unit/wallet.d.ts +2 -0
- package/dist/cjs/test/unit/wallet.d.ts.map +1 -0
- package/dist/cjs/test/unit/wallet.js +248 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/abstractUtxoCoin.d.ts +464 -0
- package/dist/esm/abstractUtxoCoin.d.ts.map +1 -0
- package/dist/esm/abstractUtxoCoin.js +598 -0
- package/dist/esm/address/fixedScript.d.ts +51 -0
- package/dist/esm/address/fixedScript.js +109 -0
- package/dist/esm/address/index.d.ts +2 -0
- package/dist/esm/address/index.js +2 -0
- package/dist/esm/config.d.ts +9 -0
- package/dist/esm/config.js +11 -0
- package/dist/esm/descriptor/NamedDescriptor.d.ts +20 -0
- package/dist/esm/descriptor/NamedDescriptor.js +39 -0
- package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts +5 -0
- package/dist/esm/descriptor/assertDescriptorWalletAddress.js +27 -0
- package/dist/esm/descriptor/builder/builder.d.ts +13 -0
- package/dist/esm/descriptor/builder/builder.js +34 -0
- package/dist/esm/descriptor/builder/index.d.ts +3 -0
- package/dist/esm/descriptor/builder/index.js +3 -0
- package/dist/esm/descriptor/builder/parse.d.ts +5 -0
- package/dist/esm/descriptor/builder/parse.js +112 -0
- package/dist/esm/descriptor/createWallet/createDescriptorWallet.d.ts +20 -0
- package/dist/esm/descriptor/createWallet/createDescriptorWallet.js +37 -0
- package/dist/esm/descriptor/createWallet/createDescriptors.d.ts +12 -0
- package/dist/esm/descriptor/createWallet/createDescriptors.js +29 -0
- package/dist/esm/descriptor/createWallet/index.d.ts +3 -0
- package/dist/esm/descriptor/createWallet/index.js +3 -0
- package/dist/esm/descriptor/descriptorWallet.d.ts +19 -0
- package/dist/esm/descriptor/descriptorWallet.js +16 -0
- package/dist/esm/descriptor/index.d.ts +8 -0
- package/dist/esm/descriptor/index.js +7 -0
- package/dist/esm/descriptor/validatePolicy.d.ts +22 -0
- package/dist/esm/descriptor/validatePolicy.js +80 -0
- package/dist/esm/impl/bch/bch.d.ts +20 -0
- package/dist/esm/impl/bch/bch.js +33 -0
- package/dist/esm/impl/bch/index.d.ts +3 -0
- package/dist/esm/impl/bch/index.js +3 -0
- package/dist/esm/impl/bch/tbch.d.ts +10 -0
- package/dist/esm/impl/bch/tbch.js +11 -0
- package/dist/esm/impl/bcha/bcha.d.ts +9 -0
- package/dist/esm/impl/bcha/bcha.js +21 -0
- package/dist/esm/impl/bcha/index.d.ts +3 -0
- package/dist/esm/impl/bcha/index.js +3 -0
- package/dist/esm/impl/bcha/tbcha.d.ts +10 -0
- package/dist/esm/impl/bcha/tbcha.js +11 -0
- package/dist/esm/impl/bsv/bsv.d.ts +8 -0
- package/dist/esm/impl/bsv/bsv.js +11 -0
- package/dist/esm/impl/bsv/index.d.ts +3 -0
- package/dist/esm/impl/bsv/index.js +3 -0
- package/dist/esm/impl/bsv/tbsv.d.ts +10 -0
- package/dist/esm/impl/bsv/tbsv.js +11 -0
- package/dist/esm/impl/btc/btc.d.ts +13 -0
- package/dist/esm/impl/btc/btc.js +18 -0
- package/dist/esm/impl/btc/index.d.ts +7 -0
- package/dist/esm/impl/btc/index.js +7 -0
- package/dist/esm/impl/btc/inscriptionBuilder.d.ts +51 -0
- package/dist/esm/impl/btc/inscriptionBuilder.js +143 -0
- package/dist/esm/impl/btc/tbtc.d.ts +10 -0
- package/dist/esm/impl/btc/tbtc.js +11 -0
- package/dist/esm/impl/btc/tbtc4.d.ts +10 -0
- package/dist/esm/impl/btc/tbtc4.js +11 -0
- package/dist/esm/impl/btc/tbtcbgsig.d.ts +10 -0
- package/dist/esm/impl/btc/tbtcbgsig.js +11 -0
- package/dist/esm/impl/btc/tbtcsig.d.ts +10 -0
- package/dist/esm/impl/btc/tbtcsig.js +11 -0
- package/dist/esm/impl/btg/btg.d.ts +7 -0
- package/dist/esm/impl/btg/btg.js +11 -0
- package/dist/esm/impl/btg/index.d.ts +2 -0
- package/dist/esm/impl/btg/index.js +2 -0
- package/dist/esm/impl/dash/dash.d.ts +7 -0
- package/dist/esm/impl/dash/dash.js +11 -0
- package/dist/esm/impl/dash/index.d.ts +3 -0
- package/dist/esm/impl/dash/index.js +3 -0
- package/dist/esm/impl/dash/tdash.d.ts +10 -0
- package/dist/esm/impl/dash/tdash.js +11 -0
- package/dist/esm/impl/doge/doge.d.ts +31 -0
- package/dist/esm/impl/doge/doge.d.ts.map +1 -0
- package/dist/esm/impl/doge/doge.js +75 -0
- package/dist/esm/impl/doge/index.d.ts +3 -0
- package/dist/esm/impl/doge/index.js +3 -0
- package/dist/esm/impl/doge/tdoge.d.ts +10 -0
- package/dist/esm/impl/doge/tdoge.js +11 -0
- package/dist/esm/impl/index.d.ts +10 -0
- package/dist/esm/impl/index.js +10 -0
- package/dist/esm/impl/ltc/index.d.ts +3 -0
- package/dist/esm/impl/ltc/index.js +3 -0
- package/dist/esm/impl/ltc/ltc.d.ts +7 -0
- package/dist/esm/impl/ltc/ltc.js +15 -0
- package/dist/esm/impl/ltc/tltc.d.ts +7 -0
- package/dist/esm/impl/ltc/tltc.js +14 -0
- package/dist/esm/impl/zec/index.d.ts +3 -0
- package/dist/esm/impl/zec/index.js +3 -0
- package/dist/esm/impl/zec/tzec.d.ts +7 -0
- package/dist/esm/impl/zec/tzec.js +11 -0
- package/dist/esm/impl/zec/zec.d.ts +10 -0
- package/dist/esm/impl/zec/zec.js +11 -0
- package/dist/esm/index.d.ts +21 -0
- package/dist/esm/index.js +21 -0
- package/dist/esm/keychains.d.ts +48 -0
- package/dist/esm/keychains.js +61 -0
- package/dist/esm/names.d.ts +26 -0
- package/dist/esm/names.js +171 -0
- package/dist/esm/offlineVault/OfflineVaultHalfSigned.d.ts +8 -0
- package/dist/esm/offlineVault/OfflineVaultHalfSigned.js +23 -0
- package/dist/esm/offlineVault/OfflineVaultSignable.d.ts +46 -0
- package/dist/esm/offlineVault/OfflineVaultSignable.js +18 -0
- package/dist/esm/offlineVault/TransactionExplanation.d.ts +15 -0
- package/dist/esm/offlineVault/TransactionExplanation.js +13 -0
- package/dist/esm/offlineVault/descriptor/index.d.ts +2 -0
- package/dist/esm/offlineVault/descriptor/index.js +2 -0
- package/dist/esm/offlineVault/descriptor/transaction.d.ts +38 -0
- package/dist/esm/offlineVault/descriptor/transaction.js +41 -0
- package/dist/esm/offlineVault/index.d.ts +6 -0
- package/dist/esm/offlineVault/index.js +4 -0
- package/dist/esm/recovery/RecoveryProvider.d.ts +22 -0
- package/dist/{src → esm}/recovery/RecoveryProvider.js +6 -9
- package/dist/esm/recovery/backupKeyRecovery.d.ts +88 -0
- package/dist/esm/recovery/backupKeyRecovery.js +329 -0
- package/dist/esm/recovery/baseApi.d.ts +24 -0
- package/dist/esm/recovery/baseApi.js +64 -0
- package/dist/esm/recovery/coingeckoApi.d.ts +6 -0
- package/dist/esm/recovery/coingeckoApi.js +40 -0
- package/dist/esm/recovery/crossChainRecovery.d.ts +86 -0
- package/dist/esm/recovery/crossChainRecovery.js +325 -0
- package/dist/esm/recovery/index.d.ts +7 -0
- package/dist/esm/recovery/index.js +7 -0
- package/dist/esm/recovery/mempoolApi.d.ts +7 -0
- package/dist/esm/recovery/mempoolApi.js +29 -0
- package/dist/esm/replayProtection.d.ts +5 -0
- package/dist/esm/replayProtection.d.ts.map +1 -0
- package/dist/esm/replayProtection.js +20 -0
- package/dist/esm/sign.d.ts +54 -0
- package/dist/esm/sign.js +162 -0
- package/dist/esm/transaction/bip322.d.ts +27 -0
- package/dist/esm/transaction/bip322.js +86 -0
- package/dist/esm/transaction/common/verifyPayGoAmount.d.ts +1 -0
- package/dist/{src → esm}/transaction/common/verifyPayGoAmount.js +0 -2
- package/dist/esm/transaction/descriptor/explainPsbt.d.ts +5 -0
- package/dist/esm/transaction/descriptor/explainPsbt.d.ts.map +1 -0
- package/dist/esm/transaction/descriptor/explainPsbt.js +44 -0
- package/dist/esm/transaction/descriptor/index.d.ts +7 -0
- package/dist/esm/transaction/descriptor/index.js +6 -0
- package/dist/esm/transaction/descriptor/parse.d.ts +15 -0
- package/dist/esm/transaction/descriptor/parse.js +79 -0
- package/dist/esm/transaction/descriptor/parseToAmountType.d.ts +13 -0
- package/dist/esm/transaction/descriptor/parseToAmountType.js +55 -0
- package/dist/esm/transaction/descriptor/recipient.d.ts +5 -0
- package/dist/{src → esm}/transaction/descriptor/recipient.js +1 -2
- package/dist/esm/transaction/descriptor/signPsbt.d.ts +25 -0
- package/dist/esm/transaction/descriptor/signPsbt.js +38 -0
- package/dist/esm/transaction/descriptor/verifyTransaction.d.ts +35 -0
- package/dist/esm/transaction/descriptor/verifyTransaction.js +65 -0
- package/dist/esm/transaction/explainTransaction.d.ts +18 -0
- package/dist/esm/transaction/explainTransaction.d.ts.map +1 -0
- package/dist/esm/transaction/explainTransaction.js +52 -0
- package/dist/esm/transaction/fetchInputs.d.ts +26 -0
- package/dist/esm/transaction/fetchInputs.js +72 -0
- package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts +10 -0
- package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/explainPsbtWasm.js +40 -0
- package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +63 -0
- package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/explainTransaction.js +284 -0
- package/dist/esm/transaction/fixedScript/index.d.ts +7 -0
- package/dist/esm/transaction/fixedScript/index.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/index.js +6 -0
- package/dist/esm/transaction/fixedScript/parseOutput.d.ts +26 -0
- package/dist/{src → esm}/transaction/fixedScript/parseOutput.js +22 -28
- package/dist/esm/transaction/fixedScript/parseTransaction.d.ts +7 -0
- package/dist/esm/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/parseTransaction.js +164 -0
- package/dist/esm/transaction/fixedScript/signTransaction.d.ts +18 -0
- package/dist/esm/transaction/fixedScript/signTransaction.js +95 -0
- package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts +21 -0
- package/dist/esm/transaction/fixedScript/verifyTransaction.js +159 -0
- package/dist/esm/transaction/getPayGoVerificationPubkey.d.ts +9 -0
- package/dist/esm/transaction/getPayGoVerificationPubkey.js +17 -0
- package/dist/esm/transaction/index.d.ts +7 -0
- package/dist/esm/transaction/index.js +7 -0
- package/dist/esm/transaction/outputDifference.d.ts +40 -0
- package/dist/esm/transaction/outputDifference.js +42 -0
- package/dist/esm/transaction/parseTransaction.d.ts +3 -0
- package/dist/esm/transaction/parseTransaction.js +12 -0
- package/dist/esm/transaction/recipient.d.ts +29 -0
- package/dist/esm/transaction/recipient.js +48 -0
- package/dist/esm/transaction/signTransaction.d.ts +6 -0
- package/dist/esm/transaction/signTransaction.js +63 -0
- package/dist/esm/transaction/verifyTransaction.d.ts +4 -0
- package/dist/esm/transaction/verifyTransaction.js +14 -0
- package/dist/esm/verifyKey.d.ts +28 -0
- package/dist/esm/verifyKey.js +123 -0
- package/dist/esm/wallet.d.ts +15 -0
- package/dist/esm/wallet.js +5 -0
- package/package.json +32 -15
- package/dist/src/abstractUtxoCoin.d.ts.map +0 -1
- package/dist/src/abstractUtxoCoin.js +0 -634
- package/dist/src/address/fixedScript.js +0 -150
- package/dist/src/config.js +0 -14
- package/dist/src/descriptor/NamedDescriptor.js +0 -79
- package/dist/src/descriptor/assertDescriptorWalletAddress.js +0 -66
- package/dist/src/descriptor/builder/builder.js +0 -37
- package/dist/src/descriptor/builder/parse.js +0 -116
- package/dist/src/descriptor/createWallet/createDescriptorWallet.js +0 -41
- package/dist/src/descriptor/createWallet/createDescriptors.js +0 -33
- package/dist/src/descriptor/descriptorWallet.js +0 -54
- package/dist/src/descriptor/validatePolicy.js +0 -92
- package/dist/src/impl/bch/bch.js +0 -70
- package/dist/src/impl/btc/inscriptionBuilder.js +0 -183
- package/dist/src/impl/btg/btg.js +0 -48
- package/dist/src/impl/doge/doge.d.ts.map +0 -1
- package/dist/src/impl/doge/doge.js +0 -79
- package/dist/src/keychains.js +0 -104
- package/dist/src/names.js +0 -214
- package/dist/src/offlineVault/OfflineVaultHalfSigned.js +0 -26
- package/dist/src/offlineVault/OfflineVaultSignable.js +0 -55
- package/dist/src/offlineVault/TransactionExplanation.js +0 -16
- package/dist/src/offlineVault/descriptor/transaction.js +0 -80
- package/dist/src/recovery/backupKeyRecovery.js +0 -370
- package/dist/src/recovery/baseApi.js +0 -73
- package/dist/src/recovery/coingeckoApi.js +0 -44
- package/dist/src/recovery/crossChainRecovery.js +0 -364
- package/dist/src/recovery/mempoolApi.js +0 -36
- package/dist/src/replayProtection.d.ts.map +0 -1
- package/dist/src/replayProtection.js +0 -53
- package/dist/src/sign.js +0 -205
- package/dist/src/transaction/bip322.js +0 -125
- package/dist/src/transaction/descriptor/explainPsbt.d.ts.map +0 -1
- package/dist/src/transaction/descriptor/explainPsbt.js +0 -80
- package/dist/src/transaction/descriptor/parse.js +0 -116
- package/dist/src/transaction/descriptor/parseToAmountType.js +0 -60
- package/dist/src/transaction/descriptor/signPsbt.js +0 -43
- package/dist/src/transaction/descriptor/verifyTransaction.js +0 -108
- package/dist/src/transaction/explainTransaction.d.ts.map +0 -1
- package/dist/src/transaction/explainTransaction.js +0 -67
- package/dist/src/transaction/fetchInputs.js +0 -109
- package/dist/src/transaction/fixedScript/explainTransaction.d.ts +0 -29
- package/dist/src/transaction/fixedScript/explainTransaction.d.ts.map +0 -1
- package/dist/src/transaction/fixedScript/explainTransaction.js +0 -321
- package/dist/src/transaction/fixedScript/index.d.ts.map +0 -1
- package/dist/src/transaction/fixedScript/parseTransaction.d.ts.map +0 -1
- package/dist/src/transaction/fixedScript/parseTransaction.js +0 -203
- package/dist/src/transaction/fixedScript/signTransaction.js +0 -101
- package/dist/src/transaction/fixedScript/verifyTransaction.js +0 -198
- package/dist/src/transaction/outputDifference.js +0 -47
- package/dist/src/transaction/recipient.js +0 -88
- package/dist/src/transaction/signTransaction.js +0 -102
- package/dist/src/verifyKey.js +0 -164
- package/dist/src/wallet.js +0 -8
- /package/dist/{src → cjs/src}/address/fixedScript.d.ts +0 -0
- /package/dist/{src → cjs/src}/address/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/config.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/NamedDescriptor.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/assertDescriptorWalletAddress.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/builder/builder.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/builder/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/builder/parse.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/createWallet/createDescriptorWallet.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/createWallet/createDescriptors.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/createWallet/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/descriptorWallet.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/validatePolicy.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/bch/bch.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/bch/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/bch/tbch.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/bcha/bcha.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/bcha/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/bcha/tbcha.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/bsv/bsv.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/bsv/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/bsv/tbsv.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/btc/btc.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/btc/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/btc/inscriptionBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/btc/tbtc.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/btc/tbtc4.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/btc/tbtcbgsig.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/btc/tbtcsig.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/btg/btg.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/btg/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/dash/dash.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/dash/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/dash/tdash.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/doge/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/doge/tdoge.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/ltc/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/ltc/ltc.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/ltc/tltc.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/zec/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/zec/tzec.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/zec/zec.d.ts +0 -0
- /package/dist/{src → cjs/src}/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/keychains.d.ts +0 -0
- /package/dist/{src → cjs/src}/names.d.ts +0 -0
- /package/dist/{src → cjs/src}/offlineVault/OfflineVaultHalfSigned.d.ts +0 -0
- /package/dist/{src → cjs/src}/offlineVault/OfflineVaultSignable.d.ts +0 -0
- /package/dist/{src → cjs/src}/offlineVault/TransactionExplanation.d.ts +0 -0
- /package/dist/{src → cjs/src}/offlineVault/descriptor/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/offlineVault/descriptor/transaction.d.ts +0 -0
- /package/dist/{src → cjs/src}/offlineVault/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/recovery/RecoveryProvider.d.ts +0 -0
- /package/dist/{src → cjs/src}/recovery/backupKeyRecovery.d.ts +0 -0
- /package/dist/{src → cjs/src}/recovery/baseApi.d.ts +0 -0
- /package/dist/{src → cjs/src}/recovery/coingeckoApi.d.ts +0 -0
- /package/dist/{src → cjs/src}/recovery/crossChainRecovery.d.ts +0 -0
- /package/dist/{src → cjs/src}/recovery/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/recovery/mempoolApi.d.ts +0 -0
- /package/dist/{src → cjs/src}/sign.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/bip322.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/common/verifyPayGoAmount.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/descriptor/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/descriptor/parse.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/descriptor/parseToAmountType.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/descriptor/recipient.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/descriptor/signPsbt.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/descriptor/verifyTransaction.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/fetchInputs.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/fixedScript/parseOutput.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/fixedScript/signTransaction.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/fixedScript/verifyTransaction.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/getPayGoVerificationPubkey.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/outputDifference.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/parseTransaction.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/recipient.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/signTransaction.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/verifyTransaction.d.ts +0 -0
- /package/dist/{src → cjs/src}/verifyKey.d.ts +0 -0
- /package/dist/{src → cjs/src}/wallet.d.ts +0 -0
- /package/dist/{src → esm}/address/fixedScript.d.ts.map +0 -0
- /package/dist/{src → esm}/address/index.d.ts.map +0 -0
- /package/dist/{src → esm}/config.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/NamedDescriptor.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/assertDescriptorWalletAddress.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/builder/builder.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/builder/index.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/builder/parse.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/createWallet/createDescriptorWallet.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/createWallet/createDescriptors.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/createWallet/index.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/descriptorWallet.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/index.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/validatePolicy.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/bch/bch.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/bch/index.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/bch/tbch.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/bcha/bcha.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/bcha/index.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/bcha/tbcha.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/bsv/bsv.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/bsv/index.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/bsv/tbsv.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/btc/btc.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/btc/index.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/btc/inscriptionBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/btc/tbtc.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/btc/tbtc4.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/btc/tbtcbgsig.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/btc/tbtcsig.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/btg/btg.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/btg/index.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/dash/dash.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/dash/index.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/dash/tdash.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/doge/index.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/doge/tdoge.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/index.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/ltc/index.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/ltc/ltc.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/ltc/tltc.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/zec/index.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/zec/tzec.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/zec/zec.d.ts.map +0 -0
- /package/dist/{src → esm}/index.d.ts.map +0 -0
- /package/dist/{src → esm}/keychains.d.ts.map +0 -0
- /package/dist/{src → esm}/names.d.ts.map +0 -0
- /package/dist/{src → esm}/offlineVault/OfflineVaultHalfSigned.d.ts.map +0 -0
- /package/dist/{src → esm}/offlineVault/OfflineVaultSignable.d.ts.map +0 -0
- /package/dist/{src → esm}/offlineVault/TransactionExplanation.d.ts.map +0 -0
- /package/dist/{src → esm}/offlineVault/descriptor/index.d.ts.map +0 -0
- /package/dist/{src → esm}/offlineVault/descriptor/transaction.d.ts.map +0 -0
- /package/dist/{src → esm}/offlineVault/index.d.ts.map +0 -0
- /package/dist/{src → esm}/recovery/RecoveryProvider.d.ts.map +0 -0
- /package/dist/{src → esm}/recovery/backupKeyRecovery.d.ts.map +0 -0
- /package/dist/{src → esm}/recovery/baseApi.d.ts.map +0 -0
- /package/dist/{src → esm}/recovery/coingeckoApi.d.ts.map +0 -0
- /package/dist/{src → esm}/recovery/crossChainRecovery.d.ts.map +0 -0
- /package/dist/{src → esm}/recovery/index.d.ts.map +0 -0
- /package/dist/{src → esm}/recovery/mempoolApi.d.ts.map +0 -0
- /package/dist/{src → esm}/sign.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/bip322.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/common/verifyPayGoAmount.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/descriptor/index.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/descriptor/parse.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/descriptor/parseToAmountType.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/descriptor/recipient.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/descriptor/signPsbt.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/descriptor/verifyTransaction.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/fetchInputs.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/fixedScript/parseOutput.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/fixedScript/signTransaction.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/fixedScript/verifyTransaction.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/getPayGoVerificationPubkey.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/index.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/outputDifference.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/parseTransaction.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/recipient.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/signTransaction.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/verifyTransaction.d.ts.map +0 -0
- /package/dist/{src → esm}/verifyKey.d.ts.map +0 -0
- /package/dist/{src → esm}/wallet.d.ts.map +0 -0
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
require("mocha");
|
|
37
|
+
const assert = __importStar(require("assert"));
|
|
38
|
+
const _ = __importStar(require("lodash"));
|
|
39
|
+
const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
|
|
40
|
+
const nock = require("nock");
|
|
41
|
+
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
42
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
43
|
+
const src_1 = require("../../src");
|
|
44
|
+
const util_1 = require("./util");
|
|
45
|
+
function getScriptTypes2Of3() {
|
|
46
|
+
return [...utxo_lib_1.bitgo.outputScripts.scriptTypes2Of3, 'taprootKeyPathSpend'];
|
|
47
|
+
}
|
|
48
|
+
describe(`UTXO coin signTransaction`, async function () {
|
|
49
|
+
const bgUrl = sdk_core_1.common.Environments[util_1.defaultBitGo.getEnv()].uri;
|
|
50
|
+
const coin = (0, util_1.getUtxoCoin)('btc');
|
|
51
|
+
const wallet = (0, util_1.getUtxoWallet)(coin, { id: '5b34252f1bf349930e34020a00000000', coin: coin.getChain() });
|
|
52
|
+
const rootWalletKeys = (0, util_1.getDefaultWalletKeys)();
|
|
53
|
+
const userPrv = rootWalletKeys.user.toBase58();
|
|
54
|
+
const pubs = util_1.keychainsBase58.map((v) => v.pub);
|
|
55
|
+
function validatePsbt(txHex, targetSigCount, targetNonceCount) {
|
|
56
|
+
const psbt = utxolib.bitgo.createPsbtFromHex(txHex, coin.network);
|
|
57
|
+
psbt.data.inputs.forEach((input, index) => {
|
|
58
|
+
const parsed = utxolib.bitgo.parsePsbtInput(input);
|
|
59
|
+
if (parsed.scriptType === 'taprootKeyPathSpend') {
|
|
60
|
+
assert.ok(targetNonceCount);
|
|
61
|
+
const nonce = psbt.getProprietaryKeyVals(index, {
|
|
62
|
+
identifier: utxolib.bitgo.PSBT_PROPRIETARY_IDENTIFIER,
|
|
63
|
+
subtype: utxolib.bitgo.ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
|
|
64
|
+
});
|
|
65
|
+
assert.strictEqual(nonce.length, targetNonceCount);
|
|
66
|
+
}
|
|
67
|
+
const expectedSigCount = parsed.scriptType === 'p2shP2pk' || targetSigCount === 0 ? undefined : 1;
|
|
68
|
+
assert.strictEqual(parsed.signatures?.length, expectedSigCount);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function validateTx(txHex, unspents, targetSigCount) {
|
|
72
|
+
const tx = utxolib.bitgo.createTransactionFromHex(txHex, coin.network);
|
|
73
|
+
unspents.forEach((u, i) => {
|
|
74
|
+
const sigCount = utxolib.bitgo.getStrictSignatureCount(tx.ins[i]);
|
|
75
|
+
const expectedSigCount = utxolib.bitgo.isWalletUnspent(u) && !!targetSigCount ? 1 : 0;
|
|
76
|
+
assert.strictEqual(sigCount, expectedSigCount);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
async function signTransaction(tx, useSigningSteps, unspents) {
|
|
80
|
+
const isPsbt = tx instanceof utxolib.bitgo.UtxoPsbt;
|
|
81
|
+
const isTxWithTaprootKeyPathSpend = isPsbt && utxolib.bitgo.isTransactionWithKeyPathSpendInput(tx);
|
|
82
|
+
const txHex = tx.toHex();
|
|
83
|
+
function nockSignPsbt(psbtHex) {
|
|
84
|
+
const psbt = utxolib.bitgo.createPsbtFromHex(psbtHex, coin.network);
|
|
85
|
+
return nock(bgUrl)
|
|
86
|
+
.post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/tx/signpsbt`, (body) => body.psbt)
|
|
87
|
+
.reply(200, { psbt: psbt.setAllInputsMusig2NonceHD(rootWalletKeys.bitgo).toHex() });
|
|
88
|
+
}
|
|
89
|
+
if (!useSigningSteps) {
|
|
90
|
+
let scope;
|
|
91
|
+
if (tx instanceof utxolib.bitgo.UtxoPsbt && isTxWithTaprootKeyPathSpend) {
|
|
92
|
+
scope = nockSignPsbt(tx.clone().setAllInputsMusig2NonceHD(rootWalletKeys.bitgo).toHex());
|
|
93
|
+
}
|
|
94
|
+
const psbt = await coin.signTransaction({
|
|
95
|
+
txPrebuild: {
|
|
96
|
+
txHex,
|
|
97
|
+
txInfo: isPsbt ? undefined : { unspents },
|
|
98
|
+
walletId: isTxWithTaprootKeyPathSpend ? wallet.id() : undefined,
|
|
99
|
+
},
|
|
100
|
+
prv: userPrv,
|
|
101
|
+
pubs: isPsbt ? undefined : pubs,
|
|
102
|
+
});
|
|
103
|
+
assert.ok('txHex' in psbt);
|
|
104
|
+
if (isPsbt) {
|
|
105
|
+
validatePsbt(psbt.txHex, 1, 2);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
assert.ok(unspents);
|
|
109
|
+
validateTx(psbt.txHex, unspents, 1);
|
|
110
|
+
}
|
|
111
|
+
if (scope) {
|
|
112
|
+
assert.strictEqual(scope.isDone(), true);
|
|
113
|
+
}
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const signerNoncePsbt = await coin.signTransaction({
|
|
117
|
+
txPrebuild: { txHex },
|
|
118
|
+
prv: userPrv,
|
|
119
|
+
signingStep: 'signerNonce',
|
|
120
|
+
});
|
|
121
|
+
assert.ok('txHex' in signerNoncePsbt);
|
|
122
|
+
if (isPsbt) {
|
|
123
|
+
validatePsbt(signerNoncePsbt.txHex, 0, isTxWithTaprootKeyPathSpend ? 1 : undefined);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
assert.ok(unspents);
|
|
127
|
+
validateTx(signerNoncePsbt.txHex, unspents, 0);
|
|
128
|
+
}
|
|
129
|
+
let scope;
|
|
130
|
+
if (isTxWithTaprootKeyPathSpend) {
|
|
131
|
+
scope = nockSignPsbt(signerNoncePsbt.txHex);
|
|
132
|
+
}
|
|
133
|
+
const cosignerNoncePsbt = await coin.signTransaction({
|
|
134
|
+
txPrebuild: { ...signerNoncePsbt, walletId: wallet.id() },
|
|
135
|
+
signingStep: 'cosignerNonce',
|
|
136
|
+
});
|
|
137
|
+
assert.ok('txHex' in cosignerNoncePsbt);
|
|
138
|
+
if (isPsbt) {
|
|
139
|
+
validatePsbt(cosignerNoncePsbt.txHex, 0, isTxWithTaprootKeyPathSpend ? 2 : undefined);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
assert.ok(unspents);
|
|
143
|
+
validateTx(cosignerNoncePsbt.txHex, unspents, 0);
|
|
144
|
+
}
|
|
145
|
+
if (scope) {
|
|
146
|
+
assert.strictEqual(scope.isDone(), true);
|
|
147
|
+
}
|
|
148
|
+
const signerSigPsbt = await coin.signTransaction({
|
|
149
|
+
txPrebuild: { ...cosignerNoncePsbt, txInfo: isPsbt ? undefined : { unspents } },
|
|
150
|
+
prv: userPrv,
|
|
151
|
+
pubs: isPsbt ? undefined : pubs,
|
|
152
|
+
signingStep: 'signerSignature',
|
|
153
|
+
});
|
|
154
|
+
assert.ok('txHex' in signerSigPsbt);
|
|
155
|
+
if (isPsbt) {
|
|
156
|
+
validatePsbt(signerSigPsbt.txHex, 1, isTxWithTaprootKeyPathSpend ? 2 : undefined);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
assert.ok(unspents);
|
|
160
|
+
validateTx(signerSigPsbt.txHex, unspents, 1);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
it('success when called like customSigningFunction flow - PSBT with taprootKeyPathSpend inputs', async function () {
|
|
164
|
+
const inputs = utxo_lib_1.testutil.inputScriptTypes.map((scriptType) => ({
|
|
165
|
+
scriptType,
|
|
166
|
+
value: BigInt(1000),
|
|
167
|
+
}));
|
|
168
|
+
const unspentSum = inputs.reduce((prev, curr) => prev + curr.value, BigInt(0));
|
|
169
|
+
const outputs = [{ scriptType: 'p2sh', value: unspentSum - BigInt(1000) }];
|
|
170
|
+
const psbt = utxo_lib_1.testutil.constructPsbt(inputs, outputs, coin.network, rootWalletKeys, 'unsigned');
|
|
171
|
+
for (const v of [false, true]) {
|
|
172
|
+
await signTransaction(psbt, v);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
it('success when called like customSigningFunction flow - PSBT without taprootKeyPathSpend inputs', async function () {
|
|
176
|
+
const inputs = utxo_lib_1.testutil.inputScriptTypes
|
|
177
|
+
.filter((v) => v !== 'taprootKeyPathSpend')
|
|
178
|
+
.map((scriptType) => ({
|
|
179
|
+
scriptType,
|
|
180
|
+
value: BigInt(1000),
|
|
181
|
+
}));
|
|
182
|
+
const unspentSum = inputs.reduce((prev, cur) => prev + cur.value, BigInt(0));
|
|
183
|
+
const outputs = [{ scriptType: 'p2sh', value: unspentSum - BigInt(1000) }];
|
|
184
|
+
const psbt = utxo_lib_1.testutil.constructPsbt(inputs, outputs, coin.network, rootWalletKeys, 'unsigned');
|
|
185
|
+
for (const v of [false, true]) {
|
|
186
|
+
await signTransaction(psbt, v);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
it('success when called like customSigningFunction flow - Network Tx', async function () {
|
|
190
|
+
const inputs = utxo_lib_1.testutil.txnInputScriptTypes
|
|
191
|
+
.filter((v) => v !== 'p2shP2pk')
|
|
192
|
+
.map((scriptType) => ({
|
|
193
|
+
scriptType,
|
|
194
|
+
value: BigInt(1000),
|
|
195
|
+
}));
|
|
196
|
+
const unspentSum = inputs.reduce((prev, curr) => prev + curr.value, BigInt(0));
|
|
197
|
+
const outputs = [{ scriptType: 'p2sh', value: unspentSum - BigInt(1000) }];
|
|
198
|
+
const txBuilder = utxo_lib_1.testutil.constructTxnBuilder(inputs, outputs, coin.network, rootWalletKeys, 'unsigned');
|
|
199
|
+
const unspents = inputs.map((v, i) => utxo_lib_1.testutil.toTxnUnspent(v, i, coin.network, rootWalletKeys));
|
|
200
|
+
for (const v of [false, true]) {
|
|
201
|
+
await signTransaction(txBuilder.buildIncomplete(), v, unspents);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
it('fails when called like customSigningFunction flow - PSBT cache miss', async function () {
|
|
205
|
+
const inputs = [{ scriptType: 'taprootKeyPathSpend', value: BigInt(1000) }];
|
|
206
|
+
const unspentSum = inputs.reduce((prev, curr) => prev + curr.value, BigInt(0));
|
|
207
|
+
const outputs = [{ scriptType: 'p2sh', value: unspentSum - BigInt(1000) }];
|
|
208
|
+
const psbt = utxo_lib_1.testutil.constructPsbt(inputs, outputs, coin.network, rootWalletKeys, 'unsigned');
|
|
209
|
+
await assert.rejects(async () => {
|
|
210
|
+
await coin.signTransaction({
|
|
211
|
+
txPrebuild: { txHex: psbt.toHex() },
|
|
212
|
+
prv: userPrv,
|
|
213
|
+
signingStep: 'signerSignature',
|
|
214
|
+
});
|
|
215
|
+
}, {
|
|
216
|
+
message: `Psbt is missing from txCache (cache size 0).
|
|
217
|
+
This may be due to the request being routed to a different BitGo-Express instance that for signing step 'signerNonce'.`,
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
it('fails when unsupported locking script is used', async function () {
|
|
221
|
+
const inputs = [
|
|
222
|
+
{ scriptType: 'p2wsh', value: BigInt(1000) },
|
|
223
|
+
{ scriptType: 'p2trMusig2', value: BigInt(1000) },
|
|
224
|
+
];
|
|
225
|
+
const unspentSum = inputs.reduce((prev, curr) => prev + curr.value, BigInt(0));
|
|
226
|
+
const outputs = [{ scriptType: 'p2sh', value: unspentSum - BigInt(500) }];
|
|
227
|
+
const psbt = utxo_lib_1.testutil.constructPsbt(inputs, outputs, coin.network, rootWalletKeys, 'unsigned');
|
|
228
|
+
// override the 1st PSBT input with unsupported 2 of 2 multi-sig locking script.
|
|
229
|
+
const unspent = utxo_lib_1.testutil.toUnspent(inputs[0], 0, coin.network, rootWalletKeys);
|
|
230
|
+
if (!utxolib.bitgo.isWalletUnspent(unspent)) {
|
|
231
|
+
throw new Error('invalid unspent');
|
|
232
|
+
}
|
|
233
|
+
const { publicKeys } = rootWalletKeys.deriveForChainAndIndex(unspent.chain, unspent.index);
|
|
234
|
+
const script2Of2 = utxolib.payments.p2ms({ m: 2, pubkeys: [publicKeys[0], publicKeys[1]] });
|
|
235
|
+
psbt.data.inputs[0].witnessScript = script2Of2.output;
|
|
236
|
+
await assert.rejects(async () => {
|
|
237
|
+
await coin.signTransaction({
|
|
238
|
+
txPrebuild: { txHex: psbt.toHex() },
|
|
239
|
+
prv: userPrv,
|
|
240
|
+
});
|
|
241
|
+
}, {
|
|
242
|
+
message: `length mismatch`,
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
function run(coin, inputScripts, txFormat, amountType = 'number') {
|
|
247
|
+
describe(`Transaction Stages ${coin.getChain()} (${amountType}) scripts=${inputScripts.join(',')} txFormat=${txFormat}`, function () {
|
|
248
|
+
const bgUrl = sdk_core_1.common.Environments[util_1.defaultBitGo.getEnv()].uri;
|
|
249
|
+
const isTransactionWithKeyPathSpend = inputScripts.some((s) => s === 'taprootKeyPathSpend');
|
|
250
|
+
const isTransactionWithReplayProtection = inputScripts.some((s) => s === 'p2shP2pk');
|
|
251
|
+
const isTransactionWithP2tr = inputScripts.some((s) => s === 'p2tr');
|
|
252
|
+
const isTransactionWithP2trMusig2 = inputScripts.some((s) => s === 'p2trMusig2');
|
|
253
|
+
const value = (amountType === 'bigint' ? BigInt('10999999800000001') : 1e8);
|
|
254
|
+
const wallet = (0, util_1.getUtxoWallet)(coin, { id: '5b34252f1bf349930e34020a00000000', coin: coin.getChain() });
|
|
255
|
+
const walletKeys = (0, util_1.getDefaultWalletKeys)();
|
|
256
|
+
const fullSign = !(isTransactionWithReplayProtection || isTransactionWithKeyPathSpend);
|
|
257
|
+
function getUnspentsForPsbt() {
|
|
258
|
+
return inputScripts.map((t, index) => {
|
|
259
|
+
return utxo_lib_1.testutil.toUnspent({ scriptType: t, value: t === 'p2shP2pk' ? BigInt(1000) : BigInt(value) }, index, coin.network, walletKeys);
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
function toTxnInputScriptType(type) {
|
|
263
|
+
return type === 'p2shP2pk' ? 'replayProtection' : type === 'taprootKeyPathSpend' ? 'p2trMusig2' : type;
|
|
264
|
+
}
|
|
265
|
+
function getUnspents() {
|
|
266
|
+
return inputScripts.map((type, i) => (0, util_1.mockUnspent)(coin.network, walletKeys, toTxnInputScriptType(type), i, value));
|
|
267
|
+
}
|
|
268
|
+
function getOutputAddress(rootWalletKeys) {
|
|
269
|
+
return (0, src_1.generateAddress)(coin.network, {
|
|
270
|
+
keychains: rootWalletKeys.triple.map((k) => ({ pub: k.neutered().toBase58() })),
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
function getSignParams(prebuildHex, signer, cosigner) {
|
|
274
|
+
const txInfo = {
|
|
275
|
+
unspents: txFormat === 'psbt' ? undefined : getUnspents(),
|
|
276
|
+
};
|
|
277
|
+
return {
|
|
278
|
+
txPrebuild: {
|
|
279
|
+
walletId: isTransactionWithKeyPathSpend ? wallet.id() : undefined,
|
|
280
|
+
txHex: prebuildHex,
|
|
281
|
+
txInfo,
|
|
282
|
+
},
|
|
283
|
+
prv: signer.toBase58(),
|
|
284
|
+
pubs: walletKeys.triple.map((k) => k.neutered().toBase58()),
|
|
285
|
+
cosignerPub: cosigner.neutered().toBase58(),
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
async function createHalfSignedTransaction(prebuild, signer, cosigner) {
|
|
289
|
+
let scope;
|
|
290
|
+
if (prebuild instanceof utxolib.bitgo.UtxoPsbt && isTransactionWithKeyPathSpend) {
|
|
291
|
+
const psbt = prebuild.clone().setAllInputsMusig2NonceHD(cosigner);
|
|
292
|
+
scope = nock(bgUrl)
|
|
293
|
+
.post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/tx/signpsbt`, (body) => body.psbt)
|
|
294
|
+
.reply(200, { psbt: psbt.toHex() });
|
|
295
|
+
}
|
|
296
|
+
// half-sign with the user key
|
|
297
|
+
const result = (await wallet.signTransaction(getSignParams(prebuild.toBuffer().toString('hex'), signer, cosigner)));
|
|
298
|
+
if (scope) {
|
|
299
|
+
assert.strictEqual(scope.isDone(), true);
|
|
300
|
+
}
|
|
301
|
+
return result;
|
|
302
|
+
}
|
|
303
|
+
async function createFullSignedTransaction(halfSigned, signer, cosigner) {
|
|
304
|
+
return (await wallet.signTransaction({
|
|
305
|
+
...getSignParams(halfSigned.txHex, signer, cosigner),
|
|
306
|
+
isLastSignature: true,
|
|
307
|
+
}));
|
|
308
|
+
}
|
|
309
|
+
function createPrebuildPsbt() {
|
|
310
|
+
const inputs = inputScripts.map((t) => ({
|
|
311
|
+
scriptType: t,
|
|
312
|
+
value: t === 'p2shP2pk' ? BigInt(1000) : BigInt(value),
|
|
313
|
+
}));
|
|
314
|
+
const unspentSum = inputs.reduce((prev, curr) => prev + curr.value, BigInt(0));
|
|
315
|
+
const outputs = [
|
|
316
|
+
{ address: getOutputAddress((0, util_1.getWalletKeys)('test')), value: unspentSum - BigInt(1000) },
|
|
317
|
+
];
|
|
318
|
+
const psbt = utxo_lib_1.testutil.constructPsbt(inputs, outputs, coin.network, walletKeys, 'unsigned');
|
|
319
|
+
utxolib.bitgo.addXpubsToPsbt(psbt, walletKeys);
|
|
320
|
+
return psbt;
|
|
321
|
+
}
|
|
322
|
+
async function getTransactionStages() {
|
|
323
|
+
const prebuild = txFormat === 'psbt'
|
|
324
|
+
? createPrebuildPsbt()
|
|
325
|
+
: (0, util_1.createPrebuildTransaction)(coin.network, getUnspents(), getOutputAddress(walletKeys));
|
|
326
|
+
const halfSignedUserBitGo = await createHalfSignedTransaction(prebuild, walletKeys.user, walletKeys.bitgo);
|
|
327
|
+
const fullSignedUserBitGo = fullSign && !isTransactionWithP2trMusig2
|
|
328
|
+
? await createFullSignedTransaction(halfSignedUserBitGo, walletKeys.bitgo, walletKeys.user)
|
|
329
|
+
: undefined;
|
|
330
|
+
const halfSignedUserBackup = !isTransactionWithKeyPathSpend && !(txFormat === 'psbt' && isTransactionWithP2tr)
|
|
331
|
+
? await createHalfSignedTransaction(prebuild, walletKeys.user, walletKeys.backup)
|
|
332
|
+
: undefined;
|
|
333
|
+
const fullSignedUserBackup = fullSign && halfSignedUserBackup
|
|
334
|
+
? await createFullSignedTransaction(halfSignedUserBackup, walletKeys.backup, walletKeys.user)
|
|
335
|
+
: undefined;
|
|
336
|
+
return {
|
|
337
|
+
prebuild,
|
|
338
|
+
halfSignedUserBackup,
|
|
339
|
+
halfSignedUserBitGo,
|
|
340
|
+
fullSignedUserBackup,
|
|
341
|
+
fullSignedUserBitGo,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
let transactionStages;
|
|
345
|
+
before('prepare', async function () {
|
|
346
|
+
transactionStages = await getTransactionStages();
|
|
347
|
+
});
|
|
348
|
+
afterEach(nock.cleanAll);
|
|
349
|
+
it('match fixtures', async function () {
|
|
350
|
+
if (txFormat === 'psbt') {
|
|
351
|
+
// TODO (maybe) - once full PSBT support is added to abstract-utxo module, custom JSON representation of PSBT can be created and tested here.
|
|
352
|
+
// signatures of taprootKeyPathSpends are random since random nature of MuSig2 nonce, so psbt hex comparison also wont work.
|
|
353
|
+
return this.skip();
|
|
354
|
+
}
|
|
355
|
+
function toTransactionStagesObj(stages) {
|
|
356
|
+
return _.mapValues(stages, (v) => v === undefined || v instanceof utxolib.bitgo.UtxoPsbt
|
|
357
|
+
? undefined
|
|
358
|
+
: v instanceof utxolib.bitgo.UtxoTransaction
|
|
359
|
+
? (0, util_1.transactionToObj)(v)
|
|
360
|
+
: (0, util_1.transactionHexToObj)(v.txHex, coin.network, amountType));
|
|
361
|
+
}
|
|
362
|
+
(0, util_1.shouldEqualJSON)(toTransactionStagesObj(transactionStages), await (0, util_1.getFixture)(coin, `transactions-${inputScripts.map((t) => toTxnInputScriptType(t)).join('-')}`, toTransactionStagesObj(transactionStages)));
|
|
363
|
+
});
|
|
364
|
+
function testPsbtValidSignatures(tx, signedBy) {
|
|
365
|
+
const psbt = utxolib.bitgo.createPsbtFromHex(tx.txHex, coin.network);
|
|
366
|
+
const unspents = getUnspentsForPsbt();
|
|
367
|
+
psbt.data.inputs.forEach((input, index) => {
|
|
368
|
+
const unspent = unspents[index];
|
|
369
|
+
if (!utxolib.bitgo.isWalletUnspent(unspent)) {
|
|
370
|
+
assert.ok(utxolib.bitgo.getPsbtInputScriptType(input), 'p2shP2pk');
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
const pubkeys = walletKeys.deriveForChainAndIndex(unspent.chain, unspent.index).publicKeys;
|
|
374
|
+
pubkeys.forEach((pk, pkIndex) => {
|
|
375
|
+
psbt.validateSignaturesOfInputCommon(index, pk).should.eql(signedBy.includes(walletKeys.triple[pkIndex]));
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
function testValidSignatures(tx, signedBy, sign) {
|
|
380
|
+
if (txFormat === 'psbt' && sign === 'halfsigned') {
|
|
381
|
+
testPsbtValidSignatures(tx, signedBy);
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
const unspents = txFormat === 'psbt'
|
|
385
|
+
? getUnspentsForPsbt().map((u) => ({ ...u, value: utxo_lib_1.bitgo.toTNumber(u.value, amountType) }))
|
|
386
|
+
: getUnspents();
|
|
387
|
+
const prevOutputs = unspents.map((u) => ({
|
|
388
|
+
script: utxolib.address.toOutputScript(u.address, coin.network),
|
|
389
|
+
value: u.value,
|
|
390
|
+
}));
|
|
391
|
+
const transaction = utxolib.bitgo.createTransactionFromBuffer(Buffer.from(tx.txHex, 'hex'), coin.network, { amountType });
|
|
392
|
+
transaction.ins.forEach((input, index) => {
|
|
393
|
+
if (inputScripts[index] === 'p2shP2pk') {
|
|
394
|
+
assert.ok(coin.isBitGoTaintedUnspent(unspents[index]));
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
const unspent = unspents[index];
|
|
398
|
+
const pubkeys = walletKeys.deriveForChainAndIndex(unspent.chain, unspent.index).publicKeys;
|
|
399
|
+
pubkeys.forEach((pk, pkIndex) => {
|
|
400
|
+
utxolib.bitgo
|
|
401
|
+
.verifySignature(transaction, index, prevOutputs[index].value, {
|
|
402
|
+
publicKey: pk,
|
|
403
|
+
}, prevOutputs)
|
|
404
|
+
.should.eql(signedBy.includes(walletKeys.triple[pkIndex]));
|
|
405
|
+
});
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
async function testExplainTx(stageName, txHex, unspents, pubs) {
|
|
409
|
+
const explanation = await coin.explainTransaction({
|
|
410
|
+
txHex,
|
|
411
|
+
txInfo: {
|
|
412
|
+
unspents,
|
|
413
|
+
},
|
|
414
|
+
pubs,
|
|
415
|
+
});
|
|
416
|
+
explanation.should.have.properties('displayOrder', 'id', 'outputs', 'changeOutputs', 'changeAmount', 'outputAmount', 'inputSignatures', 'signatures');
|
|
417
|
+
const expectedSignatureCount = stageName === 'prebuild' || pubs === undefined
|
|
418
|
+
? 0
|
|
419
|
+
: stageName.startsWith('halfSigned')
|
|
420
|
+
? 1
|
|
421
|
+
: stageName.startsWith('fullSigned')
|
|
422
|
+
? 2
|
|
423
|
+
: undefined;
|
|
424
|
+
if ('inputSignatures' in explanation) {
|
|
425
|
+
explanation.inputSignatures.should.eql(
|
|
426
|
+
// FIXME(BG-35154): implement signature verification for replay protection inputs
|
|
427
|
+
inputScripts.map((type) => (type === 'p2shP2pk' ? 0 : expectedSignatureCount)));
|
|
428
|
+
}
|
|
429
|
+
if ('signatures' in explanation) {
|
|
430
|
+
explanation.signatures.should.eql(expectedSignatureCount);
|
|
431
|
+
explanation.changeAmount.should.eql('0'); // no change addresses given
|
|
432
|
+
}
|
|
433
|
+
let expectedOutputAmount = BigInt((txFormat === 'psbt' ? getUnspentsForPsbt() : getUnspents()).length) * BigInt(value);
|
|
434
|
+
inputScripts.forEach((type) => {
|
|
435
|
+
if (type === 'p2shP2pk') {
|
|
436
|
+
// replayProtection unspents have value 1000
|
|
437
|
+
expectedOutputAmount -= BigInt(value);
|
|
438
|
+
expectedOutputAmount += BigInt(1000);
|
|
439
|
+
}
|
|
440
|
+
});
|
|
441
|
+
expectedOutputAmount -= BigInt(1000); // fee of 1000
|
|
442
|
+
explanation.outputAmount.should.eql(expectedOutputAmount.toString());
|
|
443
|
+
}
|
|
444
|
+
it('have valid signature for half-signed transaction', function () {
|
|
445
|
+
if (transactionStages.halfSignedUserBackup) {
|
|
446
|
+
testValidSignatures(transactionStages.halfSignedUserBackup, [walletKeys.user], 'halfsigned');
|
|
447
|
+
}
|
|
448
|
+
testValidSignatures(transactionStages.halfSignedUserBitGo, [walletKeys.user], 'halfsigned');
|
|
449
|
+
});
|
|
450
|
+
it('have valid signatures for full-signed transaction', function () {
|
|
451
|
+
if (!fullSign) {
|
|
452
|
+
return this.skip();
|
|
453
|
+
}
|
|
454
|
+
if (transactionStages.fullSignedUserBackup) {
|
|
455
|
+
testValidSignatures(transactionStages.fullSignedUserBackup, [walletKeys.user, walletKeys.backup], 'fullsigned');
|
|
456
|
+
}
|
|
457
|
+
if (transactionStages.fullSignedUserBitGo) {
|
|
458
|
+
testValidSignatures(transactionStages.fullSignedUserBitGo, [walletKeys.user, walletKeys.bitgo], 'fullsigned');
|
|
459
|
+
}
|
|
460
|
+
});
|
|
461
|
+
it('have correct results for explainTransaction', async function () {
|
|
462
|
+
for (const [stageName, stageTx] of Object.entries(transactionStages)) {
|
|
463
|
+
if (!stageTx) {
|
|
464
|
+
continue;
|
|
465
|
+
}
|
|
466
|
+
const txHex = stageTx instanceof utxolib.bitgo.UtxoPsbt || stageTx instanceof utxolib.bitgo.UtxoTransaction
|
|
467
|
+
? stageTx.toBuffer().toString('hex')
|
|
468
|
+
: stageTx.txHex;
|
|
469
|
+
const pubs = walletKeys.triple.map((k) => k.neutered().toBase58());
|
|
470
|
+
const unspents = txFormat === 'psbt'
|
|
471
|
+
? getUnspentsForPsbt().map((u) => ({ ...u, value: utxo_lib_1.bitgo.toTNumber(u.value, amountType) }))
|
|
472
|
+
: getUnspents();
|
|
473
|
+
await testExplainTx(stageName, txHex, unspents, pubs);
|
|
474
|
+
await testExplainTx(stageName, txHex, unspents);
|
|
475
|
+
}
|
|
476
|
+
});
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
function runWithAmountType(coin, inputScripts, txFormat) {
|
|
480
|
+
const amountType = coin.amountType;
|
|
481
|
+
if (amountType === 'bigint') {
|
|
482
|
+
run(coin, inputScripts, txFormat, amountType);
|
|
483
|
+
}
|
|
484
|
+
else {
|
|
485
|
+
run(coin, inputScripts, txFormat, amountType);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
util_1.utxoCoins.forEach((coin) => getScriptTypes2Of3().forEach((type) => {
|
|
489
|
+
['legacy', 'psbt'].forEach((txFormat) => {
|
|
490
|
+
if ((type === 'taprootKeyPathSpend' || type === 'p2trMusig2') && txFormat !== 'psbt') {
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
493
|
+
if (coin.supportsAddressType(type === 'taprootKeyPathSpend' ? 'p2trMusig2' : type)) {
|
|
494
|
+
runWithAmountType(coin, [type, type], txFormat);
|
|
495
|
+
if ((0, src_1.getReplayProtectionAddresses)(coin.network).length) {
|
|
496
|
+
runWithAmountType(coin, ['p2shP2pk', type], txFormat);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
});
|
|
500
|
+
}));
|
|
501
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpQkFBZTtBQUNmLCtDQUFpQztBQUVqQywwQ0FBNEI7QUFDNUIsOERBQWdEO0FBQ2hELDZCQUE4QjtBQUM5QixtREFBdUU7QUFDdkUsbURBTThCO0FBRTlCLG1DQUE0RjtBQUU1RixpQ0FnQmdCO0FBS2hCLFNBQVMsa0JBQWtCO0lBQ3pCLE9BQU8sQ0FBQyxHQUFHLGdCQUFLLENBQUMsYUFBYSxDQUFDLGVBQWUsRUFBRSxxQkFBcUIsQ0FBVSxDQUFDO0FBQ2xGLENBQUM7QUFFRCxRQUFRLENBQUMsMkJBQTJCLEVBQUUsS0FBSztJQUN6QyxNQUFNLEtBQUssR0FBRyxpQkFBTSxDQUFDLFlBQVksQ0FBQyxtQkFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDO0lBRTdELE1BQU0sSUFBSSxHQUFHLElBQUEsa0JBQVcsRUFBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFBLG9CQUFhLEVBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLGtDQUFrQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RHLE1BQU0sY0FBYyxHQUFHLElBQUEsMkJBQW9CLEdBQUUsQ0FBQztJQUM5QyxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQy9DLE1BQU0sSUFBSSxHQUFHLHNCQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFtQixDQUFDO0lBRWpFLFNBQVMsWUFBWSxDQUFDLEtBQWEsRUFBRSxjQUFxQixFQUFFLGdCQUF3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QUFDSCxDQUFDO0FBRUQsZ0JBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUN6QixrQkFBa0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO0lBQ25DLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQ2pELElBQUksQ0FBQyxJQUFJLEtBQUsscUJBQXFCLElBQUksSUFBSSxLQUFLLFlBQVksQ0FBQyxJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNyRixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksS0FBSyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ25GLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUVoRCxJQUFJLElBQUEsa0NBQTRCLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN0RCxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDeEQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ21vY2hhJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0IHsgQklQMzJJbnRlcmZhY2UsIGJpdGdvLCB0ZXN0dXRpbCB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7XG4gIGNvbW1vbixcbiAgRnVsbHlTaWduZWRUcmFuc2FjdGlvbixcbiAgSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbixcbiAgVHJpcGxlLFxuICBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0VXR4b0NvaW4sIGdldFJlcGxheVByb3RlY3Rpb25BZGRyZXNzZXMsIGdlbmVyYXRlQWRkcmVzcyB9IGZyb20gJy4uLy4uL3NyYyc7XG5cbmltcG9ydCB7XG4gIHV0eG9Db2lucyxcbiAgc2hvdWxkRXF1YWxKU09OLFxuICBnZXRGaXh0dXJlLFxuICBnZXRVdHhvV2FsbGV0LFxuICBtb2NrVW5zcGVudCxcbiAgSW5wdXRTY3JpcHRUeXBlLFxuICBUcmFuc2FjdGlvbk9iaixcbiAgdHJhbnNhY3Rpb25Ub09iaixcbiAgdHJhbnNhY3Rpb25IZXhUb09iaixcbiAgY3JlYXRlUHJlYnVpbGRUcmFuc2FjdGlvbixcbiAgZ2V0RGVmYXVsdFdhbGxldEtleXMsXG4gIGdldFV0eG9Db2luLFxuICBrZXljaGFpbnNCYXNlNTgsXG4gIGdldFdhbGxldEtleXMsXG4gIGRlZmF1bHRCaXRHbyxcbn0gZnJvbSAnLi91dGlsJztcblxudHlwZSBVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+ID0gYml0Z28uVW5zcGVudDxUTnVtYmVyPjtcbnR5cGUgV2FsbGV0VW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IGJpdGdvLldhbGxldFVuc3BlbnQ8VE51bWJlcj47XG5cbmZ1bmN0aW9uIGdldFNjcmlwdFR5cGVzMk9mMygpIHtcbiAgcmV0dXJuIFsuLi5iaXRnby5vdXRwdXRTY3JpcHRzLnNjcmlwdFR5cGVzMk9mMywgJ3RhcHJvb3RLZXlQYXRoU3BlbmQnXSBhcyBjb25zdDtcbn1cblxuZGVzY3JpYmUoYFVUWE8gY29pbiBzaWduVHJhbnNhY3Rpb25gLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGJnVXJsID0gY29tbW9uLkVudmlyb25tZW50c1tkZWZhdWx0Qml0R28uZ2V0RW52KCldLnVyaTtcblxuICBjb25zdCBjb2luID0gZ2V0VXR4b0NvaW4oJ2J0YycpO1xuICBjb25zdCB3YWxsZXQgPSBnZXRVdHhvV2FsbGV0KGNvaW4sIHsgaWQ6ICc1YjM0MjUyZjFiZjM0OTkzMGUzNDAyMGEwMDAwMDAwMCcsIGNvaW46IGNvaW4uZ2V0Q2hhaW4oKSB9KTtcbiAgY29uc3Qgcm9vdFdhbGxldEtleXMgPSBnZXREZWZhdWx0V2FsbGV0S2V5cygpO1xuICBjb25zdCB1c2VyUHJ2ID0gcm9vdFdhbGxldEtleXMudXNlci50b0Jhc2U1OCgpO1xuICBjb25zdCBwdWJzID0ga2V5Y2hhaW5zQmFzZTU4Lm1hcCgodikgPT4gdi5wdWIpIGFzIFRyaXBsZTxzdHJpbmc+O1xuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlUHNidCh0eEhleDogc3RyaW5nLCB0YXJnZXRTaWdDb3VudDogMCB8IDEsIHRhcmdldE5vbmNlQ291bnQ/OiAxIHwgMikge1xuICAgIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGcm9tSGV4KHR4SGV4LCBjb2luLm5ldHdvcmspO1xuICAgIHBzYnQuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwYXJzZWQgPSB1dHhvbGliLmJpdGdvLnBhcnNlUHNidElucHV0KGlucHV0KTtcbiAgICAgIGlmIChwYXJzZWQuc2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnKSB7XG4gICAgICAgIGFzc2VydC5vayh0YXJnZXROb25jZUNvdW50KTtcbiAgICAgICAgY29uc3Qgbm9uY2UgPSBwc2J0LmdldFByb3ByaWV0YXJ5S2V5VmFscyhpbmRleCwge1xuICAgICAgICAgIGlkZW50aWZpZXI6IHV0eG9saWIuYml0Z28uUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgICAgICAgIHN1YnR5cGU6IHV0eG9saWIuYml0Z28uUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QVUJfTk9OQ0UsXG4gICAgICAgIH0pO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobm9uY2UubGVuZ3RoLCB0YXJnZXROb25jZUNvdW50KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4cGVjdGVkU2lnQ291bnQgPSBwYXJzZWQuc2NyaXB0VHlwZSA9PT0gJ3Ayc2hQMnBrJyB8fCB0YXJnZXRTaWdDb3VudCA9PT0gMCA/IHVuZGVmaW5lZCA6IDE7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocGFyc2VkLnNpZ25hdHVyZXM/Lmxlbmd0aCwgZXhwZWN0ZWRTaWdDb3VudCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB2YWxpZGF0ZVR4KHR4SGV4OiBzdHJpbmcsIHVuc3BlbnRzOiBVbnNwZW50PGJpZ2ludD5bXSwgdGFyZ2V0U2lnQ291bnQ6IDAgfCAxKSB7XG4gICAgY29uc3QgdHggPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleCh0eEhleCwgY29pbi5uZXR3b3JrKTtcbiAgICB1bnNwZW50cy5mb3JFYWNoKCh1LCBpKSA9PiB7XG4gICAgICBjb25zdCBzaWdDb3VudCA9IHV0eG9saWIuYml0Z28uZ2V0U3RyaWN0U2lnbmF0dXJlQ291bnQodHguaW5zW2ldKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkU2lnQ291bnQgPSB1dHhvbGliLmJpdGdvLmlzV2FsbGV0VW5zcGVudCh1KSAmJiAhIXRhcmdldFNpZ0NvdW50ID8gMSA6IDA7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2lnQ291bnQsIGV4cGVjdGVkU2lnQ291bnQpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc2lnblRyYW5zYWN0aW9uKFxuICAgIHR4OiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHwgdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248YmlnaW50PixcbiAgICB1c2VTaWduaW5nU3RlcHM6IGJvb2xlYW4sXG4gICAgdW5zcGVudHM/OiBVbnNwZW50PGJpZ2ludD5bXVxuICApIHtcbiAgICBjb25zdCBpc1BzYnQgPSB0eCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1BzYnQ7XG4gICAgY29uc3QgaXNUeFdpdGhUYXByb290S2V5UGF0aFNwZW5kID0gaXNQc2J0ICYmIHV0eG9saWIuYml0Z28uaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmRJbnB1dCh0eCk7XG4gICAgY29uc3QgdHhIZXggPSB0eC50b0hleCgpO1xuXG4gICAgZnVuY3Rpb24gbm9ja1NpZ25Qc2J0KHBzYnRIZXg6IHN0cmluZyk6IG5vY2suU2NvcGUge1xuICAgICAgY29uc3QgcHNidCA9IHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZyb21IZXgocHNidEhleCwgY29pbi5uZXR3b3JrKTtcbiAgICAgIHJldHVybiBub2NrKGJnVXJsKVxuICAgICAgICAucG9zdChgL2FwaS92Mi8ke3dhbGxldC5jb2luKCl9L3dhbGxldC8ke3dhbGxldC5pZCgpfS90eC9zaWducHNidGAsIChib2R5KSA9PiBib2R5LnBzYnQpXG4gICAgICAgIC5yZXBseSgyMDAsIHsgcHNidDogcHNidC5zZXRBbGxJbnB1dHNNdXNpZzJOb25jZUhEKHJvb3RXYWxsZXRLZXlzLmJpdGdvKS50b0hleCgpIH0pO1xuICAgIH1cblxuICAgIGlmICghdXNlU2lnbmluZ1N0ZXBzKSB7XG4gICAgICBsZXQgc2NvcGU6IG5vY2suU2NvcGUgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAodHggaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0ICYmIGlzVHhXaXRoVGFwcm9vdEtleVBhdGhTcGVuZCkge1xuICAgICAgICBzY29wZSA9IG5vY2tTaWduUHNidCh0eC5jbG9uZSgpLnNldEFsbElucHV0c011c2lnMk5vbmNlSEQocm9vdFdhbGxldEtleXMuYml0Z28pLnRvSGV4KCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgcHNidCA9IGF3YWl0IGNvaW4uc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgIHR4SGV4LFxuICAgICAgICAgIHR4SW5mbzogaXNQc2J0ID8gdW5kZWZpbmVkIDogeyB1bnNwZW50cyB9LFxuICAgICAgICAgIHdhbGxldElkOiBpc1R4V2l0aFRhcHJvb3RLZXlQYXRoU3BlbmQgPyB3YWxsZXQuaWQoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgICAgcHJ2OiB1c2VyUHJ2LFxuICAgICAgICBwdWJzOiBpc1BzYnQgPyB1bmRlZmluZWQgOiBwdWJzLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQub2soJ3R4SGV4JyBpbiBwc2J0KTtcbiAgICAgIGlmIChpc1BzYnQpIHtcbiAgICAgICAgdmFsaWRhdGVQc2J0KHBzYnQudHhIZXgsIDEsIDIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXNzZXJ0Lm9rKHVuc3BlbnRzKTtcbiAgICAgICAgdmFsaWRhdGVUeChwc2J0LnR4SGV4LCB1bnNwZW50cywgMSk7XG4gICAgICB9XG4gICAgICBpZiAoc2NvcGUpIHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjb3BlLmlzRG9uZSgpLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduZXJOb25jZVBzYnQgPSBhd2FpdCBjb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4IH0sXG4gICAgICBwcnY6IHVzZXJQcnYsXG4gICAgICBzaWduaW5nU3RlcDogJ3NpZ25lck5vbmNlJyxcbiAgICB9KTtcbiAgICBhc3NlcnQub2soJ3R4SGV4JyBpbiBzaWduZXJOb25jZVBzYnQpO1xuICAgIGlmIChpc1BzYnQpIHtcbiAgICAgIHZhbGlkYXRlUHNidChzaWduZXJOb25jZVBzYnQudHhIZXgsIDAsIGlzVHhXaXRoVGFwcm9vdEtleVBhdGhTcGVuZCA/IDEgOiB1bmRlZmluZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQub2sodW5zcGVudHMpO1xuICAgICAgdmFsaWRhdGVUeChzaWduZXJOb25jZVBzYnQudHhIZXgsIHVuc3BlbnRzLCAwKTtcbiAgICB9XG5cbiAgICBsZXQgc2NvcGU6IG5vY2suU2NvcGUgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzVHhXaXRoVGFwcm9vdEtleVBhdGhTcGVuZCkge1xuICAgICAgc2NvcGUgPSBub2NrU2lnblBzYnQoc2lnbmVyTm9uY2VQc2J0LnR4SGV4KTtcbiAgICB9XG5cbiAgICBjb25zdCBjb3NpZ25lck5vbmNlUHNidCA9IGF3YWl0IGNvaW4uc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgIHR4UHJlYnVpbGQ6IHsgLi4uc2lnbmVyTm9uY2VQc2J0LCB3YWxsZXRJZDogd2FsbGV0LmlkKCkgfSxcbiAgICAgIHNpZ25pbmdTdGVwOiAnY29zaWduZXJOb25jZScsXG4gICAgfSk7XG4gICAgYXNzZXJ0Lm9rKCd0eEhleCcgaW4gY29zaWduZXJOb25jZVBzYnQpO1xuICAgIGlmIChpc1BzYnQpIHtcbiAgICAgIHZhbGlkYXRlUHNidChjb3NpZ25lck5vbmNlUHNidC50eEhleCwgMCwgaXNUeFdpdGhUYXByb290S2V5UGF0aFNwZW5kID8gMiA6IHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydC5vayh1bnNwZW50cyk7XG4gICAgICB2YWxpZGF0ZVR4KGNvc2lnbmVyTm9uY2VQc2J0LnR4SGV4LCB1bnNwZW50cywgMCk7XG4gICAgfVxuXG4gICAgaWYgKHNjb3BlKSB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NvcGUuaXNEb25lKCksIHRydWUpO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25lclNpZ1BzYnQgPSBhd2FpdCBjb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICB0eFByZWJ1aWxkOiB7IC4uLmNvc2lnbmVyTm9uY2VQc2J0LCB0eEluZm86IGlzUHNidCA/IHVuZGVmaW5lZCA6IHsgdW5zcGVudHMgfSB9LFxuICAgICAgcHJ2OiB1c2VyUHJ2LFxuICAgICAgcHViczogaXNQc2J0ID8gdW5kZWZpbmVkIDogcHVicyxcbiAgICAgIHNpZ25pbmdTdGVwOiAnc2lnbmVyU2lnbmF0dXJlJyxcbiAgICB9KTtcbiAgICBhc3NlcnQub2soJ3R4SGV4JyBpbiBzaWduZXJTaWdQc2J0KTtcbiAgICBpZiAoaXNQc2J0KSB7XG4gICAgICB2YWxpZGF0ZVBzYnQoc2lnbmVyU2lnUHNidC50eEhleCwgMSwgaXNUeFdpdGhUYXByb290S2V5UGF0aFNwZW5kID8gMiA6IHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydC5vayh1bnNwZW50cyk7XG4gICAgICB2YWxpZGF0ZVR4KHNpZ25lclNpZ1BzYnQudHhIZXgsIHVuc3BlbnRzLCAxKTtcbiAgICB9XG4gIH1cblxuICBpdCgnc3VjY2VzcyB3aGVuIGNhbGxlZCBsaWtlIGN1c3RvbVNpZ25pbmdGdW5jdGlvbiBmbG93IC0gUFNCVCB3aXRoIHRhcHJvb3RLZXlQYXRoU3BlbmQgaW5wdXRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGlucHV0czogdGVzdHV0aWwuSW5wdXRbXSA9IHRlc3R1dGlsLmlucHV0U2NyaXB0VHlwZXMubWFwKChzY3JpcHRUeXBlKSA9PiAoe1xuICAgICAgc2NyaXB0VHlwZSxcbiAgICAgIHZhbHVlOiBCaWdJbnQoMTAwMCksXG4gICAgfSkpO1xuICAgIGNvbnN0IHVuc3BlbnRTdW0gPSBpbnB1dHMucmVkdWNlKChwcmV2OiBiaWdpbnQsIGN1cnIpID0+IHByZXYgKyBjdXJyLnZhbHVlLCBCaWdJbnQoMCkpO1xuICAgIGNvbnN0IG91dHB1dHM6IHRlc3R1dGlsLk91dHB1dFtdID0gW3sgc2NyaXB0VHlwZTogJ3Ayc2gnLCB2YWx1ZTogdW5zcGVudFN1bSAtIEJpZ0ludCgxMDAwKSB9XTtcbiAgICBjb25zdCBwc2J0ID0gdGVzdHV0aWwuY29uc3RydWN0UHNidChpbnB1dHMsIG91dHB1dHMsIGNvaW4ubmV0d29yaywgcm9vdFdhbGxldEtleXMsICd1bnNpZ25lZCcpO1xuXG4gICAgZm9yIChjb25zdCB2IG9mIFtmYWxzZSwgdHJ1ZV0pIHtcbiAgICAgIGF3YWl0IHNpZ25UcmFuc2FjdGlvbihwc2J0LCB2KTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdzdWNjZXNzIHdoZW4gY2FsbGVkIGxpa2UgY3VzdG9tU2lnbmluZ0Z1bmN0aW9uIGZsb3cgLSBQU0JUIHdpdGhvdXQgdGFwcm9vdEtleVBhdGhTcGVuZCBpbnB1dHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgaW5wdXRzOiB0ZXN0dXRpbC5JbnB1dFtdID0gdGVzdHV0aWwuaW5wdXRTY3JpcHRUeXBlc1xuICAgICAgLmZpbHRlcigodikgPT4gdiAhPT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnKVxuICAgICAgLm1hcCgoc2NyaXB0VHlwZSkgPT4gKHtcbiAgICAgICAgc2NyaXB0VHlwZSxcbiAgICAgICAgdmFsdWU6IEJpZ0ludCgxMDAwKSxcbiAgICAgIH0pKTtcbiAgICBjb25zdCB1bnNwZW50U3VtID0gaW5wdXRzLnJlZHVjZSgocHJldjogYmlnaW50LCBjdXIpID0+IHByZXYgKyBjdXIudmFsdWUsIEJpZ0ludCgwKSk7XG4gICAgY29uc3Qgb3V0cHV0czogdGVzdHV0aWwuT3V0cHV0W10gPSBbeyBzY3JpcHRUeXBlOiAncDJzaCcsIHZhbHVlOiB1bnNwZW50U3VtIC0gQmlnSW50KDEwMDApIH1dO1xuICAgIGNvbnN0IHBzYnQgPSB0ZXN0dXRpbC5jb25zdHJ1Y3RQc2J0KGlucHV0cywgb3V0cHV0cywgY29pbi5uZXR3b3JrLCByb290V2FsbGV0S2V5cywgJ3Vuc2lnbmVkJyk7XG5cbiAgICBmb3IgKGNvbnN0IHYgb2YgW2ZhbHNlLCB0cnVlXSkge1xuICAgICAgYXdhaXQgc2lnblRyYW5zYWN0aW9uKHBzYnQsIHYpO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ3N1Y2Nlc3Mgd2hlbiBjYWxsZWQgbGlrZSBjdXN0b21TaWduaW5nRnVuY3Rpb24gZmxvdyAtIE5ldHdvcmsgVHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgaW5wdXRzOiB0ZXN0dXRpbC5UeG5JbnB1dDxiaWdpbnQ+W10gPSB0ZXN0dXRpbC50eG5JbnB1dFNjcmlwdFR5cGVzXG4gICAgICAuZmlsdGVyKCh2KSA9PiB2ICE9PSAncDJzaFAycGsnKVxuICAgICAgLm1hcCgoc2NyaXB0VHlwZSkgPT4gKHtcbiAgICAgICAgc2NyaXB0VHlwZSxcbiAgICAgICAgdmFsdWU6IEJpZ0ludCgxMDAwKSxcbiAgICAgIH0pKTtcbiAgICBjb25zdCB1bnNwZW50U3VtID0gaW5wdXRzLnJlZHVjZSgocHJldjogYmlnaW50LCBjdXJyKSA9PiBwcmV2ICsgY3Vyci52YWx1ZSwgQmlnSW50KDApKTtcbiAgICBjb25zdCBvdXRwdXRzOiB0ZXN0dXRpbC5UeG5PdXRwdXQ8YmlnaW50PltdID0gW3sgc2NyaXB0VHlwZTogJ3Ayc2gnLCB2YWx1ZTogdW5zcGVudFN1bSAtIEJpZ0ludCgxMDAwKSB9XTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSB0ZXN0dXRpbC5jb25zdHJ1Y3RUeG5CdWlsZGVyKGlucHV0cywgb3V0cHV0cywgY29pbi5uZXR3b3JrLCByb290V2FsbGV0S2V5cywgJ3Vuc2lnbmVkJyk7XG4gICAgY29uc3QgdW5zcGVudHMgPSBpbnB1dHMubWFwKCh2LCBpKSA9PiB0ZXN0dXRpbC50b1R4blVuc3BlbnQodiwgaSwgY29pbi5uZXR3b3JrLCByb290V2FsbGV0S2V5cykpO1xuXG4gICAgZm9yIChjb25zdCB2IG9mIFtmYWxzZSwgdHJ1ZV0pIHtcbiAgICAgIGF3YWl0IHNpZ25UcmFuc2FjdGlvbih0eEJ1aWxkZXIuYnVpbGRJbmNvbXBsZXRlKCksIHYsIHVuc3BlbnRzKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdmYWlscyB3aGVuIGNhbGxlZCBsaWtlIGN1c3RvbVNpZ25pbmdGdW5jdGlvbiBmbG93IC0gUFNCVCBjYWNoZSBtaXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGlucHV0czogdGVzdHV0aWwuSW5wdXRbXSA9IFt7IHNjcmlwdFR5cGU6ICd0YXByb290S2V5UGF0aFNwZW5kJywgdmFsdWU6IEJpZ0ludCgxMDAwKSB9XTtcbiAgICBjb25zdCB1bnNwZW50U3VtID0gaW5wdXRzLnJlZHVjZSgocHJldjogYmlnaW50LCBjdXJyKSA9PiBwcmV2ICsgY3Vyci52YWx1ZSwgQmlnSW50KDApKTtcbiAgICBjb25zdCBvdXRwdXRzOiB0ZXN0dXRpbC5PdXRwdXRbXSA9IFt7IHNjcmlwdFR5cGU6ICdwMnNoJywgdmFsdWU6IHVuc3BlbnRTdW0gLSBCaWdJbnQoMTAwMCkgfV07XG4gICAgY29uc3QgcHNidCA9IHRlc3R1dGlsLmNvbnN0cnVjdFBzYnQoaW5wdXRzLCBvdXRwdXRzLCBjb2luLm5ldHdvcmssIHJvb3RXYWxsZXRLZXlzLCAndW5zaWduZWQnKTtcblxuICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleDogcHNidC50b0hleCgpIH0sXG4gICAgICAgICAgcHJ2OiB1c2VyUHJ2LFxuICAgICAgICAgIHNpZ25pbmdTdGVwOiAnc2lnbmVyU2lnbmF0dXJlJyxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtZXNzYWdlOiBgUHNidCBpcyBtaXNzaW5nIGZyb20gdHhDYWNoZSAoY2FjaGUgc2l6ZSAwKS5cbiAgICAgICAgICAgIFRoaXMgbWF5IGJlIGR1ZSB0byB0aGUgcmVxdWVzdCBiZWluZyByb3V0ZWQgdG8gYSBkaWZmZXJlbnQgQml0R28tRXhwcmVzcyBpbnN0YW5jZSB0aGF0IGZvciBzaWduaW5nIHN0ZXAgJ3NpZ25lck5vbmNlJy5gLFxuICAgICAgfVxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdmYWlscyB3aGVuIHVuc3VwcG9ydGVkIGxvY2tpbmcgc2NyaXB0IGlzIHVzZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgaW5wdXRzOiB0ZXN0dXRpbC5JbnB1dFtdID0gW1xuICAgICAgeyBzY3JpcHRUeXBlOiAncDJ3c2gnLCB2YWx1ZTogQmlnSW50KDEwMDApIH0sXG4gICAgICB7IHNjcmlwdFR5cGU6ICdwMnRyTXVzaWcyJywgdmFsdWU6IEJpZ0ludCgxMDAwKSB9LFxuICAgIF07XG4gICAgY29uc3QgdW5zcGVudFN1bSA9IGlucHV0cy5yZWR1Y2UoKHByZXY6IGJpZ2ludCwgY3VycikgPT4gcHJldiArIGN1cnIudmFsdWUsIEJpZ0ludCgwKSk7XG4gICAgY29uc3Qgb3V0cHV0czogdGVzdHV0aWwuT3V0cHV0W10gPSBbeyBzY3JpcHRUeXBlOiAncDJzaCcsIHZhbHVlOiB1bnNwZW50U3VtIC0gQmlnSW50KDUwMCkgfV07XG4gICAgY29uc3QgcHNidCA9IHRlc3R1dGlsLmNvbnN0cnVjdFBzYnQoaW5wdXRzLCBvdXRwdXRzLCBjb2luLm5ldHdvcmssIHJvb3RXYWxsZXRLZXlzLCAndW5zaWduZWQnKTtcblxuICAgIC8vIG92ZXJyaWRlIHRoZSAxc3QgUFNCVCBpbnB1dCB3aXRoIHVuc3VwcG9ydGVkIDIgb2YgMiBtdWx0aS1zaWcgbG9ja2luZyBzY3JpcHQuXG4gICAgY29uc3QgdW5zcGVudCA9IHRlc3R1dGlsLnRvVW5zcGVudChpbnB1dHNbMF0sIDAsIGNvaW4ubmV0d29yaywgcm9vdFdhbGxldEtleXMpO1xuICAgIGlmICghdXR4b2xpYi5iaXRnby5pc1dhbGxldFVuc3BlbnQodW5zcGVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB1bnNwZW50Jyk7XG4gICAgfVxuICAgIGNvbnN0IHsgcHVibGljS2V5cyB9ID0gcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh1bnNwZW50LmNoYWluLCB1bnNwZW50LmluZGV4KTtcbiAgICBjb25zdCBzY3JpcHQyT2YyID0gdXR4b2xpYi5wYXltZW50cy5wMm1zKHsgbTogMiwgcHVia2V5czogW3B1YmxpY0tleXNbMF0sIHB1YmxpY0tleXNbMV1dIH0pO1xuICAgIHBzYnQuZGF0YS5pbnB1dHNbMF0ud2l0bmVzc1NjcmlwdCA9IHNjcmlwdDJPZjIub3V0cHV0O1xuXG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvaW4uc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiBwc2J0LnRvSGV4KCkgfSxcbiAgICAgICAgICBwcnY6IHVzZXJQcnYsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWVzc2FnZTogYGxlbmd0aCBtaXNtYXRjaGAsXG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG59KTtcblxuZnVuY3Rpb24gcnVuPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICBpbnB1dFNjcmlwdHM6IHRlc3R1dGlsLklucHV0U2NyaXB0VHlwZVtdLFxuICB0eEZvcm1hdDogJ2xlZ2FjeScgfCAncHNidCcsXG4gIGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCcgPSAnbnVtYmVyJ1xuKSB7XG4gIGRlc2NyaWJlKGBUcmFuc2FjdGlvbiBTdGFnZXMgJHtjb2luLmdldENoYWluKCl9ICgke2Ftb3VudFR5cGV9KSBzY3JpcHRzPSR7aW5wdXRTY3JpcHRzLmpvaW4oXG4gICAgJywnXG4gICl9IHR4Rm9ybWF0PSR7dHhGb3JtYXR9YCwgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJnVXJsID0gY29tbW9uLkVudmlyb25tZW50c1tkZWZhdWx0Qml0R28uZ2V0RW52KCldLnVyaTtcblxuICAgIGNvbnN0IGlzVHJhbnNhY3Rpb25XaXRoS2V5UGF0aFNwZW5kID0gaW5wdXRTY3JpcHRzLnNvbWUoKHMpID0+IHMgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJyk7XG4gICAgY29uc3QgaXNUcmFuc2FjdGlvbldpdGhSZXBsYXlQcm90ZWN0aW9uID0gaW5wdXRTY3JpcHRzLnNvbWUoKHMpID0+IHMgPT09ICdwMnNoUDJwaycpO1xuICAgIGNvbnN0IGlzVHJhbnNhY3Rpb25XaXRoUDJ0ciA9IGlucHV0U2NyaXB0cy5zb21lKChzKSA9PiBzID09PSAncDJ0cicpO1xuICAgIGNvbnN0IGlzVHJhbnNhY3Rpb25XaXRoUDJ0ck11c2lnMiA9IGlucHV0U2NyaXB0cy5zb21lKChzKSA9PiBzID09PSAncDJ0ck11c2lnMicpO1xuXG4gICAgY29uc3QgdmFsdWUgPSAoYW1vdW50VHlwZSA9PT0gJ2JpZ2ludCcgPyBCaWdJbnQoJzEwOTk5OTk5ODAwMDAwMDAxJykgOiAxZTgpIGFzIFROdW1iZXI7XG4gICAgY29uc3Qgd2FsbGV0ID0gZ2V0VXR4b1dhbGxldChjb2luLCB7IGlkOiAnNWIzNDI1MmYxYmYzNDk5MzBlMzQwMjBhMDAwMDAwMDAnLCBjb2luOiBjb2luLmdldENoYWluKCkgfSk7XG4gICAgY29uc3Qgd2FsbGV0S2V5cyA9IGdldERlZmF1bHRXYWxsZXRLZXlzKCk7XG5cbiAgICBjb25zdCBmdWxsU2lnbiA9ICEoaXNUcmFuc2FjdGlvbldpdGhSZXBsYXlQcm90ZWN0aW9uIHx8IGlzVHJhbnNhY3Rpb25XaXRoS2V5UGF0aFNwZW5kKTtcblxuICAgIGZ1bmN0aW9uIGdldFVuc3BlbnRzRm9yUHNidCgpOiBVbnNwZW50PGJpZ2ludD5bXSB7XG4gICAgICByZXR1cm4gaW5wdXRTY3JpcHRzLm1hcCgodCwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRlc3R1dGlsLnRvVW5zcGVudChcbiAgICAgICAgICB7IHNjcmlwdFR5cGU6IHQsIHZhbHVlOiB0ID09PSAncDJzaFAycGsnID8gQmlnSW50KDEwMDApIDogQmlnSW50KHZhbHVlKSB9LFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGNvaW4ubmV0d29yayxcbiAgICAgICAgICB3YWxsZXRLZXlzXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b1R4bklucHV0U2NyaXB0VHlwZSh0eXBlOiB0ZXN0dXRpbC5JbnB1dFNjcmlwdFR5cGUpOiBJbnB1dFNjcmlwdFR5cGUge1xuICAgICAgcmV0dXJuIHR5cGUgPT09ICdwMnNoUDJwaycgPyAncmVwbGF5UHJvdGVjdGlvbicgOiB0eXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcgPyAncDJ0ck11c2lnMicgOiB0eXBlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFVuc3BlbnRzKCk6IFVuc3BlbnQ8VE51bWJlcj5bXSB7XG4gICAgICByZXR1cm4gaW5wdXRTY3JpcHRzLm1hcCgodHlwZSwgaSkgPT5cbiAgICAgICAgbW9ja1Vuc3BlbnQ8VE51bWJlcj4oY29pbi5uZXR3b3JrLCB3YWxsZXRLZXlzLCB0b1R4bklucHV0U2NyaXB0VHlwZSh0eXBlKSwgaSwgdmFsdWUpXG4gICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldE91dHB1dEFkZHJlc3Mocm9vdFdhbGxldEtleXM6IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGdlbmVyYXRlQWRkcmVzcyhjb2luLm5ldHdvcmssIHtcbiAgICAgICAga2V5Y2hhaW5zOiByb290V2FsbGV0S2V5cy50cmlwbGUubWFwKChrKSA9PiAoeyBwdWI6IGsubmV1dGVyZWQoKS50b0Jhc2U1OCgpIH0pKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNpZ25QYXJhbXMoXG4gICAgICBwcmVidWlsZEhleDogc3RyaW5nLFxuICAgICAgc2lnbmVyOiBCSVAzMkludGVyZmFjZSxcbiAgICAgIGNvc2lnbmVyOiBCSVAzMkludGVyZmFjZVxuICAgICk6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMge1xuICAgICAgY29uc3QgdHhJbmZvID0ge1xuICAgICAgICB1bnNwZW50czogdHhGb3JtYXQgPT09ICdwc2J0JyA/IHVuZGVmaW5lZCA6IGdldFVuc3BlbnRzKCksXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgIHdhbGxldElkOiBpc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZCA/IHdhbGxldC5pZCgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHR4SGV4OiBwcmVidWlsZEhleCxcbiAgICAgICAgICB0eEluZm8sXG4gICAgICAgIH0sXG4gICAgICAgIHBydjogc2lnbmVyLnRvQmFzZTU4KCksXG4gICAgICAgIHB1YnM6IHdhbGxldEtleXMudHJpcGxlLm1hcCgoaykgPT4gay5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkpLFxuICAgICAgICBjb3NpZ25lclB1YjogY29zaWduZXIubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgICAgfSBhcyBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zO1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUhhbGZTaWduZWRUcmFuc2FjdGlvbihcbiAgICAgIHByZWJ1aWxkOiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPiB8IHV0eG9saWIuYml0Z28uVXR4b1BzYnQsXG4gICAgICBzaWduZXI6IEJJUDMySW50ZXJmYWNlLFxuICAgICAgY29zaWduZXI6IEJJUDMySW50ZXJmYWNlXG4gICAgKTogUHJvbWlzZTxIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uPiB7XG4gICAgICBsZXQgc2NvcGU6IG5vY2suU2NvcGUgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAocHJlYnVpbGQgaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0ICYmIGlzVHJhbnNhY3Rpb25XaXRoS2V5UGF0aFNwZW5kKSB7XG4gICAgICAgIGNvbnN0IHBzYnQgPSBwcmVidWlsZC5jbG9uZSgpLnNldEFsbElucHV0c011c2lnMk5vbmNlSEQoY29zaWduZXIpO1xuICAgICAgICBzY29wZSA9IG5vY2soYmdVcmwpXG4gICAgICAgICAgLnBvc3QoYC9hcGkvdjIvJHt3YWxsZXQuY29pbigpfS93YWxsZXQvJHt3YWxsZXQuaWQoKX0vdHgvc2lnbnBzYnRgLCAoYm9keSkgPT4gYm9keS5wc2J0KVxuICAgICAgICAgIC5yZXBseSgyMDAsIHsgcHNidDogcHNidC50b0hleCgpIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBoYWxmLXNpZ24gd2l0aCB0aGUgdXNlciBrZXlcbiAgICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCB3YWxsZXQuc2lnblRyYW5zYWN0aW9uKFxuICAgICAgICBnZXRTaWduUGFyYW1zKHByZWJ1aWxkLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpLCBzaWduZXIsIGNvc2lnbmVyKVxuICAgICAgKSkgYXMgUHJvbWlzZTxIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uPjtcblxuICAgICAgaWYgKHNjb3BlKSB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY29wZS5pc0RvbmUoKSwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRnVsbFNpZ25lZFRyYW5zYWN0aW9uKFxuICAgICAgaGFsZlNpZ25lZDogSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbixcbiAgICAgIHNpZ25lcjogQklQMzJJbnRlcmZhY2UsXG4gICAgICBjb3NpZ25lcjogQklQMzJJbnRlcmZhY2VcbiAgICApOiBQcm9taXNlPEZ1bGx5U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICAgIHJldHVybiAoYXdhaXQgd2FsbGV0LnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAgIC4uLmdldFNpZ25QYXJhbXMoaGFsZlNpZ25lZC50eEhleCwgc2lnbmVyLCBjb3NpZ25lciksXG4gICAgICAgIGlzTGFzdFNpZ25hdHVyZTogdHJ1ZSxcbiAgICAgIH0pKSBhcyBGdWxseVNpZ25lZFRyYW5zYWN0aW9uO1xuICAgIH1cblxuICAgIHR5cGUgVHJhbnNhY3Rpb25TdGFnZXMgPSB7XG4gICAgICBwcmVidWlsZDogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248VE51bWJlcj4gfCB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0O1xuICAgICAgaGFsZlNpZ25lZFVzZXJCYWNrdXA/OiBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uO1xuICAgICAgaGFsZlNpZ25lZFVzZXJCaXRHbzogSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbjtcbiAgICAgIGZ1bGxTaWduZWRVc2VyQmFja3VwPzogRnVsbHlTaWduZWRUcmFuc2FjdGlvbjtcbiAgICAgIGZ1bGxTaWduZWRVc2VyQml0R28/OiBGdWxseVNpZ25lZFRyYW5zYWN0aW9uO1xuICAgIH07XG5cbiAgICB0eXBlIFRyYW5zYWN0aW9uT2JqU3RhZ2VzID0gUmVjb3JkPGtleW9mIFRyYW5zYWN0aW9uU3RhZ2VzLCBUcmFuc2FjdGlvbk9iaj47XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVQcmVidWlsZFBzYnQoKSB7XG4gICAgICBjb25zdCBpbnB1dHMgPSBpbnB1dFNjcmlwdHMubWFwKFxuICAgICAgICAodCk6IHRlc3R1dGlsLklucHV0ID0+ICh7XG4gICAgICAgICAgc2NyaXB0VHlwZTogdCxcbiAgICAgICAgICB2YWx1ZTogdCA9PT0gJ3Ayc2hQMnBrJyA/IEJpZ0ludCgxMDAwKSA6IEJpZ0ludCh2YWx1ZSksXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgY29uc3QgdW5zcGVudFN1bSA9IGlucHV0cy5yZWR1Y2UoKHByZXY6IGJpZ2ludCwgY3VycikgPT4gcHJldiArIGN1cnIudmFsdWUsIEJpZ0ludCgwKSk7XG4gICAgICBjb25zdCBvdXRwdXRzOiB0ZXN0dXRpbC5PdXRwdXRbXSA9IFtcbiAgICAgICAgeyBhZGRyZXNzOiBnZXRPdXRwdXRBZGRyZXNzKGdldFdhbGxldEtleXMoJ3Rlc3QnKSksIHZhbHVlOiB1bnNwZW50U3VtIC0gQmlnSW50KDEwMDApIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgcHNidCA9IHRlc3R1dGlsLmNvbnN0cnVjdFBzYnQoaW5wdXRzLCBvdXRwdXRzLCBjb2luLm5ldHdvcmssIHdhbGxldEtleXMsICd1bnNpZ25lZCcpO1xuICAgICAgdXR4b2xpYi5iaXRnby5hZGRYcHVic1RvUHNidChwc2J0LCB3YWxsZXRLZXlzKTtcbiAgICAgIHJldHVybiBwc2J0O1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uU3RhZ2VzKCk6IFByb21pc2U8VHJhbnNhY3Rpb25TdGFnZXM+IHtcbiAgICAgIGNvbnN0IHByZWJ1aWxkID1cbiAgICAgICAgdHhGb3JtYXQgPT09ICdwc2J0J1xuICAgICAgICAgID8gY3JlYXRlUHJlYnVpbGRQc2J0KClcbiAgICAgICAgICA6IGNyZWF0ZVByZWJ1aWxkVHJhbnNhY3Rpb248VE51bWJlcj4oY29pbi5uZXR3b3JrLCBnZXRVbnNwZW50cygpLCBnZXRPdXRwdXRBZGRyZXNzKHdhbGxldEtleXMpKTtcblxuICAgICAgY29uc3QgaGFsZlNpZ25lZFVzZXJCaXRHbyA9IGF3YWl0IGNyZWF0ZUhhbGZTaWduZWRUcmFuc2FjdGlvbihwcmVidWlsZCwgd2FsbGV0S2V5cy51c2VyLCB3YWxsZXRLZXlzLmJpdGdvKTtcbiAgICAgIGNvbnN0IGZ1bGxTaWduZWRVc2VyQml0R28gPVxuICAgICAgICBmdWxsU2lnbiAmJiAhaXNUcmFuc2FjdGlvbldpdGhQMnRyTXVzaWcyXG4gICAgICAgICAgPyBhd2FpdCBjcmVhdGVGdWxsU2lnbmVkVHJhbnNhY3Rpb24oaGFsZlNpZ25lZFVzZXJCaXRHbywgd2FsbGV0S2V5cy5iaXRnbywgd2FsbGV0S2V5cy51c2VyKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBoYWxmU2lnbmVkVXNlckJhY2t1cCA9XG4gICAgICAgICFpc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZCAmJiAhKHR4Rm9ybWF0ID09PSAncHNidCcgJiYgaXNUcmFuc2FjdGlvbldpdGhQMnRyKVxuICAgICAgICAgID8gYXdhaXQgY3JlYXRlSGFsZlNpZ25lZFRyYW5zYWN0aW9uKHByZWJ1aWxkLCB3YWxsZXRLZXlzLnVzZXIsIHdhbGxldEtleXMuYmFja3VwKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZnVsbFNpZ25lZFVzZXJCYWNrdXAgPVxuICAgICAgICBmdWxsU2lnbiAmJiBoYWxmU2lnbmVkVXNlckJhY2t1cFxuICAgICAgICAgID8gYXdhaXQgY3JlYXRlRnVsbFNpZ25lZFRyYW5zYWN0aW9uKGhhbGZTaWduZWRVc2VyQmFja3VwLCB3YWxsZXRLZXlzLmJhY2t1cCwgd2FsbGV0S2V5cy51c2VyKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcmVidWlsZCxcbiAgICAgICAgaGFsZlNpZ25lZFVzZXJCYWNrdXAsXG4gICAgICAgIGhhbGZTaWduZWRVc2VyQml0R28sXG4gICAgICAgIGZ1bGxTaWduZWRVc2VyQmFja3VwLFxuICAgICAgICBmdWxsU2lnbmVkVXNlckJpdEdvLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgdHJhbnNhY3Rpb25TdGFnZXM6IFRyYW5zYWN0aW9uU3RhZ2VzO1xuXG4gICAgYmVmb3JlKCdwcmVwYXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgdHJhbnNhY3Rpb25TdGFnZXMgPSBhd2FpdCBnZXRUcmFuc2FjdGlvblN0YWdlcygpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKG5vY2suY2xlYW5BbGwpO1xuXG4gICAgaXQoJ21hdGNoIGZpeHR1cmVzJywgYXN5bmMgZnVuY3Rpb24gKHRoaXM6IE1vY2hhLkNvbnRleHQpIHtcbiAgICAgIGlmICh0eEZvcm1hdCA9PT0gJ3BzYnQnKSB7XG4gICAgICAgIC8vIFRPRE8gKG1heWJlKSAtIG9uY2UgZnVsbCBQU0JUIHN1cHBvcnQgaXMgYWRkZWQgdG8gYWJzdHJhY3QtdXR4byBtb2R1bGUsIGN1c3RvbSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIFBTQlQgY2FuIGJlIGNyZWF0ZWQgYW5kIHRlc3RlZCBoZXJlLlxuICAgICAgICAvLyBzaWduYXR1cmVzIG9mIHRhcHJvb3RLZXlQYXRoU3BlbmRzIGFyZSByYW5kb20gc2luY2UgcmFuZG9tIG5hdHVyZSBvZiBNdVNpZzIgbm9uY2UsIHNvIHBzYnQgaGV4IGNvbXBhcmlzb24gYWxzbyB3b250IHdvcmsuXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCgpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB0b1RyYW5zYWN0aW9uU3RhZ2VzT2JqKHN0YWdlczogVHJhbnNhY3Rpb25TdGFnZXMpOiBUcmFuc2FjdGlvbk9ialN0YWdlcyB7XG4gICAgICAgIHJldHVybiBfLm1hcFZhbHVlcyhzdGFnZXMsICh2KSA9PlxuICAgICAgICAgIHYgPT09IHVuZGVmaW5lZCB8fCB2IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvUHNidFxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogdiBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uXG4gICAgICAgICAgICA/IHRyYW5zYWN0aW9uVG9PYmo8VE51bWJlcj4odilcbiAgICAgICAgICAgIDogdHJhbnNhY3Rpb25IZXhUb09iaih2LnR4SGV4LCBjb2luLm5ldHdvcmssIGFtb3VudFR5cGUpXG4gICAgICAgICkgYXMgVHJhbnNhY3Rpb25PYmpTdGFnZXM7XG4gICAgICB9XG5cbiAgICAgIHNob3VsZEVxdWFsSlNPTihcbiAgICAgICAgdG9UcmFuc2FjdGlvblN0YWdlc09iaih0cmFuc2FjdGlvblN0YWdlcyksXG4gICAgICAgIGF3YWl0IGdldEZpeHR1cmUoXG4gICAgICAgICAgY29pbixcbiAgICAgICAgICBgdHJhbnNhY3Rpb25zLSR7aW5wdXRTY3JpcHRzLm1hcCgodCkgPT4gdG9UeG5JbnB1dFNjcmlwdFR5cGUodCkpLmpvaW4oJy0nKX1gLFxuICAgICAgICAgIHRvVHJhbnNhY3Rpb25TdGFnZXNPYmoodHJhbnNhY3Rpb25TdGFnZXMpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiB0ZXN0UHNidFZhbGlkU2lnbmF0dXJlcyh0eDogSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbiwgc2lnbmVkQnk6IEJJUDMySW50ZXJmYWNlW10pIHtcbiAgICAgIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGcm9tSGV4KHR4LnR4SGV4LCBjb2luLm5ldHdvcmspO1xuICAgICAgY29uc3QgdW5zcGVudHMgPSBnZXRVbnNwZW50c0ZvclBzYnQoKTtcbiAgICAgIHBzYnQuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHVuc3BlbnQgPSB1bnNwZW50c1tpbmRleF07XG4gICAgICAgIGlmICghdXR4b2xpYi5iaXRnby5pc1dhbGxldFVuc3BlbnQodW5zcGVudCkpIHtcbiAgICAgICAgICBhc3NlcnQub2sodXR4b2xpYi5iaXRnby5nZXRQc2J0SW5wdXRTY3JpcHRUeXBlKGlucHV0KSwgJ3Ayc2hQMnBrJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHB1YmtleXMgPSB3YWxsZXRLZXlzLmRlcml2ZUZvckNoYWluQW5kSW5kZXgodW5zcGVudC5jaGFpbiwgdW5zcGVudC5pbmRleCkucHVibGljS2V5cztcbiAgICAgICAgcHVia2V5cy5mb3JFYWNoKChwaywgcGtJbmRleCkgPT4ge1xuICAgICAgICAgIHBzYnQudmFsaWRhdGVTaWduYXR1cmVzT2ZJbnB1dENvbW1vbihpbmRleCwgcGspLnNob3VsZC5lcWwoc2lnbmVkQnkuaW5jbHVkZXMod2FsbGV0S2V5cy50cmlwbGVbcGtJbmRleF0pKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0ZXN0VmFsaWRTaWduYXR1cmVzKFxuICAgICAgdHg6IEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24gfCBGdWxseVNpZ25lZFRyYW5zYWN0aW9uLFxuICAgICAgc2lnbmVkQnk6IEJJUDMySW50ZXJmYWNlW10sXG4gICAgICBzaWduOiAnaGFsZnNpZ25lZCcgfCAnZnVsbHNpZ25lZCdcbiAgICApIHtcbiAgICAgIGlmICh0eEZvcm1hdCA9PT0gJ3BzYnQnICYmIHNpZ24gPT09ICdoYWxmc2lnbmVkJykge1xuICAgICAgICB0ZXN0UHNidFZhbGlkU2lnbmF0dXJlcyh0eCwgc2lnbmVkQnkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB1bnNwZW50cyA9XG4gICAgICAgIHR4Rm9ybWF0ID09PSAncHNidCdcbiAgICAgICAgICA/IGdldFVuc3BlbnRzRm9yUHNidCgpLm1hcCgodSkgPT4gKHsgLi4udSwgdmFsdWU6IGJpdGdvLnRvVE51bWJlcih1LnZhbHVlLCBhbW91bnRUeXBlKSBhcyBUTnVtYmVyIH0pKVxuICAgICAgICAgIDogZ2V0VW5zcGVudHMoKTtcbiAgICAgIGNvbnN0IHByZXZPdXRwdXRzID0gdW5zcGVudHMubWFwKFxuICAgICAgICAodSk6IHV0eG9saWIuVHhPdXRwdXQ8VE51bWJlcj4gPT4gKHtcbiAgICAgICAgICBzY3JpcHQ6IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdCh1LmFkZHJlc3MsIGNvaW4ubmV0d29yayksXG4gICAgICAgICAgdmFsdWU6IHUudmFsdWUsXG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tQnVmZmVyPFROdW1iZXI+KFxuICAgICAgICBCdWZmZXIuZnJvbSh0eC50eEhleCwgJ2hleCcpLFxuICAgICAgICBjb2luLm5ldHdvcmssXG4gICAgICAgIHsgYW1vdW50VHlwZSB9XG4gICAgICApO1xuICAgICAgdHJhbnNhY3Rpb24uaW5zLmZvckVhY2goKGlucHV0LCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoaW5wdXRTY3JpcHRzW2luZGV4XSA9PT0gJ3Ayc2hQMnBrJykge1xuICAgICAgICAgIGFzc2VydC5vayhjb2luLmlzQml0R29UYWludGVkVW5zcGVudCh1bnNwZW50c1tpbmRleF0pKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1bnNwZW50ID0gdW5zcGVudHNbaW5kZXhdIGFzIFdhbGxldFVuc3BlbnQ8VE51bWJlcj47XG4gICAgICAgIGNvbnN0IHB1YmtleXMgPSB3YWxsZXRLZXlzLmRlcml2ZUZvckNoYWluQW5kSW5kZXgodW5zcGVudC5jaGFpbiwgdW5zcGVudC5pbmRleCkucHVibGljS2V5cztcblxuICAgICAgICBwdWJrZXlzLmZvckVhY2goKHBrLCBwa0luZGV4KSA9PiB7XG4gICAgICAgICAgdXR4b2xpYi5iaXRnb1xuICAgICAgICAgICAgLnZlcmlmeVNpZ25hdHVyZTxUTnVtYmVyPihcbiAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sXG4gICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICBwcmV2T3V0cHV0c1tpbmRleF0udmFsdWUsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwdWJsaWNLZXk6IHBrLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBwcmV2T3V0cHV0c1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnNob3VsZC5lcWwoc2lnbmVkQnkuaW5jbHVkZXMod2FsbGV0S2V5cy50cmlwbGVbcGtJbmRleF0pKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiB0ZXN0RXhwbGFpblR4KFxuICAgICAgc3RhZ2VOYW1lOiBzdHJpbmcsXG4gICAgICB0eEhleDogc3RyaW5nLFxuICAgICAgdW5zcGVudHM/OiB1dHhvbGliLmJpdGdvLlVuc3BlbnQ8VE51bWJlcj5bXSxcbiAgICAgIHB1YnM/OiBUcmlwbGU8c3RyaW5nPlxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSBhd2FpdCBjb2luLmV4cGxhaW5UcmFuc2FjdGlvbjxUTnVtYmVyPih7XG4gICAgICAgIHR4SGV4LFxuICAgICAgICB0eEluZm86IHtcbiAgICAgICAgICB1bnNwZW50cyxcbiAgICAgICAgfSxcbiAgICAgICAgcHVicyxcbiAgICAgIH0pO1xuXG4gICAgICBleHBsYW5hdGlvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0aWVzKFxuICAgICAgICAnZGlzcGxheU9yZGVyJyxcbiAgICAgICAgJ2lkJyxcbiAgICAgICAgJ291dHB1dHMnLFxuICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgJ2lucHV0U2lnbmF0dXJlcycsXG4gICAgICAgICdzaWduYXR1cmVzJ1xuICAgICAgKTtcblxuICAgICAgY29uc3QgZXhwZWN0ZWRTaWduYXR1cmVDb3VudCA9XG4gICAgICAgIHN0YWdlTmFtZSA9PT0gJ3ByZWJ1aWxkJyB8fCBwdWJzID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IHN0YWdlTmFtZS5zdGFydHNXaXRoKCdoYWxmU2lnbmVkJylcbiAgICAgICAgICA/IDFcbiAgICAgICAgICA6IHN0YWdlTmFtZS5zdGFydHNXaXRoKCdmdWxsU2lnbmVkJylcbiAgICAgICAgICA/IDJcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKCdpbnB1dFNpZ25hdHVyZXMnIGluIGV4cGxhbmF0aW9uKSB7XG4gICAgICAgIGV4cGxhbmF0aW9uLmlucHV0U2lnbmF0dXJlcy5zaG91bGQuZXFsKFxuICAgICAgICAgIC8vIEZJWE1FKEJHLTM1MTU0KTogaW1wbGVtZW50IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZm9yIHJlcGxheSBwcm90ZWN0aW9uIGlucHV0c1xuICAgICAgICAgIGlucHV0U2NyaXB0cy5tYXAoKHR5cGUpID0+ICh0eXBlID09PSAncDJzaFAycGsnID8gMCA6IGV4cGVjdGVkU2lnbmF0dXJlQ291bnQpKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCdzaWduYXR1cmVzJyBpbiBleHBsYW5hdGlvbikge1xuICAgICAgICBleHBsYW5hdGlvbi5zaWduYXR1cmVzLnNob3VsZC5lcWwoZXhwZWN0ZWRTaWduYXR1cmVDb3VudCk7XG4gICAgICAgIGV4cGxhbmF0aW9uLmNoYW5nZUFtb3VudC5zaG91bGQuZXFsKCcwJyk7IC8vIG5vIGNoYW5nZSBhZGRyZXNzZXMgZ2l2ZW5cbiAgICAgIH1cbiAgICAgIGxldCBleHBlY3RlZE91dHB1dEFtb3VudCA9XG4gICAgICAgIEJpZ0ludCgodHhGb3JtYXQgPT09ICdwc2J0JyA/IGdldFVuc3BlbnRzRm9yUHNidCgpIDogZ2V0VW5zcGVudHMoKSkubGVuZ3RoKSAqIEJpZ0ludCh2YWx1ZSk7XG4gICAgICBpbnB1dFNjcmlwdHMuZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3Ayc2hQMnBrJykge1xuICAgICAgICAgIC8vIHJlcGxheVByb3RlY3Rpb24gdW5zcGVudHMgaGF2ZSB2YWx1ZSAxMDAwXG4gICAgICAgICAgZXhwZWN0ZWRPdXRwdXRBbW91bnQgLT0gQmlnSW50KHZhbHVlKTtcbiAgICAgICAgICBleHBlY3RlZE91dHB1dEFtb3VudCArPSBCaWdJbnQoMTAwMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZXhwZWN0ZWRPdXRwdXRBbW91bnQgLT0gQmlnSW50KDEwMDApOyAvLyBmZWUgb2YgMTAwMFxuICAgICAgZXhwbGFuYXRpb24ub3V0cHV0QW1vdW50LnNob3VsZC5lcWwoZXhwZWN0ZWRPdXRwdXRBbW91bnQudG9TdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgaXQoJ2hhdmUgdmFsaWQgc2lnbmF0dXJlIGZvciBoYWxmLXNpZ25lZCB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0cmFuc2FjdGlvblN0YWdlcy5oYWxmU2lnbmVkVXNlckJhY2t1cCkge1xuICAgICAgICB0ZXN0VmFsaWRTaWduYXR1cmVzKHRyYW5zYWN0aW9uU3RhZ2VzLmhhbGZTaWduZWRVc2VyQmFja3VwLCBbd2FsbGV0S2V5cy51c2VyXSwgJ2hhbGZzaWduZWQnKTtcbiAgICAgIH1cbiAgICAgIHRlc3RWYWxpZFNpZ25hdHVyZXModHJhbnNhY3Rpb25TdGFnZXMuaGFsZlNpZ25lZFVzZXJCaXRHbywgW3dhbGxldEtleXMudXNlcl0sICdoYWxmc2lnbmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGF2ZSB2YWxpZCBzaWduYXR1cmVzIGZvciBmdWxsLXNpZ25lZCB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghZnVsbFNpZ24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCgpO1xuICAgICAgfVxuICAgICAgaWYgKHRyYW5zYWN0aW9uU3RhZ2VzLmZ1bGxTaWduZWRVc2VyQmFja3VwKSB7XG4gICAgICAgIHRlc3RWYWxpZFNpZ25hdHVyZXModHJhbnNhY3Rpb25TdGFnZXMuZnVsbFNpZ25lZFVzZXJCYWNrdXAsIFt3YWxsZXRLZXlzLnVzZXIsIHdhbGxldEtleXMuYmFja3VwXSwgJ2Z1bGxzaWduZWQnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0cmFuc2FjdGlvblN0YWdlcy5mdWxsU2lnbmVkVXNlckJpdEdvKSB7XG4gICAgICAgIHRlc3RWYWxpZFNpZ25hdHVyZXModHJhbnNhY3Rpb25TdGFnZXMuZnVsbFNpZ25lZFVzZXJCaXRHbywgW3dhbGxldEtleXMudXNlciwgd2FsbGV0S2V5cy5iaXRnb10sICdmdWxsc2lnbmVkJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnaGF2ZSBjb3JyZWN0IHJlc3VsdHMgZm9yIGV4cGxhaW5UcmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgW3N0YWdlTmFtZSwgc3RhZ2VUeF0gb2YgT2JqZWN0LmVudHJpZXModHJhbnNhY3Rpb25TdGFnZXMpKSB7XG4gICAgICAgIGlmICghc3RhZ2VUeCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHhIZXggPVxuICAgICAgICAgIHN0YWdlVHggaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHx8IHN0YWdlVHggaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvblxuICAgICAgICAgICAgPyBzdGFnZVR4LnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpXG4gICAgICAgICAgICA6IHN0YWdlVHgudHhIZXg7XG5cbiAgICAgICAgY29uc3QgcHVicyA9IHdhbGxldEtleXMudHJpcGxlLm1hcCgoaykgPT4gay5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkpIGFzIFRyaXBsZTxzdHJpbmc+O1xuICAgICAgICBjb25zdCB1bnNwZW50cyA9XG4gICAgICAgICAgdHhGb3JtYXQgPT09ICdwc2J0J1xuICAgICAgICAgICAgPyBnZXRVbnNwZW50c0ZvclBzYnQoKS5tYXAoKHUpID0+ICh7IC4uLnUsIHZhbHVlOiBiaXRnby50b1ROdW1iZXIodS52YWx1ZSwgYW1vdW50VHlwZSkgYXMgVE51bWJlciB9KSlcbiAgICAgICAgICAgIDogZ2V0VW5zcGVudHMoKTtcbiAgICAgICAgYXdhaXQgdGVzdEV4cGxhaW5UeChzdGFnZU5hbWUsIHR4SGV4LCB1bnNwZW50cywgcHVicyk7XG4gICAgICAgIGF3YWl0IHRlc3RFeHBsYWluVHgoc3RhZ2VOYW1lLCB0eEhleCwgdW5zcGVudHMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuV2l0aEFtb3VudFR5cGUoXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIGlucHV0U2NyaXB0czogdGVzdHV0aWwuSW5wdXRTY3JpcHRUeXBlW10sXG4gIHR4Rm9ybWF0OiAnbGVnYWN5JyB8ICdwc2J0J1xuKSB7XG4gIGNvbnN0IGFtb3VudFR5cGUgPSBjb2luLmFtb3VudFR5cGU7XG4gIGlmIChhbW91bnRUeXBlID09PSAnYmlnaW50Jykge1xuICAgIHJ1bjxiaWdpbnQ+KGNvaW4sIGlucHV0U2NyaXB0cywgdHhGb3JtYXQsIGFtb3VudFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHJ1bihjb2luLCBpbnB1dFNjcmlwdHMsIHR4Rm9ybWF0LCBhbW91bnRUeXBlKTtcbiAgfVxufVxuXG51dHhvQ29pbnMuZm9yRWFjaCgoY29pbikgPT5cbiAgZ2V0U2NyaXB0VHlwZXMyT2YzKCkuZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgIChbJ2xlZ2FjeScsICdwc2J0J10gYXMgY29uc3QpLmZvckVhY2goKHR4Rm9ybWF0KSA9PiB7XG4gICAgICBpZiAoKHR5cGUgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJyB8fCB0eXBlID09PSAncDJ0ck11c2lnMicpICYmIHR4Rm9ybWF0ICE9PSAncHNidCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGNvaW4uc3VwcG9ydHNBZGRyZXNzVHlwZSh0eXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcgPyAncDJ0ck11c2lnMicgOiB0eXBlKSkge1xuICAgICAgICBydW5XaXRoQW1vdW50VHlwZShjb2luLCBbdHlwZSwgdHlwZV0sIHR4Rm9ybWF0KTtcblxuICAgICAgICBpZiAoZ2V0UmVwbGF5UHJvdGVjdGlvbkFkZHJlc3Nlcyhjb2luLm5ldHdvcmspLmxlbmd0aCkge1xuICAgICAgICAgIHJ1bldpdGhBbW91bnRUeXBlKGNvaW4sIFsncDJzaFAycGsnLCB0eXBlXSwgdHhGb3JtYXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0pXG4pO1xuIl19
|