@bitgo/sdk-core 37.5.0 → 37.6.0

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 (75) hide show
  1. package/dist/src/api/types.d.ts +1 -0
  2. package/dist/src/api/types.d.ts.map +1 -1
  3. package/dist/src/api/types.js +1 -1
  4. package/dist/src/bitgo/defi/defiVault.d.ts +79 -0
  5. package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -0
  6. package/dist/src/bitgo/defi/defiVault.js +198 -0
  7. package/dist/src/bitgo/defi/iDefiVault.d.ts +59 -0
  8. package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -0
  9. package/dist/src/bitgo/defi/iDefiVault.js +6 -0
  10. package/dist/src/bitgo/defi/index.d.ts +3 -0
  11. package/dist/src/bitgo/defi/index.d.ts.map +1 -0
  12. package/dist/src/bitgo/defi/index.js +22 -0
  13. package/dist/src/bitgo/index.d.ts +1 -0
  14. package/dist/src/bitgo/index.d.ts.map +1 -1
  15. package/dist/src/bitgo/index.js +2 -1
  16. package/dist/src/bitgo/internal/keycard.d.ts +2 -1
  17. package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
  18. package/dist/src/bitgo/internal/keycard.js +6 -3
  19. package/dist/src/bitgo/keychain/iKeychains.d.ts +2 -1
  20. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  21. package/dist/src/bitgo/keychain/iKeychains.js +1 -1
  22. package/dist/src/bitgo/keychain/keychains.d.ts +2 -1
  23. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  24. package/dist/src/bitgo/keychain/keychains.js +8 -3
  25. package/dist/src/bitgo/tss/common.d.ts +2 -1
  26. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  27. package/dist/src/bitgo/tss/common.js +14 -4
  28. package/dist/src/bitgo/utils/messageTypes.d.ts +3 -1
  29. package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -1
  30. package/dist/src/bitgo/utils/messageTypes.js +3 -1
  31. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  32. package/dist/src/bitgo/utils/mpcUtils.js +16 -1
  33. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +25 -3
  34. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  35. package/dist/src/bitgo/utils/tss/baseTypes.js +1 -1
  36. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +3 -0
  37. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  38. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +8 -1
  39. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +1 -1
  40. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
  41. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +14 -8
  42. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +2 -2
  43. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  44. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +13 -5
  45. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +3 -1
  46. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
  47. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +18 -23
  48. package/dist/src/bitgo/wallet/iWallet.d.ts +6 -1
  49. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  50. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  51. package/dist/src/bitgo/wallet/iWallets.d.ts +3 -0
  52. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  53. package/dist/src/bitgo/wallet/iWallets.js +1 -1
  54. package/dist/src/bitgo/wallet/wallet.d.ts +9 -3
  55. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  56. package/dist/src/bitgo/wallet/wallet.js +34 -7
  57. package/dist/src/bitgo/wallet/wallets.d.ts +2 -1
  58. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  59. package/dist/src/bitgo/wallet/wallets.js +19 -9
  60. package/dist/src/coins/ofc.d.ts +4 -0
  61. package/dist/src/coins/ofc.d.ts.map +1 -1
  62. package/dist/src/coins/ofc.js +17 -2
  63. package/dist/test/unit/bitgo/defi/defiVault.d.ts +2 -0
  64. package/dist/test/unit/bitgo/defi/defiVault.d.ts.map +1 -0
  65. package/dist/test/unit/bitgo/defi/defiVault.js +292 -0
  66. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts +2 -0
  67. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts.map +1 -0
  68. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.js +94 -0
  69. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +50 -1
  70. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +29 -3
  71. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts +2 -0
  72. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts.map +1 -0
  73. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +228 -0
  74. package/dist/tsconfig.tsbuildinfo +1 -1
  75. package/package.json +3 -3
@@ -22,6 +22,10 @@ export declare class Ofc extends BaseCoin {
22
22
  /**
23
23
  * Return boolean indicating whether input is valid public key for the coin.
24
24
  *
25
+ * OFC wallets hold keys in two formats: the user key is a BIP-32 base58 xpub,
26
+ * and the BitGo key (source: 'bitgo') is a base64-encoded SPKI (DER-wrapped)
27
+ * secp256k1 public key. Both are valid.
28
+ *
25
29
  * @param {String} pub the pub to be checked
26
30
  * @returns {Boolean} is it valid?
27
31
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ofc.d.ts","sourceRoot":"","sources":["../../../src/coins/ofc.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,uBAAuB,EACvB,QAAQ,EACR,SAAS,EACT,OAAO,EAEP,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,wBAAwB,EACxB,MAAM,EACP,MAAM,KAAK,CAAC;AAEb,qBAAa,GAAI,SAAQ,QAAQ;gBACnB,KAAK,EAAE,SAAS;IAI5B,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,QAAQ;IAIjD,QAAQ;IAIR;;;;;OAKG;IACH,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAevC,SAAS;IAIT,WAAW;IAIX;;OAEG;IACH,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAInD;;;;;OAKG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAQhC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIxC,aAAa,IAAI,MAAM,GAAG,MAAM;IAI1B,gBAAgB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI7E,eAAe,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAI/D,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrE,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIjF;;;;OAIG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACnE;;;;OAIG;IACG,WAAW,CAAC,GAAG,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASzE,kBAAkB;IAClB,iBAAiB,CAAC,MAAM,EAAE,uBAAuB;CAGlD"}
1
+ {"version":3,"file":"ofc.d.ts","sourceRoot":"","sources":["../../../src/coins/ofc.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,uBAAuB,EACvB,QAAQ,EACR,SAAS,EACT,OAAO,EAEP,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,wBAAwB,EACxB,MAAM,EACP,MAAM,KAAK,CAAC;AAEb,qBAAa,GAAI,SAAQ,QAAQ;gBACnB,KAAK,EAAE,SAAS;IAI5B,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,QAAQ;IAIjD,QAAQ;IAIR;;;;;OAKG;IACH,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAevC,SAAS;IAIT,WAAW;IAIX;;OAEG;IACH,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAInD;;;;;;;;;OASG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAkBhC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIxC,aAAa,IAAI,MAAM,GAAG,MAAM;IAI1B,gBAAgB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI7E,eAAe,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAI/D,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrE,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIjF;;;;OAIG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACnE;;;;OAIG;IACG,WAAW,CAAC,GAAG,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASzE,kBAAkB;IAClB,iBAAiB,CAAC,MAAM,EAAE,uBAAuB;CAGlD"}
@@ -52,12 +52,27 @@ class Ofc extends __1.BaseCoin {
52
52
  /**
53
53
  * Return boolean indicating whether input is valid public key for the coin.
54
54
  *
55
+ * OFC wallets hold keys in two formats: the user key is a BIP-32 base58 xpub,
56
+ * and the BitGo key (source: 'bitgo') is a base64-encoded SPKI (DER-wrapped)
57
+ * secp256k1 public key. Both are valid.
58
+ *
55
59
  * @param {String} pub the pub to be checked
56
60
  * @returns {Boolean} is it valid?
57
61
  */
58
62
  isValidPub(pub) {
63
+ // BIP-32 base58 xpub (user key)
64
+ try {
65
+ if (utxo_lib_1.bip32.fromBase58(pub).isNeutered()) {
66
+ return true;
67
+ }
68
+ }
69
+ catch (e) {
70
+ // not a BIP-32 key; fall through to the SPKI check
71
+ }
72
+ // base64-encoded SPKI DER secp256k1 public key (BitGo key)
59
73
  try {
60
- return utxo_lib_1.bip32.fromBase58(pub).isNeutered();
74
+ const key = (0, crypto_1.createPublicKey)({ key: Buffer.from(pub, 'base64'), format: 'der', type: 'spki' });
75
+ return key.asymmetricKeyType === 'ec' && key.asymmetricKeyDetails?.namedCurve === 'secp256k1';
61
76
  }
62
77
  catch (e) {
63
78
  return false;
@@ -94,4 +109,4 @@ class Ofc extends __1.BaseCoin {
94
109
  }
95
110
  }
96
111
  exports.Ofc = Ofc;
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvaW5zL29mYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7R0FFRztBQUNILG1DQUFxQztBQUNyQyw4Q0FBd0M7QUFDeEMsMkJBYWE7QUFFYixNQUFhLEdBQUksU0FBUSxZQUFRO0lBQy9CLFlBQVksS0FBZ0I7UUFDMUIsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0I7UUFDcEMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZUFBZSxDQUFDLElBQWE7UUFDM0IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsMEVBQTBFO1lBQzFFLDBFQUEwRTtZQUMxRSxrRUFBa0U7WUFDbEUsSUFBSSxHQUFHLElBQUEsb0JBQVcsRUFBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLGdCQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQyxPQUFPO1lBQ0wsR0FBRyxFQUFFLElBQUk7WUFDVCxHQUFHLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRTtTQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUE0QjtRQUNqRCxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxVQUFVLENBQUMsR0FBVztRQUNwQixJQUFJLENBQUM7WUFDSCxPQUFPLGdCQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzVDLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELGNBQWMsQ0FBQyxPQUFlO1FBQzVCLE1BQU0sSUFBSSw2QkFBeUIsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQStCO1FBQ3BELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBNEI7UUFDaEQsTUFBTSxJQUFJLDZCQUF5QixFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFnQztRQUN0RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQThCO1FBQ2xELE1BQU0sSUFBSSw2QkFBeUIsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFjRCxLQUFLLENBQUMsV0FBVyxDQUFDLFdBQXFDLEVBQUUsT0FBZTtRQUN0RSxJQUFJLENBQUMsQ0FBQyxXQUFXLFlBQVksVUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNyQyxPQUFPLEtBQUssQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDbEcsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsaUJBQWlCLENBQUMsTUFBK0I7UUFDL0MsTUFBTSxJQUFJLDZCQUF5QixFQUFFLENBQUM7SUFDeEMsQ0FBQztDQUNGO0FBL0dELGtCQStHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7XG4gIEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zLFxuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBLZXlQYWlyLFxuICBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxuICBXYWxsZXQsXG59IGZyb20gJy4uLyc7XG5cbmV4cG9ydCBjbGFzcyBPZmMgZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UpIHtcbiAgICBzdXBlcihiaXRnbyk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlSW5zdGFuY2UoYml0Z286IEJpdEdvQmFzZSk6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gbmV3IE9mYyhiaXRnbyk7XG4gIH1cblxuICBnZXRDaGFpbigpIHtcbiAgICByZXR1cm4gJ29mYyc7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgc2VjcDI1NmsxIGtleSBwYWlyXG4gICAqXG4gICAqIEBwYXJhbSBzZWVkXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IG9iamVjdCB3aXRoIGdlbmVyYXRlZCBwdWIgYW5kIHBydlxuICAgKi9cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICBpZiAoIXNlZWQpIHtcbiAgICAgIC8vIEFuIGV4dGVuZGVkIHByaXZhdGUga2V5IGhhcyBib3RoIGEgbm9ybWFsIDI1NiBiaXQgcHJpdmF0ZSBrZXkgYW5kIGEgMjU2XG4gICAgICAvLyBiaXQgY2hhaW4gY29kZSwgYm90aCBvZiB3aGljaCBtdXN0IGJlIHJhbmRvbS4gNTEyIGJpdHMgaXMgdGhlcmVmb3JlIHRoZVxuICAgICAgLy8gbWF4aW11bSBlbnRyb3B5IGFuZCBnaXZlcyB1cyBtYXhpbXVtIHNlY3VyaXR5IGFnYWluc3QgY3JhY2tpbmcuXG4gICAgICBzZWVkID0gcmFuZG9tQnl0ZXMoNTEyIC8gOCk7XG4gICAgfVxuICAgIGNvbnN0IGV4dGVuZGVkS2V5ID0gYmlwMzIuZnJvbVNlZWQoc2VlZCk7XG4gICAgY29uc3QgeHB1YiA9IGV4dGVuZGVkS2V5Lm5ldXRlcmVkKCkudG9CYXNlNTgoKTtcbiAgICByZXR1cm4ge1xuICAgICAgcHViOiB4cHViLFxuICAgICAgcHJ2OiBleHRlbmRlZEtleS50b0Jhc2U1OCgpLFxuICAgIH07XG4gIH1cblxuICBnZXRGYW1pbHkoKSB7XG4gICAgcmV0dXJuICdvZmMnO1xuICB9XG5cbiAgZ2V0RnVsbE5hbWUoKSB7XG4gICAgcmV0dXJuICdPZmZjaGFpbic7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG0gb2YgbiB3YWxsZXQgc2lnbmVycy8ga2V5IGFtb3VudHMgYXJlIHZhbGlkIGZvciB0aGUgY29pblxuICAgKi9cbiAgaXNWYWxpZE1vZk5TZXR1cCh7IG0sIG4gfTogeyBtOiBudW1iZXI7IG46IG51bWJlciB9KSB7XG4gICAgcmV0dXJuIG0gPT09IDEgJiYgbiA9PT0gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgaW5wdXQgaXMgdmFsaWQgcHVibGljIGtleSBmb3IgdGhlIGNvaW4uXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwdWIgdGhlIHB1YiB0byBiZSBjaGVja2VkXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBpcyBpdCB2YWxpZD9cbiAgICovXG4gIGlzVmFsaWRQdWIocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGJpcDMyLmZyb21CYXNlNTgocHViKS5pc05ldXRlcmVkKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBnZXRCYXNlRmFjdG9yKCk6IG51bWJlciB8IHN0cmluZyB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBhc3luYyBwYXJzZVRyYW5zYWN0aW9uKHBhcmFtczogUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgYXN5bmMgaXNXYWxsZXRBZGRyZXNzKHBhcmFtczogVmVyaWZ5QWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIHNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIG1lc3NhZ2UgdXNpbmcgYSB0cmFkaW5nIHdhbGxldCdzIEJpdEdvIEtleVxuICAgKiBAcGFyYW0gd2FsbGV0IC0gdXNlcyB0aGUgQml0R28ga2V5IG9mIHRoaXMgdHJhZGluZyB3YWxsZXQgdG8gc2lnbiB0aGUgbWVzc2FnZSByZW1vdGVseSBpbiBhIEtNU1xuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgc2lnbk1lc3NhZ2Uod2FsbGV0OiBXYWxsZXQsIG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPjtcbiAgLyoqXG4gICAqIFNpZ25zIGEgbWVzc2FnZSB1c2luZyB0aGUgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIGtleSAtIHVzZXMgdGhlIHByaXZhdGUga2V5IHRvIHNpZ24gdGhlIG1lc3NhZ2VcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIHNpZ25NZXNzYWdlKGtleTogeyBwcnY6IHN0cmluZyB9LCBtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj47XG4gIGFzeW5jIHNpZ25NZXNzYWdlKGtleU9yV2FsbGV0OiB7IHBydjogc3RyaW5nIH0gfCBXYWxsZXQsIG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgaWYgKCEoa2V5T3JXYWxsZXQgaW5zdGFuY2VvZiBXYWxsZXQpKSB7XG4gICAgICByZXR1cm4gc3VwZXIuc2lnbk1lc3NhZ2Uoa2V5T3JXYWxsZXQsIG1lc3NhZ2UpO1xuICAgIH1cbiAgICBjb25zdCBzaWduYXR1cmVIZXhTdHJpbmcgPSBhd2FpdCBrZXlPcldhbGxldC50b1RyYWRpbmdBY2NvdW50KCkuc2lnblBheWxvYWQoeyBwYXlsb2FkOiBtZXNzYWdlIH0pO1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShzaWduYXR1cmVIZXhTdHJpbmcsICdoZXgnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhdWRpdERlY3J5cHRlZEtleShwYXJhbXM6IEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zKSB7XG4gICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxufVxuIl19
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvaW5zL29mYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7R0FFRztBQUNILG1DQUFzRDtBQUN0RCw4Q0FBd0M7QUFDeEMsMkJBYWE7QUFFYixNQUFhLEdBQUksU0FBUSxZQUFRO0lBQy9CLFlBQVksS0FBZ0I7UUFDMUIsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0I7UUFDcEMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZUFBZSxDQUFDLElBQWE7UUFDM0IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsMEVBQTBFO1lBQzFFLDBFQUEwRTtZQUMxRSxrRUFBa0U7WUFDbEUsSUFBSSxHQUFHLElBQUEsb0JBQVcsRUFBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLGdCQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQyxPQUFPO1lBQ0wsR0FBRyxFQUFFLElBQUk7WUFDVCxHQUFHLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRTtTQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUE0QjtRQUNqRCxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsVUFBVSxDQUFDLEdBQVc7UUFDcEIsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQztZQUNILElBQUksZ0JBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztnQkFDdkMsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxtREFBbUQ7UUFDckQsQ0FBQztRQUNELDJEQUEyRDtRQUMzRCxJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxJQUFBLHdCQUFlLEVBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUM5RixPQUFPLEdBQUcsQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLG9CQUFvQixFQUFFLFVBQVUsS0FBSyxXQUFXLENBQUM7UUFDaEcsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsY0FBYyxDQUFDLE9BQWU7UUFDNUIsTUFBTSxJQUFJLDZCQUF5QixFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBK0I7UUFDcEQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUE0QjtRQUNoRCxNQUFNLElBQUksNkJBQXlCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQWdDO1FBQ3RELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBOEI7UUFDbEQsTUFBTSxJQUFJLDZCQUF5QixFQUFFLENBQUM7SUFDeEMsQ0FBQztJQWNELEtBQUssQ0FBQyxXQUFXLENBQUMsV0FBcUMsRUFBRSxPQUFlO1FBQ3RFLElBQUksQ0FBQyxDQUFDLFdBQVcsWUFBWSxVQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUNELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNsRyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixpQkFBaUIsQ0FBQyxNQUErQjtRQUMvQyxNQUFNLElBQUksNkJBQXlCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0NBQ0Y7QUE3SEQsa0JBNkhDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IHsgY3JlYXRlUHVibGljS2V5LCByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQge1xuICBBdWRpdERlY3J5cHRlZEtleVBhcmFtcyxcbiAgQmFzZUNvaW4sXG4gIEJpdEdvQmFzZSxcbiAgS2V5UGFpcixcbiAgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcixcbiAgUGFyc2VkVHJhbnNhY3Rpb24sXG4gIFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBTaWduZWRUcmFuc2FjdGlvbixcbiAgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgV2FsbGV0LFxufSBmcm9tICcuLi8nO1xuXG5leHBvcnQgY2xhc3MgT2ZjIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlKSB7XG4gICAgc3VwZXIoYml0Z28pO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUluc3RhbmNlKGJpdGdvOiBCaXRHb0Jhc2UpOiBCYXNlQ29pbiB7XG4gICAgcmV0dXJuIG5ldyBPZmMoYml0Z28pO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKSB7XG4gICAgcmV0dXJuICdvZmMnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHNlY3AyNTZrMSBrZXkgcGFpclxuICAgKlxuICAgKiBAcGFyYW0gc2VlZFxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBvYmplY3Qgd2l0aCBnZW5lcmF0ZWQgcHViIGFuZCBwcnZcbiAgICovXG4gIGdlbmVyYXRlS2V5UGFpcihzZWVkPzogQnVmZmVyKTogS2V5UGFpciB7XG4gICAgaWYgKCFzZWVkKSB7XG4gICAgICAvLyBBbiBleHRlbmRlZCBwcml2YXRlIGtleSBoYXMgYm90aCBhIG5vcm1hbCAyNTYgYml0IHByaXZhdGUga2V5IGFuZCBhIDI1NlxuICAgICAgLy8gYml0IGNoYWluIGNvZGUsIGJvdGggb2Ygd2hpY2ggbXVzdCBiZSByYW5kb20uIDUxMiBiaXRzIGlzIHRoZXJlZm9yZSB0aGVcbiAgICAgIC8vIG1heGltdW0gZW50cm9weSBhbmQgZ2l2ZXMgdXMgbWF4aW11bSBzZWN1cml0eSBhZ2FpbnN0IGNyYWNraW5nLlxuICAgICAgc2VlZCA9IHJhbmRvbUJ5dGVzKDUxMiAvIDgpO1xuICAgIH1cbiAgICBjb25zdCBleHRlbmRlZEtleSA9IGJpcDMyLmZyb21TZWVkKHNlZWQpO1xuICAgIGNvbnN0IHhwdWIgPSBleHRlbmRlZEtleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1YjogeHB1YixcbiAgICAgIHBydjogZXh0ZW5kZWRLZXkudG9CYXNlNTgoKSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0RmFtaWx5KCkge1xuICAgIHJldHVybiAnb2ZjJztcbiAgfVxuXG4gIGdldEZ1bGxOYW1lKCkge1xuICAgIHJldHVybiAnT2ZmY2hhaW4nO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBtIG9mIG4gd2FsbGV0IHNpZ25lcnMvIGtleSBhbW91bnRzIGFyZSB2YWxpZCBmb3IgdGhlIGNvaW5cbiAgICovXG4gIGlzVmFsaWRNb2ZOU2V0dXAoeyBtLCBuIH06IHsgbTogbnVtYmVyOyBuOiBudW1iZXIgfSkge1xuICAgIHJldHVybiBtID09PSAxICYmIG4gPT09IDE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGlucHV0IGlzIHZhbGlkIHB1YmxpYyBrZXkgZm9yIHRoZSBjb2luLlxuICAgKlxuICAgKiBPRkMgd2FsbGV0cyBob2xkIGtleXMgaW4gdHdvIGZvcm1hdHM6IHRoZSB1c2VyIGtleSBpcyBhIEJJUC0zMiBiYXNlNTggeHB1YixcbiAgICogYW5kIHRoZSBCaXRHbyBrZXkgKHNvdXJjZTogJ2JpdGdvJykgaXMgYSBiYXNlNjQtZW5jb2RlZCBTUEtJIChERVItd3JhcHBlZClcbiAgICogc2VjcDI1NmsxIHB1YmxpYyBrZXkuIEJvdGggYXJlIHZhbGlkLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHViIHRoZSBwdWIgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBpc1ZhbGlkUHViKHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gQklQLTMyIGJhc2U1OCB4cHViICh1c2VyIGtleSlcbiAgICB0cnkge1xuICAgICAgaWYgKGJpcDMyLmZyb21CYXNlNTgocHViKS5pc05ldXRlcmVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gbm90IGEgQklQLTMyIGtleTsgZmFsbCB0aHJvdWdoIHRvIHRoZSBTUEtJIGNoZWNrXG4gICAgfVxuICAgIC8vIGJhc2U2NC1lbmNvZGVkIFNQS0kgREVSIHNlY3AyNTZrMSBwdWJsaWMga2V5IChCaXRHbyBrZXkpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGtleSA9IGNyZWF0ZVB1YmxpY0tleSh7IGtleTogQnVmZmVyLmZyb20ocHViLCAnYmFzZTY0JyksIGZvcm1hdDogJ2RlcicsIHR5cGU6ICdzcGtpJyB9KTtcbiAgICAgIHJldHVybiBrZXkuYXN5bW1ldHJpY0tleVR5cGUgPT09ICdlYycgJiYga2V5LmFzeW1tZXRyaWNLZXlEZXRhaWxzPy5uYW1lZEN1cnZlID09PSAnc2VjcDI1NmsxJztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIGdldEJhc2VGYWN0b3IoKTogbnVtYmVyIHwgc3RyaW5nIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb24ocGFyYW1zOiBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb24+IHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBhc3luYyBpc1dhbGxldEFkZHJlc3MocGFyYW1zOiBWZXJpZnlBZGRyZXNzT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgc2lnblRyYW5zYWN0aW9uKHBhcmFtczogU2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgbWVzc2FnZSB1c2luZyBhIHRyYWRpbmcgd2FsbGV0J3MgQml0R28gS2V5XG4gICAqIEBwYXJhbSB3YWxsZXQgLSB1c2VzIHRoZSBCaXRHbyBrZXkgb2YgdGhpcyB0cmFkaW5nIHdhbGxldCB0byBzaWduIHRoZSBtZXNzYWdlIHJlbW90ZWx5IGluIGEgS01TXG4gICAqIEBwYXJhbSBtZXNzYWdlXG4gICAqL1xuICBhc3luYyBzaWduTWVzc2FnZSh3YWxsZXQ6IFdhbGxldCwgbWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+O1xuICAvKipcbiAgICogU2lnbnMgYSBtZXNzYWdlIHVzaW5nIHRoZSBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ga2V5IC0gdXNlcyB0aGUgcHJpdmF0ZSBrZXkgdG8gc2lnbiB0aGUgbWVzc2FnZVxuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgc2lnbk1lc3NhZ2Uoa2V5OiB7IHBydjogc3RyaW5nIH0sIG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPjtcbiAgYXN5bmMgc2lnbk1lc3NhZ2Uoa2V5T3JXYWxsZXQ6IHsgcHJ2OiBzdHJpbmcgfSB8IFdhbGxldCwgbWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBpZiAoIShrZXlPcldhbGxldCBpbnN0YW5jZW9mIFdhbGxldCkpIHtcbiAgICAgIHJldHVybiBzdXBlci5zaWduTWVzc2FnZShrZXlPcldhbGxldCwgbWVzc2FnZSk7XG4gICAgfVxuICAgIGNvbnN0IHNpZ25hdHVyZUhleFN0cmluZyA9IGF3YWl0IGtleU9yV2FsbGV0LnRvVHJhZGluZ0FjY291bnQoKS5zaWduUGF5bG9hZCh7IHBheWxvYWQ6IG1lc3NhZ2UgfSk7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZUhleFN0cmluZywgJ2hleCcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGF1ZGl0RGVjcnlwdGVkS2V5KHBhcmFtczogQXVkaXREZWNyeXB0ZWRLZXlQYXJhbXMpIHtcbiAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ import 'should';
2
+ //# sourceMappingURL=defiVault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defiVault.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/defi/defiVault.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,CAAC"}
@@ -0,0 +1,292 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const sinon_1 = __importDefault(require("sinon"));
7
+ const assert_1 = __importDefault(require("assert"));
8
+ require("should");
9
+ const src_1 = require("../../../../src");
10
+ describe('DefiVault', function () {
11
+ let wallet;
12
+ let defiVault;
13
+ let mockBitGo;
14
+ let mockBaseCoin;
15
+ // Helper to create a chainable request mock
16
+ function mockRequest(result) {
17
+ return {
18
+ send: sinon_1.default.stub().returnsThis(),
19
+ query: sinon_1.default.stub().returnsThis(),
20
+ result: sinon_1.default.stub().resolves(result),
21
+ };
22
+ }
23
+ beforeEach(function () {
24
+ mockBitGo = {
25
+ post: sinon_1.default.stub(),
26
+ get: sinon_1.default.stub(),
27
+ del: sinon_1.default.stub(),
28
+ url: sinon_1.default.stub().callsFake((path, version) => `https://bitgo.com/api/v${version}${path}`),
29
+ microservicesUrl: sinon_1.default.stub().callsFake((path) => `https://bitgo.com${path}`),
30
+ setRequestTracer: sinon_1.default.stub(),
31
+ };
32
+ mockBaseCoin = {
33
+ getFamily: sinon_1.default.stub().returns('eth'),
34
+ url: sinon_1.default.stub(),
35
+ keychains: sinon_1.default.stub(),
36
+ supportsTss: sinon_1.default.stub().returns(true),
37
+ getMPCAlgorithm: sinon_1.default.stub(),
38
+ };
39
+ const mockWalletData = {
40
+ id: 'test-wallet-id',
41
+ coin: 'eth',
42
+ keys: ['user-key', 'backup-key', 'bitgo-key'],
43
+ };
44
+ wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
45
+ defiVault = wallet.defi;
46
+ });
47
+ afterEach(function () {
48
+ sinon_1.default.restore();
49
+ });
50
+ describe('depositToVault', function () {
51
+ it('should call sendMany for approve and deposit on happy path', async function () {
52
+ const operationId = 'op-uuid-123';
53
+ // Pre-flight: no active operations
54
+ const preflightReq = mockRequest({ items: [] });
55
+ mockBitGo.get.onFirstCall().returns(preflightReq);
56
+ // Mock sendMany for approve and deposit
57
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
58
+ sendManyStub.onFirstCall().resolves({
59
+ txRequest: {
60
+ txRequestId: 'txreq-approve-1',
61
+ intent: { intentType: 'defi-approve', operationId },
62
+ },
63
+ });
64
+ sendManyStub.onSecondCall().resolves({
65
+ txRequest: {
66
+ txRequestId: 'txreq-deposit-1',
67
+ intent: { intentType: 'defi-deposit', operationId },
68
+ },
69
+ });
70
+ const result = await defiVault.depositToVault({
71
+ vaultId: 'vlt-galaxy-usdc',
72
+ amount: '1000000',
73
+ });
74
+ result.operationId.should.equal(operationId);
75
+ result.txRequestIds.approve.should.equal('txreq-approve-1');
76
+ result.txRequestIds.deposit.should.equal('txreq-deposit-1');
77
+ // Verify pre-flight was called with correct query
78
+ preflightReq.query.calledWith({ vaultId: 'vlt-galaxy-usdc', state: 'active' }).should.be.true();
79
+ // Verify sendMany was called with correct params for approve
80
+ sendManyStub.calledTwice.should.be.true();
81
+ const approveArgs = sendManyStub.firstCall.args[0];
82
+ approveArgs.type.should.equal('defiApprove');
83
+ approveArgs.defiParams.vaultId.should.equal('vlt-galaxy-usdc');
84
+ approveArgs.defiParams.amount.should.equal('1000000');
85
+ // Verify sendMany was called with correct params for deposit
86
+ const depositArgs = sendManyStub.secondCall.args[0];
87
+ depositArgs.type.should.equal('defiDeposit');
88
+ depositArgs.defiParams.operationId.should.equal(operationId);
89
+ });
90
+ it('should reject when an active operation already exists', async function () {
91
+ const preflightReq = mockRequest({
92
+ items: [{ operationId: 'existing-op-id', state: 'APPROVE_TX_REQUESTED' }],
93
+ });
94
+ mockBitGo.get.returns(preflightReq);
95
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-galaxy-usdc', amount: '1000000' }), (err) => {
96
+ (err instanceof src_1.ActiveOperationExistsError).should.be.true();
97
+ err.operationId.should.equal('existing-op-id');
98
+ return true;
99
+ });
100
+ });
101
+ it('should propagate deposit sendMany failure without cleanup', async function () {
102
+ const operationId = 'op-uuid-456';
103
+ // Pre-flight: no active operations
104
+ const preflightReq = mockRequest({ items: [] });
105
+ mockBitGo.get.returns(preflightReq);
106
+ // Mock sendMany: approve succeeds, deposit fails
107
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
108
+ sendManyStub.onFirstCall().resolves({
109
+ txRequest: {
110
+ txRequestId: 'txreq-approve-2',
111
+ intent: { intentType: 'defi-approve', operationId },
112
+ },
113
+ });
114
+ sendManyStub.onSecondCall().rejects(new Error('deposit creation failed'));
115
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-galaxy-usdc', amount: '1000000' }), {
116
+ message: 'deposit creation failed',
117
+ });
118
+ // SDK does not attempt cleanup — reconciler handles orphaned approvals
119
+ mockBitGo.del.called.should.be.false();
120
+ });
121
+ it('should throw if vaultId is missing', async function () {
122
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: '', amount: '1000000' }), {
123
+ message: 'vaultId is required',
124
+ });
125
+ });
126
+ it('should throw if amount is missing', async function () {
127
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-1', amount: '' }), {
128
+ message: 'amount is required',
129
+ });
130
+ });
131
+ it('should pass clientIdempotencyKey and walletPassphrase when provided', async function () {
132
+ const operationId = 'op-uuid-789';
133
+ const preflightReq = mockRequest({ items: [] });
134
+ mockBitGo.get.returns(preflightReq);
135
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
136
+ sendManyStub.onFirstCall().resolves({
137
+ txRequest: {
138
+ txRequestId: 'txreq-approve-3',
139
+ intent: { intentType: 'defi-approve', operationId },
140
+ },
141
+ });
142
+ sendManyStub.onSecondCall().resolves({
143
+ txRequest: {
144
+ txRequestId: 'txreq-deposit-3',
145
+ intent: { intentType: 'defi-deposit', operationId },
146
+ },
147
+ });
148
+ await defiVault.depositToVault({
149
+ vaultId: 'vlt-galaxy-usdc',
150
+ amount: '1000000',
151
+ clientIdempotencyKey: 'idem-key-123',
152
+ walletPassphrase: 'test-passphrase',
153
+ });
154
+ const approveArgs = sendManyStub.firstCall.args[0];
155
+ approveArgs.defiParams.clientIdempotencyKey.should.equal('idem-key-123');
156
+ approveArgs.walletPassphrase.should.equal('test-passphrase');
157
+ const depositArgs = sendManyStub.secondCall.args[0];
158
+ depositArgs.defiParams.clientIdempotencyKey.should.equal('idem-key-123');
159
+ depositArgs.walletPassphrase.should.equal('test-passphrase');
160
+ });
161
+ });
162
+ describe('resumeDeposit', function () {
163
+ it('should issue the deposit sendMany for a partial operation', async function () {
164
+ const operation = {
165
+ operationId: 'op-resume-1',
166
+ walletId: 'test-wallet-id',
167
+ vaultId: 'vlt-galaxy-usdc',
168
+ type: 'DEPOSIT',
169
+ assetAmount: '1000000',
170
+ state: 'APPROVE_TX_REQUESTED',
171
+ txRequestId: 'txreq-approve-existing',
172
+ associatedTxRequestId: undefined,
173
+ createdAt: '2026-05-14T07:12:00Z',
174
+ updatedAt: '2026-05-14T07:12:00Z',
175
+ };
176
+ // getOperation call
177
+ const getOpReq = mockRequest(operation);
178
+ mockBitGo.get.returns(getOpReq);
179
+ // deposit sendMany
180
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
181
+ sendManyStub.resolves({
182
+ txRequest: {
183
+ txRequestId: 'txreq-deposit-resume',
184
+ intent: { intentType: 'defi-deposit', operationId: 'op-resume-1' },
185
+ },
186
+ });
187
+ const result = await defiVault.resumeDeposit({ operationId: 'op-resume-1' });
188
+ result.operationId.should.equal('op-resume-1');
189
+ result.txRequestIds.approve.should.equal('txreq-approve-existing');
190
+ result.txRequestIds.deposit.should.equal('txreq-deposit-resume');
191
+ // Verify sendMany was called with correct defiParams
192
+ const depositArgs = sendManyStub.firstCall.args[0];
193
+ depositArgs.type.should.equal('defiDeposit');
194
+ depositArgs.defiParams.vaultId.should.equal('vlt-galaxy-usdc');
195
+ depositArgs.defiParams.amount.should.equal('1000000');
196
+ depositArgs.defiParams.operationId.should.equal('op-resume-1');
197
+ });
198
+ it('should throw if deposit txRequest already exists', async function () {
199
+ const operation = {
200
+ operationId: 'op-already-done',
201
+ walletId: 'test-wallet-id',
202
+ vaultId: 'vlt-galaxy-usdc',
203
+ type: 'DEPOSIT',
204
+ assetAmount: '1000000',
205
+ state: 'DEPOSIT_TX_REQUESTED',
206
+ txRequestId: 'txreq-approve-x',
207
+ associatedTxRequestId: 'txreq-deposit-x',
208
+ createdAt: '2026-05-14T07:12:00Z',
209
+ updatedAt: '2026-05-14T07:12:00Z',
210
+ };
211
+ const getOpReq = mockRequest(operation);
212
+ mockBitGo.get.returns(getOpReq);
213
+ await assert_1.default.rejects(() => defiVault.resumeDeposit({ operationId: 'op-already-done' }), {
214
+ message: 'Deposit txRequest already exists for this operation; nothing to resume',
215
+ });
216
+ });
217
+ it('should throw if operationId is missing', async function () {
218
+ await assert_1.default.rejects(() => defiVault.resumeDeposit({ operationId: '' }), { message: 'operationId is required' });
219
+ });
220
+ });
221
+ describe('getOperation', function () {
222
+ it('should fetch an operation by ID', async function () {
223
+ const operation = {
224
+ operationId: 'op-get-1',
225
+ walletId: 'test-wallet-id',
226
+ vaultId: 'vlt-galaxy-usdc',
227
+ type: 'DEPOSIT',
228
+ assetAmount: '1000000',
229
+ state: 'COMPLETED',
230
+ txRequestId: 'txreq-1',
231
+ associatedTxRequestId: 'txreq-2',
232
+ createdAt: '2026-05-14T07:12:00Z',
233
+ updatedAt: '2026-05-14T07:18:00Z',
234
+ };
235
+ const req = mockRequest(operation);
236
+ mockBitGo.get.returns(req);
237
+ const result = await defiVault.getOperation({ operationId: 'op-get-1' });
238
+ result.should.deepEqual(operation);
239
+ });
240
+ it('should throw if operationId is missing', async function () {
241
+ await assert_1.default.rejects(() => defiVault.getOperation({ operationId: '' }), { message: 'operationId is required' });
242
+ });
243
+ });
244
+ describe('listOperations', function () {
245
+ it('should list operations for a vault', async function () {
246
+ const listResult = {
247
+ items: [
248
+ {
249
+ operationId: 'op-1',
250
+ walletId: 'test-wallet-id',
251
+ vaultId: 'vlt-galaxy-usdc',
252
+ type: 'DEPOSIT',
253
+ assetAmount: '1000000',
254
+ state: 'COMPLETED',
255
+ createdAt: '2026-05-14T07:12:00Z',
256
+ updatedAt: '2026-05-14T07:18:00Z',
257
+ },
258
+ ],
259
+ nextCursor: 'cursor-abc',
260
+ };
261
+ const req = mockRequest(listResult);
262
+ mockBitGo.get.returns(req);
263
+ const result = await defiVault.listOperations({
264
+ vaultId: 'vlt-galaxy-usdc',
265
+ state: 'COMPLETED',
266
+ limit: 10,
267
+ });
268
+ result.items.length.should.equal(1);
269
+ result.nextCursor.should.equal('cursor-abc');
270
+ // Verify query params
271
+ const queryArgs = req.query.firstCall.args[0];
272
+ queryArgs.vaultId.should.equal('vlt-galaxy-usdc');
273
+ queryArgs.state.should.equal('COMPLETED');
274
+ queryArgs.limit.should.equal(10);
275
+ });
276
+ it('should throw if vaultId is missing', async function () {
277
+ await assert_1.default.rejects(() => defiVault.listOperations({ vaultId: '' }), { message: 'vaultId is required' });
278
+ });
279
+ });
280
+ describe('wallet.defi getter', function () {
281
+ it('should return a DefiVault instance', function () {
282
+ const defi = wallet.defi;
283
+ (defi instanceof src_1.DefiVault).should.be.true();
284
+ });
285
+ it('should return the same instance on subsequent calls', function () {
286
+ const defi1 = wallet.defi;
287
+ const defi2 = wallet.defi;
288
+ (defi1 === defi2).should.be.true();
289
+ });
290
+ });
291
+ });
292
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaVZhdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL2RlZmkvZGVmaVZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsa0RBQTBCO0FBQzFCLG9EQUE0QjtBQUM1QixrQkFBZ0I7QUFDaEIseUNBQWdGO0FBRWhGLFFBQVEsQ0FBQyxXQUFXLEVBQUU7SUFDcEIsSUFBSSxNQUFjLENBQUM7SUFDbkIsSUFBSSxTQUFvQixDQUFDO0lBQ3pCLElBQUksU0FBYyxDQUFDO0lBQ25CLElBQUksWUFBaUIsQ0FBQztJQUV0Qiw0Q0FBNEM7SUFDNUMsU0FBUyxXQUFXLENBQUMsTUFBVztRQUM5QixPQUFPO1lBQ0wsSUFBSSxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDaEMsS0FBSyxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDakMsTUFBTSxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1NBQ3RDLENBQUM7SUFDSixDQUFDO0lBRUQsVUFBVSxDQUFDO1FBQ1QsU0FBUyxHQUFHO1lBQ1YsSUFBSSxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7WUFDbEIsR0FBRyxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7WUFDakIsR0FBRyxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7WUFDakIsR0FBRyxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFZLEVBQUUsT0FBZSxFQUFFLEVBQUUsQ0FBQywwQkFBMEIsT0FBTyxHQUFHLElBQUksRUFBRSxDQUFDO1lBQzFHLGdCQUFnQixFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLG9CQUFvQixJQUFJLEVBQUUsQ0FBQztZQUN0Rixn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QUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRSxLQUFLO1lBQzVDLE1BQU0sZ0JBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLENBQUMsQ0FBQztRQUM1RyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG9CQUFvQixFQUFFO1FBQzdCLEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRTtZQUN2QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ3pCLENBQUMsSUFBSSxZQUFZLGVBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscURBQXFELEVBQUU7WUFDeEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztZQUMxQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQzFCLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCB7IEFjdGl2ZU9wZXJhdGlvbkV4aXN0c0Vycm9yLCBEZWZpVmF1bHQsIFdhbGxldCB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYyc7XG5cbmRlc2NyaWJlKCdEZWZpVmF1bHQnLCBmdW5jdGlvbiAoKSB7XG4gIGxldCB3YWxsZXQ6IFdhbGxldDtcbiAgbGV0IGRlZmlWYXVsdDogRGVmaVZhdWx0O1xuICBsZXQgbW9ja0JpdEdvOiBhbnk7XG4gIGxldCBtb2NrQmFzZUNvaW46IGFueTtcblxuICAvLyBIZWxwZXIgdG8gY3JlYXRlIGEgY2hhaW5hYmxlIHJlcXVlc3QgbW9ja1xuICBmdW5jdGlvbiBtb2NrUmVxdWVzdChyZXN1bHQ6IGFueSkge1xuICAgIHJldHVybiB7XG4gICAgICBzZW5kOiBzaW5vbi5zdHViKCkucmV0dXJuc1RoaXMoKSxcbiAgICAgIHF1ZXJ5OiBzaW5vbi5zdHViKCkucmV0dXJuc1RoaXMoKSxcbiAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHJlc3VsdCksXG4gICAgfTtcbiAgfVxuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIG1vY2tCaXRHbyA9IHtcbiAgICAgIHBvc3Q6IHNpbm9uLnN0dWIoKSxcbiAgICAgIGdldDogc2lub24uc3R1YigpLFxuICAgICAgZGVsOiBzaW5vbi5zdHViKCksXG4gICAgICB1cmw6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKHBhdGg6IHN0cmluZywgdmVyc2lvbjogbnVtYmVyKSA9PiBgaHR0cHM6Ly9iaXRnby5jb20vYXBpL3Yke3ZlcnNpb259JHtwYXRofWApLFxuICAgICAgbWljcm9zZXJ2aWNlc1VybDogc2lub24uc3R1YigpLmNhbGxzRmFrZSgocGF0aDogc3RyaW5nKSA9PiBgaHR0cHM6Ly9iaXRnby5jb20ke3BhdGh9YCksXG4gICAgICBzZXRSZXF1ZXN0VHJhY2VyOiBzaW5vbi5zdHViKCksXG4gICAgfTtcblxuICAgIG1vY2tCYXNlQ29pbiA9IHtcbiAgICAgIGdldEZhbWlseTogc2lub24uc3R1YigpLnJldHVybnMoJ2V0aCcpLFxuICAgICAgdXJsOiBzaW5vbi5zdHViKCksXG4gICAgICBrZXljaGFpbnM6IHNpbm9uLnN0dWIoKSxcbiAgICAgIHN1cHBvcnRzVHNzOiBzaW5vbi5zdHViKCkucmV0dXJucyh0cnVlKSxcbiAgICAgIGdldE1QQ0FsZ29yaXRobTogc2lub24uc3R1YigpLFxuICAgIH07XG5cbiAgICBjb25zdCBtb2NrV2FsbGV0RGF0YSA9IHtcbiAgICAgIGlkOiAndGVzdC13YWxsZXQtaWQnLFxuICAgICAgY29pbjogJ2V0aCcsXG4gICAgICBrZXlzOiBbJ3VzZXIta2V5JywgJ2JhY2t1cC1rZXknLCAnYml0Z28ta2V5J10sXG4gICAgfTtcblxuICAgIHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4sIG1vY2tXYWxsZXREYXRhKTtcbiAgICBkZWZpVmF1bHQgPSB3YWxsZXQuZGVmaTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkZXBvc2l0VG9WYXVsdCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgc2VuZE1hbnkgZm9yIGFwcHJvdmUgYW5kIGRlcG9zaXQgb24gaGFwcHkgcGF0aCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gJ29wLXV1aWQtMTIzJztcblxuICAgICAgLy8gUHJlLWZsaWdodDogbm8gYWN0aXZlIG9wZXJhdGlvbnNcbiAgICAgIGNvbnN0IHByZWZsaWdodFJlcSA9IG1vY2tSZXF1ZXN0KHsgaXRlbXM6IFtdIH0pO1xuICAgICAgbW9ja0JpdEdvLmdldC5vbkZpcnN0Q2FsbCgpLnJldHVybnMocHJlZmxpZ2h0UmVxKTtcblxuICAgICAgLy8gTW9jayBzZW5kTWFueSBmb3IgYXBwcm92ZSBhbmQgZGVwb3NpdFxuICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgc2VuZE1hbnlTdHViLm9uRmlyc3RDYWxsKCkucmVzb2x2ZXMoe1xuICAgICAgICB0eFJlcXVlc3Q6IHtcbiAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWFwcHJvdmUtMScsXG4gICAgICAgICAgaW50ZW50OiB7IGludGVudFR5cGU6ICdkZWZpLWFwcHJvdmUnLCBvcGVyYXRpb25JZCB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBzZW5kTWFueVN0dWIub25TZWNvbmRDYWxsKCkucmVzb2x2ZXMoe1xuICAgICAgICB0eFJlcXVlc3Q6IHtcbiAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWRlcG9zaXQtMScsXG4gICAgICAgICAgaW50ZW50OiB7IGludGVudFR5cGU6ICdkZWZpLWRlcG9zaXQnLCBvcGVyYXRpb25JZCB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7XG4gICAgICAgIHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLFxuICAgICAgICBhbW91bnQ6ICcxMDAwMDAwJyxcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHQub3BlcmF0aW9uSWQuc2hvdWxkLmVxdWFsKG9wZXJhdGlvbklkKTtcbiAgICAgIHJlc3VsdC50eFJlcXVlc3RJZHMuYXBwcm92ZS5zaG91bGQuZXF1YWwoJ3R4cmVxLWFwcHJvdmUtMScpO1xuICAgICAgcmVzdWx0LnR4UmVxdWVzdElkcy5kZXBvc2l0LnNob3VsZC5lcXVhbCgndHhyZXEtZGVwb3NpdC0xJyk7XG5cbiAgICAgIC8vIFZlcmlmeSBwcmUtZmxpZ2h0IHdhcyBjYWxsZWQgd2l0aCBjb3JyZWN0IHF1ZXJ5XG4gICAgICBwcmVmbGlnaHRSZXEucXVlcnkuY2FsbGVkV2l0aCh7IHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLCBzdGF0ZTogJ2FjdGl2ZScgfSkuc2hvdWxkLmJlLnRydWUoKTtcblxuICAgICAgLy8gVmVyaWZ5IHNlbmRNYW55IHdhcyBjYWxsZWQgd2l0aCBjb3JyZWN0IHBhcmFtcyBmb3IgYXBwcm92ZVxuICAgICAgc2VuZE1hbnlTdHViLmNhbGxlZFR3aWNlLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBjb25zdCBhcHByb3ZlQXJnczogYW55ID0gc2VuZE1hbnlTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgYXBwcm92ZUFyZ3MudHlwZS5zaG91bGQuZXF1YWwoJ2RlZmlBcHByb3ZlJyk7XG4gICAgICBhcHByb3ZlQXJncy5kZWZpUGFyYW1zLnZhdWx0SWQuc2hvdWxkLmVxdWFsKCd2bHQtZ2FsYXh5LXVzZGMnKTtcbiAgICAgIGFwcHJvdmVBcmdzLmRlZmlQYXJhbXMuYW1vdW50LnNob3VsZC5lcXVhbCgnMTAwMDAwMCcpO1xuXG4gICAgICAvLyBWZXJpZnkgc2VuZE1hbnkgd2FzIGNhbGxlZCB3aXRoIGNvcnJlY3QgcGFyYW1zIGZvciBkZXBvc2l0XG4gICAgICBjb25zdCBkZXBvc2l0QXJnczogYW55ID0gc2VuZE1hbnlTdHViLnNlY29uZENhbGwuYXJnc1swXTtcbiAgICAgIGRlcG9zaXRBcmdzLnR5cGUuc2hvdWxkLmVxdWFsKCdkZWZpRGVwb3NpdCcpO1xuICAgICAgZGVwb3NpdEFyZ3MuZGVmaVBhcmFtcy5vcGVyYXRpb25JZC5zaG91bGQuZXF1YWwob3BlcmF0aW9uSWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgd2hlbiBhbiBhY3RpdmUgb3BlcmF0aW9uIGFscmVhZHkgZXhpc3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHJlZmxpZ2h0UmVxID0gbW9ja1JlcXVlc3Qoe1xuICAgICAgICBpdGVtczogW3sgb3BlcmF0aW9uSWQ6ICdleGlzdGluZy1vcC1pZCcsIHN0YXRlOiAnQVBQUk9WRV9UWF9SRVFVRVNURUQnIH1dLFxuICAgICAgfSk7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMocHJlZmxpZ2h0UmVxKTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICgpID0+IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLCBhbW91bnQ6ICcxMDAwMDAwJyB9KSxcbiAgICAgICAgKGVycjogRXJyb3IpID0+IHtcbiAgICAgICAgICAoZXJyIGluc3RhbmNlb2YgQWN0aXZlT3BlcmF0aW9uRXhpc3RzRXJyb3IpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgICAgKGVyciBhcyBBY3RpdmVPcGVyYXRpb25FeGlzdHNFcnJvcikub3BlcmF0aW9uSWQuc2hvdWxkLmVxdWFsKCdleGlzdGluZy1vcC1pZCcpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9wYWdhdGUgZGVwb3NpdCBzZW5kTWFueSBmYWlsdXJlIHdpdGhvdXQgY2xlYW51cCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gJ29wLXV1aWQtNDU2JztcblxuICAgICAgLy8gUHJlLWZsaWdodDogbm8gYWN0aXZlIG9wZXJhdGlvbnNcbiAgICAgIGNvbnN0IHByZWZsaWdodFJlcSA9IG1vY2tSZXF1ZXN0KHsgaXRlbXM6IFtdIH0pO1xuICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKHByZWZsaWdodFJlcSk7XG5cbiAgICAgIC8vIE1vY2sgc2VuZE1hbnk6IGFwcHJvdmUgc3VjY2VlZHMsIGRlcG9zaXQgZmFpbHNcbiAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcbiAgICAgIHNlbmRNYW55U3R1Yi5vbkZpcnN0Q2FsbCgpLnJlc29sdmVzKHtcbiAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eHJlcS1hcHByb3ZlLTInLFxuICAgICAgICAgIGludGVudDogeyBpbnRlbnRUeXBlOiAnZGVmaS1hcHByb3ZlJywgb3BlcmF0aW9uSWQgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgc2VuZE1hbnlTdHViLm9uU2Vjb25kQ2FsbCgpLnJlamVjdHMobmV3IEVycm9yKCdkZXBvc2l0IGNyZWF0aW9uIGZhaWxlZCcpKTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0LmRlcG9zaXRUb1ZhdWx0KHsgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsIGFtb3VudDogJzEwMDAwMDAnIH0pLCB7XG4gICAgICAgIG1lc3NhZ2U6ICdkZXBvc2l0IGNyZWF0aW9uIGZhaWxlZCcsXG4gICAgICB9KTtcblxuICAgICAgLy8gU0RLIGRvZXMgbm90IGF0dGVtcHQgY2xlYW51cCDigJQgcmVjb25jaWxlciBoYW5kbGVzIG9ycGhhbmVkIGFwcHJvdmFsc1xuICAgICAgbW9ja0JpdEdvLmRlbC5jYWxsZWQuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIHZhdWx0SWQgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICcnLCBhbW91bnQ6ICcxMDAwMDAwJyB9KSwge1xuICAgICAgICBtZXNzYWdlOiAndmF1bHRJZCBpcyByZXF1aXJlZCcsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgYW1vdW50IGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQuZGVwb3NpdFRvVmF1bHQoeyB2YXVsdElkOiAndmx0LTEnLCBhbW91bnQ6ICcnIH0pLCB7XG4gICAgICAgIG1lc3NhZ2U6ICdhbW91bnQgaXMgcmVxdWlyZWQnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhc3MgY2xpZW50SWRlbXBvdGVuY3lLZXkgYW5kIHdhbGxldFBhc3NwaHJhc2Ugd2hlbiBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gJ29wLXV1aWQtNzg5JztcblxuICAgICAgY29uc3QgcHJlZmxpZ2h0UmVxID0gbW9ja1JlcXVlc3QoeyBpdGVtczogW10gfSk7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMocHJlZmxpZ2h0UmVxKTtcblxuICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgc2VuZE1hbnlTdHViLm9uRmlyc3RDYWxsKCkucmVzb2x2ZXMoe1xuICAgICAgICB0eFJlcXVlc3Q6IHtcbiAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWFwcHJvdmUtMycsXG4gICAgICAgICAgaW50ZW50OiB7IGludGVudFR5cGU6ICdkZWZpLWFwcHJvdmUnLCBvcGVyYXRpb25JZCB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBzZW5kTWFueVN0dWIub25TZWNvbmRDYWxsKCkucmVzb2x2ZXMoe1xuICAgICAgICB0eFJlcXVlc3Q6IHtcbiAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWRlcG9zaXQtMycsXG4gICAgICAgICAgaW50ZW50OiB7IGludGVudFR5cGU6ICdkZWZpLWRlcG9zaXQnLCBvcGVyYXRpb25JZCB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7XG4gICAgICAgIHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLFxuICAgICAgICBhbW91bnQ6ICcxMDAwMDAwJyxcbiAgICAgICAgY2xpZW50SWRlbXBvdGVuY3lLZXk6ICdpZGVtLWtleS0xMjMnLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAndGVzdC1wYXNzcGhyYXNlJyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBhcHByb3ZlQXJnczogYW55ID0gc2VuZE1hbnlTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgYXBwcm92ZUFyZ3MuZGVmaVBhcmFtcy5jbGllbnRJZGVtcG90ZW5jeUtleS5zaG91bGQuZXF1YWwoJ2lkZW0ta2V5LTEyMycpO1xuICAgICAgYXBwcm92ZUFyZ3Mud2FsbGV0UGFzc3BocmFzZS5zaG91bGQuZXF1YWwoJ3Rlc3QtcGFzc3BocmFzZScpO1xuXG4gICAgICBjb25zdCBkZXBvc2l0QXJnczogYW55ID0gc2VuZE1hbnlTdHViLnNlY29uZENhbGwuYXJnc1swXTtcbiAgICAgIGRlcG9zaXRBcmdzLmRlZmlQYXJhbXMuY2xpZW50SWRlbXBvdGVuY3lLZXkuc2hvdWxkLmVxdWFsKCdpZGVtLWtleS0xMjMnKTtcbiAgICAgIGRlcG9zaXRBcmdzLndhbGxldFBhc3NwaHJhc2Uuc2hvdWxkLmVxdWFsKCd0ZXN0LXBhc3NwaHJhc2UnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Jlc3VtZURlcG9zaXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBpc3N1ZSB0aGUgZGVwb3NpdCBzZW5kTWFueSBmb3IgYSBwYXJ0aWFsIG9wZXJhdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IHtcbiAgICAgICAgb3BlcmF0aW9uSWQ6ICdvcC1yZXN1bWUtMScsXG4gICAgICAgIHdhbGxldElkOiAndGVzdC13YWxsZXQtaWQnLFxuICAgICAgICB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJyxcbiAgICAgICAgdHlwZTogJ0RFUE9TSVQnLFxuICAgICAgICBhc3NldEFtb3VudDogJzEwMDAwMDAnLFxuICAgICAgICBzdGF0ZTogJ0FQUFJPVkVfVFhfUkVRVUVTVEVEJyxcbiAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eHJlcS1hcHByb3ZlLWV4aXN0aW5nJyxcbiAgICAgICAgYXNzb2NpYXRlZFR4UmVxdWVzdElkOiB1bmRlZmluZWQsXG4gICAgICAgIGNyZWF0ZWRBdDogJzIwMjYtMDUtMTRUMDc6MTI6MDBaJyxcbiAgICAgICAgdXBkYXRlZEF0OiAnMjAyNi0wNS0xNFQwNzoxMjowMFonLFxuICAgICAgfTtcblxuICAgICAgLy8gZ2V0T3BlcmF0aW9uIGNhbGxcbiAgICAgIGNvbnN0IGdldE9wUmVxID0gbW9ja1JlcXVlc3Qob3BlcmF0aW9uKTtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhnZXRPcFJlcSk7XG5cbiAgICAgIC8vIGRlcG9zaXQgc2VuZE1hbnlcbiAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcbiAgICAgIHNlbmRNYW55U3R1Yi5yZXNvbHZlcyh7XG4gICAgICAgIHR4UmVxdWVzdDoge1xuICAgICAgICAgIHR4UmVxdWVzdElkOiAndHhyZXEtZGVwb3NpdC1yZXN1bWUnLFxuICAgICAgICAgIGludGVudDogeyBpbnRlbnRUeXBlOiAnZGVmaS1kZXBvc2l0Jywgb3BlcmF0aW9uSWQ6ICdvcC1yZXN1bWUtMScgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWZpVmF1bHQucmVzdW1lRGVwb3NpdCh7IG9wZXJhdGlvbklkOiAnb3AtcmVzdW1lLTEnIH0pO1xuXG4gICAgICByZXN1bHQub3BlcmF0aW9uSWQuc2hvdWxkLmVxdWFsKCdvcC1yZXN1bWUtMScpO1xuICAgICAgcmVzdWx0LnR4UmVxdWVzdElkcy5hcHByb3ZlLnNob3VsZC5lcXVhbCgndHhyZXEtYXBwcm92ZS1leGlzdGluZycpO1xuICAgICAgcmVzdWx0LnR4UmVxdWVzdElkcy5kZXBvc2l0LnNob3VsZC5lcXVhbCgndHhyZXEtZGVwb3NpdC1yZXN1bWUnKTtcblxuICAgICAgLy8gVmVyaWZ5IHNlbmRNYW55IHdhcyBjYWxsZWQgd2l0aCBjb3JyZWN0IGRlZmlQYXJhbXNcbiAgICAgIGNvbnN0IGRlcG9zaXRBcmdzOiBhbnkgPSBzZW5kTWFueVN0dWIuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICBkZXBvc2l0QXJncy50eXBlLnNob3VsZC5lcXVhbCgnZGVmaURlcG9zaXQnKTtcbiAgICAgIGRlcG9zaXRBcmdzLmRlZmlQYXJhbXMudmF1bHRJZC5zaG91bGQuZXF1YWwoJ3ZsdC1nYWxheHktdXNkYycpO1xuICAgICAgZGVwb3NpdEFyZ3MuZGVmaVBhcmFtcy5hbW91bnQuc2hvdWxkLmVxdWFsKCcxMDAwMDAwJyk7XG4gICAgICBkZXBvc2l0QXJncy5kZWZpUGFyYW1zLm9wZXJhdGlvbklkLnNob3VsZC5lcXVhbCgnb3AtcmVzdW1lLTEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgZGVwb3NpdCB0eFJlcXVlc3QgYWxyZWFkeSBleGlzdHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcGVyYXRpb24gPSB7XG4gICAgICAgIG9wZXJhdGlvbklkOiAnb3AtYWxyZWFkeS1kb25lJyxcbiAgICAgICAgd2FsbGV0SWQ6ICd0ZXN0LXdhbGxldC1pZCcsXG4gICAgICAgIHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLFxuICAgICAgICB0eXBlOiAnREVQT1NJVCcsXG4gICAgICAgIGFzc2V0QW1vdW50OiAnMTAwMDAwMCcsXG4gICAgICAgIHN0YXRlOiAnREVQT1NJVF9UWF9SRVFVRVNURUQnLFxuICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWFwcHJvdmUteCcsXG4gICAgICAgIGFzc29jaWF0ZWRUeFJlcXVlc3RJZDogJ3R4cmVxLWRlcG9zaXQteCcsXG4gICAgICAgIGNyZWF0ZWRBdDogJzIwMjYtMDUtMTRUMDc6MTI6MDBaJyxcbiAgICAgICAgdXBkYXRlZEF0OiAnMjAyNi0wNS0xNFQwNzoxMjowMFonLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgZ2V0T3BSZXEgPSBtb2NrUmVxdWVzdChvcGVyYXRpb24pO1xuICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKGdldE9wUmVxKTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0LnJlc3VtZURlcG9zaXQoeyBvcGVyYXRpb25JZDogJ29wLWFscmVhZHktZG9uZScgfSksIHtcbiAgICAgICAgbWVzc2FnZTogJ0RlcG9zaXQgdHhSZXF1ZXN0IGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIG9wZXJhdGlvbjsgbm90aGluZyB0byByZXN1bWUnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIG9wZXJhdGlvbklkIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQucmVzdW1lRGVwb3NpdCh7IG9wZXJhdGlvbklkOiAnJyB9KSwgeyBtZXNzYWdlOiAnb3BlcmF0aW9uSWQgaXMgcmVxdWlyZWQnIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0T3BlcmF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZmV0Y2ggYW4gb3BlcmF0aW9uIGJ5IElEJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9uID0ge1xuICAgICAgICBvcGVyYXRpb25JZDogJ29wLWdldC0xJyxcbiAgICAgICAgd2FsbGV0SWQ6ICd0ZXN0LXdhbGxldC1pZCcsXG4gICAgICAgIHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLFxuICAgICAgICB0eXBlOiAnREVQT1NJVCcsXG4gICAgICAgIGFzc2V0QW1vdW50OiAnMTAwMDAwMCcsXG4gICAgICAgIHN0YXRlOiAnQ09NUExFVEVEJyxcbiAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eHJlcS0xJyxcbiAgICAgICAgYXNzb2NpYXRlZFR4UmVxdWVzdElkOiAndHhyZXEtMicsXG4gICAgICAgIGNyZWF0ZWRBdDogJzIwMjYtMDUtMTRUMDc6MTI6MDBaJyxcbiAgICAgICAgdXBkYXRlZEF0OiAnMjAyNi0wNS0xNFQwNzoxODowMFonLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVxID0gbW9ja1JlcXVlc3Qob3BlcmF0aW9uKTtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhyZXEpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWZpVmF1bHQuZ2V0T3BlcmF0aW9uKHsgb3BlcmF0aW9uSWQ6ICdvcC1nZXQtMScgfSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbChvcGVyYXRpb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBvcGVyYXRpb25JZCBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0LmdldE9wZXJhdGlvbih7IG9wZXJhdGlvbklkOiAnJyB9KSwgeyBtZXNzYWdlOiAnb3BlcmF0aW9uSWQgaXMgcmVxdWlyZWQnIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbGlzdE9wZXJhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBsaXN0IG9wZXJhdGlvbnMgZm9yIGEgdmF1bHQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBsaXN0UmVzdWx0ID0ge1xuICAgICAgICBpdGVtczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbklkOiAnb3AtMScsXG4gICAgICAgICAgICB3YWxsZXRJZDogJ3Rlc3Qtd2FsbGV0LWlkJyxcbiAgICAgICAgICAgIHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLFxuICAgICAgICAgICAgdHlwZTogJ0RFUE9TSVQnLFxuICAgICAgICAgICAgYXNzZXRBbW91bnQ6ICcxMDAwMDAwJyxcbiAgICAgICAgICAgIHN0YXRlOiAnQ09NUExFVEVEJyxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogJzIwMjYtMDUtMTRUMDc6MTI6MDBaJyxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogJzIwMjYtMDUtMTRUMDc6MTg6MDBaJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBuZXh0Q3Vyc29yOiAnY3Vyc29yLWFiYycsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXEgPSBtb2NrUmVxdWVzdChsaXN0UmVzdWx0KTtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhyZXEpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWZpVmF1bHQubGlzdE9wZXJhdGlvbnMoe1xuICAgICAgICB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJyxcbiAgICAgICAgc3RhdGU6ICdDT01QTEVURUQnLFxuICAgICAgICBsaW1pdDogMTAsXG4gICAgICB9KTtcblxuICAgICAgcmVzdWx0Lml0ZW1zLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICByZXN1bHQubmV4dEN1cnNvciEuc2hvdWxkLmVxdWFsKCdjdXJzb3ItYWJjJyk7XG5cbiAgICAgIC8vIFZlcmlmeSBxdWVyeSBwYXJhbXNcbiAgICAgIGNvbnN0IHF1ZXJ5QXJncyA9IHJlcS5xdWVyeS5maXJzdENhbGwuYXJnc1swXTtcbiAgICAgIHF1ZXJ5QXJncy52YXVsdElkLnNob3VsZC5lcXVhbCgndmx0LWdhbGF4eS11c2RjJyk7XG4gICAgICBxdWVyeUFyZ3Muc3RhdGUuc2hvdWxkLmVxdWFsKCdDT01QTEVURUQnKTtcbiAgICAgIHF1ZXJ5QXJncy5saW1pdC5zaG91bGQuZXF1YWwoMTApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB2YXVsdElkIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQubGlzdE9wZXJhdGlvbnMoeyB2YXVsdElkOiAnJyB9KSwgeyBtZXNzYWdlOiAndmF1bHRJZCBpcyByZXF1aXJlZCcgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3YWxsZXQuZGVmaSBnZXR0ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBEZWZpVmF1bHQgaW5zdGFuY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkZWZpID0gd2FsbGV0LmRlZmk7XG4gICAgICAoZGVmaSBpbnN0YW5jZW9mIERlZmlWYXVsdCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlIG9uIHN1YnNlcXVlbnQgY2FsbHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkZWZpMSA9IHdhbGxldC5kZWZpO1xuICAgICAgY29uc3QgZGVmaTIgPSB3YWxsZXQuZGVmaTtcbiAgICAgIChkZWZpMSA9PT0gZGVmaTIpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ecdsaEncryptionVersion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecdsaEncryptionVersion.d.ts","sourceRoot":"","sources":["../../../../../../../test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.ts"],"names":[],"mappings":""}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const assert = __importStar(require("assert"));
37
+ const sinon = __importStar(require("sinon"));
38
+ const ecdsa_1 = require("../../../../../../src/bitgo/utils/tss/ecdsa/ecdsa");
39
+ /**
40
+ * Regression tests for the ECDSA MPCv1 createKeychains encryptionVersion bug.
41
+ *
42
+ * Previously, EcdsaUtils.createKeychains dropped `encryptionVersion` silently —
43
+ * it was not declared in the params and was never forwarded to createUserKeychain
44
+ * or createBackupKeychain, causing a version mismatch within a wallet: v2 for
45
+ * encryptedWalletPassphrase but v1 for the user/backup keychains.
46
+ */
47
+ describe('EcdsaUtils.createKeychains - encryptionVersion forwarding', function () {
48
+ let ecdsaUtils;
49
+ let createUserKeychainStub;
50
+ let createBackupKeychainStub;
51
+ const fakeKeychain = { id: 'key-id', pub: 'pub', commonKeychain: 'ckc', type: 'tss' };
52
+ const fakeGpgKey = { publicKey: 'pub', privateKey: 'prv' };
53
+ const fakeKeyShare = { userHeldKeyShare: {} };
54
+ beforeEach(function () {
55
+ const mockBitgo = { getEnv: sinon.stub().returns('test') };
56
+ const mockCoin = {};
57
+ ecdsaUtils = new ecdsa_1.EcdsaUtils(mockBitgo, mockCoin);
58
+ createUserKeychainStub = sinon.stub(ecdsaUtils, 'createUserKeychain').resolves(fakeKeychain);
59
+ createBackupKeychainStub = sinon.stub(ecdsaUtils, 'createBackupKeychain').resolves(fakeKeychain);
60
+ sinon.stub(ecdsaUtils, 'createBitgoKeychain').resolves(fakeKeychain);
61
+ sinon.stub(ecdsaUtils, 'createBackupKeyShares').resolves(fakeKeyShare);
62
+ sinon.stub(ecdsaUtils, 'getBitgoGpgPubkeyBasedOnFeatureFlags').resolves({ mpcv2PublicKey: undefined });
63
+ sinon.stub(ecdsaUtils, 'getBackupGpgPubKey').resolves(fakeGpgKey);
64
+ sinon.stub(require('../../../../../../src/bitgo/utils/opengpgUtils'), 'generateGPGKeyPair').resolves(fakeGpgKey);
65
+ });
66
+ afterEach(function () {
67
+ sinon.restore();
68
+ });
69
+ it('forwards encryptionVersion: 2 to createUserKeychain', async function () {
70
+ await ecdsaUtils.createKeychains({ passphrase: 'pass', encryptionVersion: 2 });
71
+ assert.ok(createUserKeychainStub.calledOnce);
72
+ const userParams = createUserKeychainStub.firstCall.args[0];
73
+ assert.strictEqual(userParams.encryptionVersion, 2);
74
+ });
75
+ it('forwards encryptionVersion: 2 to createBackupKeychain', async function () {
76
+ await ecdsaUtils.createKeychains({ passphrase: 'pass', encryptionVersion: 2 });
77
+ assert.ok(createBackupKeychainStub.calledOnce);
78
+ const backupParams = createBackupKeychainStub.firstCall.args[0];
79
+ assert.strictEqual(backupParams.encryptionVersion, 2);
80
+ });
81
+ it('forwards encryptionVersion: undefined when not set', async function () {
82
+ await ecdsaUtils.createKeychains({ passphrase: 'pass' });
83
+ assert.ok(createUserKeychainStub.calledOnce);
84
+ assert.ok(createBackupKeychainStub.calledOnce);
85
+ assert.strictEqual(createUserKeychainStub.firstCall.args[0].encryptionVersion, undefined);
86
+ assert.strictEqual(createBackupKeychainStub.firstCall.args[0].encryptionVersion, undefined);
87
+ });
88
+ it('forwards encryptionVersion: 1 explicitly', async function () {
89
+ await ecdsaUtils.createKeychains({ passphrase: 'pass', encryptionVersion: 1 });
90
+ assert.strictEqual(createUserKeychainStub.firstCall.args[0].encryptionVersion, 1);
91
+ assert.strictEqual(createBackupKeychainStub.firstCall.args[0].encryptionVersion, 1);
92
+ });
93
+ });
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2FFbmNyeXB0aW9uVmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby91dGlscy90c3MvZWNkc2EvZWNkc2FFbmNyeXB0aW9uVmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUNqQyw2Q0FBK0I7QUFDL0IsNkVBQStFO0FBRy9FOzs7Ozs7O0dBT0c7QUFDSCxRQUFRLENBQUMsMkRBQTJELEVBQUU7SUFDcEUsSUFBSSxVQUFzQixDQUFDO0lBQzNCLElBQUksc0JBQXVDLENBQUM7SUFDNUMsSUFBSSx3QkFBeUMsQ0FBQztJQUU5QyxNQUFNLFlBQVksR0FBRyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFjLEVBQUUsQ0FBQztJQUMvRixNQUFNLFVBQVUsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQzNELE1BQU0sWUFBWSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFFOUMsVUFBVSxDQUFDO1FBQ1QsTUFBTSxTQUFTLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBMEIsQ0FBQztRQUNuRixNQUFNLFFBQVEsR0FBRyxFQUEwQixDQUFDO1FBRTVDLFVBQVUsR0FBRyxJQUFJLGtCQUFVLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRWpELHNCQUFzQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLG9CQUFvQixDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdGLHdCQUF3QixH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QUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEYsTUFBTSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCB7IEVjZHNhVXRpbHMgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2VjZHNhL2VjZHNhJztcbmltcG9ydCB7IEJpdEdvQmFzZSwgSUJhc2VDb2luIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vc3JjJztcblxuLyoqXG4gKiBSZWdyZXNzaW9uIHRlc3RzIGZvciB0aGUgRUNEU0EgTVBDdjEgY3JlYXRlS2V5Y2hhaW5zIGVuY3J5cHRpb25WZXJzaW9uIGJ1Zy5cbiAqXG4gKiBQcmV2aW91c2x5LCBFY2RzYVV0aWxzLmNyZWF0ZUtleWNoYWlucyBkcm9wcGVkIGBlbmNyeXB0aW9uVmVyc2lvbmAgc2lsZW50bHkg4oCUXG4gKiBpdCB3YXMgbm90IGRlY2xhcmVkIGluIHRoZSBwYXJhbXMgYW5kIHdhcyBuZXZlciBmb3J3YXJkZWQgdG8gY3JlYXRlVXNlcktleWNoYWluXG4gKiBvciBjcmVhdGVCYWNrdXBLZXljaGFpbiwgY2F1c2luZyBhIHZlcnNpb24gbWlzbWF0Y2ggd2l0aGluIGEgd2FsbGV0OiB2MiBmb3JcbiAqIGVuY3J5cHRlZFdhbGxldFBhc3NwaHJhc2UgYnV0IHYxIGZvciB0aGUgdXNlci9iYWNrdXAga2V5Y2hhaW5zLlxuICovXG5kZXNjcmliZSgnRWNkc2FVdGlscy5jcmVhdGVLZXljaGFpbnMgLSBlbmNyeXB0aW9uVmVyc2lvbiBmb3J3YXJkaW5nJywgZnVuY3Rpb24gKCkge1xuICBsZXQgZWNkc2FVdGlsczogRWNkc2FVdGlscztcbiAgbGV0IGNyZWF0ZVVzZXJLZXljaGFpblN0dWI6IHNpbm9uLlNpbm9uU3R1YjtcbiAgbGV0IGNyZWF0ZUJhY2t1cEtleWNoYWluU3R1Yjogc2lub24uU2lub25TdHViO1xuXG4gIGNvbnN0IGZha2VLZXljaGFpbiA9IHsgaWQ6ICdrZXktaWQnLCBwdWI6ICdwdWInLCBjb21tb25LZXljaGFpbjogJ2NrYycsIHR5cGU6ICd0c3MnIGFzIGNvbnN0IH07XG4gIGNvbnN0IGZha2VHcGdLZXkgPSB7IHB1YmxpY0tleTogJ3B1YicsIHByaXZhdGVLZXk6ICdwcnYnIH07XG4gIGNvbnN0IGZha2VLZXlTaGFyZSA9IHsgdXNlckhlbGRLZXlTaGFyZToge30gfTtcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtb2NrQml0Z28gPSB7IGdldEVudjogc2lub24uc3R1YigpLnJldHVybnMoJ3Rlc3QnKSB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xuICAgIGNvbnN0IG1vY2tDb2luID0ge30gYXMgdW5rbm93biBhcyBJQmFzZUNvaW47XG5cbiAgICBlY2RzYVV0aWxzID0gbmV3IEVjZHNhVXRpbHMobW9ja0JpdGdvLCBtb2NrQ29pbik7XG5cbiAgICBjcmVhdGVVc2VyS2V5Y2hhaW5TdHViID0gc2lub24uc3R1YihlY2RzYVV0aWxzLCAnY3JlYXRlVXNlcktleWNoYWluJykucmVzb2x2ZXMoZmFrZUtleWNoYWluKTtcbiAgICBjcmVhdGVCYWNrdXBLZXljaGFpblN0dWIgPSBzaW5vbi5zdHViKGVjZHNhVXRpbHMsICdjcmVhdGVCYWNrdXBLZXljaGFpbicpLnJlc29sdmVzKGZha2VLZXljaGFpbik7XG4gICAgc2lub24uc3R1YihlY2RzYVV0aWxzLCAnY3JlYXRlQml0Z29LZXljaGFpbicpLnJlc29sdmVzKGZha2VLZXljaGFpbik7XG4gICAgc2lub24uc3R1YihlY2RzYVV0aWxzLCAnY3JlYXRlQmFja3VwS2V5U2hhcmVzJykucmVzb2x2ZXMoZmFrZUtleVNoYXJlIGFzIGFueSk7XG4gICAgc2lub24uc3R1YihlY2RzYVV0aWxzLCAnZ2V0Qml0Z29HcGdQdWJrZXlCYXNlZE9uRmVhdHVyZUZsYWdzJykucmVzb2x2ZXMoeyBtcGN2MlB1YmxpY0tleTogdW5kZWZpbmVkIH0gYXMgYW55KTtcblxuICAgIHNpbm9uLnN0dWIoZWNkc2FVdGlscyBhcyBhbnksICdnZXRCYWNrdXBHcGdQdWJLZXknKS5yZXNvbHZlcyhmYWtlR3BnS2V5KTtcbiAgICBzaW5vbi5zdHViKHJlcXVpcmUoJy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy9vcGVuZ3BnVXRpbHMnKSwgJ2dlbmVyYXRlR1BHS2V5UGFpcicpLnJlc29sdmVzKGZha2VHcGdLZXkpO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ2ZvcndhcmRzIGVuY3J5cHRpb25WZXJzaW9uOiAyIHRvIGNyZWF0ZVVzZXJLZXljaGFpbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBlY2RzYVV0aWxzLmNyZWF0ZUtleWNoYWlucyh7IHBhc3NwaHJhc2U6ICdwYXNzJywgZW5jcnlwdGlvblZlcnNpb246IDIgfSk7XG5cbiAgICBhc3NlcnQub2soY3JlYXRlVXNlcktleWNoYWluU3R1Yi5jYWxsZWRPbmNlKTtcbiAgICBjb25zdCB1c2VyUGFyYW1zID0gY3JlYXRlVXNlcktleWNoYWluU3R1Yi5maXJzdENhbGwuYXJnc1swXTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodXNlclBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbiwgMik7XG4gIH0pO1xuXG4gIGl0KCdmb3J3YXJkcyBlbmNyeXB0aW9uVmVyc2lvbjogMiB0byBjcmVhdGVCYWNrdXBLZXljaGFpbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBlY2RzYVV0aWxzLmNyZWF0ZUtleWNoYWlucyh7IHBhc3NwaHJhc2U6ICdwYXNzJywgZW5jcnlwdGlvblZlcnNpb246IDIgfSk7XG5cbiAgICBhc3NlcnQub2soY3JlYXRlQmFja3VwS2V5Y2hhaW5TdHViLmNhbGxlZE9uY2UpO1xuICAgIGNvbnN0IGJhY2t1cFBhcmFtcyA9IGNyZWF0ZUJhY2t1cEtleWNoYWluU3R1Yi5maXJzdENhbGwuYXJnc1swXTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFja3VwUGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLCAyKTtcbiAgfSk7XG5cbiAgaXQoJ2ZvcndhcmRzIGVuY3J5cHRpb25WZXJzaW9uOiB1bmRlZmluZWQgd2hlbiBub3Qgc2V0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IGVjZHNhVXRpbHMuY3JlYXRlS2V5Y2hhaW5zKHsgcGFzc3BocmFzZTogJ3Bhc3MnIH0pO1xuXG4gICAgYXNzZXJ0Lm9rKGNyZWF0ZVVzZXJLZXljaGFpblN0dWIuY2FsbGVkT25jZSk7XG4gICAgYXNzZXJ0Lm9rKGNyZWF0ZUJhY2t1cEtleWNoYWluU3R1Yi5jYWxsZWRPbmNlKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY3JlYXRlVXNlcktleWNoYWluU3R1Yi5maXJzdENhbGwuYXJnc1swXS5lbmNyeXB0aW9uVmVyc2lvbiwgdW5kZWZpbmVkKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY3JlYXRlQmFja3VwS2V5Y2hhaW5TdHViLmZpcnN0Q2FsbC5hcmdzWzBdLmVuY3J5cHRpb25WZXJzaW9uLCB1bmRlZmluZWQpO1xuICB9KTtcblxuICBpdCgnZm9yd2FyZHMgZW5jcnlwdGlvblZlcnNpb246IDEgZXhwbGljaXRseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBlY2RzYVV0aWxzLmNyZWF0ZUtleWNoYWlucyh7IHBhc3NwaHJhc2U6ICdwYXNzJywgZW5jcnlwdGlvblZlcnNpb246IDEgfSk7XG5cbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY3JlYXRlVXNlcktleWNoYWluU3R1Yi5maXJzdENhbGwuYXJnc1swXS5lbmNyeXB0aW9uVmVyc2lvbiwgMSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNyZWF0ZUJhY2t1cEtleWNoYWluU3R1Yi5maXJzdENhbGwuYXJnc1swXS5lbmNyeXB0aW9uVmVyc2lvbiwgMSk7XG4gIH0pO1xufSk7XG4iXX0=