@bitgo/sdk-core 38.15.0 → 38.17.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 (70) hide show
  1. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +3 -1
  2. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +1 -1
  3. package/dist/src/account-lib/util/ed25519KeyDeriver.js +4 -2
  4. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +7 -1
  5. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  6. package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
  7. package/dist/src/bitgo/defi/defiVault.d.ts +7 -7
  8. package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -1
  9. package/dist/src/bitgo/defi/defiVault.js +10 -10
  10. package/dist/src/bitgo/defi/iDefiVault.d.ts +7 -2
  11. package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -1
  12. package/dist/src/bitgo/defi/iDefiVault.js +1 -1
  13. package/dist/src/bitgo/environments.js +3 -3
  14. package/dist/src/bitgo/keychain/iKeychains.d.ts +4 -0
  15. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  16. package/dist/src/bitgo/keychain/iKeychains.js +1 -1
  17. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  18. package/dist/src/bitgo/keychain/keychains.js +15 -15
  19. package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts +24 -81
  20. package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -1
  21. package/dist/src/bitgo/safe/derivableEd25519Pub.js +117 -147
  22. package/dist/src/bitgo/safe/iSafe.d.ts +5 -2
  23. package/dist/src/bitgo/safe/iSafe.d.ts.map +1 -1
  24. package/dist/src/bitgo/safe/iSafe.js +1 -1
  25. package/dist/src/bitgo/safe/safe.d.ts +14 -7
  26. package/dist/src/bitgo/safe/safe.d.ts.map +1 -1
  27. package/dist/src/bitgo/safe/safe.js +108 -30
  28. package/dist/src/bitgo/safe/safeDerivation.d.ts +13 -0
  29. package/dist/src/bitgo/safe/safeDerivation.d.ts.map +1 -1
  30. package/dist/src/bitgo/safe/safeDerivation.js +30 -1
  31. package/dist/src/bitgo/safe/safes.d.ts.map +1 -1
  32. package/dist/src/bitgo/safe/safes.js +10 -8
  33. package/dist/src/bitgo/staking/iStakingWallet.d.ts +13 -5
  34. package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
  35. package/dist/src/bitgo/staking/iStakingWallet.js +1 -1
  36. package/dist/src/bitgo/staking/stakingWallet.d.ts +2 -2
  37. package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
  38. package/dist/src/bitgo/staking/stakingWallet.js +14 -1
  39. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +4 -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 +18 -6
  42. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +9 -1
  43. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -1
  44. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +24 -3
  45. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts +50 -1
  46. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts.map +1 -1
  47. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.js +154 -4
  48. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +3 -0
  49. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -1
  50. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +1 -1
  51. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -1
  52. package/dist/src/bitgo/utils/tss/recipientUtils.js +9 -1
  53. package/dist/src/bitgo/wallet/BuildParams.d.ts +8 -0
  54. package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
  55. package/dist/src/bitgo/wallet/BuildParams.js +6 -1
  56. package/dist/src/bitgo/wallet/iWallet.d.ts +5 -1
  57. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  58. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  59. package/dist/test/unit/bitgo/defi/defiVault.js +102 -1
  60. package/dist/test/unit/bitgo/keychain/keychains.js +40 -29
  61. package/dist/test/unit/bitgo/safe/derivableEd25519Pub.js +72 -76
  62. package/dist/test/unit/bitgo/safe/fixtures/derivableEd25519Pub.json +50 -175
  63. package/dist/test/unit/bitgo/safe/safe.js +122 -23
  64. package/dist/test/unit/bitgo/safe/safeDerivation.d.ts +2 -0
  65. package/dist/test/unit/bitgo/safe/safeDerivation.d.ts.map +1 -0
  66. package/dist/test/unit/bitgo/safe/safeDerivation.js +71 -0
  67. package/dist/test/unit/bitgo/safe/safes.js +23 -11
  68. package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +29 -1
  69. package/dist/tsconfig.tsbuildinfo +1 -1
  70. package/package.json +5 -5
@@ -36,15 +36,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  const sinon = __importStar(require("sinon"));
37
37
  require("should");
38
38
  const src_1 = require("../../../../src");
39
- /**
40
- * Slot-④ root keys are generated as XLM keychains, so `create()` yields a 56-char StrKey pub.
41
- * Taken from the cross-repo fixture pinned in WCN-2485.
42
- */
39
+ /** Slot-④ roots are generated as XLM keychains, then persisted as raw pub||chain-code base32. */
43
40
  const STRKEY_PUB = 'GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH';
44
- /** Marks the key as a safe root; combined with the pub's shape this identifies slot ④. */
45
41
  const SAFE_ID = 'safe-1';
46
- /** An xpub, as the secp256k1Multisig (slot ①) root coin generates. Already has a chain code. */
47
42
  const XPUB = 'xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8';
43
+ const BASE32_ROOT = /^[A-Z2-7]{103}$/;
48
44
  describe('Keychains.createBackup', function () {
49
45
  let keychains;
50
46
  let send;
@@ -87,27 +83,25 @@ describe('Keychains.createBackup', function () {
87
83
  });
88
84
  });
89
85
  describe('safe ed25519Multisig root (slot ④)', function () {
90
- it('posts a 108-char composite pub built from the generated key', async function () {
86
+ it('posts raw public key plus chain code as unpadded base32', async function () {
91
87
  await keychains.createBackup({ passphrase: 'pw', safeId: SAFE_ID });
92
88
  const pub = sentBody().pub;
93
- pub.length.should.equal(108);
94
- (0, src_1.decodeDerivableEd25519Pub)(pub).pub.should.equal(STRKEY_PUB);
95
- });
96
- it('mints a chain code that round-trips out of the pub', async function () {
97
- await keychains.createBackup({ passphrase: 'pw', safeId: SAFE_ID });
98
- // The chain code has no field of its own; this decode is how callers (e.g. the keycard's
99
- // box B) recover it.
100
- const { chainCode } = (0, src_1.decodeDerivableEd25519Pub)(sentBody().pub);
101
- chainCode.should.match(/^[A-Z2-7]{52}$/);
89
+ BASE32_ROOT.test(pub).should.equal(true);
90
+ (0, src_1.decodeDerivableEd25519Pub)(pub)
91
+ .pub.toString('hex')
92
+ .should.match(/^[0-9a-f]{64}$/);
93
+ (0, src_1.decodeDerivableEd25519Pub)(pub)
94
+ .chainCode.toString('hex')
95
+ .should.match(/^[0-9a-f]{64}$/);
102
96
  });
103
97
  it('mints a different chain code for each backup key', async function () {
104
- await keychains.createBackup({ passphrase: 'pw', safeId: SAFE_ID });
105
98
  await keychains.createBackup({ passphrase: 'pw', safeId: SAFE_ID });
106
99
  const first = (0, src_1.decodeDerivableEd25519Pub)(send.firstCall.args[0].pub).chainCode;
100
+ await keychains.createBackup({ passphrase: 'pw', safeId: SAFE_ID });
107
101
  const second = (0, src_1.decodeDerivableEd25519Pub)(send.secondCall.args[0].pub).chainCode;
108
- first.should.not.equal(second);
102
+ first.equals(second).should.equal(false);
109
103
  });
110
- it('sends no chainCode field of its own', async function () {
104
+ it('sends no separate chainCode field', async function () {
111
105
  await keychains.createBackup({ passphrase: 'pw', safeId: SAFE_ID });
112
106
  sentBody().should.not.have.property('chainCode');
113
107
  });
@@ -124,8 +118,7 @@ describe('Keychains.createBackup', function () {
124
118
  body.pub.should.equal(STRKEY_PUB);
125
119
  body.pub.length.should.equal(56);
126
120
  });
127
- it('does not compose a safe secp256k1Multisig root (slot ①)', async function () {
128
- // An xpub already carries its own chain code; composing onto it would corrupt the pub.
121
+ it('does not compose a safe secp256k1Multisig root', async function () {
129
122
  const btcKeychains = buildKeychains(XPUB);
130
123
  await btcKeychains.createBackup({ passphrase: 'pw', safeId: SAFE_ID });
131
124
  sentBody().pub.should.equal(XPUB);
@@ -137,13 +130,6 @@ describe('Keychains.createBackup', function () {
137
130
  body.source.should.equal('backup');
138
131
  body.encryptedPrv.should.equal('encrypted-prv');
139
132
  });
140
- it('leaves a TSS backup key untouched', async function () {
141
- // No local keypair is generated on the TSS path, so there is no pub to inspect or compose.
142
- await keychains.createBackup({ prv: 'tss-prv', commonKeychain: 'common-keychain', safeId: SAFE_ID });
143
- const body = sentBody();
144
- body.commonKeychain.should.equal('common-keychain');
145
- (body.pub === undefined).should.be.true();
146
- });
147
133
  it('leaves a KRS-provider backup key untouched', async function () {
148
134
  await keychains.createBackup({ provider: 'krs-provider', safeId: SAFE_ID });
149
135
  const body = sentBody();
@@ -151,5 +137,30 @@ describe('Keychains.createBackup', function () {
151
137
  body.provider.should.equal('krs-provider');
152
138
  });
153
139
  });
140
+ describe('password rotation encryption session', function () {
141
+ it('uses the supplied session for the new encrypted private key', async function () {
142
+ mockBitGo.decrypt = sinon.stub().resolves('decrypted-prv');
143
+ const sessionEncrypt = sinon.stub().resolves('session-encrypted');
144
+ const session = {
145
+ encrypt: sessionEncrypt,
146
+ decrypt: sinon.stub().resolves('decrypted-prv'),
147
+ destroy: sinon.stub(),
148
+ };
149
+ const updatedKeychain = await keychains.updateSingleKeychainPassword({
150
+ keychain: {
151
+ id: 'key-id',
152
+ encryptedPrv: 'legacy-encrypted-prv',
153
+ type: 'independent',
154
+ },
155
+ oldPassword: 'old-password',
156
+ newPassword: 'new-password',
157
+ encryptionVersion: 2,
158
+ encryptionSession: session,
159
+ });
160
+ sessionEncrypt.calledOnceWithExactly('decrypted-prv').should.equal(true);
161
+ mockBitGo.encrypt.called.should.equal(false);
162
+ updatedKeychain.encryptedPrv.should.equal('session-encrypted');
163
+ });
164
+ });
154
165
  });
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL2tleWNoYWluL2tleWNoYWlucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUErQjtBQUMvQixrQkFBZ0I7QUFDaEIseUNBQXVFO0FBRXZFOzs7R0FHRztBQUNILE1BQU0sVUFBVSxHQUFHLDBEQUEwRCxDQUFDO0FBRTlFLDBGQUEwRjtBQUMxRixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUM7QUFFekIsZ0dBQWdHO0FBQ2hHLE1BQU0sSUFBSSxHQUNSLGlIQUFpSCxDQUFDO0FBRXBILFFBQVEsQ0FBQyx3QkFBd0IsRUFBRTtJQUNqQyxJQUFJLFNBQW9CLENBQUM7SUFDekIsSUFBSSxJQUFxQixDQUFDO0lBQzFCLElBQUksU0FBYyxDQUFDO0lBRW5CLDBFQUEwRTtJQUMxRSxTQUFTLFFBQVE7UUFDZixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxTQUFTLGNBQWMsQ0FBQyxHQUFHLEdBQUcsVUFBVTtRQUN0QyxNQUFNLFlBQVksR0FBRztZQUNuQixHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ25ELGVBQWUsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsQ0FBQztTQUNqRSxDQUFDO1FBQ0YsT0FBTyxJQUFJLGVBQVMsQ0FBQyxTQUFTLEVBQUUsWUFBbUIsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxVQUFVLENBQUM7UUFDVCxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9B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QUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGNBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDckQsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNENBQTRDLEVBQUUsS0FBSztZQUNwRCxNQUFNLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBRTVFLE1BQU0sSUFBSSxHQUFHLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxRQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBLZXljaGFpbnMsIGRlY29kZURlcml2YWJsZUVkMjU1MTlQdWIgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMnO1xuXG4vKipcbiAqIFNsb3Qt4pGjIHJvb3Qga2V5cyBhcmUgZ2VuZXJhdGVkIGFzIFhMTSBrZXljaGFpbnMsIHNvIGBjcmVhdGUoKWAgeWllbGRzIGEgNTYtY2hhciBTdHJLZXkgcHViLlxuICogVGFrZW4gZnJvbSB0aGUgY3Jvc3MtcmVwbyBmaXh0dXJlIHBpbm5lZCBpbiBXQ04tMjQ4NS5cbiAqL1xuY29uc3QgU1RSS0VZX1BVQiA9ICdHQTVXVUo1NFoyM0tJTExDVU9VTkFLVFBCVlpXS01RVk80TzZFUTVHSExBRVJJTUxMSE5DU0tZSCc7XG5cbi8qKiBNYXJrcyB0aGUga2V5IGFzIGEgc2FmZSByb290OyBjb21iaW5lZCB3aXRoIHRoZSBwdWIncyBzaGFwZSB0aGlzIGlkZW50aWZpZXMgc2xvdCDikaMuICovXG5jb25zdCBTQUZFX0lEID0gJ3NhZmUtMSc7XG5cbi8qKiBBbiB4cHViLCBhcyB0aGUgc2VjcDI1NmsxTXVsdGlzaWcgKHNsb3Qg4pGgKSByb290IGNvaW4gZ2VuZXJhdGVzLiBBbHJlYWR5IGhhcyBhIGNoYWluIGNvZGUuICovXG5jb25zdCBYUFVCID1cbiAgJ3hwdWI2NjFNeU13QXFSYmNGdFhnUzVzWUpBQnFxRzlZTG1DNFExUmRhcDlnU0U4TnF0d3liR2hlUFkyZ1oyOUVTRmpxSm9DdTFSdXBqZThZdEdxc2VmRDI2NVRNZzd1c1VERmRwNlcxRUdNY2V0OCc7XG5cbmRlc2NyaWJlKCdLZXljaGFpbnMuY3JlYXRlQmFja3VwJywgZnVuY3Rpb24gKCkge1xuICBsZXQga2V5Y2hhaW5zOiBLZXljaGFpbnM7XG4gIGxldCBzZW5kOiBzaW5vbi5TaW5vblN0dWI7XG4gIGxldCBtb2NrQml0R286IGFueTtcblxuICAvKiogVGhlIGJvZHkgYWN0dWFsbHkgaGFuZGVkIHRvIGAuc2VuZCgpYCDigJQgaS5lLiB3aGF0IGdvZXMgb24gdGhlIHdpcmUuICovXG4gIGZ1bmN0aW9uIHNlbnRCb2R5KCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gc2VuZC5maXJzdENhbGwuYXJnc1swXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkS2V5Y2hhaW5zKHB1YiA9IFNUUktFWV9QVUIpOiBLZXljaGFpbnMge1xuICAgIGNvbnN0IG1vY2tCYXNlQ29pbiA9IHtcbiAgICAgIHVybDogc2lub24uc3R1YigpLmNhbGxzRmFrZSgocGF0aDogc3RyaW5nKSA9PiBwYXRoKSxcbiAgICAgIGdlbmVyYXRlS2V5UGFpcjogc2lub24uc3R1YigpLnJldHVybnMoeyBwdWIsIHBydjogJ1NPTUVfU0VFRCcgfSksXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IEtleWNoYWlucyhtb2NrQml0R28sIG1vY2tCYXNlQ29pbiBhcyBhbnkpO1xuICB9XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2VuZCA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBpZDogJ2JhY2t1cC1rZXktaWQnIH0pIH0pO1xuICAgIG1vY2tCaXRHbyA9IHtcbiAgICAgIHBvc3Q6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgc2VuZCB9KSxcbiAgICAgIGVuY3J5cHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcygnZW5jcnlwdGVkLXBydicpLFxuICAgICAgc2V0UmVxdWVzdFRyYWNlcjogc2lub24uc3R1YigpLFxuICAgIH07XG4gICAga2V5Y2hhaW5zID0gYnVpbGRLZXljaGFpbnMoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NhZmUgY2hpbGQga2V5IHJlZ2lzdHJhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2VyaWFsaXplcyB0aGUgaGFyZGVuZWQgZGVyaXZhdGlvbiBwYXRoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQga2V5Y2hhaW5zLmFkZCh7XG4gICAgICAgIHB1YjogWFBVQixcbiAgICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICAgIGtleVR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICAgIHBhcmVudDogJ3VzZXItcm9vdC1pZCcsXG4gICAgICAgIHNhZmVJZDogU0FGRV9JRCxcbiAgICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aDogXCJtLzcnXCIsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGVyaXZlZFBhdGggPSBzZW50Qm9keSgpLmRlcml2ZWRGcm9tUGFyZW50V2l0aFBhdGg7XG4gICAgICBpZiAodHlwZW9mIGRlcml2ZWRQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIGRlcml2ZWRGcm9tUGFyZW50V2l0aFBhdGggdG8gYmUgc2VyaWFsaXplZCcpO1xuICAgICAgfVxuICAgICAgZGVyaXZlZFBhdGguc2hvdWxkLmVxdWFsKFwibS83J1wiKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NhZmUgZWQyNTUxOU11bHRpc2lnIHJvb3QgKHNsb3Qg4pGjKScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgncG9zdHMgYSAxMDgtY2hhciBjb21wb3NpdGUgcHViIGJ1aWx0IGZyb20gdGhlIGdlbmVyYXRlZCBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuXG4gICAgICBjb25zdCBwdWIgPSBzZW50Qm9keSgpLnB1YiBhcyBzdHJpbmc7XG4gICAgICBwdWIubGVuZ3RoLnNob3VsZC5lcXVhbCgxMDgpO1xuICAgICAgZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihwdWIpLnB1Yi5zaG91bGQuZXF1YWwoU1RSS0VZX1BVQik7XG4gICAgfSk7XG5cbiAgICBpdCgnbWludHMgYSBjaGFpbiBjb2RlIHRoYXQgcm91bmQtdHJpcHMgb3V0IG9mIHRoZSBwdWInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuXG4gICAgICAvLyBUaGUgY2hhaW4gY29kZSBoYXMgbm8gZmllbGQgb2YgaXRzIG93bjsgdGhpcyBkZWNvZGUgaXMgaG93IGNhbGxlcnMgKGUuZy4gdGhlIGtleWNhcmQnc1xuICAgICAgLy8gYm94IEIpIHJlY292ZXIgaXQuXG4gICAgICBjb25zdCB7IGNoYWluQ29kZSB9ID0gZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihzZW50Qm9keSgpLnB1YiBhcyBzdHJpbmcpO1xuICAgICAgY2hhaW5Db2RlLnNob3VsZC5tYXRjaCgvXltBLVoyLTddezUyfSQvKTtcbiAgICB9KTtcblxuICAgIGl0KCdtaW50cyBhIGRpZmZlcmVudCBjaGFpbiBjb2RlIGZvciBlYWNoIGJhY2t1cCBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuICAgICAgYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBhc3NwaHJhc2U6ICdwdycsIHNhZmVJZDogU0FGRV9JRCB9KTtcblxuICAgICAgY29uc3QgZmlyc3QgPSBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHNlbmQuZmlyc3RDYWxsLmFyZ3NbMF0ucHViKS5jaGFpbkNvZGU7XG4gICAgICBjb25zdCBzZWNvbmQgPSBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHNlbmQuc2Vjb25kQ2FsbC5hcmdzWzBdLnB1YikuY2hhaW5Db2RlO1xuICAgICAgZmlyc3Quc2hvdWxkLm5vdC5lcXVhbChzZWNvbmQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NlbmRzIG5vIGNoYWluQ29kZSBmaWVsZCBvZiBpdHMgb3duJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBhc3NwaHJhc2U6ICdwdycsIHNhZmVJZDogU0FGRV9JRCB9KTtcblxuICAgICAgc2VudEJvZHkoKS5zaG91bGQubm90LmhhdmUucHJvcGVydHkoJ2NoYWluQ29kZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3N0aWxsIGVuY3J5cHRzIGFuZCByZXR1cm5zIHRoZSB1bi1jb21wb3NlZCBwcnYnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuXG4gICAgICBzZW50Qm9keSgpLmVuY3J5cHRlZFBydiEuc2hvdWxkLmVxdWFsKCdlbmNyeXB0ZWQtcHJ2Jyk7XG4gICAgICByZXN1bHQucHJ2IS5zaG91bGQuZXF1YWwoJ1NPTUVfU0VFRCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbGVhdmVzIGV2ZXJ5IG90aGVyIGtleSB1bnRvdWNoZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2RvZXMgbm90IGNvbXBvc2Ugd2l0aG91dCBhIHNhZmVJZCwgZXZlbiBmb3IgYW4gZWQyNTUxOSBjb2luJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBhc3NwaHJhc2U6ICdwdycgfSk7XG5cbiAgICAgIGNvbnN0IGJvZHkgPSBzZW50Qm9keSgpO1xuICAgICAgYm9keS5wdWIhLnNob3VsZC5lcXVhbChTVFJLRVlfUFVCKTtcbiAgICAgIChib2R5LnB1YiBhcyBzdHJpbmcpLmxlbmd0aC5zaG91bGQuZXF1YWwoNTYpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGNvbXBvc2UgYSBzYWZlIHNlY3AyNTZrMU11bHRpc2lnIHJvb3QgKHNsb3Qg4pGgKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEFuIHhwdWIgYWxyZWFkeSBjYXJyaWVzIGl0cyBvd24gY2hhaW4gY29kZTsgY29tcG9zaW5nIG9udG8gaXQgd291bGQgY29ycnVwdCB0aGUgcHViLlxuICAgICAgY29uc3QgYnRjS2V5Y2hhaW5zID0gYnVpbGRLZXljaGFpbnMoWFBVQik7XG5cbiAgICAgIGF3YWl0IGJ0Y0tleWNoYWlucy5jcmVhdGVCYWNrdXAoeyBwYXNzcGhyYXNlOiAncHcnLCBzYWZlSWQ6IFNBRkVfSUQgfSk7XG5cbiAgICAgIHNlbnRCb2R5KCkucHViIS5zaG91bGQuZXF1YWwoWFBVQik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2VuZHMgYSBib2R5IHdpdGggbm8gY2hhaW5Db2RlIGFuZCBzb3VyY2UgYmFja3VwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBhc3NwaHJhc2U6ICdwdycgfSk7XG5cbiAgICAgIGNvbnN0IGJvZHkgPSBzZW50Qm9keSgpO1xuICAgICAgYm9keS5zaG91bGQubm90LmhhdmUucHJvcGVydHkoJ2NoYWluQ29kZScpO1xuICAgICAgYm9keS5zb3VyY2UhLnNob3VsZC5lcXVhbCgnYmFja3VwJyk7XG4gICAgICBib2R5LmVuY3J5cHRlZFBydiEuc2hvdWxkLmVxdWFsKCdlbmNyeXB0ZWQtcHJ2Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnbGVhdmVzIGEgVFNTIGJhY2t1cCBrZXkgdW50b3VjaGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gTm8gbG9jYWwga2V5cGFpciBpcyBnZW5lcmF0ZWQgb24gdGhlIFRTUyBwYXRoLCBzbyB0aGVyZSBpcyBubyBwdWIgdG8gaW5zcGVjdCBvciBjb21wb3NlLlxuICAgICAgYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBydjogJ3Rzcy1wcnYnLCBjb21tb25LZXljaGFpbjogJ2NvbW1vbi1rZXljaGFpbicsIHNhZmVJZDogU0FGRV9JRCB9KTtcblxuICAgICAgY29uc3QgYm9keSA9IHNlbnRCb2R5KCk7XG4gICAgICBib2R5LmNvbW1vbktleWNoYWluIS5zaG91bGQuZXF1YWwoJ2NvbW1vbi1rZXljaGFpbicpO1xuICAgICAgKGJvZHkucHViID09PSB1bmRlZmluZWQpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnbGVhdmVzIGEgS1JTLXByb3ZpZGVyIGJhY2t1cCBrZXkgdW50b3VjaGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHByb3ZpZGVyOiAna3JzLXByb3ZpZGVyJywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuXG4gICAgICBjb25zdCBib2R5ID0gc2VudEJvZHkoKTtcbiAgICAgIChib2R5LnB1YiA9PT0gdW5kZWZpbmVkKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgYm9keS5wcm92aWRlciEuc2hvdWxkLmVxdWFsKCdrcnMtcHJvdmlkZXInKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL2tleWNoYWluL2tleWNoYWlucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUErQjtBQUMvQixrQkFBZ0I7QUFDaEIseUNBQXVFO0FBR3ZFLGlHQUFpRztBQUNqRyxNQUFNLFVBQVUsR0FBRywwREFBMEQsQ0FBQztBQUM5RSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUM7QUFDekIsTUFBTSxJQUFJLEdBQ1IsaUhBQWlILENBQUM7QUFDcEgsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUM7QUFFdEMsUUFBUSxDQUFDLHdCQUF3QixFQUFFO0lBQ2pDLElBQUksU0FBb0IsQ0FBQztJQUN6QixJQUFJLElBQXFCLENBQUM7SUFDMUIsSUFBSSxTQUFjLENBQUM7SUFFbkIsMEVBQTBFO0lBQzFFLFNBQVMsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELFNBQVMsY0FBYyxDQUFDLEdBQUcsR0FBRyxVQUFVO1FBQ3RDLE1BQU0sWUFBWSxHQUFHO1lBQ25CLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDbkQsZUFBZSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxDQUFDO1NBQ2pFLENBQUM7UUFDRixPQUFPLElBQUksZUFBUyxDQUFDLFNBQVMsRUFBRSxZQUFtQixDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELFVBQVUsQ0FBQztRQUNULElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFF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Q0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgS2V5Y2hhaW5zLCBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcbmltcG9ydCB0eXBlIHsgSUVuY3J5cHRpb25TZXNzaW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2FwaSc7XG5cbi8qKiBTbG90LeKRoyByb290cyBhcmUgZ2VuZXJhdGVkIGFzIFhMTSBrZXljaGFpbnMsIHRoZW4gcGVyc2lzdGVkIGFzIHJhdyBwdWJ8fGNoYWluLWNvZGUgYmFzZTMyLiAqL1xuY29uc3QgU1RSS0VZX1BVQiA9ICdHQTVXVUo1NFoyM0tJTExDVU9VTkFLVFBCVlpXS01RVk80TzZFUTVHSExBRVJJTUxMSE5DU0tZSCc7XG5jb25zdCBTQUZFX0lEID0gJ3NhZmUtMSc7XG5jb25zdCBYUFVCID1cbiAgJ3hwdWI2NjFNeU13QXFSYmNGdFhnUzVzWUpBQnFxRzlZTG1DNFExUmRhcDlnU0U4TnF0d3liR2hlUFkyZ1oyOUVTRmpxSm9DdTFSdXBqZThZdEdxc2VmRDI2NVRNZzd1c1VERmRwNlcxRUdNY2V0OCc7XG5jb25zdCBCQVNFMzJfUk9PVCA9IC9eW0EtWjItN117MTAzfSQvO1xuXG5kZXNjcmliZSgnS2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCcsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGtleWNoYWluczogS2V5Y2hhaW5zO1xuICBsZXQgc2VuZDogc2lub24uU2lub25TdHViO1xuICBsZXQgbW9ja0JpdEdvOiBhbnk7XG5cbiAgLyoqIFRoZSBib2R5IGFjdHVhbGx5IGhhbmRlZCB0byBgLnNlbmQoKWAg4oCUIGkuZS4gd2hhdCBnb2VzIG9uIHRoZSB3aXJlLiAqL1xuICBmdW5jdGlvbiBzZW50Qm9keSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHNlbmQuZmlyc3RDYWxsLmFyZ3NbMF07XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZEtleWNoYWlucyhwdWIgPSBTVFJLRVlfUFVCKTogS2V5Y2hhaW5zIHtcbiAgICBjb25zdCBtb2NrQmFzZUNvaW4gPSB7XG4gICAgICB1cmw6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKHBhdGg6IHN0cmluZykgPT4gcGF0aCksXG4gICAgICBnZW5lcmF0ZUtleVBhaXI6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgcHViLCBwcnY6ICdTT01FX1NFRUQnIH0pLFxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBLZXljaGFpbnMobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4gYXMgYW55KTtcbiAgfVxuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNlbmQgPSBzaW5vbi5zdHViKCkucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgaWQ6ICdiYWNrdXAta2V5LWlkJyB9KSB9KTtcbiAgICBtb2NrQml0R28gPSB7XG4gICAgICBwb3N0OiBzaW5vbi5zdHViKCkucmV0dXJucyh7IHNlbmQgfSksXG4gICAgICBlbmNyeXB0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoJ2VuY3J5cHRlZC1wcnYnKSxcbiAgICAgIHNldFJlcXVlc3RUcmFjZXI6IHNpbm9uLnN0dWIoKSxcbiAgICB9O1xuICAgIGtleWNoYWlucyA9IGJ1aWxkS2V5Y2hhaW5zKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzYWZlIGNoaWxkIGtleSByZWdpc3RyYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3NlcmlhbGl6ZXMgdGhlIGhhcmRlbmVkIGRlcml2YXRpb24gcGF0aCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGtleWNoYWlucy5hZGQoe1xuICAgICAgICBwdWI6IFhQVUIsXG4gICAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgICBrZXlUeXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICBwYXJlbnQ6ICd1c2VyLXJvb3QtaWQnLFxuICAgICAgICBzYWZlSWQ6IFNBRkVfSUQsXG4gICAgICAgIGRlcml2ZWRGcm9tUGFyZW50V2l0aFBhdGg6IFwibS83J1wiLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRlcml2ZWRQYXRoID0gc2VudEJvZHkoKS5kZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoO1xuICAgICAgaWYgKHR5cGVvZiBkZXJpdmVkUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBkZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoIHRvIGJlIHNlcmlhbGl6ZWQnKTtcbiAgICAgIH1cbiAgICAgIGRlcml2ZWRQYXRoLnNob3VsZC5lcXVhbChcIm0vNydcIik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzYWZlIGVkMjU1MTlNdWx0aXNpZyByb290IChzbG90IOKRoyknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Bvc3RzIHJhdyBwdWJsaWMga2V5IHBsdXMgY2hhaW4gY29kZSBhcyB1bnBhZGRlZCBiYXNlMzInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuXG4gICAgICBjb25zdCBwdWIgPSBzZW50Qm9keSgpLnB1YiBhcyBzdHJpbmc7XG4gICAgICBCQVNFMzJfUk9PVC50ZXN0KHB1Yikuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihwdWIpXG4gICAgICAgIC5wdWIudG9TdHJpbmcoJ2hleCcpXG4gICAgICAgIC5zaG91bGQubWF0Y2goL15bMC05YS1mXXs2NH0kLyk7XG4gICAgICBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHB1YilcbiAgICAgICAgLmNoYWluQ29kZS50b1N0cmluZygnaGV4JylcbiAgICAgICAgLnNob3VsZC5tYXRjaCgvXlswLTlhLWZdezY0fSQvKTtcbiAgICB9KTtcblxuICAgIGl0KCdtaW50cyBhIGRpZmZlcmVudCBjaGFpbiBjb2RlIGZvciBlYWNoIGJhY2t1cCBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuICAgICAgY29uc3QgZmlyc3QgPSBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHNlbmQuZmlyc3RDYWxsLmFyZ3NbMF0ucHViKS5jaGFpbkNvZGU7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuICAgICAgY29uc3Qgc2Vjb25kID0gZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihzZW5kLnNlY29uZENhbGwuYXJnc1swXS5wdWIpLmNoYWluQ29kZTtcbiAgICAgIGZpcnN0LmVxdWFscyhzZWNvbmQpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2VuZHMgbm8gc2VwYXJhdGUgY2hhaW5Db2RlIGZpZWxkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBhc3NwaHJhc2U6ICdwdycsIHNhZmVJZDogU0FGRV9JRCB9KTtcbiAgICAgIHNlbnRCb2R5KCkuc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCdjaGFpbkNvZGUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzdGlsbCBlbmNyeXB0cyBhbmQgcmV0dXJucyB0aGUgdW4tY29tcG9zZWQgcHJ2JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBhc3NwaHJhc2U6ICdwdycsIHNhZmVJZDogU0FGRV9JRCB9KTtcbiAgICAgIHNlbnRCb2R5KCkuZW5jcnlwdGVkUHJ2IS5zaG91bGQuZXF1YWwoJ2VuY3J5cHRlZC1wcnYnKTtcbiAgICAgIHJlc3VsdC5wcnYhLnNob3VsZC5lcXVhbCgnU09NRV9TRUVEJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdsZWF2ZXMgZXZlcnkgb3RoZXIga2V5IHVudG91Y2hlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnZG9lcyBub3QgY29tcG9zZSB3aXRob3V0IGEgc2FmZUlkLCBldmVuIGZvciBhbiBlZDI1NTE5IGNvaW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3JyB9KTtcbiAgICAgIGNvbnN0IGJvZHkgPSBzZW50Qm9keSgpO1xuICAgICAgYm9keS5wdWIhLnNob3VsZC5lcXVhbChTVFJLRVlfUFVCKTtcbiAgICAgIChib2R5LnB1YiBhcyBzdHJpbmcpLmxlbmd0aC5zaG91bGQuZXF1YWwoNTYpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGNvbXBvc2UgYSBzYWZlIHNlY3AyNTZrMU11bHRpc2lnIHJvb3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidGNLZXljaGFpbnMgPSBidWlsZEtleWNoYWlucyhYUFVCKTtcbiAgICAgIGF3YWl0IGJ0Y0tleWNoYWlucy5jcmVhdGVCYWNrdXAoeyBwYXNzcGhyYXNlOiAncHcnLCBzYWZlSWQ6IFNBRkVfSUQgfSk7XG4gICAgICBzZW50Qm9keSgpLnB1YiEuc2hvdWxkLmVxdWFsKFhQVUIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NlbmRzIGEgYm9keSB3aXRoIG5vIGNoYWluQ29kZSBhbmQgc291cmNlIGJhY2t1cCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGtleWNoYWlucy5jcmVhdGVCYWNrdXAoeyBwYXNzcGhyYXNlOiAncHcnIH0pO1xuXG4gICAgICBjb25zdCBib2R5ID0gc2VudEJvZHkoKTtcbiAgICAgIGJvZHkuc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCdjaGFpbkNvZGUnKTtcbiAgICAgIGJvZHkuc291cmNlIS5zaG91bGQuZXF1YWwoJ2JhY2t1cCcpO1xuICAgICAgYm9keS5lbmNyeXB0ZWRQcnYhLnNob3VsZC5lcXVhbCgnZW5jcnlwdGVkLXBydicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2xlYXZlcyBhIEtSUy1wcm92aWRlciBiYWNrdXAga2V5IHVudG91Y2hlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGtleWNoYWlucy5jcmVhdGVCYWNrdXAoeyBwcm92aWRlcjogJ2tycy1wcm92aWRlcicsIHNhZmVJZDogU0FGRV9JRCB9KTtcblxuICAgICAgY29uc3QgYm9keSA9IHNlbnRCb2R5KCk7XG4gICAgICAoYm9keS5wdWIgPT09IHVuZGVmaW5lZCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGJvZHkucHJvdmlkZXIhLnNob3VsZC5lcXVhbCgna3JzLXByb3ZpZGVyJyk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgncGFzc3dvcmQgcm90YXRpb24gZW5jcnlwdGlvbiBzZXNzaW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCd1c2VzIHRoZSBzdXBwbGllZCBzZXNzaW9uIGZvciB0aGUgbmV3IGVuY3J5cHRlZCBwcml2YXRlIGtleScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCaXRHby5kZWNyeXB0ID0gc2lub24uc3R1YigpLnJlc29sdmVzKCdkZWNyeXB0ZWQtcHJ2Jyk7XG4gICAgICBjb25zdCBzZXNzaW9uRW5jcnlwdCA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcygnc2Vzc2lvbi1lbmNyeXB0ZWQnKTtcbiAgICAgIGNvbnN0IHNlc3Npb246IElFbmNyeXB0aW9uU2Vzc2lvbiA9IHtcbiAgICAgICAgZW5jcnlwdDogc2Vzc2lvbkVuY3J5cHQsXG4gICAgICAgIGRlY3J5cHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcygnZGVjcnlwdGVkLXBydicpLFxuICAgICAgICBkZXN0cm95OiBzaW5vbi5zdHViKCksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB1cGRhdGVkS2V5Y2hhaW4gPSBhd2FpdCBrZXljaGFpbnMudXBkYXRlU2luZ2xlS2V5Y2hhaW5QYXNzd29yZCh7XG4gICAgICAgIGtleWNoYWluOiB7XG4gICAgICAgICAgaWQ6ICdrZXktaWQnLFxuICAgICAgICAgIGVuY3J5cHRlZFBydjogJ2xlZ2FjeS1lbmNyeXB0ZWQtcHJ2JyxcbiAgICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICB9LFxuICAgICAgICBvbGRQYXNzd29yZDogJ29sZC1wYXNzd29yZCcsXG4gICAgICAgIG5ld1Bhc3N3b3JkOiAnbmV3LXBhc3N3b3JkJyxcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IDIsXG4gICAgICAgIGVuY3J5cHRpb25TZXNzaW9uOiBzZXNzaW9uLFxuICAgICAgfSk7XG5cbiAgICAgIHNlc3Npb25FbmNyeXB0LmNhbGxlZE9uY2VXaXRoRXhhY3RseSgnZGVjcnlwdGVkLXBydicpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIG1vY2tCaXRHby5lbmNyeXB0LmNhbGxlZC5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgdXBkYXRlZEtleWNoYWluLmVuY3J5cHRlZFBydiEuc2hvdWxkLmVxdWFsKCdzZXNzaW9uLWVuY3J5cHRlZCcpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -35,103 +35,99 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  require("should");
37
37
  const src_1 = require("../../../../src");
38
- // Cross-repo fixture: byte-identical to
39
- // packages/wallet-platform/test/unit/base/safes/fixtures/derivableEd25519Pub.json.
40
- // Four independent implementations of this split will otherwise drift, and the failure mode is an
41
- // unrecoverable wallet.
38
+ // Cross-repo fixture: byte-identical to wallet-platform
39
+ // test/unit/base/safes/fixtures/derivableEd25519Pub.json. Four independent implementations of this
40
+ // format will otherwise drift, and the failure mode is unrecoverable wallets.
42
41
  const fixture = __importStar(require("./fixtures/derivableEd25519Pub.json"));
42
+ const PUBLIC_KEY = Buffer.alloc(32);
43
+ const CHAIN_CODE = Buffer.alloc(32, 0xab);
44
+ const ROOT_PUB = (0, src_1.encodeDerivableEd25519Pub)(PUBLIC_KEY, CHAIN_CODE);
45
+ const ROOT_KEYCHAIN = Buffer.concat([PUBLIC_KEY, CHAIN_CODE]).toString('hex');
46
+ const STRKEY_PUBLIC = 'GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH';
47
+ const STRKEY_SEED = 'SAAACAQDAQCQMBYIBEFAWDANBYHRAEISCMKBKFQXDAMRUGY4DUPB6NKI';
43
48
  describe('derivableEd25519Pub', function () {
44
- describe('format constants', function () {
49
+ describe('base32 root format', function () {
50
+ it('encodes 32-byte public key plus 32-byte chain code', function () {
51
+ src_1.DERIVABLE_ED25519_CHAIN_CODE_BYTES.should.equal(32);
52
+ src_1.DERIVABLE_ED25519_PUB_LENGTH.should.equal(103);
53
+ ROOT_PUB.should.match(/^[A-Z2-7]{103}$/);
54
+ (0, src_1.decodeDerivableEd25519Pub)(ROOT_PUB).pub.equals(PUBLIC_KEY).should.equal(true);
55
+ (0, src_1.decodeDerivableEd25519Pub)(ROOT_PUB).chainCode.equals(CHAIN_CODE).should.equal(true);
56
+ });
45
57
  it('matches the constants pinned in the shared fixture', function () {
46
- src_1.DERIVABLE_ED25519_PUB_SPLIT_OFFSET.should.equal(fixture.splitOffset);
47
- src_1.DERIVABLE_ED25519_CHAIN_CODE_LENGTH.should.equal(fixture.chainCodeLength);
48
- src_1.DERIVABLE_ED25519_PUB_LENGTH.should.equal(fixture.compositeLength);
58
+ src_1.DERIVABLE_ED25519_PUB_LENGTH.should.equal(fixture.rootPubBase32Length);
59
+ src_1.DERIVABLE_ED25519_CHAIN_CODE_BYTES.should.equal(fixture.chainCodeBytes);
60
+ });
61
+ it('generates raw chain code for root composition', function () {
62
+ (0, src_1.generateEd25519ChainCode)().length.should.equal(32);
49
63
  });
50
64
  });
51
- describe('encodeDerivableEd25519Pub', function () {
52
- for (const v of fixture.valid) {
53
- it(`composes ${v.name}`, function () {
54
- (0, src_1.encodeDerivableEd25519Pub)(v.pub, v.chainCode).should.equal(v.composite);
55
- });
56
- }
57
- for (const v of fixture.invalidEncodeInputs) {
58
- it(`rejects ${v.name}`, function () {
59
- (() => (0, src_1.encodeDerivableEd25519Pub)(v.pub, v.chainCode)).should.throw(/Invalid derivable ed25519 pub/);
60
- });
61
- }
62
- });
63
- describe('decodeDerivableEd25519Pub', function () {
64
- for (const v of fixture.valid) {
65
- it(`splits ${v.name}`, function () {
66
- (0, src_1.decodeDerivableEd25519Pub)(v.composite).should.eql({ pub: v.pub, chainCode: v.chainCode });
65
+ describe('fixture vectors', function () {
66
+ for (const vector of fixture.valid) {
67
+ it(`round-trips ${vector.name}`, function () {
68
+ const composite = (0, src_1.encodeDerivableEd25519Pub)(Buffer.from(vector.pub, 'hex'), Buffer.from(vector.chainCode, 'hex'));
69
+ composite.should.equal(vector.composite);
70
+ const decoded = (0, src_1.decodeDerivableEd25519Pub)(vector.composite);
71
+ decoded.pub.toString('hex').should.equal(vector.pub);
72
+ decoded.chainCode.toString('hex').should.equal(vector.chainCode);
73
+ (0, src_1.isDerivableEd25519Pub)(vector.composite).should.equal(true);
67
74
  });
68
75
  }
69
- for (const v of fixture.invalidComposite) {
70
- it(`rejects ${v.name}`, function () {
71
- (() => (0, src_1.decodeDerivableEd25519Pub)(v.composite)).should.throw(/Invalid derivable ed25519 pub/);
72
- (0, src_1.isDerivableEd25519Pub)(v.composite).should.equal(false);
76
+ for (const vector of fixture.invalidComposite) {
77
+ it(`rejects ${vector.name}`, function () {
78
+ (0, src_1.isDerivableEd25519Pub)(vector.composite).should.equal(false);
79
+ (() => (0, src_1.decodeDerivableEd25519Pub)(vector.composite)).should.throw(/Invalid derivable ed25519 pub/);
73
80
  });
74
81
  }
75
82
  });
76
- describe('round trip', function () {
77
- for (const v of fixture.valid) {
78
- it(`round-trips ${v.name}`, function () {
79
- const composite = (0, src_1.encodeDerivableEd25519Pub)(v.pub, v.chainCode);
80
- const decoded = (0, src_1.decodeDerivableEd25519Pub)(composite);
81
- decoded.should.eql({ pub: v.pub, chainCode: v.chainCode });
82
- (0, src_1.encodeDerivableEd25519Pub)(decoded.pub, decoded.chainCode).should.equal(composite);
83
- (0, src_1.isDerivableEd25519Pub)(composite).should.equal(true);
83
+ describe('raw public soft derivation', function () {
84
+ it('derives a deterministic public key and discards the child chain code', async function () {
85
+ const eddsa = await src_1.Eddsa.initialize(await src_1.Ed25519BIP32.initialize());
86
+ const derived = eddsa.deriveUnhardened(ROOT_KEYCHAIN, 'm/7');
87
+ derived.length.should.equal(128);
88
+ derived.slice(0, 64).should.match(/^[0-9a-f]{64}$/);
89
+ derived.slice(64).should.match(/^[0-9a-f]{64}$/);
90
+ (await (0, src_1.softDeriveChildPubEd25519)(ROOT_PUB, 7)).toString('hex').should.equal(derived.slice(0, 64));
91
+ });
92
+ // The golden vectors below pin the unhardened derivation output shared cross-repo with
93
+ // wallet-platform: a divergent implementation derives co-signer keys nobody else can
94
+ // reproduce, permanently bricking the wallets minted with it.
95
+ for (const vector of fixture.softDerivation) {
96
+ it(`derives the pinned golden child: ${vector.name}`, async function () {
97
+ const child = await (0, src_1.softDeriveChildPubEd25519)(vector.composite, vector.index);
98
+ child.toString('hex').should.equal(vector.childPub);
84
99
  });
85
100
  }
86
- });
87
- describe('isValidEd25519ChainCode', function () {
88
- const { chainCode } = fixture.valid[3];
89
- it('accepts 52 canonical base32 characters', function () {
90
- (0, src_1.isValidEd25519ChainCode)(chainCode).should.equal(true);
101
+ it('rejects a hardened or out-of-range index', async function () {
102
+ await (0, src_1.softDeriveChildPubEd25519)(ROOT_PUB, -1).should.be.rejectedWith(/non-hardened/);
103
+ await (0, src_1.softDeriveChildPubEd25519)(ROOT_PUB, 0x80000000).should.be.rejectedWith(/non-hardened/);
104
+ await (0, src_1.softDeriveChildPubEd25519)(ROOT_PUB, 1.5).should.be.rejectedWith(/non-hardened/);
91
105
  });
92
- it('rejects lowercase', function () {
93
- (0, src_1.isValidEd25519ChainCode)(chainCode.toLowerCase()).should.equal(false);
94
- });
95
- it('rejects a chain code of the wrong length', function () {
96
- (0, src_1.isValidEd25519ChainCode)(chainCode.slice(0, 51)).should.equal(false);
97
- (0, src_1.isValidEd25519ChainCode)(chainCode + 'A').should.equal(false);
98
- });
99
- it('rejects a character outside the base32 alphabet', function () {
100
- // 0, 1, 8 and 9 are absent from the RFC 4648 alphabet.
101
- (0, src_1.isValidEd25519ChainCode)('0' + chainCode.slice(1)).should.equal(false);
102
- });
103
- it('rejects a non-canonical spelling whose padding bits are set', function () {
104
- // The 52nd character holds 1 significant bit and 4 padding bits, so 16 strings decode to the
105
- // same 32 bytes. Only the zero-padded one is the chain code.
106
- const BASE32 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
107
- const bumped = chainCode.slice(0, 51) + BASE32[BASE32.indexOf(chainCode[51]) + 1];
108
- bumped.should.not.equal(chainCode);
109
- (0, src_1.isValidEd25519ChainCode)(bumped).should.equal(false);
110
- });
111
- it('accepts what the generator mints', function () {
112
- (0, src_1.isValidEd25519ChainCode)((0, src_1.generateEd25519ChainCodeBase32)()).should.equal(true);
106
+ it('rejects a malformed root', async function () {
107
+ await (0, src_1.softDeriveChildPubEd25519)(fixture.invalidComposite[1].composite, 0).should.be.rejectedWith(/Invalid derivable ed25519 pub/);
108
+ await (0, src_1.softDeriveChildPubEd25519)(STRKEY_PUBLIC, 0).should.be.rejectedWith(/Invalid derivable ed25519 pub/);
113
109
  });
114
110
  });
115
- describe('isValidEd25519StrKeyPublicKey', function () {
116
- for (const v of fixture.valid) {
117
- it(`accepts the pub half of ${v.name}`, function () {
118
- (0, src_1.isValidEd25519StrKeyPublicKey)(v.pub).should.equal(true);
119
- });
120
- }
121
- it('rejects a bad checksum', function () {
122
- // last character of a known-good pub flipped
111
+ describe('Stellar user-key codecs', function () {
112
+ it('keeps Stellar encoding separate from the neutral root format', function () {
113
+ (0, src_1.isValidEd25519StrKeyPublicKey)(STRKEY_PUBLIC).should.equal(true);
114
+ (0, src_1.encodeEd25519StrKeyPublicKey)((0, src_1.decodeEd25519StrKeyPublicKey)(STRKEY_PUBLIC)).should.equal(STRKEY_PUBLIC);
115
+ (0, src_1.decodeEd25519StrKeySecretSeed)(STRKEY_SEED).length.should.equal(32);
116
+ (0, src_1.isDerivableEd25519Pub)(STRKEY_PUBLIC).should.equal(false);
117
+ (0, src_1.isChecksumValidStrKeyEd25519Pub)(STRKEY_PUBLIC).should.equal(true);
118
+ });
119
+ it('rejects a public key with a corrupted checksum', function () {
123
120
  (0, src_1.isValidEd25519StrKeyPublicKey)('GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYA').should.equal(false);
124
121
  });
125
- it('rejects a secret seed', function () {
122
+ it('rejects a secret seed where a public key is required', function () {
126
123
  (0, src_1.isValidEd25519StrKeyPublicKey)('SA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH').should.equal(false);
124
+ (() => (0, src_1.decodeEd25519StrKeyPublicKey)('SA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH')).should.throw(/StrKey public key/);
127
125
  });
128
- it('rejects a non-base32 character', function () {
126
+ it('rejects a non-base32 character, the empty string, and lowercase', function () {
129
127
  (0, src_1.isValidEd25519StrKeyPublicKey)('GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKY1').should.equal(false);
130
- });
131
- it('rejects the empty string and a composite pub', function () {
132
128
  (0, src_1.isValidEd25519StrKeyPublicKey)('').should.equal(false);
133
- (0, src_1.isValidEd25519StrKeyPublicKey)(fixture.valid[3].composite).should.equal(false);
129
+ (0, src_1.isValidEd25519StrKeyPublicKey)(STRKEY_PUBLIC.toLowerCase()).should.equal(false);
134
130
  });
135
131
  });
136
132
  });
137
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVyaXZhYmxlRWQyNTUxOVB1Yi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby9zYWZlL2Rlcml2YWJsZUVkMjU1MTlQdWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrQkFBZ0I7QUFDaEIseUNBVXlCO0FBRXpCLHdDQUF3QztBQUN4QyxtRkFBbUY7QUFDbkYsa0dBQWtHO0FBQ2xHLHdCQUF3QjtBQUN4Qiw2RUFBK0Q7QUFFL0QsUUFBUSxDQUFDLHFCQUFxQixFQUFFO0lBQzlCLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtRQUMzQixFQUFFLENBQUMsb0RBQW9ELEVBQUU7WUFDdkQsd0NBQWtDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDckUseUNBQW1DLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDMUUsa0NBQTRCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQywyQkFBMkIsRUFBRTtRQUNwQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM5QixFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3ZCLElBQUEsK0JBQXlCLEVBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUUsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsS0FBSyxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMs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QUFLLENBQUMsQ0FBQztRQUNoRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQge1xuICBERVJJVkFCTEVfRUQyNTUxOV9DSEFJTl9DT0RFX0xFTkdUSCxcbiAgREVSSVZBQkxFX0VEMjU1MTlfUFVCX0xFTkdUSCxcbiAgREVSSVZBQkxFX0VEMjU1MTlfUFVCX1NQTElUX09GRlNFVCxcbiAgZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1YixcbiAgZW5jb2RlRGVyaXZhYmxlRWQyNTUxOVB1YixcbiAgaXNEZXJpdmFibGVFZDI1NTE5UHViLFxuICBpc1ZhbGlkRWQyNTUxOUNoYWluQ29kZSxcbiAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXksXG4gIGdlbmVyYXRlRWQyNTUxOUNoYWluQ29kZUJhc2UzMixcbn0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcblxuLy8gQ3Jvc3MtcmVwbyBmaXh0dXJlOiBieXRlLWlkZW50aWNhbCB0b1xuLy8gcGFja2FnZXMvd2FsbGV0LXBsYXRmb3JtL3Rlc3QvdW5pdC9iYXNlL3NhZmVzL2ZpeHR1cmVzL2Rlcml2YWJsZUVkMjU1MTlQdWIuanNvbi5cbi8vIEZvdXIgaW5kZXBlbmRlbnQgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgc3BsaXQgd2lsbCBvdGhlcndpc2UgZHJpZnQsIGFuZCB0aGUgZmFpbHVyZSBtb2RlIGlzIGFuXG4vLyB1bnJlY292ZXJhYmxlIHdhbGxldC5cbmltcG9ydCAqIGFzIGZpeHR1cmUgZnJvbSAnLi9maXh0dXJlcy9kZXJpdmFibGVFZDI1NTE5UHViLmpzb24nO1xuXG5kZXNjcmliZSgnZGVyaXZhYmxlRWQyNTUxOVB1YicsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ2Zvcm1hdCBjb25zdGFudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ21hdGNoZXMgdGhlIGNvbnN0YW50cyBwaW5uZWQgaW4gdGhlIHNoYXJlZCBmaXh0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgICAgREVSSVZBQkxFX0VEMjU1MTlfUFVCX1NQTElUX09GRlNFVC5zaG91bGQuZXF1YWwoZml4dHVyZS5zcGxpdE9mZnNldCk7XG4gICAgICBERVJJVkFCTEVfRUQyNTUxOV9DSEFJTl9DT0RFX0xFTkdUSC5zaG91bGQuZXF1YWwoZml4dHVyZS5jaGFpbkNvZGVMZW5ndGgpO1xuICAgICAgREVSSVZBQkxFX0VEMjU1MTlfUFVCX0xFTkdUSC5zaG91bGQuZXF1YWwoZml4dHVyZS5jb21wb3NpdGVMZW5ndGgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZW5jb2RlRGVyaXZhYmxlRWQyNTUxOVB1YicsIGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKGNvbnN0IHYgb2YgZml4dHVyZS52YWxpZCkge1xuICAgICAgaXQoYGNvbXBvc2VzICR7di5uYW1lfWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZW5jb2RlRGVyaXZhYmxlRWQyNTUxOVB1Yih2LnB1Yiwgdi5jaGFpbkNvZGUpLnNob3VsZC5lcXVhbCh2LmNvbXBvc2l0ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHYgb2YgZml4dHVyZS5pbnZhbGlkRW5jb2RlSW5wdXRzKSB7XG4gICAgICBpdChgcmVqZWN0cyAke3YubmFtZX1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiBlbmNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHYucHViLCB2LmNoYWluQ29kZSkpLnNob3VsZC50aHJvdygvSW52YWxpZCBkZXJpdmFibGUgZWQyNTUxOSBwdWIvKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RlY29kZURlcml2YWJsZUVkMjU1MTlQdWInLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yIChjb25zdCB2IG9mIGZpeHR1cmUudmFsaWQpIHtcbiAgICAgIGl0KGBzcGxpdHMgJHt2Lm5hbWV9YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHYuY29tcG9zaXRlKS5zaG91bGQuZXFsKHsgcHViOiB2LnB1YiwgY2hhaW5Db2RlOiB2LmNoYWluQ29kZSB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdiBvZiBmaXh0dXJlLmludmFsaWRDb21wb3NpdGUpIHtcbiAgICAgIGl0KGByZWplY3RzICR7di5uYW1lfWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IGRlY29kZURlcml2YWJsZUVkMjU1MTlQdWIodi5jb21wb3NpdGUpKS5zaG91bGQudGhyb3coL0ludmFsaWQgZGVyaXZhYmxlIGVkMjU1MTkgcHViLyk7XG4gICAgICAgIGlzRGVyaXZhYmxlRWQyNTUxOVB1Yih2LmNvbXBvc2l0ZSkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JvdW5kIHRyaXAnLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yIChjb25zdCB2IG9mIGZpeHR1cmUudmFsaWQpIHtcbiAgICAgIGl0KGByb3VuZC10cmlwcyAke3YubmFtZX1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZSA9IGVuY29kZURlcml2YWJsZUVkMjU1MTlQdWIodi5wdWIsIHYuY2hhaW5Db2RlKTtcbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZURlcml2YWJsZUVkMjU1MTlQdWIoY29tcG9zaXRlKTtcbiAgICAgICAgZGVjb2RlZC5zaG91bGQuZXFsKHsgcHViOiB2LnB1YiwgY2hhaW5Db2RlOiB2LmNoYWluQ29kZSB9KTtcbiAgICAgICAgZW5jb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihkZWNvZGVkLnB1YiwgZGVjb2RlZC5jaGFpbkNvZGUpLnNob3VsZC5lcXVhbChjb21wb3NpdGUpO1xuICAgICAgICBpc0Rlcml2YWJsZUVkMjU1MTlQdWIoY29tcG9zaXRlKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkRWQyNTUxOUNoYWluQ29kZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB7IGNoYWluQ29kZSB9ID0gZml4dHVyZS52YWxpZFszXTtcblxuICAgIGl0KCdhY2NlcHRzIDUyIGNhbm9uaWNhbCBiYXNlMzIgY2hhcmFjdGVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlzVmFsaWRFZDI1NTE5Q2hhaW5Db2RlKGNoYWluQ29kZSkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgbG93ZXJjYXNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXNWYWxpZEVkMjU1MTlDaGFpbkNvZGUoY2hhaW5Db2RlLnRvTG93ZXJDYXNlKCkpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIGNoYWluIGNvZGUgb2YgdGhlIHdyb25nIGxlbmd0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlzVmFsaWRFZDI1NTE5Q2hhaW5Db2RlKGNoYWluQ29kZS5zbGljZSgwLCA1MSkpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBpc1ZhbGlkRWQyNTUxOUNoYWluQ29kZShjaGFpbkNvZGUgKyAnQScpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIGNoYXJhY3RlciBvdXRzaWRlIHRoZSBiYXNlMzIgYWxwaGFiZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyAwLCAxLCA4IGFuZCA5IGFyZSBhYnNlbnQgZnJvbSB0aGUgUkZDIDQ2NDggYWxwaGFiZXQuXG4gICAgICBpc1ZhbGlkRWQyNTUxOUNoYWluQ29kZSgnMCcgKyBjaGFpbkNvZGUuc2xpY2UoMSkpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIG5vbi1jYW5vbmljYWwgc3BlbGxpbmcgd2hvc2UgcGFkZGluZyBiaXRzIGFyZSBzZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBUaGUgNTJuZCBjaGFyYWN0ZXIgaG9sZHMgMSBzaWduaWZpY2FudCBiaXQgYW5kIDQgcGFkZGluZyBiaXRzLCBzbyAxNiBzdHJpbmdzIGRlY29kZSB0byB0aGVcbiAgICAgIC8vIHNhbWUgMzIgYnl0ZXMuIE9ubHkgdGhlIHplcm8tcGFkZGVkIG9uZSBpcyB0aGUgY2hhaW4gY29kZS5cbiAgICAgIGNvbnN0IEJBU0UzMiA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjIzNDU2Nyc7XG4gICAgICBjb25zdCBidW1wZWQgPSBjaGFpbkNvZGUuc2xpY2UoMCwgNTEpICsgQkFTRTMyW0JBU0UzMi5pbmRleE9mKGNoYWluQ29kZVs1MV0pICsgMV07XG4gICAgICBidW1wZWQuc2hvdWxkLm5vdC5lcXVhbChjaGFpbkNvZGUpO1xuICAgICAgaXNWYWxpZEVkMjU1MTlDaGFpbkNvZGUoYnVtcGVkKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FjY2VwdHMgd2hhdCB0aGUgZ2VuZXJhdG9yIG1pbnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXNWYWxpZEVkMjU1MTlDaGFpbkNvZGUoZ2VuZXJhdGVFZDI1NTE5Q2hhaW5Db2RlQmFzZTMyKCkpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRFZDI1NTE5U3RyS2V5UHVibGljS2V5JywgZnVuY3Rpb24gKCkge1xuICAgIGZvciAoY29uc3QgdiBvZiBmaXh0dXJlLnZhbGlkKSB7XG4gICAgICBpdChgYWNjZXB0cyB0aGUgcHViIGhhbGYgb2YgJHt2Lm5hbWV9YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpc1ZhbGlkRWQyNTUxOVN0cktleVB1YmxpY0tleSh2LnB1Yikuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXQoJ3JlamVjdHMgYSBiYWQgY2hlY2tzdW0nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBsYXN0IGNoYXJhY3RlciBvZiBhIGtub3duLWdvb2QgcHViIGZsaXBwZWRcbiAgICAgIGlzVmFsaWRFZDI1NTE5U3RyS2V5UHVibGljS2V5KCdHQTVXVUo1NFoyM0tJTExDVU9VTkFLVFBCVlpXS01RVk80TzZFUTVHSExBRVJJTUxMSE5DU0tZQScpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIHNlY3JldCBzZWVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoJ1NBNVdVSjU0WjIzS0lMTENVT1VOQUtUUEJWWldLTVFWTzRPNkVRNUdITEFFUklNTExITkNTS1lIJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGEgbm9uLWJhc2UzMiBjaGFyYWN0ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpc1ZhbGlkRWQyNTUxOVN0cktleVB1YmxpY0tleSgnR0E1V1VKNTRaMjNLSUxMQ1VPVU5BS1RQQlZaV0tNUVZPNE82RVE1R0hMQUVSSU1MTEhOQ1NLWTEnKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgdGhlIGVtcHR5IHN0cmluZyBhbmQgYSBjb21wb3NpdGUgcHViJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoJycpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBpc1ZhbGlkRWQyNTUxOVN0cktleVB1YmxpY0tleShmaXh0dXJlLnZhbGlkWzNdLmNvbXBvc2l0ZSkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVyaXZhYmxlRWQyNTUxOVB1Yi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby9zYWZlL2Rlcml2YWJsZUVkMjU1MTlQdWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrQkFBZ0I7QUFDaEIseUNBZXlCO0FBRXpCLHdEQUF3RDtBQUN4RCxtR0FBbUc7QUFDbkcsOEVBQThFO0FBQzlFLDZFQUErRDtBQUUvRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzFDLE1BQU0sUUFBUSxHQUFHLElBQUEsK0JBQXlCLEVBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ25FLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUUsTUFBTSxhQUFhLEdBQUcsMERBQTBELENBQUM7QUFDakYsTUFBTSxXQUFXLEdBQUcsMERBQTBELENBQUM7QUFFL0UsUUFBUSxDQUFDLHFCQUFxQixFQUFFO0lBQzlCLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtRQUM3QixFQUFFLENBQUMsb0RBQW9ELEVBQUU7WUFDdkQsd0NBQWtDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwRCxrQ0FBNEIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDekMsSUFBQSwrQkFBeUIsRUFBQyxRQUFRLENBQUMsQ0FB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QixFQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0RBQWdELEVBQUU7WUFDbkQsSUFBQSxtQ0FBNkIsRUFBQywwREFBMEQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEgsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsc0RBQXNELEVBQUU7WUFDekQsSUFBQSxtQ0FBNkIsRUFBQywwREFBMEQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLGtDQUE0QixFQUFDLDBEQUEwRCxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUMzRyxtQkFBbUIsQ0FDcEIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGlFQUFpRSxFQUFFO1lBQ3BFLElBQUEsbUNBQTZCLEVBQUMsMERBQTBELENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlHLElBQUEsbUNBQTZCLEVBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RCxJQUFBLG1DQUE2QixFQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHtcbiAgREVSSVZBQkxFX0VEMjU1MTlfQ0hBSU5fQ09ERV9CWVRFUyxcbiAgREVSSVZBQkxFX0VEMjU1MTlfUFVCX0xFTkdUSCxcbiAgRWQyNTUxOUJJUDMyLFxuICBFZGRzYSxcbiAgZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1YixcbiAgZGVjb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleSxcbiAgZGVjb2RlRWQyNTUxOVN0cktleVNlY3JldFNlZWQsXG4gIGVuY29kZURlcml2YWJsZUVkMjU1MTlQdWIsXG4gIGVuY29kZUVkMjU1MTlTdHJLZXlQdWJsaWNLZXksXG4gIGdlbmVyYXRlRWQyNTUxOUNoYWluQ29kZSxcbiAgaXNDaGVja3N1bVZhbGlkU3RyS2V5RWQyNTUxOVB1YixcbiAgaXNEZXJpdmFibGVFZDI1NTE5UHViLFxuICBpc1ZhbGlkRWQyNTUxOVN0cktleVB1YmxpY0tleSxcbiAgc29mdERlcml2ZUNoaWxkUHViRWQyNTUxOSxcbn0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcblxuLy8gQ3Jvc3MtcmVwbyBmaXh0dXJlOiBieXRlLWlkZW50aWNhbCB0byB3YWxsZXQtcGxhdGZvcm1cbi8vIHRlc3QvdW5pdC9iYXNlL3NhZmVzL2ZpeHR1cmVzL2Rlcml2YWJsZUVkMjU1MTlQdWIuanNvbi4gRm91ciBpbmRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpc1xuLy8gZm9ybWF0IHdpbGwgb3RoZXJ3aXNlIGRyaWZ0LCBhbmQgdGhlIGZhaWx1cmUgbW9kZSBpcyB1bnJlY292ZXJhYmxlIHdhbGxldHMuXG5pbXBvcnQgKiBhcyBmaXh0dXJlIGZyb20gJy4vZml4dHVyZXMvZGVyaXZhYmxlRWQyNTUxOVB1Yi5qc29uJztcblxuY29uc3QgUFVCTElDX0tFWSA9IEJ1ZmZlci5hbGxvYygzMik7XG5jb25zdCBDSEFJTl9DT0RFID0gQnVmZmVyLmFsbG9jKDMyLCAweGFiKTtcbmNvbnN0IFJPT1RfUFVCID0gZW5jb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihQVUJMSUNfS0VZLCBDSEFJTl9DT0RFKTtcbmNvbnN0IFJPT1RfS0VZQ0hBSU4gPSBCdWZmZXIuY29uY2F0KFtQVUJMSUNfS0VZLCBDSEFJTl9DT0RFXSkudG9TdHJpbmcoJ2hleCcpO1xuY29uc3QgU1RSS0VZX1BVQkxJQyA9ICdHQTVXVUo1NFoyM0tJTExDVU9VTkFLVFBCVlpXS01RVk80TzZFUTVHSExBRVJJTUxMSE5DU0tZSCc7XG5jb25zdCBTVFJLRVlfU0VFRCA9ICdTQUFBQ0FRREFRQ1FNQllJQkVGQVdEQU5CWUhSQUVJU0NNS0JLRlFYREFNUlVHWTREVVBCNk5LSSc7XG5cbmRlc2NyaWJlKCdkZXJpdmFibGVFZDI1NTE5UHViJywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnYmFzZTMyIHJvb3QgZm9ybWF0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdlbmNvZGVzIDMyLWJ5dGUgcHVibGljIGtleSBwbHVzIDMyLWJ5dGUgY2hhaW4gY29kZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIERFUklWQUJMRV9FRDI1NTE5X0NIQUlOX0NPREVfQllURVMuc2hvdWxkLmVxdWFsKDMyKTtcbiAgICAgIERFUklWQUJMRV9FRDI1NTE5X1BVQl9MRU5HVEguc2hvdWxkLmVxdWFsKDEwMyk7XG4gICAgICBST09UX1BVQi5zaG91bGQubWF0Y2goL15bQS1aMi03XXsxMDN9JC8pO1xuICAgICAgZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihST09UX1BVQikucHViLmVxdWFscyhQVUJMSUNfS0VZKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKFJPT1RfUFVCKS5jaGFpbkNvZGUuZXF1YWxzKENIQUlOX0NPREUpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdtYXRjaGVzIHRoZSBjb25zdGFudHMgcGlubmVkIGluIHRoZSBzaGFyZWQgZml4dHVyZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIERFUklWQUJMRV9FRDI1NTE5X1BVQl9MRU5HVEguc2hvdWxkLmVxdWFsKGZpeHR1cmUucm9vdFB1YkJhc2UzMkxlbmd0aCk7XG4gICAgICBERVJJVkFCTEVfRUQyNTUxOV9DSEFJTl9DT0RFX0JZVEVTLnNob3VsZC5lcXVhbChmaXh0dXJlLmNoYWluQ29kZUJ5dGVzKTtcbiAgICB9KTtcblxuICAgIGl0KCdnZW5lcmF0ZXMgcmF3IGNoYWluIGNvZGUgZm9yIHJvb3QgY29tcG9zaXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBnZW5lcmF0ZUVkMjU1MTlDaGFpbkNvZGUoKS5sZW5ndGguc2hvdWxkLmVxdWFsKDMyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2ZpeHR1cmUgdmVjdG9ycycsIGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKGNvbnN0IHZlY3RvciBvZiBmaXh0dXJlLnZhbGlkKSB7XG4gICAgICBpdChgcm91bmQtdHJpcHMgJHt2ZWN0b3IubmFtZX1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZSA9IGVuY29kZURlcml2YWJsZUVkMjU1MTlQdWIoXG4gICAgICAgICAgQnVmZmVyLmZyb20odmVjdG9yLnB1YiwgJ2hleCcpLFxuICAgICAgICAgIEJ1ZmZlci5mcm9tKHZlY3Rvci5jaGFpbkNvZGUsICdoZXgnKVxuICAgICAgICApO1xuICAgICAgICBjb21wb3NpdGUuc2hvdWxkLmVxdWFsKHZlY3Rvci5jb21wb3NpdGUpO1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1Yih2ZWN0b3IuY29tcG9zaXRlKTtcbiAgICAgICAgZGVjb2RlZC5wdWIudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbCh2ZWN0b3IucHViKTtcbiAgICAgICAgZGVjb2RlZC5jaGFpbkNvZGUudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbCh2ZWN0b3IuY2hhaW5Db2RlKTtcbiAgICAgICAgaXNEZXJpdmFibGVFZDI1NTE5UHViKHZlY3Rvci5jb21wb3NpdGUpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdmVjdG9yIG9mIGZpeHR1cmUuaW52YWxpZENvbXBvc2l0ZSkge1xuICAgICAgaXQoYHJlamVjdHMgJHt2ZWN0b3IubmFtZX1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlzRGVyaXZhYmxlRWQyNTUxOVB1Yih2ZWN0b3IuY29tcG9zaXRlKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgICAoKCkgPT4gZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1Yih2ZWN0b3IuY29tcG9zaXRlKSkuc2hvdWxkLnRocm93KC9JbnZhbGlkIGRlcml2YWJsZSBlZDI1NTE5IHB1Yi8pO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBkZXNjcmliZSgncmF3IHB1YmxpYyBzb2Z0IGRlcml2YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2Rlcml2ZXMgYSBkZXRlcm1pbmlzdGljIHB1YmxpYyBrZXkgYW5kIGRpc2NhcmRzIHRoZSBjaGlsZCBjaGFpbiBjb2RlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZWRkc2EgPSBhd2FpdCBFZGRzYS5pbml0aWFsaXplKGF3YWl0IEVkMjU1MTlCSVAzMi5pbml0aWFsaXplKCkpO1xuICAgICAgY29uc3QgZGVyaXZlZCA9IGVkZHNhLmRlcml2ZVVuaGFyZGVuZWQoUk9PVF9LRVlDSEFJTiwgJ20vNycpO1xuICAgICAgZGVyaXZlZC5sZW5ndGguc2hvdWxkLmVxdWFsKDEyOCk7XG4gICAgICBkZXJpdmVkLnNsaWNlKDAsIDY0KS5zaG91bGQubWF0Y2goL15bMC05YS1mXXs2NH0kLyk7XG4gICAgICBkZXJpdmVkLnNsaWNlKDY0KS5zaG91bGQubWF0Y2goL15bMC05YS1mXXs2NH0kLyk7XG4gICAgICAoYXdhaXQgc29mdERlcml2ZUNoaWxkUHViRWQyNTUxOShST09UX1BVQiwgNykpLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoZGVyaXZlZC5zbGljZSgwLCA2NCkpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIGdvbGRlbiB2ZWN0b3JzIGJlbG93IHBpbiB0aGUgdW5oYXJkZW5lZCBkZXJpdmF0aW9uIG91dHB1dCBzaGFyZWQgY3Jvc3MtcmVwbyB3aXRoXG4gICAgLy8gd2FsbGV0LXBsYXRmb3JtOiBhIGRpdmVyZ2VudCBpbXBsZW1lbnRhdGlvbiBkZXJpdmVzIGNvLXNpZ25lciBrZXlzIG5vYm9keSBlbHNlIGNhblxuICAgIC8vIHJlcHJvZHVjZSwgcGVybWFuZW50bHkgYnJpY2tpbmcgdGhlIHdhbGxldHMgbWludGVkIHdpdGggaXQuXG4gICAgZm9yIChjb25zdCB2ZWN0b3Igb2YgZml4dHVyZS5zb2Z0RGVyaXZhdGlvbikge1xuICAgICAgaXQoYGRlcml2ZXMgdGhlIHBpbm5lZCBnb2xkZW4gY2hpbGQ6ICR7dmVjdG9yLm5hbWV9YCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGF3YWl0IHNvZnREZXJpdmVDaGlsZFB1YkVkMjU1MTkodmVjdG9yLmNvbXBvc2l0ZSwgdmVjdG9yLmluZGV4KTtcbiAgICAgICAgY2hpbGQudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbCh2ZWN0b3IuY2hpbGRQdWIpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXQoJ3JlamVjdHMgYSBoYXJkZW5lZCBvciBvdXQtb2YtcmFuZ2UgaW5kZXgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBzb2Z0RGVyaXZlQ2hpbGRQdWJFZDI1NTE5KFJPT1RfUFVCLCAtMSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbm9uLWhhcmRlbmVkLyk7XG4gICAgICBhd2FpdCBzb2Z0RGVyaXZlQ2hpbGRQdWJFZDI1NTE5KFJPT1RfUFVCLCAweDgwMDAwMDAwKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9ub24taGFyZGVuZWQvKTtcbiAgICAgIGF3YWl0IHNvZnREZXJpdmVDaGlsZFB1YkVkMjU1MTkoUk9PVF9QVUIsIDEuNSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbm9uLWhhcmRlbmVkLyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIG1hbGZvcm1lZCByb290JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgc29mdERlcml2ZUNoaWxkUHViRWQyNTUxOShmaXh0dXJlLmludmFsaWRDb21wb3NpdGVbMV0uY29tcG9zaXRlLCAwKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAvSW52YWxpZCBkZXJpdmFibGUgZWQyNTUxOSBwdWIvXG4gICAgICApO1xuICAgICAgYXdhaXQgc29mdERlcml2ZUNoaWxkUHViRWQyNTUxOShTVFJLRVlfUFVCTElDLCAwKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIGRlcml2YWJsZSBlZDI1NTE5IHB1Yi8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnU3RlbGxhciB1c2VyLWtleSBjb2RlY3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2tlZXBzIFN0ZWxsYXIgZW5jb2Rpbmcgc2VwYXJhdGUgZnJvbSB0aGUgbmV1dHJhbCByb290IGZvcm1hdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlzVmFsaWRFZDI1NTE5U3RyS2V5UHVibGljS2V5KFNUUktFWV9QVUJMSUMpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIGVuY29kZUVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoZGVjb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleShTVFJLRVlfUFVCTElDKSkuc2hvdWxkLmVxdWFsKFNUUktFWV9QVUJMSUMpO1xuICAgICAgZGVjb2RlRWQyNTUxOVN0cktleVNlY3JldFNlZWQoU1RSS0VZX1NFRUQpLmxlbmd0aC5zaG91bGQuZXF1YWwoMzIpO1xuICAgICAgaXNEZXJpdmFibGVFZDI1NTE5UHViKFNUUktFWV9QVUJMSUMpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBpc0NoZWNrc3VtVmFsaWRTdHJLZXlFZDI1NTE5UHViKFNUUktFWV9QVUJMSUMpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGEgcHVibGljIGtleSB3aXRoIGEgY29ycnVwdGVkIGNoZWNrc3VtJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoJ0dBNVdVSjU0WjIzS0lMTENVT1VOQUtUUEJWWldLTVFWTzRPNkVRNUdITEFFUklNTExITkNTS1lBJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGEgc2VjcmV0IHNlZWQgd2hlcmUgYSBwdWJsaWMga2V5IGlzIHJlcXVpcmVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoJ1NBNVdVSjU0WjIzS0lMTENVT1VOQUtUUEJWWldLTVFWTzRPNkVRNUdITEFFUklNTExITkNTS1lIJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgICgoKSA9PiBkZWNvZGVFZDI1NTE5U3RyS2V5UHVibGljS2V5KCdTQTVXVUo1NFoyM0tJTExDVU9VTkFLVFBCVlpXS01RVk80TzZFUTVHSExBRVJJTUxMSE5DU0tZSCcpKS5zaG91bGQudGhyb3coXG4gICAgICAgIC9TdHJLZXkgcHVibGljIGtleS9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIG5vbi1iYXNlMzIgY2hhcmFjdGVyLCB0aGUgZW1wdHkgc3RyaW5nLCBhbmQgbG93ZXJjYXNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoJ0dBNVdVSjU0WjIzS0lMTENVT1VOQUtUUEJWWldLTVFWTzRPNkVRNUdITEFFUklNTExITkNTS1kxJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgIGlzVmFsaWRFZDI1NTE5U3RyS2V5UHVibGljS2V5KCcnKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoU1RSS0VZX1BVQkxJQy50b0xvd2VyQ2FzZSgpKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19