@bitgo-beta/sdk-coin-kaspa 0.0.1-beta.21 → 0.0.1-beta.211

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 (49) hide show
  1. package/README.md +224 -33
  2. package/dist/src/kaspa.d.ts +86 -18
  3. package/dist/src/kaspa.d.ts.map +1 -1
  4. package/dist/src/kaspa.js +119 -31
  5. package/dist/src/lib/constants.d.ts +38 -0
  6. package/dist/src/lib/constants.d.ts.map +1 -1
  7. package/dist/src/lib/constants.js +56 -5
  8. package/dist/src/lib/iface.d.ts +28 -17
  9. package/dist/src/lib/iface.d.ts.map +1 -1
  10. package/dist/src/lib/iface.js +1 -1
  11. package/dist/src/lib/index.d.ts +2 -0
  12. package/dist/src/lib/index.d.ts.map +1 -1
  13. package/dist/src/lib/index.js +4 -2
  14. package/dist/src/lib/keyPair.d.ts +6 -2
  15. package/dist/src/lib/keyPair.d.ts.map +1 -1
  16. package/dist/src/lib/keyPair.js +7 -4
  17. package/dist/src/lib/pskt.d.ts +257 -0
  18. package/dist/src/lib/pskt.d.ts.map +1 -0
  19. package/dist/src/lib/pskt.js +439 -0
  20. package/dist/src/lib/sighash.d.ts +34 -13
  21. package/dist/src/lib/sighash.d.ts.map +1 -1
  22. package/dist/src/lib/sighash.js +115 -56
  23. package/dist/src/lib/transaction.d.ts +94 -6
  24. package/dist/src/lib/transaction.d.ts.map +1 -1
  25. package/dist/src/lib/transaction.js +199 -21
  26. package/dist/src/lib/transactionBuilder.d.ts +22 -0
  27. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  28. package/dist/src/lib/transactionBuilder.js +53 -5
  29. package/dist/src/lib/transactionBuilderFactory.d.ts +8 -3
  30. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  31. package/dist/src/lib/transactionBuilderFactory.js +14 -4
  32. package/dist/src/lib/utils.d.ts +17 -3
  33. package/dist/src/lib/utils.d.ts.map +1 -1
  34. package/dist/src/lib/utils.js +45 -11
  35. package/dist/src/register.js +2 -2
  36. package/dist/test/fixtures/kaspa.fixtures.d.ts +12 -0
  37. package/dist/test/fixtures/kaspa.fixtures.d.ts.map +1 -1
  38. package/dist/test/fixtures/kaspa.fixtures.js +76 -11
  39. package/dist/test/unit/coin.test.js +129 -9
  40. package/dist/test/unit/keyPair.test.js +35 -1
  41. package/dist/test/unit/pskt.test.d.ts +15 -0
  42. package/dist/test/unit/pskt.test.d.ts.map +1 -0
  43. package/dist/test/unit/pskt.test.js +383 -0
  44. package/dist/test/unit/transaction.test.js +291 -11
  45. package/dist/test/unit/transactionBuilder.test.js +16 -3
  46. package/dist/test/unit/transactionFlow.test.js +67 -2
  47. package/dist/test/unit/utils.test.js +63 -4
  48. package/dist/tsconfig.tsbuildinfo +1 -1
  49. package/package.json +6 -5
@@ -165,14 +165,14 @@ describe('Kaspa TransactionBuilder', function () {
165
165
  const tx = (await builder.build());
166
166
  builder.sign({ key: kaspa_fixtures_1.KEYS.prv });
167
167
  assert_1.default.ok(tx.signature[0].length > 0, 'input should be signed');
168
- assert_1.default.equal(tx.signature[0].length, 130, 'Schnorr sig should be 65 bytes / 130 hex chars');
168
+ assert_1.default.equal(tx.signature[0].length, 132, 'signatureScript should be 66 bytes / 132 hex chars (push opcode + sig + sighash)');
169
169
  });
170
170
  it('should sign all inputs of a multi-input transaction', async function () {
171
171
  builder.addInputs([kaspa_fixtures_1.UTXOS.simple, kaspa_fixtures_1.UTXOS.second]).to(kaspa_fixtures_1.ADDRESSES.recipient, '299998000').fee('2000');
172
172
  const tx = (await builder.build());
173
173
  builder.sign({ key: kaspa_fixtures_1.KEYS.prv });
174
174
  assert_1.default.equal(tx.signature.length, 2);
175
- assert_1.default.ok(tx.signature.every((s) => s.length === 130));
175
+ assert_1.default.ok(tx.signature.every((s) => s.length === 132));
176
176
  });
177
177
  it('should throw SigningError when private key is missing', async function () {
178
178
  builder.addInput(kaspa_fixtures_1.UTXOS.simple).to(kaspa_fixtures_1.ADDRESSES.recipient, '99998000');
@@ -205,6 +205,19 @@ describe('Kaspa TransactionBuilderFactory', function () {
205
205
  assert_1.default.ok(builder instanceof transactionBuilder_1.TransactionBuilder);
206
206
  });
207
207
  });
208
+ describe('getTransferBuilder', function () {
209
+ it('should return a new TransactionBuilder (same as getBuilder)', function () {
210
+ const builder = factory.getTransferBuilder();
211
+ assert_1.default.ok(builder instanceof transactionBuilder_1.TransactionBuilder);
212
+ });
213
+ it('should build a valid transaction', async function () {
214
+ const builder = factory.getTransferBuilder();
215
+ builder.addInput(kaspa_fixtures_1.UTXOS.simple).to(kaspa_fixtures_1.ADDRESSES.recipient, '99998000').fee('2000');
216
+ const tx = (await builder.build());
217
+ assert_1.default.equal(tx.txData.inputs.length, 1);
218
+ assert_1.default.equal(tx.txData.outputs.length, 1);
219
+ });
220
+ });
208
221
  describe('from', function () {
209
222
  it('should reconstruct a builder from a serialized transaction hex', async function () {
210
223
  const originalBuilder = factory.getBuilder();
@@ -217,4 +230,4 @@ describe('Kaspa TransactionBuilderFactory', function () {
217
230
  });
218
231
  });
219
232
  });
220
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsaURBQTRDO0FBQzVDLDJEQUF3RDtBQUN4RCx5RUFBc0U7QUFDdEUsdUZBQW9GO0FBQ3BGLHVEQUFzRDtBQUN0RCwrREFBb0U7QUFFcEUsTUFBTSxVQUFVLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUV0QyxRQUFRLENBQUMsMEJBQTBCLEVBQUU7SUFDbkMsSUFBSSxPQUEyQixDQUFDO0lBRWhDLFVBQVUsQ0FBQztRQUNULE9BQU8sR0FBRyxJQUFJLHVDQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFFBQVEsRUFBRTtRQUNqQixFQUFFLENBQUMsd0RBQXdELEVBQUU7WUFDM0QsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQywwQkFBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hELGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRTtZQUMzQyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLE9BQU8sQ0FBQyxNQUFNLENBQUMsMEJBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQyxDQUFDLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLElBQUksRUFBRTtRQUNiLEVBQUUsQ0FBQywrQ0FBK0MsRUFBRTtZQUNsRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMs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TUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBZ0IsQ0FBQztZQUMxRCxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFdkIsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QyxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU0sY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFnQixDQUFDO1lBRWhFLGdCQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnknO1xuaW1wb3J0IHsgREVGQVVMVF9GRUUgfSBmcm9tICcuLi8uLi9zcmMvbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBBRERSRVNTRVMsIEtFWVMsIFVUWE9TIH0gZnJvbSAnLi4vZml4dHVyZXMva2FzcGEuZml4dHVyZXMnO1xuXG5jb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KCdrYXNwYScpO1xuXG5kZXNjcmliZSgnS2FzcGEgVHJhbnNhY3Rpb25CdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICBsZXQgYnVpbGRlcjogVHJhbnNhY3Rpb25CdWlsZGVyO1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5Db25maWcpO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2VuZGVyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc2V0IHRoZSBzZW5kZXIgYWRkcmVzcyBhbmQgcmV0dXJuIHRoaXMgKGZsdWVudCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyLnNlbmRlcihBRERSRVNTRVMuc2VuZGVyKTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIGJ1aWxkZXIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBpbnZhbGlkIHNlbmRlciBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuc2VuZGVyKEFERFJFU1NFUy5pbnZhbGlkKTtcbiAgICAgIH0sIC9JbnZhbGlkIEthc3BhIGFkZHJlc3MvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RvJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWRkIGFuIG91dHB1dCBhbmQgcmV0dXJuIHRoaXMgKGZsdWVudCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyLnRvKEFERFJFU1NFUy5yZWNpcGllbnQsICcxMDAwJyk7XG4gICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBidWlsZGVyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgb24gaW52YWxpZCByZWNpcGllbnQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnRvKCdub3RhbmFkZHJlc3MnLCAnMTAwMCcpO1xuICAgICAgfSwgL0ludmFsaWQgS2FzcGEvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2ZlZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHNldCB0aGUgZmVlIGFuZCByZXR1cm4gdGhpcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXIuZmVlKCc1MDAwJyk7XG4gICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBidWlsZGVyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVmYXVsdCB0byBERUZBVUxUX0ZFRScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnOTk5OTgwMDAnKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLmZlZSwgREVGQVVMVF9GRUUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkSW5wdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhZGQgYSBVVFhPIGlucHV0IGFuZCByZXR1cm4gdGhpcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIGJ1aWxkZXIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHRyYW5zYWN0aW9uSWQgaXMgbWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFkZElucHV0KHsgLi4uVVRYT1Muc2ltcGxlLCB0cmFuc2FjdGlvbklkOiAnJyB9KTtcbiAgICAgIH0sIC9JbnZhbGlkIFVUWE8vKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiB0cmFuc2FjdGlvbkluZGV4IGlzIHVuZGVmaW5lZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFkZElucHV0KHsgLi4uVVRYT1Muc2ltcGxlLCB0cmFuc2FjdGlvbkluZGV4OiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBudW1iZXIgfSk7XG4gICAgICB9LCAvSW52YWxpZCBVVFhPLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhZGRJbnB1dHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhZGQgbXVsdGlwbGUgaW5wdXRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlci5hZGRJbnB1dHMoW1VUWE9TLnNpbXBsZSwgVVRYT1Muc2Vjb25kXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2YWxpZGF0ZVRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBubyBpbnB1dHMgYXJlIHNldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIudG8oQUREUkVTU0VTLnJlY2lwaWVudCwgJzEwMDAnKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKTtcbiAgICAgIH0sIC9BdCBsZWFzdCBvbmUgVVRYTyBpbnB1dC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIG5vIG91dHB1dHMgYXJlIHNldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKTtcbiAgICAgIH0sIC9BdCBsZWFzdCBvbmUgb3V0cHV0Lyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCB0aHJvdyB3aXRoIHZhbGlkIGlucHV0cyBhbmQgb3V0cHV0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnOTk5OTgwMDAnKTtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmFsaWRhdGVBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgbm90IHRocm93IGZvciBhIHZhbGlkIGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci52YWxpZGF0ZUFkZHJlc3MoeyBhZGRyZXNzOiBBRERSRVNTRVMudmFsaWQgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZm9yIGFuIGludmFsaWQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlQWRkcmVzcyh7IGFkZHJlc3M6ICdpbnZhbGlkJyB9KTtcbiAgICAgIH0sIC9JbnZhbGlkIEthc3BhIGFkZHJlc3MvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlUmF3VHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBub3QgdGhyb3cgZm9yIHZhbGlkIGhleCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnOTk5OTgwMDAnKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBoZXggPSB0eC50b0hleCgpO1xuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihoZXgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGZvciBpbnZhbGlkIGhleCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oJ25vdHZhbGlkaGV4ISEnKTtcbiAgICAgIH0sIC9JbnZhbGlkIHJhdyBLYXNwYS8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmFsaWRhdGVWYWx1ZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIG5vdCB0aHJvdyBmb3Igbm9uLW5lZ2F0aXZlIHZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgQmlnTnVtYmVyID0gcmVxdWlyZSgnYmlnbnVtYmVyLmpzJykuZGVmYXVsdCA/PyByZXF1aXJlKCdiaWdudW1iZXIuanMnKTtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlVmFsdWUobmV3IEJpZ051bWJlcigwKSk7XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlVmFsdWUobmV3IEJpZ051bWJlcigxMDAwMDAwKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZm9yIG5lZ2F0aXZlIHZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgQmlnTnVtYmVyID0gcmVxdWlyZSgnYmlnbnVtYmVyLmpzJykuZGVmYXVsdCA/PyByZXF1aXJlKCdiaWdudW1iZXIuanMnKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlVmFsdWUobmV3IEJpZ051bWJlcigtMSkpO1xuICAgICAgfSwgL25lZ2F0aXZlLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdmFsaWQgdHJhbnNhY3Rpb24gZnJvbSBpbnB1dHMgKyBvdXRwdXRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlci5hZGRJbnB1dChVVFhPUy5zaW1wbGUpLnRvKEFERFJFU1NFUy5yZWNpcGllbnQsICc5OTk5ODAwMCcpLmZlZSgnMjAwMCcpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcblxuICAgICAgYXNzZXJ0Lm9rKHR4IGluc3RhbmNlb2YgVHJhbnNhY3Rpb24pO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS52ZXJzaW9uLCAwKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEub3V0cHV0c1swXS5hbW91bnQsICc5OTk5ODAwMCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS5mZWUsICcyMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgbXVsdGktaW5wdXQgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLmFkZElucHV0cyhbVVRYT1Muc2ltcGxlLCBVVFhPUy5zZWNvbmRdKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnMjk5OTk4MDAwJykuZmVlKCcyMDAwJyk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuXG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLmlucHV0cy5sZW5ndGgsIDIpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS5vdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGluY2x1ZGUgYWxsIHN0YW5kYXJkIGZpZWxkcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnOTk5OTgwMDAnKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG5cbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEudmVyc2lvbiwgMCk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLmxvY2tUaW1lLCAnMCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS5zdWJuZXR3b3JrSWQsICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc2lnbiB0aGUgYnVpbHQgdHJhbnNhY3Rpb24gdmlhIHNpZ25JbXBsZW1lbnRhdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnOTk5OTgwMDAnKS5mZWUoJzIwMDAnKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IEtFWVMucHJ2IH0pO1xuICAgICAgYXNzZXJ0Lm9rKHR4LnNpZ25hdHVyZVswXS5sZW5ndGggPiAwLCAnaW5wdXQgc2hvdWxkIGJlIHNpZ25lZCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnNpZ25hdHVyZVswXS5sZW5ndGgsIDEzMCwgJ1NjaG5vcnIgc2lnIHNob3VsZCBiZSA2NSBieXRlcyAvIDEzMCBoZXggY2hhcnMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2lnbiBhbGwgaW5wdXRzIG9mIGEgbXVsdGktaW5wdXQgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLmFkZElucHV0cyhbVVRYT1Muc2ltcGxlLCBVVFhPUy5zZWNvbmRdKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnMjk5OTk4MDAwJykuZmVlKCcyMDAwJyk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiBLRVlTLnBydiB9KTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5zaWduYXR1cmUubGVuZ3RoLCAyKTtcbiAgICAgIGFzc2VydC5vayh0eC5zaWduYXR1cmUuZXZlcnkoKHMpID0+IHMubGVuZ3RoID09PSAxMzApKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgU2lnbmluZ0Vycm9yIHdoZW4gcHJpdmF0ZSBrZXkgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnOTk5OTgwMDAnKTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6ICcnIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmcm9tIChyZWJ1aWxkIGZyb20gaGV4KScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJlY29uc3RydWN0IGEgYnVpbGRlciBmcm9tIGEgc2VyaWFsaXplZCB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnOTk5OTgwMDAnKS5mZWUoJzIwMDAnKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBoZXggPSB0eC50b0hleCgpO1xuXG4gICAgICBjb25zdCBuZXdCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlcihjb2luQ29uZmlnKTtcbiAgICAgIG5ld0J1aWxkZXIuZnJvbShoZXgpO1xuICAgICAgY29uc3QgcmVidWlsdCA9IChhd2FpdCBuZXdCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlYnVpbHQudG9Kc29uKCksIHR4LnRvSnNvbigpKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ0thc3BhIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnknLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBmYWN0b3J5OiBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5O1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2luQ29uZmlnKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0QnVpbGRlcigpO1xuICAgICAgYXNzZXJ0Lm9rKGJ1aWxkZXIgaW5zdGFuY2VvZiBUcmFuc2FjdGlvbkJ1aWxkZXIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZnJvbScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJlY29uc3RydWN0IGEgYnVpbGRlciBmcm9tIGEgc2VyaWFsaXplZCB0cmFuc2FjdGlvbiBoZXgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEJ1aWxkZXIgPSBmYWN0b3J5LmdldEJ1aWxkZXIoKTtcbiAgICAgIG9yaWdpbmFsQnVpbGRlci5hZGRJbnB1dChVVFhPUy5zaW1wbGUpLnRvKEFERFJFU1NFUy5yZWNpcGllbnQsICc5OTk5ODAwMCcpLmZlZSgnMjAwMCcpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgb3JpZ2luYWxCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgaGV4ID0gdHgudG9IZXgoKTtcblxuICAgICAgY29uc3QgcmVidWlsdEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20oaGV4KTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IChhd2FpdCByZWJ1aWx0QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZWJ1aWx0VHgudG9Kc29uKCksIHR4LnRvSnNvbigpKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
233
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsaURBQTRDO0FBQzVDLDJEQUF3RDtBQUN4RCx5RUFBc0U7QUFDdEUsdUZBQW9GO0FBQ3BGLHVEQUFzRDtBQUN0RCwrREFBb0U7QUFFcEUsTUFBTSxVQUFVLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUV0QyxRQUFRLENBQUMsMEJBQTBCLEVBQUU7SUFDbkMsSUFBSSxPQUEyQixDQUFDO0lBRWhDLFVBQVUsQ0FBQztRQUNULE9BQU8sR0FBRyxJQUFJLHVDQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFFBQVEsRUFBRTtRQUNqQixFQUFFLENBQUMsd0RBQXdELEVBQUU7WUFDM0QsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQywwQkFBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hELGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRTtZQUMzQyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLE9BQU8sQ0FBQyxNQUFNLENBQUMsMEJBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQyxDQUFDLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLElBQUksRUFBRTtRQUNiLEVBQUUsQ0FBQywrQ0FBK0MsRUFBRTtZQUNsRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMs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LENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5JztcbmltcG9ydCB7IERFRkFVTFRfRkVFIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQUREUkVTU0VTLCBLRVlTLCBVVFhPUyB9IGZyb20gJy4uL2ZpeHR1cmVzL2thc3BhLmZpeHR1cmVzJztcblxuY29uc3QgY29pbkNvbmZpZyA9IGNvaW5zLmdldCgna2FzcGEnKTtcblxuZGVzY3JpYmUoJ0thc3BhIFRyYW5zYWN0aW9uQnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJ1aWxkZXI6IFRyYW5zYWN0aW9uQnVpbGRlcjtcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBidWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlcihjb2luQ29uZmlnKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NlbmRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHNldCB0aGUgc2VuZGVyIGFkZHJlc3MgYW5kIHJldHVybiB0aGlzIChmbHVlbnQpJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYnVpbGRlci5zZW5kZXIoQUREUkVTU0VTLnNlbmRlcik7XG4gICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBidWlsZGVyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgb24gaW52YWxpZCBzZW5kZXIgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnNlbmRlcihBRERSRVNTRVMuaW52YWxpZCk7XG4gICAgICB9LCAvSW52YWxpZCBLYXNwYSBhZGRyZXNzLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd0bycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFkZCBhbiBvdXRwdXQgYW5kIHJldHVybiB0aGlzIChmbHVlbnQpJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYnVpbGRlci50byhBRERSRVNTRVMucmVjaXBpZW50LCAnMTAwMCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgYnVpbGRlcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IG9uIGludmFsaWQgcmVjaXBpZW50IGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci50bygnbm90YW5hZGRyZXNzJywgJzEwMDAnKTtcbiAgICAgIH0sIC9JbnZhbGlkIEthc3BhLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmZWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgdGhlIGZlZSBhbmQgcmV0dXJuIHRoaXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyLmZlZSgnNTAwMCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgYnVpbGRlcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRlZmF1bHQgdG8gREVGQVVMVF9GRUUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLmFkZElucHV0KFVUWE9TLnNpbXBsZSkudG8oQUREUkVTU0VTLnJlY2lwaWVudCwgJzk5OTk4MDAwJyk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS5mZWUsIERFRkFVTFRfRkVFKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZElucHV0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWRkIGEgVVRYTyBpbnB1dCBhbmQgcmV0dXJuIHRoaXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyLmFkZElucHV0KFVUWE9TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBidWlsZGVyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiB0cmFuc2FjdGlvbklkIGlzIG1pc3NpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hZGRJbnB1dCh7IC4uLlVUWE9TLnNpbXBsZSwgdHJhbnNhY3Rpb25JZDogJycgfSk7XG4gICAgICB9LCAvSW52YWxpZCBVVFhPLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gdHJhbnNhY3Rpb25JbmRleCBpcyB1bmRlZmluZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hZGRJbnB1dCh7IC4uLlVUWE9TLnNpbXBsZSwgdHJhbnNhY3Rpb25JbmRleDogdW5kZWZpbmVkIGFzIHVua25vd24gYXMgbnVtYmVyIH0pO1xuICAgICAgfSwgL0ludmFsaWQgVVRYTy8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkSW5wdXRzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWRkIG11bHRpcGxlIGlucHV0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuYWRkSW5wdXRzKFtVVFhPUy5zaW1wbGUsIFVUWE9TLnNlY29uZF0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmFsaWRhdGVUcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gbm8gaW5wdXRzIGFyZSBzZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLnRvKEFERFJFU1NFUy5yZWNpcGllbnQsICcxMDAwJyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKCk7XG4gICAgICB9LCAvQXQgbGVhc3Qgb25lIFVUWE8gaW5wdXQvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBubyBvdXRwdXRzIGFyZSBzZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLmFkZElucHV0KFVUWE9TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKCk7XG4gICAgICB9LCAvQXQgbGVhc3Qgb25lIG91dHB1dC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgdGhyb3cgd2l0aCB2YWxpZCBpbnB1dHMgYW5kIG91dHB1dHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLmFkZElucHV0KFVUWE9TLnNpbXBsZSkudG8oQUREUkVTU0VTLnJlY2lwaWVudCwgJzk5OTk4MDAwJyk7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlQWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIG5vdCB0aHJvdyBmb3IgYSB2YWxpZCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudmFsaWRhdGVBZGRyZXNzKHsgYWRkcmVzczogQUREUkVTU0VTLnZhbGlkIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGZvciBhbiBpbnZhbGlkIGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci52YWxpZGF0ZUFkZHJlc3MoeyBhZGRyZXNzOiAnaW52YWxpZCcgfSk7XG4gICAgICB9LCAvSW52YWxpZCBLYXNwYSBhZGRyZXNzLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgbm90IHRocm93IGZvciB2YWxpZCBoZXgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLmFkZElucHV0KFVUWE9TLnNpbXBsZSkudG8oQUREUkVTU0VTLnJlY2lwaWVudCwgJzk5OTk4MDAwJyk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgaGV4ID0gdHgudG9IZXgoKTtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oaGV4KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBmb3IgaW52YWxpZCBoZXgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKCdub3R2YWxpZGhleCEhJyk7XG4gICAgICB9LCAvSW52YWxpZCByYXcgS2FzcGEvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlVmFsdWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBub3QgdGhyb3cgZm9yIG5vbi1uZWdhdGl2ZSB2YWx1ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IEJpZ051bWJlciA9IHJlcXVpcmUoJ2JpZ251bWJlci5qcycpLmRlZmF1bHQgPz8gcmVxdWlyZSgnYmlnbnVtYmVyLmpzJyk7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci52YWxpZGF0ZVZhbHVlKG5ldyBCaWdOdW1iZXIoMCkpO1xuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci52YWxpZGF0ZVZhbHVlKG5ldyBCaWdOdW1iZXIoMTAwMDAwMCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGZvciBuZWdhdGl2ZSB2YWx1ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IEJpZ051bWJlciA9IHJlcXVpcmUoJ2JpZ251bWJlci5qcycpLmRlZmF1bHQgPz8gcmVxdWlyZSgnYmlnbnVtYmVyLmpzJyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci52YWxpZGF0ZVZhbHVlKG5ldyBCaWdOdW1iZXIoLTEpKTtcbiAgICAgIH0sIC9uZWdhdGl2ZS8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYnVpbGQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHZhbGlkIHRyYW5zYWN0aW9uIGZyb20gaW5wdXRzICsgb3V0cHV0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnOTk5OTgwMDAnKS5mZWUoJzIwMDAnKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG5cbiAgICAgIGFzc2VydC5vayh0eCBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEudmVyc2lvbiwgMCk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLmlucHV0cy5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS5vdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLm91dHB1dHNbMF0uYW1vdW50LCAnOTk5OTgwMDAnKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuZmVlLCAnMjAwMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIG11bHRpLWlucHV0IHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlci5hZGRJbnB1dHMoW1VUWE9TLnNpbXBsZSwgVVRYT1Muc2Vjb25kXSkudG8oQUREUkVTU0VTLnJlY2lwaWVudCwgJzI5OTk5ODAwMCcpLmZlZSgnMjAwMCcpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcblxuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS5pbnB1dHMubGVuZ3RoLCAyKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEub3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbmNsdWRlIGFsbCBzdGFuZGFyZCBmaWVsZHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLmFkZElucHV0KFVUWE9TLnNpbXBsZSkudG8oQUREUkVTU0VTLnJlY2lwaWVudCwgJzk5OTk4MDAwJyk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuXG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLnZlcnNpb24sIDApO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS5sb2NrVGltZSwgJzAnKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuc3VibmV0d29ya0lkLCAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2lnbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHNpZ24gdGhlIGJ1aWx0IHRyYW5zYWN0aW9uIHZpYSBzaWduSW1wbGVtZW50YXRpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLmFkZElucHV0KFVUWE9TLnNpbXBsZSkudG8oQUREUkVTU0VTLnJlY2lwaWVudCwgJzk5OTk4MDAwJykuZmVlKCcyMDAwJyk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiBLRVlTLnBydiB9KTtcbiAgICAgIGFzc2VydC5vayh0eC5zaWduYXR1cmVbMF0ubGVuZ3RoID4gMCwgJ2lucHV0IHNob3VsZCBiZSBzaWduZWQnKTtcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgdHguc2lnbmF0dXJlWzBdLmxlbmd0aCxcbiAgICAgICAgMTMyLFxuICAgICAgICAnc2lnbmF0dXJlU2NyaXB0IHNob3VsZCBiZSA2NiBieXRlcyAvIDEzMiBoZXggY2hhcnMgKHB1c2ggb3Bjb2RlICsgc2lnICsgc2lnaGFzaCknXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaWduIGFsbCBpbnB1dHMgb2YgYSBtdWx0aS1pbnB1dCB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuYWRkSW5wdXRzKFtVVFhPUy5zaW1wbGUsIFVUWE9TLnNlY29uZF0pLnRvKEFERFJFU1NFUy5yZWNpcGllbnQsICcyOTk5OTgwMDAnKS5mZWUoJzIwMDAnKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IEtFWVMucHJ2IH0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnNpZ25hdHVyZS5sZW5ndGgsIDIpO1xuICAgICAgYXNzZXJ0Lm9rKHR4LnNpZ25hdHVyZS5ldmVyeSgocykgPT4gcy5sZW5ndGggPT09IDEzMikpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBTaWduaW5nRXJyb3Igd2hlbiBwcml2YXRlIGtleSBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlci5hZGRJbnB1dChVVFhPUy5zaW1wbGUpLnRvKEFERFJFU1NFUy5yZWNpcGllbnQsICc5OTk5ODAwMCcpO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogJycgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Zyb20gKHJlYnVpbGQgZnJvbSBoZXgpJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmVjb25zdHJ1Y3QgYSBidWlsZGVyIGZyb20gYSBzZXJpYWxpemVkIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlci5hZGRJbnB1dChVVFhPUy5zaW1wbGUpLnRvKEFERFJFU1NFUy5yZWNpcGllbnQsICc5OTk5ODAwMCcpLmZlZSgnMjAwMCcpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IGhleCA9IHR4LnRvSGV4KCk7XG5cbiAgICAgIGNvbnN0IG5ld0J1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5Db25maWcpO1xuICAgICAgbmV3QnVpbGRlci5mcm9tKGhleCk7XG4gICAgICBjb25zdCByZWJ1aWx0ID0gKGF3YWl0IG5ld0J1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVidWlsdC50b0pzb24oKSwgdHgudG9Kc29uKCkpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnS2FzcGEgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeScsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGZhY3Rvcnk6IFRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnk7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5Db25maWcpO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0QnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRCdWlsZGVyKCk7XG4gICAgICBhc3NlcnQub2soYnVpbGRlciBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uQnVpbGRlcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRUcmFuc2ZlckJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyIChzYW1lIGFzIGdldEJ1aWxkZXIpJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBhc3NlcnQub2soYnVpbGRlciBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uQnVpbGRlcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdmFsaWQgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnOTk5OTgwMDAnKS5mZWUoJzIwMDAnKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLmlucHV0cy5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS5vdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmcm9tJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmVjb25zdHJ1Y3QgYSBidWlsZGVyIGZyb20gYSBzZXJpYWxpemVkIHRyYW5zYWN0aW9uIGhleCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsQnVpbGRlciA9IGZhY3RvcnkuZ2V0QnVpbGRlcigpO1xuICAgICAgb3JpZ2luYWxCdWlsZGVyLmFkZElucHV0KFVUWE9TLnNpbXBsZSkudG8oQUREUkVTU0VTLnJlY2lwaWVudCwgJzk5OTk4MDAwJykuZmVlKCcyMDAwJyk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBvcmlnaW5hbEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBoZXggPSB0eC50b0hleCgpO1xuXG4gICAgICBjb25zdCByZWJ1aWx0QnVpbGRlciA9IGZhY3RvcnkuZnJvbShoZXgpO1xuICAgICAgY29uc3QgcmVidWlsdFR4ID0gKGF3YWl0IHJlYnVpbHRCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlYnVpbHRUeC50b0pzb24oKSwgdHgudG9Kc29uKCkpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -11,6 +11,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  const assert_1 = __importDefault(require("assert"));
13
13
  const statics_1 = require("@bitgo-beta/statics");
14
+ const secp256k1_1 = require("@bitgo-beta/secp256k1");
14
15
  const transactionBuilder_1 = require("../../src/lib/transactionBuilder");
15
16
  const transaction_1 = require("../../src/lib/transaction");
16
17
  const kaspa_fixtures_1 = require("../fixtures/kaspa.fixtures");
@@ -83,6 +84,70 @@ describe('Kaspa — End-to-End Transaction Flow', function () {
83
84
  const rebuiltPayload = rebuilt.toBroadcastFormat();
84
85
  assert_1.default.equal(rebuiltPayload, originalPayload, 'serialization should be deterministic');
85
86
  });
87
+ it('HSM flow — build unsigned → serialize → extract sighashes → apply external signatures → verify', async function () {
88
+ const prv = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
89
+ const pub = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
90
+ // Step 1: Build an unsigned 2-input transaction
91
+ const builder = new transactionBuilder_1.TransactionBuilder(coinConfig);
92
+ builder.addInputs([kaspa_fixtures_1.UTXOS.simple, kaspa_fixtures_1.UTXOS.second]).to(kaspa_fixtures_1.ADDRESSES.recipient, '299996000').fee('4000');
93
+ const unsignedTx = (await builder.build());
94
+ // Step 2: Serialize to hex — this is what gets sent to the HSM
95
+ const unsignedHex = unsignedTx.toHex();
96
+ assert_1.default.ok(unsignedTx.signature.every((s) => s === ''), 'must be unsigned before leaving SDK');
97
+ // Step 3: HSM receives the hex, deserializes it, reads per-input sighashes
98
+ const txForHsm = transaction_1.Transaction.fromHex(coinConfig.name, unsignedHex);
99
+ const sighashes = txForHsm.signablePayloads; // Buffer[2] — one message per input
100
+ assert_1.default.equal(sighashes.length, 2);
101
+ assert_1.default.ok(!sighashes[0].equals(sighashes[1]), 'each input has a distinct sighash');
102
+ // Step 4: HSM signs each sighash independently (Schnorr)
103
+ // In production this is a DKLS / HSM operation; here we use the raw key directly
104
+ const externalSig0 = Buffer.from(secp256k1_1.ecc.signSchnorr(sighashes[0], prv)); // 64 bytes
105
+ const externalSig1 = Buffer.from(secp256k1_1.ecc.signSchnorr(sighashes[1], prv)); // 64 bytes
106
+ assert_1.default.equal(externalSig0.length, 64);
107
+ assert_1.default.equal(externalSig1.length, 64);
108
+ assert_1.default.ok(!externalSig0.equals(externalSig1), 'signatures over distinct hashes must differ');
109
+ // Step 5: Apply the external signatures to a fresh deserialized tx
110
+ const txToSign = transaction_1.Transaction.fromHex(coinConfig.name, unsignedHex);
111
+ txToSign.addSignatureForInput(0, kaspa_fixtures_1.KEYS.pub, externalSig0);
112
+ txToSign.addSignatureForInput(1, kaspa_fixtures_1.KEYS.pub, externalSig1);
113
+ // Step 6: Cryptographically verify each input's Schnorr signature
114
+ assert_1.default.ok(txToSign.verifySignature(pub, 0), 'input[0] Schnorr signature must be valid');
115
+ assert_1.default.ok(txToSign.verifySignature(pub, 1), 'input[1] Schnorr signature must be valid');
116
+ // Step 7: Serialize the fully-signed tx for broadcast
117
+ const signedHex = txToSign.toHex();
118
+ const broadcast = txToSign.toBroadcastFormat();
119
+ const rpc = JSON.parse(broadcast);
120
+ assert_1.default.equal(rpc.inputs[0].signatureScript.length, 132, '66-byte script = 132 hex chars (push opcode + sig + sighash)');
121
+ assert_1.default.equal(rpc.inputs[1].signatureScript.length, 132);
122
+ // Step 8: Round-trip — reload from hex and confirm signatures are intact
123
+ const reloaded = transaction_1.Transaction.fromHex(coinConfig.name, signedHex);
124
+ assert_1.default.ok(reloaded.verifySignature(pub, 0), 'input[0] must still verify after round-trip');
125
+ assert_1.default.ok(reloaded.verifySignature(pub, 1), 'input[1] must still verify after round-trip');
126
+ });
127
+ it('should build and sign a transaction with multiple outputs (send + change)', async function () {
128
+ // Simulate a common real-world pattern: one recipient output + one change output
129
+ const builder = new transactionBuilder_1.TransactionBuilder(coinConfig);
130
+ builder
131
+ .addInput(kaspa_fixtures_1.UTXOS.simple) // 1 KASPA input
132
+ .to(kaspa_fixtures_1.ADDRESSES.recipient, '50000000') // send 0.5 KASPA
133
+ .to(kaspa_fixtures_1.ADDRESSES.sender, '49998000') // change back 0.49998 KASPA
134
+ .fee('2000');
135
+ const tx = (await builder.build());
136
+ assert_1.default.equal(tx.txData.inputs.length, 1);
137
+ assert_1.default.equal(tx.txData.outputs.length, 2);
138
+ assert_1.default.equal(tx.txData.outputs[0].amount, '50000000');
139
+ assert_1.default.equal(tx.txData.outputs[1].amount, '49998000');
140
+ // Sign and verify both outputs survive serialization
141
+ tx.sign(PRV_KEY_BUF);
142
+ const explanation = tx.explainTransaction();
143
+ assert_1.default.equal(explanation.outputs.length, 2);
144
+ assert_1.default.equal(explanation.outputAmount, '99998000'); // sum of both outputs
145
+ // Round-trip
146
+ const reloaded = transaction_1.Transaction.fromHex(coinConfig.name, tx.toHex());
147
+ assert_1.default.equal(reloaded.txData.outputs.length, 2);
148
+ assert_1.default.equal(reloaded.txData.outputs[0].amount, '50000000');
149
+ assert_1.default.equal(reloaded.txData.outputs[1].amount, '49998000');
150
+ });
86
151
  it('should produce a valid RPC-submittable JSON broadcast payload', async function () {
87
152
  const builder = new transactionBuilder_1.TransactionBuilder(coinConfig);
88
153
  builder.addInput(kaspa_fixtures_1.UTXOS.simple).to(kaspa_fixtures_1.ADDRESSES.recipient, '99998000').fee('2000');
@@ -98,8 +163,8 @@ describe('Kaspa — End-to-End Transaction Flow', function () {
98
163
  assert_1.default.ok(parsed.outputs.length > 0, 'must have at least one output');
99
164
  for (const input of parsed.inputs) {
100
165
  assert_1.default.ok(input.signatureScript, 'signed input must have signatureScript');
101
- assert_1.default.equal(input.signatureScript.length, 130, 'Schnorr sig should be 65 bytes = 130 hex chars');
166
+ assert_1.default.equal(input.signatureScript.length, 132, '66-byte script = 132 hex chars (push opcode + sig + sighash)');
102
167
  }
103
168
  });
104
169
  });
105
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25GbG93LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25GbG93LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7OztBQUVILG9EQUE0QjtBQUM1QixpREFBNEM7QUFDNUMseUVBQXNFO0FBQ3RFLDJEQUF3RDtBQUN4RCwrREFBb0U7QUFFcEUsTUFBTSxVQUFVLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN0QyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRWpELFFBQVEsQ0FBQyxxQ0FBcUMsRUFBRTtJQUM5QyxFQUFFLENBQUMsNkVBQTZFLEVBQUUsS0FBSztRQUNyRixnQkFBZ0I7UUFDaEIsTUFBTSxPQUFPLEdBQUcsSUFBSSx1Q0FBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuRCxPQUFPLENBQUMsUUFBUSxDQUFDLHNCQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLDBCQUFTLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUvRSxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFnQixDQUFDO1FBQ2xELGdCQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSx5QkFBVyxFQUFFLHFDQUFxQyxDQUFDLENBQUM7UUFDNUUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2hFLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFD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TSxFQUFFLENBQUM7WUFDbEMsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDO1lBQzNFLGdCQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxnREFBZ0QsQ0FBQyxDQUFDO1FBQ3BHLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBLYXNwYSBFbmQtdG8tRW5kIFRyYW5zYWN0aW9uIEZsb3dcbiAqXG4gKiBDb3ZlcnM6IGJ1aWxkIOKGkiBzaWduIOKGkiBzZXJpYWxpemUg4oaSIGRlc2VyaWFsaXplIOKGkiB2ZXJpZnlcbiAqIEFsbCBvcGVyYXRpb25zIGFyZSBvZmZsaW5lIChubyBsaXZlIFJQQyBjYWxscykuXG4gKi9cblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBLRVlTLCBBRERSRVNTRVMsIFVUWE9TIH0gZnJvbSAnLi4vZml4dHVyZXMva2FzcGEuZml4dHVyZXMnO1xuXG5jb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KCdrYXNwYScpO1xuY29uc3QgUFJWX0tFWV9CVUYgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuXG5kZXNjcmliZSgnS2FzcGEg4oCUIEVuZC10by1FbmQgVHJhbnNhY3Rpb24gRmxvdycsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3Nob3VsZCBidWlsZCwgc2lnbiwgc2VyaWFsaXplLCBkZXNlcmlhbGl6ZSwgYW5kIHZlcmlmeSBhIHNpbXBsZSB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTdGVwIDE6IEJ1aWxkXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXIoY29pbkNvbmZpZyk7XG4gICAgYnVpbGRlci5hZGRJbnB1dChVVFhPUy5zaW1wbGUpLnRvKEFERFJFU1NFUy5yZWNpcGllbnQsICc5OTk5ODAwMCcpLmZlZSgnMjAwMCcpO1xuXG4gICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICBhc3NlcnQub2sodHggaW5zdGFuY2VvZiBUcmFuc2FjdGlvbiwgJ2J1aWxkKCkgc2hvdWxkIHJldHVybiBhIFRyYW5zYWN0aW9uJyk7XG4gICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS5pbnB1dHMubGVuZ3RoLCAxLCAnc2hvdWxkIGhhdmUgMSBpbnB1dCcpO1xuICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEub3V0cHV0cy5sZW5ndGgsIDEsICdzaG91bGQgaGF2ZSAxIG91dHB1dCcpO1xuICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEub3V0cHV0c1swXS5hbW91bnQsICc5OTk5ODAwMCcpO1xuXG4gICAgLy8gU3RlcCAyOiBTaWduXG4gICAgdHguc2lnbihQUlZfS0VZX0JVRik7XG4gICAgY29uc3Qgc2lncyA9IHR4LnNpZ25hdHVyZTtcbiAgICBhc3NlcnQub2soc2lncy5sZW5ndGggPiAwLCAnc2hvdWxkIGhhdmUgc2lnbmF0dXJlcyBhZnRlciBzaWduaW5nJyk7XG4gICAgYXNzZXJ0Lm9rKHNpZ3NbMF0ubGVuZ3RoID4gMCwgJ3NpZ25hdHVyZSBzaG91bGQgYmUgbm9uLWVtcHR5Jyk7XG5cbiAgICAvLyBTdGVwIDM6IFZlcmlmeSBzaWduYXR1cmUgd2l0aCBwdWJsaWMga2V5XG4gICAgY29uc3QgcHViS2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wdWIsICdoZXgnKTtcbiAgICBhc3NlcnQub2sodHgudmVyaWZ5U2lnbmF0dXJlKHB1YktleSwgMCksICdzaWduYXR1cmUgc2hvdWxkIHZlcmlmeSBhZ2FpbnN0IGNvcnJlY3QgcHVia2V5Jyk7XG5cbiAgICAvLyBTdGVwIDQ6IFNlcmlhbGl6ZSB0byBicm9hZGNhc3QgZm9ybWF0XG4gICAgY29uc3QgYnJvYWRjYXN0UGF5bG9hZCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgYXNzZXJ0Lm9rKGJyb2FkY2FzdFBheWxvYWQsICd0b0Jyb2FkY2FzdEZvcm1hdCBzaG91bGQgcmV0dXJuIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4gSlNPTi5wYXJzZShicm9hZGNhc3RQYXlsb2FkKSwgJ2Jyb2FkY2FzdCBmb3JtYXQgc2hvdWxkIGJlIHZhbGlkIEpTT04nKTtcblxuICAgIC8vIFN0ZXAgNTogU2VyaWFsaXplIHRvIGhleFxuICAgIGNvbnN0IGhleCA9IHR4LnRvSGV4KCk7XG4gICAgYXNzZXJ0Lm9rKC9eWzAtOWEtZkEtRl0rJC8udGVzdChoZXgpLCAndG9IZXggc2hvdWxkIHJldHVybiB2YWxpZCBoZXgnKTtcblxuICAgIC8vIFN0ZXAgNjogRGVzZXJpYWxpemUgYW5kIHZlcmlmeSByb3VuZC10cmlwXG4gICAgY29uc3QgcmVsb2FkZWQgPSBUcmFuc2FjdGlvbi5mcm9tSGV4KGNvaW5Db25maWcubmFtZSwgaGV4KTtcbiAgICBhc3NlcnQuZGVlcEVxdWFsKHJlbG9hZGVkLnR4RGF0YS5pbnB1dHMsIHR4LnR4RGF0YS5pbnB1dHMpO1xuICAgIGFzc2VydC5kZWVwRXF1YWwocmVsb2FkZWQudHhEYXRhLm91dHB1dHMsIHR4LnR4RGF0YS5vdXRwdXRzKTtcbiAgICBhc3NlcnQuZXF1YWwocmVsb2FkZWQudHhEYXRhLmZlZSwgdHgudHhEYXRhLmZlZSk7XG5cbiAgICAvLyBTdGVwIDc6IEV4cGxhaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAgY29uc3QgZXhwbGFuYXRpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICBhc3NlcnQub2soZXhwbGFuYXRpb24ub3V0cHV0cy5sZW5ndGggPiAwLCAnZXhwbGFuYXRpb24gc2hvdWxkIGhhdmUgb3V0cHV0cycpO1xuICAgIGFzc2VydC5lcXVhbChleHBsYW5hdGlvbi5vdXRwdXRzWzBdLmFtb3VudCwgJzk5OTk4MDAwJyk7XG4gICAgYXNzZXJ0Lm9rKGV4cGxhbmF0aW9uLmZlZSwgJ2V4cGxhbmF0aW9uIHNob3VsZCBoYXZlIGZlZScpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIE5PVCBiZSBjb25zaWRlcmVkIGZ1bGx5IHNpZ25lZCB3aGVuIHVuc2lnbmVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5Db25maWcpO1xuICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnOTk5OTgwMDAnKS5mZWUoJzIwMDAnKTtcblxuICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgY29uc3Qgc2lncyA9IHR4LnNpZ25hdHVyZTtcblxuICAgIGFzc2VydC5vayhcbiAgICAgIHNpZ3MuZXZlcnkoKHMpID0+IHMgPT09ICcnKSxcbiAgICAgICd1bnNpZ25lZCB0cmFuc2FjdGlvbiBzaG91bGQgaGF2ZSBlbXB0eSBzaWduYXR1cmUgc2NyaXB0cydcbiAgICApO1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShwYXlsb2FkKTtcbiAgICBhc3NlcnQub2soIXBhcnNlZC5pbnB1dHNbMF0uc2lnbmF0dXJlU2NyaXB0LCAnaW5wdXRzIHNob3VsZCBub3QgaGF2ZSBzaWduYXR1cmVTY3JpcHQgd2hlbiB1bnNpZ25lZCcpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHNpZ24gbXVsdGlwbGUgaW5wdXRzIGluZGVwZW5kZW50bHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXIoY29pbkNvbmZpZyk7XG4gICAgYnVpbGRlci5hZGRJbnB1dHMoW1VUWE9TLnNpbXBsZSwgVVRYT1Muc2Vjb25kXSkudG8oQUREUkVTU0VTLnJlY2lwaWVudCwgJzI5OTk5ODAwMCcpLmZlZSgnMjAwMCcpO1xuXG4gICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICB0eC5zaWduKFBSVl9LRVlfQlVGKTtcblxuICAgIGNvbnN0IHB1YktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHViLCAnaGV4Jyk7XG4gICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS5pbnB1dHMubGVuZ3RoLCAyKTtcbiAgICBhc3NlcnQub2sodHgudmVyaWZ5U2lnbmF0dXJlKHB1YktleSwgMCksICdmaXJzdCBpbnB1dCBzaWduYXR1cmUgc2hvdWxkIHZlcmlmeScpO1xuICAgIGFzc2VydC5vayh0eC52ZXJpZnlTaWduYXR1cmUocHViS2V5LCAxKSwgJ3NlY29uZCBpbnB1dCBzaWduYXR1cmUgc2hvdWxkIHZlcmlmeScpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJlYnVpbGQgZnJvbSBzZXJpYWxpemVkIGhleCBhbmQgcHJvZHVjZSBpZGVudGljYWwgYnJvYWRjYXN0IGZvcm1hdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBidWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlcihjb2luQ29uZmlnKTtcbiAgICBidWlsZGVyLmFkZElucHV0KFVUWE9TLnNpbXBsZSkudG8oQUREUkVTU0VTLnJlY2lwaWVudCwgJzk5OTk4MDAwJykuZmVlKCcyMDAwJyk7XG4gICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICB0eC5zaWduKFBSVl9LRVlfQlVGKTtcblxuICAgIGNvbnN0IG9yaWdpbmFsSGV4ID0gdHgudG9IZXgoKTtcbiAgICBjb25zdCBvcmlnaW5hbFBheWxvYWQgPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgY29uc3QgcmVidWlsdCA9IFRyYW5zYWN0aW9uLmZyb21IZXgoY29pbkNvbmZpZy5uYW1lLCBvcmlnaW5hbEhleCk7XG4gICAgY29uc3QgcmVidWlsdFBheWxvYWQgPSByZWJ1aWx0LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICBhc3NlcnQuZXF1YWwocmVidWlsdFBheWxvYWQsIG9yaWdpbmFsUGF5bG9hZCwgJ3NlcmlhbGl6YXRpb24gc2hvdWxkIGJlIGRldGVybWluaXN0aWMnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBwcm9kdWNlIGEgdmFsaWQgUlBDLXN1Ym1pdHRhYmxlIEpTT04gYnJvYWRjYXN0IHBheWxvYWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXIoY29pbkNvbmZpZyk7XG4gICAgYnVpbGRlci5hZGRJbnB1dChVVFhPUy5zaW1wbGUpLnRvKEFERFJFU1NFUy5yZWNpcGllbnQsICc5OTk5ODAwMCcpLmZlZSgnMjAwMCcpO1xuICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgdHguc2lnbihQUlZfS0VZX0JVRik7XG5cbiAgICBjb25zdCBwYXlsb2FkID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgIGFzc2VydC5vayhwYXlsb2FkLmxlbmd0aCA+IDAsICdwYXlsb2FkIG11c3QgYmUgbm9uLWVtcHR5Jyk7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShwYXlsb2FkKTtcblxuICAgIGFzc2VydC5vayhwYXJzZWQudmVyc2lvbiAhPT0gdW5kZWZpbmVkLCAnbXVzdCBoYXZlIHZlcnNpb24nKTtcbiAgICBhc3NlcnQub2soQXJyYXkuaXNBcnJheShwYXJzZWQuaW5wdXRzKSwgJ211c3QgaGF2ZSBpbnB1dHMgYXJyYXknKTtcbiAgICBhc3NlcnQub2soQXJyYXkuaXNBcnJheShwYXJzZWQub3V0cHV0cyksICdtdXN0IGhhdmUgb3V0cHV0cyBhcnJheScpO1xuICAgIGFzc2VydC5vayhwYXJzZWQuaW5wdXRzLmxlbmd0aCA+IDAsICdtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGlucHV0Jyk7XG4gICAgYXNzZXJ0Lm9rKHBhcnNlZC5vdXRwdXRzLmxlbmd0aCA+IDAsICdtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG91dHB1dCcpO1xuXG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiBwYXJzZWQuaW5wdXRzKSB7XG4gICAgICBhc3NlcnQub2soaW5wdXQuc2lnbmF0dXJlU2NyaXB0LCAnc2lnbmVkIGlucHV0IG11c3QgaGF2ZSBzaWduYXR1cmVTY3JpcHQnKTtcbiAgICAgIGFzc2VydC5lcXVhbChpbnB1dC5zaWduYXR1cmVTY3JpcHQubGVuZ3RoLCAxMzAsICdTY2hub3JyIHNpZyBzaG91bGQgYmUgNjUgYnl0ZXMgPSAxMzAgaGV4IGNoYXJzJyk7XG4gICAgfVxuICB9KTtcbn0pO1xuIl19
170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25GbG93LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25GbG93LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7OztBQUVILG9EQUE0QjtBQUM1QixpREFBNEM7QUFDNUMscURBQTRDO0FBQzVDLHlFQUFzRTtBQUN0RSwyREFBd0Q7QUFDeEQsK0RBQW9FO0FBRXBFLE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUVqRCxRQUFRLENBQUMscUNBQXFDLEVBQUU7SUFDOUMsRUFBRSxDQUFDLDZFQUE2RSxFQUFFLEtBQUs7UUFDckYsZ0JBQWdCO1FBQ2hCLE1BQU0sT0FBTyxHQUFHLElBQUksdUNBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbkQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxzQkFBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQywwQkFBUyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0UsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBZ0IsQ0FBQztRQUNsRCxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVkseUJBQVcsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzVFLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUNoRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxN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QkFBd0IsQ0FBQyxDQUFDO1FBQ2xFLGdCQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDcEUsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLDhCQUE4QixDQUFDLENBQUM7UUFDcEUsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLCtCQUErQixDQUFDLENBQUM7UUFFdEUsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEMsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDO1lBQzNFLGdCQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSw4REFBOEQsQ0FBQyxDQUFDO1FBQ2xILENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBLYXNwYSBFbmQtdG8tRW5kIFRyYW5zYWN0aW9uIEZsb3dcbiAqXG4gKiBDb3ZlcnM6IGJ1aWxkIOKGkiBzaWduIOKGkiBzZXJpYWxpemUg4oaSIGRlc2VyaWFsaXplIOKGkiB2ZXJpZnlcbiAqIEFsbCBvcGVyYXRpb25zIGFyZSBvZmZsaW5lIChubyBsaXZlIFJQQyBjYWxscykuXG4gKi9cblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IGVjYyB9IGZyb20gJ0BiaXRnby1iZXRhL3NlY3AyNTZrMSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgS0VZUywgQUREUkVTU0VTLCBVVFhPUyB9IGZyb20gJy4uL2ZpeHR1cmVzL2thc3BhLmZpeHR1cmVzJztcblxuY29uc3QgY29pbkNvbmZpZyA9IGNvaW5zLmdldCgna2FzcGEnKTtcbmNvbnN0IFBSVl9LRVlfQlVGID0gQnVmZmVyLmZyb20oS0VZUy5wcnYsICdoZXgnKTtcblxuZGVzY3JpYmUoJ0thc3BhIOKAlCBFbmQtdG8tRW5kIFRyYW5zYWN0aW9uIEZsb3cnLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdzaG91bGQgYnVpbGQsIHNpZ24sIHNlcmlhbGl6ZSwgZGVzZXJpYWxpemUsIGFuZCB2ZXJpZnkgYSBzaW1wbGUgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgLy8gU3RlcCAxOiBCdWlsZFxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5Db25maWcpO1xuICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnOTk5OTgwMDAnKS5mZWUoJzIwMDAnKTtcblxuICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgYXNzZXJ0Lm9rKHR4IGluc3RhbmNlb2YgVHJhbnNhY3Rpb24sICdidWlsZCgpIHNob3VsZCByZXR1cm4gYSBUcmFuc2FjdGlvbicpO1xuICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuaW5wdXRzLmxlbmd0aCwgMSwgJ3Nob3VsZCBoYXZlIDEgaW5wdXQnKTtcbiAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLm91dHB1dHMubGVuZ3RoLCAxLCAnc2hvdWxkIGhhdmUgMSBvdXRwdXQnKTtcbiAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLm91dHB1dHNbMF0uYW1vdW50LCAnOTk5OTgwMDAnKTtcblxuICAgIC8vIFN0ZXAgMjogU2lnblxuICAgIHR4LnNpZ24oUFJWX0tFWV9CVUYpO1xuICAgIGNvbnN0IHNpZ3MgPSB0eC5zaWduYXR1cmU7XG4gICAgYXNzZXJ0Lm9rKHNpZ3MubGVuZ3RoID4gMCwgJ3Nob3VsZCBoYXZlIHNpZ25hdHVyZXMgYWZ0ZXIgc2lnbmluZycpO1xuICAgIGFzc2VydC5vayhzaWdzWzBdLmxlbmd0aCA+IDAsICdzaWduYXR1cmUgc2hvdWxkIGJlIG5vbi1lbXB0eScpO1xuXG4gICAgLy8gU3RlcCAzOiBWZXJpZnkgc2lnbmF0dXJlIHdpdGggcHVibGljIGtleVxuICAgIGNvbnN0IHB1YktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHViLCAnaGV4Jyk7XG4gICAgYXNzZXJ0Lm9rKHR4LnZlcmlmeVNpZ25hdHVyZShwdWJLZXksIDApLCAnc2lnbmF0dXJlIHNob3VsZCB2ZXJpZnkgYWdhaW5zdCBjb3JyZWN0IHB1YmtleScpO1xuXG4gICAgLy8gU3RlcCA0OiBTZXJpYWxpemUgdG8gYnJvYWRjYXN0IGZvcm1hdFxuICAgIGNvbnN0IGJyb2FkY2FzdFBheWxvYWQgPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIGFzc2VydC5vayhicm9hZGNhc3RQYXlsb2FkLCAndG9Ccm9hZGNhc3RGb3JtYXQgc2hvdWxkIHJldHVybiBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IEpTT04ucGFyc2UoYnJvYWRjYXN0UGF5bG9hZCksICdicm9hZGNhc3QgZm9ybWF0IHNob3VsZCBiZSB2YWxpZCBKU09OJyk7XG5cbiAgICAvLyBTdGVwIDU6IFNlcmlhbGl6ZSB0byBoZXhcbiAgICBjb25zdCBoZXggPSB0eC50b0hleCgpO1xuICAgIGFzc2VydC5vaygvXlswLTlhLWZBLUZdKyQvLnRlc3QoaGV4KSwgJ3RvSGV4IHNob3VsZCByZXR1cm4gdmFsaWQgaGV4Jyk7XG5cbiAgICAvLyBTdGVwIDY6IERlc2VyaWFsaXplIGFuZCB2ZXJpZnkgcm91bmQtdHJpcFxuICAgIGNvbnN0IHJlbG9hZGVkID0gVHJhbnNhY3Rpb24uZnJvbUhleChjb2luQ29uZmlnLm5hbWUsIGhleCk7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbChyZWxvYWRlZC50eERhdGEuaW5wdXRzLCB0eC50eERhdGEuaW5wdXRzKTtcbiAgICBhc3NlcnQuZGVlcEVxdWFsKHJlbG9hZGVkLnR4RGF0YS5vdXRwdXRzLCB0eC50eERhdGEub3V0cHV0cyk7XG4gICAgYXNzZXJ0LmVxdWFsKHJlbG9hZGVkLnR4RGF0YS5mZWUsIHR4LnR4RGF0YS5mZWUpO1xuXG4gICAgLy8gU3RlcCA3OiBFeHBsYWluIHRoZSB0cmFuc2FjdGlvblxuICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgYXNzZXJ0Lm9rKGV4cGxhbmF0aW9uLm91dHB1dHMubGVuZ3RoID4gMCwgJ2V4cGxhbmF0aW9uIHNob3VsZCBoYXZlIG91dHB1dHMnKTtcbiAgICBhc3NlcnQuZXF1YWwoZXhwbGFuYXRpb24ub3V0cHV0c1swXS5hbW91bnQsICc5OTk5ODAwMCcpO1xuICAgIGFzc2VydC5vayhleHBsYW5hdGlvbi5mZWUsICdleHBsYW5hdGlvbiBzaG91bGQgaGF2ZSBmZWUnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBOT1QgYmUgY29uc2lkZXJlZCBmdWxseSBzaWduZWQgd2hlbiB1bnNpZ25lZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBidWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlcihjb2luQ29uZmlnKTtcbiAgICBidWlsZGVyLmFkZElucHV0KFVUWE9TLnNpbXBsZSkudG8oQUREUkVTU0VTLnJlY2lwaWVudCwgJzk5OTk4MDAwJykuZmVlKCcyMDAwJyk7XG5cbiAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IHNpZ3MgPSB0eC5zaWduYXR1cmU7XG5cbiAgICBhc3NlcnQub2soXG4gICAgICBzaWdzLmV2ZXJ5KChzKSA9PiBzID09PSAnJyksXG4gICAgICAndW5zaWduZWQgdHJhbnNhY3Rpb24gc2hvdWxkIGhhdmUgZW1wdHkgc2lnbmF0dXJlIHNjcmlwdHMnXG4gICAgKTtcblxuICAgIGNvbnN0IHBheWxvYWQgPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocGF5bG9hZCk7XG4gICAgYXNzZXJ0Lm9rKCFwYXJzZWQuaW5wdXRzWzBdLnNpZ25hdHVyZVNjcmlwdCwgJ2lucHV0cyBzaG91bGQgbm90IGhhdmUgc2lnbmF0dXJlU2NyaXB0IHdoZW4gdW5zaWduZWQnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzaWduIG11bHRpcGxlIGlucHV0cyBpbmRlcGVuZGVudGx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5Db25maWcpO1xuICAgIGJ1aWxkZXIuYWRkSW5wdXRzKFtVVFhPUy5zaW1wbGUsIFVUWE9TLnNlY29uZF0pLnRvKEFERFJFU1NFUy5yZWNpcGllbnQsICcyOTk5OTgwMDAnKS5mZWUoJzIwMDAnKTtcblxuICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgdHguc2lnbihQUlZfS0VZX0JVRik7XG5cbiAgICBjb25zdCBwdWJLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnB1YiwgJ2hleCcpO1xuICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuaW5wdXRzLmxlbmd0aCwgMik7XG4gICAgYXNzZXJ0Lm9rKHR4LnZlcmlmeVNpZ25hdHVyZShwdWJLZXksIDApLCAnZmlyc3QgaW5wdXQgc2lnbmF0dXJlIHNob3VsZCB2ZXJpZnknKTtcbiAgICBhc3NlcnQub2sodHgudmVyaWZ5U2lnbmF0dXJlKHB1YktleSwgMSksICdzZWNvbmQgaW5wdXQgc2lnbmF0dXJlIHNob3VsZCB2ZXJpZnknKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZWJ1aWxkIGZyb20gc2VyaWFsaXplZCBoZXggYW5kIHByb2R1Y2UgaWRlbnRpY2FsIGJyb2FkY2FzdCBmb3JtYXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXIoY29pbkNvbmZpZyk7XG4gICAgYnVpbGRlci5hZGRJbnB1dChVVFhPUy5zaW1wbGUpLnRvKEFERFJFU1NFUy5yZWNpcGllbnQsICc5OTk5ODAwMCcpLmZlZSgnMjAwMCcpO1xuICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgdHguc2lnbihQUlZfS0VZX0JVRik7XG5cbiAgICBjb25zdCBvcmlnaW5hbEhleCA9IHR4LnRvSGV4KCk7XG4gICAgY29uc3Qgb3JpZ2luYWxQYXlsb2FkID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgIGNvbnN0IHJlYnVpbHQgPSBUcmFuc2FjdGlvbi5mcm9tSGV4KGNvaW5Db25maWcubmFtZSwgb3JpZ2luYWxIZXgpO1xuICAgIGNvbnN0IHJlYnVpbHRQYXlsb2FkID0gcmVidWlsdC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgYXNzZXJ0LmVxdWFsKHJlYnVpbHRQYXlsb2FkLCBvcmlnaW5hbFBheWxvYWQsICdzZXJpYWxpemF0aW9uIHNob3VsZCBiZSBkZXRlcm1pbmlzdGljJyk7XG4gIH0pO1xuXG4gIGl0KCdIU00gZmxvdyDigJQgYnVpbGQgdW5zaWduZWQg4oaSIHNlcmlhbGl6ZSDihpIgZXh0cmFjdCBzaWdoYXNoZXMg4oaSIGFwcGx5IGV4dGVybmFsIHNpZ25hdHVyZXMg4oaSIHZlcmlmeScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwcnYgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgIGNvbnN0IHB1YiA9IEJ1ZmZlci5mcm9tKEtFWVMucHViLCAnaGV4Jyk7XG5cbiAgICAvLyBTdGVwIDE6IEJ1aWxkIGFuIHVuc2lnbmVkIDItaW5wdXQgdHJhbnNhY3Rpb25cbiAgICBjb25zdCBidWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlcihjb2luQ29uZmlnKTtcbiAgICBidWlsZGVyLmFkZElucHV0cyhbVVRYT1Muc2ltcGxlLCBVVFhPUy5zZWNvbmRdKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnMjk5OTk2MDAwJykuZmVlKCc0MDAwJyk7XG4gICAgY29uc3QgdW5zaWduZWRUeCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuXG4gICAgLy8gU3RlcCAyOiBTZXJpYWxpemUgdG8gaGV4IOKAlCB0aGlzIGlzIHdoYXQgZ2V0cyBzZW50IHRvIHRoZSBIU01cbiAgICBjb25zdCB1bnNpZ25lZEhleCA9IHVuc2lnbmVkVHgudG9IZXgoKTtcbiAgICBhc3NlcnQub2soXG4gICAgICB1bnNpZ25lZFR4LnNpZ25hdHVyZS5ldmVyeSgocykgPT4gcyA9PT0gJycpLFxuICAgICAgJ211c3QgYmUgdW5zaWduZWQgYmVmb3JlIGxlYXZpbmcgU0RLJ1xuICAgICk7XG5cbiAgICAvLyBTdGVwIDM6IEhTTSByZWNlaXZlcyB0aGUgaGV4LCBkZXNlcmlhbGl6ZXMgaXQsIHJlYWRzIHBlci1pbnB1dCBzaWdoYXNoZXNcbiAgICBjb25zdCB0eEZvckhzbSA9IFRyYW5zYWN0aW9uLmZyb21IZXgoY29pbkNvbmZpZy5uYW1lLCB1bnNpZ25lZEhleCk7XG4gICAgY29uc3Qgc2lnaGFzaGVzID0gdHhGb3JIc20uc2lnbmFibGVQYXlsb2FkczsgLy8gQnVmZmVyWzJdIOKAlCBvbmUgbWVzc2FnZSBwZXIgaW5wdXRcbiAgICBhc3NlcnQuZXF1YWwoc2lnaGFzaGVzLmxlbmd0aCwgMik7XG4gICAgYXNzZXJ0Lm9rKCFzaWdoYXNoZXNbMF0uZXF1YWxzKHNpZ2hhc2hlc1sxXSksICdlYWNoIGlucHV0IGhhcyBhIGRpc3RpbmN0IHNpZ2hhc2gnKTtcblxuICAgIC8vIFN0ZXAgNDogSFNNIHNpZ25zIGVhY2ggc2lnaGFzaCBpbmRlcGVuZGVudGx5IChTY2hub3JyKVxuICAgIC8vIEluIHByb2R1Y3Rpb24gdGhpcyBpcyBhIERLTFMgLyBIU00gb3BlcmF0aW9uOyBoZXJlIHdlIHVzZSB0aGUgcmF3IGtleSBkaXJlY3RseVxuICAgIGNvbnN0IGV4dGVybmFsU2lnMCA9IEJ1ZmZlci5mcm9tKGVjYy5zaWduU2Nobm9ycihzaWdoYXNoZXNbMF0sIHBydikpOyAvLyA2NCBieXRlc1xuICAgIGNvbnN0IGV4dGVybmFsU2lnMSA9IEJ1ZmZlci5mcm9tKGVjYy5zaWduU2Nobm9ycihzaWdoYXNoZXNbMV0sIHBydikpOyAvLyA2NCBieXRlc1xuICAgIGFzc2VydC5lcXVhbChleHRlcm5hbFNpZzAubGVuZ3RoLCA2NCk7XG4gICAgYXNzZXJ0LmVxdWFsKGV4dGVybmFsU2lnMS5sZW5ndGgsIDY0KTtcbiAgICBhc3NlcnQub2soIWV4dGVybmFsU2lnMC5lcXVhbHMoZXh0ZXJuYWxTaWcxKSwgJ3NpZ25hdHVyZXMgb3ZlciBkaXN0aW5jdCBoYXNoZXMgbXVzdCBkaWZmZXInKTtcblxuICAgIC8vIFN0ZXAgNTogQXBwbHkgdGhlIGV4dGVybmFsIHNpZ25hdHVyZXMgdG8gYSBmcmVzaCBkZXNlcmlhbGl6ZWQgdHhcbiAgICBjb25zdCB0eFRvU2lnbiA9IFRyYW5zYWN0aW9uLmZyb21IZXgoY29pbkNvbmZpZy5uYW1lLCB1bnNpZ25lZEhleCk7XG4gICAgdHhUb1NpZ24uYWRkU2lnbmF0dXJlRm9ySW5wdXQoMCwgS0VZUy5wdWIsIGV4dGVybmFsU2lnMCk7XG4gICAgdHhUb1NpZ24uYWRkU2lnbmF0dXJlRm9ySW5wdXQoMSwgS0VZUy5wdWIsIGV4dGVybmFsU2lnMSk7XG5cbiAgICAvLyBTdGVwIDY6IENyeXB0b2dyYXBoaWNhbGx5IHZlcmlmeSBlYWNoIGlucHV0J3MgU2Nobm9yciBzaWduYXR1cmVcbiAgICBhc3NlcnQub2sodHhUb1NpZ24udmVyaWZ5U2lnbmF0dXJlKHB1YiwgMCksICdpbnB1dFswXSBTY2hub3JyIHNpZ25hdHVyZSBtdXN0IGJlIHZhbGlkJyk7XG4gICAgYXNzZXJ0Lm9rKHR4VG9TaWduLnZlcmlmeVNpZ25hdHVyZShwdWIsIDEpLCAnaW5wdXRbMV0gU2Nobm9yciBzaWduYXR1cmUgbXVzdCBiZSB2YWxpZCcpO1xuXG4gICAgLy8gU3RlcCA3OiBTZXJpYWxpemUgdGhlIGZ1bGx5LXNpZ25lZCB0eCBmb3IgYnJvYWRjYXN0XG4gICAgY29uc3Qgc2lnbmVkSGV4ID0gdHhUb1NpZ24udG9IZXgoKTtcbiAgICBjb25zdCBicm9hZGNhc3QgPSB0eFRvU2lnbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIGNvbnN0IHJwYyA9IEpTT04ucGFyc2UoYnJvYWRjYXN0KTtcbiAgICBhc3NlcnQuZXF1YWwoXG4gICAgICBycGMuaW5wdXRzWzBdLnNpZ25hdHVyZVNjcmlwdC5sZW5ndGgsXG4gICAgICAxMzIsXG4gICAgICAnNjYtYnl0ZSBzY3JpcHQgPSAxMzIgaGV4IGNoYXJzIChwdXNoIG9wY29kZSArIHNpZyArIHNpZ2hhc2gpJ1xuICAgICk7XG4gICAgYXNzZXJ0LmVxdWFsKHJwYy5pbnB1dHNbMV0uc2lnbmF0dXJlU2NyaXB0Lmxlbmd0aCwgMTMyKTtcblxuICAgIC8vIFN0ZXAgODogUm91bmQtdHJpcCDigJQgcmVsb2FkIGZyb20gaGV4IGFuZCBjb25maXJtIHNpZ25hdHVyZXMgYXJlIGludGFjdFxuICAgIGNvbnN0IHJlbG9hZGVkID0gVHJhbnNhY3Rpb24uZnJvbUhleChjb2luQ29uZmlnLm5hbWUsIHNpZ25lZEhleCk7XG4gICAgYXNzZXJ0Lm9rKHJlbG9hZGVkLnZlcmlmeVNpZ25hdHVyZShwdWIsIDApLCAnaW5wdXRbMF0gbXVzdCBzdGlsbCB2ZXJpZnkgYWZ0ZXIgcm91bmQtdHJpcCcpO1xuICAgIGFzc2VydC5vayhyZWxvYWRlZC52ZXJpZnlTaWduYXR1cmUocHViLCAxKSwgJ2lucHV0WzFdIG11c3Qgc3RpbGwgdmVyaWZ5IGFmdGVyIHJvdW5kLXRyaXAnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCBhbmQgc2lnbiBhIHRyYW5zYWN0aW9uIHdpdGggbXVsdGlwbGUgb3V0cHV0cyAoc2VuZCArIGNoYW5nZSknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgLy8gU2ltdWxhdGUgYSBjb21tb24gcmVhbC13b3JsZCBwYXR0ZXJuOiBvbmUgcmVjaXBpZW50IG91dHB1dCArIG9uZSBjaGFuZ2Ugb3V0cHV0XG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXIoY29pbkNvbmZpZyk7XG4gICAgYnVpbGRlclxuICAgICAgLmFkZElucHV0KFVUWE9TLnNpbXBsZSkgLy8gMSBLQVNQQSBpbnB1dFxuICAgICAgLnRvKEFERFJFU1NFUy5yZWNpcGllbnQsICc1MDAwMDAwMCcpIC8vIHNlbmQgMC41IEtBU1BBXG4gICAgICAudG8oQUREUkVTU0VTLnNlbmRlciwgJzQ5OTk4MDAwJykgLy8gY2hhbmdlIGJhY2sgMC40OTk5OCBLQVNQQVxuICAgICAgLmZlZSgnMjAwMCcpO1xuXG4gICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLmlucHV0cy5sZW5ndGgsIDEpO1xuICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEub3V0cHV0cy5sZW5ndGgsIDIpO1xuICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEub3V0cHV0c1swXS5hbW91bnQsICc1MDAwMDAwMCcpO1xuICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEub3V0cHV0c1sxXS5hbW91bnQsICc0OTk5ODAwMCcpO1xuXG4gICAgLy8gU2lnbiBhbmQgdmVyaWZ5IGJvdGggb3V0cHV0cyBzdXJ2aXZlIHNlcmlhbGl6YXRpb25cbiAgICB0eC5zaWduKFBSVl9LRVlfQlVGKTtcbiAgICBjb25zdCBleHBsYW5hdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgIGFzc2VydC5lcXVhbChleHBsYW5hdGlvbi5vdXRwdXRzLmxlbmd0aCwgMik7XG4gICAgYXNzZXJ0LmVxdWFsKGV4cGxhbmF0aW9uLm91dHB1dEFtb3VudCwgJzk5OTk4MDAwJyk7IC8vIHN1bSBvZiBib3RoIG91dHB1dHNcblxuICAgIC8vIFJvdW5kLXRyaXBcbiAgICBjb25zdCByZWxvYWRlZCA9IFRyYW5zYWN0aW9uLmZyb21IZXgoY29pbkNvbmZpZy5uYW1lLCB0eC50b0hleCgpKTtcbiAgICBhc3NlcnQuZXF1YWwocmVsb2FkZWQudHhEYXRhLm91dHB1dHMubGVuZ3RoLCAyKTtcbiAgICBhc3NlcnQuZXF1YWwocmVsb2FkZWQudHhEYXRhLm91dHB1dHNbMF0uYW1vdW50LCAnNTAwMDAwMDAnKTtcbiAgICBhc3NlcnQuZXF1YWwocmVsb2FkZWQudHhEYXRhLm91dHB1dHNbMV0uYW1vdW50LCAnNDk5OTgwMDAnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBwcm9kdWNlIGEgdmFsaWQgUlBDLXN1Ym1pdHRhYmxlIEpTT04gYnJvYWRjYXN0IHBheWxvYWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXIoY29pbkNvbmZpZyk7XG4gICAgYnVpbGRlci5hZGRJbnB1dChVVFhPUy5zaW1wbGUpLnRvKEFERFJFU1NFUy5yZWNpcGllbnQsICc5OTk5ODAwMCcpLmZlZSgnMjAwMCcpO1xuICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgdHguc2lnbihQUlZfS0VZX0JVRik7XG5cbiAgICBjb25zdCBwYXlsb2FkID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgIGFzc2VydC5vayhwYXlsb2FkLmxlbmd0aCA+IDAsICdwYXlsb2FkIG11c3QgYmUgbm9uLWVtcHR5Jyk7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShwYXlsb2FkKTtcblxuICAgIGFzc2VydC5vayhwYXJzZWQudmVyc2lvbiAhPT0gdW5kZWZpbmVkLCAnbXVzdCBoYXZlIHZlcnNpb24nKTtcbiAgICBhc3NlcnQub2soQXJyYXkuaXNBcnJheShwYXJzZWQuaW5wdXRzKSwgJ211c3QgaGF2ZSBpbnB1dHMgYXJyYXknKTtcbiAgICBhc3NlcnQub2soQXJyYXkuaXNBcnJheShwYXJzZWQub3V0cHV0cyksICdtdXN0IGhhdmUgb3V0cHV0cyBhcnJheScpO1xuICAgIGFzc2VydC5vayhwYXJzZWQuaW5wdXRzLmxlbmd0aCA+IDAsICdtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGlucHV0Jyk7XG4gICAgYXNzZXJ0Lm9rKHBhcnNlZC5vdXRwdXRzLmxlbmd0aCA+IDAsICdtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG91dHB1dCcpO1xuXG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiBwYXJzZWQuaW5wdXRzKSB7XG4gICAgICBhc3NlcnQub2soaW5wdXQuc2lnbmF0dXJlU2NyaXB0LCAnc2lnbmVkIGlucHV0IG11c3QgaGF2ZSBzaWduYXR1cmVTY3JpcHQnKTtcbiAgICAgIGFzc2VydC5lcXVhbChpbnB1dC5zaWduYXR1cmVTY3JpcHQubGVuZ3RoLCAxMzIsICc2Ni1ieXRlIHNjcmlwdCA9IDEzMiBoZXggY2hhcnMgKHB1c2ggb3Bjb2RlICsgc2lnICsgc2lnaGFzaCknKTtcbiAgICB9XG4gIH0pO1xufSk7XG4iXX0=
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const assert_1 = __importDefault(require("assert"));
7
7
  const utils_1 = require("../../src/lib/utils");
8
+ const constants_1 = require("../../src/lib/constants");
8
9
  const keyPair_1 = require("../../src/lib/keyPair");
9
10
  const kaspa_fixtures_1 = require("../fixtures/kaspa.fixtures");
10
11
  describe('Kaspa Utils', function () {
@@ -51,13 +52,13 @@ describe('Kaspa Utils', function () {
51
52
  });
52
53
  });
53
54
  describe('pubKeyToKaspaAddress', function () {
54
- it('should derive a valid mainnet address from compressed public key', function () {
55
+ it('should derive a valid mainnet Schnorr address from compressed public key', function () {
55
56
  const pubKeyBuffer = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
56
57
  const address = (0, utils_1.pubKeyToKaspaAddress)(pubKeyBuffer, 'kaspa');
57
58
  assert_1.default.ok(address.startsWith('kaspa:'));
58
59
  assert_1.default.ok((0, utils_1.isValidKaspaAddress)(address));
59
60
  });
60
- it('should derive a valid testnet address from compressed public key', function () {
61
+ it('should derive a valid testnet Schnorr address from compressed public key', function () {
61
62
  const pubKeyBuffer = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
62
63
  const address = (0, utils_1.pubKeyToKaspaAddress)(pubKeyBuffer, 'kaspatest');
63
64
  assert_1.default.ok(address.startsWith('kaspatest:'));
@@ -72,12 +73,70 @@ describe('Kaspa Utils', function () {
72
73
  (0, utils_1.pubKeyToKaspaAddress)(Buffer.from('0102030405', 'hex'), 'kaspa');
73
74
  });
74
75
  });
75
- it('should produce same address as KeyPair.getAddress', function () {
76
+ it('should produce same Schnorr address as KeyPair.getAddress', function () {
76
77
  const kp = new keyPair_1.KeyPair({ pub: kaspa_fixtures_1.KEYS.pub });
77
78
  const fromKp = kp.getAddress('mainnet');
78
79
  const fromUtil = (0, utils_1.pubKeyToKaspaAddress)(Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex'), 'kaspa');
79
80
  assert_1.default.equal(fromUtil, fromKp);
80
81
  });
82
+ it('should derive a valid mainnet ECDSA address', function () {
83
+ const pubKeyBuffer = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
84
+ const address = (0, utils_1.pubKeyToKaspaAddress)(pubKeyBuffer, 'kaspa', constants_1.KaspaAddressType.ECDSA);
85
+ assert_1.default.ok(address.startsWith('kaspa:'));
86
+ assert_1.default.ok((0, utils_1.isValidKaspaAddress)(address));
87
+ });
88
+ it('should derive a valid testnet ECDSA address', function () {
89
+ const pubKeyBuffer = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
90
+ const address = (0, utils_1.pubKeyToKaspaAddress)(pubKeyBuffer, 'kaspatest', constants_1.KaspaAddressType.ECDSA);
91
+ assert_1.default.ok(address.startsWith('kaspatest:'));
92
+ assert_1.default.ok((0, utils_1.isValidKaspaAddress)(address));
93
+ });
94
+ it('Schnorr and ECDSA addresses from the same key should differ', function () {
95
+ const pubKeyBuffer = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
96
+ const schnorrAddr = (0, utils_1.pubKeyToKaspaAddress)(pubKeyBuffer, 'kaspa');
97
+ const ecdsaAddr = (0, utils_1.pubKeyToKaspaAddress)(pubKeyBuffer, 'kaspa', constants_1.KaspaAddressType.ECDSA);
98
+ assert_1.default.notEqual(schnorrAddr, ecdsaAddr);
99
+ });
100
+ it('ECDSA address matches KeyPair.getAddress(ECDSA)', function () {
101
+ const kp = new keyPair_1.KeyPair({ pub: kaspa_fixtures_1.KEYS.pub });
102
+ const fromKp = kp.getAddress('mainnet', constants_1.KaspaAddressType.ECDSA);
103
+ const fromUtil = (0, utils_1.pubKeyToKaspaAddress)(Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex'), 'kaspa', constants_1.KaspaAddressType.ECDSA);
104
+ assert_1.default.equal(fromUtil, fromKp);
105
+ });
106
+ it('ECDSA address matches fixture ADDRESSES.validEcdsa', function () {
107
+ const address = (0, utils_1.pubKeyToKaspaAddress)(Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex'), 'kaspa', constants_1.KaspaAddressType.ECDSA);
108
+ assert_1.default.equal(address, kaspa_fixtures_1.ADDRESSES.validEcdsa);
109
+ });
110
+ });
111
+ describe('addressToScriptPublicKey', function () {
112
+ it('should derive the Schnorr scriptPublicKey from a Schnorr address', function () {
113
+ const script = (0, utils_1.addressToScriptPublicKey)(kaspa_fixtures_1.ADDRESSES.valid);
114
+ // Schnorr: OP_DATA_32 (0x20) + 32-byte xOnly + OP_CHECKSIG_SCHNORR (0xAC) = 34 bytes = 68 hex chars
115
+ assert_1.default.equal(script.length, 68);
116
+ assert_1.default.ok(script.endsWith('ac'), 'Schnorr script should end with 0xAC');
117
+ assert_1.default.ok(script.startsWith('20'), 'Schnorr script should start with OP_DATA_32');
118
+ });
119
+ it('should match the fixture SCRIPT_PUBLIC_KEY for the Schnorr address', function () {
120
+ const script = (0, utils_1.addressToScriptPublicKey)(kaspa_fixtures_1.ADDRESSES.valid);
121
+ assert_1.default.equal(script, kaspa_fixtures_1.SCRIPT_PUBLIC_KEY);
122
+ });
123
+ it('should derive the ECDSA scriptPublicKey from an ECDSA address', function () {
124
+ const script = (0, utils_1.addressToScriptPublicKey)(kaspa_fixtures_1.ADDRESSES.validEcdsa);
125
+ // ECDSA: OP_DATA_33 (0x21) + 33-byte compressed + OP_CHECKSIG_ECDSA (0xAB) = 35 bytes = 70 hex chars
126
+ assert_1.default.equal(script.length, 70);
127
+ assert_1.default.ok(script.endsWith('ab'), 'ECDSA script should end with 0xAB');
128
+ assert_1.default.ok(script.startsWith('21'), 'ECDSA script should start with OP_DATA_33');
129
+ });
130
+ it('should match the fixture ECDSA_SCRIPT_PUBLIC_KEY for the ECDSA address', function () {
131
+ const script = (0, utils_1.addressToScriptPublicKey)(kaspa_fixtures_1.ADDRESSES.validEcdsa);
132
+ assert_1.default.equal(script, kaspa_fixtures_1.ECDSA_SCRIPT_PUBLIC_KEY);
133
+ });
134
+ it('should throw for an invalid address', function () {
135
+ assert_1.default.throws(() => (0, utils_1.addressToScriptPublicKey)('notanaddress'));
136
+ });
137
+ it('should throw for an address without a colon prefix', function () {
138
+ assert_1.default.throws(() => (0, utils_1.addressToScriptPublicKey)('nocolon'));
139
+ });
81
140
  });
82
141
  describe('isValidPublicKey', function () {
83
142
  it('should accept a valid compressed 33-byte public key', function () {
@@ -156,4 +215,4 @@ describe('Kaspa Utils', function () {
156
215
  });
157
216
  });
158
217
  });
159
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC91dGlscy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLCtDQVM2QjtBQUM3QixtREFBZ0Q7QUFDaEQsK0RBQW9FO0FBRXBFLFFBQVEsQ0FBQyxhQUFhLEVBQUU7SUFDdEIsUUFBUSxDQUFDLHFCQUFxQixFQUFFO1FBQzlCLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRTtZQUMxQyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFBLDJCQUFtQixFQUFDLDBCQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRTtZQUMxQyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFBLDJCQUFtQixFQUFDLDBCQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywrQkFBK0IsRUFBRTtZQUNsQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxJQUFBLDJCQUFtQixFQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDBDQUEwQyxFQUFFO1lBQzdDLGdCQUFNLENBQUMsS0FBSyxDQUFDLElBQUEsMkJBQW1CLEVBQUMsb0JBQW9CLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRTtZQUN6QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxJQUFBLDJCQUFtQixFQUFDLGNBQWMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtCQUErQixFQUFFO1lBQ2xDLGdCQUFNLENBQUMsS0FBSyxDQUFD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QUFFLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLHNCQUFLLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHtcbiAgaXNWYWxpZEthc3BhQWRkcmVzcyxcbiAgaXNWYWxpZE1haW5uZXRBZGRyZXNzLFxuICBpc1ZhbGlkVGVzdG5ldEFkZHJlc3MsXG4gIGlzVmFsaWRQdWJsaWNLZXksXG4gIGlzVmFsaWRQcml2YXRlS2V5LFxuICBpc1ZhbGlkVHJhbnNhY3Rpb25JZCxcbiAgcHViS2V5VG9LYXNwYUFkZHJlc3MsXG4gIFV0aWxzLFxufSBmcm9tICcuLi8uLi9zcmMvbGliL3V0aWxzJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuLi8uLi9zcmMvbGliL2tleVBhaXInO1xuaW1wb3J0IHsgS0VZUywgQUREUkVTU0VTLCBVVFhPUyB9IGZyb20gJy4uL2ZpeHR1cmVzL2thc3BhLmZpeHR1cmVzJztcblxuZGVzY3JpYmUoJ0thc3BhIFV0aWxzJywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnaXNWYWxpZEthc3BhQWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhIHZhbGlkIG1haW5uZXQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5vayhpc1ZhbGlkS2FzcGFBZGRyZXNzKEFERFJFU1NFUy52YWxpZCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgYSB2YWxpZCB0ZXN0bmV0IGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQub2soaXNWYWxpZEthc3BhQWRkcmVzcyhBRERSRVNTRVMudGVzdG5ldCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYW4gZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGlzVmFsaWRLYXNwYUFkZHJlc3MoJycpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIG5vbi1rYXNwYSBhZGRyZXNzIGZvcm1hdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkS2FzcGFBZGRyZXNzKCdiaXRjb2luOnFwOWRrc3JxejknKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYSBwbGFpbiBpbnZhbGlkIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkS2FzcGFBZGRyZXNzKCdub3RhbmFkZHJlc3MnKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgbnVsbC1saWtlIGlucHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGlzVmFsaWRLYXNwYUFkZHJlc3MobnVsbCBhcyB1bmtub3duIGFzIHN0cmluZyksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRNYWlubmV0QWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhIHZhbGlkIG1haW5uZXQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5vayhpc1ZhbGlkTWFpbm5ldEFkZHJlc3MoQUREUkVTU0VTLnZhbGlkKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIHRlc3RuZXQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkTWFpbm5ldEFkZHJlc3MoQUREUkVTU0VTLnRlc3RuZXQpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhbiBlbXB0eSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoaXNWYWxpZE1haW5uZXRBZGRyZXNzKCcnKSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZFRlc3RuZXRBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWNjZXB0IGEgdmFsaWQgdGVzdG5ldCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0Lm9rKGlzVmFsaWRUZXN0bmV0QWRkcmVzcyhBRERSRVNTRVMudGVzdG5ldCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYSBtYWlubmV0IGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoaXNWYWxpZFRlc3RuZXRBZGRyZXNzKEFERFJFU1NFUy52YWxpZCksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkVGVzdG5ldEFkZHJlc3MoJycpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwdWJLZXlUb0thc3BhQWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGRlcml2ZSBhIHZhbGlkIG1haW5uZXQgYWRkcmVzcyBmcm9tIGNvbXByZXNzZWQgcHVibGljIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHB1YktleUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKEtFWVMucHViLCAnaGV4Jyk7XG4gICAgICBjb25zdCBhZGRyZXNzID0gcHViS2V5VG9LYXNwYUFkZHJlc3MocHViS2V5QnVmZmVyLCAna2FzcGEnKTtcbiAgICAgIGFzc2VydC5vayhhZGRyZXNzLnN0YXJ0c1dpdGgoJ2thc3BhOicpKTtcbiAgICAgIGFzc2VydC5vayhpc1ZhbGlkS2FzcGFBZGRyZXNzKGFkZHJlc3MpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVyaXZlIGEgdmFsaWQgdGVzdG5ldCBhZGRyZXNzIGZyb20gY29tcHJlc3NlZCBwdWJsaWMga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHViS2V5QnVmZmVyID0gQnVmZmVyLmZyb20oS0VZUy5wdWIsICdoZXgnKTtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSBwdWJLZXlUb0thc3BhQWRkcmVzcyhwdWJLZXlCdWZmZXIsICdrYXNwYXRlc3QnKTtcbiAgICAgIGFzc2VydC5vayhhZGRyZXNzLnN0YXJ0c1dpdGgoJ2thc3BhdGVzdDonKSk7XG4gICAgICBhc3NlcnQub2soaXNWYWxpZEthc3BhQWRkcmVzcyhhZGRyZXNzKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBoZXggc3RyaW5nIHB1YmxpYyBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gcHViS2V5VG9LYXNwYUFkZHJlc3MoS0VZUy5wdWIsICdrYXNwYScpO1xuICAgICAgYXNzZXJ0Lm9rKGFkZHJlc3Muc3RhcnRzV2l0aCgna2FzcGE6JykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBmb3Igbm9uLTMzLWJ5dGUgcHVibGljIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBwdWJLZXlUb0thc3BhQWRkcmVzcyhCdWZmZXIuZnJvbSgnMDEwMjAzMDQwNScsICdoZXgnKSwgJ2thc3BhJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBzYW1lIGFkZHJlc3MgYXMgS2V5UGFpci5nZXRBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qga3AgPSBuZXcgS2V5UGFpcih7IHB1YjogS0VZUy5wdWIgfSk7XG4gICAgICBjb25zdCBmcm9tS3AgPSBrcC5nZXRBZGRyZXNzKCdtYWlubmV0Jyk7XG4gICAgICBjb25zdCBmcm9tVXRpbCA9IHB1YktleVRvS2FzcGFBZGRyZXNzKEJ1ZmZlci5mcm9tKEtFWVMucHViLCAnaGV4JyksICdrYXNwYScpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGZyb21VdGlsLCBmcm9tS3ApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZFB1YmxpY0tleScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhIHZhbGlkIGNvbXByZXNzZWQgMzMtYnl0ZSBwdWJsaWMga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0Lm9rKGlzVmFsaWRQdWJsaWNLZXkoS0VZUy5wdWIpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkUHVibGljS2V5KCcnKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYSBzdHJpbmcgdGhhdCBpcyBub3QgaGV4JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGlzVmFsaWRQdWJsaWNLZXkoJ25vdF9hX2tleScpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpbmNvcnJlY3Qga2V5IGxlbmd0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkUHVibGljS2V5KCcwMTAyMDMwNDA1JyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IHVuY29tcHJlc3NlZCA2NS1ieXRlIHB1YmxpYyBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmYWtlVW5jb21wcmVzc2VkID0gJzA0JyArICdhYicucmVwZWF0KDY0KTtcbiAgICAgIGFzc2VydC5vayhpc1ZhbGlkUHVibGljS2V5KGZha2VVbmNvbXByZXNzZWQpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgbnVsbC1saWtlIHZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGlzVmFsaWRQdWJsaWNLZXkobnVsbCBhcyB1bmtub3duIGFzIHN0cmluZyksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRQcml2YXRlS2V5JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWNjZXB0IGEgdmFsaWQgMzItYnl0ZSBoZXggcHJpdmF0ZSBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQub2soaXNWYWxpZFByaXZhdGVLZXkoS0VZUy5wcnYpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkUHJpdmF0ZUtleSgnJyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgbm9uLWhleCBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoaXNWYWxpZFByaXZhdGVLZXkoJ25vdF9hX2tleScpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBudWxsLWxpa2UgdmFsdWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoaXNWYWxpZFByaXZhdGVLZXkobnVsbCBhcyB1bmtub3duIGFzIHN0cmluZyksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRUcmFuc2FjdGlvbklkJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWNjZXB0IGEgdmFsaWQgNjQtY2hhciBoZXggdHJhbnNhY3Rpb24gSUQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQub2soaXNWYWxpZFRyYW5zYWN0aW9uSWQoVVRYT1Muc2ltcGxlLnRyYW5zYWN0aW9uSWQpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHNob3J0IGhleCBzdHJpbmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGlzVmFsaWRUcmFuc2FjdGlvbklkKCdhYmNkZWYxMjM0JyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5vbi1oZXggc3RyaW5ncycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkVHJhbnNhY3Rpb25JZCgneHl6JyArICdhJy5yZXBlYXQoNjEpKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGlzVmFsaWRUcmFuc2FjdGlvbklkKCcnKSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVXRpbHMgY2xhc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdXRpbHMgPSBuZXcgVXRpbHMoKTtcblxuICAgIGl0KCdpc1ZhbGlkQWRkcmVzcyBzaG91bGQgZGVsZWdhdGUgdG8gaXNWYWxpZEthc3BhQWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5vayh1dGlscy5pc1ZhbGlkQWRkcmVzcyhBRERSRVNTRVMudmFsaWQpKTtcbiAgICAgIGFzc2VydC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcygnaW52YWxpZCcpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXNWYWxpZEJsb2NrSWQgc2hvdWxkIGFjY2VwdCA2NC1jaGFyIGhleCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5vayh1dGlscy5pc1ZhbGlkQmxvY2tJZChVVFhPUy5zaW1wbGUudHJhbnNhY3Rpb25JZCkpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHV0aWxzLmlzVmFsaWRCbG9ja0lkKCdzaG9ydCcpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXNWYWxpZFByaXZhdGVLZXkgc2hvdWxkIGFjY2VwdCB2YWxpZCBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQub2sodXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoS0VZUy5wcnYpKTtcbiAgICB9KTtcblxuICAgIGl0KCdpc1ZhbGlkUHVibGljS2V5IHNob3VsZCBhY2NlcHQgdmFsaWQga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0Lm9rKHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoS0VZUy5wdWIpKTtcbiAgICB9KTtcblxuICAgIGl0KCdpc1ZhbGlkU2lnbmF0dXJlIHNob3VsZCBhY2NlcHQgMTI4LWNoYXIgaGV4JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2lnID0gJ2FiJy5yZXBlYXQoNjQpO1xuICAgICAgYXNzZXJ0Lm9rKHV0aWxzLmlzVmFsaWRTaWduYXR1cmUoc2lnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXNWYWxpZFNpZ25hdHVyZSBzaG91bGQgcmVqZWN0IHNob3J0IHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwodXRpbHMuaXNWYWxpZFNpZ25hdHVyZSgnYWJjZCcpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXNWYWxpZFRyYW5zYWN0aW9uSWQgc2hvdWxkIGFjY2VwdCA2NC1jaGFyIGhleCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5vayh1dGlscy5pc1ZhbGlkVHJhbnNhY3Rpb25JZChVVFhPUy5zaW1wbGUudHJhbnNhY3Rpb25JZCkpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
218
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC91dGlscy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLCtDQVU2QjtBQUM3Qix1REFBMkQ7QUFDM0QsbURBQWdEO0FBQ2hELCtEQUFnSDtBQUVoSCxRQUFRLENBQUMsYUFBYSxFQUFFO0lBQ3RCLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTtRQUM5QixFQUFFLENBQUMsdUNBQXVDLEVBQUU7WUFDMUMsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsSUFBQSwyQkFBbUIsRUFBQywwQkFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdUNBQXVDLEVBQUU7WUFDMUMsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsSUFBQSwyQkFBbUIsRUFBQywwQkFBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsK0JBQStCLEVBQUU7WUFDbEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBQSwyQkFBbUIsRUFBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRTtZQUM3QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxJQUFBLDJCQUFtQixFQUFDLG9CQUFvQixDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsc0NBQXNDLEVBQUU7WUFDekMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBQSwyQkFBbUIsRUFBQyxjQUFjLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywrQkFBK0IsRUFBRTtZQUNsQyxnQkFBTSxD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LEVBQUUsQ0FBQyxDQUFDO1lBQzVCLGdCQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDhDQUE4QyxFQUFFO1lBQ2pELGdCQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxnREFBZ0QsRUFBRTtZQUNuRCxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsc0JBQUssQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge1xuICBpc1ZhbGlkS2FzcGFBZGRyZXNzLFxuICBpc1ZhbGlkTWFpbm5ldEFkZHJlc3MsXG4gIGlzVmFsaWRUZXN0bmV0QWRkcmVzcyxcbiAgaXNWYWxpZFB1YmxpY0tleSxcbiAgaXNWYWxpZFByaXZhdGVLZXksXG4gIGlzVmFsaWRUcmFuc2FjdGlvbklkLFxuICBwdWJLZXlUb0thc3BhQWRkcmVzcyxcbiAgYWRkcmVzc1RvU2NyaXB0UHVibGljS2V5LFxuICBVdGlscyxcbn0gZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBLYXNwYUFkZHJlc3NUeXBlIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4uLy4uL3NyYy9saWIva2V5UGFpcic7XG5pbXBvcnQgeyBLRVlTLCBBRERSRVNTRVMsIFVUWE9TLCBTQ1JJUFRfUFVCTElDX0tFWSwgRUNEU0FfU0NSSVBUX1BVQkxJQ19LRVkgfSBmcm9tICcuLi9maXh0dXJlcy9rYXNwYS5maXh0dXJlcyc7XG5cbmRlc2NyaWJlKCdLYXNwYSBVdGlscycsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ2lzVmFsaWRLYXNwYUFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgYSB2YWxpZCBtYWlubmV0IGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQub2soaXNWYWxpZEthc3BhQWRkcmVzcyhBRERSRVNTRVMudmFsaWQpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IGEgdmFsaWQgdGVzdG5ldCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0Lm9rKGlzVmFsaWRLYXNwYUFkZHJlc3MoQUREUkVTU0VTLnRlc3RuZXQpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkS2FzcGFBZGRyZXNzKCcnKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYSBub24ta2FzcGEgYWRkcmVzcyBmb3JtYXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoaXNWYWxpZEthc3BhQWRkcmVzcygnYml0Y29pbjpxcDlka3NycXo5JyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgcGxhaW4gaW52YWxpZCBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoaXNWYWxpZEthc3BhQWRkcmVzcygnbm90YW5hZGRyZXNzJyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG51bGwtbGlrZSBpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkS2FzcGFBZGRyZXNzKG51bGwgYXMgdW5rbm93biBhcyBzdHJpbmcpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkTWFpbm5ldEFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgYSB2YWxpZCBtYWlubmV0IGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQub2soaXNWYWxpZE1haW5uZXRBZGRyZXNzKEFERFJFU1NFUy52YWxpZCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYSB0ZXN0bmV0IGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoaXNWYWxpZE1haW5uZXRBZGRyZXNzKEFERFJFU1NFUy50ZXN0bmV0KSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYW4gZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGlzVmFsaWRNYWlubmV0QWRkcmVzcygnJyksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRUZXN0bmV0QWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhIHZhbGlkIHRlc3RuZXQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5vayhpc1ZhbGlkVGVzdG5ldEFkZHJlc3MoQUREUkVTU0VTLnRlc3RuZXQpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgbWFpbm5ldCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGlzVmFsaWRUZXN0bmV0QWRkcmVzcyhBRERSRVNTRVMudmFsaWQpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhbiBlbXB0eSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoaXNWYWxpZFRlc3RuZXRBZGRyZXNzKCcnKSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncHViS2V5VG9LYXNwYUFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBkZXJpdmUgYSB2YWxpZCBtYWlubmV0IFNjaG5vcnIgYWRkcmVzcyBmcm9tIGNvbXByZXNzZWQgcHVibGljIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHB1YktleUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKEtFWVMucHViLCAnaGV4Jyk7XG4gICAgICBjb25zdCBhZGRyZXNzID0gcHViS2V5VG9LYXNwYUFkZHJlc3MocHViS2V5QnVmZmVyLCAna2FzcGEnKTtcbiAgICAgIGFzc2VydC5vayhhZGRyZXNzLnN0YXJ0c1dpdGgoJ2thc3BhOicpKTtcbiAgICAgIGFzc2VydC5vayhpc1ZhbGlkS2FzcGFBZGRyZXNzKGFkZHJlc3MpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVyaXZlIGEgdmFsaWQgdGVzdG5ldCBTY2hub3JyIGFkZHJlc3MgZnJvbSBjb21wcmVzc2VkIHB1YmxpYyBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwdWJLZXlCdWZmZXIgPSBCdWZmZXIuZnJvbShLRVlTLnB1YiwgJ2hleCcpO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IHB1YktleVRvS2FzcGFBZGRyZXNzKHB1YktleUJ1ZmZlciwgJ2thc3BhdGVzdCcpO1xuICAgICAgYXNzZXJ0Lm9rKGFkZHJlc3Muc3RhcnRzV2l0aCgna2FzcGF0ZXN0OicpKTtcbiAgICAgIGFzc2VydC5vayhpc1ZhbGlkS2FzcGFBZGRyZXNzKGFkZHJlc3MpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IGhleCBzdHJpbmcgcHVibGljIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSBwdWJLZXlUb0thc3BhQWRkcmVzcyhLRVlTLnB1YiwgJ2thc3BhJyk7XG4gICAgICBhc3NlcnQub2soYWRkcmVzcy5zdGFydHNXaXRoKCdrYXNwYTonKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGZvciBub24tMzMtYnl0ZSBwdWJsaWMga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIHB1YktleVRvS2FzcGFBZGRyZXNzKEJ1ZmZlci5mcm9tKCcwMTAyMDMwNDA1JywgJ2hleCcpLCAna2FzcGEnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIHNhbWUgU2Nobm9yciBhZGRyZXNzIGFzIEtleVBhaXIuZ2V0QWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtwID0gbmV3IEtleVBhaXIoeyBwdWI6IEtFWVMucHViIH0pO1xuICAgICAgY29uc3QgZnJvbUtwID0ga3AuZ2V0QWRkcmVzcygnbWFpbm5ldCcpO1xuICAgICAgY29uc3QgZnJvbVV0aWwgPSBwdWJLZXlUb0thc3BhQWRkcmVzcyhCdWZmZXIuZnJvbShLRVlTLnB1YiwgJ2hleCcpLCAna2FzcGEnKTtcbiAgICAgIGFzc2VydC5lcXVhbChmcm9tVXRpbCwgZnJvbUtwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVyaXZlIGEgdmFsaWQgbWFpbm5ldCBFQ0RTQSBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHViS2V5QnVmZmVyID0gQnVmZmVyLmZyb20oS0VZUy5wdWIsICdoZXgnKTtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSBwdWJLZXlUb0thc3BhQWRkcmVzcyhwdWJLZXlCdWZmZXIsICdrYXNwYScsIEthc3BhQWRkcmVzc1R5cGUuRUNEU0EpO1xuICAgICAgYXNzZXJ0Lm9rKGFkZHJlc3Muc3RhcnRzV2l0aCgna2FzcGE6JykpO1xuICAgICAgYXNzZXJ0Lm9rKGlzVmFsaWRLYXNwYUFkZHJlc3MoYWRkcmVzcykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZXJpdmUgYSB2YWxpZCB0ZXN0bmV0IEVDRFNBIGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwdWJLZXlCdWZmZXIgPSBCdWZmZXIuZnJvbShLRVlTLnB1YiwgJ2hleCcpO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IHB1YktleVRvS2FzcGFBZGRyZXNzKHB1YktleUJ1ZmZlciwgJ2thc3BhdGVzdCcsIEthc3BhQWRkcmVzc1R5cGUuRUNEU0EpO1xuICAgICAgYXNzZXJ0Lm9rKGFkZHJlc3Muc3RhcnRzV2l0aCgna2FzcGF0ZXN0OicpKTtcbiAgICAgIGFzc2VydC5vayhpc1ZhbGlkS2FzcGFBZGRyZXNzKGFkZHJlc3MpKTtcbiAgICB9KTtcblxuICAgIGl0KCdTY2hub3JyIGFuZCBFQ0RTQSBhZGRyZXNzZXMgZnJvbSB0aGUgc2FtZSBrZXkgc2hvdWxkIGRpZmZlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHB1YktleUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKEtFWVMucHViLCAnaGV4Jyk7XG4gICAgICBjb25zdCBzY2hub3JyQWRkciA9IHB1YktleVRvS2FzcGFBZGRyZXNzKHB1YktleUJ1ZmZlciwgJ2thc3BhJyk7XG4gICAgICBjb25zdCBlY2RzYUFkZHIgPSBwdWJLZXlUb0thc3BhQWRkcmVzcyhwdWJLZXlCdWZmZXIsICdrYXNwYScsIEthc3BhQWRkcmVzc1R5cGUuRUNEU0EpO1xuICAgICAgYXNzZXJ0Lm5vdEVxdWFsKHNjaG5vcnJBZGRyLCBlY2RzYUFkZHIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ0VDRFNBIGFkZHJlc3MgbWF0Y2hlcyBLZXlQYWlyLmdldEFkZHJlc3MoRUNEU0EpJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qga3AgPSBuZXcgS2V5UGFpcih7IHB1YjogS0VZUy5wdWIgfSk7XG4gICAgICBjb25zdCBmcm9tS3AgPSBrcC5nZXRBZGRyZXNzKCdtYWlubmV0JywgS2FzcGFBZGRyZXNzVHlwZS5FQ0RTQSk7XG4gICAgICBjb25zdCBmcm9tVXRpbCA9IHB1YktleVRvS2FzcGFBZGRyZXNzKEJ1ZmZlci5mcm9tKEtFWVMucHViLCAnaGV4JyksICdrYXNwYScsIEthc3BhQWRkcmVzc1R5cGUuRUNEU0EpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGZyb21VdGlsLCBmcm9tS3ApO1xuICAgIH0pO1xuXG4gICAgaXQoJ0VDRFNBIGFkZHJlc3MgbWF0Y2hlcyBmaXh0dXJlIEFERFJFU1NFUy52YWxpZEVjZHNhJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzcyA9IHB1YktleVRvS2FzcGFBZGRyZXNzKEJ1ZmZlci5mcm9tKEtFWVMucHViLCAnaGV4JyksICdrYXNwYScsIEthc3BhQWRkcmVzc1R5cGUuRUNEU0EpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGFkZHJlc3MsIEFERFJFU1NFUy52YWxpZEVjZHNhKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZHJlc3NUb1NjcmlwdFB1YmxpY0tleScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGRlcml2ZSB0aGUgU2Nobm9yciBzY3JpcHRQdWJsaWNLZXkgZnJvbSBhIFNjaG5vcnIgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNjcmlwdCA9IGFkZHJlc3NUb1NjcmlwdFB1YmxpY0tleShBRERSRVNTRVMudmFsaWQpO1xuICAgICAgLy8gU2Nobm9ycjogT1BfREFUQV8zMiAoMHgyMCkgKyAzMi1ieXRlIHhPbmx5ICsgT1BfQ0hFQ0tTSUdfU0NITk9SUiAoMHhBQykgPSAzNCBieXRlcyA9IDY4IGhleCBjaGFyc1xuICAgICAgYXNzZXJ0LmVxdWFsKHNjcmlwdC5sZW5ndGgsIDY4KTtcbiAgICAgIGFzc2VydC5vayhzY3JpcHQuZW5kc1dpdGgoJ2FjJyksICdTY2hub3JyIHNjcmlwdCBzaG91bGQgZW5kIHdpdGggMHhBQycpO1xuICAgICAgYXNzZXJ0Lm9rKHNjcmlwdC5zdGFydHNXaXRoKCcyMCcpLCAnU2Nobm9yciBzY3JpcHQgc2hvdWxkIHN0YXJ0IHdpdGggT1BfREFUQV8zMicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtYXRjaCB0aGUgZml4dHVyZSBTQ1JJUFRfUFVCTElDX0tFWSBmb3IgdGhlIFNjaG5vcnIgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNjcmlwdCA9IGFkZHJlc3NUb1NjcmlwdFB1YmxpY0tleShBRERSRVNTRVMudmFsaWQpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHNjcmlwdCwgU0NSSVBUX1BVQkxJQ19LRVkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZXJpdmUgdGhlIEVDRFNBIHNjcmlwdFB1YmxpY0tleSBmcm9tIGFuIEVDRFNBIGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzY3JpcHQgPSBhZGRyZXNzVG9TY3JpcHRQdWJsaWNLZXkoQUREUkVTU0VTLnZhbGlkRWNkc2EpO1xuICAgICAgLy8gRUNEU0E6IE9QX0RBVEFfMzMgKDB4MjEpICsgMzMtYnl0ZSBjb21wcmVzc2VkICsgT1BfQ0hFQ0tTSUdfRUNEU0EgKDB4QUIpID0gMzUgYnl0ZXMgPSA3MCBoZXggY2hhcnNcbiAgICAgIGFzc2VydC5lcXVhbChzY3JpcHQubGVuZ3RoLCA3MCk7XG4gICAgICBhc3NlcnQub2soc2NyaXB0LmVuZHNXaXRoKCdhYicpLCAnRUNEU0Egc2NyaXB0IHNob3VsZCBlbmQgd2l0aCAweEFCJyk7XG4gICAgICBhc3NlcnQub2soc2NyaXB0LnN0YXJ0c1dpdGgoJzIxJyksICdFQ0RTQSBzY3JpcHQgc2hvdWxkIHN0YXJ0IHdpdGggT1BfREFUQV8zMycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtYXRjaCB0aGUgZml4dHVyZSBFQ0RTQV9TQ1JJUFRfUFVCTElDX0tFWSBmb3IgdGhlIEVDRFNBIGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzY3JpcHQgPSBhZGRyZXNzVG9TY3JpcHRQdWJsaWNLZXkoQUREUkVTU0VTLnZhbGlkRWNkc2EpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHNjcmlwdCwgRUNEU0FfU0NSSVBUX1BVQkxJQ19LRVkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBmb3IgYW4gaW52YWxpZCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBhZGRyZXNzVG9TY3JpcHRQdWJsaWNLZXkoJ25vdGFuYWRkcmVzcycpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZm9yIGFuIGFkZHJlc3Mgd2l0aG91dCBhIGNvbG9uIHByZWZpeCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYWRkcmVzc1RvU2NyaXB0UHVibGljS2V5KCdub2NvbG9uJykpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZFB1YmxpY0tleScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhIHZhbGlkIGNvbXByZXNzZWQgMzMtYnl0ZSBwdWJsaWMga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0Lm9rKGlzVmFsaWRQdWJsaWNLZXkoS0VZUy5wdWIpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkUHVibGljS2V5KCcnKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYSBzdHJpbmcgdGhhdCBpcyBub3QgaGV4JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGlzVmFsaWRQdWJsaWNLZXkoJ25vdF9hX2tleScpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpbmNvcnJlY3Qga2V5IGxlbmd0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkUHVibGljS2V5KCcwMTAyMDMwNDA1JyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IHVuY29tcHJlc3NlZCA2NS1ieXRlIHB1YmxpYyBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmYWtlVW5jb21wcmVzc2VkID0gJzA0JyArICdhYicucmVwZWF0KDY0KTtcbiAgICAgIGFzc2VydC5vayhpc1ZhbGlkUHVibGljS2V5KGZha2VVbmNvbXByZXNzZWQpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgbnVsbC1saWtlIHZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGlzVmFsaWRQdWJsaWNLZXkobnVsbCBhcyB1bmtub3duIGFzIHN0cmluZyksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRQcml2YXRlS2V5JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWNjZXB0IGEgdmFsaWQgMzItYnl0ZSBoZXggcHJpdmF0ZSBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQub2soaXNWYWxpZFByaXZhdGVLZXkoS0VZUy5wcnYpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkUHJpdmF0ZUtleSgnJyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgbm9uLWhleCBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoaXNWYWxpZFByaXZhdGVLZXkoJ25vdF9hX2tleScpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBudWxsLWxpa2UgdmFsdWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoaXNWYWxpZFByaXZhdGVLZXkobnVsbCBhcyB1bmtub3duIGFzIHN0cmluZyksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRUcmFuc2FjdGlvbklkJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWNjZXB0IGEgdmFsaWQgNjQtY2hhciBoZXggdHJhbnNhY3Rpb24gSUQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQub2soaXNWYWxpZFRyYW5zYWN0aW9uSWQoVVRYT1Muc2ltcGxlLnRyYW5zYWN0aW9uSWQpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHNob3J0IGhleCBzdHJpbmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGlzVmFsaWRUcmFuc2FjdGlvbklkKCdhYmNkZWYxMjM0JyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5vbi1oZXggc3RyaW5ncycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkVHJhbnNhY3Rpb25JZCgneHl6JyArICdhJy5yZXBlYXQoNjEpKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGlzVmFsaWRUcmFuc2FjdGlvbklkKCcnKSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVXRpbHMgY2xhc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdXRpbHMgPSBuZXcgVXRpbHMoKTtcblxuICAgIGl0KCdpc1ZhbGlkQWRkcmVzcyBzaG91bGQgZGVsZWdhdGUgdG8gaXNWYWxpZEthc3BhQWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5vayh1dGlscy5pc1ZhbGlkQWRkcmVzcyhBRERSRVNTRVMudmFsaWQpKTtcbiAgICAgIGFzc2VydC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcygnaW52YWxpZCcpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXNWYWxpZEJsb2NrSWQgc2hvdWxkIGFjY2VwdCA2NC1jaGFyIGhleCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5vayh1dGlscy5pc1ZhbGlkQmxvY2tJZChVVFhPUy5zaW1wbGUudHJhbnNhY3Rpb25JZCkpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHV0aWxzLmlzVmFsaWRCbG9ja0lkKCdzaG9ydCcpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXNWYWxpZFByaXZhdGVLZXkgc2hvdWxkIGFjY2VwdCB2YWxpZCBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQub2sodXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoS0VZUy5wcnYpKTtcbiAgICB9KTtcblxuICAgIGl0KCdpc1ZhbGlkUHVibGljS2V5IHNob3VsZCBhY2NlcHQgdmFsaWQga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0Lm9rKHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoS0VZUy5wdWIpKTtcbiAgICB9KTtcblxuICAgIGl0KCdpc1ZhbGlkU2lnbmF0dXJlIHNob3VsZCBhY2NlcHQgMTI4LWNoYXIgaGV4JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2lnID0gJ2FiJy5yZXBlYXQoNjQpO1xuICAgICAgYXNzZXJ0Lm9rKHV0aWxzLmlzVmFsaWRTaWduYXR1cmUoc2lnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXNWYWxpZFNpZ25hdHVyZSBzaG91bGQgcmVqZWN0IHNob3J0IHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwodXRpbHMuaXNWYWxpZFNpZ25hdHVyZSgnYWJjZCcpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXNWYWxpZFRyYW5zYWN0aW9uSWQgc2hvdWxkIGFjY2VwdCA2NC1jaGFyIGhleCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5vayh1dGlscy5pc1ZhbGlkVHJhbnNhY3Rpb25JZChVVFhPUy5zaW1wbGUudHJhbnNhY3Rpb25JZCkpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19