@bitgo-beta/sdk-coin-trx 1.0.2-beta.222 → 1.0.2-beta.2221
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/resources/protobuf/Contract.proto +32 -0
- package/dist/resources/protobuf/tron.d.ts +1478 -214
- package/dist/resources/protobuf/tron.js +6312 -2600
- package/dist/resources/protobuf/tron.proto +6 -0
- package/dist/src/index.js +6 -2
- package/dist/src/lib/accountCreateTxBuilder.d.ts +60 -0
- package/dist/src/lib/accountCreateTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/accountCreateTxBuilder.js +191 -0
- package/dist/src/lib/constants.d.ts +4 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +7 -0
- package/dist/src/lib/contractCallBuilder.d.ts +1 -35
- package/dist/src/lib/contractCallBuilder.d.ts.map +1 -1
- package/dist/src/lib/contractCallBuilder.js +13 -76
- package/dist/src/lib/delegateResourceTxBuilder.d.ts +27 -0
- package/dist/src/lib/delegateResourceTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/delegateResourceTxBuilder.js +104 -0
- package/dist/src/lib/enum.d.ts +40 -1
- package/dist/src/lib/enum.d.ts.map +1 -1
- package/dist/src/lib/enum.js +44 -4
- package/dist/src/lib/freezeBalanceTxBuilder.d.ts +71 -0
- package/dist/src/lib/freezeBalanceTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/freezeBalanceTxBuilder.js +217 -0
- package/dist/src/lib/iface.d.ts +248 -2
- 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.d.ts +0 -1
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +31 -18
- package/dist/src/lib/resourceManagementTxBuilder.d.ts +72 -0
- package/dist/src/lib/resourceManagementTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/resourceManagementTxBuilder.js +150 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts +1 -1
- package/dist/src/lib/tokenTransferBuilder.js +3 -3
- package/dist/src/lib/transaction.d.ts +3 -0
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +115 -6
- package/dist/src/lib/transactionBuilder.d.ts +53 -6
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +114 -21
- package/dist/src/lib/undelegateResourceTxBuilder.d.ts +27 -0
- package/dist/src/lib/undelegateResourceTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/undelegateResourceTxBuilder.js +104 -0
- package/dist/src/lib/unfreezeBalanceTxBuilder.d.ts +65 -0
- package/dist/src/lib/unfreezeBalanceTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/unfreezeBalanceTxBuilder.js +210 -0
- package/dist/src/lib/utils.d.ts +92 -4
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +482 -47
- package/dist/src/lib/voteWitnessTxBuilder.d.ts +62 -0
- package/dist/src/lib/voteWitnessTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/voteWitnessTxBuilder.js +219 -0
- package/dist/src/lib/withdrawBuilder.d.ts +49 -0
- package/dist/src/lib/withdrawBuilder.d.ts.map +1 -0
- package/dist/src/lib/withdrawBuilder.js +167 -0
- package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.d.ts +49 -0
- package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.js +167 -0
- package/dist/src/lib/wrappedBuilder.d.ts +67 -1
- package/dist/src/lib/wrappedBuilder.d.ts.map +1 -1
- package/dist/src/lib/wrappedBuilder.js +114 -4
- package/dist/src/trx.d.ts +119 -4
- package/dist/src/trx.d.ts.map +1 -1
- package/dist/src/trx.js +600 -147
- package/dist/src/trxToken.d.ts +2 -2
- package/dist/src/trxToken.d.ts.map +1 -1
- package/dist/src/trxToken.js +53 -6
- package/dist/test/fixtures.d.ts +40 -0
- package/dist/test/fixtures.d.ts.map +1 -0
- package/dist/test/fixtures.js +46 -0
- package/dist/test/resources.d.ts +614 -0
- package/dist/test/resources.d.ts.map +1 -0
- package/dist/test/resources.js +782 -0
- package/dist/test/unit/index.d.ts +2 -0
- package/dist/test/unit/index.d.ts.map +1 -0
- package/dist/test/unit/index.js +19 -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 +163 -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 +38 -0
- package/dist/test/unit/transactionBuilder/accountCreateTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/accountCreateTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/accountCreateTxBuilder.js +247 -0
- package/dist/test/unit/transactionBuilder/contractCallBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/contractCallBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/contractCallBuilder.js +315 -0
- package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.js +339 -0
- package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.js +365 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +55 -0
- package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.js +339 -0
- package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.js +336 -0
- package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.js +277 -0
- package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.js +213 -0
- package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.js +213 -0
- package/dist/test/unit/transactionBuilder/wrappedBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/wrappedBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/wrappedBuilder.js +50 -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 +178 -0
- package/dist/test/unit/trx.d.ts +2 -0
- package/dist/test/unit/trx.d.ts.map +1 -0
- package/dist/test/unit/trx.js +796 -0
- package/dist/test/unit/trxToken.d.ts +2 -0
- package/dist/test/unit/trxToken.d.ts.map +1 -0
- package/dist/test/unit/trxToken.js +120 -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 +141 -0
- package/dist/test/unit/verifyTransaction.d.ts +2 -0
- package/dist/test/unit/verifyTransaction.d.ts.map +1 -0
- package/dist/test/unit/verifyTransaction.js +593 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +22 -16
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -118
- package/resources/README.md +0 -31
- package/resources/protobuf/Contract.proto +0 -256
- package/resources/protobuf/Discover.proto +0 -44
- package/resources/protobuf/tron.d.ts +0 -11205
- package/resources/protobuf/tron.js +0 -33480
- package/resources/protobuf/tron.proto +0 -677
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../test/unit/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
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 node_assert_1 = __importDefault(require("node:assert"));
|
|
7
|
+
const node_test_1 = require("node:test");
|
|
8
|
+
const builder_1 = require("../../src/lib/builder");
|
|
9
|
+
(0, node_test_1.describe)('Coin factory', () => {
|
|
10
|
+
(0, node_test_1.it)('should instantiate TRX builder properly', () => {
|
|
11
|
+
const trxBuilder = (0, builder_1.getBuilder)('trx');
|
|
12
|
+
node_assert_1.default.ok(trxBuilder);
|
|
13
|
+
});
|
|
14
|
+
(0, node_test_1.it)('should instantiate TTRX builder properly', () => {
|
|
15
|
+
const ttrxBuilder = (0, builder_1.getBuilder)('ttrx');
|
|
16
|
+
node_assert_1.default.ok(ttrxBuilder);
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4REFBaUM7QUFDakMseUNBQXlDO0FBQ3pDLG1EQUFtRDtBQUVuRCxJQUFBLG9CQUFRLEVBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtJQUM1QixJQUFBLGNBQUUsRUFBQyx5Q0FBeUMsRUFBRSxHQUFHLEVBQUU7UUFDakQsTUFBTSxVQUFVLEdBQUcsSUFBQSxvQkFBVSxFQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLHFCQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxjQUFFLEVBQUMsMENBQTBDLEVBQUUsR0FBRyxFQUFFO1FBQ2xELE1BQU0sV0FBVyxHQUFHLElBQUEsb0JBQVUsRUFBQyxNQUFNLENBQUMsQ0FBQztRQUN2QyxxQkFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN6QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydCc7XG5pbXBvcnQgeyBkZXNjcmliZSwgaXQgfSBmcm9tICdub2RlOnRlc3QnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlciB9IGZyb20gJy4uLy4uL3NyYy9saWIvYnVpbGRlcic7XG5cbmRlc2NyaWJlKCdDb2luIGZhY3RvcnknLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgaW5zdGFudGlhdGUgVFJYIGJ1aWxkZXIgcHJvcGVybHknLCAoKSA9PiB7XG4gICAgY29uc3QgdHJ4QnVpbGRlciA9IGdldEJ1aWxkZXIoJ3RyeCcpO1xuICAgIGFzc2VydC5vayh0cnhCdWlsZGVyKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBpbnN0YW50aWF0ZSBUVFJYIGJ1aWxkZXIgcHJvcGVybHknLCAoKSA9PiB7XG4gICAgY29uc3QgdHRyeEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCd0dHJ4Jyk7XG4gICAgYXNzZXJ0Lm9rKHR0cnhCdWlsZGVyKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyPair.d.ts","sourceRoot":"","sources":["../../../test/unit/keyPair.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,163 @@
|
|
|
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 node_test_1 = require("node:test");
|
|
7
|
+
const assert_1 = __importDefault(require("assert"));
|
|
8
|
+
const src_1 = require("../../src");
|
|
9
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
10
|
+
(0, node_test_1.describe)('Trx KeyPair', function () {
|
|
11
|
+
const defaultSeed = { seed: Buffer.alloc(32) };
|
|
12
|
+
(0, node_test_1.describe)('should create a KeyPair', function () {
|
|
13
|
+
(0, node_test_1.it)('from an xpub', () => {
|
|
14
|
+
const source = {
|
|
15
|
+
pub: 'xpub661MyMwAqRbcFhCvdhTAfpEEDV58oqDvv65YNHC686NNs4KbH8YZQJWVmrfbve7aAVHzxw8bKFxA7MLeDK6BbLfkE3bqkvHLPgaGHHtYGeY',
|
|
16
|
+
};
|
|
17
|
+
const keyPair = new src_1.KeyPair(source);
|
|
18
|
+
const defaultKeys = keyPair.getKeys();
|
|
19
|
+
assert_1.default.equal(defaultKeys.prv, undefined);
|
|
20
|
+
assert_1.default.equal(defaultKeys.pub, '04D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A827503E948A2FDBF74A981D4E0054F10EDA7042C2D469F44473D3C7791E0E326E355');
|
|
21
|
+
const extendedKeys = keyPair.getExtendedKeys();
|
|
22
|
+
assert_1.default.equal(extendedKeys.xprv, undefined);
|
|
23
|
+
assert_1.default.equal(extendedKeys.xpub, 'xpub661MyMwAqRbcFhCvdhTAfpEEDV58oqDvv65YNHC686NNs4KbH8YZQJWVmrfbve7aAVHzxw8bKFxA7MLeDK6BbLfkE3bqkvHLPgaGHHtYGeY');
|
|
24
|
+
});
|
|
25
|
+
(0, node_test_1.it)('from an xprv', () => {
|
|
26
|
+
const source = {
|
|
27
|
+
prv: 'xprv9s21ZrQH143K3D8TXfvAJgHVfTEeQNW5Ys9wZtnUZkqPzFzSjbEJrWC1vZ4GnXCvR7rQL2UFX3RSuYeU9MrERm1XBvACow7c36vnz5iYyj2',
|
|
28
|
+
};
|
|
29
|
+
const keyPair = new src_1.KeyPair(source);
|
|
30
|
+
const defaultKeys = keyPair.getKeys();
|
|
31
|
+
assert_1.default.equal(defaultKeys.prv, '82A34E3867EA7EA4E67E27865D500AE84E98D07AB1BAB06526F0A5A5FDCC3EBA');
|
|
32
|
+
assert_1.default.equal(defaultKeys.pub, '04D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A827503E948A2FDBF74A981D4E0054F10EDA7042C2D469F44473D3C7791E0E326E355');
|
|
33
|
+
const extendedKeys = keyPair.getExtendedKeys();
|
|
34
|
+
assert_1.default.equal(extendedKeys.xprv, 'xprv9s21ZrQH143K3D8TXfvAJgHVfTEeQNW5Ys9wZtnUZkqPzFzSjbEJrWC1vZ4GnXCvR7rQL2UFX3RSuYeU9MrERm1XBvACow7c36vnz5iYyj2');
|
|
35
|
+
assert_1.default.equal(extendedKeys.xpub, 'xpub661MyMwAqRbcFhCvdhTAfpEEDV58oqDvv65YNHC686NNs4KbH8YZQJWVmrfbve7aAVHzxw8bKFxA7MLeDK6BbLfkE3bqkvHLPgaGHHtYGeY');
|
|
36
|
+
});
|
|
37
|
+
(0, node_test_1.it)('from an uncompressed public key', () => {
|
|
38
|
+
const source = {
|
|
39
|
+
pub: '04D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A827503E948A2FDBF74A981D4E0054F10EDA7042C2D469F44473D3C7791E0E326E355',
|
|
40
|
+
};
|
|
41
|
+
const keyPair = new src_1.KeyPair(source);
|
|
42
|
+
const defaultKeys = keyPair.getKeys();
|
|
43
|
+
assert_1.default.equal(defaultKeys.prv, undefined);
|
|
44
|
+
assert_1.default.equal(defaultKeys.pub, '04D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A827503E948A2FDBF74A981D4E0054F10EDA7042C2D469F44473D3C7791E0E326E355');
|
|
45
|
+
assert_1.default.throws(() => keyPair.getExtendedKeys());
|
|
46
|
+
});
|
|
47
|
+
(0, node_test_1.it)('from a compressed public key', () => {
|
|
48
|
+
const source = {
|
|
49
|
+
pub: '03D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A8275',
|
|
50
|
+
};
|
|
51
|
+
const keyPair = new src_1.KeyPair(source);
|
|
52
|
+
const defaultKeys = keyPair.getKeys();
|
|
53
|
+
assert_1.default.equal(defaultKeys.prv, undefined);
|
|
54
|
+
assert_1.default.equal(defaultKeys.pub, '04D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A827503E948A2FDBF74A981D4E0054F10EDA7042C2D469F44473D3C7791E0E326E355');
|
|
55
|
+
assert_1.default.throws(() => keyPair.getExtendedKeys());
|
|
56
|
+
});
|
|
57
|
+
(0, node_test_1.it)('from a raw private key', () => {
|
|
58
|
+
const source = {
|
|
59
|
+
prv: '82A34E3867EA7EA4E67E27865D500AE84E98D07AB1BAB06526F0A5A5FDCC3EBA',
|
|
60
|
+
};
|
|
61
|
+
const keyPair = new src_1.KeyPair(source);
|
|
62
|
+
const defaultKeys = keyPair.getKeys();
|
|
63
|
+
assert_1.default.equal(defaultKeys.prv, '82A34E3867EA7EA4E67E27865D500AE84E98D07AB1BAB06526F0A5A5FDCC3EBA');
|
|
64
|
+
assert_1.default.equal(defaultKeys.pub, '04D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A827503E948A2FDBF74A981D4E0054F10EDA7042C2D469F44473D3C7791E0E326E355');
|
|
65
|
+
assert_1.default.throws(() => keyPair.getExtendedKeys());
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
(0, node_test_1.describe)('should fail to create a KeyPair', function () {
|
|
69
|
+
(0, node_test_1.it)('from an invalid seed', () => {
|
|
70
|
+
const seed = { seed: Buffer.alloc(8) }; // Seed should be at least 128 bits (16 bytes, not 8)
|
|
71
|
+
assert_1.default.throws(() => new src_1.KeyPair(seed));
|
|
72
|
+
});
|
|
73
|
+
(0, node_test_1.it)('from an invalid public key', () => {
|
|
74
|
+
const source = {
|
|
75
|
+
pub: '01D63D',
|
|
76
|
+
};
|
|
77
|
+
assert_1.default.throws(() => new src_1.KeyPair(source));
|
|
78
|
+
});
|
|
79
|
+
(0, node_test_1.it)('from an invalid private key', () => {
|
|
80
|
+
const source = {
|
|
81
|
+
prv: '82A34E',
|
|
82
|
+
};
|
|
83
|
+
assert_1.default.throws(() => new src_1.KeyPair(source));
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
(0, node_test_1.describe)('getAddress', function () {
|
|
87
|
+
(0, node_test_1.it)('should get a new hex address', () => {
|
|
88
|
+
const keyPair = new src_1.KeyPair(defaultSeed);
|
|
89
|
+
const address = keyPair.getAddress(sdk_core_1.AddressFormat.hex);
|
|
90
|
+
assert_1.default.equal(address, '41EB317B9F2E0891D66C061DDC3F5EE7ED42D70A44');
|
|
91
|
+
});
|
|
92
|
+
(0, node_test_1.it)('should get a new base58 address', () => {
|
|
93
|
+
const keyPair = new src_1.KeyPair(defaultSeed);
|
|
94
|
+
const address = keyPair.getAddress(sdk_core_1.AddressFormat.base58);
|
|
95
|
+
assert_1.default.equal(address, 'TXQo5GgQQJYVzreX5yzqqVnzBQP5Ek2iQW');
|
|
96
|
+
});
|
|
97
|
+
(0, node_test_1.it)('should get a new base58 address by default', () => {
|
|
98
|
+
const keyPair = new src_1.KeyPair(defaultSeed);
|
|
99
|
+
const address = keyPair.getAddress();
|
|
100
|
+
assert_1.default.equal(address, 'TXQo5GgQQJYVzreX5yzqqVnzBQP5Ek2iQW');
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
(0, node_test_1.describe)('getKeys', function () {
|
|
104
|
+
(0, node_test_1.it)('should get private and public keys in the protocol default format', () => {
|
|
105
|
+
const keyPair = new src_1.KeyPair(defaultSeed);
|
|
106
|
+
const { prv, pub } = keyPair.getKeys();
|
|
107
|
+
assert_1.default.equal(prv, '82A34E3867EA7EA4E67E27865D500AE84E98D07AB1BAB06526F0A5A5FDCC3EBA');
|
|
108
|
+
assert_1.default.equal(pub, '04D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A827503E948A2FDBF74A981D4E0054F10EDA7042C2D469F44473D3C7791E0E326E355');
|
|
109
|
+
});
|
|
110
|
+
(0, node_test_1.it)('should get private and public keys for a random seed', () => {
|
|
111
|
+
const keyPair = new src_1.KeyPair();
|
|
112
|
+
const { prv, pub } = keyPair.getKeys();
|
|
113
|
+
assert_1.default.ok(prv);
|
|
114
|
+
assert_1.default.ok(pub);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
(0, node_test_1.describe)('getExtendedKeys', function () {
|
|
118
|
+
(0, node_test_1.it)('should get the keys in extended format', () => {
|
|
119
|
+
const keyPair = new src_1.KeyPair(defaultSeed);
|
|
120
|
+
const { xprv, xpub } = keyPair.getExtendedKeys();
|
|
121
|
+
assert_1.default.equal(xprv, 'xprv9s21ZrQH143K3D8TXfvAJgHVfTEeQNW5Ys9wZtnUZkqPzFzSjbEJrWC1vZ4GnXCvR7rQL2UFX3RSuYeU9MrERm1XBvACow7c36vnz5iYyj2');
|
|
122
|
+
assert_1.default.equal(xpub, 'xpub661MyMwAqRbcFhCvdhTAfpEEDV58oqDvv65YNHC686NNs4KbH8YZQJWVmrfbve7aAVHzxw8bKFxA7MLeDK6BbLfkE3bqkvHLPgaGHHtYGeY');
|
|
123
|
+
});
|
|
124
|
+
(0, node_test_1.it)('should get the keys in extended format for a random seed', () => {
|
|
125
|
+
const keyPair = new src_1.KeyPair();
|
|
126
|
+
const { xprv, xpub } = keyPair.getExtendedKeys();
|
|
127
|
+
assert_1.default.ok(xprv);
|
|
128
|
+
assert_1.default.ok(xpub);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
(0, node_test_1.describe)('signMessage', function () {
|
|
132
|
+
(0, node_test_1.it)('should sign a message', () => {
|
|
133
|
+
const keyPair = new src_1.KeyPair(defaultSeed);
|
|
134
|
+
const message = 'Hello world';
|
|
135
|
+
const signature = keyPair.signMessage(message);
|
|
136
|
+
assert_1.default.equal(signature.toString('hex'), '83eec642ee0215c5d645393fa3f23b586bfe426ec4206fdb2b66d1620d308a4d4df57cc10cc4207c4a4c19e2ed572229bb1afe26ca0018eaed2bd2a44528f67d1b');
|
|
137
|
+
assert_1.default.strictEqual(keyPair.verifySignature(message, signature), true);
|
|
138
|
+
});
|
|
139
|
+
(0, node_test_1.it)('should fail if there is no private key', () => {
|
|
140
|
+
const source = {
|
|
141
|
+
pub: '03D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A8275',
|
|
142
|
+
};
|
|
143
|
+
const keyPair = new src_1.KeyPair(source);
|
|
144
|
+
const message = 'Hello world';
|
|
145
|
+
assert_1.default.throws(() => keyPair.signMessage(message));
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
(0, node_test_1.describe)('verifySignature', function () {
|
|
149
|
+
(0, node_test_1.it)('should be true for a properly signed message', () => {
|
|
150
|
+
const keyPair = new src_1.KeyPair(defaultSeed);
|
|
151
|
+
const message = 'Hello world';
|
|
152
|
+
const signature = Buffer.from('83eec642ee0215c5d645393fa3f23b586bfe426ec4206fdb2b66d1620d308a4d4df57cc10cc4207c4a4c19e2ed572229bb1afe26ca0018eaed2bd2a44528f67d1b', 'hex');
|
|
153
|
+
assert_1.default.strictEqual(keyPair.verifySignature(message, signature), true);
|
|
154
|
+
});
|
|
155
|
+
(0, node_test_1.it)('should be false for a message with the wrong signature', () => {
|
|
156
|
+
const keyPair = new src_1.KeyPair(defaultSeed);
|
|
157
|
+
const message = 'Not the message you expected';
|
|
158
|
+
const signature = Buffer.from('83eec642ee0215c5d645393fa3f23b586bfe426ec4206fdb2b66d1620d308a4d4df57cc10cc4207c4a4c19e2ed572229bb1afe26ca0018eaed2bd2a44528f67d1b', 'hex');
|
|
159
|
+
assert_1.default.strictEqual(keyPair.verifySignature(message, signature), false);
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5UGFpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9rZXlQYWlyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUNBQXlDO0FBQ3pDLG9EQUE0QjtBQUU1QixtQ0FBb0M7QUFDcEMsbURBQXFEO0FBRXJELElBQUEsb0JBQVEsRUFBQyxhQUFhLEVBQUU7SUFDdEIsTUFBTSxXQUFXLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBRS9DLElBQUEsb0JBQVEsRUFBQyx5QkFBeUIsRUFBRTtRQUNsQyxJQUFBLGNBQUUsRUFBQyxjQUFjLEVBQUUsR0FBRyxFQUFFO1lBQ3RCLE1BQU0sTUFBTSxHQUFHO2dCQUNiLEdBQUcsRUFBRSxpSEFBaUg7YUFDdkgsQ0FBQztZQUNGLE1BQU0sT0FBTyxHQUFHLElBQUksYUFBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3pDLGdCQUFNLENBQUMsS0FBSyxDQUNWLFdBQVcsQ0FBQyxHQUFHLEVBQ2Ysb0lBQW9JLENBQ3JJLENBQUM7WUFFRixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDL0MsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzQyxnQkFBTSxDQUFDLEtBQUssQ0FDVixZQUFZLENBQUMsSUFBSSxFQUNqQixpSEFBaUgsQ0FDbEgsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxjQUFFLEVBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtZQUN0QixNQUFNLE1BQU0sR0FBRztnQkFDYixHQUFHLEVBQUUsaUhBQWlIO2FBQ3ZILENBQUM7WUFDRixNQUFNLE9BQU8sR0FBRyxJQUFJLGFBQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUksRUFBRSxrRUFBa0UsQ0FBQyxDQUFDO1lBQ25HLGdCQUFNLENBQUMsS0FBSyxDQUNWLFdBQVcsQ0FBQyxHQUFHLEVBQ2Ysb0lBQW9JLENBQ3JJLENBQUM7WUFFRixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDL0MsZ0JBQU0sQ0FBQyxLQUFLLENBQ1YsWUFBWSxDQUFDLElBQUssRUFDbEIsaUhBQWlILENBQ2xILENBQUM7WUFDRixnQkFBTSxDQUFDLEtBQUssQ0FDVixZQUFZLENBQUMsSUFBSSxFQUNqQixpSEFBaUgsQ0FDbEgsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxjQUFFLEVBQUMsaUNBQWlDLEVBQUUsR0FBRyxFQUFFO1lBQ3pDLE1BQU0sTUFBTSxHQUFHO2dCQUNiLEdBQUcsRUFBRSxvSUFBb0k7YUFDMUksQ0FBQztZQUNGLE1BQU0sT0FBTyxHQUFHLElBQUksYUFBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3pDLGdCQUFNLENBQUMsS0FBSyxDQUNWLFdBQVcsQ0FBQyxHQUFHLEVBQ2Ysb0lBQW9JLENBQ3JJLENBQUM7WUFFRixnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUEsY0FBRSxFQUFDLDhCQUE4QixFQUFFLEdBQUcsRUFBRTtZQUN0QyxNQUFNLE1BQU0sR0FBRztnQkFDYixHQUFHLEVBQUUsb0VBQW9FO2FBQzFFLENBQUM7WUFDRixNQUFNLE9BQU8sR0FBRyxJQUFJLGFBQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN6QyxnQkFBTSxDQUFDLEtBQUssQ0FDVixXQUFXLENBQUMsR0FBRyxFQUNmLG9JQUFvSSxDQUNySSxDQUFDO1lBRUYsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLGNBQUUsRUFBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7WUFDaEMsTUFBTSxNQUFNLEdBQUc7Z0JBQ2IsR0FBRyxFQUFFLGtFQUFrRTthQUN4RSxDQUFDO1lBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RDLGdCQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFJLEVBQUUsa0VBQWtFLENBQUMsQ0FBQztZQUNuRyxnQkFBTSxDQUFDLEtBQUssQ0FDVixXQUFXLENBQUMsR0FBRyxFQUNmLG9JQUFvSSxDQUNySSxDQUFDO1lBRUYsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsb0JBQVEsRUFBQyxpQ0FBaUMsRUFBRTtRQUMxQyxJQUFBLGNBQUUsRUFBQyxzQkFBc0IsRUFBRSxHQUFHLEVBQUU7WUFDOUIsTUFBTSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsc0RBQXNEO1lBQzlGLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksYUFBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLGNBQUUsRUFBQyw0QkFBNEIsRUFBRSxHQUFHLEVBQUU7WUFDcEMsTUFBTSxNQUFNLEdBQUc7Z0JBQ2IsR0FBRyxFQUFFLFFBQVE7YUFDZCxDQUFDO1lBQ0YsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxhQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUEsY0FBRSxFQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtZQUNyQyxNQUFNLE1BQU0sR0FBRztnQkFDYixHQUFHLEVBQUUsUUFBUTthQUNkLENBQUM7WUFDRixnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLGFBQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLG9CQUFRLEVBQUMsWUFBWSxFQUFFO1FBQ3JCLElBQUEsY0FBRSxFQUFDLDhCQUE4QixFQUFFLEdBQUcsRUFBRTtZQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLGFBQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLHdCQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLDRDQUE0QyxDQUFDLENBQUM7UUFDdEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLGNBQUUsRUFBQyxpQ0FBaUMsRUFBRSxHQUFHLEVBQUU7WUFDekMsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDekMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyx3QkFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pELGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxvQ0FBb0MsQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxjQUFFLEVBQUMsNENBQTRDLEVBQUUsR0FBRyxFQUFFO1lBQ3BELE1BQU0sT0FBTyxHQUFHLElBQUksYUFBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsb0NBQW9DLENBQUMsQ0FBQztRQUM5RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxvQkFBUSxFQUFDLFNBQVMsRUFBRTtRQUNsQixJQUFBLGNBQUUsRUFBQyxtRUFBbUUsRUFBRSxHQUFHLEVBQUU7WUFDM0UsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDekMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsR0FBSSxFQUFFLGtFQUFrRSxDQUFDLENBQUM7WUFDdkYsZ0JBQU0sQ0FBQyxLQUFLLENBQ1YsR0FBRyxFQUNILG9JQUFvSSxDQUNySSxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLGNBQUUsRUFBQyxzREFBc0QsRUFBRSxHQUFHLEVBQUU7WUFDOUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFPLEVBQUUsQ0FBQztZQUM5QixNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN2QyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNmLGdCQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLG9CQUFRLEVBQUMsaUJBQWlCLEVBQUU7UUFDMUIsSUFBQSxjQUFFLEVBQUMsd0NBQXdDLEVBQUUsR0FBRyxFQUFFO1lBQ2hELE1BQU0sT0FBTyxHQUFHLElBQUksYUFBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ2pELGdCQUFNLENBQUMsS0FBSyxDQUNWLElBQUssRUFDTCxpSEFBaUgsQ0FDbEgsQ0FBQztZQUNGLGdCQUFNLENBQUMsS0FBSyxDQUNWLElBQUksRUFDSixpSEFBaUgsQ0FDbEgsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxjQUFFLEVBQUMsMkRBQTJELEVBQUUsR0FBRyxFQUFFO1lBQ25FLE1BQU0sT0FBTyxHQUFHLElBQUksYUFBTyxFQUFFLENBQUM7WUFDOUIsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDakQsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEIsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsb0JBQVEsRUFBQyxhQUFhLEVBQUU7UUFDdEIsSUFBQSxjQUFFLEVBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO1lBQy9CLE1BQU0sT0FBTyxHQUFHLElBQUksYUFBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQztZQUM5QixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQy9DLGdCQUFNLENBQUMsS0FBSyxDQUNWLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQ3pCLG9JQUFvSSxDQUNySSxDQUFDO1lBQ0YsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLGNBQUUsRUFBQyx3Q0FBd0MsRUFBRSxHQUFHLEVBQUU7WUFDaEQsTUFBTSxNQUFNLEdBQUc7Z0JBQ2IsR0FBRyxFQUFFLG9FQUFvRTthQUMxRSxDQUFDO1lBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEMsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDO1lBQzlCLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxvQkFBUSxFQUFDLGlCQUFpQixFQUFFO1FBQzFCLElBQUEsY0FBRSxFQUFDLDhDQUE4QyxFQUFFLEdBQUcsRUFBRTtZQUN0RCxNQUFNLE9BQU8sR0FBRyxJQUFJLGFBQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUM7WUFDOUIsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FDM0Isb0lBQW9JLEVBQ3BJLEtBQUssQ0FDTixDQUFDO1lBQ0YsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLGNBQUUsRUFBQyx3REFBd0QsRUFBRSxHQUFHLEVBQUU7WUFDaEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDekMsTUFBTSxPQUFPLEdBQUcsOEJBQThCLENBQUM7WUFDL0MsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FDM0Isb0lBQW9JLEVBQ3BJLEtBQUssQ0FDTixDQUFDO1lBQ0YsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGl0IH0gZnJvbSAnbm9kZTp0ZXN0JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBBZGRyZXNzRm9ybWF0IH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5kZXNjcmliZSgnVHJ4IEtleVBhaXInLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGRlZmF1bHRTZWVkID0geyBzZWVkOiBCdWZmZXIuYWxsb2MoMzIpIH07XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBjcmVhdGUgYSBLZXlQYWlyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdmcm9tIGFuIHhwdWInLCAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSB7XG4gICAgICAgIHB1YjogJ3hwdWI2NjFNeU13QXFSYmNGaEN2ZGhUQWZwRUVEVjU4b3FEdnY2NVlOSEM2ODZOTnM0S2JIOFlaUUpXVm1yZmJ2ZTdhQVZIenh3OGJLRnhBN01MZURLNkJiTGZrRTNicWt2SExQZ2FHSEh0WUdlWScsXG4gICAgICB9O1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHNvdXJjZSk7XG4gICAgICBjb25zdCBkZWZhdWx0S2V5cyA9IGtleVBhaXIuZ2V0S2V5cygpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRlZmF1bHRLZXlzLnBydiwgdW5kZWZpbmVkKTtcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgZGVmYXVsdEtleXMucHViLFxuICAgICAgICAnMDRENjNEOUZEOUZENzcyQTk4OUM1QjkwRURCMzc3MTY0MDYzNTZFOTgyNzNFNUY5OEZFMDc2NTIyNDdBM0E4Mjc1MDNFOTQ4QTJGREJGNzRBOTgxRDRFMDA1NEYxMEVEQTcwNDJDMkQ0NjlGNDQ0NzNEM0M3NzkxRTBFMzI2RTM1NSdcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGV4dGVuZGVkS2V5cyA9IGtleVBhaXIuZ2V0RXh0ZW5kZWRLZXlzKCk7XG4gICAgICBhc3NlcnQuZXF1YWwoZXh0ZW5kZWRLZXlzLnhwcnYsIHVuZGVmaW5lZCk7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIGV4dGVuZGVkS2V5cy54cHViLFxuICAgICAgICAneHB1YjY2MU15TXdBcVJiY0ZoQ3ZkaFRBZnBFRURWNThvcUR2djY1WU5IQzY4Nk5OczRLYkg4WVpRSldWbXJmYnZlN2FBVkh6eHc4YktGeEE3TUxlREs2QmJMZmtFM2Jxa3ZITFBnYUdISHRZR2VZJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdmcm9tIGFuIHhwcnYnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSB7XG4gICAgICAgIHBydjogJ3hwcnY5czIxWnJRSDE0M0szRDhUWGZ2QUpnSFZmVEVlUU5XNVlzOXdadG5VWmtxUHpGelNqYkVKcldDMXZaNEduWEN2UjdyUUwyVUZYM1JTdVllVTlNckVSbTFYQnZBQ293N2MzNnZuejVpWXlqMicsXG4gICAgICB9O1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHNvdXJjZSk7XG4gICAgICBjb25zdCBkZWZhdWx0S2V5cyA9IGtleVBhaXIuZ2V0S2V5cygpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRlZmF1bHRLZXlzLnBydiEsICc4MkEzNEUzODY3RUE3RUE0RTY3RTI3ODY1RDUwMEFFODRFOThEMDdBQjFCQUIwNjUyNkYwQTVBNUZEQ0MzRUJBJyk7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIGRlZmF1bHRLZXlzLnB1YixcbiAgICAgICAgJzA0RDYzRDlGRDlGRDc3MkE5ODlDNUI5MEVEQjM3NzE2NDA2MzU2RTk4MjczRTVGOThGRTA3NjUyMjQ3QTNBODI3NTAzRTk0OEEyRkRCRjc0QTk4MUQ0RTAwNTRGMTBFREE3MDQyQzJENDY5RjQ0NDczRDNDNzc5MUUwRTMyNkUzNTUnXG4gICAgICApO1xuXG4gICAgICBjb25zdCBleHRlbmRlZEtleXMgPSBrZXlQYWlyLmdldEV4dGVuZGVkS2V5cygpO1xuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICBleHRlbmRlZEtleXMueHBydiEsXG4gICAgICAgICd4cHJ2OXMyMVpyUUgxNDNLM0Q4VFhmdkFKZ0hWZlRFZVFOVzVZczl3WnRuVVprcVB6RnpTamJFSnJXQzF2WjRHblhDdlI3clFMMlVGWDNSU3VZZVU5TXJFUm0xWEJ2QUNvdzdjMzZ2bno1aVl5ajInXG4gICAgICApO1xuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICBleHRlbmRlZEtleXMueHB1YixcbiAgICAgICAgJ3hwdWI2NjFNeU13QXFSYmNGaEN2ZGhUQWZwRUVEVjU4b3FEdnY2NVlOSEM2ODZOTnM0S2JIOFlaUUpXVm1yZmJ2ZTdhQVZIenh3OGJLRnhBN01MZURLNkJiTGZrRTNicWt2SExQZ2FHSEh0WUdlWSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnZnJvbSBhbiB1bmNvbXByZXNzZWQgcHVibGljIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHtcbiAgICAgICAgcHViOiAnMDRENjNEOUZEOUZENzcyQTk4OUM1QjkwRURCMzc3MTY0MDYzNTZFOTgyNzNFNUY5OEZFMDc2NTIyNDdBM0E4Mjc1MDNFOTQ4QTJGREJGNzRBOTgxRDRFMDA1NEYxMEVEQTcwNDJDMkQ0NjlGNDQ0NzNEM0M3NzkxRTBFMzI2RTM1NScsXG4gICAgICB9O1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHNvdXJjZSk7XG4gICAgICBjb25zdCBkZWZhdWx0S2V5cyA9IGtleVBhaXIuZ2V0S2V5cygpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRlZmF1bHRLZXlzLnBydiwgdW5kZWZpbmVkKTtcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgZGVmYXVsdEtleXMucHViLFxuICAgICAgICAnMDRENjNEOUZEOUZENzcyQTk4OUM1QjkwRURCMzc3MTY0MDYzNTZFOTgyNzNFNUY5OEZFMDc2NTIyNDdBM0E4Mjc1MDNFOTQ4QTJGREJGNzRBOTgxRDRFMDA1NEYxMEVEQTcwNDJDMkQ0NjlGNDQ0NzNEM0M3NzkxRTBFMzI2RTM1NSdcbiAgICAgICk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ga2V5UGFpci5nZXRFeHRlbmRlZEtleXMoKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZnJvbSBhIGNvbXByZXNzZWQgcHVibGljIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHtcbiAgICAgICAgcHViOiAnMDNENjNEOUZEOUZENzcyQTk4OUM1QjkwRURCMzc3MTY0MDYzNTZFOTgyNzNFNUY5OEZFMDc2NTIyNDdBM0E4Mjc1JyxcbiAgICAgIH07XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoc291cmNlKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRLZXlzID0ga2V5UGFpci5nZXRLZXlzKCk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGVmYXVsdEtleXMucHJ2LCB1bmRlZmluZWQpO1xuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICBkZWZhdWx0S2V5cy5wdWIsXG4gICAgICAgICcwNEQ2M0Q5RkQ5RkQ3NzJBOTg5QzVCOTBFREIzNzcxNjQwNjM1NkU5ODI3M0U1Rjk4RkUwNzY1MjI0N0EzQTgyNzUwM0U5NDhBMkZEQkY3NEE5ODFENEUwMDU0RjEwRURBNzA0MkMyRDQ2OUY0NDQ3M0QzQzc3OTFFMEUzMjZFMzU1J1xuICAgICAgKTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBrZXlQYWlyLmdldEV4dGVuZGVkS2V5cygpKTtcbiAgICB9KTtcblxuICAgIGl0KCdmcm9tIGEgcmF3IHByaXZhdGUga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0ge1xuICAgICAgICBwcnY6ICc4MkEzNEUzODY3RUE3RUE0RTY3RTI3ODY1RDUwMEFFODRFOThEMDdBQjFCQUIwNjUyNkYwQTVBNUZEQ0MzRUJBJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoc291cmNlKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRLZXlzID0ga2V5UGFpci5nZXRLZXlzKCk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGVmYXVsdEtleXMucHJ2ISwgJzgyQTM0RTM4NjdFQTdFQTRFNjdFMjc4NjVENTAwQUU4NEU5OEQwN0FCMUJBQjA2NTI2RjBBNUE1RkRDQzNFQkEnKTtcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgZGVmYXVsdEtleXMucHViLFxuICAgICAgICAnMDRENjNEOUZEOUZENzcyQTk4OUM1QjkwRURCMzc3MTY0MDYzNTZFOTgyNzNFNUY5OEZFMDc2NTIyNDdBM0E4Mjc1MDNFOTQ4QTJGREJGNzRBOTgxRDRFMDA1NEYxMEVEQTcwNDJDMkQ0NjlGNDQ0NzNEM0M3NzkxRTBFMzI2RTM1NSdcbiAgICAgICk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ga2V5UGFpci5nZXRFeHRlbmRlZEtleXMoKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgZmFpbCB0byBjcmVhdGUgYSBLZXlQYWlyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdmcm9tIGFuIGludmFsaWQgc2VlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHNlZWQgPSB7IHNlZWQ6IEJ1ZmZlci5hbGxvYyg4KSB9OyAvLyAgU2VlZCBzaG91bGQgYmUgYXQgbGVhc3QgMTI4IGJpdHMgKDE2IGJ5dGVzLCBub3QgOClcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gbmV3IEtleVBhaXIoc2VlZCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb20gYW4gaW52YWxpZCBwdWJsaWMga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0ge1xuICAgICAgICBwdWI6ICcwMUQ2M0QnLFxuICAgICAgfTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gbmV3IEtleVBhaXIoc291cmNlKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZnJvbSBhbiBpbnZhbGlkIHByaXZhdGUga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0ge1xuICAgICAgICBwcnY6ICc4MkEzNEUnLFxuICAgICAgfTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gbmV3IEtleVBhaXIoc291cmNlKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZ2V0IGEgbmV3IGhleCBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKGRlZmF1bHRTZWVkKTtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSBrZXlQYWlyLmdldEFkZHJlc3MoQWRkcmVzc0Zvcm1hdC5oZXgpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGFkZHJlc3MsICc0MUVCMzE3QjlGMkUwODkxRDY2QzA2MUREQzNGNUVFN0VENDJENzBBNDQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IGEgbmV3IGJhc2U1OCBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKGRlZmF1bHRTZWVkKTtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSBrZXlQYWlyLmdldEFkZHJlc3MoQWRkcmVzc0Zvcm1hdC5iYXNlNTgpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGFkZHJlc3MsICdUWFFvNUdnUVFKWVZ6cmVYNXl6cXFWbnpCUVA1RWsyaVFXJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdldCBhIG5ldyBiYXNlNTggYWRkcmVzcyBieSBkZWZhdWx0JywgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKGRlZmF1bHRTZWVkKTtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSBrZXlQYWlyLmdldEFkZHJlc3MoKTtcbiAgICAgIGFzc2VydC5lcXVhbChhZGRyZXNzLCAnVFhRbzVHZ1FRSllWenJlWDV5enFxVm56QlFQNUVrMmlRVycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0S2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGdldCBwcml2YXRlIGFuZCBwdWJsaWMga2V5cyBpbiB0aGUgcHJvdG9jb2wgZGVmYXVsdCBmb3JtYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoZGVmYXVsdFNlZWQpO1xuICAgICAgY29uc3QgeyBwcnYsIHB1YiB9ID0ga2V5UGFpci5nZXRLZXlzKCk7XG4gICAgICBhc3NlcnQuZXF1YWwocHJ2ISwgJzgyQTM0RTM4NjdFQTdFQTRFNjdFMjc4NjVENTAwQUU4NEU5OEQwN0FCMUJBQjA2NTI2RjBBNUE1RkRDQzNFQkEnKTtcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgcHViLFxuICAgICAgICAnMDRENjNEOUZEOUZENzcyQTk4OUM1QjkwRURCMzc3MTY0MDYzNTZFOTgyNzNFNUY5OEZFMDc2NTIyNDdBM0E4Mjc1MDNFOTQ4QTJGREJGNzRBOTgxRDRFMDA1NEYxMEVEQTcwNDJDMkQ0NjlGNDQ0NzNEM0M3NzkxRTBFMzI2RTM1NSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdldCBwcml2YXRlIGFuZCBwdWJsaWMga2V5cyBmb3IgYSByYW5kb20gc2VlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcigpO1xuICAgICAgY29uc3QgeyBwcnYsIHB1YiB9ID0ga2V5UGFpci5nZXRLZXlzKCk7XG4gICAgICBhc3NlcnQub2socHJ2KTtcbiAgICAgIGFzc2VydC5vayhwdWIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0RXh0ZW5kZWRLZXlzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZ2V0IHRoZSBrZXlzIGluIGV4dGVuZGVkIGZvcm1hdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcihkZWZhdWx0U2VlZCk7XG4gICAgICBjb25zdCB7IHhwcnYsIHhwdWIgfSA9IGtleVBhaXIuZ2V0RXh0ZW5kZWRLZXlzKCk7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIHhwcnYhLFxuICAgICAgICAneHBydjlzMjFaclFIMTQzSzNEOFRYZnZBSmdIVmZURWVRTlc1WXM5d1p0blVaa3FQekZ6U2piRUpyV0Mxdlo0R25YQ3ZSN3JRTDJVRlgzUlN1WWVVOU1yRVJtMVhCdkFDb3c3YzM2dm56NWlZeWoyJ1xuICAgICAgKTtcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgeHB1YixcbiAgICAgICAgJ3hwdWI2NjFNeU13QXFSYmNGaEN2ZGhUQWZwRUVEVjU4b3FEdnY2NVlOSEM2ODZOTnM0S2JIOFlaUUpXVm1yZmJ2ZTdhQVZIenh3OGJLRnhBN01MZURLNkJiTGZrRTNicWt2SExQZ2FHSEh0WUdlWSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdldCB0aGUga2V5cyBpbiBleHRlbmRlZCBmb3JtYXQgIGZvciBhIHJhbmRvbSBzZWVkJywgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKCk7XG4gICAgICBjb25zdCB7IHhwcnYsIHhwdWIgfSA9IGtleVBhaXIuZ2V0RXh0ZW5kZWRLZXlzKCk7XG4gICAgICBhc3NlcnQub2soeHBydik7XG4gICAgICBhc3NlcnQub2soeHB1Yik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduTWVzc2FnZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHNpZ24gYSBtZXNzYWdlJywgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKGRlZmF1bHRTZWVkKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnSGVsbG8gd29ybGQnO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0ga2V5UGFpci5zaWduTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgc2lnbmF0dXJlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgJzgzZWVjNjQyZWUwMjE1YzVkNjQ1MzkzZmEzZjIzYjU4NmJmZTQyNmVjNDIwNmZkYjJiNjZkMTYyMGQzMDhhNGQ0ZGY1N2NjMTBjYzQyMDdjNGE0YzE5ZTJlZDU3MjIyOWJiMWFmZTI2Y2EwMDE4ZWFlZDJiZDJhNDQ1MjhmNjdkMWInXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGtleVBhaXIudmVyaWZ5U2lnbmF0dXJlKG1lc3NhZ2UsIHNpZ25hdHVyZSksIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGlmIHRoZXJlIGlzIG5vIHByaXZhdGUga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0ge1xuICAgICAgICBwdWI6ICcwM0Q2M0Q5RkQ5RkQ3NzJBOTg5QzVCOTBFREIzNzcxNjQwNjM1NkU5ODI3M0U1Rjk4RkUwNzY1MjI0N0EzQTgyNzUnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcihzb3VyY2UpO1xuICAgICAgY29uc3QgbWVzc2FnZSA9ICdIZWxsbyB3b3JsZCc7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGtleVBhaXIuc2lnbk1lc3NhZ2UobWVzc2FnZSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmVyaWZ5U2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYmUgdHJ1ZSBmb3IgYSBwcm9wZXJseSBzaWduZWQgbWVzc2FnZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcihkZWZhdWx0U2VlZCk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ0hlbGxvIHdvcmxkJztcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IEJ1ZmZlci5mcm9tKFxuICAgICAgICAnODNlZWM2NDJlZTAyMTVjNWQ2NDUzOTNmYTNmMjNiNTg2YmZlNDI2ZWM0MjA2ZmRiMmI2NmQxNjIwZDMwOGE0ZDRkZjU3Y2MxMGNjNDIwN2M0YTRjMTllMmVkNTcyMjI5YmIxYWZlMjZjYTAwMThlYWVkMmJkMmE0NDUyOGY2N2QxYicsXG4gICAgICAgICdoZXgnXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGtleVBhaXIudmVyaWZ5U2lnbmF0dXJlKG1lc3NhZ2UsIHNpZ25hdHVyZSksIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBiZSBmYWxzZSBmb3IgYSBtZXNzYWdlIHdpdGggdGhlIHdyb25nIHNpZ25hdHVyZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcihkZWZhdWx0U2VlZCk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ05vdCB0aGUgbWVzc2FnZSB5b3UgZXhwZWN0ZWQnO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gQnVmZmVyLmZyb20oXG4gICAgICAgICc4M2VlYzY0MmVlMDIxNWM1ZDY0NTM5M2ZhM2YyM2I1ODZiZmU0MjZlYzQyMDZmZGIyYjY2ZDE2MjBkMzA4YTRkNGRmNTdjYzEwY2M0MjA3YzRhNGMxOWUyZWQ1NzIyMjliYjFhZmUyNmNhMDAxOGVhZWQyYmQyYTQ0NTI4ZjY3ZDFiJyxcbiAgICAgICAgJ2hleCdcbiAgICAgICk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoa2V5UGFpci52ZXJpZnlTaWduYXR1cmUobWVzc2FnZSwgc2lnbmF0dXJlKSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../test/unit/transaction.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,38 @@
|
|
|
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 node_test_1 = require("node:test");
|
|
7
|
+
const assert_1 = __importDefault(require("assert"));
|
|
8
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
9
|
+
const src_1 = require("../../src");
|
|
10
|
+
const resources_1 = require("../resources");
|
|
11
|
+
(0, node_test_1.describe)('Tron transactions', function () {
|
|
12
|
+
(0, node_test_1.describe)('should parse', () => {
|
|
13
|
+
(0, node_test_1.it)('inputs and outputs from an unsigned transaction', () => {
|
|
14
|
+
const tx = new src_1.Transaction(statics_1.coins.get('ttrx'), resources_1.UnsignedBuildTransaction);
|
|
15
|
+
assert_1.default.equal(tx.inputs.length, 1);
|
|
16
|
+
assert_1.default.equal(tx.inputs[0].address, 'TTsGwnTLQ4eryFJpDvJSfuGQxPXRCjXvZz');
|
|
17
|
+
assert_1.default.equal(tx.inputs[0].value, '1718');
|
|
18
|
+
assert_1.default.equal(tx.outputs.length, 1);
|
|
19
|
+
assert_1.default.equal(tx.outputs[0].address, 'TNYssiPgaf9XYz3urBUqr861Tfqxvko47B');
|
|
20
|
+
assert_1.default.equal(tx.outputs[0].value, '1718');
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
(0, node_test_1.describe)('should throw when', () => {
|
|
24
|
+
(0, node_test_1.it)('transaction is empty and toJson is called', () => {
|
|
25
|
+
const tx = new src_1.Transaction(statics_1.coins.get('ttrx'));
|
|
26
|
+
assert_1.default.throws(() => tx.toJson());
|
|
27
|
+
});
|
|
28
|
+
(0, node_test_1.it)('transaction is empty and extendExpiration is called', () => {
|
|
29
|
+
const tx = new src_1.Transaction(statics_1.coins.get('ttrx'));
|
|
30
|
+
assert_1.default.throws(() => tx.extendExpiration(1));
|
|
31
|
+
});
|
|
32
|
+
(0, node_test_1.it)('the extension time is negative', () => {
|
|
33
|
+
const tx = new src_1.Transaction(statics_1.coins.get('ttrx'));
|
|
34
|
+
assert_1.default.throws(() => tx.extendExpiration(-1));
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5Q0FBeUM7QUFDekMsb0RBQTRCO0FBQzVCLGlEQUE0QztBQUM1QyxtQ0FBbUQ7QUFDbkQsNENBQXdEO0FBRXhELElBQUEsb0JBQVEsRUFBQyxtQkFBbUIsRUFBRTtJQUM1QixJQUFBLG9CQUFRLEVBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtRQUM1QixJQUFBLGNBQUUsRUFBQyxpREFBaUQsRUFBRSxHQUFHLEVBQUU7WUFDekQsTUFBTSxFQUFFLEdBQUcsSUFBSSxpQkFBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsb0NBQXdELENBQUMsQ0FBQztZQUN4RyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxvQ0FBb0MsQ0FBQyxDQUFDO1lBQ3pFLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3pDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25DLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLG9DQUFvQyxDQUFDLENBQUM7WUFDMUUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsb0JBQVEsRUFBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7UUFDakMsSUFBQSxjQUFFLEVBQUMsMkNBQTJDLEVBQUUsR0FBRyxFQUFFO1lBQ25ELE1BQU0sRUFBRSxHQUFHLElBQUksaUJBQVcsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDOUMsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLGNBQUUsRUFBQyxxREFBcUQsRUFBRSxHQUFHLEVBQUU7WUFDN0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxpQkFBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUM5QyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUEsY0FBRSxFQUFDLGdDQUFnQyxFQUFFLEdBQUcsRUFBRTtZQUN4QyxNQUFNLEVBQUUsR0FBRyxJQUFJLGlCQUFXLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzlDLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGl0IH0gZnJvbSAnbm9kZTp0ZXN0JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBJbnRlcmZhY2UsIFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCB7IFVuc2lnbmVkQnVpbGRUcmFuc2FjdGlvbiB9IGZyb20gJy4uL3Jlc291cmNlcyc7XG5cbmRlc2NyaWJlKCdUcm9uIHRyYW5zYWN0aW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ3Nob3VsZCBwYXJzZScsICgpID0+IHtcbiAgICBpdCgnaW5wdXRzIGFuZCBvdXRwdXRzIGZyb20gYW4gdW5zaWduZWQgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3R0cngnKSwgVW5zaWduZWRCdWlsZFRyYW5zYWN0aW9uIGFzIEludGVyZmFjZS5UcmFuc2FjdGlvblJlY2VpcHQpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LmlucHV0cy5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LmlucHV0c1swXS5hZGRyZXNzLCAnVFRzR3duVExRNGVyeUZKcER2SlNmdUdReFBYUkNqWHZaeicpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LmlucHV0c1swXS52YWx1ZSwgJzE3MTgnKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5vdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgub3V0cHV0c1swXS5hZGRyZXNzLCAnVE5Zc3NpUGdhZjlYWXozdXJCVXFyODYxVGZxeHZrbzQ3QicpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4Lm91dHB1dHNbMF0udmFsdWUsICcxNzE4Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgdGhyb3cgd2hlbicsICgpID0+IHtcbiAgICBpdCgndHJhbnNhY3Rpb24gaXMgZW1wdHkgYW5kIHRvSnNvbiBpcyBjYWxsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3R0cngnKSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4LnRvSnNvbigpKTtcbiAgICB9KTtcblxuICAgIGl0KCd0cmFuc2FjdGlvbiBpcyBlbXB0eSBhbmQgZXh0ZW5kRXhwaXJhdGlvbiBpcyBjYWxsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3R0cngnKSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4LmV4dGVuZEV4cGlyYXRpb24oMSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3RoZSBleHRlbnNpb24gdGltZSBpcyBuZWdhdGl2ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHRyeCcpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHguZXh0ZW5kRXhwaXJhdGlvbigtMSkpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accountCreateTxBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/accountCreateTxBuilder.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,247 @@
|
|
|
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 sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
8
|
+
const node_test_1 = require("node:test");
|
|
9
|
+
const resources_1 = require("../../resources");
|
|
10
|
+
const builder_1 = require("../../../src/lib/builder");
|
|
11
|
+
(0, node_test_1.describe)('Tron AccountCreate builder', function () {
|
|
12
|
+
const initTxBuilder = () => {
|
|
13
|
+
const builder = (0, builder_1.getBuilder)('ttrx').getAccountCreateTxBuilder();
|
|
14
|
+
builder
|
|
15
|
+
.source({ address: resources_1.PARTICIPANTS.custodian.address })
|
|
16
|
+
.setAccountAddress({ address: resources_1.PARTICIPANTS.to.address })
|
|
17
|
+
.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH });
|
|
18
|
+
return builder;
|
|
19
|
+
};
|
|
20
|
+
(0, node_test_1.describe)('should build successfully', () => {
|
|
21
|
+
(0, node_test_1.it)('a transaction with correct inputs', async () => {
|
|
22
|
+
const timestamp = Date.now();
|
|
23
|
+
const txBuilder = initTxBuilder();
|
|
24
|
+
txBuilder.timestamp(timestamp);
|
|
25
|
+
txBuilder.expiration(timestamp + 40000);
|
|
26
|
+
const tx = (await txBuilder.build());
|
|
27
|
+
const txJson = tx.toJson();
|
|
28
|
+
assert_1.default.equal(tx.type, sdk_core_1.TransactionType.AccountCreate);
|
|
29
|
+
assert_1.default.equal(tx.inputs.length, 1);
|
|
30
|
+
assert_1.default.equal(tx.inputs[0].address, resources_1.PARTICIPANTS.custodian.address);
|
|
31
|
+
assert_1.default.equal(tx.inputs[0].value, '0');
|
|
32
|
+
assert_1.default.equal(tx.outputs[0].value, '0');
|
|
33
|
+
assert_1.default.deepStrictEqual(txJson.raw_data.contract, resources_1.ACCOUNT_CREATE_CONTRACT);
|
|
34
|
+
});
|
|
35
|
+
(0, node_test_1.it)('an unsigned transaction from a string and from a JSON', async () => {
|
|
36
|
+
const timestamp = Date.now();
|
|
37
|
+
const txBuilder = initTxBuilder();
|
|
38
|
+
txBuilder.timestamp(timestamp);
|
|
39
|
+
txBuilder.expiration(timestamp + 40000);
|
|
40
|
+
const tx = await txBuilder.build();
|
|
41
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
42
|
+
txBuilder2.sign({ key: resources_1.PARTICIPANTS.custodian.pk });
|
|
43
|
+
const tx2 = await txBuilder2.build();
|
|
44
|
+
const txBuilder3 = (0, builder_1.getBuilder)('ttrx').from(tx.toJson());
|
|
45
|
+
txBuilder3.sign({ key: resources_1.PARTICIPANTS.custodian.pk });
|
|
46
|
+
const tx3 = await txBuilder3.build();
|
|
47
|
+
assert_1.default.deepStrictEqual(tx2, tx3);
|
|
48
|
+
});
|
|
49
|
+
(0, node_test_1.it)('an unsigned transaction with extended duration', async () => {
|
|
50
|
+
const timestamp = Date.now();
|
|
51
|
+
const expiration = timestamp + resources_1.EXPIRATION;
|
|
52
|
+
const extension = 60000;
|
|
53
|
+
const txBuilder = initTxBuilder();
|
|
54
|
+
txBuilder.timestamp(timestamp);
|
|
55
|
+
txBuilder.expiration(expiration);
|
|
56
|
+
const tx = await txBuilder.build();
|
|
57
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
58
|
+
txBuilder2.extendValidTo(extension);
|
|
59
|
+
txBuilder2.sign({ key: resources_1.PARTICIPANTS.custodian.pk });
|
|
60
|
+
const tx2 = await txBuilder2.build();
|
|
61
|
+
assert_1.default.equal(tx2.inputs.length, 1);
|
|
62
|
+
assert_1.default.equal(tx2.inputs[0].address, resources_1.PARTICIPANTS.custodian.address);
|
|
63
|
+
assert_1.default.equal(tx2.inputs[0].value, '0');
|
|
64
|
+
assert_1.default.equal(tx2.outputs[0].value, '0');
|
|
65
|
+
const txJson = tx2.toJson();
|
|
66
|
+
assert_1.default.equal(txJson.raw_data.expiration, expiration + extension);
|
|
67
|
+
});
|
|
68
|
+
(0, node_test_1.it)('a transaction signed multiple times', async () => {
|
|
69
|
+
const timestamp = Date.now();
|
|
70
|
+
const txBuilder = initTxBuilder();
|
|
71
|
+
txBuilder.timestamp(timestamp);
|
|
72
|
+
txBuilder.expiration(timestamp + resources_1.EXPIRATION);
|
|
73
|
+
const tx = await txBuilder.build();
|
|
74
|
+
let txJson = tx.toJson();
|
|
75
|
+
let rawData = txJson.raw_data;
|
|
76
|
+
assert_1.default.deepStrictEqual(rawData.contract, resources_1.ACCOUNT_CREATE_CONTRACT);
|
|
77
|
+
assert_1.default.equal(txJson.signature.length, 0);
|
|
78
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toJson());
|
|
79
|
+
txBuilder2.sign({ key: resources_1.PARTICIPANTS.custodian.pk });
|
|
80
|
+
const tx2 = await txBuilder2.build();
|
|
81
|
+
txJson = tx2.toJson();
|
|
82
|
+
rawData = txJson.raw_data;
|
|
83
|
+
assert_1.default.deepStrictEqual(rawData.contract, resources_1.ACCOUNT_CREATE_CONTRACT);
|
|
84
|
+
assert_1.default.equal(txJson.signature.length, 1);
|
|
85
|
+
const txBuilder3 = (0, builder_1.getBuilder)('ttrx').from(tx2.toJson());
|
|
86
|
+
txBuilder3.sign({ key: resources_1.PARTICIPANTS.from.pk });
|
|
87
|
+
const tx3 = await txBuilder3.build();
|
|
88
|
+
txJson = tx3.toJson();
|
|
89
|
+
rawData = txJson.raw_data;
|
|
90
|
+
assert_1.default.deepStrictEqual(rawData.contract, resources_1.ACCOUNT_CREATE_CONTRACT);
|
|
91
|
+
assert_1.default.equal(txJson.signature.length, 2);
|
|
92
|
+
assert_1.default.equal(rawData.expiration, timestamp + resources_1.EXPIRATION);
|
|
93
|
+
assert_1.default.equal(rawData.timestamp, timestamp);
|
|
94
|
+
});
|
|
95
|
+
(0, node_test_1.it)('preserves consistent transaction ID across round-trips', async () => {
|
|
96
|
+
const timestamp = Date.now();
|
|
97
|
+
const txBuilder = initTxBuilder();
|
|
98
|
+
txBuilder.timestamp(timestamp);
|
|
99
|
+
txBuilder.expiration(timestamp + resources_1.EXPIRATION);
|
|
100
|
+
const tx = await txBuilder.build();
|
|
101
|
+
const originalTxId = tx.toJson().txID;
|
|
102
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
103
|
+
const tx2 = await txBuilder2.build();
|
|
104
|
+
assert_1.default.equal(tx2.toJson().txID, originalTxId);
|
|
105
|
+
});
|
|
106
|
+
// Regression test: AccountCreateContract's enum value is 0, which is the
|
|
107
|
+
// proto3 default for the outer Transaction.Contract.type field. When the
|
|
108
|
+
// SDK explicitly encoded `type: 0`, the wire format included the 2-byte
|
|
109
|
+
// tag `0800` inside the contract envelope. TRON's node re-serializes
|
|
110
|
+
// raw_data from broadcast JSON and omits default-valued fields, producing
|
|
111
|
+
// a 2-byte-shorter canonical raw_data_hex and a different txID. The TSS
|
|
112
|
+
// signature was valid for the SDK's hash but recovered to a garbage
|
|
113
|
+
// pubkey under TRON's canonical hash, so AccountCreate broadcasts failed
|
|
114
|
+
// with SIGERROR "signed by <random T...> but not contained of permission".
|
|
115
|
+
(0, node_test_1.it)('produces raw_data_hex without the proto3 default-valued type field', async () => {
|
|
116
|
+
const timestamp = 1779455020653;
|
|
117
|
+
const expiration = 1779465820653;
|
|
118
|
+
const txBuilder = initTxBuilder();
|
|
119
|
+
txBuilder.timestamp(timestamp);
|
|
120
|
+
txBuilder.expiration(expiration);
|
|
121
|
+
const tx = await txBuilder.build();
|
|
122
|
+
const rawDataHex = tx.toJson().raw_data_hex;
|
|
123
|
+
// The buggy encoding had `5a68 0800 1264` (contract tag, length 0x68,
|
|
124
|
+
// type=0, parameter tag, length 0x64). The canonical encoding TRON
|
|
125
|
+
// re-serializes to drops the `0800` and decrements the contract length
|
|
126
|
+
// by 2 -> `5a66 1264`.
|
|
127
|
+
assert_1.default.ok(!rawDataHex.includes('5a68080012'), `raw_data_hex must not include the proto3-default \`type: 0\` tag (0800). Got: ${rawDataHex}`);
|
|
128
|
+
assert_1.default.ok(rawDataHex.includes('5a661264'), `raw_data_hex must use the canonical contract framing (5a66...1264). Got: ${rawDataHex}`);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
(0, node_test_1.describe)('should validate', () => {
|
|
132
|
+
(0, node_test_1.it)('a valid expiration', async () => {
|
|
133
|
+
const now = Date.now();
|
|
134
|
+
const expiration = now + resources_1.EXPIRATION;
|
|
135
|
+
const txBuilder = initTxBuilder();
|
|
136
|
+
txBuilder.timestamp(now);
|
|
137
|
+
txBuilder.expiration(expiration + 1000);
|
|
138
|
+
txBuilder.expiration(expiration);
|
|
139
|
+
const tx = await txBuilder.build();
|
|
140
|
+
const txJson = tx.toJson();
|
|
141
|
+
assert_1.default.equal(txJson.raw_data.expiration, expiration);
|
|
142
|
+
});
|
|
143
|
+
(0, node_test_1.it)('an expiration greater than one year', async () => {
|
|
144
|
+
const now = Date.now();
|
|
145
|
+
const txBuilder = initTxBuilder();
|
|
146
|
+
txBuilder.timestamp(now);
|
|
147
|
+
assert_1.default.throws(() => {
|
|
148
|
+
txBuilder.expiration(now + 31536000001);
|
|
149
|
+
}, (e) => e.message === 'Expiration must not be greater than one day');
|
|
150
|
+
});
|
|
151
|
+
(0, node_test_1.it)('an expiration less than the current date', async () => {
|
|
152
|
+
const now = Date.now();
|
|
153
|
+
const txBuilder = initTxBuilder();
|
|
154
|
+
txBuilder.timestamp(now - 2000);
|
|
155
|
+
assert_1.default.throws(() => {
|
|
156
|
+
txBuilder.expiration(now - 1000);
|
|
157
|
+
}, (e) => e.message === 'Expiration must be greater than current time');
|
|
158
|
+
});
|
|
159
|
+
(0, node_test_1.it)('an expiration less than the timestamp', async () => {
|
|
160
|
+
const now = Date.now();
|
|
161
|
+
const txBuilder = initTxBuilder();
|
|
162
|
+
txBuilder.timestamp(now + 2000);
|
|
163
|
+
assert_1.default.throws(() => {
|
|
164
|
+
txBuilder.expiration(now + 1000);
|
|
165
|
+
}, (e) => e.message === 'Expiration must be greater than timestamp');
|
|
166
|
+
});
|
|
167
|
+
(0, node_test_1.it)('an expiration set after build', async () => {
|
|
168
|
+
const now = Date.now();
|
|
169
|
+
const expiration = now + resources_1.EXPIRATION;
|
|
170
|
+
const txBuilder = initTxBuilder();
|
|
171
|
+
await txBuilder.build();
|
|
172
|
+
assert_1.default.throws(() => {
|
|
173
|
+
txBuilder.expiration(expiration);
|
|
174
|
+
}, (e) => e.message === 'Expiration is already set, it can only be extended');
|
|
175
|
+
});
|
|
176
|
+
(0, node_test_1.it)('an expiration set after deserializing', async () => {
|
|
177
|
+
const now = Date.now();
|
|
178
|
+
const expiration = now + resources_1.EXPIRATION;
|
|
179
|
+
const txBuilder = initTxBuilder();
|
|
180
|
+
const tx = await txBuilder.build();
|
|
181
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
182
|
+
assert_1.default.throws(() => {
|
|
183
|
+
txBuilder2.expiration(expiration);
|
|
184
|
+
}, (e) => e.message === 'Expiration is already set, it can only be extended');
|
|
185
|
+
});
|
|
186
|
+
(0, node_test_1.it)('an extension without a set expiration', async () => {
|
|
187
|
+
const txBuilder = initTxBuilder();
|
|
188
|
+
assert_1.default.throws(() => {
|
|
189
|
+
txBuilder.extendValidTo(20000);
|
|
190
|
+
}, (e) => e.message === 'There is not expiration to extend');
|
|
191
|
+
});
|
|
192
|
+
(0, node_test_1.it)('a zero millisecond extension', async () => {
|
|
193
|
+
const txBuilder = initTxBuilder();
|
|
194
|
+
const expiration = Date.now() + resources_1.EXPIRATION;
|
|
195
|
+
txBuilder.expiration(expiration);
|
|
196
|
+
const tx = await txBuilder.build();
|
|
197
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
198
|
+
assert_1.default.throws(() => {
|
|
199
|
+
txBuilder2.extendValidTo(0);
|
|
200
|
+
}, (e) => e.message === 'Value cannot be below zero');
|
|
201
|
+
});
|
|
202
|
+
(0, node_test_1.it)('an extension greater than one year', async () => {
|
|
203
|
+
const txBuilder = initTxBuilder();
|
|
204
|
+
const expiration = Date.now() + resources_1.EXPIRATION;
|
|
205
|
+
txBuilder.expiration(expiration);
|
|
206
|
+
const tx = await txBuilder.build();
|
|
207
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
208
|
+
assert_1.default.throws(() => {
|
|
209
|
+
txBuilder2.extendValidTo(31536000001);
|
|
210
|
+
}, (e) => e.message === 'The expiration cannot be extended more than one day');
|
|
211
|
+
});
|
|
212
|
+
(0, node_test_1.it)('an extension after signing', async () => {
|
|
213
|
+
const txBuilder = initTxBuilder();
|
|
214
|
+
txBuilder.sign({ key: resources_1.PARTICIPANTS.custodian.pk });
|
|
215
|
+
const tx = await txBuilder.build();
|
|
216
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
217
|
+
assert_1.default.throws(() => {
|
|
218
|
+
txBuilder2.extendValidTo(20000);
|
|
219
|
+
}, (e) => e.message === 'Cannot extend a signed transaction');
|
|
220
|
+
});
|
|
221
|
+
(0, node_test_1.it)('transaction mandatory fields', async () => {
|
|
222
|
+
const txBuilder = (0, builder_1.getBuilder)('ttrx').getAccountCreateTxBuilder();
|
|
223
|
+
await assert_1.default.rejects(txBuilder.build(), {
|
|
224
|
+
message: 'Missing parameter: source',
|
|
225
|
+
});
|
|
226
|
+
txBuilder.source({ address: resources_1.PARTICIPANTS.custodian.address });
|
|
227
|
+
await assert_1.default.rejects(txBuilder.build(), {
|
|
228
|
+
message: 'Missing parameter: account address',
|
|
229
|
+
});
|
|
230
|
+
txBuilder.setAccountAddress({ address: resources_1.PARTICIPANTS.to.address });
|
|
231
|
+
await assert_1.default.rejects(txBuilder.build(), {
|
|
232
|
+
message: 'Missing block reference information',
|
|
233
|
+
});
|
|
234
|
+
txBuilder.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH });
|
|
235
|
+
assert_1.default.doesNotReject(() => {
|
|
236
|
+
return txBuilder.build();
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
(0, node_test_1.it)('rejects an invalid account address', async () => {
|
|
240
|
+
const txBuilder = (0, builder_1.getBuilder)('ttrx').getAccountCreateTxBuilder();
|
|
241
|
+
assert_1.default.throws(() => {
|
|
242
|
+
txBuilder.setAccountAddress({ address: '4173a5993cd182ae152adad8203163f780c65a8aa5' });
|
|
243
|
+
}, (e) => e.message.includes('is not a valid base58 address'));
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudENyZWF0ZVR4QnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvYWNjb3VudENyZWF0ZVR4QnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1QixtREFBdUQ7QUFDdkQseUNBQXlDO0FBQ3pDLCtDQUE4RztBQUM5RyxzREFBc0Q7QUFHdEQsSUFBQSxvQkFBUSxFQUFDLDRCQUE0QixFQUFFO0lBQ3JDLE1BQU0sYUFBYSxHQUFHLEdBQUcsRUFBRTtRQUN6QixNQUFNLE9BQU8sR0FBSSxJQUFBLG9CQUFVLEVBQUMsTUFBTSxDQUFvQixDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDbkYsT0FBTzthQUNKLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSx3QkFBWSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUNuRCxpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSx3QkFBWSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUN2RCxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsd0JBQVksRUFBRSxJQUFJLEVBQUUsc0JBQVUsRUFBRSxDQUFDLENBQUM7UUFFckQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQyxDQUFDO0lBRUYsSUFBQSxvQkFBUSxFQUFDLDJCQUEyQixFQUFFLEdBQUcsRUFBRTtRQUN6QyxJQUFBLGNBQUUsRUFBQyxtQ0FBbUMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDN0IsTUFBTSxTQUFTLEdBQUcsYUFBYSxFQUFFLENBQUM7WUFDbEMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMvQixTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQztZQUN4QyxN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cnQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgZGVzY3JpYmUsIGl0IH0gZnJvbSAnbm9kZTp0ZXN0JztcbmltcG9ydCB7IFBBUlRJQ0lQQU5UUywgQkxPQ0tfSEFTSCwgQkxPQ0tfTlVNQkVSLCBFWFBJUkFUSU9OLCBBQ0NPVU5UX0NSRUFURV9DT05UUkFDVCB9IGZyb20gJy4uLy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBnZXRCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9idWlsZGVyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uLCBXcmFwcGVkQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5cbmRlc2NyaWJlKCdUcm9uIEFjY291bnRDcmVhdGUgYnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgaW5pdFR4QnVpbGRlciA9ICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gKGdldEJ1aWxkZXIoJ3R0cngnKSBhcyBXcmFwcGVkQnVpbGRlcikuZ2V0QWNjb3VudENyZWF0ZVR4QnVpbGRlcigpO1xuICAgIGJ1aWxkZXJcbiAgICAgIC5zb3VyY2UoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMuY3VzdG9kaWFuLmFkZHJlc3MgfSlcbiAgICAgIC5zZXRBY2NvdW50QWRkcmVzcyh7IGFkZHJlc3M6IFBBUlRJQ0lQQU5UUy50by5hZGRyZXNzIH0pXG4gICAgICAuYmxvY2soeyBudW1iZXI6IEJMT0NLX05VTUJFUiwgaGFzaDogQkxPQ0tfSEFTSCB9KTtcblxuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgYnVpbGQgc3VjY2Vzc2Z1bGx5JywgKCkgPT4ge1xuICAgIGl0KCdhIHRyYW5zYWN0aW9uIHdpdGggY29ycmVjdCBpbnB1dHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnRpbWVzdGFtcCh0aW1lc3RhbXApO1xuICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb24odGltZXN0YW1wICsgNDAwMDApO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkFjY291bnRDcmVhdGUpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LmlucHV0cy5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LmlucHV0c1swXS5hZGRyZXNzLCBQQVJUSUNJUEFOVFMuY3VzdG9kaWFuLmFkZHJlc3MpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LmlucHV0c1swXS52YWx1ZSwgJzAnKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5vdXRwdXRzWzBdLnZhbHVlLCAnMCcpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCh0eEpzb24ucmF3X2RhdGEuY29udHJhY3QsIEFDQ09VTlRfQ1JFQVRFX0NPTlRSQUNUKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbiB1bnNpZ25lZCB0cmFuc2FjdGlvbiBmcm9tIGEgc3RyaW5nIGFuZCBmcm9tIGEgSlNPTicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudGltZXN0YW1wKHRpbWVzdGFtcCk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbih0aW1lc3RhbXAgKyA0MDAwMCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZ2V0QnVpbGRlcigndHRyeCcpLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICB0eEJ1aWxkZXIyLnNpZ24oeyBrZXk6IFBBUlRJQ0lQQU5UUy5jdXN0b2RpYW4ucGsgfSk7XG4gICAgICBjb25zdCB0eDIgPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjMgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0pzb24oKSk7XG4gICAgICB0eEJ1aWxkZXIzLnNpZ24oeyBrZXk6IFBBUlRJQ0lQQU5UUy5jdXN0b2RpYW4ucGsgfSk7XG4gICAgICBjb25zdCB0eDMgPSBhd2FpdCB0eEJ1aWxkZXIzLmJ1aWxkKCk7XG5cbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwodHgyLCB0eDMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIHVuc2lnbmVkIHRyYW5zYWN0aW9uIHdpdGggZXh0ZW5kZWQgZHVyYXRpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgZXhwaXJhdGlvbiA9IHRpbWVzdGFtcCArIEVYUElSQVRJT047XG4gICAgICBjb25zdCBleHRlbnNpb24gPSA2MDAwMDtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50aW1lc3RhbXAodGltZXN0YW1wKTtcbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKGV4cGlyYXRpb24pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGdldEJ1aWxkZXIoJ3R0cngnKS5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgdHhCdWlsZGVyMi5leHRlbmRWYWxpZFRvKGV4dGVuc2lvbik7XG4gICAgICB0eEJ1aWxkZXIyLnNpZ24oeyBrZXk6IFBBUlRJQ0lQQU5UUy5jdXN0b2RpYW4ucGsgfSk7XG4gICAgICBjb25zdCB0eDIgPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG5cbiAgICAgIGFzc2VydC5lcXVhbCh0eDIuaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgyLmlucHV0c1swXS5hZGRyZXNzLCBQQVJUSUNJUEFOVFMuY3VzdG9kaWFuLmFkZHJlc3MpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4Mi5pbnB1dHNbMF0udmFsdWUsICcwJyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgyLm91dHB1dHNbMF0udmFsdWUsICcwJyk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eDIudG9Kc29uKCk7XG4gICAgICBhc3NlcnQuZXF1YWwodHhKc29uLnJhd19kYXRhLmV4cGlyYXRpb24sIGV4cGlyYXRpb24gKyBleHRlbnNpb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgdHJhbnNhY3Rpb24gc2lnbmVkIG11bHRpcGxlIHRpbWVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50aW1lc3RhbXAodGltZXN0YW1wKTtcbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKHRpbWVzdGFtcCArIEVYUElSQVRJT04pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGxldCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIGxldCByYXdEYXRhID0gdHhKc29uLnJhd19kYXRhO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyYXdEYXRhLmNvbnRyYWN0LCBBQ0NPVU5UX0NSRUFURV9DT05UUkFDVCk7XG4gICAgICBhc3NlcnQuZXF1YWwodHhKc29uLnNpZ25hdHVyZS5sZW5ndGgsIDApO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZ2V0QnVpbGRlcigndHRyeCcpLmZyb20odHgudG9Kc29uKCkpO1xuICAgICAgdHhCdWlsZGVyMi5zaWduKHsga2V5OiBQQVJUSUNJUEFOVFMuY3VzdG9kaWFuLnBrIH0pO1xuICAgICAgY29uc3QgdHgyID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuICAgICAgdHhKc29uID0gdHgyLnRvSnNvbigpO1xuICAgICAgcmF3RGF0YSA9IHR4SnNvbi5yYXdfZGF0YTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmF3RGF0YS5jb250cmFjdCwgQUNDT1VOVF9DUkVBVEVfQ09OVFJBQ1QpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4SnNvbi5zaWduYXR1cmUubGVuZ3RoLCAxKTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyMyA9IGdldEJ1aWxkZXIoJ3R0cngnKS5mcm9tKHR4Mi50b0pzb24oKSk7XG4gICAgICB0eEJ1aWxkZXIzLnNpZ24oeyBrZXk6IFBBUlRJQ0lQQU5UUy5mcm9tLnBrIH0pO1xuICAgICAgY29uc3QgdHgzID0gYXdhaXQgdHhCdWlsZGVyMy5idWlsZCgpO1xuICAgICAgdHhKc29uID0gdHgzLnRvSnNvbigpO1xuICAgICAgcmF3RGF0YSA9IHR4SnNvbi5yYXdfZGF0YTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmF3RGF0YS5jb250cmFjdCwgQUNDT1VOVF9DUkVBVEVfQ09OVFJBQ1QpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4SnNvbi5zaWduYXR1cmUubGVuZ3RoLCAyKTtcbiAgICAgIGFzc2VydC5lcXVhbChyYXdEYXRhLmV4cGlyYXRpb24sIHRpbWVzdGFtcCArIEVYUElSQVRJT04pO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJhd0RhdGEudGltZXN0YW1wLCB0aW1lc3RhbXApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ByZXNlcnZlcyBjb25zaXN0ZW50IHRyYW5zYWN0aW9uIElEIGFjcm9zcyByb3VuZC10cmlwcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudGltZXN0YW1wKHRpbWVzdGFtcCk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbih0aW1lc3RhbXAgKyBFWFBJUkFUSU9OKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBvcmlnaW5hbFR4SWQgPSB0eC50b0pzb24oKS50eElEO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZ2V0QnVpbGRlcigndHRyeCcpLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBjb25zdCB0eDIgPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG5cbiAgICAgIGFzc2VydC5lcXVhbCh0eDIudG9Kc29uKCkudHhJRCwgb3JpZ2luYWxUeElkKTtcbiAgICB9KTtcblxuICAgIC8vIFJlZ3Jlc3Npb24gdGVzdDogQWNjb3VudENyZWF0ZUNvbnRyYWN0J3MgZW51bSB2YWx1ZSBpcyAwLCB3aGljaCBpcyB0aGVcbiAgICAvLyBwcm90bzMgZGVmYXVsdCBmb3IgdGhlIG91dGVyIFRyYW5zYWN0aW9uLkNvbnRyYWN0LnR5cGUgZmllbGQuIFdoZW4gdGhlXG4gICAgLy8gU0RLIGV4cGxpY2l0bHkgZW5jb2RlZCBgdHlwZTogMGAsIHRoZSB3aXJlIGZvcm1hdCBpbmNsdWRlZCB0aGUgMi1ieXRlXG4gICAgLy8gdGFnIGAwODAwYCBpbnNpZGUgdGhlIGNvbnRyYWN0IGVudmVsb3BlLiBUUk9OJ3Mgbm9kZSByZS1zZXJpYWxpemVzXG4gICAgLy8gcmF3X2RhdGEgZnJvbSBicm9hZGNhc3QgSlNPTiBhbmQgb21pdHMgZGVmYXVsdC12YWx1ZWQgZmllbGRzLCBwcm9kdWNpbmdcbiAgICAvLyBhIDItYnl0ZS1zaG9ydGVyIGNhbm9uaWNhbCByYXdfZGF0YV9oZXggYW5kIGEgZGlmZmVyZW50IHR4SUQuIFRoZSBUU1NcbiAgICAvLyBzaWduYXR1cmUgd2FzIHZhbGlkIGZvciB0aGUgU0RLJ3MgaGFzaCBidXQgcmVjb3ZlcmVkIHRvIGEgZ2FyYmFnZVxuICAgIC8vIHB1YmtleSB1bmRlciBUUk9OJ3MgY2Fub25pY2FsIGhhc2gsIHNvIEFjY291bnRDcmVhdGUgYnJvYWRjYXN0cyBmYWlsZWRcbiAgICAvLyB3aXRoIFNJR0VSUk9SIFwic2lnbmVkIGJ5IDxyYW5kb20gVC4uLj4gYnV0IG5vdCBjb250YWluZWQgb2YgcGVybWlzc2lvblwiLlxuICAgIGl0KCdwcm9kdWNlcyByYXdfZGF0YV9oZXggd2l0aG91dCB0aGUgcHJvdG8zIGRlZmF1bHQtdmFsdWVkIHR5cGUgZmllbGQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSAxNzc5NDU1MDIwNjUzO1xuICAgICAgY29uc3QgZXhwaXJhdGlvbiA9IDE3Nzk0NjU4MjA2NTM7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudGltZXN0YW1wKHRpbWVzdGFtcCk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbihleHBpcmF0aW9uKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdEYXRhSGV4ID0gdHgudG9Kc29uKCkucmF3X2RhdGFfaGV4O1xuXG4gICAgICAvLyBUaGUgYnVnZ3kgZW5jb2RpbmcgaGFkIGA1YTY4IDA4MDAgMTI2NGAgKGNvbnRyYWN0IHRhZywgbGVuZ3RoIDB4NjgsXG4gICAgICAvLyB0eXBlPTAsIHBhcmFtZXRlciB0YWcsIGxlbmd0aCAweDY0KS4gVGhlIGNhbm9uaWNhbCBlbmNvZGluZyBUUk9OXG4gICAgICAvLyByZS1zZXJpYWxpemVzIHRvIGRyb3BzIHRoZSBgMDgwMGAgYW5kIGRlY3JlbWVudHMgdGhlIGNvbnRyYWN0IGxlbmd0aFxuICAgICAgLy8gYnkgMiAtPiBgNWE2NiAxMjY0YC5cbiAgICAgIGFzc2VydC5vayhcbiAgICAgICAgIXJhd0RhdGFIZXguaW5jbHVkZXMoJzVhNjgwODAwMTInKSxcbiAgICAgICAgYHJhd19kYXRhX2hleCBtdXN0IG5vdCBpbmNsdWRlIHRoZSBwcm90bzMtZGVmYXVsdCBcXGB0eXBlOiAwXFxgIHRhZyAoMDgwMCkuIEdvdDogJHtyYXdEYXRhSGV4fWBcbiAgICAgICk7XG4gICAgICBhc3NlcnQub2soXG4gICAgICAgIHJhd0RhdGFIZXguaW5jbHVkZXMoJzVhNjYxMjY0JyksXG4gICAgICAgIGByYXdfZGF0YV9oZXggbXVzdCB1c2UgdGhlIGNhbm9uaWNhbCBjb250cmFjdCBmcmFtaW5nICg1YTY2Li4uMTI2NCkuIEdvdDogJHtyYXdEYXRhSGV4fWBcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgdmFsaWRhdGUnLCAoKSA9PiB7XG4gICAgaXQoJ2EgdmFsaWQgZXhwaXJhdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBleHBpcmF0aW9uID0gbm93ICsgRVhQSVJBVElPTjtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50aW1lc3RhbXAobm93KTtcbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKGV4cGlyYXRpb24gKyAxMDAwKTtcbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKGV4cGlyYXRpb24pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4SnNvbi5yYXdfZGF0YS5leHBpcmF0aW9uLCBleHBpcmF0aW9uKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbiBleHBpcmF0aW9uIGdyZWF0ZXIgdGhhbiBvbmUgeWVhcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudGltZXN0YW1wKG5vdyk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb24obm93ICsgMzE1MzYwMDAwMDEpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdFeHBpcmF0aW9uIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBvbmUgZGF5J1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbiBleHBpcmF0aW9uIGxlc3MgdGhhbiB0aGUgY3VycmVudCBkYXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50aW1lc3RhbXAobm93IC0gMjAwMCk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb24obm93IC0gMTAwMCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ0V4cGlyYXRpb24gbXVzdCBiZSBncmVhdGVyIHRoYW4gY3VycmVudCB0aW1lJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbiBleHBpcmF0aW9uIGxlc3MgdGhhbiB0aGUgdGltZXN0YW1wJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50aW1lc3RhbXAobm93ICsgMjAwMCk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb24obm93ICsgMTAwMCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ0V4cGlyYXRpb24gbXVzdCBiZSBncmVhdGVyIHRoYW4gdGltZXN0YW1wJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbiBleHBpcmF0aW9uIHNldCBhZnRlciBidWlsZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBleHBpcmF0aW9uID0gbm93ICsgRVhQSVJBVElPTjtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKGV4cGlyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdFeHBpcmF0aW9uIGlzIGFscmVhZHkgc2V0LCBpdCBjYW4gb25seSBiZSBleHRlbmRlZCdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gZXhwaXJhdGlvbiBzZXQgYWZ0ZXIgZGVzZXJpYWxpemluZycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBleHBpcmF0aW9uID0gbm93ICsgRVhQSVJBVElPTjtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZ2V0QnVpbGRlcigndHRyeCcpLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyMi5leHBpcmF0aW9uKGV4cGlyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdFeHBpcmF0aW9uIGlzIGFscmVhZHkgc2V0LCBpdCBjYW4gb25seSBiZSBleHRlbmRlZCdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gZXh0ZW5zaW9uIHdpdGhvdXQgYSBzZXQgZXhwaXJhdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuZXh0ZW5kVmFsaWRUbygyMDAwMCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ1RoZXJlIGlzIG5vdCBleHBpcmF0aW9uIHRvIGV4dGVuZCdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSB6ZXJvIG1pbGxpc2Vjb25kIGV4dGVuc2lvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IGV4cGlyYXRpb24gPSBEYXRlLm5vdygpICsgRVhQSVJBVElPTjtcbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKGV4cGlyYXRpb24pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGdldEJ1aWxkZXIoJ3R0cngnKS5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlcjIuZXh0ZW5kVmFsaWRUbygwKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnVmFsdWUgY2Fubm90IGJlIGJlbG93IHplcm8nXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIGV4dGVuc2lvbiBncmVhdGVyIHRoYW4gb25lIHllYXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICBjb25zdCBleHBpcmF0aW9uID0gRGF0ZS5ub3coKSArIEVYUElSQVRJT047XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbihleHBpcmF0aW9uKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIyLmV4dGVuZFZhbGlkVG8oMzE1MzYwMDAwMDEpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdUaGUgZXhwaXJhdGlvbiBjYW5ub3QgYmUgZXh0ZW5kZWQgbW9yZSB0aGFuIG9uZSBkYXknXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIGV4dGVuc2lvbiBhZnRlciBzaWduaW5nJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IFBBUlRJQ0lQQU5UUy5jdXN0b2RpYW4ucGsgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZ2V0QnVpbGRlcigndHRyeCcpLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyMi5leHRlbmRWYWxpZFRvKDIwMDAwKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnQ2Fubm90IGV4dGVuZCBhIHNpZ25lZCB0cmFuc2FjdGlvbidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgndHJhbnNhY3Rpb24gbWFuZGF0b3J5IGZpZWxkcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IChnZXRCdWlsZGVyKCd0dHJ4JykgYXMgV3JhcHBlZEJ1aWxkZXIpLmdldEFjY291bnRDcmVhdGVUeEJ1aWxkZXIoKTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHModHhCdWlsZGVyLmJ1aWxkKCksIHtcbiAgICAgICAgbWVzc2FnZTogJ01pc3NpbmcgcGFyYW1ldGVyOiBzb3VyY2UnLFxuICAgICAgfSk7XG5cbiAgICAgIHR4QnVpbGRlci5zb3VyY2UoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMuY3VzdG9kaWFuLmFkZHJlc3MgfSk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyh0eEJ1aWxkZXIuYnVpbGQoKSwge1xuICAgICAgICBtZXNzYWdlOiAnTWlzc2luZyBwYXJhbWV0ZXI6IGFjY291bnQgYWRkcmVzcycsXG4gICAgICB9KTtcblxuICAgICAgdHhCdWlsZGVyLnNldEFjY291bnRBZGRyZXNzKHsgYWRkcmVzczogUEFSVElDSVBBTlRTLnRvLmFkZHJlc3MgfSk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyh0eEJ1aWxkZXIuYnVpbGQoKSwge1xuICAgICAgICBtZXNzYWdlOiAnTWlzc2luZyBibG9jayByZWZlcmVuY2UgaW5mb3JtYXRpb24nLFxuICAgICAgfSk7XG5cbiAgICAgIHR4QnVpbGRlci5ibG9jayh7IG51bWJlcjogQkxPQ0tfTlVNQkVSLCBoYXNoOiBCTE9DS19IQVNIIH0pO1xuICAgICAgYXNzZXJ0LmRvZXNOb3RSZWplY3QoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGFuIGludmFsaWQgYWNjb3VudCBhZGRyZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gKGdldEJ1aWxkZXIoJ3R0cngnKSBhcyBXcmFwcGVkQnVpbGRlcikuZ2V0QWNjb3VudENyZWF0ZVR4QnVpbGRlcigpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5zZXRBY2NvdW50QWRkcmVzcyh7IGFkZHJlc3M6ICc0MTczYTU5OTNjZDE4MmFlMTUyYWRhZDgyMDMxNjNmNzgwYzY1YThhYTUnIH0pO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ2lzIG5vdCBhIHZhbGlkIGJhc2U1OCBhZGRyZXNzJylcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|