@bitgo/sdk-core 28.15.2 → 28.17.1

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.
Files changed (45) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/src/account-lib/baseCoin/ed25519KeyPair.js +4 -7
  3. package/dist/src/account-lib/baseCoin/enum.d.ts +12 -11
  4. package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
  5. package/dist/src/account-lib/baseCoin/enum.js +14 -12
  6. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.js +3 -5
  7. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +4 -4
  8. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.js +3 -3
  9. package/dist/src/account-lib/mpc/util.js +2 -3
  10. package/dist/src/bitgo/address-book/address-book.js +5 -8
  11. package/dist/src/bitgo/enterprise/enterprise.js +3 -4
  12. package/dist/src/bitgo/enterprise/enterprises.js +5 -5
  13. package/dist/src/bitgo/keychain/decryptKeychain.js +2 -3
  14. package/dist/src/bitgo/keychain/keychains.js +7 -9
  15. package/dist/src/bitgo/lightning/custodial/lightning.js +9 -9
  16. package/dist/src/bitgo/lightning/custodial/lightningUtils.js +3 -4
  17. package/dist/src/bitgo/lightning/lightningWallet.js +5 -6
  18. package/dist/src/bitgo/pendingApproval/pendingApproval.js +4 -6
  19. package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
  20. package/dist/src/bitgo/staking/stakingWallet.js +4 -4
  21. package/dist/src/bitgo/tss/ecdsa/ecdsa.js +5 -9
  22. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +2 -3
  23. package/dist/src/bitgo/utils/mpcUtils.js +4 -5
  24. package/dist/src/bitgo/utils/opengpgUtils.js +4 -4
  25. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +1 -0
  26. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  27. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +13 -18
  28. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +9 -15
  29. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +11 -16
  30. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +2 -3
  31. package/dist/src/bitgo/utils/txRequest.d.ts +10 -0
  32. package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -0
  33. package/dist/src/bitgo/utils/txRequest.js +47 -0
  34. package/dist/src/bitgo/wallet/iWallet.d.ts +1 -1
  35. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  36. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  37. package/dist/src/bitgo/wallet/wallet.d.ts +1 -1
  38. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  39. package/dist/src/bitgo/wallet/wallet.js +42 -71
  40. package/dist/src/bitgo/wallet/wallets.js +9 -15
  41. package/dist/test/unit/bitgo/utils/txRequest.d.ts +2 -0
  42. package/dist/test/unit/bitgo/utils/txRequest.d.ts.map +1 -0
  43. package/dist/test/unit/bitgo/utils/txRequest.js +105 -0
  44. package/dist/tsconfig.tsbuildinfo +1 -1
  45. package/package.json +3 -3
@@ -95,7 +95,6 @@ class Wallets {
95
95
  * "keys": array of keychain ids
96
96
  */
97
97
  async add(params) {
98
- var _a, _b;
99
98
  params = params || {};
100
99
  common.validateParams(params, [], ['label', 'enterprise', 'type']);
101
100
  if (typeof params.label !== 'string') {
@@ -122,7 +121,7 @@ class Wallets {
122
121
  const tssSettings = await this.bitgo
123
122
  .get(this.bitgo.microservicesUrl('/api/v2/tss/settings'))
124
123
  .result();
125
- const multisigTypeVersion = (_b = (_a = tssSettings.coinSettings[this.baseCoin.getFamily()]) === null || _a === void 0 ? void 0 : _a.walletCreationSettings) === null || _b === void 0 ? void 0 : _b.multiSigTypeVersion;
124
+ const multisigTypeVersion = tssSettings.coinSettings[this.baseCoin.getFamily()]?.walletCreationSettings?.multiSigTypeVersion;
126
125
  if (multisigTypeVersion === 'MPCv2') {
127
126
  params.walletVersion = 5;
128
127
  }
@@ -227,7 +226,6 @@ class Wallets {
227
226
  * @returns {*}
228
227
  */
229
228
  async generateWallet(params = {}) {
230
- var _a;
231
229
  if (this.baseCoin.getFamily() === 'lnbtc') {
232
230
  const options = (0, utils_1.decodeOrElse)(iWallets_1.GenerateLightningWalletOptionsCodec.name, iWallets_1.GenerateLightningWalletOptionsCodec, params, (errors) => {
233
231
  throw new Error(`error(s) parsing generate lightning wallet request params: ${errors}`);
@@ -402,7 +400,7 @@ class Wallets {
402
400
  }
403
401
  let derivationPath = undefined;
404
402
  const reqId = new utils_1.RequestTracer();
405
- if (params.type === 'custodial' && ((_a = params.multisigType) !== null && _a !== void 0 ? _a : 'onchain') === 'onchain') {
403
+ if (params.type === 'custodial' && (params.multisigType ?? 'onchain') === 'onchain') {
406
404
  // for custodial multisig, when the wallet is created on the platfor side, the keys are not needed
407
405
  walletParams.n = undefined;
408
406
  walletParams.m = undefined;
@@ -614,16 +612,15 @@ class Wallets {
614
612
  * @param userPassword
615
613
  */
616
614
  async reshareWalletWithSpenders(walletId, userPassword) {
617
- var _a, _b;
618
615
  const wallet = await this.get({ id: walletId });
619
- if (!((_a = wallet === null || wallet === void 0 ? void 0 : wallet._wallet) === null || _a === void 0 ? void 0 : _a.enterprise)) {
616
+ if (!wallet?._wallet?.enterprise) {
620
617
  throw new Error('Enterprise not found for the wallet');
621
618
  }
622
619
  const enterpriseUsersResponse = await this.bitgo
623
- .get(this.bitgo.url(`/enterprise/${(_b = wallet === null || wallet === void 0 ? void 0 : wallet._wallet) === null || _b === void 0 ? void 0 : _b.enterprise}/user`))
620
+ .get(this.bitgo.url(`/enterprise/${wallet?._wallet?.enterprise}/user`))
624
621
  .result();
625
622
  // create a map of users for easy lookup - we need the user email id to share the wallet
626
- const usersMap = new Map([...enterpriseUsersResponse === null || enterpriseUsersResponse === void 0 ? void 0 : enterpriseUsersResponse.adminUsers, ...enterpriseUsersResponse === null || enterpriseUsersResponse === void 0 ? void 0 : enterpriseUsersResponse.nonAdminUsers].map((obj) => [obj.id, obj]));
623
+ const usersMap = new Map([...enterpriseUsersResponse?.adminUsers, ...enterpriseUsersResponse?.nonAdminUsers].map((obj) => [obj.id, obj]));
627
624
  if (wallet._wallet.users) {
628
625
  for (const user of wallet._wallet.users) {
629
626
  const userObject = usersMap.get(user.user);
@@ -844,12 +841,11 @@ class Wallets {
844
841
  * @private
845
842
  */
846
843
  async generateMpcWallet({ passphrase, label, multisigType, enterprise, walletVersion, originalPasscodeEncryptionCode, backupProvider, }) {
847
- var _a, _b;
848
844
  if (multisigType === 'tss' && this.baseCoin.getMPCAlgorithm() === 'ecdsa') {
849
845
  const tssSettings = await this.bitgo
850
846
  .get(this.bitgo.microservicesUrl('/api/v2/tss/settings'))
851
847
  .result();
852
- const multisigTypeVersion = (_b = (_a = tssSettings.coinSettings[this.baseCoin.getFamily()]) === null || _a === void 0 ? void 0 : _a.walletCreationSettings) === null || _b === void 0 ? void 0 : _b.multiSigTypeVersion;
848
+ const multisigTypeVersion = tssSettings.coinSettings[this.baseCoin.getFamily()]?.walletCreationSettings?.multiSigTypeVersion;
853
849
  walletVersion = this.determineEcdsaMpcWalletVersion(walletVersion, multisigTypeVersion);
854
850
  }
855
851
  const reqId = new utils_1.RequestTracer();
@@ -894,7 +890,6 @@ class Wallets {
894
890
  * @private
895
891
  */
896
892
  async generateSMCMpcWallet({ label, multisigType, enterprise, walletVersion, bitgoKeyId, commonKeychain, coldDerivationSeed, }) {
897
- var _a, _b;
898
893
  const reqId = new utils_1.RequestTracer();
899
894
  this.bitgo.setRequestTracer(reqId);
900
895
  let multisigTypeVersion;
@@ -903,7 +898,7 @@ class Wallets {
903
898
  .get(this.bitgo.microservicesUrl('/api/v2/tss/settings'))
904
899
  .result();
905
900
  multisigTypeVersion =
906
- (_b = (_a = tssSettings.coinSettings[this.baseCoin.getFamily()]) === null || _a === void 0 ? void 0 : _a.walletCreationSettings) === null || _b === void 0 ? void 0 : _b.coldMultiSigTypeVersion;
901
+ tssSettings.coinSettings[this.baseCoin.getFamily()]?.walletCreationSettings?.coldMultiSigTypeVersion;
907
902
  walletVersion = this.determineEcdsaMpcWalletVersion(walletVersion, multisigTypeVersion);
908
903
  }
909
904
  // Create MPC Keychains
@@ -965,14 +960,13 @@ class Wallets {
965
960
  * @private
966
961
  */
967
962
  async generateCustodialMpcWallet({ label, multisigType, enterprise, walletVersion, }) {
968
- var _a, _b;
969
963
  const reqId = new utils_1.RequestTracer();
970
964
  this.bitgo.setRequestTracer(reqId);
971
965
  if (multisigType === 'tss' && this.baseCoin.getMPCAlgorithm() === 'ecdsa') {
972
966
  const tssSettings = await this.bitgo
973
967
  .get(this.bitgo.microservicesUrl('/api/v2/tss/settings'))
974
968
  .result();
975
- const multisigTypeVersion = (_b = (_a = tssSettings.coinSettings[this.baseCoin.getFamily()]) === null || _a === void 0 ? void 0 : _a.walletCreationSettings) === null || _b === void 0 ? void 0 : _b.custodialMultiSigTypeVersion;
969
+ const multisigTypeVersion = tssSettings.coinSettings[this.baseCoin.getFamily()]?.walletCreationSettings?.custodialMultiSigTypeVersion;
976
970
  walletVersion = this.determineEcdsaMpcWalletVersion(walletVersion, multisigTypeVersion);
977
971
  }
978
972
  const finalWalletParams = {
@@ -1005,4 +999,4 @@ class Wallets {
1005
999
  }
1006
1000
  }
1007
1001
  exports.Wallets = Wallets;
1008
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvd2FsbGV0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0Q0Esc0RBSUM7QUFoREQ7O0dBRUc7QUFDSCxvREFBNEI7QUFDNUIsK0NBQXlDO0FBQ3pDLDhDQUF3QztBQUN4QywwQ0FBNEI7QUFDNUIsNENBQTZDO0FBRTdDLG1DQUErQztBQUMvQyxxREFBdUM7QUFHdkMsa0NBQTBDO0FBQzFDLDBDQUF1RTtBQUN2RSxvQ0FBcUU7QUFDckUseUNBb0JvQjtBQUVwQixxQ0FBa0M7QUFHbEM7O0dBRUc7QUFDSCxTQUFnQixxQkFBcUIsQ0FDbkMsTUFBMEQ7SUFFMUQsT0FBTyxNQUFNLENBQUMsWUFBWSxLQUFLLHFCQUFxQixDQUFDO0FBQ3ZELENBQUM7QUFFRCxNQUFhLE9BQU87SUFJbEIsWUFBWSxLQUFnQixFQUFFLFFBQW1CO1FBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQTJCLEVBQUU7UUFDckMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFzRCxFQUFFO1FBQ2pFLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFD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QUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7WUFDMUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7WUFDeEUsWUFBWSxFQUFFLHFCQUFxQjtTQUNwQyxDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLDhCQUE4QixDQUFDLGFBQXNCLEVBQUUsbUJBQTRCO1FBQ3pGLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxtQkFBbUIsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUM3RCxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsYUFBYSxLQUFLLENBQUMsSUFBSSxhQUFhLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDbkUsT0FBTyxDQUFDLENBQUM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRjtBQS9sQ0QsMEJBK2xDQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEJpZ051bWJlciB9IGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBDb2luRmVhdHVyZSB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcblxuaW1wb3J0IHsgc2FuaXRpemVMZWdhY3lQYXRoIH0gZnJvbSAnLi4vLi4vYXBpJztcbmltcG9ydCAqIGFzIGNvbW1vbiBmcm9tICcuLi8uLi9jb21tb24nO1xuaW1wb3J0IHsgSUJhc2VDb2luLCBLZXljaGFpbnNUcmlwbGV0LCBLZXlQYWlyLCBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zIH0gZnJvbSAnLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IGdldFNoYXJlZFNlY3JldCB9IGZyb20gJy4uL2VjZGgnO1xuaW1wb3J0IHsgQWRkS2V5Y2hhaW5PcHRpb25zLCBLZXljaGFpbiwgS2V5SW5kaWNlcyB9IGZyb20gJy4uL2tleWNoYWluJztcbmltcG9ydCB7IGRlY29kZU9yRWxzZSwgcHJvbWlzZVByb3BzLCBSZXF1ZXN0VHJhY2VyIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgQWNjZXB0U2hhcmVPcHRpb25zLFxuICBBY2NlcHRTaGFyZU9wdGlvbnNSZXF1ZXN0LFxuICBBY2NlcHRTaGFyZVJlc3BvbnNlLFxuICBBZGRXYWxsZXRPcHRpb25zLFxuICBCdWxrQWNjZXB0U2hhcmVPcHRpb25zLFxuICBHZW5lcmF0ZUJhc2VNcGNXYWxsZXRPcHRpb25zLFxuICBHZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldE9wdGlvbnMsXG4gIEdlbmVyYXRlTGlnaHRuaW5nV2FsbGV0T3B0aW9uc0NvZGVjLFxuICBHZW5lcmF0ZU1wY1dhbGxldE9wdGlvbnMsXG4gIEdlbmVyYXRlU01DTXBjV2FsbGV0T3B0aW9ucyxcbiAgR2VuZXJhdGVXYWxsZXRPcHRpb25zLFxuICBHZXRXYWxsZXRCeUFkZHJlc3NPcHRpb25zLFxuICBHZXRXYWxsZXRPcHRpb25zLFxuICBJV2FsbGV0cyxcbiAgTGlnaHRuaW5nV2FsbGV0V2l0aEtleWNoYWlucyxcbiAgTGlzdFdhbGxldE9wdGlvbnMsXG4gIFVwZGF0ZVNoYXJlT3B0aW9ucyxcbiAgV2FsbGV0U2hhcmVzLFxuICBXYWxsZXRXaXRoS2V5Y2hhaW5zLFxufSBmcm9tICcuL2lXYWxsZXRzJztcbmltcG9ydCB7IFdhbGxldFNoYXJlIH0gZnJvbSAnLi9pV2FsbGV0JztcbmltcG9ydCB7IFdhbGxldCB9IGZyb20gJy4vd2FsbGV0JztcbmltcG9ydCB7IFRzc1NldHRpbmdzIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5cbi8qKlxuICogQ2hlY2sgaWYgYSB3YWxsZXQgaXMgYSBXYWxsZXRXaXRoS2V5Y2hhaW5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1dhbGxldFdpdGhLZXljaGFpbnMoXG4gIHdhbGxldDogV2FsbGV0V2l0aEtleWNoYWlucyB8IExpZ2h0bmluZ1dhbGxldFdpdGhLZXljaGFpbnNcbik6IHdhbGxldCBpcyBXYWxsZXRXaXRoS2V5Y2hhaW5zIHtcbiAgcmV0dXJuIHdhbGxldC5yZXNwb25zZVR5cGUgPT09ICdXYWxsZXRXaXRoS2V5Y2hhaW5zJztcbn1cblxuZXhwb3J0IGNsYXNzIFdhbGxldHMgaW1wbGVtZW50cyBJV2FsbGV0cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlQ29pbjogSUJhc2VDb2luO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGJhc2VDb2luOiBJQmFzZUNvaW4pIHtcbiAgICB0aGlzLmJpdGdvID0gYml0Z287XG4gICAgdGhpcy5iYXNlQ29pbiA9IGJhc2VDb2luO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHdhbGxldCBieSBJRCAocHJveHkgZm9yIGdldFdhbGxldClcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgZ2V0KHBhcmFtczogR2V0V2FsbGV0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRXYWxsZXQocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGEgdXNlcidzIHdhbGxldHNcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGxpc3QocGFyYW1zOiBMaXN0V2FsbGV0T3B0aW9ucyAmIHsgZW50ZXJwcmlzZT86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPHsgd2FsbGV0czogV2FsbGV0W10gfT4ge1xuICAgIGlmIChwYXJhbXMuc2tpcCAmJiBwYXJhbXMucHJldklkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBzcGVjaWZ5IGJvdGggc2tpcCBhbmQgcHJldklkJyk7XG4gICAgfVxuICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQnKSkucXVlcnkocGFyYW1zKS5yZXN1bHQoKSkgYXMgYW55O1xuICAgIGJvZHkud2FsbGV0cyA9IGJvZHkud2FsbGV0cy5tYXAoKHcpID0+IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgdykpO1xuICAgIHJldHVybiBib2R5O1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZFxuICAgKiBBZGQgYSBuZXcgd2FsbGV0IChhZHZhbmNlZCBtb2RlKS5cbiAgICogVGhpcyBhbGxvd3MgeW91IHRvIG1hbnVhbGx5IHN1Ym1pdCB0aGUga2V5cywgdHlwZSwgbSBhbmQgbiBvZiB0aGUgd2FsbGV0XG4gICAqIFBhcmFtZXRlcnMgaW5jbHVkZTpcbiAgICogICAgXCJsYWJlbFwiOiBsYWJlbCBvZiB0aGUgd2FsbGV0IHRvIGJlIHNob3duIGluIFVJXG4gICAqICAgIFwibVwiOiBudW1iZXIgb2Yga2V5cyByZXF1aXJlZCB0byB1bmxvY2sgd2FsbGV0ICgyKVxuICAgKiAgICBcIm5cIjogbnVtYmVyIG9mIGtleXMgYXZhaWxhYmxlIG9uIHRoZSB3YWxsZXQgKDMpXG4gICAqICAgIFwia2V5c1wiOiBhcnJheSBvZiBrZXljaGFpbiBpZHNcbiAgICovXG4gIGFzeW5jIGFkZChwYXJhbXM6IEFkZFdhbGxldE9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcblxuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ2xhYmVsJywgJ2VudGVycHJpc2UnLCAndHlwZSddKTtcblxuICAgIGlmICh0eXBlb2YgcGFyYW1zLmxhYmVsICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgbGFiZWwnKTtcbiAgICB9XG5cbiAgICAvLyBubyBuZWVkIHRvIHBhc3Mga2V5cyBmb3IgKHNpbmdsZSkgY3VzdG9kaWFsIHdhbGxldHNcbiAgICBpZiAocGFyYW1zLnR5cGUgIT09ICdjdXN0b2RpYWwnKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMua2V5cykgPT09IGZhbHNlIHx8ICFfLmlzTnVtYmVyKHBhcmFtcy5tKSB8fCAhXy5pc051bWJlcihwYXJhbXMubikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSB0eXBlcyBvZiBtdWx0aXNpZ1xuICAgICAgaWYgKCF0aGlzLmJhc2VDb2luLmlzVmFsaWRNb2ZOU2V0dXAocGFyYW1zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIG11bHRpLXNpZyB0eXBlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5nYXNQcmljZSAmJiAhXy5pc051bWJlcihwYXJhbXMuZ2FzUHJpY2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGdhc1ByaWNlIC0gbnVtYmVyIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy53YWxsZXRWZXJzaW9uKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLndhbGxldFZlcnNpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3Igd2FsbGV0VmVyc2lvbiAtIG51bWJlciBleHBlY3RlZCcpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnICYmIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlY2RzYScgJiYgcGFyYW1zLndhbGxldFZlcnNpb24gPT09IDMpIHtcbiAgICAgICAgY29uc3QgdHNzU2V0dGluZ3M6IFRzc1NldHRpbmdzID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAgIC5nZXQodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL3YyL3Rzcy9zZXR0aW5ncycpKVxuICAgICAgICAgIC5yZXN1bHQoKTtcbiAgICAgICAgY29uc3QgbXVsdGlzaWdUeXBlVmVyc2lvbiA9XG4gICAgICAgICAgdHNzU2V0dGluZ3MuY29pblNldHRpbmdzW3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCldPy53YWxsZXRDcmVhdGlvblNldHRpbmdzPy5tdWx0aVNpZ1R5cGVWZXJzaW9uO1xuICAgICAgICBpZiAobXVsdGlzaWdUeXBlVmVyc2lvbiA9PT0gJ01QQ3YyJykge1xuICAgICAgICAgIHBhcmFtcy53YWxsZXRWZXJzaW9uID0gNTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbXMudGFncyAmJiBBcnJheS5pc0FycmF5KHBhcmFtcy50YWdzKSA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgdGFncyAtIGFycmF5IGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5jbGllbnRGbGFncyAmJiBBcnJheS5pc0FycmF5KHBhcmFtcy5jbGllbnRGbGFncykgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGNsaWVudEZsYWdzIC0gYXJyYXkgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmlzQ29sZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmlzQ29sZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgaXNDb2xkIC0gYm9vbGVhbiBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuaXNDdXN0b2RpYWwgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5pc0N1c3RvZGlhbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgaXNDdXN0b2RpYWwgLSBib29sZWFuIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzICYmICghXy5pc1N0cmluZyhwYXJhbXMuYWRkcmVzcykgfHwgIXRoaXMuYmFzZUNvaW4uaXNWYWxpZEFkZHJlc3MocGFyYW1zLmFkZHJlc3MpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBhZGRyZXNzIC0gdmFsaWQgYWRkcmVzcyBzdHJpbmcgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4ge1xuICAgICAgd2FsbGV0OiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVMaWdodG5pbmdXYWxsZXQocGFyYW1zOiBHZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldE9wdGlvbnMpOiBQcm9taXNlPExpZ2h0bmluZ1dhbGxldFdpdGhLZXljaGFpbnM+IHtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcblxuICAgIGNvbnN0IHsgbGFiZWwsIHBhc3NwaHJhc2UsIGVudGVycHJpc2UsIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUgfSA9IHBhcmFtcztcblxuICAgIGNvbnN0IGtleWNoYWluUHJvbWlzZXMgPSAoW3VuZGVmaW5lZCwgJ3VzZXJBdXRoJywgJ25vZGVBdXRoJ10gYXMgY29uc3QpLm1hcCgocHVycG9zZSkgPT4ge1xuICAgICAgcmV0dXJuIGFzeW5jICgpOiBQcm9taXNlPEtleWNoYWluPiA9PiB7XG4gICAgICAgIGxldCBrZXljaGFpbjogS2V5UGFpciB8IG51bGwgPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZSgpO1xuICAgICAgICBjb25zdCBwdWIgPSBrZXljaGFpbi5wdWI7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7IHBhc3N3b3JkOiBwYXNzcGhyYXNlLCBpbnB1dDoga2V5Y2hhaW4ucHJ2IH0pO1xuICAgICAgICBkZWxldGUgKGtleWNoYWluIGFzIGFueSkucHJ2O1xuICAgICAgICBrZXljaGFpbiA9IG51bGw7XG4gICAgICAgIGNvbnN0IGtleWNoYWluUGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7XG4gICAgICAgICAgcHViLFxuICAgICAgICAgIGVuY3J5cHRlZFBydixcbiAgICAgICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6IHB1cnBvc2UgPT09IHVuZGVmaW5lZCA/IHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgY29pblNwZWNpZmljOiBwdXJwb3NlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB7IFt0aGlzLmJhc2VDb2luLmdldENoYWluKCldOiB7IHB1cnBvc2UgfSB9LFxuICAgICAgICAgIGtleVR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZChrZXljaGFpblBhcmFtcyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyB1c2VyS2V5Y2hhaW4sIHVzZXJBdXRoS2V5Y2hhaW4sIG5vZGVBdXRoS2V5Y2hhaW4gfSA9IGF3YWl0IHByb21pc2VQcm9wcyh7XG4gICAgICB1c2VyS2V5Y2hhaW46IGtleWNoYWluUHJvbWlzZXNbMF0oKSxcbiAgICAgIHVzZXJBdXRoS2V5Y2hhaW46IGtleWNoYWluUHJvbWlzZXNbMV0oKSxcbiAgICAgIG5vZGVBdXRoS2V5Y2hhaW46IGtleWNoYWluUHJvbWlzZXNbMl0oKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHdhbGxldFBhcmFtczogU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyA9IHtcbiAgICAgIGxhYmVsLFxuICAgICAgbTogMSxcbiAgICAgIG46IDEsXG4gICAgICB0eXBlOiAnaG90JyxcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICBrZXlzOiBbdXNlcktleWNoYWluLmlkXSxcbiAgICAgIGNvaW5TcGVjaWZpYzogeyBbdGhpcy5iYXNlQ29pbi5nZXRDaGFpbigpXTogeyBrZXlzOiBbdXNlckF1dGhLZXljaGFpbi5pZCwgbm9kZUF1dGhLZXljaGFpbi5pZF0gfSB9LFxuICAgIH07XG5cbiAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQod2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcbiAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdhbGxldCxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIHVzZXJBdXRoS2V5Y2hhaW4sXG4gICAgICBub2RlQXV0aEtleWNoYWluLFxuICAgICAgcmVzcG9uc2VUeXBlOiAnTGlnaHRuaW5nV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIG5ldyB3YWxsZXRcbiAgICogMS4gQ3JlYXRlcyB0aGUgdXNlciBrZXljaGFpbiBsb2NhbGx5IG9uIHRoZSBjbGllbnQsIGFuZCBlbmNyeXB0cyBpdCB3aXRoIHRoZSBwcm92aWRlZCBwYXNzcGhyYXNlXG4gICAqIDIuIElmIG5vIHB1YiB3YXMgcHJvdmlkZWQsIGNyZWF0ZXMgdGhlIGJhY2t1cCBrZXljaGFpbiBsb2NhbGx5IG9uIHRoZSBjbGllbnQsIGFuZCBlbmNyeXB0cyBpdCB3aXRoIHRoZSBwcm92aWRlZCBwYXNzcGhyYXNlXG4gICAqIDMuIFVwbG9hZHMgdGhlIGVuY3J5cHRlZCB1c2VyIGFuZCBiYWNrdXAga2V5Y2hhaW5zIHRvIEJpdEdvXG4gICAqIDQuIENyZWF0ZXMgdGhlIEJpdEdvIGtleSBvbiB0aGUgc2VydmljZVxuICAgKiA1LiBDcmVhdGVzIHRoZSB3YWxsZXQgb24gQml0R28gd2l0aCB0aGUgMyBwdWJsaWMga2V5cyBhYm92ZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMubGFiZWwgTGFiZWwgZm9yIHRoZSB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtcy5wYXNzcGhyYXNlIFBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBlbmNyeXB0IHRoZSB1c2VyIGFuZCBiYWNrdXAga2V5Y2hhaW5zXG4gICAqIEBwYXJhbSBwYXJhbXMudXNlcktleSBVc2VyIHhwdWJcbiAgICogQHBhcmFtIHBhcmFtcy5iYWNrdXBYcHViIEJhY2t1cCB4cHViXG4gICAqIEBwYXJhbSBwYXJhbXMuYmFja3VwWHB1YlByb3ZpZGVyXG4gICAqIEBwYXJhbSBwYXJhbXMuYmFja3VwUHJvdmlkZXIgVGhpcmQgcGFydHkgYmFja3VwIHByb3ZpZGVyIGZvciBUU1NcbiAgICogQHBhcmFtIHBhcmFtcy5lbnRlcnByaXNlIHRoZSBlbnRlcnByaXNlSWRcbiAgICogQHBhcmFtIHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zXG4gICAqIEBwYXJhbSBwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSBvcHRpb25hbCB0aGlzIGlzIGEgcmVjb3ZlcnkgY29kZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIG9yaWdpbmFsIHBhc3NwaHJhc2UgaW4gYSByZWNvdmVyeSBjYXNlLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHVzZXIgbXVzdCBnZW5lcmF0ZSBhbmQga2VlcCB0aGUgZW5jcnlwdGVkIG9yaWdpbmFsIHBhc3NwaHJhc2Ugc2FmZSB3aGlsZSB0aGlzIGNvZGUgaXMgc3RvcmVkIG9uIEJpdEdvXG4gICAqIEBwYXJhbSBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkIG9wdGlvbmFsIHNlZWQgZm9yIFNNQyB3YWxsZXRzXG4gICAqIEBwYXJhbSBwYXJhbXMuZ2FzUHJpY2VcbiAgICogQHBhcmFtIHBhcmFtcy5kaXNhYmxlS1JTRW1haWxcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRWZXJzaW9uXG4gICAqIEBwYXJhbSBwYXJhbXMubXVsdGlzaWdUeXBlIG9wdGlvbmFsIG11bHRpc2lnIHR5cGUsICdvbmNoYWluJyBvciAndHNzJyBvciAnYmxzZGtnJzsgaWYgYWJzZW50LCB3ZSB3aWxsIGRlZmVyIHRvIHRoZSBjb2luJ3MgZGVmYXVsdCB0eXBlXG4gICAqIEBwYXJhbSBwYXJhbXMuaXNEaXN0cmlidXRlZEN1c3RvZHkgb3B0aW9uYWwgcGFyYW1ldGVyIGZvciBjcmVhdGluZyBiaXRnbyBrZXkuIFRoaXMgaXMgb25seSBuZWNlc3NhcnkgaWYgeW91IHdhbnQgdG8gY3JlYXRlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBkaXN0cmlidXRlZCBjdXN0b2R5IHdhbGxldC4gSWYgcHJvdmlkZWQsIHlvdSBtdXN0IGhhdmUgdGhlIGVudGVycHJpc2UgbGljZW5zZSBhbmQgcGFzcyBpblxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBwYXJhbXMuZW50ZXJwcmlzZWAgaW50byBgZ2VuZXJhdGVXYWxsZXRgIGFzIHdlbGwuXG4gICAqIEBwYXJhbSBwYXJhbXMudHlwZSBvcHRpb25hbCB3YWxsZXQgdHlwZSwgJ2hvdCcgb3IgJ2NvbGQnIG9yICdjdXN0b2RpYWwnOyBpZiBhYnNlbnQsIHdlIHdpbGwgZGVmZXIgdG8gJ2hvdCdcbiAgICogQHBhcmFtIHBhcmFtcy5iaXRnb0tleUlkIG9wdGlvbmFsIGJpdGdvIGtleSBpZCBmb3IgU01DIFRTUyB3YWxsZXRzXG4gICAqIEBwYXJhbSBwYXJhbXMuY29tbW9uS2V5Y2hhaW4gb3B0aW9uYWwgY29tbW9uIGtleWNoYWluIGZvciBTTUMgVFNTIHdhbGxldHNcbiAgICpcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVdhbGxldChcbiAgICBwYXJhbXM6IEdlbmVyYXRlV2FsbGV0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8V2FsbGV0V2l0aEtleWNoYWlucyB8IExpZ2h0bmluZ1dhbGxldFdpdGhLZXljaGFpbnM+IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PT0gJ2xuYnRjJykge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGRlY29kZU9yRWxzZShcbiAgICAgICAgR2VuZXJhdGVMaWdodG5pbmdXYWxsZXRPcHRpb25zQ29kZWMubmFtZSxcbiAgICAgICAgR2VuZXJhdGVMaWdodG5pbmdXYWxsZXRPcHRpb25zQ29kZWMsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgKGVycm9ycykgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZXJyb3IocykgcGFyc2luZyBnZW5lcmF0ZSBsaWdodG5pbmcgd2FsbGV0IHJlcXVlc3QgcGFyYW1zOiAke2Vycm9yc31gKTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgY29uc3Qgd2FsbGV0RGF0YSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVMaWdodG5pbmdXYWxsZXQob3B0aW9ucyk7XG4gICAgICB3YWxsZXREYXRhLmVuY3J5cHRlZFdhbGxldFBhc3NwaHJhc2UgPSB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICBpbnB1dDogb3B0aW9ucy5wYXNzcGhyYXNlLFxuICAgICAgICBwYXNzd29yZDogb3B0aW9ucy5wYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gd2FsbGV0RGF0YTtcbiAgICB9XG5cbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2xhYmVsJ10sIFsncGFzc3BocmFzZScsICd1c2VyS2V5JywgJ2JhY2t1cFhwdWInXSk7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMubGFiZWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciBsYWJlbCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdHlwZSA9ICdob3QnLCBsYWJlbCwgcGFzc3BocmFzZSwgZW50ZXJwcmlzZSwgaXNEaXN0cmlidXRlZEN1c3RvZHkgfSA9IHBhcmFtcztcbiAgICBjb25zdCBpc1RzcyA9IHBhcmFtcy5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnICYmIHRoaXMuYmFzZUNvaW4uc3VwcG9ydHNUc3MoKTtcbiAgICBjb25zdCBjYW5FbmNyeXB0ID0gISFwYXNzcGhyYXNlICYmIHR5cGVvZiBwYXNzcGhyYXNlID09PSAnc3RyaW5nJztcblxuICAgIGNvbnN0IHdhbGxldFBhcmFtczogU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyA9IHtcbiAgICAgIGxhYmVsOiBsYWJlbCxcbiAgICAgIG06IDIsXG4gICAgICBuOiAzLFxuICAgICAga2V5czogW10sXG4gICAgICB0eXBlOiAhIXBhcmFtcy51c2VyS2V5ICYmIHBhcmFtcy5tdWx0aXNpZ1R5cGUgIT09ICdvbmNoYWluJyA/ICdjb2xkJyA6IHR5cGUsXG4gICAgfTtcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXNzY29kZUVuY3J5cHRpb25Db2RlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZW50ZXJwcmlzZSkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhlbnRlcnByaXNlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZW50ZXJwcmlzZSBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLmVudGVycHJpc2UgPSBlbnRlcnByaXNlO1xuICAgIH1cblxuICAgIC8vIEVWTSBUU1Mgd2FsbGV0cyBtdXN0IHVzZSB3YWxsZXQgdmVyc2lvbiAzLCA1IGFuZCA2XG4gICAgaWYgKFxuICAgICAgaXNUc3MgJiZcbiAgICAgIHRoaXMuYmFzZUNvaW4uaXNFVk0oKSAmJlxuICAgICAgIShwYXJhbXMud2FsbGV0VmVyc2lvbiA9PT0gMyB8fCBwYXJhbXMud2FsbGV0VmVyc2lvbiA9PT0gNSB8fCBwYXJhbXMud2FsbGV0VmVyc2lvbiA9PT0gNilcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRVZNIFRTUyB3YWxsZXRzIGFyZSBvbmx5IHN1cHBvcnRlZCBmb3Igd2FsbGV0IHZlcnNpb24gMywgNSBhbmQgNicpO1xuICAgIH1cblxuICAgIGlmIChpc1Rzcykge1xuICAgICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzVHNzKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb2luICR7dGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKX0gZG9lcyBub3Qgc3VwcG9ydCBUU1MgYXQgdGhpcyB0aW1lYCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIChwYXJhbXMud2FsbGV0VmVyc2lvbiA9PT0gNSB8fCBwYXJhbXMud2FsbGV0VmVyc2lvbiA9PT0gNikgJiZcbiAgICAgICAgIXRoaXMuYmFzZUNvaW4uZ2V0Q29uZmlnKCkuZmVhdHVyZXMuaW5jbHVkZXMoQ29pbkZlYXR1cmUuTVBDVjIpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb2luICR7dGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKX0gZG9lcyBub3Qgc3VwcG9ydCBUU1MgTVBDdjIgYXQgdGhpcyB0aW1lYCk7XG4gICAgICB9XG4gICAgICBhc3NlcnQoZW50ZXJwcmlzZSwgJ2VudGVycHJpc2UgaXMgcmVxdWlyZWQgZm9yIFRTUyB3YWxsZXQnKTtcblxuICAgICAgaWYgKHR5cGUgPT09ICdjb2xkJykge1xuICAgICAgICAvLyB2YWxpZGF0ZVxuICAgICAgICBhc3NlcnQocGFyYW1zLmJpdGdvS2V5SWQsICdiaXRnb0tleUlkIGlzIHJlcXVpcmVkIGZvciBTTUMgVFNTIHdhbGxldCcpO1xuICAgICAgICBhc3NlcnQocGFyYW1zLmNvbW1vbktleWNoYWluLCAnY29tbW9uS2V5Y2hhaW4gaXMgcmVxdWlyZWQgZm9yIFNNQyBUU1Mgd2FsbGV0Jyk7XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU01DTXBjV2FsbGV0KHtcbiAgICAgICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgIGVudGVycHJpc2UsXG4gICAgICAgICAgd2FsbGV0VmVyc2lvbjogcGFyYW1zLndhbGxldFZlcnNpb24sXG4gICAgICAgICAgYml0Z29LZXlJZDogcGFyYW1zLmJpdGdvS2V5SWQsXG4gICAgICAgICAgY29tbW9uS2V5Y2hhaW46IHBhcmFtcy5jb21tb25LZXljaGFpbixcbiAgICAgICAgICBjb2xkRGVyaXZhdGlvblNlZWQ6IHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZSA9PT0gJ2N1c3RvZGlhbCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVDdXN0b2RpYWxNcGNXYWxsZXQoe1xuICAgICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgZW50ZXJwcmlzZSxcbiAgICAgICAgICB3YWxsZXRWZXJzaW9uOiBwYXJhbXMud2FsbGV0VmVyc2lvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGFzc2VydChwYXNzcGhyYXNlLCAnY2Fubm90IGdlbmVyYXRlIFRTUyBrZXlzIHdpdGhvdXQgcGFzc3BocmFzZScpO1xuICAgICAgY29uc3Qgd2FsbGV0RGF0YSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVNcGNXYWxsZXQoe1xuICAgICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAgICBsYWJlbCxcbiAgICAgICAgcGFzc3BocmFzZSxcbiAgICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiBwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgICAgZW50ZXJwcmlzZSxcbiAgICAgICAgd2FsbGV0VmVyc2lvbjogcGFyYW1zLndhbGxldFZlcnNpb24sXG4gICAgICAgIGJhY2t1cFByb3ZpZGVyOiBwYXJhbXMuYmFja3VwUHJvdmlkZXIsXG4gICAgICB9KTtcbiAgICAgIGlmIChwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSkge1xuICAgICAgICB3YWxsZXREYXRhLmVuY3J5cHRlZFdhbGxldFBhc3NwaHJhc2UgPSB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgIGlucHV0OiBwYXNzcGhyYXNlLFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2FsbGV0RGF0YTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0Jsc0RrZyA9IHBhcmFtcy5tdWx0aXNpZ1R5cGUgPyBwYXJhbXMubXVsdGlzaWdUeXBlID09PSAnYmxzZGtnJyA6IHRoaXMuYmFzZUNvaW4uc3VwcG9ydHNCbHNEa2coKTtcbiAgICBpZiAoaXNCbHNEa2cpIHtcbiAgICAgIGlmICghdGhpcy5iYXNlQ29pbi5zdXBwb3J0c0Jsc0RrZygpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgY29pbiAke3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCl9IGRvZXMgbm90IHN1cHBvcnQgQkxTLURLRyBhdCB0aGlzIHRpbWVgKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChlbnRlcnByaXNlLCAnZW50ZXJwcmlzZSBpcyByZXF1aXJlZCBmb3IgQkxTLURLRyB3YWxsZXQnKTtcblxuICAgICAgaWYgKHR5cGUgPT09ICdjb2xkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JMUy1ES0cgU01DIHdhbGxldHMgYXJlIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlID09PSAnY3VzdG9kaWFsJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JMUy1ES0cgY3VzdG9kaWFsIHdhbGxldHMgYXJlIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lJyk7XG4gICAgICB9XG5cbiAgICAgIGFzc2VydChwYXNzcGhyYXNlLCAnY2Fubm90IGdlbmVyYXRlIEJMUy1ES0cga2V5cyB3aXRob3V0IHBhc3NwaHJhc2UnKTtcbiAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlTXBjV2FsbGV0KHsgbXVsdGlzaWdUeXBlOiAnYmxzZGtnJywgbGFiZWwsIHBhc3NwaHJhc2UsIGVudGVycHJpc2UgfSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGRpc3RyaWJ1dGVkIGN1c3RvZHlcbiAgICBpZiAoaXNEaXN0cmlidXRlZEN1c3RvZHkpIHtcbiAgICAgIGlmICghZW50ZXJwcmlzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgcHJvdmlkZSBlbnRlcnByaXNlIHdoZW4gY3JlYXRpbmcgZGlzdHJpYnV0ZWQgY3VzdG9keSB3YWxsZXQnKTtcbiAgICAgIH1cbiAgICAgIGlmICghdHlwZSB8fCB0eXBlICE9PSAnY29sZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkaXN0cmlidXRlZCBjdXN0b2R5IHdhbGxldHMgbXVzdCBiZSB0eXBlOiBjb2xkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFzQmFja3VwWHB1YiA9ICEhcGFyYW1zLmJhY2t1cFhwdWI7XG4gICAgY29uc3QgaGFzQmFja3VwWHB1YlByb3ZpZGVyID0gISFwYXJhbXMuYmFja3VwWHB1YlByb3ZpZGVyO1xuICAgIGlmIChoYXNCYWNrdXBYcHViICYmIGhhc0JhY2t1cFhwdWJQcm92aWRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcHJvdmlkZSBtb3JlIHRoYW4gb25lIGJhY2t1cFhwdWIgb3IgYmFja3VwWHB1YlByb3ZpZGVyIGZsYWcnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmdhc1ByaWNlICYmIHBhcmFtcy5laXAxNTU5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbiBub3QgdXNlIGJvdGggZWlwMTU1OSBhbmQgZ2FzUHJpY2UgdmFsdWVzJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucyA9IHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZ2FzUHJpY2UpKSB7XG4gICAgICBjb25zdCBnYXNQcmljZUJOID0gbmV3IEJpZ051bWJlcihwYXJhbXMuZ2FzUHJpY2UpO1xuICAgICAgaWYgKGdhc1ByaWNlQk4uaXNOYU4oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZ2FzIHByaWNlIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyIG9yIG51bWJlciBhcyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5nYXNQcmljZSA9IGdhc1ByaWNlQk4udG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmVpcDE1NTkpICYmICFfLmlzRW1wdHkocGFyYW1zLmVpcDE1NTkpKSB7XG4gICAgICBjb25zdCBtYXhGZWVQZXJHYXNCTiA9IG5ldyBCaWdOdW1iZXIocGFyYW1zLmVpcDE1NTkubWF4RmVlUGVyR2FzKTtcbiAgICAgIGlmIChtYXhGZWVQZXJHYXNCTi5pc05hTigpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBtYXggZmVlIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyIG9yIG51bWJlciBhcyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1heFByaW9yaXR5RmVlUGVyR2FzQk4gPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5laXAxNTU5Lm1heFByaW9yaXR5RmVlUGVyR2FzKTtcbiAgICAgIGlmIChtYXhQcmlvcml0eUZlZVBlckdhc0JOLmlzTmFOKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByaW9yaXR5IGZlZSBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlciBvciBudW1iZXIgYXMgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMuZWlwMTU1OSA9IHtcbiAgICAgICAgbWF4RmVlUGVyR2FzOiBtYXhGZWVQZXJHYXNCTi50b1N0cmluZygpLFxuICAgICAgICBtYXhQcmlvcml0eUZlZVBlckdhczogbWF4UHJpb3JpdHlGZWVQZXJHYXNCTi50b1N0cmluZygpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmRpc2FibGVLUlNFbWFpbCkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmRpc2FibGVLUlNFbWFpbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRpc2FibGVLUlNFbWFpbCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5kaXNhYmxlS1JTRW1haWwgPSBwYXJhbXMuZGlzYWJsZUtSU0VtYWlsO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMud2FsbGV0VmVyc2lvbikpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMud2FsbGV0VmVyc2lvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHdhbGxldFZlcnNpb24gcHJvdmlkZWQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy53YWxsZXRWZXJzaW9uID0gcGFyYW1zLndhbGxldFZlcnNpb247XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGVhY2gga3JzU3BlY2lmaWMgcGFyYW0gaXMgZWl0aGVyIGEgc3RyaW5nLCBib29sZWFuLCBvciBudW1iZXJcbiAgICBjb25zdCB7IGtyc1NwZWNpZmljIH0gPSBwYXJhbXM7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGtyc1NwZWNpZmljKSkge1xuICAgICAgT2JqZWN0LmtleXMoa3JzU3BlY2lmaWMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBjb25zdCB2YWwgPSBrcnNTcGVjaWZpY1trZXldO1xuICAgICAgICBpZiAoIV8uaXNCb29sZWFuKHZhbCkgJiYgIV8uaXNTdHJpbmcodmFsKSAmJiAhXy5pc051bWJlcih2YWwpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrcnNTcGVjaWZpYyBvYmplY3QgY29udGFpbnMgaWxsZWdhbCB2YWx1ZXMuIHZhbHVlcyBtdXN0IGJlIHN0cmluZ3MsIGJvb2xlYW5zLCBvciBudW1iZXJzJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCBkZXJpdmF0aW9uUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuXG4gICAgaWYgKHBhcmFtcy50eXBlID09PSAnY3VzdG9kaWFsJyAmJiAocGFyYW1zLm11bHRpc2lnVHlwZSA/PyAnb25jaGFpbicpID09PSAnb25jaGFpbicpIHtcbiAgICAgIC8vIGZvciBjdXN0b2RpYWwgbXVsdGlzaWcsIHdoZW4gdGhlIHdhbGxldCBpcyBjcmVhdGVkIG9uIHRoZSBwbGF0Zm9yIHNpZGUsIHRoZSBrZXlzIGFyZSBub3QgbmVlZGVkXG4gICAgICB3YWxsZXRQYXJhbXMubiA9IHVuZGVmaW5lZDtcbiAgICAgIHdhbGxldFBhcmFtcy5tID0gdW5kZWZpbmVkO1xuICAgICAgd2FsbGV0UGFyYW1zLmtleXMgPSB1bmRlZmluZWQ7XG4gICAgICB3YWxsZXRQYXJhbXMua2V5U2lnbmF0dXJlcyA9IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKHdhbGxldFBhcmFtcykucmVzdWx0KCk7IC8vIHJldHVybnMgdGhlIGlkc1xuXG4gICAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldCh7IGlkOiBuZXdXYWxsZXQua2V5c1tLZXlJbmRpY2VzLlVTRVJdLCByZXFJZCB9KTtcbiAgICAgIGNvbnN0IGJhY2t1cEtleWNoYWluID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXQoeyBpZDogbmV3V2FsbGV0LmtleXNbS2V5SW5kaWNlcy5CQUNLVVBdLCByZXFJZCB9KTtcbiAgICAgIGNvbnN0IGJpdGdvS2V5Y2hhaW4gPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldCh7IGlkOiBuZXdXYWxsZXQua2V5c1tLZXlJbmRpY2VzLkJJVEdPXSwgcmVxSWQgfSk7XG5cbiAgICAgIGNvbnN0IFt1c2VyS2V5LCBiaXRnb0tleSwgYmFja3VwS2V5XSA9IGF3YWl0IFByb21pc2UuYWxsKFt1c2VyS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluXSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdDogV2FsbGV0V2l0aEtleWNoYWlucyA9IHtcbiAgICAgICAgd2FsbGV0OiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCksXG4gICAgICAgIHVzZXJLZXljaGFpbjogdXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5Y2hhaW46IGJpdGdvS2V5LFxuICAgICAgICBiaXRnb0tleWNoYWluOiBiYWNrdXBLZXksXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ1dhbGxldFdpdGhLZXljaGFpbnMnLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdXNlcktleWNoYWluUHJvbWlzZSA9IGFzeW5jICgpOiBQcm9taXNlPEtleWNoYWluPiA9PiB7XG4gICAgICAgIGxldCB1c2VyS2V5Y2hhaW5QYXJhbXM7XG4gICAgICAgIGxldCB1c2VyS2V5Y2hhaW47XG4gICAgICAgIC8vIFVzZXIgcHJvdmlkZWQgdXNlciBrZXlcbiAgICAgICAgaWYgKHBhcmFtcy51c2VyS2V5KSB7XG4gICAgICAgICAgdXNlcktleWNoYWluID0geyBwdWI6IHBhcmFtcy51c2VyS2V5IH07XG4gICAgICAgICAgdXNlcktleWNoYWluUGFyYW1zID0gdXNlcktleWNoYWluO1xuICAgICAgICAgIGlmIChwYXJhbXMuY29sZERlcml2YXRpb25TZWVkKSB7XG4gICAgICAgICAgICAvLyB0aGUgZGVyaXZhdGlvbiBvbmx5IG1ha2VzIHNlbnNlIHdoZW4gYSBrZXkgYWxyZWFkeSBleGlzdHNcbiAgICAgICAgICAgIGNvbnN0IGRlcml2YXRpb24gPSB0aGlzLmJhc2VDb2luLmRlcml2ZUtleVdpdGhTZWVkKHtcbiAgICAgICAgICAgICAga2V5OiBwYXJhbXMudXNlcktleSxcbiAgICAgICAgICAgICAgc2VlZDogcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGVyaXZhdGlvblBhdGggPSBkZXJpdmF0aW9uLmRlcml2YXRpb25QYXRoO1xuICAgICAgICAgICAgdXNlcktleWNoYWluLnB1YiA9IGRlcml2YXRpb24ua2V5O1xuICAgICAgICAgICAgdXNlcktleWNoYWluLmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQgPSBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIWNhbkVuY3J5cHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IGdlbmVyYXRlIHVzZXIga2V5cGFpciB3aXRob3V0IHBhc3NwaHJhc2UnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQ3JlYXRlIHRoZSB1c2VyIGtleS5cbiAgICAgICAgICB1c2VyS2V5Y2hhaW4gPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZSgpO1xuICAgICAgICAgIHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnYgPSB0aGlzLmJpdGdvLmVuY3J5cHQoeyBwYXNzd29yZDogcGFzc3BocmFzZSwgaW5wdXQ6IHVzZXJLZXljaGFpbi5wcnYgfSk7XG4gICAgICAgICAgdXNlcktleWNoYWluUGFyYW1zID0ge1xuICAgICAgICAgICAgcHViOiB1c2VyS2V5Y2hhaW4ucHViLFxuICAgICAgICAgICAgZW5jcnlwdGVkUHJ2OiB1c2VyS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LFxuICAgICAgICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiBwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdXNlcktleWNoYWluUGFyYW1zLnJlcUlkID0gcmVxSWQ7XG4gICAgICAgIGNvbnN0IG5ld1VzZXJLZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuYWRkKHVzZXJLZXljaGFpblBhcmFtcyk7XG4gICAgICAgIHJldHVybiBfLmV4dGVuZCh7fSwgbmV3VXNlcktleWNoYWluLCB1c2VyS2V5Y2hhaW4pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgYmFja3VwS2V5Y2hhaW5Qcm9taXNlID0gYXN5bmMgKCk6IFByb21pc2U8S2V5Y2hhaW4+ID0+IHtcbiAgICAgICAgaWYgKHBhcmFtcy5iYWNrdXBYcHViUHJvdmlkZXIpIHtcbiAgICAgICAgICAvLyBJZiByZXF1ZXN0ZWQsIHVzZSBhIEtSUyBvciBiYWNrdXAga2V5IHByb3ZpZGVyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlQmFja3VwKHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiBwYXJhbXMuYmFja3VwWHB1YlByb3ZpZGVyIHx8ICdkZWZhdWx0Uk1HQmFja3VwUHJvdmlkZXInLFxuICAgICAgICAgICAgZGlzYWJsZUtSU0VtYWlsOiBwYXJhbXMuZGlzYWJsZUtSU0VtYWlsLFxuICAgICAgICAgICAga3JzU3BlY2lmaWM6IHBhcmFtcy5rcnNTcGVjaWZpYyxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMuYmFzZUNvaW4uZ2V0Q2hhaW4oKSxcbiAgICAgICAgICAgIHBhc3NwaHJhc2U6IHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2VyIHByb3ZpZGVkIGJhY2t1cCB4cHViXG4gICAgICAgIGlmIChwYXJhbXMuYmFja3VwWHB1Yikge1xuICAgICAgICAgIC8vIHVzZXIgcHJvdmlkZWQgYmFja3VwIGV0aGVyZXVtIGFkZHJlc3NcbiAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5hZGQoe1xuICAgICAgICAgICAgcHViOiBwYXJhbXMuYmFja3VwWHB1YixcbiAgICAgICAgICAgIHNvdXJjZTogJ2JhY2t1cCcsXG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIWNhbkVuY3J5cHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IGdlbmVyYXRlIGJhY2t1cCBrZXlwYWlyIHdpdGhvdXQgcGFzc3BocmFzZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBObyBwcm92aWRlZCBiYWNrdXAgeHB1YiBvciBhZGRyZXNzLCBzbyBkZWZhdWx0IHRvIGNyZWF0aW5nIG9uZSBoZXJlXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlQmFja3VwKHsgcmVxSWQsIHBhc3NwaHJhc2U6IHBhcmFtcy5wYXNzcGhyYXNlIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgeyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluIH06IEtleWNoYWluc1RyaXBsZXQgPSBhd2FpdCBwcm9taXNlUHJvcHMoe1xuICAgICAgICB1c2VyS2V5Y2hhaW46IHVzZXJLZXljaGFpblByb21pc2UoKSxcbiAgICAgICAgYmFja3VwS2V5Y2hhaW46IGJhY2t1cEtleWNoYWluUHJvbWlzZSgpLFxuICAgICAgICBiaXRnb0tleWNoYWluOiB0aGlzLmJhc2VDb2luXG4gICAgICAgICAgLmtleWNoYWlucygpXG4gICAgICAgICAgLmNyZWF0ZUJpdEdvKHsgZW50ZXJwcmlzZTogcGFyYW1zLmVudGVycHJpc2UsIHJlcUlkLCBpc0Rpc3RyaWJ1dGVkQ3VzdG9keTogcGFyYW1zLmlzRGlzdHJpYnV0ZWRDdXN0b2R5IH0pLFxuICAgICAgfSk7XG5cbiAgICAgIHdhbGxldFBhcmFtcy5rZXlzID0gW3VzZXJLZXljaGFpbi5pZCwgYmFja3VwS2V5Y2hhaW4uaWQsIGJpdGdvS2V5Y2hhaW4uaWRdO1xuXG4gICAgICBjb25zdCB7IHBydiB9ID0gdXNlcktleWNoYWluO1xuICAgICAgaWYgKF8uaXNTdHJpbmcocHJ2KSkge1xuICAgICAgICBhc3NlcnQoYmFja3VwS2V5Y2hhaW4ucHViKTtcbiAgICAgICAgYXNzZXJ0KGJpdGdvS2V5Y2hhaW4ucHViKTtcbiAgICAgICAgd2FsbGV0UGFyYW1zLmtleVNpZ25hdHVyZXMgPSB7XG4gICAgICAgICAgYmFja3VwOiAoYXdhaXQgdGhpcy5iYXNlQ29pbi5zaWduTWVzc2FnZSh7IHBydiB9LCBiYWNrdXBLZXljaGFpbi5wdWIpKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgYml0Z286IChhd2FpdCB0aGlzLmJhc2VDb2luLnNpZ25NZXNzYWdlKHsgcHJ2IH0sIGJpdGdvS2V5Y2hhaW4ucHViKSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXljaGFpbnMgPSB7XG4gICAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5hbFdhbGxldFBhcmFtcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uc3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0KHdhbGxldFBhcmFtcywga2V5Y2hhaW5zKTtcblxuICAgICAgaWYgKF8uaW5jbHVkZXMoWyd4cnAnLCAneGxtJywgJ2NzcHInXSwgdGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLnJvb3RQcml2YXRlS2V5KSkge1xuICAgICAgICB3YWxsZXRQYXJhbXMucm9vdFByaXZhdGVLZXkgPSBwYXJhbXMucm9vdFByaXZhdGVLZXk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQoZmluYWxXYWxsZXRQYXJhbXMpLnJlc3VsdCgpO1xuXG4gICAgICBjb25zdCByZXN1bHQ6IFdhbGxldFdpdGhLZXljaGFpbnMgPSB7XG4gICAgICAgIHdhbGxldDogbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBuZXdXYWxsZXQpLFxuICAgICAgICB1c2VyS2V5Y2hhaW46IHVzZXJLZXljaGFpbixcbiAgICAgICAgYmFja3VwS2V5Y2hhaW46IGJhY2t1cEtleWNoYWluLFxuICAgICAgICBiaXRnb0tleWNoYWluOiBiaXRnb0tleWNoYWluLFxuICAgICAgICByZXNwb25zZVR5cGU6ICdXYWxsZXRXaXRoS2V5Y2hhaW5zJyxcbiAgICAgIH07XG5cbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZChiYWNrdXBLZXljaGFpbi5wcnYpKSB7XG4gICAgICAgIHJlc3VsdC53YXJuaW5nID0gJ0JlIHN1cmUgdG8gYmFja3VwIHRoZSBiYWNrdXAga2V5Y2hhaW4gLS0gaXQgaXMgbm90IHN0b3JlZCBhbnl3aGVyZSBlbHNlISc7XG4gICAgICB9XG5cbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZChkZXJpdmF0aW9uUGF0aCkpIHtcbiAgICAgICAgdXNlcktleWNoYWluLmRlcml2YXRpb25QYXRoID0gZGVyaXZhdGlvblBhdGg7XG4gICAgICB9XG5cbiAgICAgIGlmIChjYW5FbmNyeXB0ICYmIHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSB7XG4gICAgICAgIHJlc3VsdC5lbmNyeXB0ZWRXYWxsZXRQYXNzcGhyYXNlID0gdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogcGFzc3BocmFzZSxcbiAgICAgICAgICBwYXNzd29yZDogcGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB1c2VyJ3Mgd2FsbGV0IHNoYXJlc1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBsaXN0U2hhcmVzKHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0c2hhcmUnKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdXNlcidzIHdhbGxldCBzaGFyZXMgdjJcbiAgICogQHJldHVybnMge1Byb21pc2U8V2FsbGV0U2hhcmVzPn1cbiAgICovXG4gIGFzeW5jIGxpc3RTaGFyZXNWMigpOiBQcm9taXNlPFdhbGxldFNoYXJlcz4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldHNoYXJlcycsIDIpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgd2FsbGV0IHNoYXJlIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgdGhlIGVuY3J5cHRlZCBzaGFyaW5nIGtleWNoYWluLiByZXF1aXJlcyB1bmxvY2sgaWYga2V5Y2hhaW4gaXMgcHJlc2VudC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFNoYXJlSWQgLSB0aGUgd2FsbGV0IHNoYXJlIHRvIGdldCBpbmZvcm1hdGlvbiBvblxuICAgKi9cbiAgYXN5bmMgZ2V0U2hhcmUocGFyYW1zOiB7IHdhbGxldFNoYXJlSWQ/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldFNoYXJlSWQnXSwgW10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0c2hhcmUvJyArIHBhcmFtcy53YWxsZXRTaGFyZUlkKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGEgd2FsbGV0IHNoYXJlXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0U2hhcmVJZCAtIHRoZSB3YWxsZXQgc2hhcmUgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSBwYXJhbXMuc3RhdGUgLSB0aGUgbmV3IHN0YXRlIG9mIHRoZSB3YWxsZXQgc2hhcmVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgdXBkYXRlU2hhcmUocGFyYW1zOiBVcGRhdGVTaGFyZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRTaGFyZUlkJ10sIFtdKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldHNoYXJlLycgKyBwYXJhbXMud2FsbGV0U2hhcmVJZCkpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQnVsayBhY2NlcHQgd2FsbGV0IHNoYXJlc1xuICAgKiBAcGFyYW0gcGFyYW1zIEFjY2VwdFNoYXJlT3B0aW9uc1JlcXVlc3RbXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBY2NlcHRTaGFyZVJlc3BvbnNlW10+fVxuICAgKi9cbiAgYXN5bmMgYnVsa0FjY2VwdFNoYXJlUmVxdWVzdChwYXJhbXM6IEFjY2VwdFNoYXJlT3B0aW9uc1JlcXVlc3RbXSk6IFByb21pc2U8QWNjZXB0U2hhcmVSZXNwb25zZVtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wdXQodGhpcy5iaXRnby51cmwoJy93YWxsZXRzaGFyZXMvYWNjZXB0JywgMikpXG4gICAgICAuc2VuZCh7XG4gICAgICAgIGtleXNGb3JXYWxsZXRTaGFyZXM6IHBhcmFtcyxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZW5kIGEgd2FsbGV0IHNoYXJlIGludml0YXRpb24gZW1haWxcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFNoYXJlSWQgLSB0aGUgd2FsbGV0IHNoYXJlIHdob3NlIGludml0aWF0aW9uIHNob3VsZCBiZSByZXNlbnRcbiAgICovXG4gIGFzeW5jIHJlc2VuZFNoYXJlSW52aXRlKHBhcmFtczogeyB3YWxsZXRTaGFyZUlkPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRTaGFyZUlkJ10sIFtdKTtcblxuICAgIGNvbnN0IHVybFBhcnRzID0gcGFyYW1zLndhbGxldFNoYXJlSWQgKyAnL3Jlc2VuZGVtYWlsJztcbiAgICByZXR1cm4gdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0c2hhcmUvJyArIHVybFBhcnRzKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGEgd2FsbGV0IHNoYXJlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB0byB1cGRhdGVcbiAgICovXG4gIGFzeW5jIGNhbmNlbFNoYXJlKHBhcmFtczogeyB3YWxsZXRTaGFyZUlkPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRTaGFyZUlkJ10sIFtdKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAuZGVsKHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0c2hhcmUvJyArIHBhcmFtcy53YWxsZXRTaGFyZUlkKSlcbiAgICAgIC5zZW5kKClcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1zaGFyZSB3YWxsZXQgd2l0aCBleGlzdGluZyBzcGVuZGVycyBvZiB0aGUgd2FsbGV0XG4gICAqIEBwYXJhbSB3YWxsZXRJZFxuICAgKiBAcGFyYW0gdXNlclBhc3N3b3JkXG4gICAqL1xuICBhc3luYyByZXNoYXJlV2FsbGV0V2l0aFNwZW5kZXJzKHdhbGxldElkOiBzdHJpbmcsIHVzZXJQYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd2FsbGV0ID0gYXdhaXQgdGhpcy5nZXQoeyBpZDogd2FsbGV0SWQgfSk7XG4gICAgaWYgKCF3YWxsZXQ/Ll93YWxsZXQ/LmVudGVycHJpc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW50ZXJwcmlzZSBub3QgZm91bmQgZm9yIHRoZSB3YWxsZXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRlcnByaXNlVXNlcnNSZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iaXRnby51cmwoYC9lbnRlcnByaXNlLyR7d2FsbGV0Py5fd2FsbGV0Py5lbnRlcnByaXNlfS91c2VyYCkpXG4gICAgICAucmVzdWx0KCk7XG4gICAgLy8gY3JlYXRlIGEgbWFwIG9mIHVzZXJzIGZvciBlYXN5IGxvb2t1cCAtIHdlIG5lZWQgdGhlIHVzZXIgZW1haWwgaWQgdG8gc2hhcmUgdGhlIHdhbGxldFxuICAgIGNvbnN0IHVzZXJzTWFwID0gbmV3IE1hcChcbiAgICAgIFsuLi5lbnRlcnByaXNlVXNlcnNSZXNwb25zZT8uYWRtaW5Vc2VycywgLi4uZW50ZXJwcmlzZVVzZXJzUmVzcG9uc2U/Lm5vbkFkbWluVXNlcnNdLm1hcCgob2JqKSA9PiBbb2JqLmlkLCBvYmpdKVxuICAgICk7XG5cbiAgICBpZiAod2FsbGV0Ll93YWxsZXQudXNlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgdXNlciBvZiB3YWxsZXQuX3dhbGxldC51c2Vycykge1xuICAgICAgICBjb25zdCB1c2VyT2JqZWN0ID0gdXNlcnNNYXAuZ2V0KHVzZXIudXNlcik7XG4gICAgICAgIGlmICh1c2VyLnBlcm1pc3Npb25zLmluY2x1ZGVzKCdzcGVuZCcpICYmICF1c2VyLnBlcm1pc3Npb25zLmluY2x1ZGVzKCdhZG1pbicpICYmIHVzZXJPYmplY3QpIHtcbiAgICAgICAgICBjb25zdCBzaGFyZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHdhbGxldElkOiB3YWxsZXRJZCxcbiAgICAgICAgICAgIHVzZXI6IHVzZXIudXNlcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiB1c2VyLnBlcm1pc3Npb25zLmpvaW4oJywnKSxcbiAgICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHVzZXJQYXNzd29yZCxcbiAgICAgICAgICAgIGVtYWlsOiB1c2VyT2JqZWN0LmVtYWlsLmVtYWlsLFxuICAgICAgICAgICAgcmVzaGFyZTogdHJ1ZSxcbiAgICAgICAgICAgIHNraXBLZXljaGFpbjogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCB3YWxsZXQuc2hhcmVXYWxsZXQoc2hhcmVQYXJhbXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdHMgYSB3YWxsZXQgc2hhcmUsIGFkZGluZyB0aGUgd2FsbGV0IHRvIHRoZSB1c2VyJ3MgbGlzdFxuICAgKiBOZWVkcyBhIHVzZXIncyBwYXNzd29yZCB0byBkZWNyeXB0IHRoZSBzaGFyZWQga2V5XG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB0byBhY2NlcHRcbiAgICogQHBhcmFtIHBhcmFtcy51c2VyUGFzc3dvcmQgLSAocmVxdWlyZWQgaWYgbW9yZSBhIGtleWNoYWluIHdhcyBzaGFyZWQpIHVzZXIncyBwYXNzd29yZCB0byBkZWNyeXB0IHRoZSBzaGFyZWQgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSAtIG5ldyB3YWxsZXQgcGFzc3BocmFzZSBmb3Igc2F2aW5nIHRoZSBzaGFyZWQgd2FsbGV0IHBydi5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgbGVmdCBibGFuayBhbmQgYSB3YWxsZXQgd2l0aCBtb3JlIHRoYW4gdmlldyBwZXJtaXNzaW9ucyB3YXMgc2hhcmVkLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIHRoZSB1c2VyJ3MgbG9naW4gcGFzc3dvcmQgaXMgdXNlZC5cbiAgICogQHBhcmFtIHBhcmFtcy5vdmVycmlkZUVuY3J5cHRlZFBydiAtIHNldCBvbmx5IGlmIHRoZSBwcnYgd2FzIHJlY2VpdmVkIG91dC1vZi1iYW5kLlxuICAgKi9cbiAgYXN5bmMgYWNjZXB0U2hhcmUocGFyYW1zOiBBY2NlcHRTaGFyZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRTaGFyZUlkJ10sIFsnb3ZlcnJpZGVFbmNyeXB0ZWRQcnYnLCAndXNlclBhc3N3b3JkJywgJ25ld1dhbGxldFBhc3NwaHJhc2UnXSk7XG5cbiAgICBsZXQgZW5jcnlwdGVkUHJ2ID0gcGFyYW1zLm92ZXJyaWRlRW5jcnlwdGVkUHJ2O1xuICAgIGNvbnN0IHdhbGxldFNoYXJlID0gYXdhaXQgdGhpcy5nZXRTaGFyZSh7IHdhbGxldFNoYXJlSWQ6IHBhcmFtcy53YWxsZXRTaGFyZUlkIH0pO1xuICAgIGlmIChcbiAgICAgIHdhbGxldFNoYXJlLmtleWNoYWluT3ZlcnJpZGVSZXF1aXJlZCAmJlxuICAgICAgd2FsbGV0U2hhcmUucGVybWlzc2lvbnMuaW5kZXhPZignYWRtaW4nKSAhPT0gLTEgJiZcbiAgICAgIHdhbGxldFNoYXJlLnBlcm1pc3Npb25zLmluZGV4T2YoJ3NwZW5kJykgIT09IC0xXG4gICAgKSB7XG4gICAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMudXNlclBhc3N3b3JkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJQYXNzd29yZCBwYXJhbSBtdXN0IGJlIHByb3ZpZGVkIHRvIGRlY3J5cHQgc2hhcmVkIGtleScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3YWxsZXRLZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlVXNlcktleWNoYWluKHBhcmFtcy51c2VyUGFzc3dvcmQpO1xuICAgICAgaWYgKF8uaXNVbmRlZmluZWQod2FsbGV0S2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VuY3J5cHRlZFBydiB3YXMgbm90IGZvdW5kIG9uIHdhbGxldCBrZXljaGFpbicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICB0cmFkaW5nQWNjb3VudElkOiB3YWxsZXRTaGFyZS53YWxsZXQsXG4gICAgICAgIHB1YmtleTogd2FsbGV0S2V5Y2hhaW4ucHViLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIH07XG4gICAgICBjb25zdCBwYXlsb2FkU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCk7XG5cbiAgICAgIGNvbnN0IHByaXZhdGVLZXkgPSB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgICBwYXNzd29yZDogcGFyYW1zLnVzZXJQYXNzd29yZCxcbiAgICAgICAgaW5wdXQ6IHdhbGxldEtleWNoYWluLmVuY3J5cHRlZFBydixcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5zaWduTWVzc2FnZSh7IHBydjogcHJpdmF0ZUtleSB9LCBwYXlsb2FkU3RyaW5nKTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnVwZGF0ZVNoYXJlKHtcbiAgICAgICAgd2FsbGV0U2hhcmVJZDogcGFyYW1zLndhbGxldFNoYXJlSWQsXG4gICAgICAgIHN0YXRlOiAnYWNjZXB0ZWQnLFxuICAgICAgICBrZXlJZDogd2FsbGV0S2V5Y2hhaW4uaWQsXG4gICAgICAgIHNpZ25hdHVyZTogc2lnbmF0dXJlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgcGF5bG9hZDogcGF5bG9hZFN0cmluZyxcbiAgICAgIH0pO1xuICAgICAgLy8gSWYgdGhlIHdhbGxldCBzaGFyZSB3YXMgYWNjZXB0ZWQgc3VjY2Vzc2Z1bGx5IChjaGFuZ2VkPXRydWUpLCByZXNoYXJlIHRoZSB3YWxsZXQgd2l0aCB0aGUgc3BlbmRlcnNcbiAgICAgIGlmIChyZXNwb25zZS5jaGFuZ2VkICYmIHJlc3BvbnNlLnN0YXRlID09PSAnYWNjZXB0ZWQnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5yZXNoYXJlV2FsbGV0V2l0aFNwZW5kZXJzKHdhbGxldFNoYXJlLndhbGxldCwgcGFyYW1zLnVzZXJQYXNzd29yZCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBUT0RPOiBQWC0zODI2XG4gICAgICAgICAgLy8gRG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuICAgIC8vIFJldHVybiByaWdodCBhd2F5IGlmIHRoZXJlIGlzIG5vIGtleWNoYWluIHRvIGRlY3J5cHQsIG9yIGlmIGV4cGxpY2l0IGVuY3J5cHRlZFBydiB3YXMgcHJvdmlkZWRcbiAgICBpZiAoIXdhbGxldFNoYXJlLmtleWNoYWluIHx8ICF3YWxsZXRTaGFyZS5rZXljaGFpbi5lbmNyeXB0ZWRQcnYgfHwgZW5jcnlwdGVkUHJ2KSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWQ6IHBhcmFtcy53YWxsZXRTaGFyZUlkLFxuICAgICAgICBzdGF0ZTogJ2FjY2VwdGVkJyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIE1vcmUgdGhhbiB2aWV3aW5nIHdhcyByZXF1ZXN0ZWQsIHNvIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgd2FsbGV0IGtleXMgdXNpbmcgdGhlIHNoYXJlZCBlY2RoIHNjaGVtZVxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy51c2VyUGFzc3dvcmQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJQYXNzd29yZCBwYXJhbSBtdXN0IGJlIHByb3ZpZGVkIHRvIGRlY3J5cHQgc2hhcmVkIGtleScpO1xuICAgIH1cblxuICAgIGNvbnN0IHNoYXJpbmdLZXljaGFpbiA9IChhd2FpdCB0aGlzLmJpdGdvLmdldEVDREhLZXljaGFpbigpKSBhcyBhbnk7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQoc2hhcmluZ0tleWNoYWluLmVuY3J5cHRlZFhwcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VuY3J5cHRlZFhwcnYgd2FzIG5vdCBmb3VuZCBvbiBzaGFyaW5nIGtleWNoYWluJyk7XG4gICAgfVxuXG4gICAgLy8gTm93IHdlIGhhdmUgdGhlIHNoYXJpbmcga2V5Y2hhaW4sIHdlIGNhbiB3b3JrIG91dCB0aGUgc2VjcmV0IHVzZWQgZm9yIHNoYXJpbmcgdGhlIHdhbGxldCB3aXRoIHVzXG4gICAgc2hhcmluZ0tleWNoYWluLnBydiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICBwYXNzd29yZDogcGFyYW1zLnVzZXJQYXNzd29yZCxcbiAgICAgIGlucHV0OiBzaGFyaW5nS2V5Y2hhaW4uZW5jcnlwdGVkWHBydixcbiAgICB9KTtcbiAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoXG4gICAgICAvLyBEZXJpdmUga2V5IGJ5IHBhdGggKHdoaWNoIGlzIHVzZWQgYmV0d2VlbiB0aGVzZSAyIHVzZXJzIG9ubHkpXG4gICAgICBiaXAzMi5mcm9tQmFzZTU4KHNoYXJpbmdLZXljaGFpbi5wcnYpLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKHdhbGxldFNoYXJlLmtleWNoYWluLnBhdGgpKSxcbiAgICAgIEJ1ZmZlci5mcm9tKHdhbGxldFNoYXJlLmtleWNoYWluLmZyb21QdWJLZXksICdoZXgnKVxuICAgICkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgLy8gWWVzISBXZSBnb3QgdGhlIHNlY3JldCBzdWNjZXNzZnVsbHkgaGVyZSwgbm93IGRlY3J5cHQgdGhlIHNoYXJlZCB3YWxsZXQgcHJ2XG4gICAgY29uc3QgZGVjcnlwdGVkU2hhcmVkV2FsbGV0UHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIHBhc3N3b3JkOiBzZWNyZXQsXG4gICAgICBpbnB1dDogd2FsbGV0U2hhcmUua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LFxuICAgIH0pO1xuXG4gICAgLy8gV2Ugd2lsbCBub3cgcmUtZW5jcnlwdCB0aGUgd2FsbGV0IHdpdGggb3VyIG93biBwYXNzd29yZFxuICAgIGNvbnN0IG5ld1dhbGxldFBhc3NwaHJhc2UgPSBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSB8fCBwYXJhbXMudXNlclBhc3N3b3JkO1xuICAgIGVuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICBwYXNzd29yZDogbmV3V2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGlucHV0OiBkZWNyeXB0ZWRTaGFyZWRXYWxsZXRQcnYsXG4gICAgfSk7XG4gICAgY29uc3QgdXBkYXRlUGFyYW1zOiBVcGRhdGVTaGFyZU9wdGlvbnMgPSB7XG4gICAgICB3YWxsZXRTaGFyZUlkOiBwYXJhbXMud2FsbGV0U2hhcmVJZCxcbiAgICAgIHN0YXRlOiAnYWNjZXB0ZWQnLFxuICAgIH07XG5cbiAgICBpZiAoZW5jcnlwdGVkUHJ2KSB7XG4gICAgICB1cGRhdGVQYXJhbXMuZW5jcnlwdGVkUHJ2ID0gZW5jcnlwdGVkUHJ2O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy51cGRhdGVTaGFyZSh1cGRhdGVQYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1bGsgQWNjZXB0IHdhbGxldCBzaGFyZXMsIGFkZGluZyB0aGUgd2FsbGV0cyB0byB0aGUgdXNlcidzIGxpc3RcbiAgICogTmVlZHMgYSB1c2VyJ3MgcGFzc3dvcmQgdG8gZGVjcnlwdCB0aGUgc2hhcmVkIGtleVxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIEJ1bGtBY2NlcHRTaGFyZU9wdGlvbnNcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRTaGFyZUlkIC0gYXJyYXkgb2YgdGhlIHdhbGxldCBzaGFyZXMgdG8gYWNjZXB0XG4gICAqIEBwYXJhbSBwYXJhbXMudXNlclBhc3N3b3JkIC0gdXNlcidzIHBhc3N3b3JkIHRvIGRlY3J5cHQgdGhlIHNoYXJlZCB3YWxsZXQga2V5XG4gICAqIEBwYXJhbSBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSAtIG5ldyB3YWxsZXQgcGFzc3BocmFzZSBmb3Igc2F2aW5nIHRoZSBzaGFyZWQgd2FsbGV0IHBydi5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgbGVmdCBibGFuayB0aGVuIHRoZSB1c2VyJ3MgbG9naW4gcGFzc3dvcmQgaXMgdXNlZC5cbiAgICpcbiAgICpAcmV0dXJucyB7UHJvbWlzZTxBY2NlcHRTaGFyZVJlc3BvbnNlW10+fVxuICAgKi9cbiAgYXN5bmMgYnVsa0FjY2VwdFNoYXJlKHBhcmFtczogQnVsa0FjY2VwdFNoYXJlT3B0aW9ucyk6IFByb21pc2U8QWNjZXB0U2hhcmVSZXNwb25zZVtdPiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1c2VyTG9naW5QYXNzd29yZCddLCBbJ25ld1dhbGxldFBhc3NwaHJhc2UnXSk7XG4gICAgYXNzZXJ0KHBhcmFtcy53YWxsZXRTaGFyZUlkcy5sZW5ndGggPiAwLCAnbm8gd2FsbGV0U2hhcmVJZHMgYXJlIHBhc3NlZCcpO1xuXG4gICAgY29uc3QgYWxsV2FsbGV0U2hhcmVzID0gYXdhaXQgdGhpcy5saXN0U2hhcmVzVjIoKTtcbiAgICBjb25zdCB3YWxsZXRTaGFyZU1hcCA9IGFsbFdhbGxldFNoYXJlcy5pbmNvbWluZy5yZWR1Y2UoXG4gICAgICAobWFwOiB7IFtrZXk6IHN0cmluZ106IFdhbGxldFNoYXJlIH0sIHNoYXJlKSA9PiAoeyAuLi5tYXAsIFtzaGFyZS5pZF06IHNoYXJlIH0pLFxuICAgICAge31cbiAgICApO1xuXG4gICAgY29uc3Qgd2FsbGV0U2hhcmVzID0gcGFyYW1zLndhbGxldFNoYXJlSWRzXG4gICAgICAubWFwKCh3YWxsZXRTaGFyZUlkKSA9PiB3YWxsZXRTaGFyZU1hcFt3YWxsZXRTaGFyZUlkXSlcbiAgICAgIC5maWx0ZXIoKHdhbGxldFNoYXJlKSA9PiB3YWxsZXRTaGFyZSAmJiB3YWxsZXRTaGFyZS5rZXljaGFpbik7XG4gICAgaWYgKCF3YWxsZXRTaGFyZXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgd2FsbGV0IHNoYXJlcyBwcm92aWRlZCcpO1xuICAgIH1cbiAgICBjb25zdCBzaGFyaW5nS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJpdGdvLmdldEVDREhLZXljaGFpbigpO1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHNoYXJpbmdLZXljaGFpbi5lbmNyeXB0ZWRYcHJ2KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbmNyeXB0ZWRYcHJ2IHdhcyBub3QgZm91bmQgb24gc2hhcmluZyBrZXljaGFpbicpO1xuICAgIH1cblxuICAgIHNoYXJpbmdLZXljaGFpbi5wcnYgPSB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgcGFzc3dvcmQ6IHBhcmFtcy51c2VyTG9naW5QYXNzd29yZCxcbiAgICAgIGlucHV0OiBzaGFyaW5nS2V5Y2hhaW4uZW5jcnlwdGVkWHBydixcbiAgICB9KTtcbiAgICBjb25zdCBuZXdXYWxsZXRQYXNzcGhyYXNlID0gcGFyYW1zLm5ld1dhbGxldFBhc3NwaHJhc2UgfHwgcGFyYW1zLnVzZXJMb2dpblBhc3N3b3JkO1xuICAgIGNvbnN0IGtleXNGb3JXYWxsZXRTaGFyZXMgPSB3YWxsZXRTaGFyZXMuZmxhdE1hcCgod2FsbGV0U2hhcmUpID0+IHtcbiAgICAgIGlmICghd2FsbGV0U2hhcmUua2V5Y2hhaW4pIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VjcmV0ID0gZ2V0U2hhcmVkU2VjcmV0KFxuICAgICAgICBiaXAzMi5mcm9tQmFzZTU4KHNoYXJpbmdLZXljaGFpbi5wcnYpLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKHdhbGxldFNoYXJlLmtleWNoYWluLnBhdGgpKSxcbiAgICAgICAgQnVmZmVyLmZyb20od2FsbGV0U2hhcmUua2V5Y2hhaW4uZnJvbVB1YktleSwgJ2hleCcpXG4gICAgICApLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgICAgY29uc3QgZGVjcnlwdGVkU2hhcmVkV2FsbGV0UHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IHNlY3JldCxcbiAgICAgICAgaW5wdXQ6IHdhbGxldFNoYXJlLmtleWNoYWluLmVuY3J5cHRlZFBydixcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbmV3RW5jcnlwdGVkUHJ2ID0gdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IG5ld1dhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIGlucHV0OiBkZWNyeXB0ZWRTaGFyZWRXYWxsZXRQcnYsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB3YWxsZXRTaGFyZUlkOiB3YWxsZXRTaGFyZS5pZCxcbiAgICAgICAgICBlbmNyeXB0ZWRQcnY6IG5ld0VuY3J5cHRlZFBydixcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5idWxrQWNjZXB0U2hhcmVSZXF1ZXN0KGtleXNGb3JXYWxsZXRTaGFyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHdhbGxldCBieSBpdHMgSURcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmlkIHdhbGxldCBpZFxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdldFdhbGxldChwYXJhbXM6IEdldFdhbGxldE9wdGlvbnMgPSB7fSk6IFByb21pc2U8V2FsbGV0PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbXSk7XG5cbiAgICBjb25zdCBxdWVyeTogR2V0V2FsbGV0T3B0aW9ucyA9IHt9O1xuICAgIGlmIChwYXJhbXMuYWxsVG9rZW5zKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5hbGxUb2tlbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhbGxUb2tlbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5hbGxUb2tlbnMgPSBwYXJhbXMuYWxsVG9rZW5zO1xuICAgIH1cblxuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSk7XG5cbiAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyBwYXJhbXMuaWQpKVxuICAgICAgLnF1ZXJ5KHF1ZXJ5KVxuICAgICAgLnJlc3VsdCgpO1xuICAgIHJldHVybiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIHdhbGxldCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgd2FsbGV0IGJ5IGl0cyBhZGRyZXNzXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5hZGRyZXNzIHdhbGxldCBhZGRyZXNzXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0V2FsbGV0QnlBZGRyZXNzKHBhcmFtczogR2V0V2FsbGV0QnlBZGRyZXNzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnXSwgW10pO1xuXG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpKTtcblxuICAgIGNvbnN0IHdhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZHJlc3MvJyArIHBhcmFtcy5hZGRyZXNzKSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgd2FsbGV0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3IgYW55IGdpdmVuIHN1cHBvcnRlZCBjb2luLCBnZXQgdG90YWwgYmFsYW5jZXMgZm9yIGFsbCB3YWxsZXRzIG9mIHRoYXRcbiAgICogY29pbiB0eXBlIG9uIHRoZSBhY2NvdW50LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0VG90YWxCYWxhbmNlcyhwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYmFsYW5jZXMnKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgVFNTIG9yIEJMUy1ES0cgV2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlTXBjV2FsbGV0KHtcbiAgICBwYXNzcGhyYXNlLFxuICAgIGxhYmVsLFxuICAgIG11bHRpc2lnVHlwZSxcbiAgICBlbnRlcnByaXNlLFxuICAgIHdhbGxldFZlcnNpb24sXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgIGJhY2t1cFByb3ZpZGVyLFxuICB9OiBHZW5lcmF0ZU1wY1dhbGxldE9wdGlvbnMpOiBQcm9taXNlPFdhbGxldFdpdGhLZXljaGFpbnM+IHtcbiAgICBpZiAobXVsdGlzaWdUeXBlID09PSAndHNzJyAmJiB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWNkc2EnKSB7XG4gICAgICBjb25zdCB0c3NTZXR0aW5nczogVHNzU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5nZXQodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL3YyL3Rzcy9zZXR0aW5ncycpKVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgICBjb25zdCBtdWx0aXNpZ1R5cGVWZXJzaW9uID1cbiAgICAgICAgdHNzU2V0dGluZ3MuY29pblNldHRpbmdzW3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCldPy53YWxsZXRDcmVhdGlvblNldHRpbmdzPy5tdWx0aVNpZ1R5cGVWZXJzaW9uO1xuICAgICAgd2FsbGV0VmVyc2lvbiA9IHRoaXMuZGV0ZXJtaW5lRWNkc2FNcGNXYWxsZXRWZXJzaW9uKHdhbGxldFZlcnNpb24sIG11bHRpc2lnVHlwZVZlcnNpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgLy8gQ3JlYXRlIE1QQyBLZXljaGFpbnNcbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZU1wYyh7XG4gICAgICBtdWx0aXNpZ1R5cGUsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgZW50ZXJwcmlzZSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIGJhY2t1cFByb3ZpZGVyLFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIFdhbGxldFxuICAgIGNvbnN0IHsgdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbiB9ID0ga2V5Y2hhaW5zO1xuICAgIGNvbnN0IHdhbGxldFBhcmFtczogU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyA9IHtcbiAgICAgIGxhYmVsLFxuICAgICAgbTogMixcbiAgICAgIG46IDMsXG4gICAgICBrZXlzOiBbdXNlcktleWNoYWluLmlkLCBiYWNrdXBLZXljaGFpbi5pZCwgYml0Z29LZXljaGFpbi5pZF0sXG4gICAgICB0eXBlOiAnaG90JyxcbiAgICAgIG11bHRpc2lnVHlwZSxcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICB3YWxsZXRWZXJzaW9uLFxuICAgIH07XG4gICAgY29uc3QgZmluYWxXYWxsZXRQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLnN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldCh3YWxsZXRQYXJhbXMsIGtleWNoYWlucyk7XG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKGZpbmFsV2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcblxuICAgIGNvbnN0IHJlc3VsdDogV2FsbGV0V2l0aEtleWNoYWlucyA9IHtcbiAgICAgIHdhbGxldDogbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBuZXdXYWxsZXQpLFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcmVzcG9uc2VUeXBlOiAnV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgfTtcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChiYWNrdXBLZXljaGFpbi5wcnYpICYmICFfLmlzVW5kZWZpbmVkKGJhY2t1cFByb3ZpZGVyKSkge1xuICAgICAgcmVzdWx0Lndhcm5pbmcgPSAnQmUgc3VyZSB0byBiYWNrdXAgdGhlIGJhY2t1cCBrZXljaGFpbiAtLSBpdCBpcyBub3Qgc3RvcmVkIGFueXdoZXJlIGVsc2UhJztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIFNlbGYtTWFuYWdlZCBDb2xkIFRTUyBXYWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVTTUNNcGNXYWxsZXQoe1xuICAgIGxhYmVsLFxuICAgIG11bHRpc2lnVHlwZSxcbiAgICBlbnRlcnByaXNlLFxuICAgIHdhbGxldFZlcnNpb24sXG4gICAgYml0Z29LZXlJZCxcbiAgICBjb21tb25LZXljaGFpbixcbiAgICBjb2xkRGVyaXZhdGlvblNlZWQsXG4gIH06IEdlbmVyYXRlU01DTXBjV2FsbGV0T3B0aW9ucyk6IFByb21pc2U8V2FsbGV0V2l0aEtleWNoYWlucz4ge1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgbGV0IG11bHRpc2lnVHlwZVZlcnNpb246ICdNUEN2MicgfCB1bmRlZmluZWQ7XG4gICAgaWYgKG11bHRpc2lnVHlwZSA9PT0gJ3RzcycgJiYgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSA9PT0gJ2VjZHNhJykge1xuICAgICAgY29uc3QgdHNzU2V0dGluZ3M6IFRzc1NldHRpbmdzID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAuZ2V0KHRoaXMuYml0Z28ubWljcm9zZXJ2aWNlc1VybCgnL2FwaS92Mi90c3Mvc2V0dGluZ3MnKSlcbiAgICAgICAgLnJlc3VsdCgpO1xuICAgICAgbXVsdGlzaWdUeXBlVmVyc2lvbiA9XG4gICAgICAgIHRzc1NldHRpbmdzLmNvaW5TZXR0aW5nc1t0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpXT8ud2FsbGV0Q3JlYXRpb25TZXR0aW5ncz8uY29sZE11bHRpU2lnVHlwZVZlcnNpb247XG4gICAgICB3YWxsZXRWZXJzaW9uID0gdGhpcy5kZXRlcm1pbmVFY2RzYU1wY1dhbGxldFZlcnNpb24od2FsbGV0VmVyc2lvbiwgbXVsdGlzaWdUeXBlVmVyc2lvbik7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIE1QQyBLZXljaGFpbnNcbiAgICBjb25zdCBiaXRnb0tleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXQoeyBpZDogYml0Z29LZXlJZCB9KTtcblxuICAgIGlmICghYml0Z29LZXljaGFpbiB8fCAhYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaXRHbyBrZXljaGFpbiBub3QgZm91bmQnKTtcbiAgICB9XG5cbiAgICBpZiAoYml0Z29LZXljaGFpbi5zb3VyY2UgIT09ICdiaXRnbycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHByb3ZpZGVkIGJpdGdvS2V5SWQgaXMgbm90IGEgQml0R28ga2V5Y2hhaW4nKTtcbiAgICB9XG5cbiAgICBpZiAoYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbiAhPT0gY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHByb3ZpZGVkIENvbW1vbiBrZXljaGFpbiBtaXNtYXRjaCB3aXRoIHRoZSBwcm92aWRlZCBCaXRnbyBrZXknKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbGREZXJpdmF0aW9uU2VlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcktleWNoYWluUGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7XG4gICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIGtleVR5cGU6ICd0c3MnLFxuICAgICAgY29tbW9uS2V5Y2hhaW46IGNvbW1vbktleWNoYWluLFxuICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDogY29sZERlcml2YXRpb25TZWVkLFxuICAgICAgaXNNUEN2MjogbXVsdGlzaWdUeXBlVmVyc2lvbiA9PT0gJ01QQ3YyJyA/IHRydWUgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZCh1c2VyS2V5Y2hhaW5QYXJhbXMpO1xuXG4gICAgY29uc3QgYmFja3VwS2V5Q2hhaW5QYXJhbXM6IEFkZEtleWNoYWluT3B0aW9ucyA9IHtcbiAgICAgIHNvdXJjZTogJ2JhY2t1cCcsXG4gICAgICBrZXlUeXBlOiAndHNzJyxcbiAgICAgIGNvbW1vbktleWNoYWluOiBjb21tb25LZXljaGFpbixcbiAgICAgIGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQ6IGNvbGREZXJpdmF0aW9uU2VlZCxcbiAgICAgIGlzTVBDdjI6IG11bHRpc2lnVHlwZVZlcnNpb24gPT09ICdNUEN2MicgPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICBjb25zdCBiYWNrdXBLZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuYWRkKGJhY2t1cEtleUNoYWluUGFyYW1zKTtcblxuICAgIC8vIENyZWF0ZSBXYWxsZXRcbiAgICBjb25zdCBrZXljaGFpbnMgPSB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfTtcbiAgICBjb25zdCB3YWxsZXRQYXJhbXM6IFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMgPSB7XG4gICAgICBsYWJlbCxcbiAgICAgIG06IDIsXG4gICAgICBuOiAzLFxuICAgICAga2V5czogW3VzZXJLZXljaGFpbi5pZCwgYmFja3VwS2V5Y2hhaW4uaWQsIGJpdGdvS2V5Y2hhaW4uaWRdLFxuICAgICAgdHlwZTogJ2NvbGQnLFxuICAgICAgbXVsdGlzaWdUeXBlLFxuICAgICAgZW50ZXJwcmlzZSxcbiAgICAgIHdhbGxldFZlcnNpb24sXG4gICAgfTtcblxuICAgIGNvbnN0IGZpbmFsV2FsbGV0UGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5zdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQod2FsbGV0UGFyYW1zLCBrZXljaGFpbnMpO1xuICAgIGNvbnN0IG5ld1dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9hZGQnKSkuc2VuZChmaW5hbFdhbGxldFBhcmFtcykucmVzdWx0KCk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFdhbGxldFdpdGhLZXljaGFpbnMgPSB7XG4gICAgICB3YWxsZXQ6IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHJlc3BvbnNlVHlwZTogJ1dhbGxldFdpdGhLZXljaGFpbnMnLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIEN1c3RvZGlhbCBUU1MgV2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlQ3VzdG9kaWFsTXBjV2FsbGV0KHtcbiAgICBsYWJlbCxcbiAgICBtdWx0aXNpZ1R5cGUsXG4gICAgZW50ZXJwcmlzZSxcbiAgICB3YWxsZXRWZXJzaW9uLFxuICB9OiBHZW5lcmF0ZUJhc2VNcGNXYWxsZXRPcHRpb25zKTogUHJvbWlzZTxXYWxsZXRXaXRoS2V5Y2hhaW5zPiB7XG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBpZiAobXVsdGlzaWdUeXBlID09PSAndHNzJyAmJiB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWNkc2EnKSB7XG4gICAgICBjb25zdCB0c3NTZXR0aW5nczogVHNzU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5nZXQodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL3YyL3Rzcy9zZXR0aW5ncycpKVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgICBjb25zdCBtdWx0aXNpZ1R5cGVWZXJzaW9uID1cbiAgICAgICAgdHNzU2V0dGluZ3MuY29pblNldHRpbmdzW3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCldPy53YWxsZXRDcmVhdGlvblNldHRpbmdzPy5jdXN0b2RpYWxNdWx0aVNpZ1R5cGVWZXJzaW9uO1xuICAgICAgd2FsbGV0VmVyc2lvbiA9IHRoaXMuZGV0ZXJtaW5lRWNkc2FNcGNXYWxsZXRWZXJzaW9uKHdhbGxldFZlcnNpb24sIG11bHRpc2lnVHlwZVZlcnNpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmFsV2FsbGV0UGFyYW1zID0ge1xuICAgICAgbGFiZWwsXG4gICAgICBtdWx0aXNpZ1R5cGUsXG4gICAgICBlbnRlcnByaXNlLFxuICAgICAgd2FsbGV0VmVyc2lvbixcbiAgICAgIHR5cGU6ICdjdXN0b2RpYWwnLFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgV2FsbGV0XG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKGZpbmFsV2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcbiAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCk7XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gd2FsbGV0LmtleUlkcygpO1xuICAgIGNvbnN0IHJlc3VsdDogV2FsbGV0V2l0aEtleWNoYWlucyA9IHtcbiAgICAgIHdhbGxldCxcbiAgICAgIHVzZXJLZXljaGFpbjogeyBpZDoga2V5Y2hhaW5zWzBdLCB0eXBlOiBtdWx0aXNpZ1R5cGUsIHNvdXJjZTogJ3VzZXInIH0sXG4gICAgICBiYWNrdXBLZXljaGFpbjogeyBpZDoga2V5Y2hhaW5zWzFdLCB0eXBlOiBtdWx0aXNpZ1R5cGUsIHNvdXJjZTogJ2JhY2t1cCcgfSxcbiAgICAgIGJpdGdvS2V5Y2hhaW46IHsgaWQ6IGtleWNoYWluc1syXSwgdHlwZTogbXVsdGlzaWdUeXBlLCBzb3VyY2U6ICdiaXRnbycgfSxcbiAgICAgIHJlc3BvbnNlVHlwZTogJ1dhbGxldFdpdGhLZXljaGFpbnMnLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRlcm1pbmVFY2RzYU1wY1dhbGxldFZlcnNpb24od2FsbGV0VmVyc2lvbj86IG51bWJlciwgbXVsdGlzaWdUeXBlVmVyc2lvbj86IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uaXNFVk0oKSAmJiBtdWx0aXNpZ1R5cGVWZXJzaW9uID09PSAnTVBDdjInKSB7XG4gICAgICBpZiAoIXdhbGxldFZlcnNpb24gfHwgKHdhbGxldFZlcnNpb24gIT09IDUgJiYgd2FsbGV0VmVyc2lvbiAhPT0gNikpIHtcbiAgICAgICAgcmV0dXJuIDU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3YWxsZXRWZXJzaW9uO1xuICB9XG59XG4iXX0=
1002
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvd2FsbGV0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0Q0Esc0RBSUM7QUFoREQ7O0dBRUc7QUFDSCxvREFBNEI7QUFDNUIsK0NBQXlDO0FBQ3pDLDhDQUF3QztBQUN4QywwQ0FBNEI7QUFDNUIsNENBQTZDO0FBRTdDLG1DQUErQztBQUMvQyxxREFBdUM7QUFHdkMsa0NBQTBDO0FBQzFDLDBDQUF1RTtBQUN2RSxvQ0FBcUU7QUFDckUseUNBb0JvQjtBQUVwQixxQ0FBa0M7QUFHbEM7O0dBRUc7QUFDSCxTQUFnQixxQkFBcUIsQ0FDbkMsTUFBMEQ7SUFFMUQsT0FBTyxNQUFNLENBQUMsWUFBWSxLQUFLLHFCQUFxQixDQUFDO0FBQ3ZELENBQUM7QUFFRCxNQUFhLE9BQU87SUFJbEIsWUFBWSxLQUFnQixFQUFFLFFBQW1CO1FBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQTJCLEVBQUU7UUFDckMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFzRCxFQUFFO1FBQ2pFLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFD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UUFFRixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sOEJBQThCLENBQUMsYUFBc0IsRUFBRSxtQkFBNEI7UUFDekYsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLG1CQUFtQixLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQzdELElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxhQUFhLEtBQUssQ0FBQyxJQUFJLGFBQWEsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNuRSxPQUFPLENBQUMsQ0FBQztZQUNYLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztDQUNGO0FBL2xDRCwwQkErbENDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgQmlnTnVtYmVyIH0gZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IENvaW5GZWF0dXJlIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuXG5pbXBvcnQgeyBzYW5pdGl6ZUxlZ2FjeVBhdGggfSBmcm9tICcuLi8uLi9hcGknO1xuaW1wb3J0ICogYXMgY29tbW9uIGZyb20gJy4uLy4uL2NvbW1vbic7XG5pbXBvcnQgeyBJQmFzZUNvaW4sIEtleWNoYWluc1RyaXBsZXQsIEtleVBhaXIsIFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMgfSBmcm9tICcuLi9iYXNlQ29pbic7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgZ2V0U2hhcmVkU2VjcmV0IH0gZnJvbSAnLi4vZWNkaCc7XG5pbXBvcnQgeyBBZGRLZXljaGFpbk9wdGlvbnMsIEtleWNoYWluLCBLZXlJbmRpY2VzIH0gZnJvbSAnLi4va2V5Y2hhaW4nO1xuaW1wb3J0IHsgZGVjb2RlT3JFbHNlLCBwcm9taXNlUHJvcHMsIFJlcXVlc3RUcmFjZXIgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge1xuICBBY2NlcHRTaGFyZU9wdGlvbnMsXG4gIEFjY2VwdFNoYXJlT3B0aW9uc1JlcXVlc3QsXG4gIEFjY2VwdFNoYXJlUmVzcG9uc2UsXG4gIEFkZFdhbGxldE9wdGlvbnMsXG4gIEJ1bGtBY2NlcHRTaGFyZU9wdGlvbnMsXG4gIEdlbmVyYXRlQmFzZU1wY1dhbGxldE9wdGlvbnMsXG4gIEdlbmVyYXRlTGlnaHRuaW5nV2FsbGV0T3B0aW9ucyxcbiAgR2VuZXJhdGVMaWdodG5pbmdXYWxsZXRPcHRpb25zQ29kZWMsXG4gIEdlbmVyYXRlTXBjV2FsbGV0T3B0aW9ucyxcbiAgR2VuZXJhdGVTTUNNcGNXYWxsZXRPcHRpb25zLFxuICBHZW5lcmF0ZVdhbGxldE9wdGlvbnMsXG4gIEdldFdhbGxldEJ5QWRkcmVzc09wdGlvbnMsXG4gIEdldFdhbGxldE9wdGlvbnMsXG4gIElXYWxsZXRzLFxuICBMaWdodG5pbmdXYWxsZXRXaXRoS2V5Y2hhaW5zLFxuICBMaXN0V2FsbGV0T3B0aW9ucyxcbiAgVXBkYXRlU2hhcmVPcHRpb25zLFxuICBXYWxsZXRTaGFyZXMsXG4gIFdhbGxldFdpdGhLZXljaGFpbnMsXG59IGZyb20gJy4vaVdhbGxldHMnO1xuaW1wb3J0IHsgV2FsbGV0U2hhcmUgfSBmcm9tICcuL2lXYWxsZXQnO1xuaW1wb3J0IHsgV2FsbGV0IH0gZnJvbSAnLi93YWxsZXQnO1xuaW1wb3J0IHsgVHNzU2V0dGluZ3MgfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcblxuLyoqXG4gKiBDaGVjayBpZiBhIHdhbGxldCBpcyBhIFdhbGxldFdpdGhLZXljaGFpbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV2FsbGV0V2l0aEtleWNoYWlucyhcbiAgd2FsbGV0OiBXYWxsZXRXaXRoS2V5Y2hhaW5zIHwgTGlnaHRuaW5nV2FsbGV0V2l0aEtleWNoYWluc1xuKTogd2FsbGV0IGlzIFdhbGxldFdpdGhLZXljaGFpbnMge1xuICByZXR1cm4gd2FsbGV0LnJlc3BvbnNlVHlwZSA9PT0gJ1dhbGxldFdpdGhLZXljaGFpbnMnO1xufVxuXG5leHBvcnQgY2xhc3MgV2FsbGV0cyBpbXBsZW1lbnRzIElXYWxsZXRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiaXRnbzogQml0R29CYXNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VDb2luOiBJQmFzZUNvaW47XG5cbiAgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgYmFzZUNvaW46IElCYXNlQ29pbikge1xuICAgIHRoaXMuYml0Z28gPSBiaXRnbztcbiAgICB0aGlzLmJhc2VDb2luID0gYmFzZUNvaW47XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgd2FsbGV0IGJ5IElEIChwcm94eSBmb3IgZ2V0V2FsbGV0KVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXQocGFyYW1zOiBHZXRXYWxsZXRPcHRpb25zID0ge30pOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIHJldHVybiB0aGlzLmdldFdhbGxldChwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYSB1c2VyJ3Mgd2FsbGV0c1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgbGlzdChwYXJhbXM6IExpc3RXYWxsZXRPcHRpb25zICYgeyBlbnRlcnByaXNlPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8eyB3YWxsZXRzOiBXYWxsZXRbXSB9PiB7XG4gICAgaWYgKHBhcmFtcy5za2lwICYmIHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHNwZWNpZnkgYm90aCBza2lwIGFuZCBwcmV2SWQnKTtcbiAgICB9XG4gICAgY29uc3QgYm9keSA9IChhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldCcpKS5xdWVyeShwYXJhbXMpLnJlc3VsdCgpKSBhcyBhbnk7XG4gICAgYm9keS53YWxsZXRzID0gYm9keS53YWxsZXRzLm1hcCgodykgPT4gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCB3KSk7XG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cblxuICAvKipcbiAgICogYWRkXG4gICAqIEFkZCBhIG5ldyB3YWxsZXQgKGFkdmFuY2VkIG1vZGUpLlxuICAgKiBUaGlzIGFsbG93cyB5b3UgdG8gbWFudWFsbHkgc3VibWl0IHRoZSBrZXlzLCB0eXBlLCBtIGFuZCBuIG9mIHRoZSB3YWxsZXRcbiAgICogUGFyYW1ldGVycyBpbmNsdWRlOlxuICAgKiAgICBcImxhYmVsXCI6IGxhYmVsIG9mIHRoZSB3YWxsZXQgdG8gYmUgc2hvd24gaW4gVUlcbiAgICogICAgXCJtXCI6IG51bWJlciBvZiBrZXlzIHJlcXVpcmVkIHRvIHVubG9jayB3YWxsZXQgKDIpXG4gICAqICAgIFwiblwiOiBudW1iZXIgb2Yga2V5cyBhdmFpbGFibGUgb24gdGhlIHdhbGxldCAoMylcbiAgICogICAgXCJrZXlzXCI6IGFycmF5IG9mIGtleWNoYWluIGlkc1xuICAgKi9cbiAgYXN5bmMgYWRkKHBhcmFtczogQWRkV2FsbGV0T3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuXG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnbGFiZWwnLCAnZW50ZXJwcmlzZScsICd0eXBlJ10pO1xuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMubGFiZWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciBsYWJlbCcpO1xuICAgIH1cblxuICAgIC8vIG5vIG5lZWQgdG8gcGFzcyBrZXlzIGZvciAoc2luZ2xlKSBjdXN0b2RpYWwgd2FsbGV0c1xuICAgIGlmIChwYXJhbXMudHlwZSAhPT0gJ2N1c3RvZGlhbCcpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtcy5rZXlzKSA9PT0gZmFsc2UgfHwgIV8uaXNOdW1iZXIocGFyYW1zLm0pIHx8ICFfLmlzTnVtYmVyKHBhcmFtcy5uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIHR5cGVzIG9mIG11bHRpc2lnXG4gICAgICBpZiAoIXRoaXMuYmFzZUNvaW4uaXNWYWxpZE1vZk5TZXR1cChwYXJhbXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgbXVsdGktc2lnIHR5cGUnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmdhc1ByaWNlICYmICFfLmlzTnVtYmVyKHBhcmFtcy5nYXNQcmljZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgZ2FzUHJpY2UgLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLndhbGxldFZlcnNpb24pIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMud2FsbGV0VmVyc2lvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciB3YWxsZXRWZXJzaW9uIC0gbnVtYmVyIGV4cGVjdGVkJyk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLm11bHRpc2lnVHlwZSA9PT0gJ3RzcycgJiYgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSA9PT0gJ2VjZHNhJyAmJiBwYXJhbXMud2FsbGV0VmVyc2lvbiA9PT0gMykge1xuICAgICAgICBjb25zdCB0c3NTZXR0aW5nczogVHNzU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgICAgLmdldCh0aGlzLmJpdGdvLm1pY3Jvc2VydmljZXNVcmwoJy9hcGkvdjIvdHNzL3NldHRpbmdzJykpXG4gICAgICAgICAgLnJlc3VsdCgpO1xuICAgICAgICBjb25zdCBtdWx0aXNpZ1R5cGVWZXJzaW9uID1cbiAgICAgICAgICB0c3NTZXR0aW5ncy5jb2luU2V0dGluZ3NbdGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKV0/LndhbGxldENyZWF0aW9uU2V0dGluZ3M/Lm11bHRpU2lnVHlwZVZlcnNpb247XG4gICAgICAgIGlmIChtdWx0aXNpZ1R5cGVWZXJzaW9uID09PSAnTVBDdjInKSB7XG4gICAgICAgICAgcGFyYW1zLndhbGxldFZlcnNpb24gPSA1O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy50YWdzICYmIEFycmF5LmlzQXJyYXkocGFyYW1zLnRhZ3MpID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciB0YWdzIC0gYXJyYXkgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmNsaWVudEZsYWdzICYmIEFycmF5LmlzQXJyYXkocGFyYW1zLmNsaWVudEZsYWdzKSA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgY2xpZW50RmxhZ3MgLSBhcnJheSBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuaXNDb2xkICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaXNDb2xkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBpc0NvbGQgLSBib29sZWFuIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5pc0N1c3RvZGlhbCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmlzQ3VzdG9kaWFsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBpc0N1c3RvZGlhbCAtIGJvb2xlYW4gZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmFkZHJlc3MgJiYgKCFfLmlzU3RyaW5nKHBhcmFtcy5hZGRyZXNzKSB8fCAhdGhpcy5iYXNlQ29pbi5pc1ZhbGlkQWRkcmVzcyhwYXJhbXMuYWRkcmVzcykpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFkZHJlc3MgLSB2YWxpZCBhZGRyZXNzIHN0cmluZyBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9hZGQnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiB7XG4gICAgICB3YWxsZXQ6IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldChwYXJhbXM6IEdlbmVyYXRlTGlnaHRuaW5nV2FsbGV0T3B0aW9ucyk6IFByb21pc2U8TGlnaHRuaW5nV2FsbGV0V2l0aEtleWNoYWlucz4ge1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgY29uc3QgeyBsYWJlbCwgcGFzc3BocmFzZSwgZW50ZXJwcmlzZSwgcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSB9ID0gcGFyYW1zO1xuXG4gICAgY29uc3Qga2V5Y2hhaW5Qcm9taXNlcyA9IChbdW5kZWZpbmVkLCAndXNlckF1dGgnLCAnbm9kZUF1dGgnXSBhcyBjb25zdCkubWFwKChwdXJwb3NlKSA9PiB7XG4gICAgICByZXR1cm4gYXN5bmMgKCk6IFByb21pc2U8S2V5Y2hhaW4+ID0+IHtcbiAgICAgICAgbGV0IGtleWNoYWluOiBLZXlQYWlyIHwgbnVsbCA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG4gICAgICAgIGNvbnN0IHB1YiA9IGtleWNoYWluLnB1YjtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkUHJ2ID0gdGhpcy5iaXRnby5lbmNyeXB0KHsgcGFzc3dvcmQ6IHBhc3NwaHJhc2UsIGlucHV0OiBrZXljaGFpbi5wcnYgfSk7XG4gICAgICAgIGRlbGV0ZSAoa2V5Y2hhaW4gYXMgYW55KS5wcnY7XG4gICAgICAgIGtleWNoYWluID0gbnVsbDtcbiAgICAgICAgY29uc3Qga2V5Y2hhaW5QYXJhbXM6IEFkZEtleWNoYWluT3B0aW9ucyA9IHtcbiAgICAgICAgICBwdWIsXG4gICAgICAgICAgZW5jcnlwdGVkUHJ2LFxuICAgICAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZTogcHVycG9zZSA9PT0gdW5kZWZpbmVkID8gcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjb2luU3BlY2lmaWM6IHB1cnBvc2UgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHsgW3RoaXMuYmFzZUNvaW4uZ2V0Q2hhaW4oKV06IHsgcHVycG9zZSB9IH0sXG4gICAgICAgICAga2V5VHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuYWRkKGtleWNoYWluUGFyYW1zKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgdXNlckF1dGhLZXljaGFpbiwgbm9kZUF1dGhLZXljaGFpbiB9ID0gYXdhaXQgcHJvbWlzZVByb3BzKHtcbiAgICAgIHVzZXJLZXljaGFpbjoga2V5Y2hhaW5Qcm9taXNlc1swXSgpLFxuICAgICAgdXNlckF1dGhLZXljaGFpbjoga2V5Y2hhaW5Qcm9taXNlc1sxXSgpLFxuICAgICAgbm9kZUF1dGhLZXljaGFpbjoga2V5Y2hhaW5Qcm9taXNlc1syXSgpLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge1xuICAgICAgbGFiZWwsXG4gICAgICBtOiAxLFxuICAgICAgbjogMSxcbiAgICAgIHR5cGU6ICdob3QnLFxuICAgICAgZW50ZXJwcmlzZSxcbiAgICAgIGtleXM6IFt1c2VyS2V5Y2hhaW4uaWRdLFxuICAgICAgY29pblNwZWNpZmljOiB7IFt0aGlzLmJhc2VDb2luLmdldENoYWluKCldOiB7IGtleXM6IFt1c2VyQXV0aEtleWNoYWluLmlkLCBub2RlQXV0aEtleWNoYWluLmlkXSB9IH0sXG4gICAgfTtcblxuICAgIGNvbnN0IG5ld1dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9hZGQnKSkuc2VuZCh3YWxsZXRQYXJhbXMpLnJlc3VsdCgpO1xuICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KTtcbiAgICByZXR1cm4ge1xuICAgICAgd2FsbGV0LFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgdXNlckF1dGhLZXljaGFpbixcbiAgICAgIG5vZGVBdXRoS2V5Y2hhaW4sXG4gICAgICByZXNwb25zZVR5cGU6ICdMaWdodG5pbmdXYWxsZXRXaXRoS2V5Y2hhaW5zJyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgbmV3IHdhbGxldFxuICAgKiAxLiBDcmVhdGVzIHRoZSB1c2VyIGtleWNoYWluIGxvY2FsbHkgb24gdGhlIGNsaWVudCwgYW5kIGVuY3J5cHRzIGl0IHdpdGggdGhlIHByb3ZpZGVkIHBhc3NwaHJhc2VcbiAgICogMi4gSWYgbm8gcHViIHdhcyBwcm92aWRlZCwgY3JlYXRlcyB0aGUgYmFja3VwIGtleWNoYWluIGxvY2FsbHkgb24gdGhlIGNsaWVudCwgYW5kIGVuY3J5cHRzIGl0IHdpdGggdGhlIHByb3ZpZGVkIHBhc3NwaHJhc2VcbiAgICogMy4gVXBsb2FkcyB0aGUgZW5jcnlwdGVkIHVzZXIgYW5kIGJhY2t1cCBrZXljaGFpbnMgdG8gQml0R29cbiAgICogNC4gQ3JlYXRlcyB0aGUgQml0R28ga2V5IG9uIHRoZSBzZXJ2aWNlXG4gICAqIDUuIENyZWF0ZXMgdGhlIHdhbGxldCBvbiBCaXRHbyB3aXRoIHRoZSAzIHB1YmxpYyBrZXlzIGFib3ZlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5sYWJlbCBMYWJlbCBmb3IgdGhlIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zLnBhc3NwaHJhc2UgUGFzc3BocmFzZSB0byBiZSB1c2VkIHRvIGVuY3J5cHQgdGhlIHVzZXIgYW5kIGJhY2t1cCBrZXljaGFpbnNcbiAgICogQHBhcmFtIHBhcmFtcy51c2VyS2V5IFVzZXIgeHB1YlxuICAgKiBAcGFyYW0gcGFyYW1zLmJhY2t1cFhwdWIgQmFja3VwIHhwdWJcbiAgICogQHBhcmFtIHBhcmFtcy5iYWNrdXBYcHViUHJvdmlkZXJcbiAgICogQHBhcmFtIHBhcmFtcy5iYWNrdXBQcm92aWRlciBUaGlyZCBwYXJ0eSBiYWNrdXAgcHJvdmlkZXIgZm9yIFRTU1xuICAgKiBAcGFyYW0gcGFyYW1zLmVudGVycHJpc2UgdGhlIGVudGVycHJpc2VJZFxuICAgKiBAcGFyYW0gcGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnNcbiAgICogQHBhcmFtIHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlIG9wdGlvbmFsIHRoaXMgaXMgYSByZWNvdmVyeSBjb2RlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgb3JpZ2luYWwgcGFzc3BocmFzZSBpbiBhIHJlY292ZXJ5IGNhc2UuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdXNlciBtdXN0IGdlbmVyYXRlIGFuZCBrZWVwIHRoZSBlbmNyeXB0ZWQgb3JpZ2luYWwgcGFzc3BocmFzZSBzYWZlIHdoaWxlIHRoaXMgY29kZSBpcyBzdG9yZWQgb24gQml0R29cbiAgICogQHBhcmFtIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQgb3B0aW9uYWwgc2VlZCBmb3IgU01DIHdhbGxldHNcbiAgICogQHBhcmFtIHBhcmFtcy5nYXNQcmljZVxuICAgKiBAcGFyYW0gcGFyYW1zLmRpc2FibGVLUlNFbWFpbFxuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFZlcnNpb25cbiAgICogQHBhcmFtIHBhcmFtcy5tdWx0aXNpZ1R5cGUgb3B0aW9uYWwgbXVsdGlzaWcgdHlwZSwgJ29uY2hhaW4nIG9yICd0c3MnIG9yICdibHNka2cnOyBpZiBhYnNlbnQsIHdlIHdpbGwgZGVmZXIgdG8gdGhlIGNvaW4ncyBkZWZhdWx0IHR5cGVcbiAgICogQHBhcmFtIHBhcmFtcy5pc0Rpc3RyaWJ1dGVkQ3VzdG9keSBvcHRpb25hbCBwYXJhbWV0ZXIgZm9yIGNyZWF0aW5nIGJpdGdvIGtleS4gVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB5b3Ugd2FudCB0byBjcmVhdGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGRpc3RyaWJ1dGVkIGN1c3RvZHkgd2FsbGV0LiBJZiBwcm92aWRlZCwgeW91IG11c3QgaGF2ZSB0aGUgZW50ZXJwcmlzZSBsaWNlbnNlIGFuZCBwYXNzIGluXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHBhcmFtcy5lbnRlcnByaXNlYCBpbnRvIGBnZW5lcmF0ZVdhbGxldGAgYXMgd2VsbC5cbiAgICogQHBhcmFtIHBhcmFtcy50eXBlIG9wdGlvbmFsIHdhbGxldCB0eXBlLCAnaG90JyBvciAnY29sZCcgb3IgJ2N1c3RvZGlhbCc7IGlmIGFic2VudCwgd2Ugd2lsbCBkZWZlciB0byAnaG90J1xuICAgKiBAcGFyYW0gcGFyYW1zLmJpdGdvS2V5SWQgb3B0aW9uYWwgYml0Z28ga2V5IGlkIGZvciBTTUMgVFNTIHdhbGxldHNcbiAgICogQHBhcmFtIHBhcmFtcy5jb21tb25LZXljaGFpbiBvcHRpb25hbCBjb21tb24ga2V5Y2hhaW4gZm9yIFNNQyBUU1Mgd2FsbGV0c1xuICAgKlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlV2FsbGV0KFxuICAgIHBhcmFtczogR2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxXYWxsZXRXaXRoS2V5Y2hhaW5zIHwgTGlnaHRuaW5nV2FsbGV0V2l0aEtleWNoYWlucz4ge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpID09PSAnbG5idGMnKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gZGVjb2RlT3JFbHNlKFxuICAgICAgICBHZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldE9wdGlvbnNDb2RlYy5uYW1lLFxuICAgICAgICBHZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldE9wdGlvbnNDb2RlYyxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICAoZXJyb3JzKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBlcnJvcihzKSBwYXJzaW5nIGdlbmVyYXRlIGxpZ2h0bmluZyB3YWxsZXQgcmVxdWVzdCBwYXJhbXM6ICR7ZXJyb3JzfWApO1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCB3YWxsZXREYXRhID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldChvcHRpb25zKTtcbiAgICAgIHdhbGxldERhdGEuZW5jcnlwdGVkV2FsbGV0UGFzc3BocmFzZSA9IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgIGlucHV0OiBvcHRpb25zLnBhc3NwaHJhc2UsXG4gICAgICAgIHBhc3N3b3JkOiBvcHRpb25zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB3YWxsZXREYXRhO1xuICAgIH1cblxuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnbGFiZWwnXSwgWydwYXNzcGhyYXNlJywgJ3VzZXJLZXknLCAnYmFja3VwWHB1YiddKTtcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5sYWJlbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIGxhYmVsJyk7XG4gICAgfVxuXG4gICAgY29uc3QgeyB0eXBlID0gJ2hvdCcsIGxhYmVsLCBwYXNzcGhyYXNlLCBlbnRlcnByaXNlLCBpc0Rpc3RyaWJ1dGVkQ3VzdG9keSB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGlzVHNzID0gcGFyYW1zLm11bHRpc2lnVHlwZSA9PT0gJ3RzcycgJiYgdGhpcy5iYXNlQ29pbi5zdXBwb3J0c1RzcygpO1xuICAgIGNvbnN0IGNhbkVuY3J5cHQgPSAhIXBhc3NwaHJhc2UgJiYgdHlwZW9mIHBhc3NwaHJhc2UgPT09ICdzdHJpbmcnO1xuXG4gICAgY29uc3Qgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge1xuICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgbTogMixcbiAgICAgIG46IDMsXG4gICAgICBrZXlzOiBbXSxcbiAgICAgIHR5cGU6ICEhcGFyYW1zLnVzZXJLZXkgJiYgcGFyYW1zLm11bHRpc2lnVHlwZSAhPT0gJ29uY2hhaW4nID8gJ2NvbGQnIDogdHlwZSxcbiAgICB9O1xuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Bhc3Njb2RlRW5jcnlwdGlvbkNvZGUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChlbnRlcnByaXNlKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGVudGVycHJpc2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBlbnRlcnByaXNlIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMuZW50ZXJwcmlzZSA9IGVudGVycHJpc2U7XG4gICAgfVxuXG4gICAgLy8gRVZNIFRTUyB3YWxsZXRzIG11c3QgdXNlIHdhbGxldCB2ZXJzaW9uIDMsIDUgYW5kIDZcbiAgICBpZiAoXG4gICAgICBpc1RzcyAmJlxuICAgICAgdGhpcy5iYXNlQ29pbi5pc0VWTSgpICYmXG4gICAgICAhKHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSAzIHx8IHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSA1IHx8IHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSA2KVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFVk0gVFNTIHdhbGxldHMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciB3YWxsZXQgdmVyc2lvbiAzLCA1IGFuZCA2Jyk7XG4gICAgfVxuXG4gICAgaWYgKGlzVHNzKSB7XG4gICAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNUc3MoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvaW4gJHt0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpfSBkb2VzIG5vdCBzdXBwb3J0IFRTUyBhdCB0aGlzIHRpbWVgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgKHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSA1IHx8IHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSA2KSAmJlxuICAgICAgICAhdGhpcy5iYXNlQ29pbi5nZXRDb25maWcoKS5mZWF0dXJlcy5pbmNsdWRlcyhDb2luRmVhdHVyZS5NUENWMilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvaW4gJHt0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpfSBkb2VzIG5vdCBzdXBwb3J0IFRTUyBNUEN2MiBhdCB0aGlzIHRpbWVgKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChlbnRlcnByaXNlLCAnZW50ZXJwcmlzZSBpcyByZXF1aXJlZCBmb3IgVFNTIHdhbGxldCcpO1xuXG4gICAgICBpZiAodHlwZSA9PT0gJ2NvbGQnKSB7XG4gICAgICAgIC8vIHZhbGlkYXRlXG4gICAgICAgIGFzc2VydChwYXJhbXMuYml0Z29LZXlJZCwgJ2JpdGdvS2V5SWQgaXMgcmVxdWlyZWQgZm9yIFNNQyBUU1Mgd2FsbGV0Jyk7XG4gICAgICAgIGFzc2VydChwYXJhbXMuY29tbW9uS2V5Y2hhaW4sICdjb21tb25LZXljaGFpbiBpcyByZXF1aXJlZCBmb3IgU01DIFRTUyB3YWxsZXQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVTTUNNcGNXYWxsZXQoe1xuICAgICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgZW50ZXJwcmlzZSxcbiAgICAgICAgICB3YWxsZXRWZXJzaW9uOiBwYXJhbXMud2FsbGV0VmVyc2lvbixcbiAgICAgICAgICBiaXRnb0tleUlkOiBwYXJhbXMuYml0Z29LZXlJZCxcbiAgICAgICAgICBjb21tb25LZXljaGFpbjogcGFyYW1zLmNvbW1vbktleWNoYWluLFxuICAgICAgICAgIGNvbGREZXJpdmF0aW9uU2VlZDogcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlID09PSAnY3VzdG9kaWFsJykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUN1c3RvZGlhbE1wY1dhbGxldCh7XG4gICAgICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICBlbnRlcnByaXNlLFxuICAgICAgICAgIHdhbGxldFZlcnNpb246IHBhcmFtcy53YWxsZXRWZXJzaW9uLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0KHBhc3NwaHJhc2UsICdjYW5ub3QgZ2VuZXJhdGUgVFNTIGtleXMgd2l0aG91dCBwYXNzcGhyYXNlJyk7XG4gICAgICBjb25zdCB3YWxsZXREYXRhID0gYXdhaXQgdGhpcy5nZW5lcmF0ZU1wY1dhbGxldCh7XG4gICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgIGxhYmVsLFxuICAgICAgICBwYXNzcGhyYXNlLFxuICAgICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6IHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgICBlbnRlcnByaXNlLFxuICAgICAgICB3YWxsZXRWZXJzaW9uOiBwYXJhbXMud2FsbGV0VmVyc2lvbixcbiAgICAgICAgYmFja3VwUHJvdmlkZXI6IHBhcmFtcy5iYWNrdXBQcm92aWRlcixcbiAgICAgIH0pO1xuICAgICAgaWYgKHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSB7XG4gICAgICAgIHdhbGxldERhdGEuZW5jcnlwdGVkV2FsbGV0UGFzc3BocmFzZSA9IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgaW5wdXQ6IHBhc3NwaHJhc2UsXG4gICAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3YWxsZXREYXRhO1xuICAgIH1cblxuICAgIGNvbnN0IGlzQmxzRGtnID0gcGFyYW1zLm11bHRpc2lnVHlwZSA/IHBhcmFtcy5tdWx0aXNpZ1R5cGUgPT09ICdibHNka2cnIDogdGhpcy5iYXNlQ29pbi5zdXBwb3J0c0Jsc0RrZygpO1xuICAgIGlmIChpc0Jsc0RrZykge1xuICAgICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzQmxzRGtnKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb2luICR7dGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKX0gZG9lcyBub3Qgc3VwcG9ydCBCTFMtREtHIGF0IHRoaXMgdGltZWApO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KGVudGVycHJpc2UsICdlbnRlcnByaXNlIGlzIHJlcXVpcmVkIGZvciBCTFMtREtHIHdhbGxldCcpO1xuXG4gICAgICBpZiAodHlwZSA9PT0gJ2NvbGQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQkxTLURLRyBTTUMgd2FsbGV0cyBhcmUgbm90IHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGUgPT09ICdjdXN0b2RpYWwnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQkxTLURLRyBjdXN0b2RpYWwgd2FsbGV0cyBhcmUgbm90IHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUnKTtcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0KHBhc3NwaHJhc2UsICdjYW5ub3QgZ2VuZXJhdGUgQkxTLURLRyBrZXlzIHdpdGhvdXQgcGFzc3BocmFzZScpO1xuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVNcGNXYWxsZXQoeyBtdWx0aXNpZ1R5cGU6ICdibHNka2cnLCBsYWJlbCwgcGFzc3BocmFzZSwgZW50ZXJwcmlzZSB9KTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZGlzdHJpYnV0ZWQgY3VzdG9keVxuICAgIGlmIChpc0Rpc3RyaWJ1dGVkQ3VzdG9keSkge1xuICAgICAgaWYgKCFlbnRlcnByaXNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIGVudGVycHJpc2Ugd2hlbiBjcmVhdGluZyBkaXN0cmlidXRlZCBjdXN0b2R5IHdhbGxldCcpO1xuICAgICAgfVxuICAgICAgaWYgKCF0eXBlIHx8IHR5cGUgIT09ICdjb2xkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rpc3RyaWJ1dGVkIGN1c3RvZHkgd2FsbGV0cyBtdXN0IGJlIHR5cGU6IGNvbGQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYXNCYWNrdXBYcHViID0gISFwYXJhbXMuYmFja3VwWHB1YjtcbiAgICBjb25zdCBoYXNCYWNrdXBYcHViUHJvdmlkZXIgPSAhIXBhcmFtcy5iYWNrdXBYcHViUHJvdmlkZXI7XG4gICAgaWYgKGhhc0JhY2t1cFhwdWIgJiYgaGFzQmFja3VwWHB1YlByb3ZpZGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBwcm92aWRlIG1vcmUgdGhhbiBvbmUgYmFja3VwWHB1YiBvciBiYWNrdXBYcHViUHJvdmlkZXIgZmxhZycpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZ2FzUHJpY2UgJiYgcGFyYW1zLmVpcDE1NTkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2FuIG5vdCB1c2UgYm90aCBlaXAxNTU5IGFuZCBnYXNQcmljZSB2YWx1ZXMnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zID0gcGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5nYXNQcmljZSkpIHtcbiAgICAgIGNvbnN0IGdhc1ByaWNlQk4gPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5nYXNQcmljZSk7XG4gICAgICBpZiAoZ2FzUHJpY2VCTi5pc05hTigpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBnYXMgcHJpY2UgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXIgb3IgbnVtYmVyIGFzIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLmdhc1ByaWNlID0gZ2FzUHJpY2VCTi50b1N0cmluZygpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZWlwMTU1OSkgJiYgIV8uaXNFbXB0eShwYXJhbXMuZWlwMTU1OSkpIHtcbiAgICAgIGNvbnN0IG1heEZlZVBlckdhc0JOID0gbmV3IEJpZ051bWJlcihwYXJhbXMuZWlwMTU1OS5tYXhGZWVQZXJHYXMpO1xuICAgICAgaWYgKG1heEZlZVBlckdhc0JOLmlzTmFOKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1heCBmZWUgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXIgb3IgbnVtYmVyIGFzIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgY29uc3QgbWF4UHJpb3JpdHlGZWVQZXJHYXNCTiA9IG5ldyBCaWdOdW1iZXIocGFyYW1zLmVpcDE1NTkubWF4UHJpb3JpdHlGZWVQZXJHYXMpO1xuICAgICAgaWYgKG1heFByaW9yaXR5RmVlUGVyR2FzQk4uaXNOYU4oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJpb3JpdHkgZmVlIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyIG9yIG51bWJlciBhcyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5laXAxNTU5ID0ge1xuICAgICAgICBtYXhGZWVQZXJHYXM6IG1heEZlZVBlckdhc0JOLnRvU3RyaW5nKCksXG4gICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiBtYXhQcmlvcml0eUZlZVBlckdhc0JOLnRvU3RyaW5nKCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZGlzYWJsZUtSU0VtYWlsKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuZGlzYWJsZUtSU0VtYWlsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGlzYWJsZUtSU0VtYWlsIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLmRpc2FibGVLUlNFbWFpbCA9IHBhcmFtcy5kaXNhYmxlS1JTRW1haWw7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy53YWxsZXRWZXJzaW9uKSkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy53YWxsZXRWZXJzaW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgd2FsbGV0VmVyc2lvbiBwcm92aWRlZCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLndhbGxldFZlcnNpb24gPSBwYXJhbXMud2FsbGV0VmVyc2lvbjtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgZWFjaCBrcnNTcGVjaWZpYyBwYXJhbSBpcyBlaXRoZXIgYSBzdHJpbmcsIGJvb2xlYW4sIG9yIG51bWJlclxuICAgIGNvbnN0IHsga3JzU3BlY2lmaWMgfSA9IHBhcmFtcztcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoa3JzU3BlY2lmaWMpKSB7XG4gICAgICBPYmplY3Qua2V5cyhrcnNTcGVjaWZpYykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbCA9IGtyc1NwZWNpZmljW2tleV07XG4gICAgICAgIGlmICghXy5pc0Jvb2xlYW4odmFsKSAmJiAhXy5pc1N0cmluZyh2YWwpICYmICFfLmlzTnVtYmVyKHZhbCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tyc1NwZWNpZmljIG9iamVjdCBjb250YWlucyBpbGxlZ2FsIHZhbHVlcy4gdmFsdWVzIG11c3QgYmUgc3RyaW5ncywgYm9vbGVhbnMsIG9yIG51bWJlcnMnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IGRlcml2YXRpb25QYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG5cbiAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdjdXN0b2RpYWwnICYmIChwYXJhbXMubXVsdGlzaWdUeXBlID8/ICdvbmNoYWluJykgPT09ICdvbmNoYWluJykge1xuICAgICAgLy8gZm9yIGN1c3RvZGlhbCBtdWx0aXNpZywgd2hlbiB0aGUgd2FsbGV0IGlzIGNyZWF0ZWQgb24gdGhlIHBsYXRmb3Igc2lkZSwgdGhlIGtleXMgYXJlIG5vdCBuZWVkZWRcbiAgICAgIHdhbGxldFBhcmFtcy5uID0gdW5kZWZpbmVkO1xuICAgICAgd2FsbGV0UGFyYW1zLm0gPSB1bmRlZmluZWQ7XG4gICAgICB3YWxsZXRQYXJhbXMua2V5cyA9IHVuZGVmaW5lZDtcbiAgICAgIHdhbGxldFBhcmFtcy5rZXlTaWduYXR1cmVzID0gdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQod2FsbGV0UGFyYW1zKS5yZXN1bHQoKTsgLy8gcmV0dXJucyB0aGUgaWRzXG5cbiAgICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHsgaWQ6IG5ld1dhbGxldC5rZXlzW0tleUluZGljZXMuVVNFUl0sIHJlcUlkIH0pO1xuICAgICAgY29uc3QgYmFja3VwS2V5Y2hhaW4gPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldCh7IGlkOiBuZXdXYWxsZXQua2V5c1tLZXlJbmRpY2VzLkJBQ0tVUF0sIHJlcUlkIH0pO1xuICAgICAgY29uc3QgYml0Z29LZXljaGFpbiA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHsgaWQ6IG5ld1dhbGxldC5rZXlzW0tleUluZGljZXMuQklUR09dLCByZXFJZCB9KTtcblxuICAgICAgY29uc3QgW3VzZXJLZXksIGJpdGdvS2V5LCBiYWNrdXBLZXldID0gYXdhaXQgUHJvbWlzZS5hbGwoW3VzZXJLZXljaGFpbiwgYml0Z29LZXljaGFpbiwgYmFja3VwS2V5Y2hhaW5dKTtcblxuICAgICAgY29uc3QgcmVzdWx0OiBXYWxsZXRXaXRoS2V5Y2hhaW5zID0ge1xuICAgICAgICB3YWxsZXQ6IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KSxcbiAgICAgICAgdXNlcktleWNoYWluOiB1c2VyS2V5LFxuICAgICAgICBiYWNrdXBLZXljaGFpbjogYml0Z29LZXksXG4gICAgICAgIGJpdGdvS2V5Y2hhaW46IGJhY2t1cEtleSxcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAnV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB1c2VyS2V5Y2hhaW5Qcm9taXNlID0gYXN5bmMgKCk6IFByb21pc2U8S2V5Y2hhaW4+ID0+IHtcbiAgICAgICAgbGV0IHVzZXJLZXljaGFpblBhcmFtcztcbiAgICAgICAgbGV0IHVzZXJLZXljaGFpbjtcbiAgICAgICAgLy8gVXNlciBwcm92aWRlZCB1c2VyIGtleVxuICAgICAgICBpZiAocGFyYW1zLnVzZXJLZXkpIHtcbiAgICAgICAgICB1c2VyS2V5Y2hhaW4gPSB7IHB1YjogcGFyYW1zLnVzZXJLZXkgfTtcbiAgICAgICAgICB1c2VyS2V5Y2hhaW5QYXJhbXMgPSB1c2VyS2V5Y2hhaW47XG4gICAgICAgICAgaWYgKHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQpIHtcbiAgICAgICAgICAgIC8vIHRoZSBkZXJpdmF0aW9uIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiBhIGtleSBhbHJlYWR5IGV4aXN0c1xuICAgICAgICAgICAgY29uc3QgZGVyaXZhdGlvbiA9IHRoaXMuYmFzZUNvaW4uZGVyaXZlS2V5V2l0aFNlZWQoe1xuICAgICAgICAgICAgICBrZXk6IHBhcmFtcy51c2VyS2V5LFxuICAgICAgICAgICAgICBzZWVkOiBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkZXJpdmF0aW9uUGF0aCA9IGRlcml2YXRpb24uZGVyaXZhdGlvblBhdGg7XG4gICAgICAgICAgICB1c2VyS2V5Y2hhaW4ucHViID0gZGVyaXZhdGlvbi5rZXk7XG4gICAgICAgICAgICB1c2VyS2V5Y2hhaW4uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCA9IHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghY2FuRW5jcnlwdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZ2VuZXJhdGUgdXNlciBrZXlwYWlyIHdpdGhvdXQgcGFzc3BocmFzZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBDcmVhdGUgdGhlIHVzZXIga2V5LlxuICAgICAgICAgIHVzZXJLZXljaGFpbiA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG4gICAgICAgICAgdXNlcktleWNoYWluLmVuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7IHBhc3N3b3JkOiBwYXNzcGhyYXNlLCBpbnB1dDogdXNlcktleWNoYWluLnBydiB9KTtcbiAgICAgICAgICB1c2VyS2V5Y2hhaW5QYXJhbXMgPSB7XG4gICAgICAgICAgICBwdWI6IHVzZXJLZXljaGFpbi5wdWIsXG4gICAgICAgICAgICBlbmNyeXB0ZWRQcnY6IHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnYsXG4gICAgICAgICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6IHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB1c2VyS2V5Y2hhaW5QYXJhbXMucmVxSWQgPSByZXFJZDtcbiAgICAgICAgY29uc3QgbmV3VXNlcktleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5hZGQodXNlcktleWNoYWluUGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIF8uZXh0ZW5kKHt9LCBuZXdVc2VyS2V5Y2hhaW4sIHVzZXJLZXljaGFpbik7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBiYWNrdXBLZXljaGFpblByb21pc2UgPSBhc3luYyAoKTogUHJvbWlzZTxLZXljaGFpbj4gPT4ge1xuICAgICAgICBpZiAocGFyYW1zLmJhY2t1cFhwdWJQcm92aWRlcikge1xuICAgICAgICAgIC8vIElmIHJlcXVlc3RlZCwgdXNlIGEgS1JTIG9yIGJhY2t1cCBrZXkgcHJvdmlkZXJcbiAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGVCYWNrdXAoe1xuICAgICAgICAgICAgcHJvdmlkZXI6IHBhcmFtcy5iYWNrdXBYcHViUHJvdmlkZXIgfHwgJ2RlZmF1bHRSTUdCYWNrdXBQcm92aWRlcicsXG4gICAgICAgICAgICBkaXNhYmxlS1JTRW1haWw6IHBhcmFtcy5kaXNhYmxlS1JTRW1haWwsXG4gICAgICAgICAgICBrcnNTcGVjaWZpYzogcGFyYW1zLmtyc1NwZWNpZmljLFxuICAgICAgICAgICAgdHlwZTogdGhpcy5iYXNlQ29pbi5nZXRDaGFpbigpLFxuICAgICAgICAgICAgcGFzc3BocmFzZTogcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZXIgcHJvdmlkZWQgYmFja3VwIHhwdWJcbiAgICAgICAgaWYgKHBhcmFtcy5iYWNrdXBYcHViKSB7XG4gICAgICAgICAgLy8gdXNlciBwcm92aWRlZCBiYWNrdXAgZXRoZXJldW0gYWRkcmVzc1xuICAgICAgICAgIHJldHVybiB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZCh7XG4gICAgICAgICAgICBwdWI6IHBhcmFtcy5iYWNrdXBYcHViLFxuICAgICAgICAgICAgc291cmNlOiAnYmFja3VwJyxcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghY2FuRW5jcnlwdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZ2VuZXJhdGUgYmFja3VwIGtleXBhaXIgd2l0aG91dCBwYXNzcGhyYXNlJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIE5vIHByb3ZpZGVkIGJhY2t1cCB4cHViIG9yIGFkZHJlc3MsIHNvIGRlZmF1bHQgdG8gY3JlYXRpbmcgb25lIGhlcmVcbiAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGVCYWNrdXAoeyByZXFJZCwgcGFzc3BocmFzZTogcGFyYW1zLnBhc3NwaHJhc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfTogS2V5Y2hhaW5zVHJpcGxldCA9IGF3YWl0IHByb21pc2VQcm9wcyh7XG4gICAgICAgIHVzZXJLZXljaGFpbjogdXNlcktleWNoYWluUHJvbWlzZSgpLFxuICAgICAgICBiYWNrdXBLZXljaGFpbjogYmFja3VwS2V5Y2hhaW5Qcm9taXNlKCksXG4gICAgICAgIGJpdGdvS2V5Y2hhaW46IHRoaXMuYmFzZUNvaW5cbiAgICAgICAgICAua2V5Y2hhaW5zKClcbiAgICAgICAgICAuY3JlYXRlQml0R28oeyBlbnRlcnByaXNlOiBwYXJhbXMuZW50ZXJwcmlzZSwgcmVxSWQsIGlzRGlzdHJpYnV0ZWRDdXN0b2R5OiBwYXJhbXMuaXNEaXN0cmlidXRlZEN1c3RvZHkgfSksXG4gICAgICB9KTtcblxuICAgICAgd2FsbGV0UGFyYW1zLmtleXMgPSBbdXNlcktleWNoYWluLmlkLCBiYWNrdXBLZXljaGFpbi5pZCwgYml0Z29LZXljaGFpbi5pZF07XG5cbiAgICAgIGNvbnN0IHsgcHJ2IH0gPSB1c2VyS2V5Y2hhaW47XG4gICAgICBpZiAoXy5pc1N0cmluZyhwcnYpKSB7XG4gICAgICAgIGFzc2VydChiYWNrdXBLZXljaGFpbi5wdWIpO1xuICAgICAgICBhc3NlcnQoYml0Z29LZXljaGFpbi5wdWIpO1xuICAgICAgICB3YWxsZXRQYXJhbXMua2V5U2lnbmF0dXJlcyA9IHtcbiAgICAgICAgICBiYWNrdXA6IChhd2FpdCB0aGlzLmJhc2VDb2luLnNpZ25NZXNzYWdlKHsgcHJ2IH0sIGJhY2t1cEtleWNoYWluLnB1YikpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBiaXRnbzogKGF3YWl0IHRoaXMuYmFzZUNvaW4uc2lnbk1lc3NhZ2UoeyBwcnYgfSwgYml0Z29LZXljaGFpbi5wdWIpKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleWNoYWlucyA9IHtcbiAgICAgICAgdXNlcktleWNoYWluLFxuICAgICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmFsV2FsbGV0UGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5zdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQod2FsbGV0UGFyYW1zLCBrZXljaGFpbnMpO1xuXG4gICAgICBpZiAoXy5pbmNsdWRlcyhbJ3hycCcsICd4bG0nLCAnY3NwciddLCB0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMucm9vdFByaXZhdGVLZXkpKSB7XG4gICAgICAgIHdhbGxldFBhcmFtcy5yb290UHJpdmF0ZUtleSA9IHBhcmFtcy5yb290UHJpdmF0ZUtleTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICAgIGNvbnN0IG5ld1dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9hZGQnKSkuc2VuZChmaW5hbFdhbGxldFBhcmFtcykucmVzdWx0KCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdDogV2FsbGV0V2l0aEtleWNoYWlucyA9IHtcbiAgICAgICAgd2FsbGV0OiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCksXG4gICAgICAgIHVzZXJLZXljaGFpbjogdXNlcktleWNoYWluLFxuICAgICAgICBiYWNrdXBLZXljaGFpbjogYmFja3VwS2V5Y2hhaW4sXG4gICAgICAgIGJpdGdvS2V5Y2hhaW46IGJpdGdvS2V5Y2hhaW4sXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ1dhbGxldFdpdGhLZXljaGFpbnMnLFxuICAgICAgfTtcblxuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKGJhY2t1cEtleWNoYWluLnBydikpIHtcbiAgICAgICAgcmVzdWx0Lndhcm5pbmcgPSAnQmUgc3VyZSB0byBiYWNrdXAgdGhlIGJhY2t1cCBrZXljaGFpbiAtLSBpdCBpcyBub3Qgc3RvcmVkIGFueXdoZXJlIGVsc2UhJztcbiAgICAgIH1cblxuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKGRlcml2YXRpb25QYXRoKSkge1xuICAgICAgICB1c2VyS2V5Y2hhaW4uZGVyaXZhdGlvblBhdGggPSBkZXJpdmF0aW9uUGF0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbkVuY3J5cHQgJiYgcGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUpIHtcbiAgICAgICAgcmVzdWx0LmVuY3J5cHRlZFdhbGxldFBhc3NwaHJhc2UgPSB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgIGlucHV0OiBwYXNzcGhyYXNlLFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIHVzZXIncyB3YWxsZXQgc2hhcmVzXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGxpc3RTaGFyZXMocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXRzaGFyZScpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB1c2VyJ3Mgd2FsbGV0IHNoYXJlcyB2MlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxXYWxsZXRTaGFyZXM+fVxuICAgKi9cbiAgYXN5bmMgbGlzdFNoYXJlc1YyKCk6IFByb21pc2U8V2FsbGV0U2hhcmVzPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMuYml0Z28udXJsKCcvd2FsbGV0c2hhcmVzJywgMikpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSB3YWxsZXQgc2hhcmUgaW5mb3JtYXRpb24sIGluY2x1ZGluZyB0aGUgZW5jcnlwdGVkIHNoYXJpbmcga2V5Y2hhaW4uIHJlcXVpcmVzIHVubG9jayBpZiBrZXljaGFpbiBpcyBwcmVzZW50LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0U2hhcmVJZCAtIHRoZSB3YWxsZXQgc2hhcmUgdG8gZ2V0IGluZm9ybWF0aW9uIG9uXG4gICAqL1xuICBhc3luYyBnZXRTaGFyZShwYXJhbXM6IHsgd2FsbGV0U2hhcmVJZD86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXRzaGFyZS8nICsgcGFyYW1zLndhbGxldFNoYXJlSWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYSB3YWxsZXQgc2hhcmVcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB0byB1cGRhdGVcbiAgICogQHBhcmFtIHBhcmFtcy5zdGF0ZSAtIHRoZSBuZXcgc3RhdGUgb2YgdGhlIHdhbGxldCBzaGFyZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyB1cGRhdGVTaGFyZShwYXJhbXM6IFVwZGF0ZVNoYXJlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldFNoYXJlSWQnXSwgW10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0c2hhcmUvJyArIHBhcmFtcy53YWxsZXRTaGFyZUlkKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWxrIGFjY2VwdCB3YWxsZXQgc2hhcmVzXG4gICAqIEBwYXJhbSBwYXJhbXMgQWNjZXB0U2hhcmVPcHRpb25zUmVxdWVzdFtdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFjY2VwdFNoYXJlUmVzcG9uc2VbXT59XG4gICAqL1xuICBhc3luYyBidWxrQWNjZXB0U2hhcmVSZXF1ZXN0KHBhcmFtczogQWNjZXB0U2hhcmVPcHRpb25zUmVxdWVzdFtdKTogUHJvbWlzZTxBY2NlcHRTaGFyZVJlc3BvbnNlW10+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnB1dCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldHNoYXJlcy9hY2NlcHQnLCAyKSlcbiAgICAgIC5zZW5kKHtcbiAgICAgICAga2V5c0ZvcldhbGxldFNoYXJlczogcGFyYW1zLFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNlbmQgYSB3YWxsZXQgc2hhcmUgaW52aXRhdGlvbiBlbWFpbFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0U2hhcmVJZCAtIHRoZSB3YWxsZXQgc2hhcmUgd2hvc2UgaW52aXRpYXRpb24gc2hvdWxkIGJlIHJlc2VudFxuICAgKi9cbiAgYXN5bmMgcmVzZW5kU2hhcmVJbnZpdGUocGFyYW1zOiB7IHdhbGxldFNoYXJlSWQ/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldFNoYXJlSWQnXSwgW10pO1xuXG4gICAgY29uc3QgdXJsUGFydHMgPSBwYXJhbXMud2FsbGV0U2hhcmVJZCArICcvcmVzZW5kZW1haWwnO1xuICAgIHJldHVybiB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXRzaGFyZS8nICsgdXJsUGFydHMpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgYSB3YWxsZXQgc2hhcmVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFNoYXJlSWQgLSB0aGUgd2FsbGV0IHNoYXJlIHRvIHVwZGF0ZVxuICAgKi9cbiAgYXN5bmMgY2FuY2VsU2hhcmUocGFyYW1zOiB7IHdhbGxldFNoYXJlSWQ/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldFNoYXJlSWQnXSwgW10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5kZWwodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXRzaGFyZS8nICsgcGFyYW1zLndhbGxldFNoYXJlSWQpKVxuICAgICAgLnNlbmQoKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlLXNoYXJlIHdhbGxldCB3aXRoIGV4aXN0aW5nIHNwZW5kZXJzIG9mIHRoZSB3YWxsZXRcbiAgICogQHBhcmFtIHdhbGxldElkXG4gICAqIEBwYXJhbSB1c2VyUGFzc3dvcmRcbiAgICovXG4gIGFzeW5jIHJlc2hhcmVXYWxsZXRXaXRoU3BlbmRlcnMod2FsbGV0SWQ6IHN0cmluZywgdXNlclBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCB0aGlzLmdldCh7IGlkOiB3YWxsZXRJZCB9KTtcbiAgICBpZiAoIXdhbGxldD8uX3dhbGxldD8uZW50ZXJwcmlzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbnRlcnByaXNlIG5vdCBmb3VuZCBmb3IgdGhlIHdhbGxldCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGVycHJpc2VVc2Vyc1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLmJpdGdvLnVybChgL2VudGVycHJpc2UvJHt3YWxsZXQ/Ll93YWxsZXQ/LmVudGVycHJpc2V9L3VzZXJgKSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgICAvLyBjcmVhdGUgYSBtYXAgb2YgdXNlcnMgZm9yIGVhc3kgbG9va3VwIC0gd2UgbmVlZCB0aGUgdXNlciBlbWFpbCBpZCB0byBzaGFyZSB0aGUgd2FsbGV0XG4gICAgY29uc3QgdXNlcnNNYXAgPSBuZXcgTWFwKFxuICAgICAgWy4uLmVudGVycHJpc2VVc2Vyc1Jlc3BvbnNlPy5hZG1pblVzZXJzLCAuLi5lbnRlcnByaXNlVXNlcnNSZXNwb25zZT8ubm9uQWRtaW5Vc2Vyc10ubWFwKChvYmopID0+IFtvYmouaWQsIG9ial0pXG4gICAgKTtcblxuICAgIGlmICh3YWxsZXQuX3dhbGxldC51c2Vycykge1xuICAgICAgZm9yIChjb25zdCB1c2VyIG9mIHdhbGxldC5fd2FsbGV0LnVzZXJzKSB7XG4gICAgICAgIGNvbnN0IHVzZXJPYmplY3QgPSB1c2Vyc01hcC5nZXQodXNlci51c2VyKTtcbiAgICAgICAgaWYgKHVzZXIucGVybWlzc2lvbnMuaW5jbHVkZXMoJ3NwZW5kJykgJiYgIXVzZXIucGVybWlzc2lvbnMuaW5jbHVkZXMoJ2FkbWluJykgJiYgdXNlck9iamVjdCkge1xuICAgICAgICAgIGNvbnN0IHNoYXJlUGFyYW1zID0ge1xuICAgICAgICAgICAgd2FsbGV0SWQ6IHdhbGxldElkLFxuICAgICAgICAgICAgdXNlcjogdXNlci51c2VyLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IHVzZXIucGVybWlzc2lvbnMuam9pbignLCcpLFxuICAgICAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogdXNlclBhc3N3b3JkLFxuICAgICAgICAgICAgZW1haWw6IHVzZXJPYmplY3QuZW1haWwuZW1haWwsXG4gICAgICAgICAgICByZXNoYXJlOiB0cnVlLFxuICAgICAgICAgICAgc2tpcEtleWNoYWluOiBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGF3YWl0IHdhbGxldC5zaGFyZVdhbGxldChzaGFyZVBhcmFtcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0cyBhIHdhbGxldCBzaGFyZSwgYWRkaW5nIHRoZSB3YWxsZXQgdG8gdGhlIHVzZXIncyBsaXN0XG4gICAqIE5lZWRzIGEgdXNlcidzIHBhc3N3b3JkIHRvIGRlY3J5cHQgdGhlIHNoYXJlZCBrZXlcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFNoYXJlSWQgLSB0aGUgd2FsbGV0IHNoYXJlIHRvIGFjY2VwdFxuICAgKiBAcGFyYW0gcGFyYW1zLnVzZXJQYXNzd29yZCAtIChyZXF1aXJlZCBpZiBtb3JlIGEga2V5Y2hhaW4gd2FzIHNoYXJlZCkgdXNlcidzIHBhc3N3b3JkIHRvIGRlY3J5cHQgdGhlIHNoYXJlZCB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlIC0gbmV3IHdhbGxldCBwYXNzcGhyYXNlIGZvciBzYXZpbmcgdGhlIHNoYXJlZCB3YWxsZXQgcHJ2LlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBsZWZ0IGJsYW5rIGFuZCBhIHdhbGxldCB3aXRoIG1vcmUgdGhhbiB2aWV3IHBlcm1pc3Npb25zIHdhcyBzaGFyZWQsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIHVzZXIncyBsb2dpbiBwYXNzd29yZCBpcyB1c2VkLlxuICAgKiBAcGFyYW0gcGFyYW1zLm92ZXJyaWRlRW5jcnlwdGVkUHJ2IC0gc2V0IG9ubHkgaWYgdGhlIHBydiB3YXMgcmVjZWl2ZWQgb3V0LW9mLWJhbmQuXG4gICAqL1xuICBhc3luYyBhY2NlcHRTaGFyZShwYXJhbXM6IEFjY2VwdFNoYXJlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldFNoYXJlSWQnXSwgWydvdmVycmlkZUVuY3J5cHRlZFBydicsICd1c2VyUGFzc3dvcmQnLCAnbmV3V2FsbGV0UGFzc3BocmFzZSddKTtcblxuICAgIGxldCBlbmNyeXB0ZWRQcnYgPSBwYXJhbXMub3ZlcnJpZGVFbmNyeXB0ZWRQcnY7XG4gICAgY29uc3Qgd2FsbGV0U2hhcmUgPSBhd2FpdCB0aGlzLmdldFNoYXJlKHsgd2FsbGV0U2hhcmVJZDogcGFyYW1zLndhbGxldFNoYXJlSWQgfSk7XG4gICAgaWYgKFxuICAgICAgd2FsbGV0U2hhcmUua2V5Y2hhaW5PdmVycmlkZVJlcXVpcmVkICYmXG4gICAgICB3YWxsZXRTaGFyZS5wZXJtaXNzaW9ucy5pbmRleE9mKCdhZG1pbicpICE9PSAtMSAmJlxuICAgICAgd2FsbGV0U2hhcmUucGVybWlzc2lvbnMuaW5kZXhPZignc3BlbmQnKSAhPT0gLTFcbiAgICApIHtcbiAgICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy51c2VyUGFzc3dvcmQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlclBhc3N3b3JkIHBhcmFtIG11c3QgYmUgcHJvdmlkZWQgdG8gZGVjcnlwdCBzaGFyZWQga2V5Jyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdhbGxldEtleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGVVc2VyS2V5Y2hhaW4ocGFyYW1zLnVzZXJQYXNzd29yZCk7XG4gICAgICBpZiAoXy5pc1VuZGVmaW5lZCh3YWxsZXRLZXljaGFpbi5lbmNyeXB0ZWRQcnYpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZW5jcnlwdGVkUHJ2IHdhcyBub3QgZm91bmQgb24gd2FsbGV0IGtleWNoYWluJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgIHRyYWRpbmdBY2NvdW50SWQ6IHdhbGxldFNoYXJlLndhbGxldCxcbiAgICAgICAgcHVia2V5OiB3YWxsZXRLZXljaGFpbi5wdWIsXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHBheWxvYWRTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcblxuICAgICAgY29uc3QgcHJpdmF0ZUtleSA9IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICAgIHBhc3N3b3JkOiBwYXJhbXMudXNlclBhc3N3b3JkLFxuICAgICAgICBpbnB1dDogd2FsbGV0S2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSBhd2FpdCB0aGlzLmJhc2VDb2luLnNpZ25NZXNzYWdlKHsgcHJ2OiBwcml2YXRlS2V5IH0sIHBheWxvYWRTdHJpbmcpO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMudXBkYXRlU2hhcmUoe1xuICAgICAgICB3YWxsZXRTaGFyZUlkOiBwYXJhbXMud2FsbGV0U2hhcmVJZCxcbiAgICAgICAgc3RhdGU6ICdhY2NlcHRlZCcsXG4gICAgICAgIGtleUlkOiB3YWxsZXRLZXljaGFpbi5pZCxcbiAgICAgICAgc2lnbmF0dXJlOiBzaWduYXR1cmUudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBwYXlsb2FkOiBwYXlsb2FkU3RyaW5nLFxuICAgICAgfSk7XG4gICAgICAvLyBJZiB0aGUgd2FsbGV0IHNoYXJlIHdhcyBhY2NlcHRlZCBzdWNjZXNzZnVsbHkgKGNoYW5nZWQ9dHJ1ZSksIHJlc2hhcmUgdGhlIHdhbGxldCB3aXRoIHRoZSBzcGVuZGVyc1xuICAgICAgaWYgKHJlc3BvbnNlLmNoYW5nZWQgJiYgcmVzcG9uc2Uuc3RhdGUgPT09ICdhY2NlcHRlZCcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlc2hhcmVXYWxsZXRXaXRoU3BlbmRlcnMod2FsbGV0U2hhcmUud2FsbGV0LCBwYXJhbXMudXNlclBhc3N3b3JkKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIFRPRE86IFBYLTM4MjZcbiAgICAgICAgICAvLyBEbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG4gICAgLy8gUmV0dXJuIHJpZ2h0IGF3YXkgaWYgdGhlcmUgaXMgbm8ga2V5Y2hhaW4gdG8gZGVjcnlwdCwgb3IgaWYgZXhwbGljaXQgZW5jcnlwdGVkUHJ2IHdhcyBwcm92aWRlZFxuICAgIGlmICghd2FsbGV0U2hhcmUua2V5Y2hhaW4gfHwgIXdhbGxldFNoYXJlLmtleWNoYWluLmVuY3J5cHRlZFBydiB8fCBlbmNyeXB0ZWRQcnYpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVNoYXJlKHtcbiAgICAgICAgd2FsbGV0U2hhcmVJZDogcGFyYW1zLndhbGxldFNoYXJlSWQsXG4gICAgICAgIHN0YXRlOiAnYWNjZXB0ZWQnLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTW9yZSB0aGFuIHZpZXdpbmcgd2FzIHJlcXVlc3RlZCwgc28gd2UgbmVlZCB0byBwcm9jZXNzIHRoZSB3YWxsZXQga2V5cyB1c2luZyB0aGUgc2hhcmVkIGVjZGggc2NoZW1lXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnVzZXJQYXNzd29yZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndXNlclBhc3N3b3JkIHBhcmFtIG11c3QgYmUgcHJvdmlkZWQgdG8gZGVjcnlwdCBzaGFyZWQga2V5Jyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hhcmluZ0tleWNoYWluID0gKGF3YWl0IHRoaXMuYml0Z28uZ2V0RUNESEtleWNoYWluKCkpIGFzIGFueTtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChzaGFyaW5nS2V5Y2hhaW4uZW5jcnlwdGVkWHBydikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZW5jcnlwdGVkWHBydiB3YXMgbm90IGZvdW5kIG9uIHNoYXJpbmcga2V5Y2hhaW4nKTtcbiAgICB9XG5cbiAgICAvLyBOb3cgd2UgaGF2ZSB0aGUgc2hhcmluZyBrZXljaGFpbiwgd2UgY2FuIHdvcmsgb3V0IHRoZSBzZWNyZXQgdXNlZCBmb3Igc2hhcmluZyB0aGUgd2FsbGV0IHdpdGggdXNcbiAgICBzaGFyaW5nS2V5Y2hhaW4ucHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIHBhc3N3b3JkOiBwYXJhbXMudXNlclBhc3N3b3JkLFxuICAgICAgaW5wdXQ6IHNoYXJpbmdLZXljaGFpbi5lbmNyeXB0ZWRYcHJ2LFxuICAgIH0pO1xuICAgIGNvbnN0IHNlY3JldCA9IGdldFNoYXJlZFNlY3JldChcbiAgICAgIC8vIERlcml2ZSBrZXkgYnkgcGF0aCAod2hpY2ggaXMgdXNlZCBiZXR3ZWVuIHRoZXNlIDIgdXNlcnMgb25seSlcbiAgICAgIGJpcDMyLmZyb21CYXNlNTgoc2hhcmluZ0tleWNoYWluLnBydikuZGVyaXZlUGF0aChzYW5pdGl6ZUxlZ2FjeVBhdGgod2FsbGV0U2hhcmUua2V5Y2hhaW4ucGF0aCkpLFxuICAgICAgQnVmZmVyLmZyb20od2FsbGV0U2hhcmUua2V5Y2hhaW4uZnJvbVB1YktleSwgJ2hleCcpXG4gICAgKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAvLyBZZXMhIFdlIGdvdCB0aGUgc2VjcmV0IHN1Y2Nlc3NmdWxseSBoZXJlLCBub3cgZGVjcnlwdCB0aGUgc2hhcmVkIHdhbGxldCBwcnZcbiAgICBjb25zdCBkZWNyeXB0ZWRTaGFyZWRXYWxsZXRQcnYgPSB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgcGFzc3dvcmQ6IHNlY3JldCxcbiAgICAgIGlucHV0OiB3YWxsZXRTaGFyZS5rZXljaGFpbi5lbmNyeXB0ZWRQcnYsXG4gICAgfSk7XG5cbiAgICAvLyBXZSB3aWxsIG5vdyByZS1lbmNyeXB0IHRoZSB3YWxsZXQgd2l0aCBvdXIgb3duIHBhc3N3b3JkXG4gICAgY29uc3QgbmV3V2FsbGV0UGFzc3BocmFzZSA9IHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlIHx8IHBhcmFtcy51c2VyUGFzc3dvcmQ7XG4gICAgZW5jcnlwdGVkUHJ2ID0gdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgIHBhc3N3b3JkOiBuZXdXYWxsZXRQYXNzcGhyYXNlLFxuICAgICAgaW5wdXQ6IGRlY3J5cHRlZFNoYXJlZFdhbGxldFBydixcbiAgICB9KTtcbiAgICBjb25zdCB1cGRhdGVQYXJhbXM6IFVwZGF0ZVNoYXJlT3B0aW9ucyA9IHtcbiAgICAgIHdhbGxldFNoYXJlSWQ6IHBhcmFtcy53YWxsZXRTaGFyZUlkLFxuICAgICAgc3RhdGU6ICdhY2NlcHRlZCcsXG4gICAgfTtcblxuICAgIGlmIChlbmNyeXB0ZWRQcnYpIHtcbiAgICAgIHVwZGF0ZVBhcmFtcy5lbmNyeXB0ZWRQcnYgPSBlbmNyeXB0ZWRQcnY7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnVwZGF0ZVNoYXJlKHVwZGF0ZVBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogQnVsayBBY2NlcHQgd2FsbGV0IHNoYXJlcywgYWRkaW5nIHRoZSB3YWxsZXRzIHRvIHRoZSB1c2VyJ3MgbGlzdFxuICAgKiBOZWVkcyBhIHVzZXIncyBwYXNzd29yZCB0byBkZWNyeXB0IHRoZSBzaGFyZWQga2V5XG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgQnVsa0FjY2VwdFNoYXJlT3B0aW9uc1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFNoYXJlSWQgLSBhcnJheSBvZiB0aGUgd2FsbGV0IHNoYXJlcyB0byBhY2NlcHRcbiAgICogQHBhcmFtIHBhcmFtcy51c2VyUGFzc3dvcmQgLSB1c2VyJ3MgcGFzc3dvcmQgdG8gZGVjcnlwdCB0aGUgc2hhcmVkIHdhbGxldCBrZXlcbiAgICogQHBhcmFtIHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlIC0gbmV3IHdhbGxldCBwYXNzcGhyYXNlIGZvciBzYXZpbmcgdGhlIHNoYXJlZCB3YWxsZXQgcHJ2LlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBsZWZ0IGJsYW5rIHRoZW4gdGhlIHVzZXIncyBsb2dpbiBwYXNzd29yZCBpcyB1c2VkLlxuICAgKlxuICAgKkByZXR1cm5zIHtQcm9taXNlPEFjY2VwdFNoYXJlUmVzcG9uc2VbXT59XG4gICAqL1xuICBhc3luYyBidWxrQWNjZXB0U2hhcmUocGFyYW1zOiBCdWxrQWNjZXB0U2hhcmVPcHRpb25zKTogUHJvbWlzZTxBY2NlcHRTaGFyZVJlc3BvbnNlW10+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXJMb2dpblBhc3N3b3JkJ10sIFsnbmV3V2FsbGV0UGFzc3BocmFzZSddKTtcbiAgICBhc3NlcnQocGFyYW1zLndhbGxldFNoYXJlSWRzLmxlbmd0aCA+IDAsICdubyB3YWxsZXRTaGFyZUlkcyBhcmUgcGFzc2VkJyk7XG5cbiAgICBjb25zdCBhbGxXYWxsZXRTaGFyZXMgPSBhd2FpdCB0aGlzLmxpc3RTaGFyZXNWMigpO1xuICAgIGNvbnN0IHdhbGxldFNoYXJlTWFwID0gYWxsV2FsbGV0U2hhcmVzLmluY29taW5nLnJlZHVjZShcbiAgICAgIChtYXA6IHsgW2tleTogc3RyaW5nXTogV2FsbGV0U2hhcmUgfSwgc2hhcmUpID0+ICh7IC4uLm1hcCwgW3NoYXJlLmlkXTogc2hhcmUgfSksXG4gICAgICB7fVxuICAgICk7XG5cbiAgICBjb25zdCB3YWxsZXRTaGFyZXMgPSBwYXJhbXMud2FsbGV0U2hhcmVJZHNcbiAgICAgIC5tYXAoKHdhbGxldFNoYXJlSWQpID0+IHdhbGxldFNoYXJlTWFwW3dhbGxldFNoYXJlSWRdKVxuICAgICAgLmZpbHRlcigod2FsbGV0U2hhcmUpID0+IHdhbGxldFNoYXJlICYmIHdhbGxldFNoYXJlLmtleWNoYWluKTtcbiAgICBpZiAoIXdhbGxldFNoYXJlcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB3YWxsZXQgc2hhcmVzIHByb3ZpZGVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHNoYXJpbmdLZXljaGFpbiA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0RUNESEtleWNoYWluKCk7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQoc2hhcmluZ0tleWNoYWluLmVuY3J5cHRlZFhwcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VuY3J5cHRlZFhwcnYgd2FzIG5vdCBmb3VuZCBvbiBzaGFyaW5nIGtleWNoYWluJyk7XG4gICAgfVxuXG4gICAgc2hhcmluZ0tleWNoYWluLnBydiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICBwYXNzd29yZDogcGFyYW1zLnVzZXJMb2dpblBhc3N3b3JkLFxuICAgICAgaW5wdXQ6IHNoYXJpbmdLZXljaGFpbi5lbmNyeXB0ZWRYcHJ2LFxuICAgIH0pO1xuICAgIGNvbnN0IG5ld1dhbGxldFBhc3NwaHJhc2UgPSBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSB8fCBwYXJhbXMudXNlckxvZ2luUGFzc3dvcmQ7XG4gICAgY29uc3Qga2V5c0ZvcldhbGxldFNoYXJlcyA9IHdhbGxldFNoYXJlcy5mbGF0TWFwKCh3YWxsZXRTaGFyZSkgPT4ge1xuICAgICAgaWYgKCF3YWxsZXRTaGFyZS5rZXljaGFpbikge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoXG4gICAgICAgIGJpcDMyLmZyb21CYXNlNTgoc2hhcmluZ0tleWNoYWluLnBydikuZGVyaXZlUGF0aChzYW5pdGl6ZUxlZ2FjeVBhdGgod2FsbGV0U2hhcmUua2V5Y2hhaW4ucGF0aCkpLFxuICAgICAgICBCdWZmZXIuZnJvbSh3YWxsZXRTaGFyZS5rZXljaGFpbi5mcm9tUHViS2V5LCAnaGV4JylcbiAgICAgICkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgICBjb25zdCBkZWNyeXB0ZWRTaGFyZWRXYWxsZXRQcnYgPSB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgICBwYXNzd29yZDogc2VjcmV0LFxuICAgICAgICBpbnB1dDogd2FsbGV0U2hhcmUua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBuZXdFbmNyeXB0ZWRQcnYgPSB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICBwYXNzd29yZDogbmV3V2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgaW5wdXQ6IGRlY3J5cHRlZFNoYXJlZFdhbGxldFBydixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHdhbGxldFNoYXJlSWQ6IHdhbGxldFNoYXJlLmlkLFxuICAgICAgICAgIGVuY3J5cHRlZFBydjogbmV3RW5jcnlwdGVkUHJ2LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmJ1bGtBY2NlcHRTaGFyZVJlcXVlc3Qoa2V5c0ZvcldhbGxldFNoYXJlcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgd2FsbGV0IGJ5IGl0cyBJRFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuaWQgd2FsbGV0IGlkXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0V2FsbGV0KHBhcmFtczogR2V0V2FsbGV0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdKTtcblxuICAgIGNvbnN0IHF1ZXJ5OiBHZXRXYWxsZXRPcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcy5hbGxUb2tlbnMpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmFsbFRva2VucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFsbFRva2VucyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmFsbFRva2VucyA9IHBhcmFtcy5hbGxUb2tlbnM7XG4gICAgfVxuXG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpKTtcblxuICAgIGNvbnN0IHdhbGxldCA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHBhcmFtcy5pZCkpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gICAgcmV0dXJuIG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgd2FsbGV0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB3YWxsZXQgYnkgaXRzIGFkZHJlc3NcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmFkZHJlc3Mgd2FsbGV0IGFkZHJlc3NcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBnZXRXYWxsZXRCeUFkZHJlc3MocGFyYW1zOiBHZXRXYWxsZXRCeUFkZHJlc3NPcHRpb25zID0ge30pOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbXSk7XG5cbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCkpO1xuXG4gICAgY29uc3Qgd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkcmVzcy8nICsgcGFyYW1zLmFkZHJlc3MpKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCB3YWxsZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBhbnkgZ2l2ZW4gc3VwcG9ydGVkIGNvaW4sIGdldCB0b3RhbCBiYWxhbmNlcyBmb3IgYWxsIHdhbGxldHMgb2YgdGhhdFxuICAgKiBjb2luIHR5cGUgb24gdGhlIGFjY291bnQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBnZXRUb3RhbEJhbGFuY2VzKHBhcmFtczogUmVjb3JkPHN0cmluZywgbmV2ZXI+ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9iYWxhbmNlcycpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBUU1Mgb3IgQkxTLURLRyBXYWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVNcGNXYWxsZXQoe1xuICAgIHBhc3NwaHJhc2UsXG4gICAgbGFiZWwsXG4gICAgbXVsdGlzaWdUeXBlLFxuICAgIGVudGVycHJpc2UsXG4gICAgd2FsbGV0VmVyc2lvbixcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgYmFja3VwUHJvdmlkZXIsXG4gIH06IEdlbmVyYXRlTXBjV2FsbGV0T3B0aW9ucyk6IFByb21pc2U8V2FsbGV0V2l0aEtleWNoYWlucz4ge1xuICAgIGlmIChtdWx0aXNpZ1R5cGUgPT09ICd0c3MnICYmIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlY2RzYScpIHtcbiAgICAgIGNvbnN0IHRzc1NldHRpbmdzOiBUc3NTZXR0aW5ncyA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgICAgLmdldCh0aGlzLmJpdGdvLm1pY3Jvc2VydmljZXNVcmwoJy9hcGkvdjIvdHNzL3NldHRpbmdzJykpXG4gICAgICAgIC5yZXN1bHQoKTtcbiAgICAgIGNvbnN0IG11bHRpc2lnVHlwZVZlcnNpb24gPVxuICAgICAgICB0c3NTZXR0aW5ncy5jb2luU2V0dGluZ3NbdGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKV0/LndhbGxldENyZWF0aW9uU2V0dGluZ3M/Lm11bHRpU2lnVHlwZVZlcnNpb247XG4gICAgICB3YWxsZXRWZXJzaW9uID0gdGhpcy5kZXRlcm1pbmVFY2RzYU1wY1dhbGxldFZlcnNpb24od2FsbGV0VmVyc2lvbiwgbXVsdGlzaWdUeXBlVmVyc2lvbik7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICAvLyBDcmVhdGUgTVBDIEtleWNoYWluc1xuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlTXBjKHtcbiAgICAgIG11bHRpc2lnVHlwZSxcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBlbnRlcnByaXNlLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgYmFja3VwUHJvdmlkZXIsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgV2FsbGV0XG4gICAgY29uc3QgeyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluIH0gPSBrZXljaGFpbnM7XG4gICAgY29uc3Qgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge1xuICAgICAgbGFiZWwsXG4gICAgICBtOiAyLFxuICAgICAgbjogMyxcbiAgICAgIGtleXM6IFt1c2VyS2V5Y2hhaW4uaWQsIGJhY2t1cEtleWNoYWluLmlkLCBiaXRnb0tleWNoYWluLmlkXSxcbiAgICAgIHR5cGU6ICdob3QnLFxuICAgICAgbXVsdGlzaWdUeXBlLFxuICAgICAgZW50ZXJwcmlzZSxcbiAgICAgIHdhbGxldFZlcnNpb24sXG4gICAgfTtcbiAgICBjb25zdCBmaW5hbFdhbGxldFBhcmFtcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uc3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0KHdhbGxldFBhcmFtcywga2V5Y2hhaW5zKTtcbiAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQoZmluYWxXYWxsZXRQYXJhbXMpLnJlc3VsdCgpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBXYWxsZXRXaXRoS2V5Y2hhaW5zID0ge1xuICAgICAgd2FsbGV0OiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCksXG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICByZXNwb25zZVR5cGU6ICdXYWxsZXRXaXRoS2V5Y2hhaW5zJyxcbiAgICB9O1xuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGJhY2t1cEtleWNoYWluLnBydikgJiYgIV8uaXNVbmRlZmluZWQoYmFja3VwUHJvdmlkZXIpKSB7XG4gICAgICByZXN1bHQud2FybmluZyA9ICdCZSBzdXJlIHRvIGJhY2t1cCB0aGUgYmFja3VwIGtleWNoYWluIC0tIGl0IGlzIG5vdCBzdG9yZWQgYW55d2hlcmUgZWxzZSEnO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgU2VsZi1NYW5hZ2VkIENvbGQgVFNTIFdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVNNQ01wY1dhbGxldCh7XG4gICAgbGFiZWwsXG4gICAgbXVsdGlzaWdUeXBlLFxuICAgIGVudGVycHJpc2UsXG4gICAgd2FsbGV0VmVyc2lvbixcbiAgICBiaXRnb0tleUlkLFxuICAgIGNvbW1vbktleWNoYWluLFxuICAgIGNvbGREZXJpdmF0aW9uU2VlZCxcbiAgfTogR2VuZXJhdGVTTUNNcGNXYWxsZXRPcHRpb25zKTogUHJvbWlzZTxXYWxsZXRXaXRoS2V5Y2hhaW5zPiB7XG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBsZXQgbXVsdGlzaWdUeXBlVmVyc2lvbjogJ01QQ3YyJyB8IHVuZGVmaW5lZDtcbiAgICBpZiAobXVsdGlzaWdUeXBlID09PSAndHNzJyAmJiB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWNkc2EnKSB7XG4gICAgICBjb25zdCB0c3NTZXR0aW5nczogVHNzU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5nZXQodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL3YyL3Rzcy9zZXR0aW5ncycpKVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgICBtdWx0aXNpZ1R5cGVWZXJzaW9uID1cbiAgICAgICAgdHNzU2V0dGluZ3MuY29pblNldHRpbmdzW3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCldPy53YWxsZXRDcmVhdGlvblNldHRpbmdzPy5jb2xkTXVsdGlTaWdUeXBlVmVyc2lvbjtcbiAgICAgIHdhbGxldFZlcnNpb24gPSB0aGlzLmRldGVybWluZUVjZHNhTXBjV2FsbGV0VmVyc2lvbih3YWxsZXRWZXJzaW9uLCBtdWx0aXNpZ1R5cGVWZXJzaW9uKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgTVBDIEtleWNoYWluc1xuICAgIGNvbnN0IGJpdGdvS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldCh7IGlkOiBiaXRnb0tleUlkIH0pO1xuXG4gICAgaWYgKCFiaXRnb0tleWNoYWluIHx8ICFiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JpdEdvIGtleWNoYWluIG5vdCBmb3VuZCcpO1xuICAgIH1cblxuICAgIGlmIChiaXRnb0tleWNoYWluLnNvdXJjZSAhPT0gJ2JpdGdvJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcHJvdmlkZWQgYml0Z29LZXlJZCBpcyBub3QgYSBCaXRHbyBrZXljaGFpbicpO1xuICAgIH1cblxuICAgIGlmIChiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluICE9PSBjb21tb25LZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcHJvdmlkZWQgQ29tbW9uIGtleWNoYWluIG1pc21hdGNoIHdpdGggdGhlIHByb3ZpZGVkIEJpdGdvIGtleScpO1xuICAgIH1cblxuICAgIGlmICghY29sZERlcml2YXRpb25TZWVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyS2V5Y2hhaW5QYXJhbXM6IEFkZEtleWNoYWluT3B0aW9ucyA9IHtcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAga2V5VHlwZTogJ3RzcycsXG4gICAgICBjb21tb25LZXljaGFpbjogY29tbW9uS2V5Y2hhaW4sXG4gICAgICBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkOiBjb2xkRGVyaXZhdGlvblNlZWQsXG4gICAgICBpc01QQ3YyOiBtdWx0aXNpZ1R5cGVWZXJzaW9uID09PSAnTVBDdjInID8gdHJ1ZSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuYWRkKHVzZXJLZXljaGFpblBhcmFtcyk7XG5cbiAgICBjb25zdCBiYWNrdXBLZXlDaGFpblBhcmFtczogQWRkS2V5Y2hhaW5PcHRpb25zID0ge1xuICAgICAgc291cmNlOiAnYmFja3VwJyxcbiAgICAgIGtleVR5cGU6ICd0c3MnLFxuICAgICAgY29tbW9uS2V5Y2hhaW46IGNvbW1vbktleWNoYWluLFxuICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDogY29sZERlcml2YXRpb25TZWVkLFxuICAgICAgaXNNUEN2MjogbXVsdGlzaWdUeXBlVmVyc2lvbiA9PT0gJ01QQ3YyJyA/IHRydWUgOiB1bmRlZmluZWQsXG4gICAgfTtcblxuICAgIGNvbnN0IGJhY2t1cEtleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5hZGQoYmFja3VwS2V5Q2hhaW5QYXJhbXMpO1xuXG4gICAgLy8gQ3JlYXRlIFdhbGxldFxuICAgIGNvbnN0IGtleWNoYWlucyA9IHsgdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbiB9O1xuICAgIGNvbnN0IHdhbGxldFBhcmFtczogU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyA9IHtcbiAgICAgIGxhYmVsLFxuICAgICAgbTogMixcbiAgICAgIG46IDMsXG4gICAgICBrZXlzOiBbdXNlcktleWNoYWluLmlkLCBiYWNrdXBLZXljaGFpbi5pZCwgYml0Z29LZXljaGFpbi5pZF0sXG4gICAgICB0eXBlOiAnY29sZCcsXG4gICAgICBtdWx0aXNpZ1R5cGUsXG4gICAgICBlbnRlcnByaXNlLFxuICAgICAgd2FsbGV0VmVyc2lvbixcbiAgICB9O1xuXG4gICAgY29uc3QgZmluYWxXYWxsZXRQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLnN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldCh3YWxsZXRQYXJhbXMsIGtleWNoYWlucyk7XG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKGZpbmFsV2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcblxuICAgIGNvbnN0IHJlc3VsdDogV2FsbGV0V2l0aEtleWNoYWlucyA9IHtcbiAgICAgIHdhbGxldDogbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBuZXdXYWxsZXQpLFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcmVzcG9uc2VUeXBlOiAnV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgfTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgQ3VzdG9kaWFsIFRTUyBXYWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVDdXN0b2RpYWxNcGNXYWxsZXQoe1xuICAgIGxhYmVsLFxuICAgIG11bHRpc2lnVHlwZSxcbiAgICBlbnRlcnByaXNlLFxuICAgIHdhbGxldFZlcnNpb24sXG4gIH06IEdlbmVyYXRlQmFzZU1wY1dhbGxldE9wdGlvbnMpOiBQcm9taXNlPFdhbGxldFdpdGhLZXljaGFpbnM+IHtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcblxuICAgIGlmIChtdWx0aXNpZ1R5cGUgPT09ICd0c3MnICYmIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlY2RzYScpIHtcbiAgICAgIGNvbnN0IHRzc1NldHRpbmdzOiBUc3NTZXR0aW5ncyA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgICAgLmdldCh0aGlzLmJpdGdvLm1pY3Jvc2VydmljZXNVcmwoJy9hcGkvdjIvdHNzL3NldHRpbmdzJykpXG4gICAgICAgIC5yZXN1bHQoKTtcbiAgICAgIGNvbnN0IG11bHRpc2lnVHlwZVZlcnNpb24gPVxuICAgICAgICB0c3NTZXR0aW5ncy5jb2luU2V0dGluZ3NbdGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKV0/LndhbGxldENyZWF0aW9uU2V0dGluZ3M/LmN1c3RvZGlhbE11bHRpU2lnVHlwZVZlcnNpb247XG4gICAgICB3YWxsZXRWZXJzaW9uID0gdGhpcy5kZXRlcm1pbmVFY2RzYU1wY1dhbGxldFZlcnNpb24od2FsbGV0VmVyc2lvbiwgbXVsdGlzaWdUeXBlVmVyc2lvbik7XG4gICAgfVxuXG4gICAgY29uc3QgZmluYWxXYWxsZXRQYXJhbXMgPSB7XG4gICAgICBsYWJlbCxcbiAgICAgIG11bHRpc2lnVHlwZSxcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICB3YWxsZXRWZXJzaW9uLFxuICAgICAgdHlwZTogJ2N1c3RvZGlhbCcsXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBXYWxsZXRcbiAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQoZmluYWxXYWxsZXRQYXJhbXMpLnJlc3VsdCgpO1xuICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KTtcbiAgICBjb25zdCBrZXljaGFpbnMgPSB3YWxsZXQua2V5SWRzKCk7XG4gICAgY29uc3QgcmVzdWx0OiBXYWxsZXRXaXRoS2V5Y2hhaW5zID0ge1xuICAgICAgd2FsbGV0LFxuICAgICAgdXNlcktleWNoYWluOiB7IGlkOiBrZXljaGFpbnNbMF0sIHR5cGU6IG11bHRpc2lnVHlwZSwgc291cmNlOiAndXNlcicgfSxcbiAgICAgIGJhY2t1cEtleWNoYWluOiB7IGlkOiBrZXljaGFpbnNbMV0sIHR5cGU6IG11bHRpc2lnVHlwZSwgc291cmNlOiAnYmFja3VwJyB9LFxuICAgICAgYml0Z29LZXljaGFpbjogeyBpZDoga2V5Y2hhaW5zWzJdLCB0eXBlOiBtdWx0aXNpZ1R5cGUsIHNvdXJjZTogJ2JpdGdvJyB9LFxuICAgICAgcmVzcG9uc2VUeXBlOiAnV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgfTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGRldGVybWluZUVjZHNhTXBjV2FsbGV0VmVyc2lvbih3YWxsZXRWZXJzaW9uPzogbnVtYmVyLCBtdWx0aXNpZ1R5cGVWZXJzaW9uPzogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5pc0VWTSgpICYmIG11bHRpc2lnVHlwZVZlcnNpb24gPT09ICdNUEN2MicpIHtcbiAgICAgIGlmICghd2FsbGV0VmVyc2lvbiB8fCAod2FsbGV0VmVyc2lvbiAhPT0gNSAmJiB3YWxsZXRWZXJzaW9uICE9PSA2KSkge1xuICAgICAgICByZXR1cm4gNTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHdhbGxldFZlcnNpb247XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import 'should';
2
+ //# sourceMappingURL=txRequest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"txRequest.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/utils/txRequest.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}