@bitgo-beta/sdk-core 8.2.1-beta.9 → 8.2.1-beta.900
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/CHANGELOG.md +2909 -0
- 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 +16 -2
- package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/enum.js +31 -5
- package/dist/src/account-lib/baseCoin/errors.js +1 -1
- package/dist/src/account-lib/baseCoin/iface.d.ts +11 -35
- package/dist/src/account-lib/baseCoin/iface.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/iface.js +4 -18
- package/dist/src/account-lib/baseCoin/index.d.ts +0 -1
- package/dist/src/account-lib/baseCoin/index.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/index.js +7 -5
- 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/curves/ed25519.d.ts +4 -18
- package/dist/src/account-lib/mpc/curves/ed25519.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/curves/ed25519.js +6 -60
- package/dist/src/account-lib/mpc/index.d.ts +4 -4
- package/dist/src/account-lib/mpc/index.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/index.js +11 -7
- package/dist/src/account-lib/mpc/shamir.d.ts +5 -37
- package/dist/src/account-lib/mpc/shamir.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/shamir.js +6 -130
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +70 -18
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +800 -242
- package/dist/src/account-lib/mpc/tss/ecdsa/index.js +23 -9
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts +3 -3
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.js +5 -5
- package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +114 -78
- 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 +1 -2
- 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 -4
- 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 +19 -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 +61 -31
- 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 +8 -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/{openssl → bitgo/address-book}/index.js +8 -3
- 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 +96 -10
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/baseCoin.js +144 -16
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +100 -20
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +7 -3
- package/dist/src/bitgo/baseCoin/index.js +6 -2
- package/dist/src/bitgo/bip32util.d.ts +0 -1
- package/dist/src/bitgo/bip32util.d.ts.map +1 -1
- package/dist/src/bitgo/bip32util.js +25 -12
- 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 +6 -2
- 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 +1 -1
- package/dist/src/bitgo/coinFactory.d.ts.map +1 -1
- package/dist/src/bitgo/coinFactory.js +1 -1
- package/dist/src/bitgo/config.d.ts +82 -20
- package/dist/src/bitgo/config.d.ts.map +1 -1
- package/dist/src/bitgo/config.js +26 -15
- 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 +16 -14
- package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
- package/dist/src/bitgo/enterprise/enterprise.js +64 -31
- package/dist/src/bitgo/enterprise/enterprises.d.ts +6 -0
- package/dist/src/bitgo/enterprise/enterprises.d.ts.map +1 -1
- package/dist/src/bitgo/enterprise/enterprises.js +48 -9
- package/dist/src/bitgo/enterprise/iEnterprise.d.ts +6 -7
- 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/iEnterprises.d.ts +2 -0
- package/dist/src/bitgo/enterprise/iEnterprises.d.ts.map +1 -1
- package/dist/src/bitgo/enterprise/iEnterprises.js +1 -1
- package/dist/src/bitgo/enterprise/index.js +6 -2
- package/dist/src/bitgo/environments.d.ts +59 -5
- package/dist/src/bitgo/environments.d.ts.map +1 -1
- package/dist/src/bitgo/environments.js +99 -16
- package/dist/src/bitgo/errors.d.ts +6 -0
- package/dist/src/bitgo/errors.d.ts.map +1 -1
- package/dist/src/bitgo/errors.js +14 -2
- package/dist/src/bitgo/index.d.ts +1 -1
- package/dist/src/bitgo/index.d.ts.map +1 -1
- package/dist/src/bitgo/index.js +26 -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.js +6 -7
- package/dist/src/bitgo/keychain/decryptKeychain.d.ts +13 -0
- package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -0
- package/dist/src/bitgo/keychain/decryptKeychain.js +35 -0
- package/dist/src/bitgo/keychain/iKeychains.d.ts +64 -7
- 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 +13 -3
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +155 -58
- package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +126 -91
- package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/ovcJsonCodec.js +53 -32
- 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 +3 -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 +218 -98
- package/dist/src/bitgo/pendingApproval/pendingApprovals.js +23 -9
- package/dist/src/bitgo/recovery/index.js +6 -2
- package/dist/src/bitgo/recovery/initiate.d.ts +8 -2
- package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
- package/dist/src/bitgo/recovery/initiate.js +7 -8
- package/dist/src/bitgo/staking/goStakingWallet.d.ts +36 -0
- package/dist/src/bitgo/staking/goStakingWallet.d.ts.map +1 -0
- package/dist/src/bitgo/staking/goStakingWallet.js +92 -0
- package/dist/src/bitgo/staking/iGoStakingWallet.d.ts +44 -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 +131 -5
- 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 +2 -0
- package/dist/src/bitgo/staking/index.d.ts.map +1 -1
- package/dist/src/bitgo/staking/index.js +8 -2
- package/dist/src/bitgo/staking/stakingWallet.d.ts +20 -3
- package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/stakingWallet.js +53 -4
- package/dist/src/bitgo/trading/iTradingAccount.d.ts +2 -32
- 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 -15
- package/dist/src/bitgo/trading/index.d.ts.map +1 -1
- package/dist/src/bitgo/trading/index.js +7 -17
- 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 +101 -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 +11 -35
- package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
- package/dist/src/bitgo/trading/tradingAccount.js +9 -96
- package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +27 -0
- package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
- package/dist/src/bitgo/tss/bitgoPubKeys.js +61 -0
- package/dist/src/bitgo/tss/common.d.ts +50 -7
- package/dist/src/bitgo/tss/common.d.ts.map +1 -1
- package/dist/src/bitgo/tss/common.js +124 -23
- package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +17 -12
- package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/ecdsa.js +111 -96
- 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 +162 -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 +13 -9
- package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/tss/eddsa/eddsa.js +43 -35
- 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 +19 -0
- 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 +11 -0
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -1
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +66 -10
- package/dist/src/bitgo/utils/codecProps.d.ts +7 -0
- package/dist/src/bitgo/utils/codecProps.d.ts.map +1 -0
- package/dist/src/bitgo/utils/codecProps.js +54 -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 +2 -2
- package/dist/src/bitgo/utils/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/index.js +25 -11
- package/dist/src/bitgo/utils/mpcUtils.d.ts +2 -3
- package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/mpcUtils.js +34 -12
- 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 +11 -9
- package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/opengpgUtils.js +74 -73
- package/dist/src/bitgo/utils/postWithCodec.d.ts +18 -0
- package/dist/src/bitgo/utils/postWithCodec.d.ts.map +1 -0
- package/dist/src/bitgo/utils/postWithCodec.js +25 -0
- 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/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/baseTSSUtils.d.ts +91 -25
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.js +196 -43
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +290 -31
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.js +36 -10
- 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 +56 -49
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +334 -326
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +199 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +950 -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 +15 -9
- 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/eddsa.d.ts +21 -6
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +132 -61
- package/dist/src/bitgo/utils/tss/eddsa/index.js +23 -9
- 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/index.js +23 -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 +47 -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 +119 -0
- package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/BuildParams.js +140 -0
- package/dist/src/bitgo/wallet/iWallet.d.ts +211 -18
- 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 +91 -16
- package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallets.js +43 -3
- package/dist/src/bitgo/wallet/index.js +6 -2
- package/dist/src/bitgo/wallet/wallet.d.ts +200 -25
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +995 -335
- package/dist/src/bitgo/wallet/wallets.d.ts +96 -9
- package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallets.js +816 -193
- package/dist/src/bitgo/webhook/index.js +6 -2
- package/dist/src/bitgo/webhook/webhooks.js +23 -9
- package/dist/src/coins/fiataed.d.ts +30 -0
- package/dist/src/coins/fiataed.d.ts.map +1 -0
- package/dist/src/coins/fiataed.js +57 -0
- package/dist/src/coins/fiateur.d.ts +0 -1
- package/dist/src/coins/fiateur.d.ts.map +1 -1
- package/dist/src/coins/fiatgbp.d.ts +0 -1
- package/dist/src/coins/fiatgbp.d.ts.map +1 -1
- package/dist/src/coins/fiatsgd.d.ts +30 -0
- package/dist/src/coins/fiatsgd.d.ts.map +1 -0
- package/dist/src/coins/fiatsgd.js +57 -0
- package/dist/src/coins/fiatusd.d.ts +0 -1
- package/dist/src/coins/fiatusd.d.ts.map +1 -1
- package/dist/src/coins/index.d.ts +4 -0
- package/dist/src/coins/index.d.ts.map +1 -1
- package/dist/src/coins/index.js +10 -2
- package/dist/src/coins/ofc.d.ts +0 -1
- package/dist/src/coins/ofc.d.ts.map +1 -1
- package/dist/src/coins/ofc.js +2 -2
- package/dist/src/coins/ofcToken.js +2 -2
- package/dist/src/coins/susd.d.ts +0 -1
- package/dist/src/coins/susd.d.ts.map +1 -1
- package/dist/src/coins/tfiataed.d.ts +11 -0
- package/dist/src/coins/tfiataed.d.ts.map +1 -0
- package/dist/src/coins/tfiataed.js +17 -0
- package/dist/src/coins/tfiatsgd.d.ts +11 -0
- package/dist/src/coins/tfiatsgd.d.ts.map +1 -0
- package/dist/src/coins/tfiatsgd.js +17 -0
- 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 +28 -11
- package/dist/src/units.js +5 -6
- package/dist/test/node.utils.d.ts +2 -0
- package/dist/test/node.utils.d.ts.map +1 -0
- package/dist/test/node.utils.js +5 -0
- package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +2 -0
- package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -0
- package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.js +233 -0
- package/dist/test/unit/account-lib/mpc/tss/ecdsa/fixtures.d.ts +3 -0
- package/dist/test/unit/account-lib/mpc/tss/ecdsa/fixtures.d.ts.map +1 -0
- package/dist/test/unit/account-lib/mpc/tss/ecdsa/fixtures.js +24 -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/utils/abstractUtxoCoinUtil.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.js +45 -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.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/postWithCodec.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/postWithCodec.js +73 -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 +105 -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 +68 -0
- package/dist/test/unit/bitgo/wallet/SendTransactionRequest.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/SendTransactionRequest.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/SendTransactionRequest.js +58 -0
- package/dist/test/unit/units.d.ts +2 -0
- package/dist/test/unit/units.d.ts.map +1 -0
- package/dist/test/unit/units.js +98 -0
- package/dist/tsconfig.tsbuildinfo +1 -8272
- package/package.json +25 -21
- 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/account-lib/mpc/hdTree.d.ts +0 -31
- package/dist/src/account-lib/mpc/hdTree.d.ts.map +0 -1
- package/dist/src/account-lib/mpc/hdTree.js +0 -141
- package/dist/src/account-lib/mpc/types.d.ts +0 -5
- package/dist/src/account-lib/mpc/types.d.ts.map +0 -1
- package/dist/src/account-lib/mpc/types.js +0 -3
- 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/trading/affirmation.d.ts +0 -35
- package/dist/src/bitgo/trading/affirmation.d.ts.map +0 -1
- package/dist/src/bitgo/trading/affirmation.js +0 -53
- package/dist/src/bitgo/trading/affirmations.d.ts +0 -23
- package/dist/src/bitgo/trading/affirmations.d.ts.map +0 -1
- package/dist/src/bitgo/trading/affirmations.js +0 -45
- package/dist/src/bitgo/trading/iAffirmation.d.ts +0 -15
- package/dist/src/bitgo/trading/iAffirmation.d.ts.map +0 -1
- package/dist/src/bitgo/trading/iAffirmation.js +0 -13
- package/dist/src/bitgo/trading/iAffirmations.d.ts +0 -10
- package/dist/src/bitgo/trading/iAffirmations.d.ts.map +0 -1
- package/dist/src/bitgo/trading/iAffirmations.js +0 -3
- package/dist/src/bitgo/trading/iSettlement.d.ts +0 -25
- package/dist/src/bitgo/trading/iSettlement.d.ts.map +0 -1
- package/dist/src/bitgo/trading/iSettlement.js +0 -17
- package/dist/src/bitgo/trading/iSettlements.d.ts +0 -19
- package/dist/src/bitgo/trading/iSettlements.d.ts.map +0 -1
- package/dist/src/bitgo/trading/iSettlements.js +0 -3
- package/dist/src/bitgo/trading/iTradingPartner.d.ts +0 -14
- package/dist/src/bitgo/trading/iTradingPartner.d.ts.map +0 -1
- package/dist/src/bitgo/trading/iTradingPartner.js +0 -17
- package/dist/src/bitgo/trading/iTradingPartners.d.ts +0 -15
- package/dist/src/bitgo/trading/iTradingPartners.d.ts.map +0 -1
- package/dist/src/bitgo/trading/iTradingPartners.js +0 -9
- package/dist/src/bitgo/trading/lock.d.ts +0 -16
- package/dist/src/bitgo/trading/lock.d.ts.map +0 -1
- package/dist/src/bitgo/trading/lock.js +0 -12
- package/dist/src/bitgo/trading/payload.d.ts +0 -22
- package/dist/src/bitgo/trading/payload.d.ts.map +0 -1
- package/dist/src/bitgo/trading/payload.js +0 -3
- package/dist/src/bitgo/trading/settlement.d.ts +0 -16
- package/dist/src/bitgo/trading/settlement.d.ts.map +0 -1
- package/dist/src/bitgo/trading/settlement.js +0 -21
- package/dist/src/bitgo/trading/settlements.d.ts +0 -32
- package/dist/src/bitgo/trading/settlements.d.ts.map +0 -1
- package/dist/src/bitgo/trading/settlements.js +0 -61
- package/dist/src/bitgo/trading/trade.d.ts +0 -29
- package/dist/src/bitgo/trading/trade.d.ts.map +0 -1
- package/dist/src/bitgo/trading/trade.js +0 -11
- package/dist/src/bitgo/trading/tradingPartner.d.ts +0 -26
- package/dist/src/bitgo/trading/tradingPartner.d.ts.map +0 -1
- package/dist/src/bitgo/trading/tradingPartner.js +0 -31
- package/dist/src/bitgo/trading/tradingPartners.d.ts +0 -24
- package/dist/src/bitgo/trading/tradingPartners.d.ts.map +0 -1
- package/dist/src/bitgo/trading/tradingPartners.js +0 -32
- 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/openssl/index.d.ts +0 -2
- package/dist/src/openssl/index.d.ts.map +0 -1
- package/dist/src/openssl/openssl.d.ts +0 -12
- package/dist/src/openssl/openssl.d.ts.map +0 -1
- package/dist/src/openssl/openssl.js +0 -48
- package/dist/src/openssl/opensslbytes.d.ts +0 -4
- package/dist/src/openssl/opensslbytes.d.ts.map +0 -1
- package/dist/src/openssl/opensslbytes.js +0 -20
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
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);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -11,32 +15,35 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
11
15
|
}) : function(o, v) {
|
|
12
16
|
o["default"] = v;
|
|
13
17
|
});
|
|
14
|
-
var __importStar = (this && this.__importStar) || function (
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
+
})();
|
|
24
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
36
|
const paillierBigint = __importStar(require("paillier-bigint"));
|
|
26
37
|
const bigintCryptoUtils = __importStar(require("bigint-crypto-utils"));
|
|
27
|
-
const
|
|
28
|
-
const hdTree_1 = require("../../hdTree");
|
|
38
|
+
const secp256k1_1 = require("@noble/curves/secp256k1");
|
|
29
39
|
const crypto_1 = require("crypto");
|
|
30
40
|
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
31
|
-
const crypto_2 = require("../../../util/crypto");
|
|
32
41
|
const util_1 = require("../../util");
|
|
33
42
|
const curves_1 = require("../../curves");
|
|
34
|
-
const shamir_1 = __importDefault(require("../../shamir"));
|
|
35
43
|
const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
|
|
36
44
|
const _5n = BigInt(5);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
45
|
+
// Size of alpha and mu shares in bytes expected by the implementation of the protocol
|
|
46
|
+
const ALPHAMUSIZE = 768;
|
|
40
47
|
/**
|
|
41
48
|
* ECDSA TSS implementation supporting 2:n Threshold
|
|
42
49
|
*/
|
|
@@ -47,12 +54,11 @@ class Ecdsa {
|
|
|
47
54
|
* @param {number} threshold Signing threshold
|
|
48
55
|
* @param {number} numShares Number of shares
|
|
49
56
|
* @param {Buffer} seed optional 64 byte seed to use for key generation
|
|
50
|
-
* @param
|
|
57
|
+
* @param sync optional sync flag, if true then a synchronous version of Paillier key generation is used that does not spawn Worker threads.
|
|
51
58
|
* @returns {Promise<KeyShare>} Returns the private p-share
|
|
52
59
|
* and n-shares to be distributed to participants at their corresponding index.
|
|
53
60
|
*/
|
|
54
61
|
async keyShare(index, threshold, numShares, seed, sync = false) {
|
|
55
|
-
var _a, _b;
|
|
56
62
|
if (!(index > 0 && index <= numShares && threshold <= numShares && threshold === 2)) {
|
|
57
63
|
throw 'Invalid KeyShare Config';
|
|
58
64
|
}
|
|
@@ -62,33 +68,35 @@ class Ecdsa {
|
|
|
62
68
|
let seedWithValidLength = seed;
|
|
63
69
|
if (seed && seed.length > 64) {
|
|
64
70
|
// if seed length is greater than 64 bytes, hash seed to 64 bytes.
|
|
65
|
-
seedWithValidLength = crypto_1.createHash('sha512').update(seed).digest();
|
|
71
|
+
seedWithValidLength = (0, crypto_1.createHash)('sha512').update(seed).digest();
|
|
66
72
|
}
|
|
67
73
|
// Generate additively homomorphic encryption key.
|
|
68
74
|
let paillierKeyPair;
|
|
69
75
|
if (!sync) {
|
|
70
|
-
paillierKeyPair = await paillierBigint.generateRandomKeys(
|
|
76
|
+
paillierKeyPair = await paillierBigint.generateRandomKeys(sdk_lib_mpc_1.minModulusBitLength, true);
|
|
71
77
|
}
|
|
72
78
|
else {
|
|
73
|
-
|
|
79
|
+
// eslint-disable-next-line no-sync
|
|
80
|
+
paillierKeyPair = paillierBigint.generateRandomKeysSync(sdk_lib_mpc_1.minModulusBitLength, true);
|
|
74
81
|
}
|
|
75
82
|
const { publicKey, privateKey } = paillierKeyPair;
|
|
76
83
|
// Accept a 64 byte seed and create an extended private key from that seed
|
|
77
84
|
const secretKey = seedWithValidLength && utxo_lib_1.bip32.fromSeed(seedWithValidLength);
|
|
78
|
-
const u = (
|
|
85
|
+
const u = (secretKey && secretKey.privateKey && (0, util_1.bigIntFromU8ABE)(new Uint8Array(secretKey.privateKey))) ??
|
|
86
|
+
Ecdsa.curve.scalarRandom();
|
|
79
87
|
const y = Ecdsa.curve.basePointMult(u);
|
|
80
|
-
const chaincode = (
|
|
88
|
+
const chaincode = (secretKey && secretKey.chainCode) ?? (0, crypto_1.randomBytes)(32);
|
|
81
89
|
// Compute secret shares of the private key
|
|
82
90
|
const { shares: uShares, v } = Ecdsa.shamir.split(u, threshold, numShares);
|
|
83
91
|
const currentParticipant = {
|
|
84
92
|
i: index,
|
|
85
93
|
t: threshold,
|
|
86
94
|
c: numShares,
|
|
87
|
-
l: util_1.bigIntToBufferBE(privateKey.lambda, 192).toString('hex'),
|
|
88
|
-
m: util_1.bigIntToBufferBE(privateKey.mu, 192).toString('hex'),
|
|
89
|
-
n: util_1.bigIntToBufferBE(publicKey.n, 384).toString('hex'),
|
|
90
|
-
y: util_1.bigIntToBufferBE(y, 33).toString('hex'),
|
|
91
|
-
u: util_1.bigIntToBufferBE(uShares[index], 32).toString('hex'),
|
|
95
|
+
l: (0, util_1.bigIntToBufferBE)(privateKey.lambda, 192).toString('hex'),
|
|
96
|
+
m: (0, util_1.bigIntToBufferBE)(privateKey.mu, 192).toString('hex'),
|
|
97
|
+
n: (0, util_1.bigIntToBufferBE)(publicKey.n, 384).toString('hex'),
|
|
98
|
+
y: (0, util_1.bigIntToBufferBE)(y, 33).toString('hex'),
|
|
99
|
+
u: (0, util_1.bigIntToBufferBE)(uShares[index], 32).toString('hex'),
|
|
92
100
|
uu: u.toString(),
|
|
93
101
|
chaincode: chaincode.toString('hex'),
|
|
94
102
|
};
|
|
@@ -103,9 +111,9 @@ class Ecdsa {
|
|
|
103
111
|
i: participantIndex,
|
|
104
112
|
j: currentParticipant['i'],
|
|
105
113
|
n: publicKey.n.toString(16),
|
|
106
|
-
y: util_1.bigIntToBufferBE(y, 33).toString('hex'),
|
|
107
|
-
v: util_1.bigIntToBufferBE(v[0], 33).toString('hex'),
|
|
108
|
-
u: util_1.bigIntToBufferBE(uShares[participantIndex], 32).toString('hex'),
|
|
114
|
+
y: (0, util_1.bigIntToBufferBE)(y, 33).toString('hex'),
|
|
115
|
+
v: (0, util_1.bigIntToBufferBE)(v[0], 33).toString('hex'),
|
|
116
|
+
u: (0, util_1.bigIntToBufferBE)(uShares[participantIndex], 32).toString('hex'),
|
|
109
117
|
chaincode: chaincode.toString('hex'),
|
|
110
118
|
};
|
|
111
119
|
}
|
|
@@ -122,22 +130,26 @@ class Ecdsa {
|
|
|
122
130
|
keyCombine(pShare, nShares) {
|
|
123
131
|
const allShares = [pShare, ...nShares];
|
|
124
132
|
// Compute the public key.
|
|
125
|
-
const y = allShares.map((participant) =>
|
|
133
|
+
const y = allShares.map((participant) => (0, sdk_lib_mpc_1.hexToBigInt)(participant['y'])).reduce(Ecdsa.curve.pointAdd);
|
|
126
134
|
// Add secret shares
|
|
127
|
-
const x = allShares.map((participant) =>
|
|
135
|
+
const x = allShares.map((participant) => (0, sdk_lib_mpc_1.hexToBigInt)(participant['u'])).reduce(Ecdsa.curve.scalarAdd);
|
|
128
136
|
// Verify shares.
|
|
129
137
|
for (const share of nShares) {
|
|
130
138
|
if (share.v) {
|
|
131
139
|
try {
|
|
132
|
-
Ecdsa.shamir.verify(
|
|
140
|
+
Ecdsa.shamir.verify((0, sdk_lib_mpc_1.hexToBigInt)(share.u), [(0, sdk_lib_mpc_1.hexToBigInt)(share.y), (0, sdk_lib_mpc_1.hexToBigInt)(share.v)], pShare.i);
|
|
133
141
|
}
|
|
134
142
|
catch (err) {
|
|
135
143
|
throw new Error(`Could not verify share from participant ${share.j}. Verification error: ${err}`);
|
|
136
144
|
}
|
|
137
145
|
}
|
|
138
146
|
}
|
|
147
|
+
// Generate Schnorr proof of knowledge of the discrete log of X = xG.
|
|
148
|
+
const X = Ecdsa.curve.basePointMult(x);
|
|
149
|
+
const proofContext = (0, crypto_1.createHash)('sha256').update((0, util_1.bigIntToBufferBE)(y, Ecdsa.curve.pointBytes)).digest();
|
|
150
|
+
const schnorrProofX = sdk_lib_mpc_1.Schnorr.createSchnorrProof(X, x, Ecdsa.curve, proofContext);
|
|
139
151
|
// Chaincode will be used in future when we add support for key derivation for ecdsa
|
|
140
|
-
const chaincodes = [pShare, ...nShares].map(({ chaincode }) => util_1.bigIntFromBufferBE(Buffer.from(chaincode, 'hex')));
|
|
152
|
+
const chaincodes = [pShare, ...nShares].map(({ chaincode }) => (0, util_1.bigIntFromBufferBE)(Buffer.from(chaincode, 'hex')));
|
|
141
153
|
const chaincode = chaincodes.reduce((acc, chaincode) => (acc + chaincode) % BigInt('0x010000000000000000000000000000000000000000000000000000000000000000') // 2^256
|
|
142
154
|
);
|
|
143
155
|
const participants = {
|
|
@@ -146,9 +158,10 @@ class Ecdsa {
|
|
|
146
158
|
l: pShare.l,
|
|
147
159
|
m: pShare.m,
|
|
148
160
|
n: pShare.n,
|
|
149
|
-
y: util_1.bigIntToBufferBE(y, 33).toString('hex'),
|
|
150
|
-
x: util_1.bigIntToBufferBE(x, 32).toString('hex'),
|
|
151
|
-
|
|
161
|
+
y: (0, util_1.bigIntToBufferBE)(y, 33).toString('hex'),
|
|
162
|
+
x: (0, util_1.bigIntToBufferBE)(x, 32).toString('hex'),
|
|
163
|
+
schnorrProofX: schnorrProofX,
|
|
164
|
+
chaincode: (0, util_1.bigIntToBufferBE)(chaincode, 32).toString('hex'),
|
|
152
165
|
},
|
|
153
166
|
yShares: {},
|
|
154
167
|
};
|
|
@@ -171,17 +184,17 @@ class Ecdsa {
|
|
|
171
184
|
* be distributed to participants at their corresponding index.
|
|
172
185
|
*/
|
|
173
186
|
keyDerive(pShare, nShares, path) {
|
|
174
|
-
const yValues = [pShare, ...nShares].map((share) =>
|
|
187
|
+
const yValues = [pShare, ...nShares].map((share) => (0, sdk_lib_mpc_1.hexToBigInt)(share.y));
|
|
175
188
|
const y = yValues.reduce((partial, share) => Ecdsa.curve.pointAdd(partial, share));
|
|
176
189
|
const u = BigInt(pShare.uu);
|
|
177
|
-
let contribChaincode =
|
|
178
|
-
const chaincodes = [contribChaincode, ...nShares.map(({ chaincode }) =>
|
|
179
|
-
const chaincode = chaincodes.reduce((acc, chaincode) => (acc + chaincode) %
|
|
190
|
+
let contribChaincode = (0, sdk_lib_mpc_1.hexToBigInt)(pShare.chaincode);
|
|
191
|
+
const chaincodes = [contribChaincode, ...nShares.map(({ chaincode }) => (0, sdk_lib_mpc_1.hexToBigInt)(chaincode))];
|
|
192
|
+
const chaincode = chaincodes.reduce((acc, chaincode) => (acc + chaincode) % sdk_lib_mpc_1.chaincodeBase);
|
|
180
193
|
// Verify shares.
|
|
181
194
|
for (const share of nShares) {
|
|
182
195
|
if (share.v) {
|
|
183
196
|
try {
|
|
184
|
-
Ecdsa.shamir.verify(
|
|
197
|
+
Ecdsa.shamir.verify((0, sdk_lib_mpc_1.hexToBigInt)(share.u), [(0, sdk_lib_mpc_1.hexToBigInt)(share.y), (0, sdk_lib_mpc_1.hexToBigInt)(share.v)], pShare.i);
|
|
185
198
|
}
|
|
186
199
|
catch (err) {
|
|
187
200
|
throw new Error(`Could not verify share from participant ${share.j}. Verification error: ${err}`);
|
|
@@ -193,20 +206,25 @@ class Ecdsa {
|
|
|
193
206
|
// Calculate new public key contribution.
|
|
194
207
|
const contribY = Ecdsa.curve.basePointMult(subkey.sk);
|
|
195
208
|
// Calculate new chaincode contribution.
|
|
196
|
-
const chaincodeDelta = (
|
|
197
|
-
contribChaincode = (contribChaincode + chaincodeDelta) %
|
|
209
|
+
const chaincodeDelta = (sdk_lib_mpc_1.chaincodeBase + subkey.chaincode - chaincode) % sdk_lib_mpc_1.chaincodeBase;
|
|
210
|
+
contribChaincode = (contribChaincode + chaincodeDelta) % sdk_lib_mpc_1.chaincodeBase;
|
|
198
211
|
// Calculate new u values.
|
|
199
212
|
const { shares: split_u, v } = Ecdsa.shamir.split(subkey.sk, pShare.t || 2, pShare.c || 3);
|
|
200
213
|
// Calculate new signing key.
|
|
201
|
-
const x = [split_u[pShare.i], ...nShares.map(({ u }) =>
|
|
214
|
+
const x = [split_u[pShare.i], ...nShares.map(({ u }) => (0, sdk_lib_mpc_1.hexToBigInt)(u))].reduce(Ecdsa.curve.scalarAdd);
|
|
215
|
+
// Generate Schnorr proof of knowledge of the discrete log of X = xG.
|
|
216
|
+
const X = Ecdsa.curve.basePointMult(x);
|
|
217
|
+
const proofContext = (0, crypto_1.createHash)('sha256').update((0, util_1.bigIntToBufferBE)(subkey.pk, Ecdsa.curve.pointBytes)).digest();
|
|
218
|
+
const schnorrProofX = sdk_lib_mpc_1.Schnorr.createSchnorrProof(X, x, Ecdsa.curve, proofContext);
|
|
202
219
|
const P_i = {
|
|
203
220
|
i: pShare.i,
|
|
204
221
|
l: pShare.l,
|
|
205
222
|
m: pShare.m,
|
|
206
223
|
n: pShare.n,
|
|
207
|
-
y: util_1.bigIntToBufferBE(subkey.pk, 33).toString('hex'),
|
|
208
|
-
x: util_1.bigIntToBufferBE(x, 32).toString('hex'),
|
|
209
|
-
|
|
224
|
+
y: (0, util_1.bigIntToBufferBE)(subkey.pk, 33).toString('hex'),
|
|
225
|
+
x: (0, util_1.bigIntToBufferBE)(x, 32).toString('hex'),
|
|
226
|
+
schnorrProofX: schnorrProofX,
|
|
227
|
+
chaincode: (0, util_1.bigIntToBufferBE)(subkey.chaincode, 32).toString('hex'),
|
|
210
228
|
};
|
|
211
229
|
const shares = {
|
|
212
230
|
xShare: P_i,
|
|
@@ -217,15 +235,37 @@ class Ecdsa {
|
|
|
217
235
|
shares.nShares[P_j.j] = {
|
|
218
236
|
i: P_j.j,
|
|
219
237
|
j: P_i.i,
|
|
220
|
-
n:
|
|
221
|
-
u: util_1.bigIntToBufferBE(split_u[P_j.j], 32).toString('hex'),
|
|
222
|
-
y: util_1.bigIntToBufferBE(contribY, 32).toString('hex'),
|
|
223
|
-
v: util_1.bigIntToBufferBE(v[0], 32).toString('hex'),
|
|
224
|
-
chaincode: util_1.bigIntToBufferBE(contribChaincode, 32).toString('hex'),
|
|
238
|
+
n: P_i.n,
|
|
239
|
+
u: (0, util_1.bigIntToBufferBE)(split_u[P_j.j], 32).toString('hex'),
|
|
240
|
+
y: (0, util_1.bigIntToBufferBE)(contribY, 32).toString('hex'),
|
|
241
|
+
v: (0, util_1.bigIntToBufferBE)(v[0], 32).toString('hex'),
|
|
242
|
+
chaincode: (0, util_1.bigIntToBufferBE)(contribChaincode, 32).toString('hex'),
|
|
225
243
|
};
|
|
226
244
|
}
|
|
227
245
|
return shares;
|
|
228
246
|
}
|
|
247
|
+
/**
|
|
248
|
+
* Verify Schnorr proof of knowledge of the discrete log of X_i = x_i * G.
|
|
249
|
+
* @param Y The combined public key.
|
|
250
|
+
* @param VSSs The VSS shares received from all participants.
|
|
251
|
+
* @param index The i of X_i.
|
|
252
|
+
* @param proof The schnorr proof.
|
|
253
|
+
* @returns True if it's a valid proof with regards to Y and VSSs.
|
|
254
|
+
*/
|
|
255
|
+
verifySchnorrProofX(Y, VSSs, index, proof) {
|
|
256
|
+
if (index < 1 || index > VSSs.length) {
|
|
257
|
+
throw new Error('Invalid value supplied for index');
|
|
258
|
+
}
|
|
259
|
+
// Calculate X_i from public information.
|
|
260
|
+
let X_i = Y;
|
|
261
|
+
VSSs.forEach((VSS) => {
|
|
262
|
+
VSS.forEach((v) => {
|
|
263
|
+
X_i = Ecdsa.curve.pointAdd(X_i, Ecdsa.curve.pointMultiply(v, BigInt(index)));
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
const proofContext = (0, crypto_1.createHash)('sha256').update((0, util_1.bigIntToBufferBE)(Y, Ecdsa.curve.pointBytes)).digest();
|
|
267
|
+
return sdk_lib_mpc_1.Schnorr.verifySchnorrProof(X_i, proof, Ecdsa.curve, proofContext);
|
|
268
|
+
}
|
|
229
269
|
/**
|
|
230
270
|
* Derives a child common keychain from common keychain
|
|
231
271
|
*
|
|
@@ -239,40 +279,29 @@ class Ecdsa {
|
|
|
239
279
|
}
|
|
240
280
|
const keychain = Buffer.from(commonKeychain, 'hex');
|
|
241
281
|
const derivedPublicKeychain = Ecdsa.hdTree.publicDerive({
|
|
242
|
-
pk: util_1.bigIntFromBufferBE(keychain.slice(0, 33)),
|
|
243
|
-
chaincode: util_1.bigIntFromBufferBE(keychain.slice(33)),
|
|
282
|
+
pk: (0, util_1.bigIntFromBufferBE)(keychain.slice(0, 33)),
|
|
283
|
+
chaincode: (0, util_1.bigIntFromBufferBE)(keychain.slice(33)),
|
|
244
284
|
}, path);
|
|
245
|
-
const derivedPk = util_1.bigIntToBufferBE(derivedPublicKeychain.pk, 33).toString('hex');
|
|
246
|
-
const derivedChaincode = util_1.bigIntToBufferBE(derivedPublicKeychain.chaincode, 32).toString('hex');
|
|
285
|
+
const derivedPk = (0, util_1.bigIntToBufferBE)(derivedPublicKeychain.pk, 33).toString('hex');
|
|
286
|
+
const derivedChaincode = (0, util_1.bigIntToBufferBE)(derivedPublicKeychain.chaincode, 32).toString('hex');
|
|
247
287
|
return derivedPk + derivedChaincode;
|
|
248
288
|
}
|
|
249
289
|
/**
|
|
250
290
|
* Appends a given range proof challenge to the shares previously created
|
|
251
291
|
* by #keyCombine. Generates a new challenge if not provided.
|
|
252
|
-
* @param {XShare}
|
|
253
|
-
* @param
|
|
254
|
-
*
|
|
255
|
-
* @
|
|
256
|
-
* @returns {KeyCombined} The new XShare and YShares with the amended
|
|
257
|
-
* challenge values
|
|
292
|
+
* @param {XShare | YShare} share Private xShare or yShare of the signing operation
|
|
293
|
+
* @param rangeProofChallenge - challenge generated via generateNtilde
|
|
294
|
+
* @param paillierProofChallenge
|
|
295
|
+
* @returns {KeyCombined} The share with amended challenge values
|
|
258
296
|
*/
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
challenge = sdk_lib_mpc_1.EcdsaTypes.serializeNtilde(await sdk_lib_mpc_1.EcdsaRangeProof.generateNtilde(3072));
|
|
262
|
-
}
|
|
263
|
-
const { ntilde, h1, h2 } = challenge;
|
|
297
|
+
appendChallenge(share, rangeProofChallenge, paillierProofChallenge) {
|
|
298
|
+
const { ntilde, h1, h2 } = rangeProofChallenge;
|
|
264
299
|
return {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
n: xShare.n,
|
|
271
|
-
ntilde,
|
|
272
|
-
h1,
|
|
273
|
-
h2,
|
|
274
|
-
},
|
|
275
|
-
},
|
|
300
|
+
...share,
|
|
301
|
+
ntilde,
|
|
302
|
+
h1,
|
|
303
|
+
h2,
|
|
304
|
+
p: paillierProofChallenge.p,
|
|
276
305
|
};
|
|
277
306
|
}
|
|
278
307
|
/**
|
|
@@ -283,69 +312,487 @@ class Ecdsa {
|
|
|
283
312
|
* and k-share to be distributed to other participant signer
|
|
284
313
|
*/
|
|
285
314
|
async signShare(xShare, yShare) {
|
|
286
|
-
const pk = util_1.getPaillierPublicKey(
|
|
287
|
-
// Generate a challenge if ntilde is not present in the xShare.
|
|
288
|
-
if (!hasNtilde(xShare)) {
|
|
289
|
-
xShare = (await this.appendChallenge(xShare, yShare)).xShare;
|
|
290
|
-
}
|
|
315
|
+
const pk = (0, util_1.getPaillierPublicKey)((0, sdk_lib_mpc_1.hexToBigInt)(xShare.n));
|
|
291
316
|
const k = Ecdsa.curve.scalarRandom();
|
|
292
|
-
const rk = await sdk_lib_mpc_1.
|
|
317
|
+
const rk = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pk.n);
|
|
293
318
|
const ck = pk.encrypt(k, rk);
|
|
294
319
|
const gamma = Ecdsa.curve.scalarRandom();
|
|
295
320
|
const d = Ecdsa.curve.scalarMult(Ecdsa.curve.scalarSub(BigInt(yShare.j), BigInt(xShare.i)), BigInt(xShare.i));
|
|
296
321
|
const w = [
|
|
297
322
|
Ecdsa.curve.scalarMult(BigInt(yShare.j), BigInt(xShare.i)),
|
|
298
|
-
|
|
323
|
+
(0, sdk_lib_mpc_1.hexToBigInt)(xShare['x']),
|
|
299
324
|
Ecdsa.curve.scalarInvert(d),
|
|
300
325
|
].reduce(Ecdsa.curve.scalarMult);
|
|
301
326
|
const { ntilde: ntildea, h1: h1a, h2: h2a } = xShare;
|
|
302
|
-
const
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
},
|
|
317
|
-
kShare: {},
|
|
327
|
+
const wShare = {
|
|
328
|
+
i: xShare.i,
|
|
329
|
+
l: xShare.l,
|
|
330
|
+
m: xShare.m,
|
|
331
|
+
n: xShare.n,
|
|
332
|
+
y: xShare.y,
|
|
333
|
+
ntilde: ntildea,
|
|
334
|
+
h1: h1a,
|
|
335
|
+
h2: h2a,
|
|
336
|
+
p: xShare.p,
|
|
337
|
+
k: (0, util_1.bigIntToBufferBE)(k, 32).toString('hex'),
|
|
338
|
+
ck: (0, util_1.bigIntToBufferBE)(ck, 768).toString('hex'),
|
|
339
|
+
w: (0, util_1.bigIntToBufferBE)(w, 32).toString('hex'),
|
|
340
|
+
gamma: (0, util_1.bigIntToBufferBE)(gamma, 32).toString('hex'),
|
|
318
341
|
};
|
|
319
342
|
const { ntilde: ntildeb, h1: h1b, h2: h2b } = yShare;
|
|
320
|
-
const proof = await sdk_lib_mpc_1.EcdsaRangeProof.prove(Ecdsa.curve,
|
|
321
|
-
ntilde:
|
|
322
|
-
h1:
|
|
323
|
-
h2:
|
|
343
|
+
const proof = await sdk_lib_mpc_1.EcdsaRangeProof.prove(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pk, {
|
|
344
|
+
ntilde: (0, sdk_lib_mpc_1.hexToBigInt)(ntildeb),
|
|
345
|
+
h1: (0, sdk_lib_mpc_1.hexToBigInt)(h1b),
|
|
346
|
+
h2: (0, sdk_lib_mpc_1.hexToBigInt)(h2b),
|
|
324
347
|
}, ck, k, rk);
|
|
348
|
+
// create paillier challenge proof based on the other signers challenge
|
|
349
|
+
// only send sigma if we also send challenge p
|
|
350
|
+
const sigma = sdk_lib_mpc_1.EcdsaPaillierProof.prove((0, sdk_lib_mpc_1.hexToBigInt)(xShare.n), (0, sdk_lib_mpc_1.hexToBigInt)(xShare.l), sdk_lib_mpc_1.EcdsaTypes.deserializePaillierChallenge({ p: yShare.p }).p);
|
|
325
351
|
const proofShare = {
|
|
326
|
-
z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
|
|
327
|
-
u: util_1.bigIntToBufferBE(proof.u, 768).toString('hex'),
|
|
328
|
-
w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
|
|
329
|
-
s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
|
|
330
|
-
s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
|
|
331
|
-
s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
|
|
352
|
+
z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
|
|
353
|
+
u: (0, util_1.bigIntToBufferBE)(proof.u, 768).toString('hex'),
|
|
354
|
+
w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
|
|
355
|
+
s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
|
|
356
|
+
s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
|
|
357
|
+
s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
|
|
332
358
|
};
|
|
333
|
-
|
|
359
|
+
const kShare = {
|
|
360
|
+
// this share will be sent to the other participant,
|
|
361
|
+
// so we need to swap the i and j values here
|
|
362
|
+
// so that they know it's their kShare, produced by us
|
|
334
363
|
i: yShare.j,
|
|
335
364
|
j: xShare.i,
|
|
336
365
|
n: pk.n.toString(16),
|
|
337
366
|
ntilde: ntildea,
|
|
338
367
|
h1: h1a,
|
|
339
368
|
h2: h2a,
|
|
340
|
-
|
|
369
|
+
p: xShare.p,
|
|
370
|
+
k: (0, util_1.bigIntToBufferBE)(ck, 768).toString('hex'),
|
|
371
|
+
sigma: sdk_lib_mpc_1.EcdsaTypes.serializePaillierChallengeProofs({ sigma: sigma }).sigma,
|
|
341
372
|
proof: proofShare,
|
|
342
373
|
};
|
|
343
|
-
return
|
|
374
|
+
return {
|
|
375
|
+
wShare,
|
|
376
|
+
kShare,
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Perform multiplicitive-to-additive (MtA) share conversion with another signer.
|
|
381
|
+
* Connection 1.2 in https://lucid.app/lucidchart/7061785b-bc5c-4002-b546-3f4a3612fc62/edit?page=IAVmvYO4FvKc#
|
|
382
|
+
* If signer A completed signShare initially (input to this fn), then this step is completed by signer B.
|
|
383
|
+
* @param {SignConvert} shares
|
|
384
|
+
* @returns {SignConvertRT}
|
|
385
|
+
*/
|
|
386
|
+
async signConvertStep1(shares) {
|
|
387
|
+
const receivedKShare = shares.kShare;
|
|
388
|
+
const xShare = shares.xShare; // currentParticipant secret xShare
|
|
389
|
+
const yShare = {
|
|
390
|
+
...shares.yShare,
|
|
391
|
+
ntilde: receivedKShare.ntilde,
|
|
392
|
+
h1: receivedKShare.h1,
|
|
393
|
+
h2: receivedKShare.h2,
|
|
394
|
+
p: receivedKShare.p,
|
|
395
|
+
};
|
|
396
|
+
const signShare = await this.signShare(xShare, yShare);
|
|
397
|
+
const shareParticipant = signShare.wShare;
|
|
398
|
+
if (shareParticipant.i !== receivedKShare.i) {
|
|
399
|
+
throw new Error('Shares from same participant');
|
|
400
|
+
}
|
|
401
|
+
if (!receivedKShare.proof) {
|
|
402
|
+
throw new Error('Unexpected missing proof on aShareToBeSent');
|
|
403
|
+
}
|
|
404
|
+
// the other participants paillier public key
|
|
405
|
+
const n = (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.n);
|
|
406
|
+
const pka = (0, util_1.getPaillierPublicKey)(n);
|
|
407
|
+
// the other participant's range proof challenge
|
|
408
|
+
const ntildea = (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.ntilde);
|
|
409
|
+
const h1a = (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.h1);
|
|
410
|
+
const h2a = (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.h2);
|
|
411
|
+
// the current participant's range proof challenge
|
|
412
|
+
const ntildeb = (0, sdk_lib_mpc_1.hexToBigInt)(shareParticipant.ntilde);
|
|
413
|
+
const h1b = (0, sdk_lib_mpc_1.hexToBigInt)(shareParticipant.h1);
|
|
414
|
+
const h2b = (0, sdk_lib_mpc_1.hexToBigInt)(shareParticipant.h2);
|
|
415
|
+
const k = (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.k);
|
|
416
|
+
// the current participants paillier proof challenge
|
|
417
|
+
const shareParticipantPaillierChallenge = sdk_lib_mpc_1.EcdsaTypes.deserializePaillierChallenge({ p: shareParticipant.p });
|
|
418
|
+
// the other signing parties proof to the current participants paillier proof challenge
|
|
419
|
+
const receivedPaillierChallengeProof = sdk_lib_mpc_1.EcdsaTypes.deserializePaillierChallengeProofs({
|
|
420
|
+
sigma: receivedKShare.sigma,
|
|
421
|
+
});
|
|
422
|
+
if (!(await sdk_lib_mpc_1.EcdsaPaillierProof.verify(n, shareParticipantPaillierChallenge.p, receivedPaillierChallengeProof.sigma))) {
|
|
423
|
+
throw new Error('Could not verify signing A share paillier proof');
|
|
424
|
+
}
|
|
425
|
+
if (!sdk_lib_mpc_1.EcdsaRangeProof.verify(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
426
|
+
ntilde: ntildeb,
|
|
427
|
+
h1: h1b,
|
|
428
|
+
h2: h2b,
|
|
429
|
+
}, {
|
|
430
|
+
z: (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.proof.z),
|
|
431
|
+
u: (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.proof.u),
|
|
432
|
+
w: (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.proof.w),
|
|
433
|
+
s: (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.proof.s),
|
|
434
|
+
s1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.proof.s1),
|
|
435
|
+
s2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.proof.s2),
|
|
436
|
+
}, k)) {
|
|
437
|
+
throw new Error('Could not verify signing A share proof');
|
|
438
|
+
}
|
|
439
|
+
// MtA $k_j, \gamma_i$.
|
|
440
|
+
const beta0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
|
|
441
|
+
const beta = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(beta0)), 32).toString('hex');
|
|
442
|
+
const g = (0, sdk_lib_mpc_1.hexToBigInt)(shareParticipant.gamma);
|
|
443
|
+
const rb = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pka.n);
|
|
444
|
+
const cb = pka.encrypt(beta0, rb);
|
|
445
|
+
const alpha = pka.addition(pka.multiply(k, g), cb);
|
|
446
|
+
const alphaToBeSent = (0, util_1.bigIntToBufferBE)(alpha, ALPHAMUSIZE).toString('hex');
|
|
447
|
+
// Prove $\gamma_i \in Z_{N^2}$.
|
|
448
|
+
const gx = Ecdsa.curve.basePointMult(g);
|
|
449
|
+
let proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
450
|
+
ntilde: ntildea,
|
|
451
|
+
h1: h1a,
|
|
452
|
+
h2: h2a,
|
|
453
|
+
}, k, alpha, g, beta0, rb, gx);
|
|
454
|
+
const gammaProofToBeSent = {
|
|
455
|
+
z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
|
|
456
|
+
zprm: (0, util_1.bigIntToBufferBE)(proof.zprm, 384).toString('hex'),
|
|
457
|
+
t: (0, util_1.bigIntToBufferBE)(proof.t, 384).toString('hex'),
|
|
458
|
+
v: (0, util_1.bigIntToBufferBE)(proof.v, 768).toString('hex'),
|
|
459
|
+
w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
|
|
460
|
+
s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
|
|
461
|
+
s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
|
|
462
|
+
s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
|
|
463
|
+
t1: (0, util_1.bigIntToBufferBE)(proof.t1, 224).toString('hex'),
|
|
464
|
+
t2: (0, util_1.bigIntToBufferBE)(proof.t2, 480).toString('hex'),
|
|
465
|
+
u: (0, util_1.bigIntToBufferBE)(proof.u, 33).toString('hex'),
|
|
466
|
+
x: (0, util_1.bigIntToBufferBE)(gx, 33).toString('hex'),
|
|
467
|
+
};
|
|
468
|
+
// MtA $k_j, w_i$.
|
|
469
|
+
const nu0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
|
|
470
|
+
const nu = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(nu0)), 32).toString('hex');
|
|
471
|
+
const w = (0, sdk_lib_mpc_1.hexToBigInt)(shareParticipant.w);
|
|
472
|
+
const rn = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pka.n);
|
|
473
|
+
const cn = pka.encrypt(nu0, rn);
|
|
474
|
+
const mu = pka.addition(pka.multiply(k, w), cn);
|
|
475
|
+
const muToBeSent = (0, util_1.bigIntToBufferBE)(mu, ALPHAMUSIZE).toString('hex');
|
|
476
|
+
// Prove $\w_i \in Z_{N^2}$.
|
|
477
|
+
const wx = Ecdsa.curve.basePointMult(w);
|
|
478
|
+
proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
479
|
+
ntilde: ntildea,
|
|
480
|
+
h1: h1a,
|
|
481
|
+
h2: h2a,
|
|
482
|
+
}, k, (0, sdk_lib_mpc_1.hexToBigInt)(muToBeSent), w, nu0, rn, wx);
|
|
483
|
+
const wProofToBeSent = {
|
|
484
|
+
z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
|
|
485
|
+
zprm: (0, util_1.bigIntToBufferBE)(proof.zprm, 384).toString('hex'),
|
|
486
|
+
t: (0, util_1.bigIntToBufferBE)(proof.t, 384).toString('hex'),
|
|
487
|
+
v: (0, util_1.bigIntToBufferBE)(proof.v, 768).toString('hex'),
|
|
488
|
+
w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
|
|
489
|
+
s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
|
|
490
|
+
s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
|
|
491
|
+
s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
|
|
492
|
+
t1: (0, util_1.bigIntToBufferBE)(proof.t1, 224).toString('hex'),
|
|
493
|
+
t2: (0, util_1.bigIntToBufferBE)(proof.t2, 480).toString('hex'),
|
|
494
|
+
u: (0, util_1.bigIntToBufferBE)(proof.u, 33).toString('hex'),
|
|
495
|
+
x: (0, util_1.bigIntToBufferBE)(wx, 33).toString('hex'),
|
|
496
|
+
};
|
|
497
|
+
const nToBeSent = signShare.kShare.n;
|
|
498
|
+
const ntildeToBeSent = (0, util_1.bigIntToBufferBE)(ntildeb, 384).toString('hex');
|
|
499
|
+
const h1ToBeSent = (0, util_1.bigIntToBufferBE)(h1b, 384).toString('hex');
|
|
500
|
+
const h2ToBeSent = (0, util_1.bigIntToBufferBE)(h2b, 384).toString('hex');
|
|
501
|
+
const kToBeSent = signShare.kShare.k;
|
|
502
|
+
const proofToBeSent = signShare.kShare.proof;
|
|
503
|
+
const [iToBeSent, jToBeSent] = [receivedKShare.j, receivedKShare.i];
|
|
504
|
+
return {
|
|
505
|
+
aShare: {
|
|
506
|
+
i: iToBeSent,
|
|
507
|
+
j: jToBeSent,
|
|
508
|
+
ntilde: ntildeToBeSent,
|
|
509
|
+
h1: h1ToBeSent,
|
|
510
|
+
h2: h2ToBeSent,
|
|
511
|
+
n: nToBeSent,
|
|
512
|
+
k: kToBeSent,
|
|
513
|
+
alpha: alphaToBeSent,
|
|
514
|
+
mu: muToBeSent,
|
|
515
|
+
proof: proofToBeSent,
|
|
516
|
+
gammaProof: gammaProofToBeSent,
|
|
517
|
+
wProof: wProofToBeSent,
|
|
518
|
+
// provide the share participants proof
|
|
519
|
+
// to the paillier challenge in the receivedKShare from the other signer
|
|
520
|
+
sigma: signShare.kShare.sigma,
|
|
521
|
+
},
|
|
522
|
+
bShare: {
|
|
523
|
+
...shareParticipant,
|
|
524
|
+
beta,
|
|
525
|
+
nu,
|
|
526
|
+
},
|
|
527
|
+
};
|
|
344
528
|
}
|
|
345
529
|
/**
|
|
346
530
|
* Perform multiplicitive-to-additive (MtA) share conversion with another
|
|
347
531
|
* signer.
|
|
348
|
-
*
|
|
532
|
+
* Connection 2.1 in https://lucid.app/lucidchart/7061785b-bc5c-4002-b546-3f4a3612fc62/edit?page=IAVmvYO4FvKc#
|
|
533
|
+
* If signer B completed signConvertStep1, then this step is completed by signer A.
|
|
534
|
+
* @param {SignConvert} shares
|
|
535
|
+
* @returns {SignConvertRT}
|
|
536
|
+
*/
|
|
537
|
+
async signConvertStep2(shares) {
|
|
538
|
+
const receivedAShare = shares.aShare;
|
|
539
|
+
if (!receivedAShare.gammaProof) {
|
|
540
|
+
throw new Error('Unexpected missing gammaProof on aShareToBeSent');
|
|
541
|
+
}
|
|
542
|
+
if (!receivedAShare.wProof) {
|
|
543
|
+
throw new Error('Unexpected missing wProof on aShareToBeSent');
|
|
544
|
+
}
|
|
545
|
+
const n = (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.n); // Paillier pub from other signer
|
|
546
|
+
// current participant public key
|
|
547
|
+
const pka = (0, util_1.getPaillierPublicKey)((0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.n));
|
|
548
|
+
const ntildea = (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.ntilde);
|
|
549
|
+
const h1a = (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.h1);
|
|
550
|
+
const h2a = (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.h2);
|
|
551
|
+
const ck = (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.ck);
|
|
552
|
+
const shareParticipantPaillierChallenge = sdk_lib_mpc_1.EcdsaTypes.deserializePaillierChallenge({ p: shares.wShare.p });
|
|
553
|
+
const receivedPaillierChallengeProof = sdk_lib_mpc_1.EcdsaTypes.deserializePaillierChallengeProofs({
|
|
554
|
+
sigma: shares.aShare.sigma,
|
|
555
|
+
});
|
|
556
|
+
if (!sdk_lib_mpc_1.EcdsaPaillierProof.verify(n, shareParticipantPaillierChallenge.p, receivedPaillierChallengeProof.sigma)) {
|
|
557
|
+
throw new Error('could not verify signing share for paillier proof');
|
|
558
|
+
}
|
|
559
|
+
// Verify $\gamma_i \in Z_{N^2}$.
|
|
560
|
+
if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
561
|
+
ntilde: ntildea,
|
|
562
|
+
h1: h1a,
|
|
563
|
+
h2: h2a,
|
|
564
|
+
}, {
|
|
565
|
+
z: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.z),
|
|
566
|
+
zprm: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.zprm),
|
|
567
|
+
t: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.t),
|
|
568
|
+
v: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.v),
|
|
569
|
+
w: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.w),
|
|
570
|
+
s: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.s),
|
|
571
|
+
s1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.s1),
|
|
572
|
+
s2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.s2),
|
|
573
|
+
t1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.t1),
|
|
574
|
+
t2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.t2),
|
|
575
|
+
u: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.u),
|
|
576
|
+
}, ck, (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.alpha), (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.x))) {
|
|
577
|
+
throw new Error('could not verify signing share for gamma proof');
|
|
578
|
+
}
|
|
579
|
+
// Verify $\w_i \in Z_{N^2}$.
|
|
580
|
+
if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
581
|
+
ntilde: ntildea,
|
|
582
|
+
h1: h1a,
|
|
583
|
+
h2: h2a,
|
|
584
|
+
}, {
|
|
585
|
+
z: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.z),
|
|
586
|
+
zprm: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.zprm),
|
|
587
|
+
t: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.t),
|
|
588
|
+
v: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.v),
|
|
589
|
+
w: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.w),
|
|
590
|
+
s: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.s),
|
|
591
|
+
s1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.s1),
|
|
592
|
+
s2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.s2),
|
|
593
|
+
t1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.t1),
|
|
594
|
+
t2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.t2),
|
|
595
|
+
u: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.u),
|
|
596
|
+
}, ck, (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.mu), (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.x))) {
|
|
597
|
+
throw new Error('could not verify share for wProof');
|
|
598
|
+
}
|
|
599
|
+
const sk = new paillierBigint.PrivateKey((0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.l), (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.m), pka);
|
|
600
|
+
const gShareAlpha = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarReduce(sk.decrypt((0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.alpha))), 32).toString('hex');
|
|
601
|
+
const gShareMu = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarReduce(sk.decrypt((0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.mu))), // recheck encrypted number
|
|
602
|
+
32).toString('hex');
|
|
603
|
+
if (!receivedAShare.proof) {
|
|
604
|
+
throw new Error('Unexpected missing proof on aShareToBeSent');
|
|
605
|
+
}
|
|
606
|
+
const pkb = (0, util_1.getPaillierPublicKey)(n);
|
|
607
|
+
const ntildeb = (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.ntilde);
|
|
608
|
+
const h1b = (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.h1);
|
|
609
|
+
const h2b = (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.h2);
|
|
610
|
+
const k = (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.k);
|
|
611
|
+
if (!sdk_lib_mpc_1.EcdsaRangeProof.verify(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pkb, {
|
|
612
|
+
ntilde: ntildea,
|
|
613
|
+
h1: h1a,
|
|
614
|
+
h2: h2a,
|
|
615
|
+
}, {
|
|
616
|
+
z: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.proof.z),
|
|
617
|
+
u: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.proof.u),
|
|
618
|
+
w: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.proof.w),
|
|
619
|
+
s: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.proof.s),
|
|
620
|
+
s1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.proof.s1),
|
|
621
|
+
s2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.proof.s2),
|
|
622
|
+
}, k)) {
|
|
623
|
+
throw new Error('Could not verify signing A share proof');
|
|
624
|
+
}
|
|
625
|
+
// MtA $k_j, \gamma_i$.
|
|
626
|
+
const beta0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
|
|
627
|
+
const gShareBeta = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(beta0)), 32).toString('hex');
|
|
628
|
+
const g = (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.gamma);
|
|
629
|
+
const rb = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pkb.n);
|
|
630
|
+
const cb = pkb.encrypt(beta0, rb);
|
|
631
|
+
const alpha = pkb.addition(pkb.multiply(k, g), cb);
|
|
632
|
+
const alphaToBeSent = (0, util_1.bigIntToBufferBE)(alpha, ALPHAMUSIZE).toString('hex');
|
|
633
|
+
// Prove $\gamma_i \in Z_{N^2}$.
|
|
634
|
+
const gx = Ecdsa.curve.basePointMult(g);
|
|
635
|
+
let proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pkb, {
|
|
636
|
+
ntilde: ntildeb,
|
|
637
|
+
h1: h1b,
|
|
638
|
+
h2: h2b,
|
|
639
|
+
}, k, alpha, g, beta0, rb, gx);
|
|
640
|
+
const gammaProofToBeSent = {
|
|
641
|
+
z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
|
|
642
|
+
zprm: (0, util_1.bigIntToBufferBE)(proof.zprm, 384).toString('hex'),
|
|
643
|
+
t: (0, util_1.bigIntToBufferBE)(proof.t, 384).toString('hex'),
|
|
644
|
+
v: (0, util_1.bigIntToBufferBE)(proof.v, 768).toString('hex'),
|
|
645
|
+
w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
|
|
646
|
+
s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
|
|
647
|
+
s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
|
|
648
|
+
s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
|
|
649
|
+
t1: (0, util_1.bigIntToBufferBE)(proof.t1, 224).toString('hex'),
|
|
650
|
+
t2: (0, util_1.bigIntToBufferBE)(proof.t2, 480).toString('hex'),
|
|
651
|
+
u: (0, util_1.bigIntToBufferBE)(proof.u, 33).toString('hex'),
|
|
652
|
+
x: (0, util_1.bigIntToBufferBE)(gx, 33).toString('hex'),
|
|
653
|
+
};
|
|
654
|
+
// MtA $k_j, w_i$.
|
|
655
|
+
const nu0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
|
|
656
|
+
const gShareNu = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(nu0)), 32).toString('hex');
|
|
657
|
+
const w = (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.w);
|
|
658
|
+
const rn = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pkb.n);
|
|
659
|
+
const cn = pkb.encrypt(nu0, rn);
|
|
660
|
+
const mu = pkb.addition(pkb.multiply(k, w), cn);
|
|
661
|
+
const muToBeSent = (0, util_1.bigIntToBufferBE)(mu, ALPHAMUSIZE).toString('hex');
|
|
662
|
+
// Prove $\w_i \in Z_{N^2}$.
|
|
663
|
+
const wx = Ecdsa.curve.basePointMult(w);
|
|
664
|
+
proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pkb, {
|
|
665
|
+
ntilde: ntildeb,
|
|
666
|
+
h1: h1b,
|
|
667
|
+
h2: h2b,
|
|
668
|
+
}, k, (0, sdk_lib_mpc_1.hexToBigInt)(muToBeSent), w, nu0, rn, wx);
|
|
669
|
+
const wProofToBeSent = {
|
|
670
|
+
z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
|
|
671
|
+
zprm: (0, util_1.bigIntToBufferBE)(proof.zprm, 384).toString('hex'),
|
|
672
|
+
t: (0, util_1.bigIntToBufferBE)(proof.t, 384).toString('hex'),
|
|
673
|
+
v: (0, util_1.bigIntToBufferBE)(proof.v, 768).toString('hex'),
|
|
674
|
+
w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
|
|
675
|
+
s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
|
|
676
|
+
s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
|
|
677
|
+
s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
|
|
678
|
+
t1: (0, util_1.bigIntToBufferBE)(proof.t1, 224).toString('hex'),
|
|
679
|
+
t2: (0, util_1.bigIntToBufferBE)(proof.t2, 480).toString('hex'),
|
|
680
|
+
u: (0, util_1.bigIntToBufferBE)(proof.u, 33).toString('hex'),
|
|
681
|
+
x: (0, util_1.bigIntToBufferBE)(wx, 33).toString('hex'),
|
|
682
|
+
};
|
|
683
|
+
const [iToBeSent, jToBeSent] = [receivedAShare.j, receivedAShare.i];
|
|
684
|
+
return {
|
|
685
|
+
muShare: {
|
|
686
|
+
i: iToBeSent,
|
|
687
|
+
j: jToBeSent,
|
|
688
|
+
alpha: alphaToBeSent,
|
|
689
|
+
mu: muToBeSent,
|
|
690
|
+
gammaProof: gammaProofToBeSent,
|
|
691
|
+
wProof: wProofToBeSent,
|
|
692
|
+
},
|
|
693
|
+
gShare: {
|
|
694
|
+
i: shares.wShare.i,
|
|
695
|
+
n: shares.wShare.n,
|
|
696
|
+
y: shares.wShare.y,
|
|
697
|
+
k: shares.wShare.k,
|
|
698
|
+
w: shares.wShare.w,
|
|
699
|
+
gamma: shares.wShare.gamma,
|
|
700
|
+
alpha: gShareAlpha,
|
|
701
|
+
mu: gShareMu,
|
|
702
|
+
beta: gShareBeta,
|
|
703
|
+
nu: gShareNu,
|
|
704
|
+
},
|
|
705
|
+
};
|
|
706
|
+
}
|
|
707
|
+
/**
|
|
708
|
+
* Perform multiplicitive-to-additive (MtA) share conversion with another signer.
|
|
709
|
+
* Connection 2.2 in https://lucid.app/lucidchart/7061785b-bc5c-4002-b546-3f4a3612fc62/edit?page=IAVmvYO4FvKc#
|
|
710
|
+
* If signer A completed signConvertStep2, then this step is completed by signer B.
|
|
711
|
+
* @param {SignConvert} shares
|
|
712
|
+
* @returns {SignConvertRT}
|
|
713
|
+
*/
|
|
714
|
+
async signConvertStep3(shares) {
|
|
715
|
+
const receivedMuShare = shares.muShare;
|
|
716
|
+
if (!receivedMuShare.gammaProof) {
|
|
717
|
+
throw new Error('Unexpected missing gammaProof on aShareToBeSent');
|
|
718
|
+
}
|
|
719
|
+
if (!receivedMuShare.wProof) {
|
|
720
|
+
throw new Error('Unexpected missing wProof on aShareToBeSent');
|
|
721
|
+
}
|
|
722
|
+
const pka = (0, util_1.getPaillierPublicKey)((0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.n));
|
|
723
|
+
const ntildea = (0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.ntilde);
|
|
724
|
+
const h1a = (0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.h1);
|
|
725
|
+
const h2a = (0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.h2);
|
|
726
|
+
const ck = (0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.ck);
|
|
727
|
+
// Verify $\gamma_i \in Z_{N^2}$.
|
|
728
|
+
if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
729
|
+
ntilde: ntildea,
|
|
730
|
+
h1: h1a,
|
|
731
|
+
h2: h2a,
|
|
732
|
+
}, {
|
|
733
|
+
z: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.z),
|
|
734
|
+
zprm: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.zprm),
|
|
735
|
+
t: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.t),
|
|
736
|
+
v: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.v),
|
|
737
|
+
w: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.w),
|
|
738
|
+
s: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.s),
|
|
739
|
+
s1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.s1),
|
|
740
|
+
s2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.s2),
|
|
741
|
+
t1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.t1),
|
|
742
|
+
t2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.t2),
|
|
743
|
+
u: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.u),
|
|
744
|
+
}, ck, (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.alpha), (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.x))) {
|
|
745
|
+
throw new Error('could not verify signing share for gamma proof');
|
|
746
|
+
}
|
|
747
|
+
// Verify $\w_i \in Z_{N^2}$.
|
|
748
|
+
if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
749
|
+
ntilde: ntildea,
|
|
750
|
+
h1: h1a,
|
|
751
|
+
h2: h2a,
|
|
752
|
+
}, {
|
|
753
|
+
z: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.z),
|
|
754
|
+
zprm: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.zprm),
|
|
755
|
+
t: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.t),
|
|
756
|
+
v: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.v),
|
|
757
|
+
w: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.w),
|
|
758
|
+
s: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.s),
|
|
759
|
+
s1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.s1),
|
|
760
|
+
s2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.s2),
|
|
761
|
+
t1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.t1),
|
|
762
|
+
t2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.t2),
|
|
763
|
+
u: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.u),
|
|
764
|
+
}, ck, (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.mu), (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.x))) {
|
|
765
|
+
throw new Error('could not verify share for wProof');
|
|
766
|
+
}
|
|
767
|
+
const sk = new paillierBigint.PrivateKey((0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.l), (0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.m), pka);
|
|
768
|
+
const alpha = sk.decrypt((0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.alpha));
|
|
769
|
+
const gShareAlpha = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarReduce(alpha), 32).toString('hex');
|
|
770
|
+
const mu = sk.decrypt((0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.mu)); // recheck encrypted number
|
|
771
|
+
const gShareMu = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarReduce(mu), 32).toString('hex');
|
|
772
|
+
const [iToBeSent, jToBeSent] = [receivedMuShare.j, receivedMuShare.i];
|
|
773
|
+
return {
|
|
774
|
+
gShare: {
|
|
775
|
+
i: shares.bShare.i,
|
|
776
|
+
n: shares.bShare.n,
|
|
777
|
+
y: shares.bShare.y,
|
|
778
|
+
k: shares.bShare.k,
|
|
779
|
+
w: shares.bShare.w,
|
|
780
|
+
gamma: shares.bShare.gamma,
|
|
781
|
+
alpha: gShareAlpha,
|
|
782
|
+
mu: gShareMu,
|
|
783
|
+
beta: shares.bShare.beta,
|
|
784
|
+
nu: shares.bShare.nu,
|
|
785
|
+
},
|
|
786
|
+
signIndex: {
|
|
787
|
+
i: iToBeSent,
|
|
788
|
+
j: jToBeSent,
|
|
789
|
+
},
|
|
790
|
+
};
|
|
791
|
+
}
|
|
792
|
+
/**
|
|
793
|
+
* Perform multiplicitive-to-additive (MtA) share conversion with another signer.
|
|
794
|
+
* @deprecated - use one of [signConvertStep1, signConvertStep2, signConvertStep3] instead
|
|
795
|
+
* @param {SignConvert} shares
|
|
349
796
|
* @returns {SignConvertRT}
|
|
350
797
|
*/
|
|
351
798
|
async signConvert(shares) {
|
|
@@ -359,6 +806,7 @@ class Ecdsa {
|
|
|
359
806
|
ntilde: shares.kShare.ntilde,
|
|
360
807
|
h1: shares.kShare.h1,
|
|
361
808
|
h2: shares.kShare.h2,
|
|
809
|
+
p: shares.kShare.p,
|
|
362
810
|
};
|
|
363
811
|
const signShare = await this.signShare(xShare, yShare);
|
|
364
812
|
kShare = signShare.kShare;
|
|
@@ -379,61 +827,67 @@ class Ecdsa {
|
|
|
379
827
|
if (shareToBeSent.alpha) {
|
|
380
828
|
const bShareParticipant = shareParticipant;
|
|
381
829
|
const aShareToBeSent = shareToBeSent;
|
|
382
|
-
|
|
830
|
+
if (!aShareToBeSent.gammaProof) {
|
|
831
|
+
throw new Error('Unexpected missing gammaProof on aShareToBeSent');
|
|
832
|
+
}
|
|
833
|
+
if (!aShareToBeSent.wProof) {
|
|
834
|
+
throw new Error('Unexpected missing wProof on aShareToBeSent');
|
|
835
|
+
}
|
|
836
|
+
const pka = (0, util_1.getPaillierPublicKey)((0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.n));
|
|
383
837
|
let ntildea, h1a, h2a, ck;
|
|
384
838
|
if (bShareParticipant.ntilde) {
|
|
385
|
-
ntildea =
|
|
386
|
-
h1a =
|
|
387
|
-
h2a =
|
|
388
|
-
ck =
|
|
839
|
+
ntildea = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.ntilde);
|
|
840
|
+
h1a = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.h1);
|
|
841
|
+
h2a = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.h2);
|
|
842
|
+
ck = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.ck);
|
|
389
843
|
}
|
|
390
844
|
// Verify $\gamma_i \in Z_{N^2}$.
|
|
391
|
-
if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve,
|
|
845
|
+
if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
392
846
|
ntilde: ntildea,
|
|
393
847
|
h1: h1a,
|
|
394
848
|
h2: h2a,
|
|
395
849
|
}, {
|
|
396
|
-
z:
|
|
397
|
-
zprm:
|
|
398
|
-
t:
|
|
399
|
-
v:
|
|
400
|
-
w:
|
|
401
|
-
s:
|
|
402
|
-
s1:
|
|
403
|
-
s2:
|
|
404
|
-
t1:
|
|
405
|
-
t2:
|
|
406
|
-
u:
|
|
407
|
-
}, ck,
|
|
850
|
+
z: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.z),
|
|
851
|
+
zprm: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.zprm),
|
|
852
|
+
t: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.t),
|
|
853
|
+
v: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.v),
|
|
854
|
+
w: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.w),
|
|
855
|
+
s: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.s),
|
|
856
|
+
s1: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.s1),
|
|
857
|
+
s2: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.s2),
|
|
858
|
+
t1: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.t1),
|
|
859
|
+
t2: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.t2),
|
|
860
|
+
u: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.u),
|
|
861
|
+
}, ck, (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.alpha), (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.x))) {
|
|
408
862
|
throw new Error('could not verify signing share for gamma proof');
|
|
409
863
|
}
|
|
410
864
|
// Verify $\w_i \in Z_{N^2}$.
|
|
411
|
-
if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve,
|
|
865
|
+
if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
412
866
|
ntilde: ntildea,
|
|
413
867
|
h1: h1a,
|
|
414
868
|
h2: h2a,
|
|
415
869
|
}, {
|
|
416
|
-
z:
|
|
417
|
-
zprm:
|
|
418
|
-
t:
|
|
419
|
-
v:
|
|
420
|
-
w:
|
|
421
|
-
s:
|
|
422
|
-
s1:
|
|
423
|
-
s2:
|
|
424
|
-
t1:
|
|
425
|
-
t2:
|
|
426
|
-
u:
|
|
427
|
-
}, ck,
|
|
870
|
+
z: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.z),
|
|
871
|
+
zprm: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.zprm),
|
|
872
|
+
t: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.t),
|
|
873
|
+
v: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.v),
|
|
874
|
+
w: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.w),
|
|
875
|
+
s: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.s),
|
|
876
|
+
s1: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.s1),
|
|
877
|
+
s2: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.s2),
|
|
878
|
+
t1: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.t1),
|
|
879
|
+
t2: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.t2),
|
|
880
|
+
u: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.u),
|
|
881
|
+
}, ck, (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.mu), (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.x))) {
|
|
428
882
|
throw new Error('could not verify share for wProof');
|
|
429
883
|
}
|
|
430
|
-
const sk = new paillierBigint.PrivateKey(
|
|
884
|
+
const sk = new paillierBigint.PrivateKey((0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.l), (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.m), pka);
|
|
431
885
|
const gShareParticipant = shareParticipant;
|
|
432
886
|
const muShareToBeSent = shareToBeSent;
|
|
433
|
-
const alpha = sk.decrypt(
|
|
434
|
-
gShareParticipant.alpha = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(alpha), 32).toString('hex');
|
|
435
|
-
const mu = sk.decrypt(
|
|
436
|
-
gShareParticipant.mu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(mu), 32).toString('hex');
|
|
887
|
+
const alpha = sk.decrypt((0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.alpha));
|
|
888
|
+
gShareParticipant.alpha = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarReduce(alpha), 32).toString('hex');
|
|
889
|
+
const mu = sk.decrypt((0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.mu)); // recheck encrypted number
|
|
890
|
+
gShareParticipant.mu = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarReduce(mu), 32).toString('hex');
|
|
437
891
|
const partialShareParticipant = shareParticipant;
|
|
438
892
|
const partialShareToBeSent = muShareToBeSent;
|
|
439
893
|
delete partialShareParticipant.l;
|
|
@@ -444,92 +898,92 @@ class Ecdsa {
|
|
|
444
898
|
if (shareToBeSent.k) {
|
|
445
899
|
const bShareParticipant = shareParticipant;
|
|
446
900
|
const aShareToBeSent = shareToBeSent;
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
let ntildea, h1a, h2a, ntildeb, h1b, h2b;
|
|
450
|
-
if (aShareToBeSent.ntilde) {
|
|
451
|
-
ntildea = crypto_2.hexToBigInt(aShareToBeSent.ntilde);
|
|
452
|
-
h1a = crypto_2.hexToBigInt(aShareToBeSent.h1);
|
|
453
|
-
h2a = crypto_2.hexToBigInt(aShareToBeSent.h2);
|
|
454
|
-
ntildeb = crypto_2.hexToBigInt(bShareParticipant.ntilde);
|
|
455
|
-
h1b = crypto_2.hexToBigInt(bShareParticipant.h1);
|
|
456
|
-
h2b = crypto_2.hexToBigInt(bShareParticipant.h2);
|
|
901
|
+
if (!aShareToBeSent.proof) {
|
|
902
|
+
throw new Error('Unexpected missing proof on aShareToBeSent');
|
|
457
903
|
}
|
|
458
|
-
const
|
|
459
|
-
|
|
904
|
+
const n = (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.n); // Paillier pub from other signer
|
|
905
|
+
const pka = (0, util_1.getPaillierPublicKey)(n);
|
|
906
|
+
const ntildea = (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.ntilde);
|
|
907
|
+
const h1a = (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.h1);
|
|
908
|
+
const h2a = (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.h2);
|
|
909
|
+
const ntildeb = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.ntilde);
|
|
910
|
+
const h1b = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.h1);
|
|
911
|
+
const h2b = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.h2);
|
|
912
|
+
const k = (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.k);
|
|
913
|
+
if (!sdk_lib_mpc_1.EcdsaRangeProof.verify(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
460
914
|
ntilde: ntildeb,
|
|
461
915
|
h1: h1b,
|
|
462
916
|
h2: h2b,
|
|
463
917
|
}, {
|
|
464
|
-
z:
|
|
465
|
-
u:
|
|
466
|
-
w:
|
|
467
|
-
s:
|
|
468
|
-
s1:
|
|
469
|
-
s2:
|
|
918
|
+
z: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.proof.z),
|
|
919
|
+
u: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.proof.u),
|
|
920
|
+
w: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.proof.w),
|
|
921
|
+
s: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.proof.s),
|
|
922
|
+
s1: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.proof.s1),
|
|
923
|
+
s2: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.proof.s2),
|
|
470
924
|
}, k)) {
|
|
471
925
|
throw new Error('Could not verify signing A share proof');
|
|
472
926
|
}
|
|
473
927
|
// MtA $k_j, \gamma_i$.
|
|
474
928
|
const beta0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
|
|
475
|
-
bShareParticipant.beta = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(beta0)), 32).toString('hex');
|
|
476
|
-
const g =
|
|
477
|
-
const rb = await sdk_lib_mpc_1.
|
|
929
|
+
bShareParticipant.beta = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(beta0)), 32).toString('hex');
|
|
930
|
+
const g = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.gamma);
|
|
931
|
+
const rb = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pka.n);
|
|
478
932
|
const cb = pka.encrypt(beta0, rb);
|
|
479
933
|
const alpha = pka.addition(pka.multiply(k, g), cb);
|
|
480
|
-
aShareToBeSent.alpha = util_1.bigIntToBufferBE(alpha, 32).toString('hex');
|
|
934
|
+
aShareToBeSent.alpha = (0, util_1.bigIntToBufferBE)(alpha, 32).toString('hex');
|
|
481
935
|
// Prove $\gamma_i \in Z_{N^2}$.
|
|
482
936
|
const gx = Ecdsa.curve.basePointMult(g);
|
|
483
|
-
let proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve,
|
|
937
|
+
let proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
484
938
|
ntilde: ntildea,
|
|
485
939
|
h1: h1a,
|
|
486
940
|
h2: h2a,
|
|
487
941
|
}, k, alpha, g, beta0, rb, gx);
|
|
488
942
|
Object.assign(aShareToBeSent, {
|
|
489
943
|
gammaProof: {
|
|
490
|
-
z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
|
|
491
|
-
zprm: util_1.bigIntToBufferBE(proof.zprm, 384).toString('hex'),
|
|
492
|
-
t: util_1.bigIntToBufferBE(proof.t, 384).toString('hex'),
|
|
493
|
-
v: util_1.bigIntToBufferBE(proof.v, 768).toString('hex'),
|
|
494
|
-
w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
|
|
495
|
-
s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
|
|
496
|
-
s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
|
|
497
|
-
s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
|
|
498
|
-
t1: util_1.bigIntToBufferBE(proof.t1, 224).toString('hex'),
|
|
499
|
-
t2: util_1.bigIntToBufferBE(proof.t2, 480).toString('hex'),
|
|
500
|
-
u: util_1.bigIntToBufferBE(proof.u, 33).toString('hex'),
|
|
501
|
-
x: util_1.bigIntToBufferBE(gx, 33).toString('hex'),
|
|
944
|
+
z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
|
|
945
|
+
zprm: (0, util_1.bigIntToBufferBE)(proof.zprm, 384).toString('hex'),
|
|
946
|
+
t: (0, util_1.bigIntToBufferBE)(proof.t, 384).toString('hex'),
|
|
947
|
+
v: (0, util_1.bigIntToBufferBE)(proof.v, 768).toString('hex'),
|
|
948
|
+
w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
|
|
949
|
+
s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
|
|
950
|
+
s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
|
|
951
|
+
s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
|
|
952
|
+
t1: (0, util_1.bigIntToBufferBE)(proof.t1, 224).toString('hex'),
|
|
953
|
+
t2: (0, util_1.bigIntToBufferBE)(proof.t2, 480).toString('hex'),
|
|
954
|
+
u: (0, util_1.bigIntToBufferBE)(proof.u, 33).toString('hex'),
|
|
955
|
+
x: (0, util_1.bigIntToBufferBE)(gx, 33).toString('hex'),
|
|
502
956
|
},
|
|
503
957
|
});
|
|
504
958
|
// MtA $k_j, w_i$.
|
|
505
959
|
const nu0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
|
|
506
|
-
shareParticipant.nu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(nu0)), 32).toString('hex');
|
|
507
|
-
const w =
|
|
508
|
-
const rn = await sdk_lib_mpc_1.
|
|
960
|
+
shareParticipant.nu = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(nu0)), 32).toString('hex');
|
|
961
|
+
const w = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.w);
|
|
962
|
+
const rn = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pka.n);
|
|
509
963
|
const cn = pka.encrypt(nu0, rn);
|
|
510
964
|
const mu = pka.addition(pka.multiply(k, w), cn);
|
|
511
|
-
shareToBeSent.mu = util_1.bigIntToBufferBE(mu, 32).toString('hex');
|
|
965
|
+
shareToBeSent.mu = (0, util_1.bigIntToBufferBE)(mu, 32).toString('hex');
|
|
512
966
|
// Prove $\w_i \in Z_{N^2}$.
|
|
513
967
|
const wx = Ecdsa.curve.basePointMult(w);
|
|
514
|
-
proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve,
|
|
968
|
+
proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
515
969
|
ntilde: ntildea,
|
|
516
970
|
h1: h1a,
|
|
517
971
|
h2: h2a,
|
|
518
|
-
}, k,
|
|
972
|
+
}, k, (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.mu), w, nu0, rn, wx);
|
|
519
973
|
Object.assign(shareToBeSent, {
|
|
520
974
|
wProof: {
|
|
521
|
-
z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
|
|
522
|
-
zprm: util_1.bigIntToBufferBE(proof.zprm, 384).toString('hex'),
|
|
523
|
-
t: util_1.bigIntToBufferBE(proof.t, 384).toString('hex'),
|
|
524
|
-
v: util_1.bigIntToBufferBE(proof.v, 768).toString('hex'),
|
|
525
|
-
w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
|
|
526
|
-
s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
|
|
527
|
-
s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
|
|
528
|
-
s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
|
|
529
|
-
t1: util_1.bigIntToBufferBE(proof.t1, 224).toString('hex'),
|
|
530
|
-
t2: util_1.bigIntToBufferBE(proof.t2, 480).toString('hex'),
|
|
531
|
-
u: util_1.bigIntToBufferBE(proof.u, 33).toString('hex'),
|
|
532
|
-
x: util_1.bigIntToBufferBE(wx, 33).toString('hex'),
|
|
975
|
+
z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
|
|
976
|
+
zprm: (0, util_1.bigIntToBufferBE)(proof.zprm, 384).toString('hex'),
|
|
977
|
+
t: (0, util_1.bigIntToBufferBE)(proof.t, 384).toString('hex'),
|
|
978
|
+
v: (0, util_1.bigIntToBufferBE)(proof.v, 768).toString('hex'),
|
|
979
|
+
w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
|
|
980
|
+
s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
|
|
981
|
+
s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
|
|
982
|
+
s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
|
|
983
|
+
t1: (0, util_1.bigIntToBufferBE)(proof.t1, 224).toString('hex'),
|
|
984
|
+
t2: (0, util_1.bigIntToBufferBE)(proof.t2, 480).toString('hex'),
|
|
985
|
+
u: (0, util_1.bigIntToBufferBE)(proof.u, 33).toString('hex'),
|
|
986
|
+
x: (0, util_1.bigIntToBufferBE)(wx, 33).toString('hex'),
|
|
533
987
|
},
|
|
534
988
|
});
|
|
535
989
|
if (shareParticipant.alpha) {
|
|
@@ -549,9 +1003,9 @@ class Ecdsa {
|
|
|
549
1003
|
else {
|
|
550
1004
|
Object.assign(shareToBeSent, {
|
|
551
1005
|
n: kShare.n,
|
|
552
|
-
ntilde: util_1.bigIntToBufferBE(ntildeb, 384).toString('hex'),
|
|
553
|
-
h1: util_1.bigIntToBufferBE(h1b, 384).toString('hex'),
|
|
554
|
-
h2: util_1.bigIntToBufferBE(h2b, 384).toString('hex'),
|
|
1006
|
+
ntilde: (0, util_1.bigIntToBufferBE)(ntildeb, 384).toString('hex'),
|
|
1007
|
+
h1: (0, util_1.bigIntToBufferBE)(h1b, 384).toString('hex'),
|
|
1008
|
+
h2: (0, util_1.bigIntToBufferBE)(h2b, 384).toString('hex'),
|
|
555
1009
|
k: kShare.k,
|
|
556
1010
|
proof: kShare.proof,
|
|
557
1011
|
});
|
|
@@ -589,13 +1043,13 @@ class Ecdsa {
|
|
|
589
1043
|
signCombine(shares) {
|
|
590
1044
|
const gShare = shares.gShare;
|
|
591
1045
|
const S = shares.signIndex;
|
|
592
|
-
const gamma =
|
|
593
|
-
const alpha =
|
|
594
|
-
const beta =
|
|
595
|
-
const mu =
|
|
596
|
-
const nu =
|
|
597
|
-
const k =
|
|
598
|
-
const w =
|
|
1046
|
+
const gamma = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.gamma);
|
|
1047
|
+
const alpha = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.alpha);
|
|
1048
|
+
const beta = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.beta);
|
|
1049
|
+
const mu = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.mu);
|
|
1050
|
+
const nu = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.nu);
|
|
1051
|
+
const k = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.k);
|
|
1052
|
+
const w = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.w);
|
|
599
1053
|
const delta = Ecdsa.curve.scalarAdd(Ecdsa.curve.scalarMult(k, gamma), Ecdsa.curve.scalarAdd(alpha, beta));
|
|
600
1054
|
const omicron = Ecdsa.curve.scalarAdd(Ecdsa.curve.scalarMult(k, w), Ecdsa.curve.scalarAdd(mu, nu));
|
|
601
1055
|
const Gamma = Ecdsa.curve.basePointMult(gamma);
|
|
@@ -603,16 +1057,16 @@ class Ecdsa {
|
|
|
603
1057
|
oShare: {
|
|
604
1058
|
i: gShare.i,
|
|
605
1059
|
y: gShare.y,
|
|
606
|
-
k: util_1.bigIntToBufferBE(k, 32).toString('hex'),
|
|
607
|
-
omicron: util_1.bigIntToBufferBE(omicron, 32).toString('hex'),
|
|
608
|
-
delta: util_1.bigIntToBufferBE(delta, 32).toString('hex'),
|
|
609
|
-
Gamma: util_1.bigIntToBufferBE(Gamma, 33).toString('hex'),
|
|
1060
|
+
k: (0, util_1.bigIntToBufferBE)(k, 32).toString('hex'),
|
|
1061
|
+
omicron: (0, util_1.bigIntToBufferBE)(omicron, 32).toString('hex'),
|
|
1062
|
+
delta: (0, util_1.bigIntToBufferBE)(delta, 32).toString('hex'),
|
|
1063
|
+
Gamma: (0, util_1.bigIntToBufferBE)(Gamma, 33).toString('hex'),
|
|
610
1064
|
},
|
|
611
1065
|
dShare: {
|
|
612
1066
|
i: S.i,
|
|
613
1067
|
j: gShare.i,
|
|
614
|
-
delta: util_1.bigIntToBufferBE(delta, 32).toString('hex'),
|
|
615
|
-
Gamma: util_1.bigIntToBufferBE(Gamma, 33).toString('hex'),
|
|
1068
|
+
delta: (0, util_1.bigIntToBufferBE)(delta, 32).toString('hex'),
|
|
1069
|
+
Gamma: (0, util_1.bigIntToBufferBE)(Gamma, 33).toString('hex'),
|
|
616
1070
|
},
|
|
617
1071
|
};
|
|
618
1072
|
}
|
|
@@ -622,23 +1076,127 @@ class Ecdsa {
|
|
|
622
1076
|
* @param {OShare} oShare private omicron share of current participant
|
|
623
1077
|
* @param {DShare} dShare delta share received from the other participant
|
|
624
1078
|
* @param {Hash} hash hashing algorithm implementing Node`s standard crypto hash interface
|
|
625
|
-
* @param
|
|
626
|
-
* @returns {
|
|
1079
|
+
* @param shouldHash if true, we hash the provided buffer before signing
|
|
1080
|
+
* @returns {VAShare}
|
|
627
1081
|
*/
|
|
628
1082
|
sign(M, oShare, dShare, hash, shouldHash = true) {
|
|
629
|
-
const m = shouldHash ? (hash || crypto_1.createHash('sha256')).update(M).digest() : M;
|
|
630
|
-
const delta = Ecdsa.curve.scalarAdd(
|
|
631
|
-
const R = Ecdsa.curve.pointMultiply(Ecdsa.curve.pointAdd(
|
|
632
|
-
const pointR =
|
|
1083
|
+
const m = shouldHash ? (hash || (0, crypto_1.createHash)('sha256')).update(M).digest() : M;
|
|
1084
|
+
const delta = Ecdsa.curve.scalarAdd((0, sdk_lib_mpc_1.hexToBigInt)(oShare.delta), (0, sdk_lib_mpc_1.hexToBigInt)(dShare.delta));
|
|
1085
|
+
const R = Ecdsa.curve.pointMultiply(Ecdsa.curve.pointAdd((0, sdk_lib_mpc_1.hexToBigInt)(oShare.Gamma), (0, sdk_lib_mpc_1.hexToBigInt)(dShare.Gamma)), Ecdsa.curve.scalarInvert(delta));
|
|
1086
|
+
const pointR = secp256k1_1.secp256k1.ProjectivePoint.fromHex((0, util_1.bigIntToBufferBE)(R, 32));
|
|
633
1087
|
const r = pointR.x;
|
|
634
|
-
const s = Ecdsa.curve.scalarAdd(Ecdsa.curve.scalarMult(util_1.bigIntFromU8ABE(m),
|
|
1088
|
+
const s = Ecdsa.curve.scalarAdd(Ecdsa.curve.scalarMult((0, util_1.bigIntFromU8ABE)(m), (0, sdk_lib_mpc_1.hexToBigInt)(oShare.k)), Ecdsa.curve.scalarMult(r, (0, sdk_lib_mpc_1.hexToBigInt)(oShare.omicron)));
|
|
1089
|
+
const l = Ecdsa.curve.scalarRandom();
|
|
1090
|
+
const rho = Ecdsa.curve.scalarRandom();
|
|
1091
|
+
const V = Ecdsa.curve.pointAdd(Ecdsa.curve.pointMultiply(R, s), Ecdsa.curve.basePointMult(l));
|
|
1092
|
+
const A = Ecdsa.curve.basePointMult(rho);
|
|
1093
|
+
const comDecom_V_A = sdk_lib_mpc_1.HashCommitment.createCommitment(Buffer.concat([(0, util_1.bigIntToBufferBE)(V, Ecdsa.curve.pointBytes), (0, util_1.bigIntToBufferBE)(A, Ecdsa.curve.pointBytes)]));
|
|
635
1094
|
return {
|
|
636
1095
|
i: oShare.i,
|
|
637
1096
|
y: oShare.y,
|
|
638
1097
|
R: pointR.toHex(true),
|
|
639
|
-
s: util_1.bigIntToBufferBE(s, 32).toString('hex'),
|
|
1098
|
+
s: (0, util_1.bigIntToBufferBE)(s, 32).toString('hex'),
|
|
1099
|
+
m: m,
|
|
1100
|
+
l: l,
|
|
1101
|
+
rho: rho,
|
|
1102
|
+
V: V,
|
|
1103
|
+
A: A,
|
|
1104
|
+
comDecomVA: comDecom_V_A,
|
|
640
1105
|
};
|
|
641
1106
|
}
|
|
1107
|
+
/**
|
|
1108
|
+
* Generate proofs of V_i and A_i values.
|
|
1109
|
+
* @param {Buffer} M Message to commit to as part of the context of the proof.
|
|
1110
|
+
* This doesn't need to be the same message that was signed in the sign function above.
|
|
1111
|
+
* But it should be the same for all participants for the purpose of providing proof context.
|
|
1112
|
+
* @param {VAShare} vaShare The VAShare to prove.
|
|
1113
|
+
* @returns {VAShareWithProofs}
|
|
1114
|
+
*/
|
|
1115
|
+
generateVAProofs(M, vaShare) {
|
|
1116
|
+
const s = (0, sdk_lib_mpc_1.hexToBigInt)(vaShare.s);
|
|
1117
|
+
const R = (0, util_1.bigIntFromU8ABE)(secp256k1_1.secp256k1.ProjectivePoint.fromHex(vaShare.R).toRawBytes(true));
|
|
1118
|
+
const proofContext = (0, crypto_1.createHash)('sha256').update(M).update((0, util_1.bigIntToBufferBE)(R, Ecdsa.curve.pointBytes)).digest();
|
|
1119
|
+
const zkVProof = sdk_lib_mpc_1.EcdsaZkVProof.createZkVProof(vaShare.V, s, vaShare.l, R, Ecdsa.curve, proofContext);
|
|
1120
|
+
const schnorrProof = sdk_lib_mpc_1.Schnorr.createSchnorrProof(vaShare.A, vaShare.rho, Ecdsa.curve, proofContext);
|
|
1121
|
+
return {
|
|
1122
|
+
...vaShare,
|
|
1123
|
+
proofContext: proofContext,
|
|
1124
|
+
zkVProofV: zkVProof,
|
|
1125
|
+
schnorrProofA: schnorrProof,
|
|
1126
|
+
};
|
|
1127
|
+
}
|
|
1128
|
+
/**
|
|
1129
|
+
* Verify V_i and A_i values of all other participants during signing phase 5 steps 5A and 5B.
|
|
1130
|
+
* @param {VAShareWithProofs} vaShare V_i, A_i info including SShare values of the currenct participant
|
|
1131
|
+
* @param {PublicVAShareWithProofs[]} publicVAShares public V_i, A_i info of all other participants
|
|
1132
|
+
* @returns {UTShare} U_i, T_i info of the current participant if all verifications pass
|
|
1133
|
+
*/
|
|
1134
|
+
verifyVAShares(vaShare, publicVAShares) {
|
|
1135
|
+
publicVAShares.forEach((publicVAShare) => {
|
|
1136
|
+
if (!sdk_lib_mpc_1.HashCommitment.verifyCommitment(publicVAShare.comDecomVA.commitment, {
|
|
1137
|
+
secret: Buffer.concat([
|
|
1138
|
+
(0, util_1.bigIntToBufferBE)(publicVAShare.V, Ecdsa.curve.pointBytes),
|
|
1139
|
+
(0, util_1.bigIntToBufferBE)(publicVAShare.A, Ecdsa.curve.pointBytes),
|
|
1140
|
+
]),
|
|
1141
|
+
blindingFactor: publicVAShare.comDecomVA.decommitment.blindingFactor,
|
|
1142
|
+
})) {
|
|
1143
|
+
throw new Error('Could not verify commitment of V_i and A_i');
|
|
1144
|
+
}
|
|
1145
|
+
if (!sdk_lib_mpc_1.Schnorr.verifySchnorrProof(publicVAShare.A, publicVAShare.schnorrProofA, Ecdsa.curve, vaShare.proofContext)) {
|
|
1146
|
+
throw new Error('Could not verify Schnorr proof of A_i');
|
|
1147
|
+
}
|
|
1148
|
+
if (!sdk_lib_mpc_1.EcdsaZkVProof.verifyZkVProof(publicVAShare.V, publicVAShare.zkVProofV, (0, sdk_lib_mpc_1.hexToBigInt)(vaShare.R), Ecdsa.curve, vaShare.proofContext)) {
|
|
1149
|
+
throw new Error('Could not verify ZK proof of V_i');
|
|
1150
|
+
}
|
|
1151
|
+
});
|
|
1152
|
+
const y = (0, sdk_lib_mpc_1.hexToBigInt)(vaShare.y);
|
|
1153
|
+
// r is R's x coordinate. R is in compressed form, so we need to slice off the first byte.
|
|
1154
|
+
const r = (0, sdk_lib_mpc_1.hexToBigInt)(vaShare.R.slice(2));
|
|
1155
|
+
// Calculate aggregation of all V_i and A_i.
|
|
1156
|
+
let V = Ecdsa.curve.pointAdd(Ecdsa.curve.pointAdd(Ecdsa.curve.basePointMult(Ecdsa.curve.scalarNegate((0, util_1.bigIntFromU8ABE)(vaShare.m))), Ecdsa.curve.pointMultiply(y, Ecdsa.curve.scalarNegate(r))), vaShare.V);
|
|
1157
|
+
let A = vaShare.A;
|
|
1158
|
+
publicVAShares.forEach((publicVAShare) => {
|
|
1159
|
+
V = Ecdsa.curve.pointAdd(V, publicVAShare.V);
|
|
1160
|
+
A = Ecdsa.curve.pointAdd(A, publicVAShare.A);
|
|
1161
|
+
});
|
|
1162
|
+
// Calculate U_i = rho_i * V and T_i = l_i * A.
|
|
1163
|
+
const U = Ecdsa.curve.pointMultiply(V, vaShare.rho);
|
|
1164
|
+
const T = Ecdsa.curve.pointMultiply(A, vaShare.l);
|
|
1165
|
+
const comDecom_U_T = sdk_lib_mpc_1.HashCommitment.createCommitment(Buffer.concat([(0, util_1.bigIntToBufferBE)(U, Ecdsa.curve.pointBytes), (0, util_1.bigIntToBufferBE)(T, Ecdsa.curve.pointBytes)]));
|
|
1166
|
+
return {
|
|
1167
|
+
...vaShare,
|
|
1168
|
+
U,
|
|
1169
|
+
T,
|
|
1170
|
+
comDecomUT: comDecom_U_T,
|
|
1171
|
+
};
|
|
1172
|
+
}
|
|
1173
|
+
/**
|
|
1174
|
+
* Verify U_i and V_i values of all other participants during signing phase 5 steps 5C and 5D.
|
|
1175
|
+
* @param {UTShare} utShare U_i, T_i info including SShare values of the currenct participant
|
|
1176
|
+
* @param {PublicUTShare[]} publicUTShares public U_i, T_i info of all other participants
|
|
1177
|
+
* @returns {SShare} SShare of the current participant if all verifications pass
|
|
1178
|
+
*/
|
|
1179
|
+
verifyUTShares(utShare, publicUTShares) {
|
|
1180
|
+
let sigmaU = utShare.U;
|
|
1181
|
+
let sigmaT = utShare.T;
|
|
1182
|
+
publicUTShares.forEach((publicUTShare) => {
|
|
1183
|
+
if (!sdk_lib_mpc_1.HashCommitment.verifyCommitment(publicUTShare.comDecomUT.commitment, {
|
|
1184
|
+
secret: Buffer.concat([
|
|
1185
|
+
(0, util_1.bigIntToBufferBE)(publicUTShare.U, Ecdsa.curve.pointBytes),
|
|
1186
|
+
(0, util_1.bigIntToBufferBE)(publicUTShare.T, Ecdsa.curve.pointBytes),
|
|
1187
|
+
]),
|
|
1188
|
+
blindingFactor: publicUTShare.comDecomUT.decommitment.blindingFactor,
|
|
1189
|
+
})) {
|
|
1190
|
+
throw new Error('Could not verify commitment of U_i and T_i');
|
|
1191
|
+
}
|
|
1192
|
+
sigmaU = Ecdsa.curve.pointAdd(sigmaU, publicUTShare.U);
|
|
1193
|
+
sigmaT = Ecdsa.curve.pointAdd(sigmaT, publicUTShare.T);
|
|
1194
|
+
});
|
|
1195
|
+
if (sigmaU !== sigmaT) {
|
|
1196
|
+
throw new Error('Sum of all U_i does not match sum of all T_i');
|
|
1197
|
+
}
|
|
1198
|
+
return { ...utShare };
|
|
1199
|
+
}
|
|
642
1200
|
/**
|
|
643
1201
|
* Construct full signature by combining Sign Shares
|
|
644
1202
|
* @param {SShare[]} shares
|
|
@@ -651,14 +1209,14 @@ class Ecdsa {
|
|
|
651
1209
|
if (!isRMatching) {
|
|
652
1210
|
throw new Error('R value should be consistent across all shares');
|
|
653
1211
|
}
|
|
654
|
-
let s = shares.map((share) =>
|
|
1212
|
+
let s = shares.map((share) => (0, sdk_lib_mpc_1.hexToBigInt)(share['s'])).reduce(Ecdsa.curve.scalarAdd);
|
|
655
1213
|
const recid = (R.slice(0, 2) === '03' ? 1 : 0) ^ (s > Ecdsa.curve.order() / BigInt(2) ? 1 : 0);
|
|
656
1214
|
// Normalize s.
|
|
657
1215
|
s = s > Ecdsa.curve.order() / BigInt(2) ? Ecdsa.curve.order() - s : s;
|
|
658
1216
|
return {
|
|
659
1217
|
y: shares[0]['y'],
|
|
660
1218
|
r: R.slice(2),
|
|
661
|
-
s: util_1.bigIntToBufferBE(s, 32).toString('hex'),
|
|
1219
|
+
s: (0, util_1.bigIntToBufferBE)(s, 32).toString('hex'),
|
|
662
1220
|
recid: recid,
|
|
663
1221
|
};
|
|
664
1222
|
}
|
|
@@ -671,12 +1229,12 @@ class Ecdsa {
|
|
|
671
1229
|
* @returns {boolean} True if signature is valid; False otherwise
|
|
672
1230
|
*/
|
|
673
1231
|
verify(message, signature, hash, shouldHash = true) {
|
|
674
|
-
const messageToVerify = shouldHash ? (hash || crypto_1.createHash('sha256')).update(message).digest() : message;
|
|
1232
|
+
const messageToVerify = shouldHash ? (hash || (0, crypto_1.createHash)('sha256')).update(message).digest() : message;
|
|
675
1233
|
return Ecdsa.curve.verify(messageToVerify, Buffer.concat([
|
|
676
1234
|
Buffer.from([signature['recid']]),
|
|
677
|
-
util_1.bigIntToBufferBE(
|
|
678
|
-
util_1.bigIntToBufferBE(
|
|
679
|
-
]),
|
|
1235
|
+
(0, util_1.bigIntToBufferBE)((0, sdk_lib_mpc_1.hexToBigInt)(signature['r']), 32),
|
|
1236
|
+
(0, util_1.bigIntToBufferBE)((0, sdk_lib_mpc_1.hexToBigInt)(signature['s']), 32),
|
|
1237
|
+
]), (0, sdk_lib_mpc_1.hexToBigInt)(signature['y']));
|
|
680
1238
|
}
|
|
681
1239
|
/**
|
|
682
1240
|
* Deserializes a challenge and it's proofs from hex strings to bigint
|
|
@@ -694,8 +1252,8 @@ class Ecdsa {
|
|
|
694
1252
|
return sdk_lib_mpc_1.EcdsaTypes.serializeNtilde(challenge);
|
|
695
1253
|
}
|
|
696
1254
|
}
|
|
697
|
-
exports.default = Ecdsa;
|
|
698
1255
|
Ecdsa.curve = new curves_1.Secp256k1Curve();
|
|
699
|
-
Ecdsa.hdTree = new
|
|
700
|
-
Ecdsa.shamir = new
|
|
701
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYWNjb3VudC1saWIvbXBjL3Rzcy9lY2RzYS9lY2RzYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnRUFBa0Q7QUFDbEQsdUVBQXlEO0FBQ3pELHVEQUF5QztBQUN6Qyx5Q0FBNEQ7QUFDNUQsbUNBQXVEO0FBQ3ZELG1EQUE2QztBQUM3QyxpREFBbUQ7QUFDbkQscUNBQXlHO0FBQ3pHLHlDQUE4QztBQUM5QywwREFBa0M7QUFDbEMseURBQXVGO0FBNEJ2RixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFdEIsU0FBUyxTQUFTLENBQUMsS0FBc0I7SUFDdkMsT0FBTyxRQUFRLElBQUksS0FBSyxDQUFDO0FBQzNCLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQXFCLEtBQUs7SUFJeEI7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFhLEVBQUUsU0FBaUIsRUFBRSxTQUFpQixFQUFFLElBQWEsRUFBRSxJQUFJLEdBQUcsS0FBSzs7UUFDN0YsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ25GLE1BQU0seUJBQXlCLENBQUM7U0FDakM7UUFFRCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRTtZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7U0FDakU7UUFFRCxJQUFJLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUMvQixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRTtZQUM1QixrRUFBa0U7WUFDbEUsbUJBQW1CLEdBQUcs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QUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxFQUFFLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNsRCxFQUFFLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNuRCxFQUFFLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNuRCxFQUFFLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNuRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNoRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7aUJBQzVDO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsa0JBQWtCO1lBQ2xCLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ3RFLGdCQUFnQixDQUFDLEVBQUUsR0FBRyx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FDMUcsS0FBSyxDQUNOLENBQUM7WUFDRixNQUFNLENBQUMsR0FBRyxvQkFBVyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sRUFBRSxHQUFHLE1BQU0sNkJBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoRCxhQUFhLENBQUMsRUFBRSxHQUFHLHVCQUFnQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUQsNEJBQTRCO1lBQzVCLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLEtBQUssR0FBRyxNQUFNLDZCQUFlLENBQUMsY0FBYyxDQUMxQyxLQUFLLENBQUMsS0FBSyxFQUNYLElBQUksRUFDSixHQUFHLEVBQ0g7Z0JBQ0UsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsRUFBRSxFQUFFLEdBQUc7Z0JBQ1AsRUFBRSxFQUFFLEdBQUc7YUFDUixFQUNELENBQUMsRUFDRCxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsRUFDOUIsQ0FBQyxFQUNELEdBQUcsRUFDSCxFQUFFLEVBQ0YsRUFBRSxDQUNILENBQUM7WUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTtnQkFDM0IsTUFBTSxFQUFFO29CQUNOLENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2pELElBQUksRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ3ZELENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2pELENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2pELENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2pELENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2pELEVBQUUsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2xELEVBQUUsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ25ELEVBQUUsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ25ELEVBQUUsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENB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eEJILHdCQXF4QkM7QUFweEJRLFdBQUssR0FBbUIsSUFBSSx1QkFBYyxFQUFFLENBQUM7QUFDN0MsWUFBTSxHQUFXLElBQUksY0FBSyxFQUFFLENBQUM7QUFDN0IsWUFBTSxHQUFXLElBQUksZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYWlsbGllckJpZ2ludCBmcm9tICdwYWlsbGllci1iaWdpbnQnO1xuaW1wb3J0ICogYXMgYmlnaW50Q3J5cHRvVXRpbHMgZnJvbSAnYmlnaW50LWNyeXB0by11dGlscyc7XG5pbXBvcnQgKiBhcyBzZWNwIGZyb20gJ0Bub2JsZS9zZWNwMjU2azEnO1xuaW1wb3J0IEhEVHJlZSwgeyBCSVAzMiwgY2hhaW5jb2RlQmFzZSB9IGZyb20gJy4uLy4uL2hkVHJlZSc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoLCBIYXNoLCByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IGhleFRvQmlnSW50IH0gZnJvbSAnLi4vLi4vLi4vdXRpbC9jcnlwdG8nO1xuaW1wb3J0IHsgYmlnSW50RnJvbUJ1ZmZlckJFLCBiaWdJbnRGcm9tVThBQkUsIGJpZ0ludFRvQnVmZmVyQkUsIGdldFBhaWxsaWVyUHVibGljS2V5IH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBTZWNwMjU2azFDdXJ2ZSB9IGZyb20gJy4uLy4uL2N1cnZlcyc7XG5pbXBvcnQgU2hhbWlyIGZyb20gJy4uLy4uL3NoYW1pcic7XG5pbXBvcnQgeyBFY2RzYVJhbmdlUHJvb2YsIEVjZHNhVHlwZXMsIHJhbmRvbUNvUHJpbWVUbyB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCB7XG4gIEFTaGFyZSxcbiAgQlNoYXJlLFxuICBEU2hhcmUsXG4gIEdTaGFyZSxcbiAgS2V5Q29tYmluZWQsXG4gIEtleUNvbWJpbmVkV2l0aE50aWxkZSxcbiAgS2V5U2hhcmUsXG4gIEtTaGFyZSxcbiAgTVVTaGFyZSxcbiAgTlNoYXJlLFxuICBPU2hhcmUsXG4gIFBTaGFyZSxcbiAgU2lnbmF0dXJlLFxuICBTaWduQ29tYmluZSxcbiAgU2lnbkNvbWJpbmVSVCxcbiAgU2lnbkNvbnZlcnQsXG4gIFNpZ25Db252ZXJ0UlQsXG4gIFNpZ25TaGFyZVJULFxuICBTU2hhcmUsXG4gIFN1YmtleVNoYXJlLFxuICBYU2hhcmUsXG4gIFhTaGFyZVdpdGhOdGlsZGUsXG4gIFlTaGFyZSxcbiAgWVNoYXJlV2l0aE50aWxkZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IF81biA9IEJpZ0ludCg1KTtcblxuZnVuY3Rpb24gaGFzTnRpbGRlKHNoYXJlOiBYU2hhcmUgfCBZU2hhcmUpOiBzaGFyZSBpcyBYU2hhcmVXaXRoTnRpbGRlIHwgWVNoYXJlV2l0aE50aWxkZSB7XG4gIHJldHVybiAnbnRpbGRlJyBpbiBzaGFyZTtcbn1cblxuLyoqXG4gKiBFQ0RTQSBUU1MgaW1wbGVtZW50YXRpb24gc3VwcG9ydGluZyAyOm4gVGhyZXNob2xkXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVjZHNhIHtcbiAgc3RhdGljIGN1cnZlOiBTZWNwMjU2azFDdXJ2ZSA9IG5ldyBTZWNwMjU2azFDdXJ2ZSgpO1xuICBzdGF0aWMgaGRUcmVlOiBIRFRyZWUgPSBuZXcgQklQMzIoKTtcbiAgc3RhdGljIHNoYW1pcjogU2hhbWlyID0gbmV3IFNoYW1pcihFY2RzYS5jdXJ2ZSk7XG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzaGFyZXMgZm9yIHBhcnRpY2lwYW50IGF0IGluZGV4IGFuZCBzcGxpdCBrZXlzIGAodGhyZXNob2xkLG51bVNoYXJlcylgIHdheXMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBwYXJ0aWNpcGFudCBpbmRleFxuICAgKiBAcGFyYW0ge251bWJlcn0gdGhyZXNob2xkIFNpZ25pbmcgdGhyZXNob2xkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBudW1TaGFyZXMgIE51bWJlciBvZiBzaGFyZXNcbiAgICogQHBhcmFtIHtCdWZmZXJ9IHNlZWQgb3B0aW9uYWwgNjQgYnl0ZSBzZWVkIHRvIHVzZSBmb3Iga2V5IGdlbmVyYXRpb25cbiAgICogQHBhcmFtIHtCb29sZWFufSBzeW5jIG9wdGlvbmFsIHN5bmMgZmxhZywgaWYgdHJ1ZSB0aGVuIGEgc3luY2hyb25vdXMgdmVyc2lvbiBvZiBQYWlsbGllciBrZXkgZ2VuZXJhdGlvbiBpcyB1c2VkIHRoYXQgZG9lcyBub3Qgc3Bhd24gV29ya2VyIHRocmVhZHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEtleVNoYXJlPn0gUmV0dXJucyB0aGUgcHJpdmF0ZSBwLXNoYXJlXG4gICAqIGFuZCBuLXNoYXJlcyB0byBiZSBkaXN0cmlidXRlZCB0byBwYXJ0aWNpcGFudHMgYXQgdGhlaXIgY29ycmVzcG9uZGluZyBpbmRleC5cbiAgICovXG4gIGFzeW5jIGtleVNoYXJlKGluZGV4OiBudW1iZXIsIHRocmVzaG9sZDogbnVtYmVyLCBudW1TaGFyZXM6IG51bWJlciwgc2VlZD86IEJ1ZmZlciwgc3luYyA9IGZhbHNlKTogUHJvbWlzZTxLZXlTaGFyZT4ge1xuICAgIGlmICghKGluZGV4ID4gMCAmJiBpbmRleCA8PSBudW1TaGFyZXMgJiYgdGhyZXNob2xkIDw9IG51bVNoYXJlcyAmJiB0aHJlc2hvbGQgPT09IDIpKSB7XG4gICAgICB0aHJvdyAnSW52YWxpZCBLZXlTaGFyZSBDb25maWcnO1xuICAgIH1cblxuICAgIGlmIChzZWVkICYmIHNlZWQubGVuZ3RoIDwgNjQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VlZCBtdXN0IGhhdmUgYSBsZW5ndGggb2YgYXQgbGVhc3QgNjQgYnl0ZXMnKTtcbiAgICB9XG5cbiAgICBsZXQgc2VlZFdpdGhWYWxpZExlbmd0aCA9IHNlZWQ7XG4gICAgaWYgKHNlZWQgJiYgc2VlZC5sZW5ndGggPiA2NCkge1xuICAgICAgLy8gaWYgc2VlZCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIDY0IGJ5dGVzLCBoYXNoIHNlZWQgdG8gNjQgYnl0ZXMuXG4gICAgICBzZWVkV2l0aFZhbGlkTGVuZ3RoID0gY3JlYXRlSGFzaCgnc2hhNTEyJykudXBkYXRlKHNlZWQpLmRpZ2VzdCgpO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIGFkZGl0aXZlbHkgaG9tb21vcnBoaWMgZW5jcnlwdGlvbiBrZXkuXG4gICAgbGV0IHBhaWxsaWVyS2V5UGFpcjogcGFpbGxpZXJCaWdpbnQuS2V5UGFpcjtcbiAgICBpZiAoIXN5bmMpIHtcbiAgICAgIHBhaWxsaWVyS2V5UGFpciA9IGF3YWl0IHBhaWxsaWVyQmlnaW50LmdlbmVyYXRlUmFuZG9tS2V5cygzMDcyLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFpbGxpZXJLZXlQYWlyID0gcGFpbGxpZXJCaWdpbnQuZ2VuZXJhdGVSYW5kb21LZXlzU3luYygzMDcyLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3QgeyBwdWJsaWNLZXksIHByaXZhdGVLZXkgfSA9IHBhaWxsaWVyS2V5UGFpcjtcbiAgICAvLyBBY2NlcHQgYSA2NCBieXRlIHNlZWQgYW5kIGNyZWF0ZSBhbiBleHRlbmRlZCBwcml2YXRlIGtleSBmcm9tIHRoYXQgc2VlZFxuICAgIGNvbnN0IHNlY3JldEtleSA9IHNlZWRXaXRoVmFsaWRMZW5ndGggJiYgYmlwMzIuZnJvbVNlZWQoc2VlZFdpdGhWYWxpZExlbmd0aCk7XG4gICAgY29uc3QgdSA9XG4gICAgICAoc2VjcmV0S2V5ICYmIHNlY3JldEtleS5wcml2YXRlS2V5ICYmIGJpZ0ludEZyb21VOEFCRShuZXcgVWludDhBcnJheShzZWNyZXRLZXkucHJpdmF0ZUtleSkpKSA/P1xuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyUmFuZG9tKCk7XG4gICAgY29uc3QgeSA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQodSk7XG4gICAgY29uc3QgY2hhaW5jb2RlID0gKHNlY3JldEtleSAmJiBzZWNyZXRLZXkuY2hhaW5Db2RlKSA/PyByYW5kb21CeXRlcygzMik7XG4gICAgLy8gQ29tcHV0ZSBzZWNyZXQgc2hhcmVzIG9mIHRoZSBwcml2YXRlIGtleVxuICAgIGNvbnN0IHsgc2hhcmVzOiB1U2hhcmVzLCB2IH0gPSBFY2RzYS5zaGFtaXIuc3BsaXQodSwgdGhyZXNob2xkLCBudW1TaGFyZXMpO1xuICAgIGNvbnN0IGN1cnJlbnRQYXJ0aWNpcGFudDogUFNoYXJlID0ge1xuICAgICAgaTogaW5kZXgsXG4gICAgICB0OiB0aHJlc2hvbGQsXG4gICAgICBjOiBudW1TaGFyZXMsXG4gICAgICBsOiBiaWdJbnRUb0J1ZmZlckJFKHByaXZhdGVLZXkubGFtYmRhLCAxOTIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIG06IGJpZ0ludFRvQnVmZmVyQkUocHJpdmF0ZUtleS5tdSwgMTkyKS50b1N0cmluZygnaGV4JyksXG4gICAgICBuOiBiaWdJbnRUb0J1ZmZlckJFKHB1YmxpY0tleS5uLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHk6IGJpZ0ludFRvQnVmZmVyQkUoeSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUodVNoYXJlc1tpbmRleF0sIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICB1dTogdS50b1N0cmluZygpLFxuICAgICAgY2hhaW5jb2RlOiBjaGFpbmNvZGUudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG4gICAgY29uc3Qga2V5U2hhcmU6IEtleVNoYXJlID0ge1xuICAgICAgcFNoYXJlOiBjdXJyZW50UGFydGljaXBhbnQsXG4gICAgICBuU2hhcmVzOiB7fSxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBzaGFyZSBpbiB1U2hhcmVzKSB7XG4gICAgICBjb25zdCBwYXJ0aWNpcGFudEluZGV4ID0gcGFyc2VJbnQoc2hhcmUsIDEwKTtcbiAgICAgIGlmIChwYXJ0aWNpcGFudEluZGV4ICE9PSBpbmRleCkge1xuICAgICAgICBrZXlTaGFyZS5uU2hhcmVzW3BhcnRpY2lwYW50SW5kZXhdID0ge1xuICAgICAgICAgIGk6IHBhcnRpY2lwYW50SW5kZXgsXG4gICAgICAgICAgajogY3VycmVudFBhcnRpY2lwYW50WydpJ10sXG4gICAgICAgICAgbjogcHVibGljS2V5Lm4udG9TdHJpbmcoMTYpLFxuICAgICAgICAgIHk6IGJpZ0ludFRvQnVmZmVyQkUoeSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHZbMF0sIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdTogYmlnSW50VG9CdWZmZXJCRSh1U2hhcmVzW3BhcnRpY2lwYW50SW5kZXhdLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIGNoYWluY29kZTogY2hhaW5jb2RlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfSBhcyBOU2hhcmU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBrZXlTaGFyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21iaW5lIGRhdGEgc2hhcmVkIGR1cmluZyB0aGUga2V5IGdlbmVyYXRpb24gcHJvdG9jb2wuXG4gICAqIEBwYXJhbSB7S2V5U2hhcmV9IHBhcnRpY2lwYW50U2hhcmVzIHByaXZhdGUgcC1zaGFyZSBhbmRcbiAgICogbi1zaGFyZXMgcmVjZWl2ZWQgZnJvbSBhbGwgb3RoZXIgcGFydGljaXBhbnRzLlxuICAgKiBAcmV0dXJucyB7S2V5Q29tYmluZWR9IFJldHVybnMgdGhlIHBhcnRpY2lwYW50IHByaXZhdGUgeC1zaGFyZVxuICAgKiBhbmQgeS1zaGFyZXMgdG8gYmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgc2lnbmluZyBzaGFyZXMuXG4gICAqL1xuICBrZXlDb21iaW5lKHBTaGFyZTogUFNoYXJlLCBuU2hhcmVzOiBOU2hhcmVbXSk6IEtleUNvbWJpbmVkIHtcbiAgICBjb25zdCBhbGxTaGFyZXMgPSBbcFNoYXJlLCAuLi5uU2hhcmVzXTtcbiAgICAvLyBDb21wdXRlIHRoZSBwdWJsaWMga2V5LlxuICAgIGNvbnN0IHkgPSBhbGxTaGFyZXMubWFwKChwYXJ0aWNpcGFudCkgPT4gaGV4VG9CaWdJbnQocGFydGljaXBhbnRbJ3knXSkpLnJlZHVjZShFY2RzYS5jdXJ2ZS5wb2ludEFkZCk7XG4gICAgLy8gQWRkIHNlY3JldCBzaGFyZXNcbiAgICBjb25zdCB4ID0gYWxsU2hhcmVzLm1hcCgocGFydGljaXBhbnQpID0+IGhleFRvQmlnSW50KHBhcnRpY2lwYW50Wyd1J10pKS5yZWR1Y2UoRWNkc2EuY3VydmUuc2NhbGFyQWRkKTtcblxuICAgIC8vIFZlcmlmeSBzaGFyZXMuXG4gICAgZm9yIChjb25zdCBzaGFyZSBvZiBuU2hhcmVzKSB7XG4gICAgICBpZiAoc2hhcmUudikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEVjZHNhLnNoYW1pci52ZXJpZnkoaGV4VG9CaWdJbnQoc2hhcmUudSksIFtoZXhUb0JpZ0ludChzaGFyZS55KSwgaGV4VG9CaWdJbnQoc2hhcmUudiEpXSwgcFNoYXJlLmkpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCB2ZXJpZnkgc2hhcmUgZnJvbSBwYXJ0aWNpcGFudCAke3NoYXJlLmp9LiBWZXJpZmljYXRpb24gZXJyb3I6ICR7ZXJyfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hhaW5jb2RlIHdpbGwgYmUgdXNlZCBpbiBmdXR1cmUgd2hlbiB3ZSBhZGQgc3VwcG9ydCBmb3Iga2V5IGRlcml2YXRpb24gZm9yIGVjZHNhXG4gICAgY29uc3QgY2hhaW5jb2RlcyA9IFtwU2hhcmUsIC4uLm5TaGFyZXNdLm1hcCgoeyBjaGFpbmNvZGUgfSkgPT4gYmlnSW50RnJvbUJ1ZmZlckJFKEJ1ZmZlci5mcm9tKGNoYWluY29kZSwgJ2hleCcpKSk7XG4gICAgY29uc3QgY2hhaW5jb2RlID0gY2hhaW5jb2Rlcy5yZWR1Y2UoXG4gICAgICAoYWNjLCBjaGFpbmNvZGUpID0+XG4gICAgICAgIChhY2MgKyBjaGFpbmNvZGUpICUgQmlnSW50KCcweDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcpIC8vIDJeMjU2XG4gICAgKTtcblxuICAgIGNvbnN0IHBhcnRpY2lwYW50czogS2V5Q29tYmluZWQgPSB7XG4gICAgICB4U2hhcmU6IHtcbiAgICAgICAgaTogcFNoYXJlLmksXG4gICAgICAgIGw6IHBTaGFyZS5sLFxuICAgICAgICBtOiBwU2hhcmUubSxcbiAgICAgICAgbjogcFNoYXJlLm4sXG4gICAgICAgIHk6IGJpZ0ludFRvQnVmZmVyQkUoeSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgeDogYmlnSW50VG9CdWZmZXJCRSh4LCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBjaGFpbmNvZGU6IGJpZ0ludFRvQnVmZmVyQkUoY2hhaW5jb2RlLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfSxcbiAgICAgIHlTaGFyZXM6IHt9LFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHNoYXJlIGluIG5TaGFyZXMpIHtcbiAgICAgIGNvbnN0IHBhcnRpY2lwYW50SW5kZXggPSBuU2hhcmVzW3NoYXJlXVsnaiddO1xuICAgICAgcGFydGljaXBhbnRzLnlTaGFyZXNbcGFydGljaXBhbnRJbmRleF0gPSB7XG4gICAgICAgIGk6IHBTaGFyZS5pLFxuICAgICAgICBqOiBuU2hhcmVzW3NoYXJlXVsnaiddLFxuICAgICAgICBuOiBuU2hhcmVzW3NoYXJlXVsnbiddLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRpY2lwYW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJpdmUgc2hhcmVzIGZvciBhIEJJUC0zMiBzdWJrZXkuXG4gICAqIEBwYXJhbSB7UFNoYXJlfSBUaGUgdXNlcidzIHAtc2hhcmUuXG4gICAqIEBwYXJhbSB7TlNoYXJlW119IFRoZSBuLXNoYXJlcyByZWNlaXZlZCBmcm9tIHRoZSBvdGhlciBwYXJ0aWNpcGFudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgQklQLTMyIHBhdGggdG8gZGVyaXZlLlxuICAgKiBAcmV0dXJucyB7U3Via2V5U2hhcmV9IFJldHVybnMgdGhlIHByaXZhdGUgeC1zaGFyZSBhbmQgbi1zaGFyZXMgdG9cbiAgICogYmUgZGlzdHJpYnV0ZWQgdG8gcGFydGljaXBhbnRzIGF0IHRoZWlyIGNvcnJlc3BvbmRpbmcgaW5kZXguXG4gICAqL1xuICBrZXlEZXJpdmUocFNoYXJlOiBQU2hhcmUsIG5TaGFyZXM6IE5TaGFyZVtdLCBwYXRoOiBzdHJpbmcpOiBTdWJrZXlTaGFyZSB7XG4gICAgY29uc3QgeVZhbHVlcyA9IFtwU2hhcmUsIC4uLm5TaGFyZXNdLm1hcCgoc2hhcmUpID0+IGhleFRvQmlnSW50KHNoYXJlLnkpKTtcbiAgICBjb25zdCB5ID0geVZhbHVlcy5yZWR1Y2UoKHBhcnRpYWwsIHNoYXJlKSA9PiBFY2RzYS5jdXJ2ZS5wb2ludEFkZChwYXJ0aWFsLCBzaGFyZSkpO1xuICAgIGNvbnN0IHUgPSBCaWdJbnQocFNoYXJlLnV1KTtcbiAgICBsZXQgY29udHJpYkNoYWluY29kZSA9IGhleFRvQmlnSW50KHBTaGFyZS5jaGFpbmNvZGUpO1xuICAgIGNvbnN0IGNoYWluY29kZXMgPSBbY29udHJpYkNoYWluY29kZSwgLi4ublNoYXJlcy5tYXAoKHsgY2hhaW5jb2RlIH0pID0+IGhleFRvQmlnSW50KGNoYWluY29kZSkpXTtcbiAgICBjb25zdCBjaGFpbmNvZGUgPSBjaGFpbmNvZGVzLnJlZHVjZSgoYWNjLCBjaGFpbmNvZGUpID0+IChhY2MgKyBjaGFpbmNvZGUpICUgY2hhaW5jb2RlQmFzZSk7XG5cbiAgICAvLyBWZXJpZnkgc2hhcmVzLlxuICAgIGZvciAoY29uc3Qgc2hhcmUgb2YgblNoYXJlcykge1xuICAgICAgaWYgKHNoYXJlLnYpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBFY2RzYS5zaGFtaXIudmVyaWZ5KGhleFRvQmlnSW50KHNoYXJlLnUpLCBbaGV4VG9CaWdJbnQoc2hhcmUueSksIGhleFRvQmlnSW50KHNoYXJlLnYhKV0sIHBTaGFyZS5pKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgdmVyaWZ5IHNoYXJlIGZyb20gcGFydGljaXBhbnQgJHtzaGFyZS5qfS4gVmVyaWZpY2F0aW9uIGVycm9yOiAke2Vycn1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlcml2ZSBzdWJrZXkuXG4gICAgY29uc3Qgc3Via2V5ID0gRWNkc2EuaGRUcmVlLnByaXZhdGVEZXJpdmUoeyBwazogeSwgc2s6IHUsIGNoYWluY29kZSB9LCBwYXRoKTtcblxuICAgIC8vIENhbGN1bGF0ZSBuZXcgcHVibGljIGtleSBjb250cmlidXRpb24uXG4gICAgY29uc3QgY29udHJpYlkgPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KHN1YmtleS5zayk7XG5cbiAgICAvLyBDYWxjdWxhdGUgbmV3IGNoYWluY29kZSBjb250cmlidXRpb24uXG4gICAgY29uc3QgY2hhaW5jb2RlRGVsdGEgPSAoY2hhaW5jb2RlQmFzZSArIHN1YmtleS5jaGFpbmNvZGUgLSBjaGFpbmNvZGUpICUgY2hhaW5jb2RlQmFzZTtcbiAgICBjb250cmliQ2hhaW5jb2RlID0gKGNvbnRyaWJDaGFpbmNvZGUgKyBjaGFpbmNvZGVEZWx0YSkgJSBjaGFpbmNvZGVCYXNlO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyB1IHZhbHVlcy5cbiAgICBjb25zdCB7IHNoYXJlczogc3BsaXRfdSwgdiB9ID0gRWNkc2Euc2hhbWlyLnNwbGl0KHN1YmtleS5zaywgcFNoYXJlLnQgfHwgMiwgcFNoYXJlLmMgfHwgMyk7XG5cbiAgICAvLyBDYWxjdWxhdGUgbmV3IHNpZ25pbmcga2V5LlxuICAgIGNvbnN0IHggPSBbc3BsaXRfdVtwU2hhcmUuaV0sIC4uLm5TaGFyZXMubWFwKCh7IHUgfSkgPT4gaGV4VG9CaWdJbnQodSkpXS5yZWR1Y2UoRWNkc2EuY3VydmUuc2NhbGFyQWRkKTtcblxuICAgIGNvbnN0IFBfaTogWFNoYXJlID0ge1xuICAgICAgaTogcFNoYXJlLmksXG4gICAgICBsOiBwU2hhcmUubCxcbiAgICAgIG06IHBTaGFyZS5tLFxuICAgICAgbjogcFNoYXJlLm4sXG4gICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKHN1YmtleS5waywgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUoeCwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGNoYWluY29kZTogYmlnSW50VG9CdWZmZXJCRShzdWJrZXkuY2hhaW5jb2RlLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG5cbiAgICBjb25zdCBzaGFyZXM6IFN1YmtleVNoYXJlID0ge1xuICAgICAgeFNoYXJlOiBQX2ksXG4gICAgICBuU2hhcmVzOiB7fSxcbiAgICB9O1xuXG4gICAgZm9yIChsZXQgaW5kID0gMDsgaW5kIDwgblNoYXJlcy5sZW5ndGg7IGluZCsrKSB7XG4gICAgICBjb25zdCBQX2ogPSBuU2hhcmVzW2luZF07XG4gICAgICBzaGFyZXMublNoYXJlc1tQX2oual0gPSB7XG4gICAgICAgIGk6IFBfai5qLFxuICAgICAgICBqOiBQX2kuaSxcbiAgICAgICAgbjogUF9qLm4sXG4gICAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUoc3BsaXRfdVtQX2oual0sIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHk6IGJpZ0ludFRvQnVmZmVyQkUoY29udHJpYlksIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHY6IGJpZ0ludFRvQnVmZmVyQkUodlswXSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgY2hhaW5jb2RlOiBiaWdJbnRUb0J1ZmZlckJFKGNvbnRyaWJDaGFpbmNvZGUsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBzaGFyZXM7XG4gIH1cblxuICAvKipcbiAgICogRGVyaXZlcyBhIGNoaWxkIGNvbW1vbiBrZXljaGFpbiBmcm9tIGNvbW1vbiBrZXljaGFpblxuICAgKlxuICAgKiBAcGFyYW0ge2NvbW1vbktleWNoYWlufSBUaGUgY29tbW9uIGtleWNoYWluIGFzIGEgaGV4IHN0cmluZy5cbiAgICogQHBhcmFtIHtwYXRofSBUaGUgQklQLTMyIHBhdGggdG8gZGVyaXZlLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkZXJpdmVkIGNvbW1vbiBrZXljaGFpbiBhcyBhIGhleCBzdHJpbmcuXG4gICAqL1xuICBkZXJpdmVVbmhhcmRlbmVkKGNvbW1vbktleWNoYWluOiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKEVjZHNhLmhkVHJlZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBkZXJpdmUga2V5IHdpdGhvdXQgSERUcmVlIGltcGxlbWVudGF0aW9uXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWluID0gQnVmZmVyLmZyb20oY29tbW9uS2V5Y2hhaW4sICdoZXgnKTtcblxuICAgIGNvbnN0IGRlcml2ZWRQdWJsaWNLZXljaGFpbiA9IEVjZHNhLmhkVHJlZS5wdWJsaWNEZXJpdmUoXG4gICAgICB7XG4gICAgICAgIHBrOiBiaWdJbnRGcm9tQnVmZmVyQkUoa2V5Y2hhaW4uc2xpY2UoMCwgMzMpKSxcbiAgICAgICAgY2hhaW5jb2RlOiBiaWdJbnRGcm9tQnVmZmVyQkUoa2V5Y2hhaW4uc2xpY2UoMzMpKSxcbiAgICAgIH0sXG4gICAgICBwYXRoXG4gICAgKTtcblxuICAgIGNvbnN0IGRlcml2ZWRQayA9IGJpZ0ludFRvQnVmZmVyQkUoZGVyaXZlZFB1YmxpY0tleWNoYWluLnBrLCAzMykudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IGRlcml2ZWRDaGFpbmNvZGUgPSBiaWdJbnRUb0J1ZmZlckJFKGRlcml2ZWRQdWJsaWNLZXljaGFpbi5jaGFpbmNvZGUsIDMyKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICByZXR1cm4gZGVyaXZlZFBrICsgZGVyaXZlZENoYWluY29kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgZ2l2ZW4gcmFuZ2UgcHJvb2YgY2hhbGxlbmdlIHRvIHRoZSBzaGFyZXMgcHJldmlvdXNseSBjcmVhdGVkXG4gICAqIGJ5ICNrZXlDb21iaW5lLiBHZW5lcmF0ZXMgYSBuZXcgY2hhbGxlbmdlIGlmIG5vdCBwcm92aWRlZC5cbiAgICogQHBhcmFtIHtYU2hhcmV9IHhTaGFyZSBQcml2YXRlIHhTaGFyZSBvZiBzaWduZXJcbiAgICogQHBhcmFtIHtZU2hhcmV9IHlTaGFyZSBZU2hhcmUgb2YgdGhlIG90aGVyIHBhcnRpY2lwYW50IGludm9sdmVkIGluXG4gICAqIHRoaXMgc2lnbmluZyBvcGVyYXRpb25cbiAgICogQHBhcmFtIHtFY2RzYVR5cGVzLlNlcmlhbGl6ZWROdGlsZGV9IGNoYWxsZW5nZVxuICAgKiBAcmV0dXJucyB7S2V5Q29tYmluZWR9IFRoZSBuZXcgWFNoYXJlIGFuZCBZU2hhcmVzIHdpdGggdGhlIGFtZW5kZWRcbiAgICogY2hhbGxlbmdlIHZhbHVlc1xuICAgKi9cbiAgYXN5bmMgYXBwZW5kQ2hhbGxlbmdlKFxuICAgIHhTaGFyZTogWFNoYXJlLFxuICAgIHlTaGFyZTogWVNoYXJlLFxuICAgIGNoYWxsZW5nZT86IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZVxuICApOiBQcm9taXNlPEtleUNvbWJpbmVkV2l0aE50aWxkZT4ge1xuICAgIGlmICghY2hhbGxlbmdlKSB7XG4gICAgICBjaGFsbGVuZ2UgPSBFY2RzYVR5cGVzLnNlcmlhbGl6ZU50aWxkZShhd2FpdCBFY2RzYVJhbmdlUHJvb2YuZ2VuZXJhdGVOdGlsZGUoMzA3MikpO1xuICAgIH1cbiAgICBjb25zdCB7IG50aWxkZSwgaDEsIGgyIH0gPSBjaGFsbGVuZ2U7XG4gICAgcmV0dXJuIHtcbiAgICAgIHhTaGFyZTogeyAuLi54U2hhcmUsIG50aWxkZSwgaDEsIGgyIH0sXG4gICAgICB5U2hhcmVzOiB7XG4gICAgICAgIFt5U2hhcmUual06IHtcbiAgICAgICAgICBpOiB5U2hhcmUuaixcbiAgICAgICAgICBqOiB5U2hhcmUuaSxcbiAgICAgICAgICBuOiB4U2hhcmUubixcbiAgICAgICAgICBudGlsZGUsXG4gICAgICAgICAgaDEsXG4gICAgICAgICAgaDIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHNpZ25pbmcgc2hhcmVzLlxuICAgKiBAcGFyYW0ge3hTaGFyZX0geFNoYXJlIFByaXZhdGUgeFNoYXJlIG9mIGN1cnJlbnQgcGFydGljaXBhbnQgc2lnbmVyXG4gICAqIEBwYXJhbSB7WVNoYXJlfSB5U2hhcmUgeVNoYXJlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG90aGVyIHBhcnRpY2lwYW50IHNpZ25lclxuICAgKiBAcmV0dXJucyB7U2lnblNoYXJlUlR9IFJldHVybnMgdGhlIHBhcnRpY2lwYW50IHByaXZhdGUgdy1zaGFyZVxuICAgKiBhbmQgay1zaGFyZSB0byBiZSBkaXN0cmlidXRlZCB0byBvdGhlciBwYXJ0aWNpcGFudCBzaWduZXJcbiAgICovXG4gIGFzeW5jIHNpZ25TaGFyZSh4U2hhcmU6IFhTaGFyZSB8IFhTaGFyZVdpdGhOdGlsZGUsIHlTaGFyZTogWVNoYXJlV2l0aE50aWxkZSk6IFByb21pc2U8U2lnblNoYXJlUlQ+IHtcbiAgICBjb25zdCBwayA9IGdldFBhaWxsaWVyUHVibGljS2V5KGhleFRvQmlnSW50KHhTaGFyZS5uKSk7XG5cbiAgICAvLyBHZW5lcmF0ZSBhIGNoYWxsZW5nZSBpZiBudGlsZGUgaXMgbm90IHByZXNlbnQgaW4gdGhlIHhTaGFyZS5cbiAgICBpZiAoIWhhc050aWxkZSh4U2hhcmUpKSB7XG4gICAgICB4U2hhcmUgPSAoYXdhaXQgdGhpcy5hcHBlbmRDaGFsbGVuZ2UoeFNoYXJlLCB5U2hhcmUpKS54U2hhcmU7XG4gICAgfVxuXG4gICAgY29uc3QgayA9IEVjZHNhLmN1cnZlLnNjYWxhclJhbmRvbSgpO1xuICAgIGNvbnN0IHJrID0gYXdhaXQgcmFuZG9tQ29QcmltZVRvKHBrLm4pO1xuICAgIGNvbnN0IGNrID0gcGsuZW5jcnlwdChrLCByayk7XG4gICAgY29uc3QgZ2FtbWEgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJSYW5kb20oKTtcblxuICAgIGNvbnN0IGQgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJNdWx0KEVjZHNhLmN1cnZlLnNjYWxhclN1YihCaWdJbnQoeVNoYXJlLmopLCBCaWdJbnQoeFNoYXJlLmkpKSwgQmlnSW50KHhTaGFyZS5pKSk7XG5cbiAgICBjb25zdCB3ID0gW1xuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyTXVsdChCaWdJbnQoeVNoYXJlLmopLCBCaWdJbnQoeFNoYXJlLmkpKSxcbiAgICAgIGhleFRvQmlnSW50KHhTaGFyZVsneCddKSxcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhckludmVydChkKSxcbiAgICBdLnJlZHVjZShFY2RzYS5jdXJ2ZS5zY2FsYXJNdWx0KTtcblxuICAgIGNvbnN0IHsgbnRpbGRlOiBudGlsZGVhLCBoMTogaDFhLCBoMjogaDJhIH0gPSB4U2hhcmUgYXMgWFNoYXJlV2l0aE50aWxkZTtcblxuICAgIGNvbnN0IHNpZ25lcnM6IFNpZ25TaGFyZVJUID0ge1xuICAgICAgd1NoYXJlOiB7XG4gICAgICAgIGk6IHhTaGFyZS5pLFxuICAgICAgICBsOiB4U2hhcmUubCxcbiAgICAgICAgbTogeFNoYXJlLm0sXG4gICAgICAgIG46IHhTaGFyZS5uLFxuICAgICAgICB5OiB4U2hhcmUueSxcbiAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICBoMTogaDFhLFxuICAgICAgICBoMjogaDJhLFxuICAgICAgICBrOiBiaWdJbnRUb0J1ZmZlckJFKGssIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIGNrOiBiaWdJbnRUb0J1ZmZlckJFKGNrLCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgdzogYmlnSW50VG9CdWZmZXJCRSh3LCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBnYW1tYTogYmlnSW50VG9CdWZmZXJCRShnYW1tYSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0sXG4gICAgICBrU2hhcmU6IHt9IGFzIEtTaGFyZSxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBudGlsZGU6IG50aWxkZWIsIGgxOiBoMWIsIGgyOiBoMmIgfSA9IHlTaGFyZTtcbiAgICBjb25zdCBwcm9vZiA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5wcm92ZShcbiAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgMzA3MixcbiAgICAgIHBrLFxuICAgICAge1xuICAgICAgICBudGlsZGU6IGhleFRvQmlnSW50KG50aWxkZWIpLFxuICAgICAgICBoMTogaGV4VG9CaWdJbnQoaDFiKSxcbiAgICAgICAgaDI6IGhleFRvQmlnSW50KGgyYiksXG4gICAgICB9LFxuICAgICAgY2ssXG4gICAgICBrLFxuICAgICAgcmtcbiAgICApO1xuICAgIGNvbnN0IHByb29mU2hhcmUgPSB7XG4gICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi51LCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczEsIDk2KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcblxuICAgIHNpZ25lcnMua1NoYXJlID0ge1xuICAgICAgaTogeVNoYXJlLmosXG4gICAgICBqOiB4U2hhcmUuaSxcbiAgICAgIG46IHBrLm4udG9TdHJpbmcoMTYpLFxuICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgaDE6IGgxYSxcbiAgICAgIGgyOiBoMmEsXG4gICAgICBrOiBiaWdJbnRUb0J1ZmZlckJFKGNrLCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHByb29mOiBwcm9vZlNoYXJlLFxuICAgIH07XG5cbiAgICByZXR1cm4gc2lnbmVycztcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIG11bHRpcGxpY2l0aXZlLXRvLWFkZGl0aXZlIChNdEEpIHNoYXJlIGNvbnZlcnNpb24gd2l0aCBhbm90aGVyXG4gICAqIHNpZ25lci5cbiAgICogQHBhcmFtIHtTaWduQ29udmVydH1cbiAgICogQHJldHVybnMge1NpZ25Db252ZXJ0UlR9XG4gICAqL1xuICBhc3luYyBzaWduQ29udmVydChzaGFyZXM6IFNpZ25Db252ZXJ0KTogUHJvbWlzZTxTaWduQ29udmVydFJUPiB7XG4gICAgbGV0IHNoYXJlUGFydGljaXBhbnQ6IFBhcnRpYWw8QlNoYXJlPiB8IFBhcnRpYWw8R1NoYXJlPiwgc2hhcmVUb0JlU2VudDogUGFydGlhbDxBU2hhcmU+IHwgTVVTaGFyZTtcbiAgICBsZXQgaXNHYW1tYVNoYXJlID0gZmFsc2U7XG4gICAgbGV0IGtTaGFyZTogUGFydGlhbDxLU2hhcmU+ID0ge307XG4gICAgaWYgKHNoYXJlcy54U2hhcmUgJiYgc2hhcmVzLnlTaGFyZSAmJiBzaGFyZXMua1NoYXJlKSB7XG4gICAgICBjb25zdCB4U2hhcmUgPSBzaGFyZXMueFNoYXJlOyAvLyBjdXJyZW50UGFydGljaXBhbnQgc2VjcmV0IHhTaGFyZVxuICAgICAgY29uc3QgeVNoYXJlID0ge1xuICAgICAgICAuLi5zaGFyZXMueVNoYXJlLFxuICAgICAgICBudGlsZGU6IHNoYXJlcy5rU2hhcmUubnRpbGRlLFxuICAgICAgICBoMTogc2hhcmVzLmtTaGFyZS5oMSxcbiAgICAgICAgaDI6IHNoYXJlcy5rU2hhcmUuaDIsXG4gICAgICB9O1xuICAgICAgY29uc3Qgc2lnblNoYXJlID0gYXdhaXQgdGhpcy5zaWduU2hhcmUoeFNoYXJlLCB5U2hhcmUpO1xuICAgICAga1NoYXJlID0gc2lnblNoYXJlLmtTaGFyZTtcbiAgICAgIHNoYXJlVG9CZVNlbnQgPSB7IC4uLnNoYXJlcy5rU2hhcmUgfSBhcyBQYXJ0aWFsPEFTaGFyZT47XG4gICAgICBzaGFyZVBhcnRpY2lwYW50ID0geyAuLi5zaWduU2hhcmUud1NoYXJlIH0gYXMgUGFydGlhbDxCU2hhcmU+O1xuICAgIH0gZWxzZSBpZiAoKHNoYXJlcy5iU2hhcmUgJiYgc2hhcmVzLm11U2hhcmUpIHx8IChzaGFyZXMuYVNoYXJlICYmIHNoYXJlcy53U2hhcmUpKSB7XG4gICAgICBpc0dhbW1hU2hhcmUgPSB0cnVlO1xuICAgICAgc2hhcmVUb0JlU2VudCA9IHNoYXJlcy5hU2hhcmUgPyAoeyAuLi5zaGFyZXMuYVNoYXJlIH0gYXMgTVVTaGFyZSkgOiAoeyAuLi5zaGFyZXMubXVTaGFyZSB9IGFzIE1VU2hhcmUpO1xuICAgICAgc2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlcy53U2hhcmUgPyAoeyAuLi5zaGFyZXMud1NoYXJlIH0gYXMgUGFydGlhbDxHU2hhcmU+KSA6ICh7IC4uLnNoYXJlcy5iU2hhcmUgfSBhcyBHU2hhcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29uZmlnIGZvciBTaWduIENvbnZlcnQnKTtcbiAgICB9XG4gICAgaWYgKHNoYXJlUGFydGljaXBhbnQuaSAhPT0gc2hhcmVUb0JlU2VudC5pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NoYXJlcyBmcm9tIHNhbWUgcGFydGljaXBhbnQnKTtcbiAgICB9XG4gICAgaWYgKChzaGFyZVRvQmVTZW50IGFzIEFTaGFyZSkuYWxwaGEpIHtcbiAgICAgIGNvbnN0IGJTaGFyZVBhcnRpY2lwYW50ID0gc2hhcmVQYXJ0aWNpcGFudCBhcyBCU2hhcmU7XG4gICAgICBjb25zdCBhU2hhcmVUb0JlU2VudCA9IHNoYXJlVG9CZVNlbnQgYXMgQVNoYXJlO1xuICAgICAgY29uc3QgcGthID0gZ2V0UGFpbGxpZXJQdWJsaWNLZXkoaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQubikpO1xuICAgICAgbGV0IG50aWxkZWEsIGgxYSwgaDJhLCBjaztcbiAgICAgIGlmIChiU2hhcmVQYXJ0aWNpcGFudC5udGlsZGUpIHtcbiAgICAgICAgbnRpbGRlYSA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50Lm50aWxkZSk7XG4gICAgICAgIGgxYSA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50LmgxKTtcbiAgICAgICAgaDJhID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuaDIpO1xuICAgICAgICBjayA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50LmNrKTtcbiAgICAgIH1cbiAgICAgIC8vIFZlcmlmeSAkXFxnYW1tYV9pIFxcaW4gWl97Tl4yfSQuXG4gICAgICBpZiAoXG4gICAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5V2l0aENoZWNrKFxuICAgICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICAgIDMwNzIsXG4gICAgICAgICAgcGthLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgICBoMjogaDJhLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgejogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi56KSxcbiAgICAgICAgICAgIHpwcm06IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YuenBybSksXG4gICAgICAgICAgICB0OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnQpLFxuICAgICAgICAgICAgdjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi52KSxcbiAgICAgICAgICAgIHc6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YudyksXG4gICAgICAgICAgICBzOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnMpLFxuICAgICAgICAgICAgczE6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YuczEpLFxuICAgICAgICAgICAgczI6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YuczIpLFxuICAgICAgICAgICAgdDE6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YudDEpLFxuICAgICAgICAgICAgdDI6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YudDIpLFxuICAgICAgICAgICAgdTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi51KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNrLFxuICAgICAgICAgIGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmFscGhhKSxcbiAgICAgICAgICBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLngpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCB2ZXJpZnkgc2lnbmluZyBzaGFyZSBmb3IgZ2FtbWEgcHJvb2YnKTtcbiAgICAgIH1cbiAgICAgIC8vIFZlcmlmeSAkXFx3X2kgXFxpbiBaX3tOXjJ9JC5cbiAgICAgIGlmIChcbiAgICAgICAgIUVjZHNhUmFuZ2VQcm9vZi52ZXJpZnlXaXRoQ2hlY2soXG4gICAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgICAgMzA3MixcbiAgICAgICAgICBwa2EsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB6OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YueiksXG4gICAgICAgICAgICB6cHJtOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YuenBybSksXG4gICAgICAgICAgICB0OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YudCksXG4gICAgICAgICAgICB2OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YudiksXG4gICAgICAgICAgICB3OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YudyksXG4gICAgICAgICAgICBzOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YucyksXG4gICAgICAgICAgICBzMTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnMxKSxcbiAgICAgICAgICAgIHMyOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YuczIpLFxuICAgICAgICAgICAgdDE6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi50MSksXG4gICAgICAgICAgICB0MjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnQyKSxcbiAgICAgICAgICAgIHU6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi51KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNrLFxuICAgICAgICAgIGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50Lm11KSxcbiAgICAgICAgICBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YueClcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHZlcmlmeSBzaGFyZSBmb3Igd1Byb29mJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzayA9IG5ldyBwYWlsbGllckJpZ2ludC5Qcml2YXRlS2V5KFxuICAgICAgICBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5sIGFzIHN0cmluZyksXG4gICAgICAgIGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50Lm0gYXMgc3RyaW5nKSxcbiAgICAgICAgcGthXG4gICAgICApO1xuICAgICAgY29uc3QgZ1NoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIEdTaGFyZTtcbiAgICAgIGNvbnN0IG11U2hhcmVUb0JlU2VudCA9IHNoYXJlVG9CZVNlbnQgYXMgTVVTaGFyZTtcbiAgICAgIGNvbnN0IGFscGhhID0gc2suZGVjcnlwdChoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5hbHBoYSkpO1xuICAgICAgZ1NoYXJlUGFydGljaXBhbnQuYWxwaGEgPSBiaWdJbnRUb0J1ZmZlckJFKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShhbHBoYSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCBtdSA9IHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQubXUgYXMgc3RyaW5nKSk7IC8vIHJlY2hlY2sgZW5jcnlwdGVkIG51bWJlclxuICAgICAgZ1NoYXJlUGFydGljaXBhbnQubXUgPSBiaWdJbnRUb0J1ZmZlckJFKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShtdSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlUGFydGljaXBhbnQgYXMgUGFydGlhbDxHU2hhcmU+O1xuICAgICAgY29uc3QgcGFydGlhbFNoYXJlVG9CZVNlbnQgPSBtdVNoYXJlVG9CZVNlbnQgYXMgUGFydGlhbDxNVVNoYXJlPjtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5sO1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50Lm07XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQuYWxwaGE7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQubXU7XG4gICAgfVxuICAgIGlmICgoc2hhcmVUb0JlU2VudCBhcyBBU2hhcmUpLmspIHtcbiAgICAgIGNvbnN0IGJTaGFyZVBhcnRpY2lwYW50ID0gc2hhcmVQYXJ0aWNpcGFudCBhcyBCU2hhcmU7XG4gICAgICBjb25zdCBhU2hhcmVUb0JlU2VudCA9IHNoYXJlVG9CZVNlbnQgYXMgQVNoYXJlO1xuICAgICAgY29uc3QgbiA9IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50Lm4pOyAvLyBQYWlsbGllciBwdWIgZnJvbSBvdGhlciBzaWduZXJcbiAgICAgIGNvbnN0IHBrYSA9IGdldFBhaWxsaWVyUHVibGljS2V5KG4pO1xuICAgICAgbGV0IG50aWxkZWEsIGgxYSwgaDJhLCBudGlsZGViLCBoMWIsIGgyYjtcbiAgICAgIGlmIChhU2hhcmVUb0JlU2VudC5udGlsZGUpIHtcbiAgICAgICAgbnRpbGRlYSA9IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50Lm50aWxkZSk7XG4gICAgICAgIGgxYSA9IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmgxKTtcbiAgICAgICAgaDJhID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuaDIpO1xuICAgICAgICBudGlsZGViID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQubnRpbGRlKTtcbiAgICAgICAgaDFiID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuaDEpO1xuICAgICAgICBoMmIgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5oMik7XG4gICAgICB9XG4gICAgICBjb25zdCBrID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuayk7XG4gICAgICBpZiAoXG4gICAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5KFxuICAgICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICAgIDMwNzIsXG4gICAgICAgICAgcGthLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG50aWxkZTogbnRpbGRlYixcbiAgICAgICAgICAgIGgxOiBoMWIsXG4gICAgICAgICAgICBoMjogaDJiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgejogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YueiksXG4gICAgICAgICAgICB1OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5wcm9vZi51KSxcbiAgICAgICAgICAgIHc6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLncpLFxuICAgICAgICAgICAgczogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YucyksXG4gICAgICAgICAgICBzMTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YuczEpLFxuICAgICAgICAgICAgczI6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLnMyKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGtcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHZlcmlmeSBzaWduaW5nIEEgc2hhcmUgcHJvb2YnKTtcbiAgICAgIH1cbiAgICAgIC8vIE10QSAka19qLCBcXGdhbW1hX2kkLlxuICAgICAgY29uc3QgYmV0YTAgPSBiaWdpbnRDcnlwdG9VdGlscy5yYW5kQmV0d2VlbihFY2RzYS5jdXJ2ZS5vcmRlcigpICoqIF81bik7XG4gICAgICBiU2hhcmVQYXJ0aWNpcGFudC5iZXRhID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGJldGEwKSksIDMyKS50b1N0cmluZyhcbiAgICAgICAgJ2hleCdcbiAgICAgICk7XG4gICAgICBjb25zdCBnID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuZ2FtbWEpO1xuICAgICAgY29uc3QgcmIgPSBhd2FpdCByYW5kb21Db1ByaW1lVG8ocGthLm4pO1xuICAgICAgY29uc3QgY2IgPSBwa2EuZW5jcnlwdChiZXRhMCwgcmIpO1xuICAgICAgY29uc3QgYWxwaGEgPSBwa2EuYWRkaXRpb24ocGthLm11bHRpcGx5KGssIGcpLCBjYik7XG4gICAgICBhU2hhcmVUb0JlU2VudC5hbHBoYSA9IGJpZ0ludFRvQnVmZmVyQkUoYWxwaGEsIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAvLyBQcm92ZSAkXFxnYW1tYV9pIFxcaW4gWl97Tl4yfSQuXG4gICAgICBjb25zdCBneCA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoZyk7XG4gICAgICBsZXQgcHJvb2YgPSBhd2FpdCBFY2RzYVJhbmdlUHJvb2YucHJvdmVXaXRoQ2hlY2soXG4gICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICAzMDcyLFxuICAgICAgICBwa2EsXG4gICAgICAgIHtcbiAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgICBoMjogaDJhLFxuICAgICAgICB9LFxuICAgICAgICBrLFxuICAgICAgICBhbHBoYSxcbiAgICAgICAgZyxcbiAgICAgICAgYmV0YTAsXG4gICAgICAgIHJiLFxuICAgICAgICBneFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oYVNoYXJlVG9CZVNlbnQsIHtcbiAgICAgICAgZ2FtbWFQcm9vZjoge1xuICAgICAgICAgIHo6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YueiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgenBybTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56cHJtLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHY6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudiwgNzY4KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHMxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMxLCA5NikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0MTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MSwgMjI0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdDI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKGd4LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICAvLyBNdEEgJGtfaiwgd19pJC5cbiAgICAgIGNvbnN0IG51MCA9IGJpZ2ludENyeXB0b1V0aWxzLnJhbmRCZXR3ZWVuKEVjZHNhLmN1cnZlLm9yZGVyKCkgKiogXzVuKTtcbiAgICAgIHNoYXJlUGFydGljaXBhbnQubnUgPSBiaWdJbnRUb0J1ZmZlckJFKEVjZHNhLmN1cnZlLnNjYWxhck5lZ2F0ZShFY2RzYS5jdXJ2ZS5zY2FsYXJSZWR1Y2UobnUwKSksIDMyKS50b1N0cmluZyhcbiAgICAgICAgJ2hleCdcbiAgICAgICk7XG4gICAgICBjb25zdCB3ID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQudyk7XG4gICAgICBjb25zdCBybiA9IGF3YWl0IHJhbmRvbUNvUHJpbWVUbyhwa2Eubik7XG4gICAgICBjb25zdCBjbiA9IHBrYS5lbmNyeXB0KG51MCwgcm4pO1xuICAgICAgY29uc3QgbXUgPSBwa2EuYWRkaXRpb24ocGthLm11bHRpcGx5KGssIHcpLCBjbik7XG4gICAgICBzaGFyZVRvQmVTZW50Lm11ID0gYmlnSW50VG9CdWZmZXJCRShtdSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIC8vIFByb3ZlICRcXHdfaSBcXGluIFpfe05eMn0kLlxuICAgICAgY29uc3Qgd3ggPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KHcpO1xuICAgICAgcHJvb2YgPSBhd2FpdCBFY2RzYVJhbmdlUHJvb2YucHJvdmVXaXRoQ2hlY2soXG4gICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICAzMDcyLFxuICAgICAgICBwa2EsXG4gICAgICAgIHtcbiAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgICBoMjogaDJhLFxuICAgICAgICB9LFxuICAgICAgICBrLFxuICAgICAgICBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5tdSksXG4gICAgICAgIHcsXG4gICAgICAgIG51MCxcbiAgICAgICAgcm4sXG4gICAgICAgIHd4XG4gICAgICApO1xuICAgICAgT2JqZWN0LmFzc2lnbihzaGFyZVRvQmVTZW50LCB7XG4gICAgICAgIHdQcm9vZjoge1xuICAgICAgICAgIHo6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YueiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgenBybTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56cHJtLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHY6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudiwgNzY4KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHMxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMxLCA5NikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0MTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MSwgMjI0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdDI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKHd4LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBpZiAoKHNoYXJlUGFydGljaXBhbnQgYXMgR1NoYXJlKS5hbHBoYSkge1xuICAgICAgICBjb25zdCBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlUGFydGljaXBhbnQgYXMgUGFydGlhbDxCU2hhcmU+O1xuICAgICAgICBjb25zdCBwYXJ0aWFsU2hhcmVUb0JlU2VudCA9IHNoYXJlVG9CZVNlbnQgYXMgUGFydGlhbDxBU2hhcmU+O1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQubnRpbGRlO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuaDE7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5oMjtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50LmNrO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQubjtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50Lm50aWxkZTtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50LmgxO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQuaDI7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5rO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQucHJvb2Y7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3QuYXNzaWduKHNoYXJlVG9CZVNlbnQsIHtcbiAgICAgICAgICBuOiBrU2hhcmUubixcbiAgICAgICAgICBudGlsZGU6IGJpZ0ludFRvQnVmZmVyQkUobnRpbGRlYiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgaDE6IGJpZ0ludFRvQnVmZmVyQkUoaDFiLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBoMjogYmlnSW50VG9CdWZmZXJCRShoMmIsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIGs6IGtTaGFyZS5rLFxuICAgICAgICAgIHByb29mOiBrU2hhcmUucHJvb2YsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoISgnYWxwaGEnIGluIHNoYXJlVG9CZVNlbnQpICYmICEoJ2snIGluIHNoYXJlVG9CZVNlbnQpKSB7XG4gICAgICBjb25zdCBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlUGFydGljaXBhbnQgYXMgUGFydGlhbDxCU2hhcmU+O1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50Lm50aWxkZTtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5oMTtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5oMjtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5jaztcbiAgICAgIGNvbnN0IG11U2hhcmVUb0JlU2VudCA9IHNoYXJlVG9CZVNlbnQgYXMgTVVTaGFyZTtcbiAgICAgIHNoYXJlVG9CZVNlbnQgPSB7XG4gICAgICAgIGk6IG11U2hhcmVUb0JlU2VudC5pLFxuICAgICAgICBqOiBtdVNoYXJlVG9CZVNlbnQuaixcbiAgICAgIH0gYXMgTVVTaGFyZTtcbiAgICB9XG4gICAgW3NoYXJlVG9CZVNlbnQuaSwgc2hhcmVUb0JlU2VudC5qXSA9IFtzaGFyZVRvQmVTZW50LmosIHNoYXJlVG9CZVNlbnQuaV07XG4gICAgaWYgKGlzR2FtbWFTaGFyZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbXVTaGFyZTogc2hhcmVUb0JlU2VudCBhcyBNVVNoYXJlLFxuICAgICAgICBnU2hhcmU6IHNoYXJlUGFydGljaXBhbnQgYXMgR1NoYXJlLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFTaGFyZTogc2hhcmVUb0JlU2VudCBhcyBBU2hhcmUsXG4gICAgICBiU2hhcmU6IHNoYXJlUGFydGljaXBhbnQgYXMgQlNoYXJlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29tYmluZSBnYW1tYSBzaGFyZXMgdG8gZ2V0IHRoZSBwcml2YXRlIG9taWNyb24gLyBkZWx0YSBzaGFyZXNcbiAgICogQHBhcmFtIHtTaWduQ29tYmluZX0gc2hhcmVzXG4gICAqIEByZXR1cm5zIHtTaWduQ29tYmluZVJUfVxuICAgKi9cbiAgc2lnbkNvbWJpbmUoc2hhcmVzOiBTaWduQ29tYmluZSk6IFNpZ25Db21iaW5lUlQge1xuICAgIGNvbnN0IGdTaGFyZSA9IHNoYXJlcy5nU2hhcmU7XG4gICAgY29uc3QgUyA9IHNoYXJlcy5zaWduSW5kZXg7XG4gICAgY29uc3QgZ2FtbWEgPSBoZXhUb0JpZ0ludChnU2hhcmUuZ2FtbWEpO1xuICAgIGNvbnN0IGFscGhhID0gaGV4VG9CaWdJbnQoZ1NoYXJlLmFscGhhKTtcbiAgICBjb25zdCBiZXRhID0gaGV4VG9CaWdJbnQoZ1NoYXJlLmJldGEpO1xuICAgIGNvbnN0IG11ID0gaGV4VG9CaWdJbnQoZ1NoYXJlLm11KTtcbiAgICBjb25zdCBudSA9IGhleFRvQmlnSW50KGdTaGFyZS5udSk7XG4gICAgY29uc3QgayA9IGhleFRvQmlnSW50KGdTaGFyZS5rKTtcbiAgICBjb25zdCB3ID0gaGV4VG9CaWdJbnQoZ1NoYXJlLncpO1xuXG4gICAgY29uc3QgZGVsdGEgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQoRWNkc2EuY3VydmUuc2NhbGFyTXVsdChrLCBnYW1tYSksIEVjZHNhLmN1cnZlLnNjYWxhckFkZChhbHBoYSwgYmV0YSkpO1xuICAgIGNvbnN0IG9taWNyb24gPSBFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQoRWNkc2EuY3VydmUuc2NhbGFyTXVsdChrLCB3KSwgRWNkc2EuY3VydmUuc2NhbGFyQWRkKG11LCBudSkpO1xuICAgIGNvbnN0IEdhbW1hID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChnYW1tYSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgb1NoYXJlOiB7XG4gICAgICAgIGk6IGdTaGFyZS5pLFxuICAgICAgICB5OiBnU2hhcmUueSxcbiAgICAgICAgazogYmlnSW50VG9CdWZmZXJCRShrLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBvbWljcm9uOiBiaWdJbnRUb0J1ZmZlckJFKG9taWNyb24sIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIGRlbHRhOiBiaWdJbnRUb0J1ZmZlckJFKGRlbHRhLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBHYW1tYTogYmlnSW50VG9CdWZmZXJCRShHYW1tYSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0sXG4gICAgICBkU2hhcmU6IHtcbiAgICAgICAgaTogUy5pLFxuICAgICAgICBqOiBnU2hhcmUuaSxcbiAgICAgICAgZGVsdGE6IGJpZ0ludFRvQnVmZmVyQkUoZGVsdGEsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIEdhbW1hOiBiaWdJbnRUb0J1ZmZlckJFKEdhbW1hLCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gTSBNZXNzYWdlIHRvIGJlIHNpZ25lZFxuICAgKiBAcGFyYW0ge09TaGFyZX0gb1NoYXJlIHByaXZhdGUgb21pY3JvbiBzaGFyZSBvZiBjdXJyZW50IHBhcnRpY2lwYW50XG4gICAqIEBwYXJhbSB7RFNoYXJlfSBkU2hhcmUgZGVsdGEgc2hhcmUgcmVjZWl2ZWQgZnJvbSB0aGUgb3RoZXIgcGFydGljaXBhbnRcbiAgICogQHBhcmFtIHtIYXNofSBoYXNoIGhhc2hpbmcgYWxnb3JpdGhtIGltcGxlbWVudGluZyBOb2RlYHMgc3RhbmRhcmQgY3J5cHRvIGhhc2ggaW50ZXJmYWNlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkSGFzaCBpZiB0cnVlLCB3ZSBoYXNoIHRoZSBwcm92aWRlZCBidWZmZXIgYmVmb3JlIHNpZ25pbmdcbiAgICogQHJldHVybnMge1NTaGFyZX1cbiAgICovXG4gIHNpZ24oTTogQnVmZmVyLCBvU2hhcmU6IE9TaGFyZSwgZFNoYXJlOiBEU2hhcmUsIGhhc2g/OiBIYXNoLCBzaG91bGRIYXNoID0gdHJ1ZSk6IFNTaGFyZSB7XG4gICAgY29uc3QgbSA9IHNob3VsZEhhc2ggPyAoaGFzaCB8fCBjcmVhdGVIYXNoKCdzaGEyNTYnKSkudXBkYXRlKE0pLmRpZ2VzdCgpIDogTTtcblxuICAgIGNvbnN0IGRlbHRhID0gRWNkc2EuY3VydmUuc2NhbGFyQWRkKGhleFRvQmlnSW50KG9TaGFyZS5kZWx0YSksIGhleFRvQmlnSW50KGRTaGFyZS5kZWx0YSkpO1xuXG4gICAgY29uc3QgUiA9IEVjZHNhLmN1cnZlLnBvaW50TXVsdGlwbHkoXG4gICAgICBFY2RzYS5jdXJ2ZS5wb2ludEFkZChoZXhUb0JpZ0ludChvU2hhcmUuR2FtbWEpLCBoZXhUb0JpZ0ludChkU2hhcmUuR2FtbWEpKSxcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhckludmVydChkZWx0YSlcbiAgICApO1xuICAgIGNvbnN0IHBvaW50UiA9IHNlY3AuUG9pbnQuZnJvbUhleChiaWdJbnRUb0J1ZmZlckJFKFIsIDMyKSk7XG4gICAgY29uc3QgciA9IHBvaW50Ui54O1xuXG4gICAgY29uc3QgcyA9IEVjZHNhLmN1cnZlLnNjYWxhckFkZChcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhck11bHQoYmlnSW50RnJvbVU4QUJFKG0pLCBoZXhUb0JpZ0ludChvU2hhcmUuaykpLFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyTXVsdChyLCBoZXhUb0JpZ0ludChvU2hhcmUub21pY3JvbikpXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgaTogb1NoYXJlLmksXG4gICAgICB5OiBvU2hhcmUueSxcbiAgICAgIFI6IHBvaW50Ui50b0hleCh0cnVlKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBmdWxsIHNpZ25hdHVyZSBieSBjb21iaW5pbmcgU2lnbiBTaGFyZXNcbiAgICogQHBhcmFtIHtTU2hhcmVbXX0gc2hhcmVzXG4gICAqIEByZXR1cm5zIHtTaWduYXR1cmV9XG4gICAqL1xuICBjb25zdHJ1Y3RTaWduYXR1cmUoc2hhcmVzOiBTU2hhcmVbXSk6IFNpZ25hdHVyZSB7XG4gICAgLy8gRXZlcnkgUiBtdXN0IG1hdGNoLlxuICAgIGNvbnN0IFIgPSBzaGFyZXNbMF1bJ1InXTtcbiAgICBjb25zdCBpc1JNYXRjaGluZyA9IHNoYXJlcy5tYXAoKHNoYXJlKSA9PiBzaGFyZVsnUiddID09PSBSKS5yZWR1Y2UoKGEsIGIpID0+IGEgJiYgYik7XG4gICAgaWYgKCFpc1JNYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSIHZhbHVlIHNob3VsZCBiZSBjb25zaXN0ZW50IGFjcm9zcyBhbGwgc2hhcmVzJyk7XG4gICAgfVxuXG4gICAgbGV0IHMgPSBzaGFyZXMubWFwKChzaGFyZSkgPT4gaGV4VG9CaWdJbnQoc2hhcmVbJ3MnXSkpLnJlZHVjZShFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQpO1xuICAgIGNvbnN0IHJlY2lkID0gKFIuc2xpY2UoMCwgMikgPT09ICcwMycgPyAxIDogMCkgXiAocyA+IEVjZHNhLmN1cnZlLm9yZGVyKCkgLyBCaWdJbnQoMikgPyAxIDogMCk7XG5cbiAgICAvLyBOb3JtYWxpemUgcy5cbiAgICBzID0gcyA+IEVjZHNhLmN1cnZlLm9yZGVyKCkgLyBCaWdJbnQoMikgPyBFY2RzYS5jdXJ2ZS5vcmRlcigpIC0gcyA6IHM7XG4gICAgcmV0dXJuIHtcbiAgICAgIHk6IHNoYXJlc1swXVsneSddLFxuICAgICAgcjogUi5zbGljZSgyKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHJlY2lkOiByZWNpZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBlY2RzYSBzaWduYXR1cmVzXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBtZXNzYWdlXG4gICAqIEBwYXJhbSB7U2lnbmF0dXJlIH0gc2lnbmF0dXJlXG4gICAqIEBwYXJhbSB7SGFzaH0gaGFzaCBoYXNoaW5nIGFsZ29yaXRobSBpbXBsZW1lbnRpbmcgTm9kZWBzIHN0YW5kYXJkIGNyeXB0byBoYXNoIGludGVyZmFjZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZEhhc2ggaWYgdHJ1ZSwgd2UgaGFzaCB0aGUgcHJvdmlkZWQgYnVmZmVyIGJlZm9yZSB2ZXJpZnlpbmdcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgc2lnbmF0dXJlIGlzIHZhbGlkOyBGYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHZlcmlmeShtZXNzYWdlOiBCdWZmZXIsIHNpZ25hdHVyZTogU2lnbmF0dXJlLCBoYXNoPzogSGFzaCwgc2hvdWxkSGFzaCA9IHRydWUpOiBib29sZWFuIHtcbiAgICBjb25zdCBtZXNzYWdlVG9WZXJpZnkgPSBzaG91bGRIYXNoID8gKGhhc2ggfHwgY3JlYXRlSGFzaCgnc2hhMjU2JykpLnVwZGF0ZShtZXNzYWdlKS5kaWdlc3QoKSA6IG1lc3NhZ2U7XG4gICAgcmV0dXJuIEVjZHNhLmN1cnZlLnZlcmlmeShcbiAgICAgIG1lc3NhZ2VUb1ZlcmlmeSxcbiAgICAgIEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICBCdWZmZXIuZnJvbShbc2lnbmF0dXJlWydyZWNpZCddXSksXG4gICAgICAgIGJpZ0ludFRvQnVmZmVyQkUoaGV4VG9CaWdJbnQoc2lnbmF0dXJlWydyJ10pLCAzMiksXG4gICAgICAgIGJpZ0ludFRvQnVmZmVyQkUoaGV4VG9CaWdJbnQoc2lnbmF0dXJlWydzJ10pLCAzMiksXG4gICAgICBdKSxcbiAgICAgIGhleFRvQmlnSW50KHNpZ25hdHVyZVsneSddKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIGEgY2hhbGxlbmdlIGFuZCBpdCdzIHByb29mcyBmcm9tIGhleCBzdHJpbmdzIHRvIGJpZ2ludFxuICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2RrLWxpYi1tcGMgRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZU50aWxkZSBpbnN0ZWFkXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVOdGlsZGUoY2hhbGxlbmdlOiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWROdGlsZGUpOiBFY2RzYVR5cGVzLkRlc2VyaWFsaXplZE50aWxkZSB7XG4gICAgcmV0dXJuIEVjZHNhVHlwZXMuZGVzZXJpYWxpemVOdGlsZGUoY2hhbGxlbmdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgY2hhbGxlbmdlIGFuZCBpdCdzIHByb29mcyBmcm9tIGJpZyBpbnQgdG8gaGV4IHN0cmluZ3MuXG4gICAqIEBkZXByZWNhdGVkIHVzZSBzZGstbGliLW1wYyBFY2RzYVR5cGVzLmRlc2VyaWFsaXplTnRpbGRlIGluc3RlYWRcbiAgICogQHBhcmFtIGNoYWxsZW5nZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZU50aWxkZShjaGFsbGVuZ2U6IEVjZHNhVHlwZXMuRGVzZXJpYWxpemVkTnRpbGRlKTogRWNkc2FUeXBlcy5TZXJpYWxpemVkTnRpbGRlIHtcbiAgICByZXR1cm4gRWNkc2FUeXBlcy5zZXJpYWxpemVOdGlsZGUoY2hhbGxlbmdlKTtcbiAgfVxufVxuIl19
|
|
1256
|
+
Ecdsa.hdTree = new sdk_lib_mpc_1.Secp256k1Bip32HdTree();
|
|
1257
|
+
Ecdsa.shamir = new sdk_lib_mpc_1.Shamir(Ecdsa.curve);
|
|
1258
|
+
exports.default = Ecdsa;
|
|
1259
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYWNjb3VudC1saWIvbXBjL3Rzcy9lY2RzYS9lY2RzYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdFQUFrRDtBQUNsRCx1RUFBeUQ7QUFDekQsdURBQTREO0FBQzVELG1DQUF1RDtBQUN2RCxtREFBNkM7QUFDN0MscUNBQXlHO0FBQ3pHLHlDQUE4QztBQUM5Qyx5REFlaUM7QUF1Q2pDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixzRkFBc0Y7QUFDdEYsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDO0FBRXhCOztHQUVHO0FBQ0gsTUFBcUIsS0FBSztJQUl4Qjs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQWEsRUFBRSxTQUFpQixFQUFFLFNBQWlCLEVBQUUsSUFBYSxFQUFFLElBQUksR0FBRyxLQUFLO1FBQzdGLElBQUksQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3BGLE1BQU0seUJBQXlCLENBQUM7UUFDbEMsQ0FBQztRQUVELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFFRCxJQUFJLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUMvQixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQzdCLGtFQUFrRTtZQUNsRSxtQkFBbUIsR0FBRyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDLENB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TSxFQUFFLEdBQUcsTUFBTSxJQUFBLHFDQUF1QixFQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXpDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5RyxNQUFNLENBQUMsR0FBRztZQUNSLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRCxJQUFBLHlCQUFXLEVBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztTQUM1QixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUVyRCxNQUFNLE1BQU0sR0FBVztZQUNyQixDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDWCxDQUFDLEVBQUUs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NUMsWUFBTSxHQUFXLElBQUksb0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7a0JBSDdCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYWlsbGllckJpZ2ludCBmcm9tICdwYWlsbGllci1iaWdpbnQnO1xuaW1wb3J0ICogYXMgYmlnaW50Q3J5cHRvVXRpbHMgZnJvbSAnYmlnaW50LWNyeXB0by11dGlscyc7XG5pbXBvcnQgeyBzZWNwMjU2azEgYXMgc2VjcCB9IGZyb20gJ0Bub2JsZS9jdXJ2ZXMvc2VjcDI1NmsxJztcbmltcG9ydCB7IGNyZWF0ZUhhc2gsIEhhc2gsIHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IHsgYmlnSW50RnJvbUJ1ZmZlckJFLCBiaWdJbnRGcm9tVThBQkUsIGJpZ0ludFRvQnVmZmVyQkUsIGdldFBhaWxsaWVyUHVibGljS2V5IH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBTZWNwMjU2azFDdXJ2ZSB9IGZyb20gJy4uLy4uL2N1cnZlcyc7XG5pbXBvcnQge1xuICBFY2RzYVBhaWxsaWVyUHJvb2YsXG4gIEVjZHNhUmFuZ2VQcm9vZixcbiAgRWNkc2FUeXBlcyxcbiAgRWNkc2Faa1ZQcm9vZixcbiAgSGFzaENvbW1pdG1lbnQsXG4gIFNjaG5vcnIsXG4gIHJhbmRvbVBvc2l0aXZlQ29QcmltZVRvLFxuICBoZXhUb0JpZ0ludCxcbiAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgSERUcmVlLFxuICBTZWNwMjU2azFCaXAzMkhkVHJlZSxcbiAgY2hhaW5jb2RlQmFzZSxcbiAgU2hhbWlyLFxuICBTY2hub3JyUHJvb2YsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCB7XG4gIEFTaGFyZSxcbiAgQlNoYXJlLFxuICBEU2hhcmUsXG4gIEdTaGFyZSxcbiAgS2V5Q29tYmluZWQsXG4gIEtleVNoYXJlLFxuICBLU2hhcmUsXG4gIE1VU2hhcmUsXG4gIE5TaGFyZSxcbiAgT1NoYXJlLFxuICBQU2hhcmUsXG4gIFB1YmxpY1VUU2hhcmUsXG4gIFJhbmdlUHJvb2ZXaXRoQ2hlY2tTaGFyZSxcbiAgU2lnbmF0dXJlLFxuICBTaWduQ29tYmluZSxcbiAgU2lnbkNvbWJpbmVSVCxcbiAgU2lnbkNvbnZlcnQsXG4gIFNpZ25Db252ZXJ0UlQsXG4gIFNpZ25Db252ZXJ0U3RlcDEsXG4gIFNpZ25Db252ZXJ0U3RlcDFSZXNwb25zZSxcbiAgU2lnbkNvbnZlcnRTdGVwMixcbiAgU2lnbkNvbnZlcnRTdGVwMlJlc3BvbnNlLFxuICBTaWduQ29udmVydFN0ZXAzLFxuICBTaWduQ29udmVydFN0ZXAzUmVzcG9uc2UsXG4gIFNpZ25TaGFyZVJULFxuICBTU2hhcmUsXG4gIFN1YmtleVNoYXJlLFxuICBVVFNoYXJlLFxuICBWQVNoYXJlV2l0aFByb29mcyxcbiAgVkFTaGFyZSxcbiAgV1NoYXJlLFxuICBYU2hhcmUsXG4gIFhTaGFyZVdpdGhDaGFsbGVuZ2VzLFxuICBZU2hhcmVXaXRoQ2hhbGxlbmdlcyxcbiAgUHVibGljVkFTaGFyZVdpdGhQcm9vZnMsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBfNW4gPSBCaWdJbnQoNSk7XG4vLyBTaXplIG9mIGFscGhhIGFuZCBtdSBzaGFyZXMgaW4gYnl0ZXMgZXhwZWN0ZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwcm90b2NvbFxuY29uc3QgQUxQSEFNVVNJWkUgPSA3Njg7XG5cbi8qKlxuICogRUNEU0EgVFNTIGltcGxlbWVudGF0aW9uIHN1cHBvcnRpbmcgMjpuIFRocmVzaG9sZFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFY2RzYSB7XG4gIHN0YXRpYyBjdXJ2ZTogU2VjcDI1NmsxQ3VydmUgPSBuZXcgU2VjcDI1NmsxQ3VydmUoKTtcbiAgc3RhdGljIGhkVHJlZTogSERUcmVlID0gbmV3IFNlY3AyNTZrMUJpcDMySGRUcmVlKCk7XG4gIHN0YXRpYyBzaGFtaXI6IFNoYW1pciA9IG5ldyBTaGFtaXIoRWNkc2EuY3VydmUpO1xuICAvKipcbiAgICogR2VuZXJhdGUgc2hhcmVzIGZvciBwYXJ0aWNpcGFudCBhdCBpbmRleCBhbmQgc3BsaXQga2V5cyBgKHRocmVzaG9sZCxudW1TaGFyZXMpYCB3YXlzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggcGFydGljaXBhbnQgaW5kZXhcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRocmVzaG9sZCBTaWduaW5nIHRocmVzaG9sZFxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtU2hhcmVzICBOdW1iZXIgb2Ygc2hhcmVzXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBzZWVkIG9wdGlvbmFsIDY0IGJ5dGUgc2VlZCB0byB1c2UgZm9yIGtleSBnZW5lcmF0aW9uXG4gICAqIEBwYXJhbSBzeW5jIG9wdGlvbmFsIHN5bmMgZmxhZywgaWYgdHJ1ZSB0aGVuIGEgc3luY2hyb25vdXMgdmVyc2lvbiBvZiBQYWlsbGllciBrZXkgZ2VuZXJhdGlvbiBpcyB1c2VkIHRoYXQgZG9lcyBub3Qgc3Bhd24gV29ya2VyIHRocmVhZHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEtleVNoYXJlPn0gUmV0dXJucyB0aGUgcHJpdmF0ZSBwLXNoYXJlXG4gICAqIGFuZCBuLXNoYXJlcyB0byBiZSBkaXN0cmlidXRlZCB0byBwYXJ0aWNpcGFudHMgYXQgdGhlaXIgY29ycmVzcG9uZGluZyBpbmRleC5cbiAgICovXG4gIGFzeW5jIGtleVNoYXJlKGluZGV4OiBudW1iZXIsIHRocmVzaG9sZDogbnVtYmVyLCBudW1TaGFyZXM6IG51bWJlciwgc2VlZD86IEJ1ZmZlciwgc3luYyA9IGZhbHNlKTogUHJvbWlzZTxLZXlTaGFyZT4ge1xuICAgIGlmICghKGluZGV4ID4gMCAmJiBpbmRleCA8PSBudW1TaGFyZXMgJiYgdGhyZXNob2xkIDw9IG51bVNoYXJlcyAmJiB0aHJlc2hvbGQgPT09IDIpKSB7XG4gICAgICB0aHJvdyAnSW52YWxpZCBLZXlTaGFyZSBDb25maWcnO1xuICAgIH1cblxuICAgIGlmIChzZWVkICYmIHNlZWQubGVuZ3RoIDwgNjQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VlZCBtdXN0IGhhdmUgYSBsZW5ndGggb2YgYXQgbGVhc3QgNjQgYnl0ZXMnKTtcbiAgICB9XG5cbiAgICBsZXQgc2VlZFdpdGhWYWxpZExlbmd0aCA9IHNlZWQ7XG4gICAgaWYgKHNlZWQgJiYgc2VlZC5sZW5ndGggPiA2NCkge1xuICAgICAgLy8gaWYgc2VlZCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIDY0IGJ5dGVzLCBoYXNoIHNlZWQgdG8gNjQgYnl0ZXMuXG4gICAgICBzZWVkV2l0aFZhbGlkTGVuZ3RoID0gY3JlYXRlSGFzaCgnc2hhNTEyJykudXBkYXRlKHNlZWQpLmRpZ2VzdCgpO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIGFkZGl0aXZlbHkgaG9tb21vcnBoaWMgZW5jcnlwdGlvbiBrZXkuXG4gICAgbGV0IHBhaWxsaWVyS2V5UGFpcjogcGFpbGxpZXJCaWdpbnQuS2V5UGFpcjtcbiAgICBpZiAoIXN5bmMpIHtcbiAgICAgIHBhaWxsaWVyS2V5UGFpciA9IGF3YWl0IHBhaWxsaWVyQmlnaW50LmdlbmVyYXRlUmFuZG9tS2V5cyhtaW5Nb2R1bHVzQml0TGVuZ3RoLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXN5bmNcbiAgICAgIHBhaWxsaWVyS2V5UGFpciA9IHBhaWxsaWVyQmlnaW50LmdlbmVyYXRlUmFuZG9tS2V5c1N5bmMobWluTW9kdWx1c0JpdExlbmd0aCwgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgcHVibGljS2V5LCBwcml2YXRlS2V5IH0gPSBwYWlsbGllcktleVBhaXI7XG4gICAgLy8gQWNjZXB0IGEgNjQgYnl0ZSBzZWVkIGFuZCBjcmVhdGUgYW4gZXh0ZW5kZWQgcHJpdmF0ZSBrZXkgZnJvbSB0aGF0IHNlZWRcbiAgICBjb25zdCBzZWNyZXRLZXkgPSBzZWVkV2l0aFZhbGlkTGVuZ3RoICYmIGJpcDMyLmZyb21TZWVkKHNlZWRXaXRoVmFsaWRMZW5ndGgpO1xuICAgIGNvbnN0IHUgPVxuICAgICAgKHNlY3JldEtleSAmJiBzZWNyZXRLZXkucHJpdmF0ZUtleSAmJiBiaWdJbnRGcm9tVThBQkUobmV3IFVpbnQ4QXJyYXkoc2VjcmV0S2V5LnByaXZhdGVLZXkpKSkgPz9cbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhclJhbmRvbSgpO1xuICAgIGNvbnN0IHkgPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KHUpO1xuICAgIGNvbnN0IGNoYWluY29kZSA9IChzZWNyZXRLZXkgJiYgc2VjcmV0S2V5LmNoYWluQ29kZSkgPz8gcmFuZG9tQnl0ZXMoMzIpO1xuICAgIC8vIENvbXB1dGUgc2VjcmV0IHNoYXJlcyBvZiB0aGUgcHJpdmF0ZSBrZXlcbiAgICBjb25zdCB7IHNoYXJlczogdVNoYXJlcywgdiB9ID0gRWNkc2Euc2hhbWlyLnNwbGl0KHUsIHRocmVzaG9sZCwgbnVtU2hhcmVzKTtcbiAgICBjb25zdCBjdXJyZW50UGFydGljaXBhbnQ6IFBTaGFyZSA9IHtcbiAgICAgIGk6IGluZGV4LFxuICAgICAgdDogdGhyZXNob2xkLFxuICAgICAgYzogbnVtU2hhcmVzLFxuICAgICAgbDogYmlnSW50VG9CdWZmZXJCRShwcml2YXRlS2V5LmxhbWJkYSwgMTkyKS50b1N0cmluZygnaGV4JyksXG4gICAgICBtOiBiaWdJbnRUb0J1ZmZlckJFKHByaXZhdGVLZXkubXUsIDE5MikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgbjogYmlnSW50VG9CdWZmZXJCRShwdWJsaWNLZXkubiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKHksIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHVTaGFyZXNbaW5kZXhdLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdXU6IHUudG9TdHJpbmcoKSxcbiAgICAgIGNoYWluY29kZTogY2hhaW5jb2RlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuICAgIGNvbnN0IGtleVNoYXJlOiBLZXlTaGFyZSA9IHtcbiAgICAgIHBTaGFyZTogY3VycmVudFBhcnRpY2lwYW50LFxuICAgICAgblNoYXJlczoge30sXG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qgc2hhcmUgaW4gdVNoYXJlcykge1xuICAgICAgY29uc3QgcGFydGljaXBhbnRJbmRleCA9IHBhcnNlSW50KHNoYXJlLCAxMCk7XG4gICAgICBpZiAocGFydGljaXBhbnRJbmRleCAhPT0gaW5kZXgpIHtcbiAgICAgICAga2V5U2hhcmUublNoYXJlc1twYXJ0aWNpcGFudEluZGV4XSA9IHtcbiAgICAgICAgICBpOiBwYXJ0aWNpcGFudEluZGV4LFxuICAgICAgICAgIGo6IGN1cnJlbnRQYXJ0aWNpcGFudFsnaSddLFxuICAgICAgICAgIG46IHB1YmxpY0tleS5uLnRvU3RyaW5nKDE2KSxcbiAgICAgICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKHksIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdjogYmlnSW50VG9CdWZmZXJCRSh2WzBdLCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUodVNoYXJlc1twYXJ0aWNpcGFudEluZGV4XSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBjaGFpbmNvZGU6IGNoYWluY29kZS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH0gYXMgTlNoYXJlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5U2hhcmU7XG4gIH1cblxuICAvKipcbiAgICogQ29tYmluZSBkYXRhIHNoYXJlZCBkdXJpbmcgdGhlIGtleSBnZW5lcmF0aW9uIHByb3RvY29sLlxuICAgKiBAcGFyYW0ge0tleVNoYXJlfSBwYXJ0aWNpcGFudFNoYXJlcyBwcml2YXRlIHAtc2hhcmUgYW5kXG4gICAqIG4tc2hhcmVzIHJlY2VpdmVkIGZyb20gYWxsIG90aGVyIHBhcnRpY2lwYW50cy5cbiAgICogQHJldHVybnMge0tleUNvbWJpbmVkfSBSZXR1cm5zIHRoZSBwYXJ0aWNpcGFudCBwcml2YXRlIHgtc2hhcmVcbiAgICogYW5kIHktc2hhcmVzIHRvIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHNpZ25pbmcgc2hhcmVzLlxuICAgKi9cbiAga2V5Q29tYmluZShwU2hhcmU6IFBTaGFyZSwgblNoYXJlczogTlNoYXJlW10pOiBLZXlDb21iaW5lZCB7XG4gICAgY29uc3QgYWxsU2hhcmVzID0gW3BTaGFyZSwgLi4ublNoYXJlc107XG4gICAgLy8gQ29tcHV0ZSB0aGUgcHVibGljIGtleS5cbiAgICBjb25zdCB5ID0gYWxsU2hhcmVzLm1hcCgocGFydGljaXBhbnQpID0+IGhleFRvQmlnSW50KHBhcnRpY2lwYW50Wyd5J10pKS5yZWR1Y2UoRWNkc2EuY3VydmUucG9pbnRBZGQpO1xuICAgIC8vIEFkZCBzZWNyZXQgc2hhcmVzXG4gICAgY29uc3QgeCA9IGFsbFNoYXJlcy5tYXAoKHBhcnRpY2lwYW50KSA9PiBoZXhUb0JpZ0ludChwYXJ0aWNpcGFudFsndSddKSkucmVkdWNlKEVjZHNhLmN1cnZlLnNjYWxhckFkZCk7XG5cbiAgICAvLyBWZXJpZnkgc2hhcmVzLlxuICAgIGZvciAoY29uc3Qgc2hhcmUgb2YgblNoYXJlcykge1xuICAgICAgaWYgKHNoYXJlLnYpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBFY2RzYS5zaGFtaXIudmVyaWZ5KGhleFRvQmlnSW50KHNoYXJlLnUpLCBbaGV4VG9CaWdJbnQoc2hhcmUueSksIGhleFRvQmlnSW50KHNoYXJlLnYpXSwgcFNoYXJlLmkpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCB2ZXJpZnkgc2hhcmUgZnJvbSBwYXJ0aWNpcGFudCAke3NoYXJlLmp9LiBWZXJpZmljYXRpb24gZXJyb3I6ICR7ZXJyfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgU2Nobm9yciBwcm9vZiBvZiBrbm93bGVkZ2Ugb2YgdGhlIGRpc2NyZXRlIGxvZyBvZiBYID0geEcuXG4gICAgY29uc3QgWCA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoeCk7XG5cbiAgICBjb25zdCBwcm9vZkNvbnRleHQgPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoYmlnSW50VG9CdWZmZXJCRSh5LCBFY2RzYS5jdXJ2ZS5wb2ludEJ5dGVzKSkuZGlnZXN0KCk7XG5cbiAgICBjb25zdCBzY2hub3JyUHJvb2ZYID0gU2Nobm9yci5jcmVhdGVTY2hub3JyUHJvb2YoWCwgeCwgRWNkc2EuY3VydmUsIHByb29mQ29udGV4dCk7XG5cbiAgICAvLyBDaGFpbmNvZGUgd2lsbCBiZSB1c2VkIGluIGZ1dHVyZSB3aGVuIHdlIGFkZCBzdXBwb3J0IGZvciBrZXkgZGVyaXZhdGlvbiBmb3IgZWNkc2FcbiAgICBjb25zdCBjaGFpbmNvZGVzID0gW3BTaGFyZSwgLi4ublNoYXJlc10ubWFwKCh7IGNoYWluY29kZSB9KSA9PiBiaWdJbnRGcm9tQnVmZmVyQkUoQnVmZmVyLmZyb20oY2hhaW5jb2RlLCAnaGV4JykpKTtcbiAgICBjb25zdCBjaGFpbmNvZGUgPSBjaGFpbmNvZGVzLnJlZHVjZShcbiAgICAgIChhY2MsIGNoYWluY29kZSkgPT5cbiAgICAgICAgKGFjYyArIGNoYWluY29kZSkgJSBCaWdJbnQoJzB4MDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJykgLy8gMl4yNTZcbiAgICApO1xuXG4gICAgY29uc3QgcGFydGljaXBhbnRzOiBLZXlDb21iaW5lZCA9IHtcbiAgICAgIHhTaGFyZToge1xuICAgICAgICBpOiBwU2hhcmUuaSxcbiAgICAgICAgbDogcFNoYXJlLmwsXG4gICAgICAgIG06IHBTaGFyZS5tLFxuICAgICAgICBuOiBwU2hhcmUubixcbiAgICAgICAgeTogYmlnSW50VG9CdWZmZXJCRSh5LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKHgsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHNjaG5vcnJQcm9vZlg6IHNjaG5vcnJQcm9vZlgsXG4gICAgICAgIGNoYWluY29kZTogYmlnSW50VG9CdWZmZXJCRShjaGFpbmNvZGUsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9LFxuICAgICAgeVNoYXJlczoge30sXG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qgc2hhcmUgaW4gblNoYXJlcykge1xuICAgICAgY29uc3QgcGFydGljaXBhbnRJbmRleCA9IG5TaGFyZXNbc2hhcmVdWydqJ107XG4gICAgICBwYXJ0aWNpcGFudHMueVNoYXJlc1twYXJ0aWNpcGFudEluZGV4XSA9IHtcbiAgICAgICAgaTogcFNoYXJlLmksXG4gICAgICAgIGo6IG5TaGFyZXNbc2hhcmVdWydqJ10sXG4gICAgICAgIG46IG5TaGFyZXNbc2hhcmVdWyduJ10sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcGFydGljaXBhbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcml2ZSBzaGFyZXMgZm9yIGEgQklQLTMyIHN1YmtleS5cbiAgICogQHBhcmFtIHtQU2hhcmV9IFRoZSB1c2VyJ3MgcC1zaGFyZS5cbiAgICogQHBhcmFtIHtOU2hhcmVbXX0gVGhlIG4tc2hhcmVzIHJlY2VpdmVkIGZyb20gdGhlIG90aGVyIHBhcnRpY2lwYW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFRoZSBCSVAtMzIgcGF0aCB0byBkZXJpdmUuXG4gICAqIEByZXR1cm5zIHtTdWJrZXlTaGFyZX0gUmV0dXJucyB0aGUgcHJpdmF0ZSB4LXNoYXJlIGFuZCBuLXNoYXJlcyB0b1xuICAgKiBiZSBkaXN0cmlidXRlZCB0byBwYXJ0aWNpcGFudHMgYXQgdGhlaXIgY29ycmVzcG9uZGluZyBpbmRleC5cbiAgICovXG4gIGtleURlcml2ZShwU2hhcmU6IFBTaGFyZSwgblNoYXJlczogTlNoYXJlW10sIHBhdGg6IHN0cmluZyk6IFN1YmtleVNoYXJlIHtcbiAgICBjb25zdCB5VmFsdWVzID0gW3BTaGFyZSwgLi4ublNoYXJlc10ubWFwKChzaGFyZSkgPT4gaGV4VG9CaWdJbnQoc2hhcmUueSkpO1xuICAgIGNvbnN0IHkgPSB5VmFsdWVzLnJlZHVjZSgocGFydGlhbCwgc2hhcmUpID0+IEVjZHNhLmN1cnZlLnBvaW50QWRkKHBhcnRpYWwsIHNoYXJlKSk7XG4gICAgY29uc3QgdSA9IEJpZ0ludChwU2hhcmUudXUpO1xuICAgIGxldCBjb250cmliQ2hhaW5jb2RlID0gaGV4VG9CaWdJbnQocFNoYXJlLmNoYWluY29kZSk7XG4gICAgY29uc3QgY2hhaW5jb2RlcyA9IFtjb250cmliQ2hhaW5jb2RlLCAuLi5uU2hhcmVzLm1hcCgoeyBjaGFpbmNvZGUgfSkgPT4gaGV4VG9CaWdJbnQoY2hhaW5jb2RlKSldO1xuICAgIGNvbnN0IGNoYWluY29kZSA9IGNoYWluY29kZXMucmVkdWNlKChhY2MsIGNoYWluY29kZSkgPT4gKGFjYyArIGNoYWluY29kZSkgJSBjaGFpbmNvZGVCYXNlKTtcblxuICAgIC8vIFZlcmlmeSBzaGFyZXMuXG4gICAgZm9yIChjb25zdCBzaGFyZSBvZiBuU2hhcmVzKSB7XG4gICAgICBpZiAoc2hhcmUudikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEVjZHNhLnNoYW1pci52ZXJpZnkoaGV4VG9CaWdJbnQoc2hhcmUudSksIFtoZXhUb0JpZ0ludChzaGFyZS55KSwgaGV4VG9CaWdJbnQoc2hhcmUudildLCBwU2hhcmUuaSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHZlcmlmeSBzaGFyZSBmcm9tIHBhcnRpY2lwYW50ICR7c2hhcmUuan0uIFZlcmlmaWNhdGlvbiBlcnJvcjogJHtlcnJ9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZXJpdmUgc3Via2V5LlxuICAgIGNvbnN0IHN1YmtleSA9IEVjZHNhLmhkVHJlZS5wcml2YXRlRGVyaXZlKHsgcGs6IHksIHNrOiB1LCBjaGFpbmNvZGUgfSwgcGF0aCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgbmV3IHB1YmxpYyBrZXkgY29udHJpYnV0aW9uLlxuICAgIGNvbnN0IGNvbnRyaWJZID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChzdWJrZXkuc2spO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyBjaGFpbmNvZGUgY29udHJpYnV0aW9uLlxuICAgIGNvbnN0IGNoYWluY29kZURlbHRhID0gKGNoYWluY29kZUJhc2UgKyBzdWJrZXkuY2hhaW5jb2RlIC0gY2hhaW5jb2RlKSAlIGNoYWluY29kZUJhc2U7XG4gICAgY29udHJpYkNoYWluY29kZSA9IChjb250cmliQ2hhaW5jb2RlICsgY2hhaW5jb2RlRGVsdGEpICUgY2hhaW5jb2RlQmFzZTtcblxuICAgIC8vIENhbGN1bGF0ZSBuZXcgdSB2YWx1ZXMuXG4gICAgY29uc3QgeyBzaGFyZXM6IHNwbGl0X3UsIHYgfSA9IEVjZHNhLnNoYW1pci5zcGxpdChzdWJrZXkuc2ssIHBTaGFyZS50IHx8IDIsIHBTaGFyZS5jIHx8IDMpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyBzaWduaW5nIGtleS5cbiAgICBjb25zdCB4ID0gW3NwbGl0X3VbcFNoYXJlLmldLCAuLi5uU2hhcmVzLm1hcCgoeyB1IH0pID0+IGhleFRvQmlnSW50KHUpKV0ucmVkdWNlKEVjZHNhLmN1cnZlLnNjYWxhckFkZCk7XG5cbiAgICAvLyBHZW5lcmF0ZSBTY2hub3JyIHByb29mIG9mIGtub3dsZWRnZSBvZiB0aGUgZGlzY3JldGUgbG9nIG9mIFggPSB4Ry5cbiAgICBjb25zdCBYID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdCh4KTtcblxuICAgIGNvbnN0IHByb29mQ29udGV4dCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHN1YmtleS5waywgRWNkc2EuY3VydmUucG9pbnRCeXRlcykpLmRpZ2VzdCgpO1xuXG4gICAgY29uc3Qgc2Nobm9yclByb29mWCA9IFNjaG5vcnIuY3JlYXRlU2Nobm9yclByb29mKFgsIHgsIEVjZHNhLmN1cnZlLCBwcm9vZkNvbnRleHQpO1xuXG4gICAgY29uc3QgUF9pOiBYU2hhcmUgPSB7XG4gICAgICBpOiBwU2hhcmUuaSxcbiAgICAgIGw6IHBTaGFyZS5sLFxuICAgICAgbTogcFNoYXJlLm0sXG4gICAgICBuOiBwU2hhcmUubixcbiAgICAgIHk6IGJpZ0ludFRvQnVmZmVyQkUoc3Via2V5LnBrLCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgeDogYmlnSW50VG9CdWZmZXJCRSh4LCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgc2Nobm9yclByb29mWDogc2Nobm9yclByb29mWCxcbiAgICAgIGNoYWluY29kZTogYmlnSW50VG9CdWZmZXJCRShzdWJrZXkuY2hhaW5jb2RlLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG5cbiAgICBjb25zdCBzaGFyZXM6IFN1YmtleVNoYXJlID0ge1xuICAgICAgeFNoYXJlOiBQX2ksXG4gICAgICBuU2hhcmVzOiB7fSxcbiAgICB9O1xuXG4gICAgZm9yIChsZXQgaW5kID0gMDsgaW5kIDwgblNoYXJlcy5sZW5ndGg7IGluZCsrKSB7XG4gICAgICBjb25zdCBQX2ogPSBuU2hhcmVzW2luZF07XG4gICAgICBzaGFyZXMublNoYXJlc1tQX2oual0gPSB7XG4gICAgICAgIGk6IFBfai5qLFxuICAgICAgICBqOiBQX2kuaSxcbiAgICAgICAgbjogUF9pLm4sXG4gICAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUoc3BsaXRfdVtQX2oual0sIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHk6IGJpZ0ludFRvQnVmZmVyQkUoY29udHJpYlksIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHY6IGJpZ0ludFRvQnVmZmVyQkUodlswXSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgY2hhaW5jb2RlOiBiaWdJbnRUb0J1ZmZlckJFKGNvbnRyaWJDaGFpbmNvZGUsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBzaGFyZXM7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IFNjaG5vcnIgcHJvb2Ygb2Yga25vd2xlZGdlIG9mIHRoZSBkaXNjcmV0ZSBsb2cgb2YgWF9pID0geF9pICogRy5cbiAgICogQHBhcmFtIFkgVGhlIGNvbWJpbmVkIHB1YmxpYyBrZXkuXG4gICAqIEBwYXJhbSBWU1NzIFRoZSBWU1Mgc2hhcmVzIHJlY2VpdmVkIGZyb20gYWxsIHBhcnRpY2lwYW50cy5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBpIG9mIFhfaS5cbiAgICogQHBhcmFtIHByb29mIFRoZSBzY2hub3JyIHByb29mLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIGl0J3MgYSB2YWxpZCBwcm9vZiB3aXRoIHJlZ2FyZHMgdG8gWSBhbmQgVlNTcy5cbiAgICovXG4gIHZlcmlmeVNjaG5vcnJQcm9vZlgoWTogYmlnaW50LCBWU1NzOiBiaWdpbnRbXVtdLCBpbmRleDogbnVtYmVyLCBwcm9vZjogU2Nobm9yclByb29mKTogYm9vbGVhbiB7XG4gICAgaWYgKGluZGV4IDwgMSB8fCBpbmRleCA+IFZTU3MubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgc3VwcGxpZWQgZm9yIGluZGV4Jyk7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIFhfaSBmcm9tIHB1YmxpYyBpbmZvcm1hdGlvbi5cbiAgICBsZXQgWF9pID0gWTtcbiAgICBWU1NzLmZvckVhY2goKFZTUykgPT4ge1xuICAgICAgVlNTLmZvckVhY2goKHYpID0+IHtcbiAgICAgICAgWF9pID0gRWNkc2EuY3VydmUucG9pbnRBZGQoWF9pLCBFY2RzYS5jdXJ2ZS5wb2ludE11bHRpcGx5KHYsIEJpZ0ludChpbmRleCkpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvb2ZDb250ZXh0ID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUoWSwgRWNkc2EuY3VydmUucG9pbnRCeXRlcykpLmRpZ2VzdCgpO1xuICAgIHJldHVybiBTY2hub3JyLnZlcmlmeVNjaG5vcnJQcm9vZihYX2ksIHByb29mLCBFY2RzYS5jdXJ2ZSwgcHJvb2ZDb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJpdmVzIGEgY2hpbGQgY29tbW9uIGtleWNoYWluIGZyb20gY29tbW9uIGtleWNoYWluXG4gICAqXG4gICAqIEBwYXJhbSB7Y29tbW9uS2V5Y2hhaW59IFRoZSBjb21tb24ga2V5Y2hhaW4gYXMgYSBoZXggc3RyaW5nLlxuICAgKiBAcGFyYW0ge3BhdGh9IFRoZSBCSVAtMzIgcGF0aCB0byBkZXJpdmUuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRlcml2ZWQgY29tbW9uIGtleWNoYWluIGFzIGEgaGV4IHN0cmluZy5cbiAgICovXG4gIGRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Y2hhaW46IHN0cmluZywgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoRWNkc2EuaGRUcmVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGRlcml2ZSBrZXkgd2l0aG91dCBIRFRyZWUgaW1wbGVtZW50YXRpb25cIik7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW4gPSBCdWZmZXIuZnJvbShjb21tb25LZXljaGFpbiwgJ2hleCcpO1xuXG4gICAgY29uc3QgZGVyaXZlZFB1YmxpY0tleWNoYWluID0gRWNkc2EuaGRUcmVlLnB1YmxpY0Rlcml2ZShcbiAgICAgIHtcbiAgICAgICAgcGs6IGJpZ0ludEZyb21CdWZmZXJCRShrZXljaGFpbi5zbGljZSgwLCAzMykpLFxuICAgICAgICBjaGFpbmNvZGU6IGJpZ0ludEZyb21CdWZmZXJCRShrZXljaGFpbi5zbGljZSgzMykpLFxuICAgICAgfSxcbiAgICAgIHBhdGhcbiAgICApO1xuXG4gICAgY29uc3QgZGVyaXZlZFBrID0gYmlnSW50VG9CdWZmZXJCRShkZXJpdmVkUHVibGljS2V5Y2hhaW4ucGssIDMzKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgZGVyaXZlZENoYWluY29kZSA9IGJpZ0ludFRvQnVmZmVyQkUoZGVyaXZlZFB1YmxpY0tleWNoYWluLmNoYWluY29kZSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIHJldHVybiBkZXJpdmVkUGsgKyBkZXJpdmVkQ2hhaW5jb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBnaXZlbiByYW5nZSBwcm9vZiBjaGFsbGVuZ2UgdG8gdGhlIHNoYXJlcyBwcmV2aW91c2x5IGNyZWF0ZWRcbiAgICogYnkgI2tleUNvbWJpbmUuIEdlbmVyYXRlcyBhIG5ldyBjaGFsbGVuZ2UgaWYgbm90IHByb3ZpZGVkLlxuICAgKiBAcGFyYW0ge1hTaGFyZSB8IFlTaGFyZX0gc2hhcmUgUHJpdmF0ZSB4U2hhcmUgb3IgeVNoYXJlIG9mIHRoZSBzaWduaW5nIG9wZXJhdGlvblxuICAgKiBAcGFyYW0gcmFuZ2VQcm9vZkNoYWxsZW5nZSAtIGNoYWxsZW5nZSBnZW5lcmF0ZWQgdmlhIGdlbmVyYXRlTnRpbGRlXG4gICAqIEBwYXJhbSBwYWlsbGllclByb29mQ2hhbGxlbmdlXG4gICAqIEByZXR1cm5zIHtLZXlDb21iaW5lZH0gVGhlIHNoYXJlIHdpdGggYW1lbmRlZCBjaGFsbGVuZ2UgdmFsdWVzXG4gICAqL1xuICBhcHBlbmRDaGFsbGVuZ2U8VD4oXG4gICAgc2hhcmU6IFQsXG4gICAgcmFuZ2VQcm9vZkNoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkTnRpbGRlLFxuICAgIHBhaWxsaWVyUHJvb2ZDaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZFBhaWxsaWVyQ2hhbGxlbmdlXG4gICk6IFQgJiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWRFY2RzYUNoYWxsZW5nZXMge1xuICAgIGNvbnN0IHsgbnRpbGRlLCBoMSwgaDIgfSA9IHJhbmdlUHJvb2ZDaGFsbGVuZ2U7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNoYXJlLFxuICAgICAgbnRpbGRlLFxuICAgICAgaDEsXG4gICAgICBoMixcbiAgICAgIHA6IHBhaWxsaWVyUHJvb2ZDaGFsbGVuZ2UucCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBzaWduaW5nIHNoYXJlcy5cbiAgICogQHBhcmFtIHt4U2hhcmV9IHhTaGFyZSBQcml2YXRlIHhTaGFyZSBvZiBjdXJyZW50IHBhcnRpY2lwYW50IHNpZ25lclxuICAgKiBAcGFyYW0ge1lTaGFyZX0geVNoYXJlIHlTaGFyZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdGhlciBwYXJ0aWNpcGFudCBzaWduZXJcbiAgICogQHJldHVybnMge1NpZ25TaGFyZVJUfSBSZXR1cm5zIHRoZSBwYXJ0aWNpcGFudCBwcml2YXRlIHctc2hhcmVcbiAgICogYW5kIGstc2hhcmUgdG8gYmUgZGlzdHJpYnV0ZWQgdG8gb3RoZXIgcGFydGljaXBhbnQgc2lnbmVyXG4gICAqL1xuICBhc3luYyBzaWduU2hhcmUoeFNoYXJlOiBYU2hhcmVXaXRoQ2hhbGxlbmdlcywgeVNoYXJlOiBZU2hhcmVXaXRoQ2hhbGxlbmdlcyk6IFByb21pc2U8U2lnblNoYXJlUlQ+IHtcbiAgICBjb25zdCBwayA9IGdldFBhaWxsaWVyUHVibGljS2V5KGhleFRvQmlnSW50KHhTaGFyZS5uKSk7XG5cbiAgICBjb25zdCBrID0gRWNkc2EuY3VydmUuc2NhbGFyUmFuZG9tKCk7XG4gICAgY29uc3QgcmsgPSBhd2FpdCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhway5uKTtcbiAgICBjb25zdCBjayA9IHBrLmVuY3J5cHQoaywgcmspO1xuICAgIGNvbnN0IGdhbW1hID0gRWNkc2EuY3VydmUuc2NhbGFyUmFuZG9tKCk7XG5cbiAgICBjb25zdCBkID0gRWNkc2EuY3VydmUuc2NhbGFyTXVsdChFY2RzYS5jdXJ2ZS5zY2FsYXJTdWIoQmlnSW50KHlTaGFyZS5qKSwgQmlnSW50KHhTaGFyZS5pKSksIEJpZ0ludCh4U2hhcmUuaSkpO1xuXG4gICAgY29uc3QgdyA9IFtcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhck11bHQoQmlnSW50KHlTaGFyZS5qKSwgQmlnSW50KHhTaGFyZS5pKSksXG4gICAgICBoZXhUb0JpZ0ludCh4U2hhcmVbJ3gnXSksXG4gICAgICBFY2RzYS5jdXJ2ZS5zY2FsYXJJbnZlcnQoZCksXG4gICAgXS5yZWR1Y2UoRWNkc2EuY3VydmUuc2NhbGFyTXVsdCk7XG5cbiAgICBjb25zdCB7IG50aWxkZTogbnRpbGRlYSwgaDE6IGgxYSwgaDI6IGgyYSB9ID0geFNoYXJlO1xuXG4gICAgY29uc3Qgd1NoYXJlOiBXU2hhcmUgPSB7XG4gICAgICBpOiB4U2hhcmUuaSxcbiAgICAgIGw6IHhTaGFyZS5sLFxuICAgICAgbTogeFNoYXJlLm0sXG4gICAgICBuOiB4U2hhcmUubixcbiAgICAgIHk6IHhTaGFyZS55LFxuICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgaDE6IGgxYSxcbiAgICAgIGgyOiBoMmEsXG4gICAgICBwOiB4U2hhcmUucCxcbiAgICAgIGs6IGJpZ0ludFRvQnVmZmVyQkUoaywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGNrOiBiaWdJbnRUb0J1ZmZlckJFKGNrLCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUodywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGdhbW1hOiBiaWdJbnRUb0J1ZmZlckJFKGdhbW1hLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG5cbiAgICBjb25zdCB7IG50aWxkZTogbnRpbGRlYiwgaDE6IGgxYiwgaDI6IGgyYiB9ID0geVNoYXJlO1xuICAgIGNvbnN0IHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlKFxuICAgICAgRWNkc2EuY3VydmUsXG4gICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgcGssXG4gICAgICB7XG4gICAgICAgIG50aWxkZTogaGV4VG9CaWdJbnQobnRpbGRlYiksXG4gICAgICAgIGgxOiBoZXhUb0JpZ0ludChoMWIpLFxuICAgICAgICBoMjogaGV4VG9CaWdJbnQoaDJiKSxcbiAgICAgIH0sXG4gICAgICBjayxcbiAgICAgIGssXG4gICAgICBya1xuICAgICk7XG5cbiAgICAvLyBjcmVhdGUgcGFpbGxpZXIgY2hhbGxlbmdlIHByb29mIGJhc2VkIG9uIHRoZSBvdGhlciBzaWduZXJzIGNoYWxsZW5nZVxuICAgIC8vIG9ubHkgc2VuZCBzaWdtYSBpZiB3ZSBhbHNvIHNlbmQgY2hhbGxlbmdlIHBcbiAgICBjb25zdCBzaWdtYSA9IEVjZHNhUGFpbGxpZXJQcm9vZi5wcm92ZShcbiAgICAgIGhleFRvQmlnSW50KHhTaGFyZS5uKSxcbiAgICAgIGhleFRvQmlnSW50KHhTaGFyZS5sKSxcbiAgICAgIEVjZHNhVHlwZXMuZGVzZXJpYWxpemVQYWlsbGllckNoYWxsZW5nZSh7IHA6IHlTaGFyZS5wIH0pLnBcbiAgICApO1xuXG4gICAgY29uc3QgcHJvb2ZTaGFyZSA9IHtcbiAgICAgIHo6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YueiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuXG4gICAgY29uc3Qga1NoYXJlOiBLU2hhcmUgPSB7XG4gICAgICAvLyB0aGlzIHNoYXJlIHdpbGwgYmUgc2VudCB0byB0aGUgb3RoZXIgcGFydGljaXBhbnQsXG4gICAgICAvLyBzbyB3ZSBuZWVkIHRvIHN3YXAgdGhlIGkgYW5kIGogdmFsdWVzIGhlcmVcbiAgICAgIC8vIHNvIHRoYXQgdGhleSBrbm93IGl0J3MgdGhlaXIga1NoYXJlLCBwcm9kdWNlZCBieSB1c1xuICAgICAgaTogeVNoYXJlLmosXG4gICAgICBqOiB4U2hhcmUuaSxcbiAgICAgIG46IHBrLm4udG9TdHJpbmcoMTYpLFxuICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgaDE6IGgxYSxcbiAgICAgIGgyOiBoMmEsXG4gICAgICBwOiB4U2hhcmUucCxcbiAgICAgIGs6IGJpZ0ludFRvQnVmZmVyQkUoY2ssIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgc2lnbWE6IEVjZHNhVHlwZXMuc2VyaWFsaXplUGFpbGxpZXJDaGFsbGVuZ2VQcm9vZnMoeyBzaWdtYTogc2lnbWEgfSkuc2lnbWEsXG4gICAgICBwcm9vZjogcHJvb2ZTaGFyZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHdTaGFyZSxcbiAgICAgIGtTaGFyZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gbXVsdGlwbGljaXRpdmUtdG8tYWRkaXRpdmUgKE10QSkgc2hhcmUgY29udmVyc2lvbiB3aXRoIGFub3RoZXIgc2lnbmVyLlxuICAgKiBDb25uZWN0aW9uIDEuMiBpbiBodHRwczovL2x1Y2lkLmFwcC9sdWNpZGNoYXJ0LzcwNjE3ODViLWJjNWMtNDAwMi1iNTQ2LTNmNGEzNjEyZmM2Mi9lZGl0P3BhZ2U9SUFWbXZZTzRGdktjI1xuICAgKiBJZiBzaWduZXIgQSBjb21wbGV0ZWQgc2lnblNoYXJlIGluaXRpYWxseSAoaW5wdXQgdG8gdGhpcyBmbiksIHRoZW4gdGhpcyBzdGVwIGlzIGNvbXBsZXRlZCBieSBzaWduZXIgQi5cbiAgICogQHBhcmFtIHtTaWduQ29udmVydH0gc2hhcmVzXG4gICAqIEByZXR1cm5zIHtTaWduQ29udmVydFJUfVxuICAgKi9cbiAgYXN5bmMgc2lnbkNvbnZlcnRTdGVwMShzaGFyZXM6IFNpZ25Db252ZXJ0U3RlcDEpOiBQcm9taXNlPFNpZ25Db252ZXJ0U3RlcDFSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlY2VpdmVkS1NoYXJlID0gc2hhcmVzLmtTaGFyZTtcbiAgICBjb25zdCB4U2hhcmUgPSBzaGFyZXMueFNoYXJlOyAvLyBjdXJyZW50UGFydGljaXBhbnQgc2VjcmV0IHhTaGFyZVxuICAgIGNvbnN0IHlTaGFyZTogWVNoYXJlV2l0aENoYWxsZW5nZXMgPSB7XG4gICAgICAuLi5zaGFyZXMueVNoYXJlLFxuICAgICAgbnRpbGRlOiByZWNlaXZlZEtTaGFyZS5udGlsZGUsXG4gICAgICBoMTogcmVjZWl2ZWRLU2hhcmUuaDEsXG4gICAgICBoMjogcmVjZWl2ZWRLU2hhcmUuaDIsXG4gICAgICBwOiByZWNlaXZlZEtTaGFyZS5wLFxuICAgIH07XG4gICAgY29uc3Qgc2lnblNoYXJlID0gYXdhaXQgdGhpcy5zaWduU2hhcmUoeFNoYXJlLCB5U2hhcmUpO1xuICAgIGNvbnN0IHNoYXJlUGFydGljaXBhbnQgPSBzaWduU2hhcmUud1NoYXJlO1xuXG4gICAgaWYgKHNoYXJlUGFydGljaXBhbnQuaSAhPT0gcmVjZWl2ZWRLU2hhcmUuaSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaGFyZXMgZnJvbSBzYW1lIHBhcnRpY2lwYW50Jyk7XG4gICAgfVxuICAgIGlmICghcmVjZWl2ZWRLU2hhcmUucHJvb2YpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBtaXNzaW5nIHByb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgfVxuXG4gICAgLy8gdGhlIG90aGVyIHBhcnRpY2lwYW50cyBwYWlsbGllciBwdWJsaWMga2V5XG4gICAgY29uc3QgbiA9IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLm4pO1xuICAgIGNvbnN0IHBrYSA9IGdldFBhaWxsaWVyUHVibGljS2V5KG4pO1xuICAgIC8vIHRoZSBvdGhlciBwYXJ0aWNpcGFudCdzIHJhbmdlIHByb29mIGNoYWxsZW5nZVxuICAgIGNvbnN0IG50aWxkZWEgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5udGlsZGUpO1xuICAgIGNvbnN0IGgxYSA9IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLmgxKTtcbiAgICBjb25zdCBoMmEgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5oMik7XG5cbiAgICAvLyB0aGUgY3VycmVudCBwYXJ0aWNpcGFudCdzIHJhbmdlIHByb29mIGNoYWxsZW5nZVxuICAgIGNvbnN0IG50aWxkZWIgPSBoZXhUb0JpZ0ludChzaGFyZVBhcnRpY2lwYW50Lm50aWxkZSk7XG4gICAgY29uc3QgaDFiID0gaGV4VG9CaWdJbnQoc2hhcmVQYXJ0aWNpcGFudC5oMSk7XG4gICAgY29uc3QgaDJiID0gaGV4VG9CaWdJbnQoc2hhcmVQYXJ0aWNpcGFudC5oMik7XG5cbiAgICBjb25zdCBrID0gaGV4VG9CaWdJbnQocmVjZWl2ZWRLU2hhcmUuayk7XG5cbiAgICAvLyB0aGUgY3VycmVudCBwYXJ0aWNpcGFudHMgcGFpbGxpZXIgcHJvb2YgY2hhbGxlbmdlXG4gICAgY29uc3Qgc2hhcmVQYXJ0aWNpcGFudFBhaWxsaWVyQ2hhbGxlbmdlID0gRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZVBhaWxsaWVyQ2hhbGxlbmdlKHsgcDogc2hhcmVQYXJ0aWNpcGFudC5wIH0pO1xuICAgIC8vIHRoZSBvdGhlciBzaWduaW5nIHBhcnRpZXMgcHJvb2YgdG8gdGhlIGN1cnJlbnQgcGFydGljaXBhbnRzIHBhaWxsaWVyIHByb29mIGNoYWxsZW5nZVxuICAgIGNvbnN0IHJlY2VpdmVkUGFpbGxpZXJDaGFsbGVuZ2VQcm9vZiA9IEVjZHNhVHlwZXMuZGVzZXJpYWxpemVQYWlsbGllckNoYWxsZW5nZVByb29mcyh7XG4gICAgICBzaWdtYTogcmVjZWl2ZWRLU2hhcmUuc2lnbWEsXG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgIShhd2FpdCBFY2RzYVBhaWxsaWVyUHJvb2YudmVyaWZ5KG4sIHNoYXJlUGFydGljaXBhbnRQYWlsbGllckNoYWxsZW5nZS5wLCByZWNlaXZlZFBhaWxsaWVyQ2hhbGxlbmdlUHJvb2Yuc2lnbWEpKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgQSBzaGFyZSBwYWlsbGllciBwcm9vZicpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5KFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgICAgcGthLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGViLFxuICAgICAgICAgIGgxOiBoMWIsXG4gICAgICAgICAgaDI6IGgyYixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHo6IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLnByb29mLnopLFxuICAgICAgICAgIHU6IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLnByb29mLnUpLFxuICAgICAgICAgIHc6IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLnByb29mLncpLFxuICAgICAgICAgIHM6IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLnByb29mLnMpLFxuICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5wcm9vZi5zMSksXG4gICAgICAgICAgczI6IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLnByb29mLnMyKSxcbiAgICAgICAgfSxcbiAgICAgICAga1xuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgQSBzaGFyZSBwcm9vZicpO1xuICAgIH1cbiAgICAvLyBNdEEgJGtfaiwgXFxnYW1tYV9pJC5cbiAgICBjb25zdCBiZXRhMCA9IGJpZ2ludENyeXB0b1V0aWxzLnJhbmRCZXR3ZWVuKEVjZHNhLmN1cnZlLm9yZGVyKCkgKiogXzVuKTtcbiAgICBjb25zdCBiZXRhID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGJldGEwKSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgZyA9IGhleFRvQmlnSW50KHNoYXJlUGFydGljaXBhbnQuZ2FtbWEpO1xuICAgIGNvbnN0IHJiID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGthLm4pO1xuICAgIGNvbnN0IGNiID0gcGthLmVuY3J5cHQoYmV0YTAsIHJiKTtcbiAgICBjb25zdCBhbHBoYSA9IHBrYS5hZGRpdGlvbihwa2EubXVsdGlwbHkoaywgZyksIGNiKTtcbiAgICBjb25zdCBhbHBoYVRvQmVTZW50ID0gYmlnSW50VG9CdWZmZXJCRShhbHBoYSwgQUxQSEFNVVNJWkUpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAvLyBQcm92ZSAkXFxnYW1tYV9pIFxcaW4gWl97Tl4yfSQuXG4gICAgY29uc3QgZ3ggPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KGcpO1xuICAgIGxldCBwcm9vZiA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5wcm92ZVdpdGhDaGVjayhcbiAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgIHBrYSxcbiAgICAgIHtcbiAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICBoMTogaDFhLFxuICAgICAgICBoMjogaDJhLFxuICAgICAgfSxcbiAgICAgIGssXG4gICAgICBhbHBoYSxcbiAgICAgIGcsXG4gICAgICBiZXRhMCxcbiAgICAgIHJiLFxuICAgICAgZ3hcbiAgICApO1xuICAgIGNvbnN0IGdhbW1hUHJvb2ZUb0JlU2VudDogUmFuZ2VQcm9vZldpdGhDaGVja1NoYXJlID0ge1xuICAgICAgejogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHpwcm06IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuenBybSwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB0OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi52LCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczEsIDk2KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICB0MTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MSwgMjI0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB0MjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKGd4LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG4gICAgLy8gTXRBICRrX2osIHdfaSQuXG4gICAgY29uc3QgbnUwID0gYmlnaW50Q3J5cHRvVXRpbHMucmFuZEJldHdlZW4oRWNkc2EuY3VydmUub3JkZXIoKSAqKiBfNW4pO1xuICAgIGNvbnN0IG51ID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKG51MCkpLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHcgPSBoZXhUb0JpZ0ludChzaGFyZVBhcnRpY2lwYW50LncpO1xuICAgIGNvbnN0IHJuID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGthLm4pO1xuICAgIGNvbnN0IGNuID0gcGthLmVuY3J5cHQobnUwLCBybik7XG4gICAgY29uc3QgbXUgPSBwa2EuYWRkaXRpb24ocGthLm11bHRpcGx5KGssIHcpLCBjbik7XG4gICAgY29uc3QgbXVUb0JlU2VudCA9IGJpZ0ludFRvQnVmZmVyQkUobXUsIEFMUEhBTVVTSVpFKS50b1N0cmluZygnaGV4Jyk7XG4gICAgLy8gUHJvdmUgJFxcd19pIFxcaW4gWl97Tl4yfSQuXG4gICAgY29uc3Qgd3ggPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KHcpO1xuICAgIHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlV2l0aENoZWNrKFxuICAgICAgRWNkc2EuY3VydmUsXG4gICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgcGthLFxuICAgICAge1xuICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgIGgxOiBoMWEsXG4gICAgICAgIGgyOiBoMmEsXG4gICAgICB9LFxuICAgICAgayxcbiAgICAgIGhleFRvQmlnSW50KG11VG9CZVNlbnQpLFxuICAgICAgdyxcbiAgICAgIG51MCxcbiAgICAgIHJuLFxuICAgICAgd3hcbiAgICApO1xuICAgIGNvbnN0IHdQcm9vZlRvQmVTZW50OiBSYW5nZVByb29mV2l0aENoZWNrU2hhcmUgPSB7XG4gICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgenBybTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56cHJtLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQ6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudCwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnYsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQxLCAyMjQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUod3gsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcblxuICAgIGNvbnN0IG5Ub0JlU2VudCA9IHNpZ25TaGFyZS5rU2hhcmUubjtcbiAgICBjb25zdCBudGlsZGVUb0JlU2VudCA9IGJpZ0ludFRvQnVmZmVyQkUobnRpbGRlYiwgMzg0KS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgaDFUb0JlU2VudCA9IGJpZ0ludFRvQnVmZmVyQkUoaDFiLCAzODQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBoMlRvQmVTZW50ID0gYmlnSW50VG9CdWZmZXJCRShoMmIsIDM4NCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IGtUb0JlU2VudCA9IHNpZ25TaGFyZS5rU2hhcmUuaztcbiAgICBjb25zdCBwcm9vZlRvQmVTZW50ID0gc2lnblNoYXJlLmtTaGFyZS5wcm9vZjtcbiAgICBjb25zdCBbaVRvQmVTZW50LCBqVG9CZVNlbnRdID0gW3JlY2VpdmVkS1NoYXJlLmosIHJlY2VpdmVkS1NoYXJlLmldO1xuICAgIHJldHVybiB7XG4gICAgICBhU2hhcmU6IHtcbiAgICAgICAgaTogaVRvQmVTZW50LFxuICAgICAgICBqOiBqVG9CZVNlbnQsXG4gICAgICAgIG50aWxkZTogbnRpbGRlVG9CZVNlbnQsXG4gICAgICAgIGgxOiBoMVRvQmVTZW50LFxuICAgICAgICBoMjogaDJUb0JlU2VudCxcbiAgICAgICAgbjogblRvQmVTZW50LFxuICAgICAgICBrOiBrVG9CZVNlbnQsXG4gICAgICAgIGFscGhhOiBhbHBoYVRvQmVTZW50LFxuICAgICAgICBtdTogbXVUb0JlU2VudCxcbiAgICAgICAgcHJvb2Y6IHByb29mVG9CZVNlbnQsXG4gICAgICAgIGdhbW1hUHJvb2Y6IGdhbW1hUHJvb2ZUb0JlU2VudCxcbiAgICAgICAgd1Byb29mOiB3UHJvb2ZUb0JlU2VudCxcbiAgICAgICAgLy8gcHJvdmlkZSB0aGUgc2hhcmUgcGFydGljaXBhbnRzIHByb29mXG4gICAgICAgIC8vIHRvIHRoZSBwYWlsbGllciBjaGFsbGVuZ2UgaW4gdGhlIHJlY2VpdmVkS1NoYXJlIGZyb20gdGhlIG90aGVyIHNpZ25lclxuICAgICAgICBzaWdtYTogc2lnblNoYXJlLmtTaGFyZS5zaWdtYSxcbiAgICAgIH0sXG4gICAgICBiU2hhcmU6IHtcbiAgICAgICAgLi4uc2hhcmVQYXJ0aWNpcGFudCxcbiAgICAgICAgYmV0YSxcbiAgICAgICAgbnUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBtdWx0aXBsaWNpdGl2ZS10by1hZGRpdGl2ZSAoTXRBKSBzaGFyZSBjb252ZXJzaW9uIHdpdGggYW5vdGhlclxuICAgKiBzaWduZXIuXG4gICAqIENvbm5lY3Rpb24gMi4xIGluIGh0dHBzOi8vbHVjaWQuYXBwL2x1Y2lkY2hhcnQvNzA2MTc4NWItYmM1Yy00MDAyLWI1NDYtM2Y0YTM2MTJmYzYyL2VkaXQ/cGFnZT1JQVZtdllPNEZ2S2MjXG4gICAqIElmIHNpZ25lciBCIGNvbXBsZXRlZCBzaWduQ29udmVydFN0ZXAxLCB0aGVuIHRoaXMgc3RlcCBpcyBjb21wbGV0ZWQgYnkgc2lnbmVyIEEuXG4gICAqIEBwYXJhbSB7U2lnbkNvbnZlcnR9IHNoYXJlc1xuICAgKiBAcmV0dXJucyB7U2lnbkNvbnZlcnRSVH1cbiAgICovXG4gIGFzeW5jIHNpZ25Db252ZXJ0U3RlcDIoc2hhcmVzOiBTaWduQ29udmVydFN0ZXAyKTogUHJvbWlzZTxTaWduQ29udmVydFN0ZXAyUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZWNlaXZlZEFTaGFyZSA9IHNoYXJlcy5hU2hhcmU7XG4gICAgaWYgKCFyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyBnYW1tYVByb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgfVxuICAgIGlmICghcmVjZWl2ZWRBU2hhcmUud1Byb29mKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyB3UHJvb2Ygb24gYVNoYXJlVG9CZVNlbnQnKTtcbiAgICB9XG4gICAgY29uc3QgbiA9IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLm4pOyAvLyBQYWlsbGllciBwdWIgZnJvbSBvdGhlciBzaWduZXJcbiAgICAvLyBjdXJyZW50IHBhcnRpY2lwYW50IHB1YmxpYyBrZXlcbiAgICBjb25zdCBwa2EgPSBnZXRQYWlsbGllclB1YmxpY0tleShoZXhUb0JpZ0ludChzaGFyZXMud1NoYXJlLm4pKTtcbiAgICBjb25zdCBudGlsZGVhID0gaGV4VG9CaWdJbnQoc2hhcmVzLndTaGFyZS5udGlsZGUpO1xuICAgIGNvbnN0IGgxYSA9IGhleFRvQmlnSW50KHNoYXJlcy53U2hhcmUuaDEpO1xuICAgIGNvbnN0IGgyYSA9IGhleFRvQmlnSW50KHNoYXJlcy53U2hhcmUuaDIpO1xuICAgIGNvbnN0IGNrID0gaGV4VG9CaWdJbnQoc2hhcmVzLndTaGFyZS5jayk7XG5cbiAgICBjb25zdCBzaGFyZVBhcnRpY2lwYW50UGFpbGxpZXJDaGFsbGVuZ2UgPSBFY2RzYVR5cGVzLmRlc2VyaWFsaXplUGFpbGxpZXJDaGFsbGVuZ2UoeyBwOiBzaGFyZXMud1NoYXJlLnAgfSk7XG4gICAgY29uc3QgcmVjZWl2ZWRQYWlsbGllckNoYWxsZW5nZVByb29mID0gRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZVBhaWxsaWVyQ2hhbGxlbmdlUHJvb2ZzKHtcbiAgICAgIHNpZ21hOiBzaGFyZXMuYVNoYXJlLnNpZ21hLFxuICAgIH0pO1xuICAgIGlmICghRWNkc2FQYWlsbGllclByb29mLnZlcmlmeShuLCBzaGFyZVBhcnRpY2lwYW50UGFpbGxpZXJDaGFsbGVuZ2UucCwgcmVjZWl2ZWRQYWlsbGllckNoYWxsZW5nZVByb29mLnNpZ21hKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgc2hhcmUgZm9yIHBhaWxsaWVyIHByb29mJyk7XG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5ICRcXGdhbW1hX2kgXFxpbiBaX3tOXjJ9JC5cbiAgICBpZiAoXG4gICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeVdpdGhDaGVjayhcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgIHBrYSxcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB6OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mLnopLFxuICAgICAgICAgIHpwcm06IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YuenBybSksXG4gICAgICAgICAgdDogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi50KSxcbiAgICAgICAgICB2OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mLnYpLFxuICAgICAgICAgIHc6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YudyksXG4gICAgICAgICAgczogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi5zKSxcbiAgICAgICAgICBzMTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi5zMSksXG4gICAgICAgICAgczI6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YuczIpLFxuICAgICAgICAgIHQxOiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mLnQxKSxcbiAgICAgICAgICB0MjogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi50MiksXG4gICAgICAgICAgdTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi51KSxcbiAgICAgICAgfSxcbiAgICAgICAgY2ssXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmFscGhhKSxcbiAgICAgICAgaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi54KVxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgc2hhcmUgZm9yIGdhbW1hIHByb29mJyk7XG4gICAgfVxuICAgIC8vIFZlcmlmeSAkXFx3X2kgXFxpbiBaX3tOXjJ9JC5cbiAgICBpZiAoXG4gICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeVdpdGhDaGVjayhcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgIHBrYSxcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB6OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS53UHJvb2YueiksXG4gICAgICAgICAgenBybTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnpwcm0pLFxuICAgICAgICAgIHQ6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi50KSxcbiAgICAgICAgICB2OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS53UHJvb2YudiksXG4gICAgICAgICAgdzogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLncpLFxuICAgICAgICAgIHM6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi5zKSxcbiAgICAgICAgICBzMTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnMxKSxcbiAgICAgICAgICBzMjogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnMyKSxcbiAgICAgICAgICB0MTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnQxKSxcbiAgICAgICAgICB0MjogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnQyKSxcbiAgICAgICAgICB1OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS53UHJvb2YudSksXG4gICAgICAgIH0sXG4gICAgICAgIGNrLFxuICAgICAgICBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5tdSksXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi54KVxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNoYXJlIGZvciB3UHJvb2YnKTtcbiAgICB9XG4gICAgY29uc3Qgc2sgPSBuZXcgcGFpbGxpZXJCaWdpbnQuUHJpdmF0ZUtleShoZXhUb0JpZ0ludChzaGFyZXMud1NoYXJlLmwpLCBoZXhUb0JpZ0ludChzaGFyZXMud1NoYXJlLm0pLCBwa2EpO1xuXG4gICAgY29uc3QgZ1NoYXJlQWxwaGEgPSBiaWdJbnRUb0J1ZmZlckJFKFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuYWxwaGEpKSksXG4gICAgICAzMlxuICAgICkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgY29uc3QgZ1NoYXJlTXUgPSBiaWdJbnRUb0J1ZmZlckJFKFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUubXUpKSksIC8vIHJlY2hlY2sgZW5jcnlwdGVkIG51bWJlclxuICAgICAgMzJcbiAgICApLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGlmICghcmVjZWl2ZWRBU2hhcmUucHJvb2YpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBtaXNzaW5nIHByb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgfVxuICAgIGNvbnN0IHBrYiA9IGdldFBhaWxsaWVyUHVibGljS2V5KG4pO1xuICAgIGNvbnN0IG50aWxkZWIgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5udGlsZGUpO1xuICAgIGNvbnN0IGgxYiA9IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmgxKTtcbiAgICBjb25zdCBoMmIgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5oMik7XG4gICAgY29uc3QgayA9IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmspO1xuICAgIGlmIChcbiAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5KFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgICAgcGtiLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHo6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLnByb29mLnopLFxuICAgICAgICAgIHU6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLnByb29mLnUpLFxuICAgICAgICAgIHc6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLnByb29mLncpLFxuICAgICAgICAgIHM6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLnByb29mLnMpLFxuICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5wcm9vZi5zMSksXG4gICAgICAgICAgczI6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLnByb29mLnMyKSxcbiAgICAgICAgfSxcbiAgICAgICAga1xuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgQSBzaGFyZSBwcm9vZicpO1xuICAgIH1cbiAgICAvLyBNdEEgJGtfaiwgXFxnYW1tYV9pJC5cbiAgICBjb25zdCBiZXRhMCA9IGJpZ2ludENyeXB0b1V0aWxzLnJhbmRCZXR3ZWVuKEVjZHNhLmN1cnZlLm9yZGVyKCkgKiogXzVuKTtcbiAgICBjb25zdCBnU2hhcmVCZXRhID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGJldGEwKSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBjb25zdCBnID0gaGV4VG9CaWdJbnQoc2hhcmVzLndTaGFyZS5nYW1tYSk7XG4gICAgY29uc3QgcmIgPSBhd2FpdCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhwa2Iubik7XG4gICAgY29uc3QgY2IgPSBwa2IuZW5jcnlwdChiZXRhMCwgcmIpO1xuICAgIGNvbnN0IGFscGhhID0gcGtiLmFkZGl0aW9uKHBrYi5tdWx0aXBseShrLCBnKSwgY2IpO1xuICAgIGNvbnN0IGFscGhhVG9CZVNlbnQgPSBiaWdJbnRUb0J1ZmZlckJFKGFscGhhLCBBTFBIQU1VU0laRSkudG9TdHJpbmcoJ2hleCcpO1xuICAgIC8vIFByb3ZlICRcXGdhbW1hX2kgXFxpbiBaX3tOXjJ9JC5cbiAgICBjb25zdCBneCA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoZyk7XG4gICAgbGV0IHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlV2l0aENoZWNrKFxuICAgICAgRWNkc2EuY3VydmUsXG4gICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgcGtiLFxuICAgICAge1xuICAgICAgICBudGlsZGU6IG50aWxkZWIsXG4gICAgICAgIGgxOiBoMWIsXG4gICAgICAgIGgyOiBoMmIsXG4gICAgICB9LFxuICAgICAgayxcbiAgICAgIGFscGhhLFxuICAgICAgZyxcbiAgICAgIGJldGEwLFxuICAgICAgcmIsXG4gICAgICBneFxuICAgICk7XG4gICAgY29uc3QgZ2FtbWFQcm9vZlRvQmVTZW50OiBSYW5nZVByb29mV2l0aENoZWNrU2hhcmUgPSB7XG4gICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgenBybTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56cHJtLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQ6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudCwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnYsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQxLCAyMjQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUoZ3gsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcbiAgICAvLyBNdEEgJGtfaiwgd19pJC5cbiAgICBjb25zdCBudTAgPSBiaWdpbnRDcnlwdG9VdGlscy5yYW5kQmV0d2VlbihFY2RzYS5jdXJ2ZS5vcmRlcigpICoqIF81bik7XG4gICAgY29uc3QgZ1NoYXJlTnUgPSBiaWdJbnRUb0J1ZmZlckJFKEVjZHNhLmN1cnZlLnNjYWxhck5lZ2F0ZShFY2RzYS5jdXJ2ZS5zY2FsYXJSZWR1Y2UobnUwKSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgdyA9IGhleFRvQmlnSW50KHNoYXJlcy53U2hhcmUudyk7XG4gICAgY29uc3Qgcm4gPSBhd2FpdCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhwa2Iubik7XG4gICAgY29uc3QgY24gPSBwa2IuZW5jcnlwdChudTAsIHJuKTtcbiAgICBjb25zdCBtdSA9IHBrYi5hZGRpdGlvbihwa2IubXVsdGlwbHkoaywgdyksIGNuKTtcbiAgICBjb25zdCBtdVRvQmVTZW50ID0gYmlnSW50VG9CdWZmZXJCRShtdSwgQUxQSEFNVVNJWkUpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAvLyBQcm92ZSAkXFx3X2kgXFxpbiBaX3tOXjJ9JC5cbiAgICBjb25zdCB3eCA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQodyk7XG4gICAgcHJvb2YgPSBhd2FpdCBFY2RzYVJhbmdlUHJvb2YucHJvdmVXaXRoQ2hlY2soXG4gICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICBwa2IsXG4gICAgICB7XG4gICAgICAgIG50aWxkZTogbnRpbGRlYixcbiAgICAgICAgaDE6IGgxYixcbiAgICAgICAgaDI6IGgyYixcbiAgICAgIH0sXG4gICAgICBrLFxuICAgICAgaGV4VG9CaWdJbnQobXVUb0JlU2VudCksXG4gICAgICB3LFxuICAgICAgbnUwLFxuICAgICAgcm4sXG4gICAgICB3eFxuICAgICk7XG4gICAgY29uc3Qgd1Byb29mVG9CZVNlbnQ6IFJhbmdlUHJvb2ZXaXRoQ2hlY2tTaGFyZSA9IHtcbiAgICAgIHo6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YueiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB6cHJtOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnpwcm0sIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdDogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHY6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudiwgNzY4KS50b1N0cmluZygnaGV4JyksXG4gICAgICB3OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLncsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMxLCA5NikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdDE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDEsIDIyNCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdDI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi51LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgeDogYmlnSW50VG9CdWZmZXJCRSh3eCwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuXG4gICAgY29uc3QgW2lUb0JlU2VudCwgalRvQmVTZW50XSA9IFtyZWNlaXZlZEFTaGFyZS5qLCByZWNlaXZlZEFTaGFyZS5pXTtcbiAgICByZXR1cm4ge1xuICAgICAgbXVTaGFyZToge1xuICAgICAgICBpOiBpVG9CZVNlbnQsXG4gICAgICAgIGo6IGpUb0JlU2VudCxcbiAgICAgICAgYWxwaGE6IGFscGhhVG9CZVNlbnQsXG4gICAgICAgIG11OiBtdVRvQmVTZW50LFxuICAgICAgICBnYW1tYVByb29mOiBnYW1tYVByb29mVG9CZVNlbnQsXG4gICAgICAgIHdQcm9vZjogd1Byb29mVG9CZVNlbnQsXG4gICAgICB9LFxuICAgICAgZ1NoYXJlOiB7XG4gICAgICAgIGk6IHNoYXJlcy53U2hhcmUuaSxcbiAgICAgICAgbjogc2hhcmVzLndTaGFyZS5uLFxuICAgICAgICB5OiBzaGFyZXMud1NoYXJlLnksXG4gICAgICAgIGs6IHNoYXJlcy53U2hhcmUuayxcbiAgICAgICAgdzogc2hhcmVzLndTaGFyZS53LFxuICAgICAgICBnYW1tYTogc2hhcmVzLndTaGFyZS5nYW1tYSxcbiAgICAgICAgYWxwaGE6IGdTaGFyZUFscGhhLFxuICAgICAgICBtdTogZ1NoYXJlTXUsXG4gICAgICAgIGJldGE6IGdTaGFyZUJldGEsXG4gICAgICAgIG51OiBnU2hhcmVOdSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIG11bHRpcGxpY2l0aXZlLXRvLWFkZGl0aXZlIChNdEEpIHNoYXJlIGNvbnZlcnNpb24gd2l0aCBhbm90aGVyIHNpZ25lci5cbiAgICogQ29ubmVjdGlvbiAyLjIgaW4gaHR0cHM6Ly9sdWNpZC5hcHAvbHVjaWRjaGFydC83MDYxNzg1Yi1iYzVjLTQwMDItYjU0Ni0zZjRhMzYxMmZjNjIvZWRpdD9wYWdlPUlBVm12WU80RnZLYyNcbiAgICogSWYgc2lnbmVyIEEgY29tcGxldGVkIHNpZ25Db252ZXJ0U3RlcDIsIHRoZW4gdGhpcyBzdGVwIGlzIGNvbXBsZXRlZCBieSBzaWduZXIgQi5cbiAgICogQHBhcmFtIHtTaWduQ29udmVydH0gc2hhcmVzXG4gICAqIEByZXR1cm5zIHtTaWduQ29udmVydFJUfVxuICAgKi9cbiAgYXN5bmMgc2lnbkNvbnZlcnRTdGVwMyhzaGFyZXM6IFNpZ25Db252ZXJ0U3RlcDMpOiBQcm9taXNlPFNpZ25Db252ZXJ0U3RlcDNSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlY2VpdmVkTXVTaGFyZSA9IHNoYXJlcy5tdVNoYXJlO1xuICAgIGlmICghcmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBtaXNzaW5nIGdhbW1hUHJvb2Ygb24gYVNoYXJlVG9CZVNlbnQnKTtcbiAgICB9XG4gICAgaWYgKCFyZWNlaXZlZE11U2hhcmUud1Byb29mKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyB3UHJvb2Ygb24gYVNoYXJlVG9CZVNlbnQnKTtcbiAgICB9XG4gICAgY29uc3QgcGthID0gZ2V0UGFpbGxpZXJQdWJsaWNLZXkoaGV4VG9CaWdJbnQoc2hhcmVzLmJTaGFyZS5uKSk7XG4gICAgY29uc3QgbnRpbGRlYSA9IGhleFRvQmlnSW50KHNoYXJlcy5iU2hhcmUubnRpbGRlKTtcbiAgICBjb25zdCBoMWEgPSBoZXhUb0JpZ0ludChzaGFyZXMuYlNoYXJlLmgxKTtcbiAgICBjb25zdCBoMmEgPSBoZXhUb0JpZ0ludChzaGFyZXMuYlNoYXJlLmgyKTtcbiAgICBjb25zdCBjayA9IGhleFRvQmlnSW50KHNoYXJlcy5iU2hhcmUuY2spO1xuICAgIC8vIFZlcmlmeSAkXFxnYW1tYV9pIFxcaW4gWl97Tl4yfSQuXG4gICAgaWYgKFxuICAgICAgIUVjZHNhUmFuZ2VQcm9vZi52ZXJpZnlXaXRoQ2hlY2soXG4gICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgICBwa2EsXG4gICAgICAgIHtcbiAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgICBoMjogaDJhLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgejogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YueiksXG4gICAgICAgICAgenBybTogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YuenBybSksXG4gICAgICAgICAgdDogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YudCksXG4gICAgICAgICAgdjogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YudiksXG4gICAgICAgICAgdzogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YudyksXG4gICAgICAgICAgczogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YucyksXG4gICAgICAgICAgczE6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLnMxKSxcbiAgICAgICAgICBzMjogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YuczIpLFxuICAgICAgICAgIHQxOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUuZ2FtbWFQcm9vZi50MSksXG4gICAgICAgICAgdDI6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLnQyKSxcbiAgICAgICAgICB1OiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUuZ2FtbWFQcm9vZi51KSxcbiAgICAgICAgfSxcbiAgICAgICAgY2ssXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5hbHBoYSksXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLngpXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCB2ZXJpZnkgc2lnbmluZyBzaGFyZSBmb3IgZ2FtbWEgcHJvb2YnKTtcbiAgICB9XG4gICAgLy8gVmVyaWZ5ICRcXHdfaSBcXGluIFpfe05eMn0kLlxuICAgIGlmIChcbiAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5V2l0aENoZWNrKFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgICAgcGthLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHo6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS53UHJvb2YueiksXG4gICAgICAgICAgenBybTogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi56cHJtKSxcbiAgICAgICAgICB0OiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnQpLFxuICAgICAgICAgIHY6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS53UHJvb2YudiksXG4gICAgICAgICAgdzogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi53KSxcbiAgICAgICAgICBzOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnMpLFxuICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnMxKSxcbiAgICAgICAgICBzMjogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi5zMiksXG4gICAgICAgICAgdDE6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS53UHJvb2YudDEpLFxuICAgICAgICAgIHQyOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnQyKSxcbiAgICAgICAgICB1OiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnUpLFxuICAgICAgICB9LFxuICAgICAgICBjayxcbiAgICAgICAgaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLm11KSxcbiAgICAgICAgaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi54KVxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNoYXJlIGZvciB3UHJvb2YnKTtcbiAgICB9XG4gICAgY29uc3Qgc2sgPSBuZXcgcGFpbGxpZXJCaWdpbnQuUHJpdmF0ZUtleShoZXhUb0JpZ0ludChzaGFyZXMuYlNoYXJlLmwpLCBoZXhUb0JpZ0ludChzaGFyZXMuYlNoYXJlLm0pLCBwa2EpO1xuICAgIGNvbnN0IGFscGhhID0gc2suZGVjcnlwdChoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUuYWxwaGEpKTtcbiAgICBjb25zdCBnU2hhcmVBbHBoYSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGFscGhhKSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBtdSA9IHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLm11IGFzIHN0cmluZykpOyAvLyByZWNoZWNrIGVuY3J5cHRlZCBudW1iZXJcbiAgICBjb25zdCBnU2hhcmVNdSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKG11KSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGNvbnN0IFtpVG9CZVNlbnQsIGpUb0JlU2VudF0gPSBbcmVjZWl2ZWRNdVNoYXJlLmosIHJlY2VpdmVkTXVTaGFyZS5pXTtcbiAgICByZXR1cm4ge1xuICAgICAgZ1NoYXJlOiB7XG4gICAgICAgIGk6IHNoYXJlcy5iU2hhcmUuaSxcbiAgICAgICAgbjogc2hhcmVzLmJTaGFyZS5uLFxuICAgICAgICB5OiBzaGFyZXMuYlNoYXJlLnksXG4gICAgICAgIGs6IHNoYXJlcy5iU2hhcmUuayxcbiAgICAgICAgdzogc2hhcmVzLmJTaGFyZS53LFxuICAgICAgICBnYW1tYTogc2hhcmVzLmJTaGFyZS5nYW1tYSxcbiAgICAgICAgYWxwaGE6IGdTaGFyZUFscGhhLFxuICAgICAgICBtdTogZ1NoYXJlTXUsXG4gICAgICAgIGJldGE6IHNoYXJlcy5iU2hhcmUuYmV0YSxcbiAgICAgICAgbnU6IHNoYXJlcy5iU2hhcmUubnUsXG4gICAgICB9LFxuICAgICAgc2lnbkluZGV4OiB7XG4gICAgICAgIGk6IGlUb0JlU2VudCxcbiAgICAgICAgajogalRvQmVTZW50LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gbXVsdGlwbGljaXRpdmUtdG8tYWRkaXRpdmUgKE10QSkgc2hhcmUgY29udmVyc2lvbiB3aXRoIGFub3RoZXIgc2lnbmVyLlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSBvbmUgb2YgW3NpZ25Db252ZXJ0U3RlcDEsIHNpZ25Db252ZXJ0U3RlcDIsIHNpZ25Db252ZXJ0U3RlcDNdIGluc3RlYWRcbiAgICogQHBhcmFtIHtTaWduQ29udmVydH0gc2hhcmVzXG4gICAqIEByZXR1cm5zIHtTaWduQ29udmVydFJUfVxuICAgKi9cbiAgYXN5bmMgc2lnbkNvbnZlcnQoc2hhcmVzOiBTaWduQ29udmVydCk6IFByb21pc2U8U2lnbkNvbnZlcnRSVD4ge1xuICAgIGxldCBzaGFyZVBhcnRpY2lwYW50OiBQYXJ0aWFsPEJTaGFyZT4gfCBQYXJ0aWFsPEdTaGFyZT4sIHNoYXJlVG9CZVNlbnQ6IFBhcnRpYWw8QVNoYXJlPiB8IE1VU2hhcmU7XG4gICAgbGV0IGlzR2FtbWFTaGFyZSA9IGZhbHNlO1xuICAgIGxldCBrU2hhcmU6IFBhcnRpYWw8S1NoYXJlPiA9IHt9O1xuICAgIGlmIChzaGFyZXMueFNoYXJlICYmIHNoYXJlcy55U2hhcmUgJiYgc2hhcmVzLmtTaGFyZSkge1xuICAgICAgY29uc3QgeFNoYXJlID0gc2hhcmVzLnhTaGFyZTsgLy8gY3VycmVudFBhcnRpY2lwYW50IHNlY3JldCB4U2hhcmVcbiAgICAgIGNvbnN0IHlTaGFyZTogWVNoYXJlV2l0aENoYWxsZW5nZXMgPSB7XG4gICAgICAgIC4uLnNoYXJlcy55U2hhcmUsXG4gICAgICAgIG50aWxkZTogc2hhcmVzLmtTaGFyZS5udGlsZGUsXG4gICAgICAgIGgxOiBzaGFyZXMua1NoYXJlLmgxLFxuICAgICAgICBoMjogc2hhcmVzLmtTaGFyZS5oMixcbiAgICAgICAgcDogc2hhcmVzLmtTaGFyZS5wLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHNpZ25TaGFyZSA9IGF3YWl0IHRoaXMuc2lnblNoYXJlKHhTaGFyZSwgeVNoYXJlKTtcbiAgICAgIGtTaGFyZSA9IHNpZ25TaGFyZS5rU2hhcmU7XG4gICAgICBzaGFyZVRvQmVTZW50ID0geyAuLi5zaGFyZXMua1NoYXJlIH0gYXMgUGFydGlhbDxBU2hhcmU+O1xuICAgICAgc2hhcmVQYXJ0aWNpcGFudCA9IHsgLi4uc2lnblNoYXJlLndTaGFyZSB9IGFzIFBhcnRpYWw8QlNoYXJlPjtcbiAgICB9IGVsc2UgaWYgKChzaGFyZXMuYlNoYXJlICYmIHNoYXJlcy5tdVNoYXJlKSB8fCAoc2hhcmVzLmFTaGFyZSAmJiBzaGFyZXMud1NoYXJlKSkge1xuICAgICAgaXNHYW1tYVNoYXJlID0gdHJ1ZTtcbiAgICAgIHNoYXJlVG9CZVNlbnQgPSBzaGFyZXMuYVNoYXJlID8gKHsgLi4uc2hhcmVzLmFTaGFyZSB9IGFzIE1VU2hhcmUpIDogKHsgLi4uc2hhcmVzLm11U2hhcmUgfSBhcyBNVVNoYXJlKTtcbiAgICAgIHNoYXJlUGFydGljaXBhbnQgPSBzaGFyZXMud1NoYXJlID8gKHsgLi4uc2hhcmVzLndTaGFyZSB9IGFzIFBhcnRpYWw8R1NoYXJlPikgOiAoeyAuLi5zaGFyZXMuYlNoYXJlIH0gYXMgR1NoYXJlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbmZpZyBmb3IgU2lnbiBDb252ZXJ0Jyk7XG4gICAgfVxuICAgIGlmIChzaGFyZVBhcnRpY2lwYW50LmkgIT09IHNoYXJlVG9CZVNlbnQuaSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaGFyZXMgZnJvbSBzYW1lIHBhcnRpY2lwYW50Jyk7XG4gICAgfVxuICAgIGlmICgoc2hhcmVUb0JlU2VudCBhcyBBU2hhcmUpLmFscGhhKSB7XG4gICAgICBjb25zdCBiU2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlUGFydGljaXBhbnQgYXMgQlNoYXJlO1xuICAgICAgY29uc3QgYVNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIEFTaGFyZTtcbiAgICAgIGlmICghYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyBnYW1tYVByb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgICB9XG4gICAgICBpZiAoIWFTaGFyZVRvQmVTZW50LndQcm9vZikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyB3UHJvb2Ygb24gYVNoYXJlVG9CZVNlbnQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBrYSA9IGdldFBhaWxsaWVyUHVibGljS2V5KGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50Lm4pKTtcbiAgICAgIGxldCBudGlsZGVhLCBoMWEsIGgyYSwgY2s7XG4gICAgICBpZiAoYlNoYXJlUGFydGljaXBhbnQubnRpbGRlKSB7XG4gICAgICAgIG50aWxkZWEgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5udGlsZGUpO1xuICAgICAgICBoMWEgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5oMSk7XG4gICAgICAgIGgyYSA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50LmgyKTtcbiAgICAgICAgY2sgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5jayk7XG4gICAgICB9XG4gICAgICAvLyBWZXJpZnkgJFxcZ2FtbWFfaSBcXGluIFpfe05eMn0kLlxuICAgICAgaWYgKFxuICAgICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeVdpdGhDaGVjayhcbiAgICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgICAgIHBrYSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHo6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YueiksXG4gICAgICAgICAgICB6cHJtOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnpwcm0pLFxuICAgICAgICAgICAgdDogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi50KSxcbiAgICAgICAgICAgIHY6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YudiksXG4gICAgICAgICAgICB3OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLncpLFxuICAgICAgICAgICAgczogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi5zKSxcbiAgICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnMxKSxcbiAgICAgICAgICAgIHMyOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnMyKSxcbiAgICAgICAgICAgIHQxOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnQxKSxcbiAgICAgICAgICAgIHQyOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnQyKSxcbiAgICAgICAgICAgIHU6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YudSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjayxcbiAgICAgICAgICBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5hbHBoYSksXG4gICAgICAgICAgaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi54KVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgc2hhcmUgZm9yIGdhbW1hIHByb29mJyk7XG4gICAgICB9XG4gICAgICAvLyBWZXJpZnkgJFxcd19pIFxcaW4gWl97Tl4yfSQuXG4gICAgICBpZiAoXG4gICAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5V2l0aENoZWNrKFxuICAgICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgICAgcGthLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgICBoMjogaDJhLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgejogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnopLFxuICAgICAgICAgICAgenBybTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnpwcm0pLFxuICAgICAgICAgICAgdDogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnQpLFxuICAgICAgICAgICAgdjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnYpLFxuICAgICAgICAgICAgdzogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLncpLFxuICAgICAgICAgICAgczogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnMpLFxuICAgICAgICAgICAgczE6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi5zMSksXG4gICAgICAgICAgICBzMjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnMyKSxcbiAgICAgICAgICAgIHQxOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YudDEpLFxuICAgICAgICAgICAgdDI6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi50MiksXG4gICAgICAgICAgICB1OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YudSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjayxcbiAgICAgICAgICBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5tdSksXG4gICAgICAgICAgaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLngpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCB2ZXJpZnkgc2hhcmUgZm9yIHdQcm9vZicpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2sgPSBuZXcgcGFpbGxpZXJCaWdpbnQuUHJpdmF0ZUtleShcbiAgICAgICAgaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQubCBhcyBzdHJpbmcpLFxuICAgICAgICBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5tIGFzIHN0cmluZyksXG4gICAgICAgIHBrYVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGdTaGFyZVBhcnRpY2lwYW50ID0gc2hhcmVQYXJ0aWNpcGFudCBhcyBHU2hhcmU7XG4gICAgICBjb25zdCBtdVNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIE1VU2hhcmU7XG4gICAgICBjb25zdCBhbHBoYSA9IHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuYWxwaGEpKTtcbiAgICAgIGdTaGFyZVBhcnRpY2lwYW50LmFscGhhID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJSZWR1Y2UoYWxwaGEpLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3QgbXUgPSBzay5kZWNyeXB0KGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50Lm11IGFzIHN0cmluZykpOyAvLyByZWNoZWNrIGVuY3J5cHRlZCBudW1iZXJcbiAgICAgIGdTaGFyZVBhcnRpY2lwYW50Lm11ID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJSZWR1Y2UobXUpLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3QgcGFydGlhbFNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIFBhcnRpYWw8R1NoYXJlPjtcbiAgICAgIGNvbnN0IHBhcnRpYWxTaGFyZVRvQmVTZW50ID0gbXVTaGFyZVRvQmVTZW50IGFzIFBhcnRpYWw8TVVTaGFyZT47XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQubDtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5tO1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50LmFscGhhO1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50Lm11O1xuICAgIH1cbiAgICBpZiAoKHNoYXJlVG9CZVNlbnQgYXMgQVNoYXJlKS5rKSB7XG4gICAgICBjb25zdCBiU2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlUGFydGljaXBhbnQgYXMgQlNoYXJlO1xuICAgICAgY29uc3QgYVNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIEFTaGFyZTtcbiAgICAgIGlmICghYVNoYXJlVG9CZVNlbnQucHJvb2YpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIG1pc3NpbmcgcHJvb2Ygb24gYVNoYXJlVG9CZVNlbnQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG4gPSBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5uKTsgLy8gUGFpbGxpZXIgcHViIGZyb20gb3RoZXIgc2lnbmVyXG4gICAgICBjb25zdCBwa2EgPSBnZXRQYWlsbGllclB1YmxpY0tleShuKTtcbiAgICAgIGNvbnN0IG50aWxkZWEgPSBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5udGlsZGUpO1xuICAgICAgY29uc3QgaDFhID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuaDEpO1xuICAgICAgY29uc3QgaDJhID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuaDIpO1xuICAgICAgY29uc3QgbnRpbGRlYiA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50Lm50aWxkZSk7XG4gICAgICBjb25zdCBoMWIgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5oMSk7XG4gICAgICBjb25zdCBoMmIgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5oMik7XG4gICAgICBjb25zdCBrID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuayk7XG4gICAgICBpZiAoXG4gICAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5KFxuICAgICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgICAgcGthLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG50aWxkZTogbnRpbGRlYixcbiAgICAgICAgICAgIGgxOiBoMWIsXG4gICAgICAgICAgICBoMjogaDJiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgejogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YueiksXG4gICAgICAgICAgICB1OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5wcm9vZi51KSxcbiAgICAgICAgICAgIHc6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLncpLFxuICAgICAgICAgICAgczogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YucyksXG4gICAgICAgICAgICBzMTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YuczEpLFxuICAgICAgICAgICAgczI6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLnMyKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGtcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHZlcmlmeSBzaWduaW5nIEEgc2hhcmUgcHJvb2YnKTtcbiAgICAgIH1cbiAgICAgIC8vIE10QSAka19qLCBcXGdhbW1hX2kkLlxuICAgICAgY29uc3QgYmV0YTAgPSBiaWdpbnRDcnlwdG9VdGlscy5yYW5kQmV0d2VlbihFY2RzYS5jdXJ2ZS5vcmRlcigpICoqIF81bik7XG4gICAgICBiU2hhcmVQYXJ0aWNpcGFudC5iZXRhID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGJldGEwKSksIDMyKS50b1N0cmluZyhcbiAgICAgICAgJ2hleCdcbiAgICAgICk7XG4gICAgICBjb25zdCBnID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuZ2FtbWEpO1xuICAgICAgY29uc3QgcmIgPSBhd2FpdCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhwa2Eubik7XG4gICAgICBjb25zdCBjYiA9IHBrYS5lbmNyeXB0KGJldGEwLCByYik7XG4gICAgICBjb25zdCBhbHBoYSA9IHBrYS5hZGRpdGlvbihwa2EubXVsdGlwbHkoaywgZyksIGNiKTtcbiAgICAgIGFTaGFyZVRvQmVTZW50LmFscGhhID0gYmlnSW50VG9CdWZmZXJCRShhbHBoYSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIC8vIFByb3ZlICRcXGdhbW1hX2kgXFxpbiBaX3tOXjJ9JC5cbiAgICAgIGNvbnN0IGd4ID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChnKTtcbiAgICAgIGxldCBwcm9vZiA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5wcm92ZVdpdGhDaGVjayhcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgIHBrYSxcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgIH0sXG4gICAgICAgIGssXG4gICAgICAgIGFscGhhLFxuICAgICAgICBnLFxuICAgICAgICBiZXRhMCxcbiAgICAgICAgcmIsXG4gICAgICAgIGd4XG4gICAgICApO1xuICAgICAgT2JqZWN0LmFzc2lnbihhU2hhcmVUb0JlU2VudCwge1xuICAgICAgICBnYW1tYVByb29mOiB7XG4gICAgICAgICAgejogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB6cHJtOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnpwcm0sIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQ6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudCwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi52LCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB3OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLncsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczEsIDk2KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQxLCAyMjQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0MjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi51LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUoZ3gsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIC8vIE10QSAka19qLCB3X2kkLlxuICAgICAgY29uc3QgbnUwID0gYmlnaW50Q3J5cHRvVXRpbHMucmFuZEJldHdlZW4oRWNkc2EuY3VydmUub3JkZXIoKSAqKiBfNW4pO1xuICAgICAgc2hhcmVQYXJ0aWNpcGFudC5udSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyTmVnYXRlKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShudTApKSwgMzIpLnRvU3RyaW5nKFxuICAgICAgICAnaGV4J1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHcgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC53KTtcbiAgICAgIGNvbnN0IHJuID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGthLm4pO1xuICAgICAgY29uc3QgY24gPSBwa2EuZW5jcnlwdChudTAsIHJuKTtcbiAgICAgIGNvbnN0IG11ID0gcGthLmFkZGl0aW9uKHBrYS5tdWx0aXBseShrLCB3KSwgY24pO1xuICAgICAgc2hhcmVUb0JlU2VudC5tdSA9IGJpZ0ludFRvQnVmZmVyQkUobXUsIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAvLyBQcm92ZSAkXFx3X2kgXFxpbiBaX3tOXjJ9JC5cbiAgICAgIGNvbnN0IHd4ID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdCh3KTtcbiAgICAgIHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlV2l0aENoZWNrKFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgICAgcGthLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgfSxcbiAgICAgICAgayxcbiAgICAgICAgaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQubXUpLFxuICAgICAgICB3LFxuICAgICAgICBudTAsXG4gICAgICAgIHJuLFxuICAgICAgICB3eFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oc2hhcmVUb0JlU2VudCwge1xuICAgICAgICB3UHJvb2Y6IHtcbiAgICAgICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHpwcm06IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuenBybSwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdDogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnYsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBzMjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdDE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDEsIDIyNCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgeDogYmlnSW50VG9CdWZmZXJCRSh3eCwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgaWYgKChzaGFyZVBhcnRpY2lwYW50IGFzIEdTaGFyZSkuYWxwaGEpIHtcbiAgICAgICAgY29uc3QgcGFydGlhbFNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIFBhcnRpYWw8QlNoYXJlPjtcbiAgICAgICAgY29uc3QgcGFydGlhbFNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIFBhcnRpYWw8QVNoYXJlPjtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50Lm50aWxkZTtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50LmgxO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuaDI7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5jaztcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50Lm47XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5udGlsZGU7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5oMTtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50LmgyO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQuaztcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50LnByb29mO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzaGFyZVRvQmVTZW50LCB7XG4gICAgICAgICAgbjoga1NoYXJlLm4sXG4gICAgICAgICAgbnRpbGRlOiBiaWdJbnRUb0J1ZmZlckJFKG50aWxkZWIsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIGgxOiBiaWdJbnRUb0J1ZmZlckJFKGgxYiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgaDI6IGJpZ0ludFRvQnVmZmVyQkUoaDJiLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBrOiBrU2hhcmUuayxcbiAgICAgICAgICBwcm9vZjoga1NoYXJlLnByb29mLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEoJ2FscGhhJyBpbiBzaGFyZVRvQmVTZW50KSAmJiAhKCdrJyBpbiBzaGFyZVRvQmVTZW50KSkge1xuICAgICAgY29uc3QgcGFydGlhbFNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIFBhcnRpYWw8QlNoYXJlPjtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5udGlsZGU7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuaDE7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuaDI7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuY2s7XG4gICAgICBjb25zdCBtdVNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIE1VU2hhcmU7XG4gICAgICBzaGFyZVRvQmVTZW50ID0ge1xuICAgICAgICBpOiBtdVNoYXJlVG9CZVNlbnQuaSxcbiAgICAgICAgajogbXVTaGFyZVRvQmVTZW50LmosXG4gICAgICB9IGFzIE1VU2hhcmU7XG4gICAgfVxuICAgIFtzaGFyZVRvQmVTZW50LmksIHNoYXJlVG9CZVNlbnQual0gPSBbc2hhcmVUb0JlU2VudC5qLCBzaGFyZVRvQmVTZW50LmldO1xuICAgIGlmIChpc0dhbW1hU2hhcmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG11U2hhcmU6IHNoYXJlVG9CZVNlbnQgYXMgTVVTaGFyZSxcbiAgICAgICAgZ1NoYXJlOiBzaGFyZVBhcnRpY2lwYW50IGFzIEdTaGFyZSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBhU2hhcmU6IHNoYXJlVG9CZVNlbnQgYXMgQVNoYXJlLFxuICAgICAgYlNoYXJlOiBzaGFyZVBhcnRpY2lwYW50IGFzIEJTaGFyZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbWJpbmUgZ2FtbWEgc2hhcmVzIHRvIGdldCB0aGUgcHJpdmF0ZSBvbWljcm9uIC8gZGVsdGEgc2hhcmVzXG4gICAqIEBwYXJhbSB7U2lnbkNvbWJpbmV9IHNoYXJlc1xuICAgKiBAcmV0dXJucyB7U2lnbkNvbWJpbmVSVH1cbiAgICovXG4gIHNpZ25Db21iaW5lKHNoYXJlczogU2lnbkNvbWJpbmUpOiBTaWduQ29tYmluZVJUIHtcbiAgICBjb25zdCBnU2hhcmUgPSBzaGFyZXMuZ1NoYXJlO1xuICAgIGNvbnN0IFMgPSBzaGFyZXMuc2lnbkluZGV4O1xuICAgIGNvbnN0IGdhbW1hID0gaGV4VG9CaWdJbnQoZ1NoYXJlLmdhbW1hKTtcbiAgICBjb25zdCBhbHBoYSA9IGhleFRvQmlnSW50KGdTaGFyZS5hbHBoYSk7XG4gICAgY29uc3QgYmV0YSA9IGhleFRvQmlnSW50KGdTaGFyZS5iZXRhKTtcbiAgICBjb25zdCBtdSA9IGhleFRvQmlnSW50KGdTaGFyZS5tdSk7XG4gICAgY29uc3QgbnUgPSBoZXhUb0JpZ0ludChnU2hhcmUubnUpO1xuICAgIGNvbnN0IGsgPSBoZXhUb0JpZ0ludChnU2hhcmUuayk7XG4gICAgY29uc3QgdyA9IGhleFRvQmlnSW50KGdTaGFyZS53KTtcblxuICAgIGNvbnN0IGRlbHRhID0gRWNkc2EuY3VydmUuc2NhbGFyQWRkKEVjZHNhLmN1cnZlLnNjYWxhck11bHQoaywgZ2FtbWEpLCBFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQoYWxwaGEsIGJldGEpKTtcbiAgICBjb25zdCBvbWljcm9uID0gRWNkc2EuY3VydmUuc2NhbGFyQWRkKEVjZHNhLmN1cnZlLnNjYWxhck11bHQoaywgdyksIEVjZHNhLmN1cnZlLnNjYWxhckFkZChtdSwgbnUpKTtcbiAgICBjb25zdCBHYW1tYSA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoZ2FtbWEpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9TaGFyZToge1xuICAgICAgICBpOiBnU2hhcmUuaSxcbiAgICAgICAgeTogZ1NoYXJlLnksXG4gICAgICAgIGs6IGJpZ0ludFRvQnVmZmVyQkUoaywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgb21pY3JvbjogYmlnSW50VG9CdWZmZXJCRShvbWljcm9uLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBkZWx0YTogYmlnSW50VG9CdWZmZXJCRShkZWx0YSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgR2FtbWE6IGJpZ0ludFRvQnVmZmVyQkUoR2FtbWEsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9LFxuICAgICAgZFNoYXJlOiB7XG4gICAgICAgIGk6IFMuaSxcbiAgICAgICAgajogZ1NoYXJlLmksXG4gICAgICAgIGRlbHRhOiBiaWdJbnRUb0J1ZmZlckJFKGRlbHRhLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBHYW1tYTogYmlnSW50VG9CdWZmZXJCRShHYW1tYSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IE0gTWVzc2FnZSB0byBiZSBzaWduZWRcbiAgICogQHBhcmFtIHtPU2hhcmV9IG9TaGFyZSBwcml2YXRlIG9taWNyb24gc2hhcmUgb2YgY3VycmVudCBwYXJ0aWNpcGFudFxuICAgKiBAcGFyYW0ge0RTaGFyZX0gZFNoYXJlIGRlbHRhIHNoYXJlIHJlY2VpdmVkIGZyb20gdGhlIG90aGVyIHBhcnRpY2lwYW50XG4gICAqIEBwYXJhbSB7SGFzaH0gaGFzaCBoYXNoaW5nIGFsZ29yaXRobSBpbXBsZW1lbnRpbmcgTm9kZWBzIHN0YW5kYXJkIGNyeXB0byBoYXNoIGludGVyZmFjZVxuICAgKiBAcGFyYW0gc2hvdWxkSGFzaCBpZiB0cnVlLCB3ZSBoYXNoIHRoZSBwcm92aWRlZCBidWZmZXIgYmVmb3JlIHNpZ25pbmdcbiAgICogQHJldHVybnMge1ZBU2hhcmV9XG4gICAqL1xuICBzaWduKE06IEJ1ZmZlciwgb1NoYXJlOiBPU2hhcmUsIGRTaGFyZTogRFNoYXJlLCBoYXNoPzogSGFzaCwgc2hvdWxkSGFzaCA9IHRydWUpOiBWQVNoYXJlIHtcbiAgICBjb25zdCBtID0gc2hvdWxkSGFzaCA/IChoYXNoIHx8IGNyZWF0ZUhhc2goJ3NoYTI1NicpKS51cGRhdGUoTSkuZGlnZXN0KCkgOiBNO1xuXG4gICAgY29uc3QgZGVsdGEgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQoaGV4VG9CaWdJbnQob1NoYXJlLmRlbHRhKSwgaGV4VG9CaWdJbnQoZFNoYXJlLmRlbHRhKSk7XG5cbiAgICBjb25zdCBSID0gRWNkc2EuY3VydmUucG9pbnRNdWx0aXBseShcbiAgICAgIEVjZHNhLmN1cnZlLnBvaW50QWRkKGhleFRvQmlnSW50KG9TaGFyZS5HYW1tYSksIGhleFRvQmlnSW50KGRTaGFyZS5HYW1tYSkpLFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFySW52ZXJ0KGRlbHRhKVxuICAgICk7XG4gICAgY29uc3QgcG9pbnRSID0gc2VjcC5Qcm9qZWN0aXZlUG9pbnQuZnJvbUhleChiaWdJbnRUb0J1ZmZlckJFKFIsIDMyKSk7XG4gICAgY29uc3QgciA9IHBvaW50Ui54O1xuXG4gICAgY29uc3QgcyA9IEVjZHNhLmN1cnZlLnNjYWxhckFkZChcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhck11bHQoYmlnSW50RnJvbVU4QUJFKG0pLCBoZXhUb0JpZ0ludChvU2hhcmUuaykpLFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyTXVsdChyLCBoZXhUb0JpZ0ludChvU2hhcmUub21pY3JvbikpXG4gICAgKTtcblxuICAgIGNvbnN0IGwgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJSYW5kb20oKTtcbiAgICBjb25zdCByaG8gPSBFY2RzYS5jdXJ2ZS5zY2FsYXJSYW5kb20oKTtcbiAgICBjb25zdCBWID0gRWNkc2EuY3VydmUucG9pbnRBZGQoRWNkc2EuY3VydmUucG9pbnRNdWx0aXBseShSLCBzKSwgRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChsKSk7XG4gICAgY29uc3QgQSA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQocmhvKTtcblxuICAgIGNvbnN0IGNvbURlY29tX1ZfQSA9IEhhc2hDb21taXRtZW50LmNyZWF0ZUNvbW1pdG1lbnQoXG4gICAgICBCdWZmZXIuY29uY2F0KFtiaWdJbnRUb0J1ZmZlckJFKFYsIEVjZHNhLmN1cnZlLnBvaW50Qnl0ZXMpLCBiaWdJbnRUb0J1ZmZlckJFKEEsIEVjZHNhLmN1cnZlLnBvaW50Qnl0ZXMpXSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGk6IG9TaGFyZS5pLFxuICAgICAgeTogb1NoYXJlLnksXG4gICAgICBSOiBwb2ludFIudG9IZXgodHJ1ZSksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHMsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICBtOiBtLFxuICAgICAgbDogbCxcbiAgICAgIHJobzogcmhvLFxuICAgICAgVjogVixcbiAgICAgIEE6IEEsXG4gICAgICBjb21EZWNvbVZBOiBjb21EZWNvbV9WX0EsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBwcm9vZnMgb2YgVl9pIGFuZCBBX2kgdmFsdWVzLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gTSBNZXNzYWdlIHRvIGNvbW1pdCB0byBhcyBwYXJ0IG9mIHRoZSBjb250ZXh0IG9mIHRoZSBwcm9vZi5cbiAgICogICAgVGhpcyBkb2Vzbid0IG5lZWQgdG8gYmUgdGhlIHNhbWUgbWVzc2FnZSB0aGF0IHdhcyBzaWduZWQgaW4gdGhlIHNpZ24gZnVuY3Rpb24gYWJvdmUuXG4gICAqICAgIEJ1dCBpdCBzaG91bGQgYmUgdGhlIHNhbWUgZm9yIGFsbCBwYXJ0aWNpcGFudHMgZm9yIHRoZSBwdXJwb3NlIG9mIHByb3ZpZGluZyBwcm9vZiBjb250ZXh0LlxuICAgKiBAcGFyYW0ge1ZBU2hhcmV9IHZhU2hhcmUgVGhlIFZBU2hhcmUgdG8gcHJvdmUuXG4gICAqIEByZXR1cm5zIHtWQVNoYXJlV2l0aFByb29mc31cbiAgICovXG4gIGdlbmVyYXRlVkFQcm9vZnMoTTogQnVmZmVyLCB2YVNoYXJlOiBWQVNoYXJlKTogVkFTaGFyZVdpdGhQcm9vZnMge1xuICAgIGNvbnN0IHMgPSBoZXhUb0JpZ0ludCh2YVNoYXJlLnMpO1xuICAgIGNvbnN0IFIgPSBiaWdJbnRGcm9tVThBQkUoc2VjcC5Qcm9qZWN0aXZlUG9pbnQuZnJvbUhleCh2YVNoYXJlLlIpLnRvUmF3Qnl0ZXModHJ1ZSkpO1xuXG4gICAgY29uc3QgcHJvb2ZDb250ZXh0ID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKE0pLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKFIsIEVjZHNhLmN1cnZlLnBvaW50Qnl0ZXMpKS5kaWdlc3QoKTtcblxuICAgIGNvbnN0IHprVlByb29mID0gRWNkc2Faa1ZQcm9vZi5jcmVhdGVaa1ZQcm9vZih2YVNoYXJlLlYsIHMsIHZhU2hhcmUubCwgUiwgRWNkc2EuY3VydmUsIHByb29mQ29udGV4dCk7XG4gICAgY29uc3Qgc2Nobm9yclByb29mID0gU2Nobm9yci5jcmVhdGVTY2hub3JyUHJvb2YodmFTaGFyZS5BLCB2YVNoYXJlLnJobywgRWNkc2EuY3VydmUsIHByb29mQ29udGV4dCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udmFTaGFyZSxcbiAgICAgIHByb29mQ29udGV4dDogcHJvb2ZDb250ZXh0LFxuICAgICAgemtWUHJvb2ZWOiB6a1ZQcm9vZixcbiAgICAgIHNjaG5vcnJQcm9vZkE6IHNjaG5vcnJQcm9vZixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBWX2kgYW5kIEFfaSB2YWx1ZXMgb2YgYWxsIG90aGVyIHBhcnRpY2lwYW50cyBkdXJpbmcgc2lnbmluZyBwaGFzZSA1IHN0ZXBzIDVBIGFuZCA1Qi5cbiAgICogQHBhcmFtIHtWQVNoYXJlV2l0aFByb29mc30gdmFTaGFyZSBWX2ksIEFfaSBpbmZvIGluY2x1ZGluZyBTU2hhcmUgdmFsdWVzIG9mIHRoZSBjdXJyZW5jdCBwYXJ0aWNpcGFudFxuICAgKiBAcGFyYW0ge1B1YmxpY1ZBU2hhcmVXaXRoUHJvb2ZzW119IHB1YmxpY1ZBU2hhcmVzIHB1YmxpYyBWX2ksIEFfaSBpbmZvIG9mIGFsbCBvdGhlciBwYXJ0aWNpcGFudHNcbiAgICogQHJldHVybnMge1VUU2hhcmV9IFVfaSwgVF9pIGluZm8gb2YgdGhlIGN1cnJlbnQgcGFydGljaXBhbnQgaWYgYWxsIHZlcmlmaWNhdGlvbnMgcGFzc1xuICAgKi9cbiAgdmVyaWZ5VkFTaGFyZXModmFTaGFyZTogVkFTaGFyZVdpdGhQcm9vZnMsIHB1YmxpY1ZBU2hhcmVzOiBQdWJsaWNWQVNoYXJlV2l0aFByb29mc1tdKTogVVRTaGFyZSB7XG4gICAgcHVibGljVkFTaGFyZXMuZm9yRWFjaCgocHVibGljVkFTaGFyZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhSGFzaENvbW1pdG1lbnQudmVyaWZ5Q29tbWl0bWVudChwdWJsaWNWQVNoYXJlLmNvbURlY29tVkEuY29tbWl0bWVudCwge1xuICAgICAgICAgIHNlY3JldDogQnVmZmVyLmNvbmNhdChbXG4gICAgICAgICAgICBiaWdJbnRUb0J1ZmZlckJFKHB1YmxpY1ZBU2hhcmUuViwgRWNkc2EuY3VydmUucG9pbnRCeXRlcyksXG4gICAgICAgICAgICBiaWdJbnRUb0J1ZmZlckJFKHB1YmxpY1ZBU2hhcmUuQSwgRWNkc2EuY3VydmUucG9pbnRCeXRlcyksXG4gICAgICAgICAgXSksXG4gICAgICAgICAgYmxpbmRpbmdGYWN0b3I6IHB1YmxpY1ZBU2hhcmUuY29tRGVjb21WQS5kZWNvbW1pdG1lbnQuYmxpbmRpbmdGYWN0b3IsXG4gICAgICAgIH0pXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdmVyaWZ5IGNvbW1pdG1lbnQgb2YgVl9pIGFuZCBBX2knKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgIVNjaG5vcnIudmVyaWZ5U2Nobm9yclByb29mKHB1YmxpY1ZBU2hhcmUuQSwgcHVibGljVkFTaGFyZS5zY2hub3JyUHJvb2ZBLCBFY2RzYS5jdXJ2ZSwgdmFTaGFyZS5wcm9vZkNvbnRleHQpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdmVyaWZ5IFNjaG5vcnIgcHJvb2Ygb2YgQV9pJyk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgICFFY2RzYVprVlByb29mLnZlcmlmeVprVlByb29mKFxuICAgICAgICAgIHB1YmxpY1ZBU2hhcmUuVixcbiAgICAgICAgICBwdWJsaWNWQVNoYXJlLnprVlByb29mVixcbiAgICAgICAgICBoZXhUb0JpZ0ludCh2YVNoYXJlLlIpLFxuICAgICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICAgIHZhU2hhcmUucHJvb2ZDb250ZXh0XG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCB2ZXJpZnkgWksgcHJvb2Ygb2YgVl9pJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB5ID0gaGV4VG9CaWdJbnQodmFTaGFyZS55KTtcbiAgICAvLyByIGlzIFIncyB4IGNvb3JkaW5hdGUuICBSIGlzIGluIGNvbXByZXNzZWQgZm9ybSwgc28gd2UgbmVlZCB0byBzbGljZSBvZmYgdGhlIGZpcnN0IGJ5dGUuXG4gICAgY29uc3QgciA9IGhleFRvQmlnSW50KHZhU2hhcmUuUi5zbGljZSgyKSk7XG5cbiAgICAvLyBDYWxjdWxhdGUgYWdncmVnYXRpb24gb2YgYWxsIFZfaSBhbmQgQV9pLlxuICAgIGxldCBWID0gRWNkc2EuY3VydmUucG9pbnRBZGQoXG4gICAgICBFY2RzYS5jdXJ2ZS5wb2ludEFkZChcbiAgICAgICAgRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoYmlnSW50RnJvbVU4QUJFKHZhU2hhcmUubSkpKSxcbiAgICAgICAgRWNkc2EuY3VydmUucG9pbnRNdWx0aXBseSh5LCBFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUocikpXG4gICAgICApLFxuICAgICAgdmFTaGFyZS5WXG4gICAgKTtcbiAgICBsZXQgQSA9IHZhU2hhcmUuQTtcbiAgICBwdWJsaWNWQVNoYXJlcy5mb3JFYWNoKChwdWJsaWNWQVNoYXJlKSA9PiB7XG4gICAgICBWID0gRWNkc2EuY3VydmUucG9pbnRBZGQoViwgcHVibGljVkFTaGFyZS5WKTtcbiAgICAgIEEgPSBFY2RzYS5jdXJ2ZS5wb2ludEFkZChBLCBwdWJsaWNWQVNoYXJlLkEpO1xuICAgIH0pO1xuXG4gICAgLy8gQ2FsY3VsYXRlIFVfaSA9IHJob19pICogViBhbmQgVF9pID0gbF9pICogQS5cbiAgICBjb25zdCBVID0gRWNkc2EuY3VydmUucG9pbnRNdWx0aXBseShWLCB2YVNoYXJlLnJobyk7XG4gICAgY29uc3QgVCA9IEVjZHNhLmN1cnZlLnBvaW50TXVsdGlwbHkoQSwgdmFTaGFyZS5sKTtcbiAgICBjb25zdCBjb21EZWNvbV9VX1QgPSBIYXNoQ29tbWl0bWVudC5jcmVhdGVDb21taXRtZW50KFxuICAgICAgQnVmZmVyLmNvbmNhdChbYmlnSW50VG9CdWZmZXJCRShVLCBFY2RzYS5jdXJ2ZS5wb2ludEJ5dGVzKSwgYmlnSW50VG9CdWZmZXJCRShULCBFY2RzYS5jdXJ2ZS5wb2ludEJ5dGVzKV0pXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi52YVNoYXJlLFxuICAgICAgVSxcbiAgICAgIFQsXG4gICAgICBjb21EZWNvbVVUOiBjb21EZWNvbV9VX1QsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgVV9pIGFuZCBWX2kgdmFsdWVzIG9mIGFsbCBvdGhlciBwYXJ0aWNpcGFudHMgZHVyaW5nIHNpZ25pbmcgcGhhc2UgNSBzdGVwcyA1QyBhbmQgNUQuXG4gICAqIEBwYXJhbSB7VVRTaGFyZX0gdXRTaGFyZSBVX2ksIFRfaSBpbmZvIGluY2x1ZGluZyBTU2hhcmUgdmFsdWVzIG9mIHRoZSBjdXJyZW5jdCBwYXJ0aWNpcGFudFxuICAgKiBAcGFyYW0ge1B1YmxpY1VUU2hhcmVbXX0gcHVibGljVVRTaGFyZXMgcHVibGljIFVfaSwgVF9pIGluZm8gb2YgYWxsIG90aGVyIHBhcnRpY2lwYW50c1xuICAgKiBAcmV0dXJucyB7U1NoYXJlfSBTU2hhcmUgb2YgdGhlIGN1cnJlbnQgcGFydGljaXBhbnQgaWYgYWxsIHZlcmlmaWNhdGlvbnMgcGFzc1xuICAgKi9cbiAgdmVyaWZ5VVRTaGFyZXModXRTaGFyZTogVVRTaGFyZSwgcHVibGljVVRTaGFyZXM6IFB1YmxpY1VUU2hhcmVbXSk6IFNTaGFyZSB7XG4gICAgbGV0IHNpZ21hVSA9IHV0U2hhcmUuVTtcbiAgICBsZXQgc2lnbWFUID0gdXRTaGFyZS5UO1xuXG4gICAgcHVibGljVVRTaGFyZXMuZm9yRWFjaCgocHVibGljVVRTaGFyZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhSGFzaENvbW1pdG1lbnQudmVyaWZ5Q29tbWl0bWVudChwdWJsaWNVVFNoYXJlLmNvbURlY29tVVQuY29tbWl0bWVudCwge1xuICAgICAgICAgIHNlY3JldDogQnVmZmVyLmNvbmNhdChbXG4gICAgICAgICAgICBiaWdJbnRUb0J1ZmZlckJFKHB1YmxpY1VUU2hhcmUuVSwgRWNkc2EuY3VydmUucG9pbnRCeXRlcyksXG4gICAgICAgICAgICBiaWdJbnRUb0J1ZmZlckJFKHB1YmxpY1VUU2hhcmUuVCwgRWNkc2EuY3VydmUucG9pbnRCeXRlcyksXG4gICAgICAgICAgXSksXG4gICAgICAgICAgYmxpbmRpbmdGYWN0b3I6IHB1YmxpY1VUU2hhcmUuY29tRGVjb21VVC5kZWNvbW1pdG1lbnQuYmxpbmRpbmdGYWN0b3IsXG4gICAgICAgIH0pXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdmVyaWZ5IGNvbW1pdG1lbnQgb2YgVV9pIGFuZCBUX2knKTtcbiAgICAgIH1cblxuICAgICAgc2lnbWFVID0gRWNkc2EuY3VydmUucG9pbnRBZGQoc2lnbWFVLCBwdWJsaWNVVFNoYXJlLlUpO1xuICAgICAgc2lnbWFUID0gRWNkc2EuY3VydmUucG9pbnRBZGQoc2lnbWFULCBwdWJsaWNVVFNoYXJlLlQpO1xuICAgIH0pO1xuXG4gICAgaWYgKHNpZ21hVSAhPT0gc2lnbWFUKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1bSBvZiBhbGwgVV9pIGRvZXMgbm90IG1hdGNoIHN1bSBvZiBhbGwgVF9pJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgLi4udXRTaGFyZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBmdWxsIHNpZ25hdHVyZSBieSBjb21iaW5pbmcgU2lnbiBTaGFyZXNcbiAgICogQHBhcmFtIHtTU2hhcmVbXX0gc2hhcmVzXG4gICAqIEByZXR1cm5zIHtTaWduYXR1cmV9XG4gICAqL1xuICBjb25zdHJ1Y3RTaWduYXR1cmUoc2hhcmVzOiBTU2hhcmVbXSk6IFNpZ25hdHVyZSB7XG4gICAgLy8gRXZlcnkgUiBtdXN0IG1hdGNoLlxuICAgIGNvbnN0IFIgPSBzaGFyZXNbMF1bJ1InXTtcbiAgICBjb25zdCBpc1JNYXRjaGluZyA9IHNoYXJlcy5tYXAoKHNoYXJlKSA9PiBzaGFyZVsnUiddID09PSBSKS5yZWR1Y2UoKGEsIGIpID0+IGEgJiYgYik7XG4gICAgaWYgKCFpc1JNYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSIHZhbHVlIHNob3VsZCBiZSBjb25zaXN0ZW50IGFjcm9zcyBhbGwgc2hhcmVzJyk7XG4gICAgfVxuXG4gICAgbGV0IHMgPSBzaGFyZXMubWFwKChzaGFyZSkgPT4gaGV4VG9CaWdJbnQoc2hhcmVbJ3MnXSkpLnJlZHVjZShFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQpO1xuICAgIGNvbnN0IHJlY2lkID0gKFIuc2xpY2UoMCwgMikgPT09ICcwMycgPyAxIDogMCkgXiAocyA+IEVjZHNhLmN1cnZlLm9yZGVyKCkgLyBCaWdJbnQoMikgPyAxIDogMCk7XG5cbiAgICAvLyBOb3JtYWxpemUgcy5cbiAgICBzID0gcyA+IEVjZHNhLmN1cnZlLm9yZGVyKCkgLyBCaWdJbnQoMikgPyBFY2RzYS5jdXJ2ZS5vcmRlcigpIC0gcyA6IHM7XG4gICAgcmV0dXJuIHtcbiAgICAgIHk6IHNoYXJlc1swXVsneSddLFxuICAgICAgcjogUi5zbGljZSgyKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHJlY2lkOiByZWNpZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBlY2RzYSBzaWduYXR1cmVzXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBtZXNzYWdlXG4gICAqIEBwYXJhbSB7U2lnbmF0dXJlIH0gc2lnbmF0dXJlXG4gICAqIEBwYXJhbSB7SGFzaH0gaGFzaCBoYXNoaW5nIGFsZ29yaXRobSBpbXBsZW1lbnRpbmcgTm9kZWBzIHN0YW5kYXJkIGNyeXB0byBoYXNoIGludGVyZmFjZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZEhhc2ggaWYgdHJ1ZSwgd2UgaGFzaCB0aGUgcHJvdmlkZWQgYnVmZmVyIGJlZm9yZSB2ZXJpZnlpbmdcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgc2lnbmF0dXJlIGlzIHZhbGlkOyBGYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHZlcmlmeShtZXNzYWdlOiBCdWZmZXIsIHNpZ25hdHVyZTogU2lnbmF0dXJlLCBoYXNoPzogSGFzaCwgc2hvdWxkSGFzaCA9IHRydWUpOiBib29sZWFuIHtcbiAgICBjb25zdCBtZXNzYWdlVG9WZXJpZnkgPSBzaG91bGRIYXNoID8gKGhhc2ggfHwgY3JlYXRlSGFzaCgnc2hhMjU2JykpLnVwZGF0ZShtZXNzYWdlKS5kaWdlc3QoKSA6IG1lc3NhZ2U7XG4gICAgcmV0dXJuIEVjZHNhLmN1cnZlLnZlcmlmeShcbiAgICAgIG1lc3NhZ2VUb1ZlcmlmeSxcbiAgICAgIEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICBCdWZmZXIuZnJvbShbc2lnbmF0dXJlWydyZWNpZCddXSksXG4gICAgICAgIGJpZ0ludFRvQnVmZmVyQkUoaGV4VG9CaWdJbnQoc2lnbmF0dXJlWydyJ10pLCAzMiksXG4gICAgICAgIGJpZ0ludFRvQnVmZmVyQkUoaGV4VG9CaWdJbnQoc2lnbmF0dXJlWydzJ10pLCAzMiksXG4gICAgICBdKSxcbiAgICAgIGhleFRvQmlnSW50KHNpZ25hdHVyZVsneSddKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIGEgY2hhbGxlbmdlIGFuZCBpdCdzIHByb29mcyBmcm9tIGhleCBzdHJpbmdzIHRvIGJpZ2ludFxuICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2RrLWxpYi1tcGMgRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZU50aWxkZSBpbnN0ZWFkXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVOdGlsZGUoY2hhbGxlbmdlOiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWROdGlsZGUpOiBFY2RzYVR5cGVzLkRlc2VyaWFsaXplZE50aWxkZSB7XG4gICAgcmV0dXJuIEVjZHNhVHlwZXMuZGVzZXJpYWxpemVOdGlsZGUoY2hhbGxlbmdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgY2hhbGxlbmdlIGFuZCBpdCdzIHByb29mcyBmcm9tIGJpZyBpbnQgdG8gaGV4IHN0cmluZ3MuXG4gICAqIEBkZXByZWNhdGVkIHVzZSBzZGstbGliLW1wYyBFY2RzYVR5cGVzLmRlc2VyaWFsaXplTnRpbGRlIGluc3RlYWRcbiAgICogQHBhcmFtIGNoYWxsZW5nZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZU50aWxkZShjaGFsbGVuZ2U6IEVjZHNhVHlwZXMuRGVzZXJpYWxpemVkTnRpbGRlKTogRWNkc2FUeXBlcy5TZXJpYWxpemVkTnRpbGRlIHtcbiAgICByZXR1cm4gRWNkc2FUeXBlcy5zZXJpYWxpemVOdGlsZGUoY2hhbGxlbmdlKTtcbiAgfVxufVxuIl19
|