@bitgo-beta/sdk-coin-polyx 1.0.0-alpha.21 → 1.0.0-alpha.211
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/lib/baseBuilder.d.ts +24 -0
- package/dist/src/lib/baseBuilder.d.ts.map +1 -0
- package/dist/src/lib/baseBuilder.js +31 -0
- package/dist/src/lib/batchStakingBuilder.d.ts +79 -0
- package/dist/src/lib/batchStakingBuilder.d.ts.map +1 -0
- package/dist/src/lib/batchStakingBuilder.js +302 -0
- package/dist/src/lib/batchUnstakingBuilder.d.ts +39 -0
- package/dist/src/lib/batchUnstakingBuilder.d.ts.map +1 -0
- package/dist/src/lib/batchUnstakingBuilder.js +129 -0
- package/dist/src/lib/bondExtraBuilder.d.ts +37 -0
- package/dist/src/lib/bondExtraBuilder.d.ts.map +1 -0
- package/dist/src/lib/bondExtraBuilder.js +103 -0
- package/dist/src/lib/constants.d.ts +21 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +24 -0
- package/dist/src/lib/hexTokenTransferBuilder.d.ts +24 -0
- package/dist/src/lib/hexTokenTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/hexTokenTransferBuilder.js +46 -0
- package/dist/src/lib/hexTransferBuilder.d.ts +28 -0
- package/dist/src/lib/hexTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/hexTransferBuilder.js +51 -0
- package/dist/src/lib/iface.d.ts +249 -0
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +48 -1
- package/dist/src/lib/index.d.ts +36 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +82 -5
- package/dist/src/lib/nominateBuilder.d.ts +18 -0
- package/dist/src/lib/nominateBuilder.d.ts.map +1 -0
- package/dist/src/lib/nominateBuilder.js +101 -0
- package/dist/src/lib/preApproveAssetBuilder.d.ts +33 -0
- package/dist/src/lib/preApproveAssetBuilder.d.ts.map +1 -0
- package/dist/src/lib/preApproveAssetBuilder.js +77 -0
- package/dist/src/lib/registerDidWithCDDBuilder.d.ts +7 -2
- package/dist/src/lib/registerDidWithCDDBuilder.d.ts.map +1 -1
- package/dist/src/lib/registerDidWithCDDBuilder.js +22 -3
- package/dist/src/lib/rejectInstructionBuilder.d.ts +29 -0
- package/dist/src/lib/rejectInstructionBuilder.d.ts.map +1 -0
- package/dist/src/lib/rejectInstructionBuilder.js +89 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts +64 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/tokenTransferBuilder.js +167 -0
- package/dist/src/lib/transaction.d.ts +30 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +211 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +59 -1
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +288 -8
- package/dist/src/lib/transferBuilder.d.ts +4 -2
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +12 -5
- package/dist/src/lib/txnSchema.d.ts +67 -0
- package/dist/src/lib/txnSchema.d.ts.map +1 -1
- package/dist/src/lib/txnSchema.js +231 -2
- package/dist/src/lib/unbondBuilder.d.ts +37 -0
- package/dist/src/lib/unbondBuilder.d.ts.map +1 -0
- package/dist/src/lib/unbondBuilder.js +100 -0
- package/dist/src/lib/utils.d.ts +40 -0
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +94 -1
- package/dist/src/lib/v8BatchStakingBuilder.d.ts +85 -0
- package/dist/src/lib/v8BatchStakingBuilder.d.ts.map +1 -0
- package/dist/src/lib/v8BatchStakingBuilder.js +266 -0
- package/dist/src/lib/v8BatchUnstakingBuilder.d.ts +11 -0
- package/dist/src/lib/v8BatchUnstakingBuilder.d.ts.map +1 -0
- package/dist/src/lib/v8BatchUnstakingBuilder.js +21 -0
- package/dist/src/lib/v8BondExtraBuilder.d.ts +11 -0
- package/dist/src/lib/v8BondExtraBuilder.d.ts.map +1 -0
- package/dist/src/lib/v8BondExtraBuilder.js +21 -0
- package/dist/src/lib/v8HexTokenTransferBuilder.d.ts +20 -0
- package/dist/src/lib/v8HexTokenTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/v8HexTokenTransferBuilder.js +42 -0
- package/dist/src/lib/v8HexTransferBuilder.d.ts +11 -0
- package/dist/src/lib/v8HexTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/v8HexTransferBuilder.js +21 -0
- package/dist/src/lib/v8NominateBuilder.d.ts +11 -0
- package/dist/src/lib/v8NominateBuilder.d.ts.map +1 -0
- package/dist/src/lib/v8NominateBuilder.js +21 -0
- package/dist/src/lib/v8PreApproveAssetBuilder.d.ts +11 -0
- package/dist/src/lib/v8PreApproveAssetBuilder.d.ts.map +1 -0
- package/dist/src/lib/v8PreApproveAssetBuilder.js +21 -0
- package/dist/src/lib/v8RegisterDidBuilder.d.ts +47 -0
- package/dist/src/lib/v8RegisterDidBuilder.d.ts.map +1 -0
- package/dist/src/lib/v8RegisterDidBuilder.js +96 -0
- package/dist/src/lib/v8RegisterDidWithCDDBuilder.d.ts +11 -0
- package/dist/src/lib/v8RegisterDidWithCDDBuilder.d.ts.map +1 -0
- package/dist/src/lib/v8RegisterDidWithCDDBuilder.js +21 -0
- package/dist/src/lib/v8TokenTransferBuilder.d.ts +24 -0
- package/dist/src/lib/v8TokenTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/v8TokenTransferBuilder.js +101 -0
- package/dist/src/lib/v8TransferBuilder.d.ts +11 -0
- package/dist/src/lib/v8TransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/v8TransferBuilder.js +21 -0
- package/dist/src/lib/v8UnbondBuilder.d.ts +11 -0
- package/dist/src/lib/v8UnbondBuilder.d.ts.map +1 -0
- package/dist/src/lib/v8UnbondBuilder.js +21 -0
- package/dist/src/lib/v8WithdrawUnbondedBuilder.d.ts +11 -0
- package/dist/src/lib/v8WithdrawUnbondedBuilder.d.ts.map +1 -0
- package/dist/src/lib/v8WithdrawUnbondedBuilder.js +21 -0
- package/dist/src/lib/withdrawUnbondedBuilder.d.ts +35 -0
- package/dist/src/lib/withdrawUnbondedBuilder.d.ts.map +1 -0
- package/dist/src/lib/withdrawUnbondedBuilder.js +91 -0
- package/dist/src/polyx.d.ts +51 -9
- package/dist/src/polyx.d.ts.map +1 -1
- package/dist/src/polyx.js +272 -15
- package/dist/src/polyxToken.d.ts +20 -0
- package/dist/src/polyxToken.d.ts.map +1 -0
- package/dist/src/polyxToken.js +55 -0
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +5 -1
- package/dist/src/resources/index.d.ts +2 -0
- package/dist/src/resources/index.d.ts.map +1 -1
- package/dist/src/resources/index.js +3 -1
- package/dist/src/resources/mainnetV8.d.ts +13 -0
- package/dist/src/resources/mainnetV8.d.ts.map +1 -0
- package/dist/src/resources/mainnetV8.js +24 -0
- package/dist/src/resources/testnetV8.d.ts +13 -0
- package/dist/src/resources/testnetV8.d.ts.map +1 -0
- package/dist/src/resources/testnetV8.js +16 -0
- package/dist/src/tpolyx.d.ts +7 -0
- package/dist/src/tpolyx.d.ts.map +1 -1
- package/dist/src/tpolyx.js +11 -1
- package/dist/test/integration/index.d.ts +1 -0
- package/dist/test/integration/index.d.ts.map +1 -0
- package/dist/test/integration/index.js +1 -0
- package/dist/test/resources/index.d.ts +139 -0
- package/dist/test/resources/index.d.ts.map +1 -0
- package/dist/test/resources/index.js +150 -0
- package/dist/test/resources/mainnet.d.ts +2 -0
- package/dist/test/resources/mainnet.d.ts.map +1 -0
- package/dist/test/resources/mainnet.js +5 -0
- package/dist/test/resources/materialData.json +8 -0
- package/dist/test/resources/materialDataModified.json +8 -0
- package/dist/test/resources/testnet.d.ts +2 -0
- package/dist/test/resources/testnet.d.ts.map +1 -0
- package/dist/test/resources/testnet.js +5 -0
- package/dist/test/resources/wrwUsers.d.ts +19 -0
- package/dist/test/resources/wrwUsers.d.ts.map +1 -0
- package/dist/test/resources/wrwUsers.js +60 -0
- package/dist/test/unit/polyx.d.ts +2 -0
- package/dist/test/unit/polyx.d.ts.map +1 -0
- package/dist/test/unit/polyx.js +356 -0
- package/dist/test/unit/transactionBuilder/base.d.ts +4 -0
- package/dist/test/unit/transactionBuilder/base.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/base.js +245 -0
- package/dist/test/unit/transactionBuilder/batchStakingBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/batchStakingBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/batchStakingBuilder.js +309 -0
- package/dist/test/unit/transactionBuilder/batchUnstakingBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/batchUnstakingBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/batchUnstakingBuilder.js +159 -0
- package/dist/test/unit/transactionBuilder/bondExtraBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/bondExtraBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/bondExtraBuilder.js +158 -0
- package/dist/test/unit/transactionBuilder/hexTokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/hexTokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/hexTokenTransferBuilder.js +261 -0
- package/dist/test/unit/transactionBuilder/hexTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/hexTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/hexTransferBuilder.js +389 -0
- package/dist/test/unit/transactionBuilder/nominateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/nominateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/nominateBuilder.js +226 -0
- package/dist/test/unit/transactionBuilder/preApproveAssetBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/preApproveAssetBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/preApproveAssetBuilder.js +115 -0
- package/dist/test/unit/transactionBuilder/registerDidWithCDDBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/registerDidWithCDDBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/registerDidWithCDDBuilder.js +302 -0
- package/dist/test/unit/transactionBuilder/rejectInstructionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/rejectInstructionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/rejectInstructionBuilder.js +128 -0
- package/dist/test/unit/transactionBuilder/singletonRegistry.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/singletonRegistry.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/singletonRegistry.js +59 -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 +140 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +240 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +326 -0
- package/dist/test/unit/transactionBuilder/unbondBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/unbondBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/unbondBuilder.js +144 -0
- package/dist/test/unit/transactionBuilder/v8BatchStakingBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/v8BatchStakingBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/v8BatchStakingBuilder.js +252 -0
- package/dist/test/unit/transactionBuilder/v8HexTokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/v8HexTokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/v8HexTokenTransferBuilder.js +90 -0
- package/dist/test/unit/transactionBuilder/v8HexTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/v8HexTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/v8HexTransferBuilder.js +62 -0
- package/dist/test/unit/transactionBuilder/v8PreApproveAssetBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/v8PreApproveAssetBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/v8PreApproveAssetBuilder.js +45 -0
- package/dist/test/unit/transactionBuilder/v8RegisterDidBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/v8RegisterDidBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/v8RegisterDidBuilder.js +87 -0
- package/dist/test/unit/transactionBuilder/v8RegisterDidWithCDDBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/v8RegisterDidWithCDDBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/v8RegisterDidWithCDDBuilder.js +45 -0
- package/dist/test/unit/transactionBuilder/v8TokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/v8TokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/v8TokenTransferBuilder.js +114 -0
- package/dist/test/unit/transactionBuilder/v8TransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/v8TransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/v8TransferBuilder.js +107 -0
- package/dist/test/unit/transactionBuilder/withdrawUnbondedBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/withdrawUnbondedBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/withdrawUnbondedBuilder.js +138 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +143 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +15 -9
- package/.eslintignore +0 -4
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -22
|
@@ -0,0 +1,389 @@
|
|
|
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 should_1 = __importDefault(require("should"));
|
|
7
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
8
|
+
const lib_1 = require("../../../src/lib");
|
|
9
|
+
const src_1 = require("../../../src");
|
|
10
|
+
const resources_1 = require("../../resources");
|
|
11
|
+
const base_1 = require("./base");
|
|
12
|
+
// Expected NEW-encoding hex values from problem.md example table
|
|
13
|
+
const NEW_MEMO_HEX = {
|
|
14
|
+
0: '0x3000000000000000000000000000000000000000000000000000000000000000',
|
|
15
|
+
1: '0x3100000000000000000000000000000000000000000000000000000000000000',
|
|
16
|
+
2: '0x3200000000000000000000000000000000000000000000000000000000000000',
|
|
17
|
+
56594: '0x3536353934000000000000000000000000000000000000000000000000000000',
|
|
18
|
+
102329716: '0x3130323332393731360000000000000000000000000000000000000000000000',
|
|
19
|
+
testmemo: '0x746573746d656d6f000000000000000000000000000000000000000000000000',
|
|
20
|
+
abc: '0x6162630000000000000000000000000000000000000000000000000000000000',
|
|
21
|
+
};
|
|
22
|
+
describe('HexTransferBuilder — memo encoding', () => {
|
|
23
|
+
let builder;
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
const config = (0, base_1.buildTestConfig)();
|
|
26
|
+
builder = new lib_1.HexTransferBuilder(config).material(src_1.utils.getMaterial(config.network.type));
|
|
27
|
+
});
|
|
28
|
+
describe('memo() produces NEW encoding', () => {
|
|
29
|
+
it('encodes "0"', () => {
|
|
30
|
+
builder.memo('0');
|
|
31
|
+
should_1.default.equal(builder._memo, NEW_MEMO_HEX['0']);
|
|
32
|
+
});
|
|
33
|
+
it('encodes "1"', () => {
|
|
34
|
+
builder.memo('1');
|
|
35
|
+
should_1.default.equal(builder._memo, NEW_MEMO_HEX['1']);
|
|
36
|
+
});
|
|
37
|
+
it('encodes "2"', () => {
|
|
38
|
+
builder.memo('2');
|
|
39
|
+
should_1.default.equal(builder._memo, NEW_MEMO_HEX['2']);
|
|
40
|
+
});
|
|
41
|
+
it('encodes "56594"', () => {
|
|
42
|
+
builder.memo('56594');
|
|
43
|
+
should_1.default.equal(builder._memo, NEW_MEMO_HEX['56594']);
|
|
44
|
+
});
|
|
45
|
+
it('encodes "102329716"', () => {
|
|
46
|
+
builder.memo('102329716');
|
|
47
|
+
should_1.default.equal(builder._memo, NEW_MEMO_HEX['102329716']);
|
|
48
|
+
});
|
|
49
|
+
it('encodes "testmemo"', () => {
|
|
50
|
+
builder.memo('testmemo');
|
|
51
|
+
should_1.default.equal(builder._memo, NEW_MEMO_HEX['testmemo']);
|
|
52
|
+
});
|
|
53
|
+
it('encodes "abc"', () => {
|
|
54
|
+
builder.memo('abc');
|
|
55
|
+
should_1.default.equal(builder._memo, NEW_MEMO_HEX['abc']);
|
|
56
|
+
});
|
|
57
|
+
it('stores an already-encoded 0x hex memo as-is (round-trip)', () => {
|
|
58
|
+
const alreadyEncoded = NEW_MEMO_HEX['56594'];
|
|
59
|
+
builder.memo(alreadyEncoded);
|
|
60
|
+
should_1.default.equal(builder._memo, alreadyEncoded);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe('NEW encoding differs from OLD encoding', () => {
|
|
64
|
+
it('produces different bytes than TransferBuilder for "56594"', () => {
|
|
65
|
+
const { TransferBuilder } = require('../../../src/lib');
|
|
66
|
+
const config = (0, base_1.buildTestConfig)();
|
|
67
|
+
const oldBuilder = new TransferBuilder(config).material(src_1.utils.getMaterial(config.network.type));
|
|
68
|
+
const newBuilder = new lib_1.HexTransferBuilder(config).material(src_1.utils.getMaterial(config.network.type));
|
|
69
|
+
oldBuilder.memo('56594');
|
|
70
|
+
newBuilder.memo('56594');
|
|
71
|
+
const oldMemo = oldBuilder._memo;
|
|
72
|
+
const newMemo = newBuilder._memo;
|
|
73
|
+
should_1.default.notEqual(oldMemo, newMemo);
|
|
74
|
+
// OLD: left-pad with ASCII '0' chars
|
|
75
|
+
should_1.default.ok(oldMemo.startsWith('000000'), `OLD memo should start with ASCII '0' padding, got: ${oldMemo}`);
|
|
76
|
+
// NEW: 0x-prefixed hex
|
|
77
|
+
should_1.default.ok(newMemo.startsWith('0x'), `NEW memo should start with 0x, got: ${newMemo}`);
|
|
78
|
+
should_1.default.equal(newMemo, NEW_MEMO_HEX['56594']);
|
|
79
|
+
});
|
|
80
|
+
it('produces different bytes than TransferBuilder for "0"', () => {
|
|
81
|
+
const { TransferBuilder } = require('../../../src/lib');
|
|
82
|
+
const config = (0, base_1.buildTestConfig)();
|
|
83
|
+
const oldBuilder = new TransferBuilder(config).material(src_1.utils.getMaterial(config.network.type));
|
|
84
|
+
const newBuilder = new lib_1.HexTransferBuilder(config).material(src_1.utils.getMaterial(config.network.type));
|
|
85
|
+
oldBuilder.memo('0');
|
|
86
|
+
newBuilder.memo('0');
|
|
87
|
+
should_1.default.notEqual(oldBuilder._memo, newBuilder._memo);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
describe('build transaction with NEW memo encoding', () => {
|
|
91
|
+
const sender = resources_1.accounts.account1;
|
|
92
|
+
const receiver = resources_1.accounts.account2;
|
|
93
|
+
it('should build a transaction with NEW memo "56594"', async () => {
|
|
94
|
+
builder
|
|
95
|
+
.amount('1000000')
|
|
96
|
+
.to({ address: receiver.address })
|
|
97
|
+
.sender({ address: sender.address })
|
|
98
|
+
.memo('56594')
|
|
99
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
100
|
+
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
|
|
101
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 1 })
|
|
102
|
+
.fee({ amount: 0, type: 'tip' });
|
|
103
|
+
builder.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
104
|
+
const tx = await builder.build();
|
|
105
|
+
const txJson = tx.toJson();
|
|
106
|
+
should_1.default.deepEqual(txJson.amount, '1000000');
|
|
107
|
+
should_1.default.deepEqual(txJson.to, receiver.address);
|
|
108
|
+
should_1.default.deepEqual(txJson.sender, sender.address);
|
|
109
|
+
});
|
|
110
|
+
it('should build a transaction with NEW memo "testmemo"', async () => {
|
|
111
|
+
builder
|
|
112
|
+
.amount('1000000')
|
|
113
|
+
.to({ address: receiver.address })
|
|
114
|
+
.sender({ address: sender.address })
|
|
115
|
+
.memo('testmemo')
|
|
116
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
117
|
+
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
|
|
118
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 1 })
|
|
119
|
+
.fee({ amount: 0, type: 'tip' });
|
|
120
|
+
builder.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
121
|
+
const tx = await builder.build();
|
|
122
|
+
const txJson = tx.toJson();
|
|
123
|
+
should_1.default.deepEqual(txJson.amount, '1000000');
|
|
124
|
+
should_1.default.deepEqual(txJson.to, receiver.address);
|
|
125
|
+
should_1.default.deepEqual(builder._memo, NEW_MEMO_HEX['testmemo']);
|
|
126
|
+
});
|
|
127
|
+
it('should build a transaction with NEW memo "0" (default)', async () => {
|
|
128
|
+
builder
|
|
129
|
+
.amount('1000000')
|
|
130
|
+
.to({ address: receiver.address })
|
|
131
|
+
.sender({ address: sender.address })
|
|
132
|
+
.memo('0')
|
|
133
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
134
|
+
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
|
|
135
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 1 })
|
|
136
|
+
.fee({ amount: 0, type: 'tip' });
|
|
137
|
+
builder.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
138
|
+
const tx = await builder.build();
|
|
139
|
+
should_1.default.ok(tx);
|
|
140
|
+
should_1.default.equal(builder._memo, NEW_MEMO_HEX['0']);
|
|
141
|
+
});
|
|
142
|
+
it('should build a transaction with NEW memo "102329716"', async () => {
|
|
143
|
+
builder
|
|
144
|
+
.amount('1000000')
|
|
145
|
+
.to({ address: receiver.address })
|
|
146
|
+
.sender({ address: sender.address })
|
|
147
|
+
.memo('102329716')
|
|
148
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
149
|
+
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
|
|
150
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 1 })
|
|
151
|
+
.fee({ amount: 0, type: 'tip' });
|
|
152
|
+
builder.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
153
|
+
const tx = await builder.build();
|
|
154
|
+
should_1.default.ok(tx);
|
|
155
|
+
should_1.default.equal(builder._memo, NEW_MEMO_HEX['102329716']);
|
|
156
|
+
});
|
|
157
|
+
it('raw transaction bytes differ between OLD and NEW builder for same memo', async () => {
|
|
158
|
+
const { TransferBuilder } = require('../../../src/lib');
|
|
159
|
+
const config = (0, base_1.buildTestConfig)();
|
|
160
|
+
const material = src_1.utils.getMaterial(config.network.type);
|
|
161
|
+
const commonParams = {
|
|
162
|
+
address: receiver.address,
|
|
163
|
+
amount: '1000000',
|
|
164
|
+
sender: sender.address,
|
|
165
|
+
firstValid: 3933,
|
|
166
|
+
maxDuration: 64,
|
|
167
|
+
referenceBlock: '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d',
|
|
168
|
+
nonce: 1,
|
|
169
|
+
};
|
|
170
|
+
const oldBuilder = new TransferBuilder(config)
|
|
171
|
+
.material(material)
|
|
172
|
+
.amount(commonParams.amount)
|
|
173
|
+
.to({ address: commonParams.address })
|
|
174
|
+
.sender({ address: commonParams.sender })
|
|
175
|
+
.memo('56594')
|
|
176
|
+
.validity({ firstValid: commonParams.firstValid, maxDuration: commonParams.maxDuration })
|
|
177
|
+
.referenceBlock(commonParams.referenceBlock)
|
|
178
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: commonParams.nonce })
|
|
179
|
+
.fee({ amount: 0, type: 'tip' });
|
|
180
|
+
oldBuilder.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
181
|
+
const oldTx = await oldBuilder.build();
|
|
182
|
+
const newBuilder = new lib_1.HexTransferBuilder(config)
|
|
183
|
+
.material(material)
|
|
184
|
+
.amount(commonParams.amount)
|
|
185
|
+
.to({ address: commonParams.address })
|
|
186
|
+
.sender({ address: commonParams.sender })
|
|
187
|
+
.memo('56594')
|
|
188
|
+
.validity({ firstValid: commonParams.firstValid, maxDuration: commonParams.maxDuration })
|
|
189
|
+
.referenceBlock(commonParams.referenceBlock)
|
|
190
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: commonParams.nonce })
|
|
191
|
+
.fee({ amount: 0, type: 'tip' });
|
|
192
|
+
newBuilder.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
193
|
+
const newTx = await newBuilder.build();
|
|
194
|
+
should_1.default.notEqual(oldTx.toBroadcastFormat(), newTx.toBroadcastFormat());
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
describe('HexTransferBuilder — Mainnet', () => {
|
|
199
|
+
let builder;
|
|
200
|
+
const sender = resources_1.accounts.account5Mainnet;
|
|
201
|
+
const receiver = resources_1.accounts.account6Mainnet;
|
|
202
|
+
beforeEach(() => {
|
|
203
|
+
const config = (0, base_1.buildMainnetConfig)();
|
|
204
|
+
builder = new lib_1.HexTransferBuilder(config).material(src_1.utils.getMaterial(config.network.type));
|
|
205
|
+
});
|
|
206
|
+
it('should encode memo "56594" correctly on mainnet', () => {
|
|
207
|
+
builder.memo('56594');
|
|
208
|
+
should_1.default.equal(builder._memo, NEW_MEMO_HEX['56594']);
|
|
209
|
+
});
|
|
210
|
+
it('should build a mainnet transaction with NEW memo', async () => {
|
|
211
|
+
builder
|
|
212
|
+
.amount('1000000')
|
|
213
|
+
.to({ address: receiver.address })
|
|
214
|
+
.sender({ address: sender.address })
|
|
215
|
+
.memo('56594')
|
|
216
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
217
|
+
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
|
|
218
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 1 })
|
|
219
|
+
.fee({ amount: 0, type: 'tip' });
|
|
220
|
+
builder.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
221
|
+
const tx = await builder.build();
|
|
222
|
+
const txJson = tx.toJson();
|
|
223
|
+
should_1.default.deepEqual(txJson.amount, '1000000');
|
|
224
|
+
should_1.default.deepEqual(txJson.to, receiver.address);
|
|
225
|
+
should_1.default.deepEqual(txJson.sender, sender.address);
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
describe('HexTransferBuilder — factory.from() rebuild round-trip', () => {
|
|
229
|
+
const sender = resources_1.accounts.account1;
|
|
230
|
+
const receiver = resources_1.accounts.account2;
|
|
231
|
+
const commonParams = {
|
|
232
|
+
amount: '1000000',
|
|
233
|
+
firstValid: 3933,
|
|
234
|
+
maxDuration: 64,
|
|
235
|
+
referenceBlock: '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d',
|
|
236
|
+
nonce: 1,
|
|
237
|
+
};
|
|
238
|
+
let factory;
|
|
239
|
+
beforeEach(() => {
|
|
240
|
+
factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tpolyx'));
|
|
241
|
+
});
|
|
242
|
+
it('factory.from() returns HexTransferBuilder for a NEW-encoded signed transaction', async () => {
|
|
243
|
+
const builder = new lib_1.HexTransferBuilder((0, base_1.buildTestConfig)())
|
|
244
|
+
.material(src_1.utils.getMaterial((0, base_1.buildTestConfig)().network.type))
|
|
245
|
+
.amount(commonParams.amount)
|
|
246
|
+
.to({ address: receiver.address })
|
|
247
|
+
.sender({ address: sender.address })
|
|
248
|
+
.memo('56594')
|
|
249
|
+
.validity({ firstValid: commonParams.firstValid, maxDuration: commonParams.maxDuration })
|
|
250
|
+
.referenceBlock(commonParams.referenceBlock)
|
|
251
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: commonParams.nonce })
|
|
252
|
+
.fee({ amount: 0, type: 'tip' });
|
|
253
|
+
builder.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
254
|
+
const tx = await builder.build();
|
|
255
|
+
const serialized = tx.toBroadcastFormat();
|
|
256
|
+
const rebuilt = factory.from(serialized);
|
|
257
|
+
rebuilt.should.be.instanceOf(lib_1.HexTransferBuilder);
|
|
258
|
+
});
|
|
259
|
+
it('factory.from() returns TransferBuilder (not HexTransferBuilder) for an OLD-encoded signed transaction', async () => {
|
|
260
|
+
const builder = new lib_1.TransferBuilder((0, base_1.buildTestConfig)())
|
|
261
|
+
.material(src_1.utils.getMaterial((0, base_1.buildTestConfig)().network.type))
|
|
262
|
+
.amount(commonParams.amount)
|
|
263
|
+
.to({ address: receiver.address })
|
|
264
|
+
.sender({ address: sender.address })
|
|
265
|
+
.memo('56594')
|
|
266
|
+
.validity({ firstValid: commonParams.firstValid, maxDuration: commonParams.maxDuration })
|
|
267
|
+
.referenceBlock(commonParams.referenceBlock)
|
|
268
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: commonParams.nonce })
|
|
269
|
+
.fee({ amount: 0, type: 'tip' });
|
|
270
|
+
builder.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
271
|
+
const tx = await builder.build();
|
|
272
|
+
const serialized = tx.toBroadcastFormat();
|
|
273
|
+
const rebuilt = factory.from(serialized);
|
|
274
|
+
rebuilt.should.be.instanceOf(lib_1.TransferBuilder);
|
|
275
|
+
rebuilt.should.not.be.instanceOf(lib_1.HexTransferBuilder);
|
|
276
|
+
});
|
|
277
|
+
it('rebuild from NEW-encoded tx preserves memo bytes (serialized hex is identical)', async () => {
|
|
278
|
+
const build = async (memo) => {
|
|
279
|
+
const b = new lib_1.HexTransferBuilder((0, base_1.buildTestConfig)())
|
|
280
|
+
.material(src_1.utils.getMaterial((0, base_1.buildTestConfig)().network.type))
|
|
281
|
+
.amount(commonParams.amount)
|
|
282
|
+
.to({ address: receiver.address })
|
|
283
|
+
.sender({ address: sender.address })
|
|
284
|
+
.memo(memo)
|
|
285
|
+
.validity({ firstValid: commonParams.firstValid, maxDuration: commonParams.maxDuration })
|
|
286
|
+
.referenceBlock(commonParams.referenceBlock)
|
|
287
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: commonParams.nonce })
|
|
288
|
+
.fee({ amount: 0, type: 'tip' });
|
|
289
|
+
b.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
290
|
+
return (await b.build()).toBroadcastFormat();
|
|
291
|
+
};
|
|
292
|
+
for (const memo of ['56594', 'testmemo', '0', '102329716']) {
|
|
293
|
+
const original = await build(memo);
|
|
294
|
+
// fromImplementation for signed txs doesn't restore blockNumber — must re-supply validity + referenceBlock
|
|
295
|
+
const rebuilt = factory
|
|
296
|
+
.from(original)
|
|
297
|
+
.validity({ firstValid: commonParams.firstValid, maxDuration: commonParams.maxDuration })
|
|
298
|
+
.referenceBlock(commonParams.referenceBlock);
|
|
299
|
+
const roundTripped = (await rebuilt.build()).toBroadcastFormat();
|
|
300
|
+
should_1.default.equal(roundTripped, original, `round-trip failed for memo "${memo}"`);
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
it('rebuild from NEW-encoded tx has correct _memo value', async () => {
|
|
304
|
+
const hexBuilder = new lib_1.HexTransferBuilder((0, base_1.buildTestConfig)())
|
|
305
|
+
.material(src_1.utils.getMaterial((0, base_1.buildTestConfig)().network.type))
|
|
306
|
+
.amount(commonParams.amount)
|
|
307
|
+
.to({ address: receiver.address })
|
|
308
|
+
.sender({ address: sender.address })
|
|
309
|
+
.memo('56594')
|
|
310
|
+
.validity({ firstValid: commonParams.firstValid, maxDuration: commonParams.maxDuration })
|
|
311
|
+
.referenceBlock(commonParams.referenceBlock)
|
|
312
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: commonParams.nonce })
|
|
313
|
+
.fee({ amount: 0, type: 'tip' });
|
|
314
|
+
hexBuilder.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
315
|
+
const serialized = (await hexBuilder.build()).toBroadcastFormat();
|
|
316
|
+
const rebuilt = factory.from(serialized);
|
|
317
|
+
should_1.default.equal(rebuilt._memo, NEW_MEMO_HEX['56594']);
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
describe('utils.isNewMemoEncoding', () => {
|
|
321
|
+
it('detects NEW encoding (has 0x00 bytes)', () => {
|
|
322
|
+
should_1.default.ok(src_1.utils.isNewMemoEncoding(NEW_MEMO_HEX['56594']));
|
|
323
|
+
should_1.default.ok(src_1.utils.isNewMemoEncoding(NEW_MEMO_HEX['testmemo']));
|
|
324
|
+
should_1.default.ok(src_1.utils.isNewMemoEncoding(NEW_MEMO_HEX['abc']));
|
|
325
|
+
should_1.default.ok(src_1.utils.isNewMemoEncoding(NEW_MEMO_HEX['0']));
|
|
326
|
+
});
|
|
327
|
+
it('does not detect OLD encoding as NEW (no 0x00 bytes)', () => {
|
|
328
|
+
// OLD encoding of "0": all 0x30 bytes, no nulls
|
|
329
|
+
const oldMemoZero = '0x3030303030303030303030303030303030303030303030303030303030303030';
|
|
330
|
+
// OLD encoding of "56594": 27 × 0x30 + ASCII "56594"
|
|
331
|
+
const oldMemoRef = '0x3030303030303030303030303030303030303030303030303030303536353934';
|
|
332
|
+
should_1.default.ok(!src_1.utils.isNewMemoEncoding(oldMemoZero));
|
|
333
|
+
should_1.default.ok(!src_1.utils.isNewMemoEncoding(oldMemoRef));
|
|
334
|
+
});
|
|
335
|
+
it('returns false for non-0x strings', () => {
|
|
336
|
+
should_1.default.ok(!src_1.utils.isNewMemoEncoding('00000000000000000000000000056594'));
|
|
337
|
+
should_1.default.ok(!src_1.utils.isNewMemoEncoding(''));
|
|
338
|
+
});
|
|
339
|
+
it('returns false for wrong-length 0x strings', () => {
|
|
340
|
+
should_1.default.ok(!src_1.utils.isNewMemoEncoding('0x1234'));
|
|
341
|
+
});
|
|
342
|
+
it('detects full 32-byte NEW memo with no null padding as NEW', () => {
|
|
343
|
+
const fullMemo = '0x' + '61'.repeat(32);
|
|
344
|
+
should_1.default.ok(src_1.utils.isNewMemoEncoding(fullMemo));
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
describe('utils.encodeMemoNew', () => {
|
|
348
|
+
it('encodes "56594" correctly', () => {
|
|
349
|
+
should_1.default.equal(src_1.utils.encodeMemoNew('56594'), NEW_MEMO_HEX['56594']);
|
|
350
|
+
});
|
|
351
|
+
it('encodes "testmemo" correctly', () => {
|
|
352
|
+
should_1.default.equal(src_1.utils.encodeMemoNew('testmemo'), NEW_MEMO_HEX['testmemo']);
|
|
353
|
+
});
|
|
354
|
+
it('encodes "0" correctly', () => {
|
|
355
|
+
should_1.default.equal(src_1.utils.encodeMemoNew('0'), NEW_MEMO_HEX['0']);
|
|
356
|
+
});
|
|
357
|
+
it('encodes "102329716" correctly', () => {
|
|
358
|
+
should_1.default.equal(src_1.utils.encodeMemoNew('102329716'), NEW_MEMO_HEX['102329716']);
|
|
359
|
+
});
|
|
360
|
+
it('encodes "abc" correctly', () => {
|
|
361
|
+
should_1.default.equal(src_1.utils.encodeMemoNew('abc'), NEW_MEMO_HEX['abc']);
|
|
362
|
+
});
|
|
363
|
+
it('always returns a 0x-prefixed 66-character string', () => {
|
|
364
|
+
['0', '1', '56594', 'testmemo', 'abc', '102329716'].forEach((memo) => {
|
|
365
|
+
const encoded = src_1.utils.encodeMemoNew(memo);
|
|
366
|
+
should_1.default.ok(encoded.startsWith('0x'), `should start with 0x: ${encoded}`);
|
|
367
|
+
should_1.default.equal(encoded.length, 66, `should be 66 chars (0x + 64 hex): ${encoded}`);
|
|
368
|
+
});
|
|
369
|
+
});
|
|
370
|
+
it('throws when memo exceeds 32 UTF-8 bytes', () => {
|
|
371
|
+
const tooLong = 'a'.repeat(33);
|
|
372
|
+
should_1.default.throws(() => src_1.utils.encodeMemoNew(tooLong), /exceeds maximum length of 32 bytes/);
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
describe('HexTransferBuilder — memo validation', () => {
|
|
376
|
+
let builder;
|
|
377
|
+
beforeEach(() => {
|
|
378
|
+
const config = (0, base_1.buildTestConfig)();
|
|
379
|
+
builder = new lib_1.HexTransferBuilder(config).material(src_1.utils.getMaterial(config.network.type));
|
|
380
|
+
});
|
|
381
|
+
it('throws when memo exceeds 32 UTF-8 bytes', () => {
|
|
382
|
+
const tooLong = 'a'.repeat(33);
|
|
383
|
+
should_1.default.throws(() => builder.memo(tooLong), /exceeds maximum length of 32 bytes/);
|
|
384
|
+
});
|
|
385
|
+
it('throws for invalid hex memo', () => {
|
|
386
|
+
should_1.default.throws(() => builder.memo('0x' + 'zz'.repeat(32)), /Invalid memo hex encoding/);
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGV4VHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9oZXhUcmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsaURBQTRDO0FBQzVDLDBDQUFrRztBQUNsRyxzQ0FBcUM7QUFDckMsK0NBQTZEO0FBQzdELGlDQUE2RDtBQUU3RCxpRUFBaUU7QUFDakUsTUFBTSxZQUFZLEdBQTJCO0lBQzNDLENBQUMsRUFBRSxvRUFBb0U7SUFDdkUsQ0FBQyxFQUFFLG9FQUFvRTtJQUN2RSxDQUFDLEVBQUUsb0VBQW9FO0lBQ3ZFLEtBQUssRUFBRSxvRUFBb0U7SUFDM0UsU0FBUyxFQUFFLG9FQUFvRTtJQUMvRSxRQUFRLEVBQUUsb0VBQW9FO0lBQzlFLEdBQUcsRUFBRSxvRUFBb0U7Q0FDMUUsQ0FBQztBQUVGLFFBQVEsQ0FBQyxvQ0FBb0MsRUFBRSxHQUFHLEVBQUU7SUFDbEQsSUFBSSxPQUEyQixDQUFDO0lBRWhDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxNQUFNLE1BQU0sR0FBRyxJQUFBLHNCQUFlLEdBQUUsQ0FBQztRQUNqQyxPQUFPLEdBQUcsSUFBSSx3QkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDNUYsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFO1FBQzVDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO1lBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEIsZ0JBQU0sQ0FBQyxLQUFLLENBQUUsT0FBZSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMs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RSxDQUFDLENBQUMsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO0lBQ3pGLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgSGV4VHJhbnNmZXJCdWlsZGVyLCBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LCBUcmFuc2ZlckJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCB7IHV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCB7IGFjY291bnRzLCBtb2NrVHNzU2lnbmF0dXJlIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzJztcbmltcG9ydCB7IGJ1aWxkVGVzdENvbmZpZywgYnVpbGRNYWlubmV0Q29uZmlnIH0gZnJvbSAnLi9iYXNlJztcblxuLy8gRXhwZWN0ZWQgTkVXLWVuY29kaW5nIGhleCB2YWx1ZXMgZnJvbSBwcm9ibGVtLm1kIGV4YW1wbGUgdGFibGVcbmNvbnN0IE5FV19NRU1PX0hFWDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgMDogJzB4MzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gIDE6ICcweDMxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAyOiAnMHgzMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgNTY1OTQ6ICcweDM1MzYzNTM5MzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAxMDIzMjk3MTY6ICcweDMxMzAzMjMzMzIzOTM3MzEzNjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICB0ZXN0bWVtbzogJzB4NzQ2NTczNzQ2ZDY1NmQ2ZjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gIGFiYzogJzB4NjE2MjYzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG59O1xuXG5kZXNjcmliZSgnSGV4VHJhbnNmZXJCdWlsZGVyIOKAlCBtZW1vIGVuY29kaW5nJywgKCkgPT4ge1xuICBsZXQgYnVpbGRlcjogSGV4VHJhbnNmZXJCdWlsZGVyO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGJ1aWxkVGVzdENvbmZpZygpO1xuICAgIGJ1aWxkZXIgPSBuZXcgSGV4VHJhbnNmZXJCdWlsZGVyKGNvbmZpZykubWF0ZXJpYWwodXRpbHMuZ2V0TWF0ZXJpYWwoY29uZmlnLm5ldHdvcmsudHlwZSkpO1xuICB9KTtcblxuICBkZXNjcmliZSgnbWVtbygpIHByb2R1Y2VzIE5FVyBlbmNvZGluZycsICgpID0+IHtcbiAgICBpdCgnZW5jb2RlcyBcIjBcIicsICgpID0+IHtcbiAgICAgIGJ1aWxkZXIubWVtbygnMCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKChidWlsZGVyIGFzIGFueSkuX21lbW8sIE5FV19NRU1PX0hFWFsnMCddKTtcbiAgICB9KTtcblxuICAgIGl0KCdlbmNvZGVzIFwiMVwiJywgKCkgPT4ge1xuICAgICAgYnVpbGRlci5tZW1vKCcxJyk7XG4gICAgICBzaG91bGQuZXF1YWwoKGJ1aWxkZXIgYXMgYW55KS5fbWVtbywgTkVXX01FTU9fSEVYWycxJ10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2VuY29kZXMgXCIyXCInLCAoKSA9PiB7XG4gICAgICBidWlsZGVyLm1lbW8oJzInKTtcbiAgICAgIHNob3VsZC5lcXVhbCgoYnVpbGRlciBhcyBhbnkpLl9tZW1vLCBORVdfTUVNT19IRVhbJzInXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZW5jb2RlcyBcIjU2NTk0XCInLCAoKSA9PiB7XG4gICAgICBidWlsZGVyLm1lbW8oJzU2NTk0Jyk7XG4gICAgICBzaG91bGQuZXF1YWwoKGJ1aWxkZXIgYXMgYW55KS5fbWVtbywgTkVXX01FTU9fSEVYWyc1NjU5NCddKTtcbiAgICB9KTtcblxuICAgIGl0KCdlbmNvZGVzIFwiMTAyMzI5NzE2XCInLCAoKSA9PiB7XG4gICAgICBidWlsZGVyLm1lbW8oJzEwMjMyOTcxNicpO1xuICAgICAgc2hvdWxkLmVxdWFsKChidWlsZGVyIGFzIGFueSkuX21lbW8sIE5FV19NRU1PX0hFWFsnMTAyMzI5NzE2J10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2VuY29kZXMgXCJ0ZXN0bWVtb1wiJywgKCkgPT4ge1xuICAgICAgYnVpbGRlci5tZW1vKCd0ZXN0bWVtbycpO1xuICAgICAgc2hvdWxkLmVxdWFsKChidWlsZGVyIGFzIGFueSkuX21lbW8sIE5FV19NRU1PX0hFWFsndGVzdG1lbW8nXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZW5jb2RlcyBcImFiY1wiJywgKCkgPT4ge1xuICAgICAgYnVpbGRlci5tZW1vKCdhYmMnKTtcbiAgICAgIHNob3VsZC5lcXVhbCgoYnVpbGRlciBhcyBhbnkpLl9tZW1vLCBORVdfTUVNT19IRVhbJ2FiYyddKTtcbiAgICB9KTtcblxuICAgIGl0KCdzdG9yZXMgYW4gYWxyZWFkeS1lbmNvZGVkIDB4IGhleCBtZW1vIGFzLWlzIChyb3VuZC10cmlwKScsICgpID0+IHtcbiAgICAgIGNvbnN0IGFscmVhZHlFbmNvZGVkID0gTkVXX01FTU9fSEVYWyc1NjU5NCddO1xuICAgICAgYnVpbGRlci5tZW1vKGFscmVhZHlFbmNvZGVkKTtcbiAgICAgIHNob3VsZC5lcXVhbCgoYnVpbGRlciBhcyBhbnkpLl9tZW1vLCBhbHJlYWR5RW5jb2RlZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdORVcgZW5jb2RpbmcgZGlmZmVycyBmcm9tIE9MRCBlbmNvZGluZycsICgpID0+IHtcbiAgICBpdCgncHJvZHVjZXMgZGlmZmVyZW50IGJ5dGVzIHRoYW4gVHJhbnNmZXJCdWlsZGVyIGZvciBcIjU2NTk0XCInLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IFRyYW5zZmVyQnVpbGRlciB9ID0gcmVxdWlyZSgnLi4vLi4vLi4vc3JjL2xpYicpO1xuICAgICAgY29uc3QgY29uZmlnID0gYnVpbGRUZXN0Q29uZmlnKCk7XG4gICAgICBjb25zdCBvbGRCdWlsZGVyID0gbmV3IFRyYW5zZmVyQnVpbGRlcihjb25maWcpLm1hdGVyaWFsKHV0aWxzLmdldE1hdGVyaWFsKGNvbmZpZy5uZXR3b3JrLnR5cGUpKTtcbiAgICAgIGNvbnN0IG5ld0J1aWxkZXIgPSBuZXcgSGV4VHJhbnNmZXJCdWlsZGVyKGNvbmZpZykubWF0ZXJpYWwodXRpbHMuZ2V0TWF0ZXJpYWwoY29uZmlnLm5ldHdvcmsudHlwZSkpO1xuXG4gICAgICBvbGRCdWlsZGVyLm1lbW8oJzU2NTk0Jyk7XG4gICAgICBuZXdCdWlsZGVyLm1lbW8oJzU2NTk0Jyk7XG5cbiAgICAgIGNvbnN0IG9sZE1lbW8gPSAob2xkQnVpbGRlciBhcyBhbnkpLl9tZW1vO1xuICAgICAgY29uc3QgbmV3TWVtbyA9IChuZXdCdWlsZGVyIGFzIGFueSkuX21lbW87XG5cbiAgICAgIHNob3VsZC5ub3RFcXVhbChvbGRNZW1vLCBuZXdNZW1vKTtcbiAgICAgIC8vIE9MRDogbGVmdC1wYWQgd2l0aCBBU0NJSSAnMCcgY2hhcnNcbiAgICAgIHNob3VsZC5vayhvbGRNZW1vLnN0YXJ0c1dpdGgoJzAwMDAwMCcpLCBgT0xEIG1lbW8gc2hvdWxkIHN0YXJ0IHdpdGggQVNDSUkgJzAnIHBhZGRpbmcsIGdvdDogJHtvbGRNZW1vfWApO1xuICAgICAgLy8gTkVXOiAweC1wcmVmaXhlZCBoZXhcbiAgICAgIHNob3VsZC5vayhuZXdNZW1vLnN0YXJ0c1dpdGgoJzB4JyksIGBORVcgbWVtbyBzaG91bGQgc3RhcnQgd2l0aCAweCwgZ290OiAke25ld01lbW99YCk7XG4gICAgICBzaG91bGQuZXF1YWwobmV3TWVtbywgTkVXX01FTU9fSEVYWyc1NjU5NCddKTtcbiAgICB9KTtcblxuICAgIGl0KCdwcm9kdWNlcyBkaWZmZXJlbnQgYnl0ZXMgdGhhbiBUcmFuc2ZlckJ1aWxkZXIgZm9yIFwiMFwiJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBUcmFuc2ZlckJ1aWxkZXIgfSA9IHJlcXVpcmUoJy4uLy4uLy4uL3NyYy9saWInKTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGJ1aWxkVGVzdENvbmZpZygpO1xuICAgICAgY29uc3Qgb2xkQnVpbGRlciA9IG5ldyBUcmFuc2ZlckJ1aWxkZXIoY29uZmlnKS5tYXRlcmlhbCh1dGlscy5nZXRNYXRlcmlhbChjb25maWcubmV0d29yay50eXBlKSk7XG4gICAgICBjb25zdCBuZXdCdWlsZGVyID0gbmV3IEhleFRyYW5zZmVyQnVpbGRlcihjb25maWcpLm1hdGVyaWFsKHV0aWxzLmdldE1hdGVyaWFsKGNvbmZpZy5uZXR3b3JrLnR5cGUpKTtcblxuICAgICAgb2xkQnVpbGRlci5tZW1vKCcwJyk7XG4gICAgICBuZXdCdWlsZGVyLm1lbW8oJzAnKTtcblxuICAgICAgc2hvdWxkLm5vdEVxdWFsKChvbGRCdWlsZGVyIGFzIGFueSkuX21lbW8sIChuZXdCdWlsZGVyIGFzIGFueSkuX21lbW8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYnVpbGQgdHJhbnNhY3Rpb24gd2l0aCBORVcgbWVtbyBlbmNvZGluZycsICgpID0+IHtcbiAgICBjb25zdCBzZW5kZXIgPSBhY2NvdW50cy5hY2NvdW50MTtcbiAgICBjb25zdCByZWNlaXZlciA9IGFjY291bnRzLmFjY291bnQyO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zYWN0aW9uIHdpdGggTkVXIG1lbW8gXCI1NjU5NFwiJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYnVpbGRlclxuICAgICAgICAuYW1vdW50KCcxMDAwMDAwJylcbiAgICAgICAgLnRvKHsgYWRkcmVzczogcmVjZWl2ZXIuYWRkcmVzcyB9KVxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgICAgLm1lbW8oJzU2NTk0JylcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogMzkzMywgbWF4RHVyYXRpb246IDY0IH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jaygnMHgxNDk3OTliYzk2MDJjYjVjZjIwMWYzNDI1ZmI4ZDI1M2IyZDRlNjFmYzExOWRjYWIzMjQ5ZjMwN2Y1OTQ3NTRkJylcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMSB9KVxuICAgICAgICAuZmVlKHsgYW1vdW50OiAwLCB0eXBlOiAndGlwJyB9KTtcbiAgICAgIGJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiBzZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKG1vY2tUc3NTaWduYXR1cmUsICdoZXgnKSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmFtb3VudCwgJzEwMDAwMDAnKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnRvLCByZWNlaXZlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnNlbmRlciwgc2VuZGVyLmFkZHJlc3MpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zYWN0aW9uIHdpdGggTkVXIG1lbW8gXCJ0ZXN0bWVtb1wiJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYnVpbGRlclxuICAgICAgICAuYW1vdW50KCcxMDAwMDAwJylcbiAgICAgICAgLnRvKHsgYWRkcmVzczogcmVjZWl2ZXIuYWRkcmVzcyB9KVxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgICAgLm1lbW8oJ3Rlc3RtZW1vJylcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogMzkzMywgbWF4RHVyYXRpb246IDY0IH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jaygnMHgxNDk3OTliYzk2MDJjYjVjZjIwMWYzNDI1ZmI4ZDI1M2IyZDRlNjFmYzExOWRjYWIzMjQ5ZjMwN2Y1OTQ3NTRkJylcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMSB9KVxuICAgICAgICAuZmVlKHsgYW1vdW50OiAwLCB0eXBlOiAndGlwJyB9KTtcbiAgICAgIGJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiBzZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKG1vY2tUc3NTaWduYXR1cmUsICdoZXgnKSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmFtb3VudCwgJzEwMDAwMDAnKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnRvLCByZWNlaXZlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwoKGJ1aWxkZXIgYXMgYW55KS5fbWVtbywgTkVXX01FTU9fSEVYWyd0ZXN0bWVtbyddKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB0cmFuc2FjdGlvbiB3aXRoIE5FVyBtZW1vIFwiMFwiIChkZWZhdWx0KScsIGFzeW5jICgpID0+IHtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFtb3VudCgnMTAwMDAwMCcpXG4gICAgICAgIC50byh7IGFkZHJlc3M6IHJlY2VpdmVyLmFkZHJlc3MgfSlcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlci5hZGRyZXNzIH0pXG4gICAgICAgIC5tZW1vKCcwJylcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogMzkzMywgbWF4RHVyYXRpb246IDY0IH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jaygnMHgxNDk3OTliYzk2MDJjYjVjZjIwMWYzNDI1ZmI4ZDI1M2IyZDRlNjFmYzExOWRjYWIzMjQ5ZjMwN2Y1OTQ3NTRkJylcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMSB9KVxuICAgICAgICAuZmVlKHsgYW1vdW50OiAwLCB0eXBlOiAndGlwJyB9KTtcbiAgICAgIGJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiBzZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKG1vY2tUc3NTaWduYXR1cmUsICdoZXgnKSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLm9rKHR4KTtcbiAgICAgIHNob3VsZC5lcXVhbCgoYnVpbGRlciBhcyBhbnkpLl9tZW1vLCBORVdfTUVNT19IRVhbJzAnXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdHJhbnNhY3Rpb24gd2l0aCBORVcgbWVtbyBcIjEwMjMyOTcxNlwiJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYnVpbGRlclxuICAgICAgICAuYW1vdW50KCcxMDAwMDAwJylcbiAgICAgICAgLnRvKHsgYWRkcmVzczogcmVjZWl2ZXIuYWRkcmVzcyB9KVxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgICAgLm1lbW8oJzEwMjMyOTcxNicpXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IDM5MzMsIG1heER1cmF0aW9uOiA2NCB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2soJzB4MTQ5Nzk5YmM5NjAyY2I1Y2YyMDFmMzQyNWZiOGQyNTNiMmQ0ZTYxZmMxMTlkY2FiMzI0OWYzMDdmNTk0NzU0ZCcpXG4gICAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IDEgfSlcbiAgICAgICAgLmZlZSh7IGFtb3VudDogMCwgdHlwZTogJ3RpcCcgfSk7XG4gICAgICBidWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1Yjogc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbShtb2NrVHNzU2lnbmF0dXJlLCAnaGV4JykpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5vayh0eCk7XG4gICAgICBzaG91bGQuZXF1YWwoKGJ1aWxkZXIgYXMgYW55KS5fbWVtbywgTkVXX01FTU9fSEVYWycxMDIzMjk3MTYnXSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmF3IHRyYW5zYWN0aW9uIGJ5dGVzIGRpZmZlciBiZXR3ZWVuIE9MRCBhbmQgTkVXIGJ1aWxkZXIgZm9yIHNhbWUgbWVtbycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgVHJhbnNmZXJCdWlsZGVyIH0gPSByZXF1aXJlKCcuLi8uLi8uLi9zcmMvbGliJyk7XG4gICAgICBjb25zdCBjb25maWcgPSBidWlsZFRlc3RDb25maWcoKTtcbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gdXRpbHMuZ2V0TWF0ZXJpYWwoY29uZmlnLm5ldHdvcmsudHlwZSk7XG5cbiAgICAgIGNvbnN0IGNvbW1vblBhcmFtcyA9IHtcbiAgICAgICAgYWRkcmVzczogcmVjZWl2ZXIuYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiAnMTAwMDAwMCcsXG4gICAgICAgIHNlbmRlcjogc2VuZGVyLmFkZHJlc3MsXG4gICAgICAgIGZpcnN0VmFsaWQ6IDM5MzMsXG4gICAgICAgIG1heER1cmF0aW9uOiA2NCxcbiAgICAgICAgcmVmZXJlbmNlQmxvY2s6ICcweDE0OTc5OWJjOTYwMmNiNWNmMjAxZjM0MjVmYjhkMjUzYjJkNGU2MWZjMTE5ZGNhYjMyNDlmMzA3ZjU5NDc1NGQnLFxuICAgICAgICBub25jZTogMSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9sZEJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyKGNvbmZpZylcbiAgICAgICAgLm1hdGVyaWFsKG1hdGVyaWFsKVxuICAgICAgICAuYW1vdW50KGNvbW1vblBhcmFtcy5hbW91bnQpXG4gICAgICAgIC50byh7IGFkZHJlc3M6IGNvbW1vblBhcmFtcy5hZGRyZXNzIH0pXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBjb21tb25QYXJhbXMuc2VuZGVyIH0pXG4gICAgICAgIC5tZW1vKCc1NjU5NCcpXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IGNvbW1vblBhcmFtcy5maXJzdFZhbGlkLCBtYXhEdXJhdGlvbjogY29tbW9uUGFyYW1zLm1heER1cmF0aW9uIH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayhjb21tb25QYXJhbXMucmVmZXJlbmNlQmxvY2spXG4gICAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IGNvbW1vblBhcmFtcy5ub25jZSB9KVxuICAgICAgICAuZmVlKHsgYW1vdW50OiAwLCB0eXBlOiAndGlwJyB9KTtcbiAgICAgIG9sZEJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiBzZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKG1vY2tUc3NTaWduYXR1cmUsICdoZXgnKSk7XG4gICAgICBjb25zdCBvbGRUeCA9IGF3YWl0IG9sZEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgY29uc3QgbmV3QnVpbGRlciA9IG5ldyBIZXhUcmFuc2ZlckJ1aWxkZXIoY29uZmlnKVxuICAgICAgICAubWF0ZXJpYWwobWF0ZXJpYWwpXG4gICAgICAgIC5hbW91bnQoY29tbW9uUGFyYW1zLmFtb3VudClcbiAgICAgICAgLnRvKHsgYWRkcmVzczogY29tbW9uUGFyYW1zLmFkZHJlc3MgfSlcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IGNvbW1vblBhcmFtcy5zZW5kZXIgfSlcbiAgICAgICAgLm1lbW8oJzU2NTk0JylcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogY29tbW9uUGFyYW1zLmZpcnN0VmFsaWQsIG1heER1cmF0aW9uOiBjb21tb25QYXJhbXMubWF4RHVyYXRpb24gfSlcbiAgICAgICAgLnJlZmVyZW5jZUJsb2NrKGNvbW1vblBhcmFtcy5yZWZlcmVuY2VCbG9jaylcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogY29tbW9uUGFyYW1zLm5vbmNlIH0pXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDAsIHR5cGU6ICd0aXAnIH0pO1xuICAgICAgbmV3QnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20obW9ja1Rzc1NpZ25hdHVyZSwgJ2hleCcpKTtcbiAgICAgIGNvbnN0IG5ld1R4ID0gYXdhaXQgbmV3QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBzaG91bGQubm90RXF1YWwob2xkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgbmV3VHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdIZXhUcmFuc2ZlckJ1aWxkZXIg4oCUIE1haW5uZXQnLCAoKSA9PiB7XG4gIGxldCBidWlsZGVyOiBIZXhUcmFuc2ZlckJ1aWxkZXI7XG5cbiAgY29uc3Qgc2VuZGVyID0gYWNjb3VudHMuYWNjb3VudDVNYWlubmV0O1xuICBjb25zdCByZWNlaXZlciA9IGFjY291bnRzLmFjY291bnQ2TWFpbm5ldDtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBidWlsZE1haW5uZXRDb25maWcoKTtcbiAgICBidWlsZGVyID0gbmV3IEhleFRyYW5zZmVyQnVpbGRlcihjb25maWcpLm1hdGVyaWFsKHV0aWxzLmdldE1hdGVyaWFsKGNvbmZpZy5uZXR3b3JrLnR5cGUpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBlbmNvZGUgbWVtbyBcIjU2NTk0XCIgY29ycmVjdGx5IG9uIG1haW5uZXQnLCAoKSA9PiB7XG4gICAgYnVpbGRlci5tZW1vKCc1NjU5NCcpO1xuICAgIHNob3VsZC5lcXVhbCgoYnVpbGRlciBhcyBhbnkpLl9tZW1vLCBORVdfTUVNT19IRVhbJzU2NTk0J10pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJ1aWxkIGEgbWFpbm5ldCB0cmFuc2FjdGlvbiB3aXRoIE5FVyBtZW1vJywgYXN5bmMgKCkgPT4ge1xuICAgIGJ1aWxkZXJcbiAgICAgIC5hbW91bnQoJzEwMDAwMDAnKVxuICAgICAgLnRvKHsgYWRkcmVzczogcmVjZWl2ZXIuYWRkcmVzcyB9KVxuICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlci5hZGRyZXNzIH0pXG4gICAgICAubWVtbygnNTY1OTQnKVxuICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogMzkzMywgbWF4RHVyYXRpb246IDY0IH0pXG4gICAgICAucmVmZXJlbmNlQmxvY2soJzB4MTQ5Nzk5YmM5NjAyY2I1Y2YyMDFmMzQyNWZiOGQyNTNiMmQ0ZTYxZmMxMTlkY2FiMzI0OWYzMDdmNTk0NzU0ZCcpXG4gICAgICAuc2VxdWVuY2VJZCh7IG5hbWU6ICdOb25jZScsIGtleXdvcmQ6ICdub25jZScsIHZhbHVlOiAxIH0pXG4gICAgICAuZmVlKHsgYW1vdW50OiAwLCB0eXBlOiAndGlwJyB9KTtcbiAgICBidWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1Yjogc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbShtb2NrVHNzU2lnbmF0dXJlLCAnaGV4JykpO1xuXG4gICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5hbW91bnQsICcxMDAwMDAwJyk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24udG8sIHJlY2VpdmVyLmFkZHJlc3MpO1xuICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnNlbmRlciwgc2VuZGVyLmFkZHJlc3MpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnSGV4VHJhbnNmZXJCdWlsZGVyIOKAlCBmYWN0b3J5LmZyb20oKSByZWJ1aWxkIHJvdW5kLXRyaXAnLCAoKSA9PiB7XG4gIGNvbnN0IHNlbmRlciA9IGFjY291bnRzLmFjY291bnQxO1xuICBjb25zdCByZWNlaXZlciA9IGFjY291bnRzLmFjY291bnQyO1xuICBjb25zdCBjb21tb25QYXJhbXMgPSB7XG4gICAgYW1vdW50OiAnMTAwMDAwMCcsXG4gICAgZmlyc3RWYWxpZDogMzkzMyxcbiAgICBtYXhEdXJhdGlvbjogNjQsXG4gICAgcmVmZXJlbmNlQmxvY2s6ICcweDE0OTc5OWJjOTYwMmNiNWNmMjAxZjM0MjVmYjhkMjUzYjJkNGU2MWZjMTE5ZGNhYjMyNDlmMzA3ZjU5NDc1NGQnLFxuICAgIG5vbmNlOiAxLFxuICB9O1xuICBsZXQgZmFjdG9yeTogVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0cG9seXgnKSk7XG4gIH0pO1xuXG4gIGl0KCdmYWN0b3J5LmZyb20oKSByZXR1cm5zIEhleFRyYW5zZmVyQnVpbGRlciBmb3IgYSBORVctZW5jb2RlZCBzaWduZWQgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBIZXhUcmFuc2ZlckJ1aWxkZXIoYnVpbGRUZXN0Q29uZmlnKCkpXG4gICAgICAubWF0ZXJpYWwodXRpbHMuZ2V0TWF0ZXJpYWwoYnVpbGRUZXN0Q29uZmlnKCkubmV0d29yay50eXBlKSlcbiAgICAgIC5hbW91bnQoY29tbW9uUGFyYW1zLmFtb3VudClcbiAgICAgIC50byh7IGFkZHJlc3M6IHJlY2VpdmVyLmFkZHJlc3MgfSlcbiAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXIuYWRkcmVzcyB9KVxuICAgICAgLm1lbW8oJzU2NTk0JylcbiAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IGNvbW1vblBhcmFtcy5maXJzdFZhbGlkLCBtYXhEdXJhdGlvbjogY29tbW9uUGFyYW1zLm1heER1cmF0aW9uIH0pXG4gICAgICAucmVmZXJlbmNlQmxvY2soY29tbW9uUGFyYW1zLnJlZmVyZW5jZUJsb2NrKVxuICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogY29tbW9uUGFyYW1zLm5vbmNlIH0pXG4gICAgICAuZmVlKHsgYW1vdW50OiAwLCB0eXBlOiAndGlwJyB9KTtcbiAgICBidWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1Yjogc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbShtb2NrVHNzU2lnbmF0dXJlLCAnaGV4JykpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgY29uc3QgcmVidWlsdCA9IGZhY3RvcnkuZnJvbShzZXJpYWxpemVkKTtcbiAgICByZWJ1aWx0LnNob3VsZC5iZS5pbnN0YW5jZU9mKEhleFRyYW5zZmVyQnVpbGRlcik7XG4gIH0pO1xuXG4gIGl0KCdmYWN0b3J5LmZyb20oKSByZXR1cm5zIFRyYW5zZmVyQnVpbGRlciAobm90IEhleFRyYW5zZmVyQnVpbGRlcikgZm9yIGFuIE9MRC1lbmNvZGVkIHNpZ25lZCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gbmV3IFRyYW5zZmVyQnVpbGRlcihidWlsZFRlc3RDb25maWcoKSlcbiAgICAgIC5tYXRlcmlhbCh1dGlscy5nZXRNYXRlcmlhbChidWlsZFRlc3RDb25maWcoKS5uZXR3b3JrLnR5cGUpKVxuICAgICAgLmFtb3VudChjb21tb25QYXJhbXMuYW1vdW50KVxuICAgICAgLnRvKHsgYWRkcmVzczogcmVjZWl2ZXIuYWRkcmVzcyB9KVxuICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlci5hZGRyZXNzIH0pXG4gICAgICAubWVtbygnNTY1OTQnKVxuICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogY29tbW9uUGFyYW1zLmZpcnN0VmFsaWQsIG1heER1cmF0aW9uOiBjb21tb25QYXJhbXMubWF4RHVyYXRpb24gfSlcbiAgICAgIC5yZWZlcmVuY2VCbG9jayhjb21tb25QYXJhbXMucmVmZXJlbmNlQmxvY2spXG4gICAgICAuc2VxdWVuY2VJZCh7IG5hbWU6ICdOb25jZScsIGtleXdvcmQ6ICdub25jZScsIHZhbHVlOiBjb21tb25QYXJhbXMubm9uY2UgfSlcbiAgICAgIC5mZWUoeyBhbW91bnQ6IDAsIHR5cGU6ICd0aXAnIH0pO1xuICAgIGJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiBzZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKG1vY2tUc3NTaWduYXR1cmUsICdoZXgnKSk7XG4gICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICBjb25zdCByZWJ1aWx0ID0gZmFjdG9yeS5mcm9tKHNlcmlhbGl6ZWQpO1xuICAgIHJlYnVpbHQuc2hvdWxkLmJlLmluc3RhbmNlT2YoVHJhbnNmZXJCdWlsZGVyKTtcbiAgICByZWJ1aWx0LnNob3VsZC5ub3QuYmUuaW5zdGFuY2VPZihIZXhUcmFuc2ZlckJ1aWxkZXIpO1xuICB9KTtcblxuICBpdCgncmVidWlsZCBmcm9tIE5FVy1lbmNvZGVkIHR4IHByZXNlcnZlcyBtZW1vIGJ5dGVzIChzZXJpYWxpemVkIGhleCBpcyBpZGVudGljYWwpJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJ1aWxkID0gYXN5bmMgKG1lbW86IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgYiA9IG5ldyBIZXhUcmFuc2ZlckJ1aWxkZXIoYnVpbGRUZXN0Q29uZmlnKCkpXG4gICAgICAgIC5tYXRlcmlhbCh1dGlscy5nZXRNYXRlcmlhbChidWlsZFRlc3RDb25maWcoKS5uZXR3b3JrLnR5cGUpKVxuICAgICAgICAuYW1vdW50KGNvbW1vblBhcmFtcy5hbW91bnQpXG4gICAgICAgIC50byh7IGFkZHJlc3M6IHJlY2VpdmVyLmFkZHJlc3MgfSlcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlci5hZGRyZXNzIH0pXG4gICAgICAgIC5tZW1vKG1lbW8pXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IGNvbW1vblBhcmFtcy5maXJzdFZhbGlkLCBtYXhEdXJhdGlvbjogY29tbW9uUGFyYW1zLm1heER1cmF0aW9uIH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayhjb21tb25QYXJhbXMucmVmZXJlbmNlQmxvY2spXG4gICAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IGNvbW1vblBhcmFtcy5ub25jZSB9KVxuICAgICAgICAuZmVlKHsgYW1vdW50OiAwLCB0eXBlOiAndGlwJyB9KTtcbiAgICAgIGIuYWRkU2lnbmF0dXJlKHsgcHViOiBzZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKG1vY2tUc3NTaWduYXR1cmUsICdoZXgnKSk7XG4gICAgICByZXR1cm4gKGF3YWl0IGIuYnVpbGQoKSkudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBtZW1vIG9mIFsnNTY1OTQnLCAndGVzdG1lbW8nLCAnMCcsICcxMDIzMjk3MTYnXSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWwgPSBhd2FpdCBidWlsZChtZW1vKTtcbiAgICAgIC8vIGZyb21JbXBsZW1lbnRhdGlvbiBmb3Igc2lnbmVkIHR4cyBkb2Vzbid0IHJlc3RvcmUgYmxvY2tOdW1iZXIg4oCUIG11c3QgcmUtc3VwcGx5IHZhbGlkaXR5ICsgcmVmZXJlbmNlQmxvY2tcbiAgICAgIGNvbnN0IHJlYnVpbHQgPSBmYWN0b3J5XG4gICAgICAgIC5mcm9tKG9yaWdpbmFsKVxuICAgICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiBjb21tb25QYXJhbXMuZmlyc3RWYWxpZCwgbWF4RHVyYXRpb246IGNvbW1vblBhcmFtcy5tYXhEdXJhdGlvbiB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2soY29tbW9uUGFyYW1zLnJlZmVyZW5jZUJsb2NrKTtcbiAgICAgIGNvbnN0IHJvdW5kVHJpcHBlZCA9IChhd2FpdCByZWJ1aWx0LmJ1aWxkKCkpLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwocm91bmRUcmlwcGVkLCBvcmlnaW5hbCwgYHJvdW5kLXRyaXAgZmFpbGVkIGZvciBtZW1vIFwiJHttZW1vfVwiYCk7XG4gICAgfVxuICB9KTtcblxuICBpdCgncmVidWlsZCBmcm9tIE5FVy1lbmNvZGVkIHR4IGhhcyBjb3JyZWN0IF9tZW1vIHZhbHVlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGhleEJ1aWxkZXIgPSBuZXcgSGV4VHJhbnNmZXJCdWlsZGVyKGJ1aWxkVGVzdENvbmZpZygpKVxuICAgICAgLm1hdGVyaWFsKHV0aWxzLmdldE1hdGVyaWFsKGJ1aWxkVGVzdENvbmZpZygpLm5ldHdvcmsudHlwZSkpXG4gICAgICAuYW1vdW50KGNvbW1vblBhcmFtcy5hbW91bnQpXG4gICAgICAudG8oeyBhZGRyZXNzOiByZWNlaXZlci5hZGRyZXNzIH0pXG4gICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgIC5tZW1vKCc1NjU5NCcpXG4gICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiBjb21tb25QYXJhbXMuZmlyc3RWYWxpZCwgbWF4RHVyYXRpb246IGNvbW1vblBhcmFtcy5tYXhEdXJhdGlvbiB9KVxuICAgICAgLnJlZmVyZW5jZUJsb2NrKGNvbW1vblBhcmFtcy5yZWZlcmVuY2VCbG9jaylcbiAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IGNvbW1vblBhcmFtcy5ub25jZSB9KVxuICAgICAgLmZlZSh7IGFtb3VudDogMCwgdHlwZTogJ3RpcCcgfSk7XG4gICAgaGV4QnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20obW9ja1Rzc1NpZ25hdHVyZSwgJ2hleCcpKTtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gKGF3YWl0IGhleEJ1aWxkZXIuYnVpbGQoKSkudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgIGNvbnN0IHJlYnVpbHQgPSBmYWN0b3J5LmZyb20oc2VyaWFsaXplZCk7XG4gICAgc2hvdWxkLmVxdWFsKChyZWJ1aWx0IGFzIGFueSkuX21lbW8sIE5FV19NRU1PX0hFWFsnNTY1OTQnXSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCd1dGlscy5pc05ld01lbW9FbmNvZGluZycsICgpID0+IHtcbiAgaXQoJ2RldGVjdHMgTkVXIGVuY29kaW5nIChoYXMgMHgwMCBieXRlcyknLCAoKSA9PiB7XG4gICAgc2hvdWxkLm9rKHV0aWxzLmlzTmV3TWVtb0VuY29kaW5nKE5FV19NRU1PX0hFWFsnNTY1OTQnXSkpO1xuICAgIHNob3VsZC5vayh1dGlscy5pc05ld01lbW9FbmNvZGluZyhORVdfTUVNT19IRVhbJ3Rlc3RtZW1vJ10pKTtcbiAgICBzaG91bGQub2sodXRpbHMuaXNOZXdNZW1vRW5jb2RpbmcoTkVXX01FTU9fSEVYWydhYmMnXSkpO1xuICAgIHNob3VsZC5vayh1dGlscy5pc05ld01lbW9FbmNvZGluZyhORVdfTUVNT19IRVhbJzAnXSkpO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3QgZGV0ZWN0IE9MRCBlbmNvZGluZyBhcyBORVcgKG5vIDB4MDAgYnl0ZXMpJywgKCkgPT4ge1xuICAgIC8vIE9MRCBlbmNvZGluZyBvZiBcIjBcIjogYWxsIDB4MzAgYnl0ZXMsIG5vIG51bGxzXG4gICAgY29uc3Qgb2xkTWVtb1plcm8gPSAnMHgzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwJztcbiAgICAvLyBPTEQgZW5jb2Rpbmcgb2YgXCI1NjU5NFwiOiAyNyDDlyAweDMwICsgQVNDSUkgXCI1NjU5NFwiXG4gICAgY29uc3Qgb2xkTWVtb1JlZiA9ICcweDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDM1MzYzNTM5MzQnO1xuICAgIHNob3VsZC5vayghdXRpbHMuaXNOZXdNZW1vRW5jb2Rpbmcob2xkTWVtb1plcm8pKTtcbiAgICBzaG91bGQub2soIXV0aWxzLmlzTmV3TWVtb0VuY29kaW5nKG9sZE1lbW9SZWYpKTtcbiAgfSk7XG5cbiAgaXQoJ3JldHVybnMgZmFsc2UgZm9yIG5vbi0weCBzdHJpbmdzJywgKCkgPT4ge1xuICAgIHNob3VsZC5vayghdXRpbHMuaXNOZXdNZW1vRW5jb2RpbmcoJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDU2NTk0JykpO1xuICAgIHNob3VsZC5vayghdXRpbHMuaXNOZXdNZW1vRW5jb2RpbmcoJycpKTtcbiAgfSk7XG5cbiAgaXQoJ3JldHVybnMgZmFsc2UgZm9yIHdyb25nLWxlbmd0aCAweCBzdHJpbmdzJywgKCkgPT4ge1xuICAgIHNob3VsZC5vayghdXRpbHMuaXNOZXdNZW1vRW5jb2RpbmcoJzB4MTIzNCcpKTtcbiAgfSk7XG5cbiAgaXQoJ2RldGVjdHMgZnVsbCAzMi1ieXRlIE5FVyBtZW1vIHdpdGggbm8gbnVsbCBwYWRkaW5nIGFzIE5FVycsICgpID0+IHtcbiAgICBjb25zdCBmdWxsTWVtbyA9ICcweCcgKyAnNjEnLnJlcGVhdCgzMik7XG4gICAgc2hvdWxkLm9rKHV0aWxzLmlzTmV3TWVtb0VuY29kaW5nKGZ1bGxNZW1vKSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCd1dGlscy5lbmNvZGVNZW1vTmV3JywgKCkgPT4ge1xuICBpdCgnZW5jb2RlcyBcIjU2NTk0XCIgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgIHNob3VsZC5lcXVhbCh1dGlscy5lbmNvZGVNZW1vTmV3KCc1NjU5NCcpLCBORVdfTUVNT19IRVhbJzU2NTk0J10pO1xuICB9KTtcblxuICBpdCgnZW5jb2RlcyBcInRlc3RtZW1vXCIgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgIHNob3VsZC5lcXVhbCh1dGlscy5lbmNvZGVNZW1vTmV3KCd0ZXN0bWVtbycpLCBORVdfTUVNT19IRVhbJ3Rlc3RtZW1vJ10pO1xuICB9KTtcblxuICBpdCgnZW5jb2RlcyBcIjBcIiBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgc2hvdWxkLmVxdWFsKHV0aWxzLmVuY29kZU1lbW9OZXcoJzAnKSwgTkVXX01FTU9fSEVYWycwJ10pO1xuICB9KTtcblxuICBpdCgnZW5jb2RlcyBcIjEwMjMyOTcxNlwiIGNvcnJlY3RseScsICgpID0+IHtcbiAgICBzaG91bGQuZXF1YWwodXRpbHMuZW5jb2RlTWVtb05ldygnMTAyMzI5NzE2JyksIE5FV19NRU1PX0hFWFsnMTAyMzI5NzE2J10pO1xuICB9KTtcblxuICBpdCgnZW5jb2RlcyBcImFiY1wiIGNvcnJlY3RseScsICgpID0+IHtcbiAgICBzaG91bGQuZXF1YWwodXRpbHMuZW5jb2RlTWVtb05ldygnYWJjJyksIE5FV19NRU1PX0hFWFsnYWJjJ10pO1xuICB9KTtcblxuICBpdCgnYWx3YXlzIHJldHVybnMgYSAweC1wcmVmaXhlZCA2Ni1jaGFyYWN0ZXIgc3RyaW5nJywgKCkgPT4ge1xuICAgIFsnMCcsICcxJywgJzU2NTk0JywgJ3Rlc3RtZW1vJywgJ2FiYycsICcxMDIzMjk3MTYnXS5mb3JFYWNoKChtZW1vKSA9PiB7XG4gICAgICBjb25zdCBlbmNvZGVkID0gdXRpbHMuZW5jb2RlTWVtb05ldyhtZW1vKTtcbiAgICAgIHNob3VsZC5vayhlbmNvZGVkLnN0YXJ0c1dpdGgoJzB4JyksIGBzaG91bGQgc3RhcnQgd2l0aCAweDogJHtlbmNvZGVkfWApO1xuICAgICAgc2hvdWxkLmVxdWFsKGVuY29kZWQubGVuZ3RoLCA2NiwgYHNob3VsZCBiZSA2NiBjaGFycyAoMHggKyA2NCBoZXgpOiAke2VuY29kZWR9YCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCd0aHJvd3Mgd2hlbiBtZW1vIGV4Y2VlZHMgMzIgVVRGLTggYnl0ZXMnLCAoKSA9PiB7XG4gICAgY29uc3QgdG9vTG9uZyA9ICdhJy5yZXBlYXQoMzMpO1xuICAgIHNob3VsZC50aHJvd3MoKCkgPT4gdXRpbHMuZW5jb2RlTWVtb05ldyh0b29Mb25nKSwgL2V4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgMzIgYnl0ZXMvKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ0hleFRyYW5zZmVyQnVpbGRlciDigJQgbWVtbyB2YWxpZGF0aW9uJywgKCkgPT4ge1xuICBsZXQgYnVpbGRlcjogSGV4VHJhbnNmZXJCdWlsZGVyO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGJ1aWxkVGVzdENvbmZpZygpO1xuICAgIGJ1aWxkZXIgPSBuZXcgSGV4VHJhbnNmZXJCdWlsZGVyKGNvbmZpZykubWF0ZXJpYWwodXRpbHMuZ2V0TWF0ZXJpYWwoY29uZmlnLm5ldHdvcmsudHlwZSkpO1xuICB9KTtcblxuICBpdCgndGhyb3dzIHdoZW4gbWVtbyBleGNlZWRzIDMyIFVURi04IGJ5dGVzJywgKCkgPT4ge1xuICAgIGNvbnN0IHRvb0xvbmcgPSAnYScucmVwZWF0KDMzKTtcbiAgICBzaG91bGQudGhyb3dzKCgpID0+IGJ1aWxkZXIubWVtbyh0b29Mb25nKSwgL2V4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgMzIgYnl0ZXMvKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyBmb3IgaW52YWxpZCBoZXggbWVtbycsICgpID0+IHtcbiAgICBzaG91bGQudGhyb3dzKCgpID0+IGJ1aWxkZXIubWVtbygnMHgnICsgJ3p6Jy5yZXBlYXQoMzIpKSwgL0ludmFsaWQgbWVtbyBoZXggZW5jb2RpbmcvKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nominateBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/nominateBuilder.ts"],"names":[],"mappings":""}
|