@bitgo-beta/sdk-core 8.2.1-beta.90 → 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 +2758 -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 +14 -2
- package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/enum.js +28 -6
- 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 +38 -9
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +497 -349
- package/dist/src/account-lib/mpc/tss/ecdsa/index.js +23 -9
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts +2 -2
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.js +3 -3
- package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +73 -52
- 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 -1
- package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/types.js +1 -1
- package/dist/src/account-lib/mpc/tss/index.js +23 -9
- package/dist/src/account-lib/mpc/util.d.ts +7 -1
- package/dist/src/account-lib/mpc/util.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/util.js +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/bitgo/address-book/index.js +19 -0
- package/dist/src/bitgo/address-book/types.d.ts +170 -0
- package/dist/src/bitgo/address-book/types.d.ts.map +1 -0
- package/dist/src/bitgo/address-book/types.js +3 -0
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts +80 -10
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/baseCoin.js +130 -16
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +83 -19
- 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 +52 -5
- package/dist/src/bitgo/environments.d.ts.map +1 -1
- package/dist/src/bitgo/environments.js +89 -20
- 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 +63 -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 +128 -37
- package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +3 -3
- package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/ovcJsonCodec.js +23 -9
- package/dist/src/bitgo/legacyBitcoin.d.ts +0 -1
- package/dist/src/bitgo/legacyBitcoin.d.ts.map +1 -1
- package/dist/src/bitgo/legacyBitcoin.js +27 -13
- package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts +7 -0
- package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts.map +1 -0
- package/dist/src/bitgo/lightning/lightningWalletUtil.js +25 -0
- package/dist/src/bitgo/market/iMarkets.d.ts +2 -2
- package/dist/src/bitgo/market/iMarkets.d.ts.map +1 -1
- package/dist/src/bitgo/market/index.js +6 -2
- package/dist/src/bitgo/market/markets.js +23 -9
- package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +2 -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 +216 -107
- 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 +120 -4
- 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 +13 -2
- package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/stakingWallet.js +45 -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 +37 -5
- package/dist/src/bitgo/tss/common.d.ts.map +1 -1
- package/dist/src/bitgo/tss/common.js +103 -17
- package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +6 -4
- package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/ecdsa.js +78 -66
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts +15 -0
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +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 +11 -8
- package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/tss/eddsa/eddsa.js +38 -41
- package/dist/src/bitgo/tss/eddsa/index.js +23 -9
- package/dist/src/bitgo/tss/eddsa/types.d.ts +4 -4
- package/dist/src/bitgo/tss/eddsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/index.d.ts +3 -2
- package/dist/src/bitgo/tss/index.d.ts.map +1 -1
- package/dist/src/bitgo/tss/index.js +26 -10
- package/dist/src/bitgo/tss/types.d.ts +3 -3
- package/dist/src/bitgo/tss/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/types.js +2 -2
- package/dist/src/bitgo/types.d.ts +3 -3
- package/dist/src/bitgo/types.d.ts.map +1 -1
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +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 +39 -14
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.js +145 -45
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +202 -34
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.js +22 -20
- 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 +20 -52
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +145 -280
- 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 +5 -3
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +75 -58
- 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 +201 -19
- 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 +192 -25
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +920 -354
- 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 +2 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +26 -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 -1
- package/package.json +25 -22
- 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 -5
- package/dist/src/openssl/index.d.ts.map +0 -1
- package/dist/src/openssl/index.js +0 -9
|
@@ -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,13 +15,23 @@ 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
|
-
};
|
|
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
|
+
})();
|
|
21
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
37
|
};
|
|
@@ -26,30 +40,37 @@ exports.Wallet = exports.ManageUnspentsOptions = void 0;
|
|
|
26
40
|
/**
|
|
27
41
|
* @prettier
|
|
28
42
|
*/
|
|
43
|
+
const t = __importStar(require("io-ts"));
|
|
29
44
|
const assert_1 = __importDefault(require("assert"));
|
|
30
|
-
const bignumber_js_1 = require("bignumber.js");
|
|
45
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
31
46
|
const _ = __importStar(require("lodash"));
|
|
32
47
|
const common = __importStar(require("../../common"));
|
|
33
48
|
const bitcoin_1 = require("../bitcoin");
|
|
34
49
|
const ecdh_1 = require("../ecdh");
|
|
35
50
|
const errors_1 = require("../errors");
|
|
36
51
|
const internal = __importStar(require("../internal/internal"));
|
|
37
|
-
const
|
|
52
|
+
const internal_1 = require("../internal");
|
|
53
|
+
const keychain_1 = require("../keychain");
|
|
38
54
|
const pendingApproval_1 = require("../pendingApproval");
|
|
39
|
-
const
|
|
55
|
+
const trading_1 = require("../trading");
|
|
40
56
|
const utils_1 = require("../utils");
|
|
41
|
-
const
|
|
42
|
-
const lightning_1 = require("../lightning");
|
|
57
|
+
const staking_1 = require("../staking");
|
|
43
58
|
const eddsa_1 = __importDefault(require("../utils/tss/eddsa"));
|
|
44
59
|
const ecdsa_1 = require("../utils/tss/ecdsa");
|
|
45
60
|
const tss_1 = require("../tss");
|
|
46
|
-
const
|
|
61
|
+
const BuildParams_1 = require("./BuildParams");
|
|
62
|
+
const postWithCodec_1 = require("../utils/postWithCodec");
|
|
63
|
+
const public_types_1 = require("@bitgo/public-types");
|
|
64
|
+
const address_book_1 = require("../address-book");
|
|
65
|
+
const txRequest_1 = require("../utils/txRequest");
|
|
66
|
+
const lightningWalletUtil_1 = require("../lightning/lightningWalletUtil");
|
|
47
67
|
const debug = require('debug')('bitgo:v2:wallet');
|
|
68
|
+
const whitelistedSendParams = public_types_1.TxSendBody.type.types.flatMap((t) => Object.keys(t.props));
|
|
48
69
|
var ManageUnspentsOptions;
|
|
49
70
|
(function (ManageUnspentsOptions) {
|
|
50
71
|
ManageUnspentsOptions[ManageUnspentsOptions["BUILD_ONLY"] = 0] = "BUILD_ONLY";
|
|
51
72
|
ManageUnspentsOptions[ManageUnspentsOptions["BUILD_SIGN_SEND"] = 1] = "BUILD_SIGN_SEND";
|
|
52
|
-
})(ManageUnspentsOptions
|
|
73
|
+
})(ManageUnspentsOptions || (exports.ManageUnspentsOptions = ManageUnspentsOptions = {}));
|
|
53
74
|
function isPrebuildTransactionResult(prebuildTx) {
|
|
54
75
|
if (!prebuildTx || typeof prebuildTx === 'string') {
|
|
55
76
|
return false;
|
|
@@ -66,10 +87,15 @@ class Wallet {
|
|
|
66
87
|
const userDetails = _.find(walletData.users, { user: userId });
|
|
67
88
|
this._permissions = _.get(userDetails, 'permissions');
|
|
68
89
|
}
|
|
69
|
-
if (
|
|
90
|
+
if (baseCoin?.supportsTss() && this._wallet.multisigType === 'tss') {
|
|
70
91
|
switch (baseCoin.getMPCAlgorithm()) {
|
|
71
92
|
case 'ecdsa':
|
|
72
|
-
|
|
93
|
+
if (walletData.multisigTypeVersion === 'MPCv2') {
|
|
94
|
+
this.tssUtils = new ecdsa_1.EcdsaMPCv2Utils(bitgo, baseCoin, this);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
this.tssUtils = new ecdsa_1.EcdsaUtils(bitgo, baseCoin, this);
|
|
98
|
+
}
|
|
73
99
|
break;
|
|
74
100
|
case 'eddsa':
|
|
75
101
|
this.tssUtils = new eddsa_1.default(bitgo, baseCoin, this);
|
|
@@ -104,64 +130,9 @@ class Wallet {
|
|
|
104
130
|
balance() {
|
|
105
131
|
return this._wallet.balance;
|
|
106
132
|
}
|
|
133
|
+
/** @deprecated use codec instead: t.exact(BuildParams).encode(v) */
|
|
107
134
|
prebuildWhitelistedParams() {
|
|
108
|
-
return
|
|
109
|
-
'addressType',
|
|
110
|
-
'apiVersion',
|
|
111
|
-
'changeAddress',
|
|
112
|
-
'consolidateAddresses',
|
|
113
|
-
'cpfpFeeRate',
|
|
114
|
-
'cpfpTxIds',
|
|
115
|
-
'enforceMinConfirmsForChange',
|
|
116
|
-
'feeRate',
|
|
117
|
-
'gasLimit',
|
|
118
|
-
'gasPrice',
|
|
119
|
-
'hopParams',
|
|
120
|
-
'idfSignedTimestamp',
|
|
121
|
-
'idfUserId',
|
|
122
|
-
'idfVersion',
|
|
123
|
-
'instant',
|
|
124
|
-
'lastLedgerSequence',
|
|
125
|
-
'ledgerSequenceDelta',
|
|
126
|
-
'maxFee',
|
|
127
|
-
'maxFeeRate',
|
|
128
|
-
'maxValue',
|
|
129
|
-
'memo',
|
|
130
|
-
'transferId',
|
|
131
|
-
'message',
|
|
132
|
-
'minConfirms',
|
|
133
|
-
'minValue',
|
|
134
|
-
'noSplitChange',
|
|
135
|
-
'numBlocks',
|
|
136
|
-
'nonce',
|
|
137
|
-
'preview',
|
|
138
|
-
'previewPendingTxs',
|
|
139
|
-
'receiveAddress',
|
|
140
|
-
'recipients',
|
|
141
|
-
'reservation',
|
|
142
|
-
'sequenceId',
|
|
143
|
-
'strategy',
|
|
144
|
-
'sourceChain',
|
|
145
|
-
'destinationChain',
|
|
146
|
-
'targetWalletUnspents',
|
|
147
|
-
'trustlines',
|
|
148
|
-
'txFormat',
|
|
149
|
-
'type',
|
|
150
|
-
'unspents',
|
|
151
|
-
'nonParticipation',
|
|
152
|
-
'validFromBlock',
|
|
153
|
-
'validToBlock',
|
|
154
|
-
'messageKey',
|
|
155
|
-
'stakingOptions',
|
|
156
|
-
'eip1559',
|
|
157
|
-
'keyregTxBase64',
|
|
158
|
-
'closeRemainderTo',
|
|
159
|
-
'tokenName',
|
|
160
|
-
'enableTokens',
|
|
161
|
-
// param to set emergency flag on a custodial transaction.
|
|
162
|
-
// This transaction should be performed in less than 1 hour or it will fail.
|
|
163
|
-
'emergency',
|
|
164
|
-
];
|
|
135
|
+
return BuildParams_1.buildParamKeys;
|
|
165
136
|
}
|
|
166
137
|
/**
|
|
167
138
|
* This is a strict sub-set of prebuildWhitelistedParams
|
|
@@ -169,6 +140,8 @@ class Wallet {
|
|
|
169
140
|
prebuildConsolidateAccountParams() {
|
|
170
141
|
return [
|
|
171
142
|
'consolidateAddresses',
|
|
143
|
+
'nftCollectionId',
|
|
144
|
+
'nftId',
|
|
172
145
|
'feeRate',
|
|
173
146
|
'maxFeeRate',
|
|
174
147
|
'memo',
|
|
@@ -176,6 +149,7 @@ class Wallet {
|
|
|
176
149
|
'validToBlock',
|
|
177
150
|
'preview',
|
|
178
151
|
'keepAlive',
|
|
152
|
+
'apiVersion',
|
|
179
153
|
];
|
|
180
154
|
}
|
|
181
155
|
/**
|
|
@@ -221,17 +195,29 @@ class Wallet {
|
|
|
221
195
|
return this._wallet.coin;
|
|
222
196
|
}
|
|
223
197
|
type() {
|
|
224
|
-
return this._wallet.type;
|
|
198
|
+
return this._wallet.type || 'hot';
|
|
225
199
|
}
|
|
226
200
|
multisigType() {
|
|
227
201
|
return this._wallet.multisigType;
|
|
228
202
|
}
|
|
203
|
+
multisigTypeVersion() {
|
|
204
|
+
return this._wallet.multisigTypeVersion;
|
|
205
|
+
}
|
|
206
|
+
subType() {
|
|
207
|
+
return this._wallet.subType;
|
|
208
|
+
}
|
|
229
209
|
/**
|
|
230
210
|
* Get the label (name) for this wallet
|
|
231
211
|
*/
|
|
232
212
|
label() {
|
|
233
213
|
return this._wallet.label;
|
|
234
214
|
}
|
|
215
|
+
flags() {
|
|
216
|
+
return this._wallet.walletFlags ?? [];
|
|
217
|
+
}
|
|
218
|
+
flag(name) {
|
|
219
|
+
return this.flags().find((flag) => flag.name === name)?.value;
|
|
220
|
+
}
|
|
235
221
|
/**
|
|
236
222
|
* Get the public object ids for the keychains on this wallet.
|
|
237
223
|
*/
|
|
@@ -242,7 +228,7 @@ class Wallet {
|
|
|
242
228
|
* Get a receive address for this wallet
|
|
243
229
|
*/
|
|
244
230
|
receiveAddress() {
|
|
245
|
-
return this._wallet.receiveAddress
|
|
231
|
+
return this._wallet.receiveAddress?.address;
|
|
246
232
|
}
|
|
247
233
|
/**
|
|
248
234
|
* Get the wallet id of the wallet that this wallet was migrated from.
|
|
@@ -310,6 +296,43 @@ class Wallet {
|
|
|
310
296
|
.query(query)
|
|
311
297
|
.result();
|
|
312
298
|
}
|
|
299
|
+
/**
|
|
300
|
+
* Return a list of nft tokens for this wallet. Will always return undefined if the wallet
|
|
301
|
+
* was not initialized with the allTokens flag.
|
|
302
|
+
*
|
|
303
|
+
* @returns {NftBalance[] | undefined}
|
|
304
|
+
*/
|
|
305
|
+
nftBalances() {
|
|
306
|
+
if (this._wallet.nfts) {
|
|
307
|
+
return Object.values(this._wallet.nfts).map((nftData) => nftData);
|
|
308
|
+
}
|
|
309
|
+
return undefined;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Return a list of unsupported nft tokens for this wallet. Will always return undefined if the wallet
|
|
313
|
+
* was not initialized with the allTokens flag.
|
|
314
|
+
*
|
|
315
|
+
* @returns {NftBalance[] | undefined}
|
|
316
|
+
*/
|
|
317
|
+
unsupportedNftBalances() {
|
|
318
|
+
if (this._wallet.unsupportedNfts) {
|
|
319
|
+
return Object.values(this._wallet.unsupportedNfts).map((nftData) => nftData);
|
|
320
|
+
}
|
|
321
|
+
return undefined;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Returns a list of the wallets nft & unsupported nfts.
|
|
325
|
+
*
|
|
326
|
+
* @returns {NftBalance[]}
|
|
327
|
+
*/
|
|
328
|
+
async getNftBalances() {
|
|
329
|
+
const walletData = await this.bitgo.get(this.url()).query({ allTokens: true }).result();
|
|
330
|
+
const supportedNfts = walletData?.nfts ? Object.values(walletData.nfts).map((balance) => balance) : [];
|
|
331
|
+
const unsupportedNfts = walletData?.unsupportedNfts
|
|
332
|
+
? Object.values(walletData.unsupportedNfts).map((balance) => balance)
|
|
333
|
+
: [];
|
|
334
|
+
return [...supportedNfts, ...unsupportedNfts];
|
|
335
|
+
}
|
|
313
336
|
/**
|
|
314
337
|
* List the transactions for a given wallet
|
|
315
338
|
* @param params
|
|
@@ -318,18 +341,22 @@ class Wallet {
|
|
|
318
341
|
*/
|
|
319
342
|
async getTransaction(params = {}) {
|
|
320
343
|
common.validateParams(params, ['txHash'], []);
|
|
321
|
-
const
|
|
344
|
+
const paginatedOptions = {};
|
|
322
345
|
if (!_.isUndefined(params.prevId)) {
|
|
323
346
|
if (!_.isString(params.prevId)) {
|
|
324
347
|
throw new Error('invalid prevId argument, expecting string');
|
|
325
348
|
}
|
|
326
|
-
|
|
349
|
+
paginatedOptions.prevId = params.prevId;
|
|
327
350
|
}
|
|
328
351
|
if (!_.isUndefined(params.limit)) {
|
|
329
352
|
if (!_.isInteger(params.limit) || params.limit < 1) {
|
|
330
353
|
throw new Error('invalid limit argument, expecting positive integer');
|
|
331
354
|
}
|
|
332
|
-
|
|
355
|
+
paginatedOptions.limit = params.limit;
|
|
356
|
+
}
|
|
357
|
+
const query = paginatedOptions;
|
|
358
|
+
if (params.includeRbf) {
|
|
359
|
+
query['includeRbf'] = params.includeRbf;
|
|
333
360
|
}
|
|
334
361
|
return await this.bitgo
|
|
335
362
|
.get(this.url('/tx/' + params.txHash))
|
|
@@ -429,6 +456,12 @@ class Wallet {
|
|
|
429
456
|
}
|
|
430
457
|
query.type = params.type;
|
|
431
458
|
}
|
|
459
|
+
if (!_.isNil(params.decorateUtxoSpecificFields)) {
|
|
460
|
+
if (!_.isBoolean(params.decorateUtxoSpecificFields)) {
|
|
461
|
+
throw new Error('invalid includeHex argument, expecting boolean');
|
|
462
|
+
}
|
|
463
|
+
query.decorateUtxoSpecificFields = params.decorateUtxoSpecificFields;
|
|
464
|
+
}
|
|
432
465
|
return await this.bitgo.get(this.url('/transfer')).query(query).result();
|
|
433
466
|
}
|
|
434
467
|
/**
|
|
@@ -495,6 +528,7 @@ class Wallet {
|
|
|
495
528
|
'prevId',
|
|
496
529
|
'segwit',
|
|
497
530
|
'target',
|
|
531
|
+
'unspentIds',
|
|
498
532
|
]);
|
|
499
533
|
return this.bitgo.get(this.url('/unspents')).query(query).result();
|
|
500
534
|
}
|
|
@@ -526,10 +560,13 @@ class Wallet {
|
|
|
526
560
|
* - maximum number of unspents you want to use in the transaction
|
|
527
561
|
* Output parameters:
|
|
528
562
|
* @param {Number} params.numUnspentsToMake - the number of new unspents to make
|
|
563
|
+
* @param {Boolean} params.bulk - if set to True, this enables the consolidation of large number of unspents by creating multiple transactions,
|
|
564
|
+
* with each transaction composed of 200 unspents, except for the last transaction which may have fewer unspents.
|
|
529
565
|
*/
|
|
530
566
|
async manageUnspents(routeName, params = {}, option = ManageUnspentsOptions.BUILD_SIGN_SEND) {
|
|
531
567
|
common.validateParams(params, [], ['walletPassphrase', 'xprv']);
|
|
532
568
|
const reqId = new utils_1.RequestTracer();
|
|
569
|
+
const fanoutInputFormat = params.maxNumInputsToUse ? 'maxNumInputsToUse' : 'unspents';
|
|
533
570
|
const filteredParams = _.pick(params, [
|
|
534
571
|
'feeRate',
|
|
535
572
|
'maxFeeRate',
|
|
@@ -542,37 +579,69 @@ class Wallet {
|
|
|
542
579
|
'enforceMinConfirmsForChange',
|
|
543
580
|
'targetAddress',
|
|
544
581
|
'txFormat',
|
|
545
|
-
|
|
582
|
+
'bulk',
|
|
583
|
+
routeName === 'consolidate' ? 'limit' : fanoutInputFormat,
|
|
546
584
|
'numUnspentsToMake',
|
|
547
585
|
]);
|
|
548
586
|
this.bitgo.setRequestTracer(reqId);
|
|
549
|
-
const
|
|
587
|
+
const buildResponse = await this.bitgo
|
|
550
588
|
.post(this.url(`/${routeName}Unspents`))
|
|
551
589
|
.send(filteredParams)
|
|
552
590
|
.result();
|
|
553
591
|
if (option === ManageUnspentsOptions.BUILD_ONLY) {
|
|
554
|
-
return
|
|
592
|
+
return buildResponse;
|
|
555
593
|
}
|
|
556
594
|
const keychains = (await this.baseCoin
|
|
557
595
|
.keychains()
|
|
558
596
|
.getKeysForSigning({ wallet: this, reqId }));
|
|
559
597
|
const transactionParams = {
|
|
560
598
|
...params,
|
|
561
|
-
txPrebuild: response,
|
|
562
599
|
keychain: keychains[0],
|
|
563
600
|
pubs: keychains.map((k) => {
|
|
564
|
-
assert_1.default(k.pub);
|
|
601
|
+
(0, assert_1.default)(k.pub);
|
|
565
602
|
return k.pub;
|
|
566
603
|
}),
|
|
604
|
+
// Building PSBTs with the bulk flag does not include the previous transaction for non-segwit inputs.
|
|
605
|
+
// Manually override the signing and validating to not fail.
|
|
606
|
+
allowNonSegwitSigningWithoutPrevTx: !!params.bulk,
|
|
567
607
|
};
|
|
568
|
-
const
|
|
569
|
-
const selectParams = _.pick(params, ['comment', 'otp']);
|
|
570
|
-
const
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
.
|
|
575
|
-
|
|
608
|
+
const txPrebuilds = Array.isArray(buildResponse) ? buildResponse : [buildResponse];
|
|
609
|
+
const selectParams = _.pick(params, ['comment', 'otp', 'bulk']);
|
|
610
|
+
const response = await Promise.all(txPrebuilds.map(async (txPrebuild) => {
|
|
611
|
+
const signedTransaction = await this.signTransaction({ ...transactionParams, txPrebuild });
|
|
612
|
+
const finalTxParams = _.extend({}, signedTransaction, selectParams, { type: routeName });
|
|
613
|
+
this.bitgo.setRequestTracer(reqId);
|
|
614
|
+
return this.sendTransaction(finalTxParams, reqId);
|
|
615
|
+
}));
|
|
616
|
+
return Array.isArray(buildResponse) ? response : response[0];
|
|
617
|
+
}
|
|
618
|
+
/**
|
|
619
|
+
* Manage the unspent reservations on the wallet
|
|
620
|
+
*
|
|
621
|
+
* @param params.create - create a new reservation
|
|
622
|
+
* @param params.modify - modify an existing reservation
|
|
623
|
+
* @param params.delete - delete an existing reservation
|
|
624
|
+
*/
|
|
625
|
+
async manageUnspentReservations(params) {
|
|
626
|
+
const filteredParams = _.pick(params, ['create', 'modify', 'delete']);
|
|
627
|
+
this.bitgo.setRequestTracer(new utils_1.RequestTracer());
|
|
628
|
+
// The URL cannot contain the coinName, so we remove it from the URL
|
|
629
|
+
const url = this.url(`/reservedunspents`).replace(`/${this.baseCoin.getChain()}`, '');
|
|
630
|
+
if (filteredParams.create) {
|
|
631
|
+
const filteredCreateParams = _.pick(params.create, ['unspentIds', 'expireTime']);
|
|
632
|
+
return this.bitgo.post(url).send(filteredCreateParams).result();
|
|
633
|
+
}
|
|
634
|
+
else if (filteredParams.modify) {
|
|
635
|
+
const filteredModifyParams = _.pick(params.modify, ['unspentIds', 'changes']);
|
|
636
|
+
return this.bitgo.put(url).send(filteredModifyParams).result();
|
|
637
|
+
}
|
|
638
|
+
else if (filteredParams.delete) {
|
|
639
|
+
const filteredDeleteParams = _.pick(params.delete, ['id']);
|
|
640
|
+
return this.bitgo.del(url).query(filteredDeleteParams).result();
|
|
641
|
+
}
|
|
642
|
+
else {
|
|
643
|
+
throw new Error('Did not detect a creation, modification, or deletion request.');
|
|
644
|
+
}
|
|
576
645
|
}
|
|
577
646
|
/**
|
|
578
647
|
* Consolidate unspents on a wallet
|
|
@@ -592,7 +661,9 @@ class Wallet {
|
|
|
592
661
|
* @param {Number} params.limit for routeName === 'consolidate'
|
|
593
662
|
* params.maxNumInputsToUse for routeName === 'fanout'
|
|
594
663
|
* - maximum number of unspents you want to use in the transaction
|
|
595
|
-
* @param {Number} params.numUnspentsToMake - the number of new unspents to make
|
|
664
|
+
* @param {Number} params.numUnspentsToMake - the number of new unspents to make. It is not applicable for if bulk consolidate.
|
|
665
|
+
* @param {Boolean} params.bulk - if set to True, this enables the consolidation of large number of unspents by creating multiple transactions,
|
|
666
|
+
* with each transaction composed of 200 unspents, except for the last transaction which may have fewer unspents.
|
|
596
667
|
*/
|
|
597
668
|
async consolidateUnspents(params = {}, option = ManageUnspentsOptions.BUILD_SIGN_SEND) {
|
|
598
669
|
return this.manageUnspents('consolidate', params, option);
|
|
@@ -613,9 +684,11 @@ class Wallet {
|
|
|
613
684
|
* @param {Number} params.maxFeeRate - The max limit for a fee rate in satoshis/kB
|
|
614
685
|
* @param {Number} params.maxNumInputsToUse - the number of unspents you want to use in the transaction
|
|
615
686
|
* @param {Number} params.numUnspentsToMake - the number of new unspents to make
|
|
687
|
+
*
|
|
688
|
+
* @param {ManageUnspentsOptions} option - flag to toggle build and send or build only
|
|
616
689
|
*/
|
|
617
|
-
async fanoutUnspents(params = {}) {
|
|
618
|
-
return this.manageUnspents('fanout', params);
|
|
690
|
+
async fanoutUnspents(params = {}, option = ManageUnspentsOptions.BUILD_SIGN_SEND) {
|
|
691
|
+
return this.manageUnspents('fanout', params, option);
|
|
619
692
|
}
|
|
620
693
|
/**
|
|
621
694
|
* Set the token flush thresholds for the wallet. Updates the wallet.
|
|
@@ -722,17 +795,21 @@ class Wallet {
|
|
|
722
795
|
if (this.confirmedBalanceString() !== this.balanceString()) {
|
|
723
796
|
throw new Error('cannot sweep when unconfirmed funds exist on the wallet, please wait until all inbound transactions confirm');
|
|
724
797
|
}
|
|
725
|
-
const value = this.
|
|
726
|
-
|
|
798
|
+
const value = await this.bitgo.get(this.url('/maximumSpendable')).result();
|
|
799
|
+
const maximumSpendable = new bignumber_js_1.default(value.maximumSpendable);
|
|
800
|
+
if (value === undefined || maximumSpendable.isZero()) {
|
|
727
801
|
throw new Error('no funds to sweep');
|
|
728
802
|
}
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
803
|
+
const sendManyParams = {
|
|
804
|
+
...params,
|
|
805
|
+
recipients: [
|
|
806
|
+
{
|
|
807
|
+
address: params.address || '', // Ensure address is always a string
|
|
808
|
+
amount: maximumSpendable.toString(),
|
|
809
|
+
},
|
|
810
|
+
],
|
|
811
|
+
};
|
|
812
|
+
return this.sendMany(sendManyParams);
|
|
736
813
|
}
|
|
737
814
|
// the following flow works for all UTXO coins
|
|
738
815
|
const reqId = new utils_1.RequestTracer();
|
|
@@ -742,10 +819,20 @@ class Wallet {
|
|
|
742
819
|
'maxFeeRate',
|
|
743
820
|
'feeTxConfirmTarget',
|
|
744
821
|
'allowPartialSweep',
|
|
822
|
+
'txFormat',
|
|
745
823
|
]);
|
|
746
824
|
this.bitgo.setRequestTracer(reqId);
|
|
747
825
|
const response = await this.bitgo.post(this.url('/sweepWallet')).send(filteredParams).result();
|
|
748
|
-
|
|
826
|
+
const transaction = await this.baseCoin.explainTransaction(response);
|
|
827
|
+
if (transaction?.outputs.length) {
|
|
828
|
+
const invalidOutputAddress = transaction.outputs.find((output) => output.address !== params.address);
|
|
829
|
+
if (invalidOutputAddress) {
|
|
830
|
+
throw new Error(`invalid sweep destination ${invalidOutputAddress.address}, specified ${params.address}`);
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
else {
|
|
834
|
+
throw new Error('invalid transaction, no destination address');
|
|
835
|
+
}
|
|
749
836
|
const keychains = (await this.baseCoin.keychains().getKeysForSigning({ wallet: this, reqId }));
|
|
750
837
|
const transactionParams = {
|
|
751
838
|
...params,
|
|
@@ -760,10 +847,7 @@ class Wallet {
|
|
|
760
847
|
const selectParams = _.pick(params, ['otp']);
|
|
761
848
|
const finalTxParams = _.extend({}, signedTransaction, selectParams);
|
|
762
849
|
this.bitgo.setRequestTracer(reqId);
|
|
763
|
-
return this.
|
|
764
|
-
.post(this.baseCoin.url('/wallet/' + this._wallet.id + '/tx/send'))
|
|
765
|
-
.send(finalTxParams)
|
|
766
|
-
.result();
|
|
850
|
+
return this.sendTransaction(finalTxParams, reqId);
|
|
767
851
|
}
|
|
768
852
|
/**
|
|
769
853
|
* Freeze a given wallet
|
|
@@ -873,6 +957,35 @@ class Wallet {
|
|
|
873
957
|
.query(query)
|
|
874
958
|
.result();
|
|
875
959
|
}
|
|
960
|
+
/**
|
|
961
|
+
* List the addresses sorted by balance for a given wallet
|
|
962
|
+
* @param params
|
|
963
|
+
* @returns {*}
|
|
964
|
+
*/
|
|
965
|
+
async addressesByBalance(params) {
|
|
966
|
+
const query = {
|
|
967
|
+
token: params.token,
|
|
968
|
+
};
|
|
969
|
+
query.sort = params.sort ?? -1;
|
|
970
|
+
query.page = params.page ?? 1;
|
|
971
|
+
query.limit = params.limit ?? 500;
|
|
972
|
+
if (!_.isNumber(query.sort)) {
|
|
973
|
+
throw new Error('invalid sort argument, expecting number');
|
|
974
|
+
}
|
|
975
|
+
if (!_.isNumber(query.page)) {
|
|
976
|
+
throw new Error('invalid page argument, expecting number');
|
|
977
|
+
}
|
|
978
|
+
if (!_.isNumber(params.limit)) {
|
|
979
|
+
throw new Error('invalid limit argument, expecting number');
|
|
980
|
+
}
|
|
981
|
+
if (params.limit < 1 || params.limit > 500) {
|
|
982
|
+
throw new Error('limit argument must be between 1 and 500');
|
|
983
|
+
}
|
|
984
|
+
return this.bitgo
|
|
985
|
+
.get(this.baseCoin.url('/wallet/' + this._wallet.id + '/addresses/balances'))
|
|
986
|
+
.query(query)
|
|
987
|
+
.result();
|
|
988
|
+
}
|
|
876
989
|
/**
|
|
877
990
|
* Get a single wallet address by its id
|
|
878
991
|
* @param params
|
|
@@ -934,14 +1047,11 @@ class Wallet {
|
|
|
934
1047
|
addressParams.gasPrice = gasPrice;
|
|
935
1048
|
}
|
|
936
1049
|
if (!_.isUndefined(forwarderVersion)) {
|
|
937
|
-
if (!_.isInteger(forwarderVersion) || forwarderVersion < 0 || forwarderVersion >
|
|
938
|
-
throw new Error('forwarderVersion has to be an integer 0, 1, 2 or
|
|
1050
|
+
if (!_.isInteger(forwarderVersion) || forwarderVersion < 0 || forwarderVersion > 4) {
|
|
1051
|
+
throw new Error('forwarderVersion has to be an integer 0, 1, 2, 3 or 4');
|
|
939
1052
|
}
|
|
940
1053
|
addressParams.forwarderVersion = forwarderVersion;
|
|
941
1054
|
}
|
|
942
|
-
else if (this._wallet.multisigType === 'tss' && this.baseCoin.getMPCAlgorithm() === 'ecdsa') {
|
|
943
|
-
addressParams.forwarderVersion = 3;
|
|
944
|
-
}
|
|
945
1055
|
if (!_.isUndefined(label)) {
|
|
946
1056
|
if (!_.isString(label)) {
|
|
947
1057
|
throw new Error('label has to be a string');
|
|
@@ -978,9 +1088,6 @@ class Wallet {
|
|
|
978
1088
|
if (!_.isString(onToken)) {
|
|
979
1089
|
throw new Error('onToken has to be a string');
|
|
980
1090
|
}
|
|
981
|
-
if (!statics_1.ofcTokens.includes(onToken)) {
|
|
982
|
-
throw new Error('Unknown OFC token');
|
|
983
|
-
}
|
|
984
1091
|
addressParams.onToken = onToken;
|
|
985
1092
|
}
|
|
986
1093
|
else {
|
|
@@ -994,7 +1101,6 @@ class Wallet {
|
|
|
994
1101
|
const keychains = await Promise.all(this._wallet.keys.map((k) => this.baseCoin.keychains().get({ id: k, reqId })));
|
|
995
1102
|
const rootAddress = _.get(this._wallet, 'receiveAddress.address');
|
|
996
1103
|
const newAddresses = _.times(count, async () => {
|
|
997
|
-
var _a;
|
|
998
1104
|
this.bitgo.setRequestTracer(reqId);
|
|
999
1105
|
const newAddress = (await this.bitgo
|
|
1000
1106
|
.post(this.baseCoin.url('/wallet/' + this._wallet.id + '/address'))
|
|
@@ -1002,15 +1108,16 @@ class Wallet {
|
|
|
1002
1108
|
.result());
|
|
1003
1109
|
// infer its address type
|
|
1004
1110
|
if (_.isObject(newAddress.coinSpecific)) {
|
|
1005
|
-
newAddress.addressType = utils_1.inferAddressType(newAddress);
|
|
1111
|
+
newAddress.addressType = (0, utils_1.inferAddressType)(newAddress);
|
|
1006
1112
|
}
|
|
1007
1113
|
newAddress.keychains = keychains;
|
|
1008
|
-
newAddress.baseAddress = baseAddress
|
|
1114
|
+
newAddress.baseAddress = baseAddress ?? _.get(this._wallet, 'coinSpecific.baseAddress');
|
|
1115
|
+
newAddress.format = addressParams.format;
|
|
1009
1116
|
const verificationData = _.merge({}, newAddress, { rootAddress });
|
|
1010
1117
|
if (verificationData.error) {
|
|
1011
1118
|
throw new errors_1.AddressGenerationError(verificationData.error);
|
|
1012
1119
|
}
|
|
1013
|
-
verificationData.impliedForwarderVersion = forwarderVersion
|
|
1120
|
+
verificationData.impliedForwarderVersion = forwarderVersion ?? verificationData.coinSpecific?.forwarderVersion;
|
|
1014
1121
|
// This condition was added in first place because in celo, when verifyAddress method was called on addresses which were having pendingChainInitialization as true, it used to throw some error
|
|
1015
1122
|
// In case of forwarder version 1 eth addresses, addresses need to be verified even if the pendingChainInitialization flag is true
|
|
1016
1123
|
if (verificationData.coinSpecific &&
|
|
@@ -1018,7 +1125,7 @@ class Wallet {
|
|
|
1018
1125
|
// can't verify addresses which are pending chain initialization, as the address is hidden
|
|
1019
1126
|
let isWalletAddress = false;
|
|
1020
1127
|
try {
|
|
1021
|
-
isWalletAddress = await this.baseCoin.isWalletAddress(verificationData);
|
|
1128
|
+
isWalletAddress = await this.baseCoin.isWalletAddress(verificationData, this);
|
|
1022
1129
|
}
|
|
1023
1130
|
catch (e) {
|
|
1024
1131
|
if (!(e instanceof errors_1.MethodNotImplementedError)) {
|
|
@@ -1057,6 +1164,19 @@ class Wallet {
|
|
|
1057
1164
|
const url = this.url('/address/' + encodeURIComponent(address));
|
|
1058
1165
|
return this.bitgo.put(url).send(putParams).result();
|
|
1059
1166
|
}
|
|
1167
|
+
async updateWalletBuildDefaults(params) {
|
|
1168
|
+
common.validateParams(params, [], ['minFeeRate', 'changeAddressType', 'txFormat']);
|
|
1169
|
+
return this.bitgo
|
|
1170
|
+
.put(this.url())
|
|
1171
|
+
.send({
|
|
1172
|
+
buildDefaults: {
|
|
1173
|
+
minFeeRate: params.minFeeRate,
|
|
1174
|
+
changeAddressType: params.changeAddressType,
|
|
1175
|
+
txFormat: params.txFormat,
|
|
1176
|
+
},
|
|
1177
|
+
})
|
|
1178
|
+
.result();
|
|
1179
|
+
}
|
|
1060
1180
|
/**
|
|
1061
1181
|
* List webhooks on this wallet
|
|
1062
1182
|
* @param params
|
|
@@ -1122,16 +1242,15 @@ class Wallet {
|
|
|
1122
1242
|
return this.bitgo.del(this.url('/webhooks')).send(params).result();
|
|
1123
1243
|
}
|
|
1124
1244
|
/**
|
|
1125
|
-
* Gets the user
|
|
1245
|
+
* Gets the user keychain for this wallet
|
|
1126
1246
|
*
|
|
1127
|
-
* The user
|
|
1247
|
+
* The user keychain is the first keychain of the wallet and usually has the encrypted prv stored on BitGo.
|
|
1128
1248
|
* Useful when trying to get the users' keychain from the server before decrypting to sign a transaction.
|
|
1129
|
-
* @param params
|
|
1130
1249
|
*/
|
|
1131
|
-
async getEncryptedUserKeychain(
|
|
1250
|
+
async getEncryptedUserKeychain() {
|
|
1132
1251
|
const tryKeyChain = async (index) => {
|
|
1133
1252
|
if (!this._wallet.keys || index >= this._wallet.keys.length) {
|
|
1134
|
-
throw new
|
|
1253
|
+
throw new errors_1.MissingEncryptedKeychainError();
|
|
1135
1254
|
}
|
|
1136
1255
|
const params = { id: this._wallet.keys[index] };
|
|
1137
1256
|
const keychain = await this.baseCoin.keychains().get(params);
|
|
@@ -1164,14 +1283,13 @@ class Wallet {
|
|
|
1164
1283
|
if (params.prv) {
|
|
1165
1284
|
return params.prv;
|
|
1166
1285
|
}
|
|
1167
|
-
const userKeychain =
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
try {
|
|
1171
|
-
userPrv = this.bitgo.decrypt({ input: userEncryptedPrv, password: params.walletPassphrase });
|
|
1286
|
+
const userKeychain = await this.getEncryptedUserKeychain();
|
|
1287
|
+
if (!params.walletPassphrase) {
|
|
1288
|
+
throw new Error('wallet passphrase was not provided');
|
|
1172
1289
|
}
|
|
1173
|
-
|
|
1174
|
-
|
|
1290
|
+
const userPrv = (0, keychain_1.decryptKeychainPrivateKey)(this.bitgo, userKeychain, params.walletPassphrase);
|
|
1291
|
+
if (!userPrv) {
|
|
1292
|
+
throw new Error('error decrypting wallet private key');
|
|
1175
1293
|
}
|
|
1176
1294
|
return userPrv;
|
|
1177
1295
|
}
|
|
@@ -1192,13 +1310,149 @@ class Wallet {
|
|
|
1192
1310
|
}
|
|
1193
1311
|
return this.bitgo.post(this.url('/share')).send(params).result();
|
|
1194
1312
|
}
|
|
1313
|
+
/**
|
|
1314
|
+
* Shares a wallet with multiple users by creating bulk wallet shares.
|
|
1315
|
+
*
|
|
1316
|
+
* @async
|
|
1317
|
+
* @param {BulkWalletShareOptions} params - The options for sharing wallets in bulk.
|
|
1318
|
+
* @param {Array<ShareOption>} params.shareOptions - An array of share option objects containing user and permissions information.
|
|
1319
|
+
* @param {Object} [params.shareOptions[].keychain] - The keychain object used to share the wallet.
|
|
1320
|
+
* @param {string} [params.shareOptions[].keychain.toPubKey] - The recipient's public key.
|
|
1321
|
+
* @param {string} [params.shareOptions[].keychain.path] - The derivation path of the keychain.
|
|
1322
|
+
* @param {string} params.shareOptions[].user - The user to share the wallet with.
|
|
1323
|
+
* @param {string} params.shareOptions[].permissions - The permissions granted to the user.
|
|
1324
|
+
* @param {string} [params.walletPassphrase] - The wallet passphrase used to decrypt the keychain.
|
|
1325
|
+
* @throws {Error} If `shareOptions` is empty, or if required keychain parameters (`toPubKey` and `path`) are missing when needed.
|
|
1326
|
+
* @throws {Error} If unable to decrypt the user keychain.
|
|
1327
|
+
* @returns {Promise<CreateBulkWalletShareListResponse>} A promise that resolves with the response of the bulk wallet share creation.
|
|
1328
|
+
*/
|
|
1329
|
+
async createBulkWalletShare(params) {
|
|
1330
|
+
if (params.keyShareOptions.length === 0) {
|
|
1331
|
+
throw new Error('shareOptions cannot be empty');
|
|
1332
|
+
}
|
|
1333
|
+
const bulkCreateShareOptions = [];
|
|
1334
|
+
for (const shareOption of params.keyShareOptions) {
|
|
1335
|
+
common.validateParams(shareOption, ['userId', 'pubKey', 'path'], []);
|
|
1336
|
+
const needsKeychain = shareOption.permissions && shareOption.permissions.includes('spend');
|
|
1337
|
+
if (needsKeychain) {
|
|
1338
|
+
const sharedKeychain = await this.prepareSharedKeychain(params.walletPassphrase, shareOption.pubKey, shareOption.path);
|
|
1339
|
+
const keychain = Object.keys(sharedKeychain ?? {}).length === 0 ? undefined : sharedKeychain;
|
|
1340
|
+
if (keychain) {
|
|
1341
|
+
(0, assert_1.default)(keychain.pub, 'pub must be defined for sharing');
|
|
1342
|
+
(0, assert_1.default)(keychain.encryptedPrv, 'encryptedPrv must be defined for sharing');
|
|
1343
|
+
(0, assert_1.default)(keychain.fromPubKey, 'fromPubKey must be defined for sharing');
|
|
1344
|
+
(0, assert_1.default)(keychain.toPubKey, 'toPubKey must be defined for sharing');
|
|
1345
|
+
(0, assert_1.default)(keychain.path, 'path must be defined for sharing');
|
|
1346
|
+
const bulkKeychain = {
|
|
1347
|
+
pub: keychain.pub,
|
|
1348
|
+
encryptedPrv: keychain.encryptedPrv,
|
|
1349
|
+
fromPubKey: keychain.fromPubKey,
|
|
1350
|
+
toPubKey: keychain.toPubKey,
|
|
1351
|
+
path: keychain.path,
|
|
1352
|
+
};
|
|
1353
|
+
bulkCreateShareOptions.push({
|
|
1354
|
+
user: shareOption.userId,
|
|
1355
|
+
permissions: shareOption.permissions,
|
|
1356
|
+
keychain: bulkKeychain,
|
|
1357
|
+
});
|
|
1358
|
+
}
|
|
1359
|
+
}
|
|
1360
|
+
}
|
|
1361
|
+
return await this.createBulkKeyShares(bulkCreateShareOptions);
|
|
1362
|
+
}
|
|
1363
|
+
/**
|
|
1364
|
+
* Creates bulk wallet share entries for specified share options.
|
|
1365
|
+
* Filters out share options that do not contain valid keychain information or have missing keychain fields.
|
|
1366
|
+
* If all share options are invalid or empty, it throws an error.
|
|
1367
|
+
* Sends a POST request to create the wallet shares for valid share options.
|
|
1368
|
+
*
|
|
1369
|
+
* @async
|
|
1370
|
+
* @param {BulkCreateShareOption[]} [params=[]] - The array of share options to process.
|
|
1371
|
+
* Keychain entries must include the following fields: `pub`, `encryptedPrv`, `fromPubKey`, `toPubKey`, and `path`.
|
|
1372
|
+
* @returns {Promise<CreateBulkWalletShareListResponse>} A promise resolving to the result of the wallet shares creation.
|
|
1373
|
+
* @throws {Error} Throws an error if no valid share options are provided.
|
|
1374
|
+
*/
|
|
1375
|
+
async createBulkKeyShares(params = []) {
|
|
1376
|
+
params = params.filter((shareOption) => {
|
|
1377
|
+
try {
|
|
1378
|
+
common.validateParams(shareOption.keychain, ['pub', 'encryptedPrv', 'fromPubKey', 'toPubKey', 'path'], []);
|
|
1379
|
+
return true;
|
|
1380
|
+
}
|
|
1381
|
+
catch (e) {
|
|
1382
|
+
// Exclude share options with invalid keychain
|
|
1383
|
+
return false;
|
|
1384
|
+
}
|
|
1385
|
+
});
|
|
1386
|
+
if (!params || Object.keys(params).length === 0) {
|
|
1387
|
+
throw new Error('shareOptions cannot be empty');
|
|
1388
|
+
}
|
|
1389
|
+
const url = this.bitgo.url(`/wallet/${this._wallet.id}/walletshares`, 2);
|
|
1390
|
+
return this.bitgo.post(url).send({ shareOptions: params }).result();
|
|
1391
|
+
}
|
|
1392
|
+
/**
|
|
1393
|
+
* Gets keychain with encrypted private key to be shared for wallet sharing.
|
|
1394
|
+
*/
|
|
1395
|
+
async getEncryptedWalletKeychainForWalletSharing() {
|
|
1396
|
+
if (this.baseCoin.getFamily() === 'lnbtc') {
|
|
1397
|
+
// lightning coin does not use user key to sign the transactions from SDK.
|
|
1398
|
+
// it uses user auth key instead.
|
|
1399
|
+
return await (0, lightningWalletUtil_1.getLightningAuthKey)(this, 'userAuth');
|
|
1400
|
+
}
|
|
1401
|
+
else {
|
|
1402
|
+
return await this.getEncryptedUserKeychain();
|
|
1403
|
+
}
|
|
1404
|
+
}
|
|
1405
|
+
async prepareSharedKeychain(walletPassphrase, pubkey, path) {
|
|
1406
|
+
let sharedKeychain = {};
|
|
1407
|
+
try {
|
|
1408
|
+
const keychain = await this.getEncryptedWalletKeychainForWalletSharing();
|
|
1409
|
+
// Decrypt the user key with a passphrase
|
|
1410
|
+
if (keychain.encryptedPrv) {
|
|
1411
|
+
if (!walletPassphrase) {
|
|
1412
|
+
throw new Error('Missing walletPassphrase argument');
|
|
1413
|
+
}
|
|
1414
|
+
const userPrv = (0, keychain_1.decryptKeychainPrivateKey)(this.bitgo, keychain, walletPassphrase);
|
|
1415
|
+
if (!userPrv) {
|
|
1416
|
+
throw new errors_1.IncorrectPasswordError('Password shared is incorrect for this wallet');
|
|
1417
|
+
}
|
|
1418
|
+
keychain.prv = userPrv;
|
|
1419
|
+
const eckey = (0, bitcoin_1.makeRandomKey)();
|
|
1420
|
+
const secret = (0, ecdh_1.getSharedSecret)(eckey, Buffer.from(pubkey, 'hex')).toString('hex');
|
|
1421
|
+
const newEncryptedPrv = this.bitgo.encrypt({ password: secret, input: keychain.prv });
|
|
1422
|
+
// Only one of pub/commonPub/commonKeychain should be present in the keychain
|
|
1423
|
+
let pub = keychain.pub ?? keychain.commonPub;
|
|
1424
|
+
if (keychain.commonKeychain) {
|
|
1425
|
+
pub =
|
|
1426
|
+
this.baseCoin.getMPCAlgorithm() === 'eddsa'
|
|
1427
|
+
? eddsa_1.default.getPublicKeyFromCommonKeychain(keychain.commonKeychain)
|
|
1428
|
+
: ecdsa_1.EcdsaUtils.getPublicKeyFromCommonKeychain(keychain.commonKeychain);
|
|
1429
|
+
}
|
|
1430
|
+
sharedKeychain = {
|
|
1431
|
+
pub,
|
|
1432
|
+
encryptedPrv: newEncryptedPrv,
|
|
1433
|
+
fromPubKey: eckey.publicKey.toString('hex'),
|
|
1434
|
+
toPubKey: pubkey,
|
|
1435
|
+
path: path,
|
|
1436
|
+
};
|
|
1437
|
+
}
|
|
1438
|
+
}
|
|
1439
|
+
catch (e) {
|
|
1440
|
+
if (e instanceof errors_1.MissingEncryptedKeychainError) {
|
|
1441
|
+
sharedKeychain = {};
|
|
1442
|
+
// ignore this error because this looks like a cold wallet
|
|
1443
|
+
}
|
|
1444
|
+
else {
|
|
1445
|
+
throw e;
|
|
1446
|
+
}
|
|
1447
|
+
}
|
|
1448
|
+
return sharedKeychain;
|
|
1449
|
+
}
|
|
1195
1450
|
/**
|
|
1196
1451
|
* Share this wallet with another BitGo user.
|
|
1197
1452
|
* @param params
|
|
1198
1453
|
* @returns {*}
|
|
1199
1454
|
*/
|
|
1200
1455
|
async shareWallet(params = {}) {
|
|
1201
|
-
var _a;
|
|
1202
1456
|
common.validateParams(params, ['email', 'permissions'], ['walletPassphrase', 'message']);
|
|
1203
1457
|
if (params.reshare !== undefined && !_.isBoolean(params.reshare)) {
|
|
1204
1458
|
throw new Error('Expected reshare to be a boolean.');
|
|
@@ -1216,48 +1470,7 @@ class Wallet {
|
|
|
1216
1470
|
const sharing = (await this.bitgo.getSharingKey({ email: params.email.toLowerCase() }));
|
|
1217
1471
|
let sharedKeychain;
|
|
1218
1472
|
if (needsKeychain) {
|
|
1219
|
-
|
|
1220
|
-
const keychain = (await this.getEncryptedUserKeychain({}));
|
|
1221
|
-
// Decrypt the user key with a passphrase
|
|
1222
|
-
if (keychain.encryptedPrv) {
|
|
1223
|
-
if (!params.walletPassphrase) {
|
|
1224
|
-
throw new Error('Missing walletPassphrase argument');
|
|
1225
|
-
}
|
|
1226
|
-
try {
|
|
1227
|
-
keychain.prv = this.bitgo.decrypt({ password: params.walletPassphrase, input: keychain.encryptedPrv });
|
|
1228
|
-
}
|
|
1229
|
-
catch (e) {
|
|
1230
|
-
throw new Error('Unable to decrypt user keychain');
|
|
1231
|
-
}
|
|
1232
|
-
const eckey = bitcoin_1.makeRandomKey();
|
|
1233
|
-
const secret = ecdh_1.getSharedSecret(eckey, Buffer.from(sharing.pubkey, 'hex')).toString('hex');
|
|
1234
|
-
const newEncryptedPrv = this.bitgo.encrypt({ password: secret, input: keychain.prv });
|
|
1235
|
-
// Only one of pub/commonPub/commonKeychain should be present in the keychain
|
|
1236
|
-
let pub = (_a = keychain.pub) !== null && _a !== void 0 ? _a : keychain.commonPub;
|
|
1237
|
-
if (keychain.commonKeychain) {
|
|
1238
|
-
pub =
|
|
1239
|
-
this.baseCoin.getMPCAlgorithm() === 'eddsa'
|
|
1240
|
-
? eddsa_1.default.getPublicKeyFromCommonKeychain(keychain.commonKeychain)
|
|
1241
|
-
: ecdsa_1.EcdsaUtils.getPublicKeyFromCommonKeychain(keychain.commonKeychain);
|
|
1242
|
-
}
|
|
1243
|
-
sharedKeychain = {
|
|
1244
|
-
pub,
|
|
1245
|
-
encryptedPrv: newEncryptedPrv,
|
|
1246
|
-
fromPubKey: eckey.publicKey.toString('hex'),
|
|
1247
|
-
toPubKey: sharing.pubkey,
|
|
1248
|
-
path: sharing.path,
|
|
1249
|
-
};
|
|
1250
|
-
}
|
|
1251
|
-
}
|
|
1252
|
-
catch (e) {
|
|
1253
|
-
if (e.message === 'No encrypted keychains on this wallet.') {
|
|
1254
|
-
sharedKeychain = {};
|
|
1255
|
-
// ignore this error because this looks like a cold wallet
|
|
1256
|
-
}
|
|
1257
|
-
else {
|
|
1258
|
-
throw e;
|
|
1259
|
-
}
|
|
1260
|
-
}
|
|
1473
|
+
sharedKeychain = await this.prepareSharedKeychain(params.walletPassphrase, sharing.pubkey, sharing.path);
|
|
1261
1474
|
}
|
|
1262
1475
|
const options = {
|
|
1263
1476
|
user: sharing.userId,
|
|
@@ -1265,13 +1478,9 @@ class Wallet {
|
|
|
1265
1478
|
reshare: params.reshare,
|
|
1266
1479
|
message: params.message,
|
|
1267
1480
|
disableEmail: params.disableEmail,
|
|
1481
|
+
skipKeychain: Object.keys(sharedKeychain ?? {}).length === 0,
|
|
1482
|
+
keychain: Object.keys(sharedKeychain ?? {}).length === 0 ? undefined : sharedKeychain,
|
|
1268
1483
|
};
|
|
1269
|
-
if (sharedKeychain) {
|
|
1270
|
-
options.keychain = sharedKeychain;
|
|
1271
|
-
}
|
|
1272
|
-
else if (params.skipKeychain) {
|
|
1273
|
-
options.keychain = {};
|
|
1274
|
-
}
|
|
1275
1484
|
return await this.createShare(options);
|
|
1276
1485
|
}
|
|
1277
1486
|
/**
|
|
@@ -1322,10 +1531,10 @@ class Wallet {
|
|
|
1322
1531
|
*/
|
|
1323
1532
|
async prebuildTransaction(params = {}) {
|
|
1324
1533
|
if (this._wallet.multisigType === 'tss') {
|
|
1325
|
-
return this.
|
|
1534
|
+
return this.prebuildTransactionTxRequests(params);
|
|
1326
1535
|
}
|
|
1327
1536
|
// Whitelist params to build tx
|
|
1328
|
-
const whitelistedParams = _.pick(params, this.prebuildWhitelistedParams());
|
|
1537
|
+
const whitelistedParams = this.baseCoin.preprocessBuildParams(_.pick(params, this.prebuildWhitelistedParams()));
|
|
1329
1538
|
debug('prebuilding transaction: %O', whitelistedParams);
|
|
1330
1539
|
if (params.reqId) {
|
|
1331
1540
|
this.bitgo.setRequestTracer(params.reqId);
|
|
@@ -1356,9 +1565,29 @@ class Wallet {
|
|
|
1356
1565
|
if (this._wallet && this._wallet.coinSpecific && !params.walletContractAddress) {
|
|
1357
1566
|
prebuild = _.extend({}, prebuild, { walletContractAddress: this._wallet.coinSpecific.baseAddress });
|
|
1358
1567
|
}
|
|
1568
|
+
prebuild = _.extend({}, prebuild, { reqId: params.reqId });
|
|
1359
1569
|
debug('final transaction prebuild: %O', prebuild);
|
|
1360
1570
|
return prebuild;
|
|
1361
1571
|
}
|
|
1572
|
+
/**
|
|
1573
|
+
* Gets the User Keychain and sign a TSS transaction
|
|
1574
|
+
* @param txRequestId The transaction request id
|
|
1575
|
+
* @param walletPassphrase The wallet passphrase
|
|
1576
|
+
* @return Promise<SignedTransaction>
|
|
1577
|
+
*/
|
|
1578
|
+
async getUserKeyAndSignTssTransaction({ txRequestId, walletPassphrase, }) {
|
|
1579
|
+
if (this._wallet.multisigType !== 'tss') {
|
|
1580
|
+
throw new Error('getUserKeyAndSignTssTransaction is only supported for TSS wallets');
|
|
1581
|
+
}
|
|
1582
|
+
const reqId = new utils_1.RequestTracer();
|
|
1583
|
+
// Doing a sanity check for password here to avoid doing further work if we know it's wrong
|
|
1584
|
+
const keychains = await this.getKeychainsAndValidatePassphrase({ reqId, walletPassphrase });
|
|
1585
|
+
const userKeychain = keychains[0];
|
|
1586
|
+
if (!userKeychain || !userKeychain.encryptedPrv) {
|
|
1587
|
+
throw new Error('the user keychain does not have property encryptedPrv');
|
|
1588
|
+
}
|
|
1589
|
+
return this.signTransaction({ txPrebuild: { txRequestId }, walletPassphrase, reqId, keychain: userKeychain });
|
|
1590
|
+
}
|
|
1362
1591
|
/**
|
|
1363
1592
|
* Sign a transaction
|
|
1364
1593
|
* @param params
|
|
@@ -1368,7 +1597,7 @@ class Wallet {
|
|
|
1368
1597
|
* @return {*}
|
|
1369
1598
|
*/
|
|
1370
1599
|
async signTransaction(params = {}) {
|
|
1371
|
-
const { txPrebuild, apiVersion } = params;
|
|
1600
|
+
const { txPrebuild, apiVersion, txRequestId } = params;
|
|
1372
1601
|
if (_.isFunction(params.customCommitmentGeneratingFunction) &&
|
|
1373
1602
|
_.isFunction(params.customGShareGeneratingFunction) &&
|
|
1374
1603
|
_.isFunction(params.customRShareGeneratingFunction)) {
|
|
@@ -1382,22 +1611,56 @@ class Wallet {
|
|
|
1382
1611
|
// invoke external signer TSS for ECDSA workflow
|
|
1383
1612
|
return this.signTransactionTssExternalSignerECDSA(this.baseCoin, params);
|
|
1384
1613
|
}
|
|
1614
|
+
if (_.isFunction(params.customMPCv2SigningRound1GenerationFunction) &&
|
|
1615
|
+
_.isFunction(params.customMPCv2SigningRound2GenerationFunction) &&
|
|
1616
|
+
_.isFunction(params.customMPCv2SigningRound3GenerationFunction)) {
|
|
1617
|
+
// invoke external signer TSS for ECDSA MPCv2workflow
|
|
1618
|
+
return this.signTransactionTssExternalSignerECDSAMPCv2(this.baseCoin, params);
|
|
1619
|
+
}
|
|
1385
1620
|
if (!txPrebuild || typeof txPrebuild !== 'object') {
|
|
1386
|
-
|
|
1621
|
+
if (this.multisigType() === 'onchain') {
|
|
1622
|
+
throw new Error('txPrebuild is required for on-chain multisig wallets');
|
|
1623
|
+
}
|
|
1624
|
+
if (!txRequestId) {
|
|
1625
|
+
throw new Error('txPrebuild or txRequestId is required for TSS wallets');
|
|
1626
|
+
}
|
|
1627
|
+
// We only do this if we're not using the external signer TSS flow
|
|
1628
|
+
params.txPrebuild = { txRequestId };
|
|
1629
|
+
}
|
|
1630
|
+
if (params.walletPassphrase &&
|
|
1631
|
+
!(params.keychain || params.key) &&
|
|
1632
|
+
(this.type() === 'hot' || this.type() === undefined)) {
|
|
1633
|
+
// this logic should only apply to hot wallets
|
|
1634
|
+
if (!_.isString(params.walletPassphrase)) {
|
|
1635
|
+
throw new Error('walletPassphrase must be a string');
|
|
1636
|
+
}
|
|
1637
|
+
const keychains = await this.getKeychainsAndValidatePassphrase({
|
|
1638
|
+
reqId: params.reqId,
|
|
1639
|
+
walletPassphrase: params.walletPassphrase,
|
|
1640
|
+
});
|
|
1641
|
+
const userKeychain = keychains[0];
|
|
1642
|
+
if (!userKeychain || !userKeychain.encryptedPrv) {
|
|
1643
|
+
throw new Error('the user keychain does not have property encryptedPrv');
|
|
1644
|
+
}
|
|
1645
|
+
params.keychain = userKeychain;
|
|
1387
1646
|
}
|
|
1388
1647
|
const presign = await this.baseCoin.presignTransaction({
|
|
1389
1648
|
...params,
|
|
1390
1649
|
walletData: this._wallet,
|
|
1391
1650
|
tssUtils: this.tssUtils,
|
|
1392
1651
|
});
|
|
1393
|
-
if (this.
|
|
1394
|
-
return this.signTransactionTss({
|
|
1652
|
+
if (this.multisigType() === 'tss') {
|
|
1653
|
+
return this.signTransactionTss({
|
|
1654
|
+
...presign,
|
|
1655
|
+
prv: this.getUserPrv(presign),
|
|
1656
|
+
apiVersion,
|
|
1657
|
+
});
|
|
1395
1658
|
}
|
|
1396
1659
|
let { pubs } = params;
|
|
1397
1660
|
if (!pubs && this.baseCoin.keyIdsForSigning().length > 1) {
|
|
1398
1661
|
const keychains = await this.baseCoin.keychains().getKeysForSigning({ wallet: this });
|
|
1399
1662
|
pubs = keychains.map((k) => {
|
|
1400
|
-
assert_1.default(k.pub);
|
|
1663
|
+
(0, assert_1.default)(k.pub);
|
|
1401
1664
|
return k.pub;
|
|
1402
1665
|
});
|
|
1403
1666
|
}
|
|
@@ -1411,11 +1674,17 @@ class Wallet {
|
|
|
1411
1674
|
if (typeof this.baseCoin.signWithCustomSigningFunction === 'function') {
|
|
1412
1675
|
return this.baseCoin.signWithCustomSigningFunction(params.customSigningFunction, signTransactionParams);
|
|
1413
1676
|
}
|
|
1414
|
-
|
|
1677
|
+
const keys = await this.baseCoin.keychains().getKeysForSigning({ wallet: this });
|
|
1678
|
+
const signTransactionParamsWithSeed = {
|
|
1679
|
+
...signTransactionParams,
|
|
1680
|
+
derivationSeed: keys[0]?.derivedFromParentWithSeed,
|
|
1681
|
+
};
|
|
1682
|
+
return params.customSigningFunction(signTransactionParamsWithSeed);
|
|
1415
1683
|
}
|
|
1416
1684
|
return this.baseCoin.signTransaction({
|
|
1417
1685
|
...signTransactionParams,
|
|
1418
1686
|
prv: this.getUserPrv(presign),
|
|
1687
|
+
wallet: this,
|
|
1419
1688
|
});
|
|
1420
1689
|
}
|
|
1421
1690
|
/**
|
|
@@ -1440,7 +1709,7 @@ class Wallet {
|
|
|
1440
1709
|
}
|
|
1441
1710
|
const keychains = await this.baseCoin.keychains().getKeysForSigning({ wallet: this, reqId: params.reqId });
|
|
1442
1711
|
const userPrvOptions = { ...params, keychain: keychains[0] };
|
|
1443
|
-
assert_1.default(keychains[0].commonKeychain, 'Unable to find commonKeychain in keychains');
|
|
1712
|
+
(0, assert_1.default)(keychains[0].commonKeychain, 'Unable to find commonKeychain in keychains');
|
|
1444
1713
|
const presign = {
|
|
1445
1714
|
...params,
|
|
1446
1715
|
walletData: this._wallet,
|
|
@@ -1475,7 +1744,7 @@ class Wallet {
|
|
|
1475
1744
|
}
|
|
1476
1745
|
const keychains = await this.baseCoin.keychains().getKeysForSigning({ wallet: this, reqId: params.reqId });
|
|
1477
1746
|
const userPrvOptions = { ...params, keychain: keychains[0] };
|
|
1478
|
-
assert_1.default(keychains[0].commonKeychain, 'Unable to find commonKeychain in keychains');
|
|
1747
|
+
(0, assert_1.default)(keychains[0].commonKeychain, 'Unable to find commonKeychain in keychains');
|
|
1479
1748
|
const presign = {
|
|
1480
1749
|
...params,
|
|
1481
1750
|
walletData: this._wallet,
|
|
@@ -1501,9 +1770,11 @@ class Wallet {
|
|
|
1501
1770
|
}
|
|
1502
1771
|
// use the `derivedFromParentWithSeed` property from the user keychain as the `coldDerivationSeed`
|
|
1503
1772
|
// if no other `coldDerivationSeed` was explicitly provided
|
|
1773
|
+
// Only for onchain multisig wallets, TSS key derivation happens during the signing process
|
|
1504
1774
|
if (params.coldDerivationSeed === undefined &&
|
|
1505
1775
|
params.keychain !== undefined &&
|
|
1506
|
-
params.keychain.derivedFromParentWithSeed !== undefined
|
|
1776
|
+
params.keychain.derivedFromParentWithSeed !== undefined &&
|
|
1777
|
+
this.multisigType() === 'onchain') {
|
|
1507
1778
|
params.coldDerivationSeed = params.keychain.derivedFromParentWithSeed;
|
|
1508
1779
|
}
|
|
1509
1780
|
if (userPrv && params.coldDerivationSeed) {
|
|
@@ -1522,7 +1793,10 @@ class Wallet {
|
|
|
1522
1793
|
if (!params.walletPassphrase) {
|
|
1523
1794
|
throw new Error('walletPassphrase property missing');
|
|
1524
1795
|
}
|
|
1525
|
-
userPrv = this.bitgo
|
|
1796
|
+
userPrv = (0, keychain_1.decryptKeychainPrivateKey)(this.bitgo, userKeychain, params.walletPassphrase);
|
|
1797
|
+
if (!userPrv) {
|
|
1798
|
+
throw new Error('failed to decrypt user keychain');
|
|
1799
|
+
}
|
|
1526
1800
|
}
|
|
1527
1801
|
return userPrv;
|
|
1528
1802
|
}
|
|
@@ -1531,7 +1805,6 @@ class Wallet {
|
|
|
1531
1805
|
* @param params
|
|
1532
1806
|
*/
|
|
1533
1807
|
async prebuildAndSignTransaction(params = {}) {
|
|
1534
|
-
var _a, _b, _c;
|
|
1535
1808
|
if (params.eip1559 && params.gasPrice) {
|
|
1536
1809
|
const error = new Error('Only one of params.eip1559 and params.gasPrice may be specified');
|
|
1537
1810
|
error.code = 'both_gasPrice_and_eip1559gasModel_specified';
|
|
@@ -1562,28 +1835,18 @@ class Wallet {
|
|
|
1562
1835
|
error.code = 'recipients_not_allowed_for_fillnonce_and_acceleration_tx_type';
|
|
1563
1836
|
throw error;
|
|
1564
1837
|
}
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
// we ignore this check with if customSigningFunction is provided
|
|
1568
|
-
// which means that the user is handling the signing in external signing mode
|
|
1569
|
-
try {
|
|
1570
|
-
if (keychains[0].encryptedPrv && !params.customSigningFunction && params.walletPassphrase) {
|
|
1571
|
-
this.bitgo.decrypt({ input: keychains[0].encryptedPrv, password: params.walletPassphrase });
|
|
1572
|
-
}
|
|
1573
|
-
}
|
|
1574
|
-
catch (e) {
|
|
1575
|
-
const error = new Error(`unable to decrypt keychain with the given wallet passphrase. Error: ${JSON.stringify(e)}`);
|
|
1576
|
-
error.code = 'wallet_passphrase_incorrect';
|
|
1577
|
-
throw error;
|
|
1838
|
+
if (params.apiVersion) {
|
|
1839
|
+
(0, txRequest_1.validateTxRequestApiVersion)(this, params.apiVersion);
|
|
1578
1840
|
}
|
|
1841
|
+
// Doing a sanity check for password here to avoid doing further work if we know it's wrong
|
|
1842
|
+
const keychains = await this.getKeychainsAndValidatePassphrase({
|
|
1843
|
+
reqId: params.reqId,
|
|
1844
|
+
walletPassphrase: params.walletPassphrase,
|
|
1845
|
+
customSigningFunction: params.customSigningFunction,
|
|
1846
|
+
});
|
|
1579
1847
|
let txPrebuildQuery;
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
if (
|
|
1583
|
-
// verify the wallet must use txRequest Full api and must rebuild the tx before submitting
|
|
1584
|
-
mustUseTxRequestFull &&
|
|
1585
|
-
isPrebuildTransactionResult(params.prebuildTx) &&
|
|
1586
|
-
((_b = params.prebuildTx.buildParams) === null || _b === void 0 ? void 0 : _b.preview)) {
|
|
1848
|
+
if (isPrebuildTransactionResult(params.prebuildTx) && params.prebuildTx.buildParams?.preview) {
|
|
1849
|
+
// If we prebuilt the txRequest with preview=true, then we should rebuild with preview=false to persist the request
|
|
1587
1850
|
txPrebuildQuery = this.prebuildTransaction({
|
|
1588
1851
|
...params,
|
|
1589
1852
|
...{ ...params.prebuildTx.buildParams, preview: false },
|
|
@@ -1596,10 +1859,10 @@ class Wallet {
|
|
|
1596
1859
|
const txPrebuild = (await txPrebuildQuery);
|
|
1597
1860
|
try {
|
|
1598
1861
|
await this.baseCoin.verifyTransaction({
|
|
1599
|
-
txParams: txPrebuild.buildParams
|
|
1862
|
+
txParams: { ...txPrebuild.buildParams, ...params },
|
|
1600
1863
|
txPrebuild,
|
|
1601
1864
|
wallet: this,
|
|
1602
|
-
verification:
|
|
1865
|
+
verification: params.verification ?? {},
|
|
1603
1866
|
reqId: params.reqId,
|
|
1604
1867
|
walletType: this._wallet.multisigType,
|
|
1605
1868
|
});
|
|
@@ -1615,10 +1878,7 @@ class Wallet {
|
|
|
1615
1878
|
const signingParams = {
|
|
1616
1879
|
...params,
|
|
1617
1880
|
txPrebuild,
|
|
1618
|
-
wallet:
|
|
1619
|
-
// this is the version of the multisig address at wallet creation time
|
|
1620
|
-
addressVersion: this._wallet.coinSpecific.addressVersion,
|
|
1621
|
-
},
|
|
1881
|
+
wallet: this,
|
|
1622
1882
|
keychain: keychains[0],
|
|
1623
1883
|
backupKeychain: keychains.length > 1 ? keychains[1] : null,
|
|
1624
1884
|
bitgoKeychain: keychains.length > 2 ? keychains[2] : null,
|
|
@@ -1626,10 +1886,17 @@ class Wallet {
|
|
|
1626
1886
|
};
|
|
1627
1887
|
if (this._wallet.multisigType === 'onchain') {
|
|
1628
1888
|
signingParams.pubs = keychains.map((k) => {
|
|
1629
|
-
assert_1.default(k.pub);
|
|
1889
|
+
(0, assert_1.default)(k.pub);
|
|
1630
1890
|
return k.pub;
|
|
1631
1891
|
});
|
|
1632
1892
|
}
|
|
1893
|
+
if (signingParams.txPrebuild.txRequestId) {
|
|
1894
|
+
(0, assert_1.default)(this.tssUtils, 'tssUtils must be defined for TSS wallets');
|
|
1895
|
+
const txRequest = await this.tssUtils.getTxRequest(signingParams.txPrebuild.txRequestId, params.reqId);
|
|
1896
|
+
if (this.tssUtils.isPendingApprovalTxRequestFull(txRequest)) {
|
|
1897
|
+
return txRequest;
|
|
1898
|
+
}
|
|
1899
|
+
}
|
|
1633
1900
|
try {
|
|
1634
1901
|
return await this.signTransaction(signingParams);
|
|
1635
1902
|
}
|
|
@@ -1650,13 +1917,61 @@ class Wallet {
|
|
|
1650
1917
|
}
|
|
1651
1918
|
}
|
|
1652
1919
|
/**
|
|
1653
|
-
* Accelerate a transaction's confirmation using Child-Pays-For-Parent (CPFP)
|
|
1920
|
+
* Accelerate a transaction's confirmation using Child-Pays-For-Parent (CPFP) or Replace-By-Fee (RBF)
|
|
1654
1921
|
* @param params
|
|
1655
1922
|
*/
|
|
1656
1923
|
async accelerateTransaction(params = {}) {
|
|
1924
|
+
this.validateAccelerationParams(params);
|
|
1925
|
+
params.recipients = [];
|
|
1926
|
+
return await this.submitTransaction({
|
|
1927
|
+
...(await this.prebuildAndSignTransaction(params)),
|
|
1928
|
+
...BuildParams_1.BuildParams.encode(params),
|
|
1929
|
+
});
|
|
1930
|
+
}
|
|
1931
|
+
validateAccelerationParams(params) {
|
|
1932
|
+
if (!params.cpfpTxIds && !params.rbfTxIds) {
|
|
1933
|
+
const error = new Error('must pass cpfpTxIds or rbfTxIds');
|
|
1934
|
+
error.code = 'cpfptxids_or_rbftxids_required';
|
|
1935
|
+
throw error;
|
|
1936
|
+
}
|
|
1937
|
+
if (params.cpfpTxIds && params.rbfTxIds) {
|
|
1938
|
+
const error = new Error('cannot specify both cpfpTxIds and rbfTxIds');
|
|
1939
|
+
error.code = 'cannot_specify_both_cpfp_and_rbf_txids';
|
|
1940
|
+
throw error;
|
|
1941
|
+
}
|
|
1942
|
+
if (params.cpfpTxIds) {
|
|
1943
|
+
this.validateCpfpParams(params);
|
|
1944
|
+
}
|
|
1945
|
+
if (params.rbfTxIds) {
|
|
1946
|
+
this.validateRbfParams(params);
|
|
1947
|
+
}
|
|
1948
|
+
if (params.recipients !== undefined) {
|
|
1949
|
+
if (!Array.isArray(params.recipients) || params.recipients.length !== 0) {
|
|
1950
|
+
throw new Error(`invalid value for 'recipients': must be empty array when set`);
|
|
1951
|
+
}
|
|
1952
|
+
}
|
|
1953
|
+
}
|
|
1954
|
+
validateRbfParams(params) {
|
|
1955
|
+
if (!Array.isArray(params.rbfTxIds) || params.rbfTxIds.length !== 1) {
|
|
1956
|
+
const error = new Error('expecting rbfTxIds to be an array of length 1');
|
|
1957
|
+
error.code = 'rbftxids_not_array';
|
|
1958
|
+
throw error;
|
|
1959
|
+
}
|
|
1960
|
+
if (!params.feeMultiplier) {
|
|
1961
|
+
const error = new Error('feeMultiplier must be set');
|
|
1962
|
+
error.code = 'feemultiplier_not_set';
|
|
1963
|
+
throw error;
|
|
1964
|
+
}
|
|
1965
|
+
if (params.feeMultiplier <= 1) {
|
|
1966
|
+
const error = new Error('feeMultiplier must be a greater than 1');
|
|
1967
|
+
error.code = 'feemultiplier_greater_than_one';
|
|
1968
|
+
throw error;
|
|
1969
|
+
}
|
|
1970
|
+
}
|
|
1971
|
+
validateCpfpParams(params) {
|
|
1657
1972
|
// TODO(BG-9349): change the last check to > 0 and the error message once platform allows multiple transactions to
|
|
1658
|
-
//
|
|
1659
|
-
if (
|
|
1973
|
+
// be bumped in the same CPFP transaction
|
|
1974
|
+
if (!Array.isArray(params.cpfpTxIds) || params.cpfpTxIds.length !== 1) {
|
|
1660
1975
|
const error = new Error('expecting cpfpTxIds to be an array of length 1');
|
|
1661
1976
|
error.code = 'cpfptxids_not_array';
|
|
1662
1977
|
throw error;
|
|
@@ -1689,24 +2004,15 @@ class Wallet {
|
|
|
1689
2004
|
throw error;
|
|
1690
2005
|
}
|
|
1691
2006
|
}
|
|
1692
|
-
if (params.recipients !== undefined) {
|
|
1693
|
-
if (!Array.isArray(params.recipients) || params.recipients.length !== 0) {
|
|
1694
|
-
throw new Error(`invalid value for 'recipients': must be empty array when set`);
|
|
1695
|
-
}
|
|
1696
|
-
}
|
|
1697
|
-
params.recipients = [];
|
|
1698
|
-
// We must pass the build params through to submit in case the CPFP tx ever has to be rebuilt.
|
|
1699
|
-
const submitParams = Object.assign(params, await this.prebuildAndSignTransaction(params));
|
|
1700
|
-
delete submitParams.wallet;
|
|
1701
|
-
return await this.submitTransaction(submitParams);
|
|
1702
2007
|
}
|
|
1703
2008
|
/**
|
|
1704
2009
|
* Submit a half-signed transaction to BitGo
|
|
1705
2010
|
* @param params
|
|
1706
2011
|
* - txHex: transaction hex to submit
|
|
1707
2012
|
* - halfSigned: object containing transaction (txHex or txBase64) to submit
|
|
2013
|
+
* @param reqId - request tracer request id
|
|
1708
2014
|
*/
|
|
1709
|
-
async submitTransaction(params = {}) {
|
|
2015
|
+
async submitTransaction(params = {}, reqId) {
|
|
1710
2016
|
common.validateParams(params, [], ['otp', 'txHex', 'txRequestId']);
|
|
1711
2017
|
const hasTxHex = !!params.txHex;
|
|
1712
2018
|
const hasHalfSigned = !!params.halfSigned;
|
|
@@ -1716,10 +2022,7 @@ class Wallet {
|
|
|
1716
2022
|
else if (!params.txRequestId && ((hasTxHex && hasHalfSigned) || (!hasTxHex && !hasHalfSigned))) {
|
|
1717
2023
|
throw new Error('must supply either txHex or halfSigned, but not both');
|
|
1718
2024
|
}
|
|
1719
|
-
return this.
|
|
1720
|
-
.post(this.baseCoin.url('/wallet/' + this.id() + '/tx/send'))
|
|
1721
|
-
.send(params)
|
|
1722
|
-
.result();
|
|
2025
|
+
return this.sendTransaction(params, reqId);
|
|
1723
2026
|
}
|
|
1724
2027
|
/**
|
|
1725
2028
|
* Send coins to a recipient
|
|
@@ -1744,13 +2047,15 @@ class Wallet {
|
|
|
1744
2047
|
throw new Error('missing required parameter address');
|
|
1745
2048
|
}
|
|
1746
2049
|
const coin = this.baseCoin;
|
|
1747
|
-
const amount = new bignumber_js_1.
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
2050
|
+
const amount = new bignumber_js_1.default(params.amount);
|
|
2051
|
+
const isAmountNegative = amount.isNegative();
|
|
2052
|
+
const isAmountZero = amount.isZero();
|
|
2053
|
+
const isAmountDecimal = !amount.isInteger();
|
|
2054
|
+
_.some([isAmountNegative, !coin.valuelessTransferAllowed() && isAmountZero, isAmountDecimal], (condition) => {
|
|
2055
|
+
if (condition) {
|
|
2056
|
+
throw new Error('invalid argument for amount - Integer greater than zero or numeric string expected');
|
|
2057
|
+
}
|
|
2058
|
+
});
|
|
1754
2059
|
const recipients = [
|
|
1755
2060
|
{
|
|
1756
2061
|
address: params.address,
|
|
@@ -1766,6 +2071,97 @@ class Wallet {
|
|
|
1766
2071
|
const sendManyOptions = Object.assign({}, params, { recipients });
|
|
1767
2072
|
return this.sendMany(sendManyOptions);
|
|
1768
2073
|
}
|
|
2074
|
+
/**
|
|
2075
|
+
* Send an ERC-721 NFT or ERC-1155 NFT(s).
|
|
2076
|
+
*
|
|
2077
|
+
* This function constructs the appropriate call data for an ERC-721/1155 token transfer,
|
|
2078
|
+
* and calls the token contract with the data, and amount 0. This transaction will always produce
|
|
2079
|
+
* a pending approval.
|
|
2080
|
+
*
|
|
2081
|
+
* @param sendOptions Options to specify how the transaction should be sent.
|
|
2082
|
+
* @param sendNftOptions Options to specify the NFT(s) to be sent.
|
|
2083
|
+
*
|
|
2084
|
+
* @return A pending approval for the transaction.
|
|
2085
|
+
*/
|
|
2086
|
+
async sendNft(sendOptions, sendNftOptions) {
|
|
2087
|
+
const nftCollections = await this.getNftBalances();
|
|
2088
|
+
const { tokenContractAddress, recipientAddress, type } = sendNftOptions;
|
|
2089
|
+
const nftBalance = nftCollections.find((c) => c.metadata.tokenContractAddress === tokenContractAddress);
|
|
2090
|
+
if (!nftBalance) {
|
|
2091
|
+
throw new Error(`Collection not found for token contract ${tokenContractAddress}`);
|
|
2092
|
+
}
|
|
2093
|
+
if (!this.baseCoin.isValidAddress(recipientAddress)) {
|
|
2094
|
+
throw new Error(`Invalid recipient address ${recipientAddress}`);
|
|
2095
|
+
}
|
|
2096
|
+
const baseAddress = this.coinSpecific()?.baseAddress || this.coinSpecific()?.rootAddress;
|
|
2097
|
+
if (!baseAddress) {
|
|
2098
|
+
throw new Error('Missing base address for wallet');
|
|
2099
|
+
}
|
|
2100
|
+
if (nftBalance.type !== type) {
|
|
2101
|
+
throw new Error(`Specified NFT type ${type} does not match collection type ${nftBalance.type}`);
|
|
2102
|
+
}
|
|
2103
|
+
switch (sendNftOptions.type) {
|
|
2104
|
+
case 'ERC721': {
|
|
2105
|
+
if (!nftBalance.collections[sendNftOptions.tokenId]) {
|
|
2106
|
+
throw new Error(`Token ${sendNftOptions.tokenId} not found in collection ${tokenContractAddress} or does not have a spendable balance`);
|
|
2107
|
+
}
|
|
2108
|
+
const data = this.baseCoin.buildNftTransferData({ ...sendNftOptions, fromAddress: baseAddress });
|
|
2109
|
+
return this.sendMany({
|
|
2110
|
+
...sendOptions,
|
|
2111
|
+
recipients: [
|
|
2112
|
+
{
|
|
2113
|
+
address: sendNftOptions.tokenContractAddress,
|
|
2114
|
+
amount: '0',
|
|
2115
|
+
data: data,
|
|
2116
|
+
},
|
|
2117
|
+
],
|
|
2118
|
+
});
|
|
2119
|
+
}
|
|
2120
|
+
case 'ERC1155': {
|
|
2121
|
+
const entries = sendNftOptions.entries;
|
|
2122
|
+
for (const entry of entries) {
|
|
2123
|
+
if (!nftBalance.collections[entry.tokenId]) {
|
|
2124
|
+
throw new Error(`Token ${entry.tokenId} not found in collection ${sendNftOptions.tokenContractAddress} or does not have a spendable balance`);
|
|
2125
|
+
}
|
|
2126
|
+
if (nftBalance.collections[entry.tokenId] < entry.amount) {
|
|
2127
|
+
throw new Error(`Amount ${entry.amount} exceeds spendable balance of ${nftBalance.collections[entry.tokenId]} for token ${entry.tokenId}`);
|
|
2128
|
+
}
|
|
2129
|
+
}
|
|
2130
|
+
const data = this.baseCoin.buildNftTransferData({ ...sendNftOptions, fromAddress: baseAddress });
|
|
2131
|
+
return this.sendMany({
|
|
2132
|
+
...sendOptions,
|
|
2133
|
+
recipients: [
|
|
2134
|
+
{
|
|
2135
|
+
address: sendNftOptions.tokenContractAddress,
|
|
2136
|
+
amount: '0',
|
|
2137
|
+
data: data,
|
|
2138
|
+
},
|
|
2139
|
+
],
|
|
2140
|
+
});
|
|
2141
|
+
}
|
|
2142
|
+
case utils_1.TokenType.DIGITAL_ASSET: {
|
|
2143
|
+
if (!nftBalance.collections[sendNftOptions.tokenId]) {
|
|
2144
|
+
throw new Error(`Token ${sendNftOptions.tokenId} not found in collection ${tokenContractAddress} or does not have a spendable balance`);
|
|
2145
|
+
}
|
|
2146
|
+
const tokenData = {
|
|
2147
|
+
tokenType: sendNftOptions.type,
|
|
2148
|
+
tokenQuantity: '1', // This NFT standard will always have quantity of 1
|
|
2149
|
+
tokenContractAddress,
|
|
2150
|
+
tokenId: sendNftOptions.tokenId,
|
|
2151
|
+
};
|
|
2152
|
+
return this.sendMany({
|
|
2153
|
+
...sendOptions,
|
|
2154
|
+
recipients: [
|
|
2155
|
+
{
|
|
2156
|
+
address: recipientAddress,
|
|
2157
|
+
amount: '1', // the amount needs to be non-zero for the transaction to be valid, it is ignored
|
|
2158
|
+
tokenData,
|
|
2159
|
+
},
|
|
2160
|
+
],
|
|
2161
|
+
});
|
|
2162
|
+
}
|
|
2163
|
+
}
|
|
2164
|
+
}
|
|
1769
2165
|
/**
|
|
1770
2166
|
* Send money to multiple recipients
|
|
1771
2167
|
* 1. Gets the user keychain by checking the wallet for a key which has an encrypted prv
|
|
@@ -1807,28 +2203,23 @@ class Wallet {
|
|
|
1807
2203
|
this.bitgo.setRequestTracer(reqId);
|
|
1808
2204
|
const coin = this.baseCoin;
|
|
1809
2205
|
if (_.isObject(params.recipients)) {
|
|
1810
|
-
params.recipients.
|
|
1811
|
-
|
|
1812
|
-
if (amount.isNegative()) {
|
|
1813
|
-
throw new Error('invalid argument for amount - positive number greater than zero or numeric string expected');
|
|
1814
|
-
}
|
|
1815
|
-
if (!coin.valuelessTransferAllowed() && amount.isZero()) {
|
|
1816
|
-
throw new Error('invalid argument for amount - positive number greater than zero or numeric string expected');
|
|
1817
|
-
}
|
|
2206
|
+
params.recipients.forEach(function (recipient) {
|
|
2207
|
+
coin.checkRecipient(recipient);
|
|
1818
2208
|
});
|
|
1819
2209
|
}
|
|
1820
2210
|
if (this._wallet.multisigType === 'tss') {
|
|
1821
|
-
return this.
|
|
2211
|
+
return this.sendManyTxRequests(params);
|
|
1822
2212
|
}
|
|
1823
2213
|
const selectParams = _.pick(params, [...this.prebuildWhitelistedParams(), 'comment', 'otp', 'hop']);
|
|
1824
2214
|
if (this._wallet.type === 'custodial') {
|
|
1825
2215
|
const extraParams = await this.baseCoin.getExtraPrebuildParams(Object.assign(params, { wallet: this }));
|
|
1826
2216
|
Object.assign(selectParams, extraParams);
|
|
1827
|
-
return
|
|
2217
|
+
return this.initiateTransaction(selectParams, reqId);
|
|
1828
2218
|
}
|
|
1829
2219
|
const halfSignedTransaction = await this.prebuildAndSignTransaction(params);
|
|
1830
|
-
const
|
|
1831
|
-
|
|
2220
|
+
const extraParams = await this.baseCoin.getExtraPrebuildParams(Object.assign(params, { wallet: this }));
|
|
2221
|
+
const finalTxParams = _.extend({}, halfSignedTransaction, selectParams, extraParams);
|
|
2222
|
+
return this.sendTransaction(finalTxParams, reqId);
|
|
1832
2223
|
}
|
|
1833
2224
|
/**
|
|
1834
2225
|
* Recover an unsupported token from a BitGo multisig wallet
|
|
@@ -1977,17 +2368,34 @@ class Wallet {
|
|
|
1977
2368
|
if (this.baseCoin.getFamily() !== 'ofc') {
|
|
1978
2369
|
throw new Error('Can only convert an Offchain (OFC) wallet to a trading account');
|
|
1979
2370
|
}
|
|
1980
|
-
return new
|
|
2371
|
+
return new trading_1.TradingAccount(this._wallet.enterprise, this, this.bitgo);
|
|
2372
|
+
}
|
|
2373
|
+
/**
|
|
2374
|
+
* Get the address book for this wallet
|
|
2375
|
+
*/
|
|
2376
|
+
toAddressBook() {
|
|
2377
|
+
if (this.baseCoin.getFamily() !== 'ofc') {
|
|
2378
|
+
throw new Error('Can only use an Offchain (OFC) wallet for the address book');
|
|
2379
|
+
}
|
|
2380
|
+
return new address_book_1.AddressBook(this._wallet.enterprise, this.bitgo, this);
|
|
1981
2381
|
}
|
|
1982
2382
|
/**
|
|
1983
2383
|
* Create a staking wallet from this wallet
|
|
1984
2384
|
*/
|
|
1985
2385
|
toStakingWallet() {
|
|
1986
|
-
|
|
1987
|
-
const isEthTss = this.baseCoin.getFamily() == 'eth' && ((_a = this._wallet.coinSpecific) === null || _a === void 0 ? void 0 : _a.walletVersion)
|
|
2386
|
+
const isEthTss = this.baseCoin.getFamily() == 'eth' && this._wallet.coinSpecific?.walletVersion
|
|
1988
2387
|
? this._wallet.coinSpecific.walletVersion >= 3
|
|
1989
2388
|
: false;
|
|
1990
|
-
return new
|
|
2389
|
+
return new staking_1.StakingWallet(this, isEthTss);
|
|
2390
|
+
}
|
|
2391
|
+
/**
|
|
2392
|
+
* Create a go staking wallet from this wallet
|
|
2393
|
+
*/
|
|
2394
|
+
toGoStakingWallet() {
|
|
2395
|
+
if (this.baseCoin.getFamily() !== 'ofc') {
|
|
2396
|
+
throw new Error('Can only convert an Offchain (OFC) wallet to a staking wallet');
|
|
2397
|
+
}
|
|
2398
|
+
return new staking_1.GoStakingWallet(this);
|
|
1991
2399
|
}
|
|
1992
2400
|
/**
|
|
1993
2401
|
* Creates and downloads PDF keycard for wallet (requires response from wallets.generateWallet)
|
|
@@ -2042,7 +2450,7 @@ class Wallet {
|
|
|
2042
2450
|
const coinShortName = this.baseCoin.type;
|
|
2043
2451
|
const coinName = this.baseCoin.getFullName();
|
|
2044
2452
|
const walletLabel = this._wallet.label;
|
|
2045
|
-
const doc =
|
|
2453
|
+
const doc = (0, internal_1.drawKeycard)({
|
|
2046
2454
|
jsPDF,
|
|
2047
2455
|
QRCode,
|
|
2048
2456
|
encrypt: this.bitgo.encrypt,
|
|
@@ -2081,6 +2489,9 @@ class Wallet {
|
|
|
2081
2489
|
.post(this.baseCoin.url('/wallet/' + this.id() + '/consolidateAccount/build'))
|
|
2082
2490
|
.send(whitelistedParams)
|
|
2083
2491
|
.result());
|
|
2492
|
+
if (buildResponse.length === 0) {
|
|
2493
|
+
throw new Error('No receive addresses with balance found to consolidate.');
|
|
2494
|
+
}
|
|
2084
2495
|
// we need to step over each prebuild now - should be in an array in the body
|
|
2085
2496
|
const consolidations = [];
|
|
2086
2497
|
for (const consolidateAccountBuild of buildResponse) {
|
|
@@ -2106,7 +2517,7 @@ class Wallet {
|
|
|
2106
2517
|
}
|
|
2107
2518
|
if (this._wallet.type === 'custodial' && this._wallet.multisigType !== 'tss') {
|
|
2108
2519
|
params.type = 'consolidate';
|
|
2109
|
-
return
|
|
2520
|
+
return this.initiateTransaction(params, params.reqId);
|
|
2110
2521
|
}
|
|
2111
2522
|
// one of a set of consolidation transactions
|
|
2112
2523
|
if (typeof params.prebuildTx === 'string' || params.prebuildTx === undefined) {
|
|
@@ -2119,13 +2530,13 @@ class Wallet {
|
|
|
2119
2530
|
if (!params.prebuildTx.txRequestId) {
|
|
2120
2531
|
throw new Error('Consolidation request missing txRequestId.');
|
|
2121
2532
|
}
|
|
2122
|
-
return await this.
|
|
2533
|
+
return await this.sendManyTxRequests(params);
|
|
2123
2534
|
}
|
|
2124
2535
|
const signedPrebuild = (await this.prebuildAndSignTransaction(params));
|
|
2125
2536
|
// decorate with our consolidation id
|
|
2126
2537
|
signedPrebuild.consolidateId = params.prebuildTx.consolidateId;
|
|
2127
2538
|
delete signedPrebuild.wallet;
|
|
2128
|
-
return await this.submitTransaction(signedPrebuild);
|
|
2539
|
+
return await this.submitTransaction(signedPrebuild, params.reqId);
|
|
2129
2540
|
}
|
|
2130
2541
|
/**
|
|
2131
2542
|
* Builds and sends a set of account consolidations. This is intended to flush many balances to the root wallet balance.
|
|
@@ -2136,14 +2547,23 @@ class Wallet {
|
|
|
2136
2547
|
if (!this.baseCoin.allowsAccountConsolidations()) {
|
|
2137
2548
|
throw new Error(`${this.baseCoin.getFullName()} does not allow account consolidations.`);
|
|
2138
2549
|
}
|
|
2550
|
+
const apiVersion = params.apiVersion ??
|
|
2551
|
+
(this.tssUtils && this.tssUtils.supportedTxRequestVersions().includes('full') ? 'full' : undefined);
|
|
2552
|
+
// Doing a sanity check for password here to avoid doing further work if we know it's wrong
|
|
2553
|
+
await this.getKeychainsAndValidatePassphrase({
|
|
2554
|
+
reqId: params.reqId,
|
|
2555
|
+
walletPassphrase: params.walletPassphrase,
|
|
2556
|
+
customSigningFunction: params.customSigningFunction,
|
|
2557
|
+
});
|
|
2139
2558
|
// this gives us a set of account consolidation transactions
|
|
2140
|
-
const unsignedBuilds =
|
|
2559
|
+
const unsignedBuilds = await this.buildAccountConsolidations({ ...params, apiVersion: apiVersion });
|
|
2141
2560
|
if (unsignedBuilds && unsignedBuilds.length > 0) {
|
|
2142
2561
|
const successfulTxs = [];
|
|
2143
2562
|
const failedTxs = new Array();
|
|
2144
2563
|
for (const unsignedBuild of unsignedBuilds) {
|
|
2145
2564
|
// fold any of the parameters we used to build this transaction into the unsignedBuild
|
|
2146
2565
|
const unsignedBuildWithOptions = Object.assign({}, params);
|
|
2566
|
+
unsignedBuildWithOptions.apiVersion = apiVersion;
|
|
2147
2567
|
unsignedBuildWithOptions.prebuildTx = unsignedBuild;
|
|
2148
2568
|
try {
|
|
2149
2569
|
const sendTx = await this.sendAccountConsolidation(unsignedBuildWithOptions);
|
|
@@ -2200,8 +2620,10 @@ class Wallet {
|
|
|
2200
2620
|
else {
|
|
2201
2621
|
// Rewrite tokens into recipients for buildTransaction
|
|
2202
2622
|
buildParams.recipients = params.enableTokens.map((token) => {
|
|
2203
|
-
|
|
2204
|
-
|
|
2623
|
+
// If token has non address, take the first wallet address is stored in its coin-specific property
|
|
2624
|
+
// In account-based coin implementations that use wallet contracts, the address is called baseAddress (e.g. eth-like, xtz)
|
|
2625
|
+
// for others it's called rootAddress (e.g. xrp, xlm, algo, trx)
|
|
2626
|
+
const address = token.address || this._wallet.coinSpecific?.baseAddress || this._wallet.coinSpecific?.rootAddress;
|
|
2205
2627
|
if (!address) {
|
|
2206
2628
|
throw new Error('Wallet does not have base address, must specify with token param');
|
|
2207
2629
|
}
|
|
@@ -2225,26 +2647,25 @@ class Wallet {
|
|
|
2225
2647
|
* - The response from initiating the transaction for custodial wallets
|
|
2226
2648
|
*/
|
|
2227
2649
|
async sendTokenEnablement(params = {}) {
|
|
2228
|
-
var _a, _b;
|
|
2229
2650
|
const teConfig = this.baseCoin.getTokenEnablementConfig();
|
|
2230
2651
|
if (!teConfig.requiresTokenEnablement) {
|
|
2231
2652
|
throw new Error(`${this.baseCoin.getFullName()} does not require token enablement transactions`);
|
|
2232
2653
|
}
|
|
2233
|
-
if (typeof params.prebuildTx === 'string' ||
|
|
2654
|
+
if (typeof params.prebuildTx === 'string' || params.prebuildTx?.buildParams?.type !== 'enabletoken') {
|
|
2234
2655
|
throw new Error('Invalid build of token enablement.');
|
|
2235
2656
|
}
|
|
2236
2657
|
if (this._wallet.multisigType === 'tss') {
|
|
2237
|
-
return await this.
|
|
2658
|
+
return await this.sendManyTxRequests(params);
|
|
2238
2659
|
}
|
|
2239
2660
|
else {
|
|
2240
2661
|
switch (this._wallet.type) {
|
|
2241
2662
|
case 'hot':
|
|
2242
2663
|
case 'cold':
|
|
2243
2664
|
const signedPrebuild = await this.prebuildAndSignTransaction(params);
|
|
2244
|
-
return await this.submitTransaction(signedPrebuild);
|
|
2665
|
+
return await this.submitTransaction(signedPrebuild, params.reqId);
|
|
2245
2666
|
case 'custodial':
|
|
2246
|
-
|
|
2247
|
-
return
|
|
2667
|
+
case 'backing':
|
|
2668
|
+
return this.initiateTransaction(params.prebuildTx.buildParams, params.reqId);
|
|
2248
2669
|
}
|
|
2249
2670
|
}
|
|
2250
2671
|
}
|
|
@@ -2281,33 +2702,16 @@ class Wallet {
|
|
|
2281
2702
|
failure: failedTxs,
|
|
2282
2703
|
};
|
|
2283
2704
|
}
|
|
2284
|
-
/**
|
|
2285
|
-
* Create lightning for btc/tbtc from this wallet
|
|
2286
|
-
*/
|
|
2287
|
-
lightning() {
|
|
2288
|
-
if (!this.baseCoin.supportsLightning()) {
|
|
2289
|
-
throw new Error(`Lightning not supported for ${this.coin()}`);
|
|
2290
|
-
}
|
|
2291
|
-
return new lightning_1.Lightning(this.bitgo, this);
|
|
2292
|
-
}
|
|
2293
2705
|
/* MARK: TSS Helpers */
|
|
2294
2706
|
/**
|
|
2295
2707
|
* Prebuilds a transaction for a TSS wallet.
|
|
2296
2708
|
*
|
|
2297
2709
|
* @param params prebuild transaction options
|
|
2298
2710
|
*/
|
|
2299
|
-
async
|
|
2300
|
-
var _a, _b, _c;
|
|
2711
|
+
async prebuildTransactionTxRequests(params = {}) {
|
|
2301
2712
|
const reqId = params.reqId || new utils_1.RequestTracer();
|
|
2302
2713
|
this.bitgo.setRequestTracer(reqId);
|
|
2303
|
-
|
|
2304
|
-
(this._wallet.type === 'custodial' || this._wallet.type === 'cold' || this.baseCoin.getMPCAlgorithm() === 'ecdsa')) {
|
|
2305
|
-
throw new Error(`Custodial and ECDSA MPC algorithm must always use 'full' api version`);
|
|
2306
|
-
}
|
|
2307
|
-
const apiVersion = params.apiVersion ||
|
|
2308
|
-
(this._wallet.type === 'custodial' || this._wallet.type === 'cold' || this.baseCoin.getMPCAlgorithm() === 'ecdsa'
|
|
2309
|
-
? 'full'
|
|
2310
|
-
: 'lite');
|
|
2714
|
+
const apiVersion = (0, txRequest_1.getTxRequestApiVersion)(this, params.apiVersion);
|
|
2311
2715
|
// Two options different implementations of fees seems to now be supported, for now we will support both to be backwards compatible
|
|
2312
2716
|
// TODO(BG-59685): deprecate one of these so that we have a single way to pass fees
|
|
2313
2717
|
let feeOptions;
|
|
@@ -2319,8 +2723,8 @@ class Wallet {
|
|
|
2319
2723
|
params.gasPrice !== undefined
|
|
2320
2724
|
? { gasPrice: params.gasPrice, gasLimit: params.gasLimit }
|
|
2321
2725
|
: {
|
|
2322
|
-
maxFeePerGas: Number(
|
|
2323
|
-
maxPriorityFeePerGas: Number(
|
|
2726
|
+
maxFeePerGas: Number(params.eip1559?.maxFeePerGas),
|
|
2727
|
+
maxPriorityFeePerGas: Number(params.eip1559?.maxPriorityFeePerGas),
|
|
2324
2728
|
gasLimit: params.gasLimit,
|
|
2325
2729
|
};
|
|
2326
2730
|
}
|
|
@@ -2343,6 +2747,8 @@ class Wallet {
|
|
|
2343
2747
|
nonce: params.nonce,
|
|
2344
2748
|
feeOptions,
|
|
2345
2749
|
custodianTransactionId: params.custodianTransactionId,
|
|
2750
|
+
unspents: params.unspents,
|
|
2751
|
+
senderAddress: params.senderAddress,
|
|
2346
2752
|
}, apiVersion, params.preview);
|
|
2347
2753
|
break;
|
|
2348
2754
|
case 'transfertoken':
|
|
@@ -2389,7 +2795,7 @@ class Wallet {
|
|
|
2389
2795
|
}
|
|
2390
2796
|
let unsignedTx;
|
|
2391
2797
|
if (txRequest.apiVersion === 'full') {
|
|
2392
|
-
if (
|
|
2798
|
+
if (txRequest.transactions?.length !== 1) {
|
|
2393
2799
|
throw new Error(`Expected a single unsigned tx for tx request with id: ${txRequest.txRequestId}`);
|
|
2394
2800
|
}
|
|
2395
2801
|
unsignedTx = txRequest.transactions[0].unsignedTx;
|
|
@@ -2408,6 +2814,7 @@ class Wallet {
|
|
|
2408
2814
|
txHex: unsignedTx.serializedTxHex,
|
|
2409
2815
|
buildParams: whitelistedParams,
|
|
2410
2816
|
feeInfo: unsignedTx.feeInfo,
|
|
2817
|
+
...(txRequest.pendingApprovalId && { pendingApprovalId: txRequest.pendingApprovalId }),
|
|
2411
2818
|
};
|
|
2412
2819
|
}
|
|
2413
2820
|
/**
|
|
@@ -2435,15 +2842,45 @@ class Wallet {
|
|
|
2435
2842
|
if (!params.customGShareGeneratingFunction) {
|
|
2436
2843
|
throw new Error('Generator function for G share required to sign transactions with External Signer.');
|
|
2437
2844
|
}
|
|
2845
|
+
(0, assert_1.default)(this.tssUtils, 'tssUtils must be defined');
|
|
2846
|
+
// adding this to rebuild the transaction just before signing for EdDSA transaction using external signer
|
|
2847
|
+
const reqId = params.reqId || undefined;
|
|
2848
|
+
await this.tssUtils.deleteSignatureShares(txRequestId, reqId);
|
|
2438
2849
|
try {
|
|
2439
|
-
|
|
2440
|
-
const signedTxRequest = await this.tssUtils.signEddsaTssUsingExternalSigner(txRequestId, params.customCommitmentGeneratingFunction, params.customRShareGeneratingFunction, params.customGShareGeneratingFunction);
|
|
2850
|
+
const signedTxRequest = await this.tssUtils.signEddsaTssUsingExternalSigner(txRequestId, params.customCommitmentGeneratingFunction, params.customRShareGeneratingFunction, params.customGShareGeneratingFunction, reqId);
|
|
2441
2851
|
return signedTxRequest;
|
|
2442
2852
|
}
|
|
2443
2853
|
catch (e) {
|
|
2444
2854
|
throw new Error('failed to sign transaction ' + e);
|
|
2445
2855
|
}
|
|
2446
2856
|
}
|
|
2857
|
+
/**
|
|
2858
|
+
* Signs and sends a transaction request from a TSS (hot) wallet, or a SMC (cold) wallet with an external signer.
|
|
2859
|
+
* Meant to be used for a transaction request where the signing process is aborted.
|
|
2860
|
+
*
|
|
2861
|
+
* @param params
|
|
2862
|
+
* txRequestId - The ID of the transaction request.
|
|
2863
|
+
* walletPassphrase - The passphrase for the wallet.
|
|
2864
|
+
* isTxRequestFull - Flag indicating if the transaction request is full.
|
|
2865
|
+
* @returns A promise that resolves to a SignedTransaction.
|
|
2866
|
+
*/
|
|
2867
|
+
async signAndSendTxRequest(params) {
|
|
2868
|
+
if (params.isTxRequestFull) {
|
|
2869
|
+
await this.tssUtils?.deleteSignatureShares(params.txRequestId);
|
|
2870
|
+
}
|
|
2871
|
+
const ret = await this.getUserKeyAndSignTssTransaction({
|
|
2872
|
+
walletPassphrase: params.walletPassphrase,
|
|
2873
|
+
txRequestId: params.txRequestId,
|
|
2874
|
+
});
|
|
2875
|
+
if (!params.isTxRequestFull) {
|
|
2876
|
+
// It is assumed that if its not a full tx request, then it is a lite tx request
|
|
2877
|
+
const submitTx = await this.submitTransaction({
|
|
2878
|
+
txRequestId: params.txRequestId,
|
|
2879
|
+
});
|
|
2880
|
+
return submitTx;
|
|
2881
|
+
}
|
|
2882
|
+
return ret;
|
|
2883
|
+
}
|
|
2447
2884
|
/**
|
|
2448
2885
|
* Signs a transaction from a TSS ECDSA wallet using external signer.
|
|
2449
2886
|
*
|
|
@@ -2473,11 +2910,10 @@ class Wallet {
|
|
|
2473
2910
|
throw new Error('Generator function for S share required to sign transactions with External Signer.');
|
|
2474
2911
|
}
|
|
2475
2912
|
try {
|
|
2476
|
-
assert_1.default(this.tssUtils, 'tssUtils must be defined');
|
|
2913
|
+
(0, assert_1.default)(this.tssUtils, 'tssUtils must be defined');
|
|
2477
2914
|
const signedTxRequest = await this.tssUtils.signEcdsaTssUsingExternalSigner({
|
|
2478
2915
|
txRequest: txRequestId,
|
|
2479
|
-
|
|
2480
|
-
reqId: new utils_1.RequestTracer(),
|
|
2916
|
+
reqId: params.reqId || new utils_1.RequestTracer(),
|
|
2481
2917
|
}, utils_1.RequestType.tx, params.customPaillierModulusGeneratingFunction, params.customKShareGeneratingFunction, params.customMuDeltaShareGeneratingFunction, params.customSShareGeneratingFunction);
|
|
2482
2918
|
return signedTxRequest;
|
|
2483
2919
|
}
|
|
@@ -2485,6 +2921,43 @@ class Wallet {
|
|
|
2485
2921
|
throw new Error('failed to sign transaction ' + e);
|
|
2486
2922
|
}
|
|
2487
2923
|
}
|
|
2924
|
+
/**
|
|
2925
|
+
* Signs a transaction from a TSS ECDSA wallet using external signer.
|
|
2926
|
+
*
|
|
2927
|
+
* @param params signing options
|
|
2928
|
+
*/
|
|
2929
|
+
async signTransactionTssExternalSignerECDSAMPCv2(coin, params = {}) {
|
|
2930
|
+
let txRequestId = '';
|
|
2931
|
+
if (params.txRequestId) {
|
|
2932
|
+
txRequestId = params.txRequestId;
|
|
2933
|
+
}
|
|
2934
|
+
else if (params.txPrebuild && params.txPrebuild.txRequestId) {
|
|
2935
|
+
txRequestId = params.txPrebuild.txRequestId;
|
|
2936
|
+
}
|
|
2937
|
+
else {
|
|
2938
|
+
throw new Error('TxRequestId required to sign TSS transactions with External Signer.');
|
|
2939
|
+
}
|
|
2940
|
+
if (!params.customMPCv2SigningRound1GenerationFunction) {
|
|
2941
|
+
throw new Error('Generator function for MPCv2 Round 1 share required to sign transactions with External Signer.');
|
|
2942
|
+
}
|
|
2943
|
+
if (!params.customMPCv2SigningRound2GenerationFunction) {
|
|
2944
|
+
throw new Error('Generator function for MPCv2 Round 2 share required to sign transactions with External Signer.');
|
|
2945
|
+
}
|
|
2946
|
+
if (!params.customMPCv2SigningRound3GenerationFunction) {
|
|
2947
|
+
throw new Error('Generator function for MPCv2 Round 3 share required to sign transactions with External Signer.');
|
|
2948
|
+
}
|
|
2949
|
+
try {
|
|
2950
|
+
(0, assert_1.default)(this.tssUtils, 'tssUtils must be defined');
|
|
2951
|
+
const signedTxRequest = await this.tssUtils.signEcdsaMPCv2TssUsingExternalSigner({
|
|
2952
|
+
txRequest: txRequestId,
|
|
2953
|
+
reqId: params.reqId || new utils_1.RequestTracer(),
|
|
2954
|
+
}, params.customMPCv2SigningRound1GenerationFunction, params.customMPCv2SigningRound2GenerationFunction, params.customMPCv2SigningRound3GenerationFunction);
|
|
2955
|
+
return signedTxRequest;
|
|
2956
|
+
}
|
|
2957
|
+
catch (e) {
|
|
2958
|
+
throw new Error('failed to sign transaction ' + e);
|
|
2959
|
+
}
|
|
2960
|
+
}
|
|
2488
2961
|
/**
|
|
2489
2962
|
* Signs a transaction from a TSS wallet.
|
|
2490
2963
|
*
|
|
@@ -2500,26 +2973,14 @@ class Wallet {
|
|
|
2500
2973
|
if (!params.prv) {
|
|
2501
2974
|
throw new Error('prv required to sign transactions with TSS');
|
|
2502
2975
|
}
|
|
2503
|
-
// If only the getHashFunction() is defined for the coin use it otherwise
|
|
2504
|
-
// pass undefined hash, default hash will be used in that case.
|
|
2505
|
-
let hash;
|
|
2506
2976
|
try {
|
|
2507
|
-
|
|
2508
|
-
}
|
|
2509
|
-
catch (err) {
|
|
2510
|
-
hash = undefined;
|
|
2511
|
-
}
|
|
2512
|
-
try {
|
|
2513
|
-
const signedTxRequest = await this.tssUtils.signTxRequest({
|
|
2977
|
+
return await this.tssUtils.signTxRequest({
|
|
2514
2978
|
txRequest: params.txPrebuild.txRequestId,
|
|
2979
|
+
txParams: params.txPrebuild.buildParams,
|
|
2515
2980
|
prv: params.prv,
|
|
2516
2981
|
reqId: params.reqId || new utils_1.RequestTracer(),
|
|
2517
2982
|
apiVersion: params.apiVersion,
|
|
2518
|
-
hash,
|
|
2519
2983
|
});
|
|
2520
|
-
return {
|
|
2521
|
-
txRequestId: signedTxRequest.txRequestId,
|
|
2522
|
-
};
|
|
2523
2984
|
}
|
|
2524
2985
|
catch (e) {
|
|
2525
2986
|
throw new Error('failed to sign transaction ' + e);
|
|
@@ -2531,7 +2992,6 @@ class Wallet {
|
|
|
2531
2992
|
* @param params signing options
|
|
2532
2993
|
*/
|
|
2533
2994
|
async signMessageTss(params = {}) {
|
|
2534
|
-
var _a, _b, _c, _d;
|
|
2535
2995
|
if (!params.reqId) {
|
|
2536
2996
|
params.reqId = new utils_1.RequestTracer();
|
|
2537
2997
|
}
|
|
@@ -2540,7 +3000,7 @@ class Wallet {
|
|
|
2540
3000
|
}
|
|
2541
3001
|
try {
|
|
2542
3002
|
let txRequest;
|
|
2543
|
-
assert_1.default(params.message, 'message required for message signing');
|
|
3003
|
+
(0, assert_1.default)(params.message, 'message required for message signing');
|
|
2544
3004
|
if (!params.message.txRequestId) {
|
|
2545
3005
|
const intentOption = {
|
|
2546
3006
|
custodianMessageId: params.custodianMessageId,
|
|
@@ -2548,13 +3008,13 @@ class Wallet {
|
|
|
2548
3008
|
intentType: 'signMessage',
|
|
2549
3009
|
isTss: true,
|
|
2550
3010
|
messageRaw: params.message.messageRaw,
|
|
2551
|
-
messageEncoded:
|
|
3011
|
+
messageEncoded: params.message.messageEncoded,
|
|
2552
3012
|
};
|
|
2553
3013
|
txRequest = await this.tssUtils.createTxRequestWithIntentForMessageSigning(intentOption);
|
|
2554
3014
|
params.message.txRequestId = txRequest.txRequestId;
|
|
2555
3015
|
}
|
|
2556
3016
|
else {
|
|
2557
|
-
txRequest = await tss_1.getTxRequest(this.bitgo, this.id(), params.message.txRequestId);
|
|
3017
|
+
txRequest = await (0, tss_1.getTxRequest)(this.bitgo, this.id(), params.message.txRequestId, params.reqId);
|
|
2558
3018
|
}
|
|
2559
3019
|
const signedMessageRequest = await this.tssUtils.signTxRequestForMessage({
|
|
2560
3020
|
txRequest,
|
|
@@ -2562,15 +3022,17 @@ class Wallet {
|
|
|
2562
3022
|
reqId: params.reqId || new utils_1.RequestTracer(),
|
|
2563
3023
|
messageRaw: params.message.messageRaw,
|
|
2564
3024
|
messageEncoded: params.message.messageEncoded,
|
|
2565
|
-
bufferToSign: Buffer.from(
|
|
3025
|
+
bufferToSign: Buffer.from(params.message.messageEncoded ?? '', 'hex'),
|
|
2566
3026
|
});
|
|
2567
|
-
assert_1.default(signedMessageRequest.messages, 'Unable to find messages in signedMessageRequest');
|
|
2568
|
-
assert_1.default(signedMessageRequest.messages[0].combineSigShare, 'Unable to find combineSigShare in signedMessageRequest.messages');
|
|
2569
|
-
assert_1.default(signedMessageRequest.messages[0].txHash, 'Unable to find txHash in signedMessageRequest.messages');
|
|
3027
|
+
(0, assert_1.default)(signedMessageRequest.messages, 'Unable to find messages in signedMessageRequest');
|
|
3028
|
+
(0, assert_1.default)(signedMessageRequest.messages[0].combineSigShare, 'Unable to find combineSigShare in signedMessageRequest.messages');
|
|
3029
|
+
(0, assert_1.default)(signedMessageRequest.messages[0].txHash, 'Unable to find txHash in signedMessageRequest.messages');
|
|
2570
3030
|
return {
|
|
2571
3031
|
coin: this.coin(),
|
|
2572
3032
|
txHash: signedMessageRequest.messages[0].txHash,
|
|
2573
|
-
|
|
3033
|
+
signature: signedMessageRequest.messages[0].txHash,
|
|
3034
|
+
messageRaw: params.message?.messageRaw,
|
|
3035
|
+
messageEncoded: params.message?.messageEncoded,
|
|
2574
3036
|
txRequestId: signedMessageRequest.txRequestId,
|
|
2575
3037
|
};
|
|
2576
3038
|
}
|
|
@@ -2592,7 +3054,7 @@ class Wallet {
|
|
|
2592
3054
|
}
|
|
2593
3055
|
try {
|
|
2594
3056
|
let txRequest;
|
|
2595
|
-
assert_1.default(params.typedData, 'typedData required for typed data signing');
|
|
3057
|
+
(0, assert_1.default)(params.typedData, 'typedData required for typed data signing');
|
|
2596
3058
|
if (!params.typedData.txRequestId) {
|
|
2597
3059
|
const intentOptions = {
|
|
2598
3060
|
custodianMessageId: params.custodianMessageId,
|
|
@@ -2606,7 +3068,7 @@ class Wallet {
|
|
|
2606
3068
|
params.typedData.txRequestId = txRequest.txRequestId;
|
|
2607
3069
|
}
|
|
2608
3070
|
else {
|
|
2609
|
-
txRequest = await tss_1.getTxRequest(this.bitgo, this.id(), params.typedData.txRequestId);
|
|
3071
|
+
txRequest = await (0, tss_1.getTxRequest)(this.bitgo, this.id(), params.typedData.txRequestId, params.reqId);
|
|
2610
3072
|
}
|
|
2611
3073
|
const signedTypedDataRequest = await this.tssUtils.signTxRequestForMessage({
|
|
2612
3074
|
txRequest,
|
|
@@ -2616,13 +3078,15 @@ class Wallet {
|
|
|
2616
3078
|
messageEncoded: params.typedData.typedDataEncoded.toString('hex'),
|
|
2617
3079
|
bufferToSign: params.typedData.typedDataEncoded,
|
|
2618
3080
|
});
|
|
2619
|
-
assert_1.default(signedTypedDataRequest.messages, 'Unable to find messages in signedTypedDataRequest');
|
|
2620
|
-
assert_1.default(signedTypedDataRequest.messages[0].combineSigShare, 'Unable to find combineSigShare in signedTypedDataRequest.messages');
|
|
2621
|
-
assert_1.default(signedTypedDataRequest.messages[0].txHash, 'Unable to find txHash in signedTypedDataRequest.messages');
|
|
3081
|
+
(0, assert_1.default)(signedTypedDataRequest.messages, 'Unable to find messages in signedTypedDataRequest');
|
|
3082
|
+
(0, assert_1.default)(signedTypedDataRequest.messages[0].combineSigShare, 'Unable to find combineSigShare in signedTypedDataRequest.messages');
|
|
3083
|
+
(0, assert_1.default)(signedTypedDataRequest.messages[0].txHash, 'Unable to find txHash in signedTypedDataRequest.messages');
|
|
2622
3084
|
return {
|
|
2623
3085
|
coin: this.coin(),
|
|
2624
3086
|
txHash: signedTypedDataRequest.messages[0].txHash,
|
|
3087
|
+
signature: signedTypedDataRequest.messages[0].txHash,
|
|
2625
3088
|
messageRaw: params.typedData.typedDataRaw,
|
|
3089
|
+
messageEncoded: params.typedData.typedDataEncoded.toString('hex'),
|
|
2626
3090
|
txRequestId: signedTypedDataRequest.txRequestId,
|
|
2627
3091
|
};
|
|
2628
3092
|
}
|
|
@@ -2635,29 +3099,38 @@ class Wallet {
|
|
|
2635
3099
|
*
|
|
2636
3100
|
* @param params send options
|
|
2637
3101
|
*/
|
|
2638
|
-
async
|
|
2639
|
-
|
|
2640
|
-
const { apiVersion } = params;
|
|
2641
|
-
const supportedTxRequestVersions = (_b = (_a = this.tssUtils) === null || _a === void 0 ? void 0 : _a.supportedTxRequestVersions()) !== null && _b !== void 0 ? _b : [];
|
|
2642
|
-
const onlySupportsTxRequestFull = supportedTxRequestVersions.length === 1 && supportedTxRequestVersions.includes('full');
|
|
2643
|
-
if (apiVersion === 'lite' && onlySupportsTxRequestFull) {
|
|
2644
|
-
throw new Error('TxRequest Lite API is not supported for this wallet');
|
|
2645
|
-
}
|
|
3102
|
+
async sendManyTxRequests(params = {}) {
|
|
3103
|
+
params.apiVersion = (0, txRequest_1.getTxRequestApiVersion)(this, params.apiVersion);
|
|
2646
3104
|
const signedTransaction = (await this.prebuildAndSignTransaction(params));
|
|
2647
3105
|
if (!signedTransaction.txRequestId) {
|
|
2648
3106
|
throw new Error('txRequestId missing from signed transaction');
|
|
2649
3107
|
}
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
3108
|
+
if (params.apiVersion === 'full') {
|
|
3109
|
+
const latestTxRequest = await (0, tss_1.getTxRequest)(this.bitgo, this.id(), signedTransaction.txRequestId, params.reqId);
|
|
3110
|
+
const reqId = params.reqId || new utils_1.RequestTracer();
|
|
3111
|
+
this.bitgo.setRequestTracer(reqId);
|
|
3112
|
+
const transfer = await this.bitgo
|
|
2653
3113
|
.post(this.bitgo.url('/wallet/' + this._wallet.id + '/txrequests/' + signedTransaction.txRequestId + '/transfers', 2))
|
|
2654
|
-
.send()
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
3114
|
+
.send()
|
|
3115
|
+
.result();
|
|
3116
|
+
if (latestTxRequest.state === 'pendingApproval') {
|
|
3117
|
+
const pendingApprovals = new pendingApproval_1.PendingApprovals(this.bitgo, this.baseCoin);
|
|
3118
|
+
const pendingApproval = await pendingApprovals.get({ id: latestTxRequest.pendingApprovalId });
|
|
3119
|
+
return {
|
|
3120
|
+
pendingApproval: pendingApproval.toJSON(),
|
|
3121
|
+
txRequest: latestTxRequest,
|
|
3122
|
+
};
|
|
3123
|
+
}
|
|
3124
|
+
return {
|
|
3125
|
+
transfer,
|
|
3126
|
+
txRequest: latestTxRequest,
|
|
3127
|
+
txid: (latestTxRequest.transactions ?? [])[0]?.signedTx?.id,
|
|
3128
|
+
tx: (latestTxRequest.transactions ?? [])[0]?.signedTx?.tx,
|
|
3129
|
+
status: transfer.state,
|
|
3130
|
+
};
|
|
2659
3131
|
}
|
|
2660
|
-
|
|
3132
|
+
const reqId = params.reqId || undefined;
|
|
3133
|
+
return this.tssUtils?.sendTxRequest(signedTransaction.txRequestId, reqId);
|
|
2661
3134
|
}
|
|
2662
3135
|
/**
|
|
2663
3136
|
* Send funds from a fee address to a forwarder. Only supports eth-like coins.
|
|
@@ -2675,6 +3148,21 @@ class Wallet {
|
|
|
2675
3148
|
this._wallet = await this.bitgo.post(url).send(params).result();
|
|
2676
3149
|
return this._wallet;
|
|
2677
3150
|
}
|
|
3151
|
+
/**
|
|
3152
|
+
* Send funds from a fee address to a forwarder.
|
|
3153
|
+
*
|
|
3154
|
+
* @param {Object} params - parameters object
|
|
3155
|
+
* @param {List} params.forwarders - list of fund forwarder options
|
|
3156
|
+
* @returns {*}
|
|
3157
|
+
*/
|
|
3158
|
+
async fundForwarders(params) {
|
|
3159
|
+
if (_.isUndefined(params.forwarders) || params.forwarders.length == 0) {
|
|
3160
|
+
throw new Error('fund forwarder options required');
|
|
3161
|
+
}
|
|
3162
|
+
const url = this.url('/fundforwarders');
|
|
3163
|
+
this._wallet = await this.bitgo.post(url).send(params).result();
|
|
3164
|
+
return this._wallet;
|
|
3165
|
+
}
|
|
2678
3166
|
/**
|
|
2679
3167
|
* Gets forwarder's balance
|
|
2680
3168
|
* @param params - optional query parameters
|
|
@@ -2683,11 +3171,11 @@ class Wallet {
|
|
|
2683
3171
|
*/
|
|
2684
3172
|
async getForwarderBalance(params) {
|
|
2685
3173
|
const query = {};
|
|
2686
|
-
if (params
|
|
2687
|
-
query.maximumBalance = params
|
|
3174
|
+
if (params?.maximumBalance) {
|
|
3175
|
+
query.maximumBalance = params?.maximumBalance;
|
|
2688
3176
|
}
|
|
2689
|
-
if (params
|
|
2690
|
-
query.minimumBalance = params
|
|
3177
|
+
if (params?.minimumBalance) {
|
|
3178
|
+
query.minimumBalance = params?.minimumBalance;
|
|
2691
3179
|
}
|
|
2692
3180
|
const url = this.url(`/forwarders/balances`);
|
|
2693
3181
|
const response = await this.bitgo.get(url).query(query).result();
|
|
@@ -2705,6 +3193,84 @@ class Wallet {
|
|
|
2705
3193
|
const url = this.bitgo.url(`/wallet/${this.id()}/challenges`, 2);
|
|
2706
3194
|
return await this.bitgo.get(url).query({}).result();
|
|
2707
3195
|
}
|
|
3196
|
+
sendTransaction(params, reqId) {
|
|
3197
|
+
// extract the whitelisted params from the top level, in case
|
|
3198
|
+
// other invalid params are present that would fail encoding
|
|
3199
|
+
// and fall back to the body params
|
|
3200
|
+
const whitelistedParams = this.baseCoin.preprocessBuildParams(_.pick(params, whitelistedSendParams));
|
|
3201
|
+
const reqTracer = reqId || new utils_1.RequestTracer();
|
|
3202
|
+
this.bitgo.setRequestTracer(reqTracer);
|
|
3203
|
+
return (0, postWithCodec_1.postWithCodec)(this.bitgo, this.baseCoin.url('/wallet/' + this.id() + '/tx/send'), t.intersection([public_types_1.TxSendBody, t.partial({ locktime: t.number })]), whitelistedParams).result();
|
|
3204
|
+
}
|
|
3205
|
+
initiateTransaction(params, reqId) {
|
|
3206
|
+
// extract the whitelisted params from the top level, in case
|
|
3207
|
+
// other invalid params are present that would fail encoding
|
|
3208
|
+
// and fall back to the body params
|
|
3209
|
+
const whitelistedParams = this.baseCoin.preprocessBuildParams(_.pick(params, whitelistedSendParams));
|
|
3210
|
+
const reqTracer = reqId || new utils_1.RequestTracer();
|
|
3211
|
+
this.bitgo.setRequestTracer(reqTracer);
|
|
3212
|
+
return (0, postWithCodec_1.postWithCodec)(this.bitgo, this.baseCoin.url('/wallet/' + this.id() + '/tx/initiate'), public_types_1.TxSendBody, whitelistedParams).result();
|
|
3213
|
+
}
|
|
3214
|
+
/**
|
|
3215
|
+
* Get wallet keychains and validate passphrase if necessary
|
|
3216
|
+
* @param {PrebuildTransactionOptions} params - prebuild transaction options
|
|
3217
|
+
* @param {string} params.walletPassphrase - wallet passphrase
|
|
3218
|
+
* @param {string} params.reqId - request id for tracing purposes
|
|
3219
|
+
* @param {Function} params.customSigningFunction - custom signing function for external signing
|
|
3220
|
+
* @returns {Promise<Keychain[]>}
|
|
3221
|
+
*/
|
|
3222
|
+
async getKeychainsAndValidatePassphrase({ customSigningFunction, walletPassphrase, reqId, }) {
|
|
3223
|
+
const keychains = await this.baseCoin.keychains().getKeysForSigning({ wallet: this, reqId });
|
|
3224
|
+
// Doing a sanity check for password here to avoid doing further work if we know it's wrong
|
|
3225
|
+
// we ignore this check with if customSigningFunction is provided
|
|
3226
|
+
// which means that the user is handling the signing in external signing mode
|
|
3227
|
+
if (!customSigningFunction && keychains?.[0]?.encryptedPrv && walletPassphrase) {
|
|
3228
|
+
if (!(0, keychain_1.decryptKeychainPrivateKey)(this.bitgo, keychains[0], walletPassphrase)) {
|
|
3229
|
+
const error = new Error(`unable to decrypt keychain with the given wallet passphrase`);
|
|
3230
|
+
error.code = 'wallet_passphrase_incorrect';
|
|
3231
|
+
throw error;
|
|
3232
|
+
}
|
|
3233
|
+
}
|
|
3234
|
+
return keychains;
|
|
3235
|
+
}
|
|
3236
|
+
/**
|
|
3237
|
+
* Approve token for use with a batcher contract
|
|
3238
|
+
* This function builds, signs, and sends a token approval transaction
|
|
3239
|
+
*
|
|
3240
|
+
* @param {string} walletPassphrase - The passphrase to be used to decrypt the user key
|
|
3241
|
+
* @param {string} tokenName - The name of the token to be approved
|
|
3242
|
+
* @returns {Promise<any>} The transaction details
|
|
3243
|
+
*/
|
|
3244
|
+
async approveErc20Token(walletPassphrase, tokenName) {
|
|
3245
|
+
const reqId = new utils_1.RequestTracer();
|
|
3246
|
+
this.bitgo.setRequestTracer(reqId);
|
|
3247
|
+
let tokenApprovalBuild;
|
|
3248
|
+
try {
|
|
3249
|
+
const url = this.baseCoin.url(`/wallet/${this.id()}/token/approval/build`);
|
|
3250
|
+
tokenApprovalBuild = await this.bitgo
|
|
3251
|
+
.post(url)
|
|
3252
|
+
.send({
|
|
3253
|
+
tokenName: tokenName,
|
|
3254
|
+
})
|
|
3255
|
+
.result();
|
|
3256
|
+
}
|
|
3257
|
+
catch (e) {
|
|
3258
|
+
throw e;
|
|
3259
|
+
}
|
|
3260
|
+
const keychains = await this.getKeychainsAndValidatePassphrase({
|
|
3261
|
+
reqId,
|
|
3262
|
+
walletPassphrase,
|
|
3263
|
+
});
|
|
3264
|
+
const signingParams = {
|
|
3265
|
+
txPrebuild: tokenApprovalBuild,
|
|
3266
|
+
keychain: keychains[0],
|
|
3267
|
+
walletPassphrase,
|
|
3268
|
+
reqId,
|
|
3269
|
+
};
|
|
3270
|
+
const halfSignedTransaction = await this.signTransaction(signingParams);
|
|
3271
|
+
const finalTxParams = _.extend({}, halfSignedTransaction);
|
|
3272
|
+
return this.sendTransaction(finalTxParams, reqId);
|
|
3273
|
+
}
|
|
2708
3274
|
}
|
|
2709
3275
|
exports.Wallet = Wallet;
|
|
2710
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dhbGxldC93YWxsZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsb0RBQTRCO0FBQzVCLCtDQUF5QztBQUN6QywwQ0FBNEI7QUFDNUIscURBQXVDO0FBU3ZDLHdDQUEyQztBQUUzQyxrQ0FBMEM7QUFDMUMsc0NBQThFO0FBQzlFLCtEQUFpRDtBQUNqRCxpREFBa0Q7QUFFbEQsd0RBQXVFO0FBQ3ZFLDhEQUEyRDtBQUMzRCxvQ0FRa0I7QUF3RGxCLDREQUF5RDtBQUN6RCw0Q0FBeUM7QUFDekMsK0RBQTRDO0FBQzVDLDhDQUFnRDtBQUNoRCxnQ0FBc0M7QUFFdEMsaURBQWdEO0FBRWhELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBSWxELElBQVkscUJBR1g7QUFIRCxXQUFZLHFCQUFxQjtJQUMvQiw2RUFBVSxDQUFBO0lBQ1YsdUZBQWUsQ0FBQTtBQUNqQixDQUFDLEVBSFcscUJBQXFCLEdBQXJCLDZCQUFxQixLQUFyQiw2QkFBcUIsUUFHaEM7QUFFRCxTQUFTLDJCQUEyQixDQUNsQyxVQUEwRDtJQUUxRCxJQUFJLENBQUMsVUFBVSxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRTtRQUNqRCxPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsT0FBUSxVQUF3QyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUM7QUFDMUUsQ0FBQztBQUVELE1BQWEsTUFBTTtJQU9qQixZQUFZLEtBQWdCLEVBQUUsUUFBbUIsRUFBRSxVQUFlO1FBQ2hFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO1FB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Q0QsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1NBQ2hDO1FBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO2FBQzlEO1lBQ0QsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1NBQzlCO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzdCLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO2FBQ2hFO1lBQ0QsS0FBSyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1NBQ2xDO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzVCLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO2FBQy9EO1lBQ0QsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1NBQ2hDO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQy9CLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO2FBQ25FO1lBQ0QsS0FBSyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFD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QyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2pFLE9BQU8sUUFBOEIsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLDRCQUE0QjtRQUNoQyxzRUFBc0U7UUFDdEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRSxPQUFPLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3RELENBQUM7Q0FDRjtBQXArRkQsd0JBbytGQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEJpZ051bWJlciB9IGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyBjb21tb24gZnJvbSAnLi4vLi4vY29tbW9uJztcbmltcG9ydCB7XG4gIElCYXNlQ29pbixcbiAgU2lnbmVkTWVzc2FnZSxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFNpZ25lZFRyYW5zYWN0aW9uUmVxdWVzdCxcbiAgVHJhbnNhY3Rpb25QcmVidWlsZCxcbiAgVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG59IGZyb20gJy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IG1ha2VSYW5kb21LZXkgfSBmcm9tICcuLi9iaXRjb2luJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBnZXRTaGFyZWRTZWNyZXQgfSBmcm9tICcuLi9lY2RoJztcbmltcG9ydCB7IEFkZHJlc3NHZW5lcmF0aW9uRXJyb3IsIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0ICogYXMgaW50ZXJuYWwgZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJuYWwnO1xuaW1wb3J0IHsgZHJhd0tleWNhcmQgfSBmcm9tICcuLi9pbnRlcm5hbC9rZXljYXJkJztcbmltcG9ydCB7IEtleWNoYWluIH0gZnJvbSAnLi4va2V5Y2hhaW4nO1xuaW1wb3J0IHsgSVBlbmRpbmdBcHByb3ZhbCwgUGVuZGluZ0FwcHJvdmFsIH0gZnJvbSAnLi4vcGVuZGluZ0FwcHJvdmFsJztcbmltcG9ydCB7IFRyYWRpbmdBY2NvdW50IH0gZnJvbSAnLi4vdHJhZGluZy90cmFkaW5nQWNjb3VudCc7XG5pbXBvcnQge1xuICBpbmZlckFkZHJlc3NUeXBlLFxuICBSZXF1ZXN0VHJhY2VyLFxuICBUeFJlcXVlc3QsXG4gIEVkZHNhVW5zaWduZWRUcmFuc2FjdGlvbixcbiAgSW50ZW50T3B0aW9uc0Zvck1lc3NhZ2UsXG4gIEludGVudE9wdGlvbnNGb3JUeXBlZERhdGEsXG4gIFJlcXVlc3RUeXBlLFxufSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge1xuICBBY2NlbGVyYXRlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBBZGRyZXNzZXNPcHRpb25zLFxuICBCdWlsZENvbnNvbGlkYXRpb25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIEJ1aWxkVG9rZW5FbmFibGVtZW50T3B0aW9ucyxcbiAgQ2hhbmdlRmVlT3B0aW9ucyxcbiAgQ29uc29saWRhdGVVbnNwZW50c09wdGlvbnMsXG4gIENyZWF0ZUFkZHJlc3NPcHRpb25zLFxuICBDcmVhdGVQb2xpY3lSdWxlT3B0aW9ucyxcbiAgQ3JlYXRlU2hhcmVPcHRpb25zLFxuICBDcm9zc0NoYWluVVRYTyxcbiAgRGVwbG95Rm9yd2FyZGVyc09wdGlvbnMsXG4gIERvd25sb2FkS2V5Y2FyZE9wdGlvbnMsXG4gIEZhbm91dFVuc3BlbnRzT3B0aW9ucyxcbiAgRmV0Y2hDcm9zc0NoYWluVVRYT3NPcHRpb25zLFxuICBGbHVzaEZvcndhcmRlclRva2VuT3B0aW9ucyxcbiAgRm9yd2FyZGVyQmFsYW5jZSxcbiAgRm9yd2FyZGVyQmFsYW5jZU9wdGlvbnMsXG4gIEZyZWV6ZU9wdGlvbnMsXG4gIEZ1bmRGb3J3YXJkZXJzT3B0aW9ucyxcbiAgR2V0QWRkcmVzc09wdGlvbnMsXG4gIEdldFBydk9wdGlvbnMsXG4gIEdldFRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgR2V0VHJhbnNmZXJPcHRpb25zLFxuICBHZXRVc2VyUHJ2T3B0aW9ucyxcbiAgSVdhbGxldCxcbiAgTWF4aW11bVNwZW5kYWJsZSxcbiAgTWF4aW11bVNwZW5kYWJsZU9wdGlvbnMsXG4gIE1vZGlmeVdlYmhvb2tPcHRpb25zLFxuICBQYWdpbmF0aW9uT3B0aW9ucyxcbiAgUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdCxcbiAgUmVjb3ZlclRva2VuT3B0aW9ucyxcbiAgUmVtb3ZlUG9saWN5UnVsZU9wdGlvbnMsXG4gIFJlbW92ZVVzZXJPcHRpb25zLFxuICBTZW5kTWFueU9wdGlvbnMsXG4gIFNlbmRPcHRpb25zLFxuICBTaGFyZVdhbGxldE9wdGlvbnMsXG4gIFNpbXVsYXRlV2ViaG9va09wdGlvbnMsXG4gIFN1Ym1pdFRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgU3dlZXBPcHRpb25zLFxuICBUcmFuc2ZlckJ5U2VxdWVuY2VJZE9wdGlvbnMsXG4gIFRyYW5zZmVyQ29tbWVudE9wdGlvbnMsXG4gIFRyYW5zZmVyc09wdGlvbnMsXG4gIFVuc3BlbnRzT3B0aW9ucyxcbiAgVXBkYXRlQWRkcmVzc09wdGlvbnMsXG4gIFdhbGxldENvaW5TcGVjaWZpYyxcbiAgV2FsbGV0RGF0YSxcbiAgV2FsbGV0RWNkc2FDaGFsbGVuZ2VzLFxuICBXYWxsZXRTaWduTWVzc2FnZU9wdGlvbnMsXG4gIFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFdhbGxldFNpZ25UeXBlZERhdGFPcHRpb25zLFxuICBXYWxsZXRUeXBlLFxufSBmcm9tICcuL2lXYWxsZXQnO1xuaW1wb3J0IHsgU3Rha2luZ1dhbGxldCB9IGZyb20gJy4uL3N0YWtpbmcvc3Rha2luZ1dhbGxldCc7XG5pbXBvcnQgeyBMaWdodG5pbmcgfSBmcm9tICcuLi9saWdodG5pbmcnO1xuaW1wb3J0IEVkZHNhVXRpbHMgZnJvbSAnLi4vdXRpbHMvdHNzL2VkZHNhJztcbmltcG9ydCB7IEVjZHNhVXRpbHMgfSBmcm9tICcuLi91dGlscy90c3MvZWNkc2EnO1xuaW1wb3J0IHsgZ2V0VHhSZXF1ZXN0IH0gZnJvbSAnLi4vdHNzJztcbmltcG9ydCB7IEhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgb2ZjVG9rZW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5cbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnYml0Z286djI6d2FsbGV0Jyk7XG5cbnR5cGUgTWFuYWdlVW5zcGVudHMgPSAnY29uc29saWRhdGUnIHwgJ2Zhbm91dCc7XG5cbmV4cG9ydCBlbnVtIE1hbmFnZVVuc3BlbnRzT3B0aW9ucyB7XG4gIEJVSUxEX09OTFksXG4gIEJVSUxEX1NJR05fU0VORCxcbn1cblxuZnVuY3Rpb24gaXNQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0KFxuICBwcmVidWlsZFR4OiBzdHJpbmcgfCBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0IHwgdW5kZWZpbmVkXG4pOiBwcmVidWlsZFR4IGlzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQge1xuICBpZiAoIXByZWJ1aWxkVHggfHwgdHlwZW9mIHByZWJ1aWxkVHggPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAocHJlYnVpbGRUeCBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0KS53YWxsZXRJZCAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgV2FsbGV0IGltcGxlbWVudHMgSVdhbGxldCB7XG4gIHB1YmxpYyByZWFkb25seSBiaXRnbzogQml0R29CYXNlO1xuICBwdWJsaWMgcmVhZG9ubHkgYmFzZUNvaW46IElCYXNlQ29pbjtcbiAgcHVibGljIF93YWxsZXQ6IFdhbGxldERhdGE7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHNzVXRpbHM6IEVjZHNhVXRpbHMgfCBFZGRzYVV0aWxzIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wZXJtaXNzaW9ucz86IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGJhc2VDb2luOiBJQmFzZUNvaW4sIHdhbGxldERhdGE6IGFueSkge1xuICAgIHRoaXMuYml0Z28gPSBiaXRnbztcbiAgICB0aGlzLmJhc2VDb2luID0gYmFzZUNvaW47XG4gICAgdGhpcy5fd2FsbGV0ID0gd2FsbGV0RGF0YTtcbiAgICBjb25zdCB1c2VySWQgPSBfLmdldChiaXRnbywgJ191c2VyLmlkJyk7XG4gICAgaWYgKF8uaXNTdHJpbmcodXNlcklkKSkge1xuICAgICAgY29uc3QgdXNlckRldGFpbHMgPSBfLmZpbmQod2FsbGV0RGF0YS51c2VycywgeyB1c2VyOiB1c2VySWQgfSk7XG4gICAgICB0aGlzLl9wZXJtaXNzaW9ucyA9IF8uZ2V0KHVzZXJEZXRhaWxzLCAncGVybWlzc2lvbnMnKTtcbiAgICB9XG4gICAgaWYgKGJhc2VDb2luPy5zdXBwb3J0c1RzcygpICYmIHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICBzd2l0Y2ggKGJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpKSB7XG4gICAgICAgIGNhc2UgJ2VjZHNhJzpcbiAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gbmV3IEVjZHNhVXRpbHMoYml0Z28sIGJhc2VDb2luLCB0aGlzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZWRkc2EnOlxuICAgICAgICAgIHRoaXMudHNzVXRpbHMgPSBuZXcgRWRkc2FVdGlscyhiaXRnbywgYmFzZUNvaW4sIHRoaXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMudHNzVXRpbHMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgVVJMIHVzaW5nIHRoaXMgd2FsbGV0J3MgaWQgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIEJpdEdvIEFQSSBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSBleHRyYSBBUEkgc3BlY2lmaWMgc3RyaW5nIHRvIGFwcGVuZCB0byB0aGUgd2FsbGV0IGlkXG4gICAqL1xuICB1cmwoZXh0cmEgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyBleHRyYSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoaXMgd2FsbGV0J3MgaWRcbiAgICovXG4gIGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlciBvZiBhcHByb3ZhbHMgcmVxdWlyZWQgZm9yIHNwZW5kaW5nIGZ1bmRzIGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIGFwcHJvdmFsc1JlcXVpcmVkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5hcHByb3ZhbHNSZXF1aXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgYmFsYW5jZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuYmFsYW5jZTtcbiAgfVxuXG4gIHByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAnYWRkcmVzc1R5cGUnLFxuICAgICAgJ2FwaVZlcnNpb24nLFxuICAgICAgJ2NoYW5nZUFkZHJlc3MnLFxuICAgICAgJ2NvbnNvbGlkYXRlQWRkcmVzc2VzJyxcbiAgICAgICdjcGZwRmVlUmF0ZScsXG4gICAgICAnY3BmcFR4SWRzJyxcbiAgICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ2dhc0xpbWl0JyxcbiAgICAgICdnYXNQcmljZScsXG4gICAgICAnaG9wUGFyYW1zJyxcbiAgICAgICdpZGZTaWduZWRUaW1lc3RhbXAnLFxuICAgICAgJ2lkZlVzZXJJZCcsXG4gICAgICAnaWRmVmVyc2lvbicsXG4gICAgICAnaW5zdGFudCcsXG4gICAgICAnbGFzdExlZGdlclNlcXVlbmNlJyxcbiAgICAgICdsZWRnZXJTZXF1ZW5jZURlbHRhJyxcbiAgICAgICdtYXhGZWUnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ21heFZhbHVlJyxcbiAgICAgICdtZW1vJyxcbiAgICAgICd0cmFuc2ZlcklkJyxcbiAgICAgICdtZXNzYWdlJyxcbiAgICAgICdtaW5Db25maXJtcycsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ25vU3BsaXRDaGFuZ2UnLFxuICAgICAgJ251bUJsb2NrcycsXG4gICAgICAnbm9uY2UnLFxuICAgICAgJ3ByZXZpZXcnLFxuICAgICAgJ3ByZXZpZXdQZW5kaW5nVHhzJyxcbiAgICAgICdyZWNlaXZlQWRkcmVzcycsXG4gICAgICAncmVjaXBpZW50cycsXG4gICAgICAncmVzZXJ2YXRpb24nLFxuICAgICAgJ3NlcXVlbmNlSWQnLFxuICAgICAgJ3N0cmF0ZWd5JyxcbiAgICAgICdzb3VyY2VDaGFpbicsXG4gICAgICAnZGVzdGluYXRpb25DaGFpbicsXG4gICAgICAndGFyZ2V0V2FsbGV0VW5zcGVudHMnLFxuICAgICAgJ3RydXN0bGluZXMnLFxuICAgICAgJ3R4Rm9ybWF0JyxcbiAgICAgICd0eXBlJyxcbiAgICAgICd1bnNwZW50cycsXG4gICAgICAnbm9uUGFydGljaXBhdGlvbicsXG4gICAgICAndmFsaWRGcm9tQmxvY2snLFxuICAgICAgJ3ZhbGlkVG9CbG9jaycsXG4gICAgICAnbWVzc2FnZUtleScsXG4gICAgICAnc3Rha2luZ09wdGlvbnMnLFxuICAgICAgJ2VpcDE1NTknLFxuICAgICAgJ2tleXJlZ1R4QmFzZTY0JyxcbiAgICAgICdjbG9zZVJlbWFpbmRlclRvJyxcbiAgICAgICd0b2tlbk5hbWUnLFxuICAgICAgJ2VuYWJsZVRva2VucycsXG4gICAgICAvLyBwYXJhbSB0byBzZXQgZW1lcmdlbmN5IGZsYWcgb24gYSBjdXN0b2RpYWwgdHJhbnNhY3Rpb24uXG4gICAgICAvLyBUaGlzIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQgaW4gbGVzcyB0aGFuIDEgaG91ciBvciBpdCB3aWxsIGZhaWwuXG4gICAgICAnZW1lcmdlbmN5JyxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYSBzdHJpY3Qgc3ViLXNldCBvZiBwcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zXG4gICAqL1xuICBwcmVidWlsZENvbnNvbGlkYXRlQWNjb3VudFBhcmFtcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdjb25zb2xpZGF0ZUFkZHJlc3NlcycsXG4gICAgICAnZmVlUmF0ZScsXG4gICAgICAnbWF4RmVlUmF0ZScsXG4gICAgICAnbWVtbycsXG4gICAgICAndmFsaWRGcm9tQmxvY2snLFxuICAgICAgJ3ZhbGlkVG9CbG9jaycsXG4gICAgICAncHJldmlldycsXG4gICAgICAna2VlcEFsaXZlJyxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29uZmlybWVkIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICovXG4gIGNvbmZpcm1lZEJhbGFuY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvbmZpcm1lZEJhbGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzcGVuZGFibGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgc3BlbmRhYmxlQmFsYW5jZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuc3BlbmRhYmxlQmFsYW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBiYWxhbmNlcyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gb3ZlcmZsb3cgc3RhbmRhcmQgamF2YXNjcmlwdCBudW1iZXJzXG4gICAqL1xuICBiYWxhbmNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5iYWxhbmNlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29uZmlybWVkIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBiYWxhbmNlcyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gb3ZlcmZsb3cgc3RhbmRhcmQgamF2YXNjcmlwdCBudW1iZXJzXG4gICAqL1xuICBjb25maXJtZWRCYWxhbmNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb25maXJtZWRCYWxhbmNlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlbmRhYmxlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBiYWxhbmNlcyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gb3ZlcmZsb3cgc3RhbmRhcmQgamF2YXNjcmlwdCBudW1iZXJzXG4gICAqL1xuICBzcGVuZGFibGVCYWxhbmNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5zcGVuZGFibGVCYWxhbmNlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29pbiBpZGVudGlmaWVyIGZvciB0aGUgdHlwZSBvZiBjb2luIHRoaXMgd2FsbGV0IGhvbGRzXG4gICAqL1xuICBjb2luKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luO1xuICB9XG5cbiAgdHlwZSgpOiBXYWxsZXRUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LnR5cGU7XG4gIH1cblxuICBtdWx0aXNpZ1R5cGUoKTogJ29uY2hhaW4nIHwgJ3Rzcycge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGFiZWwgKG5hbWUpIGZvciB0aGlzIHdhbGxldFxuICAgKi9cbiAgcHVibGljIGxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5sYWJlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHB1YmxpYyBvYmplY3QgaWRzIGZvciB0aGUga2V5Y2hhaW5zIG9uIHRoaXMgd2FsbGV0LlxuICAgKi9cbiAgcHVibGljIGtleUlkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5rZXlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHJlY2VpdmUgYWRkcmVzcyBmb3IgdGhpcyB3YWxsZXRcbiAgICovXG4gIHB1YmxpYyByZWNlaXZlQWRkcmVzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQucmVjZWl2ZUFkZHJlc3MuYWRkcmVzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHdhbGxldCBpZCBvZiB0aGUgd2FsbGV0IHRoYXQgdGhpcyB3YWxsZXQgd2FzIG1pZ3JhdGVkIGZyb20uXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCBpZiB0aGlzIGlzIGEgQkNIIHdhbGxldCB0aGF0IHdhcyBjcmVhdGVkIGZyb20gYSBCVEMgd2FsbGV0LFxuICAgKiB0aGUgQkNIIHdhbGxldCBtaWdyYXRlZCBmcm9tIGZpZWxkIHdvdWxkIGhhdmUgdGhlIEJUQyB3YWxsZXQgaWQuXG4gICAqL1xuICBwdWJsaWMgbWlncmF0ZWRGcm9tKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5taWdyYXRlZEZyb207XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSB0b2tlbiBmbHVzaCB0aHJlc2hvbGRzIGZvciB0aGlzIHdhbGxldFxuICAgKiBAcmV0dXJuIHsqfE9iamVjdH0gcGFpcnMgb2YgeyBbdG9rZW5OYW1lXTogdGhyZXNob2xkcyB9IGJhc2UgdW5pdHNcbiAgICovXG4gIHRva2VuRmx1c2hUaHJlc2hvbGRzKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLnRva2VuRmx1c2hUaHJlc2hvbGRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3YWxsZXQgcHJvcGVydGllcyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gY2VydGFpbiBjb2luIGltcGxlbWVudGF0aW9uc1xuICAgKi9cbiAgY29pblNwZWNpZmljKCk6IFdhbGxldENvaW5TcGVjaWZpYyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwZW5kaW5nIGFwcHJvdmFscyBvbiB0aGlzIHdhbGxldFxuICAgKi9cbiAgcGVuZGluZ0FwcHJvdmFscygpOiBJUGVuZGluZ0FwcHJvdmFsW10ge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQucGVuZGluZ0FwcHJvdmFscy5tYXAoKGN1cnJlbnRBcHByb3ZhbCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQZW5kaW5nQXBwcm92YWwodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgY3VycmVudEFwcHJvdmFsLCB0aGlzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoIHRoZSB3YWxsZXQgb2JqZWN0IGJ5IHN5bmNpbmcgd2l0aCB0aGUgYmFjay1lbmRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7V2FsbGV0fVxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaChwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgpKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB0cmFuc2FjdGlvbnMocGFyYW1zOiBQYWdpbmF0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fTtcblxuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3R4JykpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAtIHR4SGFzaCB0aGUgdHJhbnNhY3Rpb24gaGFzaCB0byBzZWFyY2ggZm9yXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0VHJhbnNhY3Rpb24ocGFyYW1zOiBHZXRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd0eEhhc2gnXSwgW10pO1xuXG4gICAgY29uc3QgcXVlcnk6IFBhZ2luYXRpb25PcHRpb25zID0ge307XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmxpbWl0KSkge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubGltaXQpIHx8IHBhcmFtcy5saW1pdCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy51cmwoJy90eC8nICsgcGFyYW1zLnR4SGFzaCkpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdHJhbnNmZXJzIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgdHJhbnNmZXJzKHBhcmFtczogVHJhbnNmZXJzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogVHJhbnNmZXJzT3B0aW9ucyA9IHt9O1xuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuYWxsVG9rZW5zKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5hbGxUb2tlbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhbGxUb2tlbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5hbGxUb2tlbnMgPSBwYXJhbXMuYWxsVG9rZW5zO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc2VhcmNoTGFiZWwpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuc2VhcmNoTGFiZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZWFyY2hMYWJlbCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkuc2VhcmNoTGFiZWwgPSBwYXJhbXMuc2VhcmNoTGFiZWw7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheShwYXJhbXMuYWRkcmVzcykgJiYgIV8uaXNTdHJpbmcocGFyYW1zLmFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhZGRyZXNzIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nIG9yIGFycmF5Jyk7XG4gICAgICB9XG4gICAgICBpZiAoXy5pc0FycmF5KHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgICBwYXJhbXMuYWRkcmVzcy5mb3JFYWNoKChhZGRyZXNzKSA9PiB7XG4gICAgICAgICAgaWYgKCFfLmlzU3RyaW5nKGFkZHJlc3MpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYWRkcmVzcyBhcmd1bWVudCwgZXhwZWN0aW5nIGFycmF5IG9mIGFkZHJlc3Mgc3RyaW5ncycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBxdWVyeS5hZGRyZXNzID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5kYXRlR3RlKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmRhdGVHdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkYXRlR3RlIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5kYXRlR3RlID0gcGFyYW1zLmRhdGVHdGU7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5kYXRlTHQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuZGF0ZUx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGF0ZUx0IGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5kYXRlTHQgPSBwYXJhbXMuZGF0ZUx0O1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudmFsdWVHdGUpKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnZhbHVlR3RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdmFsdWVHdGUgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnZhbHVlR3RlID0gcGFyYW1zLnZhbHVlR3RlO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudmFsdWVMdCkpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMudmFsdWVMdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHZhbHVlTHQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnZhbHVlTHQgPSBwYXJhbXMudmFsdWVMdDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLmluY2x1ZGVIZXgpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlSGV4KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jbHVkZUhleCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmluY2x1ZGVIZXggPSBwYXJhbXMuaW5jbHVkZUhleDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLnN0YXRlKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy5zdGF0ZSkgJiYgIV8uaXNTdHJpbmcocGFyYW1zLnN0YXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdGUgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcgb3IgYXJyYXknKTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zLnN0YXRlKSkge1xuICAgICAgICBwYXJhbXMuc3RhdGUuZm9yRWFjaCgoc3RhdGUpID0+IHtcbiAgICAgICAgICBpZiAoIV8uaXNTdHJpbmcoc3RhdGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdGUgYXJndW1lbnQsIGV4cGVjdGluZyBhcnJheSBvZiBzdGF0ZSBzdHJpbmdzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnN0YXRlID0gcGFyYW1zLnN0YXRlO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudHlwZSkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMudHlwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHR5cGUgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnR5cGUgPSBwYXJhbXMudHlwZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy90cmFuc2ZlcicpKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYW5zZmVycyBvbiB0aGlzIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXRUcmFuc2ZlcihwYXJhbXM6IEdldFRyYW5zZmVyT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy90cmFuc2Zlci8nICsgcGFyYW1zLmlkKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdHJhbnNhY3Rpb24gYnkgc2VxdWVuY2UgaWQgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyQnlTZXF1ZW5jZUlkKHBhcmFtczogVHJhbnNmZXJCeVNlcXVlbmNlSWRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnc2VxdWVuY2VJZCddLCBbXSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdHJhbnNmZXIvc2VxdWVuY2VJZC8nICsgcGFyYW1zLnNlcXVlbmNlSWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1heGltdW0gYW1vdW50IHlvdSBjYW4gc3BlbmQgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGltaXQgLSBtYXhpbXVtIG51bWJlciBvZiBzZWxlY3RhYmxlIHVuc3BlbnRzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSB0aGUgbWluaW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkhlaWdodCAtIHRoZSBtaW5pbXVtIGhlaWdodCBvZiB1bnNwZW50cyBvbiB0aGUgYmxvY2sgY2hhaW4gdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIEVuZm9yY2VzIG1pbkNvbmZpcm1zIG9uIGNoYW5nZSBpbnB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gZmVlIHJhdGUgdG8gdXNlIGluIGNhbGN1bGF0aW9uIG9mIG1heGltdW0gc3BlbmRhYmxlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMucmVjaXBpZW50QWRkcmVzcyAtIHJlY2lwaWVudCBhZGRyZXNzZXMgZm9yIGEgbW9yZSBhY2N1cmF0ZSBjYWxjdWxhdGlvbiBvZiB0aGUgbWF4aW11bSBhdmFpbGFibGUgdG8gc2VuZFxuICAgKiBAcmV0dXJucyB7e21heGltdW1TcGVuZGFibGU6IE51bWJlciwgY29pbjogU3RyaW5nfX1cbiAgICogTk9URSA6IGZlZVR4Q29uZmlybVRhcmdldCBvbWl0dGVkIG9uIHB1cnBvc2UgYmVjYXVzZSBnYXVnaW5nIHRoZSBtYXhpbXVtIHNwZW5kYWJsZSBhbW91bnQgd2l0aCBkeW5hbWljIGZlZXMgZG9lcyBub3QgbWFrZSBzZW5zZVxuICAgKi9cbiAgYXN5bmMgbWF4aW11bVNwZW5kYWJsZShwYXJhbXM6IE1heGltdW1TcGVuZGFibGVPcHRpb25zID0ge30pOiBQcm9taXNlPE1heGltdW1TcGVuZGFibGU+IHtcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ2xpbWl0JyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ3BsYWluVGFyZ2V0JyxcbiAgICAgICdyZWNpcGllbnRBZGRyZXNzJyxcbiAgICAgICd0YXJnZXQnLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvbWF4aW11bVNwZW5kYWJsZScpKS5xdWVyeShmaWx0ZXJlZFBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdW5zcGVudHMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB1bnNwZW50cyhwYXJhbXM6IFVuc3BlbnRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeSA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdjaGFpbnMnLFxuICAgICAgJ2xpbWl0JyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ3ByZXZJZCcsXG4gICAgICAnc2Vnd2l0JyxcbiAgICAgICd0YXJnZXQnLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdW5zcGVudHMnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlIG9yIGZhbm91dCB1bnNwZW50cyBvbiBhIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcm91dGVOYW1lIC0gZWl0aGVyIGBjb25zb2xpZGF0ZWAgb3IgYGZhbm91dGBcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqXG4gICAqIFdhbGxldCBwYXJhbWV0ZXJzOlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSB0aGUgdXNlcnMgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy54cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtIGlmIHRoZSB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbiAgICpcbiAgICogRmVlIHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBmZWUgcmF0ZSB0byB1c2UgZm9yIHRoZSBjb25zb2xpZGF0aW9uIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUGVyY2VudGFnZSAtIHRoZSBtYXhpbXVtIHJlbGF0aXZlIHBvcnRpb24gdGhhdCB5b3UncmUgd2lsbGluZyB0byBzcGVuZCB0b3dhcmRzIGZlZXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQgLSBlc3RpbWF0ZSB0aGUgZmVlcyB0byBhaW0gZm9yIGZpcnN0IGNvbmZpcm1hdGlvbiB3aXRoIHRoaXMgbnVtYmVyIG9mIGJsb2Nrc1xuICAgKlxuICAgKiBJbnB1dCBwYXJhbWV0ZXJzOlxuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBpZiB0cnVlLCBtaW5Db25maXJtcyBhbHNvIGFwcGxpZXMgdG8gY2hhbmdlIG91dHB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5saW1pdCAgICAgICAgICAgICAgICBmb3Igcm91dGVOYW1lID09PSAnY29uc29saWRhdGUnXG4gICAqICAgICAgICAgICAgICAgICBwYXJhbXMubWF4TnVtSW5wdXRzVG9Vc2UgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2Zhbm91dCdcbiAgICogICAgICAgICAgICAgICAgICAtIG1heGltdW0gbnVtYmVyIG9mIHVuc3BlbnRzIHlvdSB3YW50IHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogT3V0cHV0IHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1hbmFnZVVuc3BlbnRzKFxuICAgIHJvdXRlTmFtZTogTWFuYWdlVW5zcGVudHMsXG4gICAgcGFyYW1zOiBDb25zb2xpZGF0ZVVuc3BlbnRzT3B0aW9ucyB8IEZhbm91dFVuc3BlbnRzT3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbiA9IE1hbmFnZVVuc3BlbnRzT3B0aW9ucy5CVUlMRF9TSUdOX1NFTkRcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSk7XG5cbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbXG4gICAgICAnZmVlUmF0ZScsXG4gICAgICAnbWF4RmVlUmF0ZScsXG4gICAgICAnbWF4RmVlUGVyY2VudGFnZScsXG4gICAgICAnZmVlVHhDb25maXJtVGFyZ2V0JyxcblxuICAgICAgJ21pblZhbHVlJyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnbWluSGVpZ2h0JyxcbiAgICAgICdtaW5Db25maXJtcycsXG4gICAgICAnZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlJyxcbiAgICAgICd0YXJnZXRBZGRyZXNzJyxcbiAgICAgICd0eEZvcm1hdCcsXG5cbiAgICAgIHJvdXRlTmFtZSA9PT0gJ2NvbnNvbGlkYXRlJyA/ICdsaW1pdCcgOiAnbWF4TnVtSW5wdXRzVG9Vc2UnLFxuICAgICAgJ251bVVuc3BlbnRzVG9NYWtlJyxcbiAgICBdKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy51cmwoYC8ke3JvdXRlTmFtZX1VbnNwZW50c2ApKVxuICAgICAgLnNlbmQoZmlsdGVyZWRQYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG5cbiAgICBpZiAob3B0aW9uID09PSBNYW5hZ2VVbnNwZW50c09wdGlvbnMuQlVJTERfT05MWSkge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IChhd2FpdCB0aGlzLmJhc2VDb2luXG4gICAgICAua2V5Y2hhaW5zKClcbiAgICAgIC5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQgfSkpIGFzIHVua25vd24gYXMgS2V5Y2hhaW5bXTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uUGFyYW1zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgdHhQcmVidWlsZDogcmVzcG9uc2UsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgcHViczoga2V5Y2hhaW5zLm1hcCgoaykgPT4ge1xuICAgICAgICBhc3NlcnQoay5wdWIpO1xuICAgICAgICByZXR1cm4gay5wdWI7XG4gICAgICB9KSxcbiAgICB9O1xuICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25QYXJhbXMpO1xuICAgIGNvbnN0IHNlbGVjdFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsnY29tbWVudCcsICdvdHAnXSk7XG4gICAgY29uc3QgZmluYWxUeFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBzaWduZWRUcmFuc2FjdGlvbiwgc2VsZWN0UGFyYW1zLCB7IHR5cGU6IHJvdXRlTmFtZSB9KTtcblxuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3R4L3NlbmQnKSlcbiAgICAgIC5zZW5kKGZpbmFsVHhQYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc29saWRhdGUgdW5zcGVudHMgb24gYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBUaGUgZmVlIHJhdGUgdG8gdXNlIGZvciB0aGUgY29uc29saWRhdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVBlcmNlbnRhZ2UgLSB0aGUgbWF4aW11bSByZWxhdGl2ZSBwb3J0aW9uIHRoYXQgeW91J3JlIHdpbGxpbmcgdG8gc3BlbmQgdG93YXJkcyBmZWVzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IC0gZXN0aW1hdGUgdGhlIGZlZXMgdG8gYWltIGZvciBmaXJzdCBjb25maXJtYXRpb24gd2l0aCB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5taW5WYWx1ZSAtIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1heFZhbHVlIC0gdGhlIG1heGltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluSGVpZ2h0IC0gdGhlIG1pbmltdW0gaGVpZ2h0IG9mIHVuc3BlbnRzIG9uIHRoZSBibG9jayBjaGFpbiB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIGFsbCBzZWxlY3RlZCB1bnNwZW50cyB3aWxsIGhhdmUgYXQgbGVhc3QgdGhpcyBtYW55IGNvbmZpcm1hdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gaWYgdHJ1ZSwgbWluQ29uZmlybXMgYWxzbyBhcHBsaWVzIHRvIGNoYW5nZSBvdXRwdXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGltaXQgICAgICAgICAgICAgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2NvbnNvbGlkYXRlJ1xuICAgKiAgICAgICAgICAgICAgICAgcGFyYW1zLm1heE51bUlucHV0c1RvVXNlICAgIGZvciByb3V0ZU5hbWUgPT09ICdmYW5vdXQnXG4gICAqICAgICAgICAgICAgICAgICAgLSBtYXhpbXVtIG51bWJlciBvZiB1bnNwZW50cyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlXG4gICAqL1xuICBhc3luYyBjb25zb2xpZGF0ZVVuc3BlbnRzKFxuICAgIHBhcmFtczogQ29uc29saWRhdGVVbnNwZW50c09wdGlvbnMgPSB7fSxcbiAgICBvcHRpb24gPSBNYW5hZ2VVbnNwZW50c09wdGlvbnMuQlVJTERfU0lHTl9TRU5EXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlVW5zcGVudHMoJ2NvbnNvbGlkYXRlJywgcGFyYW1zLCBvcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhbm91dCB1bnNwZW50cyBvbiBhIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHVzZXJzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMueHBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybSBpZiB0aGUgd2FsbGV0UGFzc3BocmFzZSBpcyBub3QgYXZhaWxhYmxlXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSB0aGUgbWluaW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkhlaWdodCAtIHRoZSBtaW5pbXVtIGhlaWdodCBvZiB1bnNwZW50cyBvbiB0aGUgYmxvY2sgY2hhaW4gdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUGVyY2VudGFnZSAtIHRoZSBtYXhpbXVtIHByb3BvcnRpb24gb2YgYW4gdW5zcGVudCB5b3UgYXJlIHdpbGxpbmcgdG8gbG9zZSB0byBmZWVzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IC0gZXN0aW1hdGUgdGhlIGZlZXMgdG8gYWltIGZvciBmaXJzdCBjb25maXJtYXRpb24gd2l0aCB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gVGhlIGRlc2lyZWQgZmVlIHJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSBUaGUgbWF4IGxpbWl0IGZvciBhIGZlZSByYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4TnVtSW5wdXRzVG9Vc2UgLSB0aGUgbnVtYmVyIG9mIHVuc3BlbnRzIHlvdSB3YW50IHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5udW1VbnNwZW50c1RvTWFrZSAtIHRoZSBudW1iZXIgb2YgbmV3IHVuc3BlbnRzIHRvIG1ha2VcbiAgICovXG4gIGFzeW5jIGZhbm91dFVuc3BlbnRzKHBhcmFtczogRmFub3V0VW5zcGVudHNPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZVVuc3BlbnRzKCdmYW5vdXQnLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdG9rZW4gZmx1c2ggdGhyZXNob2xkcyBmb3IgdGhlIHdhbGxldC4gVXBkYXRlcyB0aGUgd2FsbGV0LlxuICAgKiBUb2tlbnMgd2lsbCBvbmx5IGJlIGZsdXNoZWQgZnJvbSBmb3J3YXJkZXIgY29udHJhY3RzIGlmIHRoZSBiYWxhbmNlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdGhyZXNob2xkIGRlZmluZWQgaGVyZS5cbiAgICogQHBhcmFtIHRocmVzaG9sZHMge09iamVjdH0gLSBwYWlycyBvZiB7IFt0b2tlbk5hbWVdOiB0aHJlc2hvbGQgfSAoYmFzZSB1bml0cylcbiAgICovXG4gIGFzeW5jIHVwZGF0ZVRva2VuRmx1c2hUaHJlc2hvbGRzKHRocmVzaG9sZHM6IGFueSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ2V0aCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB3YWxsZXQnKTtcbiAgICB9XG5cbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucHV0KHRoaXMudXJsKCkpXG4gICAgICAuc2VuZCh7XG4gICAgICAgIHRva2VuRmx1c2hUaHJlc2hvbGRzOiB0aHJlc2hvbGRzLFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuICAvKipcbiAgICAgICogVXBkYXRlcyB0aGUgd2FsbGV0LiBTZXRzIGZsYWdzIGZvciBkZXBsb3lGb3J3YXJkZXJzTWFudWFsbHkgYW5kIGZsdXNoRm9yd2FyZGVyc01hbnVhbGx5IG9mIHRoZSB3YWxsZXQuXG4gICAgICAqIEBwYXJhbSBmb3J3YXJkZXJGbGFncyB7T2JqZWN0fSAtIHtcbiAgICAgICAgXCJjb2luU3BlY2lmaWNcIjoge1xuICAgICAgICAgIFtjb2luTmFtZV06IHtcbiAgICAgICAgICAgIFwiZGVwbG95Rm9yd2FyZGVyc01hbnVhbGx5XCI6IHtCb29sZWFufSxcbiAgICAgICAgICAgIFwiZmx1c2hGb3J3YXJkZXJzTWFudWFsbHlcIjoge0Jvb2xlYW59XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAqL1xuICBhc3luYyB1cGRhdGVGb3J3YXJkZXJzKGZvcndhcmRlckZsYWdzOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucHV0KHRoaXMudXJsKCkpLnNlbmQoZm9yd2FyZGVyRmxhZ3MpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIG1hbnVhbGx5IGRlcGxveSBhbiBFVEggYWRkcmVzc1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuYWRkcmVzc10gLSBhZGRyZXNzSWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuaWRdIC0gYWRkcmVzc0lkIGNvdWxkIGJlIHJlY2VpdmVkIGFsc28gYXMgaWRcbiAgICogQHJldHVybnMge09iamVjdH0gSHR0cCByZXNwb25zZVxuICAgKi9cbiAgYXN5bmMgZGVwbG95Rm9yd2FyZGVycyhwYXJhbXM6IERlcGxveUZvcndhcmRlcnNPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYWRkcmVzcykgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkZHJlc3Mgb3IgaWQgb2YgYWRkcmVzcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBsZXQgcXVlcnk7XG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzKSB7XG4gICAgICBxdWVyeSA9IHBhcmFtcy5hZGRyZXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeSA9IHBhcmFtcy5pZDtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoYC9hZGRyZXNzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX0vZGVwbG95bWVudGApO1xuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh1cmwpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIG1hbnVhbGx5IGZvcndhcmQgdG9rZW5zIGZyb20gYW4gRVRIIG9yIENFTE8gYWRkcmVzc1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50b2tlbk5hbWUgLSBOYW1lIG9mIHRva2VuIHRoYXQgbmVlZHMgdG8gYmUgZm9yd2FyZGVkIGZyb20gdGhlIGFkZHJlc3NcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuYWRkcmVzc10gLVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5hZGRyZXNzXSAtIGFkZHJlc3NJZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5pZF0gLSBhZGRyZXNzSWQgY291bGQgYmUgcmVjZWl2ZWQgYWxzbyBhcyBpZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5nYXNQcmljZV0gLSBFeHBsaWNpdCBnYXMgcHJpY2UgdG8gdXNlIHdoZW4gZm9yd2FyZGluZyB0b2tlbiBmcm9tIHRoZSBmb3J3YXJkZXIgY29udHJhY3QgKEVUSCBhbmQgQ2VsbyBvbmx5KS4gSWYgbm90IGdpdmVuLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBlc3RpbWF0ZWQgbmV0d29yayBnYXMgcHJpY2UuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmVpcDE1NTldIC0gU3BlY2lmeSBlaXAxNTU5IGZlZSBwYXJhbWV0ZXJzIGluIHRva2VuIGZvcndhcmRpbmcgdHJhbnNhY3Rpb24uXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEh0dHAgcmVzcG9uc2VcbiAgICovXG4gIGFzeW5jIGZsdXNoRm9yd2FyZGVyVG9rZW4ocGFyYW1zOiBGbHVzaEZvcndhcmRlclRva2VuT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmFkZHJlc3MpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhZGRyZXNzIG9yIGlkIG9mIGFkZHJlc3MgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuaWQ7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKGAvYWRkcmVzcy8ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9L3Rva2VuZm9yd2FyZGApO1xuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh1cmwpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFN3ZWVwIGZ1bmRzIGZvciBhIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5hZGRyZXNzIC0gVGhlIGFkZHJlc3MgdG8gc2VuZCBhbGwgdGhlIGZ1bmRzIGluIHRoZSB3YWxsZXQgdG9cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHVzZXJzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMueHBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybSBpZiB0aGUgd2FsbGV0UGFzc3BocmFzZSBpcyBub3QgYXZhaWxhYmxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMub3RwIC0gVHdvIGZhY3RvciBhdXRoIGNvZGUgdG8gZW5hYmxlIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IC0gRXN0aW1hdGUgdGhlIGZlZXMgdG8gYWltIGZvciBmaXJzdCBjb25maXJtYXRpb24gd2l0aGluIHRoaXMgbnVtYmVyIG9mIGJsb2Nrc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBUaGUgZGVzaXJlZCBmZWUgcmF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbcGFyYW1zLm1heEZlZVJhdGVdIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtCb29sZWFufSBbcGFyYW1zLmFsbG93UGFydGlhbFN3ZWVwXSAtIGFsbG93cyBzd2VlcGluZyAyMDAgdW5zcGVudHMgd2hlbiB0aGUgd2FsbGV0IGhhcyBtb3JlIHRoYW4gdGhhdFxuICAgKiBAcmV0dXJucyB0eEhleCB7U3RyaW5nfSB0aGUgdHhIZXggb2YgdGhlIHNpZ25lZCB0cmFuc2FjdGlvblxuICAgKi9cbiAgYXN5bmMgc3dlZXAocGFyYW1zOiBTd2VlcE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydicsICdvdHAnXSk7XG5cbiAgICAvLyBUaGUgc3dlZXAgQVBJIGVuZHBvaW50IGlzIG9ubHkgYXZhaWxhYmxlIHRvIHV0eG8tYmFzZWQgY29pbnNcblxuICAgIGlmICghdGhpcy5iYXNlQ29pbi5zd2VlcFdpdGhTZW5kTWFueSgpKSB7XG4gICAgICBpZiAodGhpcy5jb25maXJtZWRCYWxhbmNlU3RyaW5nKCkgIT09IHRoaXMuYmFsYW5jZVN0cmluZygpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnY2Fubm90IHN3ZWVwIHdoZW4gdW5jb25maXJtZWQgZnVuZHMgZXhpc3Qgb24gdGhlIHdhbGxldCwgcGxlYXNlIHdhaXQgdW50aWwgYWxsIGluYm91bmQgdHJhbnNhY3Rpb25zIGNvbmZpcm0nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zcGVuZGFibGVCYWxhbmNlU3RyaW5nKCk7XG4gICAgICBpZiAoXy5pc1VuZGVmaW5lZCh2YWx1ZSkgfHwgdmFsdWUgPT09ICcwJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGZ1bmRzIHRvIHN3ZWVwJyk7XG4gICAgICB9XG4gICAgICAocGFyYW1zIGFzIGFueSkucmVjaXBpZW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IHBhcmFtcy5hZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogdmFsdWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICByZXR1cm4gdGhpcy5zZW5kTWFueShwYXJhbXMpO1xuICAgIH1cbiAgICAvLyB0aGUgZm9sbG93aW5nIGZsb3cgd29ya3MgZm9yIGFsbCBVVFhPIGNvaW5zXG5cbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbXG4gICAgICAnYWRkcmVzcycsXG4gICAgICAnZmVlUmF0ZScsXG4gICAgICAnbWF4RmVlUmF0ZScsXG4gICAgICAnZmVlVHhDb25maXJtVGFyZ2V0JyxcbiAgICAgICdhbGxvd1BhcnRpYWxTd2VlcCcsXG4gICAgXSk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3N3ZWVwV2FsbGV0JykpLnNlbmQoZmlsdGVyZWRQYXJhbXMpLnJlc3VsdCgpO1xuXG4gICAgLy8gVE9ETyhCRy0zNTg4KTogYWRkIHR4SGV4IHZhbGlkYXRpb24gdG8gcHJvdGVjdCBtYW4gaW4gdGhlIG1pZGRsZSBhdHRhY2tzIHJlcGxhY2luZyB0aGUgdHhIZXhcblxuICAgIGNvbnN0IGtleWNoYWlucyA9IChhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZCB9KSkgYXMgYW55O1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25QYXJhbXMgPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICB0eFByZWJ1aWxkOiByZXNwb25zZSxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICB1c2VyS2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIGJhY2t1cEtleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMSA/IGtleWNoYWluc1sxXSA6IG51bGwsXG4gICAgICBiaXRnb0tleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMiA/IGtleWNoYWluc1syXSA6IG51bGwsXG4gICAgICBwcnY6IHBhcmFtcy54cHJ2LFxuICAgIH07XG4gICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbih0cmFuc2FjdGlvblBhcmFtcyk7XG5cbiAgICBjb25zdCBzZWxlY3RQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ290cCddKTtcbiAgICBjb25zdCBmaW5hbFR4UGFyYW1zID0gXy5leHRlbmQoe30sIHNpZ25lZFRyYW5zYWN0aW9uLCBzZWxlY3RQYXJhbXMpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3R4L3NlbmQnKSlcbiAgICAgIC5zZW5kKGZpbmFsVHhQYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRnJlZXplIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBmcmVlemUocGFyYW1zOiBGcmVlemVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSk7XG5cbiAgICBpZiAocGFyYW1zLmR1cmF0aW9uKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmR1cmF0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZHVyYXRpb246IHNob3VsZCBiZSBudW1iZXIgb2Ygc2Vjb25kcycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9mcmVlemUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjb21tZW50IG9mIGEgdHJhbnNmZXJcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyQ29tbWVudChwYXJhbXM6IFRyYW5zZmVyQ29tbWVudE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbJ2NvbW1lbnQnXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvdHJhbnNmZXIvJyArIHBhcmFtcy5pZCArICcvY29tbWVudCcpKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIGFkZHJlc3NlcyBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGFkZHJlc3NlcyhwYXJhbXM6IEFkZHJlc3Nlc09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdKTtcblxuICAgIGNvbnN0IHF1ZXJ5OiBBZGRyZXNzZXNPcHRpb25zID0ge307XG5cbiAgICBpZiAocGFyYW1zLm1pbmUpIHtcbiAgICAgIHF1ZXJ5Lm1pbmUgPSAhIXBhcmFtcy5taW5lO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMucHJldklkKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcmV2SWQgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnByZXZJZCA9IHBhcmFtcy5wcmV2SWQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zb3J0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnNvcnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzb3J0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5zb3J0ID0gcGFyYW1zLnNvcnQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxhYmVsQ29udGFpbnMpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMubGFiZWxDb250YWlucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxhYmVsQ29udGFpbnMgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxhYmVsQ29udGFpbnMgPSBwYXJhbXMubGFiZWxDb250YWlucztcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnNlZ3dpdCkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLnNlZ3dpdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNlZ3dpdCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnNlZ3dpdCA9IHBhcmFtcy5zZWd3aXQ7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5jaGFpbnMpKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheShwYXJhbXMuY2hhaW5zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2hhaW5zIGFyZ3VtZW50LCBleHBlY3RpbmcgYXJyYXkgb2YgbnVtYmVycycpO1xuICAgICAgfVxuICAgICAgcXVlcnkuY2hhaW5zID0gcGFyYW1zLmNoYWlucztcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLmluY2x1ZGVCYWxhbmNlcykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluY2x1ZGVCYWxhbmNlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY2x1ZGVCYWxhbmNlcyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmluY2x1ZGVCYWxhbmNlcyA9IHBhcmFtcy5pbmNsdWRlQmFsYW5jZXM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlVG9rZW5zKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuaW5jbHVkZVRva2VucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY2x1ZGVUb2tlbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlVG9rZW5zID0gcGFyYW1zLmluY2x1ZGVUb2tlbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlVG90YWxBZGRyZXNzQ291bnQpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlVG90YWxBZGRyZXNzQ291bnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlVG90YWxBZGRyZXNzQ291bnQgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlVG90YWxBZGRyZXNzQ291bnQgPSBwYXJhbXMuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmV0dXJuQmFsYW5jZXNGb3JUb2tlbikge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5yZXR1cm5CYWxhbmNlc0ZvclRva2VuKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmV0dXJuQmFsYW5jZXNGb3JUb2tlbiBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucmV0dXJuQmFsYW5jZXNGb3JUb2tlbiA9IHBhcmFtcy5yZXR1cm5CYWxhbmNlc0ZvclRva2VuO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMucGVuZGluZ0RlcGxveW1lbnQpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5wZW5kaW5nRGVwbG95bWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBlbmRpbmdEZXBsb3ltZW50IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkucGVuZGluZ0RlcGxveW1lbnQgPSBwYXJhbXMucGVuZGluZ0RlcGxveW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvYWRkcmVzc2VzJykpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc2luZ2xlIHdhbGxldCBhZGRyZXNzIGJ5IGl0cyBpZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0QWRkcmVzcyhwYXJhbXM6IEdldEFkZHJlc3NPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ2FkZHJlc3MnLCAnaWQnXSk7XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSAmJiBfLmlzVW5kZWZpbmVkKHBhcmFtcy5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzcyBvciBpZCBvZiBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuaWQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoYC93YWxsZXQvJHt0aGlzLl93YWxsZXQuaWR9L2FkZHJlc3MvJHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWApKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBvbmUgb3IgbW9yZSBuZXcgYWRkcmVzcyhlcykgZm9yIHVzZSB3aXRoIHRoaXMgd2FsbGV0LlxuICAgKlxuICAgKiBJZiB0aGUgYGNvdW50YCBmaWVsZCBpcyBkZWZpbmVkIGFuZCBncmVhdGVyIHRoYW4gMSwgYW4gb2JqZWN0IHdpdGggYSBzaW5nbGVcbiAgICogYXJyYXkgcHJvcGVydHkgbmFtZWQgYGFkZHJlc3Nlc2AgY29udGFpbmluZyBgY291bnRgIGFkZHJlc3Mgb2JqZWN0c1xuICAgKiB3aWxsIGJlIHJldHVybmVkLiBPdGhlcndpc2UsIGEgc2luZ2xlIGFkZHJlc3Mgb2JqZWN0IGlzIHJldHVybmVkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuY2hhaW4gb24gd2hpY2ggdGhlIG5ldyBhZGRyZXNzIHNob3VsZCBiZSBjcmVhdGVkXG4gICAqIEBwYXJhbSB7KE51bWJlcnxTdHJpbmcpfSBwYXJhbXMuZ2FzUHJpY2UgZ2FzIHByaWNlIGZvciBuZXcgYWRkcmVzcyBjcmVhdGlvbiwgaWYgYXBwbGljYWJsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmxhYmVsIGxhYmVsIGZvciB0aGUgbmV3IGFkZHJlc3MoZXMpXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuY291bnQ9MSBudW1iZXIgb2YgbmV3IGFkZHJlc3NlcyB3aGljaCBzaG91bGQgYmUgY3JlYXRlZCAobWF4aW11bSAyNTApXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZm9yd2FyZGVyVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiBhZGRyZXNzIHRvIGNyZWF0ZSwgaWYgYXBwbGljYWJsZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5sb3dQcmlvcml0eSBFdGhlcmV1bS1zcGVjaWZpYyBwYXJhbSB0byBjcmVhdGUgYWRkcmVzcyB1c2luZyBsb3cgcHJpb3JpdHkgZmVlIGFkZHJlc3NcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5iYXNlQWRkcmVzcyBiYXNlIGFkZHJlc3Mgb2YgdGhlIHdhbGxldChvcHRpb25hbCBwYXJhbWV0ZXIpXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmFsbG93U2tpcFZlcmlmeUFkZHJlc3MgV2hlbiBzZXQgdG8gZmFsc2UsIGl0IHRocm93cyBlcnJvciBpZiBhZGRyZXNzIHZlcmlmaWNhdGlvbiBpcyBza2lwcGVkIGZvciBhbnkgcmVhc29uLiBEZWZhdWx0IGlzIHRydWUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMub25Ub2tlbiBtYW5kYXRvcnkgaW4gY2FzZSBvZiB0aGUgT0ZDIHdhbGxldCwgdGhlIG5hbWUgb2YgdG9rZW4gdG8gY3JlYXRlIGFkZHJlc3MgZm9yXG4gICAqIEFkZHJlc3MgdmVyaWZpY2F0aW9uIGNhbiBiZSBza2lwcGVkIHdoZW4gZm9yd2FyZGVyVmVyc2lvbiBpcyAwIGFuZCBwZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiBpcyB0cnVlIE9SXG4gICAqIGlmICdjb2luU3BlY2lmaWMnIGlzIG5vdCBwYXJ0IG9mIHRoZSByZXNwb25zZSBmcm9tIGFwaSBjYWxsIHRvIGNyZWF0ZSBhZGRyZXNzXG4gICAqL1xuICBhc3luYyBjcmVhdGVBZGRyZXNzKHBhcmFtczogQ3JlYXRlQWRkcmVzc09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgYWRkcmVzc1BhcmFtczogQ3JlYXRlQWRkcmVzc09wdGlvbnMgPSB7fTtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG5cbiAgICBjb25zdCB7XG4gICAgICBjaGFpbixcbiAgICAgIGdhc1ByaWNlLFxuICAgICAgbGFiZWwsXG4gICAgICBsb3dQcmlvcml0eSxcbiAgICAgIGZvcndhcmRlclZlcnNpb24sXG4gICAgICBmb3JtYXQsXG4gICAgICBjb3VudCA9IDEsXG4gICAgICBiYXNlQWRkcmVzcyxcbiAgICAgIGFsbG93U2tpcFZlcmlmeUFkZHJlc3MgPSB0cnVlLFxuICAgICAgb25Ub2tlbixcbiAgICB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGNoYWluKSkge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihjaGFpbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjaGFpbiBoYXMgdG8gYmUgYW4gaW50ZWdlcicpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5jaGFpbiA9IGNoYWluO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChnYXNQcmljZSkpIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIoZ2FzUHJpY2UpICYmIChpc05hTihOdW1iZXIoZ2FzUHJpY2UpKSB8fCAhXy5pc1N0cmluZyhnYXNQcmljZSkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZ2FzUHJpY2UgaGFzIHRvIGJlIGFuIGludGVnZXIgb3IgbnVtZXJpYyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuZ2FzUHJpY2UgPSBnYXNQcmljZTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZm9yd2FyZGVyVmVyc2lvbikpIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIoZm9yd2FyZGVyVmVyc2lvbikgfHwgZm9yd2FyZGVyVmVyc2lvbiA8IDAgfHwgZm9yd2FyZGVyVmVyc2lvbiA+IDMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3J3YXJkZXJWZXJzaW9uIGhhcyB0byBiZSBhbiBpbnRlZ2VyIDAsIDEsIDIgb3IgMycpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5mb3J3YXJkZXJWZXJzaW9uID0gZm9yd2FyZGVyVmVyc2lvbjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnICYmIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlY2RzYScpIHtcbiAgICAgIGFkZHJlc3NQYXJhbXMuZm9yd2FyZGVyVmVyc2lvbiA9IDM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGxhYmVsKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGxhYmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xhYmVsIGhhcyB0byBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5sYWJlbCA9IGxhYmVsO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChiYXNlQWRkcmVzcykpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhiYXNlQWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYXNlQWRkcmVzcyBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4oYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbGxvd1NraXBWZXJpZnlBZGRyZXNzIGhhcyB0byBiZSBhIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNJbnRlZ2VyKGNvdW50KSB8fCBjb3VudCA8PSAwIHx8IGNvdW50ID4gMjUwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdW50IGhhcyB0byBiZSBhIG51bWJlciBiZXR3ZWVuIDEgYW5kIDI1MCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChsb3dQcmlvcml0eSkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4obG93UHJpb3JpdHkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbG93UHJpb3JpdHkgaGFzIHRvIGJlIGEgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5sb3dQcmlvcml0eSA9IGxvd1ByaW9yaXR5O1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChmb3JtYXQpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoZm9ybWF0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Zvcm1hdCBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuZm9ybWF0ID0gZm9ybWF0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpID09PSAnb2ZjJykge1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKG9uVG9rZW4pKSB7XG4gICAgICAgIGlmICghXy5pc1N0cmluZyhvblRva2VuKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb25Ub2tlbiBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9mY1Rva2Vucy5pbmNsdWRlcyhvblRva2VuKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBPRkMgdG9rZW4nKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRyZXNzUGFyYW1zLm9uVG9rZW4gPSBvblRva2VuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvblRva2VuIGlzIGEgbWFuZGF0b3J5IHBhcmFtZXRlciBmb3IgT0ZDIHdhbGxldHMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghXy5pc1N0cmluZyhvblRva2VuKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uVG9rZW4gaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2V0IGtleWNoYWlucyBmb3IgYWRkcmVzcyB2ZXJpZmljYXRpb25cbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLl93YWxsZXQua2V5cy5tYXAoKGspID0+IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHsgaWQ6IGssIHJlcUlkIH0pKSk7XG4gICAgY29uc3Qgcm9vdEFkZHJlc3MgPSBfLmdldCh0aGlzLl93YWxsZXQsICdyZWNlaXZlQWRkcmVzcy5hZGRyZXNzJyk7XG5cbiAgICBjb25zdCBuZXdBZGRyZXNzZXMgPSBfLnRpbWVzKGNvdW50LCBhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgICAgY29uc3QgbmV3QWRkcmVzcyA9IChhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL2FkZHJlc3MnKSlcbiAgICAgICAgLnNlbmQoYWRkcmVzc1BhcmFtcylcbiAgICAgICAgLnJlc3VsdCgpKSBhcyBhbnk7XG5cbiAgICAgIC8vIGluZmVyIGl0cyBhZGRyZXNzIHR5cGVcbiAgICAgIGlmIChfLmlzT2JqZWN0KG5ld0FkZHJlc3MuY29pblNwZWNpZmljKSkge1xuICAgICAgICBuZXdBZGRyZXNzLmFkZHJlc3NUeXBlID0gaW5mZXJBZGRyZXNzVHlwZShuZXdBZGRyZXNzKTtcbiAgICAgIH1cblxuICAgICAgbmV3QWRkcmVzcy5rZXljaGFpbnMgPSBrZXljaGFpbnM7XG4gICAgICBuZXdBZGRyZXNzLmJhc2VBZGRyZXNzID0gYmFzZUFkZHJlc3MgPz8gXy5nZXQodGhpcy5fd2FsbGV0LCAnY29pblNwZWNpZmljLmJhc2VBZGRyZXNzJyk7XG5cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkRhdGE6IFZlcmlmeUFkZHJlc3NPcHRpb25zID0gXy5tZXJnZSh7fSwgbmV3QWRkcmVzcywgeyByb290QWRkcmVzcyB9KTtcblxuICAgICAgaWYgKHZlcmlmaWNhdGlvbkRhdGEuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEFkZHJlc3NHZW5lcmF0aW9uRXJyb3IodmVyaWZpY2F0aW9uRGF0YS5lcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHZlcmlmaWNhdGlvbkRhdGEuaW1wbGllZEZvcndhcmRlclZlcnNpb24gPSBmb3J3YXJkZXJWZXJzaW9uID8/IHZlcmlmaWNhdGlvbkRhdGEuY29pblNwZWNpZmljPy5mb3J3YXJkZXJWZXJzaW9uO1xuICAgICAgLy8gVGhpcyBjb25kaXRpb24gd2FzIGFkZGVkIGluIGZpcnN0IHBsYWNlIGJlY2F1c2UgaW4gY2Vsbywgd2hlbiB2ZXJpZnlBZGRyZXNzIG1ldGhvZCB3YXMgY2FsbGVkIG9uIGFkZHJlc3NlcyB3aGljaCB3ZXJlIGhhdmluZyBwZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiBhcyB0cnVlLCBpdCB1c2VkIHRvIHRocm93IHNvbWUgZXJyb3JcbiAgICAgIC8vIEluIGNhc2Ugb2YgZm9yd2FyZGVyIHZlcnNpb24gMSBldGggYWRkcmVzc2VzLCBhZGRyZXNzZXMgbmVlZCB0byBiZSB2ZXJpZmllZCBldmVuIGlmIHRoZSBwZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiBmbGFnIGlzIHRydWVcbiAgICAgIGlmIChcbiAgICAgICAgdmVyaWZpY2F0aW9uRGF0YS5jb2luU3BlY2lmaWMgJiZcbiAgICAgICAgKCF2ZXJpZmljYXRpb25EYXRhLmNvaW5TcGVjaWZpYy5wZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiB8fCB2ZXJpZmljYXRpb25EYXRhLmltcGxpZWRGb3J3YXJkZXJWZXJzaW9uID09PSAxKVxuICAgICAgKSB7XG4gICAgICAgIC8vIGNhbid0IHZlcmlmeSBhZGRyZXNzZXMgd2hpY2ggYXJlIHBlbmRpbmcgY2hhaW4gaW5pdGlhbGl6YXRpb24sIGFzIHRoZSBhZGRyZXNzIGlzIGhpZGRlblxuICAgICAgICBsZXQgaXNXYWxsZXRBZGRyZXNzID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaXNXYWxsZXRBZGRyZXNzID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5pc1dhbGxldEFkZHJlc3ModmVyaWZpY2F0aW9uRGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcikpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEZJWE1FKEJHLTQzMjI1KTogaW1wbGVtZW50IHRoaXMgY29ycmVjdGx5XG4gICAgICAgICAgaXNXYWxsZXRBZGRyZXNzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzV2FsbGV0QWRkcmVzcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm90IGEgd2FsbGV0IGFkZHJlc3NgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGFkZHJlc3MgdmVyaWZpY2F0aW9uIHNraXBwZWQgZm9yIGNvdW50ID0gJHtjb3VudH1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld0FkZHJlc3M7XG4gICAgfSk7XG5cbiAgICBpZiAobmV3QWRkcmVzc2VzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIG5ld0FkZHJlc3Nlc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWRkcmVzc2VzOiBhd2FpdCBQcm9taXNlLmFsbChuZXdBZGRyZXNzZXMpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHByb3BlcnRpZXMgb24gYW4gYWRkcmVzc1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlQWRkcmVzcyhwYXJhbXM6IFVwZGF0ZUFkZHJlc3NPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGFkZHJlc3MgPSBwYXJhbXMuYWRkcmVzcztcblxuICAgIGlmICghXy5pc1N0cmluZyhhZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgYWRkcmVzcycpO1xuICAgIH1cblxuICAgIGNvbnN0IHB1dFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsnbGFiZWwnXSk7XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9hZGRyZXNzLycgKyBlbmNvZGVVUklDb21wb25lbnQoYWRkcmVzcykpO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucHV0KHVybCkuc2VuZChwdXRQYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3Qgd2ViaG9va3Mgb24gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgbGlzdFdlYmhvb2tzKHBhcmFtczogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcXVlcnk6IFBhZ2luYXRpb25PcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbXVsYXRlIHdhbGxldCB3ZWJob29rLCBjdXJyZW50bHkgZm9yIHdlYmhvb2tzIG9mIHR5cGUgdHJhbnNmZXIgYW5kIHBlbmRpbmcgYXBwcm92YWxcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHdlYmhvb2tJZCAocmVxdWlyZWQpIGlkIG9mIHRoZSB3ZWJob29rIHRvIGJlIHNpbXVsYXRlZFxuICAgKiAtIHRyYW5zZmVySWQgKG9wdGlvbmFsIGJ1dCByZXF1aXJlZCBmb3IgdHJhbnNmZXIgd2ViaG9va3MpIGlkIG9mIHRoZSBzaW11bGF0ZWQgdHJhbnNmZXJcbiAgICogLSBwZW5kaW5nQXBwcm92YWxJZCAob3B0aW9uYWwgYnV0IHJlcXVpcmVkIGZvciBwZW5kaW5nIGFwcHJvdmFsIHdlYmhvb2tzKSBpZCBvZiB0aGUgc2ltdWxhdGVkIHBlbmRpbmcgYXBwcm92YWxcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzaW11bGF0ZVdlYmhvb2socGFyYW1zOiBTaW11bGF0ZVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2ViaG9va0lkJ10sIFsndHJhbnNmZXJJZCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICAgIGNvbnN0IGhhc1RyYW5zZmVySWQgPSAhIXBhcmFtcy50cmFuc2ZlcklkO1xuICAgIGNvbnN0IGhhc1BlbmRpbmdBcHByb3ZhbElkID0gISFwYXJhbXMucGVuZGluZ0FwcHJvdmFsSWQ7XG4gICAgaWYgKCFoYXNUcmFuc2ZlcklkICYmICFoYXNQZW5kaW5nQXBwcm92YWxJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHJhbnNmZXJJZCBvciBwZW5kaW5nQXBwcm92YWxJZCcpO1xuICAgIH1cblxuICAgIGlmIChoYXNUcmFuc2ZlcklkICYmIGhhc1BlbmRpbmdBcHByb3ZhbElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3Qgc3VwcGx5IGVpdGhlciB0cmFuc2ZlcklkIG9yIHBlbmRpbmdBcHByb3ZhbElkLCBidXQgbm90IGJvdGgnKTtcbiAgICB9XG5cbiAgICAvLyBkZXBlbmRpbmcgb24gdGhlIGNvaW4gdHlwZSBvZiB0aGUgd2FsbGV0LCB0aGUgdHhIYXNoIGhhcyB0byBhZGhlcmUgdG8gaXRzIHJlc3BlY3RpdmUgZm9ybWF0XG4gICAgLy8gYnV0IHRoZSBzZXJ2ZXIgdGFrZXMgY2FyZSBvZiB0aGF0XG5cbiAgICAvLyBvbmx5IHRha2UgdGhlIHRyYW5zZmVySWQgYW5kIHBlbmRpbmdBcHByb3ZhbElkIHByb3BlcnRpZXNcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsndHJhbnNmZXJJZCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICAgIGNvbnN0IHdlYmhvb2tJZCA9IHBhcmFtcy53ZWJob29rSWQ7XG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKCcvd2ViaG9va3MvJyArIHdlYmhvb2tJZCArICcvc2ltdWxhdGUnKSlcbiAgICAgIC5zZW5kKGZpbHRlcmVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHdlYmhvb2sgdG8gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgYWRkV2ViaG9vayhwYXJhbXM6IE1vZGlmeVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJywgJ3R5cGUnXSwgW10pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSB3ZWJob29rIGZyb20gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgcmVtb3ZlV2ViaG9vayhwYXJhbXM6IE1vZGlmeVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJywgJ3R5cGUnXSwgW10pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVzZXIga2V5IGNoYWluIGZvciB0aGlzIHdhbGxldFxuICAgKlxuICAgKiBUaGUgdXNlciBrZXkgY2hhaW4gaXMgdGhlIGZpcnN0IGtleWNoYWluIG9mIHRoZSB3YWxsZXQgYW5kIHVzdWFsbHkgaGFzIHRoZSBlbmNyeXB0ZWQgcHJ2IHN0b3JlZCBvbiBCaXRHby5cbiAgICogVXNlZnVsIHdoZW4gdHJ5aW5nIHRvIGdldCB0aGUgdXNlcnMnIGtleWNoYWluIGZyb20gdGhlIHNlcnZlciBiZWZvcmUgZGVjcnlwdGluZyB0byBzaWduIGEgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGdldEVuY3J5cHRlZFVzZXJLZXljaGFpbihwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTx7IGVuY3J5cHRlZFBydjogc3RyaW5nIH0+IHtcbiAgICBjb25zdCB0cnlLZXlDaGFpbiA9IGFzeW5jIChpbmRleDogbnVtYmVyKTogUHJvbWlzZTx7IGVuY3J5cHRlZFBydjogc3RyaW5nIH0+ID0+IHtcbiAgICAgIGlmICghdGhpcy5fd2FsbGV0LmtleXMgfHwgaW5kZXggPj0gdGhpcy5fd2FsbGV0LmtleXMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gZW5jcnlwdGVkIGtleWNoYWlucyBvbiB0aGlzIHdhbGxldC4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyYW1zID0geyBpZDogdGhpcy5fd2FsbGV0LmtleXNbaW5kZXhdIH07XG5cbiAgICAgIGNvbnN0IGtleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXQocGFyYW1zKTtcbiAgICAgIC8vIElmIHdlIGZpbmQgdGhlIHBydiwgdGhlbiB0aGlzIGlzIHByb2JhYmx5IHRoZSB1c2VyIGtleWNoYWluIHdlJ3JlIGxvb2tpbmcgZm9yXG4gICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSB7XG4gICAgICAgIHJldHVybiBrZXljaGFpbiBhcyB7IGVuY3J5cHRlZFBydjogc3RyaW5nIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ5S2V5Q2hhaW4oaW5kZXggKyAxKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRyeUtleUNoYWluKDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVuZW5jcnlwdGVkIHByaXZhdGUga2V5IGZvciB0aGlzIHdhbGxldCAoYmUgY2FyZWZ1bCEpXG4gICAqIFJlcXVpcmVzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGdldFBydihwYXJhbXM6IEdldFBydk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICdwcnYnXSk7XG5cbiAgICAvLyBQcmVwYXJlIHNpZ25pbmcga2V5XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnBydikgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBlaXRoZXIgcHJvdmlkZSBwcnYgb3Igd2FsbGV0IHBhc3NwaHJhc2UnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnBydikgJiYgIV8uaXNTdHJpbmcocGFyYW1zLnBydikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpICYmICFfLmlzU3RyaW5nKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXRQYXNzcGhyYXNlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnBydikge1xuICAgICAgcmV0dXJuIHBhcmFtcy5wcnY7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcktleWNoYWluID0gKGF3YWl0IHRoaXMuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCkpIGFzIGFueTtcbiAgICBjb25zdCB1c2VyRW5jcnlwdGVkUHJ2ID0gdXNlcktleWNoYWluLmVuY3J5cHRlZFBydjtcblxuICAgIGxldCB1c2VyUHJ2O1xuICAgIHRyeSB7XG4gICAgICB1c2VyUHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IHVzZXJFbmNyeXB0ZWRQcnYsIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Vycm9yIGRlY3J5cHRpbmcgd2FsbGV0IHBhc3NwaHJhc2UnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXNlclBydjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGFuIGVuY3J5cHRlZCB3YWxsZXQgc2hhcmUgdG8gQml0R28uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNoYXJlKHBhcmFtczogQ3JlYXRlU2hhcmVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXNlcicsICdwZXJtaXNzaW9ucyddLCBbXSk7XG5cbiAgICBpZiAocGFyYW1zLmtleWNoYWluICYmICFfLmlzRW1wdHkocGFyYW1zLmtleWNoYWluKSkge1xuICAgICAgaWYgKFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLnB1YiB8fFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLmVuY3J5cHRlZFBydiB8fFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLmZyb21QdWJLZXkgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi50b1B1YktleSB8fFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLnBhdGhcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVzIGtleWNoYWluIHBhcmFtZXRlcnMgLSBwdWIsIGVuY3J5cHRlZFBydiwgZnJvbVB1YktleSwgdG9QdWJLZXksIHBhdGgnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvc2hhcmUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlIHRoaXMgd2FsbGV0IHdpdGggYW5vdGhlciBCaXRHbyB1c2VyLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2hhcmVXYWxsZXQocGFyYW1zOiBTaGFyZVdhbGxldE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydlbWFpbCcsICdwZXJtaXNzaW9ucyddLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAnbWVzc2FnZSddKTtcblxuICAgIGlmIChwYXJhbXMucmVzaGFyZSAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMucmVzaGFyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVzaGFyZSB0byBiZSBhIGJvb2xlYW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5za2lwS2V5Y2hhaW4gIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnNraXBLZXljaGFpbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgc2tpcEtleWNoYWluIHRvIGJlIGEgYm9vbGVhbi4gJyk7XG4gICAgfVxuICAgIGNvbnN0IG5lZWRzS2V5Y2hhaW4gPSAhcGFyYW1zLnNraXBLZXljaGFpbiAmJiBwYXJhbXMucGVybWlzc2lvbnMgJiYgcGFyYW1zLnBlcm1pc3Npb25zLmluZGV4T2YoJ3NwZW5kJykgIT09IC0xO1xuXG4gICAgaWYgKHBhcmFtcy5kaXNhYmxlRW1haWwgIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmRpc2FibGVFbWFpbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZGlzYWJsZUVtYWlsIHRvIGJlIGEgYm9vbGVhbi4nKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmVtYWlsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgZW1haWwnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaGFyaW5nID0gKGF3YWl0IHRoaXMuYml0Z28uZ2V0U2hhcmluZ0tleSh7IGVtYWlsOiBwYXJhbXMuZW1haWwudG9Mb3dlckNhc2UoKSB9KSkgYXMgYW55O1xuICAgIGxldCBzaGFyZWRLZXljaGFpbjtcbiAgICBpZiAobmVlZHNLZXljaGFpbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qga2V5Y2hhaW4gPSAoYXdhaXQgdGhpcy5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oe30pKSBhcyBhbnk7XG4gICAgICAgIC8vIERlY3J5cHQgdGhlIHVzZXIga2V5IHdpdGggYSBwYXNzcGhyYXNlXG4gICAgICAgIGlmIChrZXljaGFpbi5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgICAgICBpZiAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgd2FsbGV0UGFzc3BocmFzZSBhcmd1bWVudCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAga2V5Y2hhaW4ucHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDoga2V5Y2hhaW4uZW5jcnlwdGVkUHJ2IH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGRlY3J5cHQgdXNlciBrZXljaGFpbicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVja2V5ID0gbWFrZVJhbmRvbUtleSgpO1xuICAgICAgICAgIGNvbnN0IHNlY3JldCA9IGdldFNoYXJlZFNlY3JldChlY2tleSwgQnVmZmVyLmZyb20oc2hhcmluZy5wdWJrZXksICdoZXgnKSkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICAgIGNvbnN0IG5ld0VuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7IHBhc3N3b3JkOiBzZWNyZXQsIGlucHV0OiBrZXljaGFpbi5wcnYgfSk7XG4gICAgICAgICAgLy8gT25seSBvbmUgb2YgcHViL2NvbW1vblB1Yi9jb21tb25LZXljaGFpbiBzaG91bGQgYmUgcHJlc2VudCBpbiB0aGUga2V5Y2hhaW5cbiAgICAgICAgICBsZXQgcHViID0ga2V5Y2hhaW4ucHViID8/IGtleWNoYWluLmNvbW1vblB1YjtcbiAgICAgICAgICBpZiAoa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgICAgICAgIHB1YiA9XG4gICAgICAgICAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlZGRzYSdcbiAgICAgICAgICAgICAgICA/IEVkZHNhVXRpbHMuZ2V0UHVibGljS2V5RnJvbUNvbW1vbktleWNoYWluKGtleWNoYWluLmNvbW1vbktleWNoYWluKVxuICAgICAgICAgICAgICAgIDogRWNkc2FVdGlscy5nZXRQdWJsaWNLZXlGcm9tQ29tbW9uS2V5Y2hhaW4oa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzaGFyZWRLZXljaGFpbiA9IHtcbiAgICAgICAgICAgIHB1YixcbiAgICAgICAgICAgIGVuY3J5cHRlZFBydjogbmV3RW5jcnlwdGVkUHJ2LFxuICAgICAgICAgICAgZnJvbVB1YktleTogZWNrZXkucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICAgIHRvUHViS2V5OiBzaGFyaW5nLnB1YmtleSxcbiAgICAgICAgICAgIHBhdGg6IHNoYXJpbmcucGF0aCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlLm1lc3NhZ2UgPT09ICdObyBlbmNyeXB0ZWQga2V5Y2hhaW5zIG9uIHRoaXMgd2FsbGV0LicpIHtcbiAgICAgICAgICBzaGFyZWRLZXljaGFpbiA9IHt9O1xuICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIGVycm9yIGJlY2F1c2UgdGhpcyBsb29rcyBsaWtlIGEgY29sZCB3YWxsZXRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQ3JlYXRlU2hhcmVPcHRpb25zID0ge1xuICAgICAgdXNlcjogc2hhcmluZy51c2VySWQsXG4gICAgICBwZXJtaXNzaW9uczogcGFyYW1zLnBlcm1pc3Npb25zLFxuICAgICAgcmVzaGFyZTogcGFyYW1zLnJlc2hhcmUsXG4gICAgICBtZXNzYWdlOiBwYXJhbXMubWVzc2FnZSxcbiAgICAgIGRpc2FibGVFbWFpbDogcGFyYW1zLmRpc2FibGVFbWFpbCxcbiAgICB9O1xuXG4gICAgaWYgKHNoYXJlZEtleWNoYWluKSB7XG4gICAgICBvcHRpb25zLmtleWNoYWluID0gc2hhcmVkS2V5Y2hhaW47XG4gICAgfSBlbHNlIGlmIChwYXJhbXMuc2tpcEtleWNoYWluKSB7XG4gICAgICBvcHRpb25zLmtleWNoYWluID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlU2hhcmUob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHVzZXIgZnJvbSB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHVzZXJJZCBJZCBvZiB0aGUgdXNlciB0byByZW1vdmVcbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZVVzZXIocGFyYW1zOiBSZW1vdmVVc2VyT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXJJZCddLCBbXSk7XG5cbiAgICBjb25zdCB1c2VySWQgPSBwYXJhbXMudXNlcklkO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3VzZXIvJyArIHVzZXJJZCkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgKHVuc2lnbmVkIHRyYW5zYWN0aW9uKSBmcm9tIEJpdEdvXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAgICogQHBhcmFtIHt7YWRkcmVzczogc3RyaW5nLCBhbW91bnQ6IHN0cmluZ319IHBhcmFtcy5yZWNpcGllbnRzIC0gbGlzdCBvZiByZWNpcGllbnRzIGFuZCBuZWNlc3NhcnkgcmVjaXBpZW50IGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtQmxvY2tzIC0gRXN0aW1hdGVzIHRoZSBhcHByb3hpbWF0ZSBmZWUgcGVyIGtpbG9ieXRlIG5lY2Vzc2FyeSBmb3IgYSB0cmFuc2FjdGlvbiBjb25maXJtYXRpb24gd2l0aGluIG51bUJsb2NrcyBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gdGhlIGRlc2lyZWQgZmVlUmF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGluIGJhc2UgdW5pdHMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gYmFzZSB1bml0cy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gTWluaW11bSBudW1iZXIgb2YgY29uZmlybWF0aW9ucyB1bnNwZW50cyBnb2luZyBpbnRvIHRoaXMgdHJhbnNhY3Rpb24gc2hvdWxkIGhhdmVcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gRW5mb3JjZSBtaW5pbXVtIG51bWJlciBvZiBjb25maXJtYXRpb25zIG9uIGNoYW5nZSAoaW50ZXJuYWwpIGlucHV0cy5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cyAtIFRoZSBkZXNpcmVkIGNvdW50IG9mIHVuc3BlbnRzIGluIHRoZSB3YWxsZXQuIElmIHRoZSB3YWxsZXTigJlzIGN1cnJlbnQgdW5zcGVudCBjb3VudCBpcyBsb3dlciB0aGFuIHRoZSB0YXJnZXQsIHVwIHRvIGZvdXIgYWRkaXRpb25hbCBjaGFuZ2Ugb3V0cHV0cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5taW5WYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBzbWFsbGVyIHRoYW4gdGhpcyBhbW91bnQgb2YgYmFzZSB1bml0c1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1heFZhbHVlIC0gSWdub3JlIHVuc3BlbnRzIGxhcmdlciB0aGFuIHRoaXMgYW1vdW50IG9mIGJhc2UgdW5pdHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5zZXF1ZW5jZUlkIC0gVGhlIHNlcXVlbmNlIElEIG9mIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxhc3RMZWRnZXJTZXF1ZW5jZSAtIEFic29sdXRlIG1heCBsZWRnZXIgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxlZGdlclNlcXVlbmNlRGVsdGEgLSBSZWxhdGl2ZSBsZWRnZXIgaGVpZ2h0IChpbiByZWxhdGlvbiB0byB0aGUgY3VycmVudCBsZWRnZXIpIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmdhc1ByaWNlIC0gQ3VzdG9tIGdhcyBwcmljZSB0byBiZSB1c2VkIGZvciBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmdhc0xpbWl0IC0gQ3VzdG9tIGdhcyBsaW1pdCB0byBiZSB1c2VkIGZvciBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ub1NwbGl0Q2hhbmdlIC0gU2V0IHRvIHRydWUgdG8gZGlzYWJsZSBhdXRvbWF0aWMgY2hhbmdlIHNwbGl0dGluZyBmb3IgcHVycG9zZXMgb2YgdW5zcGVudCBtYW5hZ2VtZW50XG4gICAqIEBwYXJhbSB7QXJyYXl9IHBhcmFtcy51bnNwZW50cyAtIFRoZSB1bnNwZW50cyB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uLiBFYWNoIHVuc3BlbnQgc2hvdWxkIGJlIGluIHRoZSBmb3JtIHByZXZUeElkOm5PdXRwdXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5jaGFuZ2VBZGRyZXNzIC0gU3BlY2lmaWVzIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgY2hhbmdlIG91dHB1dFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ub25QYXJ0aWNpcGF0aW9uIC0gKEFsZ29yYW5kKSBOb24gcGFydGljaXBhdGluZyBrZXkgcmVnIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudmFsaWRGcm9tQmxvY2sgLSAoQWxnb3JhbmQpIFRoZSBtaW5pbXVtIHJvdW5kIHRoaXMgd2lsbCBydW4gb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy52YWxpZFRvQmxvY2sgLSAoQWxnb3JhbmQpIFRoZSBtYXhpbXVtIHJvdW5kIHRoaXMgd2lsbCBydW4gb25cbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuaW5zdGFudCAtIEJ1aWxkIHRoaXMgdHJhbnNhY3Rpb24gdG8gY29uZm9ybSB3aXRoIGluc3RhbnQgc2VuZGluZyBjb2luLXNwZWNpZmljIG1ldGhvZCAoaWYgYXZhaWxhYmxlKVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5rZWVwQWxpdmUgLSAoUG9sa2Fkb3QpIGtlZXAgYWRkcmVzcyBhbGl2ZSBieSBzZW5kaW5nIHRoZSBhZGRyZXNzIG1pbmltdW0gZnVuZGluZyBhbW91bnQsIHVzZWQgZHVyaW5nIHdhbGxldCBjb25zb2xpZGF0aW9uLCB0cnVlIGJ5IGRlZmF1bHRcbiAgICogQHBhcmFtIHt7dmFsdWU6IFN0cmluZywgdHlwZTogU3RyaW5nfX0gcGFyYW1zLm1lbW8gLSBNZW1vIHRvIHVzZSBpbiB0cmFuc2FjdGlvbiAoc3VwcG9ydGVkIGJ5IFN0ZWxsYXIpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbS50cmFuc2ZlcklkIC0gdHJhbnNmZXIgSWQgdG8gdXNlIGluIHRyYW5zYWN0aW9uIChzdXBwb3J0ZWQgYnkgY2FzcGVyKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmFkZHJlc3NUeXBlIC0gVGhlIHR5cGUgb2YgYWRkcmVzcyB0byBjcmVhdGUgZm9yIGNoYW5nZS4gT25lIG9mIGBwMnNoYCwgYHAyc2hQMndzaGAsIGFuZCBgcDJ3c2hgLiBDYXNlLXNlbnNpdGl2ZS5cbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuaG9wIC0gQnVpbGQgdGhpcyBhcyBhbiBFdGhlcmV1bSBob3AgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcy5yZXNlcnZhdGlvbiAtIE9iamVjdCB0byByZXNlcnZlIHRoZSB1bnNwZW50cyB0aGF0IHRoaXMgdHggYnVpbGQgdXNlcy4gRm9ybWF0IGlzIHJlc2VydmF0aW9uID0geyBleHBpcmVUaW1lOiBJU09EYXRlU3RyaW5nLCBwZW5kaW5nQXBwcm92YWxJZDogU3RyaW5nIH1cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIFRoZSBwYXNzcGhyYXNlIHRvIHRoZSB3YWxsZXQgdXNlciBrZXksIHRvIHNpZ24gY29tbWl0bWVudCBkYXRhIGZvciBFdGhlcmV1bSBob3AgdHJhbnNhY3Rpb25zXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0Q29udHJhY3RBZGRyZXNzIC0gVGhlIGNvbnRyYWN0IGFkZHJlc3MgdXNlZCBhcyB0aGUgXCJ0b1wiIGZpZWxkIG9mIGEgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBwcmVidWlsZFRyYW5zYWN0aW9uKHBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgcmV0dXJuIHRoaXMucHJlYnVpbGRUcmFuc2FjdGlvblRzcyhwYXJhbXMpO1xuICAgIH1cblxuICAgIC8vIFdoaXRlbGlzdCBwYXJhbXMgdG8gYnVpbGQgdHhcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpKTtcbiAgICBkZWJ1ZygncHJlYnVpbGRpbmcgdHJhbnNhY3Rpb246ICVPJywgd2hpdGVsaXN0ZWRQYXJhbXMpO1xuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuICAgIGNvbnN0IGV4dHJhUGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5nZXRFeHRyYVByZWJ1aWxkUGFyYW1zKE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7IHdhbGxldDogdGhpcyB9KSk7XG4gICAgT2JqZWN0LmFzc2lnbih3aGl0ZWxpc3RlZFBhcmFtcywgZXh0cmFQYXJhbXMpO1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0ge1xuICAgICAgb2ZmbGluZVZlcmlmaWNhdGlvbjogcGFyYW1zLm9mZmxpbmVWZXJpZmljYXRpb24gPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICBjb25zdCBidWlsZFF1ZXJ5ID0gdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvdHgvYnVpbGQnKSlcbiAgICAgIC5xdWVyeShxdWVyeVBhcmFtcylcbiAgICAgIC5zZW5kKHdoaXRlbGlzdGVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuXG4gICAgY29uc3QgYmxvY2tIZWlnaHRRdWVyeSA9IF8uaXNGdW5jdGlvbigodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmdldExhdGVzdEJsb2NrSGVpZ2h0KVxuICAgICAgPyAodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmdldExhdGVzdEJsb2NrSGVpZ2h0KHBhcmFtcy5yZXFJZClcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgY29uc3QgcXVlcmllcyA9IFtidWlsZFF1ZXJ5LCBibG9ja0hlaWdodFF1ZXJ5XTtcbiAgICBjb25zdCBbYnVpbGRSZXNwb25zZSwgYmxvY2tIZWlnaHRdID0gKGF3YWl0IFByb21pc2UuYWxsKHF1ZXJpZXMpKSBhcyBhbnk7XG4gICAgZGVidWcoJ3Bvc3Rwcm9jZXNzaW5nIHRyYW5zYWN0aW9uIHByZWJ1aWxkOiAlTycsIGJ1aWxkUmVzcG9uc2UpO1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChibG9ja0hlaWdodCkpIHtcbiAgICAgIGJ1aWxkUmVzcG9uc2UuYmxvY2tIZWlnaHQgPSBibG9ja0hlaWdodDtcbiAgICB9XG4gICAgbGV0IHByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkID0gKGF3YWl0IHRoaXMuYmFzZUNvaW4ucG9zdFByb2Nlc3NQcmVidWlsZChcbiAgICAgIE9iamVjdC5hc3NpZ24oYnVpbGRSZXNwb25zZSwgeyB3YWxsZXQ6IHRoaXMsIGJ1aWxkUGFyYW1zOiB3aGl0ZWxpc3RlZFBhcmFtcyB9KVxuICAgICkpIGFzIGFueTtcbiAgICBkZWxldGUgcHJlYnVpbGQud2FsbGV0O1xuICAgIGRlbGV0ZSBwcmVidWlsZC5idWlsZFBhcmFtcztcbiAgICBwcmVidWlsZCA9IF8uZXh0ZW5kKHt9LCBwcmVidWlsZCwgeyB3YWxsZXRJZDogdGhpcy5pZCgpIH0pO1xuICAgIGlmICh0aGlzLl93YWxsZXQgJiYgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYyAmJiAhcGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcykge1xuICAgICAgcHJlYnVpbGQgPSBfLmV4dGVuZCh7fSwgcHJlYnVpbGQsIHsgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLmJhc2VBZGRyZXNzIH0pO1xuICAgIH1cbiAgICBkZWJ1ZygnZmluYWwgdHJhbnNhY3Rpb24gcHJlYnVpbGQ6ICVPJywgcHJlYnVpbGQpO1xuICAgIHJldHVybiBwcmVidWlsZCBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIC0gdHhQcmVidWlsZFxuICAgKiAtIFtrZXljaGFpbiAvIGtleV0gKG9iamVjdCkgb3IgcHJ2IChzdHJpbmcpXG4gICAqIC0gd2FsbGV0UGFzc3BocmFzZVxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgYXN5bmMgc2lnblRyYW5zYWN0aW9uKHBhcmFtczogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbiB8IFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHsgdHhQcmVidWlsZCwgYXBpVmVyc2lvbiB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKFxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21Db21taXRtZW50R2VuZXJhdGluZ0Z1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21HU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVJTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbilcbiAgICApIHtcbiAgICAgIC8vIGludm9rZSBleHRlcm5hbCBzaWduZXIgVFNTIGZvciBFZERTQSB3b3JrZmxvd1xuICAgICAgcmV0dXJuIHRoaXMuc2lnblRyYW5zYWN0aW9uVHNzRXh0ZXJuYWxTaWduZXJFZERTQShwYXJhbXMsIHRoaXMuYmFzZUNvaW4pO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tUGFpbGxpZXJNb2R1bHVzR2VuZXJhdGluZ0Z1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21LU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbU11RGVsdGFTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikgJiZcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tU1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKVxuICAgICkge1xuICAgICAgLy8gaW52b2tlIGV4dGVybmFsIHNpZ25lciBUU1MgZm9yIEVDRFNBIHdvcmtmbG93XG4gICAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb25Uc3NFeHRlcm5hbFNpZ25lckVDRFNBKHRoaXMuYmFzZUNvaW4sIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYgKCF0eFByZWJ1aWxkIHx8IHR5cGVvZiB0eFByZWJ1aWxkICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFByZWJ1aWxkIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJlc2lnbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ucHJlc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHdhbGxldERhdGE6IHRoaXMuX3dhbGxldCxcbiAgICAgIHRzc1V0aWxzOiB0aGlzLnRzc1V0aWxzLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb25Uc3MoeyAuLi5wcmVzaWduLCBwcnY6IHRoaXMuZ2V0VXNlclBydihwcmVzaWduIGFzIEdldFVzZXJQcnZPcHRpb25zKSwgYXBpVmVyc2lvbiB9KTtcbiAgICB9XG5cbiAgICBsZXQgeyBwdWJzIH0gPSBwYXJhbXM7XG4gICAgaWYgKCFwdWJzICYmIHRoaXMuYmFzZUNvaW4ua2V5SWRzRm9yU2lnbmluZygpLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMgfSk7XG4gICAgICBwdWJzID0ga2V5Y2hhaW5zLm1hcCgoaykgPT4ge1xuICAgICAgICBhc3NlcnQoay5wdWIpO1xuICAgICAgICByZXR1cm4gay5wdWI7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduVHJhbnNhY3Rpb25QYXJhbXMgPSB7XG4gICAgICAuLi5wcmVzaWduLFxuICAgICAgdHhQcmVidWlsZDogeyAuLi50eFByZWJ1aWxkLCB3YWxsZXRJZDogdGhpcy5pZCgpIH0sXG4gICAgICBwdWJzLFxuICAgICAgY29pbjogdGhpcy5iYXNlQ29pbixcbiAgICB9O1xuXG4gICAgaWYgKF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tU2lnbmluZ0Z1bmN0aW9uKSkge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLmJhc2VDb2luLnNpZ25XaXRoQ3VzdG9tU2lnbmluZ0Z1bmN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VDb2luLnNpZ25XaXRoQ3VzdG9tU2lnbmluZ0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21TaWduaW5nRnVuY3Rpb24sIHNpZ25UcmFuc2FjdGlvblBhcmFtcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbihzaWduVHJhbnNhY3Rpb25QYXJhbXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgcHJ2OiB0aGlzLmdldFVzZXJQcnYocHJlc2lnbiBhcyBHZXRVc2VyUHJ2T3B0aW9ucyksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIHR5cGVkIHN0cnVjdHVyZWQgZGF0YSB1c2luZyBUU1NcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgc2lnblR5cGVkRGF0YShwYXJhbXM6IFdhbGxldFNpZ25UeXBlZERhdGFPcHRpb25zKTogUHJvbWlzZTxTaWduZWRNZXNzYWdlPiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzU2lnbmluZ1R5cGVkRGF0YSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNpZ24gdHlwZWQgZGF0YSBub3Qgc3VwcG9ydGVkIGZvciAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX1gKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMudHlwZWREYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFR5cGVkIGRhdGEgcmVxdWlyZWRgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2Ugc2lnbmluZyBvbmx5IHN1cHBvcnRlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICB9XG4gICAgaWYgKF8uaXNGdW5jdGlvbihwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YVJhdykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHlwZWREYXRhLnR5cGVkRGF0YVJhdyBtdXN0IGJlIEpTT04gc3RyaW5nJyk7XG4gICAgfVxuICAgIGlmIChfLmlzRnVuY3Rpb24oKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5lbmNvZGVUeXBlZERhdGEpKSB7XG4gICAgICBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQgPSAodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmVuY29kZVR5cGVkRGF0YShwYXJhbXMudHlwZWREYXRhKTtcbiAgICB9XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQ6IHBhcmFtcy5yZXFJZCB9KTtcbiAgICBjb25zdCB1c2VyUHJ2T3B0aW9uczogR2V0VXNlclBydk9wdGlvbnMgPSB7IC4uLnBhcmFtcywga2V5Y2hhaW46IGtleWNoYWluc1swXSB9O1xuICAgIGFzc2VydChrZXljaGFpbnNbMF0uY29tbW9uS2V5Y2hhaW4sICdVbmFibGUgdG8gZmluZCBjb21tb25LZXljaGFpbiBpbiBrZXljaGFpbnMnKTtcbiAgICBjb25zdCBwcmVzaWduID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgd2FsbGV0RGF0YTogdGhpcy5fd2FsbGV0LFxuICAgICAgdHNzVXRpbHM6IHRoaXMudHNzVXRpbHMsXG4gICAgICBwcnY6IHRoaXMuZ2V0VXNlclBydih1c2VyUHJ2T3B0aW9ucyksXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgYmFja3VwS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAxID8ga2V5Y2hhaW5zWzFdIDogbnVsbCxcbiAgICAgIGJpdGdvS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAyID8ga2V5Y2hhaW5zWzJdIDogbnVsbCxcbiAgICAgIHB1Yjoga2V5Y2hhaW5zLm1hcCgoaykgPT4gay5wdWIpLFxuICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnNpZ25UeXBlZERhdGFUc3MocHJlc2lnbik7XG4gIH1cblxuICAvKipcbiAgICogIFNpZ24gYSBtZXNzYWdlIHVzaW5nIFRTU1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIC0gTWVzc2FnZVxuICAgKiAtIGN1c3RvZGlhbk1lc3NhZ2VJZFxuICAgKi9cbiAgYXN5bmMgc2lnbk1lc3NhZ2UocGFyYW1zOiBXYWxsZXRTaWduTWVzc2FnZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2lnbmVkTWVzc2FnZT4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5zdXBwb3J0c01lc3NhZ2VTaWduaW5nKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWVzc2FnZSBzaWduaW5nIG5vdCBzdXBwb3J0ZWQgZm9yICR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfWApO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5tZXNzYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UgcmVxdWlyZWQgdG8gc2lnbiBtZXNzYWdlJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXNzYWdlIHNpZ25pbmcgb25seSBzdXBwb3J0ZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgfVxuICAgIGlmIChfLmlzRnVuY3Rpb24oKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5lbmNvZGVNZXNzYWdlKSkge1xuICAgICAgcGFyYW1zLm1lc3NhZ2UubWVzc2FnZUVuY29kZWQgPSAodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmVuY29kZU1lc3NhZ2UocGFyYW1zLm1lc3NhZ2UubWVzc2FnZVJhdyk7XG4gICAgfVxuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMsIHJlcUlkOiBwYXJhbXMucmVxSWQgfSk7XG4gICAgY29uc3QgdXNlclBydk9wdGlvbnM6IEdldFVzZXJQcnZPcHRpb25zID0geyAuLi5wYXJhbXMsIGtleWNoYWluOiBrZXljaGFpbnNbMF0gfTtcbiAgICBhc3NlcnQoa2V5Y2hhaW5zWzBdLmNvbW1vbktleWNoYWluLCAnVW5hYmxlIHRvIGZpbmQgY29tbW9uS2V5Y2hhaW4gaW4ga2V5Y2hhaW5zJyk7XG4gICAgY29uc3QgcHJlc2lnbiA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHdhbGxldERhdGE6IHRoaXMuX3dhbGxldCxcbiAgICAgIHRzc1V0aWxzOiB0aGlzLnRzc1V0aWxzLFxuICAgICAgcHJ2OiB0aGlzLmdldFVzZXJQcnYodXNlclBydk9wdGlvbnMpLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIGJhY2t1cEtleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMSA/IGtleWNoYWluc1sxXSA6IG51bGwsXG4gICAgICBiaXRnb0tleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMiA/IGtleWNoYWluc1syXSA6IG51bGwsXG4gICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc2lnbk1lc3NhZ2VUc3MocHJlc2lnbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1c2VyIHByaXZhdGUga2V5IGZyb20gZWl0aGVyIGEgZGVyaXZhdGlvbiBvciBhbiBlbmNyeXB0ZWQga2V5Y2hhaW5cbiAgICogQHBhcmFtIFtwYXJhbXMua2V5Y2hhaW4gLyBwYXJhbXMua2V5XSAob2JqZWN0KSBvciBwYXJhbXMucHJ2IChzdHJpbmcpXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAoc3RyaW5nKVxuICAgKi9cbiAgZ2V0VXNlclBydihwYXJhbXM6IEdldFVzZXJQcnZPcHRpb25zID0ge30pOiBzdHJpbmcge1xuICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IHBhcmFtcy5rZXljaGFpbiB8fCBwYXJhbXMua2V5O1xuICAgIGxldCB1c2VyUHJ2ID0gcGFyYW1zLnBydjtcbiAgICBpZiAodXNlclBydiAmJiB0eXBlb2YgdXNlclBydiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICAvLyB1c2UgdGhlIGBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkYCBwcm9wZXJ0eSBmcm9tIHRoZSB1c2VyIGtleWNoYWluIGFzIHRoZSBgY29sZERlcml2YXRpb25TZWVkYFxuICAgIC8vIGlmIG5vIG90aGVyIGBjb2xkRGVyaXZhdGlvblNlZWRgIHdhcyBleHBsaWNpdGx5IHByb3ZpZGVkXG4gICAgaWYgKFxuICAgICAgcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJhbXMua2V5Y2hhaW4gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGFyYW1zLmtleWNoYWluLmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCA9IHBhcmFtcy5rZXljaGFpbi5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkO1xuICAgIH1cblxuICAgIGlmICh1c2VyUHJ2ICYmIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQpIHtcbiAgICAgIC8vIHRoZSBkZXJpdmF0aW9uIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiBhIGtleSBhbHJlYWR5IGV4aXN0c1xuICAgICAgY29uc3QgZGVyaXZhdGlvbiA9IHRoaXMuYmFzZUNvaW4uZGVyaXZlS2V5V2l0aFNlZWQoeyBrZXk6IHVzZXJQcnYsIHNlZWQ6IHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQgfSk7XG4gICAgICB1c2VyUHJ2ID0gZGVyaXZhdGlvbi5rZXk7XG4gICAgfSBlbHNlIGlmICghdXNlclBydikge1xuICAgICAgaWYgKCF1c2VyS2V5Y2hhaW4gfHwgdHlwZW9mIHVzZXJLZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbiBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgdXNlckVuY3J5cHRlZFBydiA9IHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnY7XG4gICAgICBpZiAoIXVzZXJFbmNyeXB0ZWRQcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbiBkb2VzIG5vdCBoYXZlIHByb3BlcnR5IGVuY3J5cHRlZFBydicpO1xuICAgICAgfVxuICAgICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldFBhc3NwaHJhc2UgcHJvcGVydHkgbWlzc2luZycpO1xuICAgICAgfVxuXG4gICAgICB1c2VyUHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IHVzZXJFbmNyeXB0ZWRQcnYsIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZXJQcnY7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgZnJvbSBCaXRHbywgdmFsaWRhdGUgaXQsIGFuZCB0aGVuIGRlY3J5cHQgdGhlIHVzZXIga2V5IGFuZCBzaWduIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBwcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGlmIChwYXJhbXMuZWlwMTU1OSAmJiBwYXJhbXMuZ2FzUHJpY2UpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ09ubHkgb25lIG9mIHBhcmFtcy5laXAxNTU5IGFuZCBwYXJhbXMuZ2FzUHJpY2UgbWF5IGJlIHNwZWNpZmllZCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICdib3RoX2dhc1ByaWNlX2FuZF9laXAxNTU5Z2FzTW9kZWxfc3BlY2lmaWVkJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucHJlYnVpbGRUeCAmJiBwYXJhbXMucmVjaXBpZW50cykge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignT25seSBvbmUgb2YgcHJlYnVpbGRUeCBhbmQgcmVjaXBpZW50cyBtYXkgYmUgc3BlY2lmaWVkJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2JvdGhfcHJlYnVpbGR0eF9hbmRfcmVjaXBpZW50c19zcGVjaWZpZWQnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICYmICFBcnJheS5pc0FycmF5KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignZXhwZWN0aW5nIHJlY2lwaWVudHMgYXJyYXknKTtcbiAgICAgIGVycm9yLmNvZGUgPSAncmVjaXBpZW50c19ub3RfYXJyYXknO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNBcnJheSh0aGlzLl9wZXJtaXNzaW9ucykgJiYgIXRoaXMuX3Blcm1pc3Npb25zLmluY2x1ZGVzKCdzcGVuZCcpKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdubyBzcGVuZCBwZXJtaXNzaW9uIG9uIHRoaXMgd2FsbGV0Jyk7XG4gICAgICBlcnJvci5jb2RlID0gJ3VzZXJfbm90X2FsbG93ZWRfdG9fc3BlbmRfZnJvbV93YWxsZXQnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNlaXZlQWRkcmVzcyAmJiAocGFyYW1zLnR5cGUgPT09ICd0cmFuc2ZlcicgfHwgcGFyYW1zLnR5cGUgPT09ICd0cmFuc2ZlclRva2VuJykpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoYGNhbm5vdCB1c2UgcmVjZWl2ZSBhZGRyZXNzIGZvciBUU1MgdHJhbnNhY3Rpb25zIG9mIHR5cGUgJHtwYXJhbXMudHlwZX1gKTtcbiAgICAgIGVycm9yLmNvZGUgPSAncmVjZWl2ZV9hZGRyZXNzX25vdF9hbGxvd2VkX2Zvcl90c3Nfd2l0aGRyYXdhbHMnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICYmIChwYXJhbXMudHlwZSA9PT0gJ2ZpbGxOb25jZScgfHwgcGFyYW1zLnR5cGUgPT09ICdhY2NlbGVyYXRpb24nKSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcihgY2Fubm90IHByb3ZpZGUgcmVjaXBpZW50cyBmb3IgdHJhbnNhY3Rpb24gdHlwZSAke3BhcmFtcy50eXBlfWApO1xuICAgICAgZXJyb3IuY29kZSA9ICdyZWNpcGllbnRzX25vdF9hbGxvd2VkX2Zvcl9maWxsbm9uY2VfYW5kX2FjY2VsZXJhdGlvbl90eF90eXBlJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMsIHJlcUlkOiBwYXJhbXMucmVxSWQgfSk7XG5cbiAgICAvLyBEb2luZyBhIHNhbml0eSBjaGVjayBmb3IgcGFzc3dvcmQgaGVyZSB0byBhdm9pZCBkb2luZyBmdXJ0aGVyIHdvcmsgaWYgd2Uga25vdyBpdCdzIHdyb25nXG4gICAgLy8gd2UgaWdub3JlIHRoaXMgY2hlY2sgd2l0aCBpZiBjdXN0b21TaWduaW5nRnVuY3Rpb24gaXMgcHJvdmlkZWRcbiAgICAvLyAgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdXNlciBpcyBoYW5kbGluZyB0aGUgc2lnbmluZyBpbiBleHRlcm5hbCBzaWduaW5nIG1vZGVcbiAgICB0cnkge1xuICAgICAgaWYgKGtleWNoYWluc1swXS5lbmNyeXB0ZWRQcnYgJiYgIXBhcmFtcy5jdXN0b21TaWduaW5nRnVuY3Rpb24gJiYgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpIHtcbiAgICAgICAgdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IGtleWNoYWluc1swXS5lbmNyeXB0ZWRQcnYgYXMgc3RyaW5nLCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcihcbiAgICAgICAgYHVuYWJsZSB0byBkZWNyeXB0IGtleWNoYWluIHdpdGggdGhlIGdpdmVuIHdhbGxldCBwYXNzcGhyYXNlLiBFcnJvcjogJHtKU09OLnN0cmluZ2lmeShlKX1gXG4gICAgICApO1xuICAgICAgZXJyb3IuY29kZSA9ICd3YWxsZXRfcGFzc3BocmFzZV9pbmNvcnJlY3QnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgbGV0IHR4UHJlYnVpbGRRdWVyeTogUHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0IHwgc3RyaW5nPjtcbiAgICBjb25zdCBzdXBwb3J0ZWRUeFJlcXVlc3RWZXJzaW9ucyA9IHRoaXMudHNzVXRpbHM/LnN1cHBvcnRlZFR4UmVxdWVzdFZlcnNpb25zKCkgfHwgW107XG4gICAgY29uc3QgbXVzdFVzZVR4UmVxdWVzdEZ1bGwgPSBzdXBwb3J0ZWRUeFJlcXVlc3RWZXJzaW9ucy5sZW5ndGggPT09IDEgJiYgc3VwcG9ydGVkVHhSZXF1ZXN0VmVyc2lvbnMuaW5jbHVkZXMoJ2Z1bGwnKTtcblxuICAgIGlmIChcbiAgICAgIC8vIHZlcmlmeSB0aGUgd2FsbGV0IG11c3QgdXNlIHR4UmVxdWVzdCBGdWxsIGFwaSBhbmQgbXVzdCByZWJ1aWxkIHRoZSB0eCBiZWZvcmUgc3VibWl0dGluZ1xuICAgICAgbXVzdFVzZVR4UmVxdWVzdEZ1bGwgJiZcbiAgICAgIGlzUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdChwYXJhbXMucHJlYnVpbGRUeCkgJiZcbiAgICAgIHBhcmFtcy5wcmVidWlsZFR4LmJ1aWxkUGFyYW1zPy5wcmV2aWV3XG4gICAgKSB7XG4gICAgICB0eFByZWJ1aWxkUXVlcnkgPSB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb24oe1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIC4uLnsgLi4ucGFyYW1zLnByZWJ1aWxkVHguYnVpbGRQYXJhbXMsIHByZXZpZXc6IGZhbHNlIH0sXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHhQcmVidWlsZFF1ZXJ5ID0gcGFyYW1zLnByZWJ1aWxkVHggPyBQcm9taXNlLnJlc29sdmUocGFyYW1zLnByZWJ1aWxkVHgpIDogdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgLy8gdGhlIHByZWJ1aWxkIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHByb3ZpZGluZyBhbiBleHBsaWNpdCB0eFxuICAgIGNvbnN0IHR4UHJlYnVpbGQgPSAoYXdhaXQgdHhQcmVidWlsZFF1ZXJ5KSBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYmFzZUNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczogdHhQcmVidWlsZC5idWlsZFBhcmFtcyB8fCBwYXJhbXMsXG4gICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgIHdhbGxldDogdGhpcyxcbiAgICAgICAgdmVyaWZpY2F0aW9uOiBwYXJhbXMudmVyaWZpY2F0aW9uID8/IHt9LFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgICB3YWxsZXRUeXBlOiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcigndHJhbnNhY3Rpb24gcHJlYnVpbGQgZmFpbGVkIGxvY2FsIHZhbGlkYXRpb246JywgZS5tZXNzYWdlKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICd0cmFuc2FjdGlvbiBwYXJhbXM6JyxcbiAgICAgICAgXy5vbWl0KHBhcmFtcywgWydrZXljaGFpbicsICdwcnYnLCAncGFzc3BocmFzZScsICd3YWxsZXRQYXNzcGhyYXNlJywgJ2tleScsICd3YWxsZXQnXSlcbiAgICAgICk7XG4gICAgICBjb25zb2xlLmVycm9yKCd0cmFuc2FjdGlvbiBwcmVidWlsZDonLCB0eFByZWJ1aWxkKTtcbiAgICAgIGNvbnNvbGUudHJhY2UoZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBwYXNzIG91ciB0aHJlZSBrZXlzXG4gICAgY29uc3Qgc2lnbmluZ1BhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHR4UHJlYnVpbGQsXG4gICAgICB3YWxsZXQ6IHtcbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgdmVyc2lvbiBvZiB0aGUgbXVsdGlzaWcgYWRkcmVzcyBhdCB3YWxsZXQgY3JlYXRpb24gdGltZVxuICAgICAgICBhZGRyZXNzVmVyc2lvbjogdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYy5hZGRyZXNzVmVyc2lvbixcbiAgICAgIH0sXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgYmFja3VwS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAxID8ga2V5Y2hhaW5zWzFdIDogbnVsbCxcbiAgICAgIGJpdGdvS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAyID8ga2V5Y2hhaW5zWzJdIDogbnVsbCxcbiAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgfTtcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ29uY2hhaW4nKSB7XG4gICAgICBzaWduaW5nUGFyYW1zLnB1YnMgPSBrZXljaGFpbnMubWFwKChrKSA9PiB7XG4gICAgICAgIGFzc2VydChrLnB1Yik7XG4gICAgICAgIHJldHVybiBrLnB1YjtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24oc2lnbmluZ1BhcmFtcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdpbnN1ZmZpY2llbnQgZnVuZHMnKSkge1xuICAgICAgICBlcnJvci5jb2RlID0gJ2luc3VmZmljaWVudF9mdW5kcyc7XG4gICAgICAgIGVycm9yLndhbGxldEJhbGFuY2VzID0ge1xuICAgICAgICAgIGJhbGFuY2VTdHJpbmc6IHRoaXMuYmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIGNvbmZpcm1lZEJhbGFuY2VTdHJpbmc6IHRoaXMuY29uZmlybWVkQmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIHNwZW5kYWJsZUJhbGFuY2VTdHJpbmc6IHRoaXMuc3BlbmRhYmxlQmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIGJhbGFuY2U6IHRoaXMuYmFsYW5jZSgpLFxuICAgICAgICAgIGNvbmZpcm1lZEJhbGFuY2U6IHRoaXMuY29uZmlybWVkQmFsYW5jZSgpLFxuICAgICAgICAgIHNwZW5kYWJsZUJhbGFuY2U6IHRoaXMuc3BlbmRhYmxlQmFsYW5jZSgpLFxuICAgICAgICB9O1xuICAgICAgICBlcnJvci50eFBhcmFtcyA9IF8ub21pdChwYXJhbXMsIFsna2V5Y2hhaW4nLCAncHJ2JywgJ3Bhc3NwaHJhc2UnLCAnd2FsbGV0UGFzc3BocmFzZScsICdrZXknXSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWNjZWxlcmF0ZSBhIHRyYW5zYWN0aW9uJ3MgY29uZmlybWF0aW9uIHVzaW5nIENoaWxkLVBheXMtRm9yLVBhcmVudCAoQ1BGUClcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgYWNjZWxlcmF0ZVRyYW5zYWN0aW9uKHBhcmFtczogQWNjZWxlcmF0ZVRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBUT0RPKEJHLTkzNDkpOiBjaGFuZ2UgdGhlIGxhc3QgY2hlY2sgdG8gPiAwIGFuZCB0aGUgZXJyb3IgbWVzc2FnZSBvbmNlIHBsYXRmb3JtIGFsbG93cyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMgdG9cbiAgICAvLyAgICAgICAgICAgICAgICBiZSBidW1wZWQgaW4gdGhlIHNhbWUgQ1BGUCB0cmFuc2FjdGlvblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5jcGZwVHhJZHMpIHx8ICFBcnJheS5pc0FycmF5KHBhcmFtcy5jcGZwVHhJZHMpIHx8IHBhcmFtcy5jcGZwVHhJZHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdleHBlY3RpbmcgY3BmcFR4SWRzIHRvIGJlIGFuIGFycmF5IG9mIGxlbmd0aCAxJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2NwZnB0eGlkc19ub3RfYXJyYXknO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmNwZnBGZWVSYXRlKSkge1xuICAgICAgaWYgKHBhcmFtcy5ub0NwZnBGZWVSYXRlICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2NwZnBGZWVSYXRlIG11c3QgYmUgc2V0IHVubGVzcyBub0NwZnBGZWVSYXRlIGlzIHNldCcpO1xuICAgICAgICBlcnJvci5jb2RlID0gJ2NwZnBmZWVyYXRlX25vdF9zZXQnO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMuY3BmcEZlZVJhdGUpIHx8IHBhcmFtcy5jcGZwRmVlUmF0ZSA8IDApIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignY3BmcEZlZVJhdGUgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnY3BmcGZlZXJhdGVfbm90X25vbm5lZ2F0aXZlX2ludGVnZXInO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMubWF4RmVlKSkge1xuICAgICAgaWYgKHBhcmFtcy5ub01heEZlZSAhPT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdtYXhGZWUgbXVzdCBiZSBzZXQgdW5sZXNzIG5vTWF4RmVlIGlzIHNldCcpO1xuICAgICAgICBlcnJvci5jb2RlID0gJ21heGZlZV9ub3Rfc2V0JztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLm1heEZlZSkgfHwgcGFyYW1zLm1heEZlZSA8IDApIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignbWF4RmVlIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcicpO1xuICAgICAgICBlcnJvci5jb2RlID0gJ21heGZlZV9ub3Rfbm9ubmVnYXRpdmVfaW50ZWdlcic7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVjaXBpZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLnJlY2lwaWVudHMpIHx8IHBhcmFtcy5yZWNpcGllbnRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgdmFsdWUgZm9yICdyZWNpcGllbnRzJzogbXVzdCBiZSBlbXB0eSBhcnJheSB3aGVuIHNldGApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBhcmFtcy5yZWNpcGllbnRzID0gW107XG5cbiAgICAvLyBXZSBtdXN0IHBhc3MgdGhlIGJ1aWxkIHBhcmFtcyB0aHJvdWdoIHRvIHN1Ym1pdCBpbiBjYXNlIHRoZSBDUEZQIHR4IGV2ZXIgaGFzIHRvIGJlIHJlYnVpbHQuXG4gICAgY29uc3Qgc3VibWl0UGFyYW1zID0gT2JqZWN0LmFzc2lnbihwYXJhbXMsIGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKSk7XG4gICAgZGVsZXRlIChzdWJtaXRQYXJhbXMgYXMgYW55KS53YWxsZXQ7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oc3VibWl0UGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXQgYSBoYWxmLXNpZ25lZCB0cmFuc2FjdGlvbiB0byBCaXRHb1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIC0gdHhIZXg6IHRyYW5zYWN0aW9uIGhleCB0byBzdWJtaXRcbiAgICogLSBoYWxmU2lnbmVkOiBvYmplY3QgY29udGFpbmluZyB0cmFuc2FjdGlvbiAodHhIZXggb3IgdHhCYXNlNjQpIHRvIHN1Ym1pdFxuICAgKi9cbiAgYXN5bmMgc3VibWl0VHJhbnNhY3Rpb24ocGFyYW1zOiBTdWJtaXRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnb3RwJywgJ3R4SGV4JywgJ3R4UmVxdWVzdElkJ10pO1xuICAgIGNvbnN0IGhhc1R4SGV4ID0gISFwYXJhbXMudHhIZXg7XG4gICAgY29uc3QgaGFzSGFsZlNpZ25lZCA9ICEhcGFyYW1zLmhhbGZTaWduZWQ7XG5cbiAgICBpZiAocGFyYW1zLnR4UmVxdWVzdElkICYmIChoYXNUeEhleCB8fCBoYXNIYWxmU2lnbmVkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBleGFjdGx5IG9uZSBvZiB0eFJlcXVlc3RJZCwgdHhIZXgsIG9yIGhhbGZTaWduZWQnKTtcbiAgICB9IGVsc2UgaWYgKCFwYXJhbXMudHhSZXF1ZXN0SWQgJiYgKChoYXNUeEhleCAmJiBoYXNIYWxmU2lnbmVkKSB8fCAoIWhhc1R4SGV4ICYmICFoYXNIYWxmU2lnbmVkKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzdXBwbHkgZWl0aGVyIHR4SGV4IG9yIGhhbGZTaWduZWQsIGJ1dCBub3QgYm90aCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy90eC9zZW5kJykpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBjb2lucyB0byBhIHJlY2lwaWVudFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzcyAtIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzXG4gICAqIEBwYXJhbSBwYXJhbXMuYW1vdW50IC0gdGhlIGFtb3VudCBpbiBzYXRvc2hpcy93ZWkvYmFzZSB2YWx1ZSB0byBiZSBzZW50XG4gICAqIEBwYXJhbSBwYXJhbXMubWVzc2FnZSAtIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYXR0YWNoIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMuZGF0YSAtIFtFdGhlcmV1bSBTcGVjaWZpY10gb3B0aW9uYWwgZGF0YSB0byBwYXNzIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMuY3VzdG9kaWFuVHJhbnNhY3Rpb25JZCAtIFtFdGhlcmV1bS9NTUkgU3BlY2lmaWNdIGlkIG9mIHRyYW5zYWN0aW9uIGNyZWF0ZWQgdmlhIG1ldGFtYXNrXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSBwYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXkgb24gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtcy5wcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0sIGlmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gdGhlIG1pbmltdW0gY29uZmlybWF0aW9uIHRocmVzaG9sZCBmb3IgaW5wdXRzXG4gICAqIEBwYXJhbSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gd2hldGhlciB0byBlbmZvcmNlIG1pbkNvbmZpcm1zIGZvciBjaGFuZ2UgaW5wdXRzXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2VuZChwYXJhbXM6IFNlbmRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbJ21lc3NhZ2UnLCAnZGF0YSddKTtcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hbW91bnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIGFtb3VudCcpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29pbiA9IHRoaXMuYmFzZUNvaW47XG5cbiAgICBjb25zdCBhbW91bnQgPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5hbW91bnQpO1xuICAgIGlmIChhbW91bnQuaXNOZWdhdGl2ZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFtb3VudCAtIHBvc2l0aXZlIG51bWJlciBncmVhdGVyIHRoYW4gemVybyBvciBudW1lcmljIHN0cmluZyBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmICghY29pbi52YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKSAmJiBhbW91bnQuaXNaZXJvKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgYW1vdW50IC0gcG9zaXRpdmUgbnVtYmVyIGdyZWF0ZXIgdGhhbiB6ZXJvIG9yIG51bWVyaWMgc3RyaW5nIGV4cGVjdGVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlY2lwaWVudHM6IFNlbmRNYW55T3B0aW9uc1sncmVjaXBpZW50cyddID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBwYXJhbXMuYW1vdW50LFxuICAgICAgfSxcbiAgICBdO1xuICAgIGlmIChwYXJhbXMudG9rZW5OYW1lKSB7XG4gICAgICByZWNpcGllbnRzWzBdLnRva2VuTmFtZSA9IHBhcmFtcy50b2tlbk5hbWU7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZGF0YSAmJiBjb2luLnRyYW5zYWN0aW9uRGF0YUFsbG93ZWQoKSkge1xuICAgICAgcmVjaXBpZW50c1swXS5kYXRhID0gcGFyYW1zLmRhdGE7XG4gICAgfVxuICAgIGNvbnN0IHNlbmRNYW55T3B0aW9uczogU2VuZE1hbnlPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zLCB7IHJlY2lwaWVudHMgfSk7XG4gICAgcmV0dXJuIHRoaXMuc2VuZE1hbnkoc2VuZE1hbnlPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIG1vbmV5IHRvIG11bHRpcGxlIHJlY2lwaWVudHNcbiAgICogMS4gR2V0cyB0aGUgdXNlciBrZXljaGFpbiBieSBjaGVja2luZyB0aGUgd2FsbGV0IGZvciBhIGtleSB3aGljaCBoYXMgYW4gZW5jcnlwdGVkIHBydlxuICAgKiAyLiBEZWNyeXB0cyB1c2VyIGtleVxuICAgKiAzLiBDcmVhdGVzIHRoZSB0cmFuc2FjdGlvbiB3aXRoIGRlZmF1bHQgZmVlXG4gICAqIDQuIFNpZ25zIHRyYW5zYWN0aW9uIHdpdGggZGVjcnlwdGVkIHVzZXIga2V5XG4gICAqIDUuIFNlbmRzIHRoZSB0cmFuc2FjdGlvbiB0byBCaXRHb1xuICAgKiBAcGFyYW0ge29iamVjdH0gcGFyYW1zXG4gICAqIEBwYXJhbSB7e2FkZHJlc3M6IHN0cmluZywgYW1vdW50OiBzdHJpbmd9fSBwYXJhbXMucmVjaXBpZW50cyAtIGxpc3Qgb2YgcmVjaXBpZW50cyBhbmQgbmVjZXNzYXJ5IHJlY2lwaWVudCBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm51bUJsb2NrcyAtIEVzdGltYXRlcyB0aGUgYXBwcm94aW1hdGUgZmVlIHBlciBraWxvYnl0ZSBuZWNlc3NhcnkgZm9yIGEgdHJhbnNhY3Rpb24gY29uZmlybWF0aW9uIHdpdGhpbiBudW1CbG9ja3MgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIHRoZSBkZXNpcmVkIGZlZVJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBzYXRvdGhpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBFbmZvcmNlcyBtaW5Db25maXJtcyBvbiBjaGFuZ2UgaW5wdXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMgLSBUaGUgZGVzaXJlZCBjb3VudCBvZiB1bnNwZW50cyBpbiB0aGUgd2FsbGV0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMubWVzc2FnZSAtIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYXR0YWNoIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgc21hbGxlciB0aGFuIHRoaXMgYW1vdW50IG9mIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgbGFyZ2VyIHRoYW4gdGhpcyBhbW91bnQgb2Ygc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5zZXF1ZW5jZUlkIC0gVGhlIHNlcXVlbmNlIElEIG9mIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxhc3RMZWRnZXJTZXF1ZW5jZSAtIEFic29sdXRlIG1heCBsZWRnZXIgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxlZGdlclNlcXVlbmNlRGVsdGEgLSBSZWxhdGl2ZSBsZWRnZXIgaGVpZ2h0IChpbiByZWxhdGlvbiB0byB0aGUgY3VycmVudCBsZWRnZXIpIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmdhc1ByaWNlIC0gQ3VzdG9tIGdhcyBwcmljZSB0byBiZSB1c2VkIGZvciBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ub1NwbGl0Q2hhbmdlIC0gU2V0IHRvIHRydWUgdG8gZGlzYWJsZSBhdXRvbWF0aWMgY2hhbmdlIHNwbGl0dGluZyBmb3IgcHVycG9zZXMgb2YgdW5zcGVudCBtYW5hZ2VtZW50XG4gICAqIEBwYXJhbSB7QXJyYXl9IHBhcmFtcy51bnNwZW50cyAtIFRoZSB1bnNwZW50cyB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uLiBFYWNoIHVuc3BlbnQgc2hvdWxkIGJlIGluIHRoZSBmb3JtIHByZXZUeElkOm5PdXRwdXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5jb21tZW50IC0gQW55IGFkZGl0aW9uYWwgY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMub3RwIC0gVHdvIGZhY3RvciBhdXRoIGNvZGUgdG8gZW5hYmxlIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuY2hhbmdlQWRkcmVzcyAtIFNwZWNpZmllcyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGNoYW5nZSBvdXRwdXRcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuaW5zdGFudCAtIFNlbmQgdGhpcyB0cmFuc2FjdGlvbiB1c2luZyBjb2luLXNwZWNpZmljIGluc3RhbnQgc2VuZGluZyBtZXRob2QgKGlmIGF2YWlsYWJsZSlcbiAgICogQHBhcmFtIHt7dmFsdWU6IFN0cmluZywgdHlwZTogU3RyaW5nfX0gcGFyYW1zLm1lbW8gLSBNZW1vIHRvIHVzZSBpbiB0cmFuc2FjdGlvbiAoc3VwcG9ydGVkIGJ5IFN0ZWxsYXIpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudHlwZSAtIFR5cGUgb2YgdGhlIHRyYW5zYWN0aW9uIChlLmcuIHRydXN0bGluZSlcbiAgICogQHBhcmFtIHt7dG9rZW46IHBhcmFtcywgYWN0aW9uOiBTdHJpbmcsIGxpbWl0OiBTdHJpbmd9W119IG9wdGlvbnMudHJ1c3RsaW5lcyAtIEFycmF5IG9mIHRydXN0bGluZXMgdG8gbWFuYWdlIChzdXBwb3J0ZWQgYnkgU3RlbGxhcilcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzZW5kTWFueShwYXJhbXM6IFNlbmRNYW55T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWydjb21tZW50JywgJ290cCddKTtcbiAgICBkZWJ1Zygnc2VuZE1hbnkgY2FsbGVkJyk7XG4gICAgY29uc3QgcmVxSWQgPSBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBwYXJhbXMucmVxSWQgPSByZXFJZDtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIGNvbnN0IGNvaW4gPSB0aGlzLmJhc2VDb2luO1xuICAgIGlmIChfLmlzT2JqZWN0KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgICAgcGFyYW1zLnJlY2lwaWVudHMubWFwKGZ1bmN0aW9uIChyZWNpcGllbnQpIHtcbiAgICAgICAgY29uc3QgYW1vdW50ID0gbmV3IEJpZ051bWJlcihyZWNpcGllbnQuYW1vdW50KTtcbiAgICAgICAgaWYgKGFtb3VudC5pc05lZ2F0aXZlKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFtb3VudCAtIHBvc2l0aXZlIG51bWJlciBncmVhdGVyIHRoYW4gemVybyBvciBudW1lcmljIHN0cmluZyBleHBlY3RlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29pbi52YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKSAmJiBhbW91bnQuaXNaZXJvKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFtb3VudCAtIHBvc2l0aXZlIG51bWJlciBncmVhdGVyIHRoYW4gemVybyBvciBudW1lcmljIHN0cmluZyBleHBlY3RlZCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbmRNYW55VHNzKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgWy4uLnRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpLCAnY29tbWVudCcsICdvdHAnLCAnaG9wJ10pO1xuXG4gICAgaWYgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJykge1xuICAgICAgY29uc3QgZXh0cmFQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmdldEV4dHJhUHJlYnVpbGRQYXJhbXMoT2JqZWN0LmFzc2lnbihwYXJhbXMsIHsgd2FsbGV0OiB0aGlzIH0pKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oc2VsZWN0UGFyYW1zLCBleHRyYVBhcmFtcyk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvdHgvaW5pdGlhdGUnKSkuc2VuZChzZWxlY3RQYXJhbXMpLnJlc3VsdCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbGZTaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgICBjb25zdCBmaW5hbFR4UGFyYW1zID0gXy5leHRlbmQoe30sIGhhbGZTaWduZWRUcmFuc2FjdGlvbiwgc2VsZWN0UGFyYW1zKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy90eC9zZW5kJykpLnNlbmQoZmluYWxUeFBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3ZlciBhbiB1bnN1cHBvcnRlZCB0b2tlbiBmcm9tIGEgQml0R28gbXVsdGlzaWcgd2FsbGV0XG4gICAqIHBhcmFtcyBhcmUgdmFsaWRhdGVkIGluIEV0aC5wcm90b3R5cGUucmVjb3ZlclRva2VuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzcyB0aGUgY29udHJhY3QgYWRkcmVzcyBvZiB0aGUgdW5zdXBwb3J0ZWQgdG9rZW5cbiAgICogQHBhcmFtIHBhcmFtcy5yZWNpcGllbnQgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgcmVjb3ZlcmVkIHRva2VucyBzaG91bGQgYmUgc2VudCB0b1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgdGhlIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSBwYXJhbXMucHJ2IHRoZSB4cHJ2XG4gICAqL1xuICBhc3luYyByZWNvdmVyVG9rZW4ocGFyYW1zOiBSZWNvdmVyVG9rZW5PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnZXRoJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0b2tlbiByZWNvdmVyeSBvbmx5IHN1cHBvcnRlZCBmb3IgZXRoIHdhbGxldHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHRva2VuQ29udHJhY3RBZGRyZXNzLCByZWNpcGllbnQgfSA9IHBhcmFtcztcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHRva2VuQ29udHJhY3RBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgdG9rZW5Db250cmFjdEFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChyZWNpcGllbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciByZWNpcGllbnQnKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWNvdmVyVG9rZW5PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7IHRva2VuQ29udHJhY3RBZGRyZXNzLCByZWNpcGllbnQgfSwgcGFyYW1zLCB7IHdhbGxldDogdGhpcyB9KTtcbiAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5yZWNvdmVyVG9rZW4ocmVjb3ZlclRva2VuT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYW5zYWN0aW9uIG1ldGFkYXRhIGZvciB0aGUgb2xkZXN0IHRyYW5zYWN0aW9uIHRoYXQgaXMgc3RpbGwgcGVuZGluZyBvciBhdHRlbXB0ZWRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBPYmplY3Qgd2l0aCB0eGlkLCB3YWxsZXRJZCwgdHgsIGFuZCBmZWUgKGlmIHN1cHBvcnRlZCBmb3IgY29pbilcbiAgICovXG4gIGFzeW5jIGdldEZpcnN0UGVuZGluZ1RyYW5zYWN0aW9uKHBhcmFtczogUmVjb3JkPHN0cmluZywgbmV2ZXI+ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBpbnRlcm5hbC5nZXRGaXJzdFBlbmRpbmdUcmFuc2FjdGlvbih7IHdhbGxldElkOiB0aGlzLmlkKCkgfSwgdGhpcy5iYXNlQ29pbiwgdGhpcy5iaXRnbyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBmZWUgb24gdGhlIHBlbmRpbmcgdHJhbnNhY3Rpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gdHhpZCB0byB0aGUgZ2l2ZW4gbmV3IGZlZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudHhpZCBUaGUgdHJhbnNhY3Rpb24gSWQgY29ycmVzcG9uZGluZyB0byB0aGUgdHJhbnNhY3Rpb24gd2hvc2UgZmVlIGlzIHRvIGJlIGNoYW5nZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuZmVlXSBPcHRpb25hbCAtIFRoZSBuZXcgZmVlIHRvIGFwcGx5IHRvIHRoZSBkZW5vdGVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zLmVpcDE1NTldIE9wdGlvbmFsIC0gdGhlIGVpcDE1NTkgdmFsdWVzIHRvIGFwcGx5IHRvIHRoZSBkZW5vdGVkIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSB0cmFuc2FjdGlvbiBJRCBvZiB0aGUgbmV3IHRyYW5zYWN0aW9uIHRoYXQgY29udGFpbnMgdGhlIG5ldyBmZWUgcmF0ZVxuICAgKi9cbiAgYXN5bmMgY2hhbmdlRmVlKHBhcmFtczogQ2hhbmdlRmVlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAocGFyYW1zLmZlZSkgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd0eGlkJywgJ2ZlZSddLCBbXSk7XG4gICAgaWYgKHBhcmFtcy5laXAxNTU5KSBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLmVpcDE1NTksIFsnbWF4RmVlUGVyR2FzJywgJ21heFByaW9yaXR5RmVlUGVyR2FzJ10pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy90eC9jaGFuZ2VGZWUnKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBpbmZvIGZyb20gbWVyY2hhbnQgc2VydmVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgVGhlIHBhcmFtcyBwYXNzZWQgaW50byB0aGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy51cmwgVGhlIFVybCB0byByZXRyaWV2ZSBpbmZvIGZyb21cbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIGluZm8gcmV0dXJuZWQgZnJvbSB0aGUgbWVyY2hhbnQgc2VydmVyXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBnZXRQYXltZW50SW5mbyhwYXJhbXM6IHsgdXJsPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJ10sIFtdKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3BheW1lbnRJbmZvJykpLnF1ZXJ5KHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBqc29uIHBheW1lbnQgcmVzcG9uc2VcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1zIHBhc3NlZCBpbnRvIHRoZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnBheW1lbnRVcmwgLSBUaGUgdXJsIHRvIHNlbmQgdGhlIGZ1bGx5IHNpZ25lZCB0cmFuc2FjdGlvbiB0b1xuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnR4SGV4IC0gVGhlIHRyYW5zYWN0aW9uIGhleCBvZiB0aGUgcGF5bWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLm1lbW8ge1N0cmluZ30gLSBBIG1lbW8gc3VwcGxpZWQgYnkgdGhlIG1lcmNoYW50LCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSB0cmFuc2ZlciBhcyB0aGUgY29tbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmV4cGlyZXMge1N0cmluZ30gLSBJU08gRGF0ZSBmb3JtYXQgb2Ygd2hlbiB0aGUgcGF5bWVudCByZXF1ZXN0IGV4cGlyZXNcbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIGluZm8gcmV0dXJuZWQgZnJvbSB0aGUgbWVyY2hhbnQgc2VydmVyIFBheW1lbnQgQWNrXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBzZW5kUGF5bWVudFJlc3BvbnNlKHBhcmFtczogYW55ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9zZW5kUGF5bWVudCcpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgcG9saWN5IHJ1bGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbmRpdGlvbiBjb25kaXRpb24gb2JqZWN0XG4gICAqIEBwYXJhbSBwYXJhbXMuYWN0aW9uIGFjdGlvbiBvYmplY3RcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBjcmVhdGVQb2xpY3lSdWxlKHBhcmFtczogQ3JlYXRlUG9saWN5UnVsZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCcsICd0eXBlJ10sIFsnbWVzc2FnZSddKTtcblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuY29uZGl0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogY29uZGl0aW9ucyBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwYXJhbWV0ZXI6IGFjdGlvbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvcG9saWN5L3J1bGUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhIHBvbGljeSBydWxlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5jb25kaXRpb24gY29uZGl0aW9uIG9iamVjdFxuICAgKiBAcGFyYW0gcGFyYW1zLmFjdGlvbiBhY3Rpb24gb2JqZWN0XG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2V0UG9saWN5UnVsZShwYXJhbXM6IGFueSA9IHt9KSB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCcsICd0eXBlJ10sIFsnbWVzc2FnZSddKTtcblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuY29uZGl0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogY29uZGl0aW9ucyBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwYXJhbWV0ZXI6IGFjdGlvbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wdXQodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIFBvbGljeSBSdWxlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyByZW1vdmVQb2xpY3lSdWxlKHBhcmFtczogUmVtb3ZlUG9saWN5UnVsZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbJ21lc3NhZ2UnXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyByZW1vdmUocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgY3Jvc3NDaGFpbiBVVFhPc1xuICAgKiBDdXJyZW50bHkgb25seSBmb3IgQVZBWFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnNvdXJjZUNoYWluIHRoZSBzb3VyY2VjaGFpbiB0byBwaWNrIFVUWE9zLCBpZiBub3QgZ2l2ZW4sIHRoZW4gcGljayBmcm9tIGFsbCBhdmFpbGFibGUgY2hhaW5zIFtQLCBDXVxuICAgKi9cbiAgZmV0Y2hDcm9zc0NoYWluVVRYT3MocGFyYW1zOiBGZXRjaENyb3NzQ2hhaW5VVFhPc09wdGlvbnMpOiBQcm9taXNlPENyb3NzQ2hhaW5VVFhPW10+IHtcbiAgICBjb25zdCBxdWVyeSA9IF8ucGljayhwYXJhbXMsIFsnc291cmNlQ2hhaW4nXSk7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvY3Jvc3NDaGFpblVuc3BlbnRzJykpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGEgSlNPTiByZXByZXNlbnRhYmxlIHZlcnNpb24gb2YgdGhpcyB3YWxsZXRcbiAgICovXG4gIHRvSlNPTigpOiBXYWxsZXREYXRhIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHRyYWRpbmcgYWNjb3VudCBmcm9tIHRoaXMgd2FsbGV0XG4gICAqL1xuICB0b1RyYWRpbmdBY2NvdW50KCk6IFRyYWRpbmdBY2NvdW50IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ29mYycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgY29udmVydCBhbiBPZmZjaGFpbiAoT0ZDKSB3YWxsZXQgdG8gYSB0cmFkaW5nIGFjY291bnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUcmFkaW5nQWNjb3VudCh0aGlzLl93YWxsZXQuZW50ZXJwcmlzZSwgdGhpcywgdGhpcy5iaXRnbyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgc3Rha2luZyB3YWxsZXQgZnJvbSB0aGlzIHdhbGxldFxuICAgKi9cbiAgdG9TdGFraW5nV2FsbGV0KCk6IFN0YWtpbmdXYWxsZXQge1xuICAgIGNvbnN0IGlzRXRoVHNzID1cbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT0gJ2V0aCcgJiYgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8ud2FsbGV0VmVyc2lvblxuICAgICAgICA/IHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWMud2FsbGV0VmVyc2lvbiA+PSAzXG4gICAgICAgIDogZmFsc2U7XG4gICAgcmV0dXJuIG5ldyBTdGFraW5nV2FsbGV0KHRoaXMsIGlzRXRoVHNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBkb3dubG9hZHMgUERGIGtleWNhcmQgZm9yIHdhbGxldCAocmVxdWlyZXMgcmVzcG9uc2UgZnJvbSB3YWxsZXRzLmdlbmVyYXRlV2FsbGV0KVxuICAgKlxuICAgKiBOb3RlOiB0aGlzIGlzIGV4YW1wbGUgY29kZSBhbmQgaXMgbm90IHRoZSB2ZXJzaW9uIHVzZWQgb24gYml0Z28uY29tXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogICAqIGpzUERGIC0gYW4gaW5zdGFuY2Ugb2YgdGhlIGpzUERGIGxpYnJhcnlcbiAgICogICAqIFFSQ29kZSAtIGFuIGluc3RhbmNlIG9mIHRoZSBRUmlvdXMgbGlicmFyeVxuICAgKiAgICogdXNlcktleWNoYWluIC0gYSB3YWxsZXQncyBwcml2YXRlIHVzZXIga2V5Y2hhaW5cbiAgICogICAqIGJhY2t1cEtleWNoYWluIC0gYSB3YWxsZXQncyBwcml2YXRlIGJhY2t1cCBrZXljaGFpblxuICAgKiAgICogYml0Z29LZXljaGFpbiAtIGEgd2FsbGV0J3MgcHJpdmF0ZSBiaXRnbyBrZXljaGFpblxuICAgKiAgICogcGFzc3BocmFzZSAtIHRoZSB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiAgICogcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSAtIHRoZSBlbmNyeXB0aW9uIHNlY3JldCB1c2VkIGZvciBCb3ggRFxuICAgKiAgICogYWN0aXZhdGlvbkNvZGUgLSBhIHJhbmRvbWx5IGdlbmVyYXRlZCBzaXgtZGlnaXQgYWN0aXZhdGlvbiBjb2RlXG4gICAqICAgKiB3YWxsZXRLZXlJRCAtIHRoZSBLZXkgSUQgdXNlZCBmb3IgZGVyaXZpbmcgYSBjb2xkIHdhbGxldCdzIHNpZ25pbmcga2V5XG4gICAqICAgKiBiYWNrdXBLZXlJRCAtIHRoZSBLZXkgSUQgdXNlZCBmb3IgZGVyaXZpbmcgYSBjb2xkIHdhbGxldCdzIGJhY2t1cCBrZXlcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBkb3dubG9hZEtleWNhcmQocGFyYW1zOiBEb3dubG9hZEtleWNhcmRPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICBpZiAoIXdpbmRvdyB8fCAhd2luZG93LmxvY2F0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBkb3dubG9hZEtleWNhcmQgZnVuY3Rpb24gaXMgb25seSBjYWxsYWJsZSB3aXRoaW4gYSBicm93c2VyLicpO1xuICAgIH1cblxuICAgIC8vIEdyYWIgcGFyYW1ldGVycyB3aXRoIGRlZmF1bHQgZm9yIGFjdGl2YXRpb25Db2RlXG4gICAgY29uc3Qge1xuICAgICAganNQREYsXG4gICAgICBRUkNvZGUsXG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHdhbGxldEtleUlELFxuICAgICAgYmFja3VwS2V5SUQsXG4gICAgICBhY3RpdmF0aW9uQ29kZSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDkwMDAwMCArIDEwMDAwMCkudG9TdHJpbmcoKSxcbiAgICB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCFqc1BERiB8fCB0eXBlb2YganNQREYgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHBhc3MgaW4gYSB2YWxpZCBqc1BERiBpbnN0YW5jZScpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGtleWNoYWluc1xuICAgIGlmICghdXNlcktleWNoYWluIHx8IHR5cGVvZiB1c2VyS2V5Y2hhaW4gIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFdhbGxldCBrZXljaGFpbiBtdXN0IGhhdmUgYSAndXNlcicgcHJvcGVydHlgKTtcbiAgICB9XG5cbiAgICBpZiAoIWJhY2t1cEtleWNoYWluIHx8IHR5cGVvZiBiYWNrdXBLZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQmFja3VwIGtleWNoYWluIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghYml0Z29LZXljaGFpbiB8fCB0eXBlb2YgYml0Z29LZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQml0Z28ga2V5Y2hhaW4gaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKHdhbGxldEtleUlEICYmIHR5cGVvZiB3YWxsZXRLZXlJRCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0S2V5SUQgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIGlmIChiYWNrdXBLZXlJRCAmJiB0eXBlb2YgYmFja3VwS2V5SUQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhY2t1cEtleUlEIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBhY3RpdmF0aW9uIGNvZGUgaWYgcHJvdmlkZWRcbiAgICBpZiAodHlwZW9mIGFjdGl2YXRpb25Db2RlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY3RpdmF0aW9uIENvZGUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIGlmIChhY3RpdmF0aW9uQ29kZS5sZW5ndGggIT09IDYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWN0aXZhdGlvbiBjb2RlIG11c3QgYmUgc2l4IGNoYXJhY3RlcnMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2luU2hvcnROYW1lID0gdGhpcy5iYXNlQ29pbi50eXBlO1xuICAgIGNvbnN0IGNvaW5OYW1lID0gdGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpO1xuICAgIGNvbnN0IHdhbGxldExhYmVsID0gdGhpcy5fd2FsbGV0LmxhYmVsO1xuXG4gICAgY29uc3QgZG9jID0gZHJhd0tleWNhcmQoe1xuICAgICAganNQREYsXG4gICAgICBRUkNvZGUsXG4gICAgICBlbmNyeXB0OiB0aGlzLmJpdGdvLmVuY3J5cHQsXG4gICAgICBjb2luU2hvcnROYW1lLFxuICAgICAgY29pbk5hbWUsXG4gICAgICBhY3RpdmF0aW9uQ29kZSxcbiAgICAgIHdhbGxldExhYmVsLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICB3YWxsZXRLZXlJRCxcbiAgICAgIGJhY2t1cEtleUlELFxuICAgIH0pO1xuXG4gICAgLy8gU2F2ZSB0aGUgUERGIG9uIHRoZSB1c2VyJ3MgYnJvd3NlclxuICAgIGRvYy5zYXZlKGBCaXRHbyBLZXljYXJkIGZvciAke3dhbGxldExhYmVsfS5wZGZgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzZXQgb2YgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnMgZm9yIGEgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAgICBjb25zb2xpZGF0ZUFkZHJlc3NlcyAtIHRoZXNlIGFyZSB0aGUgb24tY2hhaW4gcmVjZWl2ZSBhZGRyZXNzZXMgd2Ugd2FudCB0byBwaWNrIGEgY29uc29saWRhdGlvbiBhbW91bnQgZnJvbVxuICAgKi9cbiAgYXN5bmMgYnVpbGRBY2NvdW50Q29uc29saWRhdGlvbnMoXG4gICAgcGFyYW1zOiBCdWlsZENvbnNvbGlkYXRpb25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHRbXT4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5hbGxvd3NBY2NvdW50Q29uc29saWRhdGlvbnMoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX0gZG9lcyBub3QgYWxsb3cgYWNjb3VudCBjb25zb2xpZGF0aW9ucy5gKTtcbiAgICB9XG5cbiAgICAvLyBXaGl0ZWxpc3QgcGFyYW1zIHRvIGJ1aWxkIHR4XG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkQ29uc29saWRhdGVBY2NvdW50UGFyYW1zKCkpO1xuICAgIGRlYnVnKCdwcmVidWlsZGluZyBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uOiAlTycsIHdoaXRlbGlzdGVkUGFyYW1zKTtcblxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgY291bGQgcmV0dXJuIDEwMCBidWlsZCB0cmFuc2FjdGlvbnNcbiAgICBjb25zdCBidWlsZFJlc3BvbnNlID0gKGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL2NvbnNvbGlkYXRlQWNjb3VudC9idWlsZCcpKVxuICAgICAgLnNlbmQod2hpdGVsaXN0ZWRQYXJhbXMpXG4gICAgICAucmVzdWx0KCkpIGFzIGFueTtcblxuICAgIC8vIHdlIG5lZWQgdG8gc3RlcCBvdmVyIGVhY2ggcHJlYnVpbGQgbm93IC0gc2hvdWxkIGJlIGluIGFuIGFycmF5IGluIHRoZSBib2R5XG4gICAgY29uc3QgY29uc29saWRhdGlvbnM6IFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHRbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uc29saWRhdGVBY2NvdW50QnVpbGQgb2YgYnVpbGRSZXNwb25zZSkge1xuICAgICAgbGV0IHByZWJ1aWxkOiBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0ID0gKGF3YWl0IHRoaXMuYmFzZUNvaW4ucG9zdFByb2Nlc3NQcmVidWlsZChcbiAgICAgICAgT2JqZWN0LmFzc2lnbihjb25zb2xpZGF0ZUFjY291bnRCdWlsZCwgeyB3YWxsZXQ6IHRoaXMsIGJ1aWxkUGFyYW1zOiB3aGl0ZWxpc3RlZFBhcmFtcyB9KVxuICAgICAgKSkgYXMgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdDtcblxuICAgICAgZGVsZXRlIHByZWJ1aWxkLndhbGxldDtcbiAgICAgIGRlbGV0ZSBwcmVidWlsZC5idWlsZFBhcmFtcztcblxuICAgICAgcHJlYnVpbGQgPSBfLmV4dGVuZCh7fSwgcHJlYnVpbGQsIHsgd2FsbGV0SWQ6IHRoaXMuaWQoKSB9KTtcbiAgICAgIGRlYnVnKCdmaW5hbCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uIHByZWJ1aWxkOiAlTycsIHByZWJ1aWxkKTtcblxuICAgICAgY29uc29saWRhdGlvbnMucHVzaChwcmVidWlsZCk7XG4gICAgfVxuICAgIHJldHVybiBjb25zb2xpZGF0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW5kIHNlbmRzIGEgc2V0IG9mIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zIGZvciBhIHdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAgICAgcHJlYnVpbGRUeCAgIC0gdGhpcyBpcyB0aGUgcHJlLWJ1aWxkIGNvbnNvbGlkYXRpb24gdHguIHRoaXMgaXMgYSBub3JtYWxseSBidWlsdCB0eCB3aXRoXG4gICAqICAgICAgICAgICAgICAgICAgICBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciBvZiBjb25zb2xpZGF0ZUlkLlxuICAgKiAgICAgdmVyaWZpY2F0aW9uIC0gbm9ybWFsIGtleWNoYWlucywgZXRjLiBmb3IgdmVyaWZpY2F0aW9uXG4gICAqL1xuICBhc3luYyBzZW5kQWNjb3VudENvbnNvbGlkYXRpb24ocGFyYW1zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLmFsbG93c0FjY291bnRDb25zb2xpZGF0aW9ucygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCBhbGxvdyBhY2NvdW50IGNvbnNvbGlkYXRpb25zLmApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQudHlwZSA9PT0gJ2N1c3RvZGlhbCcgJiYgdGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSAhPT0gJ3RzcycpIHtcbiAgICAgIHBhcmFtcy50eXBlID0gJ2NvbnNvbGlkYXRlJztcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy90eC9pbml0aWF0ZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgfVxuXG4gICAgLy8gb25lIG9mIGEgc2V0IG9mIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMucHJlYnVpbGRUeCA9PT0gJ3N0cmluZycgfHwgcGFyYW1zLnByZWJ1aWxkVHggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJ1aWxkIG9mIGFjY291bnQgY29uc29saWRhdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5wcmVidWlsZFR4LmNvbnNvbGlkYXRlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZpbmQgY29uc29saWRhdGlvbiBpZCBvbiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uLicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgaWYgKCFwYXJhbXMucHJlYnVpbGRUeC50eFJlcXVlc3RJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnNvbGlkYXRpb24gcmVxdWVzdCBtaXNzaW5nIHR4UmVxdWVzdElkLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kTWFueVRzcyhwYXJhbXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25lZFByZWJ1aWxkID0gKGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKSkgYXMgYW55O1xuXG4gICAgLy8gZGVjb3JhdGUgd2l0aCBvdXIgY29uc29saWRhdGlvbiBpZFxuICAgIHNpZ25lZFByZWJ1aWxkLmNvbnNvbGlkYXRlSWQgPSBwYXJhbXMucHJlYnVpbGRUeC5jb25zb2xpZGF0ZUlkO1xuXG4gICAgZGVsZXRlIHNpZ25lZFByZWJ1aWxkLndhbGxldDtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKHNpZ25lZFByZWJ1aWxkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW5kIHNlbmRzIGEgc2V0IG9mIGFjY291bnQgY29uc29saWRhdGlvbnMuIFRoaXMgaXMgaW50ZW5kZWQgdG8gZmx1c2ggbWFueSBiYWxhbmNlcyB0byB0aGUgcm9vdCB3YWxsZXQgYmFsYW5jZS5cbiAgICogQHBhcmFtIHBhcmFtcyAtXG4gICAqICAgICBjb25zb2xpZGF0ZUFkZHJlc3NlcyAtIHRoZXNlIGFyZSB0aGUgb24tY2hhaW4gcmVjZWl2ZSBhZGRyZXNzZXMgd2Ugd2FudCB0byBwaWNrIGEgY29uc29saWRhdGlvbiBhbW91bnQgZnJvbVxuICAgKi9cbiAgYXN5bmMgc2VuZEFjY291bnRDb25zb2xpZGF0aW9ucyhwYXJhbXM6IEJ1aWxkQ29uc29saWRhdGlvblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IGFsbG93IGFjY291bnQgY29uc29saWRhdGlvbnMuYCk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBnaXZlcyB1cyBhIHNldCBvZiBhY2NvdW50IGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zXG4gICAgY29uc3QgdW5zaWduZWRCdWlsZHMgPSAoYXdhaXQgdGhpcy5idWlsZEFjY291bnRDb25zb2xpZGF0aW9ucyhwYXJhbXMpKSBhcyBhbnk7XG4gICAgaWYgKHVuc2lnbmVkQnVpbGRzICYmIHVuc2lnbmVkQnVpbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3NmdWxUeHM6IGFueVtdID0gW107XG4gICAgICBjb25zdCBmYWlsZWRUeHMgPSBuZXcgQXJyYXk8RXJyb3I+KCk7XG4gICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkQnVpbGQgb2YgdW5zaWduZWRCdWlsZHMpIHtcbiAgICAgICAgLy8gZm9sZCBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgd2UgdXNlZCB0byBidWlsZCB0aGlzIHRyYW5zYWN0aW9uIGludG8gdGhlIHVuc2lnbmVkQnVpbGRcbiAgICAgICAgY29uc3QgdW5zaWduZWRCdWlsZFdpdGhPcHRpb25zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwYXJhbXMpO1xuICAgICAgICB1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMucHJlYnVpbGRUeCA9IHVuc2lnbmVkQnVpbGQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc2VuZFR4ID0gYXdhaXQgdGhpcy5zZW5kQWNjb3VudENvbnNvbGlkYXRpb24odW5zaWduZWRCdWlsZFdpdGhPcHRpb25zKTtcbiAgICAgICAgICBzdWNjZXNzZnVsVHhzLnB1c2goc2VuZFR4KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZGlyKGUpO1xuICAgICAgICAgIGZhaWxlZFR4cy5wdXNoKGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NmdWxUeHMsXG4gICAgICAgIGZhaWx1cmU6IGZhaWxlZFR4cyxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNldCBvZiB0cmFuc2FjdGlvbnMgdGhhdCBlbmFibGVzIHRoZSBzcGVjaWZpZWQgdG9rZW5zXG4gICAqIEBwYXJhbSBwYXJhbXMgLVxuICAgKiAgICBlbmFibGVUb2tlbnM6IFRva2VuIGVuYWJsZW1lbnQgb3BlcmF0aW9ucyB3ZSB3YW50IHRvIHBlcmZvcm1cbiAgICogQHJldHVybnMgVW5zaWduZWQgdHJhbnNhY3Rpb25zIHRoYXQgZW5hYmxlcyB0aGUgc3BlY2lmaWVkIHRva2Vuc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGJ1aWxkVG9rZW5FbmFibGVtZW50cyhcbiAgICBwYXJhbXM6IEJ1aWxkVG9rZW5FbmFibGVtZW50T3B0aW9ucyA9IHsgZW5hYmxlVG9rZW5zOiBbXSB9XG4gICk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdPiB7XG4gICAgY29uc3QgdGVDb25maWcgPSB0aGlzLmJhc2VDb2luLmdldFRva2VuRW5hYmxlbWVudENvbmZpZygpO1xuICAgIGlmICghdGVDb25maWcucmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IHJlcXVpcmUgdG9rZW4gZW5hYmxlbWVudHNgKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5lbmFibGVUb2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHRva2VucyBhcmUgYmVpbmcgc3BlY2lmaWVkJyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMucmVjaXBpZW50cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IHNwZWNpZnkgcmVjaXBpZW50cyBmb3IgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbnMnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICB9XG5cbiAgICAvLyBTcGxpdCBxdWVyeSBpZiB3ZSBjYW4ndCBlbmFibGUgbXVsdGlwbGUgdG9rZW5zIGluIG9uZSB0eFxuICAgIGlmICghdGVDb25maWcuc3VwcG9ydHNNdWx0aXBsZVRva2VuRW5hYmxlbWVudHMgJiYgcGFyYW1zLmVuYWJsZVRva2Vucy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBxdWVyaWVzID0gcGFyYW1zLmVuYWJsZVRva2Vucy5tYXAoYXN5bmMgKGVuYWJsZVRva2VuKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkVG9rZW5FbmFibGVtZW50cyh7XG4gICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgIGVuYWJsZVRva2VuczogW2VuYWJsZVRva2VuXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChxdWVyaWVzKTtcbiAgICAgIHJldHVybiByZXN1bHRzLmZsYXQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBidWlsZFBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSk7XG4gICAgYnVpbGRQYXJhbXMudHlwZSA9ICdlbmFibGV0b2tlbic7XG4gICAgLy8gQ2hlY2sgaWYgd2UgYnVpbGQgd2l0aCBpbnRlbnRcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKGJ1aWxkUGFyYW1zKV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJld3JpdGUgdG9rZW5zIGludG8gcmVjaXBpZW50cyBmb3IgYnVpbGRUcmFuc2FjdGlvblxuICAgICAgYnVpbGRQYXJhbXMucmVjaXBpZW50cyA9IHBhcmFtcy5lbmFibGVUb2tlbnMubWFwKCh0b2tlbikgPT4ge1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gdG9rZW4uYWRkcmVzcyB8fCB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljPy5iYXNlQWRkcmVzcztcbiAgICAgICAgaWYgKCFhZGRyZXNzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXYWxsZXQgZG9lcyBub3QgaGF2ZSBiYXNlIGFkZHJlc3MsIG11c3Qgc3BlY2lmeSB3aXRoIHRva2VuIHBhcmFtJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0b2tlbk5hbWU6IHRva2VuLm5hbWUsXG4gICAgICAgICAgYWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6ICcwJyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgZGVsZXRlIGJ1aWxkUGFyYW1zLmVuYWJsZVRva2VucztcbiAgICAgIGNvbnN0IHByZWJ1aWxkVHggPSBhd2FpdCB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb24oYnVpbGRQYXJhbXMpO1xuICAgICAgcHJlYnVpbGRUeC5idWlsZFBhcmFtcyA9IGJ1aWxkUGFyYW1zO1xuICAgICAgcmV0dXJuIFtwcmVidWlsZFR4XTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYW5kIHNlbmRzIGEgc2luZ2xlIHVuc2lnbmVkIHRva2VuIGVuYWJsZW1lbnQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJuc1xuICAgKiAgIC0gVGhlIHJlc3BvbnNlIGZyb20gc2VuZGluZyB0aGUgdHJhbnNhY3Rpb24gZm9yIGhvdC9jb2xkIHdhbGxldHNcbiAgICogICAtIFRoZSByZXNwb25zZSBmcm9tIGluaXRpYXRpbmcgdGhlIHRyYW5zYWN0aW9uIGZvciBjdXN0b2RpYWwgd2FsbGV0c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRUb2tlbkVuYWJsZW1lbnQocGFyYW1zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgdGVDb25maWcgPSB0aGlzLmJhc2VDb2luLmdldFRva2VuRW5hYmxlbWVudENvbmZpZygpO1xuICAgIGlmICghdGVDb25maWcucmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IHJlcXVpcmUgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbnNgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBhcmFtcy5wcmVidWlsZFR4ID09PSAnc3RyaW5nJyB8fCBwYXJhbXMucHJlYnVpbGRUeD8uYnVpbGRQYXJhbXM/LnR5cGUgIT09ICdlbmFibGV0b2tlbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBidWlsZCBvZiB0b2tlbiBlbmFibGVtZW50LicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZE1hbnlUc3MocGFyYW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoICh0aGlzLl93YWxsZXQudHlwZSkge1xuICAgICAgICBjYXNlICdob3QnOlxuICAgICAgICBjYXNlICdjb2xkJzpcbiAgICAgICAgICBjb25zdCBzaWduZWRQcmVidWlsZCA9IGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihzaWduZWRQcmVidWlsZCk7XG4gICAgICAgIGNhc2UgJ2N1c3RvZGlhbCc6XG4gICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvdHgvaW5pdGlhdGUnKTtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZChwYXJhbXMucHJlYnVpbGRUeC5idWlsZFBhcmFtcykucmVzdWx0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNvbWUgY2hhaW5zIHJlcXVpcmUgdG9rZW5zIHRvIGJlIGVuYWJsZWQgYmVmb3JlIHRoZXkgY2FuIGJlIHJlY2VpdmVkL3NlbnQuXG4gICAqIFRoaXMgaXMgYSBkZWRpY2F0ZWQgZnVuY3Rpb24gdGhhdCBlbmFibGVzIHRva2Vucy5cbiAgICpcbiAgICogQnVpbGRzLCBzaWducywgYW5kIHNlbmRzIGEgc2V0IG9mIHRyYW5zYWN0aW9ucyB0aGF0IGVuYWJsZXMgdGhlIHNwZWNpZmllZCB0b2tlbnNcbiAgICogQHBhcmFtIHBhcmFtcyAtXG4gICAqICAgIGVuYWJsZVRva2VuczogVG9rZW4gZW5hYmxlbWVudCBvcGVyYXRpb25zIHdlIHdhbnQgdG8gcGVyZm9ybVxuICAgKiBAcmV0dXJuXG4gICAqICAgIHN1Y2Nlc3M6IFN1Y2Nlc3NmdWwgcmVzcG9uc2VzIGZyb20gc2VuZFRva2VuRW5hYmxlbWVudFxuICAgKiAgICBmYWlsdXJlOiBFcnJvcnMgZnJvbSBmYWlsZWQgdHJhbnNhY3Rpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZFRva2VuRW5hYmxlbWVudHMocGFyYW1zOiBCdWlsZFRva2VuRW5hYmxlbWVudE9wdGlvbnMgPSB7IGVuYWJsZVRva2VuczogW10gfSk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGFueVtdO1xuICAgIGZhaWx1cmU6IEVycm9yW107XG4gIH0+IHtcbiAgICBjb25zdCB1bnNpZ25lZEJ1aWxkcyA9IGF3YWl0IHRoaXMuYnVpbGRUb2tlbkVuYWJsZW1lbnRzKHBhcmFtcyk7XG5cbiAgICBjb25zdCBzdWNjZXNzZnVsVHhzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IGZhaWxlZFR4cyA9IG5ldyBBcnJheTxFcnJvcj4oKTtcbiAgICBmb3IgKGNvbnN0IHVuc2lnbmVkQnVpbGQgb2YgdW5zaWduZWRCdWlsZHMpIHtcbiAgICAgIGNvbnN0IHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9uczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHByZWJ1aWxkVHg6IHVuc2lnbmVkQnVpbGQsXG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VuZFR4ID0gYXdhaXQgdGhpcy5zZW5kVG9rZW5FbmFibGVtZW50KHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9ucyk7XG4gICAgICAgIHN1Y2Nlc3NmdWxUeHMucHVzaChzZW5kVHgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBmYWlsZWRUeHMucHVzaChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2Vzczogc3VjY2Vzc2Z1bFR4cyxcbiAgICAgIGZhaWx1cmU6IGZhaWxlZFR4cyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBsaWdodG5pbmcgZm9yIGJ0Yy90YnRjIGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIHB1YmxpYyBsaWdodG5pbmcoKTogTGlnaHRuaW5nIHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNMaWdodG5pbmcoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaWdodG5pbmcgbm90IHN1cHBvcnRlZCBmb3IgJHt0aGlzLmNvaW4oKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBMaWdodG5pbmcodGhpcy5iaXRnbywgdGhpcyk7XG4gIH1cblxuICAvKiBNQVJLOiBUU1MgSGVscGVycyAqL1xuXG4gIC8qKlxuICAgKiBQcmVidWlsZHMgYSB0cmFuc2FjdGlvbiBmb3IgYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHByZWJ1aWxkIHRyYW5zYWN0aW9uIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJlYnVpbGRUcmFuc2FjdGlvblRzcyhwYXJhbXM6IFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBpZiAoXG4gICAgICBwYXJhbXMuYXBpVmVyc2lvbiA9PT0gJ2xpdGUnICYmXG4gICAgICAodGhpcy5fd2FsbGV0LnR5cGUgPT09ICdjdXN0b2RpYWwnIHx8IHRoaXMuX3dhbGxldC50eXBlID09PSAnY29sZCcgfHwgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSA9PT0gJ2VjZHNhJylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ3VzdG9kaWFsIGFuZCBFQ0RTQSBNUEMgYWxnb3JpdGhtIG11c3QgYWx3YXlzIHVzZSAnZnVsbCcgYXBpIHZlcnNpb25gKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcGlWZXJzaW9uID1cbiAgICAgIHBhcmFtcy5hcGlWZXJzaW9uIHx8XG4gICAgICAodGhpcy5fd2FsbGV0LnR5cGUgPT09ICdjdXN0b2RpYWwnIHx8IHRoaXMuX3dhbGxldC50eXBlID09PSAnY29sZCcgfHwgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSA9PT0gJ2VjZHNhJ1xuICAgICAgICA/ICdmdWxsJ1xuICAgICAgICA6ICdsaXRlJyk7XG4gICAgLy8gVHdvIG9wdGlvbnMgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiBmZWVzIHNlZW1zIHRvIG5vdyBiZSBzdXBwb3J0ZWQsIGZvciBub3cgd2Ugd2lsbCBzdXBwb3J0IGJvdGggdG8gYmUgYmFja3dhcmRzIGNvbXBhdGlibGVcbiAgICAvLyBUT0RPKEJHLTU5Njg1KTogZGVwcmVjYXRlIG9uZSBvZiB0aGVzZSBzbyB0aGF0IHdlIGhhdmUgYSBzaW5nbGUgd2F5IHRvIHBhc3MgZmVlc1xuICAgIGxldCBmZWVPcHRpb25zO1xuICAgIGlmIChwYXJhbXMuZmVlT3B0aW9ucykge1xuICAgICAgZmVlT3B0aW9ucyA9IHBhcmFtcy5mZWVPcHRpb25zO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLmdhc1ByaWNlICE9PSB1bmRlZmluZWQgfHwgcGFyYW1zLmVpcDE1NTkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmVlT3B0aW9ucyA9XG4gICAgICAgIHBhcmFtcy5nYXNQcmljZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7IGdhc1ByaWNlOiBwYXJhbXMuZ2FzUHJpY2UsIGdhc0xpbWl0OiBwYXJhbXMuZ2FzTGltaXQgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBtYXhGZWVQZXJHYXM6IE51bWJlcihwYXJhbXMuZWlwMTU1OT8ubWF4RmVlUGVyR2FzKSxcbiAgICAgICAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IE51bWJlcihwYXJhbXMuZWlwMTU1OT8ubWF4UHJpb3JpdHlGZWVQZXJHYXMpLFxuICAgICAgICAgICAgICBnYXNMaW1pdDogcGFyYW1zLmdhc0xpbWl0LFxuICAgICAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5nYXNMaW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmZWVPcHRpb25zID0geyBnYXNMaW1pdDogcGFyYW1zLmdhc0xpbWl0IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGZlZU9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgbGV0IHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHN3aXRjaCAocGFyYW1zLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3RyYW5zZmVyJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAncGF5bWVudCcsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMuc2VxdWVuY2VJZCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IHBhcmFtcy5jb21tZW50LFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgICAgY3VzdG9kaWFuVHJhbnNhY3Rpb25JZDogcGFyYW1zLmN1c3RvZGlhblRyYW5zYWN0aW9uSWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndHJhbnNmZXJ0b2tlbic6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaXNUc3M6IHBhcmFtcy5pc1RzcyxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICd0cmFuc2ZlclRva2VuJyxcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IHBhcmFtcy5yZWNpcGllbnRzIHx8IFtdLFxuICAgICAgICAgICAgbm9uY2U6IHBhcmFtcy5ub25jZSxcbiAgICAgICAgICAgIGZlZU9wdGlvbnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZW5hYmxldG9rZW4nOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdlbmFibGVUb2tlbicsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBwYXJhbXMucmVjaXBpZW50cyB8fCBbXSxcbiAgICAgICAgICAgIGVuYWJsZVRva2VuczogcGFyYW1zLmVuYWJsZVRva2VucyxcbiAgICAgICAgICAgIG1lbW86IHBhcmFtcy5tZW1vLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2FjY2VsZXJhdGlvbic6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ2FjY2VsZXJhdGlvbicsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIGxvd0ZlZVR4aWQ6IHBhcmFtcy5sb3dGZWVUeGlkLFxuICAgICAgICAgICAgcmVjZWl2ZUFkZHJlc3M6IHBhcmFtcy5yZWNlaXZlQWRkcmVzcyxcbiAgICAgICAgICAgIGZlZU9wdGlvbnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZmlsbE5vbmNlJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAnZmlsbE5vbmNlJyxcbiAgICAgICAgICAgIGNvbW1lbnQ6IHBhcmFtcy5jb21tZW50LFxuICAgICAgICAgICAgbm9uY2U6IHBhcmFtcy5ub25jZSxcbiAgICAgICAgICAgIHJlY2VpdmVBZGRyZXNzOiBwYXJhbXMucmVjZWl2ZUFkZHJlc3MsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdHJhbnNhY3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAke3BhcmFtcy50eXBlfWApO1xuICAgIH1cblxuICAgIGxldCB1bnNpZ25lZFR4OiBFZGRzYVVuc2lnbmVkVHJhbnNhY3Rpb247XG5cbiAgICBpZiAodHhSZXF1ZXN0LmFwaVZlcnNpb24gPT09ICdmdWxsJykge1xuICAgICAgaWYgKHR4UmVxdWVzdC50cmFuc2FjdGlvbnM/Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgc2luZ2xlIHVuc2lnbmVkIHR4IGZvciB0eCByZXF1ZXN0IHdpdGggaWQ6ICR7dHhSZXF1ZXN0LnR4UmVxdWVzdElkfWApO1xuICAgICAgfVxuXG4gICAgICB1bnNpZ25lZFR4ID0gdHhSZXF1ZXN0LnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHhSZXF1ZXN0LnVuc2lnbmVkVHhzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgc2luZ2xlIHVuc2lnbmVkIHR4IGZvciB0eCByZXF1ZXN0IHdpdGggaWQ6ICR7dHhSZXF1ZXN0LnR4UmVxdWVzdElkfWApO1xuICAgICAgfVxuICAgICAgdW5zaWduZWRUeCA9IHR4UmVxdWVzdC51bnNpZ25lZFR4c1swXTtcbiAgICB9XG5cbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpKTtcbiAgICByZXR1cm4ge1xuICAgICAgd2FsbGV0SWQ6IHRoaXMuaWQoKSxcbiAgICAgIHdhbGxldDogdGhpcyxcbiAgICAgIHR4UmVxdWVzdElkOiB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICB0eEhleDogdW5zaWduZWRUeC5zZXJpYWxpemVkVHhIZXgsXG4gICAgICBidWlsZFBhcmFtczogd2hpdGVsaXN0ZWRQYXJhbXMsXG4gICAgICBmZWVJbmZvOiB1bnNpZ25lZFR4LmZlZUluZm8sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1MgRWREU0Egd2FsbGV0IHVzaW5nIGV4dGVybmFsIHNpZ25lci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBzaWduaW5nIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblRyYW5zYWN0aW9uVHNzRXh0ZXJuYWxTaWduZXJFZERTQShcbiAgICBwYXJhbXM6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSxcbiAgICBjb2luOiBJQmFzZUNvaW5cbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBsZXQgdHhSZXF1ZXN0SWQgPSAnJztcbiAgICBpZiAocGFyYW1zLnR4UmVxdWVzdElkKSB7XG4gICAgICB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy50eFByZWJ1aWxkICYmIHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkKSB7XG4gICAgICB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4UmVxdWVzdElkIHJlcXVpcmVkIHRvIHNpZ24gVFNTIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21Db21taXRtZW50R2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgY29tbWl0bWVudCByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21SU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBSIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbUdTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIEcgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGFzc2VydCh0aGlzLnRzc1V0aWxzLCAndHNzVXRpbHMgbXVzdCBiZSBkZWZpbmVkJyk7XG4gICAgICBjb25zdCBzaWduZWRUeFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzLnNpZ25FZGRzYVRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgICAgIHR4UmVxdWVzdElkLFxuICAgICAgICBwYXJhbXMuY3VzdG9tQ29tbWl0bWVudEdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICAgICAgcGFyYW1zLmN1c3RvbVJTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICAgICAgcGFyYW1zLmN1c3RvbUdTaGFyZUdlbmVyYXRpbmdGdW5jdGlvblxuICAgICAgKTtcbiAgICAgIHJldHVybiBzaWduZWRUeFJlcXVlc3Q7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiB0cmFuc2FjdGlvbiAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gZnJvbSBhIFRTUyBFQ0RTQSB3YWxsZXQgdXNpbmcgZXh0ZXJuYWwgc2lnbmVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNpZ25pbmcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHJhbnNhY3Rpb25Uc3NFeHRlcm5hbFNpZ25lckVDRFNBKFxuICAgIGNvaW46IElCYXNlQ29pbixcbiAgICBwYXJhbXM6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGxldCB0eFJlcXVlc3RJZCA9ICcnO1xuICAgIGlmIChwYXJhbXMudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnR4UHJlYnVpbGQgJiYgcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHhSZXF1ZXN0SWQgcmVxdWlyZWQgdG8gc2lnbiBUU1MgdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbVBhaWxsaWVyTW9kdWx1c0dlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIHBhaWxsaWVyIG1vZHVsdXMgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgSyBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBNdURlbHRhIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbVNTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIFMgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGFzc2VydCh0aGlzLnRzc1V0aWxzLCAndHNzVXRpbHMgbXVzdCBiZSBkZWZpbmVkJyk7XG4gICAgICBjb25zdCBzaWduZWRUeFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzLnNpZ25FY2RzYVRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgICAgIHtcbiAgICAgICAgICB0eFJlcXVlc3Q6IHR4UmVxdWVzdElkLFxuICAgICAgICAgIHBydjogJycsXG4gICAgICAgICAgcmVxSWQ6IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICAgIH0sXG4gICAgICAgIFJlcXVlc3RUeXBlLnR4LFxuICAgICAgICBwYXJhbXMuY3VzdG9tUGFpbGxpZXJNb2R1bHVzR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tTXVEZWx0YVNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tU1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uXG4gICAgICApO1xuICAgICAgcmV0dXJuIHNpZ25lZFR4UmVxdWVzdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBzaWduIHRyYW5zYWN0aW9uICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0cmFuc2FjdGlvbiBmcm9tIGEgVFNTIHdhbGxldC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBzaWduaW5nIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblRyYW5zYWN0aW9uVHNzKHBhcmFtczogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGlmICghcGFyYW1zLnR4UHJlYnVpbGQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHhQcmVidWlsZCByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHhSZXF1ZXN0SWQgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggVFNTJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgb25seSB0aGUgZ2V0SGFzaEZ1bmN0aW9uKCkgaXMgZGVmaW5lZCBmb3IgdGhlIGNvaW4gdXNlIGl0IG90aGVyd2lzZVxuICAgIC8vIHBhc3MgdW5kZWZpbmVkIGhhc2gsIGRlZmF1bHQgaGFzaCB3aWxsIGJlIHVzZWQgaW4gdGhhdCBjYXNlLlxuICAgIGxldCBoYXNoOiBIYXNoIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBoYXNoID0gdGhpcy5iYXNlQ29pbi5nZXRIYXNoRnVuY3Rpb24oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGhhc2ggPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzaWduZWRUeFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5zaWduVHhSZXF1ZXN0KHtcbiAgICAgICAgdHhSZXF1ZXN0OiBwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCxcbiAgICAgICAgcHJ2OiBwYXJhbXMucHJ2LFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICAgIGFwaVZlcnNpb246IHBhcmFtcy5hcGlWZXJzaW9uLFxuICAgICAgICBoYXNoLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eFJlcXVlc3RJZDogc2lnbmVkVHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBzaWduIHRyYW5zYWN0aW9uICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSBtZXNzYWdlIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNpZ25pbmcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduTWVzc2FnZVRzcyhwYXJhbXM6IFdhbGxldFNpZ25NZXNzYWdlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRNZXNzYWdlPiB7XG4gICAgaWYgKCFwYXJhbXMucmVxSWQpIHtcbiAgICAgIHBhcmFtcy5yZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiByZXF1aXJlZCB0byBzaWduIG1lc3NhZ2Ugd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgbGV0IHR4UmVxdWVzdDtcbiAgICAgIGFzc2VydChwYXJhbXMubWVzc2FnZSwgJ21lc3NhZ2UgcmVxdWlyZWQgZm9yIG1lc3NhZ2Ugc2lnbmluZycpO1xuICAgICAgaWYgKCFwYXJhbXMubWVzc2FnZS50eFJlcXVlc3RJZCkge1xuICAgICAgICBjb25zdCBpbnRlbnRPcHRpb246IEludGVudE9wdGlvbnNGb3JNZXNzYWdlID0ge1xuICAgICAgICAgIGN1c3RvZGlhbk1lc3NhZ2VJZDogcGFyYW1zLmN1c3RvZGlhbk1lc3NhZ2VJZCxcbiAgICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgICAgIGludGVudFR5cGU6ICdzaWduTWVzc2FnZScsXG4gICAgICAgICAgaXNUc3M6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZVJhdzogcGFyYW1zLm1lc3NhZ2UubWVzc2FnZVJhdyxcbiAgICAgICAgICBtZXNzYWdlRW5jb2RlZDogQnVmZmVyLmZyb20ocGFyYW1zLm1lc3NhZ2U/Lm1lc3NhZ2VFbmNvZGVkID8/ICcnKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH07XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLmNyZWF0ZVR4UmVxdWVzdFdpdGhJbnRlbnRGb3JNZXNzYWdlU2lnbmluZyhpbnRlbnRPcHRpb24pO1xuICAgICAgICBwYXJhbXMubWVzc2FnZS50eFJlcXVlc3RJZCA9IHR4UmVxdWVzdC50eFJlcXVlc3RJZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLmlkKCksIHBhcmFtcy5tZXNzYWdlLnR4UmVxdWVzdElkKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2lnbmVkTWVzc2FnZVJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5zaWduVHhSZXF1ZXN0Rm9yTWVzc2FnZSh7XG4gICAgICAgIHR4UmVxdWVzdCxcbiAgICAgICAgcHJ2OiBwYXJhbXMucHJ2LFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICAgIG1lc3NhZ2VSYXc6IHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VSYXcsXG4gICAgICAgIG1lc3NhZ2VFbmNvZGVkOiBwYXJhbXMubWVzc2FnZS5tZXNzYWdlRW5jb2RlZCxcbiAgICAgICAgYnVmZmVyVG9TaWduOiBCdWZmZXIuZnJvbShwYXJhbXMubWVzc2FnZS5tZXNzYWdlRW5jb2RlZCA/PyAnJyksXG4gICAgICB9KTtcbiAgICAgIGFzc2VydChzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlcywgJ1VuYWJsZSB0byBmaW5kIG1lc3NhZ2VzIGluIHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Jyk7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzWzBdLmNvbWJpbmVTaWdTaGFyZSxcbiAgICAgICAgJ1VuYWJsZSB0byBmaW5kIGNvbWJpbmVTaWdTaGFyZSBpbiBzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlcydcbiAgICAgICk7XG4gICAgICBhc3NlcnQoc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXNbMF0udHhIYXNoLCAnVW5hYmxlIHRvIGZpbmQgdHhIYXNoIGluIHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2luOiB0aGlzLmNvaW4oKSxcbiAgICAgICAgdHhIYXNoOiBzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsXG4gICAgICAgIG1lc3NhZ2VSYXc6IHBhcmFtcy5tZXNzYWdlPy5tZXNzYWdlUmF3LFxuICAgICAgICB0eFJlcXVlc3RJZDogc2lnbmVkTWVzc2FnZVJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gbWVzc2FnZSAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHlwZWQgZGF0YSBmcm9tIGEgVFNTIHdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHlwZWREYXRhVHNzKHBhcmFtczogV2FsbGV0U2lnblR5cGVkRGF0YU9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZE1lc3NhZ2U+IHtcbiAgICBpZiAoIXBhcmFtcy5yZXFJZCkge1xuICAgICAgcGFyYW1zLnJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiByZXF1aXJlZCB0byBzaWduIHR5cGVkIGRhdGEgd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgbGV0IHR4UmVxdWVzdDtcbiAgICAgIGFzc2VydChwYXJhbXMudHlwZWREYXRhLCAndHlwZWREYXRhIHJlcXVpcmVkIGZvciB0eXBlZCBkYXRhIHNpZ25pbmcnKTtcbiAgICAgIGlmICghcGFyYW1zLnR5cGVkRGF0YS50eFJlcXVlc3RJZCkge1xuICAgICAgICBjb25zdCBpbnRlbnRPcHRpb25zOiBJbnRlbnRPcHRpb25zRm9yVHlwZWREYXRhID0ge1xuICAgICAgICAgIGN1c3RvZGlhbk1lc3NhZ2VJZDogcGFyYW1zLmN1c3RvZGlhbk1lc3NhZ2VJZCxcbiAgICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgICAgIGludGVudFR5cGU6ICdzaWduVHlwZWRTdHJ1Y3R1cmVkRGF0YScsXG4gICAgICAgICAgaXNUc3M6IHRydWUsXG4gICAgICAgICAgdHlwZWREYXRhUmF3OiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YVJhdyxcbiAgICAgICAgICB0eXBlZERhdGFFbmNvZGVkOiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQhLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfTtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuY3JlYXRlVHhSZXF1ZXN0V2l0aEludGVudEZvclR5cGVkRGF0YVNpZ25pbmcoaW50ZW50T3B0aW9ucyk7XG4gICAgICAgIHBhcmFtcy50eXBlZERhdGEudHhSZXF1ZXN0SWQgPSB0eFJlcXVlc3QudHhSZXF1ZXN0SWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy5pZCgpLCBwYXJhbXMudHlwZWREYXRhLnR4UmVxdWVzdElkKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2lnbmVkVHlwZWREYXRhUmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnNpZ25UeFJlcXVlc3RGb3JNZXNzYWdlKHtcbiAgICAgICAgdHhSZXF1ZXN0LFxuICAgICAgICBwcnY6IHBhcmFtcy5wcnYsXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSxcbiAgICAgICAgbWVzc2FnZVJhdzogSlNPTi5zdHJpbmdpZnkocGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFSYXcpLFxuICAgICAgICBtZXNzYWdlRW5jb2RlZDogcGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFFbmNvZGVkIS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIGJ1ZmZlclRvU2lnbjogcGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFFbmNvZGVkISxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0KHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QubWVzc2FnZXMsICdVbmFibGUgdG8gZmluZCBtZXNzYWdlcyBpbiBzaWduZWRUeXBlZERhdGFSZXF1ZXN0Jyk7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QubWVzc2FnZXNbMF0uY29tYmluZVNpZ1NoYXJlLFxuICAgICAgICAnVW5hYmxlIHRvIGZpbmQgY29tYmluZVNpZ1NoYXJlIGluIHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QubWVzc2FnZXMnXG4gICAgICApO1xuICAgICAgYXNzZXJ0KHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QubWVzc2FnZXNbMF0udHhIYXNoLCAnVW5hYmxlIHRvIGZpbmQgdHhIYXNoIGluIHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QubWVzc2FnZXMnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvaW46IHRoaXMuY29pbigpLFxuICAgICAgICB0eEhhc2g6IHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QubWVzc2FnZXNbMF0udHhIYXNoLFxuICAgICAgICBtZXNzYWdlUmF3OiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YVJhdyxcbiAgICAgICAgdHhSZXF1ZXN0SWQ6IHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHlwZWQgZGF0YSAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcywgc2lnbnMsIGFuZCBzZW5kcyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNlbmQgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZW5kTWFueVRzcyhwYXJhbXM6IFNlbmRNYW55T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB7IGFwaVZlcnNpb24gfSA9IHBhcmFtcztcbiAgICBjb25zdCBzdXBwb3J0ZWRUeFJlcXVlc3RWZXJzaW9ucyA9IHRoaXMudHNzVXRpbHM/LnN1cHBvcnRlZFR4UmVxdWVzdFZlcnNpb25zKCkgPz8gW107XG4gICAgY29uc3Qgb25seVN1cHBvcnRzVHhSZXF1ZXN0RnVsbCA9XG4gICAgICBzdXBwb3J0ZWRUeFJlcXVlc3RWZXJzaW9ucy5sZW5ndGggPT09IDEgJiYgc3VwcG9ydGVkVHhSZXF1ZXN0VmVyc2lvbnMuaW5jbHVkZXMoJ2Z1bGwnKTtcbiAgICBpZiAoYXBpVmVyc2lvbiA9PT0gJ2xpdGUnICYmIG9ubHlTdXBwb3J0c1R4UmVxdWVzdEZ1bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHhSZXF1ZXN0IExpdGUgQVBJIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24gPSAoYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpKSBhcyBTaWduZWRUcmFuc2FjdGlvblJlcXVlc3Q7XG4gICAgaWYgKCFzaWduZWRUcmFuc2FjdGlvbi50eFJlcXVlc3RJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFJlcXVlc3RJZCBtaXNzaW5nIGZyb20gc2lnbmVkIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogQkctNTExMjIgUmVtb3ZlIGNvbmRpdGlvbmFsIHdoZW4gbW92ZWQgdG8gdHhSZXF1ZXN0RnVsbCBmb3IgZXZlcnl0aGluZ1xuICAgIGlmICh0aGlzLl93YWxsZXQudHlwZSA9PT0gJ2N1c3RvZGlhbCcpIHtcbiAgICAgIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgICAgLnBvc3QoXG4gICAgICAgICAgdGhpcy5iaXRnby51cmwoXG4gICAgICAgICAgICAnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy90eHJlcXVlc3RzLycgKyBzaWduZWRUcmFuc2FjdGlvbi50eFJlcXVlc3RJZCArICcvdHJhbnNmZXJzJyxcbiAgICAgICAgICAgIDJcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgLnNlbmQoKTtcbiAgICB9XG5cbiAgICAvLyBFQ0RTQSBUU1MgdXNlcyBUeFJlcXVlc3RGdWxsXG4gICAgaWYgKGFwaVZlcnNpb24gPT09ICdmdWxsJyB8fCBvbmx5U3VwcG9ydHNUeFJlcXVlc3RGdWxsKSB7XG4gICAgICByZXR1cm4gZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMuaWQoKSwgc2lnbmVkVHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRzc1V0aWxzPy5zZW5kVHhSZXF1ZXN0KHNpZ25lZFRyYW5zYWN0aW9uLnR4UmVxdWVzdElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGZ1bmRzIGZyb20gYSBmZWUgYWRkcmVzcyB0byBhIGZvcndhcmRlci4gT25seSBzdXBwb3J0cyBldGgtbGlrZSBjb2lucy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuZm9yd2FyZGVyQWRkcmVzcyAtIEFkZHJlc3Mgb2YgdGhlIGZvcndhcmRlciB0byBzZW5kIGZ1bmRzIHRvLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmFtb3VudCAtIEFtb3VudCB0byBzZW5kIHRoZSBmb3J3YXJkZXIgKG9wdGlvbmFsKS4gSWYgbm90IGdpdmVuLCBkZWZhdWx0cyB0byBzZW5kaW5nIGFuIGVzdGltYXRlIG9mIHRoZSBhbW91bnQgbmVlZGVkIGZvciBhIGZ1bmQgcmVjb3ZlcnlcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZnVuZEZvcndhcmRlcihwYXJhbXM6IEZ1bmRGb3J3YXJkZXJzT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmZvcndhcmRlckFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZvcndhcmRlciBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvZnVuZEZvcndhcmRlcicpO1xuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh1cmwpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZm9yd2FyZGVyJ3MgYmFsYW5jZVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gb3B0aW9uYWwgcXVlcnkgcGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyBMaXN0IG9mIGZvcndhcmRlciBhZGRyZXNzIGFuZCBiYWxhbmNlXG4gICAqIGlmIHBhcmFtcyBpcyBub3Qgc2V0IHRoZW4gcmV0dXJucyBsb3cgYmFsYW5jZSBmb3J3YXJkZXJzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Rm9yd2FyZGVyQmFsYW5jZShwYXJhbXM/OiBGb3J3YXJkZXJCYWxhbmNlT3B0aW9ucyk6IFByb21pc2U8Rm9yd2FyZGVyQmFsYW5jZVtdPiB7XG4gICAgY29uc3QgcXVlcnk6IEZvcndhcmRlckJhbGFuY2VPcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcz8ubWF4aW11bUJhbGFuY2UpIHtcbiAgICAgIHF1ZXJ5Lm1heGltdW1CYWxhbmNlID0gcGFyYW1zPy5tYXhpbXVtQmFsYW5jZTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zPy5taW5pbXVtQmFsYW5jZSkge1xuICAgICAgcXVlcnkubWluaW11bUJhbGFuY2UgPSBwYXJhbXM/Lm1pbmltdW1CYWxhbmNlO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKGAvZm9yd2FyZGVycy9iYWxhbmNlc2ApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodXJsKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIHJlc3BvbnNlIGFzIEZvcndhcmRlckJhbGFuY2VbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBlY2RzYSB0c3MgY2hhbGxlbmdlcyBmb3IgYSB3YWxsZXQuXG4gICAqIFRoZXNlIGFyZSBzdGF0aWMgY2hhbGxlbmdlcyB0aGF0IGhhdmUgYmVlbiB2ZXJpZmllZCBieSBhbiBlbnRlcnByaXNlIGFkbWluLlxuICAgKiBDYWxsZXJzIHNob3VsZCB2ZXJpZnkgdGhhdCBhbiBlbnRlcnByaXNlIGFkbWluIHNpZ25lZCB0aGUgY2hhbGxlbmdlIHZhbHVlcyBiZWZvcmUgdXNpbmcgdGhlbS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8V2FsbGV0RWNkc2FDaGFsbGVuZ2VzPn1cbiAgICovXG4gIGFzeW5jIGdldENoYWxsZW5nZXNGb3JFY2RzYVNpZ25pbmcoKTogUHJvbWlzZTxXYWxsZXRFY2RzYUNoYWxsZW5nZXM+IHtcbiAgICAvLyBub3RlOiB0aGlzIGlzIG5vdCBhIGNvaW4gc3BlY2lmaWMgcm91dGUsIHdlIGNhbm5vdCB1c2UgdGhpcy51cmwoLi4pXG4gICAgY29uc3QgdXJsID0gdGhpcy5iaXRnby51cmwoYC93YWxsZXQvJHt0aGlzLmlkKCl9L2NoYWxsZW5nZXNgLCAyKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodXJsKS5xdWVyeSh7fSkucmVzdWx0KCk7XG4gIH1cbn1cbiJdfQ==
|
|
3276
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dhbGxldC93YWxsZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0dBRUc7QUFDSCx5Q0FBMkI7QUFDM0Isb0RBQTRCO0FBQzVCLGdFQUFxQztBQUNyQywwQ0FBNEI7QUFDNUIscURBQXVDO0FBVXZDLHdDQUEyQztBQUUzQyxrQ0FBMEM7QUFDMUMsc0NBS21CO0FBQ25CLCtEQUFpRDtBQUNqRCwwQ0FBMEM7QUFDMUMsMENBQTRGO0FBQzVGLHdEQUF5RjtBQUN6Rix3Q0FBNEM7QUFDNUMsb0NBVWtCO0FBc0VsQix3Q0FBNEQ7QUFDNUQsK0RBQTRDO0FBQzVDLDhDQUFpRTtBQUNqRSxnQ0FBc0M7QUFDdEMsK0NBQTREO0FBQzVELDBEQUF1RDtBQUN2RCxzREFBaUQ7QUFDakQsa0RBQTREO0FBRTVELGtEQUF5RjtBQUN6RiwwRUFBdUU7QUFHdkUsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFJbEQsTUFBTSxxQkFBcUIsR0FBRyx5QkFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBRXpGLElBQVkscUJBR1g7QUFIRCxXQUFZLHFCQUFxQjtJQUMvQiw2RUFBVSxDQUFBO0lBQ1YsdUZBQWUsQ0FBQTtBQUNqQixDQUFDLEVBSFcscUJBQXFCLHFDQUFyQixxQkFBcUIsUUFHaEM7QUFFRCxTQUFTLDJCQUEyQixDQUNsQyxVQUEwRDtJQUUxRCxJQUFJLENBQUMsVUFBVSxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2xELE9BQU8sS0FBSyxD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LEtBQUs7WUFDTCxnQkFBZ0I7U0FDakIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxhQUFhLEdBQUc7WUFDcEIsVUFBVSxFQUFFLGtCQUFrQjtZQUM5QixRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN0QixnQkFBZ0I7WUFDaEIsS0FBSztTQUNOLENBQUM7UUFFRixNQUFNLHFCQUFxQixHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN4RSxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBRTFELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEQsQ0FBQztDQUNGO0FBeG9IRCx3QkF3b0hDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0ICogYXMgdCBmcm9tICdpby10cyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyBjb21tb24gZnJvbSAnLi4vLi4vY29tbW9uJztcbmltcG9ydCB7XG4gIElCYXNlQ29pbixcbiAgTkZUVHJhbnNmZXJPcHRpb25zLFxuICBTaWduZWRNZXNzYWdlLFxuICBTaWduZWRUcmFuc2FjdGlvbixcbiAgU2lnbmVkVHJhbnNhY3Rpb25SZXF1ZXN0LFxuICBUcmFuc2FjdGlvblByZWJ1aWxkLFxuICBWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbn0gZnJvbSAnLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHsgbWFrZVJhbmRvbUtleSB9IGZyb20gJy4uL2JpdGNvaW4nO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IGdldFNoYXJlZFNlY3JldCB9IGZyb20gJy4uL2VjZGgnO1xuaW1wb3J0IHtcbiAgQWRkcmVzc0dlbmVyYXRpb25FcnJvcixcbiAgSW5jb3JyZWN0UGFzc3dvcmRFcnJvcixcbiAgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcixcbiAgTWlzc2luZ0VuY3J5cHRlZEtleWNoYWluRXJyb3IsXG59IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgKiBhcyBpbnRlcm5hbCBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcm5hbCc7XG5pbXBvcnQgeyBkcmF3S2V5Y2FyZCB9IGZyb20gJy4uL2ludGVybmFsJztcbmltcG9ydCB7IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXksIEtleWNoYWluLCBLZXljaGFpbldpdGhFbmNyeXB0ZWRQcnYgfSBmcm9tICcuLi9rZXljaGFpbic7XG5pbXBvcnQgeyBJUGVuZGluZ0FwcHJvdmFsLCBQZW5kaW5nQXBwcm92YWwsIFBlbmRpbmdBcHByb3ZhbHMgfSBmcm9tICcuLi9wZW5kaW5nQXBwcm92YWwnO1xuaW1wb3J0IHsgVHJhZGluZ0FjY291bnQgfSBmcm9tICcuLi90cmFkaW5nJztcbmltcG9ydCB7XG4gIEVkZHNhVW5zaWduZWRUcmFuc2FjdGlvbixcbiAgaW5mZXJBZGRyZXNzVHlwZSxcbiAgSW50ZW50T3B0aW9uc0Zvck1lc3NhZ2UsXG4gIEludGVudE9wdGlvbnNGb3JUeXBlZERhdGEsXG4gIFJlcXVlc3RUcmFjZXIsXG4gIFJlcXVlc3RUeXBlLFxuICBUb2tlblRyYW5zZmVyUmVjaXBpZW50UGFyYW1zLFxuICBUb2tlblR5cGUsXG4gIFR4UmVxdWVzdCxcbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgQWNjZWxlcmF0ZVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgQWRkcmVzc2VzQnlCYWxhbmNlT3B0aW9ucyxcbiAgQWRkcmVzc2VzT3B0aW9ucyxcbiAgQnVpbGRDb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25PcHRpb25zLFxuICBCdWlsZFRva2VuRW5hYmxlbWVudE9wdGlvbnMsXG4gIEJ1bGtDcmVhdGVTaGFyZU9wdGlvbixcbiAgQnVsa1dhbGxldFNoYXJlS2V5Y2hhaW4sXG4gIEJ1bGtXYWxsZXRTaGFyZU9wdGlvbnMsXG4gIENoYW5nZUZlZU9wdGlvbnMsXG4gIENvbnNvbGlkYXRlVW5zcGVudHNPcHRpb25zLFxuICBDcmVhdGVBZGRyZXNzT3B0aW9ucyxcbiAgQ3JlYXRlQnVsa1dhbGxldFNoYXJlTGlzdFJlc3BvbnNlLFxuICBDcmVhdGVQb2xpY3lSdWxlT3B0aW9ucyxcbiAgQ3JlYXRlU2hhcmVPcHRpb25zLFxuICBDcm9zc0NoYWluVVRYTyxcbiAgRGVwbG95Rm9yd2FyZGVyc09wdGlvbnMsXG4gIERvd25sb2FkS2V5Y2FyZE9wdGlvbnMsXG4gIEZhbm91dFVuc3BlbnRzT3B0aW9ucyxcbiAgRmV0Y2hDcm9zc0NoYWluVVRYT3NPcHRpb25zLFxuICBGbHVzaEZvcndhcmRlclRva2VuT3B0aW9ucyxcbiAgRm9yd2FyZGVyQmFsYW5jZSxcbiAgRm9yd2FyZGVyQmFsYW5jZU9wdGlvbnMsXG4gIEZyZWV6ZU9wdGlvbnMsXG4gIEZ1bmRGb3J3YXJkZXJQYXJhbXMsXG4gIEZ1bmRGb3J3YXJkZXJzT3B0aW9ucyxcbiAgR2V0QWRkcmVzc09wdGlvbnMsXG4gIEdldFBydk9wdGlvbnMsXG4gIEdldFRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgR2V0VHJhbnNmZXJPcHRpb25zLFxuICBHZXRVc2VyUHJ2T3B0aW9ucyxcbiAgSVdhbGxldCxcbiAgTWFuYWdlVW5zcGVudFJlc2VydmF0aW9uT3B0aW9ucyxcbiAgTWF4aW11bVNwZW5kYWJsZSxcbiAgTWF4aW11bVNwZW5kYWJsZU9wdGlvbnMsXG4gIE1vZGlmeVdlYmhvb2tPcHRpb25zLFxuICBOZnRCYWxhbmNlLFxuICBQYWdpbmF0aW9uT3B0aW9ucyxcbiAgUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdCxcbiAgUmVjb3ZlclRva2VuT3B0aW9ucyxcbiAgUmVtb3ZlUG9saWN5UnVsZU9wdGlvbnMsXG4gIFJlbW92ZVVzZXJPcHRpb25zLFxuICBTZW5kTWFueU9wdGlvbnMsXG4gIFNlbmRORlRPcHRpb25zLFxuICBTZW5kTkZUUmVzdWx0LFxuICBTZW5kT3B0aW9ucyxcbiAgU2hhcmVkS2V5Q2hhaW4sXG4gIFNoYXJlV2FsbGV0T3B0aW9ucyxcbiAgU2lnbkFuZFNlbmRUeFJlcXVlc3RPcHRpb25zLFxuICBTaW11bGF0ZVdlYmhvb2tPcHRpb25zLFxuICBTdWJtaXRUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFN1YldhbGxldFR5cGUsXG4gIFN3ZWVwT3B0aW9ucyxcbiAgVHJhbnNmZXJCeVNlcXVlbmNlSWRPcHRpb25zLFxuICBUcmFuc2ZlckNvbW1lbnRPcHRpb25zLFxuICBUcmFuc2ZlcnNPcHRpb25zLFxuICBVbnNwZW50c09wdGlvbnMsXG4gIFVwZGF0ZUFkZHJlc3NPcHRpb25zLFxuICBVcGRhdGVCdWlsZERlZmF1bHRPcHRpb25zLFxuICBXYWxsZXRDb2luU3BlY2lmaWMsXG4gIFdhbGxldERhdGEsXG4gIFdhbGxldEVjZHNhQ2hhbGxlbmdlcyxcbiAgV2FsbGV0U2lnbk1lc3NhZ2VPcHRpb25zLFxuICBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBXYWxsZXRTaWduVHlwZWREYXRhT3B0aW9ucyxcbiAgV2FsbGV0VHlwZSxcbn0gZnJvbSAnLi9pV2FsbGV0JztcbmltcG9ydCB7IEdvU3Rha2luZ1dhbGxldCwgU3Rha2luZ1dhbGxldCB9IGZyb20gJy4uL3N0YWtpbmcnO1xuaW1wb3J0IEVkZHNhVXRpbHMgZnJvbSAnLi4vdXRpbHMvdHNzL2VkZHNhJztcbmltcG9ydCB7IEVjZHNhTVBDdjJVdGlscywgRWNkc2FVdGlscyB9IGZyb20gJy4uL3V0aWxzL3Rzcy9lY2RzYSc7XG5pbXBvcnQgeyBnZXRUeFJlcXVlc3QgfSBmcm9tICcuLi90c3MnO1xuaW1wb3J0IHsgYnVpbGRQYXJhbUtleXMsIEJ1aWxkUGFyYW1zIH0gZnJvbSAnLi9CdWlsZFBhcmFtcyc7XG5pbXBvcnQgeyBwb3N0V2l0aENvZGVjIH0gZnJvbSAnLi4vdXRpbHMvcG9zdFdpdGhDb2RlYyc7XG5pbXBvcnQgeyBUeFNlbmRCb2R5IH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBBZGRyZXNzQm9vaywgSUFkZHJlc3NCb29rIH0gZnJvbSAnLi4vYWRkcmVzcy1ib29rJztcbmltcG9ydCB7IElSZXF1ZXN0VHJhY2VyIH0gZnJvbSAnLi4vLi4vYXBpJztcbmltcG9ydCB7IGdldFR4UmVxdWVzdEFwaVZlcnNpb24sIHZhbGlkYXRlVHhSZXF1ZXN0QXBpVmVyc2lvbiB9IGZyb20gJy4uL3V0aWxzL3R4UmVxdWVzdCc7XG5pbXBvcnQgeyBnZXRMaWdodG5pbmdBdXRoS2V5IH0gZnJvbSAnLi4vbGlnaHRuaW5nL2xpZ2h0bmluZ1dhbGxldFV0aWwnO1xuaW1wb3J0IHsgU3VibWl0VHJhbnNhY3Rpb25SZXNwb25zZSB9IGZyb20gJy4uL2luc2NyaXB0aW9uQnVpbGRlcic7XG5cbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnYml0Z286djI6d2FsbGV0Jyk7XG5cbnR5cGUgTWFuYWdlVW5zcGVudHMgPSAnY29uc29saWRhdGUnIHwgJ2Zhbm91dCc7XG5cbmNvbnN0IHdoaXRlbGlzdGVkU2VuZFBhcmFtcyA9IFR4U2VuZEJvZHkudHlwZS50eXBlcy5mbGF0TWFwKCh0KSA9PiBPYmplY3Qua2V5cyh0LnByb3BzKSk7XG5cbmV4cG9ydCBlbnVtIE1hbmFnZVVuc3BlbnRzT3B0aW9ucyB7XG4gIEJVSUxEX09OTFksXG4gIEJVSUxEX1NJR05fU0VORCxcbn1cblxuZnVuY3Rpb24gaXNQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0KFxuICBwcmVidWlsZFR4OiBzdHJpbmcgfCBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0IHwgdW5kZWZpbmVkXG4pOiBwcmVidWlsZFR4IGlzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQge1xuICBpZiAoIXByZWJ1aWxkVHggfHwgdHlwZW9mIHByZWJ1aWxkVHggPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAocHJlYnVpbGRUeCBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0KS53YWxsZXRJZCAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgV2FsbGV0IGltcGxlbWVudHMgSVdhbGxldCB7XG4gIHB1YmxpYyByZWFkb25seSBiaXRnbzogQml0R29CYXNlO1xuICBwdWJsaWMgcmVhZG9ubHkgYmFzZUNvaW46IElCYXNlQ29pbjtcbiAgcHVibGljIF93YWxsZXQ6IFdhbGxldERhdGE7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHNzVXRpbHM6IEVjZHNhVXRpbHMgfCBFY2RzYU1QQ3YyVXRpbHMgfCBFZGRzYVV0aWxzIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wZXJtaXNzaW9ucz86IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGJhc2VDb2luOiBJQmFzZUNvaW4sIHdhbGxldERhdGE6IGFueSkge1xuICAgIHRoaXMuYml0Z28gPSBiaXRnbztcbiAgICB0aGlzLmJhc2VDb2luID0gYmFzZUNvaW47XG4gICAgdGhpcy5fd2FsbGV0ID0gd2FsbGV0RGF0YTtcbiAgICBjb25zdCB1c2VySWQgPSBfLmdldChiaXRnbywgJ191c2VyLmlkJyk7XG4gICAgaWYgKF8uaXNTdHJpbmcodXNlcklkKSkge1xuICAgICAgY29uc3QgdXNlckRldGFpbHMgPSBfLmZpbmQod2FsbGV0RGF0YS51c2VycywgeyB1c2VyOiB1c2VySWQgfSk7XG4gICAgICB0aGlzLl9wZXJtaXNzaW9ucyA9IF8uZ2V0KHVzZXJEZXRhaWxzLCAncGVybWlzc2lvbnMnKTtcbiAgICB9XG4gICAgaWYgKGJhc2VDb2luPy5zdXBwb3J0c1RzcygpICYmIHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICBzd2l0Y2ggKGJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpKSB7XG4gICAgICAgIGNhc2UgJ2VjZHNhJzpcbiAgICAgICAgICBpZiAod2FsbGV0RGF0YS5tdWx0aXNpZ1R5cGVWZXJzaW9uID09PSAnTVBDdjInKSB7XG4gICAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gbmV3IEVjZHNhTVBDdjJVdGlscyhiaXRnbywgYmFzZUNvaW4sIHRoaXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gbmV3IEVjZHNhVXRpbHMoYml0Z28sIGJhc2VDb2luLCB0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2VkZHNhJzpcbiAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gbmV3IEVkZHNhVXRpbHMoYml0Z28sIGJhc2VDb2luLCB0aGlzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIFVSTCB1c2luZyB0aGlzIHdhbGxldCdzIGlkIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBCaXRHbyBBUEkgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gZXh0cmEgQVBJIHNwZWNpZmljIHN0cmluZyB0byBhcHBlbmQgdG8gdGhlIHdhbGxldCBpZFxuICAgKi9cbiAgdXJsKGV4dHJhID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgZXh0cmEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGlzIHdhbGxldCdzIGlkXG4gICAqL1xuICBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuaWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBudW1iZXIgb2YgYXBwcm92YWxzIHJlcXVpcmVkIGZvciBzcGVuZGluZyBmdW5kcyBmcm9tIHRoaXMgd2FsbGV0XG4gICAqL1xuICBhcHByb3ZhbHNSZXF1aXJlZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuYXBwcm92YWxzUmVxdWlyZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICovXG4gIGJhbGFuY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmJhbGFuY2U7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgdXNlIGNvZGVjIGluc3RlYWQ6IHQuZXhhY3QoQnVpbGRQYXJhbXMpLmVuY29kZSh2KSAqL1xuICBwcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gYnVpbGRQYXJhbUtleXM7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBhIHN0cmljdCBzdWItc2V0IG9mIHByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXNcbiAgICovXG4gIHByZWJ1aWxkQ29uc29saWRhdGVBY2NvdW50UGFyYW1zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2NvbnNvbGlkYXRlQWRkcmVzc2VzJyxcbiAgICAgICduZnRDb2xsZWN0aW9uSWQnLFxuICAgICAgJ25mdElkJyxcbiAgICAgICdmZWVSYXRlJyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdtZW1vJyxcbiAgICAgICd2YWxpZEZyb21CbG9jaycsXG4gICAgICAndmFsaWRUb0Jsb2NrJyxcbiAgICAgICdwcmV2aWV3JyxcbiAgICAgICdrZWVwQWxpdmUnLFxuICAgICAgJ2FwaVZlcnNpb24nLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjb25maXJtZWQgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgY29uZmlybWVkQmFsYW5jZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29uZmlybWVkQmFsYW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNwZW5kYWJsZSBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqL1xuICBzcGVuZGFibGVCYWxhbmNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5zcGVuZGFibGVCYWxhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJhbGFuY2VzIGhhdmUgdGhlIHBvdGVudGlhbCB0byBvdmVyZmxvdyBzdGFuZGFyZCBqYXZhc2NyaXB0IG51bWJlcnNcbiAgICovXG4gIGJhbGFuY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmJhbGFuY2VTdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb25maXJtZWQgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJhbGFuY2VzIGhhdmUgdGhlIHBvdGVudGlhbCB0byBvdmVyZmxvdyBzdGFuZGFyZCBqYXZhc2NyaXB0IG51bWJlcnNcbiAgICovXG4gIGNvbmZpcm1lZEJhbGFuY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvbmZpcm1lZEJhbGFuY2VTdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVuZGFibGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJhbGFuY2VzIGhhdmUgdGhlIHBvdGVudGlhbCB0byBvdmVyZmxvdyBzdGFuZGFyZCBqYXZhc2NyaXB0IG51bWJlcnNcbiAgICovXG4gIHNwZW5kYWJsZUJhbGFuY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LnNwZW5kYWJsZUJhbGFuY2VTdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjb2luIGlkZW50aWZpZXIgZm9yIHRoZSB0eXBlIG9mIGNvaW4gdGhpcyB3YWxsZXQgaG9sZHNcbiAgICovXG4gIGNvaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvaW47XG4gIH1cblxuICB0eXBlKCk6IFdhbGxldFR5cGUge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQudHlwZSB8fCAnaG90JztcbiAgfVxuXG4gIG11bHRpc2lnVHlwZSgpOiAnb25jaGFpbicgfCAndHNzJyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGU7XG4gIH1cblxuICBtdWx0aXNpZ1R5cGVWZXJzaW9uKCk6ICdNUEN2MicgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbjtcbiAgfVxuXG4gIHN1YlR5cGUoKTogU3ViV2FsbGV0VHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5zdWJUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGFiZWwgKG5hbWUpIGZvciB0aGlzIHdhbGxldFxuICAgKi9cbiAgcHVibGljIGxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5sYWJlbDtcbiAgfVxuXG4gIHB1YmxpYyBmbGFncygpOiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10ge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQud2FsbGV0RmxhZ3MgPz8gW107XG4gIH1cblxuICBwdWJsaWMgZmxhZyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZsYWdzKCkuZmluZCgoZmxhZykgPT4gZmxhZy5uYW1lID09PSBuYW1lKT8udmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBwdWJsaWMgb2JqZWN0IGlkcyBmb3IgdGhlIGtleWNoYWlucyBvbiB0aGlzIHdhbGxldC5cbiAgICovXG4gIHB1YmxpYyBrZXlJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQua2V5cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSByZWNlaXZlIGFkZHJlc3MgZm9yIHRoaXMgd2FsbGV0XG4gICAqL1xuICBwdWJsaWMgcmVjZWl2ZUFkZHJlc3MoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LnJlY2VpdmVBZGRyZXNzPy5hZGRyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd2FsbGV0IGlkIG9mIHRoZSB3YWxsZXQgdGhhdCB0aGlzIHdhbGxldCB3YXMgbWlncmF0ZWQgZnJvbS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIGlmIHRoaXMgaXMgYSBCQ0ggd2FsbGV0IHRoYXQgd2FzIGNyZWF0ZWQgZnJvbSBhIEJUQyB3YWxsZXQsXG4gICAqIHRoZSBCQ0ggd2FsbGV0IG1pZ3JhdGVkIGZyb20gZmllbGQgd291bGQgaGF2ZSB0aGUgQlRDIHdhbGxldCBpZC5cbiAgICovXG4gIHB1YmxpYyBtaWdyYXRlZEZyb20oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0Lm1pZ3JhdGVkRnJvbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHRva2VuIGZsdXNoIHRocmVzaG9sZHMgZm9yIHRoaXMgd2FsbGV0XG4gICAqIEByZXR1cm4geyp8T2JqZWN0fSBwYWlycyBvZiB7IFt0b2tlbk5hbWVdOiB0aHJlc2hvbGRzIH0gYmFzZSB1bml0c1xuICAgKi9cbiAgdG9rZW5GbHVzaFRocmVzaG9sZHMoKTogYW55IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ2V0aCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB3YWxsZXQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWMudG9rZW5GbHVzaFRocmVzaG9sZHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHdhbGxldCBwcm9wZXJ0aWVzIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBjZXJ0YWluIGNvaW4gaW1wbGVtZW50YXRpb25zXG4gICAqL1xuICBjb2luU3BlY2lmaWMoKTogV2FsbGV0Q29pblNwZWNpZmljIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBlbmRpbmcgYXBwcm92YWxzIG9uIHRoaXMgd2FsbGV0XG4gICAqL1xuICBwZW5kaW5nQXBwcm92YWxzKCk6IElQZW5kaW5nQXBwcm92YWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5wZW5kaW5nQXBwcm92YWxzLm1hcCgoY3VycmVudEFwcHJvdmFsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFBlbmRpbmdBcHByb3ZhbCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBjdXJyZW50QXBwcm92YWwsIHRoaXMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggdGhlIHdhbGxldCBvYmplY3QgYnkgc3luY2luZyB3aXRoIHRoZSBiYWNrLWVuZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtXYWxsZXR9XG4gICAqL1xuICBhc3luYyByZWZyZXNoKHBhcmFtczogUmVjb3JkPHN0cmluZywgbmV2ZXI+ID0ge30pOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCkpLnJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHRyYW5zYWN0aW9ucyhwYXJhbXM6IFBhZ2luYXRpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBQYWdpbmF0aW9uT3B0aW9ucyA9IHt9O1xuXG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvdHgnKSlcbiAgICAgIC5xdWVyeShxdWVyeSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBsaXN0IG9mIG5mdCB0b2tlbnMgZm9yIHRoaXMgd2FsbGV0LiBXaWxsIGFsd2F5cyByZXR1cm4gdW5kZWZpbmVkIGlmIHRoZSB3YWxsZXRcbiAgICogd2FzIG5vdCBpbml0aWFsaXplZCB3aXRoIHRoZSBhbGxUb2tlbnMgZmxhZy5cbiAgICpcbiAgICogQHJldHVybnMge05mdEJhbGFuY2VbXSB8IHVuZGVmaW5lZH1cbiAgICovXG4gIG5mdEJhbGFuY2VzKCk6IE5mdEJhbGFuY2VbXSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuX3dhbGxldC5uZnRzKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl93YWxsZXQubmZ0cykubWFwKChuZnREYXRhKSA9PiBuZnREYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBsaXN0IG9mIHVuc3VwcG9ydGVkIG5mdCB0b2tlbnMgZm9yIHRoaXMgd2FsbGV0LiBXaWxsIGFsd2F5cyByZXR1cm4gdW5kZWZpbmVkIGlmIHRoZSB3YWxsZXRcbiAgICogd2FzIG5vdCBpbml0aWFsaXplZCB3aXRoIHRoZSBhbGxUb2tlbnMgZmxhZy5cbiAgICpcbiAgICogQHJldHVybnMge05mdEJhbGFuY2VbXSB8IHVuZGVmaW5lZH1cbiAgICovXG4gIHVuc3VwcG9ydGVkTmZ0QmFsYW5jZXMoKTogTmZ0QmFsYW5jZVtdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fd2FsbGV0LnVuc3VwcG9ydGVkTmZ0cykge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fd2FsbGV0LnVuc3VwcG9ydGVkTmZ0cykubWFwKChuZnREYXRhKSA9PiBuZnREYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgd2FsbGV0cyBuZnQgJiB1bnN1cHBvcnRlZCBuZnRzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7TmZ0QmFsYW5jZVtdfVxuICAgKi9cbiAgYXN5bmMgZ2V0TmZ0QmFsYW5jZXMoKTogUHJvbWlzZTxOZnRCYWxhbmNlW10+IHtcbiAgICBjb25zdCB3YWxsZXREYXRhOiBQYXJ0aWFsPFdhbGxldERhdGE+ID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoKSkucXVlcnkoeyBhbGxUb2tlbnM6IHRydWUgfSkucmVzdWx0KCk7XG5cbiAgICBjb25zdCBzdXBwb3J0ZWROZnRzID0gd2FsbGV0RGF0YT8ubmZ0cyA/IE9iamVjdC52YWx1ZXMod2FsbGV0RGF0YS5uZnRzKS5tYXAoKGJhbGFuY2UpID0+IGJhbGFuY2UpIDogW107XG5cbiAgICBjb25zdCB1bnN1cHBvcnRlZE5mdHMgPSB3YWxsZXREYXRhPy51bnN1cHBvcnRlZE5mdHNcbiAgICAgID8gT2JqZWN0LnZhbHVlcyh3YWxsZXREYXRhLnVuc3VwcG9ydGVkTmZ0cykubWFwKChiYWxhbmNlKSA9PiBiYWxhbmNlKVxuICAgICAgOiBbXTtcbiAgICByZXR1cm4gWy4uLnN1cHBvcnRlZE5mdHMsIC4uLnVuc3VwcG9ydGVkTmZ0c107XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAtIHR4SGFzaCB0aGUgdHJhbnNhY3Rpb24gaGFzaCB0byBzZWFyY2ggZm9yXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0VHJhbnNhY3Rpb24ocGFyYW1zOiBHZXRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd0eEhhc2gnXSwgW10pO1xuXG4gICAgY29uc3QgcGFnaW5hdGVkT3B0aW9uczogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBwYWdpbmF0ZWRPcHRpb25zLnByZXZJZCA9IHBhcmFtcy5wcmV2SWQ7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLmxpbWl0KSB8fCBwYXJhbXMubGltaXQgPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIHBvc2l0aXZlIGludGVnZXInKTtcbiAgICAgIH1cbiAgICAgIHBhZ2luYXRlZE9wdGlvbnMubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnkgPSBwYWdpbmF0ZWRPcHRpb25zO1xuICAgIGlmIChwYXJhbXMuaW5jbHVkZVJiZikge1xuICAgICAgcXVlcnlbJ2luY2x1ZGVSYmYnXSA9IHBhcmFtcy5pbmNsdWRlUmJmO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMudXJsKCcvdHgvJyArIHBhcmFtcy50eEhhc2gpKVxuICAgICAgLnF1ZXJ5KHF1ZXJ5KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIHRyYW5zZmVycyBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHRyYW5zZmVycyhwYXJhbXM6IFRyYW5zZmVyc09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcXVlcnk6IFRyYW5zZmVyc09wdGlvbnMgPSB7fTtcbiAgICBpZiAocGFyYW1zLnByZXZJZCkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcmV2SWQgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnByZXZJZCA9IHBhcmFtcy5wcmV2SWQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmFsbFRva2Vucykge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuYWxsVG9rZW5zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYWxsVG9rZW5zIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuYWxsVG9rZW5zID0gcGFyYW1zLmFsbFRva2VucztcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnNlYXJjaExhYmVsKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnNlYXJjaExhYmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2VhcmNoTGFiZWwgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnNlYXJjaExhYmVsID0gcGFyYW1zLnNlYXJjaExhYmVsO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgICAgaWYgKCFfLmlzQXJyYXkocGFyYW1zLmFkZHJlc3MpICYmICFfLmlzU3RyaW5nKHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYWRkcmVzcyBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZyBvciBhcnJheScpO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNBcnJheShwYXJhbXMuYWRkcmVzcykpIHtcbiAgICAgICAgcGFyYW1zLmFkZHJlc3MuZm9yRWFjaCgoYWRkcmVzcykgPT4ge1xuICAgICAgICAgIGlmICghXy5pc1N0cmluZyhhZGRyZXNzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFkZHJlc3MgYXJndW1lbnQsIGV4cGVjdGluZyBhcnJheSBvZiBhZGRyZXNzIHN0cmluZ3MnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcXVlcnkuYWRkcmVzcyA9IHBhcmFtcy5hZGRyZXNzO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZGF0ZUd0ZSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5kYXRlR3RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGF0ZUd0ZSBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkuZGF0ZUd0ZSA9IHBhcmFtcy5kYXRlR3RlO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZGF0ZUx0KSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmRhdGVMdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRhdGVMdCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkuZGF0ZUx0ID0gcGFyYW1zLmRhdGVMdDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLnZhbHVlR3RlKSkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy52YWx1ZUd0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHZhbHVlR3RlIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS52YWx1ZUd0ZSA9IHBhcmFtcy52YWx1ZUd0ZTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLnZhbHVlTHQpKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnZhbHVlTHQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB2YWx1ZUx0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS52YWx1ZUx0ID0gcGFyYW1zLnZhbHVlTHQ7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlSGV4KSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuaW5jbHVkZUhleCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY2x1ZGVIZXggYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlSGV4ID0gcGFyYW1zLmluY2x1ZGVIZXg7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5zdGF0ZSkpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMuc3RhdGUpICYmICFfLmlzU3RyaW5nKHBhcmFtcy5zdGF0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHN0YXRlIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nIG9yIGFycmF5Jyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtcy5zdGF0ZSkpIHtcbiAgICAgICAgcGFyYW1zLnN0YXRlLmZvckVhY2goKHN0YXRlKSA9PiB7XG4gICAgICAgICAgaWYgKCFfLmlzU3RyaW5nKHN0YXRlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHN0YXRlIGFyZ3VtZW50LCBleHBlY3RpbmcgYXJyYXkgb2Ygc3RhdGUgc3RyaW5ncycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBxdWVyeS5zdGF0ZSA9IHBhcmFtcy5zdGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLnR5cGUpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0eXBlIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS50eXBlID0gcGFyYW1zLnR5cGU7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5kZWNvcmF0ZVV0eG9TcGVjaWZpY0ZpZWxkcykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmRlY29yYXRlVXR4b1NwZWNpZmljRmllbGRzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jbHVkZUhleCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmRlY29yYXRlVXR4b1NwZWNpZmljRmllbGRzID0gcGFyYW1zLmRlY29yYXRlVXR4b1NwZWNpZmljRmllbGRzO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3RyYW5zZmVyJykpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdHJhbnNmZXJzIG9uIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGdldFRyYW5zZmVyKHBhcmFtczogR2V0VHJhbnNmZXJPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgW10pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3RyYW5zZmVyLycgKyBwYXJhbXMuaWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB0cmFuc2FjdGlvbiBieSBzZXF1ZW5jZSBpZCBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgdHJhbnNmZXJCeVNlcXVlbmNlSWQocGFyYW1zOiBUcmFuc2ZlckJ5U2VxdWVuY2VJZE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydzZXF1ZW5jZUlkJ10sIFtdKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy90cmFuc2Zlci9zZXF1ZW5jZUlkLycgKyBwYXJhbXMuc2VxdWVuY2VJZCkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbWF4aW11bSBhbW91bnQgeW91IGNhbiBzcGVuZCBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5saW1pdCAtIG1heGltdW0gbnVtYmVyIG9mIHNlbGVjdGFibGUgdW5zcGVudHNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5taW5WYWx1ZSAtIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1heFZhbHVlIC0gdGhlIG1heGltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluSGVpZ2h0IC0gdGhlIG1pbmltdW0gaGVpZ2h0IG9mIHVuc3BlbnRzIG9uIHRoZSBibG9jayBjaGFpbiB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIGFsbCBzZWxlY3RlZCB1bnNwZW50cyB3aWxsIGhhdmUgYXQgbGVhc3QgdGhpcyBtYW55IGNvbmZpcm1hdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gRW5mb3JjZXMgbWluQ29uZmlybXMgb24gY2hhbmdlIGlucHV0c1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBmZWUgcmF0ZSB0byB1c2UgaW4gY2FsY3VsYXRpb24gb2YgbWF4aW11bSBzcGVuZGFibGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5yZWNpcGllbnRBZGRyZXNzIC0gcmVjaXBpZW50IGFkZHJlc3NlcyBmb3IgYSBtb3JlIGFjY3VyYXRlIGNhbGN1bGF0aW9uIG9mIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSB0byBzZW5kXG4gICAqIEByZXR1cm5zIHt7bWF4aW11bVNwZW5kYWJsZTogTnVtYmVyLCBjb2luOiBTdHJpbmd9fVxuICAgKiBOT1RFIDogZmVlVHhDb25maXJtVGFyZ2V0IG9taXR0ZWQgb24gcHVycG9zZSBiZWNhdXNlIGdhdWdpbmcgdGhlIG1heGltdW0gc3BlbmRhYmxlIGFtb3VudCB3aXRoIGR5bmFtaWMgZmVlcyBkb2VzIG5vdCBtYWtlIHNlbnNlXG4gICAqL1xuICBhc3luYyBtYXhpbXVtU3BlbmRhYmxlKHBhcmFtczogTWF4aW11bVNwZW5kYWJsZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8TWF4aW11bVNwZW5kYWJsZT4ge1xuICAgIGNvbnN0IGZpbHRlcmVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgW1xuICAgICAgJ2VuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZScsXG4gICAgICAnZmVlUmF0ZScsXG4gICAgICAnbGltaXQnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ21heFZhbHVlJyxcbiAgICAgICdtaW5Db25maXJtcycsXG4gICAgICAnbWluSGVpZ2h0JyxcbiAgICAgICdtaW5WYWx1ZScsXG4gICAgICAncGxhaW5UYXJnZXQnLFxuICAgICAgJ3JlY2lwaWVudEFkZHJlc3MnLFxuICAgICAgJ3RhcmdldCcsXG4gICAgXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9tYXhpbXVtU3BlbmRhYmxlJykpLnF1ZXJ5KGZpbHRlcmVkUGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB1bnNwZW50cyBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHVuc3BlbnRzKHBhcmFtczogVW5zcGVudHNPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gXy5waWNrKHBhcmFtcywgW1xuICAgICAgJ2NoYWlucycsXG4gICAgICAnbGltaXQnLFxuICAgICAgJ21heFZhbHVlJyxcbiAgICAgICdtaW5Db25maXJtcycsXG4gICAgICAnbWluSGVpZ2h0JyxcbiAgICAgICdtaW5WYWx1ZScsXG4gICAgICAncHJldklkJyxcbiAgICAgICdzZWd3aXQnLFxuICAgICAgJ3RhcmdldCcsXG4gICAgICAndW5zcGVudElkcycsXG4gICAgXSk7XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy91bnNwZW50cycpKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc29saWRhdGUgb3IgZmFub3V0IHVuc3BlbnRzIG9uIGEgd2FsbGV0XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSByb3V0ZU5hbWUgLSBlaXRoZXIgYGNvbnNvbGlkYXRlYCBvciBgZmFub3V0YFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICpcbiAgICogV2FsbGV0IHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKlxuICAgKiBGZWUgcGFyYW1ldGVyczpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gVGhlIGZlZSByYXRlIHRvIHVzZSBmb3IgdGhlIGNvbnNvbGlkYXRpb24gaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVQZXJjZW50YWdlIC0gdGhlIG1heGltdW0gcmVsYXRpdmUgcG9ydGlvbiB0aGF0IHlvdSdyZSB3aWxsaW5nIHRvIHNwZW5kIHRvd2FyZHMgZmVlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIGVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGggdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4gICAqXG4gICAqIElucHV0IHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSB0aGUgbWluaW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkhlaWdodCAtIHRoZSBtaW5pbXVtIGhlaWdodCBvZiB1bnNwZW50cyBvbiB0aGUgYmxvY2sgY2hhaW4gdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIGlmIHRydWUsIG1pbkNvbmZpcm1zIGFsc28gYXBwbGllcyB0byBjaGFuZ2Ugb3V0cHV0c1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxpbWl0ICAgICAgICAgICAgICAgIGZvciByb3V0ZU5hbWUgPT09ICdjb25zb2xpZGF0ZSdcbiAgICogICAgICAgICAgICAgICAgIHBhcmFtcy5tYXhOdW1JbnB1dHNUb1VzZSAgICBmb3Igcm91dGVOYW1lID09PSAnZmFub3V0J1xuICAgKiAgICAgICAgICAgICAgICAgIC0gbWF4aW11bSBudW1iZXIgb2YgdW5zcGVudHMgeW91IHdhbnQgdG8gdXNlIGluIHRoZSB0cmFuc2FjdGlvblxuICAgKiBPdXRwdXQgcGFyYW1ldGVyczpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5udW1VbnNwZW50c1RvTWFrZSAtIHRoZSBudW1iZXIgb2YgbmV3IHVuc3BlbnRzIHRvIG1ha2VcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuYnVsayAtIGlmIHNldCB0byBUcnVlLCB0aGlzIGVuYWJsZXMgdGhlIGNvbnNvbGlkYXRpb24gb2YgbGFyZ2UgbnVtYmVyIG9mIHVuc3BlbnRzIGJ5IGNyZWF0aW5nIG11bHRpcGxlIHRyYW5zYWN0aW9ucyxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggZWFjaCB0cmFuc2FjdGlvbiBjb21wb3NlZCBvZiAyMDAgdW5zcGVudHMsIGV4Y2VwdCBmb3IgdGhlIGxhc3QgdHJhbnNhY3Rpb24gd2hpY2ggbWF5IGhhdmUgZmV3ZXIgdW5zcGVudHMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1hbmFnZVVuc3BlbnRzKFxuICAgIHJvdXRlTmFtZTogTWFuYWdlVW5zcGVudHMsXG4gICAgcGFyYW1zOiBDb25zb2xpZGF0ZVVuc3BlbnRzT3B0aW9ucyB8IEZhbm91dFVuc3BlbnRzT3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbiA9IE1hbmFnZVVuc3BlbnRzT3B0aW9ucy5CVUlMRF9TSUdOX1NFTkRcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10pO1xuXG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIGNvbnN0IGZhbm91dElucHV0Rm9ybWF0ID0gcGFyYW1zLm1heE51bUlucHV0c1RvVXNlID8gJ21heE51bUlucHV0c1RvVXNlJyA6ICd1bnNwZW50cyc7XG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbXG4gICAgICAnZmVlUmF0ZScsXG4gICAgICAnbWF4RmVlUmF0ZScsXG4gICAgICAnbWF4RmVlUGVyY2VudGFnZScsXG4gICAgICAnZmVlVHhDb25maXJtVGFyZ2V0JyxcblxuICAgICAgJ21pblZhbHVlJyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnbWluSGVpZ2h0JyxcbiAgICAgICdtaW5Db25maXJtcycsXG4gICAgICAnZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlJyxcbiAgICAgICd0YXJnZXRBZGRyZXNzJyxcbiAgICAgICd0eEZvcm1hdCcsXG4gICAgICAnYnVsaycsXG5cbiAgICAgIHJvdXRlTmFtZSA9PT0gJ2NvbnNvbGlkYXRlJyA/ICdsaW1pdCcgOiBmYW5vdXRJbnB1dEZvcm1hdCxcbiAgICAgICdudW1VbnNwZW50c1RvTWFrZScsXG4gICAgXSk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcblxuICAgIGNvbnN0IGJ1aWxkUmVzcG9uc2U6IFRyYW5zYWN0aW9uUHJlYnVpbGQgfCBUcmFuc2FjdGlvblByZWJ1aWxkW10gPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybChgLyR7cm91dGVOYW1lfVVuc3BlbnRzYCkpXG4gICAgICAuc2VuZChmaWx0ZXJlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcblxuICAgIGlmIChvcHRpb24gPT09IE1hbmFnZVVuc3BlbnRzT3B0aW9ucy5CVUlMRF9PTkxZKSB7XG4gICAgICByZXR1cm4gYnVpbGRSZXNwb25zZTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSAoYXdhaXQgdGhpcy5iYXNlQ29pblxuICAgICAgLmtleWNoYWlucygpXG4gICAgICAuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMsIHJlcUlkIH0pKSBhcyB1bmtub3duIGFzIEtleWNoYWluW107XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBwdWJzOiBrZXljaGFpbnMubWFwKChrKSA9PiB7XG4gICAgICAgIGFzc2VydChrLnB1Yik7XG4gICAgICAgIHJldHVybiBrLnB1YjtcbiAgICAgIH0pLFxuICAgICAgLy8gQnVpbGRpbmcgUFNCVHMgd2l0aCB0aGUgYnVsayBmbGFnIGRvZXMgbm90IGluY2x1ZGUgdGhlIHByZXZpb3VzIHRyYW5zYWN0aW9uIGZvciBub24tc2Vnd2l0IGlucHV0cy5cbiAgICAgIC8vIE1hbnVhbGx5IG92ZXJyaWRlIHRoZSBzaWduaW5nIGFuZCB2YWxpZGF0aW5nIHRvIG5vdCBmYWlsLlxuICAgICAgYWxsb3dOb25TZWd3aXRTaWduaW5nV2l0aG91dFByZXZUeDogISFwYXJhbXMuYnVsayxcbiAgICB9O1xuXG4gICAgY29uc3QgdHhQcmVidWlsZHMgPSBBcnJheS5pc0FycmF5KGJ1aWxkUmVzcG9uc2UpID8gYnVpbGRSZXNwb25zZSA6IFtidWlsZFJlc3BvbnNlXTtcblxuICAgIGNvbnN0IHNlbGVjdFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsnY29tbWVudCcsICdvdHAnLCAnYnVsayddKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB0eFByZWJ1aWxkcy5tYXAoYXN5bmMgKHR4UHJlYnVpbGQpID0+IHtcbiAgICAgICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbih7IC4uLnRyYW5zYWN0aW9uUGFyYW1zLCB0eFByZWJ1aWxkIH0pO1xuICAgICAgICBjb25zdCBmaW5hbFR4UGFyYW1zID0gXy5leHRlbmQoe30sIHNpZ25lZFRyYW5zYWN0aW9uLCBzZWxlY3RQYXJhbXMsIHsgdHlwZTogcm91dGVOYW1lIH0pO1xuICAgICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24oZmluYWxUeFBhcmFtcywgcmVxSWQpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYnVpbGRSZXNwb25zZSkgPyByZXNwb25zZSA6IHJlc3BvbnNlWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbmFnZSB0aGUgdW5zcGVudCByZXNlcnZhdGlvbnMgb24gdGhlIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zLmNyZWF0ZSAtIGNyZWF0ZSBhIG5ldyByZXNlcnZhdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zLm1vZGlmeSAtIG1vZGlmeSBhbiBleGlzdGluZyByZXNlcnZhdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zLmRlbGV0ZSAtIGRlbGV0ZSBhbiBleGlzdGluZyByZXNlcnZhdGlvblxuICAgKi9cbiAgYXN5bmMgbWFuYWdlVW5zcGVudFJlc2VydmF0aW9ucyhcbiAgICBwYXJhbXM6IE1hbmFnZVVuc3BlbnRSZXNlcnZhdGlvbk9wdGlvbnNcbiAgKTogUHJvbWlzZTx7IHVuc3BlbnRzOiB7IGlkOiBzdHJpbmc7IHdhbGxldElkOiBzdHJpbmc7IGV4cGlyZVRpbWU6IHN0cmluZzsgdXNlcklkPzogc3RyaW5nIH1bXSB9PiB7XG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ2NyZWF0ZScsICdtb2RpZnknLCAnZGVsZXRlJ10pO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihuZXcgUmVxdWVzdFRyYWNlcigpKTtcbiAgICAvLyBUaGUgVVJMIGNhbm5vdCBjb250YWluIHRoZSBjb2luTmFtZSwgc28gd2UgcmVtb3ZlIGl0IGZyb20gdGhlIFVSTFxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKGAvcmVzZXJ2ZWR1bnNwZW50c2ApLnJlcGxhY2UoYC8ke3RoaXMuYmFzZUNvaW4uZ2V0Q2hhaW4oKX1gLCAnJyk7XG4gICAgaWYgKGZpbHRlcmVkUGFyYW1zLmNyZWF0ZSkge1xuICAgICAgY29uc3QgZmlsdGVyZWRDcmVhdGVQYXJhbXMgPSBfLnBpY2socGFyYW1zLmNyZWF0ZSwgWyd1bnNwZW50SWRzJywgJ2V4cGlyZVRpbWUnXSk7XG4gICAgICByZXR1cm4gdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZChmaWx0ZXJlZENyZWF0ZVBhcmFtcykucmVzdWx0KCk7XG4gICAgfSBlbHNlIGlmIChmaWx0ZXJlZFBhcmFtcy5tb2RpZnkpIHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkTW9kaWZ5UGFyYW1zID0gXy5waWNrKHBhcmFtcy5tb2RpZnksIFsndW5zcGVudElkcycsICdjaGFuZ2VzJ10pO1xuICAgICAgcmV0dXJuIHRoaXMuYml0Z28ucHV0KHVybCkuc2VuZChmaWx0ZXJlZE1vZGlmeVBhcmFtcykucmVzdWx0KCk7XG4gICAgfSBlbHNlIGlmIChmaWx0ZXJlZFBhcmFtcy5kZWxldGUpIHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkRGVsZXRlUGFyYW1zID0gXy5waWNrKHBhcmFtcy5kZWxldGUsIFsnaWQnXSk7XG4gICAgICByZXR1cm4gdGhpcy5iaXRnby5kZWwodXJsKS5xdWVyeShmaWx0ZXJlZERlbGV0ZVBhcmFtcykucmVzdWx0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGlkIG5vdCBkZXRlY3QgYSBjcmVhdGlvbiwgbW9kaWZpY2F0aW9uLCBvciBkZWxldGlvbiByZXF1ZXN0LicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zb2xpZGF0ZSB1bnNwZW50cyBvbiBhIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHVzZXJzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMueHBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybSBpZiB0aGUgd2FsbGV0UGFzc3BocmFzZSBpcyBub3QgYXZhaWxhYmxlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBmZWUgcmF0ZSB0byB1c2UgZm9yIHRoZSBjb25zb2xpZGF0aW9uIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUGVyY2VudGFnZSAtIHRoZSBtYXhpbXVtIHJlbGF0aXZlIHBvcnRpb24gdGhhdCB5b3UncmUgd2lsbGluZyB0byBzcGVuZCB0b3dhcmRzIGZlZXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQgLSBlc3RpbWF0ZSB0aGUgZmVlcyB0byBhaW0gZm9yIGZpcnN0IGNvbmZpcm1hdGlvbiB3aXRoIHRoaXMgbnVtYmVyIG9mIGJsb2Nrc1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBpZiB0cnVlLCBtaW5Db25maXJtcyBhbHNvIGFwcGxpZXMgdG8gY2hhbmdlIG91dHB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5saW1pdCAgICAgICAgICAgICAgICBmb3Igcm91dGVOYW1lID09PSAnY29uc29saWRhdGUnXG4gICAqICAgICAgICAgICAgICAgICBwYXJhbXMubWF4TnVtSW5wdXRzVG9Vc2UgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2Zhbm91dCdcbiAgICogICAgICAgICAgICAgICAgICAtIG1heGltdW0gbnVtYmVyIG9mIHVuc3BlbnRzIHlvdSB3YW50IHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5udW1VbnNwZW50c1RvTWFrZSAtIHRoZSBudW1iZXIgb2YgbmV3IHVuc3BlbnRzIHRvIG1ha2UuIEl0IGlzIG5vdCBhcHBsaWNhYmxlIGZvciBpZiBidWxrIGNvbnNvbGlkYXRlLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5idWxrIC0gaWYgc2V0IHRvIFRydWUsIHRoaXMgZW5hYmxlcyB0aGUgY29uc29saWRhdGlvbiBvZiBsYXJnZSBudW1iZXIgb2YgdW5zcGVudHMgYnkgY3JlYXRpbmcgbXVsdGlwbGUgdHJhbnNhY3Rpb25zLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBlYWNoIHRyYW5zYWN0aW9uIGNvbXBvc2VkIG9mIDIwMCB1bnNwZW50cywgZXhjZXB0IGZvciB0aGUgbGFzdCB0cmFuc2FjdGlvbiB3aGljaCBtYXkgaGF2ZSBmZXdlciB1bnNwZW50cy5cbiAgICovXG4gIGFzeW5jIGNvbnNvbGlkYXRlVW5zcGVudHMoXG4gICAgcGFyYW1zOiBDb25zb2xpZGF0ZVVuc3BlbnRzT3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbiA9IE1hbmFnZVVuc3BlbnRzT3B0aW9ucy5CVUlMRF9TSUdOX1NFTkRcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlVW5zcGVudHMoJ2NvbnNvbGlkYXRlJywgcGFyYW1zLCBvcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhbm91dCB1bnNwZW50cyBvbiBhIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHVzZXJzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMueHBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybSBpZiB0aGUgd2FsbGV0UGFzc3BocmFzZSBpcyBub3QgYXZhaWxhYmxlXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSB0aGUgbWluaW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkhlaWdodCAtIHRoZSBtaW5pbXVtIGhlaWdodCBvZiB1bnNwZW50cyBvbiB0aGUgYmxvY2sgY2hhaW4gdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUGVyY2VudGFnZSAtIHRoZSBtYXhpbXVtIHByb3BvcnRpb24gb2YgYW4gdW5zcGVudCB5b3UgYXJlIHdpbGxpbmcgdG8gbG9zZSB0byBmZWVzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IC0gZXN0aW1hdGUgdGhlIGZlZXMgdG8gYWltIGZvciBmaXJzdCBjb25maXJtYXRpb24gd2l0aCB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gVGhlIGRlc2lyZWQgZmVlIHJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSBUaGUgbWF4IGxpbWl0IGZvciBhIGZlZSByYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4TnVtSW5wdXRzVG9Vc2UgLSB0aGUgbnVtYmVyIG9mIHVuc3BlbnRzIHlvdSB3YW50IHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5udW1VbnNwZW50c1RvTWFrZSAtIHRoZSBudW1iZXIgb2YgbmV3IHVuc3BlbnRzIHRvIG1ha2VcbiAgICpcbiAgICogQHBhcmFtIHtNYW5hZ2VVbnNwZW50c09wdGlvbnN9IG9wdGlvbiAtIGZsYWcgdG8gdG9nZ2xlIGJ1aWxkIGFuZCBzZW5kIG9yIGJ1aWxkIG9ubHlcbiAgICovXG4gIGFzeW5jIGZhbm91dFVuc3BlbnRzKFxuICAgIHBhcmFtczogRmFub3V0VW5zcGVudHNPcHRpb25zID0ge30sXG4gICAgb3B0aW9uID0gTWFuYWdlVW5zcGVudHNPcHRpb25zLkJVSUxEX1NJR05fU0VORFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5tYW5hZ2VVbnNwZW50cygnZmFub3V0JywgcGFyYW1zLCBvcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdG9rZW4gZmx1c2ggdGhyZXNob2xkcyBmb3IgdGhlIHdhbGxldC4gVXBkYXRlcyB0aGUgd2FsbGV0LlxuICAgKiBUb2tlbnMgd2lsbCBvbmx5IGJlIGZsdXNoZWQgZnJvbSBmb3J3YXJkZXIgY29udHJhY3RzIGlmIHRoZSBiYWxhbmNlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdGhyZXNob2xkIGRlZmluZWQgaGVyZS5cbiAgICogQHBhcmFtIHRocmVzaG9sZHMge09iamVjdH0gLSBwYWlycyBvZiB7IFt0b2tlbk5hbWVdOiB0aHJlc2hvbGQgfSAoYmFzZSB1bml0cylcbiAgICovXG4gIGFzeW5jIHVwZGF0ZVRva2VuRmx1c2hUaHJlc2hvbGRzKHRocmVzaG9sZHM6IGFueSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ2V0aCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB3YWxsZXQnKTtcbiAgICB9XG5cbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucHV0KHRoaXMudXJsKCkpXG4gICAgICAuc2VuZCh7XG4gICAgICAgIHRva2VuRmx1c2hUaHJlc2hvbGRzOiB0aHJlc2hvbGRzLFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuICAvKipcbiAgICAgICogVXBkYXRlcyB0aGUgd2FsbGV0LiBTZXRzIGZsYWdzIGZvciBkZXBsb3lGb3J3YXJkZXJzTWFudWFsbHkgYW5kIGZsdXNoRm9yd2FyZGVyc01hbnVhbGx5IG9mIHRoZSB3YWxsZXQuXG4gICAgICAqIEBwYXJhbSBmb3J3YXJkZXJGbGFncyB7T2JqZWN0fSAtIHtcbiAgICAgICAgXCJjb2luU3BlY2lmaWNcIjoge1xuICAgICAgICAgIFtjb2luTmFtZV06IHtcbiAgICAgICAgICAgIFwiZGVwbG95Rm9yd2FyZGVyc01hbnVhbGx5XCI6IHtCb29sZWFufSxcbiAgICAgICAgICAgIFwiZmx1c2hGb3J3YXJkZXJzTWFudWFsbHlcIjoge0Jvb2xlYW59XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAqL1xuICBhc3luYyB1cGRhdGVGb3J3YXJkZXJzKGZvcndhcmRlckZsYWdzOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucHV0KHRoaXMudXJsKCkpLnNlbmQoZm9yd2FyZGVyRmxhZ3MpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIG1hbnVhbGx5IGRlcGxveSBhbiBFVEggYWRkcmVzc1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuYWRkcmVzc10gLSBhZGRyZXNzSWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuaWRdIC0gYWRkcmVzc0lkIGNvdWxkIGJlIHJlY2VpdmVkIGFsc28gYXMgaWRcbiAgICogQHJldHVybnMge09iamVjdH0gSHR0cCByZXNwb25zZVxuICAgKi9cbiAgYXN5bmMgZGVwbG95Rm9yd2FyZGVycyhwYXJhbXM6IERlcGxveUZvcndhcmRlcnNPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYWRkcmVzcykgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkZHJlc3Mgb3IgaWQgb2YgYWRkcmVzcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBsZXQgcXVlcnk7XG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzKSB7XG4gICAgICBxdWVyeSA9IHBhcmFtcy5hZGRyZXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeSA9IHBhcmFtcy5pZDtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoYC9hZGRyZXNzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX0vZGVwbG95bWVudGApO1xuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh1cmwpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIG1hbnVhbGx5IGZvcndhcmQgdG9rZW5zIGZyb20gYW4gRVRIIG9yIENFTE8gYWRkcmVzc1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50b2tlbk5hbWUgLSBOYW1lIG9mIHRva2VuIHRoYXQgbmVlZHMgdG8gYmUgZm9yd2FyZGVkIGZyb20gdGhlIGFkZHJlc3NcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuYWRkcmVzc10gLVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5hZGRyZXNzXSAtIGFkZHJlc3NJZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5pZF0gLSBhZGRyZXNzSWQgY291bGQgYmUgcmVjZWl2ZWQgYWxzbyBhcyBpZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5nYXNQcmljZV0gLSBFeHBsaWNpdCBnYXMgcHJpY2UgdG8gdXNlIHdoZW4gZm9yd2FyZGluZyB0b2tlbiBmcm9tIHRoZSBmb3J3YXJkZXIgY29udHJhY3QgKEVUSCBhbmQgQ2VsbyBvbmx5KS4gSWYgbm90IGdpdmVuLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBlc3RpbWF0ZWQgbmV0d29yayBnYXMgcHJpY2UuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmVpcDE1NTldIC0gU3BlY2lmeSBlaXAxNTU5IGZlZSBwYXJhbWV0ZXJzIGluIHRva2VuIGZvcndhcmRpbmcgdHJhbnNhY3Rpb24uXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEh0dHAgcmVzcG9uc2VcbiAgICovXG4gIGFzeW5jIGZsdXNoRm9yd2FyZGVyVG9rZW4ocGFyYW1zOiBGbHVzaEZvcndhcmRlclRva2VuT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmFkZHJlc3MpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhZGRyZXNzIG9yIGlkIG9mIGFkZHJlc3MgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuaWQ7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKGAvYWRkcmVzcy8ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9L3Rva2VuZm9yd2FyZGApO1xuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh1cmwpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFN3ZWVwIGZ1bmRzIGZvciBhIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5hZGRyZXNzIC0gVGhlIGFkZHJlc3MgdG8gc2VuZCBhbGwgdGhlIGZ1bmRzIGluIHRoZSB3YWxsZXQgdG9cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHVzZXJzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMueHBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybSBpZiB0aGUgd2FsbGV0UGFzc3BocmFzZSBpcyBub3QgYXZhaWxhYmxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMub3RwIC0gVHdvIGZhY3RvciBhdXRoIGNvZGUgdG8gZW5hYmxlIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IC0gRXN0aW1hdGUgdGhlIGZlZXMgdG8gYWltIGZvciBmaXJzdCBjb25maXJtYXRpb24gd2l0aGluIHRoaXMgbnVtYmVyIG9mIGJsb2Nrc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBUaGUgZGVzaXJlZCBmZWUgcmF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbcGFyYW1zLm1heEZlZVJhdGVdIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtCb29sZWFufSBbcGFyYW1zLmFsbG93UGFydGlhbFN3ZWVwXSAtIGFsbG93cyBzd2VlcGluZyAyMDAgdW5zcGVudHMgd2hlbiB0aGUgd2FsbGV0IGhhcyBtb3JlIHRoYW4gdGhhdFxuICAgKiBAcmV0dXJucyB0eEhleCB7U3RyaW5nfSB0aGUgdHhIZXggb2YgdGhlIHNpZ25lZCB0cmFuc2FjdGlvblxuICAgKi9cbiAgYXN5bmMgc3dlZXAocGFyYW1zOiBTd2VlcE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydicsICdvdHAnXSk7XG5cbiAgICAvLyBUaGUgc3dlZXAgQVBJIGVuZHBvaW50IGlzIG9ubHkgYXZhaWxhYmxlIHRvIHV0eG8tYmFzZWQgY29pbnNcblxuICAgIGlmICghdGhpcy5iYXNlQ29pbi5zd2VlcFdpdGhTZW5kTWFueSgpKSB7XG4gICAgICBpZiAodGhpcy5jb25maXJtZWRCYWxhbmNlU3RyaW5nKCkgIT09IHRoaXMuYmFsYW5jZVN0cmluZygpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnY2Fubm90IHN3ZWVwIHdoZW4gdW5jb25maXJtZWQgZnVuZHMgZXhpc3Qgb24gdGhlIHdhbGxldCwgcGxlYXNlIHdhaXQgdW50aWwgYWxsIGluYm91bmQgdHJhbnNhY3Rpb25zIGNvbmZpcm0nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvbWF4aW11bVNwZW5kYWJsZScpKS5yZXN1bHQoKTtcbiAgICAgIGNvbnN0IG1heGltdW1TcGVuZGFibGUgPSBuZXcgQmlnTnVtYmVyKHZhbHVlLm1heGltdW1TcGVuZGFibGUpO1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgbWF4aW11bVNwZW5kYWJsZS5pc1plcm8oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGZ1bmRzIHRvIHN3ZWVwJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlbmRNYW55UGFyYW1zOiBTZW5kTWFueU9wdGlvbnMgPSB7XG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHBhcmFtcy5hZGRyZXNzIHx8ICcnLCAvLyBFbnN1cmUgYWRkcmVzcyBpcyBhbHdheXMgYSBzdHJpbmdcbiAgICAgICAgICAgIGFtb3VudDogbWF4aW11bVNwZW5kYWJsZS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gdGhpcy5zZW5kTWFueShzZW5kTWFueVBhcmFtcyk7XG4gICAgfVxuICAgIC8vIHRoZSBmb2xsb3dpbmcgZmxvdyB3b3JrcyBmb3IgYWxsIFVUWE8gY29pbnNcblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdhZGRyZXNzJyxcbiAgICAgICdmZWVSYXRlJyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdmZWVUeENvbmZpcm1UYXJnZXQnLFxuICAgICAgJ2FsbG93UGFydGlhbFN3ZWVwJyxcbiAgICAgICd0eEZvcm1hdCcsXG4gICAgXSk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3N3ZWVwV2FsbGV0JykpLnNlbmQoZmlsdGVyZWRQYXJhbXMpLnJlc3VsdCgpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5leHBsYWluVHJhbnNhY3Rpb24ocmVzcG9uc2UpO1xuICAgIGlmICh0cmFuc2FjdGlvbj8ub3V0cHV0cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGludmFsaWRPdXRwdXRBZGRyZXNzID0gdHJhbnNhY3Rpb24ub3V0cHV0cy5maW5kKChvdXRwdXQpID0+IG91dHB1dC5hZGRyZXNzICE9PSBwYXJhbXMuYWRkcmVzcyk7XG4gICAgICBpZiAoaW52YWxpZE91dHB1dEFkZHJlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHN3ZWVwIGRlc3RpbmF0aW9uICR7aW52YWxpZE91dHB1dEFkZHJlc3MuYWRkcmVzc30sIHNwZWNpZmllZCAke3BhcmFtcy5hZGRyZXNzfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdHJhbnNhY3Rpb24sIG5vIGRlc3RpbmF0aW9uIGFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSAoYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQgfSkpIGFzIGFueTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uUGFyYW1zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgdHhQcmVidWlsZDogcmVzcG9uc2UsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgdXNlcktleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcHJ2OiBwYXJhbXMueHBydixcbiAgICB9O1xuICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25QYXJhbXMpO1xuXG4gICAgY29uc3Qgc2VsZWN0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgWydvdHAnXSk7XG4gICAgY29uc3QgZmluYWxUeFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBzaWduZWRUcmFuc2FjdGlvbiwgc2VsZWN0UGFyYW1zKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIHJldHVybiB0aGlzLnNlbmRUcmFuc2FjdGlvbihmaW5hbFR4UGFyYW1zLCByZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogRnJlZXplIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBmcmVlemUocGFyYW1zOiBGcmVlemVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSk7XG5cbiAgICBpZiAocGFyYW1zLmR1cmF0aW9uKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmR1cmF0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZHVyYXRpb246IHNob3VsZCBiZSBudW1iZXIgb2Ygc2Vjb25kcycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9mcmVlemUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjb21tZW50IG9mIGEgdHJhbnNmZXJcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyQ29tbWVudChwYXJhbXM6IFRyYW5zZmVyQ29tbWVudE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbJ2NvbW1lbnQnXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvdHJhbnNmZXIvJyArIHBhcmFtcy5pZCArICcvY29tbWVudCcpKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIGFkZHJlc3NlcyBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGFkZHJlc3NlcyhwYXJhbXM6IEFkZHJlc3Nlc09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdKTtcblxuICAgIGNvbnN0IHF1ZXJ5OiBBZGRyZXNzZXNPcHRpb25zID0ge307XG5cbiAgICBpZiAocGFyYW1zLm1pbmUpIHtcbiAgICAgIHF1ZXJ5Lm1pbmUgPSAhIXBhcmFtcy5taW5lO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMucHJldklkKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcmV2SWQgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnByZXZJZCA9IHBhcmFtcy5wcmV2SWQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zb3J0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnNvcnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzb3J0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5zb3J0ID0gcGFyYW1zLnNvcnQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxhYmVsQ29udGFpbnMpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMubGFiZWxDb250YWlucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxhYmVsQ29udGFpbnMgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxhYmVsQ29udGFpbnMgPSBwYXJhbXMubGFiZWxDb250YWlucztcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnNlZ3dpdCkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLnNlZ3dpdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNlZ3dpdCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnNlZ3dpdCA9IHBhcmFtcy5zZWd3aXQ7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5jaGFpbnMpKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheShwYXJhbXMuY2hhaW5zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2hhaW5zIGFyZ3VtZW50LCBleHBlY3RpbmcgYXJyYXkgb2YgbnVtYmVycycpO1xuICAgICAgfVxuICAgICAgcXVlcnkuY2hhaW5zID0gcGFyYW1zLmNoYWlucztcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLmluY2x1ZGVCYWxhbmNlcykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluY2x1ZGVCYWxhbmNlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY2x1ZGVCYWxhbmNlcyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmluY2x1ZGVCYWxhbmNlcyA9IHBhcmFtcy5pbmNsdWRlQmFsYW5jZXM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlVG9rZW5zKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuaW5jbHVkZVRva2VucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY2x1ZGVUb2tlbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlVG9rZW5zID0gcGFyYW1zLmluY2x1ZGVUb2tlbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlVG90YWxBZGRyZXNzQ291bnQpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlVG90YWxBZGRyZXNzQ291bnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlVG90YWxBZGRyZXNzQ291bnQgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlVG90YWxBZGRyZXNzQ291bnQgPSBwYXJhbXMuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmV0dXJuQmFsYW5jZXNGb3JUb2tlbikge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5yZXR1cm5CYWxhbmNlc0ZvclRva2VuKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmV0dXJuQmFsYW5jZXNGb3JUb2tlbiBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucmV0dXJuQmFsYW5jZXNGb3JUb2tlbiA9IHBhcmFtcy5yZXR1cm5CYWxhbmNlc0ZvclRva2VuO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMucGVuZGluZ0RlcGxveW1lbnQpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5wZW5kaW5nRGVwbG95bWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBlbmRpbmdEZXBsb3ltZW50IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkucGVuZGluZ0RlcGxveW1lbnQgPSBwYXJhbXMucGVuZGluZ0RlcGxveW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvYWRkcmVzc2VzJykpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgYWRkcmVzc2VzIHNvcnRlZCBieSBiYWxhbmNlIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgYWRkcmVzc2VzQnlCYWxhbmNlKHBhcmFtczogQWRkcmVzc2VzQnlCYWxhbmNlT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcXVlcnk6IEFkZHJlc3Nlc0J5QmFsYW5jZU9wdGlvbnMgPSB7XG4gICAgICB0b2tlbjogcGFyYW1zLnRva2VuLFxuICAgIH07XG4gICAgcXVlcnkuc29ydCA9IHBhcmFtcy5zb3J0ID8/IC0xO1xuICAgIHF1ZXJ5LnBhZ2UgPSBwYXJhbXMucGFnZSA/PyAxO1xuICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0ID8/IDUwMDtcblxuICAgIGlmICghXy5pc051bWJlcihxdWVyeS5zb3J0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNvcnQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgaWYgKCFfLmlzTnVtYmVyKHF1ZXJ5LnBhZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcGFnZSBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMubGltaXQgPCAxIHx8IHBhcmFtcy5saW1pdCA+IDUwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsaW1pdCBhcmd1bWVudCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNTAwJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvYWRkcmVzc2VzL2JhbGFuY2VzJykpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc2luZ2xlIHdhbGxldCBhZGRyZXNzIGJ5IGl0cyBpZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0QWRkcmVzcyhwYXJhbXM6IEdldEFkZHJlc3NPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ2FkZHJlc3MnLCAnaWQnXSk7XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSAmJiBfLmlzVW5kZWZpbmVkKHBhcmFtcy5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzcyBvciBpZCBvZiBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuaWQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoYC93YWxsZXQvJHt0aGlzLl93YWxsZXQuaWR9L2FkZHJlc3MvJHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWApKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBvbmUgb3IgbW9yZSBuZXcgYWRkcmVzcyhlcykgZm9yIHVzZSB3aXRoIHRoaXMgd2FsbGV0LlxuICAgKlxuICAgKiBJZiB0aGUgYGNvdW50YCBmaWVsZCBpcyBkZWZpbmVkIGFuZCBncmVhdGVyIHRoYW4gMSwgYW4gb2JqZWN0IHdpdGggYSBzaW5nbGVcbiAgICogYXJyYXkgcHJvcGVydHkgbmFtZWQgYGFkZHJlc3Nlc2AgY29udGFpbmluZyBgY291bnRgIGFkZHJlc3Mgb2JqZWN0c1xuICAgKiB3aWxsIGJlIHJldHVybmVkLiBPdGhlcndpc2UsIGEgc2luZ2xlIGFkZHJlc3Mgb2JqZWN0IGlzIHJldHVybmVkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuY2hhaW4gb24gd2hpY2ggdGhlIG5ldyBhZGRyZXNzIHNob3VsZCBiZSBjcmVhdGVkXG4gICAqIEBwYXJhbSB7KE51bWJlcnxTdHJpbmcpfSBwYXJhbXMuZ2FzUHJpY2UgZ2FzIHByaWNlIGZvciBuZXcgYWRkcmVzcyBjcmVhdGlvbiwgaWYgYXBwbGljYWJsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmxhYmVsIGxhYmVsIGZvciB0aGUgbmV3IGFkZHJlc3MoZXMpXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuY291bnQ9MSBudW1iZXIgb2YgbmV3IGFkZHJlc3NlcyB3aGljaCBzaG91bGQgYmUgY3JlYXRlZCAobWF4aW11bSAyNTApXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZm9yd2FyZGVyVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiBhZGRyZXNzIHRvIGNyZWF0ZSwgaWYgYXBwbGljYWJsZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5sb3dQcmlvcml0eSBFdGhlcmV1bS1zcGVjaWZpYyBwYXJhbSB0byBjcmVhdGUgYWRkcmVzcyB1c2luZyBsb3cgcHJpb3JpdHkgZmVlIGFkZHJlc3NcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5iYXNlQWRkcmVzcyBiYXNlIGFkZHJlc3Mgb2YgdGhlIHdhbGxldChvcHRpb25hbCBwYXJhbWV0ZXIpXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmFsbG93U2tpcFZlcmlmeUFkZHJlc3MgV2hlbiBzZXQgdG8gZmFsc2UsIGl0IHRocm93cyBlcnJvciBpZiBhZGRyZXNzIHZlcmlmaWNhdGlvbiBpcyBza2lwcGVkIGZvciBhbnkgcmVhc29uLiBEZWZhdWx0IGlzIHRydWUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMub25Ub2tlbiBtYW5kYXRvcnkgaW4gY2FzZSBvZiB0aGUgT0ZDIHdhbGxldCwgdGhlIG5hbWUgb2YgdG9rZW4gdG8gY3JlYXRlIGFkZHJlc3MgZm9yXG4gICAqIEFkZHJlc3MgdmVyaWZpY2F0aW9uIGNhbiBiZSBza2lwcGVkIHdoZW4gZm9yd2FyZGVyVmVyc2lvbiBpcyAwIGFuZCBwZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiBpcyB0cnVlIE9SXG4gICAqIGlmICdjb2luU3BlY2lmaWMnIGlzIG5vdCBwYXJ0IG9mIHRoZSByZXNwb25zZSBmcm9tIGFwaSBjYWxsIHRvIGNyZWF0ZSBhZGRyZXNzXG4gICAqL1xuICBhc3luYyBjcmVhdGVBZGRyZXNzKHBhcmFtczogQ3JlYXRlQWRkcmVzc09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgYWRkcmVzc1BhcmFtczogQ3JlYXRlQWRkcmVzc09wdGlvbnMgPSB7fTtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG5cbiAgICBjb25zdCB7XG4gICAgICBjaGFpbixcbiAgICAgIGdhc1ByaWNlLFxuICAgICAgbGFiZWwsXG4gICAgICBsb3dQcmlvcml0eSxcbiAgICAgIGZvcndhcmRlclZlcnNpb24sXG4gICAgICBmb3JtYXQsXG4gICAgICBjb3VudCA9IDEsXG4gICAgICBiYXNlQWRkcmVzcyxcbiAgICAgIGFsbG93U2tpcFZlcmlmeUFkZHJlc3MgPSB0cnVlLFxuICAgICAgb25Ub2tlbixcbiAgICB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGNoYWluKSkge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihjaGFpbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjaGFpbiBoYXMgdG8gYmUgYW4gaW50ZWdlcicpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5jaGFpbiA9IGNoYWluO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChnYXNQcmljZSkpIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIoZ2FzUHJpY2UpICYmIChpc05hTihOdW1iZXIoZ2FzUHJpY2UpKSB8fCAhXy5pc1N0cmluZyhnYXNQcmljZSkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZ2FzUHJpY2UgaGFzIHRvIGJlIGFuIGludGVnZXIgb3IgbnVtZXJpYyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuZ2FzUHJpY2UgPSBnYXNQcmljZTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZm9yd2FyZGVyVmVyc2lvbikpIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIoZm9yd2FyZGVyVmVyc2lvbikgfHwgZm9yd2FyZGVyVmVyc2lvbiA8IDAgfHwgZm9yd2FyZGVyVmVyc2lvbiA+IDQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3J3YXJkZXJWZXJzaW9uIGhhcyB0byBiZSBhbiBpbnRlZ2VyIDAsIDEsIDIsIDMgb3IgNCcpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5mb3J3YXJkZXJWZXJzaW9uID0gZm9yd2FyZGVyVmVyc2lvbjtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQobGFiZWwpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcobGFiZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbGFiZWwgaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmxhYmVsID0gbGFiZWw7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGJhc2VBZGRyZXNzKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGJhc2VBZGRyZXNzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Jhc2VBZGRyZXNzIGhhcyB0byBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChhbGxvd1NraXBWZXJpZnlBZGRyZXNzKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihhbGxvd1NraXBWZXJpZnlBZGRyZXNzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FsbG93U2tpcFZlcmlmeUFkZHJlc3MgaGFzIHRvIGJlIGEgYm9vbGVhbicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc0ludGVnZXIoY291bnQpIHx8IGNvdW50IDw9IDAgfHwgY291bnQgPiAyNTApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bnQgaGFzIHRvIGJlIGEgbnVtYmVyIGJldHdlZW4gMSBhbmQgMjUwJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGxvd1ByaW9yaXR5KSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihsb3dQcmlvcml0eSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsb3dQcmlvcml0eSBoYXMgdG8gYmUgYSBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmxvd1ByaW9yaXR5ID0gbG93UHJpb3JpdHk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGZvcm1hdCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhmb3JtYXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZm9ybWF0IGhhcyB0byBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5mb3JtYXQgPSBmb3JtYXQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT09ICdvZmMnKSB7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQob25Ub2tlbikpIHtcbiAgICAgICAgaWYgKCFfLmlzU3RyaW5nKG9uVG9rZW4pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvblRva2VuIGhhcyB0byBiZSBhIHN0cmluZycpO1xuICAgICAgICB9XG4gICAgICAgIGFkZHJlc3NQYXJhbXMub25Ub2tlbiA9IG9uVG9rZW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uVG9rZW4gaXMgYSBtYW5kYXRvcnkgcGFyYW1ldGVyIGZvciBPRkMgd2FsbGV0cycpO1xuICAgICAgfVxuICAgICAgaWYgKCFfLmlzU3RyaW5nKG9uVG9rZW4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb25Ub2tlbiBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBnZXQga2V5Y2hhaW5zIGZvciBhZGRyZXNzIHZlcmlmaWNhdGlvblxuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IFByb21pc2UuYWxsKHRoaXMuX3dhbGxldC5rZXlzLm1hcCgoaykgPT4gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXQoeyBpZDogaywgcmVxSWQgfSkpKTtcbiAgICBjb25zdCByb290QWRkcmVzcyA9IF8uZ2V0KHRoaXMuX3dhbGxldCwgJ3JlY2VpdmVBZGRyZXNzLmFkZHJlc3MnKTtcblxuICAgIGNvbnN0IG5ld0FkZHJlc3NlcyA9IF8udGltZXMoY291bnQsIGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgICBjb25zdCBuZXdBZGRyZXNzID0gKGF3YWl0IHRoaXMuYml0Z29cbiAgICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvYWRkcmVzcycpKVxuICAgICAgICAuc2VuZChhZGRyZXNzUGFyYW1zKVxuICAgICAgICAucmVzdWx0KCkpIGFzIGFueTtcblxuICAgICAgLy8gaW5mZXIgaXRzIGFkZHJlc3MgdHlwZVxuICAgICAgaWYgKF8uaXNPYmplY3QobmV3QWRkcmVzcy5jb2luU3BlY2lmaWMpKSB7XG4gICAgICAgIG5ld0FkZHJlc3MuYWRkcmVzc1R5cGUgPSBpbmZlckFkZHJlc3NUeXBlKG5ld0FkZHJlc3MpO1xuICAgICAgfVxuXG4gICAgICBuZXdBZGRyZXNzLmtleWNoYWlucyA9IGtleWNoYWlucztcbiAgICAgIG5ld0FkZHJlc3MuYmFzZUFkZHJlc3MgPSBiYXNlQWRkcmVzcyA/PyBfLmdldCh0aGlzLl93YWxsZXQsICdjb2luU3BlY2lmaWMuYmFzZUFkZHJlc3MnKTtcbiAgICAgIG5ld0FkZHJlc3MuZm9ybWF0ID0gYWRkcmVzc1BhcmFtcy5mb3JtYXQ7XG5cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkRhdGE6IFZlcmlmeUFkZHJlc3NPcHRpb25zID0gXy5tZXJnZSh7fSwgbmV3QWRkcmVzcywgeyByb290QWRkcmVzcyB9KTtcblxuICAgICAgaWYgKHZlcmlmaWNhdGlvbkRhdGEuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEFkZHJlc3NHZW5lcmF0aW9uRXJyb3IodmVyaWZpY2F0aW9uRGF0YS5lcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHZlcmlmaWNhdGlvbkRhdGEuaW1wbGllZEZvcndhcmRlclZlcnNpb24gPSBmb3J3YXJkZXJWZXJzaW9uID8/IHZlcmlmaWNhdGlvbkRhdGEuY29pblNwZWNpZmljPy5mb3J3YXJkZXJWZXJzaW9uO1xuICAgICAgLy8gVGhpcyBjb25kaXRpb24gd2FzIGFkZGVkIGluIGZpcnN0IHBsYWNlIGJlY2F1c2UgaW4gY2Vsbywgd2hlbiB2ZXJpZnlBZGRyZXNzIG1ldGhvZCB3YXMgY2FsbGVkIG9uIGFkZHJlc3NlcyB3aGljaCB3ZXJlIGhhdmluZyBwZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiBhcyB0cnVlLCBpdCB1c2VkIHRvIHRocm93IHNvbWUgZXJyb3JcbiAgICAgIC8vIEluIGNhc2Ugb2YgZm9yd2FyZGVyIHZlcnNpb24gMSBldGggYWRkcmVzc2VzLCBhZGRyZXNzZXMgbmVlZCB0byBiZSB2ZXJpZmllZCBldmVuIGlmIHRoZSBwZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiBmbGFnIGlzIHRydWVcbiAgICAgIGlmIChcbiAgICAgICAgdmVyaWZpY2F0aW9uRGF0YS5jb2luU3BlY2lmaWMgJiZcbiAgICAgICAgKCF2ZXJpZmljYXRpb25EYXRhLmNvaW5TcGVjaWZpYy5wZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiB8fCB2ZXJpZmljYXRpb25EYXRhLmltcGxpZWRGb3J3YXJkZXJWZXJzaW9uID09PSAxKVxuICAgICAgKSB7XG4gICAgICAgIC8vIGNhbid0IHZlcmlmeSBhZGRyZXNzZXMgd2hpY2ggYXJlIHBlbmRpbmcgY2hhaW4gaW5pdGlhbGl6YXRpb24sIGFzIHRoZSBhZGRyZXNzIGlzIGhpZGRlblxuICAgICAgICBsZXQgaXNXYWxsZXRBZGRyZXNzID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaXNXYWxsZXRBZGRyZXNzID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5pc1dhbGxldEFkZHJlc3ModmVyaWZpY2F0aW9uRGF0YSwgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcikpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEZJWE1FKEJHLTQzMjI1KTogaW1wbGVtZW50IHRoaXMgY29ycmVjdGx5XG4gICAgICAgICAgaXNXYWxsZXRBZGRyZXNzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzV2FsbGV0QWRkcmVzcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm90IGEgd2FsbGV0IGFkZHJlc3NgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGFkZHJlc3MgdmVyaWZpY2F0aW9uIHNraXBwZWQgZm9yIGNvdW50ID0gJHtjb3VudH1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld0FkZHJlc3M7XG4gICAgfSk7XG5cbiAgICBpZiAobmV3QWRkcmVzc2VzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIG5ld0FkZHJlc3Nlc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWRkcmVzc2VzOiBhd2FpdCBQcm9taXNlLmFsbChuZXdBZGRyZXNzZXMpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHByb3BlcnRpZXMgb24gYW4gYWRkcmVzc1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlQWRkcmVzcyhwYXJhbXM6IFVwZGF0ZUFkZHJlc3NPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGFkZHJlc3MgPSBwYXJhbXMuYWRkcmVzcztcblxuICAgIGlmICghXy5pc1N0cmluZyhhZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgYWRkcmVzcycpO1xuICAgIH1cblxuICAgIGNvbnN0IHB1dFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsnbGFiZWwnXSk7XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9hZGRyZXNzLycgKyBlbmNvZGVVUklDb21wb25lbnQoYWRkcmVzcykpO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucHV0KHVybCkuc2VuZChwdXRQYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlV2FsbGV0QnVpbGREZWZhdWx0cyhwYXJhbXM6IFVwZGF0ZUJ1aWxkRGVmYXVsdE9wdGlvbnMpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWydtaW5GZWVSYXRlJywgJ2NoYW5nZUFkZHJlc3NUeXBlJywgJ3R4Rm9ybWF0J10pO1xuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAucHV0KHRoaXMudXJsKCkpXG4gICAgICAuc2VuZCh7XG4gICAgICAgIGJ1aWxkRGVmYXVsdHM6IHtcbiAgICAgICAgICBtaW5GZWVSYXRlOiBwYXJhbXMubWluRmVlUmF0ZSxcbiAgICAgICAgICBjaGFuZ2VBZGRyZXNzVHlwZTogcGFyYW1zLmNoYW5nZUFkZHJlc3NUeXBlLFxuICAgICAgICAgIHR4Rm9ybWF0OiBwYXJhbXMudHhGb3JtYXQsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3Qgd2ViaG9va3Mgb24gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgbGlzdFdlYmhvb2tzKHBhcmFtczogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcXVlcnk6IFBhZ2luYXRpb25PcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbXVsYXRlIHdhbGxldCB3ZWJob29rLCBjdXJyZW50bHkgZm9yIHdlYmhvb2tzIG9mIHR5cGUgdHJhbnNmZXIgYW5kIHBlbmRpbmcgYXBwcm92YWxcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHdlYmhvb2tJZCAocmVxdWlyZWQpIGlkIG9mIHRoZSB3ZWJob29rIHRvIGJlIHNpbXVsYXRlZFxuICAgKiAtIHRyYW5zZmVySWQgKG9wdGlvbmFsIGJ1dCByZXF1aXJlZCBmb3IgdHJhbnNmZXIgd2ViaG9va3MpIGlkIG9mIHRoZSBzaW11bGF0ZWQgdHJhbnNmZXJcbiAgICogLSBwZW5kaW5nQXBwcm92YWxJZCAob3B0aW9uYWwgYnV0IHJlcXVpcmVkIGZvciBwZW5kaW5nIGFwcHJvdmFsIHdlYmhvb2tzKSBpZCBvZiB0aGUgc2ltdWxhdGVkIHBlbmRpbmcgYXBwcm92YWxcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzaW11bGF0ZVdlYmhvb2socGFyYW1zOiBTaW11bGF0ZVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2ViaG9va0lkJ10sIFsndHJhbnNmZXJJZCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICAgIGNvbnN0IGhhc1RyYW5zZmVySWQgPSAhIXBhcmFtcy50cmFuc2ZlcklkO1xuICAgIGNvbnN0IGhhc1BlbmRpbmdBcHByb3ZhbElkID0gISFwYXJhbXMucGVuZGluZ0FwcHJvdmFsSWQ7XG4gICAgaWYgKCFoYXNUcmFuc2ZlcklkICYmICFoYXNQZW5kaW5nQXBwcm92YWxJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHJhbnNmZXJJZCBvciBwZW5kaW5nQXBwcm92YWxJZCcpO1xuICAgIH1cblxuICAgIGlmIChoYXNUcmFuc2ZlcklkICYmIGhhc1BlbmRpbmdBcHByb3ZhbElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3Qgc3VwcGx5IGVpdGhlciB0cmFuc2ZlcklkIG9yIHBlbmRpbmdBcHByb3ZhbElkLCBidXQgbm90IGJvdGgnKTtcbiAgICB9XG5cbiAgICAvLyBkZXBlbmRpbmcgb24gdGhlIGNvaW4gdHlwZSBvZiB0aGUgd2FsbGV0LCB0aGUgdHhIYXNoIGhhcyB0byBhZGhlcmUgdG8gaXRzIHJlc3BlY3RpdmUgZm9ybWF0XG4gICAgLy8gYnV0IHRoZSBzZXJ2ZXIgdGFrZXMgY2FyZSBvZiB0aGF0XG5cbiAgICAvLyBvbmx5IHRha2UgdGhlIHRyYW5zZmVySWQgYW5kIHBlbmRpbmdBcHByb3ZhbElkIHByb3BlcnRpZXNcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsndHJhbnNmZXJJZCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICAgIGNvbnN0IHdlYmhvb2tJZCA9IHBhcmFtcy53ZWJob29rSWQ7XG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKCcvd2ViaG9va3MvJyArIHdlYmhvb2tJZCArICcvc2ltdWxhdGUnKSlcbiAgICAgIC5zZW5kKGZpbHRlcmVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHdlYmhvb2sgdG8gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgYWRkV2ViaG9vayhwYXJhbXM6IE1vZGlmeVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJywgJ3R5cGUnXSwgW10pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSB3ZWJob29rIGZyb20gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgcmVtb3ZlV2ViaG9vayhwYXJhbXM6IE1vZGlmeVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJywgJ3R5cGUnXSwgW10pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVzZXIga2V5Y2hhaW4gZm9yIHRoaXMgd2FsbGV0XG4gICAqXG4gICAqIFRoZSB1c2VyIGtleWNoYWluIGlzIHRoZSBmaXJzdCBrZXljaGFpbiBvZiB0aGUgd2FsbGV0IGFuZCB1c3VhbGx5IGhhcyB0aGUgZW5jcnlwdGVkIHBydiBzdG9yZWQgb24gQml0R28uXG4gICAqIFVzZWZ1bCB3aGVuIHRyeWluZyB0byBnZXQgdGhlIHVzZXJzJyBrZXljaGFpbiBmcm9tIHRoZSBzZXJ2ZXIgYmVmb3JlIGRlY3J5cHRpbmcgdG8gc2lnbiBhIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCk6IFByb21pc2U8S2V5Y2hhaW5XaXRoRW5jcnlwdGVkUHJ2PiB7XG4gICAgY29uc3QgdHJ5S2V5Q2hhaW4gPSBhc3luYyAoaW5kZXg6IG51bWJlcik6IFByb21pc2U8S2V5Y2hhaW5XaXRoRW5jcnlwdGVkUHJ2PiA9PiB7XG4gICAgICBpZiAoIXRoaXMuX3dhbGxldC5rZXlzIHx8IGluZGV4ID49IHRoaXMuX3dhbGxldC5rZXlzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0VuY3J5cHRlZEtleWNoYWluRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyYW1zID0geyBpZDogdGhpcy5fd2FsbGV0LmtleXNbaW5kZXhdIH07XG5cbiAgICAgIGNvbnN0IGtleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXQocGFyYW1zKTtcbiAgICAgIC8vIElmIHdlIGZpbmQgdGhlIHBydiwgdGhlbiB0aGlzIGlzIHByb2JhYmx5IHRoZSB1c2VyIGtleWNoYWluIHdlJ3JlIGxvb2tpbmcgZm9yXG4gICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSB7XG4gICAgICAgIHJldHVybiBrZXljaGFpbiBhcyBLZXljaGFpbldpdGhFbmNyeXB0ZWRQcnY7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ5S2V5Q2hhaW4oaW5kZXggKyAxKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRyeUtleUNoYWluKDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVuZW5jcnlwdGVkIHByaXZhdGUga2V5IGZvciB0aGlzIHdhbGxldCAoYmUgY2FyZWZ1bCEpXG4gICAqIFJlcXVpcmVzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGdldFBydihwYXJhbXM6IEdldFBydk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICdwcnYnXSk7XG5cbiAgICAvLyBQcmVwYXJlIHNpZ25pbmcga2V5XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnBydikgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBlaXRoZXIgcHJvdmlkZSBwcnYgb3Igd2FsbGV0IHBhc3NwaHJhc2UnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnBydikgJiYgIV8uaXNTdHJpbmcocGFyYW1zLnBydikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpICYmICFfLmlzU3RyaW5nKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXRQYXNzcGhyYXNlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnBydikge1xuICAgICAgcmV0dXJuIHBhcmFtcy5wcnY7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcktleWNoYWluID0gYXdhaXQgdGhpcy5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oKTtcbiAgICBpZiAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldCBwYXNzcGhyYXNlIHdhcyBub3QgcHJvdmlkZWQnKTtcbiAgICB9XG4gICAgY29uc3QgdXNlclBydiA9IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXkodGhpcy5iaXRnbywgdXNlcktleWNoYWluLCBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSk7XG4gICAgaWYgKCF1c2VyUHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Vycm9yIGRlY3J5cHRpbmcgd2FsbGV0IHByaXZhdGUga2V5Jyk7XG4gICAgfVxuICAgIHJldHVybiB1c2VyUHJ2O1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYW4gZW5jcnlwdGVkIHdhbGxldCBzaGFyZSB0byBCaXRHby5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlU2hhcmUocGFyYW1zOiBDcmVhdGVTaGFyZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1c2VyJywgJ3Blcm1pc3Npb25zJ10sIFtdKTtcblxuICAgIGlmIChwYXJhbXMua2V5Y2hhaW4gJiYgIV8uaXNFbXB0eShwYXJhbXMua2V5Y2hhaW4pKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFwYXJhbXMua2V5Y2hhaW4ucHViIHx8XG4gICAgICAgICFwYXJhbXMua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2IHx8XG4gICAgICAgICFwYXJhbXMua2V5Y2hhaW4uZnJvbVB1YktleSB8fFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLnRvUHViS2V5IHx8XG4gICAgICAgICFwYXJhbXMua2V5Y2hhaW4ucGF0aFxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZXMga2V5Y2hhaW4gcGFyYW1ldGVycyAtIHB1YiwgZW5jcnlwdGVkUHJ2LCBmcm9tUHViS2V5LCB0b1B1YktleSwgcGF0aCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9zaGFyZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmVzIGEgd2FsbGV0IHdpdGggbXVsdGlwbGUgdXNlcnMgYnkgY3JlYXRpbmcgYnVsayB3YWxsZXQgc2hhcmVzLlxuICAgKlxuICAgKiBAYXN5bmNcbiAgICogQHBhcmFtIHtCdWxrV2FsbGV0U2hhcmVPcHRpb25zfSBwYXJhbXMgLSBUaGUgb3B0aW9ucyBmb3Igc2hhcmluZyB3YWxsZXRzIGluIGJ1bGsuXG4gICAqIEBwYXJhbSB7QXJyYXk8U2hhcmVPcHRpb24+fSBwYXJhbXMuc2hhcmVPcHRpb25zIC0gQW4gYXJyYXkgb2Ygc2hhcmUgb3B0aW9uIG9iamVjdHMgY29udGFpbmluZyB1c2VyIGFuZCBwZXJtaXNzaW9ucyBpbmZvcm1hdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXMuc2hhcmVPcHRpb25zW10ua2V5Y2hhaW5dIC0gVGhlIGtleWNoYWluIG9iamVjdCB1c2VkIHRvIHNoYXJlIHRoZSB3YWxsZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1zLnNoYXJlT3B0aW9uc1tdLmtleWNoYWluLnRvUHViS2V5XSAtIFRoZSByZWNpcGllbnQncyBwdWJsaWMga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhcmFtcy5zaGFyZU9wdGlvbnNbXS5rZXljaGFpbi5wYXRoXSAtIFRoZSBkZXJpdmF0aW9uIHBhdGggb2YgdGhlIGtleWNoYWluLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnNoYXJlT3B0aW9uc1tdLnVzZXIgLSBUaGUgdXNlciB0byBzaGFyZSB0aGUgd2FsbGV0IHdpdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc2hhcmVPcHRpb25zW10ucGVybWlzc2lvbnMgLSBUaGUgcGVybWlzc2lvbnMgZ3JhbnRlZCB0byB0aGUgdXNlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMud2FsbGV0UGFzc3BocmFzZV0gLSBUaGUgd2FsbGV0IHBhc3NwaHJhc2UgdXNlZCB0byBkZWNyeXB0IHRoZSBrZXljaGFpbi5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIGBzaGFyZU9wdGlvbnNgIGlzIGVtcHR5LCBvciBpZiByZXF1aXJlZCBrZXljaGFpbiBwYXJhbWV0ZXJzIChgdG9QdWJLZXlgIGFuZCBgcGF0aGApIGFyZSBtaXNzaW5nIHdoZW4gbmVlZGVkLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdW5hYmxlIHRvIGRlY3J5cHQgdGhlIHVzZXIga2V5Y2hhaW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENyZWF0ZUJ1bGtXYWxsZXRTaGFyZUxpc3RSZXNwb25zZT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3BvbnNlIG9mIHRoZSBidWxrIHdhbGxldCBzaGFyZSBjcmVhdGlvbi5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUJ1bGtXYWxsZXRTaGFyZShwYXJhbXM6IEJ1bGtXYWxsZXRTaGFyZU9wdGlvbnMpOiBQcm9taXNlPENyZWF0ZUJ1bGtXYWxsZXRTaGFyZUxpc3RSZXNwb25zZT4ge1xuICAgIGlmIChwYXJhbXMua2V5U2hhcmVPcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaGFyZU9wdGlvbnMgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgfVxuICAgIGNvbnN0IGJ1bGtDcmVhdGVTaGFyZU9wdGlvbnM6IEJ1bGtDcmVhdGVTaGFyZU9wdGlvbltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHNoYXJlT3B0aW9uIG9mIHBhcmFtcy5rZXlTaGFyZU9wdGlvbnMpIHtcbiAgICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhzaGFyZU9wdGlvbiwgWyd1c2VySWQnLCAncHViS2V5JywgJ3BhdGgnXSwgW10pO1xuXG4gICAgICBjb25zdCBuZWVkc0tleWNoYWluID0gc2hhcmVPcHRpb24ucGVybWlzc2lvbnMgJiYgc2hhcmVPcHRpb24ucGVybWlzc2lvbnMuaW5jbHVkZXMoJ3NwZW5kJyk7XG5cbiAgICAgIGlmIChuZWVkc0tleWNoYWluKSB7XG4gICAgICAgIGNvbnN0IHNoYXJlZEtleWNoYWluID0gYXdhaXQgdGhpcy5wcmVwYXJlU2hhcmVkS2V5Y2hhaW4oXG4gICAgICAgICAgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgc2hhcmVPcHRpb24ucHViS2V5LFxuICAgICAgICAgIHNoYXJlT3B0aW9uLnBhdGhcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qga2V5Y2hhaW4gPSBPYmplY3Qua2V5cyhzaGFyZWRLZXljaGFpbiA/PyB7fSkubGVuZ3RoID09PSAwID8gdW5kZWZpbmVkIDogc2hhcmVkS2V5Y2hhaW47XG4gICAgICAgIGlmIChrZXljaGFpbikge1xuICAgICAgICAgIGFzc2VydChrZXljaGFpbi5wdWIsICdwdWIgbXVzdCBiZSBkZWZpbmVkIGZvciBzaGFyaW5nJyk7XG4gICAgICAgICAgYXNzZXJ0KGtleWNoYWluLmVuY3J5cHRlZFBydiwgJ2VuY3J5cHRlZFBydiBtdXN0IGJlIGRlZmluZWQgZm9yIHNoYXJpbmcnKTtcbiAgICAgICAgICBhc3NlcnQoa2V5Y2hhaW4uZnJvbVB1YktleSwgJ2Zyb21QdWJLZXkgbXVzdCBiZSBkZWZpbmVkIGZvciBzaGFyaW5nJyk7XG4gICAgICAgICAgYXNzZXJ0KGtleWNoYWluLnRvUHViS2V5LCAndG9QdWJLZXkgbXVzdCBiZSBkZWZpbmVkIGZvciBzaGFyaW5nJyk7XG4gICAgICAgICAgYXNzZXJ0KGtleWNoYWluLnBhdGgsICdwYXRoIG11c3QgYmUgZGVmaW5lZCBmb3Igc2hhcmluZycpO1xuXG4gICAgICAgICAgY29uc3QgYnVsa0tleWNoYWluOiBCdWxrV2FsbGV0U2hhcmVLZXljaGFpbiA9IHtcbiAgICAgICAgICAgIHB1Yjoga2V5Y2hhaW4ucHViLFxuICAgICAgICAgICAgZW5jcnlwdGVkUHJ2OiBrZXljaGFpbi5lbmNyeXB0ZWRQcnYsXG4gICAgICAgICAgICBmcm9tUHViS2V5OiBrZXljaGFpbi5mcm9tUHViS2V5LFxuICAgICAgICAgICAgdG9QdWJLZXk6IGtleWNoYWluLnRvUHViS2V5LFxuICAgICAgICAgICAgcGF0aDoga2V5Y2hhaW4ucGF0aCxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgYnVsa0NyZWF0ZVNoYXJlT3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHVzZXI6IHNoYXJlT3B0aW9uLnVzZXJJZCxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiBzaGFyZU9wdGlvbi5wZXJtaXNzaW9ucyxcbiAgICAgICAgICAgIGtleWNoYWluOiBidWxrS2V5Y2hhaW4sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlQnVsa0tleVNoYXJlcyhidWxrQ3JlYXRlU2hhcmVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGJ1bGsgd2FsbGV0IHNoYXJlIGVudHJpZXMgZm9yIHNwZWNpZmllZCBzaGFyZSBvcHRpb25zLlxuICAgKiBGaWx0ZXJzIG91dCBzaGFyZSBvcHRpb25zIHRoYXQgZG8gbm90IGNvbnRhaW4gdmFsaWQga2V5Y2hhaW4gaW5mb3JtYXRpb24gb3IgaGF2ZSBtaXNzaW5nIGtleWNoYWluIGZpZWxkcy5cbiAgICogSWYgYWxsIHNoYXJlIG9wdGlvbnMgYXJlIGludmFsaWQgb3IgZW1wdHksIGl0IHRocm93cyBhbiBlcnJvci5cbiAgICogU2VuZHMgYSBQT1NUIHJlcXVlc3QgdG8gY3JlYXRlIHRoZSB3YWxsZXQgc2hhcmVzIGZvciB2YWxpZCBzaGFyZSBvcHRpb25zLlxuICAgKlxuICAgKiBAYXN5bmNcbiAgICogQHBhcmFtIHtCdWxrQ3JlYXRlU2hhcmVPcHRpb25bXX0gW3BhcmFtcz1bXV0gLSBUaGUgYXJyYXkgb2Ygc2hhcmUgb3B0aW9ucyB0byBwcm9jZXNzLlxuICAgKiAgIEtleWNoYWluIGVudHJpZXMgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgZmllbGRzOiBgcHViYCwgYGVuY3J5cHRlZFBydmAsIGBmcm9tUHViS2V5YCwgYHRvUHViS2V5YCwgYW5kIGBwYXRoYC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Q3JlYXRlQnVsa1dhbGxldFNoYXJlTGlzdFJlc3BvbnNlPn0gQSBwcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmVzdWx0IG9mIHRoZSB3YWxsZXQgc2hhcmVzIGNyZWF0aW9uLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIG5vIHZhbGlkIHNoYXJlIG9wdGlvbnMgYXJlIHByb3ZpZGVkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQnVsa0tleVNoYXJlcyhwYXJhbXM6IEJ1bGtDcmVhdGVTaGFyZU9wdGlvbltdID0gW10pOiBQcm9taXNlPENyZWF0ZUJ1bGtXYWxsZXRTaGFyZUxpc3RSZXNwb25zZT4ge1xuICAgIHBhcmFtcyA9IHBhcmFtcy5maWx0ZXIoKHNoYXJlT3B0aW9uKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb21tb24udmFsaWRhdGVQYXJhbXMoc2hhcmVPcHRpb24ua2V5Y2hhaW4sIFsncHViJywgJ2VuY3J5cHRlZFBydicsICdmcm9tUHViS2V5JywgJ3RvUHViS2V5JywgJ3BhdGgnXSwgW10pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gRXhjbHVkZSBzaGFyZSBvcHRpb25zIHdpdGggaW52YWxpZCBrZXljaGFpblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIXBhcmFtcyB8fCBPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaGFyZU9wdGlvbnMgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gdGhpcy5iaXRnby51cmwoYC93YWxsZXQvJHt0aGlzLl93YWxsZXQuaWR9L3dhbGxldHNoYXJlc2AsIDIpO1xuICAgIHJldHVybiB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHsgc2hhcmVPcHRpb25zOiBwYXJhbXMgfSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBrZXljaGFpbiB3aXRoIGVuY3J5cHRlZCBwcml2YXRlIGtleSB0byBiZSBzaGFyZWQgZm9yIHdhbGxldCBzaGFyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRFbmNyeXB0ZWRXYWxsZXRLZXljaGFpbkZvcldhbGxldFNoYXJpbmcoKTogUHJvbWlzZTxLZXljaGFpbldpdGhFbmNyeXB0ZWRQcnY+IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PT0gJ2xuYnRjJykge1xuICAgICAgLy8gbGlnaHRuaW5nIGNvaW4gZG9lcyBub3QgdXNlIHVzZXIga2V5IHRvIHNpZ24gdGhlIHRyYW5zYWN0aW9ucyBmcm9tIFNESy5cbiAgICAgIC8vIGl0IHVzZXMgdXNlciBhdXRoIGtleSBpbnN0ZWFkLlxuICAgICAgcmV0dXJuIGF3YWl0IGdldExpZ2h0bmluZ0F1dGhLZXkodGhpcywgJ3VzZXJBdXRoJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEVuY3J5cHRlZFVzZXJLZXljaGFpbigpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHByZXBhcmVTaGFyZWRLZXljaGFpbihcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVia2V5OiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nXG4gICk6IFByb21pc2U8U2hhcmVkS2V5Q2hhaW4+IHtcbiAgICBsZXQgc2hhcmVkS2V5Y2hhaW46IFNoYXJlZEtleUNoYWluID0ge307XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qga2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmdldEVuY3J5cHRlZFdhbGxldEtleWNoYWluRm9yV2FsbGV0U2hhcmluZygpO1xuXG4gICAgICAvLyBEZWNyeXB0IHRoZSB1c2VyIGtleSB3aXRoIGEgcGFzc3BocmFzZVxuICAgICAgaWYgKGtleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgICAgICBpZiAoIXdhbGxldFBhc3NwaHJhc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgd2FsbGV0UGFzc3BocmFzZSBhcmd1bWVudCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXNlclBydiA9IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXkodGhpcy5iaXRnbywga2V5Y2hhaW4sIHdhbGxldFBhc3NwaHJhc2UpO1xuICAgICAgICBpZiAoIXVzZXJQcnYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW5jb3JyZWN0UGFzc3dvcmRFcnJvcignUGFzc3dvcmQgc2hhcmVkIGlzIGluY29ycmVjdCBmb3IgdGhpcyB3YWxsZXQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGtleWNoYWluLnBydiA9IHVzZXJQcnY7XG4gICAgICAgIGNvbnN0IGVja2V5ID0gbWFrZVJhbmRvbUtleSgpO1xuICAgICAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoZWNrZXksIEJ1ZmZlci5mcm9tKHB1YmtleSwgJ2hleCcpKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAgIGNvbnN0IG5ld0VuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7IHBhc3N3b3JkOiBzZWNyZXQsIGlucHV0OiBrZXljaGFpbi5wcnYgfSk7XG5cbiAgICAgICAgLy8gT25seSBvbmUgb2YgcHViL2NvbW1vblB1Yi9jb21tb25LZXljaGFpbiBzaG91bGQgYmUgcHJlc2VudCBpbiB0aGUga2V5Y2hhaW5cbiAgICAgICAgbGV0IHB1YiA9IGtleWNoYWluLnB1YiA/PyBrZXljaGFpbi5jb21tb25QdWI7XG4gICAgICAgIGlmIChrZXljaGFpbi5jb21tb25LZXljaGFpbikge1xuICAgICAgICAgIHB1YiA9XG4gICAgICAgICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWRkc2EnXG4gICAgICAgICAgICAgID8gRWRkc2FVdGlscy5nZXRQdWJsaWNLZXlGcm9tQ29tbW9uS2V5Y2hhaW4oa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pXG4gICAgICAgICAgICAgIDogRWNkc2FVdGlscy5nZXRQdWJsaWNLZXlGcm9tQ29tbW9uS2V5Y2hhaW4oa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgc2hhcmVkS2V5Y2hhaW4gPSB7XG4gICAgICAgICAgcHViLFxuICAgICAgICAgIGVuY3J5cHRlZFBydjogbmV3RW5jcnlwdGVkUHJ2LFxuICAgICAgICAgIGZyb21QdWJLZXk6IGVja2V5LnB1YmxpY0tleS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdG9QdWJLZXk6IHB1YmtleSxcbiAgICAgICAgICBwYXRoOiBwYXRoLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgTWlzc2luZ0VuY3J5cHRlZEtleWNoYWluRXJyb3IpIHtcbiAgICAgICAgc2hhcmVkS2V5Y2hhaW4gPSB7fTtcbiAgICAgICAgLy8gaWdub3JlIHRoaXMgZXJyb3IgYmVjYXVzZSB0aGlzIGxvb2tzIGxpa2UgYSBjb2xkIHdhbGxldFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2hhcmVkS2V5Y2hhaW47XG4gIH1cblxuICAvKipcbiAgICogU2hhcmUgdGhpcyB3YWxsZXQgd2l0aCBhbm90aGVyIEJpdEdvIHVzZXIuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzaGFyZVdhbGxldChwYXJhbXM6IFNoYXJlV2FsbGV0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2VtYWlsJywgJ3Blcm1pc3Npb25zJ10sIFsnd2FsbGV0UGFzc3BocmFzZScsICdtZXNzYWdlJ10pO1xuICAgIGlmIChwYXJhbXMucmVzaGFyZSAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMucmVzaGFyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVzaGFyZSB0byBiZSBhIGJvb2xlYW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5za2lwS2V5Y2hhaW4gIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnNraXBLZXljaGFpbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgc2tpcEtleWNoYWluIHRvIGJlIGEgYm9vbGVhbi4gJyk7XG4gICAgfVxuICAgIGNvbnN0IG5lZWRzS2V5Y2hhaW4gPSAhcGFyYW1zLnNraXBLZXljaGFpbiAmJiBwYXJhbXMucGVybWlzc2lvbnMgJiYgcGFyYW1zLnBlcm1pc3Npb25zLmluZGV4T2YoJ3NwZW5kJykgIT09IC0xO1xuXG4gICAgaWYgKHBhcmFtcy5kaXNhYmxlRW1haWwgIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmRpc2FibGVFbWFpbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZGlzYWJsZUVtYWlsIHRvIGJlIGEgYm9vbGVhbi4nKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmVtYWlsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgZW1haWwnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaGFyaW5nID0gKGF3YWl0IHRoaXMuYml0Z28uZ2V0U2hhcmluZ0tleSh7IGVtYWlsOiBwYXJhbXMuZW1haWwudG9Mb3dlckNhc2UoKSB9KSkgYXMgYW55O1xuICAgIGxldCBzaGFyZWRLZXljaGFpbjtcbiAgICBpZiAobmVlZHNLZXljaGFpbikge1xuICAgICAgc2hhcmVkS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLnByZXBhcmVTaGFyZWRLZXljaGFpbihwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgc2hhcmluZy5wdWJrZXksIHNoYXJpbmcucGF0aCk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQ3JlYXRlU2hhcmVPcHRpb25zID0ge1xuICAgICAgdXNlcjogc2hhcmluZy51c2VySWQsXG4gICAgICBwZXJtaXNzaW9uczogcGFyYW1zLnBlcm1pc3Npb25zLFxuICAgICAgcmVzaGFyZTogcGFyYW1zLnJlc2hhcmUsXG4gICAgICBtZXNzYWdlOiBwYXJhbXMubWVzc2FnZSxcbiAgICAgIGRpc2FibGVFbWFpbDogcGFyYW1zLmRpc2FibGVFbWFpbCxcbiAgICAgIHNraXBLZXljaGFpbjogT2JqZWN0LmtleXMoc2hhcmVkS2V5Y2hhaW4gPz8ge30pLmxlbmd0aCA9PT0gMCxcbiAgICAgIGtleWNoYWluOiBPYmplY3Qua2V5cyhzaGFyZWRLZXljaGFpbiA/PyB7fSkubGVuZ3RoID09PSAwID8gdW5kZWZpbmVkIDogc2hhcmVkS2V5Y2hhaW4sXG4gICAgfTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZVNoYXJlKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB1c2VyIGZyb20gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB1c2VySWQgSWQgb2YgdGhlIHVzZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBhc3luYyByZW1vdmVVc2VyKHBhcmFtczogUmVtb3ZlVXNlck9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1c2VySWQnXSwgW10pO1xuXG4gICAgY29uc3QgdXNlcklkID0gcGFyYW1zLnVzZXJJZDtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy91c2VyLycgKyB1c2VySWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkICh1bnNpZ25lZCB0cmFuc2FjdGlvbikgZnJvbSBCaXRHb1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gICAqIEBwYXJhbSB7e2FkZHJlc3M6IHN0cmluZywgYW1vdW50OiBzdHJpbmd9fSBwYXJhbXMucmVjaXBpZW50cyAtIGxpc3Qgb2YgcmVjaXBpZW50cyBhbmQgbmVjZXNzYXJ5IHJlY2lwaWVudCBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm51bUJsb2NrcyAtIEVzdGltYXRlcyB0aGUgYXBwcm94aW1hdGUgZmVlIHBlciBraWxvYnl0ZSBuZWNlc3NhcnkgZm9yIGEgdHJhbnNhY3Rpb24gY29uZmlybWF0aW9uIHdpdGhpbiBudW1CbG9ja3MgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIHRoZSBkZXNpcmVkIGZlZVJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBiYXNlIHVuaXRzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIGJhc2UgdW5pdHMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIE1pbmltdW0gbnVtYmVyIG9mIGNvbmZpcm1hdGlvbnMgdW5zcGVudHMgZ29pbmcgaW50byB0aGlzIHRyYW5zYWN0aW9uIHNob3VsZCBoYXZlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIEVuZm9yY2UgbWluaW11bSBudW1iZXIgb2YgY29uZmlybWF0aW9ucyBvbiBjaGFuZ2UgKGludGVybmFsKSBpbnB1dHMuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMgLSBUaGUgZGVzaXJlZCBjb3VudCBvZiB1bnNwZW50cyBpbiB0aGUgd2FsbGV0LiBJZiB0aGUgd2FsbGV04oCZcyBjdXJyZW50IHVuc3BlbnQgY291bnQgaXMgbG93ZXIgdGhhbiB0aGUgdGFyZ2V0LCB1cCB0byBmb3VyIGFkZGl0aW9uYWwgY2hhbmdlIG91dHB1dHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgc21hbGxlciB0aGFuIHRoaXMgYW1vdW50IG9mIGJhc2UgdW5pdHNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBsYXJnZXIgdGhhbiB0aGlzIGFtb3VudCBvZiBiYXNlIHVuaXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuc2VxdWVuY2VJZCAtIFRoZSBzZXF1ZW5jZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5sYXN0TGVkZ2VyU2VxdWVuY2UgLSBBYnNvbHV0ZSBtYXggbGVkZ2VyIHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQgaW4sIHdoZXJlYWZ0ZXIgaXQgd2lsbCBiZSByZWplY3RlZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5sZWRnZXJTZXF1ZW5jZURlbHRhIC0gUmVsYXRpdmUgbGVkZ2VyIGhlaWdodCAoaW4gcmVsYXRpb24gdG8gdGhlIGN1cnJlbnQgbGVkZ2VyKSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQgaW4sIHdoZXJlYWZ0ZXIgaXQgd2lsbCBiZSByZWplY3RlZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5nYXNQcmljZSAtIEN1c3RvbSBnYXMgcHJpY2UgdG8gYmUgdXNlZCBmb3Igc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5nYXNMaW1pdCAtIEN1c3RvbSBnYXMgbGltaXQgdG8gYmUgdXNlZCBmb3Igc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMubm9TcGxpdENoYW5nZSAtIFNldCB0byB0cnVlIHRvIGRpc2FibGUgYXV0b21hdGljIGNoYW5nZSBzcGxpdHRpbmcgZm9yIHB1cnBvc2VzIG9mIHVuc3BlbnQgbWFuYWdlbWVudFxuICAgKiBAcGFyYW0ge0FycmF5fSBwYXJhbXMudW5zcGVudHMgLSBUaGUgdW5zcGVudHMgdG8gdXNlIGluIHRoZSB0cmFuc2FjdGlvbi4gRWFjaCB1bnNwZW50IHNob3VsZCBiZSBpbiB0aGUgZm9ybSBwcmV2VHhJZDpuT3V0cHV0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuY2hhbmdlQWRkcmVzcyAtIFNwZWNpZmllcyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGNoYW5nZSBvdXRwdXRcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMubm9uUGFydGljaXBhdGlvbiAtIChBbGdvcmFuZCkgTm9uIHBhcnRpY2lwYXRpbmcga2V5IHJlZyB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnZhbGlkRnJvbUJsb2NrIC0gKEFsZ29yYW5kKSBUaGUgbWluaW11bSByb3VuZCB0aGlzIHdpbGwgcnVuIG9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudmFsaWRUb0Jsb2NrIC0gKEFsZ29yYW5kKSBUaGUgbWF4aW11bSByb3VuZCB0aGlzIHdpbGwgcnVuIG9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmluc3RhbnQgLSBCdWlsZCB0aGlzIHRyYW5zYWN0aW9uIHRvIGNvbmZvcm0gd2l0aCBpbnN0YW50IHNlbmRpbmcgY29pbi1zcGVjaWZpYyBtZXRob2QgKGlmIGF2YWlsYWJsZSlcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMua2VlcEFsaXZlIC0gKFBvbGthZG90KSBrZWVwIGFkZHJlc3MgYWxpdmUgYnkgc2VuZGluZyB0aGUgYWRkcmVzcyBtaW5pbXVtIGZ1bmRpbmcgYW1vdW50LCB1c2VkIGR1cmluZyB3YWxsZXQgY29uc29saWRhdGlvbiwgdHJ1ZSBieSBkZWZhdWx0XG4gICAqIEBwYXJhbSB7e3ZhbHVlOiBTdHJpbmcsIHR5cGU6IFN0cmluZ319IHBhcmFtcy5tZW1vIC0gTWVtbyB0byB1c2UgaW4gdHJhbnNhY3Rpb24gKHN1cHBvcnRlZCBieSBTdGVsbGFyKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW0udHJhbnNmZXJJZCAtIHRyYW5zZmVyIElkIHRvIHVzZSBpbiB0cmFuc2FjdGlvbiAoc3VwcG9ydGVkIGJ5IGNhc3BlcilcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5hZGRyZXNzVHlwZSAtIFRoZSB0eXBlIG9mIGFkZHJlc3MgdG8gY3JlYXRlIGZvciBjaGFuZ2UuIE9uZSBvZiBgcDJzaGAsIGBwMnNoUDJ3c2hgLCBhbmQgYHAyd3NoYC4gQ2FzZS1zZW5zaXRpdmUuXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmhvcCAtIEJ1aWxkIHRoaXMgYXMgYW4gRXRoZXJldW0gaG9wIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMucmVzZXJ2YXRpb24gLSBPYmplY3QgdG8gcmVzZXJ2ZSB0aGUgdW5zcGVudHMgdGhhdCB0aGlzIHR4IGJ1aWxkIHVzZXMuIEZvcm1hdCBpcyByZXNlcnZhdGlvbiA9IHsgZXhwaXJlVGltZTogSVNPRGF0ZVN0cmluZywgcGVuZGluZ0FwcHJvdmFsSWQ6IFN0cmluZyB9XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSBUaGUgcGFzc3BocmFzZSB0byB0aGUgd2FsbGV0IHVzZXIga2V5LCB0byBzaWduIGNvbW1pdG1lbnQgZGF0YSBmb3IgRXRoZXJldW0gaG9wIHRyYW5zYWN0aW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcyAtIFRoZSBjb250cmFjdCBhZGRyZXNzIHVzZWQgYXMgdGhlIFwidG9cIiBmaWVsZCBvZiBhIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgcHJlYnVpbGRUcmFuc2FjdGlvbihwYXJhbXM6IFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb25UeFJlcXVlc3RzKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgLy8gV2hpdGVsaXN0IHBhcmFtcyB0byBidWlsZCB0eFxuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gdGhpcy5iYXNlQ29pbi5wcmVwcm9jZXNzQnVpbGRQYXJhbXMoXy5waWNrKHBhcmFtcywgdGhpcy5wcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zKCkpKTtcbiAgICBkZWJ1ZygncHJlYnVpbGRpbmcgdHJhbnNhY3Rpb246ICVPJywgd2hpdGVsaXN0ZWRQYXJhbXMpO1xuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuICAgIGNvbnN0IGV4dHJhUGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5nZXRFeHRyYVByZWJ1aWxkUGFyYW1zKE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7IHdhbGxldDogdGhpcyB9KSk7XG4gICAgT2JqZWN0LmFzc2lnbih3aGl0ZWxpc3RlZFBhcmFtcywgZXh0cmFQYXJhbXMpO1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0ge1xuICAgICAgb2ZmbGluZVZlcmlmaWNhdGlvbjogcGFyYW1zLm9mZmxpbmVWZXJpZmljYXRpb24gPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICBjb25zdCBidWlsZFF1ZXJ5ID0gdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvdHgvYnVpbGQnKSlcbiAgICAgIC5xdWVyeShxdWVyeVBhcmFtcylcbiAgICAgIC5zZW5kKHdoaXRlbGlzdGVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuXG4gICAgY29uc3QgYmxvY2tIZWlnaHRRdWVyeSA9IF8uaXNGdW5jdGlvbigodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmdldExhdGVzdEJsb2NrSGVpZ2h0KVxuICAgICAgPyAodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmdldExhdGVzdEJsb2NrSGVpZ2h0KHBhcmFtcy5yZXFJZClcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgY29uc3QgcXVlcmllcyA9IFtidWlsZFF1ZXJ5LCBibG9ja0hlaWdodFF1ZXJ5XTtcbiAgICBjb25zdCBbYnVpbGRSZXNwb25zZSwgYmxvY2tIZWlnaHRdID0gKGF3YWl0IFByb21pc2UuYWxsKHF1ZXJpZXMpKSBhcyBhbnk7XG4gICAgZGVidWcoJ3Bvc3Rwcm9jZXNzaW5nIHRyYW5zYWN0aW9uIHByZWJ1aWxkOiAlTycsIGJ1aWxkUmVzcG9uc2UpO1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChibG9ja0hlaWdodCkpIHtcbiAgICAgIGJ1aWxkUmVzcG9uc2UuYmxvY2tIZWlnaHQgPSBibG9ja0hlaWdodDtcbiAgICB9XG4gICAgbGV0IHByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkID0gKGF3YWl0IHRoaXMuYmFzZUNvaW4ucG9zdFByb2Nlc3NQcmVidWlsZChcbiAgICAgIE9iamVjdC5hc3NpZ24oYnVpbGRSZXNwb25zZSwgeyB3YWxsZXQ6IHRoaXMsIGJ1aWxkUGFyYW1zOiB3aGl0ZWxpc3RlZFBhcmFtcyB9KVxuICAgICkpIGFzIGFueTtcbiAgICBkZWxldGUgcHJlYnVpbGQud2FsbGV0O1xuICAgIGRlbGV0ZSBwcmVidWlsZC5idWlsZFBhcmFtcztcbiAgICBwcmVidWlsZCA9IF8uZXh0ZW5kKHt9LCBwcmVidWlsZCwgeyB3YWxsZXRJZDogdGhpcy5pZCgpIH0pO1xuICAgIGlmICh0aGlzLl93YWxsZXQgJiYgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYyAmJiAhcGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcykge1xuICAgICAgcHJlYnVpbGQgPSBfLmV4dGVuZCh7fSwgcHJlYnVpbGQsIHsgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLmJhc2VBZGRyZXNzIH0pO1xuICAgIH1cbiAgICBwcmVidWlsZCA9IF8uZXh0ZW5kKHt9LCBwcmVidWlsZCwgeyByZXFJZDogcGFyYW1zLnJlcUlkIH0pO1xuICAgIGRlYnVnKCdmaW5hbCB0cmFuc2FjdGlvbiBwcmVidWlsZDogJU8nLCBwcmVidWlsZCk7XG4gICAgcmV0dXJuIHByZWJ1aWxkIGFzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgVXNlciBLZXljaGFpbiBhbmQgc2lnbiBhIFRTUyB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gdHhSZXF1ZXN0SWQgVGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QgaWRcbiAgICogQHBhcmFtIHdhbGxldFBhc3NwaHJhc2UgVGhlIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEByZXR1cm4gUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj5cbiAgICovXG4gIGFzeW5jIGdldFVzZXJLZXlBbmRTaWduVHNzVHJhbnNhY3Rpb24oe1xuICAgIHR4UmVxdWVzdElkLFxuICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gIH06IHtcbiAgICB0eFJlcXVlc3RJZDogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgfSk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSAhPT0gJ3RzcycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZ2V0VXNlcktleUFuZFNpZ25Uc3NUcmFuc2FjdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICB9XG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIC8vIERvaW5nIGEgc2FuaXR5IGNoZWNrIGZvciBwYXNzd29yZCBoZXJlIHRvIGF2b2lkIGRvaW5nIGZ1cnRoZXIgd29yayBpZiB3ZSBrbm93IGl0J3Mgd3JvbmdcbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmdldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZSh7IHJlcUlkLCB3YWxsZXRQYXNzcGhyYXNlIH0pO1xuICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IGtleWNoYWluc1swXTtcbiAgICBpZiAoIXVzZXJLZXljaGFpbiB8fCAhdXNlcktleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGUgdXNlciBrZXljaGFpbiBkb2VzIG5vdCBoYXZlIHByb3BlcnR5IGVuY3J5cHRlZFBydicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQ6IHsgdHhSZXF1ZXN0SWQgfSwgd2FsbGV0UGFzc3BocmFzZSwgcmVxSWQsIGtleWNoYWluOiB1c2VyS2V5Y2hhaW4gfSk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB0eFByZWJ1aWxkXG4gICAqIC0gW2tleWNoYWluIC8ga2V5XSAob2JqZWN0KSBvciBwcnYgKHN0cmluZylcbiAgICogLSB3YWxsZXRQYXNzcGhyYXNlXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBhc3luYyBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uIHwgVHhSZXF1ZXN0PiB7XG4gICAgY29uc3QgeyB0eFByZWJ1aWxkLCBhcGlWZXJzaW9uLCB0eFJlcXVlc3RJZCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKFxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21Db21taXRtZW50R2VuZXJhdGluZ0Z1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21HU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVJTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbilcbiAgICApIHtcbiAgICAgIC8vIGludm9rZSBleHRlcm5hbCBzaWduZXIgVFNTIGZvciBFZERTQSB3b3JrZmxvd1xuICAgICAgcmV0dXJuIHRoaXMuc2lnblRyYW5zYWN0aW9uVHNzRXh0ZXJuYWxTaWduZXJFZERTQShwYXJhbXMsIHRoaXMuYmFzZUNvaW4pO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tUGFpbGxpZXJNb2R1bHVzR2VuZXJhdGluZ0Z1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21LU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbU11RGVsdGFTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikgJiZcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tU1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKVxuICAgICkge1xuICAgICAgLy8gaW52b2tlIGV4dGVybmFsIHNpZ25lciBUU1MgZm9yIEVDRFNBIHdvcmtmbG93XG4gICAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb25Uc3NFeHRlcm5hbFNpZ25lckVDRFNBKHRoaXMuYmFzZUNvaW4sIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0aW9uRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRpb25GdW5jdGlvbikgJiZcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdGlvbkZ1bmN0aW9uKVxuICAgICkge1xuICAgICAgLy8gaW52b2tlIGV4dGVybmFsIHNpZ25lciBUU1MgZm9yIEVDRFNBIE1QQ3Yyd29ya2Zsb3dcbiAgICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRUNEU0FNUEN2Mih0aGlzLmJhc2VDb2luLCBwYXJhbXMpO1xuICAgIH1cblxuICAgIGlmICghdHhQcmVidWlsZCB8fCB0eXBlb2YgdHhQcmVidWlsZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpc2lnVHlwZSgpID09PSAnb25jaGFpbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFByZWJ1aWxkIGlzIHJlcXVpcmVkIGZvciBvbi1jaGFpbiBtdWx0aXNpZyB3YWxsZXRzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXR4UmVxdWVzdElkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndHhQcmVidWlsZCBvciB0eFJlcXVlc3RJZCBpcyByZXF1aXJlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIG9ubHkgZG8gdGhpcyBpZiB3ZSdyZSBub3QgdXNpbmcgdGhlIGV4dGVybmFsIHNpZ25lciBUU1MgZmxvd1xuICAgICAgcGFyYW1zLnR4UHJlYnVpbGQgPSB7IHR4UmVxdWVzdElkIH07XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgJiZcbiAgICAgICEocGFyYW1zLmtleWNoYWluIHx8IHBhcmFtcy5rZXkpICYmXG4gICAgICAodGhpcy50eXBlKCkgPT09ICdob3QnIHx8IHRoaXMudHlwZSgpID09PSB1bmRlZmluZWQpXG4gICAgKSB7XG4gICAgICAvLyB0aGlzIGxvZ2ljIHNob3VsZCBvbmx5IGFwcGx5IHRvIGhvdCB3YWxsZXRzXG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0UGFzc3BocmFzZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmdldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZSh7XG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBrZXljaGFpbnNbMF07XG4gICAgICBpZiAoIXVzZXJLZXljaGFpbiB8fCAhdXNlcktleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoZSB1c2VyIGtleWNoYWluIGRvZXMgbm90IGhhdmUgcHJvcGVydHkgZW5jcnlwdGVkUHJ2Jyk7XG4gICAgICB9XG4gICAgICBwYXJhbXMua2V5Y2hhaW4gPSB1c2VyS2V5Y2hhaW47XG4gICAgfVxuXG4gICAgY29uc3QgcHJlc2lnbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ucHJlc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHdhbGxldERhdGE6IHRoaXMuX3dhbGxldCxcbiAgICAgIHRzc1V0aWxzOiB0aGlzLnRzc1V0aWxzLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubXVsdGlzaWdUeXBlKCkgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb25Uc3Moe1xuICAgICAgICAuLi5wcmVzaWduLFxuICAgICAgICBwcnY6IHRoaXMuZ2V0VXNlclBydihwcmVzaWduIGFzIEdldFVzZXJQcnZPcHRpb25zKSxcbiAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCB7IHB1YnMgfSA9IHBhcmFtcztcbiAgICBpZiAoIXB1YnMgJiYgdGhpcy5iYXNlQ29pbi5rZXlJZHNGb3JTaWduaW5nKCkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcyB9KTtcbiAgICAgIHB1YnMgPSBrZXljaGFpbnMubWFwKChrKSA9PiB7XG4gICAgICAgIGFzc2VydChrLnB1Yik7XG4gICAgICAgIHJldHVybiBrLnB1YjtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25UcmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgIC4uLnByZXNpZ24sXG4gICAgICB0eFByZWJ1aWxkOiB7IC4uLnR4UHJlYnVpbGQsIHdhbGxldElkOiB0aGlzLmlkKCkgfSxcbiAgICAgIHB1YnMsXG4gICAgICBjb2luOiB0aGlzLmJhc2VDb2luLFxuICAgIH07XG5cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21TaWduaW5nRnVuY3Rpb24pKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuYmFzZUNvaW4uc2lnbldpdGhDdXN0b21TaWduaW5nRnVuY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4uc2lnbldpdGhDdXN0b21TaWduaW5nRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbiwgc2lnblRyYW5zYWN0aW9uUGFyYW1zKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzIH0pO1xuICAgICAgY29uc3Qgc2lnblRyYW5zYWN0aW9uUGFyYW1zV2l0aFNlZWQgPSB7XG4gICAgICAgIC4uLnNpZ25UcmFuc2FjdGlvblBhcmFtcyxcbiAgICAgICAgZGVyaXZhdGlvblNlZWQ6IGtleXNbMF0/LmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHBhcmFtcy5jdXN0b21TaWduaW5nRnVuY3Rpb24oc2lnblRyYW5zYWN0aW9uUGFyYW1zV2l0aFNlZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgcHJ2OiB0aGlzLmdldFVzZXJQcnYocHJlc2lnbiBhcyBHZXRVc2VyUHJ2T3B0aW9ucyksXG4gICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIHR5cGVkIHN0cnVjdHVyZWQgZGF0YSB1c2luZyBUU1NcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgc2lnblR5cGVkRGF0YShwYXJhbXM6IFdhbGxldFNpZ25UeXBlZERhdGFPcHRpb25zKTogUHJvbWlzZTxTaWduZWRNZXNzYWdlPiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzU2lnbmluZ1R5cGVkRGF0YSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNpZ24gdHlwZWQgZGF0YSBub3Qgc3VwcG9ydGVkIGZvciAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX1gKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMudHlwZWREYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFR5cGVkIGRhdGEgcmVxdWlyZWRgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2Ugc2lnbmluZyBvbmx5IHN1cHBvcnRlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICB9XG4gICAgaWYgKF8uaXNGdW5jdGlvbihwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YVJhdykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHlwZWREYXRhLnR5cGVkRGF0YVJhdyBtdXN0IGJlIEpTT04gc3RyaW5nJyk7XG4gICAgfVxuICAgIGlmIChfLmlzRnVuY3Rpb24oKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5lbmNvZGVUeXBlZERhdGEpKSB7XG4gICAgICBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQgPSAodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmVuY29kZVR5cGVkRGF0YShwYXJhbXMudHlwZWREYXRhKTtcbiAgICB9XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQ6IHBhcmFtcy5yZXFJZCB9KTtcbiAgICBjb25zdCB1c2VyUHJ2T3B0aW9uczogR2V0VXNlclBydk9wdGlvbnMgPSB7IC4uLnBhcmFtcywga2V5Y2hhaW46IGtleWNoYWluc1swXSB9O1xuICAgIGFzc2VydChrZXljaGFpbnNbMF0uY29tbW9uS2V5Y2hhaW4sICdVbmFibGUgdG8gZmluZCBjb21tb25LZXljaGFpbiBpbiBrZXljaGFpbnMnKTtcbiAgICBjb25zdCBwcmVzaWduID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgd2FsbGV0RGF0YTogdGhpcy5fd2FsbGV0LFxuICAgICAgdHNzVXRpbHM6IHRoaXMudHNzVXRpbHMsXG4gICAgICBwcnY6IHRoaXMuZ2V0VXNlclBydih1c2VyUHJ2T3B0aW9ucyksXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgYmFja3VwS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAxID8ga2V5Y2hhaW5zWzFdIDogbnVsbCxcbiAgICAgIGJpdGdvS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAyID8ga2V5Y2hhaW5zWzJdIDogbnVsbCxcbiAgICAgIHB1Yjoga2V5Y2hhaW5zLm1hcCgoaykgPT4gay5wdWIpLFxuICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnNpZ25UeXBlZERhdGFUc3MocHJlc2lnbik7XG4gIH1cblxuICAvKipcbiAgICogIFNpZ24gYSBtZXNzYWdlIHVzaW5nIFRTU1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIC0gTWVzc2FnZVxuICAgKiAtIGN1c3RvZGlhbk1lc3NhZ2VJZFxuICAgKi9cbiAgYXN5bmMgc2lnbk1lc3NhZ2UocGFyYW1zOiBXYWxsZXRTaWduTWVzc2FnZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2lnbmVkTWVzc2FnZT4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5zdXBwb3J0c01lc3NhZ2VTaWduaW5nKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWVzc2FnZSBzaWduaW5nIG5vdCBzdXBwb3J0ZWQgZm9yICR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfWApO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5tZXNzYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UgcmVxdWlyZWQgdG8gc2lnbiBtZXNzYWdlJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXNzYWdlIHNpZ25pbmcgb25seSBzdXBwb3J0ZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgfVxuICAgIGlmIChfLmlzRnVuY3Rpb24oKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5lbmNvZGVNZXNzYWdlKSkge1xuICAgICAgcGFyYW1zLm1lc3NhZ2UubWVzc2FnZUVuY29kZWQgPSAodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmVuY29kZU1lc3NhZ2UocGFyYW1zLm1lc3NhZ2UubWVzc2FnZVJhdyk7XG4gICAgfVxuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMsIHJlcUlkOiBwYXJhbXMucmVxSWQgfSk7XG4gICAgY29uc3QgdXNlclBydk9wdGlvbnM6IEdldFVzZXJQcnZPcHRpb25zID0geyAuLi5wYXJhbXMsIGtleWNoYWluOiBrZXljaGFpbnNbMF0gfTtcbiAgICBhc3NlcnQoa2V5Y2hhaW5zWzBdLmNvbW1vbktleWNoYWluLCAnVW5hYmxlIHRvIGZpbmQgY29tbW9uS2V5Y2hhaW4gaW4ga2V5Y2hhaW5zJyk7XG4gICAgY29uc3QgcHJlc2lnbiA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHdhbGxldERhdGE6IHRoaXMuX3dhbGxldCxcbiAgICAgIHRzc1V0aWxzOiB0aGlzLnRzc1V0aWxzLFxuICAgICAgcHJ2OiB0aGlzLmdldFVzZXJQcnYodXNlclBydk9wdGlvbnMpLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIGJhY2t1cEtleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMSA/IGtleWNoYWluc1sxXSA6IG51bGwsXG4gICAgICBiaXRnb0tleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMiA/IGtleWNoYWluc1syXSA6IG51bGwsXG4gICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc2lnbk1lc3NhZ2VUc3MocHJlc2lnbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1c2VyIHByaXZhdGUga2V5IGZyb20gZWl0aGVyIGEgZGVyaXZhdGlvbiBvciBhbiBlbmNyeXB0ZWQga2V5Y2hhaW5cbiAgICogQHBhcmFtIFtwYXJhbXMua2V5Y2hhaW4gLyBwYXJhbXMua2V5XSAob2JqZWN0KSBvciBwYXJhbXMucHJ2IChzdHJpbmcpXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAoc3RyaW5nKVxuICAgKi9cbiAgZ2V0VXNlclBydihwYXJhbXM6IEdldFVzZXJQcnZPcHRpb25zID0ge30pOiBzdHJpbmcge1xuICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IHBhcmFtcy5rZXljaGFpbiB8fCBwYXJhbXMua2V5O1xuICAgIGxldCB1c2VyUHJ2ID0gcGFyYW1zLnBydjtcbiAgICBpZiAodXNlclBydiAmJiB0eXBlb2YgdXNlclBydiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICAvLyB1c2UgdGhlIGBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkYCBwcm9wZXJ0eSBmcm9tIHRoZSB1c2VyIGtleWNoYWluIGFzIHRoZSBgY29sZERlcml2YXRpb25TZWVkYFxuICAgIC8vIGlmIG5vIG90aGVyIGBjb2xkRGVyaXZhdGlvblNlZWRgIHdhcyBleHBsaWNpdGx5IHByb3ZpZGVkXG4gICAgLy8gT25seSBmb3Igb25jaGFpbiBtdWx0aXNpZyB3YWxsZXRzLCBUU1Mga2V5IGRlcml2YXRpb24gaGFwcGVucyBkdXJpbmcgdGhlIHNpZ25pbmcgcHJvY2Vzc1xuICAgIGlmIChcbiAgICAgIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGFyYW1zLmtleWNoYWluICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmFtcy5rZXljaGFpbi5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMubXVsdGlzaWdUeXBlKCkgPT09ICdvbmNoYWluJ1xuICAgICkge1xuICAgICAgcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCA9IHBhcmFtcy5rZXljaGFpbi5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkO1xuICAgIH1cblxuICAgIGlmICh1c2VyUHJ2ICYmIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQpIHtcbiAgICAgIC8vIHRoZSBkZXJpdmF0aW9uIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiBhIGtleSBhbHJlYWR5IGV4aXN0c1xuICAgICAgY29uc3QgZGVyaXZhdGlvbiA9IHRoaXMuYmFzZUNvaW4uZGVyaXZlS2V5V2l0aFNlZWQoeyBrZXk6IHVzZXJQcnYsIHNlZWQ6IHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQgfSk7XG4gICAgICB1c2VyUHJ2ID0gZGVyaXZhdGlvbi5rZXk7XG4gICAgfSBlbHNlIGlmICghdXNlclBydikge1xuICAgICAgaWYgKCF1c2VyS2V5Y2hhaW4gfHwgdHlwZW9mIHVzZXJLZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbiBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgdXNlckVuY3J5cHRlZFBydiA9IHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnY7XG4gICAgICBpZiAoIXVzZXJFbmNyeXB0ZWRQcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbiBkb2VzIG5vdCBoYXZlIHByb3BlcnR5IGVuY3J5cHRlZFBydicpO1xuICAgICAgfVxuICAgICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldFBhc3NwaHJhc2UgcHJvcGVydHkgbWlzc2luZycpO1xuICAgICAgfVxuICAgICAgdXNlclBydiA9IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXkodGhpcy5iaXRnbywgdXNlcktleWNoYWluLCBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSk7XG4gICAgICBpZiAoIXVzZXJQcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gZGVjcnlwdCB1c2VyIGtleWNoYWluJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1c2VyUHJ2O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkIGZyb20gQml0R28sIHZhbGlkYXRlIGl0LCBhbmQgdGhlbiBkZWNyeXB0IHRoZSB1c2VyIGtleSBhbmQgc2lnbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgcHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICBpZiAocGFyYW1zLmVpcDE1NTkgJiYgcGFyYW1zLmdhc1ByaWNlKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdPbmx5IG9uZSBvZiBwYXJhbXMuZWlwMTU1OSBhbmQgcGFyYW1zLmdhc1ByaWNlIG1heSBiZSBzcGVjaWZpZWQnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnYm90aF9nYXNQcmljZV9hbmRfZWlwMTU1OWdhc01vZGVsX3NwZWNpZmllZCc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnByZWJ1aWxkVHggJiYgcGFyYW1zLnJlY2lwaWVudHMpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ09ubHkgb25lIG9mIHByZWJ1aWxkVHggYW5kIHJlY2lwaWVudHMgbWF5IGJlIHNwZWNpZmllZCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICdib3RoX3ByZWJ1aWxkdHhfYW5kX3JlY2lwaWVudHNfc3BlY2lmaWVkJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVjaXBpZW50cyAmJiAhQXJyYXkuaXNBcnJheShwYXJhbXMucmVjaXBpZW50cykpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2V4cGVjdGluZyByZWNpcGllbnRzIGFycmF5Jyk7XG4gICAgICBlcnJvci5jb2RlID0gJ3JlY2lwaWVudHNfbm90X2FycmF5JztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChfLmlzQXJyYXkodGhpcy5fcGVybWlzc2lvbnMpICYmICF0aGlzLl9wZXJtaXNzaW9ucy5pbmNsdWRlcygnc3BlbmQnKSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignbm8gc3BlbmQgcGVybWlzc2lvbiBvbiB0aGlzIHdhbGxldCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICd1c2VyX25vdF9hbGxvd2VkX3RvX3NwZW5kX2Zyb21fd2FsbGV0JztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVjZWl2ZUFkZHJlc3MgJiYgKHBhcmFtcy50eXBlID09PSAndHJhbnNmZXInIHx8IHBhcmFtcy50eXBlID09PSAndHJhbnNmZXJUb2tlbicpKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKGBjYW5ub3QgdXNlIHJlY2VpdmUgYWRkcmVzcyBmb3IgVFNTIHRyYW5zYWN0aW9ucyBvZiB0eXBlICR7cGFyYW1zLnR5cGV9YCk7XG4gICAgICBlcnJvci5jb2RlID0gJ3JlY2VpdmVfYWRkcmVzc19ub3RfYWxsb3dlZF9mb3JfdHNzX3dpdGhkcmF3YWxzJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVjaXBpZW50cyAmJiAocGFyYW1zLnR5cGUgPT09ICdmaWxsTm9uY2UnIHx8IHBhcmFtcy50eXBlID09PSAnYWNjZWxlcmF0aW9uJykpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoYGNhbm5vdCBwcm92aWRlIHJlY2lwaWVudHMgZm9yIHRyYW5zYWN0aW9uIHR5cGUgJHtwYXJhbXMudHlwZX1gKTtcbiAgICAgIGVycm9yLmNvZGUgPSAncmVjaXBpZW50c19ub3RfYWxsb3dlZF9mb3JfZmlsbG5vbmNlX2FuZF9hY2NlbGVyYXRpb25fdHhfdHlwZSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5hcGlWZXJzaW9uKSB7XG4gICAgICB2YWxpZGF0ZVR4UmVxdWVzdEFwaVZlcnNpb24odGhpcywgcGFyYW1zLmFwaVZlcnNpb24pO1xuICAgIH1cblxuICAgIC8vIERvaW5nIGEgc2FuaXR5IGNoZWNrIGZvciBwYXNzd29yZCBoZXJlIHRvIGF2b2lkIGRvaW5nIGZ1cnRoZXIgd29yayBpZiB3ZSBrbm93IGl0J3Mgd3JvbmdcbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmdldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZSh7XG4gICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICBjdXN0b21TaWduaW5nRnVuY3Rpb246IHBhcmFtcy5jdXN0b21TaWduaW5nRnVuY3Rpb24sXG4gICAgfSk7XG5cbiAgICBsZXQgdHhQcmVidWlsZFF1ZXJ5OiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQgfCBzdHJpbmc+O1xuICAgIGlmIChpc1ByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQocGFyYW1zLnByZWJ1aWxkVHgpICYmIHBhcmFtcy5wcmVidWlsZFR4LmJ1aWxkUGFyYW1zPy5wcmV2aWV3KSB7XG4gICAgICAvLyBJZiB3ZSBwcmVidWlsdCB0aGUgdHhSZXF1ZXN0IHdpdGggcHJldmlldz10cnVlLCB0aGVuIHdlIHNob3VsZCByZWJ1aWxkIHdpdGggcHJldmlldz1mYWxzZSB0byBwZXJzaXN0IHRoZSByZXF1ZXN0XG4gICAgICB0eFByZWJ1aWxkUXVlcnkgPSB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb24oe1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIC4uLnsgLi4ucGFyYW1zLnByZWJ1aWxkVHguYnVpbGRQYXJhbXMsIHByZXZpZXc6IGZhbHNlIH0sXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHhQcmVidWlsZFF1ZXJ5ID0gcGFyYW1zLnByZWJ1aWxkVHggPyBQcm9taXNlLnJlc29sdmUocGFyYW1zLnByZWJ1aWxkVHgpIDogdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgLy8gdGhlIHByZWJ1aWxkIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHByb3ZpZGluZyBhbiBleHBsaWNpdCB0eFxuICAgIGNvbnN0IHR4UHJlYnVpbGQgPSAoYXdhaXQgdHhQcmVidWlsZFF1ZXJ5KSBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYmFzZUNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczogeyAuLi50eFByZWJ1aWxkLmJ1aWxkUGFyYW1zLCAuLi5wYXJhbXMgfSxcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgd2FsbGV0OiB0aGlzLFxuICAgICAgICB2ZXJpZmljYXRpb246IHBhcmFtcy52ZXJpZmljYXRpb24gPz8ge30sXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgIHdhbGxldFR5cGU6IHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd0cmFuc2FjdGlvbiBwcmVidWlsZCBmYWlsZWQgbG9jYWwgdmFsaWRhdGlvbjonLCBlLm1lc3NhZ2UpO1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgJ3RyYW5zYWN0aW9uIHBhcmFtczonLFxuICAgICAgICBfLm9taXQocGFyYW1zLCBbJ2tleWNoYWluJywgJ3BydicsICdwYXNzcGhyYXNlJywgJ3dhbGxldFBhc3NwaHJhc2UnLCAna2V5JywgJ3dhbGxldCddKVxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3RyYW5zYWN0aW9uIHByZWJ1aWxkOicsIHR4UHJlYnVpbGQpO1xuICAgICAgY29uc29sZS50cmFjZShlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIC8vIHBhc3Mgb3VyIHRocmVlIGtleXNcbiAgICBjb25zdCBzaWduaW5nUGFyYW1zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgdHhQcmVidWlsZCxcbiAgICAgIHdhbGxldDogdGhpcyxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICB9O1xuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAnb25jaGFpbicpIHtcbiAgICAgIHNpZ25pbmdQYXJhbXMucHVicyA9IGtleWNoYWlucy5tYXAoKGspID0+IHtcbiAgICAgICAgYXNzZXJ0KGsucHViKTtcbiAgICAgICAgcmV0dXJuIGsucHViO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHNpZ25pbmdQYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCkge1xuICAgICAgYXNzZXJ0KHRoaXMudHNzVXRpbHMsICd0c3NVdGlscyBtdXN0IGJlIGRlZmluZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgICBjb25zdCB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzLmdldFR4UmVxdWVzdChzaWduaW5nUGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQsIHBhcmFtcy5yZXFJZCk7XG4gICAgICBpZiAodGhpcy50c3NVdGlscy5pc1BlbmRpbmdBcHByb3ZhbFR4UmVxdWVzdEZ1bGwodHhSZXF1ZXN0KSkge1xuICAgICAgICByZXR1cm4gdHhSZXF1ZXN0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24oc2lnbmluZ1BhcmFtcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdpbnN1ZmZpY2llbnQgZnVuZHMnKSkge1xuICAgICAgICBlcnJvci5jb2RlID0gJ2luc3VmZmljaWVudF9mdW5kcyc7XG4gICAgICAgIGVycm9yLndhbGxldEJhbGFuY2VzID0ge1xuICAgICAgICAgIGJhbGFuY2VTdHJpbmc6IHRoaXMuYmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIGNvbmZpcm1lZEJhbGFuY2VTdHJpbmc6IHRoaXMuY29uZmlybWVkQmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIHNwZW5kYWJsZUJhbGFuY2VTdHJpbmc6IHRoaXMuc3BlbmRhYmxlQmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIGJhbGFuY2U6IHRoaXMuYmFsYW5jZSgpLFxuICAgICAgICAgIGNvbmZpcm1lZEJhbGFuY2U6IHRoaXMuY29uZmlybWVkQmFsYW5jZSgpLFxuICAgICAgICAgIHNwZW5kYWJsZUJhbGFuY2U6IHRoaXMuc3BlbmRhYmxlQmFsYW5jZSgpLFxuICAgICAgICB9O1xuICAgICAgICBlcnJvci50eFBhcmFtcyA9IF8ub21pdChwYXJhbXMsIFsna2V5Y2hhaW4nLCAncHJ2JywgJ3Bhc3NwaHJhc2UnLCAnd2FsbGV0UGFzc3BocmFzZScsICdrZXknXSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWNjZWxlcmF0ZSBhIHRyYW5zYWN0aW9uJ3MgY29uZmlybWF0aW9uIHVzaW5nIENoaWxkLVBheXMtRm9yLVBhcmVudCAoQ1BGUCkgb3IgUmVwbGFjZS1CeS1GZWUgKFJCRilcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgYWNjZWxlcmF0ZVRyYW5zYWN0aW9uKHBhcmFtczogQWNjZWxlcmF0ZVRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLnZhbGlkYXRlQWNjZWxlcmF0aW9uUGFyYW1zKHBhcmFtcyk7XG5cbiAgICBwYXJhbXMucmVjaXBpZW50cyA9IFtdO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oe1xuICAgICAgLi4uKGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKSksXG4gICAgICAuLi5CdWlsZFBhcmFtcy5lbmNvZGUocGFyYW1zKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVBY2NlbGVyYXRpb25QYXJhbXMocGFyYW1zOiBBY2NlbGVyYXRlVHJhbnNhY3Rpb25PcHRpb25zKSB7XG4gICAgaWYgKCFwYXJhbXMuY3BmcFR4SWRzICYmICFwYXJhbXMucmJmVHhJZHMpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ211c3QgcGFzcyBjcGZwVHhJZHMgb3IgcmJmVHhJZHMnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnY3BmcHR4aWRzX29yX3JiZnR4aWRzX3JlcXVpcmVkJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuY3BmcFR4SWRzICYmIHBhcmFtcy5yYmZUeElkcykge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignY2Fubm90IHNwZWNpZnkgYm90aCBjcGZwVHhJZHMgYW5kIHJiZlR4SWRzJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2Nhbm5vdF9zcGVjaWZ5X2JvdGhfY3BmcF9hbmRfcmJmX3R4aWRzJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuY3BmcFR4SWRzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlQ3BmcFBhcmFtcyhwYXJhbXMpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmJmVHhJZHMpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVSYmZQYXJhbXMocGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy5yZWNpcGllbnRzKSB8fCBwYXJhbXMucmVjaXBpZW50cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHZhbHVlIGZvciAncmVjaXBpZW50cyc6IG11c3QgYmUgZW1wdHkgYXJyYXkgd2hlbiBzZXRgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlUmJmUGFyYW1zKHBhcmFtczogQWNjZWxlcmF0ZVRyYW5zYWN0aW9uT3B0aW9ucykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMucmJmVHhJZHMpIHx8IHBhcmFtcy5yYmZUeElkcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2V4cGVjdGluZyByYmZUeElkcyB0byBiZSBhbiBhcnJheSBvZiBsZW5ndGggMScpO1xuICAgICAgZXJyb3IuY29kZSA9ICdyYmZ0eGlkc19ub3RfYXJyYXknO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuZmVlTXVsdGlwbGllcikge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignZmVlTXVsdGlwbGllciBtdXN0IGJlIHNldCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICdmZWVtdWx0aXBsaWVyX25vdF9zZXQnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5mZWVNdWx0aXBsaWVyIDw9IDEpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2ZlZU11bHRpcGxpZXIgbXVzdCBiZSBhIGdyZWF0ZXIgdGhhbiAxJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2ZlZW11bHRpcGxpZXJfZ3JlYXRlcl90aGFuX29uZSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlQ3BmcFBhcmFtcyhwYXJhbXM6IEFjY2VsZXJhdGVUcmFuc2FjdGlvbk9wdGlvbnMpIHtcbiAgICAvLyBUT0RPKEJHLTkzNDkpOiBjaGFuZ2UgdGhlIGxhc3QgY2hlY2sgdG8gPiAwIGFuZCB0aGUgZXJyb3IgbWVzc2FnZSBvbmNlIHBsYXRmb3JtIGFsbG93cyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMgdG9cbiAgICAvLyBiZSBidW1wZWQgaW4gdGhlIHNhbWUgQ1BGUCB0cmFuc2FjdGlvblxuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMuY3BmcFR4SWRzKSB8fCBwYXJhbXMuY3BmcFR4SWRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignZXhwZWN0aW5nIGNwZnBUeElkcyB0byBiZSBhbiBhcnJheSBvZiBsZW5ndGggMScpO1xuICAgICAgZXJyb3IuY29kZSA9ICdjcGZwdHhpZHNfbm90X2FycmF5JztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5jcGZwRmVlUmF0ZSkpIHtcbiAgICAgIGlmIChwYXJhbXMubm9DcGZwRmVlUmF0ZSAhPT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdjcGZwRmVlUmF0ZSBtdXN0IGJlIHNldCB1bmxlc3Mgbm9DcGZwRmVlUmF0ZSBpcyBzZXQnKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdjcGZwZmVlcmF0ZV9ub3Rfc2V0JztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLmNwZnBGZWVSYXRlKSB8fCBwYXJhbXMuY3BmcEZlZVJhdGUgPCAwKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2NwZnBGZWVSYXRlIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcicpO1xuICAgICAgICBlcnJvci5jb2RlID0gJ2NwZnBmZWVyYXRlX25vdF9ub25uZWdhdGl2ZV9pbnRlZ2VyJztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLm1heEZlZSkpIHtcbiAgICAgIGlmIChwYXJhbXMubm9NYXhGZWUgIT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignbWF4RmVlIG11c3QgYmUgc2V0IHVubGVzcyBub01heEZlZSBpcyBzZXQnKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdtYXhmZWVfbm90X3NldCc7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5tYXhGZWUpIHx8IHBhcmFtcy5tYXhGZWUgPCAwKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ21heEZlZSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdtYXhmZWVfbm90X25vbm5lZ2F0aXZlX2ludGVnZXInO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0IGEgaGFsZi1zaWduZWQgdHJhbnNhY3Rpb24gdG8gQml0R29cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHR4SGV4OiB0cmFuc2FjdGlvbiBoZXggdG8gc3VibWl0XG4gICAqIC0gaGFsZlNpZ25lZDogb2JqZWN0IGNvbnRhaW5pbmcgdHJhbnNhY3Rpb24gKHR4SGV4IG9yIHR4QmFzZTY0KSB0byBzdWJtaXRcbiAgICogQHBhcmFtIHJlcUlkIC0gcmVxdWVzdCB0cmFjZXIgcmVxdWVzdCBpZFxuICAgKi9cbiAgYXN5bmMgc3VibWl0VHJhbnNhY3Rpb24ocGFyYW1zOiBTdWJtaXRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSwgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcik6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnb3RwJywgJ3R4SGV4JywgJ3R4UmVxdWVzdElkJ10pO1xuICAgIGNvbnN0IGhhc1R4SGV4ID0gISFwYXJhbXMudHhIZXg7XG4gICAgY29uc3QgaGFzSGFsZlNpZ25lZCA9ICEhcGFyYW1zLmhhbGZTaWduZWQ7XG5cbiAgICBpZiAocGFyYW1zLnR4UmVxdWVzdElkICYmIChoYXNUeEhleCB8fCBoYXNIYWxmU2lnbmVkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBleGFjdGx5IG9uZSBvZiB0eFJlcXVlc3RJZCwgdHhIZXgsIG9yIGhhbGZTaWduZWQnKTtcbiAgICB9IGVsc2UgaWYgKCFwYXJhbXMudHhSZXF1ZXN0SWQgJiYgKChoYXNUeEhleCAmJiBoYXNIYWxmU2lnbmVkKSB8fCAoIWhhc1R4SGV4ICYmICFoYXNIYWxmU2lnbmVkKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzdXBwbHkgZWl0aGVyIHR4SGV4IG9yIGhhbGZTaWduZWQsIGJ1dCBub3QgYm90aCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24ocGFyYW1zLCByZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBjb2lucyB0byBhIHJlY2lwaWVudFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzcyAtIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzXG4gICAqIEBwYXJhbSBwYXJhbXMuYW1vdW50IC0gdGhlIGFtb3VudCBpbiBzYXRvc2hpcy93ZWkvYmFzZSB2YWx1ZSB0byBiZSBzZW50XG4gICAqIEBwYXJhbSBwYXJhbXMubWVzc2FnZSAtIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYXR0YWNoIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMuZGF0YSAtIFtFdGhlcmV1bSBTcGVjaWZpY10gb3B0aW9uYWwgZGF0YSB0byBwYXNzIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMuY3VzdG9kaWFuVHJhbnNhY3Rpb25JZCAtIFtFdGhlcmV1bS9NTUkgU3BlY2lmaWNdIGlkIG9mIHRyYW5zYWN0aW9uIGNyZWF0ZWQgdmlhIG1ldGFtYXNrXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSBwYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXkgb24gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtcy5wcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0sIGlmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gdGhlIG1pbmltdW0gY29uZmlybWF0aW9uIHRocmVzaG9sZCBmb3IgaW5wdXRzXG4gICAqIEBwYXJhbSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gd2hldGhlciB0byBlbmZvcmNlIG1pbkNvbmZpcm1zIGZvciBjaGFuZ2UgaW5wdXRzXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2VuZChwYXJhbXM6IFNlbmRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbJ21lc3NhZ2UnLCAnZGF0YSddKTtcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hbW91bnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIGFtb3VudCcpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29pbiA9IHRoaXMuYmFzZUNvaW47XG5cbiAgICBjb25zdCBhbW91bnQgPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5hbW91bnQpO1xuXG4gICAgY29uc3QgaXNBbW91bnROZWdhdGl2ZSA9IGFtb3VudC5pc05lZ2F0aXZlKCk7XG4gICAgY29uc3QgaXNBbW91bnRaZXJvID0gYW1vdW50LmlzWmVybygpO1xuICAgIGNvbnN0IGlzQW1vdW50RGVjaW1hbCA9ICFhbW91bnQuaXNJbnRlZ2VyKCk7XG5cbiAgICBfLnNvbWUoW2lzQW1vdW50TmVnYXRpdmUsICFjb2luLnZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpICYmIGlzQW1vdW50WmVybywgaXNBbW91bnREZWNpbWFsXSwgKGNvbmRpdGlvbikgPT4ge1xuICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFtb3VudCAtIEludGVnZXIgZ3JlYXRlciB0aGFuIHplcm8gb3IgbnVtZXJpYyBzdHJpbmcgZXhwZWN0ZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHJlY2lwaWVudHM6IFNlbmRNYW55T3B0aW9uc1sncmVjaXBpZW50cyddID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBwYXJhbXMuYW1vdW50LFxuICAgICAgfSxcbiAgICBdO1xuICAgIGlmIChwYXJhbXMudG9rZW5OYW1lKSB7XG4gICAgICByZWNpcGllbnRzWzBdLnRva2VuTmFtZSA9IHBhcmFtcy50b2tlbk5hbWU7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZGF0YSAmJiBjb2luLnRyYW5zYWN0aW9uRGF0YUFsbG93ZWQoKSkge1xuICAgICAgcmVjaXBpZW50c1swXS5kYXRhID0gcGFyYW1zLmRhdGE7XG4gICAgfVxuICAgIGNvbnN0IHNlbmRNYW55T3B0aW9uczogU2VuZE1hbnlPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zLCB7IHJlY2lwaWVudHMgfSk7XG4gICAgcmV0dXJuIHRoaXMuc2VuZE1hbnkoc2VuZE1hbnlPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGFuIEVSQy03MjEgTkZUIG9yIEVSQy0xMTU1IE5GVChzKS5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBjb25zdHJ1Y3RzIHRoZSBhcHByb3ByaWF0ZSBjYWxsIGRhdGEgZm9yIGFuIEVSQy03MjEvMTE1NSB0b2tlbiB0cmFuc2ZlcixcbiAgICogYW5kIGNhbGxzIHRoZSB0b2tlbiBjb250cmFjdCB3aXRoIHRoZSBkYXRhLCBhbmQgYW1vdW50IDAuIFRoaXMgdHJhbnNhY3Rpb24gd2lsbCBhbHdheXMgcHJvZHVjZVxuICAgKiBhIHBlbmRpbmcgYXBwcm92YWwuXG4gICAqXG4gICAqIEBwYXJhbSBzZW5kT3B0aW9ucyBPcHRpb25zIHRvIHNwZWNpZnkgaG93IHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgc2VudC5cbiAgICogQHBhcmFtIHNlbmROZnRPcHRpb25zIE9wdGlvbnMgdG8gc3BlY2lmeSB0aGUgTkZUKHMpIHRvIGJlIHNlbnQuXG4gICAqXG4gICAqIEByZXR1cm4gQSBwZW5kaW5nIGFwcHJvdmFsIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBhc3luYyBzZW5kTmZ0KHNlbmRPcHRpb25zOiBTZW5kTkZUT3B0aW9ucywgc2VuZE5mdE9wdGlvbnM6IE5GVFRyYW5zZmVyT3B0aW9ucyk6IFByb21pc2U8U2VuZE5GVFJlc3VsdD4ge1xuICAgIGNvbnN0IG5mdENvbGxlY3Rpb25zID0gYXdhaXQgdGhpcy5nZXROZnRCYWxhbmNlcygpO1xuICAgIGNvbnN0IHsgdG9rZW5Db250cmFjdEFkZHJlc3MsIHJlY2lwaWVudEFkZHJlc3MsIHR5cGUgfSA9IHNlbmROZnRPcHRpb25zO1xuXG4gICAgY29uc3QgbmZ0QmFsYW5jZSA9IG5mdENvbGxlY3Rpb25zLmZpbmQoKGMpID0+IGMubWV0YWRhdGEudG9rZW5Db250cmFjdEFkZHJlc3MgPT09IHRva2VuQ29udHJhY3RBZGRyZXNzKTtcbiAgICBpZiAoIW5mdEJhbGFuY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29sbGVjdGlvbiBub3QgZm91bmQgZm9yIHRva2VuIGNvbnRyYWN0ICR7dG9rZW5Db250cmFjdEFkZHJlc3N9YCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLmlzVmFsaWRBZGRyZXNzKHJlY2lwaWVudEFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVjaXBpZW50IGFkZHJlc3MgJHtyZWNpcGllbnRBZGRyZXNzfWApO1xuICAgIH1cbiAgICBjb25zdCBiYXNlQWRkcmVzcyA9IHRoaXMuY29pblNwZWNpZmljKCk/LmJhc2VBZGRyZXNzIHx8IHRoaXMuY29pblNwZWNpZmljKCk/LnJvb3RBZGRyZXNzO1xuICAgIGlmICghYmFzZUFkZHJlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBiYXNlIGFkZHJlc3MgZm9yIHdhbGxldCcpO1xuICAgIH1cblxuICAgIGlmIChuZnRCYWxhbmNlLnR5cGUgIT09IHR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3BlY2lmaWVkIE5GVCB0eXBlICR7dHlwZX0gZG9lcyBub3QgbWF0Y2ggY29sbGVjdGlvbiB0eXBlICR7bmZ0QmFsYW5jZS50eXBlfWApO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc2VuZE5mdE9wdGlvbnMudHlwZSkge1xuICAgICAgY2FzZSAnRVJDNzIxJzoge1xuICAgICAgICBpZiAoIW5mdEJhbGFuY2UuY29sbGVjdGlvbnNbc2VuZE5mdE9wdGlvbnMudG9rZW5JZF0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVG9rZW4gJHtzZW5kTmZ0T3B0aW9ucy50b2tlbklkfSBub3QgZm91bmQgaW4gY29sbGVjdGlvbiAke3Rva2VuQ29udHJhY3RBZGRyZXNzfSBvciBkb2VzIG5vdCBoYXZlIGEgc3BlbmRhYmxlIGJhbGFuY2VgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJhc2VDb2luLmJ1aWxkTmZ0VHJhbnNmZXJEYXRhKHsgLi4uc2VuZE5mdE9wdGlvbnMsIGZyb21BZGRyZXNzOiBiYXNlQWRkcmVzcyB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZE1hbnkoe1xuICAgICAgICAgIC4uLnNlbmRPcHRpb25zLFxuICAgICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogc2VuZE5mdE9wdGlvbnMudG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VSQzExNTUnOiB7XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBzZW5kTmZ0T3B0aW9ucy5lbnRyaWVzO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICBpZiAoIW5mdEJhbGFuY2UuY29sbGVjdGlvbnNbZW50cnkudG9rZW5JZF0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFRva2VuICR7ZW50cnkudG9rZW5JZH0gbm90IGZvdW5kIGluIGNvbGxlY3Rpb24gJHtzZW5kTmZ0T3B0aW9ucy50b2tlbkNvbnRyYWN0QWRkcmVzc30gb3IgZG9lcyBub3QgaGF2ZSBhIHNwZW5kYWJsZSBiYWxhbmNlYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5mdEJhbGFuY2UuY29sbGVjdGlvbnNbZW50cnkudG9rZW5JZF0gPCBlbnRyeS5hbW91bnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYEFtb3VudCAke2VudHJ5LmFtb3VudH0gZXhjZWVkcyBzcGVuZGFibGUgYmFsYW5jZSBvZiAke25mdEJhbGFuY2UuY29sbGVjdGlvbnNbZW50cnkudG9rZW5JZF19IGZvciB0b2tlbiAke1xuICAgICAgICAgICAgICAgIGVudHJ5LnRva2VuSWRcbiAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuYmFzZUNvaW4uYnVpbGROZnRUcmFuc2ZlckRhdGEoeyAuLi5zZW5kTmZ0T3B0aW9ucywgZnJvbUFkZHJlc3M6IGJhc2VBZGRyZXNzIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kTWFueSh7XG4gICAgICAgICAgLi4uc2VuZE9wdGlvbnMsXG4gICAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiBzZW5kTmZ0T3B0aW9ucy50b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICAgICAgICAgICAgYW1vdW50OiAnMCcsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRva2VuVHlwZS5ESUdJVEFMX0FTU0VUOiB7XG4gICAgICAgIGlmICghbmZ0QmFsYW5jZS5jb2xsZWN0aW9uc1tzZW5kTmZ0T3B0aW9ucy50b2tlbklkXSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUb2tlbiAke3NlbmROZnRPcHRpb25zLnRva2VuSWR9IG5vdCBmb3VuZCBpbiBjb2xsZWN0aW9uICR7dG9rZW5Db250cmFjdEFkZHJlc3N9IG9yIGRvZXMgbm90IGhhdmUgYSBzcGVuZGFibGUgYmFsYW5jZWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRva2VuRGF0YTogVG9rZW5UcmFuc2ZlclJlY2lwaWVudFBhcmFtcyA9IHtcbiAgICAgICAgICB0b2tlblR5cGU6IHNlbmROZnRPcHRpb25zLnR5cGUsXG4gICAgICAgICAgdG9rZW5RdWFudGl0eTogJzEnLCAvLyBUaGlzIE5GVCBzdGFuZGFyZCB3aWxsIGFsd2F5cyBoYXZlIHF1YW50aXR5IG9mIDFcbiAgICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICAgICAgICB0b2tlbklkOiBzZW5kTmZ0T3B0aW9ucy50b2tlbklkLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kTWFueSh7XG4gICAgICAgICAgLi4uc2VuZE9wdGlvbnMsXG4gICAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiByZWNpcGllbnRBZGRyZXNzLFxuICAgICAgICAgICAgICBhbW91bnQ6ICcxJywgLy8gdGhlIGFtb3VudCBuZWVkcyB0byBiZSBub24temVybyBmb3IgdGhlIHRyYW5zYWN0aW9uIHRvIGJlIHZhbGlkLCBpdCBpcyBpZ25vcmVkXG4gICAgICAgICAgICAgIHRva2VuRGF0YSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgbW9uZXkgdG8gbXVsdGlwbGUgcmVjaXBpZW50c1xuICAgKiAxLiBHZXRzIHRoZSB1c2VyIGtleWNoYWluIGJ5IGNoZWNraW5nIHRoZSB3YWxsZXQgZm9yIGEga2V5IHdoaWNoIGhhcyBhbiBlbmNyeXB0ZWQgcHJ2XG4gICAqIDIuIERlY3J5cHRzIHVzZXIga2V5XG4gICAqIDMuIENyZWF0ZXMgdGhlIHRyYW5zYWN0aW9uIHdpdGggZGVmYXVsdCBmZWVcbiAgICogNC4gU2lnbnMgdHJhbnNhY3Rpb24gd2l0aCBkZWNyeXB0ZWQgdXNlciBrZXlcbiAgICogNS4gU2VuZHMgdGhlIHRyYW5zYWN0aW9uIHRvIEJpdEdvXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXNcbiAgICogQHBhcmFtIHt7YWRkcmVzczogc3RyaW5nLCBhbW91bnQ6IHN0cmluZ319IHBhcmFtcy5yZWNpcGllbnRzIC0gbGlzdCBvZiByZWNpcGllbnRzIGFuZCBuZWNlc3NhcnkgcmVjaXBpZW50IGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtQmxvY2tzIC0gRXN0aW1hdGVzIHRoZSBhcHByb3hpbWF0ZSBmZWUgcGVyIGtpbG9ieXRlIG5lY2Vzc2FyeSBmb3IgYSB0cmFuc2FjdGlvbiBjb25maXJtYXRpb24gd2l0aGluIG51bUJsb2NrcyBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gdGhlIGRlc2lyZWQgZmVlUmF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGluIHNhdG90aGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIEVuZm9yY2VzIG1pbkNvbmZpcm1zIG9uIGNoYW5nZSBpbnB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cyAtIFRoZSBkZXNpcmVkIGNvdW50IG9mIHVuc3BlbnRzIGluIHRoZSB3YWxsZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5tZXNzYWdlIC0gb3B0aW9uYWwgbWVzc2FnZSB0byBhdHRhY2ggdG8gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5taW5WYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBzbWFsbGVyIHRoYW4gdGhpcyBhbW91bnQgb2Ygc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBsYXJnZXIgdGhhbiB0aGlzIGFtb3VudCBvZiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnNlcXVlbmNlSWQgLSBUaGUgc2VxdWVuY2UgSUQgb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGFzdExlZGdlclNlcXVlbmNlIC0gQWJzb2x1dGUgbWF4IGxlZGdlciB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIGluLCB3aGVyZWFmdGVyIGl0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGVkZ2VyU2VxdWVuY2VEZWx0YSAtIFJlbGF0aXZlIGxlZGdlciBoZWlnaHQgKGluIHJlbGF0aW9uIHRvIHRoZSBjdXJyZW50IGxlZGdlcikgdGhhdCB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIGluLCB3aGVyZWFmdGVyIGl0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZ2FzUHJpY2UgLSBDdXN0b20gZ2FzIHByaWNlIHRvIGJlIHVzZWQgZm9yIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLm5vU3BsaXRDaGFuZ2UgLSBTZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIGF1dG9tYXRpYyBjaGFuZ2Ugc3BsaXR0aW5nIGZvciBwdXJwb3NlcyBvZiB1bnNwZW50IG1hbmFnZW1lbnRcbiAgICogQHBhcmFtIHtBcnJheX0gcGFyYW1zLnVuc3BlbnRzIC0gVGhlIHVuc3BlbnRzIHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb24uIEVhY2ggdW5zcGVudCBzaG91bGQgYmUgaW4gdGhlIGZvcm0gcHJldlR4SWQ6bk91dHB1dFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmNvbW1lbnQgLSBBbnkgYWRkaXRpb25hbCBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5vdHAgLSBUd28gZmFjdG9yIGF1dGggY29kZSB0byBlbmFibGUgc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5jaGFuZ2VBZGRyZXNzIC0gU3BlY2lmaWVzIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgY2hhbmdlIG91dHB1dFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5pbnN0YW50IC0gU2VuZCB0aGlzIHRyYW5zYWN0aW9uIHVzaW5nIGNvaW4tc3BlY2lmaWMgaW5zdGFudCBzZW5kaW5nIG1ldGhvZCAoaWYgYXZhaWxhYmxlKVxuICAgKiBAcGFyYW0ge3t2YWx1ZTogU3RyaW5nLCB0eXBlOiBTdHJpbmd9fSBwYXJhbXMubWVtbyAtIE1lbW8gdG8gdXNlIGluIHRyYW5zYWN0aW9uIChzdXBwb3J0ZWQgYnkgU3RlbGxhcilcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50eXBlIC0gVHlwZSBvZiB0aGUgdHJhbnNhY3Rpb24gKGUuZy4gdHJ1c3RsaW5lKVxuICAgKiBAcGFyYW0ge3t0b2tlbjogcGFyYW1zLCBhY3Rpb246IFN0cmluZywgbGltaXQ6IFN0cmluZ31bXX0gb3B0aW9ucy50cnVzdGxpbmVzIC0gQXJyYXkgb2YgdHJ1c3RsaW5lcyB0byBtYW5hZ2UgKHN1cHBvcnRlZCBieSBTdGVsbGFyKVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHNlbmRNYW55KHBhcmFtczogU2VuZE1hbnlPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ2NvbW1lbnQnLCAnb3RwJ10pO1xuICAgIGRlYnVnKCdzZW5kTWFueSBjYWxsZWQnKTtcbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHBhcmFtcy5yZXFJZCA9IHJlcUlkO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgY29uc3QgY29pbiA9IHRoaXMuYmFzZUNvaW47XG4gICAgaWYgKF8uaXNPYmplY3QocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgICBwYXJhbXMucmVjaXBpZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWNpcGllbnQpIHtcbiAgICAgICAgY29pbi5jaGVja1JlY2lwaWVudChyZWNpcGllbnQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZW5kTWFueVR4UmVxdWVzdHMocGFyYW1zKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbLi4udGhpcy5wcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zKCksICdjb21tZW50JywgJ290cCcsICdob3AnXSk7XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0LnR5cGUgPT09ICdjdXN0b2RpYWwnKSB7XG4gICAgICBjb25zdCBleHRyYVBhcmFtcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uZ2V0RXh0cmFQcmVidWlsZFBhcmFtcyhPYmplY3QuYXNzaWduKHBhcmFtcywgeyB3YWxsZXQ6IHRoaXMgfSkpO1xuICAgICAgT2JqZWN0LmFzc2lnbihzZWxlY3RQYXJhbXMsIGV4dHJhUGFyYW1zKTtcbiAgICAgIHJldHVybiB0aGlzLmluaXRpYXRlVHJhbnNhY3Rpb24oc2VsZWN0UGFyYW1zLCByZXFJZCk7XG4gICAgfVxuXG4gICAgY29uc3QgaGFsZlNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpO1xuICAgIGNvbnN0IGV4dHJhUGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5nZXRFeHRyYVByZWJ1aWxkUGFyYW1zKE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7IHdhbGxldDogdGhpcyB9KSk7XG4gICAgY29uc3QgZmluYWxUeFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBoYWxmU2lnbmVkVHJhbnNhY3Rpb24sIHNlbGVjdFBhcmFtcywgZXh0cmFQYXJhbXMpO1xuICAgIHJldHVybiB0aGlzLnNlbmRUcmFuc2FjdGlvbihmaW5hbFR4UGFyYW1zLCByZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3ZlciBhbiB1bnN1cHBvcnRlZCB0b2tlbiBmcm9tIGEgQml0R28gbXVsdGlzaWcgd2FsbGV0XG4gICAqIHBhcmFtcyBhcmUgdmFsaWRhdGVkIGluIEV0aC5wcm90b3R5cGUucmVjb3ZlclRva2VuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzcyB0aGUgY29udHJhY3QgYWRkcmVzcyBvZiB0aGUgdW5zdXBwb3J0ZWQgdG9rZW5cbiAgICogQHBhcmFtIHBhcmFtcy5yZWNpcGllbnQgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgcmVjb3ZlcmVkIHRva2VucyBzaG91bGQgYmUgc2VudCB0b1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgdGhlIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSBwYXJhbXMucHJ2IHRoZSB4cHJ2XG4gICAqL1xuICBhc3luYyByZWNvdmVyVG9rZW4ocGFyYW1zOiBSZWNvdmVyVG9rZW5PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnZXRoJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0b2tlbiByZWNvdmVyeSBvbmx5IHN1cHBvcnRlZCBmb3IgZXRoIHdhbGxldHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHRva2VuQ29udHJhY3RBZGRyZXNzLCByZWNpcGllbnQgfSA9IHBhcmFtcztcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHRva2VuQ29udHJhY3RBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgdG9rZW5Db250cmFjdEFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChyZWNpcGllbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciByZWNpcGllbnQnKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWNvdmVyVG9rZW5PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7IHRva2VuQ29udHJhY3RBZGRyZXNzLCByZWNpcGllbnQgfSwgcGFyYW1zLCB7IHdhbGxldDogdGhpcyB9KTtcbiAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5yZWNvdmVyVG9rZW4ocmVjb3ZlclRva2VuT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYW5zYWN0aW9uIG1ldGFkYXRhIGZvciB0aGUgb2xkZXN0IHRyYW5zYWN0aW9uIHRoYXQgaXMgc3RpbGwgcGVuZGluZyBvciBhdHRlbXB0ZWRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBPYmplY3Qgd2l0aCB0eGlkLCB3YWxsZXRJZCwgdHgsIGFuZCBmZWUgKGlmIHN1cHBvcnRlZCBmb3IgY29pbilcbiAgICovXG4gIGFzeW5jIGdldEZpcnN0UGVuZGluZ1RyYW5zYWN0aW9uKHBhcmFtczogUmVjb3JkPHN0cmluZywgbmV2ZXI+ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBpbnRlcm5hbC5nZXRGaXJzdFBlbmRpbmdUcmFuc2FjdGlvbih7IHdhbGxldElkOiB0aGlzLmlkKCkgfSwgdGhpcy5iYXNlQ29pbiwgdGhpcy5iaXRnbyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBmZWUgb24gdGhlIHBlbmRpbmcgdHJhbnNhY3Rpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gdHhpZCB0byB0aGUgZ2l2ZW4gbmV3IGZlZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudHhpZCBUaGUgdHJhbnNhY3Rpb24gSWQgY29ycmVzcG9uZGluZyB0byB0aGUgdHJhbnNhY3Rpb24gd2hvc2UgZmVlIGlzIHRvIGJlIGNoYW5nZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuZmVlXSBPcHRpb25hbCAtIFRoZSBuZXcgZmVlIHRvIGFwcGx5IHRvIHRoZSBkZW5vdGVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zLmVpcDE1NTldIE9wdGlvbmFsIC0gdGhlIGVpcDE1NTkgdmFsdWVzIHRvIGFwcGx5IHRvIHRoZSBkZW5vdGVkIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSB0cmFuc2FjdGlvbiBJRCBvZiB0aGUgbmV3IHRyYW5zYWN0aW9uIHRoYXQgY29udGFpbnMgdGhlIG5ldyBmZWUgcmF0ZVxuICAgKi9cbiAgYXN5bmMgY2hhbmdlRmVlKHBhcmFtczogQ2hhbmdlRmVlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAocGFyYW1zLmZlZSkgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd0eGlkJywgJ2ZlZSddLCBbXSk7XG4gICAgaWYgKHBhcmFtcy5laXAxNTU5KSBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLmVpcDE1NTksIFsnbWF4RmVlUGVyR2FzJywgJ21heFByaW9yaXR5RmVlUGVyR2FzJ10pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy90eC9jaGFuZ2VGZWUnKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBpbmZvIGZyb20gbWVyY2hhbnQgc2VydmVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgVGhlIHBhcmFtcyBwYXNzZWQgaW50byB0aGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy51cmwgVGhlIFVybCB0byByZXRyaWV2ZSBpbmZvIGZyb21cbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIGluZm8gcmV0dXJuZWQgZnJvbSB0aGUgbWVyY2hhbnQgc2VydmVyXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBnZXRQYXltZW50SW5mbyhwYXJhbXM6IHsgdXJsPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJ10sIFtdKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3BheW1lbnRJbmZvJykpLnF1ZXJ5KHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBqc29uIHBheW1lbnQgcmVzcG9uc2VcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1zIHBhc3NlZCBpbnRvIHRoZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnBheW1lbnRVcmwgLSBUaGUgdXJsIHRvIHNlbmQgdGhlIGZ1bGx5IHNpZ25lZCB0cmFuc2FjdGlvbiB0b1xuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnR4SGV4IC0gVGhlIHRyYW5zYWN0aW9uIGhleCBvZiB0aGUgcGF5bWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLm1lbW8ge1N0cmluZ30gLSBBIG1lbW8gc3VwcGxpZWQgYnkgdGhlIG1lcmNoYW50LCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSB0cmFuc2ZlciBhcyB0aGUgY29tbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmV4cGlyZXMge1N0cmluZ30gLSBJU08gRGF0ZSBmb3JtYXQgb2Ygd2hlbiB0aGUgcGF5bWVudCByZXF1ZXN0IGV4cGlyZXNcbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIGluZm8gcmV0dXJuZWQgZnJvbSB0aGUgbWVyY2hhbnQgc2VydmVyIFBheW1lbnQgQWNrXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBzZW5kUGF5bWVudFJlc3BvbnNlKHBhcmFtczogYW55ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9zZW5kUGF5bWVudCcpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgcG9saWN5IHJ1bGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbmRpdGlvbiBjb25kaXRpb24gb2JqZWN0XG4gICAqIEBwYXJhbSBwYXJhbXMuYWN0aW9uIGFjdGlvbiBvYmplY3RcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBjcmVhdGVQb2xpY3lSdWxlKHBhcmFtczogQ3JlYXRlUG9saWN5UnVsZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCcsICd0eXBlJ10sIFsnbWVzc2FnZSddKTtcblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuY29uZGl0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogY29uZGl0aW9ucyBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwYXJhbWV0ZXI6IGFjdGlvbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvcG9saWN5L3J1bGUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhIHBvbGljeSBydWxlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5jb25kaXRpb24gY29uZGl0aW9uIG9iamVjdFxuICAgKiBAcGFyYW0gcGFyYW1zLmFjdGlvbiBhY3Rpb24gb2JqZWN0XG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2V0UG9saWN5UnVsZShwYXJhbXM6IGFueSA9IHt9KSB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCcsICd0eXBlJ10sIFsnbWVzc2FnZSddKTtcblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuY29uZGl0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogY29uZGl0aW9ucyBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwYXJhbWV0ZXI6IGFjdGlvbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wdXQodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIFBvbGljeSBSdWxlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyByZW1vdmVQb2xpY3lSdWxlKHBhcmFtczogUmVtb3ZlUG9saWN5UnVsZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbJ21lc3NhZ2UnXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyByZW1vdmUocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgY3Jvc3NDaGFpbiBVVFhPc1xuICAgKiBDdXJyZW50bHkgb25seSBmb3IgQVZBWFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnNvdXJjZUNoYWluIHRoZSBzb3VyY2VjaGFpbiB0byBwaWNrIFVUWE9zLCBpZiBub3QgZ2l2ZW4sIHRoZW4gcGljayBmcm9tIGFsbCBhdmFpbGFibGUgY2hhaW5zIFtQLCBDXVxuICAgKi9cbiAgZmV0Y2hDcm9zc0NoYWluVVRYT3MocGFyYW1zOiBGZXRjaENyb3NzQ2hhaW5VVFhPc09wdGlvbnMpOiBQcm9taXNlPENyb3NzQ2hhaW5VVFhPW10+IHtcbiAgICBjb25zdCBxdWVyeSA9IF8ucGljayhwYXJhbXMsIFsnc291cmNlQ2hhaW4nXSk7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvY3Jvc3NDaGFpblVuc3BlbnRzJykpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGEgSlNPTiByZXByZXNlbnRhYmxlIHZlcnNpb24gb2YgdGhpcyB3YWxsZXRcbiAgICovXG4gIHRvSlNPTigpOiBXYWxsZXREYXRhIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHRyYWRpbmcgYWNjb3VudCBmcm9tIHRoaXMgd2FsbGV0XG4gICAqL1xuICB0b1RyYWRpbmdBY2NvdW50KCk6IFRyYWRpbmdBY2NvdW50IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ29mYycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgY29udmVydCBhbiBPZmZjaGFpbiAoT0ZDKSB3YWxsZXQgdG8gYSB0cmFkaW5nIGFjY291bnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUcmFkaW5nQWNjb3VudCh0aGlzLl93YWxsZXQuZW50ZXJwcmlzZSwgdGhpcywgdGhpcy5iaXRnbyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhZGRyZXNzIGJvb2sgZm9yIHRoaXMgd2FsbGV0XG4gICAqL1xuICB0b0FkZHJlc3NCb29rKCk6IElBZGRyZXNzQm9vayB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdvZmMnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBvbmx5IHVzZSBhbiBPZmZjaGFpbiAoT0ZDKSB3YWxsZXQgZm9yIHRoZSBhZGRyZXNzIGJvb2snKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBBZGRyZXNzQm9vayh0aGlzLl93YWxsZXQuZW50ZXJwcmlzZSwgdGhpcy5iaXRnbywgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgc3Rha2luZyB3YWxsZXQgZnJvbSB0aGlzIHdhbGxldFxuICAgKi9cbiAgdG9TdGFraW5nV2FsbGV0KCk6IFN0YWtpbmdXYWxsZXQge1xuICAgIGNvbnN0IGlzRXRoVHNzID1cbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT0gJ2V0aCcgJiYgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8ud2FsbGV0VmVyc2lvblxuICAgICAgICA/IHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWMud2FsbGV0VmVyc2lvbiA+PSAzXG4gICAgICAgIDogZmFsc2U7XG4gICAgcmV0dXJuIG5ldyBTdGFraW5nV2FsbGV0KHRoaXMsIGlzRXRoVHNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBnbyBzdGFraW5nIHdhbGxldCBmcm9tIHRoaXMgd2FsbGV0XG4gICAqL1xuICB0b0dvU3Rha2luZ1dhbGxldCgpOiBHb1N0YWtpbmdXYWxsZXQge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnb2ZjJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBjb252ZXJ0IGFuIE9mZmNoYWluIChPRkMpIHdhbGxldCB0byBhIHN0YWtpbmcgd2FsbGV0Jyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgR29TdGFraW5nV2FsbGV0KHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIGRvd25sb2FkcyBQREYga2V5Y2FyZCBmb3Igd2FsbGV0IChyZXF1aXJlcyByZXNwb25zZSBmcm9tIHdhbGxldHMuZ2VuZXJhdGVXYWxsZXQpXG4gICAqXG4gICAqIE5vdGU6IHRoaXMgaXMgZXhhbXBsZSBjb2RlIGFuZCBpcyBub3QgdGhlIHZlcnNpb24gdXNlZCBvbiBiaXRnby5jb21cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAgICoganNQREYgLSBhbiBpbnN0YW5jZSBvZiB0aGUganNQREYgbGlicmFyeVxuICAgKiAgICogUVJDb2RlIC0gYW4gaW5zdGFuY2Ugb2YgdGhlIFFSaW91cyBsaWJyYXJ5XG4gICAqICAgKiB1c2VyS2V5Y2hhaW4gLSBhIHdhbGxldCdzIHByaXZhdGUgdXNlciBrZXljaGFpblxuICAgKiAgICogYmFja3VwS2V5Y2hhaW4gLSBhIHdhbGxldCdzIHByaXZhdGUgYmFja3VwIGtleWNoYWluXG4gICAqICAgKiBiaXRnb0tleWNoYWluIC0gYSB3YWxsZXQncyBwcml2YXRlIGJpdGdvIGtleWNoYWluXG4gICAqICAgKiBwYXNzcGhyYXNlIC0gdGhlIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqICAgKiBwYXNzY29kZUVuY3J5cHRpb25Db2RlIC0gdGhlIGVuY3J5cHRpb24gc2VjcmV0IHVzZWQgZm9yIEJveCBEXG4gICAqICAgKiBhY3RpdmF0aW9uQ29kZSAtIGEgcmFuZG9tbHkgZ2VuZXJhdGVkIHNpeC1kaWdpdCBhY3RpdmF0aW9uIGNvZGVcbiAgICogICAqIHdhbGxldEtleUlEIC0gdGhlIEtleSBJRCB1c2VkIGZvciBkZXJpdmluZyBhIGNvbGQgd2FsbGV0J3Mgc2lnbmluZyBrZXlcbiAgICogICAqIGJhY2t1cEtleUlEIC0gdGhlIEtleSBJRCB1c2VkIGZvciBkZXJpdmluZyBhIGNvbGQgd2FsbGV0J3MgYmFja3VwIGtleVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGRvd25sb2FkS2V5Y2FyZChwYXJhbXM6IERvd25sb2FkS2V5Y2FyZE9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIGlmICghd2luZG93IHx8ICF3aW5kb3cubG9jYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRvd25sb2FkS2V5Y2FyZCBmdW5jdGlvbiBpcyBvbmx5IGNhbGxhYmxlIHdpdGhpbiBhIGJyb3dzZXIuJyk7XG4gICAgfVxuXG4gICAgLy8gR3JhYiBwYXJhbWV0ZXJzIHdpdGggZGVmYXVsdCBmb3IgYWN0aXZhdGlvbkNvZGVcbiAgICBjb25zdCB7XG4gICAgICBqc1BERixcbiAgICAgIFFSQ29kZSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBwYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgd2FsbGV0S2V5SUQsXG4gICAgICBiYWNrdXBLZXlJRCxcbiAgICAgIGFjdGl2YXRpb25Db2RlID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogOTAwMDAwICsgMTAwMDAwKS50b1N0cmluZygpLFxuICAgIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIWpzUERGIHx8IHR5cGVvZiBqc1BERiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcGFzcyBpbiBhIHZhbGlkIGpzUERGIGluc3RhbmNlJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUga2V5Y2hhaW5zXG4gICAgaWYgKCF1c2VyS2V5Y2hhaW4gfHwgdHlwZW9mIHVzZXJLZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgV2FsbGV0IGtleWNoYWluIG11c3QgaGF2ZSBhICd1c2VyJyBwcm9wZXJ0eWApO1xuICAgIH1cblxuICAgIGlmICghYmFja3VwS2V5Y2hhaW4gfHwgdHlwZW9mIGJhY2t1cEtleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWNrdXAga2V5Y2hhaW4gaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFiaXRnb0tleWNoYWluIHx8IHR5cGVvZiBiaXRnb0tleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaXRnbyBrZXljaGFpbiBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAod2FsbGV0S2V5SUQgJiYgdHlwZW9mIHdhbGxldEtleUlEICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXRLZXlJRCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKGJhY2t1cEtleUlEICYmIHR5cGVvZiBiYWNrdXBLZXlJRCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYmFja3VwS2V5SUQgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGFjdGl2YXRpb24gY29kZSBpZiBwcm92aWRlZFxuICAgIGlmICh0eXBlb2YgYWN0aXZhdGlvbkNvZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjdGl2YXRpb24gQ29kZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGl2YXRpb25Db2RlLmxlbmd0aCAhPT0gNikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY3RpdmF0aW9uIGNvZGUgbXVzdCBiZSBzaXggY2hhcmFjdGVycycpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvaW5TaG9ydE5hbWUgPSB0aGlzLmJhc2VDb2luLnR5cGU7XG4gICAgY29uc3QgY29pbk5hbWUgPSB0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCk7XG4gICAgY29uc3Qgd2FsbGV0TGFiZWwgPSB0aGlzLl93YWxsZXQubGFiZWw7XG5cbiAgICBjb25zdCBkb2MgPSBkcmF3S2V5Y2FyZCh7XG4gICAgICBqc1BERixcbiAgICAgIFFSQ29kZSxcbiAgICAgIGVuY3J5cHQ6IHRoaXMuYml0Z28uZW5jcnlwdCxcbiAgICAgIGNvaW5TaG9ydE5hbWUsXG4gICAgICBjb2luTmFtZSxcbiAgICAgIGFjdGl2YXRpb25Db2RlLFxuICAgICAgd2FsbGV0TGFiZWwsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHdhbGxldEtleUlELFxuICAgICAgYmFja3VwS2V5SUQsXG4gICAgfSk7XG5cbiAgICAvLyBTYXZlIHRoZSBQREYgb24gdGhlIHVzZXIncyBicm93c2VyXG4gICAgZG9jLnNhdmUoYEJpdEdvIEtleWNhcmQgZm9yICR7d2FsbGV0TGFiZWx9LnBkZmApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNldCBvZiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9ucyBmb3IgYSB3YWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogICAgIGNvbnNvbGlkYXRlQWRkcmVzc2VzIC0gdGhlc2UgYXJlIHRoZSBvbi1jaGFpbiByZWNlaXZlIGFkZHJlc3NlcyB3ZSB3YW50IHRvIHBpY2sgYSBjb25zb2xpZGF0aW9uIGFtb3VudCBmcm9tXG4gICAqL1xuICBhc3luYyBidWlsZEFjY291bnRDb25zb2xpZGF0aW9ucyhcbiAgICBwYXJhbXM6IEJ1aWxkQ29uc29saWRhdGlvblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdPiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLmFsbG93c0FjY291bnRDb25zb2xpZGF0aW9ucygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCBhbGxvdyBhY2NvdW50IGNvbnNvbGlkYXRpb25zLmApO1xuICAgIH1cblxuICAgIC8vIFdoaXRlbGlzdCBwYXJhbXMgdG8gYnVpbGQgdHhcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRDb25zb2xpZGF0ZUFjY291bnRQYXJhbXMoKSk7XG4gICAgZGVidWcoJ3ByZWJ1aWxkaW5nIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb246ICVPJywgd2hpdGVsaXN0ZWRQYXJhbXMpO1xuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjb3VsZCByZXR1cm4gMTAwIGJ1aWxkIHRyYW5zYWN0aW9uc1xuICAgIGNvbnN0IGJ1aWxkUmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvY29uc29saWRhdGVBY2NvdW50L2J1aWxkJykpXG4gICAgICAuc2VuZCh3aGl0ZWxpc3RlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKSkgYXMgYW55O1xuXG4gICAgaWYgKGJ1aWxkUmVzcG9uc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlY2VpdmUgYWRkcmVzc2VzIHdpdGggYmFsYW5jZSBmb3VuZCB0byBjb25zb2xpZGF0ZS4nKTtcbiAgICB9XG5cbiAgICAvLyB3ZSBuZWVkIHRvIHN0ZXAgb3ZlciBlYWNoIHByZWJ1aWxkIG5vdyAtIHNob3VsZCBiZSBpbiBhbiBhcnJheSBpbiB0aGUgYm9keVxuICAgIGNvbnN0IGNvbnNvbGlkYXRpb25zOiBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbnNvbGlkYXRlQWNjb3VudEJ1aWxkIG9mIGJ1aWxkUmVzcG9uc2UpIHtcbiAgICAgIGxldCBwcmVidWlsZDogUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdCA9IChhd2FpdCB0aGlzLmJhc2VDb2luLnBvc3RQcm9jZXNzUHJlYnVpbGQoXG4gICAgICAgIE9iamVjdC5hc3NpZ24oY29uc29saWRhdGVBY2NvdW50QnVpbGQsIHsgd2FsbGV0OiB0aGlzLCBidWlsZFBhcmFtczogd2hpdGVsaXN0ZWRQYXJhbXMgfSlcbiAgICAgICkpIGFzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ7XG5cbiAgICAgIGRlbGV0ZSBwcmVidWlsZC53YWxsZXQ7XG4gICAgICBkZWxldGUgcHJlYnVpbGQuYnVpbGRQYXJhbXM7XG5cbiAgICAgIHByZWJ1aWxkID0gXy5leHRlbmQoe30sIHByZWJ1aWxkLCB7IHdhbGxldElkOiB0aGlzLmlkKCkgfSk7XG4gICAgICBkZWJ1ZygnZmluYWwgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbiBwcmVidWlsZDogJU8nLCBwcmVidWlsZCk7XG5cbiAgICAgIGNvbnNvbGlkYXRpb25zLnB1c2gocHJlYnVpbGQpO1xuICAgIH1cbiAgICByZXR1cm4gY29uc29saWRhdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuZCBzZW5kcyBhIHNldCBvZiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9ucyBmb3IgYSB3YWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogICAgIHByZWJ1aWxkVHggICAtIHRoaXMgaXMgdGhlIHByZS1idWlsZCBjb25zb2xpZGF0aW9uIHR4LiB0aGlzIGlzIGEgbm9ybWFsbHkgYnVpbHQgdHggd2l0aFxuICAgKiAgICAgICAgICAgICAgICAgICAgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIgb2YgY29uc29saWRhdGVJZC5cbiAgICogICAgIHZlcmlmaWNhdGlvbiAtIG5vcm1hbCBrZXljaGFpbnMsIGV0Yy4gZm9yIHZlcmlmaWNhdGlvblxuICAgKi9cbiAgYXN5bmMgc2VuZEFjY291bnRDb25zb2xpZGF0aW9uKHBhcmFtczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5hbGxvd3NBY2NvdW50Q29uc29saWRhdGlvbnMoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX0gZG9lcyBub3QgYWxsb3cgYWNjb3VudCBjb25zb2xpZGF0aW9ucy5gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0LnR5cGUgPT09ICdjdXN0b2RpYWwnICYmIHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICBwYXJhbXMudHlwZSA9ICdjb25zb2xpZGF0ZSc7XG4gICAgICByZXR1cm4gdGhpcy5pbml0aWF0ZVRyYW5zYWN0aW9uKHBhcmFtcyBhcyBUeFNlbmRCb2R5LCBwYXJhbXMucmVxSWQpO1xuICAgIH1cblxuICAgIC8vIG9uZSBvZiBhIHNldCBvZiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uc1xuICAgIGlmICh0eXBlb2YgcGFyYW1zLnByZWJ1aWxkVHggPT09ICdzdHJpbmcnIHx8IHBhcmFtcy5wcmVidWlsZFR4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBidWlsZCBvZiBhY2NvdW50IGNvbnNvbGlkYXRpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMucHJlYnVpbGRUeC5jb25zb2xpZGF0ZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBmaW5kIGNvbnNvbGlkYXRpb24gaWQgb24gY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIGlmICghcGFyYW1zLnByZWJ1aWxkVHgudHhSZXF1ZXN0SWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25zb2xpZGF0aW9uIHJlcXVlc3QgbWlzc2luZyB0eFJlcXVlc3RJZC4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZE1hbnlUeFJlcXVlc3RzKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2lnbmVkUHJlYnVpbGQgPSAoYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpKSBhcyBhbnk7XG5cbiAgICAvLyBkZWNvcmF0ZSB3aXRoIG91ciBjb25zb2xpZGF0aW9uIGlkXG4gICAgc2lnbmVkUHJlYnVpbGQuY29uc29saWRhdGVJZCA9IHBhcmFtcy5wcmVidWlsZFR4LmNvbnNvbGlkYXRlSWQ7XG5cbiAgICBkZWxldGUgc2lnbmVkUHJlYnVpbGQud2FsbGV0O1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oc2lnbmVkUHJlYnVpbGQsIHBhcmFtcy5yZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuZCBzZW5kcyBhIHNldCBvZiBhY2NvdW50IGNvbnNvbGlkYXRpb25zLiBUaGlzIGlzIGludGVuZGVkIHRvIGZsdXNoIG1hbnkgYmFsYW5jZXMgdG8gdGhlIHJvb3Qgd2FsbGV0IGJhbGFuY2UuXG4gICAqIEBwYXJhbSBwYXJhbXMgLVxuICAgKiAgICAgY29uc29saWRhdGVBZGRyZXNzZXMgLSB0aGVzZSBhcmUgdGhlIG9uLWNoYWluIHJlY2VpdmUgYWRkcmVzc2VzIHdlIHdhbnQgdG8gcGljayBhIGNvbnNvbGlkYXRpb24gYW1vdW50IGZyb21cbiAgICovXG4gIGFzeW5jIHNlbmRBY2NvdW50Q29uc29saWRhdGlvbnMocGFyYW1zOiBCdWlsZENvbnNvbGlkYXRpb25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLmFsbG93c0FjY291bnRDb25zb2xpZGF0aW9ucygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCBhbGxvdyBhY2NvdW50IGNvbnNvbGlkYXRpb25zLmApO1xuICAgIH1cblxuICAgIGNvbnN0IGFwaVZlcnNpb24gPVxuICAgICAgcGFyYW1zLmFwaVZlcnNpb24gPz9cbiAgICAgICh0aGlzLnRzc1V0aWxzICYmIHRoaXMudHNzVXRpbHMuc3VwcG9ydGVkVHhSZXF1ZXN0VmVyc2lvbnMoKS5pbmNsdWRlcygnZnVsbCcpID8gJ2Z1bGwnIDogdW5kZWZpbmVkKTtcblxuICAgIC8vIERvaW5nIGEgc2FuaXR5IGNoZWNrIGZvciBwYXNzd29yZCBoZXJlIHRvIGF2b2lkIGRvaW5nIGZ1cnRoZXIgd29yayBpZiB3ZSBrbm93IGl0J3Mgd3JvbmdcbiAgICBhd2FpdCB0aGlzLmdldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZSh7XG4gICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICBjdXN0b21TaWduaW5nRnVuY3Rpb246IHBhcmFtcy5jdXN0b21TaWduaW5nRnVuY3Rpb24sXG4gICAgfSk7XG5cbiAgICAvLyB0aGlzIGdpdmVzIHVzIGEgc2V0IG9mIGFjY291bnQgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnNcbiAgICBjb25zdCB1bnNpZ25lZEJ1aWxkcyA9IGF3YWl0IHRoaXMuYnVpbGRBY2NvdW50Q29uc29saWRhdGlvbnMoeyAuLi5wYXJhbXMsIGFwaVZlcnNpb246IGFwaVZlcnNpb24gfSk7XG4gICAgaWYgKHVuc2lnbmVkQnVpbGRzICYmIHVuc2lnbmVkQnVpbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3NmdWxUeHM6IGFueVtdID0gW107XG4gICAgICBjb25zdCBmYWlsZWRUeHMgPSBuZXcgQXJyYXk8RXJyb3I+KCk7XG4gICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkQnVpbGQgb2YgdW5zaWduZWRCdWlsZHMpIHtcbiAgICAgICAgLy8gZm9sZCBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgd2UgdXNlZCB0byBidWlsZCB0aGlzIHRyYW5zYWN0aW9uIGludG8gdGhlIHVuc2lnbmVkQnVpbGRcbiAgICAgICAgY29uc3QgdW5zaWduZWRCdWlsZFdpdGhPcHRpb25zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwYXJhbXMpO1xuICAgICAgICB1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMuYXBpVmVyc2lvbiA9IGFwaVZlcnNpb247XG4gICAgICAgIHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9ucy5wcmVidWlsZFR4ID0gdW5zaWduZWRCdWlsZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzZW5kVHggPSBhd2FpdCB0aGlzLnNlbmRBY2NvdW50Q29uc29saWRhdGlvbih1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMpO1xuICAgICAgICAgIHN1Y2Nlc3NmdWxUeHMucHVzaChzZW5kVHgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5kaXIoZSk7XG4gICAgICAgICAgZmFpbGVkVHhzLnB1c2goZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2Vzczogc3VjY2Vzc2Z1bFR4cyxcbiAgICAgICAgZmFpbHVyZTogZmFpbGVkVHhzLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgc2V0IG9mIHRyYW5zYWN0aW9ucyB0aGF0IGVuYWJsZXMgdGhlIHNwZWNpZmllZCB0b2tlbnNcbiAgICogQHBhcmFtIHBhcmFtcyAtXG4gICAqICAgIGVuYWJsZVRva2VuczogVG9rZW4gZW5hYmxlbWVudCBvcGVyYXRpb25zIHdlIHdhbnQgdG8gcGVyZm9ybVxuICAgKiBAcmV0dXJucyBVbnNpZ25lZCB0cmFuc2FjdGlvbnMgdGhhdCBlbmFibGVzIHRoZSBzcGVjaWZpZWQgdG9rZW5zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYnVpbGRUb2tlbkVuYWJsZW1lbnRzKFxuICAgIHBhcmFtczogQnVpbGRUb2tlbkVuYWJsZW1lbnRPcHRpb25zID0geyBlbmFibGVUb2tlbnM6IFtdIH1cbiAgKTogUHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0W10+IHtcbiAgICBjb25zdCB0ZUNvbmZpZyA9IHRoaXMuYmFzZUNvaW4uZ2V0VG9rZW5FbmFibGVtZW50Q29uZmlnKCk7XG4gICAgaWYgKCF0ZUNvbmZpZy5yZXF1aXJlc1Rva2VuRW5hYmxlbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX0gZG9lcyBub3QgcmVxdWlyZSB0b2tlbiBlbmFibGVtZW50c2ApO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmVuYWJsZVRva2Vucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdG9rZW5zIGFyZSBiZWluZyBzcGVjaWZpZWQnKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5yZWNpcGllbnRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3Qgc3BlY2lmeSByZWNpcGllbnRzIGZvciB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9ucycpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cblxuICAgIC8vIFNwbGl0IHF1ZXJ5IGlmIHdlIGNhbid0IGVuYWJsZSBtdWx0aXBsZSB0b2tlbnMgaW4gb25lIHR4XG4gICAgaWYgKCF0ZUNvbmZpZy5zdXBwb3J0c011bHRpcGxlVG9rZW5FbmFibGVtZW50cyAmJiBwYXJhbXMuZW5hYmxlVG9rZW5zLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IHF1ZXJpZXMgPSBwYXJhbXMuZW5hYmxlVG9rZW5zLm1hcChhc3luYyAoZW5hYmxlVG9rZW4pID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRUb2tlbkVuYWJsZW1lbnRzKHtcbiAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgICAgZW5hYmxlVG9rZW5zOiBbZW5hYmxlVG9rZW5dLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHF1ZXJpZXMpO1xuICAgICAgcmV0dXJuIHJlc3VsdHMuZmxhdCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkUGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyA9IF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpKTtcbiAgICBidWlsZFBhcmFtcy50eXBlID0gJ2VuYWJsZXRva2VuJztcbiAgICAvLyBDaGVjayBpZiB3ZSBidWlsZCB3aXRoIGludGVudFxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgcmV0dXJuIFthd2FpdCB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb24oYnVpbGRQYXJhbXMpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmV3cml0ZSB0b2tlbnMgaW50byByZWNpcGllbnRzIGZvciBidWlsZFRyYW5zYWN0aW9uXG4gICAgICBidWlsZFBhcmFtcy5yZWNpcGllbnRzID0gcGFyYW1zLmVuYWJsZVRva2Vucy5tYXAoKHRva2VuKSA9PiB7XG4gICAgICAgIC8vIElmIHRva2VuIGhhcyBub24gYWRkcmVzcywgdGFrZSB0aGUgZmlyc3Qgd2FsbGV0IGFkZHJlc3MgaXMgc3RvcmVkIGluIGl0cyBjb2luLXNwZWNpZmljIHByb3BlcnR5XG4gICAgICAgIC8vIEluIGFjY291bnQtYmFzZWQgY29pbiBpbXBsZW1lbnRhdGlvbnMgdGhhdCB1c2Ugd2FsbGV0IGNvbnRyYWN0cywgdGhlIGFkZHJlc3MgaXMgY2FsbGVkIGJhc2VBZGRyZXNzIChlLmcuIGV0aC1saWtlLCB4dHopXG4gICAgICAgIC8vIGZvciBvdGhlcnMgaXQncyBjYWxsZWQgcm9vdEFkZHJlc3MgKGUuZy4geHJwLCB4bG0sIGFsZ28sIHRyeClcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9XG4gICAgICAgICAgdG9rZW4uYWRkcmVzcyB8fCB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljPy5iYXNlQWRkcmVzcyB8fCB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljPy5yb290QWRkcmVzcztcbiAgICAgICAgaWYgKCFhZGRyZXNzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXYWxsZXQgZG9lcyBub3QgaGF2ZSBiYXNlIGFkZHJlc3MsIG11c3Qgc3BlY2lmeSB3aXRoIHRva2VuIHBhcmFtJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0b2tlbk5hbWU6IHRva2VuLm5hbWUsXG4gICAgICAgICAgYWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6ICcwJyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgZGVsZXRlIGJ1aWxkUGFyYW1zLmVuYWJsZVRva2VucztcbiAgICAgIGNvbnN0IHByZWJ1aWxkVHggPSBhd2FpdCB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb24oYnVpbGRQYXJhbXMpO1xuICAgICAgcHJlYnVpbGRUeC5idWlsZFBhcmFtcyA9IGJ1aWxkUGFyYW1zO1xuICAgICAgcmV0dXJuIFtwcmVidWlsZFR4XTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYW5kIHNlbmRzIGEgc2luZ2xlIHVuc2lnbmVkIHRva2VuIGVuYWJsZW1lbnQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJuc1xuICAgKiAgIC0gVGhlIHJlc3BvbnNlIGZyb20gc2VuZGluZyB0aGUgdHJhbnNhY3Rpb24gZm9yIGhvdC9jb2xkIHdhbGxldHNcbiAgICogICAtIFRoZSByZXNwb25zZSBmcm9tIGluaXRpYXRpbmcgdGhlIHRyYW5zYWN0aW9uIGZvciBjdXN0b2RpYWwgd2FsbGV0c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRUb2tlbkVuYWJsZW1lbnQocGFyYW1zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgdGVDb25maWcgPSB0aGlzLmJhc2VDb2luLmdldFRva2VuRW5hYmxlbWVudENvbmZpZygpO1xuICAgIGlmICghdGVDb25maWcucmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IHJlcXVpcmUgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbnNgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBhcmFtcy5wcmVidWlsZFR4ID09PSAnc3RyaW5nJyB8fCBwYXJhbXMucHJlYnVpbGRUeD8uYnVpbGRQYXJhbXM/LnR5cGUgIT09ICdlbmFibGV0b2tlbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBidWlsZCBvZiB0b2tlbiBlbmFibGVtZW50LicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZE1hbnlUeFJlcXVlc3RzKHBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAodGhpcy5fd2FsbGV0LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnaG90JzpcbiAgICAgICAgY2FzZSAnY29sZCc6XG4gICAgICAgICAgY29uc3Qgc2lnbmVkUHJlYnVpbGQgPSBhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oc2lnbmVkUHJlYnVpbGQsIHBhcmFtcy5yZXFJZCk7XG4gICAgICAgIGNhc2UgJ2N1c3RvZGlhbCc6XG4gICAgICAgIGNhc2UgJ2JhY2tpbmcnOlxuICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYXRlVHJhbnNhY3Rpb24ocGFyYW1zLnByZWJ1aWxkVHguYnVpbGRQYXJhbXMsIHBhcmFtcy5yZXFJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNvbWUgY2hhaW5zIHJlcXVpcmUgdG9rZW5zIHRvIGJlIGVuYWJsZWQgYmVmb3JlIHRoZXkgY2FuIGJlIHJlY2VpdmVkL3NlbnQuXG4gICAqIFRoaXMgaXMgYSBkZWRpY2F0ZWQgZnVuY3Rpb24gdGhhdCBlbmFibGVzIHRva2Vucy5cbiAgICpcbiAgICogQnVpbGRzLCBzaWducywgYW5kIHNlbmRzIGEgc2V0IG9mIHRyYW5zYWN0aW9ucyB0aGF0IGVuYWJsZXMgdGhlIHNwZWNpZmllZCB0b2tlbnNcbiAgICogQHBhcmFtIHBhcmFtcyAtXG4gICAqICAgIGVuYWJsZVRva2VuczogVG9rZW4gZW5hYmxlbWVudCBvcGVyYXRpb25zIHdlIHdhbnQgdG8gcGVyZm9ybVxuICAgKiBAcmV0dXJuXG4gICAqICAgIHN1Y2Nlc3M6IFN1Y2Nlc3NmdWwgcmVzcG9uc2VzIGZyb20gc2VuZFRva2VuRW5hYmxlbWVudFxuICAgKiAgICBmYWlsdXJlOiBFcnJvcnMgZnJvbSBmYWlsZWQgdHJhbnNhY3Rpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZFRva2VuRW5hYmxlbWVudHMocGFyYW1zOiBCdWlsZFRva2VuRW5hYmxlbWVudE9wdGlvbnMgPSB7IGVuYWJsZVRva2VuczogW10gfSk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGFueVtdO1xuICAgIGZhaWx1cmU6IEVycm9yW107XG4gIH0+IHtcbiAgICBjb25zdCB1bnNpZ25lZEJ1aWxkcyA9IGF3YWl0IHRoaXMuYnVpbGRUb2tlbkVuYWJsZW1lbnRzKHBhcmFtcyk7XG5cbiAgICBjb25zdCBzdWNjZXNzZnVsVHhzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IGZhaWxlZFR4cyA9IG5ldyBBcnJheTxFcnJvcj4oKTtcbiAgICBmb3IgKGNvbnN0IHVuc2lnbmVkQnVpbGQgb2YgdW5zaWduZWRCdWlsZHMpIHtcbiAgICAgIGNvbnN0IHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9uczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHByZWJ1aWxkVHg6IHVuc2lnbmVkQnVpbGQsXG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VuZFR4ID0gYXdhaXQgdGhpcy5zZW5kVG9rZW5FbmFibGVtZW50KHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9ucyk7XG4gICAgICAgIHN1Y2Nlc3NmdWxUeHMucHVzaChzZW5kVHgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBmYWlsZWRUeHMucHVzaChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2Vzczogc3VjY2Vzc2Z1bFR4cyxcbiAgICAgIGZhaWx1cmU6IGZhaWxlZFR4cyxcbiAgICB9O1xuICB9XG5cbiAgLyogTUFSSzogVFNTIEhlbHBlcnMgKi9cblxuICAvKipcbiAgICogUHJlYnVpbGRzIGEgdHJhbnNhY3Rpb24gZm9yIGEgVFNTIHdhbGxldC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBwcmVidWlsZCB0cmFuc2FjdGlvbiBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZWJ1aWxkVHJhbnNhY3Rpb25UeFJlcXVlc3RzKFxuICAgIHBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgY29uc3QgYXBpVmVyc2lvbiA9IGdldFR4UmVxdWVzdEFwaVZlcnNpb24odGhpcywgcGFyYW1zLmFwaVZlcnNpb24pO1xuICAgIC8vIFR3byBvcHRpb25zIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgZmVlcyBzZWVtcyB0byBub3cgYmUgc3VwcG9ydGVkLCBmb3Igbm93IHdlIHdpbGwgc3VwcG9ydCBib3RoIHRvIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlXG4gICAgLy8gVE9ETyhCRy01OTY4NSk6IGRlcHJlY2F0ZSBvbmUgb2YgdGhlc2Ugc28gdGhhdCB3ZSBoYXZlIGEgc2luZ2xlIHdheSB0byBwYXNzIGZlZXNcbiAgICBsZXQgZmVlT3B0aW9ucztcbiAgICBpZiAocGFyYW1zLmZlZU9wdGlvbnMpIHtcbiAgICAgIGZlZU9wdGlvbnMgPSBwYXJhbXMuZmVlT3B0aW9ucztcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5nYXNQcmljZSAhPT0gdW5kZWZpbmVkIHx8IHBhcmFtcy5laXAxNTU5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZlZU9wdGlvbnMgPVxuICAgICAgICBwYXJhbXMuZ2FzUHJpY2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8geyBnYXNQcmljZTogcGFyYW1zLmdhc1ByaWNlLCBnYXNMaW1pdDogcGFyYW1zLmdhc0xpbWl0IH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgbWF4RmVlUGVyR2FzOiBOdW1iZXIocGFyYW1zLmVpcDE1NTk/Lm1heEZlZVBlckdhcyksXG4gICAgICAgICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiBOdW1iZXIocGFyYW1zLmVpcDE1NTk/Lm1heFByaW9yaXR5RmVlUGVyR2FzKSxcbiAgICAgICAgICAgICAgZ2FzTGltaXQ6IHBhcmFtcy5nYXNMaW1pdCxcbiAgICAgICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChwYXJhbXMuZ2FzTGltaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmVlT3B0aW9ucyA9IHsgZ2FzTGltaXQ6IHBhcmFtcy5nYXNMaW1pdCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBmZWVPcHRpb25zID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGxldCB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICBzd2l0Y2ggKHBhcmFtcy50eXBlKSB7XG4gICAgICBjYXNlICd0cmFuc2Zlcic6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3BheW1lbnQnLFxuICAgICAgICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IHBhcmFtcy5yZWNpcGllbnRzIHx8IFtdLFxuICAgICAgICAgICAgbWVtbzogcGFyYW1zLm1lbW8sXG4gICAgICAgICAgICBub25jZTogcGFyYW1zLm5vbmNlLFxuICAgICAgICAgICAgZmVlT3B0aW9ucyxcbiAgICAgICAgICAgIGN1c3RvZGlhblRyYW5zYWN0aW9uSWQ6IHBhcmFtcy5jdXN0b2RpYW5UcmFuc2FjdGlvbklkLFxuICAgICAgICAgICAgdW5zcGVudHM6IHBhcmFtcy51bnNwZW50cyxcbiAgICAgICAgICAgIHNlbmRlckFkZHJlc3M6IHBhcmFtcy5zZW5kZXJBZGRyZXNzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RyYW5zZmVydG9rZW4nOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGlzVHNzOiBwYXJhbXMuaXNUc3MsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAndHJhbnNmZXJUb2tlbicsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBwYXJhbXMucmVjaXBpZW50cyB8fCBbXSxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VuYWJsZXRva2VuJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAnZW5hYmxlVG9rZW4nLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBlbmFibGVUb2tlbnM6IHBhcmFtcy5lbmFibGVUb2tlbnMsXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhY2NlbGVyYXRpb24nOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdhY2NlbGVyYXRpb24nLFxuICAgICAgICAgICAgY29tbWVudDogcGFyYW1zLmNvbW1lbnQsXG4gICAgICAgICAgICBsb3dGZWVUeGlkOiBwYXJhbXMubG93RmVlVHhpZCxcbiAgICAgICAgICAgIHJlY2VpdmVBZGRyZXNzOiBwYXJhbXMucmVjZWl2ZUFkZHJlc3MsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ZpbGxOb25jZSc6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ2ZpbGxOb25jZScsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICByZWNlaXZlQWRkcmVzczogcGFyYW1zLnJlY2VpdmVBZGRyZXNzLFxuICAgICAgICAgICAgZmVlT3B0aW9ucyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zYWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJHtwYXJhbXMudHlwZX1gKTtcbiAgICB9XG5cbiAgICBsZXQgdW5zaWduZWRUeDogRWRkc2FVbnNpZ25lZFRyYW5zYWN0aW9uO1xuXG4gICAgaWYgKHR4UmVxdWVzdC5hcGlWZXJzaW9uID09PSAnZnVsbCcpIHtcbiAgICAgIGlmICh0eFJlcXVlc3QudHJhbnNhY3Rpb25zPy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHNpbmdsZSB1bnNpZ25lZCB0eCBmb3IgdHggcmVxdWVzdCB3aXRoIGlkOiAke3R4UmVxdWVzdC50eFJlcXVlc3RJZH1gKTtcbiAgICAgIH1cblxuICAgICAgdW5zaWduZWRUeCA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR4UmVxdWVzdC51bnNpZ25lZFR4cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHNpbmdsZSB1bnNpZ25lZCB0eCBmb3IgdHggcmVxdWVzdCB3aXRoIGlkOiAke3R4UmVxdWVzdC50eFJlcXVlc3RJZH1gKTtcbiAgICAgIH1cbiAgICAgIHVuc2lnbmVkVHggPSB0eFJlcXVlc3QudW5zaWduZWRUeHNbMF07XG4gICAgfVxuXG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdhbGxldElkOiB0aGlzLmlkKCksXG4gICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgICB0eFJlcXVlc3RJZDogdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgdHhIZXg6IHVuc2lnbmVkVHguc2VyaWFsaXplZFR4SGV4LFxuICAgICAgYnVpbGRQYXJhbXM6IHdoaXRlbGlzdGVkUGFyYW1zLFxuICAgICAgZmVlSW5mbzogdW5zaWduZWRUeC5mZWVJbmZvLFxuICAgICAgLi4uKHR4UmVxdWVzdC5wZW5kaW5nQXBwcm92YWxJZCAmJiB7IHBlbmRpbmdBcHByb3ZhbElkOiB0eFJlcXVlc3QucGVuZGluZ0FwcHJvdmFsSWQgfSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1MgRWREU0Egd2FsbGV0IHVzaW5nIGV4dGVybmFsIHNpZ25lci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBzaWduaW5nIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblRyYW5zYWN0aW9uVHNzRXh0ZXJuYWxTaWduZXJFZERTQShcbiAgICBwYXJhbXM6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSxcbiAgICBjb2luOiBJQmFzZUNvaW5cbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBsZXQgdHhSZXF1ZXN0SWQgPSAnJztcbiAgICBpZiAocGFyYW1zLnR4UmVxdWVzdElkKSB7XG4gICAgICB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy50eFByZWJ1aWxkICYmIHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkKSB7XG4gICAgICB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4UmVxdWVzdElkIHJlcXVpcmVkIHRvIHNpZ24gVFNTIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21Db21taXRtZW50R2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgY29tbWl0bWVudCByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21SU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBSIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbUdTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIEcgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgYXNzZXJ0KHRoaXMudHNzVXRpbHMsICd0c3NVdGlscyBtdXN0IGJlIGRlZmluZWQnKTtcbiAgICAvLyBhZGRpbmcgdGhpcyB0byByZWJ1aWxkIHRoZSB0cmFuc2FjdGlvbiBqdXN0IGJlZm9yZSBzaWduaW5nIGZvciBFZERTQSB0cmFuc2FjdGlvbiB1c2luZyBleHRlcm5hbCBzaWduZXJcbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCB1bmRlZmluZWQ7XG4gICAgYXdhaXQgdGhpcy50c3NVdGlscy5kZWxldGVTaWduYXR1cmVTaGFyZXModHhSZXF1ZXN0SWQsIHJlcUlkKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzaWduZWRUeFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzLnNpZ25FZGRzYVRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgICAgIHR4UmVxdWVzdElkLFxuICAgICAgICBwYXJhbXMuY3VzdG9tQ29tbWl0bWVudEdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICAgICAgcGFyYW1zLmN1c3RvbVJTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICAgICAgcGFyYW1zLmN1c3RvbUdTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICAgICAgcmVxSWRcbiAgICAgICk7XG4gICAgICByZXR1cm4gc2lnbmVkVHhSZXF1ZXN0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHJhbnNhY3Rpb24gJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhbmQgc2VuZHMgYSB0cmFuc2FjdGlvbiByZXF1ZXN0IGZyb20gYSBUU1MgKGhvdCkgd2FsbGV0LCBvciBhIFNNQyAoY29sZCkgd2FsbGV0IHdpdGggYW4gZXh0ZXJuYWwgc2lnbmVyLlxuICAgKiBNZWFudCB0byBiZSB1c2VkIGZvciBhIHRyYW5zYWN0aW9uIHJlcXVlc3Qgd2hlcmUgdGhlIHNpZ25pbmcgcHJvY2VzcyBpcyBhYm9ydGVkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAgIHR4UmVxdWVzdElkIC0gVGhlIElEIG9mIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0LlxuICAgKiAgICB3YWxsZXRQYXNzcGhyYXNlIC0gVGhlIHBhc3NwaHJhc2UgZm9yIHRoZSB3YWxsZXQuXG4gICAqICAgIGlzVHhSZXF1ZXN0RnVsbCAtIEZsYWcgaW5kaWNhdGluZyBpZiB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdCBpcyBmdWxsLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIFNpZ25lZFRyYW5zYWN0aW9uLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNpZ25BbmRTZW5kVHhSZXF1ZXN0KHBhcmFtczogU2lnbkFuZFNlbmRUeFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGlmIChwYXJhbXMuaXNUeFJlcXVlc3RGdWxsKSB7XG4gICAgICBhd2FpdCB0aGlzLnRzc1V0aWxzPy5kZWxldGVTaWduYXR1cmVTaGFyZXMocGFyYW1zLnR4UmVxdWVzdElkKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCB0aGlzLmdldFVzZXJLZXlBbmRTaWduVHNzVHJhbnNhY3Rpb24oe1xuICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICB0eFJlcXVlc3RJZDogcGFyYW1zLnR4UmVxdWVzdElkLFxuICAgIH0pO1xuICAgIGlmICghcGFyYW1zLmlzVHhSZXF1ZXN0RnVsbCkge1xuICAgICAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IGlmIGl0cyBub3QgYSBmdWxsIHR4IHJlcXVlc3QsIHRoZW4gaXQgaXMgYSBsaXRlIHR4IHJlcXVlc3RcbiAgICAgIGNvbnN0IHN1Ym1pdFR4ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UmVxdWVzdElkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdWJtaXRUeDtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1MgRUNEU0Egd2FsbGV0IHVzaW5nIGV4dGVybmFsIHNpZ25lci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBzaWduaW5nIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblRyYW5zYWN0aW9uVHNzRXh0ZXJuYWxTaWduZXJFQ0RTQShcbiAgICBjb2luOiBJQmFzZUNvaW4sXG4gICAgcGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBsZXQgdHhSZXF1ZXN0SWQgPSAnJztcbiAgICBpZiAocGFyYW1zLnR4UmVxdWVzdElkKSB7XG4gICAgICB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy50eFByZWJ1aWxkICYmIHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkKSB7XG4gICAgICB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4UmVxdWVzdElkIHJlcXVpcmVkIHRvIHNpZ24gVFNTIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21QYWlsbGllck1vZHVsdXNHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBwYWlsbGllciBtb2R1bHVzIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbUtTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIEsgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tTXVEZWx0YVNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgTXVEZWx0YSBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21TU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBTIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhc3NlcnQodGhpcy50c3NVdGlscywgJ3Rzc1V0aWxzIG11c3QgYmUgZGVmaW5lZCcpO1xuICAgICAgY29uc3Qgc2lnbmVkVHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscy5zaWduRWNkc2FUc3NVc2luZ0V4dGVybmFsU2lnbmVyKFxuICAgICAgICB7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB0eFJlcXVlc3RJZCxcbiAgICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICAgIH0sXG4gICAgICAgIFJlcXVlc3RUeXBlLnR4LFxuICAgICAgICBwYXJhbXMuY3VzdG9tUGFpbGxpZXJNb2R1bHVzR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tTXVEZWx0YVNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tU1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uXG4gICAgICApO1xuICAgICAgcmV0dXJuIHNpZ25lZFR4UmVxdWVzdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBzaWduIHRyYW5zYWN0aW9uICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0cmFuc2FjdGlvbiBmcm9tIGEgVFNTIEVDRFNBIHdhbGxldCB1c2luZyBleHRlcm5hbCBzaWduZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2lnbmluZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRUNEU0FNUEN2MihcbiAgICBjb2luOiBJQmFzZUNvaW4sXG4gICAgcGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBsZXQgdHhSZXF1ZXN0SWQgPSAnJztcbiAgICBpZiAocGFyYW1zLnR4UmVxdWVzdElkKSB7XG4gICAgICB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy50eFByZWJ1aWxkICYmIHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkKSB7XG4gICAgICB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4UmVxdWVzdElkIHJlcXVpcmVkIHRvIHNpZ24gVFNTIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0aW9uRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBNUEN2MiBSb3VuZCAxIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRpb25GdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIE1QQ3YyIFJvdW5kIDIgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgTVBDdjIgUm91bmQgMyBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXNzZXJ0KHRoaXMudHNzVXRpbHMsICd0c3NVdGlscyBtdXN0IGJlIGRlZmluZWQnKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMuc2lnbkVjZHNhTVBDdjJUc3NVc2luZ0V4dGVybmFsU2lnbmVyKFxuICAgICAgICB7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB0eFJlcXVlc3RJZCxcbiAgICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICAgIH0sXG4gICAgICAgIHBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0aW9uRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0aW9uRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0aW9uRnVuY3Rpb25cbiAgICAgICk7XG4gICAgICByZXR1cm4gc2lnbmVkVHhSZXF1ZXN0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHJhbnNhY3Rpb24gJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNpZ25pbmcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHJhbnNhY3Rpb25Uc3MocGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgaWYgKCFwYXJhbXMudHhQcmVidWlsZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFByZWJ1aWxkIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggVFNTJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFJlcXVlc3RJZCByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcnYgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudHNzVXRpbHMhLnNpZ25UeFJlcXVlc3Qoe1xuICAgICAgICB0eFJlcXVlc3Q6IHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkLFxuICAgICAgICB0eFBhcmFtczogcGFyYW1zLnR4UHJlYnVpbGQuYnVpbGRQYXJhbXMsXG4gICAgICAgIHBydjogcGFyYW1zLnBydixcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpLFxuICAgICAgICBhcGlWZXJzaW9uOiBwYXJhbXMuYXBpVmVyc2lvbixcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHJhbnNhY3Rpb24gJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIG1lc3NhZ2UgZnJvbSBhIFRTUyB3YWxsZXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2lnbmluZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25NZXNzYWdlVHNzKHBhcmFtczogV2FsbGV0U2lnbk1lc3NhZ2VPcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZE1lc3NhZ2U+IHtcbiAgICBpZiAoIXBhcmFtcy5yZXFJZCkge1xuICAgICAgcGFyYW1zLnJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IHJlcXVpcmVkIHRvIHNpZ24gbWVzc2FnZSB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBsZXQgdHhSZXF1ZXN0O1xuICAgICAgYXNzZXJ0KHBhcmFtcy5tZXNzYWdlLCAnbWVzc2FnZSByZXF1aXJlZCBmb3IgbWVzc2FnZSBzaWduaW5nJyk7XG4gICAgICBpZiAoIXBhcmFtcy5tZXNzYWdlLnR4UmVxdWVzdElkKSB7XG4gICAgICAgIGNvbnN0IGludGVudE9wdGlvbjogSW50ZW50T3B0aW9uc0Zvck1lc3NhZ2UgPSB7XG4gICAgICAgICAgY3VzdG9kaWFuTWVzc2FnZUlkOiBwYXJhbXMuY3VzdG9kaWFuTWVzc2FnZUlkLFxuICAgICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgICAgaW50ZW50VHlwZTogJ3NpZ25NZXNzYWdlJyxcbiAgICAgICAgICBpc1RzczogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlUmF3OiBwYXJhbXMubWVzc2FnZS5tZXNzYWdlUmF3LFxuICAgICAgICAgIG1lc3NhZ2VFbmNvZGVkOiBwYXJhbXMubWVzc2FnZS5tZXNzYWdlRW5jb2RlZCxcbiAgICAgICAgfTtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuY3JlYXRlVHhSZXF1ZXN0V2l0aEludGVudEZvck1lc3NhZ2VTaWduaW5nKGludGVudE9wdGlvbik7XG4gICAgICAgIHBhcmFtcy5tZXNzYWdlLnR4UmVxdWVzdElkID0gdHhSZXF1ZXN0LnR4UmVxdWVzdElkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMuaWQoKSwgcGFyYW1zLm1lc3NhZ2UudHhSZXF1ZXN0SWQsIHBhcmFtcy5yZXFJZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNpZ25lZE1lc3NhZ2VSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuc2lnblR4UmVxdWVzdEZvck1lc3NhZ2Uoe1xuICAgICAgICB0eFJlcXVlc3QsXG4gICAgICAgIHBydjogcGFyYW1zLnBydixcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpLFxuICAgICAgICBtZXNzYWdlUmF3OiBwYXJhbXMubWVzc2FnZS5tZXNzYWdlUmF3LFxuICAgICAgICBtZXNzYWdlRW5jb2RlZDogcGFyYW1zLm1lc3NhZ2UubWVzc2FnZUVuY29kZWQsXG4gICAgICAgIGJ1ZmZlclRvU2lnbjogQnVmZmVyLmZyb20ocGFyYW1zLm1lc3NhZ2UubWVzc2FnZUVuY29kZWQgPz8gJycsICdoZXgnKSxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0KHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzLCAnVW5hYmxlIHRvIGZpbmQgbWVzc2FnZXMgaW4gc2lnbmVkTWVzc2FnZVJlcXVlc3QnKTtcbiAgICAgIGFzc2VydChcbiAgICAgICAgc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXNbMF0uY29tYmluZVNpZ1NoYXJlLFxuICAgICAgICAnVW5hYmxlIHRvIGZpbmQgY29tYmluZVNpZ1NoYXJlIGluIHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzJ1xuICAgICAgKTtcbiAgICAgIGFzc2VydChzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsICdVbmFibGUgdG8gZmluZCB0eEhhc2ggaW4gc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXMnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvaW46IHRoaXMuY29pbigpLFxuICAgICAgICB0eEhhc2g6IHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCxcbiAgICAgICAgc2lnbmF0dXJlOiBzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsXG4gICAgICAgIG1lc3NhZ2VSYXc6IHBhcmFtcy5tZXNzYWdlPy5tZXNzYWdlUmF3LFxuICAgICAgICBtZXNzYWdlRW5jb2RlZDogcGFyYW1zLm1lc3NhZ2U/Lm1lc3NhZ2VFbmNvZGVkLFxuICAgICAgICB0eFJlcXVlc3RJZDogc2lnbmVkTWVzc2FnZVJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gbWVzc2FnZSAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHlwZWQgZGF0YSBmcm9tIGEgVFNTIHdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHlwZWREYXRhVHNzKHBhcmFtczogV2FsbGV0U2lnblR5cGVkRGF0YU9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZE1lc3NhZ2U+IHtcbiAgICBpZiAoIXBhcmFtcy5yZXFJZCkge1xuICAgICAgcGFyYW1zLnJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiByZXF1aXJlZCB0byBzaWduIHR5cGVkIGRhdGEgd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgbGV0IHR4UmVxdWVzdDtcbiAgICAgIGFzc2VydChwYXJhbXMudHlwZWREYXRhLCAndHlwZWREYXRhIHJlcXVpcmVkIGZvciB0eXBlZCBkYXRhIHNpZ25pbmcnKTtcbiAgICAgIGlmICghcGFyYW1zLnR5cGVkRGF0YS50eFJlcXVlc3RJZCkge1xuICAgICAgICBjb25zdCBpbnRlbnRPcHRpb25zOiBJbnRlbnRPcHRpb25zRm9yVHlwZWREYXRhID0ge1xuICAgICAgICAgIGN1c3RvZGlhbk1lc3NhZ2VJZDogcGFyYW1zLmN1c3RvZGlhbk1lc3NhZ2VJZCxcbiAgICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgICAgIGludGVudFR5cGU6ICdzaWduVHlwZWRTdHJ1Y3R1cmVkRGF0YScsXG4gICAgICAgICAgaXNUc3M6IHRydWUsXG4gICAgICAgICAgdHlwZWREYXRhUmF3OiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YVJhdyxcbiAgICAgICAgICB0eXBlZERhdGFFbmNvZGVkOiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQhLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfTtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuY3JlYXRlVHhSZXF1ZXN0V2l0aEludGVudEZvclR5cGVkRGF0YVNpZ25pbmcoaW50ZW50T3B0aW9ucyk7XG4gICAgICAgIHBhcmFtcy50eXBlZERhdGEudHhSZXF1ZXN0SWQgPSB0eFJlcXVlc3QudHhSZXF1ZXN0SWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy5pZCgpLCBwYXJhbXMudHlwZWREYXRhLnR4UmVxdWVzdElkLCBwYXJhbXMucmVxSWQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzaWduZWRUeXBlZERhdGFSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuc2lnblR4UmVxdWVzdEZvck1lc3NhZ2Uoe1xuICAgICAgICB0eFJlcXVlc3QsXG4gICAgICAgIHBydjogcGFyYW1zLnBydixcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpLFxuICAgICAgICBtZXNzYWdlUmF3OiBKU09OLnN0cmluZ2lmeShwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YVJhdyksXG4gICAgICAgIG1lc3NhZ2VFbmNvZGVkOiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQhLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgYnVmZmVyVG9TaWduOiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQhLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQoc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlcywgJ1VuYWJsZSB0byBmaW5kIG1lc3NhZ2VzIGluIHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QnKTtcbiAgICAgIGFzc2VydChcbiAgICAgICAgc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS5jb21iaW5lU2lnU2hhcmUsXG4gICAgICAgICdVbmFibGUgdG8gZmluZCBjb21iaW5lU2lnU2hhcmUgaW4gc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlcydcbiAgICAgICk7XG4gICAgICBhc3NlcnQoc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsICdVbmFibGUgdG8gZmluZCB0eEhhc2ggaW4gc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlcycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29pbjogdGhpcy5jb2luKCksXG4gICAgICAgIHR4SGFzaDogc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsXG4gICAgICAgIHNpZ25hdHVyZTogc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsXG4gICAgICAgIG1lc3NhZ2VSYXc6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhUmF3LFxuICAgICAgICBtZXNzYWdlRW5jb2RlZDogcGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFFbmNvZGVkIS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHR4UmVxdWVzdElkOiBzaWduZWRUeXBlZERhdGFSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBzaWduIHR5cGVkIGRhdGEgJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMsIHNpZ25zLCBhbmQgc2VuZHMgYSB0cmFuc2FjdGlvbiBmcm9tIGEgVFNTIHdhbGxldC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBzZW5kIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZE1hbnlUeFJlcXVlc3RzKHBhcmFtczogU2VuZE1hbnlPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHBhcmFtcy5hcGlWZXJzaW9uID0gZ2V0VHhSZXF1ZXN0QXBpVmVyc2lvbih0aGlzLCBwYXJhbXMuYXBpVmVyc2lvbik7XG5cbiAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IChhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcykpIGFzIFNpZ25lZFRyYW5zYWN0aW9uUmVxdWVzdDtcbiAgICBpZiAoIXNpZ25lZFRyYW5zYWN0aW9uLnR4UmVxdWVzdElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4UmVxdWVzdElkIG1pc3NpbmcgZnJvbSBzaWduZWQgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmFwaVZlcnNpb24gPT09ICdmdWxsJykge1xuICAgICAgY29uc3QgbGF0ZXN0VHhSZXF1ZXN0ID0gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMuaWQoKSwgc2lnbmVkVHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQsIHBhcmFtcy5yZXFJZCk7XG4gICAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICAgIGNvbnN0IHRyYW5zZmVyOiB7IHN0YXRlOiBzdHJpbmc7IHBlbmRpbmdBcHByb3ZhbD86IHN0cmluZzsgdHhpZD86IHN0cmluZyB9ID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAucG9zdChcbiAgICAgICAgICB0aGlzLmJpdGdvLnVybChcbiAgICAgICAgICAgICcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3R4cmVxdWVzdHMvJyArIHNpZ25lZFRyYW5zYWN0aW9uLnR4UmVxdWVzdElkICsgJy90cmFuc2ZlcnMnLFxuICAgICAgICAgICAgMlxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAuc2VuZCgpXG4gICAgICAgIC5yZXN1bHQoKTtcbiAgICAgIGlmIChsYXRlc3RUeFJlcXVlc3Quc3RhdGUgPT09ICdwZW5kaW5nQXBwcm92YWwnKSB7XG4gICAgICAgIGNvbnN0IHBlbmRpbmdBcHByb3ZhbHMgPSBuZXcgUGVuZGluZ0FwcHJvdmFscyh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luKTtcbiAgICAgICAgY29uc3QgcGVuZGluZ0FwcHJvdmFsID0gYXdhaXQgcGVuZGluZ0FwcHJvdmFscy5nZXQoeyBpZDogbGF0ZXN0VHhSZXF1ZXN0LnBlbmRpbmdBcHByb3ZhbElkIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBlbmRpbmdBcHByb3ZhbDogcGVuZGluZ0FwcHJvdmFsLnRvSlNPTigpLFxuICAgICAgICAgIHR4UmVxdWVzdDogbGF0ZXN0VHhSZXF1ZXN0LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHJhbnNmZXIsXG4gICAgICAgIHR4UmVxdWVzdDogbGF0ZXN0VHhSZXF1ZXN0LFxuICAgICAgICB0eGlkOiAobGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyA/PyBbXSlbMF0/LnNpZ25lZFR4Py5pZCxcbiAgICAgICAgdHg6IChsYXRlc3RUeFJlcXVlc3QudHJhbnNhY3Rpb25zID8/IFtdKVswXT8uc2lnbmVkVHg/LnR4LFxuICAgICAgICBzdGF0dXM6IHRyYW5zZmVyLnN0YXRlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMudHNzVXRpbHM/LnNlbmRUeFJlcXVlc3Qoc2lnbmVkVHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQsIHJlcUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGZ1bmRzIGZyb20gYSBmZWUgYWRkcmVzcyB0byBhIGZvcndhcmRlci4gT25seSBzdXBwb3J0cyBldGgtbGlrZSBjb2lucy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuZm9yd2FyZGVyQWRkcmVzcyAtIEFkZHJlc3Mgb2YgdGhlIGZvcndhcmRlciB0byBzZW5kIGZ1bmRzIHRvLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmFtb3VudCAtIEFtb3VudCB0byBzZW5kIHRoZSBmb3J3YXJkZXIgKG9wdGlvbmFsKS4gSWYgbm90IGdpdmVuLCBkZWZhdWx0cyB0byBzZW5kaW5nIGFuIGVzdGltYXRlIG9mIHRoZSBhbW91bnQgbmVlZGVkIGZvciBhIGZ1bmQgcmVjb3ZlcnlcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZnVuZEZvcndhcmRlcihwYXJhbXM6IEZ1bmRGb3J3YXJkZXJzT3B0aW9ucyk6IFByb21pc2U8V2FsbGV0RGF0YT4ge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5mb3J3YXJkZXJBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3J3YXJkZXIgYWRkcmVzcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybCgnL2Z1bmRGb3J3YXJkZXInKTtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGZ1bmRzIGZyb20gYSBmZWUgYWRkcmVzcyB0byBhIGZvcndhcmRlci5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7TGlzdH0gcGFyYW1zLmZvcndhcmRlcnMgLSBsaXN0IG9mIGZ1bmQgZm9yd2FyZGVyIG9wdGlvbnNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZnVuZEZvcndhcmRlcnMocGFyYW1zOiBGdW5kRm9yd2FyZGVyUGFyYW1zKTogUHJvbWlzZTxXYWxsZXREYXRhPiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmZvcndhcmRlcnMpIHx8IHBhcmFtcy5mb3J3YXJkZXJzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Z1bmQgZm9yd2FyZGVyIG9wdGlvbnMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9mdW5kZm9yd2FyZGVycycpO1xuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh1cmwpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZm9yd2FyZGVyJ3MgYmFsYW5jZVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gb3B0aW9uYWwgcXVlcnkgcGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyBMaXN0IG9mIGZvcndhcmRlciBhZGRyZXNzIGFuZCBiYWxhbmNlXG4gICAqIGlmIHBhcmFtcyBpcyBub3Qgc2V0IHRoZW4gcmV0dXJucyBsb3cgYmFsYW5jZSBmb3J3YXJkZXJzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Rm9yd2FyZGVyQmFsYW5jZShwYXJhbXM/OiBGb3J3YXJkZXJCYWxhbmNlT3B0aW9ucyk6IFByb21pc2U8Rm9yd2FyZGVyQmFsYW5jZVtdPiB7XG4gICAgY29uc3QgcXVlcnk6IEZvcndhcmRlckJhbGFuY2VPcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcz8ubWF4aW11bUJhbGFuY2UpIHtcbiAgICAgIHF1ZXJ5Lm1heGltdW1CYWxhbmNlID0gcGFyYW1zPy5tYXhpbXVtQmFsYW5jZTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zPy5taW5pbXVtQmFsYW5jZSkge1xuICAgICAgcXVlcnkubWluaW11bUJhbGFuY2UgPSBwYXJhbXM/Lm1pbmltdW1CYWxhbmNlO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKGAvZm9yd2FyZGVycy9iYWxhbmNlc2ApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodXJsKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIHJlc3BvbnNlIGFzIEZvcndhcmRlckJhbGFuY2VbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBlY2RzYSB0c3MgY2hhbGxlbmdlcyBmb3IgYSB3YWxsZXQuXG4gICAqIFRoZXNlIGFyZSBzdGF0aWMgY2hhbGxlbmdlcyB0aGF0IGhhdmUgYmVlbiB2ZXJpZmllZCBieSBhbiBlbnRlcnByaXNlIGFkbWluLlxuICAgKiBDYWxsZXJzIHNob3VsZCB2ZXJpZnkgdGhhdCBhbiBlbnRlcnByaXNlIGFkbWluIHNpZ25lZCB0aGUgY2hhbGxlbmdlIHZhbHVlcyBiZWZvcmUgdXNpbmcgdGhlbS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8V2FsbGV0RWNkc2FDaGFsbGVuZ2VzPn1cbiAgICovXG4gIGFzeW5jIGdldENoYWxsZW5nZXNGb3JFY2RzYVNpZ25pbmcoKTogUHJvbWlzZTxXYWxsZXRFY2RzYUNoYWxsZW5nZXM+IHtcbiAgICAvLyBub3RlOiB0aGlzIGlzIG5vdCBhIGNvaW4gc3BlY2lmaWMgcm91dGUsIHdlIGNhbm5vdCB1c2UgdGhpcy51cmwoLi4pXG4gICAgY29uc3QgdXJsID0gdGhpcy5iaXRnby51cmwoYC93YWxsZXQvJHt0aGlzLmlkKCl9L2NoYWxsZW5nZXNgLCAyKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodXJsKS5xdWVyeSh7fSkucmVzdWx0KCk7XG4gIH1cblxuICBwcml2YXRlIHNlbmRUcmFuc2FjdGlvbihwYXJhbXM6IFR4U2VuZEJvZHksIHJlcUlkPzogSVJlcXVlc3RUcmFjZXIpIHtcbiAgICAvLyBleHRyYWN0IHRoZSB3aGl0ZWxpc3RlZCBwYXJhbXMgZnJvbSB0aGUgdG9wIGxldmVsLCBpbiBjYXNlXG4gICAgLy8gb3RoZXIgaW52YWxpZCBwYXJhbXMgYXJlIHByZXNlbnQgdGhhdCB3b3VsZCBmYWlsIGVuY29kaW5nXG4gICAgLy8gYW5kIGZhbGwgYmFjayB0byB0aGUgYm9keSBwYXJhbXNcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IHRoaXMuYmFzZUNvaW4ucHJlcHJvY2Vzc0J1aWxkUGFyYW1zKF8ucGljayhwYXJhbXMsIHdoaXRlbGlzdGVkU2VuZFBhcmFtcykpO1xuICAgIGNvbnN0IHJlcVRyYWNlciA9IHJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcVRyYWNlcik7XG4gICAgcmV0dXJuIHBvc3RXaXRoQ29kZWMoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvdHgvc2VuZCcpLFxuICAgICAgdC5pbnRlcnNlY3Rpb24oW1R4U2VuZEJvZHksIHQucGFydGlhbCh7IGxvY2t0aW1lOiB0Lm51bWJlciB9KV0pLFxuICAgICAgd2hpdGVsaXN0ZWRQYXJhbXNcbiAgICApLnJlc3VsdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWF0ZVRyYW5zYWN0aW9uKHBhcmFtczogVHhTZW5kQm9keSwgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcikge1xuICAgIC8vIGV4dHJhY3QgdGhlIHdoaXRlbGlzdGVkIHBhcmFtcyBmcm9tIHRoZSB0b3AgbGV2ZWwsIGluIGNhc2VcbiAgICAvLyBvdGhlciBpbnZhbGlkIHBhcmFtcyBhcmUgcHJlc2VudCB0aGF0IHdvdWxkIGZhaWwgZW5jb2RpbmdcbiAgICAvLyBhbmQgZmFsbCBiYWNrIHRvIHRoZSBib2R5IHBhcmFtc1xuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gdGhpcy5iYXNlQ29pbi5wcmVwcm9jZXNzQnVpbGRQYXJhbXMoXy5waWNrKHBhcmFtcywgd2hpdGVsaXN0ZWRTZW5kUGFyYW1zKSk7XG4gICAgY29uc3QgcmVxVHJhY2VyID0gcmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxVHJhY2VyKTtcbiAgICByZXR1cm4gcG9zdFdpdGhDb2RlYyhcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy90eC9pbml0aWF0ZScpLFxuICAgICAgVHhTZW5kQm9keSxcbiAgICAgIHdoaXRlbGlzdGVkUGFyYW1zXG4gICAgKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgd2FsbGV0IGtleWNoYWlucyBhbmQgdmFsaWRhdGUgcGFzc3BocmFzZSBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIHtQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9uc30gcGFyYW1zIC0gcHJlYnVpbGQgdHJhbnNhY3Rpb24gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZCBmb3IgdHJhY2luZyBwdXJwb3Nlc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJhbXMuY3VzdG9tU2lnbmluZ0Z1bmN0aW9uIC0gY3VzdG9tIHNpZ25pbmcgZnVuY3Rpb24gZm9yIGV4dGVybmFsIHNpZ25pbmdcbiAgICogQHJldHVybnMge1Byb21pc2U8S2V5Y2hhaW5bXT59XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZSh7XG4gICAgY3VzdG9tU2lnbmluZ0Z1bmN0aW9uLFxuICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgcmVxSWQsXG4gIH06IFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zICYgV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8S2V5Y2hhaW5bXT4ge1xuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMsIHJlcUlkIH0pO1xuXG4gICAgLy8gRG9pbmcgYSBzYW5pdHkgY2hlY2sgZm9yIHBhc3N3b3JkIGhlcmUgdG8gYXZvaWQgZG9pbmcgZnVydGhlciB3b3JrIGlmIHdlIGtub3cgaXQncyB3cm9uZ1xuICAgIC8vIHdlIGlnbm9yZSB0aGlzIGNoZWNrIHdpdGggaWYgY3VzdG9tU2lnbmluZ0Z1bmN0aW9uIGlzIHByb3ZpZGVkXG4gICAgLy8gIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHVzZXIgaXMgaGFuZGxpbmcgdGhlIHNpZ25pbmcgaW4gZXh0ZXJuYWwgc2lnbmluZyBtb2RlXG4gICAgaWYgKCFjdXN0b21TaWduaW5nRnVuY3Rpb24gJiYga2V5Y2hhaW5zPy5bMF0/LmVuY3J5cHRlZFBydiAmJiB3YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICBpZiAoIWRlY3J5cHRLZXljaGFpblByaXZhdGVLZXkodGhpcy5iaXRnbywga2V5Y2hhaW5zWzBdLCB3YWxsZXRQYXNzcGhyYXNlKSkge1xuICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgJiB7IGNvZGU/OiBzdHJpbmcgfSA9IG5ldyBFcnJvcihcbiAgICAgICAgICBgdW5hYmxlIHRvIGRlY3J5cHQga2V5Y2hhaW4gd2l0aCB0aGUgZ2l2ZW4gd2FsbGV0IHBhc3NwaHJhc2VgXG4gICAgICAgICk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnd2FsbGV0X3Bhc3NwaHJhc2VfaW5jb3JyZWN0JztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBrZXljaGFpbnM7XG4gIH1cblxuICAvKipcbiAgICogQXBwcm92ZSB0b2tlbiBmb3IgdXNlIHdpdGggYSBiYXRjaGVyIGNvbnRyYWN0XG4gICAqIFRoaXMgZnVuY3Rpb24gYnVpbGRzLCBzaWducywgYW5kIHNlbmRzIGEgdG9rZW4gYXBwcm92YWwgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHdhbGxldFBhc3NwaHJhc2UgLSBUaGUgcGFzc3BocmFzZSB0byBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIHVzZXIga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlbk5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdG9rZW4gdG8gYmUgYXBwcm92ZWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gVGhlIHRyYW5zYWN0aW9uIGRldGFpbHNcbiAgICovXG4gIGFzeW5jIGFwcHJvdmVFcmMyMFRva2VuKHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZywgdG9rZW5OYW1lOiBzdHJpbmcpOiBQcm9taXNlPFN1Ym1pdFRyYW5zYWN0aW9uUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcblxuICAgIGxldCB0b2tlbkFwcHJvdmFsQnVpbGQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMuYmFzZUNvaW4udXJsKGAvd2FsbGV0LyR7dGhpcy5pZCgpfS90b2tlbi9hcHByb3ZhbC9idWlsZGApO1xuICAgICAgdG9rZW5BcHByb3ZhbEJ1aWxkID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAucG9zdCh1cmwpXG4gICAgICAgIC5zZW5kKHtcbiAgICAgICAgICB0b2tlbk5hbWU6IHRva2VuTmFtZSxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc3VsdCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5nZXRLZXljaGFpbnNBbmRWYWxpZGF0ZVBhc3NwaHJhc2Uoe1xuICAgICAgcmVxSWQsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2lnbmluZ1BhcmFtcyA9IHtcbiAgICAgIHR4UHJlYnVpbGQ6IHRva2VuQXBwcm92YWxCdWlsZCxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgcmVxSWQsXG4gICAgfTtcblxuICAgIGNvbnN0IGhhbGZTaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHNpZ25pbmdQYXJhbXMpO1xuICAgIGNvbnN0IGZpbmFsVHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgaGFsZlNpZ25lZFRyYW5zYWN0aW9uKTtcblxuICAgIHJldHVybiB0aGlzLnNlbmRUcmFuc2FjdGlvbihmaW5hbFR4UGFyYW1zLCByZXFJZCk7XG4gIH1cbn1cbiJdfQ==
|