@bitgo-beta/sdk-coin-xtz 1.4.3-alpha.41 → 1.4.3-alpha.410
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/index.js +23 -9
- package/dist/src/lib/iface.d.ts +34 -1
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.js +23 -9
- package/dist/src/lib/keyPair.js +41 -27
- package/dist/src/lib/multisigUtils.js +36 -23
- package/dist/src/lib/transaction.js +28 -14
- package/dist/src/lib/transactionBuilder.js +12 -12
- package/dist/src/lib/transferBuilder.js +1 -1
- package/dist/src/lib/utils.d.ts +42 -27
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +70 -38
- package/dist/src/xtz.d.ts +50 -5
- package/dist/src/xtz.d.ts.map +1 -1
- package/dist/src/xtz.js +228 -8
- package/dist/test/fixtures.d.ts +571 -0
- package/dist/test/fixtures.d.ts.map +1 -0
- package/dist/test/fixtures.js +656 -0
- package/dist/test/resources.d.ts +451 -0
- package/dist/test/resources.d.ts.map +1 -0
- package/dist/test/resources.js +349 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +142 -0
- package/dist/test/unit/offlineTransactionBuilder.d.ts +2 -0
- package/dist/test/unit/offlineTransactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/offlineTransactionBuilder.js +291 -0
- package/dist/test/unit/transaction.d.ts +2 -0
- package/dist/test/unit/transaction.d.ts.map +1 -0
- package/dist/test/unit/transaction.js +98 -0
- package/dist/test/unit/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder.js +656 -0
- package/dist/test/unit/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transferBuilder.js +82 -0
- package/dist/test/unit/util.d.ts +2 -0
- package/dist/test/unit/util.d.ts.map +1 -0
- package/dist/test/unit/util.js +198 -0
- package/dist/test/unit/xtz.d.ts +2 -0
- package/dist/test/unit/xtz.d.ts.map +1 -0
- package/dist/test/unit/xtz.js +192 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +16 -12
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -106
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transferBuilder.d.ts","sourceRoot":"","sources":["../../../test/unit/transferBuilder.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const assert_1 = __importDefault(require("assert"));
|
|
7
|
+
const should_1 = __importDefault(require("should"));
|
|
8
|
+
const transferBuilder_1 = require("../../src/lib/transferBuilder");
|
|
9
|
+
describe('Tezos Transfer builder', function () {
|
|
10
|
+
describe('should build', () => {
|
|
11
|
+
it('a valid transfer with minimum fields', async () => {
|
|
12
|
+
const builder = new transferBuilder_1.TransferBuilder();
|
|
13
|
+
const transfer = builder.amount('10').from('a').to('b').fee('20').build();
|
|
14
|
+
transfer.amount.should.equal('10');
|
|
15
|
+
should_1.default.not.exist(transfer.coin);
|
|
16
|
+
transfer.from.should.equal('a');
|
|
17
|
+
transfer.to.should.equal('b');
|
|
18
|
+
transfer.fee.fee.should.equal('20');
|
|
19
|
+
should_1.default.not.exist(transfer.fee.gasLimit);
|
|
20
|
+
should_1.default.not.exist(transfer.fee.storageLimit);
|
|
21
|
+
should_1.default.not.exist(transfer.counter);
|
|
22
|
+
should_1.default.not.exist(transfer.dataToSign);
|
|
23
|
+
});
|
|
24
|
+
it('a valid transfer with all fields', async () => {
|
|
25
|
+
const builder = new transferBuilder_1.TransferBuilder();
|
|
26
|
+
const transfer = builder
|
|
27
|
+
.amount('10')
|
|
28
|
+
.coin('testCoin')
|
|
29
|
+
.from('a')
|
|
30
|
+
.to('b')
|
|
31
|
+
.fee('20')
|
|
32
|
+
.gasLimit('30')
|
|
33
|
+
.storageLimit('40')
|
|
34
|
+
.counter('0')
|
|
35
|
+
.dataToSign('someEncodedData')
|
|
36
|
+
.build();
|
|
37
|
+
transfer.amount.should.equal('10');
|
|
38
|
+
should_1.default.exist(transfer.coin);
|
|
39
|
+
transfer.coin.should.equal('testCoin');
|
|
40
|
+
transfer.from.should.equal('a');
|
|
41
|
+
transfer.to.should.equal('b');
|
|
42
|
+
transfer.fee.fee.should.equal('20');
|
|
43
|
+
should_1.default.exist(transfer.fee.gasLimit);
|
|
44
|
+
transfer.fee.gasLimit.should.equal('30');
|
|
45
|
+
should_1.default.exist(transfer.fee.storageLimit);
|
|
46
|
+
transfer.fee.storageLimit.should.equal('40');
|
|
47
|
+
should_1.default.exist(transfer.counter);
|
|
48
|
+
transfer.counter.should.equal('0');
|
|
49
|
+
should_1.default.exist(transfer.dataToSign);
|
|
50
|
+
transfer.dataToSign.should.equal('someEncodedData');
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe('should fail to', () => {
|
|
54
|
+
it('build an empty transfer', async () => {
|
|
55
|
+
const builder = new transferBuilder_1.TransferBuilder();
|
|
56
|
+
assert_1.default.throws(() => builder.build(), new RegExp('Missing transfer mandatory fields'));
|
|
57
|
+
});
|
|
58
|
+
it('build a transfer without amount', async () => {
|
|
59
|
+
const builder = new transferBuilder_1.TransferBuilder()
|
|
60
|
+
.from('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL')
|
|
61
|
+
.to('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A')
|
|
62
|
+
.fee('20');
|
|
63
|
+
assert_1.default.throws(() => builder.build(), new RegExp('Missing transfer mandatory fields'));
|
|
64
|
+
});
|
|
65
|
+
it('build a transfer without from address', async () => {
|
|
66
|
+
const builder = new transferBuilder_1.TransferBuilder().amount('10').to('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A').fee('20');
|
|
67
|
+
assert_1.default.throws(() => builder.build(), new RegExp('Missing transfer mandatory fields'));
|
|
68
|
+
});
|
|
69
|
+
it('build a transfer without destination address', async () => {
|
|
70
|
+
const builder = new transferBuilder_1.TransferBuilder().amount('10').from('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL').fee('20');
|
|
71
|
+
assert_1.default.throws(() => builder.build(), new RegExp('Missing transfer mandatory fields'));
|
|
72
|
+
});
|
|
73
|
+
it('build a transfer without fee', async () => {
|
|
74
|
+
const builder = new transferBuilder_1.TransferBuilder()
|
|
75
|
+
.amount('10')
|
|
76
|
+
.from('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL')
|
|
77
|
+
.to('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A');
|
|
78
|
+
assert_1.default.throws(() => builder.build(), new RegExp('Missing transfer mandatory fields'));
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zZmVyQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1QixvREFBNEI7QUFFNUIsbUVBQWdFO0FBRWhFLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRTtJQUNqQyxRQUFRLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtRQUM1QixFQUFFLENBQUMsc0NBQXNDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDcEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxpQ0FBZSxFQUFFLENBQUM7WUFDdEMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMxRSxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkMsZ0JBQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsZ0JBQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEMsZ0JBQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEs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RUFBRSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDOUMsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksTUFBTSxDQUFDLG1DQUFtQyxDQUFDLENBQUMsQ0FBQztRQUN4RixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5cbmltcG9ydCB7IFRyYW5zZmVyQnVpbGRlciB9IGZyb20gJy4uLy4uL3NyYy9saWIvdHJhbnNmZXJCdWlsZGVyJztcblxuZGVzY3JpYmUoJ1Rlem9zIFRyYW5zZmVyIGJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdzaG91bGQgYnVpbGQnLCAoKSA9PiB7XG4gICAgaXQoJ2EgdmFsaWQgdHJhbnNmZXIgd2l0aCBtaW5pbXVtIGZpZWxkcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBjb25zdCB0cmFuc2ZlciA9IGJ1aWxkZXIuYW1vdW50KCcxMCcpLmZyb20oJ2EnKS50bygnYicpLmZlZSgnMjAnKS5idWlsZCgpO1xuICAgICAgdHJhbnNmZXIuYW1vdW50LnNob3VsZC5lcXVhbCgnMTAnKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHJhbnNmZXIuY29pbik7XG4gICAgICB0cmFuc2Zlci5mcm9tLnNob3VsZC5lcXVhbCgnYScpO1xuICAgICAgdHJhbnNmZXIudG8uc2hvdWxkLmVxdWFsKCdiJyk7XG4gICAgICB0cmFuc2Zlci5mZWUuZmVlLnNob3VsZC5lcXVhbCgnMjAnKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHJhbnNmZXIuZmVlLmdhc0xpbWl0KTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHJhbnNmZXIuZmVlLnN0b3JhZ2VMaW1pdCk7XG4gICAgICBzaG91bGQubm90LmV4aXN0KHRyYW5zZmVyLmNvdW50ZXIpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdCh0cmFuc2Zlci5kYXRhVG9TaWduKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHZhbGlkIHRyYW5zZmVyIHdpdGggYWxsIGZpZWxkcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBjb25zdCB0cmFuc2ZlciA9IGJ1aWxkZXJcbiAgICAgICAgLmFtb3VudCgnMTAnKVxuICAgICAgICAuY29pbigndGVzdENvaW4nKVxuICAgICAgICAuZnJvbSgnYScpXG4gICAgICAgIC50bygnYicpXG4gICAgICAgIC5mZWUoJzIwJylcbiAgICAgICAgLmdhc0xpbWl0KCczMCcpXG4gICAgICAgIC5zdG9yYWdlTGltaXQoJzQwJylcbiAgICAgICAgLmNvdW50ZXIoJzAnKVxuICAgICAgICAuZGF0YVRvU2lnbignc29tZUVuY29kZWREYXRhJylcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgICB0cmFuc2Zlci5hbW91bnQuc2hvdWxkLmVxdWFsKCcxMCcpO1xuICAgICAgc2hvdWxkLmV4aXN0KHRyYW5zZmVyLmNvaW4pO1xuICAgICAgdHJhbnNmZXIuY29pbiEuc2hvdWxkLmVxdWFsKCd0ZXN0Q29pbicpO1xuICAgICAgdHJhbnNmZXIuZnJvbS5zaG91bGQuZXF1YWwoJ2EnKTtcbiAgICAgIHRyYW5zZmVyLnRvLnNob3VsZC5lcXVhbCgnYicpO1xuICAgICAgdHJhbnNmZXIuZmVlLmZlZS5zaG91bGQuZXF1YWwoJzIwJyk7XG4gICAgICBzaG91bGQuZXhpc3QodHJhbnNmZXIuZmVlLmdhc0xpbWl0KTtcbiAgICAgIHRyYW5zZmVyLmZlZS5nYXNMaW1pdCEuc2hvdWxkLmVxdWFsKCczMCcpO1xuICAgICAgc2hvdWxkLmV4aXN0KHRyYW5zZmVyLmZlZS5zdG9yYWdlTGltaXQpO1xuICAgICAgdHJhbnNmZXIuZmVlLnN0b3JhZ2VMaW1pdCEuc2hvdWxkLmVxdWFsKCc0MCcpO1xuICAgICAgc2hvdWxkLmV4aXN0KHRyYW5zZmVyLmNvdW50ZXIpO1xuICAgICAgdHJhbnNmZXIuY291bnRlciEuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICBzaG91bGQuZXhpc3QodHJhbnNmZXIuZGF0YVRvU2lnbik7XG4gICAgICB0cmFuc2Zlci5kYXRhVG9TaWduIS5zaG91bGQuZXF1YWwoJ3NvbWVFbmNvZGVkRGF0YScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkIGZhaWwgdG8nLCAoKSA9PiB7XG4gICAgaXQoJ2J1aWxkIGFuIGVtcHR5IHRyYW5zZmVyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5idWlsZCgpLCBuZXcgUmVnRXhwKCdNaXNzaW5nIHRyYW5zZmVyIG1hbmRhdG9yeSBmaWVsZHMnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSB0cmFuc2ZlciB3aXRob3V0IGFtb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgLmZyb20oJ0tUMU5IMk0yM3hvdmh3N3V3V1Z1b0dUWXh5a2VDY1ZmU3FoTCcpXG4gICAgICAgIC50bygndHoxVlJqUnBWS252MTZBVnByRkgxdGtEbjRURGZWcUE4OTNBJylcbiAgICAgICAgLmZlZSgnMjAnKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5idWlsZCgpLCBuZXcgUmVnRXhwKCdNaXNzaW5nIHRyYW5zZmVyIG1hbmRhdG9yeSBmaWVsZHMnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSB0cmFuc2ZlciB3aXRob3V0IGZyb20gYWRkcmVzcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyKCkuYW1vdW50KCcxMCcpLnRvKCd0ejFWUmpScFZLbnYxNkFWcHJGSDF0a0RuNFREZlZxQTg5M0EnKS5mZWUoJzIwJyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIuYnVpbGQoKSwgbmV3IFJlZ0V4cCgnTWlzc2luZyB0cmFuc2ZlciBtYW5kYXRvcnkgZmllbGRzJykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgdHJhbnNmZXIgd2l0aG91dCBkZXN0aW5hdGlvbiBhZGRyZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2ZlckJ1aWxkZXIoKS5hbW91bnQoJzEwJykuZnJvbSgnS1QxTkgyTTIzeG92aHc3dXdXVnVvR1RZeHlrZUNjVmZTcWhMJykuZmVlKCcyMCcpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLmJ1aWxkKCksIG5ldyBSZWdFeHAoJ01pc3NpbmcgdHJhbnNmZXIgbWFuZGF0b3J5IGZpZWxkcycpKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHRyYW5zZmVyIHdpdGhvdXQgZmVlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAuYW1vdW50KCcxMCcpXG4gICAgICAgIC5mcm9tKCdLVDFOSDJNMjN4b3Zodzd1d1dWdW9HVFl4eWtlQ2NWZlNxaEwnKVxuICAgICAgICAudG8oJ3R6MVZSalJwVktudjE2QVZwckZIMXRrRG40VERmVnFBODkzQScpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLmJ1aWxkKCksIG5ldyBSZWdFeHAoJ01pc3NpbmcgdHJhbnNmZXIgbWFuZGF0b3J5IGZpZWxkcycpKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../test/unit/util.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const assert_1 = __importDefault(require("assert"));
|
|
7
|
+
const should_1 = __importDefault(require("should"));
|
|
8
|
+
const resources_1 = require("../resources");
|
|
9
|
+
const src_1 = require("../../src");
|
|
10
|
+
describe('XTZ util library', function () {
|
|
11
|
+
describe('address', function () {
|
|
12
|
+
it('should validate addresses', function () {
|
|
13
|
+
const validAddresses = [
|
|
14
|
+
'tz1aWXP237BLwNHJcCD4b3DutCevhqq2T1Z9',
|
|
15
|
+
'tz2SHdGxFGhs68wYNC4hEqxbWARxp2J4mVxv',
|
|
16
|
+
'tz3gN8NTLNLJg5KRsUU47NHNVHbdhcFXjjaB',
|
|
17
|
+
'KT1EGbAxguaWQFkV3Egb2Z1r933MWuEYyrJS',
|
|
18
|
+
];
|
|
19
|
+
for (const address of validAddresses) {
|
|
20
|
+
src_1.XtzLib.Utils.isValidAddress(address).should.be.true();
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
it('should fail to validate invalid addresses', function () {
|
|
24
|
+
const invalidAddresses = [
|
|
25
|
+
'tz4aWXP237BLwNHJcCD4b3DutCevhqq2T1Z9',
|
|
26
|
+
'xtz2SHdGxFGhs68wYNC4hEqxbWARxp2J4mVxv',
|
|
27
|
+
'KT2EGbAxguaWQFkV3Egb2Z1r933MWuEYyrJS',
|
|
28
|
+
'abc',
|
|
29
|
+
];
|
|
30
|
+
for (const address of invalidAddresses) {
|
|
31
|
+
should_1.default.doesNotThrow(() => src_1.XtzLib.Utils.isValidAddress(address));
|
|
32
|
+
src_1.XtzLib.Utils.isValidAddress(address).should.be.false();
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('block hash', function () {
|
|
37
|
+
it('should validate block hashes', function () {
|
|
38
|
+
const validHashes = [
|
|
39
|
+
'BKoifs5gGffAzuRBcg3ygxbLdrCXyDDS1ALvMG8SFYWahzoYMku',
|
|
40
|
+
'BL4oxWAkozJ3mJHwVFQqga5dQMBi8kBCPAQyBKgF78z7SQT1AvN',
|
|
41
|
+
'BL29n92KHaarq1r7XjwTFotzCpxq7LtXMc9bF2qD9Qt26ZTYQia',
|
|
42
|
+
];
|
|
43
|
+
for (const hash of validHashes) {
|
|
44
|
+
src_1.XtzLib.Utils.isValidBlockHash(hash).should.be.true();
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
it('should fail to validate invalid block hashes', function () {
|
|
48
|
+
const invalidHashes = [
|
|
49
|
+
'AKoifs5gGffAzuRBcg3ygxbLdrCXyDDS1ALvMG8SFYWahzoYMku',
|
|
50
|
+
'BKoifs5gGffAzuRBcg3ygxbLdrCXyDDS1ALvMG8SFYWahzoYMku1111111111',
|
|
51
|
+
'invalid',
|
|
52
|
+
];
|
|
53
|
+
for (const hash of invalidHashes) {
|
|
54
|
+
src_1.XtzLib.Utils.isValidBlockHash(hash).should.be.false();
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe('transaction hash', function () {
|
|
59
|
+
it('should validate tx hashes', function () {
|
|
60
|
+
const validHashes = [
|
|
61
|
+
'opUmZNMueryYFxTbzzocS7K4dzs3NmgKqhhr9TkcftszDDnoRVu',
|
|
62
|
+
'ookyzxsYF7vyTeDzsgs58XJ4PXuvBkK8wWqZJ4EoRS6RWQb4Y9P',
|
|
63
|
+
'ooXQoUX32szALRvgzD2TDzeRPXtPfmfqwoehPaK5khbrBiMAtSw',
|
|
64
|
+
];
|
|
65
|
+
for (const hash of validHashes) {
|
|
66
|
+
src_1.XtzLib.Utils.isValidTransactionHash(hash).should.be.true();
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
it('should fail to validate invalid tx hashes', function () {
|
|
70
|
+
const invalidHashes = [
|
|
71
|
+
'lpUmZNMueryYFxTbzzocS7K4dzs3NmgKqhhr9TkcftszDDnoRVu',
|
|
72
|
+
'opUmZNMueryYFxTbzzocS7K4dzs3NmgKqhhr9TkcftszDDnoRVu1111111111',
|
|
73
|
+
'invalid',
|
|
74
|
+
];
|
|
75
|
+
for (const hash of invalidHashes) {
|
|
76
|
+
src_1.XtzLib.Utils.isValidTransactionHash(hash).should.be.false();
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
it('should calculate the transaction hash', async function () {
|
|
80
|
+
const operationId = await src_1.XtzLib.Utils.calculateTransactionId(resources_1.signedSerializedOriginationTransaction);
|
|
81
|
+
operationId.should.equal('opPsNbm7EcqPyryBDDR28BjdthnriktK8TbMvpwc9r4NwmvToYP');
|
|
82
|
+
});
|
|
83
|
+
it('should calculate the originated account address', async function () {
|
|
84
|
+
const accountAddress = await src_1.XtzLib.Utils.calculateOriginatedAddress('opPsNbm7EcqPyryBDDR28BjdthnriktK8TbMvpwc9r4NwmvToYP', 0);
|
|
85
|
+
accountAddress.should.equal('KT1LJvp55fbdNwbisJFign9wA4cPgq9T9oc4');
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe('sign', function () {
|
|
89
|
+
it('should produce a valid signature', async function () {
|
|
90
|
+
const signatures = await src_1.XtzLib.Utils.sign(resources_1.defaultKeyPairFromPrv, resources_1.defaultDataToSign);
|
|
91
|
+
signatures.bytes.should.equal('0507070a000000160196369c90625575ba44594b23794832a9337f7a2d0007070000050502000000320320053d036d0743035d0a00000015006b5ddaef3fb5d7c151cfb36fbe43a7a066777394031e0743036a0001034f034d031b');
|
|
92
|
+
signatures.prefixSig.should.equal('spsig19yWAc5nBpGmNCWdvEWHnpJXEiTqZjhNgWwWa1Lz6kVgakb7qCPj9z6G6LLEFWmsmNcPCZYseERVDUXh99N7wqDppcDKQM');
|
|
93
|
+
signatures.sbytes.should.equal('0507070a000000160196369c90625575ba44594b23794832a9337f7a2d0007070000050502000000320320053d036d0743035d0a00000015006b5ddaef3fb5d7c151cfb36fbe43a7a066777394031e0743036a0001034f034d031b1fd49502ba8dc7adb01716093abe715d1eef87f47a88d8ec104fcc1d6baca7ba06cc2ced6c5baa880d6045b44be926d63bc3aeb3b9124f3b32ac6d9c63584fe5');
|
|
94
|
+
signatures.sig.should.equal('sigS9pqYUXiUJcz2Wsx5x98ud9KtgGVg4gCwpBoDBgHrZy9gwJedKMCrcQPxm9C7i1gesETbhFD6Gm8BpadGgd2cgiGoQbiY');
|
|
95
|
+
});
|
|
96
|
+
it('should produce a valid signature with watermark', async function () {
|
|
97
|
+
const signatures = await src_1.XtzLib.Utils.sign(resources_1.defaultKeyPairFromPrv, resources_1.defaultDataToSign, new Uint8Array());
|
|
98
|
+
signatures.bytes.should.equal('0507070a000000160196369c90625575ba44594b23794832a9337f7a2d0007070000050502000000320320053d036d0743035d0a00000015006b5ddaef3fb5d7c151cfb36fbe43a7a066777394031e0743036a0001034f034d031b');
|
|
99
|
+
signatures.prefixSig.should.equal('spsig1DWTuXdgUg2t64PLRfaapsYejCoCVVkqy2Zjv41Zirt7MjoqSfBnP38qoAg3SWicfQNiG25yMqGYge4jrfrwv9H8hRKDyY');
|
|
100
|
+
signatures.sbytes.should.equal('0507070a000000160196369c90625575ba44594b23794832a9337f7a2d0007070000050502000000320320053d036d0743035d0a00000015006b5ddaef3fb5d7c151cfb36fbe43a7a066777394031e0743036a0001034f034d031b3ad76776913e2c0cfe827b572c417b73a14debcf9e5db726ce9b10aa4bea6aa1173b313ff67eb9bdfdcf9a753178e6ac78ac5f53aef8bcca6d56706f5c3fb01f');
|
|
101
|
+
signatures.sig.should.equal('sigVgnaU2S1L4jhtPaTX2SAxsGpP1dRS89VTSR9FrFuxxPvgA2G67QRuez6o6xP7ekagdZX4ELvh7pbMMdLoBSzvk2AVyQpk');
|
|
102
|
+
});
|
|
103
|
+
it('should validate a signature belongs to a public key for a string message', async function () {
|
|
104
|
+
const message = 'helloworld';
|
|
105
|
+
const messageHex = Buffer.from(message).toString('hex');
|
|
106
|
+
const signatures = await src_1.XtzLib.Utils.sign(resources_1.defaultKeyPairFromPrv, messageHex, new Uint8Array(0));
|
|
107
|
+
const result = await src_1.XtzLib.Utils.verifySignature(messageHex, resources_1.defaultKeyPairFromPub.getKeys().pub, signatures.sig, new Uint8Array(0));
|
|
108
|
+
result.should.be.true();
|
|
109
|
+
});
|
|
110
|
+
it('should validate a signature belongs to a public key for dataToSign', async function () {
|
|
111
|
+
const messageHex = Buffer.from(resources_1.defaultDataToSign).toString('hex');
|
|
112
|
+
const signatures = await src_1.XtzLib.Utils.sign(resources_1.defaultKeyPairFromPrv, messageHex, new Uint8Array(0));
|
|
113
|
+
const result = await src_1.XtzLib.Utils.verifySignature(messageHex, resources_1.defaultKeyPairFromPub.getKeys().pub, signatures.sig, new Uint8Array(0));
|
|
114
|
+
result.should.be.true();
|
|
115
|
+
});
|
|
116
|
+
it('should fail to validate a signature with the wrong watermark', async function () {
|
|
117
|
+
const messageHex = Buffer.from(resources_1.defaultDataToSign).toString('hex');
|
|
118
|
+
const signatures = await src_1.XtzLib.Utils.sign(resources_1.defaultKeyPairFromPrv, messageHex);
|
|
119
|
+
const result = await src_1.XtzLib.Utils.verifySignature(messageHex, resources_1.defaultKeyPairFromPub.getKeys().pub, signatures.sig, new Uint8Array(3));
|
|
120
|
+
result.should.be.false();
|
|
121
|
+
});
|
|
122
|
+
it('should fail to validate a signature with the wrong public key', async function () {
|
|
123
|
+
const messageHex = Buffer.from(resources_1.defaultDataToSign).toString('hex');
|
|
124
|
+
const signatures = await src_1.XtzLib.Utils.sign(resources_1.defaultKeyPairFromPrv, messageHex);
|
|
125
|
+
const result = await src_1.XtzLib.Utils.verifySignature(messageHex, 'sppk7d2ztzbrLdBaTB7yzaWRkPfcWGsrNQNJdkBE9bCTSSzekLNzpvf', signatures.sig);
|
|
126
|
+
result.should.be.false();
|
|
127
|
+
});
|
|
128
|
+
it('should fail to validate a signature with the wrong message', async function () {
|
|
129
|
+
const messageHex = Buffer.from(resources_1.defaultDataToSign).toString('hex');
|
|
130
|
+
const signatures = await src_1.XtzLib.Utils.sign(resources_1.defaultKeyPairFromPrv, messageHex);
|
|
131
|
+
const secondMessageHex = Buffer.from('helloWorld').toString('hex');
|
|
132
|
+
const result = await src_1.XtzLib.Utils.verifySignature(secondMessageHex, resources_1.defaultKeyPairFromPub.getKeys().pub, signatures.sig);
|
|
133
|
+
result.should.be.false();
|
|
134
|
+
});
|
|
135
|
+
it('should fail if the key pair does not have the private key', async function () {
|
|
136
|
+
await src_1.XtzLib.Utils.sign(resources_1.defaultKeyPairFromPub, resources_1.defaultDataToSign).should.be.rejectedWith(new RegExp('Missing private key'));
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
describe('generateDataToSign', function () {
|
|
140
|
+
it('should build transfer data to sign', function () {
|
|
141
|
+
const dataToSign = src_1.XtzLib.Utils.generateDataToSign('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL', 'tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS', '100', '0');
|
|
142
|
+
JSON.stringify(dataToSign).should.equal(JSON.stringify(resources_1.validDataToSign));
|
|
143
|
+
});
|
|
144
|
+
it('should fail if the contract address has the wrong format', function () {
|
|
145
|
+
assert_1.default.throws(() => src_1.XtzLib.Utils.generateDataToSign('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS', 'tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS', '0', '0'), new RegExp('Invalid contract address'));
|
|
146
|
+
});
|
|
147
|
+
it('should fail if the destination address has the wrong format', function () {
|
|
148
|
+
assert_1.default.throws(() => src_1.XtzLib.Utils.generateDataToSign('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL', 'abc', '0', '0'), new RegExp('Invalid destination address'));
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
describe('signature', function () {
|
|
152
|
+
it('should validate signature', function () {
|
|
153
|
+
const validSignatures = [
|
|
154
|
+
'sigVgnaU2S1L4jhtPaTX2SAxsGpP1dRS89VTSR9FrFuxxPvgA2G67QRuez6o6xP7ekagdZX4ELvh7pbMMdLoBSzvk2AVyQpk',
|
|
155
|
+
'spsig1DWTuXdgUg2t64PLRfaapsYejCoCVVkqy2Zjv41Zirt7MjoqSfBnP38qoAg3SWicfQNiG25yMqGYge4jrfrwv9H8hRKDyY',
|
|
156
|
+
'sigS9pqYUXiUJcz2Wsx5x98ud9KtgGVg4gCwpBoDBgHrZy9gwJedKMCrcQPxm9C7i1gesETbhFD6Gm8BpadGgd2cgiGoQbiY',
|
|
157
|
+
'spsig19yWAc5nBpGmNCWdvEWHnpJXEiTqZjhNgWwWa1Lz6kVgakb7qCPj9z6G6LLEFWmsmNcPCZYseERVDUXh99N7wqDppcDKQM',
|
|
158
|
+
];
|
|
159
|
+
for (const hash of validSignatures) {
|
|
160
|
+
src_1.XtzLib.Utils.isValidSignature(hash).should.be.true();
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
it('should fail to validate invalid signature', function () {
|
|
164
|
+
const invalidHashes = [
|
|
165
|
+
'sigS9pqYUXiUJcz2Wsx5x98ud9KtgGVg4gCwpBoDBgHrZ',
|
|
166
|
+
'sig',
|
|
167
|
+
'BKoifs5gGffAzuRBcg3ygxbLdrCXyDDS1ALvMG8SFYWahzoYMku1111111111',
|
|
168
|
+
'invalid',
|
|
169
|
+
];
|
|
170
|
+
for (const hash of invalidHashes) {
|
|
171
|
+
src_1.XtzLib.Utils.isValidSignature(hash).should.be.false();
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
describe('decodeKey', function () {
|
|
176
|
+
it('should decode the key', function () {
|
|
177
|
+
const validKeys = [['spsk2cbiVsAvpGKmau9XcMscL3NRwjkyT575N5AyAofcoj41x6g6TL', src_1.XtzLib.Utils.hashTypes.spsk]];
|
|
178
|
+
for (const data of validKeys) {
|
|
179
|
+
src_1.XtzLib.Utils.decodeKey(data[0], data[1])
|
|
180
|
+
.toString('hex')
|
|
181
|
+
.should.equal('9cc0aaa9ef687e70f7780e60de08d7a443488a9cf8e1ebe9689118763376c07c');
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
it('should fail to decode an invalid key', function () {
|
|
185
|
+
const invalidKeys = [
|
|
186
|
+
[
|
|
187
|
+
'sigVgnaU2S1L4jhtPaTX2SAxsGpP1dRS89VTSR9FrFuxxPvgA2G67QRuez6o6xP7ekagdZX4ELvh7pbMMdLoBSzvk2AVyQpk',
|
|
188
|
+
src_1.XtzLib.Utils.hashTypes.tz1,
|
|
189
|
+
],
|
|
190
|
+
['sppk', src_1.XtzLib.Utils.hashTypes.sppk],
|
|
191
|
+
];
|
|
192
|
+
for (const data of invalidKeys) {
|
|
193
|
+
assert_1.default.throws(() => src_1.XtzLib.Utils.decodeKey(data[0], data[1]), new RegExp('Unsupported private key'));
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUU1Qiw0Q0FNc0I7QUFDdEIsbUNBQW1DO0FBR25DLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtJQUMzQixRQUFRLENBQUMsU0FBUyxFQUFFO1FBQ2xCLEVBQUUsQ0FBQywyQkFBMkIsRUFBRTtZQUM5QixNQUFNLGNBQWMsR0FBRztnQkFDckIsc0NBQXNDO2dCQUN0QyxzQ0FBc0M7Z0JBQ3RDLHNDQUFzQztnQkFDdEMsc0NBQXNDO2FBQ3ZDLENBQUM7WUFFRixLQUFLLE1BQU0sT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNyQyxZQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRTtZQUM5QyxNQUFNLGdCQUFnQixHQUFHO2dCQUN2QixzQ0FBc0M7Z0JBQ3RDLHVDQUF1QztnQkFDdkMsc0NBQXNDO2dCQUN0QyxLQUFLO2FBQ04sQ0FBQztZQUVGLEtBQUssTUFBTSxPQUFPLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDdkMsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDaEUsWUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6RCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxZQUFZ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QyxJQUFJLENBQUMsQ0FBQyxDQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBYSxDQUFDO3FCQUMzRCxRQUFRLENBQUMsS0FBSyxDQUFDO3FCQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0VBQWtFLENBQUMsQ0FBQztZQUN0RixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsc0NBQXNDLEVBQUU7WUFDekMsTUFBTSxXQUFXLEdBQUc7Z0JBQ2xCO29CQUNFLGtHQUFrRztvQkFDbEcsWUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRztpQkFDM0I7Z0JBQ0QsQ0FBQyxNQUFNLEVBQUUsWUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO2FBQ3RDLENBQUM7WUFFRixLQUFLLE1BQU0sSUFBSSxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUMvQixnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FBQyxZQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBYSxDQUFDLEVBQ3BFLElBQUksTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQ3RDLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuXG5pbXBvcnQge1xuICBkZWZhdWx0RGF0YVRvU2lnbixcbiAgZGVmYXVsdEtleVBhaXJGcm9tUHJ2LFxuICBkZWZhdWx0S2V5UGFpckZyb21QdWIsXG4gIHNpZ25lZFNlcmlhbGl6ZWRPcmlnaW5hdGlvblRyYW5zYWN0aW9uLFxuICB2YWxpZERhdGFUb1NpZ24sXG59IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBYdHpMaWIgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHsgSGFzaFR5cGUgfSBmcm9tICcuLi8uLi9zcmMvbGliL2lmYWNlJztcblxuZGVzY3JpYmUoJ1hUWiB1dGlsIGxpYnJhcnknLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmFsaWRBZGRyZXNzZXMgPSBbXG4gICAgICAgICd0ejFhV1hQMjM3Qkx3TkhKY0NENGIzRHV0Q2V2aHFxMlQxWjknLFxuICAgICAgICAndHoyU0hkR3hGR2hzNjh3WU5DNGhFcXhiV0FSeHAySjRtVnh2JyxcbiAgICAgICAgJ3R6M2dOOE5UTE5MSmc1S1JzVVU0N05ITlZIYmRoY0ZYamphQicsXG4gICAgICAgICdLVDFFR2JBeGd1YVdRRmtWM0VnYjJaMXI5MzNNV3VFWXlySlMnLFxuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCBhZGRyZXNzIG9mIHZhbGlkQWRkcmVzc2VzKSB7XG4gICAgICAgIFh0ekxpYi5VdGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZhbGlkYXRlIGludmFsaWQgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW52YWxpZEFkZHJlc3NlcyA9IFtcbiAgICAgICAgJ3R6NGFXWFAyMzdCTHdOSEpjQ0Q0YjNEdXRDZXZocXEyVDFaOScsXG4gICAgICAgICd4dHoyU0hkR3hGR2hzNjh3WU5DNGhFcXhiV0FSeHAySjRtVnh2JyxcbiAgICAgICAgJ0tUMkVHYkF4Z3VhV1FGa1YzRWdiMloxcjkzM01XdUVZeXJKUycsXG4gICAgICAgICdhYmMnLFxuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCBhZGRyZXNzIG9mIGludmFsaWRBZGRyZXNzZXMpIHtcbiAgICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBYdHpMaWIuVXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykpO1xuICAgICAgICBYdHpMaWIuVXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdibG9jayBoYXNoJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYmxvY2sgaGFzaGVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmFsaWRIYXNoZXMgPSBbXG4gICAgICAgICdCS29pZnM1Z0dmZkF6dVJCY2czeWd4YkxkckNYeUREUzFBTHZNRzhTRllXYWh6b1lNa3UnLFxuICAgICAgICAnQkw0b3hXQWtvekozbUpId1ZGUXFnYTVkUU1CaThrQkNQQVF5QktnRjc4ejdTUVQxQXZOJyxcbiAgICAgICAgJ0JMMjluOTJLSGFhcnExcjdYandURm90ekNweHE3THRYTWM5YkYycUQ5UXQyNlpUWVFpYScsXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGNvbnN0IGhhc2ggb2YgdmFsaWRIYXNoZXMpIHtcbiAgICAgICAgWHR6TGliLlV0aWxzLmlzVmFsaWRCbG9ja0hhc2goaGFzaCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2YWxpZGF0ZSBpbnZhbGlkIGJsb2NrIGhhc2hlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGludmFsaWRIYXNoZXMgPSBbXG4gICAgICAgICdBS29pZnM1Z0dmZkF6dVJCY2czeWd4YkxkckNYeUREUzFBTHZNRzhTRllXYWh6b1lNa3UnLFxuICAgICAgICAnQktvaWZzNWdHZmZBenVSQmNnM3lneGJMZHJDWHlERFMxQUx2TUc4U0ZZV2Foem9ZTWt1MTExMTExMTExMScsXG4gICAgICAgICdpbnZhbGlkJyxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgaGFzaCBvZiBpbnZhbGlkSGFzaGVzKSB7XG4gICAgICAgIFh0ekxpYi5VdGlscy5pc1ZhbGlkQmxvY2tIYXNoKGhhc2gpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndHJhbnNhY3Rpb24gaGFzaCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHR4IGhhc2hlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhbGlkSGFzaGVzID0gW1xuICAgICAgICAnb3BVbVpOTXVlcnlZRnhUYnp6b2NTN0s0ZHpzM05tZ0txaGhyOVRrY2Z0c3pERG5vUlZ1JyxcbiAgICAgICAgJ29va3l6eHNZRjd2eVRlRHpzZ3M1OFhKNFBYdXZCa0s4d1dxWko0RW9SUzZSV1FiNFk5UCcsXG4gICAgICAgICdvb1hRb1VYMzJzekFMUnZnekQyVER6ZVJQWHRQZm1mcXdvZWhQYUs1a2hickJpTUF0U3cnLFxuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCBoYXNoIG9mIHZhbGlkSGFzaGVzKSB7XG4gICAgICAgIFh0ekxpYi5VdGlscy5pc1ZhbGlkVHJhbnNhY3Rpb25IYXNoKGhhc2gpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmFsaWRhdGUgaW52YWxpZCB0eCBoYXNoZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnZhbGlkSGFzaGVzID0gW1xuICAgICAgICAnbHBVbVpOTXVlcnlZRnhUYnp6b2NTN0s0ZHpzM05tZ0txaGhyOVRrY2Z0c3pERG5vUlZ1JyxcbiAgICAgICAgJ29wVW1aTk11ZXJ5WUZ4VGJ6em9jUzdLNGR6czNObWdLcWhocjlUa2NmdHN6RERub1JWdTExMTExMTExMTEnLFxuICAgICAgICAnaW52YWxpZCcsXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGNvbnN0IGhhc2ggb2YgaW52YWxpZEhhc2hlcykge1xuICAgICAgICBYdHpMaWIuVXRpbHMuaXNWYWxpZFRyYW5zYWN0aW9uSGFzaChoYXNoKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FsY3VsYXRlIHRoZSB0cmFuc2FjdGlvbiBoYXNoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9uSWQgPSBhd2FpdCBYdHpMaWIuVXRpbHMuY2FsY3VsYXRlVHJhbnNhY3Rpb25JZChzaWduZWRTZXJpYWxpemVkT3JpZ2luYXRpb25UcmFuc2FjdGlvbik7XG4gICAgICBvcGVyYXRpb25JZC5zaG91bGQuZXF1YWwoJ29wUHNOYm03RWNxUHlyeUJERFIyOEJqZHRobnJpa3RLOFRiTXZwd2M5cjROd212VG9ZUCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjYWxjdWxhdGUgdGhlIG9yaWdpbmF0ZWQgYWNjb3VudCBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWNjb3VudEFkZHJlc3MgPSBhd2FpdCBYdHpMaWIuVXRpbHMuY2FsY3VsYXRlT3JpZ2luYXRlZEFkZHJlc3MoXG4gICAgICAgICdvcFBzTmJtN0VjcVB5cnlCRERSMjhCamR0aG5yaWt0SzhUYk12cHdjOXI0TndtdlRvWVAnLFxuICAgICAgICAwXG4gICAgICApO1xuICAgICAgYWNjb3VudEFkZHJlc3Muc2hvdWxkLmVxdWFsKCdLVDFMSnZwNTVmYmROd2Jpc0pGaWduOXdBNGNQZ3E5VDlvYzQnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NpZ24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGEgdmFsaWQgc2lnbmF0dXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGF3YWl0IFh0ekxpYi5VdGlscy5zaWduKGRlZmF1bHRLZXlQYWlyRnJvbVBydiwgZGVmYXVsdERhdGFUb1NpZ24pO1xuICAgICAgc2lnbmF0dXJlcy5ieXRlcy5zaG91bGQuZXF1YWwoXG4gICAgICAgICcwNTA3MDcwYTAwMDAwMDE2MDE5NjM2OWM5MDYyNTU3NWJhNDQ1OTRiMjM3OTQ4MzJhOTMzN2Y3YTJkMDAwNzA3MDAwMDA1MDUwMjAwMDAwMDMyMDMyMDA1M2QwMzZkMDc0MzAzNWQwYTAwMDAwMDE1MDA2YjVkZGFlZjNmYjVkN2MxNTFjZmIzNmZiZTQzYTdhMDY2Nzc3Mzk0MDMxZTA3NDMwMzZhMDAwMTAzNGYwMzRkMDMxYidcbiAgICAgICk7XG4gICAgICBzaWduYXR1cmVzLnByZWZpeFNpZy5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzcHNpZzE5eVdBYzVuQnBHbU5DV2R2RVdIbnBKWEVpVHFaamhOZ1d3V2ExTHo2a1ZnYWtiN3FDUGo5ejZHNkxMRUZXbXNtTmNQQ1pZc2VFUlZEVVhoOTlON3dxRHBwY0RLUU0nXG4gICAgICApO1xuICAgICAgc2lnbmF0dXJlcy5zYnl0ZXMuc2hvdWxkLmVxdWFsKFxuICAgICAgICAnMDUwNzA3MGEwMDAwMDAxNjAxOTYzNjljOTA2MjU1NzViYTQ0NTk0YjIzNzk0ODMyYTkzMzdmN2EyZDAwMDcwNzAwMDAwNTA1MDIwMDAwMDAzMjAzMjAwNTNkMDM2ZDA3NDMwMzVkMGEwMDAwMDAxNTAwNmI1ZGRhZWYzZmI1ZDdjMTUxY2ZiMzZmYmU0M2E3YTA2Njc3NzM5NDAzMWUwNzQzMDM2YTAwMDEwMzRmMDM0ZDAzMWIxZmQ0OTUwMmJhOGRjN2FkYjAxNzE2MDkzYWJlNzE1ZDFlZWY4N2Y0N2E4OGQ4ZWMxMDRmY2MxZDZiYWNhN2JhMDZjYzJjZWQ2YzViYWE4ODBkNjA0NWI0NGJlOTI2ZDYzYmMzYWViM2I5MTI0ZjNiMzJhYzZkOWM2MzU4NGZlNSdcbiAgICAgICk7XG4gICAgICBzaWduYXR1cmVzLnNpZy5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzaWdTOXBxWVVYaVVKY3oyV3N4NXg5OHVkOUt0Z0dWZzRnQ3dwQm9EQmdIclp5OWd3SmVkS01DcmNRUHhtOUM3aTFnZXNFVGJoRkQ2R204QnBhZEdnZDJjZ2lHb1FiaVknXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGEgdmFsaWQgc2lnbmF0dXJlIHdpdGggd2F0ZXJtYXJrJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGF3YWl0IFh0ekxpYi5VdGlscy5zaWduKGRlZmF1bHRLZXlQYWlyRnJvbVBydiwgZGVmYXVsdERhdGFUb1NpZ24sIG5ldyBVaW50OEFycmF5KCkpO1xuICAgICAgc2lnbmF0dXJlcy5ieXRlcy5zaG91bGQuZXF1YWwoXG4gICAgICAgICcwNTA3MDcwYTAwMDAwMDE2MDE5NjM2OWM5MDYyNTU3NWJhNDQ1OTRiMjM3OTQ4MzJhOTMzN2Y3YTJkMDAwNzA3MDAwMDA1MDUwMjAwMDAwMDMyMDMyMDA1M2QwMzZkMDc0MzAzNWQwYTAwMDAwMDE1MDA2YjVkZGFlZjNmYjVkN2MxNTFjZmIzNmZiZTQzYTdhMDY2Nzc3Mzk0MDMxZTA3NDMwMzZhMDAwMTAzNGYwMzRkMDMxYidcbiAgICAgICk7XG4gICAgICBzaWduYXR1cmVzLnByZWZpeFNpZy5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzcHNpZzFEV1R1WGRnVWcydDY0UExSZmFhcHNZZWpDb0NWVmtxeTJaanY0MVppcnQ3TWpvcVNmQm5QMzhxb0FnM1NXaWNmUU5pRzI1eU1xR1lnZTRqcmZyd3Y5SDhoUktEeVknXG4gICAgICApO1xuICAgICAgc2lnbmF0dXJlcy5zYnl0ZXMuc2hvdWxkLmVxdWFsKFxuICAgICAgICAnMDUwNzA3MGEwMDAwMDAxNjAxOTYzNjljOTA2MjU1NzViYTQ0NTk0YjIzNzk0ODMyYTkzMzdmN2EyZDAwMDcwNzAwMDAwNTA1MDIwMDAwMDAzMjAzMjAwNTNkMDM2ZDA3NDMwMzVkMGEwMDAwMDAxNTAwNmI1ZGRhZWYzZmI1ZDdjMTUxY2ZiMzZmYmU0M2E3YTA2Njc3NzM5NDAzMWUwNzQzMDM2YTAwMDEwMzRmMDM0ZDAzMWIzYWQ3Njc3NjkxM2UyYzBjZmU4MjdiNTcyYzQxN2I3M2ExNGRlYmNmOWU1ZGI3MjZjZTliMTBhYTRiZWE2YWExMTczYjMxM2ZmNjdlYjliZGZkY2Y5YTc1MzE3OGU2YWM3OGFjNWY1M2FlZjhiY2NhNmQ1NjcwNmY1YzNmYjAxZidcbiAgICAgICk7XG4gICAgICBzaWduYXR1cmVzLnNpZy5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzaWdWZ25hVTJTMUw0amh0UGFUWDJTQXhzR3BQMWRSUzg5VlRTUjlGckZ1eHhQdmdBMkc2N1FSdWV6Nm82eFA3ZWthZ2RaWDRFTHZoN3BiTU1kTG9CU3p2azJBVnlRcGsnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhIHNpZ25hdHVyZSBiZWxvbmdzIHRvIGEgcHVibGljIGtleSBmb3IgYSBzdHJpbmcgbWVzc2FnZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnaGVsbG93b3JsZCc7XG4gICAgICBjb25zdCBtZXNzYWdlSGV4ID0gQnVmZmVyLmZyb20obWVzc2FnZSkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGF3YWl0IFh0ekxpYi5VdGlscy5zaWduKGRlZmF1bHRLZXlQYWlyRnJvbVBydiwgbWVzc2FnZUhleCwgbmV3IFVpbnQ4QXJyYXkoMCkpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgWHR6TGliLlV0aWxzLnZlcmlmeVNpZ25hdHVyZShcbiAgICAgICAgbWVzc2FnZUhleCxcbiAgICAgICAgZGVmYXVsdEtleVBhaXJGcm9tUHViLmdldEtleXMoKS5wdWIsXG4gICAgICAgIHNpZ25hdHVyZXMuc2lnLFxuICAgICAgICBuZXcgVWludDhBcnJheSgwKVxuICAgICAgKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhIHNpZ25hdHVyZSBiZWxvbmdzIHRvIGEgcHVibGljIGtleSBmb3IgZGF0YVRvU2lnbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2VIZXggPSBCdWZmZXIuZnJvbShkZWZhdWx0RGF0YVRvU2lnbikudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGF3YWl0IFh0ekxpYi5VdGlscy5zaWduKGRlZmF1bHRLZXlQYWlyRnJvbVBydiwgbWVzc2FnZUhleCwgbmV3IFVpbnQ4QXJyYXkoMCkpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgWHR6TGliLlV0aWxzLnZlcmlmeVNpZ25hdHVyZShcbiAgICAgICAgbWVzc2FnZUhleCxcbiAgICAgICAgZGVmYXVsdEtleVBhaXJGcm9tUHViLmdldEtleXMoKS5wdWIsXG4gICAgICAgIHNpZ25hdHVyZXMuc2lnLFxuICAgICAgICBuZXcgVWludDhBcnJheSgwKVxuICAgICAgKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZhbGlkYXRlIGEgc2lnbmF0dXJlIHdpdGggdGhlIHdyb25nIHdhdGVybWFyaycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2VIZXggPSBCdWZmZXIuZnJvbShkZWZhdWx0RGF0YVRvU2lnbikudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGF3YWl0IFh0ekxpYi5VdGlscy5zaWduKGRlZmF1bHRLZXlQYWlyRnJvbVBydiwgbWVzc2FnZUhleCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBYdHpMaWIuVXRpbHMudmVyaWZ5U2lnbmF0dXJlKFxuICAgICAgICBtZXNzYWdlSGV4LFxuICAgICAgICBkZWZhdWx0S2V5UGFpckZyb21QdWIuZ2V0S2V5cygpLnB1YixcbiAgICAgICAgc2lnbmF0dXJlcy5zaWcsXG4gICAgICAgIG5ldyBVaW50OEFycmF5KDMpXG4gICAgICApO1xuICAgICAgcmVzdWx0LnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZhbGlkYXRlIGEgc2lnbmF0dXJlIHdpdGggdGhlIHdyb25nIHB1YmxpYyBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtZXNzYWdlSGV4ID0gQnVmZmVyLmZyb20oZGVmYXVsdERhdGFUb1NpZ24pLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZXMgPSBhd2FpdCBYdHpMaWIuVXRpbHMuc2lnbihkZWZhdWx0S2V5UGFpckZyb21QcnYsIG1lc3NhZ2VIZXgpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgWHR6TGliLlV0aWxzLnZlcmlmeVNpZ25hdHVyZShcbiAgICAgICAgbWVzc2FnZUhleCxcbiAgICAgICAgJ3NwcGs3ZDJ6dHpickxkQmFUQjd5emFXUmtQZmNXR3NyTlFOSmRrQkU5YkNUU1N6ZWtMTnpwdmYnLFxuICAgICAgICBzaWduYXR1cmVzLnNpZ1xuICAgICAgKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2YWxpZGF0ZSBhIHNpZ25hdHVyZSB3aXRoIHRoZSB3cm9uZyBtZXNzYWdlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbWVzc2FnZUhleCA9IEJ1ZmZlci5mcm9tKGRlZmF1bHREYXRhVG9TaWduKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCBzaWduYXR1cmVzID0gYXdhaXQgWHR6TGliLlV0aWxzLnNpZ24oZGVmYXVsdEtleVBhaXJGcm9tUHJ2LCBtZXNzYWdlSGV4KTtcbiAgICAgIGNvbnN0IHNlY29uZE1lc3NhZ2VIZXggPSBCdWZmZXIuZnJvbSgnaGVsbG9Xb3JsZCcpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFh0ekxpYi5VdGlscy52ZXJpZnlTaWduYXR1cmUoXG4gICAgICAgIHNlY29uZE1lc3NhZ2VIZXgsXG4gICAgICAgIGRlZmF1bHRLZXlQYWlyRnJvbVB1Yi5nZXRLZXlzKCkucHViLFxuICAgICAgICBzaWduYXR1cmVzLnNpZ1xuICAgICAgKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBpZiB0aGUga2V5IHBhaXIgZG9lcyBub3QgaGF2ZSB0aGUgcHJpdmF0ZSBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBYdHpMaWIuVXRpbHMuc2lnbihkZWZhdWx0S2V5UGFpckZyb21QdWIsIGRlZmF1bHREYXRhVG9TaWduKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICBuZXcgUmVnRXhwKCdNaXNzaW5nIHByaXZhdGUga2V5JylcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZW5lcmF0ZURhdGFUb1NpZ24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCB0cmFuc2ZlciBkYXRhIHRvIHNpZ24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhVG9TaWduID0gWHR6TGliLlV0aWxzLmdlbmVyYXRlRGF0YVRvU2lnbihcbiAgICAgICAgJ0tUMU5IMk0yM3hvdmh3N3V3V1Z1b0dUWXh5a2VDY1ZmU3FoTCcsXG4gICAgICAgICd0ejJQdEo5emdFZ0ZWVFJxeTZHWHNzdDU0dEgza3NFbll2dlMnLFxuICAgICAgICAnMTAwJyxcbiAgICAgICAgJzAnXG4gICAgICApO1xuICAgICAgSlNPTi5zdHJpbmdpZnkoZGF0YVRvU2lnbikuc2hvdWxkLmVxdWFsKEpTT04uc3RyaW5naWZ5KHZhbGlkRGF0YVRvU2lnbikpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGlmIHRoZSBjb250cmFjdCBhZGRyZXNzIGhhcyB0aGUgd3JvbmcgZm9ybWF0JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBYdHpMaWIuVXRpbHMuZ2VuZXJhdGVEYXRhVG9TaWduKFxuICAgICAgICAgICAgJ3R6MlB0Sjl6Z0VnRlZUUnF5NkdYc3N0NTR0SDNrc0VuWXZ2UycsXG4gICAgICAgICAgICAndHoyUHRKOXpnRWdGVlRScXk2R1hzc3Q1NHRIM2tzRW5ZdnZTJyxcbiAgICAgICAgICAgICcwJyxcbiAgICAgICAgICAgICcwJ1xuICAgICAgICAgICksXG4gICAgICAgIG5ldyBSZWdFeHAoJ0ludmFsaWQgY29udHJhY3QgYWRkcmVzcycpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGlmIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGhhcyB0aGUgd3JvbmcgZm9ybWF0JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gWHR6TGliLlV0aWxzLmdlbmVyYXRlRGF0YVRvU2lnbignS1QxTkgyTTIzeG92aHc3dXdXVnVvR1RZeHlrZUNjVmZTcWhMJywgJ2FiYycsICcwJywgJzAnKSxcbiAgICAgICAgbmV3IFJlZ0V4cCgnSW52YWxpZCBkZXN0aW5hdGlvbiBhZGRyZXNzJylcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduYXR1cmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBzaWduYXR1cmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2YWxpZFNpZ25hdHVyZXMgPSBbXG4gICAgICAgICdzaWdWZ25hVTJTMUw0amh0UGFUWDJTQXhzR3BQMWRSUzg5VlRTUjlGckZ1eHhQdmdBMkc2N1FSdWV6Nm82eFA3ZWthZ2RaWDRFTHZoN3BiTU1kTG9CU3p2azJBVnlRcGsnLFxuICAgICAgICAnc3BzaWcxRFdUdVhkZ1VnMnQ2NFBMUmZhYXBzWWVqQ29DVlZrcXkyWmp2NDFaaXJ0N01qb3FTZkJuUDM4cW9BZzNTV2ljZlFOaUcyNXlNcUdZZ2U0anJmcnd2OUg4aFJLRHlZJyxcbiAgICAgICAgJ3NpZ1M5cHFZVVhpVUpjejJXc3g1eDk4dWQ5S3RnR1ZnNGdDd3BCb0RCZ0hyWnk5Z3dKZWRLTUNyY1FQeG05QzdpMWdlc0VUYmhGRDZHbThCcGFkR2dkMmNnaUdvUWJpWScsXG4gICAgICAgICdzcHNpZzE5eVdBYzVuQnBHbU5DV2R2RVdIbnBKWEVpVHFaamhOZ1d3V2ExTHo2a1ZnYWtiN3FDUGo5ejZHNkxMRUZXbXNtTmNQQ1pZc2VFUlZEVVhoOTlON3dxRHBwY0RLUU0nLFxuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCBoYXNoIG9mIHZhbGlkU2lnbmF0dXJlcykge1xuICAgICAgICBYdHpMaWIuVXRpbHMuaXNWYWxpZFNpZ25hdHVyZShoYXNoKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZhbGlkYXRlIGludmFsaWQgc2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW52YWxpZEhhc2hlcyA9IFtcbiAgICAgICAgJ3NpZ1M5cHFZVVhpVUpjejJXc3g1eDk4dWQ5S3RnR1ZnNGdDd3BCb0RCZ0hyWicsXG4gICAgICAgICdzaWcnLFxuICAgICAgICAnQktvaWZzNWdHZmZBenVSQmNnM3lneGJMZHJDWHlERFMxQUx2TUc4U0ZZV2Foem9ZTWt1MTExMTExMTExMScsXG4gICAgICAgICdpbnZhbGlkJyxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgaGFzaCBvZiBpbnZhbGlkSGFzaGVzKSB7XG4gICAgICAgIFh0ekxpYi5VdGlscy5pc1ZhbGlkU2lnbmF0dXJlKGhhc2gpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGVjb2RlS2V5JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZGVjb2RlIHRoZSBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2YWxpZEtleXMgPSBbWydzcHNrMmNiaVZzQXZwR0ttYXU5WGNNc2NMM05Sd2preVQ1NzVONUF5QW9mY29qNDF4Nmc2VEwnLCBYdHpMaWIuVXRpbHMuaGFzaFR5cGVzLnNwc2tdXTtcblxuICAgICAgZm9yIChjb25zdCBkYXRhIG9mIHZhbGlkS2V5cykge1xuICAgICAgICBYdHpMaWIuVXRpbHMuZGVjb2RlS2V5KGRhdGFbMF0gYXMgc3RyaW5nLCBkYXRhWzFdIGFzIEhhc2hUeXBlKVxuICAgICAgICAgIC50b1N0cmluZygnaGV4JylcbiAgICAgICAgICAuc2hvdWxkLmVxdWFsKCc5Y2MwYWFhOWVmNjg3ZTcwZjc3ODBlNjBkZTA4ZDdhNDQzNDg4YTljZjhlMWViZTk2ODkxMTg3NjMzNzZjMDdjJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gZGVjb2RlIGFuIGludmFsaWQga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW52YWxpZEtleXMgPSBbXG4gICAgICAgIFtcbiAgICAgICAgICAnc2lnVmduYVUyUzFMNGpodFBhVFgyU0F4c0dwUDFkUlM4OVZUU1I5RnJGdXh4UHZnQTJHNjdRUnVlejZvNnhQN2VrYWdkWlg0RUx2aDdwYk1NZExvQlN6dmsyQVZ5UXBrJyxcbiAgICAgICAgICBYdHpMaWIuVXRpbHMuaGFzaFR5cGVzLnR6MSxcbiAgICAgICAgXSxcbiAgICAgICAgWydzcHBrJywgWHR6TGliLlV0aWxzLmhhc2hUeXBlcy5zcHBrXSxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgZGF0YSBvZiBpbnZhbGlkS2V5cykge1xuICAgICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAgICgpID0+IFh0ekxpYi5VdGlscy5kZWNvZGVLZXkoZGF0YVswXSBhcyBzdHJpbmcsIGRhdGFbMV0gYXMgSGFzaFR5cGUpLFxuICAgICAgICAgIG5ldyBSZWdFeHAoJ1Vuc3VwcG9ydGVkIHByaXZhdGUga2V5JylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xtz.d.ts","sourceRoot":"","sources":["../../../test/unit/xtz.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const sdk_test_1 = require("@bitgo-beta/sdk-test");
|
|
4
|
+
const sdk_api_1 = require("@bitgo-beta/sdk-api");
|
|
5
|
+
const src_1 = require("../../src");
|
|
6
|
+
const fixtures_1 = require("../fixtures");
|
|
7
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
8
|
+
const bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
|
|
9
|
+
bitgo.safeRegister('xtz', src_1.Xtz.createInstance);
|
|
10
|
+
bitgo.safeRegister('txtz', src_1.Txtz.createInstance);
|
|
11
|
+
describe('Tezos:', function () {
|
|
12
|
+
let basecoin;
|
|
13
|
+
before(function () {
|
|
14
|
+
bitgo.initializeTestVars();
|
|
15
|
+
basecoin = bitgo.coin('txtz');
|
|
16
|
+
});
|
|
17
|
+
it('should instantiate the coin', function () {
|
|
18
|
+
const basecoin = bitgo.coin('xtz');
|
|
19
|
+
basecoin.should.be.an.instanceof(src_1.Xtz);
|
|
20
|
+
});
|
|
21
|
+
it('explain an unsigned transfer transaction', async function () {
|
|
22
|
+
const explainParams = {
|
|
23
|
+
halfSigned: {
|
|
24
|
+
txHex: fixtures_1.unsignedTransactionWithTwoTransfersHex,
|
|
25
|
+
},
|
|
26
|
+
feeInfo: { fee: 1 },
|
|
27
|
+
};
|
|
28
|
+
const explanation = await basecoin.explainTransaction(explainParams);
|
|
29
|
+
explanation.id.should.equal('');
|
|
30
|
+
explanation.outputs.length.should.equal(2);
|
|
31
|
+
explanation.outputs[0].address.should.equal('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8');
|
|
32
|
+
explanation.outputs[0].value.should.equal('100');
|
|
33
|
+
explanation.outputs[1].address.should.equal('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A');
|
|
34
|
+
explanation.outputs[1].value.should.equal('100');
|
|
35
|
+
explanation.outputAmount.should.equal('200');
|
|
36
|
+
explanation.changeAmount.should.equal('0');
|
|
37
|
+
explanation.changeOutputs.length.should.equal(0);
|
|
38
|
+
explanation.fee.fee.should.equal(1);
|
|
39
|
+
});
|
|
40
|
+
it('explain a signed transfer transaction', async function () {
|
|
41
|
+
const explainParams = {
|
|
42
|
+
txHex: fixtures_1.fullySignedTransactionWithTwoTransfersHex,
|
|
43
|
+
feeInfo: { fee: 1 },
|
|
44
|
+
};
|
|
45
|
+
const explanation = await basecoin.explainTransaction(explainParams);
|
|
46
|
+
explanation.id.should.equal('onyGaWs6z4bVVcfn3h9KbBrktEhuDyJLYEVB4aJRM6YNngjDxE4');
|
|
47
|
+
explanation.outputs.length.should.equal(2);
|
|
48
|
+
explanation.outputs[0].address.should.equal('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8');
|
|
49
|
+
explanation.outputs[0].value.should.equal('100');
|
|
50
|
+
explanation.outputs[1].address.should.equal('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A');
|
|
51
|
+
explanation.outputs[1].value.should.equal('100');
|
|
52
|
+
explanation.outputAmount.should.equal('200');
|
|
53
|
+
explanation.changeAmount.should.equal('0');
|
|
54
|
+
explanation.changeOutputs.length.should.equal(0);
|
|
55
|
+
explanation.fee.fee.should.equal(1);
|
|
56
|
+
});
|
|
57
|
+
it('should sign an unsigned transaction with a Tezos private key', async function () {
|
|
58
|
+
const signTxOptions = {
|
|
59
|
+
prv: 'xprv9s21ZrQH143K2vpv9Z5GppJtVsT6nBFWDRnA2PKTHaJobNGbhC9MR7shQCQ79jJNZvcxw6YzFTEiwxg3E6Tjo5RR7nKb2dp8r1zdKDG3w1o',
|
|
60
|
+
txPrebuild: {
|
|
61
|
+
txHex: fixtures_1.unsignedHex,
|
|
62
|
+
source: 'tz2HGMx8YxPSLguVP6usgf1D8UALPLchLoSX',
|
|
63
|
+
dataToSign: fixtures_1.dataToSign,
|
|
64
|
+
addressInfo: {
|
|
65
|
+
address: 'tz2HGMx8YxPSLguVP6usgf1D8UALPLchLoSX',
|
|
66
|
+
chain: 0,
|
|
67
|
+
index: 0,
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
const tx = await basecoin.signTransaction(signTxOptions);
|
|
72
|
+
tx.halfSigned.txHex.should.equal(fixtures_1.oneSignatureHex);
|
|
73
|
+
});
|
|
74
|
+
it('should sign with a half signed transaction with a Tezos private key', async function () {
|
|
75
|
+
const signTxOptions = {
|
|
76
|
+
prv: 'xprv9s21ZrQH143K2EHDvGaG86MLjU9bW52eEoqMKakkEYc7rM8KDC28FPMcbiwDYX3jjh2mDjFE4Bm37QqMvm4icdW7CAH7LH8jKDF3LXNbRbz',
|
|
77
|
+
txPrebuild: {
|
|
78
|
+
txHex: fixtures_1.oneSignatureHex,
|
|
79
|
+
source: 'tz28XZQ1dRm17RLKM9ayhhp2dVvCGvpPhVyB',
|
|
80
|
+
dataToSign: fixtures_1.dataToSign,
|
|
81
|
+
addressInfo: {
|
|
82
|
+
address: 'tz28XZQ1dRm17RLKM9ayhhp2dVvCGvpPhVyB',
|
|
83
|
+
chain: 0,
|
|
84
|
+
index: 0,
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
const tx = await basecoin.signTransaction(signTxOptions);
|
|
89
|
+
tx.halfSigned.txHex.should.equal(fixtures_1.twoSignatureHex);
|
|
90
|
+
});
|
|
91
|
+
it('should sign with a fee account a fully signed transaction', async function () {
|
|
92
|
+
const signTxOptions = {
|
|
93
|
+
prv: 'xprv9s21ZrQH143K2dseae8JccdEANb1jSfx7Pr8zpKq9uW1Nyh8LD8Uizn6CttWNwJ9S9xJtP3nWda2RoQjTp75HdSyTPnUgdANo2sgpPrcMwm',
|
|
94
|
+
txPrebuild: {
|
|
95
|
+
txHex: fixtures_1.twoSignatureHex,
|
|
96
|
+
source: 'tz2SsfYjnEmm6E6eb6BxHNqsbGk4i9EsKSTE',
|
|
97
|
+
addressInfo: {
|
|
98
|
+
address: 'tz2SsfYjnEmm6E6eb6BxHNqsbGk4i9EsKSTE',
|
|
99
|
+
chain: 0,
|
|
100
|
+
index: 0,
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
const tx = await basecoin.signTransaction(signTxOptions);
|
|
105
|
+
tx.halfSigned.txHex.should.equal(fixtures_1.fullySignedHex);
|
|
106
|
+
});
|
|
107
|
+
it('should check valid addresses', function () {
|
|
108
|
+
const badAddresses = [
|
|
109
|
+
'',
|
|
110
|
+
null,
|
|
111
|
+
'xxxx',
|
|
112
|
+
'YZ09fd-',
|
|
113
|
+
'412C2BA4A9FF6C53207DC5B686BFECF75EA7B805772',
|
|
114
|
+
'412C2BA4A9FF6C53207DC5B686BFECF75EA7B80',
|
|
115
|
+
'TBChwKYNaTo4a4N68Me1qEiiKsRDspXqLLZ',
|
|
116
|
+
];
|
|
117
|
+
const goodAddresses = [
|
|
118
|
+
'tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A',
|
|
119
|
+
'tz29yN7c5zrmK9ZhA1VjYwVokN9ZBn8YbCuE',
|
|
120
|
+
'KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL',
|
|
121
|
+
];
|
|
122
|
+
badAddresses.map((addr) => {
|
|
123
|
+
basecoin.isValidAddress(addr).should.equal(false);
|
|
124
|
+
});
|
|
125
|
+
goodAddresses.map((addr) => {
|
|
126
|
+
basecoin.isValidAddress(addr).should.equal(true);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
it('should throw if the params object is missing parameters', async function () {
|
|
130
|
+
const explainParams = {
|
|
131
|
+
feeInfo: { fee: 1 },
|
|
132
|
+
txHex: null,
|
|
133
|
+
};
|
|
134
|
+
await basecoin.explainTransaction(explainParams).should.be.rejectedWith('missing explain tx parameters');
|
|
135
|
+
});
|
|
136
|
+
describe('Keypairs:', () => {
|
|
137
|
+
it('should generate a keypair from random seed', function () {
|
|
138
|
+
const keyPair = basecoin.generateKeyPair();
|
|
139
|
+
keyPair.should.have.property('pub');
|
|
140
|
+
keyPair.should.have.property('prv');
|
|
141
|
+
basecoin.isValidPub(keyPair.pub).should.equal(true);
|
|
142
|
+
});
|
|
143
|
+
it('should generate a keypair from a seed', function () {
|
|
144
|
+
const seedText = '80350b4208d381fbfe2276a326603049fe500731c46d3c9936b5ce036b51377f24bab7dd0c2af7f107416ef858ff79b0670c72406dad064e72bb17fc0a9038bb';
|
|
145
|
+
const seed = Buffer.from(seedText, 'hex');
|
|
146
|
+
const keyPair = basecoin.generateKeyPair(seed);
|
|
147
|
+
keyPair.pub.should.equal('xpub661MyMwAqRbcFAwqvSGbk35kJf7CQqdN1w4CMUBBTqH5e3ivjU6D8ugv9hRSgRbRenC4w3ahXdLVahwjgjXhSuQKMdNdn55Y9TNSagBktws');
|
|
148
|
+
keyPair.prv.should.equal('xprv9s21ZrQH143K2gsNpQjbNu91kdGi1NuWei8bZ5mZuVk6mFPnBvmxb7NSJQdbZW3FGpK3Ycn7jorAXcEzMvviGtbyBz5tBrjfnWyQp3g75FK');
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
describe('Sign message:', () => {
|
|
152
|
+
it('should sign and validate a string message', async function () {
|
|
153
|
+
const keyPair = basecoin.generateKeyPair();
|
|
154
|
+
const message = 'hello world';
|
|
155
|
+
const signature = await basecoin.signMessage(keyPair, message);
|
|
156
|
+
const messageHex = Buffer.from(message).toString('hex');
|
|
157
|
+
const sig = Buffer.from(signature, 'hex').toString();
|
|
158
|
+
const publicKey = new src_1.XtzLib.KeyPair({ pub: keyPair.pub });
|
|
159
|
+
const isValid = await src_1.XtzLib.Utils.verifySignature(messageHex, publicKey.getKeys().pub, sig);
|
|
160
|
+
isValid.should.equal(true);
|
|
161
|
+
});
|
|
162
|
+
it('should fail to validate a string message with wrong public key', async function () {
|
|
163
|
+
const keyPair = basecoin.generateKeyPair();
|
|
164
|
+
const message = 'hello world';
|
|
165
|
+
const signature = await basecoin.signMessage(keyPair, message);
|
|
166
|
+
const messageHex = Buffer.from(message).toString('hex');
|
|
167
|
+
const sig = Buffer.from(signature, 'hex').toString();
|
|
168
|
+
const publicKey = new src_1.XtzLib.KeyPair();
|
|
169
|
+
const isValid = await src_1.XtzLib.Utils.verifySignature(messageHex, publicKey.getKeys().pub, sig);
|
|
170
|
+
isValid.should.equal(false);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
describe('Verify Transaction', function () {
|
|
174
|
+
const address1 = '5Ge59qRnZa8bxyhVFE6BDoY3kuhSrNVETRxXYLty1Hh6XTaf';
|
|
175
|
+
const address2 = '5DiMLZugmcKEH3igPZP367FqummZkWeW5Z6zDCHLfxRjnPXe';
|
|
176
|
+
it('should reject a txPrebuild with more than one recipient', async function () {
|
|
177
|
+
const wallet = new sdk_core_1.Wallet(bitgo, basecoin, {});
|
|
178
|
+
const txParams = {
|
|
179
|
+
recipients: [
|
|
180
|
+
{ amount: '1000000000000', address: address1 },
|
|
181
|
+
{ amount: '2500000000000', address: address2 },
|
|
182
|
+
],
|
|
183
|
+
wallet: wallet,
|
|
184
|
+
walletPassphrase: 'fakeWalletPassphrase',
|
|
185
|
+
};
|
|
186
|
+
await basecoin
|
|
187
|
+
.verifyTransaction({ txParams })
|
|
188
|
+
.should.be.rejectedWith(`txtz doesn't support sending to more than 1 destination address within a single transaction. Try again, using only a single recipient.`);
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHR6LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3h0ei50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG1EQUErRDtBQUMvRCxpREFBK0M7QUFDL0MsbUNBQThDO0FBQzlDLDBDQVFxQjtBQUNyQixtREFBOEM7QUFFOUMsTUFBTSxLQUFLLEdBQWlCLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUMxRSxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxTQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDOUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsVUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRWhELFFBQVEsQ0FBQyxRQUFRLEVBQUU7SUFDakIsSUFBSSxRQUFRLENBQUM7SUFFYixNQUFNLENBQUM7UUFDTCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw2QkFBNkIsRUFBRTtRQUNoQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBRyxDQUFDLENBQUM7SUFDeEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUUsS0FBSztRQUNsRCxNQUFNLGFBQWEsR0FBRztZQUNwQixVQUFVLEVBQUU7Z0JBQ1YsS0FBSyxFQUFFLGlEQUFzQzthQUM5QztZQUNELE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7U0FDcEIsQ0FBQztRQUNGLE1BQU0sV0FBVyxHQUFHLE1BQU0s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QUNuRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDM0MsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDO1lBQzlCLE1BQU0sU0FBUyxHQUFHLE1BQU0sUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFL0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDckQsTUFBTSxTQUFTLEdBQUcsSUFBSSxZQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzNELE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDN0YsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0VBQWdFLEVBQUUsS0FBSztZQUN4RSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDM0MsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDO1lBQzlCLE1BQU0sU0FBUyxHQUFHLE1BQU0sUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFL0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFeEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDckQsTUFBTSxTQUFTLEdBQUcsSUFBSSxZQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkMsTUFBTSxPQUFPLEdBQUcsTUFBTSxZQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM3RixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG9CQUFvQixFQUFFO1FBQzdCLE1BQU0sUUFBUSxHQUFHLGtEQUFrRCxDQUFDO1FBQ3BFLE1BQU0sUUFBUSxHQUFHLGtEQUFrRCxDQUFDO1FBQ3BFLEVBQUUsQ0FBQyx5REFBeUQsRUFBRSxLQUFLO1lBQ2pFLE1BQU0sTUFBTSxHQUFHLElBQUksaUJBQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRS9DLE1BQU0sUUFBUSxHQUFHO2dCQUNmLFVBQVUsRUFBRTtvQkFDVixFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRTtvQkFDOUMsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUU7aUJBQy9DO2dCQUNELE1BQU0sRUFBRSxNQUFNO2dCQUNkLGdCQUFnQixFQUFFLHNCQUFzQjthQUN6QyxDQUFDO1lBRUYsTUFBTSxRQUFRO2lCQUNYLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7aUJBQy9CLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUNyQix3SUFBd0ksQ0FDekksQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlc3RCaXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstYXBpJztcbmltcG9ydCB7IFh0eiwgVHh0eiwgWHR6TGliIH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCB7XG4gIGRhdGFUb1NpZ24sXG4gIGZ1bGx5U2lnbmVkSGV4LFxuICBmdWxseVNpZ25lZFRyYW5zYWN0aW9uV2l0aFR3b1RyYW5zZmVyc0hleCxcbiAgb25lU2lnbmF0dXJlSGV4LFxuICB0d29TaWduYXR1cmVIZXgsXG4gIHVuc2lnbmVkSGV4LFxuICB1bnNpZ25lZFRyYW5zYWN0aW9uV2l0aFR3b1RyYW5zZmVyc0hleCxcbn0gZnJvbSAnLi4vZml4dHVyZXMnO1xuaW1wb3J0IHsgV2FsbGV0IH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5jb25zdCBiaXRnbzogVGVzdEJpdEdvQVBJID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuYml0Z28uc2FmZVJlZ2lzdGVyKCd4dHonLCBYdHouY3JlYXRlSW5zdGFuY2UpO1xuYml0Z28uc2FmZVJlZ2lzdGVyKCd0eHR6JywgVHh0ei5jcmVhdGVJbnN0YW5jZSk7XG5cbmRlc2NyaWJlKCdUZXpvczonLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBiYXNlY29pbjtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndHh0eicpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGluc3RhbnRpYXRlIHRoZSBjb2luJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJhc2Vjb2luID0gYml0Z28uY29pbigneHR6Jyk7XG4gICAgYmFzZWNvaW4uc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoWHR6KTtcbiAgfSk7XG5cbiAgaXQoJ2V4cGxhaW4gYW4gdW5zaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZXhwbGFpblBhcmFtcyA9IHtcbiAgICAgIGhhbGZTaWduZWQ6IHtcbiAgICAgICAgdHhIZXg6IHVuc2lnbmVkVHJhbnNhY3Rpb25XaXRoVHdvVHJhbnNmZXJzSGV4LFxuICAgICAgfSxcbiAgICAgIGZlZUluZm86IHsgZmVlOiAxIH0sXG4gICAgfTtcbiAgICBjb25zdCBleHBsYW5hdGlvbiA9IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbihleHBsYWluUGFyYW1zKTtcbiAgICBleHBsYW5hdGlvbi5pZC5zaG91bGQuZXF1YWwoJycpO1xuICAgIGV4cGxhbmF0aW9uLm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICBleHBsYW5hdGlvbi5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdLVDFIVXJ0Nmtmdll5REVZQ0oyR1NqdlRQWjZLbVJmeExCVTgnKTtcbiAgICBleHBsYW5hdGlvbi5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwJyk7XG4gICAgZXhwbGFuYXRpb24ub3V0cHV0c1sxXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgndHoxVlJqUnBWS252MTZBVnByRkgxdGtEbjRURGZWcUE4OTNBJyk7XG4gICAgZXhwbGFuYXRpb24ub3V0cHV0c1sxXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMCcpO1xuICAgIGV4cGxhbmF0aW9uLm91dHB1dEFtb3VudC5zaG91bGQuZXF1YWwoJzIwMCcpO1xuICAgIGV4cGxhbmF0aW9uLmNoYW5nZUFtb3VudC5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICBleHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgZXhwbGFuYXRpb24uZmVlLmZlZS5zaG91bGQuZXF1YWwoMSk7XG4gIH0pO1xuXG4gIGl0KCdleHBsYWluIGEgc2lnbmVkIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGV4cGxhaW5QYXJhbXMgPSB7XG4gICAgICB0eEhleDogZnVsbHlTaWduZWRUcmFuc2FjdGlvbldpdGhUd29UcmFuc2ZlcnNIZXgsXG4gICAgICBmZWVJbmZvOiB7IGZlZTogMSB9LFxuICAgIH07XG4gICAgY29uc3QgZXhwbGFuYXRpb24gPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oZXhwbGFpblBhcmFtcyk7XG4gICAgZXhwbGFuYXRpb24uaWQuc2hvdWxkLmVxdWFsKCdvbnlHYVdzNno0YlZWY2ZuM2g5S2JCcmt0RWh1RHlKTFlFVkI0YUpSTTZZTm5nakR4RTQnKTtcbiAgICBleHBsYW5hdGlvbi5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgZXhwbGFuYXRpb24ub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnS1QxSFVydDZrZnZZeURFWUNKMkdTanZUUFo2S21SZnhMQlU4Jyk7XG4gICAgZXhwbGFuYXRpb24ub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMCcpO1xuICAgIGV4cGxhbmF0aW9uLm91dHB1dHNbMV0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MVZSalJwVktudjE2QVZwckZIMXRrRG40VERmVnFBODkzQScpO1xuICAgIGV4cGxhbmF0aW9uLm91dHB1dHNbMV0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDAnKTtcbiAgICBleHBsYW5hdGlvbi5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKCcyMDAnKTtcbiAgICBleHBsYW5hdGlvbi5jaGFuZ2VBbW91bnQuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgZXhwbGFuYXRpb24uY2hhbmdlT3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIGV4cGxhbmF0aW9uLmZlZS5mZWUuc2hvdWxkLmVxdWFsKDEpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHNpZ24gYW4gdW5zaWduZWQgdHJhbnNhY3Rpb24gd2l0aCBhIFRlem9zIHByaXZhdGUga2V5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHNpZ25UeE9wdGlvbnMgPSB7XG4gICAgICBwcnY6ICd4cHJ2OXMyMVpyUUgxNDNLMnZwdjlaNUdwcEp0VnNUNm5CRldEUm5BMlBLVEhhSm9iTkdiaEM5TVI3c2hRQ1E3OWpKTlp2Y3h3Nll6RlRFaXd4ZzNFNlRqbzVSUjduS2IyZHA4cjF6ZEtERzN3MW8nLFxuICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICB0eEhleDogdW5zaWduZWRIZXgsXG4gICAgICAgIHNvdXJjZTogJ3R6MkhHTXg4WXhQU0xndVZQNnVzZ2YxRDhVQUxQTGNoTG9TWCcsXG4gICAgICAgIGRhdGFUb1NpZ246IGRhdGFUb1NpZ24sXG4gICAgICAgIGFkZHJlc3NJbmZvOiB7XG4gICAgICAgICAgYWRkcmVzczogJ3R6MkhHTXg4WXhQU0xndVZQNnVzZ2YxRDhVQUxQTGNoTG9TWCcsXG4gICAgICAgICAgY2hhaW46IDAsXG4gICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgdHggPSBhd2FpdCBiYXNlY29pbi5zaWduVHJhbnNhY3Rpb24oc2lnblR4T3B0aW9ucyk7XG4gICAgdHguaGFsZlNpZ25lZC50eEhleC5zaG91bGQuZXF1YWwob25lU2lnbmF0dXJlSGV4KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzaWduIHdpdGggYSBoYWxmIHNpZ25lZCB0cmFuc2FjdGlvbiB3aXRoIGEgVGV6b3MgcHJpdmF0ZSBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgc2lnblR4T3B0aW9ucyA9IHtcbiAgICAgIHBydjogJ3hwcnY5czIxWnJRSDE0M0syRUhEdkdhRzg2TUxqVTliVzUyZUVvcU1LYWtrRVljN3JNOEtEQzI4RlBNY2Jpd0RZWDNqamgybURqRkU0Qm0zN1FxTXZtNGljZFc3Q0FIN0xIOGpLREYzTFhOYlJieicsXG4gICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgIHR4SGV4OiBvbmVTaWduYXR1cmVIZXgsXG4gICAgICAgIHNvdXJjZTogJ3R6MjhYWlExZFJtMTdSTEtNOWF5aGhwMmRWdkNHdnBQaFZ5QicsXG4gICAgICAgIGRhdGFUb1NpZ246IGRhdGFUb1NpZ24sXG4gICAgICAgIGFkZHJlc3NJbmZvOiB7XG4gICAgICAgICAgYWRkcmVzczogJ3R6MjhYWlExZFJtMTdSTEtNOWF5aGhwMmRWdkNHdnBQaFZ5QicsXG4gICAgICAgICAgY2hhaW46IDAsXG4gICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgdHggPSBhd2FpdCBiYXNlY29pbi5zaWduVHJhbnNhY3Rpb24oc2lnblR4T3B0aW9ucyk7XG4gICAgdHguaGFsZlNpZ25lZC50eEhleC5zaG91bGQuZXF1YWwodHdvU2lnbmF0dXJlSGV4KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzaWduIHdpdGggYSBmZWUgYWNjb3VudCBhIGZ1bGx5IHNpZ25lZCB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzaWduVHhPcHRpb25zID0ge1xuICAgICAgcHJ2OiAneHBydjlzMjFaclFIMTQzSzJkc2VhZThKY2NkRUFOYjFqU2Z4N1ByOHpwS3E5dVcxTnloOExEOFVpem42Q3R0V053SjlTOXhKdFAzbldkYTJSb1FqVHA3NUhkU3lUUG5VZ2RBTm8yc2dwUHJjTXdtJyxcbiAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgdHhIZXg6IHR3b1NpZ25hdHVyZUhleCxcbiAgICAgICAgc291cmNlOiAndHoyU3NmWWpuRW1tNkU2ZWI2QnhITnFzYkdrNGk5RXNLU1RFJyxcbiAgICAgICAgYWRkcmVzc0luZm86IHtcbiAgICAgICAgICBhZGRyZXNzOiAndHoyU3NmWWpuRW1tNkU2ZWI2QnhITnFzYkdrNGk5RXNLU1RFJyxcbiAgICAgICAgICBjaGFpbjogMCxcbiAgICAgICAgICBpbmRleDogMCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IGJhc2Vjb2luLnNpZ25UcmFuc2FjdGlvbihzaWduVHhPcHRpb25zKTtcbiAgICB0eC5oYWxmU2lnbmVkLnR4SGV4LnNob3VsZC5lcXVhbChmdWxseVNpZ25lZEhleCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgY2hlY2sgdmFsaWQgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJhZEFkZHJlc3NlcyA9IFtcbiAgICAgICcnLFxuICAgICAgbnVsbCxcbiAgICAgICd4eHh4JyxcbiAgICAgICdZWjA5ZmQtJyxcbiAgICAgICc0MTJDMkJBNEE5RkY2QzUzMjA3REM1QjY4NkJGRUNGNzVFQTdCODA1NzcyJyxcbiAgICAgICc0MTJDMkJBNEE5RkY2QzUzMjA3REM1QjY4NkJGRUNGNzVFQTdCODAnLFxuICAgICAgJ1RCQ2h3S1lOYVRvNGE0TjY4TWUxcUVpaUtzUkRzcFhxTExaJyxcbiAgICBdO1xuICAgIGNvbnN0IGdvb2RBZGRyZXNzZXMgPSBbXG4gICAgICAndHoxVlJqUnBWS252MTZBVnByRkgxdGtEbjRURGZWcUE4OTNBJyxcbiAgICAgICd0ejI5eU43YzV6cm1LOVpoQTFWall3Vm9rTjlaQm44WWJDdUUnLFxuICAgICAgJ0tUMU5IMk0yM3hvdmh3N3V3V1Z1b0dUWXh5a2VDY1ZmU3FoTCcsXG4gICAgXTtcblxuICAgIGJhZEFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKGFkZHIpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG4gICAgZ29vZEFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKGFkZHIpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB0aGUgcGFyYW1zIG9iamVjdCBpcyBtaXNzaW5nIHBhcmFtZXRlcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZXhwbGFpblBhcmFtcyA9IHtcbiAgICAgIGZlZUluZm86IHsgZmVlOiAxIH0sXG4gICAgICB0eEhleDogbnVsbCxcbiAgICB9O1xuICAgIGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbihleHBsYWluUGFyYW1zKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdtaXNzaW5nIGV4cGxhaW4gdHggcGFyYW1ldGVycycpO1xuICB9KTtcblxuICBkZXNjcmliZSgnS2V5cGFpcnM6JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBrZXlwYWlyIGZyb20gcmFuZG9tIHNlZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gYmFzZWNvaW4uZ2VuZXJhdGVLZXlQYWlyKCk7XG4gICAgICBrZXlQYWlyLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwdWInKTtcbiAgICAgIGtleVBhaXIuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3BydicpO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZFB1YihrZXlQYWlyLnB1Yikuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIGtleXBhaXIgZnJvbSBhIHNlZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzZWVkVGV4dCA9XG4gICAgICAgICc4MDM1MGI0MjA4ZDM4MWZiZmUyMjc2YTMyNjYwMzA0OWZlNTAwNzMxYzQ2ZDNjOTkzNmI1Y2UwMzZiNTEzNzdmMjRiYWI3ZGQwYzJhZjdmMTA3NDE2ZWY4NThmZjc5YjA2NzBjNzI0MDZkYWQwNjRlNzJiYjE3ZmMwYTkwMzhiYic7XG4gICAgICBjb25zdCBzZWVkID0gQnVmZmVyLmZyb20oc2VlZFRleHQsICdoZXgnKTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBiYXNlY29pbi5nZW5lcmF0ZUtleVBhaXIoc2VlZCk7XG4gICAgICBrZXlQYWlyLnB1Yi5zaG91bGQuZXF1YWwoXG4gICAgICAgICd4cHViNjYxTXlNd0FxUmJjRkF3cXZTR2JrMzVrSmY3Q1FxZE4xdzRDTVVCQlRxSDVlM2l2alU2RDh1Z3Y5aFJTZ1JiUmVuQzR3M2FoWGRMVmFod2pnalhoU3VRS01kTmRuNTVZOVROU2FnQmt0d3MnXG4gICAgICApO1xuICAgICAga2V5UGFpci5wcnYuc2hvdWxkLmVxdWFsKFxuICAgICAgICAneHBydjlzMjFaclFIMTQzSzJnc05wUWpiTnU5MWtkR2kxTnVXZWk4Ylo1bVp1Vms2bUZQbkJ2bXhiN05TSlFkYlpXM0ZHcEszWWNuN2pvckFYY0V6TXZ2aUd0YnlCejV0QnJqZm5XeVFwM2c3NUZLJ1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1NpZ24gbWVzc2FnZTonLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzaWduIGFuZCB2YWxpZGF0ZSBhIHN0cmluZyBtZXNzYWdlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qga2V5UGFpciA9IGJhc2Vjb2luLmdlbmVyYXRlS2V5UGFpcigpO1xuICAgICAgY29uc3QgbWVzc2FnZSA9ICdoZWxsbyB3b3JsZCc7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSBhd2FpdCBiYXNlY29pbi5zaWduTWVzc2FnZShrZXlQYWlyLCBtZXNzYWdlKTtcblxuICAgICAgY29uc3QgbWVzc2FnZUhleCA9IEJ1ZmZlci5mcm9tKG1lc3NhZ2UpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IHNpZyA9IEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSwgJ2hleCcpLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBwdWJsaWNLZXkgPSBuZXcgWHR6TGliLktleVBhaXIoeyBwdWI6IGtleVBhaXIucHViIH0pO1xuICAgICAgY29uc3QgaXNWYWxpZCA9IGF3YWl0IFh0ekxpYi5VdGlscy52ZXJpZnlTaWduYXR1cmUobWVzc2FnZUhleCwgcHVibGljS2V5LmdldEtleXMoKS5wdWIsIHNpZyk7XG4gICAgICBpc1ZhbGlkLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2YWxpZGF0ZSBhIHN0cmluZyBtZXNzYWdlIHdpdGggd3JvbmcgcHVibGljIGtleScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBiYXNlY29pbi5nZW5lcmF0ZUtleVBhaXIoKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnaGVsbG8gd29ybGQnO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgYmFzZWNvaW4uc2lnbk1lc3NhZ2Uoa2V5UGFpciwgbWVzc2FnZSk7XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2VIZXggPSBCdWZmZXIuZnJvbShtZXNzYWdlKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAgIGNvbnN0IHNpZyA9IEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSwgJ2hleCcpLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBwdWJsaWNLZXkgPSBuZXcgWHR6TGliLktleVBhaXIoKTtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSBhd2FpdCBYdHpMaWIuVXRpbHMudmVyaWZ5U2lnbmF0dXJlKG1lc3NhZ2VIZXgsIHB1YmxpY0tleS5nZXRLZXlzKCkucHViLCBzaWcpO1xuICAgICAgaXNWYWxpZC5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmVyaWZ5IFRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGFkZHJlc3MxID0gJzVHZTU5cVJuWmE4Ynh5aFZGRTZCRG9ZM2t1aFNyTlZFVFJ4WFlMdHkxSGg2WFRhZic7XG4gICAgY29uc3QgYWRkcmVzczIgPSAnNURpTUxadWdtY0tFSDNpZ1BaUDM2N0ZxdW1tWmtXZVc1WjZ6RENITGZ4UmpuUFhlJztcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIHR4UHJlYnVpbGQgd2l0aCBtb3JlIHRoYW4gb25lIHJlY2lwaWVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGJhc2Vjb2luLCB7fSk7XG5cbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgeyBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczEgfSxcbiAgICAgICAgICB7IGFtb3VudDogJzI1MDAwMDAwMDAwMDAnLCBhZGRyZXNzOiBhZGRyZXNzMiB9LFxuICAgICAgICBdLFxuICAgICAgICB3YWxsZXQ6IHdhbGxldCxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogJ2Zha2VXYWxsZXRQYXNzcGhyYXNlJyxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgIGB0eHR6IGRvZXNuJ3Qgc3VwcG9ydCBzZW5kaW5nIHRvIG1vcmUgdGhhbiAxIGRlc3RpbmF0aW9uIGFkZHJlc3Mgd2l0aGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLiBUcnkgYWdhaW4sIHVzaW5nIG9ubHkgYSBzaW5nbGUgcmVjaXBpZW50LmBcbiAgICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|