@bitgo-beta/sdk-core 8.2.1-beta.181 → 8.2.1-beta.1811
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/account-lib/baseCoin/baseTransaction.d.ts +0 -1
- package/dist/src/account-lib/baseCoin/baseTransaction.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts +3 -3
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.js +4 -3
- package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts +1 -0
- package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/ed25519KeyPair.js +41 -29
- package/dist/src/account-lib/baseCoin/enum.d.ts +50 -5
- package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/enum.js +90 -10
- package/dist/src/account-lib/baseCoin/errors.d.ts +3 -0
- package/dist/src/account-lib/baseCoin/errors.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/errors.js +8 -2
- package/dist/src/account-lib/baseCoin/iface.d.ts +19 -35
- package/dist/src/account-lib/baseCoin/iface.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/iface.js +26 -18
- package/dist/src/account-lib/baseCoin/index.d.ts +1 -1
- package/dist/src/account-lib/baseCoin/index.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/index.js +8 -5
- package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts +88 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessage.js +154 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +67 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.js +144 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +33 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +45 -0
- package/dist/src/account-lib/baseCoin/messages/iface.d.ts +164 -0
- package/dist/src/account-lib/baseCoin/messages/iface.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/iface.js +3 -0
- package/dist/src/account-lib/baseCoin/messages/index.d.ts +6 -0
- package/dist/src/account-lib/baseCoin/messages/index.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/index.js +22 -0
- package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts +3 -0
- package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/simple/index.js +19 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts +13 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.js +28 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts +21 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.js +28 -0
- package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts +1 -2
- package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.js +38 -26
- package/dist/src/account-lib/index.js +23 -9
- package/dist/src/account-lib/mpc/index.d.ts +1 -1
- package/dist/src/account-lib/mpc/index.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/index.js +6 -2
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +2 -3
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +376 -354
- package/dist/src/account-lib/mpc/tss/ecdsa/index.js +23 -9
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts +2 -2
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.js +3 -3
- package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +46 -53
- package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/types.js +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts +0 -1
- package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/eddsa.js +66 -69
- package/dist/src/account-lib/mpc/tss/eddsa/index.js +23 -9
- package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/types.js +1 -1
- package/dist/src/account-lib/mpc/tss/index.js +23 -9
- package/dist/src/account-lib/mpc/util.d.ts +7 -1
- package/dist/src/account-lib/mpc/util.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/util.js +24 -1
- package/dist/src/account-lib/staking/index.js +6 -2
- package/dist/src/account-lib/staking/utils.js +3 -3
- package/dist/src/account-lib/util/crypto.d.ts +8 -2
- package/dist/src/account-lib/util/crypto.d.ts.map +1 -1
- package/dist/src/account-lib/util/crypto.js +69 -38
- package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +2 -1
- package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +1 -1
- package/dist/src/account-lib/util/ed25519KeyDeriver.js +5 -3
- package/dist/src/api/bip32path.js +2 -3
- package/dist/src/api/index.js +6 -2
- package/dist/src/api/types.d.ts +31 -0
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/api/types.js +1 -1
- package/dist/src/bitgo/address-book/address-book.d.ts +61 -0
- package/dist/src/bitgo/address-book/address-book.d.ts.map +1 -0
- package/dist/src/bitgo/address-book/address-book.js +139 -0
- package/dist/src/bitgo/address-book/index.d.ts +3 -0
- package/dist/src/bitgo/address-book/index.d.ts.map +1 -0
- package/dist/src/bitgo/address-book/index.js +19 -0
- package/dist/src/bitgo/address-book/types.d.ts +170 -0
- package/dist/src/bitgo/address-book/types.d.ts.map +1 -0
- package/dist/src/bitgo/address-book/types.js +3 -0
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts +99 -11
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/baseCoin.js +168 -16
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +192 -28
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +14 -3
- package/dist/src/bitgo/baseCoin/index.js +6 -2
- package/dist/src/bitgo/bip32util.d.ts +3 -16
- package/dist/src/bitgo/bip32util.d.ts.map +1 -1
- package/dist/src/bitgo/bip32util.js +4 -56
- package/dist/src/bitgo/bitcoin.d.ts +0 -1
- package/dist/src/bitgo/bitcoin.d.ts.map +1 -1
- package/dist/src/bitgo/bitcoin.js +26 -13
- package/dist/src/bitgo/bitgoBase.d.ts +8 -1
- package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
- package/dist/src/bitgo/bitgoBase.js +1 -1
- package/dist/src/bitgo/coinFactory.d.ts +17 -3
- package/dist/src/bitgo/coinFactory.d.ts.map +1 -1
- package/dist/src/bitgo/coinFactory.js +26 -3
- package/dist/src/bitgo/config.d.ts +3 -95
- package/dist/src/bitgo/config.d.ts.map +1 -1
- package/dist/src/bitgo/config.js +26 -15
- package/dist/src/bitgo/defi/defiVault.d.ts +79 -0
- package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -0
- package/dist/src/bitgo/defi/defiVault.js +198 -0
- package/dist/src/bitgo/defi/iDefiVault.d.ts +59 -0
- package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -0
- package/dist/src/bitgo/defi/iDefiVault.js +6 -0
- package/dist/src/bitgo/defi/index.d.ts +3 -0
- package/dist/src/bitgo/defi/index.d.ts.map +1 -0
- package/dist/src/bitgo/defi/index.js +22 -0
- package/dist/src/bitgo/ecdh.d.ts +0 -1
- package/dist/src/bitgo/ecdh.d.ts.map +1 -1
- package/dist/src/bitgo/ecdh.js +26 -13
- package/dist/src/bitgo/enterprise/enterprise.d.ts +3 -4
- package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
- package/dist/src/bitgo/enterprise/enterprise.js +39 -21
- package/dist/src/bitgo/enterprise/enterprises.js +27 -13
- package/dist/src/bitgo/enterprise/iEnterprise.d.ts +2 -3
- package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
- package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
- package/dist/src/bitgo/enterprise/index.js +6 -2
- package/dist/src/bitgo/environments.d.ts +69 -5
- package/dist/src/bitgo/environments.d.ts.map +1 -1
- package/dist/src/bitgo/environments.js +403 -40
- package/dist/src/bitgo/errors.d.ts +175 -0
- package/dist/src/bitgo/errors.d.ts.map +1 -1
- package/dist/src/bitgo/errors.js +166 -2
- package/dist/src/bitgo/evm/evmUtils.d.ts +26 -0
- package/dist/src/bitgo/evm/evmUtils.d.ts.map +1 -0
- package/dist/src/bitgo/evm/evmUtils.js +50 -0
- package/dist/src/bitgo/index.d.ts +4 -1
- package/dist/src/bitgo/index.d.ts.map +1 -1
- package/dist/src/bitgo/index.js +30 -11
- package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts +3 -3
- package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts.map +1 -1
- package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.js +1 -1
- package/dist/src/bitgo/inscriptionBuilder/index.js +6 -2
- package/dist/src/bitgo/internal/index.js +6 -2
- package/dist/src/bitgo/internal/internal.js +5 -6
- package/dist/src/bitgo/internal/keycard.d.ts +19 -6
- package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
- package/dist/src/bitgo/internal/keycard.js +105 -44
- package/dist/src/bitgo/keychain/decryptKeychain.d.ts +24 -0
- package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -0
- package/dist/src/bitgo/keychain/decryptKeychain.js +67 -0
- package/dist/src/bitgo/keychain/iKeychains.d.ts +94 -8
- package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/iKeychains.js +2 -2
- package/dist/src/bitgo/keychain/index.d.ts +1 -0
- package/dist/src/bitgo/keychain/index.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/index.js +7 -2
- package/dist/src/bitgo/keychain/keychains.d.ts +49 -6
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +249 -46
- package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +3 -3
- package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/ovcJsonCodec.js +23 -9
- package/dist/src/bitgo/legacyBitcoin.d.ts +0 -1
- package/dist/src/bitgo/legacyBitcoin.d.ts.map +1 -1
- package/dist/src/bitgo/legacyBitcoin.js +27 -13
- package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts +7 -0
- package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts.map +1 -0
- package/dist/src/bitgo/lightning/lightningWalletUtil.js +25 -0
- package/dist/src/bitgo/market/iMarkets.d.ts +2 -2
- package/dist/src/bitgo/market/iMarkets.d.ts.map +1 -1
- package/dist/src/bitgo/market/index.js +6 -2
- package/dist/src/bitgo/market/markets.js +23 -9
- package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +1 -0
- package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts.map +1 -1
- package/dist/src/bitgo/pendingApproval/iPendingApproval.js +4 -4
- package/dist/src/bitgo/pendingApproval/index.js +6 -2
- package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts +20 -8
- package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
- package/dist/src/bitgo/pendingApproval/pendingApproval.js +228 -110
- package/dist/src/bitgo/pendingApproval/pendingApprovals.js +23 -9
- package/dist/src/bitgo/proofs/WalletProofs.d.ts +19 -0
- package/dist/src/bitgo/proofs/WalletProofs.d.ts.map +1 -0
- package/dist/src/bitgo/proofs/WalletProofs.js +37 -0
- package/dist/src/bitgo/proofs/index.d.ts +2 -0
- package/dist/src/bitgo/proofs/index.d.ts.map +1 -0
- package/dist/src/bitgo/proofs/index.js +6 -0
- package/dist/src/bitgo/proofs/types.d.ts +80 -0
- package/dist/src/bitgo/proofs/types.d.ts.map +1 -0
- package/dist/src/bitgo/proofs/types.js +80 -0
- package/dist/src/bitgo/recovery/index.js +6 -2
- package/dist/src/bitgo/recovery/initiate.d.ts +24 -1
- package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
- package/dist/src/bitgo/recovery/initiate.js +88 -40
- package/dist/src/bitgo/staking/goStakingInterfaces.d.ts +132 -0
- package/dist/src/bitgo/staking/goStakingInterfaces.d.ts.map +1 -0
- package/dist/src/bitgo/staking/goStakingInterfaces.js +3 -0
- package/dist/src/bitgo/staking/goStakingWallet.d.ts +62 -0
- package/dist/src/bitgo/staking/goStakingWallet.d.ts.map +1 -0
- package/dist/src/bitgo/staking/goStakingWallet.js +141 -0
- package/dist/src/bitgo/staking/iGoStakingWallet.d.ts +17 -0
- package/dist/src/bitgo/staking/iGoStakingWallet.d.ts.map +1 -0
- package/dist/src/bitgo/staking/iGoStakingWallet.js +3 -0
- package/dist/src/bitgo/staking/iStakingWallet.d.ts +173 -7
- package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/iStakingWallet.js +2 -2
- package/dist/src/bitgo/staking/index.d.ts +3 -0
- package/dist/src/bitgo/staking/index.d.ts.map +1 -1
- package/dist/src/bitgo/staking/index.js +9 -2
- package/dist/src/bitgo/staking/stakingWallet.d.ts +21 -8
- package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/stakingWallet.js +140 -7
- package/dist/src/bitgo/trading/iTradingAccount.d.ts +15 -1
- package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
- package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
- package/dist/src/bitgo/trading/index.d.ts +1 -0
- package/dist/src/bitgo/trading/index.d.ts.map +1 -1
- package/dist/src/bitgo/trading/index.js +7 -2
- package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts +8 -0
- package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/decrypt-aes-gcm.js +31 -0
- package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts +8 -0
- package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/decrypt-rsa.js +23 -0
- package/dist/src/bitgo/trading/network/decrypt.d.ts +14 -0
- package/dist/src/bitgo/trading/network/decrypt.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/decrypt.js +23 -0
- package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts +8 -0
- package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/encrypt-aes-gcm.js +25 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts +8 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa-browser.js +65 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts +8 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa.js +23 -0
- package/dist/src/bitgo/trading/network/encrypt.d.ts +37 -0
- package/dist/src/bitgo/trading/network/encrypt.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/encrypt.js +58 -0
- package/dist/src/bitgo/trading/network/index.d.ts +5 -0
- package/dist/src/bitgo/trading/network/index.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/index.js +21 -0
- package/dist/src/bitgo/trading/network/network.d.ts +36 -0
- package/dist/src/bitgo/trading/network/network.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/network.js +99 -0
- package/dist/src/bitgo/trading/network/types.d.ts +277 -0
- package/dist/src/bitgo/trading/network/types.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/types.js +3 -0
- package/dist/src/bitgo/trading/network/utils.d.ts +20 -0
- package/dist/src/bitgo/trading/network/utils.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/utils.js +54 -0
- package/dist/src/bitgo/trading/tradingAccount.d.ts +22 -1
- package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
- package/dist/src/bitgo/trading/tradingAccount.js +64 -7
- package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +38 -0
- package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
- package/dist/src/bitgo/tss/bitgoPubKeys.js +72 -0
- package/dist/src/bitgo/tss/common.d.ts +40 -6
- package/dist/src/bitgo/tss/common.d.ts.map +1 -1
- package/dist/src/bitgo/tss/common.js +122 -17
- package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +6 -4
- package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/ecdsa.js +78 -66
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts +15 -0
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +167 -0
- package/dist/src/bitgo/tss/ecdsa/index.d.ts +1 -0
- package/dist/src/bitgo/tss/ecdsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/index.js +25 -10
- package/dist/src/bitgo/tss/ecdsa/types.d.ts +27 -27
- package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/types.js +3 -3
- package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +15 -6
- package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/tss/eddsa/eddsa.js +47 -40
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +37 -0
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +95 -0
- package/dist/src/bitgo/tss/eddsa/index.js +23 -9
- package/dist/src/bitgo/tss/eddsa/types.d.ts +4 -4
- package/dist/src/bitgo/tss/eddsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/index.d.ts +3 -2
- package/dist/src/bitgo/tss/index.d.ts.map +1 -1
- package/dist/src/bitgo/tss/index.js +26 -10
- package/dist/src/bitgo/tss/types.d.ts +3 -3
- package/dist/src/bitgo/tss/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/types.js +2 -2
- package/dist/src/bitgo/types.d.ts +3 -3
- package/dist/src/bitgo/types.d.ts.map +1 -1
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +8 -0
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -1
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +55 -13
- package/dist/src/bitgo/utils/codecProps.js +24 -11
- package/dist/src/bitgo/utils/codecs.d.ts +11 -0
- package/dist/src/bitgo/utils/codecs.d.ts.map +1 -0
- package/dist/src/bitgo/utils/codecs.js +59 -0
- package/dist/src/bitgo/utils/decode.d.ts.map +1 -1
- package/dist/src/bitgo/utils/decode.js +30 -16
- package/dist/src/bitgo/utils/index.d.ts +4 -2
- package/dist/src/bitgo/utils/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/index.js +27 -11
- package/dist/src/bitgo/utils/messageTypes.d.ts +40 -0
- package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -0
- package/dist/src/bitgo/utils/messageTypes.js +17 -0
- package/dist/src/bitgo/utils/mpcUtils.d.ts +4 -4
- package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/mpcUtils.js +124 -14
- package/dist/src/bitgo/utils/notEmpty.d.ts +2 -0
- package/dist/src/bitgo/utils/notEmpty.d.ts.map +1 -0
- package/dist/src/bitgo/utils/notEmpty.js +7 -0
- package/dist/src/bitgo/utils/opengpgUtils.d.ts +12 -9
- package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/opengpgUtils.js +77 -64
- package/dist/src/bitgo/utils/postWithCodec.d.ts.map +1 -1
- package/dist/src/bitgo/utils/postWithCodec.js +4 -38
- package/dist/src/bitgo/utils/promise-utils.d.ts +1 -1
- package/dist/src/bitgo/utils/promise-utils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/promise-utils.js +2 -3
- package/dist/src/bitgo/utils/transactionUtils.d.ts +9 -0
- package/dist/src/bitgo/utils/transactionUtils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/transactionUtils.js +29 -0
- package/dist/src/bitgo/utils/triple.d.ts +1 -1
- package/dist/src/bitgo/utils/triple.d.ts.map +1 -1
- package/dist/src/bitgo/utils/triple.js +2 -3
- package/dist/src/bitgo/utils/tss/addressVerification.d.ts +37 -0
- package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/addressVerification.js +82 -0
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +90 -17
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.js +278 -45
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +380 -45
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.js +47 -22
- package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts +23 -0
- package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.js +157 -0
- package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts +28 -0
- package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/base.js +53 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +24 -51
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +169 -246
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +203 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1081 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +8 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +13 -0
- package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +4 -0
- package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/index.js +10 -2
- package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +7 -10
- package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +107 -0
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +55 -0
- package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts +21 -0
- package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.js +118 -0
- package/dist/src/bitgo/utils/tss/eddsa/base.d.ts +18 -0
- package/dist/src/bitgo/utils/tss/eddsa/base.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/base.js +64 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +28 -11
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +216 -103
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +90 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +560 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +6 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +13 -0
- package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +4 -0
- package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/index.js +29 -8
- package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +7 -7
- package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +40 -0
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +44 -0
- package/dist/src/bitgo/utils/tss/index.d.ts +1 -0
- package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/index.js +24 -9
- package/dist/src/bitgo/utils/txRequest.d.ts +10 -0
- package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -0
- package/dist/src/bitgo/utils/txRequest.js +49 -0
- package/dist/src/bitgo/utils/util.js +24 -10
- package/dist/src/bitgo/utils/wallet.d.ts +7 -0
- package/dist/src/bitgo/utils/wallet.d.ts.map +1 -0
- package/dist/src/bitgo/utils/wallet.js +48 -0
- package/dist/src/bitgo/wallet/BuildParams.d.ts +50 -1
- package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/BuildParams.js +58 -11
- package/dist/src/bitgo/wallet/iWallet.d.ts +480 -22
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/src/bitgo/wallet/iWallets.d.ts +135 -16
- package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallets.js +63 -3
- package/dist/src/bitgo/wallet/index.js +6 -2
- package/dist/src/bitgo/wallet/wallet.d.ts +369 -24
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +1977 -408
- package/dist/src/bitgo/wallet/wallets.d.ts +79 -4
- package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallets.js +923 -176
- package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts +12 -0
- package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/iMessageProvider.js +3 -0
- package/dist/src/bitgo/walletUtil/index.d.ts +3 -0
- package/dist/src/bitgo/walletUtil/index.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/index.js +19 -0
- package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts +22 -0
- package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/midnightMessageProvider.js +95 -0
- package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts +9 -0
- package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.js +72 -0
- package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts +15 -0
- package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/utxoMessageProof.js +40 -0
- package/dist/src/bitgo/webhook/index.js +6 -2
- package/dist/src/bitgo/webhook/webhooks.js +23 -9
- package/dist/src/coins/fiat.d.ts +45 -0
- package/dist/src/coins/fiat.d.ts.map +1 -0
- package/dist/src/coins/fiat.js +94 -0
- package/dist/src/coins/index.d.ts +1 -6
- package/dist/src/coins/index.d.ts.map +1 -1
- package/dist/src/coins/index.js +7 -8
- package/dist/src/coins/ofc.d.ts +21 -2
- package/dist/src/coins/ofc.d.ts.map +1 -1
- package/dist/src/coins/ofc.js +29 -3
- package/dist/src/coins/ofcToken.d.ts +15 -4
- package/dist/src/coins/ofcToken.d.ts.map +1 -1
- package/dist/src/coins/ofcToken.js +43 -5
- package/dist/src/coins/susd.d.ts +3 -2
- package/dist/src/coins/susd.d.ts.map +1 -1
- package/dist/src/coins/susd.js +5 -1
- package/dist/src/common.js +27 -13
- package/dist/src/index.d.ts +6 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +32 -11
- package/dist/src/lightning.d.ts +20 -0
- package/dist/src/lightning.d.ts.map +1 -0
- package/dist/src/lightning.js +13 -0
- package/dist/src/units.js +5 -6
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts +2 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.js +207 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +2 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.js +174 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +2 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +108 -0
- package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts +46 -0
- package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts.map +1 -0
- package/dist/test/unit/account-lib/baseCoin/messages/fixtures.js +69 -0
- package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.js +91 -29
- package/dist/test/unit/account-lib/mpc/util.d.ts +2 -0
- package/dist/test/unit/account-lib/mpc/util.d.ts.map +1 -0
- package/dist/test/unit/account-lib/mpc/util.js +53 -0
- package/dist/test/unit/bitgo/defi/defiVault.d.ts +2 -0
- package/dist/test/unit/bitgo/defi/defiVault.d.ts.map +1 -0
- package/dist/test/unit/bitgo/defi/defiVault.js +292 -0
- package/dist/test/unit/bitgo/environment.d.ts +2 -0
- package/dist/test/unit/bitgo/environment.d.ts.map +1 -0
- package/dist/test/unit/bitgo/environment.js +38 -0
- package/dist/test/unit/bitgo/errors.d.ts +2 -0
- package/dist/test/unit/bitgo/errors.d.ts.map +1 -0
- package/dist/test/unit/bitgo/errors.js +262 -0
- package/dist/test/unit/bitgo/recovery/initiate.d.ts +2 -0
- package/dist/test/unit/bitgo/recovery/initiate.d.ts.map +1 -0
- package/dist/test/unit/bitgo/recovery/initiate.js +230 -0
- package/dist/test/unit/bitgo/trading/network/encrypt.d.ts +2 -0
- package/dist/test/unit/bitgo/trading/network/encrypt.d.ts.map +1 -0
- package/dist/test/unit/bitgo/trading/network/encrypt.js +71 -0
- package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
- package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
- package/dist/test/unit/bitgo/trading/tradingAccount.js +192 -0
- package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.js +24 -4
- package/dist/test/unit/bitgo/utils/messageTypes.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/messageTypes.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/messageTypes.js +64 -0
- package/dist/test/unit/bitgo/utils/notEmpty.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/notEmpty.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/notEmpty.js +15 -0
- package/dist/test/unit/bitgo/utils/postWithCodec.js +32 -38
- package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/addressVerification.js +203 -0
- package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +316 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.js +94 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +875 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts +5 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.js +36 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +1211 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.js +311 -0
- package/dist/test/unit/bitgo/utils/txRequest.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/txRequest.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/txRequest.js +179 -0
- package/dist/test/unit/bitgo/wallet/BuildParams.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/BuildParams.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/BuildParams.js +97 -0
- package/dist/test/unit/bitgo/wallet/SendTransactionRequest.js +23 -9
- package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/getAccountResources.js +133 -0
- package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/getResourceDelegations.js +118 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +185 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.js +441 -0
- package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/tokenApproval.js +135 -0
- package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.js +181 -0
- package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.js +43 -0
- package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.js +320 -0
- package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +228 -0
- package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.js +216 -0
- package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +200 -0
- package/dist/test/unit/coins/ofc.d.ts +2 -0
- package/dist/test/unit/coins/ofc.d.ts.map +1 -0
- package/dist/test/unit/coins/ofc.js +124 -0
- package/dist/test/unit/lightning.d.ts +2 -0
- package/dist/test/unit/lightning.d.ts.map +1 -0
- package/dist/test/unit/lightning.js +23 -0
- package/dist/test/unit/units.d.ts.map +1 -1
- package/dist/test/unit/units.js +64 -64
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +24 -21
- package/.eslintignore +0 -5
- package/CHANGELOG.md +0 -1499
- package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +0 -77
- package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +0 -1
- package/dist/src/account-lib/baseCoin/blsKeyPair.js +0 -209
- package/dist/src/bitgo/lightning/iLightning.d.ts +0 -186
- package/dist/src/bitgo/lightning/iLightning.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/iLightning.js +0 -106
- package/dist/src/bitgo/lightning/index.d.ts +0 -5
- package/dist/src/bitgo/lightning/index.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/index.js +0 -17
- package/dist/src/bitgo/lightning/lightning.d.ts +0 -25
- package/dist/src/bitgo/lightning/lightning.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/lightning.js +0 -111
- package/dist/src/bitgo/lightning/lightningUtils.d.ts +0 -46
- package/dist/src/bitgo/lightning/lightningUtils.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/lightningUtils.js +0 -133
- package/dist/src/bitgo/lightning/lnurlCodec.d.ts +0 -3
- package/dist/src/bitgo/lightning/lnurlCodec.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/lnurlCodec.js +0 -28
- package/dist/src/bitgo/utils/blsUtils.d.ts +0 -52
- package/dist/src/bitgo/utils/blsUtils.d.ts.map +0 -1
- package/dist/src/bitgo/utils/blsUtils.js +0 -237
- package/dist/src/bitgo/utils/iBlsUtils.d.ts +0 -14
- package/dist/src/bitgo/utils/iBlsUtils.d.ts.map +0 -1
- package/dist/src/bitgo/utils/iBlsUtils.js +0 -3
- package/dist/src/coins/fiateur.d.ts +0 -31
- package/dist/src/coins/fiateur.d.ts.map +0 -1
- package/dist/src/coins/fiateur.js +0 -57
- package/dist/src/coins/fiatgbp.d.ts +0 -31
- package/dist/src/coins/fiatgbp.d.ts.map +0 -1
- package/dist/src/coins/fiatgbp.js +0 -57
- package/dist/src/coins/fiatusd.d.ts +0 -31
- package/dist/src/coins/fiatusd.d.ts.map +0 -1
- package/dist/src/coins/fiatusd.js +0 -57
- package/dist/src/coins/tfiateur.d.ts +0 -11
- package/dist/src/coins/tfiateur.d.ts.map +0 -1
- package/dist/src/coins/tfiateur.js +0 -17
- package/dist/src/coins/tfiatgbp.d.ts +0 -11
- package/dist/src/coins/tfiatgbp.d.ts.map +0 -1
- package/dist/src/coins/tfiatgbp.js +0 -17
- package/dist/src/coins/tfiatusd.d.ts +0 -11
- package/dist/src/coins/tfiatusd.d.ts.map +0 -1
- package/dist/src/coins/tfiatusd.js +0 -17
- package/dist/src/openssl/index.d.ts +0 -5
- package/dist/src/openssl/index.d.ts.map +0 -1
- package/dist/src/openssl/index.js +0 -9
- package/dist/test/unit/openssl.d.ts +0 -2
- package/dist/test/unit/openssl.d.ts.map +0 -1
- package/dist/test/unit/openssl.js +0 -39
|
@@ -0,0 +1,560 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.EddsaMPCv2Utils = void 0;
|
|
40
|
+
const assert_1 = __importDefault(require("assert"));
|
|
41
|
+
const pgp = __importStar(require("openpgp"));
|
|
42
|
+
const io_ts_types_1 = require("io-ts-types");
|
|
43
|
+
const public_types_1 = require("@bitgo/public-types");
|
|
44
|
+
const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
|
|
45
|
+
const bitgoPubKeys_1 = require("../../../tss/bitgoPubKeys");
|
|
46
|
+
const common_1 = require("../../../tss/common");
|
|
47
|
+
const codecs_1 = require("../../codecs");
|
|
48
|
+
const eddsaMPCv2_1 = require("../../../tss/eddsa/eddsaMPCv2");
|
|
49
|
+
const opengpgUtils_1 = require("../../opengpgUtils");
|
|
50
|
+
const typesMPCv2_1 = require("../ecdsa/typesMPCv2");
|
|
51
|
+
const baseTypes_1 = require("../baseTypes");
|
|
52
|
+
const base_1 = require("./base");
|
|
53
|
+
const eddsaMPCv2KeyGenSender_1 = require("./eddsaMPCv2KeyGenSender");
|
|
54
|
+
class EddsaMPCv2Utils extends base_1.BaseEddsaUtils {
|
|
55
|
+
async isEddsaMpcV1SigningMaterial(encryptedKeyShare, walletPassphrase) {
|
|
56
|
+
try {
|
|
57
|
+
const prv = await this.bitgo.decryptAsync({ input: encryptedKeyShare, password: walletPassphrase });
|
|
58
|
+
const signingMaterial = JSON.parse(prv);
|
|
59
|
+
return (typeof signingMaterial?.uShare?.seed === 'string' &&
|
|
60
|
+
typeof signingMaterial?.bitgoYShare?.u === 'string' &&
|
|
61
|
+
(typeof signingMaterial?.backupYShare?.u === 'string' || typeof signingMaterial?.userYShare?.u === 'string'));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** @inheritdoc */
|
|
68
|
+
async createKeychains(params) {
|
|
69
|
+
const userKeyPair = await (0, opengpgUtils_1.generateGPGKeyPair)('ed25519');
|
|
70
|
+
const userGpgKey = await pgp.readPrivateKey({ armoredKey: userKeyPair.privateKey });
|
|
71
|
+
const userGpgPublicKey = userKeyPair.publicKey;
|
|
72
|
+
const [userPk, userSk] = await sdk_lib_mpc_1.MPSComms.extractEd25519KeyPair(userGpgKey);
|
|
73
|
+
const backupKeyPair = await (0, opengpgUtils_1.generateGPGKeyPair)('ed25519');
|
|
74
|
+
const backupGpgKey = await pgp.readPrivateKey({ armoredKey: backupKeyPair.privateKey });
|
|
75
|
+
const backupGpgPublicKey = backupKeyPair.publicKey;
|
|
76
|
+
const [backupPk, backupSk] = await sdk_lib_mpc_1.MPSComms.extractEd25519KeyPair(backupGpgKey);
|
|
77
|
+
// Get the BitGo EdDSA MPCv2 public key (ed25519). Using the default mpcv2PublicKey (secp256k1)
|
|
78
|
+
// here would cause a WASM "Invalid Input" error, so we require the dedicated eddsaMpcv2PublicKey.
|
|
79
|
+
const { eddsaMpcv2PublicKey } = await this.getBitgoGpgPubkeyBasedOnFeatureFlags(params.enterprise, true);
|
|
80
|
+
const bitgoPublicGpgKey = eddsaMpcv2PublicKey ?? this.bitgoEddsaMpcv2PublicGpgKey;
|
|
81
|
+
(0, assert_1.default)(bitgoPublicGpgKey, 'Failed to get BitGo EdDSA MPCv2 GPG public key');
|
|
82
|
+
const bitgoPublicGpgKeyArmored = bitgoPublicGpgKey.armor();
|
|
83
|
+
if ((0, bitgoPubKeys_1.envRequiresBitgoPubGpgKeyConfig)(this.bitgo.getEnv())) {
|
|
84
|
+
(0, assert_1.default)((0, bitgoPubKeys_1.isBitgoEddsaMpcv2PubKey)(bitgoPublicGpgKeyArmored), 'Invalid BitGo GPG public key');
|
|
85
|
+
}
|
|
86
|
+
const bitgoKeyObj = await pgp.readKey({ armoredKey: bitgoPublicGpgKeyArmored });
|
|
87
|
+
const bitgoPk = await sdk_lib_mpc_1.MPSComms.extractEd25519PublicKey(bitgoKeyObj);
|
|
88
|
+
// Create DKG sessions for user (party 0) and backup (party 1)
|
|
89
|
+
const userDkg = new sdk_lib_mpc_1.EddsaMPSDkg.DKG(3, 2, typesMPCv2_1.MPCv2PartiesEnum.USER);
|
|
90
|
+
const backupDkg = new sdk_lib_mpc_1.EddsaMPSDkg.DKG(3, 2, typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
|
|
91
|
+
// #region round 1
|
|
92
|
+
await userDkg.initDkg(userSk, [backupPk, bitgoPk]);
|
|
93
|
+
await backupDkg.initDkg(backupSk, [userPk, bitgoPk]);
|
|
94
|
+
const userMsg1 = userDkg.getFirstMessage();
|
|
95
|
+
const backupMsg1 = backupDkg.getFirstMessage();
|
|
96
|
+
const userSignedMsg1 = await sdk_lib_mpc_1.MPSComms.detachSignMpsMessage(Buffer.from(userMsg1.payload), userGpgKey);
|
|
97
|
+
const backupSignedMsg1 = await sdk_lib_mpc_1.MPSComms.detachSignMpsMessage(Buffer.from(backupMsg1.payload), backupGpgKey);
|
|
98
|
+
(0, assert_1.default)(io_ts_types_1.NonEmptyString.is(userGpgPublicKey), 'User GPG public key is required');
|
|
99
|
+
(0, assert_1.default)(io_ts_types_1.NonEmptyString.is(backupGpgPublicKey), 'Backup GPG public key is required');
|
|
100
|
+
const { sessionId, bitgoMsg1 } = await this.sendKeyGenerationRound1(params.enterprise, {
|
|
101
|
+
userGpgPublicKey,
|
|
102
|
+
backupGpgPublicKey,
|
|
103
|
+
userMsg1: userSignedMsg1,
|
|
104
|
+
backupMsg1: backupSignedMsg1,
|
|
105
|
+
});
|
|
106
|
+
// #endregion
|
|
107
|
+
// #region round 2
|
|
108
|
+
const bitgoRawMsg1Bytes = await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(bitgoMsg1, bitgoKeyObj);
|
|
109
|
+
const bitgoDeserializedMsg1 = {
|
|
110
|
+
from: typesMPCv2_1.MPCv2PartiesEnum.BITGO,
|
|
111
|
+
payload: new Uint8Array(bitgoRawMsg1Bytes),
|
|
112
|
+
};
|
|
113
|
+
const round1Messages = [userMsg1, backupMsg1, bitgoDeserializedMsg1];
|
|
114
|
+
const userRound2Msgs = userDkg.handleIncomingMessages(round1Messages);
|
|
115
|
+
const backupRound2Msgs = backupDkg.handleIncomingMessages(round1Messages);
|
|
116
|
+
(0, assert_1.default)(userRound2Msgs.length === 1, 'User round 1 should produce exactly one round 2 message');
|
|
117
|
+
(0, assert_1.default)(backupRound2Msgs.length === 1, 'Backup round 1 should produce exactly one round 2 message');
|
|
118
|
+
const userMsg2 = userRound2Msgs[0];
|
|
119
|
+
const backupMsg2 = backupRound2Msgs[0];
|
|
120
|
+
const userSignedMsg2 = await sdk_lib_mpc_1.MPSComms.detachSignMpsMessage(Buffer.from(userMsg2.payload), userGpgKey);
|
|
121
|
+
const backupSignedMsg2 = await sdk_lib_mpc_1.MPSComms.detachSignMpsMessage(Buffer.from(backupMsg2.payload), backupGpgKey);
|
|
122
|
+
const { sessionId: sessionIdRound2, commonPublicKeychain, bitgoMsg2, } = await this.sendKeyGenerationRound2(params.enterprise, {
|
|
123
|
+
sessionId,
|
|
124
|
+
userMsg2: userSignedMsg2,
|
|
125
|
+
backupMsg2: backupSignedMsg2,
|
|
126
|
+
});
|
|
127
|
+
// #endregion
|
|
128
|
+
// #region keychain creation
|
|
129
|
+
assert_1.default.equal(sessionId, sessionIdRound2, 'Round 1 and round 2 session IDs do not match');
|
|
130
|
+
const bitgoRawMsg2Bytes = await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(bitgoMsg2, bitgoKeyObj);
|
|
131
|
+
const bitgoDeserializedMsg2 = {
|
|
132
|
+
from: typesMPCv2_1.MPCv2PartiesEnum.BITGO,
|
|
133
|
+
payload: new Uint8Array(bitgoRawMsg2Bytes),
|
|
134
|
+
};
|
|
135
|
+
const round2Messages = [userMsg2, backupMsg2, bitgoDeserializedMsg2];
|
|
136
|
+
const userFinalMsgs = userDkg.handleIncomingMessages(round2Messages);
|
|
137
|
+
const backupFinalMsgs = backupDkg.handleIncomingMessages(round2Messages);
|
|
138
|
+
(0, assert_1.default)(userFinalMsgs.length === 0, 'WASM round 2 should produce no output messages for user');
|
|
139
|
+
(0, assert_1.default)(backupFinalMsgs.length === 0, 'WASM round 2 should produce no output messages for backup');
|
|
140
|
+
const userCommonKeychain = userDkg.getCommonKeychain();
|
|
141
|
+
const backupCommonKeychain = backupDkg.getCommonKeychain();
|
|
142
|
+
assert_1.default.equal(userCommonKeychain, commonPublicKeychain, 'User computed keychain does not match BitGo common keychain');
|
|
143
|
+
assert_1.default.equal(backupCommonKeychain, commonPublicKeychain, 'Backup computed keychain does not match BitGo common keychain');
|
|
144
|
+
const userPrivateMaterial = userDkg.getKeyShare();
|
|
145
|
+
const backupPrivateMaterial = backupDkg.getKeyShare();
|
|
146
|
+
const userReducedPrivateMaterial = userDkg.getReducedKeyShare();
|
|
147
|
+
const backupReducedPrivateMaterial = backupDkg.getReducedKeyShare();
|
|
148
|
+
const userKeychainPromise = this.addUserKeychain(userCommonKeychain, userPrivateMaterial, userReducedPrivateMaterial, params.passphrase, params.originalPasscodeEncryptionCode, params.webauthnInfo, params.encryptionVersion);
|
|
149
|
+
const backupKeychainPromise = this.addBackupKeychain(backupCommonKeychain, backupPrivateMaterial, backupReducedPrivateMaterial, params.passphrase, params.originalPasscodeEncryptionCode, params.encryptionVersion);
|
|
150
|
+
const bitgoKeychainPromise = this.addBitgoKeychain(userCommonKeychain);
|
|
151
|
+
const [userKeychain, backupKeychain, bitgoKeychain] = await Promise.all([
|
|
152
|
+
userKeychainPromise,
|
|
153
|
+
backupKeychainPromise,
|
|
154
|
+
bitgoKeychainPromise,
|
|
155
|
+
]);
|
|
156
|
+
// #endregion
|
|
157
|
+
return {
|
|
158
|
+
userKeychain,
|
|
159
|
+
backupKeychain,
|
|
160
|
+
bitgoKeychain,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
// #region keychain utils
|
|
164
|
+
async createParticipantKeychain(participantIndex, commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, webauthnInfo, encryptionVersion) {
|
|
165
|
+
let source;
|
|
166
|
+
let encryptedPrv = undefined;
|
|
167
|
+
let reducedEncryptedPrv = undefined;
|
|
168
|
+
let privateMaterialBase64 = undefined;
|
|
169
|
+
switch (participantIndex) {
|
|
170
|
+
case typesMPCv2_1.MPCv2PartiesEnum.USER:
|
|
171
|
+
case typesMPCv2_1.MPCv2PartiesEnum.BACKUP:
|
|
172
|
+
source = participantIndex === typesMPCv2_1.MPCv2PartiesEnum.USER ? 'user' : 'backup';
|
|
173
|
+
(0, assert_1.default)(privateMaterial, `Private material is required for ${source} keychain`);
|
|
174
|
+
(0, assert_1.default)(reducedPrivateMaterial, `Reduced private material is required for ${source} keychain`);
|
|
175
|
+
(0, assert_1.default)(passphrase, `Passphrase is required for ${source} keychain`);
|
|
176
|
+
privateMaterialBase64 = privateMaterial.toString('base64');
|
|
177
|
+
encryptedPrv = await this.bitgo.encryptAsync({
|
|
178
|
+
input: privateMaterialBase64,
|
|
179
|
+
password: passphrase,
|
|
180
|
+
encryptionVersion,
|
|
181
|
+
});
|
|
182
|
+
// Encrypts the CBOR-encoded ReducedKeyShare (which contains the party's public
|
|
183
|
+
// key) with the wallet passphrase. The result is stored as reducedEncryptedPrv
|
|
184
|
+
// on the key card QR code and represents a second copy of key material
|
|
185
|
+
// beyond the server-stored encryptedPrv.
|
|
186
|
+
reducedEncryptedPrv = await this.bitgo.encryptAsync({
|
|
187
|
+
// Buffer.toString('base64') can not be used here as it does not work on the browser.
|
|
188
|
+
// The browser deals with a Buffer as Uint8Array, therefore in the browser .toString('base64') just creates a comma separated string of the array values.
|
|
189
|
+
input: btoa(String.fromCharCode.apply(null, Array.from(new Uint8Array(reducedPrivateMaterial)))),
|
|
190
|
+
password: passphrase,
|
|
191
|
+
encryptionVersion,
|
|
192
|
+
});
|
|
193
|
+
break;
|
|
194
|
+
case typesMPCv2_1.MPCv2PartiesEnum.BITGO:
|
|
195
|
+
source = 'bitgo';
|
|
196
|
+
break;
|
|
197
|
+
default:
|
|
198
|
+
throw new Error('Invalid participant index');
|
|
199
|
+
}
|
|
200
|
+
const keychainParams = {
|
|
201
|
+
source,
|
|
202
|
+
keyType: 'tss',
|
|
203
|
+
commonKeychain,
|
|
204
|
+
encryptedPrv,
|
|
205
|
+
originalPasscodeEncryptionCode,
|
|
206
|
+
isMPCv2: true,
|
|
207
|
+
};
|
|
208
|
+
if (webauthnInfo && participantIndex === typesMPCv2_1.MPCv2PartiesEnum.USER && privateMaterialBase64) {
|
|
209
|
+
keychainParams.webauthnDevices = [
|
|
210
|
+
{
|
|
211
|
+
otpDeviceId: webauthnInfo.otpDeviceId,
|
|
212
|
+
prfSalt: webauthnInfo.prfSalt,
|
|
213
|
+
encryptedPrv: await this.bitgo.encryptAsync({
|
|
214
|
+
input: privateMaterialBase64,
|
|
215
|
+
password: webauthnInfo.passphrase,
|
|
216
|
+
encryptionVersion,
|
|
217
|
+
}),
|
|
218
|
+
},
|
|
219
|
+
];
|
|
220
|
+
}
|
|
221
|
+
const keychains = this.baseCoin.keychains();
|
|
222
|
+
return { ...(await keychains.add(keychainParams)), reducedEncryptedPrv };
|
|
223
|
+
}
|
|
224
|
+
async addUserKeychain(commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, webauthnInfo, encryptionVersion) {
|
|
225
|
+
return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.USER, commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, webauthnInfo, encryptionVersion);
|
|
226
|
+
}
|
|
227
|
+
async addBackupKeychain(commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, encryptionVersion) {
|
|
228
|
+
return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BACKUP, commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, undefined, encryptionVersion);
|
|
229
|
+
}
|
|
230
|
+
async addBitgoKeychain(commonKeychain) {
|
|
231
|
+
return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BITGO, commonKeychain);
|
|
232
|
+
}
|
|
233
|
+
// #endregion
|
|
234
|
+
async sendKeyGenerationRound1(enterprise, payload) {
|
|
235
|
+
return this.sendKeyGenerationRound1BySender((0, eddsaMPCv2KeyGenSender_1.KeyGenSenderForEnterprise)(this.bitgo, enterprise), payload);
|
|
236
|
+
}
|
|
237
|
+
async sendKeyGenerationRound1BySender(senderFn, payload) {
|
|
238
|
+
return senderFn(public_types_1.MPCv2KeyGenStateEnum['MPCv2-R1'], payload);
|
|
239
|
+
}
|
|
240
|
+
async sendKeyGenerationRound2(enterprise, payload) {
|
|
241
|
+
return this.sendKeyGenerationRound2BySender((0, eddsaMPCv2KeyGenSender_1.KeyGenSenderForEnterprise)(this.bitgo, enterprise), payload);
|
|
242
|
+
}
|
|
243
|
+
async sendKeyGenerationRound2BySender(senderFn, payload) {
|
|
244
|
+
return senderFn(public_types_1.MPCv2KeyGenStateEnum['MPCv2-R2'], payload);
|
|
245
|
+
}
|
|
246
|
+
// #endregion
|
|
247
|
+
// #region sign tx request
|
|
248
|
+
/**
|
|
249
|
+
* Signs the transaction associated with the transaction request.
|
|
250
|
+
* @param {string | TxRequest} params.txRequest - transaction request object or id
|
|
251
|
+
* @param {string} params.prv - decrypted private key
|
|
252
|
+
* @param {string} params.reqId - request id
|
|
253
|
+
* @returns {Promise<TxRequest>} fully signed TxRequest
|
|
254
|
+
*/
|
|
255
|
+
async signTxRequest(params) {
|
|
256
|
+
this.bitgo.setRequestTracer(params.reqId);
|
|
257
|
+
return this.signRequestBase(params, baseTypes_1.RequestType.tx);
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Signs the message associated with the transaction request.
|
|
261
|
+
* @param {string | TxRequest} params.txRequest - transaction request object or id
|
|
262
|
+
* @param {string} params.prv - decrypted private key
|
|
263
|
+
* @param {string} params.reqId - request id
|
|
264
|
+
* @returns {Promise<TxRequest>} fully signed TxRequest
|
|
265
|
+
*/
|
|
266
|
+
async signTxRequestForMessage(params) {
|
|
267
|
+
this.bitgo.setRequestTracer(params.reqId);
|
|
268
|
+
return this.signRequestBase(params, baseTypes_1.RequestType.message);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Full 3-round EdDSA MPCv2 (MPS) online signing orchestration.
|
|
272
|
+
*
|
|
273
|
+
* Protocol overview:
|
|
274
|
+
* WASM Round 0 → getFirstMessage() (produces userMsg1)
|
|
275
|
+
* API Round 1 → send userMsg1 / recv bitgoMsg1
|
|
276
|
+
* WASM Round 1 → handleIncomingMessages([userMsg1, bitgoMsg1]) (produces userMsg2)
|
|
277
|
+
* API Round 2 → send userMsg2 / recv bitgoMsg2
|
|
278
|
+
* WASM Round 2 → handleIncomingMessages([userMsg2, bitgoMsg2]) (produces userMsg3)
|
|
279
|
+
* API Round 3 → send userMsg3 (WP finalises; no BitGo msg returned to client)
|
|
280
|
+
*/
|
|
281
|
+
async signRequestBase(params, requestType) {
|
|
282
|
+
const userKeyShare = Buffer.from(params.prv, 'base64');
|
|
283
|
+
const txRequest = typeof params.txRequest === 'string'
|
|
284
|
+
? await (0, common_1.getTxRequest)(this.bitgo, this.wallet.id(), params.txRequest, params.reqId)
|
|
285
|
+
: params.txRequest;
|
|
286
|
+
let txOrMessageToSign;
|
|
287
|
+
let derivationPath;
|
|
288
|
+
let bufferContent;
|
|
289
|
+
// One fresh ed25519 GPG key pair per signing session, reused across all signing rounds.
|
|
290
|
+
const userGpgKey = await (0, opengpgUtils_1.generateGPGKeyPair)('ed25519');
|
|
291
|
+
const userGpgPrvKey = await pgp.readPrivateKey({ armoredKey: userGpgKey.privateKey });
|
|
292
|
+
const bitgoGpgPubKey = await this.pickBitgoPubGpgKeyForSigning(true, params.reqId, txRequest.enterpriseId, true);
|
|
293
|
+
(0, assert_1.default)(bitgoGpgPubKey, 'Missing BitGo GPG key for MPCv2');
|
|
294
|
+
if (requestType === baseTypes_1.RequestType.tx) {
|
|
295
|
+
(0, assert_1.default)(txRequest.transactions || txRequest.unsignedTxs, 'Unable to find transactions in txRequest');
|
|
296
|
+
const unsignedTx = txRequest.apiVersion === 'full' ? txRequest.transactions[0].unsignedTx : txRequest.unsignedTxs[0];
|
|
297
|
+
txOrMessageToSign = unsignedTx.signableHex;
|
|
298
|
+
(0, assert_1.default)(txOrMessageToSign, 'Missing signableHex in unsignedTx');
|
|
299
|
+
derivationPath = unsignedTx.derivationPath;
|
|
300
|
+
bufferContent = Buffer.from(txOrMessageToSign, 'hex');
|
|
301
|
+
await this.baseCoin.verifyTransaction({
|
|
302
|
+
txPrebuild: { txHex: unsignedTx.serializedTxHex ?? txOrMessageToSign },
|
|
303
|
+
txParams: params.txParams || { recipients: [] },
|
|
304
|
+
wallet: this.wallet,
|
|
305
|
+
walletType: this.wallet.multisigType(),
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
else if (requestType === baseTypes_1.RequestType.message) {
|
|
309
|
+
(0, assert_1.default)(txRequest.messages && txRequest.messages.length > 0, 'Unable to find messages in txRequest');
|
|
310
|
+
txOrMessageToSign = txRequest.messages[0].messageEncoded;
|
|
311
|
+
(0, assert_1.default)(txOrMessageToSign, 'Missing messageEncoded in messages[0]');
|
|
312
|
+
derivationPath = txRequest.messages[0].derivationPath || 'm/0';
|
|
313
|
+
bufferContent = Buffer.from(txOrMessageToSign, 'hex');
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
throw new Error('Invalid request type');
|
|
317
|
+
}
|
|
318
|
+
// ── WASM Round 0 ──────────────────────────────────────────────────────────
|
|
319
|
+
const partyId = params.mpcv2PartyId ?? typesMPCv2_1.MPCv2PartiesEnum.USER;
|
|
320
|
+
const signerShareType = partyId === typesMPCv2_1.MPCv2PartiesEnum.USER ? baseTypes_1.SignatureShareType.USER : baseTypes_1.SignatureShareType.BACKUP;
|
|
321
|
+
const userDsg = new sdk_lib_mpc_1.EddsaMPSDsg.DSG(partyId);
|
|
322
|
+
userDsg.initDsg(userKeyShare, bufferContent, derivationPath, typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
323
|
+
const userMsg1 = userDsg.getFirstMessage();
|
|
324
|
+
// ── API Round 1 ───────────────────────────────────────────────────────────
|
|
325
|
+
const signatureShareRound1 = await (0, eddsaMPCv2_1.getSignatureShareRoundOne)(userMsg1, userGpgPrvKey, partyId);
|
|
326
|
+
let latestTxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequest.walletId, txRequest.txRequestId, [signatureShareRound1], requestType, this.baseCoin.getMPCAlgorithm(), userGpgKey.publicKey, undefined, this.wallet.multisigTypeVersion(), params.reqId);
|
|
327
|
+
(0, assert_1.default)(latestTxRequest.transactions || latestTxRequest.messages, 'Invalid txRequest object after round 1');
|
|
328
|
+
const signatureShares1 = requestType === baseTypes_1.RequestType.tx
|
|
329
|
+
? latestTxRequest.transactions[0].signatureShares
|
|
330
|
+
: latestTxRequest.messages[0].signatureShares;
|
|
331
|
+
const bitgoShareRoundOne = (0, common_1.getBitgoSignatureShare)(signatureShares1, signerShareType, 'round1Output');
|
|
332
|
+
const parsedBitGoToUserSigShareRoundOne = (0, codecs_1.decodeWithCodec)(public_types_1.EddsaMPCv2SignatureShareRound1Output, JSON.parse(bitgoShareRoundOne.share), 'Unexpected signature share response. Unable to parse data.');
|
|
333
|
+
if (parsedBitGoToUserSigShareRoundOne.type !== 'round1Output') {
|
|
334
|
+
throw new Error('Unexpected signature share response. Unable to parse data.');
|
|
335
|
+
}
|
|
336
|
+
const bitgoDeserializedMsg1 = await (0, eddsaMPCv2_1.verifyPeerMessageRoundOne)(parsedBitGoToUserSigShareRoundOne, bitgoGpgPubKey);
|
|
337
|
+
// ── WASM Round 1 ──────────────────────────────────────────────────────────
|
|
338
|
+
const [userMsg2] = userDsg.handleIncomingMessages([userMsg1, bitgoDeserializedMsg1]);
|
|
339
|
+
(0, assert_1.default)(userMsg2, 'WASM round 1 produced no message');
|
|
340
|
+
// ── API Round 2 ───────────────────────────────────────────────────────────
|
|
341
|
+
const signatureShareRoundTwo = await (0, eddsaMPCv2_1.getSignatureShareRoundTwo)(userMsg2, userGpgPrvKey, partyId);
|
|
342
|
+
latestTxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequest.walletId, txRequest.txRequestId, [signatureShareRoundTwo], requestType, this.baseCoin.getMPCAlgorithm(), userGpgKey.publicKey, undefined, this.wallet.multisigTypeVersion(), params.reqId);
|
|
343
|
+
(0, assert_1.default)(latestTxRequest.transactions || latestTxRequest.messages, 'Invalid txRequest object after round 2');
|
|
344
|
+
const txRequestSignatureShares = requestType === baseTypes_1.RequestType.tx
|
|
345
|
+
? latestTxRequest.transactions[0].signatureShares
|
|
346
|
+
: latestTxRequest.messages[0].signatureShares;
|
|
347
|
+
const bitgoShareRoundTwo = (0, common_1.getBitgoSignatureShare)(txRequestSignatureShares, signerShareType, 'round2Output');
|
|
348
|
+
const parsedBitGoToUserSigShareRoundTwo = (0, codecs_1.decodeWithCodec)(public_types_1.EddsaMPCv2SignatureShareRound2Output, JSON.parse(bitgoShareRoundTwo.share), 'Unexpected signature share response. Unable to parse data.');
|
|
349
|
+
if (parsedBitGoToUserSigShareRoundTwo.type !== 'round2Output') {
|
|
350
|
+
throw new Error('Unexpected signature share response. Unable to parse data.');
|
|
351
|
+
}
|
|
352
|
+
const bitgoDeserializedMsg2 = await (0, eddsaMPCv2_1.verifyPeerMessageRoundTwo)(parsedBitGoToUserSigShareRoundTwo, bitgoGpgPubKey);
|
|
353
|
+
// ── WASM Round 2 ──────────────────────────────────────────────────────────
|
|
354
|
+
const [userMsg3] = userDsg.handleIncomingMessages([userMsg2, bitgoDeserializedMsg2]);
|
|
355
|
+
(0, assert_1.default)(userMsg3, 'WASM round 2 produced no message');
|
|
356
|
+
// ── API Round 3 ───────────────────────────────────────────────────────────
|
|
357
|
+
// No BitGo response to verify; WP finalises the signing server-side
|
|
358
|
+
const signatureShareRound3 = await (0, eddsaMPCv2_1.getSignatureShareRoundThree)(userMsg3, userGpgPrvKey, partyId);
|
|
359
|
+
const round3TxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequest.walletId, txRequest.txRequestId, [signatureShareRound3], requestType, this.baseCoin.getMPCAlgorithm(), userGpgKey.publicKey, undefined, this.wallet.multisigTypeVersion(), params.reqId);
|
|
360
|
+
(0, assert_1.default)(round3TxRequest?.txRequestId === txRequest.txRequestId, 'Invalid txRequest object after round 3');
|
|
361
|
+
return (0, common_1.sendTxRequest)(this.bitgo, txRequest.walletId, txRequest.txRequestId, requestType, params.reqId);
|
|
362
|
+
}
|
|
363
|
+
// #endregion
|
|
364
|
+
// #region external signer
|
|
365
|
+
// #region Round1Share
|
|
366
|
+
async createOfflineRound1Share(params) {
|
|
367
|
+
const { prv, walletPassphrase, txRequest, encryptedPrv } = params;
|
|
368
|
+
const { signableHex, derivationPath } = this.getSignableHexAndDerivationPath(txRequest, 'Unable to find transactions in txRequest');
|
|
369
|
+
const adata = `${signableHex}:${derivationPath}`;
|
|
370
|
+
const userKeyShare = Buffer.from(prv, 'base64');
|
|
371
|
+
const userGpgKey = await (0, opengpgUtils_1.generateGPGKeyPair)('ed25519');
|
|
372
|
+
const userGpgPrvKey = await pgp.readPrivateKey({ armoredKey: userGpgKey.privateKey });
|
|
373
|
+
const userDsg = new sdk_lib_mpc_1.EddsaMPSDsg.DSG(typesMPCv2_1.MPCv2PartiesEnum.USER);
|
|
374
|
+
userDsg.initDsg(userKeyShare, Buffer.from(signableHex, 'hex'), derivationPath, typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
375
|
+
const userMsg1 = userDsg.getFirstMessage();
|
|
376
|
+
const signatureShareRound1 = await (0, eddsaMPCv2_1.getSignatureShareRoundOne)(userMsg1, userGpgPrvKey);
|
|
377
|
+
const sessionPayload = JSON.stringify({
|
|
378
|
+
dsgSession: userDsg.getSession(),
|
|
379
|
+
userMsgPayload: Buffer.from(userMsg1.payload).toString('base64'),
|
|
380
|
+
});
|
|
381
|
+
const userGpgPubKey = userGpgKey.publicKey;
|
|
382
|
+
const useV2 = encryptedPrv !== undefined && (0, baseTypes_1.isV2Envelope)(encryptedPrv);
|
|
383
|
+
if (useV2) {
|
|
384
|
+
const session = await this.bitgo.createEncryptionSession(walletPassphrase);
|
|
385
|
+
try {
|
|
386
|
+
const encryptedRound1Session = await session.encrypt(sessionPayload, `${EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND1_STATE}:${adata}`);
|
|
387
|
+
const encryptedUserGpgPrvKey = await session.encrypt(userGpgKey.privateKey, `${EddsaMPCv2Utils.MPS_DSG_SIGNING_USER_GPG_KEY}:${adata}`);
|
|
388
|
+
return { signatureShareRound1, userGpgPubKey, encryptedRound1Session, encryptedUserGpgPrvKey };
|
|
389
|
+
}
|
|
390
|
+
finally {
|
|
391
|
+
session.destroy();
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
const encryptedRound1Session = await this.bitgo.encryptAsync({
|
|
395
|
+
input: sessionPayload,
|
|
396
|
+
password: walletPassphrase,
|
|
397
|
+
adata: `${EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND1_STATE}:${adata}`,
|
|
398
|
+
encryptionVersion: 1,
|
|
399
|
+
});
|
|
400
|
+
const encryptedUserGpgPrvKey = await this.bitgo.encryptAsync({
|
|
401
|
+
input: userGpgKey.privateKey,
|
|
402
|
+
password: walletPassphrase,
|
|
403
|
+
adata: `${EddsaMPCv2Utils.MPS_DSG_SIGNING_USER_GPG_KEY}:${adata}`,
|
|
404
|
+
encryptionVersion: 1,
|
|
405
|
+
});
|
|
406
|
+
return { signatureShareRound1, userGpgPubKey, encryptedRound1Session, encryptedUserGpgPrvKey };
|
|
407
|
+
}
|
|
408
|
+
// #endregion
|
|
409
|
+
// #region Round2Share
|
|
410
|
+
async createOfflineRound2Share(params) {
|
|
411
|
+
const { walletPassphrase, encryptedUserGpgPrvKey, encryptedRound1Session, bitgoPublicGpgKey, txRequest } = params;
|
|
412
|
+
const { signableHex, derivationPath } = this.getSignableHexAndDerivationPath(txRequest, 'Unable to find transactions in txRequest');
|
|
413
|
+
const adata = `${signableHex}:${derivationPath}`;
|
|
414
|
+
const useV2 = (0, baseTypes_1.isV2Envelope)(encryptedRound1Session);
|
|
415
|
+
const { bitgoGpgKey, userGpgPrvKey } = await this.getBitgoAndUserGpgKeys(bitgoPublicGpgKey, encryptedUserGpgPrvKey, walletPassphrase, adata, EddsaMPCv2Utils.MPS_DSG_SIGNING_USER_GPG_KEY);
|
|
416
|
+
const transactions = txRequest.transactions;
|
|
417
|
+
(0, assert_1.default)(Array.isArray(transactions) && transactions.length === 1, 'txRequest must have exactly one transaction');
|
|
418
|
+
const signatureShares = transactions[0].signatureShares;
|
|
419
|
+
(0, assert_1.default)(signatureShares, 'Missing signature shares in round 1 txRequest');
|
|
420
|
+
const bitgoShareRoundOne = (0, common_1.getBitgoSignatureShare)(signatureShares, baseTypes_1.SignatureShareType.USER, 'round1Output');
|
|
421
|
+
const parsedBitGoToUserSigShareRoundOne = (0, codecs_1.decodeWithCodec)(public_types_1.EddsaMPCv2SignatureShareRound1Output, JSON.parse(bitgoShareRoundOne.share), 'Unexpected signature share response. Unable to parse data.');
|
|
422
|
+
if (parsedBitGoToUserSigShareRoundOne.type !== 'round1Output') {
|
|
423
|
+
throw new Error('Unexpected signature share response. Unable to parse data.');
|
|
424
|
+
}
|
|
425
|
+
const bitgoDeserializedMsg1 = await (0, eddsaMPCv2_1.verifyPeerMessageRoundOne)(parsedBitGoToUserSigShareRoundOne, bitgoGpgKey);
|
|
426
|
+
this.validateAdata(adata, encryptedRound1Session, EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND1_STATE);
|
|
427
|
+
let decryptedRound1Session;
|
|
428
|
+
if (useV2) {
|
|
429
|
+
decryptedRound1Session = await this.bitgo.decryptAsync({
|
|
430
|
+
input: encryptedRound1Session,
|
|
431
|
+
password: walletPassphrase,
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
decryptedRound1Session = this.bitgo.decrypt({
|
|
436
|
+
input: encryptedRound1Session,
|
|
437
|
+
password: walletPassphrase,
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
const { dsgSession, userMsgPayload } = JSON.parse(decryptedRound1Session);
|
|
441
|
+
const userDsg = new sdk_lib_mpc_1.EddsaMPSDsg.DSG(typesMPCv2_1.MPCv2PartiesEnum.USER);
|
|
442
|
+
userDsg.restoreSession(dsgSession);
|
|
443
|
+
const userMsg1 = {
|
|
444
|
+
from: typesMPCv2_1.MPCv2PartiesEnum.USER,
|
|
445
|
+
payload: new Uint8Array(Buffer.from(userMsgPayload, 'base64')),
|
|
446
|
+
};
|
|
447
|
+
const [userMsg2] = userDsg.handleIncomingMessages([userMsg1, bitgoDeserializedMsg1]);
|
|
448
|
+
(0, assert_1.default)(userMsg2, 'DSG handleIncomingMessages produced no round-2 output');
|
|
449
|
+
const signatureShareRound2 = await (0, eddsaMPCv2_1.getSignatureShareRoundTwo)(userMsg2, userGpgPrvKey);
|
|
450
|
+
const sessionPayload = JSON.stringify({
|
|
451
|
+
dsgSession: userDsg.getSession(),
|
|
452
|
+
userMsgPayload: Buffer.from(userMsg2.payload).toString('base64'),
|
|
453
|
+
});
|
|
454
|
+
if (useV2) {
|
|
455
|
+
const session = await this.bitgo.createEncryptionSession(walletPassphrase);
|
|
456
|
+
try {
|
|
457
|
+
const encryptedRound2Session = await session.encrypt(sessionPayload, `${EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND2_STATE}:${adata}`);
|
|
458
|
+
return { signatureShareRound2, encryptedRound2Session };
|
|
459
|
+
}
|
|
460
|
+
finally {
|
|
461
|
+
session.destroy();
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
const encryptedRound2Session = await this.bitgo.encryptAsync({
|
|
465
|
+
input: sessionPayload,
|
|
466
|
+
password: walletPassphrase,
|
|
467
|
+
adata: `${EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND2_STATE}:${adata}`,
|
|
468
|
+
encryptionVersion: 1,
|
|
469
|
+
});
|
|
470
|
+
return { signatureShareRound2, encryptedRound2Session };
|
|
471
|
+
}
|
|
472
|
+
// #endregion
|
|
473
|
+
// #region Round3Share
|
|
474
|
+
async createOfflineRound3Share(params) {
|
|
475
|
+
const { walletPassphrase, encryptedUserGpgPrvKey, encryptedRound2Session, bitgoPublicGpgKey, txRequest } = params;
|
|
476
|
+
const { signableHex, derivationPath } = this.getSignableHexAndDerivationPath(txRequest, 'Unable to find transactions in txRequest');
|
|
477
|
+
const adata = `${signableHex}:${derivationPath}`;
|
|
478
|
+
const useV2 = (0, baseTypes_1.isV2Envelope)(encryptedRound2Session);
|
|
479
|
+
const { bitgoGpgKey, userGpgPrvKey } = await this.getBitgoAndUserGpgKeys(bitgoPublicGpgKey, encryptedUserGpgPrvKey, walletPassphrase, adata, EddsaMPCv2Utils.MPS_DSG_SIGNING_USER_GPG_KEY);
|
|
480
|
+
const transactions = txRequest.transactions;
|
|
481
|
+
(0, assert_1.default)(Array.isArray(transactions) && transactions.length === 1, 'txRequest must have exactly one transaction');
|
|
482
|
+
const signatureShares = transactions[0].signatureShares;
|
|
483
|
+
(0, assert_1.default)(signatureShares, 'Missing signature shares in round 2 txRequest');
|
|
484
|
+
const bitgoShareRoundTwo = (0, common_1.getBitgoSignatureShare)(signatureShares, baseTypes_1.SignatureShareType.USER, 'round2Output');
|
|
485
|
+
const parsedBitGoToUserSigShareRoundTwo = (0, codecs_1.decodeWithCodec)(public_types_1.EddsaMPCv2SignatureShareRound2Output, JSON.parse(bitgoShareRoundTwo.share), 'Unexpected signature share response. Unable to parse data.');
|
|
486
|
+
if (parsedBitGoToUserSigShareRoundTwo.type !== 'round2Output') {
|
|
487
|
+
throw new Error('Unexpected signature share response. Unable to parse data.');
|
|
488
|
+
}
|
|
489
|
+
const bitgoDeserializedMsg2 = await (0, eddsaMPCv2_1.verifyPeerMessageRoundTwo)(parsedBitGoToUserSigShareRoundTwo, bitgoGpgKey);
|
|
490
|
+
this.validateAdata(adata, encryptedRound2Session, EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND2_STATE);
|
|
491
|
+
let decryptedRound2Session;
|
|
492
|
+
if (useV2) {
|
|
493
|
+
decryptedRound2Session = await this.bitgo.decryptAsync({
|
|
494
|
+
input: encryptedRound2Session,
|
|
495
|
+
password: walletPassphrase,
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
else {
|
|
499
|
+
decryptedRound2Session = this.bitgo.decrypt({
|
|
500
|
+
input: encryptedRound2Session,
|
|
501
|
+
password: walletPassphrase,
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
const { dsgSession, userMsgPayload } = JSON.parse(decryptedRound2Session);
|
|
505
|
+
const userDsg = new sdk_lib_mpc_1.EddsaMPSDsg.DSG(typesMPCv2_1.MPCv2PartiesEnum.USER);
|
|
506
|
+
userDsg.restoreSession(dsgSession);
|
|
507
|
+
const userMsg2 = {
|
|
508
|
+
from: typesMPCv2_1.MPCv2PartiesEnum.USER,
|
|
509
|
+
payload: new Uint8Array(Buffer.from(userMsgPayload, 'base64')),
|
|
510
|
+
};
|
|
511
|
+
const [userMsg3] = userDsg.handleIncomingMessages([userMsg2, bitgoDeserializedMsg2]);
|
|
512
|
+
(0, assert_1.default)(userMsg3, 'DSG handleIncomingMessages produced no round-3 output');
|
|
513
|
+
const signatureShareRound3 = await (0, eddsaMPCv2_1.getSignatureShareRoundThree)(userMsg3, userGpgPrvKey);
|
|
514
|
+
return { signatureShareRound3 };
|
|
515
|
+
}
|
|
516
|
+
// #endregion
|
|
517
|
+
/** @inheritdoc */
|
|
518
|
+
async signEddsaMPCv2TssUsingExternalSigner(params, externalSignerEddsaMPCv2SigningRound1Generator, externalSignerEddsaMPCv2SigningRound2Generator, externalSignerEddsaMPCv2SigningRound3Generator, requestType = baseTypes_1.RequestType.tx) {
|
|
519
|
+
const { txRequest, reqId } = params;
|
|
520
|
+
// TODO(WP-2176): Add support for message signing
|
|
521
|
+
(0, assert_1.default)(requestType === baseTypes_1.RequestType.tx, 'Only transaction signing is supported for external signer, got: ' + requestType);
|
|
522
|
+
let txRequestResolved;
|
|
523
|
+
if (typeof txRequest === 'string') {
|
|
524
|
+
txRequestResolved = await (0, common_1.getTxRequest)(this.bitgo, this.wallet.id(), txRequest, reqId);
|
|
525
|
+
}
|
|
526
|
+
else {
|
|
527
|
+
txRequestResolved = txRequest;
|
|
528
|
+
}
|
|
529
|
+
const bitgoPublicGpgKey = await this.pickBitgoPubGpgKeyForSigning(true, reqId, txRequestResolved.enterpriseId, true);
|
|
530
|
+
if (!bitgoPublicGpgKey) {
|
|
531
|
+
throw new Error('Missing BitGo GPG key for MPCv2');
|
|
532
|
+
}
|
|
533
|
+
// round 1
|
|
534
|
+
const { signatureShareRound1, userGpgPubKey, encryptedRound1Session, encryptedUserGpgPrvKey } = await externalSignerEddsaMPCv2SigningRound1Generator({ txRequest: txRequestResolved });
|
|
535
|
+
const round1TxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, [signatureShareRound1], requestType, this.baseCoin.getMPCAlgorithm(), userGpgPubKey, undefined, this.wallet.multisigTypeVersion(), reqId);
|
|
536
|
+
// round 2
|
|
537
|
+
const { signatureShareRound2, encryptedRound2Session } = await externalSignerEddsaMPCv2SigningRound2Generator({
|
|
538
|
+
txRequest: round1TxRequest,
|
|
539
|
+
encryptedRound1Session,
|
|
540
|
+
encryptedUserGpgPrvKey,
|
|
541
|
+
bitgoPublicGpgKey: bitgoPublicGpgKey.armor(),
|
|
542
|
+
});
|
|
543
|
+
const round2TxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, [signatureShareRound2], requestType, this.baseCoin.getMPCAlgorithm(), userGpgPubKey, undefined, this.wallet.multisigTypeVersion(), reqId);
|
|
544
|
+
(0, assert_1.default)(round2TxRequest.transactions && round2TxRequest.transactions[0].signatureShares, 'Missing signature shares in round 2 txRequest');
|
|
545
|
+
// round 3
|
|
546
|
+
const { signatureShareRound3 } = await externalSignerEddsaMPCv2SigningRound3Generator({
|
|
547
|
+
txRequest: round2TxRequest,
|
|
548
|
+
encryptedRound2Session,
|
|
549
|
+
encryptedUserGpgPrvKey,
|
|
550
|
+
bitgoPublicGpgKey: bitgoPublicGpgKey.armor(),
|
|
551
|
+
});
|
|
552
|
+
await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, [signatureShareRound3], requestType, this.baseCoin.getMPCAlgorithm(), userGpgPubKey, undefined, this.wallet.multisigTypeVersion(), reqId);
|
|
553
|
+
return (0, common_1.sendTxRequest)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, requestType, reqId);
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
exports.EddsaMPCv2Utils = EddsaMPCv2Utils;
|
|
557
|
+
EddsaMPCv2Utils.MPS_DSG_SIGNING_USER_GPG_KEY = 'MPS_DSG_SIGNING_USER_GPG_KEY';
|
|
558
|
+
EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND1_STATE = 'MPS_DSG_SIGNING_ROUND1_STATE';
|
|
559
|
+
EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND2_STATE = 'MPS_DSG_SIGNING_ROUND2_STATE';
|
|
560
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRkc2FNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWRkc2EvZWRkc2FNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsNkNBQStCO0FBQy9CLDZDQUE2QztBQUM3QyxzREFTNkI7QUFDN0IseURBQXVGO0FBR3ZGLDREQUFxRztBQUNyRyxnREFBZ0g7QUFDaEgseUNBQStDO0FBQy9DLDhEQU11QztBQUN2QyxxREFBd0Q7QUFDeEQsb0RBQXVEO0FBQ3ZELDRDQWFzQjtBQUV0QixpQ0FBd0M7QUFDeEMscUVBQTZGO0FBRTdGLE1BQWEsZUFBZ0IsU0FBUSxxQkFBYztJQUtqRCxLQUFLLENBQUMsMkJBQTJCLENBQUMsaUJBQXlCLEVBQUUsZ0JBQXdCO1FBQ25GLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztZQUNwRyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sQ0FDTCxPQUFPLGVBQWUsRUFBRSxNQUFNLEVBQUUsSUFBSSxLQUFLLFFBQVE7Z0JBQ2pELE9BQU8sZUFBZSxFQUFFLFdBQVcsRUFBRSxDQUFDLEtBQUssUUFBUTtnQkFDbkQsQ0FBQyxPQUFPLGVBQWUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxLQUFLLFFBQVEsSUFBSSxPQUFPLGVBQWUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUM3RyxDQUFDO1FBQ0osQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJ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QUM7SUFDbEgsQ0FBQzs7QUF2MkJILDBDQXkyQkM7QUF4MkJ5Qiw0Q0FBNEIsR0FBRyw4QkFBOEIsQ0FBQztBQUM5RCw0Q0FBNEIsR0FBRyw4QkFBOEIsQ0FBQztBQUM5RCw0Q0FBNEIsR0FBRyw4QkFBOEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAqIGFzIHBncCBmcm9tICdvcGVucGdwJztcbmltcG9ydCB7IE5vbkVtcHR5U3RyaW5nIH0gZnJvbSAnaW8tdHMtdHlwZXMnO1xuaW1wb3J0IHtcbiAgRWRkc2FNUEN2MktleUdlblJvdW5kMVJlcXVlc3QsXG4gIEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZSxcbiAgRWRkc2FNUEN2MktleUdlblJvdW5kMlJlcXVlc3QsXG4gIEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZSxcbiAgRWRkc2FNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQxT3V0cHV0LFxuICBFZGRzYU1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDJPdXRwdXQsXG4gIE1QQ3YyS2V5R2VuU3RhdGVFbnVtLFxuICBNUEN2MlBhcnR5RnJvbVN0cmluZ09yTnVtYmVyLFxufSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcbmltcG9ydCB7IEVkZHNhTVBTRGtnLCBFZGRzYU1QU0RzZywgTVBTQ29tbXMsIE1QU1R5cGVzIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1tcGMnO1xuaW1wb3J0IHsgS2V5Y2hhaW5zVHJpcGxldCB9IGZyb20gJy4uLy4uLy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IEFkZEtleWNoYWluT3B0aW9ucywgS2V5Y2hhaW4sIEtleVR5cGUsIFdlYmF1dGhuS2V5RW5jcnlwdGlvbkluZm8gfSBmcm9tICcuLi8uLi8uLi9rZXljaGFpbic7XG5pbXBvcnQgeyBlbnZSZXF1aXJlc0JpdGdvUHViR3BnS2V5Q29uZmlnLCBpc0JpdGdvRWRkc2FNcGN2MlB1YktleSB9IGZyb20gJy4uLy4uLy4uL3Rzcy9iaXRnb1B1YktleXMnO1xuaW1wb3J0IHsgZ2V0Qml0Z29TaWduYXR1cmVTaGFyZSwgZ2V0VHhSZXF1ZXN0LCBzZW5kU2lnbmF0dXJlU2hhcmVWMiwgc2VuZFR4UmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL3Rzcy9jb21tb24nO1xuaW1wb3J0IHsgZGVjb2RlV2l0aENvZGVjIH0gZnJvbSAnLi4vLi4vY29kZWNzJztcbmltcG9ydCB7XG4gIGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUsXG4gIGdldFNpZ25hdHVyZVNoYXJlUm91bmRUd28sXG4gIGdldFNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZSxcbiAgdmVyaWZ5UGVlck1lc3NhZ2VSb3VuZE9uZSxcbiAgdmVyaWZ5UGVlck1lc3NhZ2VSb3VuZFR3byxcbn0gZnJvbSAnLi4vLi4vLi4vdHNzL2VkZHNhL2VkZHNhTVBDdjInO1xuaW1wb3J0IHsgZ2VuZXJhdGVHUEdLZXlQYWlyIH0gZnJvbSAnLi4vLi4vb3BlbmdwZ1V0aWxzJztcbmltcG9ydCB7IE1QQ3YyUGFydGllc0VudW0gfSBmcm9tICcuLi9lY2RzYS90eXBlc01QQ3YyJztcbmltcG9ydCB7XG4gIEN1c3RvbUVkZHNhTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21FZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRpbmdGdW5jdGlvbixcbiAgQ3VzdG9tRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIFJlcXVlc3RUeXBlLFxuICBTaWduYXR1cmVTaGFyZVJlY29yZCxcbiAgU2lnbmF0dXJlU2hhcmVUeXBlLFxuICBUU1NQYXJhbXMsXG4gIFRTU1BhcmFtc0Zvck1lc3NhZ2UsXG4gIFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2LFxuICBUU1NQYXJhbXNXaXRoUHJ2LFxuICBUeFJlcXVlc3QsXG4gIGlzVjJFbnZlbG9wZSxcbn0gZnJvbSAnLi4vYmFzZVR5cGVzJztcbmltcG9ydCB7IEVuY3J5cHRpb25WZXJzaW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vYXBpJztcbmltcG9ydCB7IEJhc2VFZGRzYVV0aWxzIH0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7IEVkZHNhTVBDdjJLZXlHZW5TZW5kRm4sIEtleUdlblNlbmRlckZvckVudGVycHJpc2UgfSBmcm9tICcuL2VkZHNhTVBDdjJLZXlHZW5TZW5kZXInO1xuXG5leHBvcnQgY2xhc3MgRWRkc2FNUEN2MlV0aWxzIGV4dGVuZHMgQmFzZUVkZHNhVXRpbHMge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNUFNfRFNHX1NJR05JTkdfVVNFUl9HUEdfS0VZID0gJ01QU19EU0dfU0lHTklOR19VU0VSX0dQR19LRVknO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNUFNfRFNHX1NJR05JTkdfUk9VTkQxX1NUQVRFID0gJ01QU19EU0dfU0lHTklOR19ST1VORDFfU1RBVEUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNUFNfRFNHX1NJR05JTkdfUk9VTkQyX1NUQVRFID0gJ01QU19EU0dfU0lHTklOR19ST1VORDJfU1RBVEUnO1xuXG4gIGFzeW5jIGlzRWRkc2FNcGNWMVNpZ25pbmdNYXRlcmlhbChlbmNyeXB0ZWRLZXlTaGFyZTogc3RyaW5nLCB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0QXN5bmMoeyBpbnB1dDogZW5jcnlwdGVkS2V5U2hhcmUsIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlIH0pO1xuICAgICAgY29uc3Qgc2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShwcnYpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdHlwZW9mIHNpZ25pbmdNYXRlcmlhbD8udVNoYXJlPy5zZWVkID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB0eXBlb2Ygc2lnbmluZ01hdGVyaWFsPy5iaXRnb1lTaGFyZT8udSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgKHR5cGVvZiBzaWduaW5nTWF0ZXJpYWw/LmJhY2t1cFlTaGFyZT8udSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHNpZ25pbmdNYXRlcmlhbD8udXNlcllTaGFyZT8udSA9PT0gJ3N0cmluZycpXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhc3luYyBjcmVhdGVLZXljaGFpbnMocGFyYW1zOiB7XG4gICAgcGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGVudGVycHJpc2U6IHN0cmluZztcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmc7XG4gICAgd2ViYXV0aG5JbmZvPzogV2ViYXV0aG5LZXlFbmNyeXB0aW9uSW5mbztcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IEVuY3J5cHRpb25WZXJzaW9uO1xuICB9KTogUHJvbWlzZTxLZXljaGFpbnNUcmlwbGV0PiB7XG4gICAgY29uc3QgdXNlcktleVBhaXIgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ2VkMjU1MTknKTtcbiAgICBjb25zdCB1c2VyR3BnS2V5ID0gYXdhaXQgcGdwLnJlYWRQcml2YXRlS2V5KHsgYXJtb3JlZEtleTogdXNlcktleVBhaXIucHJpdmF0ZUtleSB9KTtcbiAgICBjb25zdCB1c2VyR3BnUHVibGljS2V5ID0gdXNlcktleVBhaXIucHVibGljS2V5O1xuICAgIGNvbnN0IFt1c2VyUGssIHVzZXJTa10gPSBhd2FpdCBNUFNDb21tcy5leHRyYWN0RWQyNTUxOUtleVBhaXIodXNlckdwZ0tleSk7XG5cbiAgICBjb25zdCBiYWNrdXBLZXlQYWlyID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdlZDI1NTE5Jyk7XG4gICAgY29uc3QgYmFja3VwR3BnS2V5ID0gYXdhaXQgcGdwLnJlYWRQcml2YXRlS2V5KHsgYXJtb3JlZEtleTogYmFja3VwS2V5UGFpci5wcml2YXRlS2V5IH0pO1xuICAgIGNvbnN0IGJhY2t1cEdwZ1B1YmxpY0tleSA9IGJhY2t1cEtleVBhaXIucHVibGljS2V5O1xuICAgIGNvbnN0IFtiYWNrdXBQaywgYmFja3VwU2tdID0gYXdhaXQgTVBTQ29tbXMuZXh0cmFjdEVkMjU1MTlLZXlQYWlyKGJhY2t1cEdwZ0tleSk7XG5cbiAgICAvLyBHZXQgdGhlIEJpdEdvIEVkRFNBIE1QQ3YyIHB1YmxpYyBrZXkgKGVkMjU1MTkpLiBVc2luZyB0aGUgZGVmYXVsdCBtcGN2MlB1YmxpY0tleSAoc2VjcDI1NmsxKVxuICAgIC8vIGhlcmUgd291bGQgY2F1c2UgYSBXQVNNIFwiSW52YWxpZCBJbnB1dFwiIGVycm9yLCBzbyB3ZSByZXF1aXJlIHRoZSBkZWRpY2F0ZWQgZWRkc2FNcGN2MlB1YmxpY0tleS5cbiAgICBjb25zdCB7IGVkZHNhTXBjdjJQdWJsaWNLZXkgfSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29HcGdQdWJrZXlCYXNlZE9uRmVhdHVyZUZsYWdzKHBhcmFtcy5lbnRlcnByaXNlLCB0cnVlKTtcbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9IGVkZHNhTXBjdjJQdWJsaWNLZXkgPz8gdGhpcy5iaXRnb0VkZHNhTXBjdjJQdWJsaWNHcGdLZXk7XG4gICAgYXNzZXJ0KGJpdGdvUHVibGljR3BnS2V5LCAnRmFpbGVkIHRvIGdldCBCaXRHbyBFZERTQSBNUEN2MiBHUEcgcHVibGljIGtleScpO1xuICAgIGNvbnN0IGJpdGdvUHVibGljR3BnS2V5QXJtb3JlZCA9IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCk7XG5cbiAgICBpZiAoZW52UmVxdWlyZXNCaXRnb1B1YkdwZ0tleUNvbmZpZyh0aGlzLmJpdGdvLmdldEVudigpKSkge1xuICAgICAgYXNzZXJ0KGlzQml0Z29FZGRzYU1wY3YyUHViS2V5KGJpdGdvUHVibGljR3BnS2V5QXJtb3JlZCksICdJbnZhbGlkIEJpdEdvIEdQRyBwdWJsaWMga2V5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29LZXlPYmogPSBhd2FpdCBwZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IGJpdGdvUHVibGljR3BnS2V5QXJtb3JlZCB9KTtcbiAgICBjb25zdCBiaXRnb1BrID0gYXdhaXQgTVBTQ29tbXMuZXh0cmFjdEVkMjU1MTlQdWJsaWNLZXkoYml0Z29LZXlPYmopO1xuXG4gICAgLy8gQ3JlYXRlIERLRyBzZXNzaW9ucyBmb3IgdXNlciAocGFydHkgMCkgYW5kIGJhY2t1cCAocGFydHkgMSlcbiAgICBjb25zdCB1c2VyRGtnID0gbmV3IEVkZHNhTVBTRGtnLkRLRygzLCAyLCBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICAgIGNvbnN0IGJhY2t1cERrZyA9IG5ldyBFZGRzYU1QU0RrZy5ES0coMywgMiwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVApO1xuXG4gICAgLy8gI3JlZ2lvbiByb3VuZCAxXG4gICAgYXdhaXQgdXNlckRrZy5pbml0RGtnKHVzZXJTaywgW2JhY2t1cFBrLCBiaXRnb1BrXSk7XG4gICAgYXdhaXQgYmFja3VwRGtnLmluaXREa2coYmFja3VwU2ssIFt1c2VyUGssIGJpdGdvUGtdKTtcblxuICAgIGNvbnN0IHVzZXJNc2cxID0gdXNlckRrZy5nZXRGaXJzdE1lc3NhZ2UoKTtcbiAgICBjb25zdCBiYWNrdXBNc2cxID0gYmFja3VwRGtnLmdldEZpcnN0TWVzc2FnZSgpO1xuXG4gICAgY29uc3QgdXNlclNpZ25lZE1zZzEgPSBhd2FpdCBNUFNDb21tcy5kZXRhY2hTaWduTXBzTWVzc2FnZShCdWZmZXIuZnJvbSh1c2VyTXNnMS5wYXlsb2FkKSwgdXNlckdwZ0tleSk7XG4gICAgY29uc3QgYmFja3VwU2lnbmVkTXNnMSA9IGF3YWl0IE1QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKEJ1ZmZlci5mcm9tKGJhY2t1cE1zZzEucGF5bG9hZCksIGJhY2t1cEdwZ0tleSk7XG5cbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXModXNlckdwZ1B1YmxpY0tleSksICdVc2VyIEdQRyBwdWJsaWMga2V5IGlzIHJlcXVpcmVkJyk7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKGJhY2t1cEdwZ1B1YmxpY0tleSksICdCYWNrdXAgR1BHIHB1YmxpYyBrZXkgaXMgcmVxdWlyZWQnKTtcblxuICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBiaXRnb01zZzEgfSA9IGF3YWl0IHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDEocGFyYW1zLmVudGVycHJpc2UsIHtcbiAgICAgIHVzZXJHcGdQdWJsaWNLZXksXG4gICAgICBiYWNrdXBHcGdQdWJsaWNLZXksXG4gICAgICB1c2VyTXNnMTogdXNlclNpZ25lZE1zZzEsXG4gICAgICBiYWNrdXBNc2cxOiBiYWNrdXBTaWduZWRNc2cxLFxuICAgIH0pO1xuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24gcm91bmQgMlxuICAgIGNvbnN0IGJpdGdvUmF3TXNnMUJ5dGVzID0gYXdhaXQgTVBTQ29tbXMudmVyaWZ5TXBzTWVzc2FnZShiaXRnb01zZzEsIGJpdGdvS2V5T2JqKTtcbiAgICBjb25zdCBiaXRnb0Rlc2VyaWFsaXplZE1zZzE6IE1QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2UgPSB7XG4gICAgICBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLFxuICAgICAgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkoYml0Z29SYXdNc2cxQnl0ZXMpLFxuICAgIH07XG5cbiAgICBjb25zdCByb3VuZDFNZXNzYWdlczogTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZXMgPSBbdXNlck1zZzEsIGJhY2t1cE1zZzEsIGJpdGdvRGVzZXJpYWxpemVkTXNnMV07XG5cbiAgICBjb25zdCB1c2VyUm91bmQyTXNncyA9IHVzZXJEa2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhyb3VuZDFNZXNzYWdlcyk7XG4gICAgY29uc3QgYmFja3VwUm91bmQyTXNncyA9IGJhY2t1cERrZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHJvdW5kMU1lc3NhZ2VzKTtcblxuICAgIGFzc2VydCh1c2VyUm91bmQyTXNncy5sZW5ndGggPT09IDEsICdVc2VyIHJvdW5kIDEgc2hvdWxkIHByb2R1Y2UgZXhhY3RseSBvbmUgcm91bmQgMiBtZXNzYWdlJyk7XG4gICAgYXNzZXJ0KGJhY2t1cFJvdW5kMk1zZ3MubGVuZ3RoID09PSAxLCAnQmFja3VwIHJvdW5kIDEgc2hvdWxkIHByb2R1Y2UgZXhhY3RseSBvbmUgcm91bmQgMiBtZXNzYWdlJyk7XG5cbiAgICBjb25zdCB1c2VyTXNnMiA9IHVzZXJSb3VuZDJNc2dzWzBdO1xuICAgIGNvbnN0IGJhY2t1cE1zZzIgPSBiYWNrdXBSb3VuZDJNc2dzWzBdO1xuXG4gICAgY29uc3QgdXNlclNpZ25lZE1zZzIgPSBhd2FpdCBNUFNDb21tcy5kZXRhY2hTaWduTXBzTWVzc2FnZShCdWZmZXIuZnJvbSh1c2VyTXNnMi5wYXlsb2FkKSwgdXNlckdwZ0tleSk7XG4gICAgY29uc3QgYmFja3VwU2lnbmVkTXNnMiA9IGF3YWl0IE1QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKEJ1ZmZlci5mcm9tKGJhY2t1cE1zZzIucGF5bG9hZCksIGJhY2t1cEdwZ0tleSk7XG5cbiAgICBjb25zdCB7XG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZFJvdW5kMixcbiAgICAgIGNvbW1vblB1YmxpY0tleWNoYWluLFxuICAgICAgYml0Z29Nc2cyLFxuICAgIH0gPSBhd2FpdCB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQyKHBhcmFtcy5lbnRlcnByaXNlLCB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB1c2VyTXNnMjogdXNlclNpZ25lZE1zZzIsXG4gICAgICBiYWNrdXBNc2cyOiBiYWNrdXBTaWduZWRNc2cyLFxuICAgIH0pO1xuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24ga2V5Y2hhaW4gY3JlYXRpb25cbiAgICBhc3NlcnQuZXF1YWwoc2Vzc2lvbklkLCBzZXNzaW9uSWRSb3VuZDIsICdSb3VuZCAxIGFuZCByb3VuZCAyIHNlc3Npb24gSURzIGRvIG5vdCBtYXRjaCcpO1xuXG4gICAgY29uc3QgYml0Z29SYXdNc2cyQnl0ZXMgPSBhd2FpdCBNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKGJpdGdvTXNnMiwgYml0Z29LZXlPYmopO1xuICAgIGNvbnN0IGJpdGdvRGVzZXJpYWxpemVkTXNnMjogTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZSA9IHtcbiAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICBwYXlsb2FkOiBuZXcgVWludDhBcnJheShiaXRnb1Jhd01zZzJCeXRlcyksXG4gICAgfTtcblxuICAgIGNvbnN0IHJvdW5kMk1lc3NhZ2VzOiBNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlcyA9IFt1c2VyTXNnMiwgYmFja3VwTXNnMiwgYml0Z29EZXNlcmlhbGl6ZWRNc2cyXTtcblxuICAgIGNvbnN0IHVzZXJGaW5hbE1zZ3MgPSB1c2VyRGtnLmhhbmRsZUluY29taW5nTWVzc2FnZXMocm91bmQyTWVzc2FnZXMpO1xuICAgIGNvbnN0IGJhY2t1cEZpbmFsTXNncyA9IGJhY2t1cERrZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHJvdW5kMk1lc3NhZ2VzKTtcblxuICAgIGFzc2VydCh1c2VyRmluYWxNc2dzLmxlbmd0aCA9PT0gMCwgJ1dBU00gcm91bmQgMiBzaG91bGQgcHJvZHVjZSBubyBvdXRwdXQgbWVzc2FnZXMgZm9yIHVzZXInKTtcbiAgICBhc3NlcnQoYmFja3VwRmluYWxNc2dzLmxlbmd0aCA9PT0gMCwgJ1dBU00gcm91bmQgMiBzaG91bGQgcHJvZHVjZSBubyBvdXRwdXQgbWVzc2FnZXMgZm9yIGJhY2t1cCcpO1xuXG4gICAgY29uc3QgdXNlckNvbW1vbktleWNoYWluID0gdXNlckRrZy5nZXRDb21tb25LZXljaGFpbigpO1xuICAgIGNvbnN0IGJhY2t1cENvbW1vbktleWNoYWluID0gYmFja3VwRGtnLmdldENvbW1vbktleWNoYWluKCk7XG5cbiAgICBhc3NlcnQuZXF1YWwoXG4gICAgICB1c2VyQ29tbW9uS2V5Y2hhaW4sXG4gICAgICBjb21tb25QdWJsaWNLZXljaGFpbixcbiAgICAgICdVc2VyIGNvbXB1dGVkIGtleWNoYWluIGRvZXMgbm90IG1hdGNoIEJpdEdvIGNvbW1vbiBrZXljaGFpbidcbiAgICApO1xuICAgIGFzc2VydC5lcXVhbChcbiAgICAgIGJhY2t1cENvbW1vbktleWNoYWluLFxuICAgICAgY29tbW9uUHVibGljS2V5Y2hhaW4sXG4gICAgICAnQmFja3VwIGNvbXB1dGVkIGtleWNoYWluIGRvZXMgbm90IG1hdGNoIEJpdEdvIGNvbW1vbiBrZXljaGFpbidcbiAgICApO1xuXG4gICAgY29uc3QgdXNlclByaXZhdGVNYXRlcmlhbCA9IHVzZXJEa2cuZ2V0S2V5U2hhcmUoKTtcbiAgICBjb25zdCBiYWNrdXBQcml2YXRlTWF0ZXJpYWwgPSBiYWNrdXBEa2cuZ2V0S2V5U2hhcmUoKTtcbiAgICBjb25zdCB1c2VyUmVkdWNlZFByaXZhdGVNYXRlcmlhbCA9IHVzZXJEa2cuZ2V0UmVkdWNlZEtleVNoYXJlKCk7XG4gICAgY29uc3QgYmFja3VwUmVkdWNlZFByaXZhdGVNYXRlcmlhbCA9IGJhY2t1cERrZy5nZXRSZWR1Y2VkS2V5U2hhcmUoKTtcblxuICAgIGNvbnN0IHVzZXJLZXljaGFpblByb21pc2UgPSB0aGlzLmFkZFVzZXJLZXljaGFpbihcbiAgICAgIHVzZXJDb21tb25LZXljaGFpbixcbiAgICAgIHVzZXJQcml2YXRlTWF0ZXJpYWwsXG4gICAgICB1c2VyUmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgcGFyYW1zLm9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHBhcmFtcy53ZWJhdXRobkluZm8sXG4gICAgICBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb25cbiAgICApO1xuICAgIGNvbnN0IGJhY2t1cEtleWNoYWluUHJvbWlzZSA9IHRoaXMuYWRkQmFja3VwS2V5Y2hhaW4oXG4gICAgICBiYWNrdXBDb21tb25LZXljaGFpbixcbiAgICAgIGJhY2t1cFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIGJhY2t1cFJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsXG4gICAgICBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb25cbiAgICApO1xuICAgIGNvbnN0IGJpdGdvS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5hZGRCaXRnb0tleWNoYWluKHVzZXJDb21tb25LZXljaGFpbik7XG5cbiAgICBjb25zdCBbdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB1c2VyS2V5Y2hhaW5Qcm9taXNlLFxuICAgICAgYmFja3VwS2V5Y2hhaW5Qcm9taXNlLFxuICAgICAgYml0Z29LZXljaGFpblByb21pc2UsXG4gICAgXSk7XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICB9O1xuICB9XG5cbiAgLy8gI3JlZ2lvbiBrZXljaGFpbiB1dGlsc1xuICBhc3luYyBjcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgIHBhcnRpY2lwYW50SW5kZXg6IE1QQ3YyUGFydHlGcm9tU3RyaW5nT3JOdW1iZXIsXG4gICAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICBwcml2YXRlTWF0ZXJpYWw/OiBCdWZmZXIsXG4gICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbD86IEJ1ZmZlcixcbiAgICBwYXNzcGhyYXNlPzogc3RyaW5nLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZyxcbiAgICB3ZWJhdXRobkluZm8/OiBXZWJhdXRobktleUVuY3J5cHRpb25JbmZvLFxuICAgIGVuY3J5cHRpb25WZXJzaW9uPzogRW5jcnlwdGlvblZlcnNpb25cbiAgKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGxldCBzb3VyY2U6IHN0cmluZztcbiAgICBsZXQgZW5jcnlwdGVkUHJ2OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHJlZHVjZWRFbmNyeXB0ZWRQcnY6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgcHJpdmF0ZU1hdGVyaWFsQmFzZTY0OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBzd2l0Y2ggKHBhcnRpY2lwYW50SW5kZXgpIHtcbiAgICAgIGNhc2UgTVBDdjJQYXJ0aWVzRW51bS5VU0VSOlxuICAgICAgY2FzZSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUDpcbiAgICAgICAgc291cmNlID0gcGFydGljaXBhbnRJbmRleCA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSID8gJ3VzZXInIDogJ2JhY2t1cCc7XG4gICAgICAgIGFzc2VydChwcml2YXRlTWF0ZXJpYWwsIGBQcml2YXRlIG1hdGVyaWFsIGlzIHJlcXVpcmVkIGZvciAke3NvdXJjZX0ga2V5Y2hhaW5gKTtcbiAgICAgICAgYXNzZXJ0KHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsIGBSZWR1Y2VkIHByaXZhdGUgbWF0ZXJpYWwgaXMgcmVxdWlyZWQgZm9yICR7c291cmNlfSBrZXljaGFpbmApO1xuICAgICAgICBhc3NlcnQocGFzc3BocmFzZSwgYFBhc3NwaHJhc2UgaXMgcmVxdWlyZWQgZm9yICR7c291cmNlfSBrZXljaGFpbmApO1xuICAgICAgICBwcml2YXRlTWF0ZXJpYWxCYXNlNjQgPSBwcml2YXRlTWF0ZXJpYWwudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICBlbmNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHRBc3luYyh7XG4gICAgICAgICAgaW5wdXQ6IHByaXZhdGVNYXRlcmlhbEJhc2U2NCxcbiAgICAgICAgICBwYXNzd29yZDogcGFzc3BocmFzZSxcbiAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEVuY3J5cHRzIHRoZSBDQk9SLWVuY29kZWQgUmVkdWNlZEtleVNoYXJlICh3aGljaCBjb250YWlucyB0aGUgcGFydHkncyBwdWJsaWNcbiAgICAgICAgLy8ga2V5KSB3aXRoIHRoZSB3YWxsZXQgcGFzc3BocmFzZS4gVGhlIHJlc3VsdCBpcyBzdG9yZWQgYXMgcmVkdWNlZEVuY3J5cHRlZFBydlxuICAgICAgICAvLyBvbiB0aGUga2V5IGNhcmQgUVIgY29kZSBhbmQgcmVwcmVzZW50cyBhIHNlY29uZCBjb3B5IG9mIGtleSBtYXRlcmlhbFxuICAgICAgICAvLyBiZXlvbmQgdGhlIHNlcnZlci1zdG9yZWQgZW5jcnlwdGVkUHJ2LlxuICAgICAgICByZWR1Y2VkRW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0QXN5bmMoe1xuICAgICAgICAgIC8vIEJ1ZmZlci50b1N0cmluZygnYmFzZTY0JykgY2FuIG5vdCBiZSB1c2VkIGhlcmUgYXMgaXQgZG9lcyBub3Qgd29yayBvbiB0aGUgYnJvd3Nlci5cbiAgICAgICAgICAvLyBUaGUgYnJvd3NlciBkZWFscyB3aXRoIGEgQnVmZmVyIGFzIFVpbnQ4QXJyYXksIHRoZXJlZm9yZSBpbiB0aGUgYnJvd3NlciAudG9TdHJpbmcoJ2Jhc2U2NCcpIGp1c3QgY3JlYXRlcyBhIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmcgb2YgdGhlIGFycmF5IHZhbHVlcy5cbiAgICAgICAgICBpbnB1dDogYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIEFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkocmVkdWNlZFByaXZhdGVNYXRlcmlhbCkpKSksXG4gICAgICAgICAgcGFzc3dvcmQ6IHBhc3NwaHJhc2UsXG4gICAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTVBDdjJQYXJ0aWVzRW51bS5CSVRHTzpcbiAgICAgICAgc291cmNlID0gJ2JpdGdvJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGFydGljaXBhbnQgaW5kZXgnKTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpblBhcmFtczogQWRkS2V5Y2hhaW5PcHRpb25zID0ge1xuICAgICAgc291cmNlLFxuICAgICAga2V5VHlwZTogJ3RzcycgYXMgS2V5VHlwZSxcbiAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgZW5jcnlwdGVkUHJ2LFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgaXNNUEN2MjogdHJ1ZSxcbiAgICB9O1xuXG4gICAgaWYgKHdlYmF1dGhuSW5mbyAmJiBwYXJ0aWNpcGFudEluZGV4ID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgJiYgcHJpdmF0ZU1hdGVyaWFsQmFzZTY0KSB7XG4gICAgICBrZXljaGFpblBhcmFtcy53ZWJhdXRobkRldmljZXMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvdHBEZXZpY2VJZDogd2ViYXV0aG5JbmZvLm90cERldmljZUlkLFxuICAgICAgICAgIHByZlNhbHQ6IHdlYmF1dGhuSW5mby5wcmZTYWx0LFxuICAgICAgICAgIGVuY3J5cHRlZFBydjogYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0QXN5bmMoe1xuICAgICAgICAgICAgaW5wdXQ6IHByaXZhdGVNYXRlcmlhbEJhc2U2NCxcbiAgICAgICAgICAgIHBhc3N3b3JkOiB3ZWJhdXRobkluZm8ucGFzc3BocmFzZSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIHJldHVybiB7IC4uLihhd2FpdCBrZXljaGFpbnMuYWRkKGtleWNoYWluUGFyYW1zKSksIHJlZHVjZWRFbmNyeXB0ZWRQcnYgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkVXNlcktleWNoYWluKFxuICAgIGNvbW1vbktleWNoYWluOiBzdHJpbmcsXG4gICAgcHJpdmF0ZU1hdGVyaWFsOiBCdWZmZXIsXG4gICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbDogQnVmZmVyLFxuICAgIHBhc3NwaHJhc2U6IHN0cmluZyxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmcsXG4gICAgd2ViYXV0aG5JbmZvPzogV2ViYXV0aG5LZXlFbmNyeXB0aW9uSW5mbyxcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IEVuY3J5cHRpb25WZXJzaW9uXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICAgICAgY29tbW9uS2V5Y2hhaW4sXG4gICAgICBwcml2YXRlTWF0ZXJpYWwsXG4gICAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHdlYmF1dGhuSW5mbyxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkQmFja3VwS2V5Y2hhaW4oXG4gICAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICBwcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlcixcbiAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsOiBCdWZmZXIsXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZyxcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IEVuY3J5cHRpb25WZXJzaW9uXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsXG4gICAgICBjb21tb25LZXljaGFpbixcbiAgICAgIHByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZW5jcnlwdGlvblZlcnNpb25cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRCaXRnb0tleWNoYWluKGNvbW1vbktleWNoYWluOiBzdHJpbmcpOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLCBjb21tb25LZXljaGFpbik7XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQxKFxuICAgIGVudGVycHJpc2U6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBFZGRzYU1QQ3YyS2V5R2VuUm91bmQxUmVxdWVzdFxuICApOiBQcm9taXNlPEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQxQnlTZW5kZXIoS2V5R2VuU2VuZGVyRm9yRW50ZXJwcmlzZSh0aGlzLmJpdGdvLCBlbnRlcnByaXNlKSwgcGF5bG9hZCk7XG4gIH1cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMUJ5U2VuZGVyKFxuICAgIHNlbmRlckZuOiBFZGRzYU1QQ3YyS2V5R2VuU2VuZEZuPEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZT4sXG4gICAgcGF5bG9hZDogRWRkc2FNUEN2MktleUdlblJvdW5kMVJlcXVlc3RcbiAgKTogUHJvbWlzZTxFZGRzYU1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gc2VuZGVyRm4oTVBDdjJLZXlHZW5TdGF0ZUVudW1bJ01QQ3YyLVIxJ10sIHBheWxvYWQpO1xuICB9XG5cbiAgYXN5bmMgc2VuZEtleUdlbmVyYXRpb25Sb3VuZDIoXG4gICAgZW50ZXJwcmlzZTogc3RyaW5nLFxuICAgIHBheWxvYWQ6IEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDJSZXF1ZXN0XG4gICk6IFByb21pc2U8RWRkc2FNUEN2MktleUdlblJvdW5kMlJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDJCeVNlbmRlcihLZXlHZW5TZW5kZXJGb3JFbnRlcnByaXNlKHRoaXMuYml0Z28sIGVudGVycHJpc2UpLCBwYXlsb2FkKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQyQnlTZW5kZXIoXG4gICAgc2VuZGVyRm46IEVkZHNhTVBDdjJLZXlHZW5TZW5kRm48RWRkc2FNUEN2MktleUdlblJvdW5kMlJlc3BvbnNlPixcbiAgICBwYXlsb2FkOiBFZGRzYU1QQ3YyS2V5R2VuUm91bmQyUmVxdWVzdFxuICApOiBQcm9taXNlPEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4ge1xuICAgIHJldHVybiBzZW5kZXJGbihNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjItUjInXSwgcGF5bG9hZCk7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBzaWduIHR4IHJlcXVlc3RcblxuICAvKipcbiAgICogU2lnbnMgdGhlIHRyYW5zYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0XG4gICAqL1xuICBhc3luYyBzaWduVHhSZXF1ZXN0KHBhcmFtczogVFNTUGFyYW1zV2l0aFBydik6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgcmV0dXJuIHRoaXMuc2lnblJlcXVlc3RCYXNlKHBhcmFtcywgUmVxdWVzdFR5cGUudHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0XG4gICAqL1xuICBhc3luYyBzaWduVHhSZXF1ZXN0Rm9yTWVzc2FnZShwYXJhbXM6IFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2KTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS5tZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdWxsIDMtcm91bmQgRWREU0EgTVBDdjIgKE1QUykgb25saW5lIHNpZ25pbmcgb3JjaGVzdHJhdGlvbi5cbiAgICpcbiAgICogUHJvdG9jb2wgb3ZlcnZpZXc6XG4gICAqICAgV0FTTSBSb3VuZCAwICDihpIgZ2V0Rmlyc3RNZXNzYWdlKCkgICAgICAocHJvZHVjZXMgdXNlck1zZzEpXG4gICAqICAgQVBJICBSb3VuZCAxICDihpIgc2VuZCB1c2VyTXNnMSAvIHJlY3YgYml0Z29Nc2cxXG4gICAqICAgV0FTTSBSb3VuZCAxICDihpIgaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbdXNlck1zZzEsIGJpdGdvTXNnMV0pICAocHJvZHVjZXMgdXNlck1zZzIpXG4gICAqICAgQVBJICBSb3VuZCAyICDihpIgc2VuZCB1c2VyTXNnMiAvIHJlY3YgYml0Z29Nc2cyXG4gICAqICAgV0FTTSBSb3VuZCAyICDihpIgaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbdXNlck1zZzIsIGJpdGdvTXNnMl0pICAocHJvZHVjZXMgdXNlck1zZzMpXG4gICAqICAgQVBJICBSb3VuZCAzICDihpIgc2VuZCB1c2VyTXNnMyAoV1AgZmluYWxpc2VzOyBubyBCaXRHbyBtc2cgcmV0dXJuZWQgdG8gY2xpZW50KVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduUmVxdWVzdEJhc2UoXG4gICAgcGFyYW1zOiBUU1NQYXJhbXNXaXRoUHJ2IHwgVFNTUGFyYW1zRm9yTWVzc2FnZVdpdGhQcnYsXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlXG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgY29uc3QgdXNlcktleVNoYXJlID0gQnVmZmVyLmZyb20ocGFyYW1zLnBydiwgJ2Jhc2U2NCcpO1xuXG4gICAgY29uc3QgdHhSZXF1ZXN0OiBUeFJlcXVlc3QgPVxuICAgICAgdHlwZW9mIHBhcmFtcy50eFJlcXVlc3QgPT09ICdzdHJpbmcnXG4gICAgICAgID8gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHBhcmFtcy50eFJlcXVlc3QsIHBhcmFtcy5yZXFJZClcbiAgICAgICAgOiBwYXJhbXMudHhSZXF1ZXN0O1xuXG4gICAgbGV0IHR4T3JNZXNzYWdlVG9TaWduO1xuICAgIGxldCBkZXJpdmF0aW9uUGF0aDtcbiAgICBsZXQgYnVmZmVyQ29udGVudDtcbiAgICAvLyBPbmUgZnJlc2ggZWQyNTUxOSBHUEcga2V5IHBhaXIgcGVyIHNpZ25pbmcgc2Vzc2lvbiwgcmV1c2VkIGFjcm9zcyBhbGwgc2lnbmluZyByb3VuZHMuXG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignZWQyNTUxOScpO1xuICAgIGNvbnN0IHVzZXJHcGdQcnZLZXkgPSBhd2FpdCBwZ3AucmVhZFByaXZhdGVLZXkoeyBhcm1vcmVkS2V5OiB1c2VyR3BnS2V5LnByaXZhdGVLZXkgfSk7XG4gICAgY29uc3QgYml0Z29HcGdQdWJLZXkgPSBhd2FpdCB0aGlzLnBpY2tCaXRnb1B1YkdwZ0tleUZvclNpZ25pbmcodHJ1ZSwgcGFyYW1zLnJlcUlkLCB0eFJlcXVlc3QuZW50ZXJwcmlzZUlkLCB0cnVlKTtcbiAgICBhc3NlcnQoYml0Z29HcGdQdWJLZXksICdNaXNzaW5nIEJpdEdvIEdQRyBrZXkgZm9yIE1QQ3YyJyk7XG5cbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4KSB7XG4gICAgICBhc3NlcnQodHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyB8fCB0eFJlcXVlc3QudW5zaWduZWRUeHMsICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID1cbiAgICAgICAgdHhSZXF1ZXN0LmFwaVZlcnNpb24gPT09ICdmdWxsJyA/IHR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnVuc2lnbmVkVHggOiB0eFJlcXVlc3QudW5zaWduZWRUeHMhWzBdO1xuICAgICAgdHhPck1lc3NhZ2VUb1NpZ24gPSB1bnNpZ25lZFR4LnNpZ25hYmxlSGV4O1xuICAgICAgYXNzZXJ0KHR4T3JNZXNzYWdlVG9TaWduLCAnTWlzc2luZyBzaWduYWJsZUhleCBpbiB1bnNpZ25lZFR4Jyk7XG4gICAgICBkZXJpdmF0aW9uUGF0aCA9IHVuc2lnbmVkVHguZGVyaXZhdGlvblBhdGg7XG4gICAgICBidWZmZXJDb250ZW50ID0gQnVmZmVyLmZyb20odHhPck1lc3NhZ2VUb1NpZ24sICdoZXgnKTtcbiAgICAgIGF3YWl0IHRoaXMuYmFzZUNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiB1bnNpZ25lZFR4LnNlcmlhbGl6ZWRUeEhleCA/PyB0eE9yTWVzc2FnZVRvU2lnbiB9LFxuICAgICAgICB0eFBhcmFtczogcGFyYW1zLnR4UGFyYW1zIHx8IHsgcmVjaXBpZW50czogW10gfSxcbiAgICAgICAgd2FsbGV0OiB0aGlzLndhbGxldCxcbiAgICAgICAgd2FsbGV0VHlwZTogdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlKCksXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS5tZXNzYWdlKSB7XG4gICAgICBhc3NlcnQodHhSZXF1ZXN0Lm1lc3NhZ2VzICYmIHR4UmVxdWVzdC5tZXNzYWdlcy5sZW5ndGggPiAwLCAnVW5hYmxlIHRvIGZpbmQgbWVzc2FnZXMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgICB0eE9yTWVzc2FnZVRvU2lnbiA9IHR4UmVxdWVzdC5tZXNzYWdlc1swXS5tZXNzYWdlRW5jb2RlZDtcbiAgICAgIGFzc2VydCh0eE9yTWVzc2FnZVRvU2lnbiwgJ01pc3NpbmcgbWVzc2FnZUVuY29kZWQgaW4gbWVzc2FnZXNbMF0nKTtcbiAgICAgIGRlcml2YXRpb25QYXRoID0gdHhSZXF1ZXN0Lm1lc3NhZ2VzWzBdLmRlcml2YXRpb25QYXRoIHx8ICdtLzAnO1xuICAgICAgYnVmZmVyQ29udGVudCA9IEJ1ZmZlci5mcm9tKHR4T3JNZXNzYWdlVG9TaWduLCAnaGV4Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByZXF1ZXN0IHR5cGUnKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgV0FTTSBSb3VuZCAwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGNvbnN0IHBhcnR5SWQgPSBwYXJhbXMubXBjdjJQYXJ0eUlkID8/IE1QQ3YyUGFydGllc0VudW0uVVNFUjtcbiAgICBjb25zdCBzaWduZXJTaGFyZVR5cGUgPSBwYXJ0eUlkID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgPyBTaWduYXR1cmVTaGFyZVR5cGUuVVNFUiA6IFNpZ25hdHVyZVNoYXJlVHlwZS5CQUNLVVA7XG4gICAgY29uc3QgdXNlckRzZyA9IG5ldyBFZGRzYU1QU0RzZy5EU0cocGFydHlJZCk7XG4gICAgdXNlckRzZy5pbml0RHNnKHVzZXJLZXlTaGFyZSwgYnVmZmVyQ29udGVudCwgZGVyaXZhdGlvblBhdGgsIE1QQ3YyUGFydGllc0VudW0uQklUR08pO1xuICAgIGNvbnN0IHVzZXJNc2cxID0gdXNlckRzZy5nZXRGaXJzdE1lc3NhZ2UoKTtcblxuICAgIC8vIOKUgOKUgCBBUEkgUm91bmQgMSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMSA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUodXNlck1zZzEsIHVzZXJHcGdQcnZLZXksIHBhcnR5SWQpO1xuICAgIGxldCBsYXRlc3RUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3Qud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDFdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuXG4gICAgYXNzZXJ0KGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzLCAnSW52YWxpZCB0eFJlcXVlc3Qgb2JqZWN0IGFmdGVyIHJvdW5kIDEnKTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlczEgPVxuICAgICAgcmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4XG4gICAgICAgID8gbGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyFbMF0uc2lnbmF0dXJlU2hhcmVzXG4gICAgICAgIDogbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzIVswXS5zaWduYXR1cmVTaGFyZXM7XG5cbiAgICBjb25zdCBiaXRnb1NoYXJlUm91bmRPbmUgPSBnZXRCaXRnb1NpZ25hdHVyZVNoYXJlKHNpZ25hdHVyZVNoYXJlczEsIHNpZ25lclNoYXJlVHlwZSwgJ3JvdW5kMU91dHB1dCcpO1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZSA9IGRlY29kZVdpdGhDb2RlYyhcbiAgICAgIEVkZHNhTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMU91dHB1dCxcbiAgICAgIEpTT04ucGFyc2UoYml0Z29TaGFyZVJvdW5kT25lLnNoYXJlKSxcbiAgICAgICdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJ1xuICAgICk7XG5cbiAgICBpZiAocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lLnR5cGUgIT09ICdyb3VuZDFPdXRwdXQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0Rlc2VyaWFsaXplZE1zZzEgPSBhd2FpdCB2ZXJpZnlQZWVyTWVzc2FnZVJvdW5kT25lKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZSwgYml0Z29HcGdQdWJLZXkpO1xuXG4gICAgLy8g4pSA4pSAIFdBU00gUm91bmQgMSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBjb25zdCBbdXNlck1zZzJdID0gdXNlckRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFt1c2VyTXNnMSwgYml0Z29EZXNlcmlhbGl6ZWRNc2cxXSk7XG4gICAgYXNzZXJ0KHVzZXJNc2cyLCAnV0FTTSByb3VuZCAxIHByb2R1Y2VkIG5vIG1lc3NhZ2UnKTtcblxuICAgIC8vIOKUgOKUgCBBUEkgUm91bmQgMiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kVHdvID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFR3byh1c2VyTXNnMiwgdXNlckdwZ1BydktleSwgcGFydHlJZCk7XG4gICAgbGF0ZXN0VHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0LndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmRUd29dLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuXG4gICAgYXNzZXJ0KGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzLCAnSW52YWxpZCB0eFJlcXVlc3Qgb2JqZWN0IGFmdGVyIHJvdW5kIDInKTtcblxuICAgIGNvbnN0IHR4UmVxdWVzdFNpZ25hdHVyZVNoYXJlcyA9XG4gICAgICByZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHhcbiAgICAgICAgPyBsYXRlc3RUeFJlcXVlc3QudHJhbnNhY3Rpb25zIVswXS5zaWduYXR1cmVTaGFyZXNcbiAgICAgICAgOiBsYXRlc3RUeFJlcXVlc3QubWVzc2FnZXMhWzBdLnNpZ25hdHVyZVNoYXJlcztcblxuICAgIGNvbnN0IGJpdGdvU2hhcmVSb3VuZFR3byA9IGdldEJpdGdvU2lnbmF0dXJlU2hhcmUodHhSZXF1ZXN0U2lnbmF0dXJlU2hhcmVzLCBzaWduZXJTaGFyZVR5cGUsICdyb3VuZDJPdXRwdXQnKTtcbiAgICBjb25zdCBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28gPSBkZWNvZGVXaXRoQ29kZWMoXG4gICAgICBFZGRzYU1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDJPdXRwdXQsXG4gICAgICBKU09OLnBhcnNlKGJpdGdvU2hhcmVSb3VuZFR3by5zaGFyZSksXG4gICAgICAnVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLidcbiAgICApO1xuXG4gICAgaWYgKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3by50eXBlICE9PSAncm91bmQyT3V0cHV0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29EZXNlcmlhbGl6ZWRNc2cyID0gYXdhaXQgdmVyaWZ5UGVlck1lc3NhZ2VSb3VuZFR3byhwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28sIGJpdGdvR3BnUHViS2V5KTtcblxuICAgIC8vIOKUgOKUgCBXQVNNIFJvdW5kIDIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgY29uc3QgW3VzZXJNc2czXSA9IHVzZXJEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbdXNlck1zZzIsIGJpdGdvRGVzZXJpYWxpemVkTXNnMl0pO1xuICAgIGFzc2VydCh1c2VyTXNnMywgJ1dBU00gcm91bmQgMiBwcm9kdWNlZCBubyBtZXNzYWdlJyk7XG5cbiAgICAvLyDilIDilIAgQVBJIFJvdW5kIDMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgLy8gTm8gQml0R28gcmVzcG9uc2UgdG8gdmVyaWZ5OyBXUCBmaW5hbGlzZXMgdGhlIHNpZ25pbmcgc2VydmVyLXNpZGVcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMyA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZSh1c2VyTXNnMywgdXNlckdwZ1BydktleSwgcGFydHlJZCk7XG4gICAgY29uc3Qgcm91bmQzVHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0LndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQzXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKTtcbiAgICBhc3NlcnQocm91bmQzVHhSZXF1ZXN0Py50eFJlcXVlc3RJZCA9PT0gdHhSZXF1ZXN0LnR4UmVxdWVzdElkLCAnSW52YWxpZCB0eFJlcXVlc3Qgb2JqZWN0IGFmdGVyIHJvdW5kIDMnKTtcblxuICAgIHJldHVybiBzZW5kVHhSZXF1ZXN0KHRoaXMuYml0Z28sIHR4UmVxdWVzdC53YWxsZXRJZCwgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLCByZXF1ZXN0VHlwZSwgcGFyYW1zLnJlcUlkKTtcbiAgfVxuXG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIGV4dGVybmFsIHNpZ25lclxuXG4gIC8vICNyZWdpb24gUm91bmQxU2hhcmVcbiAgYXN5bmMgY3JlYXRlT2ZmbGluZVJvdW5kMVNoYXJlKHBhcmFtczoge1xuICAgIHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHBydjogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRQcnY/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzaWduYXR1cmVTaGFyZVJvdW5kMTogU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgdXNlckdwZ1B1YktleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFJvdW5kMVNlc3Npb246IHN0cmluZztcbiAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCB7IHBydiwgd2FsbGV0UGFzc3BocmFzZSwgdHhSZXF1ZXN0LCBlbmNyeXB0ZWRQcnYgfSA9IHBhcmFtcztcbiAgICBjb25zdCB7IHNpZ25hYmxlSGV4LCBkZXJpdmF0aW9uUGF0aCB9ID0gdGhpcy5nZXRTaWduYWJsZUhleEFuZERlcml2YXRpb25QYXRoKFxuICAgICAgdHhSZXF1ZXN0LFxuICAgICAgJ1VuYWJsZSB0byBmaW5kIHRyYW5zYWN0aW9ucyBpbiB0eFJlcXVlc3QnXG4gICAgKTtcbiAgICBjb25zdCBhZGF0YSA9IGAke3NpZ25hYmxlSGV4fToke2Rlcml2YXRpb25QYXRofWA7XG5cbiAgICBjb25zdCB1c2VyS2V5U2hhcmUgPSBCdWZmZXIuZnJvbShwcnYsICdiYXNlNjQnKTtcbiAgICBjb25zdCB1c2VyR3BnS2V5ID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdlZDI1NTE5Jyk7XG4gICAgY29uc3QgdXNlckdwZ1BydktleSA9IGF3YWl0IHBncC5yZWFkUHJpdmF0ZUtleSh7IGFybW9yZWRLZXk6IHVzZXJHcGdLZXkucHJpdmF0ZUtleSB9KTtcblxuICAgIGNvbnN0IHVzZXJEc2cgPSBuZXcgRWRkc2FNUFNEc2cuRFNHKE1QQ3YyUGFydGllc0VudW0uVVNFUik7XG4gICAgdXNlckRzZy5pbml0RHNnKHVzZXJLZXlTaGFyZSwgQnVmZmVyLmZyb20oc2lnbmFibGVIZXgsICdoZXgnKSwgZGVyaXZhdGlvblBhdGgsIE1QQ3YyUGFydGllc0VudW0uQklUR08pO1xuICAgIGNvbnN0IHVzZXJNc2cxID0gdXNlckRzZy5nZXRGaXJzdE1lc3NhZ2UoKTtcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMSA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUodXNlck1zZzEsIHVzZXJHcGdQcnZLZXkpO1xuICAgIGNvbnN0IHNlc3Npb25QYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZHNnU2Vzc2lvbjogdXNlckRzZy5nZXRTZXNzaW9uKCksXG4gICAgICB1c2VyTXNnUGF5bG9hZDogQnVmZmVyLmZyb20odXNlck1zZzEucGF5bG9hZCkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIH0pO1xuICAgIGNvbnN0IHVzZXJHcGdQdWJLZXkgPSB1c2VyR3BnS2V5LnB1YmxpY0tleTtcblxuICAgIGNvbnN0IHVzZVYyID0gZW5jcnlwdGVkUHJ2ICE9PSB1bmRlZmluZWQgJiYgaXNWMkVudmVsb3BlKGVuY3J5cHRlZFBydik7XG4gICAgaWYgKHVzZVYyKSB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5jcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbih3YWxsZXRQYXNzcGhyYXNlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZFJvdW5kMVNlc3Npb24gPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQoXG4gICAgICAgICAgc2Vzc2lvblBheWxvYWQsXG4gICAgICAgICAgYCR7RWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19ST1VORDFfU1RBVEV9OiR7YWRhdGF9YFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5ID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KFxuICAgICAgICAgIHVzZXJHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgICBgJHtFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1VTRVJfR1BHX0tFWX06JHthZGF0YX1gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7IHNpZ25hdHVyZVNoYXJlUm91bmQxLCB1c2VyR3BnUHViS2V5LCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5IH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXNzaW9uLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0QXN5bmMoe1xuICAgICAgaW5wdXQ6IHNlc3Npb25QYXlsb2FkLFxuICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YTogYCR7RWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19ST1VORDFfU1RBVEV9OiR7YWRhdGF9YCxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiAxLFxuICAgIH0pO1xuICAgIGNvbnN0IGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHRBc3luYyh7XG4gICAgICBpbnB1dDogdXNlckdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YTogYCR7RWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19VU0VSX0dQR19LRVl9OiR7YWRhdGF9YCxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiAxLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgc2lnbmF0dXJlU2hhcmVSb3VuZDEsIHVzZXJHcGdQdWJLZXksIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgfTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBSb3VuZDJTaGFyZVxuICBhc3luYyBjcmVhdGVPZmZsaW5lUm91bmQyU2hhcmUocGFyYW1zOiB7XG4gICAgdHhSZXF1ZXN0OiBUeFJlcXVlc3Q7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGJpdGdvUHVibGljR3BnS2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkVXNlckdwZ1BydktleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFJvdW5kMVNlc3Npb246IHN0cmluZztcbiAgfSk6IFByb21pc2U8e1xuICAgIHNpZ25hdHVyZVNoYXJlUm91bmQyOiBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCB7IHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIGJpdGdvUHVibGljR3BnS2V5LCB0eFJlcXVlc3QgfSA9IHBhcmFtcztcblxuICAgIGNvbnN0IHsgc2lnbmFibGVIZXgsIGRlcml2YXRpb25QYXRoIH0gPSB0aGlzLmdldFNpZ25hYmxlSGV4QW5kRGVyaXZhdGlvblBhdGgoXG4gICAgICB0eFJlcXVlc3QsXG4gICAgICAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCdcbiAgICApO1xuICAgIGNvbnN0IGFkYXRhID0gYCR7c2lnbmFibGVIZXh9OiR7ZGVyaXZhdGlvblBhdGh9YDtcblxuICAgIGNvbnN0IHVzZVYyID0gaXNWMkVudmVsb3BlKGVuY3J5cHRlZFJvdW5kMVNlc3Npb24pO1xuXG4gICAgY29uc3QgeyBiaXRnb0dwZ0tleSwgdXNlckdwZ1BydktleSB9ID0gYXdhaXQgdGhpcy5nZXRCaXRnb0FuZFVzZXJHcGdLZXlzKFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhLFxuICAgICAgRWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19VU0VSX0dQR19LRVlcbiAgICApO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25zID0gdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucztcbiAgICBhc3NlcnQoQXJyYXkuaXNBcnJheSh0cmFuc2FjdGlvbnMpICYmIHRyYW5zYWN0aW9ucy5sZW5ndGggPT09IDEsICd0eFJlcXVlc3QgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHRyYW5zYWN0aW9uJyk7XG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVzID0gdHJhbnNhY3Rpb25zWzBdLnNpZ25hdHVyZVNoYXJlcztcbiAgICBhc3NlcnQoc2lnbmF0dXJlU2hhcmVzLCAnTWlzc2luZyBzaWduYXR1cmUgc2hhcmVzIGluIHJvdW5kIDEgdHhSZXF1ZXN0Jyk7XG5cbiAgICBjb25zdCBiaXRnb1NoYXJlUm91bmRPbmUgPSBnZXRCaXRnb1NpZ25hdHVyZVNoYXJlKHNpZ25hdHVyZVNoYXJlcywgU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIsICdyb3VuZDFPdXRwdXQnKTtcbiAgICBjb25zdCBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUgPSBkZWNvZGVXaXRoQ29kZWMoXG4gICAgICBFZGRzYU1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDFPdXRwdXQsXG4gICAgICBKU09OLnBhcnNlKGJpdGdvU2hhcmVSb3VuZE9uZS5zaGFyZSksXG4gICAgICAnVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLidcbiAgICApO1xuXG4gICAgaWYgKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZS50eXBlICE9PSAncm91bmQxT3V0cHV0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29EZXNlcmlhbGl6ZWRNc2cxID0gYXdhaXQgdmVyaWZ5UGVlck1lc3NhZ2VSb3VuZE9uZShwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUsIGJpdGdvR3BnS2V5KTtcblxuICAgIHRoaXMudmFsaWRhdGVBZGF0YShhZGF0YSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgRWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19ST1VORDFfU1RBVEUpO1xuXG4gICAgbGV0IGRlY3J5cHRlZFJvdW5kMVNlc3Npb246IHN0cmluZztcbiAgICBpZiAodXNlVjIpIHtcbiAgICAgIGRlY3J5cHRlZFJvdW5kMVNlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHRBc3luYyh7XG4gICAgICAgIGlucHV0OiBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLFxuICAgICAgICBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWNyeXB0ZWRSb3VuZDFTZXNzaW9uID0gdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgaW5wdXQ6IGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sXG4gICAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBkc2dTZXNzaW9uLCB1c2VyTXNnUGF5bG9hZCB9ID0gSlNPTi5wYXJzZShkZWNyeXB0ZWRSb3VuZDFTZXNzaW9uKSBhcyB7XG4gICAgICBkc2dTZXNzaW9uOiBzdHJpbmc7XG4gICAgICB1c2VyTXNnUGF5bG9hZDogc3RyaW5nO1xuICAgIH07XG5cbiAgICBjb25zdCB1c2VyRHNnID0gbmV3IEVkZHNhTVBTRHNnLkRTRyhNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICAgIHVzZXJEc2cucmVzdG9yZVNlc3Npb24oZHNnU2Vzc2lvbik7XG4gICAgY29uc3QgdXNlck1zZzE6IE1QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2UgPSB7XG4gICAgICBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICBwYXlsb2FkOiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh1c2VyTXNnUGF5bG9hZCwgJ2Jhc2U2NCcpKSxcbiAgICB9O1xuXG4gICAgY29uc3QgW3VzZXJNc2cyXSA9IHVzZXJEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbdXNlck1zZzEsIGJpdGdvRGVzZXJpYWxpemVkTXNnMV0pO1xuICAgIGFzc2VydCh1c2VyTXNnMiwgJ0RTRyBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzIHByb2R1Y2VkIG5vIHJvdW5kLTIgb3V0cHV0Jyk7XG5cbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMiA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRUd28odXNlck1zZzIsIHVzZXJHcGdQcnZLZXkpO1xuICAgIGNvbnN0IHNlc3Npb25QYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZHNnU2Vzc2lvbjogdXNlckRzZy5nZXRTZXNzaW9uKCksXG4gICAgICB1c2VyTXNnUGF5bG9hZDogQnVmZmVyLmZyb20odXNlck1zZzIucGF5bG9hZCkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIH0pO1xuXG4gICAgaWYgKHVzZVYyKSB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5jcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbih3YWxsZXRQYXNzcGhyYXNlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZFJvdW5kMlNlc3Npb24gPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQoXG4gICAgICAgICAgc2Vzc2lvblBheWxvYWQsXG4gICAgICAgICAgYCR7RWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19ST1VORDJfU1RBVEV9OiR7YWRhdGF9YFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyBzaWduYXR1cmVTaGFyZVJvdW5kMiwgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiB9O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2Vzc2lvbi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdEFzeW5jKHtcbiAgICAgIGlucHV0OiBzZXNzaW9uUGF5bG9hZCxcbiAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGE6IGAke0VkZHNhTVBDdjJVdGlscy5NUFNfRFNHX1NJR05JTkdfUk9VTkQyX1NUQVRFfToke2FkYXRhfWAsXG4gICAgICBlbmNyeXB0aW9uVmVyc2lvbjogMSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHNpZ25hdHVyZVNoYXJlUm91bmQyLCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uIH07XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gUm91bmQzU2hhcmVcbiAgYXN5bmMgY3JlYXRlT2ZmbGluZVJvdW5kM1NoYXJlKHBhcmFtczoge1xuICAgIHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBiaXRnb1B1YmxpY0dwZ0tleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXk6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzaWduYXR1cmVTaGFyZVJvdW5kMzogU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gIH0+IHtcbiAgICBjb25zdCB7IHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24sIGJpdGdvUHVibGljR3BnS2V5LCB0eFJlcXVlc3QgfSA9IHBhcmFtcztcblxuICAgIGNvbnN0IHsgc2lnbmFibGVIZXgsIGRlcml2YXRpb25QYXRoIH0gPSB0aGlzLmdldFNpZ25hYmxlSGV4QW5kRGVyaXZhdGlvblBhdGgoXG4gICAgICB0eFJlcXVlc3QsXG4gICAgICAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCdcbiAgICApO1xuICAgIGNvbnN0IGFkYXRhID0gYCR7c2lnbmFibGVIZXh9OiR7ZGVyaXZhdGlvblBhdGh9YDtcblxuICAgIGNvbnN0IHVzZVYyID0gaXNWMkVudmVsb3BlKGVuY3J5cHRlZFJvdW5kMlNlc3Npb24pO1xuXG4gICAgY29uc3QgeyBiaXRnb0dwZ0tleSwgdXNlckdwZ1BydktleSB9ID0gYXdhaXQgdGhpcy5nZXRCaXRnb0FuZFVzZXJHcGdLZXlzKFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhLFxuICAgICAgRWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19VU0VSX0dQR19LRVlcbiAgICApO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25zID0gdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucztcbiAgICBhc3NlcnQoQXJyYXkuaXNBcnJheSh0cmFuc2FjdGlvbnMpICYmIHRyYW5zYWN0aW9ucy5sZW5ndGggPT09IDEsICd0eFJlcXVlc3QgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHRyYW5zYWN0aW9uJyk7XG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVzID0gdHJhbnNhY3Rpb25zWzBdLnNpZ25hdHVyZVNoYXJlcztcbiAgICBhc3NlcnQoc2lnbmF0dXJlU2hhcmVzLCAnTWlzc2luZyBzaWduYXR1cmUgc2hhcmVzIGluIHJvdW5kIDIgdHhSZXF1ZXN0Jyk7XG5cbiAgICBjb25zdCBiaXRnb1NoYXJlUm91bmRUd28gPSBnZXRCaXRnb1NpZ25hdHVyZVNoYXJlKHNpZ25hdHVyZVNoYXJlcywgU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIsICdyb3VuZDJPdXRwdXQnKTtcblxuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3byA9IGRlY29kZVdpdGhDb2RlYyhcbiAgICAgIEVkZHNhTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMk91dHB1dCxcbiAgICAgIEpTT04ucGFyc2UoYml0Z29TaGFyZVJvdW5kVHdvLnNoYXJlKSxcbiAgICAgICdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJ1xuICAgICk7XG5cbiAgICBpZiAocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kVHdvLnR5cGUgIT09ICdyb3VuZDJPdXRwdXQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0Rlc2VyaWFsaXplZE1zZzIgPSBhd2FpdCB2ZXJpZnlQZWVyTWVzc2FnZVJvdW5kVHdvKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3bywgYml0Z29HcGdLZXkpO1xuXG4gICAgdGhpcy52YWxpZGF0ZUFkYXRhKGFkYXRhLCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLCBFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1JPVU5EMl9TVEFURSk7XG5cbiAgICBsZXQgZGVjcnlwdGVkUm91bmQyU2Vzc2lvbjogc3RyaW5nO1xuICAgIGlmICh1c2VWMikge1xuICAgICAgZGVjcnlwdGVkUm91bmQyU2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdEFzeW5jKHtcbiAgICAgICAgaW5wdXQ6IGVuY3J5cHRlZFJvdW5kMlNlc3Npb24sXG4gICAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlY3J5cHRlZFJvdW5kMlNlc3Npb24gPSB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgICBpbnB1dDogZW5jcnlwdGVkUm91bmQyU2Vzc2lvbixcbiAgICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGRzZ1Nlc3Npb24sIHVzZXJNc2dQYXlsb2FkIH0gPSBKU09OLnBhcnNlKGRlY3J5cHRlZFJvdW5kMlNlc3Npb24pIGFzIHtcbiAgICAgIGRzZ1Nlc3Npb246IHN0cmluZztcbiAgICAgIHVzZXJNc2dQYXlsb2FkOiBzdHJpbmc7XG4gICAgfTtcblxuICAgIGNvbnN0IHVzZXJEc2cgPSBuZXcgRWRkc2FNUFNEc2cuRFNHKE1QQ3YyUGFydGllc0VudW0uVVNFUik7XG4gICAgdXNlckRzZy5yZXN0b3JlU2Vzc2lvbihkc2dTZXNzaW9uKTtcbiAgICBjb25zdCB1c2VyTXNnMjogTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZSA9IHtcbiAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHVzZXJNc2dQYXlsb2FkLCAnYmFzZTY0JykpLFxuICAgIH07XG5cbiAgICBjb25zdCBbdXNlck1zZzNdID0gdXNlckRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFt1c2VyTXNnMiwgYml0Z29EZXNlcmlhbGl6ZWRNc2cyXSk7XG4gICAgYXNzZXJ0KHVzZXJNc2czLCAnRFNHIGhhbmRsZUluY29taW5nTWVzc2FnZXMgcHJvZHVjZWQgbm8gcm91bmQtMyBvdXRwdXQnKTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmQzID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFRocmVlKHVzZXJNc2czLCB1c2VyR3BnUHJ2S2V5KTtcblxuICAgIHJldHVybiB7IHNpZ25hdHVyZVNoYXJlUm91bmQzIH07XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhc3luYyBzaWduRWRkc2FNUEN2MlRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgcGFyYW1zOiBUU1NQYXJhbXMgfCBUU1NQYXJhbXNGb3JNZXNzYWdlLFxuICAgIGV4dGVybmFsU2lnbmVyRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0b3I6IEN1c3RvbUVkZHNhTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0b3I6IEN1c3RvbUVkZHNhTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0b3I6IEN1c3RvbUVkZHNhTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIHJlcXVlc3RUeXBlOiBSZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlLnR4XG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgY29uc3QgeyB0eFJlcXVlc3QsIHJlcUlkIH0gPSBwYXJhbXM7XG5cbiAgICAvLyBUT0RPKFdQLTIxNzYpOiBBZGQgc3VwcG9ydCBmb3IgbWVzc2FnZSBzaWduaW5nXG4gICAgYXNzZXJ0KFxuICAgICAgcmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4LFxuICAgICAgJ09ubHkgdHJhbnNhY3Rpb24gc2lnbmluZyBpcyBzdXBwb3J0ZWQgZm9yIGV4dGVybmFsIHNpZ25lciwgZ290OiAnICsgcmVxdWVzdFR5cGVcbiAgICApO1xuXG4gICAgbGV0IHR4UmVxdWVzdFJlc29sdmVkOiBUeFJlcXVlc3Q7XG4gICAgaWYgKHR5cGVvZiB0eFJlcXVlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCB0eFJlcXVlc3QsIHJlcUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQgPSB0eFJlcXVlc3Q7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXkgPSBhd2FpdCB0aGlzLnBpY2tCaXRnb1B1YkdwZ0tleUZvclNpZ25pbmcoXG4gICAgICB0cnVlLFxuICAgICAgcmVxSWQsXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC5lbnRlcnByaXNlSWQsXG4gICAgICB0cnVlXG4gICAgKTtcblxuICAgIGlmICghYml0Z29QdWJsaWNHcGdLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBCaXRHbyBHUEcga2V5IGZvciBNUEN2MicpO1xuICAgIH1cblxuICAgIC8vIHJvdW5kIDFcbiAgICBjb25zdCB7IHNpZ25hdHVyZVNoYXJlUm91bmQxLCB1c2VyR3BnUHViS2V5LCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5IH0gPVxuICAgICAgYXdhaXQgZXh0ZXJuYWxTaWduZXJFZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRvcih7IHR4UmVxdWVzdDogdHhSZXF1ZXN0UmVzb2x2ZWQgfSk7XG4gICAgY29uc3Qgcm91bmQxVHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kMV0sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnUHViS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcmVxSWRcbiAgICApO1xuXG4gICAgLy8gcm91bmQgMlxuICAgIGNvbnN0IHsgc2lnbmF0dXJlU2hhcmVSb3VuZDIsIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24gfSA9IGF3YWl0IGV4dGVybmFsU2lnbmVyRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0b3Ioe1xuICAgICAgdHhSZXF1ZXN0OiByb3VuZDFUeFJlcXVlc3QsXG4gICAgICBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLFxuICAgICAgZW5jcnlwdGVkVXNlckdwZ1BydktleSxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5OiBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpLFxuICAgIH0pO1xuICAgIGNvbnN0IHJvdW5kMlR4UmVxdWVzdCA9IGF3YWl0IHNlbmRTaWduYXR1cmVTaGFyZVYyKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDJdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ1B1YktleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHJlcUlkXG4gICAgKTtcbiAgICBhc3NlcnQoXG4gICAgICByb3VuZDJUeFJlcXVlc3QudHJhbnNhY3Rpb25zICYmIHJvdW5kMlR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF0uc2lnbmF0dXJlU2hhcmVzLFxuICAgICAgJ01pc3Npbmcgc2lnbmF0dXJlIHNoYXJlcyBpbiByb3VuZCAyIHR4UmVxdWVzdCdcbiAgICApO1xuXG4gICAgLy8gcm91bmQgM1xuICAgIGNvbnN0IHsgc2lnbmF0dXJlU2hhcmVSb3VuZDMgfSA9IGF3YWl0IGV4dGVybmFsU2lnbmVyRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0b3Ioe1xuICAgICAgdHhSZXF1ZXN0OiByb3VuZDJUeFJlcXVlc3QsXG4gICAgICBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLFxuICAgICAgZW5jcnlwdGVkVXNlckdwZ1BydktleSxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5OiBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpLFxuICAgIH0pO1xuICAgIGF3YWl0IHNlbmRTaWduYXR1cmVTaGFyZVYyKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDNdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ1B1YktleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHJlcUlkXG4gICAgKTtcblxuICAgIHJldHVybiBzZW5kVHhSZXF1ZXN0KHRoaXMuYml0Z28sIHR4UmVxdWVzdFJlc29sdmVkLndhbGxldElkLCB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZCwgcmVxdWVzdFR5cGUsIHJlcUlkKTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG59XG4iXX0=
|