@bitgo-beta/sdk-coin-tao 1.0.1-alpha.155 → 1.0.1-alpha.157

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/.eslintignore +4 -0
  2. package/.mocharc.yml +8 -0
  3. package/CHANGELOG.md +254 -0
  4. package/package.json +7 -10
  5. package/dist/test/integration/index.d.ts +0 -1
  6. package/dist/test/integration/index.d.ts.map +0 -1
  7. package/dist/test/integration/index.js +0 -1
  8. package/dist/test/resources/index.d.ts +0 -150
  9. package/dist/test/resources/index.d.ts.map +0 -1
  10. package/dist/test/resources/index.js +0 -166
  11. package/dist/test/resources/materialData.json +0 -8
  12. package/dist/test/resources/materialDataModified.json +0 -8
  13. package/dist/test/resources/testnet.d.ts +0 -2
  14. package/dist/test/resources/testnet.d.ts.map +0 -1
  15. package/dist/test/resources/testnet.js +0 -5
  16. package/dist/test/unit/fixtures.d.ts +0 -31
  17. package/dist/test/unit/fixtures.d.ts.map +0 -1
  18. package/dist/test/unit/fixtures.js +0 -107
  19. package/dist/test/unit/tao.d.ts +0 -2
  20. package/dist/test/unit/tao.d.ts.map +0 -1
  21. package/dist/test/unit/tao.js +0 -415
  22. package/dist/test/unit/transactionBuilder/base.d.ts +0 -8
  23. package/dist/test/unit/transactionBuilder/base.d.ts.map +0 -1
  24. package/dist/test/unit/transactionBuilder/base.js +0 -238
  25. package/dist/test/unit/transactionBuilder/moveStakeBuilder.d.ts +0 -2
  26. package/dist/test/unit/transactionBuilder/moveStakeBuilder.d.ts.map +0 -1
  27. package/dist/test/unit/transactionBuilder/moveStakeBuilder.js +0 -472
  28. package/dist/test/unit/transactionBuilder/singeltonRegistry.d.ts +0 -2
  29. package/dist/test/unit/transactionBuilder/singeltonRegistry.d.ts.map +0 -1
  30. package/dist/test/unit/transactionBuilder/singeltonRegistry.js +0 -59
  31. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts +0 -2
  32. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts.map +0 -1
  33. package/dist/test/unit/transactionBuilder/stakingBuilder.js +0 -112
  34. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +0 -2
  35. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +0 -1
  36. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +0 -92
  37. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts +0 -2
  38. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts.map +0 -1
  39. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +0 -75
  40. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +0 -2
  41. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +0 -1
  42. package/dist/test/unit/transactionBuilder/transferBuilder.js +0 -309
  43. package/dist/test/unit/transactionBuilder/unstakeBuilder.d.ts +0 -2
  44. package/dist/test/unit/transactionBuilder/unstakeBuilder.d.ts.map +0 -1
  45. package/dist/test/unit/transactionBuilder/unstakeBuilder.js +0 -112
  46. package/dist/test/unit/util.d.ts +0 -2
  47. package/dist/test/unit/util.d.ts.map +0 -1
  48. package/dist/test/unit/util.js +0 -29
  49. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,415 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- const should_1 = __importDefault(require("should"));
40
- const sdk_test_1 = require("@bitgo-beta/sdk-test");
41
- const sdk_api_1 = require("@bitgo-beta/sdk-api");
42
- const src_1 = require("../../src");
43
- const sinon = __importStar(require("sinon"));
44
- const testData = __importStar(require("./fixtures"));
45
- const resources_1 = require("../resources");
46
- const mocha_1 = require("mocha");
47
- describe('Tao:', function () {
48
- let bitgo;
49
- let baseCoin;
50
- before(function () {
51
- bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'mock' });
52
- bitgo.safeRegister('tao', src_1.Tao.createInstance);
53
- bitgo.safeRegister('ttao', src_1.Ttao.createInstance);
54
- bitgo.initializeTestVars();
55
- baseCoin = bitgo.coin('ttao');
56
- });
57
- describe.skip('Recover Transactions:', function () {
58
- const sandBox = sinon.createSandbox();
59
- const recoveryDestination = '5FJ18ywfrWuRifNyc8aPwQ5ium19Fefwmx18H4XYkDc36F2A';
60
- const nonce = 2;
61
- let accountInfoCB;
62
- let headerInfoCB;
63
- let getFeeCB;
64
- beforeEach(function () {
65
- accountInfoCB = sandBox.stub(src_1.Tao.prototype, 'getAccountInfo');
66
- headerInfoCB = sandBox.stub(src_1.Tao.prototype, 'getHeaderInfo');
67
- getFeeCB = sandBox.stub(src_1.Tao.prototype, 'getFee');
68
- getFeeCB.withArgs(recoveryDestination, testData.wrwUser.walletAddress0, 1510000000000).resolves(15783812856); // TODD: use it later
69
- });
70
- (0, mocha_1.afterEach)(function () {
71
- sandBox.restore();
72
- });
73
- it('should generate unsigned sweep correctly', async function () {
74
- accountInfoCB.withArgs(testData.unsignedSweepUser.walletAddress0).resolves({ nonce: 1, freeBalance: 2989864739 });
75
- headerInfoCB.resolves({
76
- headerNumber: testData.westendBlock.blockNumber,
77
- headerHash: testData.westendBlock.hash,
78
- });
79
- const commonKeyChain = 'd4a570c1831c7024cb72533e42690cec9d9150b9aac59001c4a5a3a285518263a9e89f1c709bcb1e832f2ff5169fecd496881ba8970f69d5adc977ba4799fedb'; // TODO: add common key chain
80
- const unsigned = await baseCoin.recover({ bitgoKey: commonKeyChain, recoveryDestination });
81
- unsigned.txRequests.should.not.be.undefined();
82
- unsigned.txRequests.length.should.equal(1);
83
- unsigned.txRequests[0].transactions.length.should.equal(1);
84
- unsigned.txRequests[0].walletCoin.should.equal('ttao');
85
- unsigned.txRequests[0].transactions[0].unsignedTx.should.not.be.undefined();
86
- unsigned.txRequests[0].transactions[0].unsignedTx.serializedTx.should.not.be.undefined();
87
- unsigned.txRequests[0].transactions[0].unsignedTx.scanIndex.should.equal(0);
88
- unsigned.txRequests[0].transactions[0].unsignedTx.coin.should.equal('ttao');
89
- unsigned.txRequests[0].transactions[0].unsignedTx.signableHex.should.not.be.undefined();
90
- unsigned.txRequests[0].transactions[0].unsignedTx.derivationPath.should.equal('m/0');
91
- unsigned.txRequests[0].transactions[0].unsignedTx.parsedTx.should.not.be.undefined();
92
- unsigned.txRequests[0].transactions[0].unsignedTx.parsedTx.inputs.should.not.be.undefined();
93
- unsigned.txRequests[0].transactions[0].unsignedTx.parsedTx.inputs.length.should.equal(1);
94
- unsigned.txRequests[0].transactions[0].unsignedTx.parsedTx.inputs[0].address.should.equal('5Ehp6rRKp4zZxW3zh4SUA79zEj5GDXuNhTy7y7g12DT2kh4C');
95
- unsigned.txRequests[0].transactions[0].unsignedTx.parsedTx.inputs[0].valueString.should.equal('2989864739');
96
- unsigned.txRequests[0].transactions[0].unsignedTx.parsedTx.inputs[0].value.should.equal(2989864739);
97
- unsigned.txRequests[0].transactions[0].unsignedTx.parsedTx.outputs.should.not.be.undefined();
98
- unsigned.txRequests[0].transactions[0].unsignedTx.parsedTx.outputs.length.should.equal(1);
99
- unsigned.txRequests[0].transactions[0].unsignedTx.parsedTx.outputs[0].address.should.equal('5FJ18ywfrWuRifNyc8aPwQ5ium19Fefwmx18H4XYkDc36F2A');
100
- unsigned.txRequests[0].transactions[0].unsignedTx.parsedTx.outputs[0].valueString.should.equal('2989864739');
101
- unsigned.txRequests[0].transactions[0].unsignedTx.parsedTx.outputs[0].coinName.should.equal('ttao');
102
- unsigned.txRequests[0].transactions[0].unsignedTx.parsedTx.type.should.equal('');
103
- unsigned.txRequests[0].transactions[0].unsignedTx.feeInfo.should.not.be.undefined();
104
- unsigned.txRequests[0].transactions[0].unsignedTx.feeInfo.fee.should.equal(0);
105
- unsigned.txRequests[0].transactions[0].unsignedTx.feeInfo.feeString.should.equal('0');
106
- unsigned.txRequests[0].transactions[0].unsignedTx.coinSpecific.should.not.be.undefined();
107
- unsigned.txRequests[0].transactions[0].unsignedTx.coinSpecific.firstValid.should.not.be.undefined();
108
- unsigned.txRequests[0].transactions[0].unsignedTx.coinSpecific.maxDuration.should.equal(2400);
109
- unsigned.txRequests[0].transactions[0].unsignedTx.coinSpecific.commonKeychain.should.equal('d4a570c1831c7024cb72533e42690cec9d9150b9aac59001c4a5a3a285518263a9e89f1c709bcb1e832f2ff5169fecd496881ba8970f69d5adc977ba4799fedb');
110
- });
111
- it('should recover a tx for non-bitgo recoveries', async function () {
112
- accountInfoCB.withArgs(testData.wrwUser.walletAddress0).resolves({ nonce: 2, freeBalance: 100001853 });
113
- headerInfoCB.resolves({
114
- headerNumber: testData.westendBlock.blockNumber,
115
- headerHash: testData.westendBlock.hash,
116
- });
117
- const res = await baseCoin.recover({
118
- userKey: testData.wrwUser.userKey,
119
- backupKey: testData.wrwUser.backupKey,
120
- bitgoKey: testData.wrwUser.bitgoKey,
121
- walletPassphrase: testData.wrwUser.walletPassphrase,
122
- recoveryDestination: recoveryDestination,
123
- });
124
- res.should.not.be.empty();
125
- res.should.hasOwnProperty('serializedTx');
126
- res.should.hasOwnProperty('scanIndex');
127
- // sandBox.assert.calledOnce(baseCoin.getAccountInfo);
128
- // sandBox.assert.calledOnce(baseCoin.getHeaderInfo);
129
- const txBuilder = baseCoin.getBuilder().from(res.serializedTx);
130
- txBuilder
131
- .validity({
132
- firstValid: testData.westendBlock.blockNumber,
133
- maxDuration: baseCoin.SWEEP_TXN_DURATION,
134
- })
135
- .referenceBlock(testData.westendBlock.hash);
136
- const tx = await txBuilder.build();
137
- const txJson = tx.toJson();
138
- should_1.default.deepEqual(txJson.sender, testData.wrwUser.walletAddress0);
139
- should_1.default.deepEqual(txJson.blockNumber, testData.westendBlock.blockNumber);
140
- should_1.default.deepEqual(txJson.referenceBlock, testData.westendBlock.hash);
141
- should_1.default.deepEqual(txJson.genesisHash, resources_1.genesisHash);
142
- should_1.default.deepEqual(txJson.specVersion, resources_1.specVersion);
143
- should_1.default.deepEqual(txJson.nonce, nonce);
144
- should_1.default.deepEqual(txJson.tip, 0);
145
- should_1.default.deepEqual(txJson.transactionVersion, resources_1.txVersion);
146
- // should.deepEqual(txJson.chainName, chainName);
147
- should_1.default.deepEqual(txJson.eraPeriod, baseCoin.SWEEP_TXN_DURATION);
148
- });
149
- it('should recover a txn for unsigned-sweep recoveries', async function () {
150
- accountInfoCB.withArgs(testData.unsignedSweepUser.walletAddress0).resolves({ nonce: 1, freeBalance: 2989864739 });
151
- headerInfoCB.resolves({
152
- headerNumber: testData.westendBlock.blockNumber,
153
- headerHash: testData.westendBlock.hash,
154
- });
155
- const res = await baseCoin.recover({
156
- bitgoKey: testData.unsignedSweepUser.bitgoKey,
157
- recoveryDestination: recoveryDestination,
158
- });
159
- res.should.not.be.empty();
160
- res.txRequests[0].transactions[0].unsignedTx.should.hasOwnProperty('serializedTx');
161
- res.txRequests[0].transactions[0].unsignedTx.should.hasOwnProperty('scanIndex');
162
- // sandBox.assert.calledOnce(baseCoin.getAccountInfo);
163
- // sandBox.assert.calledOnce(baseCoin.getHeaderInfo);
164
- const txBuilder = baseCoin.getBuilder().from(res.txRequests[0].transactions[0].unsignedTx.serializedTx);
165
- txBuilder
166
- .validity({
167
- firstValid: testData.westendBlock.blockNumber,
168
- maxDuration: baseCoin.SWEEP_TXN_DURATION,
169
- })
170
- .referenceBlock(testData.westendBlock.hash)
171
- .sender({ address: testData.unsignedSweepUser.walletAddress0 });
172
- const tx = await txBuilder.build();
173
- const txJson = tx.toJson();
174
- should_1.default.deepEqual(txJson.sender, testData.unsignedSweepUser.walletAddress0);
175
- should_1.default.deepEqual(txJson.blockNumber, testData.westendBlock.blockNumber);
176
- should_1.default.deepEqual(txJson.referenceBlock, testData.westendBlock.hash);
177
- should_1.default.deepEqual(txJson.genesisHash, resources_1.genesisHash);
178
- should_1.default.deepEqual(txJson.specVersion, resources_1.specVersion);
179
- should_1.default.deepEqual(txJson.nonce, 1);
180
- should_1.default.deepEqual(txJson.tip, 0);
181
- should_1.default.deepEqual(txJson.transactionVersion, resources_1.txVersion);
182
- // should.deepEqual(txJson.chainName, chainName);
183
- should_1.default.deepEqual(txJson.eraPeriod, baseCoin.SWEEP_TXN_DURATION);
184
- });
185
- });
186
- describe.skip('Build Consolidation Recoveries', function () {
187
- const sandbox = sinon.createSandbox();
188
- const baseAddr = testData.consolidationWrwUser.walletAddress0;
189
- const nonce = 123;
190
- beforeEach(function () {
191
- const accountInfoCB = sandbox.stub(src_1.Tao.prototype, 'getAccountInfo');
192
- accountInfoCB.withArgs(testData.consolidationWrwUser.walletAddress1).resolves({
193
- nonce: nonce,
194
- freeBalance: 10000000000,
195
- });
196
- accountInfoCB.withArgs(testData.consolidationWrwUser.walletAddress2).resolves({
197
- nonce: nonce,
198
- freeBalance: 1510000000000,
199
- });
200
- accountInfoCB.withArgs(testData.consolidationWrwUser.walletAddress3).resolves({
201
- nonce: nonce,
202
- freeBalance: 1510000000000,
203
- });
204
- const headerInfoCB = sandbox.stub(src_1.Tao.prototype, 'getHeaderInfo');
205
- headerInfoCB.resolves({
206
- headerNumber: testData.westendBlock.blockNumber,
207
- headerHash: testData.westendBlock.hash,
208
- });
209
- const getFeeCB = sandbox.stub(src_1.Tao.prototype, 'getFee');
210
- getFeeCB.withArgs(baseAddr, testData.consolidationWrwUser.walletAddress1, 10000000000).resolves(15783812856);
211
- getFeeCB.withArgs(baseAddr, testData.consolidationWrwUser.walletAddress2, 1510000000000).resolves(15783812856);
212
- getFeeCB.withArgs(baseAddr, testData.consolidationWrwUser.walletAddress3, 1510000000000).resolves(15783812856);
213
- });
214
- (0, mocha_1.afterEach)(function () {
215
- sandbox.restore();
216
- });
217
- it('should build signed consolidation recovery', async function () {
218
- const res = await baseCoin.recoverConsolidations({
219
- userKey: testData.consolidationWrwUser.userKey,
220
- backupKey: testData.consolidationWrwUser.backupKey,
221
- bitgoKey: testData.consolidationWrwUser.bitgoKey,
222
- walletPassphrase: testData.consolidationWrwUser.walletPassphrase,
223
- startingScanIndex: 1,
224
- endingScanIndex: 4,
225
- });
226
- res.should.not.be.empty();
227
- res.transactions.length.should.equal(2);
228
- // sandbox.assert.calledThrice(baseCoin.getAccountInfo);
229
- // sandbox.assert.calledTwice(baseCoin.getHeaderInfo);
230
- const txn1 = res.transactions[0];
231
- txn1.should.hasOwnProperty('serializedTx');
232
- txn1.should.hasOwnProperty('scanIndex');
233
- txn1.scanIndex.should.equal(2);
234
- const txBuilder1 = baseCoin.getBuilder().from(txn1.serializedTx);
235
- txBuilder1
236
- .validity({
237
- firstValid: testData.westendBlock.blockNumber,
238
- maxDuration: baseCoin.MAX_VALIDITY_DURATION,
239
- })
240
- .referenceBlock(testData.westendBlock.hash);
241
- const tx1 = await txBuilder1.build();
242
- const txJson1 = tx1.toJson();
243
- should_1.default.deepEqual(txJson1.sender, testData.consolidationWrwUser.walletAddress2);
244
- should_1.default.deepEqual(txJson1.blockNumber, testData.westendBlock.blockNumber);
245
- should_1.default.deepEqual(txJson1.referenceBlock, testData.westendBlock.hash);
246
- should_1.default.deepEqual(txJson1.genesisHash, resources_1.genesisHash);
247
- should_1.default.deepEqual(txJson1.specVersion, resources_1.specVersion);
248
- should_1.default.deepEqual(txJson1.nonce, nonce);
249
- should_1.default.deepEqual(txJson1.tip, 0);
250
- should_1.default.deepEqual(txJson1.transactionVersion, resources_1.txVersion);
251
- // should.deepEqual(txJson1.chainName, chainName);
252
- // eraPeriod will always round to the next upper power of 2 for any input value, in this case 2400.
253
- // 4096 is the "highest" value you can set, but the txn still may fail after 2400 blocks.
254
- const eraPeriod = 4096;
255
- should_1.default.deepEqual(txJson1.eraPeriod, eraPeriod);
256
- should_1.default.deepEqual(txJson1.to, baseAddr);
257
- res.lastScanIndex.should.equal(3);
258
- const txn2 = res.transactions[1];
259
- txn2.should.hasOwnProperty('serializedTx');
260
- txn2.should.hasOwnProperty('scanIndex');
261
- txn2.scanIndex.should.equal(3);
262
- const txBuilder2 = baseCoin.getBuilder().from(txn2.serializedTx);
263
- txBuilder2
264
- .validity({
265
- firstValid: testData.westendBlock.blockNumber,
266
- maxDuration: baseCoin.MAX_VALIDITY_DURATION,
267
- })
268
- .referenceBlock(testData.westendBlock.hash);
269
- const tx2 = await txBuilder2.build();
270
- const txJson2 = tx2.toJson();
271
- should_1.default.deepEqual(txJson2.sender, testData.consolidationWrwUser.walletAddress3);
272
- should_1.default.deepEqual(txJson2.blockNumber, testData.westendBlock.blockNumber);
273
- should_1.default.deepEqual(txJson2.referenceBlock, testData.westendBlock.hash);
274
- should_1.default.deepEqual(txJson2.genesisHash, resources_1.genesisHash);
275
- should_1.default.deepEqual(txJson2.specVersion, resources_1.specVersion);
276
- should_1.default.deepEqual(txJson2.nonce, nonce);
277
- should_1.default.deepEqual(txJson2.tip, 0);
278
- should_1.default.deepEqual(txJson2.transactionVersion, resources_1.txVersion);
279
- // should.deepEqual(txJson2.chainName, chainName);
280
- should_1.default.deepEqual(txJson2.eraPeriod, eraPeriod);
281
- should_1.default.deepEqual(txJson2.to, baseAddr);
282
- });
283
- it('should build unsigned consolidation recoveries', async function () {
284
- const res = await baseCoin.recoverConsolidations({
285
- bitgoKey: testData.consolidationWrwUser.bitgoKey,
286
- startingScanIndex: 1,
287
- endingScanIndex: 4,
288
- });
289
- res.should.not.be.empty();
290
- res.txRequests.length.should.equal(2);
291
- sandbox.assert.calledThrice(baseCoin.getAccountInfo);
292
- sandbox.assert.calledTwice(baseCoin.getHeaderInfo);
293
- const txn1 = res.txRequests[0].transactions[0].unsignedTx;
294
- txn1.should.hasOwnProperty('serializedTx');
295
- txn1.should.hasOwnProperty('signableHex');
296
- txn1.should.hasOwnProperty('scanIndex');
297
- txn1.scanIndex.should.equal(2);
298
- txn1.should.hasOwnProperty('coin');
299
- txn1.coin.should.equal('ttao');
300
- txn1.should.hasOwnProperty('derivationPath');
301
- txn1.derivationPath.should.equal('m/2');
302
- txn1.should.hasOwnProperty('coinSpecific');
303
- const coinSpecific1 = txn1.coinSpecific;
304
- coinSpecific1.should.hasOwnProperty('commonKeychain');
305
- coinSpecific1.should.hasOwnProperty('firstValid');
306
- coinSpecific1.firstValid.should.equal(testData.westendBlock.blockNumber);
307
- coinSpecific1.should.hasOwnProperty('maxDuration');
308
- coinSpecific1.maxDuration.should.equal(baseCoin.MAX_VALIDITY_DURATION);
309
- // deserialize the txn and verify the fields are what we expect
310
- const txBuilder1 = baseCoin.getBuilder().from(txn1.serializedTx);
311
- // some information isn't deserialized by the from method, so we will
312
- // supply it again in order to re-build the txn
313
- txBuilder1
314
- .validity({
315
- firstValid: testData.westendBlock.blockNumber,
316
- maxDuration: baseCoin.MAX_VALIDITY_DURATION,
317
- })
318
- .referenceBlock(testData.westendBlock.hash)
319
- .sender({ address: testData.consolidationWrwUser.walletAddress2 });
320
- const tx1 = await txBuilder1.build();
321
- const txJson1 = tx1.toJson();
322
- should_1.default.deepEqual(txJson1.sender, testData.consolidationWrwUser.walletAddress2);
323
- should_1.default.deepEqual(txJson1.blockNumber, testData.westendBlock.blockNumber);
324
- should_1.default.deepEqual(txJson1.referenceBlock, testData.westendBlock.hash);
325
- should_1.default.deepEqual(txJson1.genesisHash, resources_1.genesisHash);
326
- should_1.default.deepEqual(txJson1.specVersion, resources_1.specVersion);
327
- should_1.default.deepEqual(txJson1.nonce, nonce);
328
- should_1.default.deepEqual(txJson1.tip, 0);
329
- should_1.default.deepEqual(txJson1.transactionVersion, resources_1.txVersion);
330
- // should.deepEqual(txJson1.chainName, chainName);
331
- // eraPeriod will always round to the next upper power of 2 for any input value, in this case 2400.
332
- // 4096 is the "highest" value you can set, but the txn still may fail after 2400 blocks.
333
- const eraPeriod = 4096;
334
- should_1.default.deepEqual(txJson1.eraPeriod, eraPeriod);
335
- should_1.default.deepEqual(txJson1.to, baseAddr);
336
- const txn2 = res.txRequests[1].transactions[0].unsignedTx;
337
- txn2.should.hasOwnProperty('serializedTx');
338
- txn2.should.hasOwnProperty('signableHex');
339
- txn2.should.hasOwnProperty('scanIndex');
340
- txn2.scanIndex.should.equal(3);
341
- txn2.should.hasOwnProperty('coin');
342
- txn2.coin.should.equal('ttao');
343
- txn2.should.hasOwnProperty('derivationPath');
344
- txn2.derivationPath.should.equal('m/3');
345
- txn2.should.hasOwnProperty('coinSpecific');
346
- const coinSpecific2 = txn2.coinSpecific;
347
- coinSpecific2.should.hasOwnProperty('commonKeychain');
348
- coinSpecific2.should.hasOwnProperty('firstValid');
349
- coinSpecific2.firstValid.should.equal(testData.westendBlock.blockNumber);
350
- coinSpecific2.should.hasOwnProperty('maxDuration');
351
- coinSpecific2.maxDuration.should.equal(baseCoin.MAX_VALIDITY_DURATION);
352
- coinSpecific2.should.hasOwnProperty('commonKeychain');
353
- coinSpecific2.should.hasOwnProperty('lastScanIndex');
354
- coinSpecific2.lastScanIndex.should.equal(3);
355
- // deserialize the txn and verify the fields are what we expect
356
- const txBuilder2 = baseCoin.getBuilder().from(txn2.serializedTx);
357
- // some information isn't deserialized by the from method, so we will
358
- // supply it again in order to re-build the txn
359
- txBuilder2
360
- .validity({
361
- firstValid: testData.westendBlock.blockNumber,
362
- maxDuration: baseCoin.MAX_VALIDITY_DURATION,
363
- })
364
- .referenceBlock(testData.westendBlock.hash)
365
- .sender({ address: testData.consolidationWrwUser.walletAddress3 });
366
- const tx2 = await txBuilder2.build();
367
- const txJson2 = tx2.toJson();
368
- should_1.default.deepEqual(txJson2.sender, testData.consolidationWrwUser.walletAddress3);
369
- should_1.default.deepEqual(txJson2.blockNumber, testData.westendBlock.blockNumber);
370
- should_1.default.deepEqual(txJson2.referenceBlock, testData.westendBlock.hash);
371
- should_1.default.deepEqual(txJson2.genesisHash, resources_1.genesisHash);
372
- should_1.default.deepEqual(txJson2.specVersion, resources_1.specVersion);
373
- should_1.default.deepEqual(txJson2.nonce, nonce);
374
- should_1.default.deepEqual(txJson2.tip, 0);
375
- should_1.default.deepEqual(txJson2.transactionVersion, resources_1.txVersion);
376
- // should.deepEqual(txJson2.chainName, chainName);
377
- should_1.default.deepEqual(txJson2.eraPeriod, eraPeriod);
378
- should_1.default.deepEqual(txJson2.to, baseAddr);
379
- });
380
- it('should skip building consolidate transaction if balance is equal to zero', async function () {
381
- await baseCoin
382
- .recoverConsolidations({
383
- userKey: testData.consolidationWrwUser.userKey,
384
- backupKey: testData.consolidationWrwUser.backupKey,
385
- bitgoKey: testData.consolidationWrwUser.bitgoKey,
386
- walletPassphrase: testData.consolidationWrwUser.walletPassphrase,
387
- startingScanIndex: 1,
388
- endingScanIndex: 2,
389
- })
390
- .should.rejectedWith('Did not find an address with funds to recover');
391
- });
392
- it('should throw if startingScanIndex is not ge to 1', async () => {
393
- await baseCoin
394
- .recoverConsolidations({
395
- userKey: testData.consolidationWrwUser.userKey,
396
- backupKey: testData.consolidationWrwUser.backupKey,
397
- bitgoKey: testData.consolidationWrwUser.bitgoKey,
398
- startingScanIndex: -1,
399
- })
400
- .should.be.rejectedWith('Invalid starting or ending index to scan for addresses. startingScanIndex: -1, endingScanIndex: 19.');
401
- });
402
- it('should throw if scan factor is too high', async () => {
403
- await baseCoin
404
- .recoverConsolidations({
405
- userKey: testData.consolidationWrwUser.userKey,
406
- backupKey: testData.consolidationWrwUser.backupKey,
407
- bitgoKey: testData.consolidationWrwUser.bitgoKey,
408
- startingScanIndex: 1,
409
- endingScanIndex: 300,
410
- })
411
- .should.be.rejectedWith('Invalid starting or ending index to scan for addresses. startingScanIndex: 1, endingScanIndex: 300.');
412
- });
413
- });
414
- });
415
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3Rhby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixtREFBK0Q7QUFDL0QsaURBQStDO0FBQy9DLG1DQUFzQztBQUN0Qyw2Q0FBK0I7QUFDL0IscURBQXVDO0FBQ3ZDLDRDQUFtRTtBQUNuRSxpQ0FBa0M7QUFFbEMsUUFBUSxDQUFDLE1BQU0sRUFBRTtJQUNmLElBQUksS0FBbUIsQ0FBQztJQUN4QixJQUFJLFFBQVEsQ0FBQztJQUViLE1BQU0sQ0FBQztRQUNMLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxrQkFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEQsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzlDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFVBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNoRCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQVMsQ0FBQztJQUN4QyxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUU7UUFDckMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sbUJBQW1CLEdBQUcsa0RBQWtELENBQUM7UUFDL0UsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLElBQUksYUFBYSxDQUFDO1FBQ2xCLElBQUksWUFBWSxDQUFDO1FBQ2pCLElBQUksUUFBUSxDQUFDO1FBRWIsVUFBVSxDQUFDO1lBQ1QsYUFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBRyxDQUFDLFNBQVMsRUFBRSxnQkFBNkIsQ0FBQyxDQUFDO1lBQzNFLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQUcsQ0FBQyxTQUFTLEVBQUUsZUFBNEIsQ0FBQyxDQUFDO1lBQ3pFLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQUcsQ0FBQyxTQUFTLEVBQUUsUUFBcUIsQ0FBQyxDQUFDO1lBRTlELFFBQVEsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMscUJBQXFCO1FBQ3JJLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxpQkFBUyxFQUFDO1lBQ1IsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLEtBQUs7WUFDbEQsYUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNsSCxZQUFZLENBQUMsUUFBUSxDQUFDO2dCQUNwQixZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXO2dCQUMvQyxVQUFVLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJO2FBQ3ZDLENBQUMsQ0FBQztZQUVILE1BQU0sY0FBYyxHQUNsQixrSUFBa0ksQ0FBQyxDQUFDLDZCQUE2QjtZQUVuSyxNQUFNLFFBQVEsR0FBRyxNQUFNLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQztZQUUzRixRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzlDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0MsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0QsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN2RCxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDNUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN6RixRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDeEYsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JGLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDckYsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDNUYsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekYsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ3ZGLGtEQUFrRCxDQUNuRCxDQUFDO1lBQ0YsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDNUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDcEcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDN0YsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUYsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ3hGLGtEQUFrRCxDQUNuRCxDQUFDO1lBQ0YsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDN0csUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqRixRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BGLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0RixRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3pGLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUYsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZ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QkFDWCxxQkFBcUIsQ0FBQztnQkFDckIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPO2dCQUM5QyxTQUFTLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFNBQVM7Z0JBQ2xELFFBQVEsRUFBRSxRQUFRLENBQUMsb0JBQW9CLENBQUMsUUFBUTtnQkFDaEQsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO2FBQ3RCLENBQUM7aUJBQ0QsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQ3JCLHFHQUFxRyxDQUN0RyxDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMseUNBQXlDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDdkQsTUFBTSxRQUFRO2lCQUNYLHFCQUFxQixDQUFDO2dCQUNyQixPQUFPLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixDQUFDLE9BQU87Z0JBQzlDLFNBQVMsRUFBRSxRQUFRLENBQUMsb0JBQW9CLENBQUMsU0FBUztnQkFDbEQsUUFBUSxFQUFFLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRO2dCQUNoRCxpQkFBaUIsRUFBRSxDQUFDO2dCQUNwQixlQUFlLEVBQUUsR0FBRzthQUNyQixDQUFDO2lCQUNELE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUNyQixxR0FBcUcsQ0FDdEcsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRlc3RCaXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstYXBpJztcbmltcG9ydCB7IFRhbywgVHRhbyB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuL2ZpeHR1cmVzJztcbmltcG9ydCB7IHR4VmVyc2lvbiwgZ2VuZXNpc0hhc2gsIHNwZWNWZXJzaW9uIH0gZnJvbSAnLi4vcmVzb3VyY2VzJztcbmltcG9ydCB7IGFmdGVyRWFjaCB9IGZyb20gJ21vY2hhJztcblxuZGVzY3JpYmUoJ1RhbzonLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBiaXRnbzogVGVzdEJpdEdvQVBJO1xuICBsZXQgYmFzZUNvaW47XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwgeyBlbnY6ICdtb2NrJyB9KTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3RhbycsIFRhby5jcmVhdGVJbnN0YW5jZSk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCd0dGFvJywgVHRhby5jcmVhdGVJbnN0YW5jZSk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgYmFzZUNvaW4gPSBiaXRnby5jb2luKCd0dGFvJykgYXMgVHRhbztcbiAgfSk7XG5cbiAgZGVzY3JpYmUuc2tpcCgnUmVjb3ZlciBUcmFuc2FjdGlvbnM6JywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHNhbmRCb3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgY29uc3QgcmVjb3ZlcnlEZXN0aW5hdGlvbiA9ICc1RkoxOHl3ZnJXdVJpZk55YzhhUHdRNWl1bTE5RmVmd214MThINFhZa0RjMzZGMkEnO1xuICAgIGNvbnN0IG5vbmNlID0gMjtcbiAgICBsZXQgYWNjb3VudEluZm9DQjtcbiAgICBsZXQgaGVhZGVySW5mb0NCO1xuICAgIGxldCBnZXRGZWVDQjtcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgYWNjb3VudEluZm9DQiA9IHNhbmRCb3guc3R1YihUYW8ucHJvdG90eXBlLCAnZ2V0QWNjb3VudEluZm8nIGFzIGtleW9mIFRhbyk7XG4gICAgICBoZWFkZXJJbmZvQ0IgPSBzYW5kQm94LnN0dWIoVGFvLnByb3RvdHlwZSwgJ2dldEhlYWRlckluZm8nIGFzIGtleW9mIFRhbyk7XG4gICAgICBnZXRGZWVDQiA9IHNhbmRCb3guc3R1YihUYW8ucHJvdG90eXBlLCAnZ2V0RmVlJyBhcyBrZXlvZiBUYW8pO1xuXG4gICAgICBnZXRGZWVDQi53aXRoQXJncyhyZWNvdmVyeURlc3RpbmF0aW9uLCB0ZXN0RGF0YS53cndVc2VyLndhbGxldEFkZHJlc3MwLCAxNTEwMDAwMDAwMDAwKS5yZXNvbHZlcygxNTc4MzgxMjg1Nik7IC8vIFRPREQ6IHVzZSBpdCBsYXRlclxuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNhbmRCb3gucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSB1bnNpZ25lZCBzd2VlcCBjb3JyZWN0bHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhY2NvdW50SW5mb0NCLndpdGhBcmdzKHRlc3REYXRhLnVuc2lnbmVkU3dlZXBVc2VyLndhbGxldEFkZHJlc3MwKS5yZXNvbHZlcyh7IG5vbmNlOiAxLCBmcmVlQmFsYW5jZTogMjk4OTg2NDczOSB9KTtcbiAgICAgIGhlYWRlckluZm9DQi5yZXNvbHZlcyh7XG4gICAgICAgIGhlYWRlck51bWJlcjogdGVzdERhdGEud2VzdGVuZEJsb2NrLmJsb2NrTnVtYmVyLFxuICAgICAgICBoZWFkZXJIYXNoOiB0ZXN0RGF0YS53ZXN0ZW5kQmxvY2suaGFzaCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBjb21tb25LZXlDaGFpbiA9XG4gICAgICAgICdkNGE1NzBjMTgzMWM3MDI0Y2I3MjUzM2U0MjY5MGNlYzlkOTE1MGI5YWFjNTkwMDFjNGE1YTNhMjg1NTE4MjYzYTllODlmMWM3MDliY2IxZTgzMmYyZmY1MTY5ZmVjZDQ5Njg4MWJhODk3MGY2OWQ1YWRjOTc3YmE0Nzk5ZmVkYic7IC8vIFRPRE86IGFkZCBjb21tb24ga2V5IGNoYWluXG5cbiAgICAgIGNvbnN0IHVuc2lnbmVkID0gYXdhaXQgYmFzZUNvaW4ucmVjb3Zlcih7IGJpdGdvS2V5OiBjb21tb25LZXlDaGFpbiwgcmVjb3ZlcnlEZXN0aW5hdGlvbiB9KTtcblxuICAgICAgdW5zaWduZWQudHhSZXF1ZXN0cy5zaG91bGQubm90LmJlLnVuZGVmaW5lZCgpO1xuICAgICAgdW5zaWduZWQudHhSZXF1ZXN0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdW5zaWduZWQudHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHVuc2lnbmVkLnR4UmVxdWVzdHNbMF0ud2FsbGV0Q29pbi5zaG91bGQuZXF1YWwoJ3R0YW8nKTtcbiAgICAgIHVuc2lnbmVkLnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguc2hvdWxkLm5vdC5iZS51bmRlZmluZWQoKTtcbiAgICAgIHVuc2lnbmVkLnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguc2VyaWFsaXplZFR4LnNob3VsZC5ub3QuYmUudW5kZWZpbmVkKCk7XG4gICAgICB1bnNpZ25lZC50eFJlcXVlc3RzWzBdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LnNjYW5JbmRleC5zaG91bGQuZXF1YWwoMCk7XG4gICAgICB1bnNpZ25lZC50eFJlcXVlc3RzWzBdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LmNvaW4uc2hvdWxkLmVxdWFsKCd0dGFvJyk7XG4gICAgICB1bnNpZ25lZC50eFJlcXVlc3RzWzBdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LnNpZ25hYmxlSGV4LnNob3VsZC5ub3QuYmUudW5kZWZpbmVkKCk7XG4gICAgICB1bnNpZ25lZC50eFJlcXVlc3RzWzBdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LmRlcml2YXRpb25QYXRoLnNob3VsZC5lcXVhbCgnbS8wJyk7XG4gICAgICB1bnNpZ25lZC50eFJlcXVlc3RzWzBdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LnBhcnNlZFR4LnNob3VsZC5ub3QuYmUudW5kZWZpbmVkKCk7XG4gICAgICB1bnNpZ25lZC50eFJlcXVlc3RzWzBdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LnBhcnNlZFR4LmlucHV0cy5zaG91bGQubm90LmJlLnVuZGVmaW5lZCgpO1xuICAgICAgdW5zaWduZWQudHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5wYXJzZWRUeC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHVuc2lnbmVkLnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHgucGFyc2VkVHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKFxuICAgICAgICAnNUVocDZyUktwNHpaeFczemg0U1VBNzl6RWo1R0RYdU5oVHk3eTdnMTJEVDJraDRDJ1xuICAgICAgKTtcbiAgICAgIHVuc2lnbmVkLnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHgucGFyc2VkVHguaW5wdXRzWzBdLnZhbHVlU3RyaW5nLnNob3VsZC5lcXVhbCgnMjk4OTg2NDczOScpO1xuICAgICAgdW5zaWduZWQudHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5wYXJzZWRUeC5pbnB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKDI5ODk4NjQ3MzkpO1xuICAgICAgdW5zaWduZWQudHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5wYXJzZWRUeC5vdXRwdXRzLnNob3VsZC5ub3QuYmUudW5kZWZpbmVkKCk7XG4gICAgICB1bnNpZ25lZC50eFJlcXVlc3RzWzBdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LnBhcnNlZFR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHVuc2lnbmVkLnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHgucGFyc2VkVHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbChcbiAgICAgICAgJzVGSjE4eXdmcld1UmlmTnljOGFQd1E1aXVtMTlGZWZ3bXgxOEg0WFlrRGMzNkYyQSdcbiAgICAgICk7XG4gICAgICB1bnNpZ25lZC50eFJlcXVlc3RzWzBdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LnBhcnNlZFR4Lm91dHB1dHNbMF0udmFsdWVTdHJpbmcuc2hvdWxkLmVxdWFsKCcyOTg5ODY0NzM5Jyk7XG4gICAgICB1bnNpZ25lZC50eFJlcXVlc3RzWzBdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LnBhcnNlZFR4Lm91dHB1dHNbMF0uY29pbk5hbWUuc2hvdWxkLmVxdWFsKCd0dGFvJyk7XG4gICAgICB1bnNpZ25lZC50eFJlcXVlc3RzWzBdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LnBhcnNlZFR4LnR5cGUuc2hvdWxkLmVxdWFsKCcnKTtcbiAgICAgIHVuc2lnbmVkLnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguZmVlSW5mby5zaG91bGQubm90LmJlLnVuZGVmaW5lZCgpO1xuICAgICAgdW5zaWduZWQudHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5mZWVJbmZvLmZlZS5zaG91bGQuZXF1YWwoMCk7XG4gICAgICB1bnNpZ25lZC50eFJlcXVlc3RzWzBdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LmZlZUluZm8uZmVlU3RyaW5nLnNob3VsZC5lcXVhbCgnMCcpO1xuICAgICAgdW5zaWduZWQudHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5jb2luU3BlY2lmaWMuc2hvdWxkLm5vdC5iZS51bmRlZmluZWQoKTtcbiAgICAgIHVuc2lnbmVkLnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguY29pblNwZWNpZmljLmZpcnN0VmFsaWQuc2hvdWxkLm5vdC5iZS51bmRlZmluZWQoKTtcbiAgICAgIHVuc2lnbmVkLnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguY29pblNwZWNpZmljLm1heER1cmF0aW9uLnNob3VsZC5lcXVhbCgyNDAwKTtcbiAgICAgIHVuc2lnbmVkLnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguY29pblNwZWNpZmljLmNvbW1vbktleWNoYWluLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ2Q0YTU3MGMxODMxYzcwMjRjYjcyNTMzZTQyNjkwY2VjOWQ5MTUwYjlhYWM1OTAwMWM0YTVhM2EyODU1MTgyNjNhOWU4OWYxYzcwOWJjYjFlODMyZjJmZjUxNjlmZWNkNDk2ODgxYmE4OTcwZjY5ZDVhZGM5NzdiYTQ3OTlmZWRiJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVjb3ZlciBhIHR4IGZvciBub24tYml0Z28gcmVjb3ZlcmllcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFjY291bnRJbmZvQ0Iud2l0aEFyZ3ModGVzdERhdGEud3J3VXNlci53YWxsZXRBZGRyZXNzMCkucmVzb2x2ZXMoeyBub25jZTogMiwgZnJlZUJhbGFuY2U6IDEwMDAwMTg1MyB9KTtcbiAgICAgIGhlYWRlckluZm9DQi5yZXNvbHZlcyh7XG4gICAgICAgIGhlYWRlck51bWJlcjogdGVzdERhdGEud2VzdGVuZEJsb2NrLmJsb2NrTnVtYmVyLFxuICAgICAgICBoZWFkZXJIYXNoOiB0ZXN0RGF0YS53ZXN0ZW5kQmxvY2suaGFzaCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNlQ29pbi5yZWNvdmVyKHtcbiAgICAgICAgdXNlcktleTogdGVzdERhdGEud3J3VXNlci51c2VyS2V5LFxuICAgICAgICBiYWNrdXBLZXk6IHRlc3REYXRhLndyd1VzZXIuYmFja3VwS2V5LFxuICAgICAgICBiaXRnb0tleTogdGVzdERhdGEud3J3VXNlci5iaXRnb0tleSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogdGVzdERhdGEud3J3VXNlci53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgfSk7XG5cbiAgICAgIHJlcy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG4gICAgICByZXMuc2hvdWxkLmhhc093blByb3BlcnR5KCdzZXJpYWxpemVkVHgnKTtcbiAgICAgIHJlcy5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3NjYW5JbmRleCcpO1xuICAgICAgLy8gc2FuZEJveC5hc3NlcnQuY2FsbGVkT25jZShiYXNlQ29pbi5nZXRBY2NvdW50SW5mbyk7XG4gICAgICAvLyBzYW5kQm94LmFzc2VydC5jYWxsZWRPbmNlKGJhc2VDb2luLmdldEhlYWRlckluZm8pO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBiYXNlQ29pbi5nZXRCdWlsZGVyKCkuZnJvbShyZXMuc2VyaWFsaXplZFR4KTtcbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAudmFsaWRpdHkoe1xuICAgICAgICAgIGZpcnN0VmFsaWQ6IHRlc3REYXRhLndlc3RlbmRCbG9jay5ibG9ja051bWJlcixcbiAgICAgICAgICBtYXhEdXJhdGlvbjogYmFzZUNvaW4uU1dFRVBfVFhOX0RVUkFUSU9OLFxuICAgICAgICB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2sodGVzdERhdGEud2VzdGVuZEJsb2NrLmhhc2gpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5zZW5kZXIsIHRlc3REYXRhLndyd1VzZXIud2FsbGV0QWRkcmVzczApO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uYmxvY2tOdW1iZXIsIHRlc3REYXRhLndlc3RlbmRCbG9jay5ibG9ja051bWJlcik7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5yZWZlcmVuY2VCbG9jaywgdGVzdERhdGEud2VzdGVuZEJsb2NrLmhhc2gpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZ2VuZXNpc0hhc2gsIGdlbmVzaXNIYXNoKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnNwZWNWZXJzaW9uLCBzcGVjVmVyc2lvbik7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5ub25jZSwgbm9uY2UpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24udGlwLCAwKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnRyYW5zYWN0aW9uVmVyc2lvbiwgdHhWZXJzaW9uKTtcbiAgICAgIC8vIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmNoYWluTmFtZSwgY2hhaW5OYW1lKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmVyYVBlcmlvZCwgYmFzZUNvaW4uU1dFRVBfVFhOX0RVUkFUSU9OKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVjb3ZlciBhIHR4biBmb3IgdW5zaWduZWQtc3dlZXAgcmVjb3ZlcmllcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFjY291bnRJbmZvQ0Iud2l0aEFyZ3ModGVzdERhdGEudW5zaWduZWRTd2VlcFVzZXIud2FsbGV0QWRkcmVzczApLnJlc29sdmVzKHsgbm9uY2U6IDEsIGZyZWVCYWxhbmNlOiAyOTg5ODY0NzM5IH0pO1xuICAgICAgaGVhZGVySW5mb0NCLnJlc29sdmVzKHtcbiAgICAgICAgaGVhZGVyTnVtYmVyOiB0ZXN0RGF0YS53ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIsXG4gICAgICAgIGhlYWRlckhhc2g6IHRlc3REYXRhLndlc3RlbmRCbG9jay5oYXNoLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2VDb2luLnJlY292ZXIoe1xuICAgICAgICBiaXRnb0tleTogdGVzdERhdGEudW5zaWduZWRTd2VlcFVzZXIuYml0Z29LZXksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICB9KTtcblxuICAgICAgcmVzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHJlcy50eFJlcXVlc3RzWzBdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnc2VyaWFsaXplZFR4Jyk7XG4gICAgICByZXMudHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3NjYW5JbmRleCcpO1xuICAgICAgLy8gc2FuZEJveC5hc3NlcnQuY2FsbGVkT25jZShiYXNlQ29pbi5nZXRBY2NvdW50SW5mbyk7XG4gICAgICAvLyBzYW5kQm94LmFzc2VydC5jYWxsZWRPbmNlKGJhc2VDb2luLmdldEhlYWRlckluZm8pO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBiYXNlQ29pbi5nZXRCdWlsZGVyKCkuZnJvbShyZXMudHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5zZXJpYWxpemVkVHgpO1xuICAgICAgdHhCdWlsZGVyXG4gICAgICAgIC52YWxpZGl0eSh7XG4gICAgICAgICAgZmlyc3RWYWxpZDogdGVzdERhdGEud2VzdGVuZEJsb2NrLmJsb2NrTnVtYmVyLFxuICAgICAgICAgIG1heER1cmF0aW9uOiBiYXNlQ29pbi5TV0VFUF9UWE5fRFVSQVRJT04sXG4gICAgICAgIH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayh0ZXN0RGF0YS53ZXN0ZW5kQmxvY2suaGFzaClcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHRlc3REYXRhLnVuc2lnbmVkU3dlZXBVc2VyLndhbGxldEFkZHJlc3MwIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5zZW5kZXIsIHRlc3REYXRhLnVuc2lnbmVkU3dlZXBVc2VyLndhbGxldEFkZHJlc3MwKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmJsb2NrTnVtYmVyLCB0ZXN0RGF0YS53ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucmVmZXJlbmNlQmxvY2ssIHRlc3REYXRhLndlc3RlbmRCbG9jay5oYXNoKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmdlbmVzaXNIYXNoLCBnZW5lc2lzSGFzaCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5zcGVjVmVyc2lvbiwgc3BlY1ZlcnNpb24pO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ubm9uY2UsIDEpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24udGlwLCAwKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnRyYW5zYWN0aW9uVmVyc2lvbiwgdHhWZXJzaW9uKTtcbiAgICAgIC8vIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmNoYWluTmFtZSwgY2hhaW5OYW1lKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmVyYVBlcmlvZCwgYmFzZUNvaW4uU1dFRVBfVFhOX0RVUkFUSU9OKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUuc2tpcCgnQnVpbGQgQ29uc29saWRhdGlvbiBSZWNvdmVyaWVzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHNhbmRib3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgY29uc3QgYmFzZUFkZHIgPSB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uV3J3VXNlci53YWxsZXRBZGRyZXNzMDtcbiAgICBjb25zdCBub25jZSA9IDEyMztcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWNjb3VudEluZm9DQiA9IHNhbmRib3guc3R1YihUYW8ucHJvdG90eXBlLCAnZ2V0QWNjb3VudEluZm8nIGFzIGtleW9mIFRhbyk7XG4gICAgICBhY2NvdW50SW5mb0NCLndpdGhBcmdzKHRlc3REYXRhLmNvbnNvbGlkYXRpb25XcndVc2VyLndhbGxldEFkZHJlc3MxKS5yZXNvbHZlcyh7XG4gICAgICAgIG5vbmNlOiBub25jZSxcbiAgICAgICAgZnJlZUJhbGFuY2U6IDEwMDAwMDAwMDAwLFxuICAgICAgfSk7XG4gICAgICBhY2NvdW50SW5mb0NCLndpdGhBcmdzKHRlc3REYXRhLmNvbnNvbGlkYXRpb25XcndVc2VyLndhbGxldEFkZHJlc3MyKS5yZXNvbHZlcyh7XG4gICAgICAgIG5vbmNlOiBub25jZSxcbiAgICAgICAgZnJlZUJhbGFuY2U6IDE1MTAwMDAwMDAwMDAsXG4gICAgICB9KTtcbiAgICAgIGFjY291bnRJbmZvQ0Iud2l0aEFyZ3ModGVzdERhdGEuY29uc29saWRhdGlvbldyd1VzZXIud2FsbGV0QWRkcmVzczMpLnJlc29sdmVzKHtcbiAgICAgICAgbm9uY2U6IG5vbmNlLFxuICAgICAgICBmcmVlQmFsYW5jZTogMTUxMDAwMDAwMDAwMCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgaGVhZGVySW5mb0NCID0gc2FuZGJveC5zdHViKFRhby5wcm90b3R5cGUsICdnZXRIZWFkZXJJbmZvJyBhcyBrZXlvZiBUYW8pO1xuICAgICAgaGVhZGVySW5mb0NCLnJlc29sdmVzKHtcbiAgICAgICAgaGVhZGVyTnVtYmVyOiB0ZXN0RGF0YS53ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIsXG4gICAgICAgIGhlYWRlckhhc2g6IHRlc3REYXRhLndlc3RlbmRCbG9jay5oYXNoLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBnZXRGZWVDQiA9IHNhbmRib3guc3R1YihUYW8ucHJvdG90eXBlLCAnZ2V0RmVlJyBhcyBrZXlvZiBUYW8pO1xuICAgICAgZ2V0RmVlQ0Iud2l0aEFyZ3MoYmFzZUFkZHIsIHRlc3REYXRhLmNvbnNvbGlkYXRpb25XcndVc2VyLndhbGxldEFkZHJlc3MxLCAxMDAwMDAwMDAwMCkucmVzb2x2ZXMoMTU3ODM4MTI4NTYpO1xuICAgICAgZ2V0RmVlQ0Iud2l0aEFyZ3MoYmFzZUFkZHIsIHRlc3REYXRhLmNvbnNvbGlkYXRpb25XcndVc2VyLndhbGxldEFkZHJlc3MyLCAxNTEwMDAwMDAwMDAwKS5yZXNvbHZlcygxNTc4MzgxMjg1Nik7XG4gICAgICBnZXRGZWVDQi53aXRoQXJncyhiYXNlQWRkciwgdGVzdERhdGEuY29uc29saWRhdGlvbldyd1VzZXIud2FsbGV0QWRkcmVzczMsIDE1MTAwMDAwMDAwMDApLnJlc29sdmVzKDE1NzgzODEyODU2KTtcbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzYW5kYm94LnJlc3RvcmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgc2lnbmVkIGNvbnNvbGlkYXRpb24gcmVjb3ZlcnknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNlQ29pbi5yZWNvdmVyQ29uc29saWRhdGlvbnMoe1xuICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uV3J3VXNlci51c2VyS2V5LFxuICAgICAgICBiYWNrdXBLZXk6IHRlc3REYXRhLmNvbnNvbGlkYXRpb25XcndVc2VyLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IHRlc3REYXRhLmNvbnNvbGlkYXRpb25XcndVc2VyLmJpdGdvS2V5LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uV3J3VXNlci53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogMSxcbiAgICAgICAgZW5kaW5nU2NhbkluZGV4OiA0LFxuICAgICAgfSk7XG5cbiAgICAgIHJlcy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG4gICAgICByZXMudHJhbnNhY3Rpb25zLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgICAvLyBzYW5kYm94LmFzc2VydC5jYWxsZWRUaHJpY2UoYmFzZUNvaW4uZ2V0QWNjb3VudEluZm8pO1xuICAgICAgLy8gc2FuZGJveC5hc3NlcnQuY2FsbGVkVHdpY2UoYmFzZUNvaW4uZ2V0SGVhZGVySW5mbyk7XG5cbiAgICAgIGNvbnN0IHR4bjEgPSByZXMudHJhbnNhY3Rpb25zWzBdO1xuICAgICAgdHhuMS5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3NlcmlhbGl6ZWRUeCcpO1xuICAgICAgdHhuMS5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3NjYW5JbmRleCcpO1xuICAgICAgdHhuMS5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyMSA9IGJhc2VDb2luLmdldEJ1aWxkZXIoKS5mcm9tKHR4bjEuc2VyaWFsaXplZFR4KTtcbiAgICAgIHR4QnVpbGRlcjFcbiAgICAgICAgLnZhbGlkaXR5KHtcbiAgICAgICAgICBmaXJzdFZhbGlkOiB0ZXN0RGF0YS53ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIsXG4gICAgICAgICAgbWF4RHVyYXRpb246IGJhc2VDb2luLk1BWF9WQUxJRElUWV9EVVJBVElPTixcbiAgICAgICAgfSlcbiAgICAgICAgLnJlZmVyZW5jZUJsb2NrKHRlc3REYXRhLndlc3RlbmRCbG9jay5oYXNoKTtcbiAgICAgIGNvbnN0IHR4MSA9IGF3YWl0IHR4QnVpbGRlcjEuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbjEgPSB0eDEudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbjEuc2VuZGVyLCB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uV3J3VXNlci53YWxsZXRBZGRyZXNzMik7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbjEuYmxvY2tOdW1iZXIsIHRlc3REYXRhLndlc3RlbmRCbG9jay5ibG9ja051bWJlcik7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbjEucmVmZXJlbmNlQmxvY2ssIHRlc3REYXRhLndlc3RlbmRCbG9jay5oYXNoKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uMS5nZW5lc2lzSGFzaCwgZ2VuZXNpc0hhc2gpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24xLnNwZWNWZXJzaW9uLCBzcGVjVmVyc2lvbik7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbjEubm9uY2UsIG5vbmNlKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uMS50aXAsIDApO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24xLnRyYW5zYWN0aW9uVmVyc2lvbiwgdHhWZXJzaW9uKTtcbiAgICAgIC8vIHNob3VsZC5kZWVwRXF1YWwodHhKc29uMS5jaGFpbk5hbWUsIGNoYWluTmFtZSk7XG4gICAgICAvLyBlcmFQZXJpb2Qgd2lsbCBhbHdheXMgcm91bmQgdG8gdGhlIG5leHQgdXBwZXIgcG93ZXIgb2YgMiBmb3IgYW55IGlucHV0IHZhbHVlLCBpbiB0aGlzIGNhc2UgMjQwMC5cbiAgICAgIC8vIDQwOTYgaXMgdGhlIFwiaGlnaGVzdFwiIHZhbHVlIHlvdSBjYW4gc2V0LCBidXQgdGhlIHR4biBzdGlsbCBtYXkgZmFpbCBhZnRlciAyNDAwIGJsb2Nrcy5cbiAgICAgIGNvbnN0IGVyYVBlcmlvZCA9IDQwOTY7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbjEuZXJhUGVyaW9kLCBlcmFQZXJpb2QpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24xLnRvLCBiYXNlQWRkcik7XG5cbiAgICAgIHJlcy5sYXN0U2NhbkluZGV4LnNob3VsZC5lcXVhbCgzKTtcbiAgICAgIGNvbnN0IHR4bjIgPSByZXMudHJhbnNhY3Rpb25zWzFdO1xuICAgICAgdHhuMi5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3NlcmlhbGl6ZWRUeCcpO1xuICAgICAgdHhuMi5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3NjYW5JbmRleCcpO1xuICAgICAgdHhuMi5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDMpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGJhc2VDb2luLmdldEJ1aWxkZXIoKS5mcm9tKHR4bjIuc2VyaWFsaXplZFR4KTtcbiAgICAgIHR4QnVpbGRlcjJcbiAgICAgICAgLnZhbGlkaXR5KHtcbiAgICAgICAgICBmaXJzdFZhbGlkOiB0ZXN0RGF0YS53ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIsXG4gICAgICAgICAgbWF4RHVyYXRpb246IGJhc2VDb2luLk1BWF9WQUxJRElUWV9EVVJBVElPTixcbiAgICAgICAgfSlcbiAgICAgICAgLnJlZmVyZW5jZUJsb2NrKHRlc3REYXRhLndlc3RlbmRCbG9jay5oYXNoKTtcbiAgICAgIGNvbnN0IHR4MiA9IGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbjIgPSB0eDIudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbjIuc2VuZGVyLCB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uV3J3VXNlci53YWxsZXRBZGRyZXNzMyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbjIuYmxvY2tOdW1iZXIsIHRlc3REYXRhLndlc3RlbmRCbG9jay5ibG9ja051bWJlcik7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbjIucmVmZXJlbmNlQmxvY2ssIHRlc3REYXRhLndlc3RlbmRCbG9jay5oYXNoKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uMi5nZW5lc2lzSGFzaCwgZ2VuZXNpc0hhc2gpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24yLnNwZWNWZXJzaW9uLCBzcGVjVmVyc2lvbik7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbjIubm9uY2UsIG5vbmNlKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uMi50aXAsIDApO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24yLnRyYW5zYWN0aW9uVmVyc2lvbiwgdHhWZXJzaW9uKTtcbiAgICAgIC8vIHNob3VsZC5kZWVwRXF1YWwodHhKc29uMi5jaGFpbk5hbWUsIGNoYWluTmFtZSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbjIuZXJhUGVyaW9kLCBlcmFQZXJpb2QpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24yLnRvLCBiYXNlQWRkcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHVuc2lnbmVkIGNvbnNvbGlkYXRpb24gcmVjb3ZlcmllcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2VDb2luLnJlY292ZXJDb25zb2xpZGF0aW9ucyh7XG4gICAgICAgIGJpdGdvS2V5OiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uV3J3VXNlci5iaXRnb0tleSxcbiAgICAgICAgc3RhcnRpbmdTY2FuSW5kZXg6IDEsXG4gICAgICAgIGVuZGluZ1NjYW5JbmRleDogNCxcbiAgICAgIH0pO1xuICAgICAgcmVzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHJlcy50eFJlcXVlc3RzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgICBzYW5kYm94LmFzc2VydC5jYWxsZWRUaHJpY2UoYmFzZUNvaW4uZ2V0QWNjb3VudEluZm8pO1xuICAgICAgc2FuZGJveC5hc3NlcnQuY2FsbGVkVHdpY2UoYmFzZUNvaW4uZ2V0SGVhZGVySW5mbyk7XG5cbiAgICAgIGNvbnN0IHR4bjEgPSByZXMudHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeDtcbiAgICAgIHR4bjEuc2hvdWxkLmhhc093blByb3BlcnR5KCdzZXJpYWxpemVkVHgnKTtcbiAgICAgIHR4bjEuc2hvdWxkLmhhc093blByb3BlcnR5KCdzaWduYWJsZUhleCcpO1xuICAgICAgdHhuMS5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3NjYW5JbmRleCcpO1xuICAgICAgdHhuMS5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgdHhuMS5zaG91bGQuaGFzT3duUHJvcGVydHkoJ2NvaW4nKTtcbiAgICAgIHR4bjEuY29pbi5zaG91bGQuZXF1YWwoJ3R0YW8nKTtcbiAgICAgIHR4bjEuc2hvdWxkLmhhc093blByb3BlcnR5KCdkZXJpdmF0aW9uUGF0aCcpO1xuICAgICAgdHhuMS5kZXJpdmF0aW9uUGF0aC5zaG91bGQuZXF1YWwoJ20vMicpO1xuXG4gICAgICB0eG4xLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnY29pblNwZWNpZmljJyk7XG4gICAgICBjb25zdCBjb2luU3BlY2lmaWMxID0gdHhuMS5jb2luU3BlY2lmaWM7XG4gICAgICBjb2luU3BlY2lmaWMxLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnY29tbW9uS2V5Y2hhaW4nKTtcbiAgICAgIGNvaW5TcGVjaWZpYzEuc2hvdWxkLmhhc093blByb3BlcnR5KCdmaXJzdFZhbGlkJyk7XG4gICAgICBjb2luU3BlY2lmaWMxLmZpcnN0VmFsaWQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLndlc3RlbmRCbG9jay5ibG9ja051bWJlcik7XG4gICAgICBjb2luU3BlY2lmaWMxLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnbWF4RHVyYXRpb24nKTtcbiAgICAgIGNvaW5TcGVjaWZpYzEubWF4RHVyYXRpb24uc2hvdWxkLmVxdWFsKGJhc2VDb2luLk1BWF9WQUxJRElUWV9EVVJBVElPTik7XG5cbiAgICAgIC8vIGRlc2VyaWFsaXplIHRoZSB0eG4gYW5kIHZlcmlmeSB0aGUgZmllbGRzIGFyZSB3aGF0IHdlIGV4cGVjdFxuICAgICAgY29uc3QgdHhCdWlsZGVyMSA9IGJhc2VDb2luLmdldEJ1aWxkZXIoKS5mcm9tKHR4bjEuc2VyaWFsaXplZFR4KTtcbiAgICAgIC8vIHNvbWUgaW5mb3JtYXRpb24gaXNuJ3QgZGVzZXJpYWxpemVkIGJ5IHRoZSBmcm9tIG1ldGhvZCwgc28gd2Ugd2lsbFxuICAgICAgLy8gc3VwcGx5IGl0IGFnYWluIGluIG9yZGVyIHRvIHJlLWJ1aWxkIHRoZSB0eG5cbiAgICAgIHR4QnVpbGRlcjFcbiAgICAgICAgLnZhbGlkaXR5KHtcbiAgICAgICAgICBmaXJzdFZhbGlkOiB0ZXN0RGF0YS53ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIsXG4gICAgICAgICAgbWF4RHVyYXRpb246IGJhc2VDb2luLk1BWF9WQUxJRElUWV9EVVJBVElPTixcbiAgICAgICAgfSlcbiAgICAgICAgLnJlZmVyZW5jZUJsb2NrKHRlc3REYXRhLndlc3RlbmRCbG9jay5oYXNoKVxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogdGVzdERhdGEuY29uc29saWRhdGlvbldyd1VzZXIud2FsbGV0QWRkcmVzczIgfSk7XG4gICAgICBjb25zdCB0eDEgPSBhd2FpdCB0eEJ1aWxkZXIxLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24xID0gdHgxLnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24xLnNlbmRlciwgdGVzdERhdGEuY29uc29saWRhdGlvbldyd1VzZXIud2FsbGV0QWRkcmVzczIpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24xLmJsb2NrTnVtYmVyLCB0ZXN0RGF0YS53ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24xLnJlZmVyZW5jZUJsb2NrLCB0ZXN0RGF0YS53ZXN0ZW5kQmxvY2suaGFzaCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbjEuZ2VuZXNpc0hhc2gsIGdlbmVzaXNIYXNoKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uMS5zcGVjVmVyc2lvbiwgc3BlY1ZlcnNpb24pO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24xLm5vbmNlLCBub25jZSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbjEudGlwLCAwKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uMS50cmFuc2FjdGlvblZlcnNpb24sIHR4VmVyc2lvbik7XG4gICAgICAvLyBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbjEuY2hhaW5OYW1lLCBjaGFpbk5hbWUpO1xuICAgICAgLy8gZXJhUGVyaW9kIHdpbGwgYWx3YXlzIHJvdW5kIHRvIHRoZSBuZXh0IHVwcGVyIHBvd2VyIG9mIDIgZm9yIGFueSBpbnB1dCB2YWx1ZSwgaW4gdGhpcyBjYXNlIDI0MDAuXG4gICAgICAvLyA0MDk2IGlzIHRoZSBcImhpZ2hlc3RcIiB2YWx1ZSB5b3UgY2FuIHNldCwgYnV0IHRoZSB0eG4gc3RpbGwgbWF5IGZhaWwgYWZ0ZXIgMjQwMCBibG9ja3MuXG4gICAgICBjb25zdCBlcmFQZXJpb2QgPSA0MDk2O1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24xLmVyYVBlcmlvZCwgZXJhUGVyaW9kKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uMS50bywgYmFzZUFkZHIpO1xuXG4gICAgICBjb25zdCB0eG4yID0gcmVzLnR4UmVxdWVzdHNbMV0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHg7XG4gICAgICB0eG4yLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnc2VyaWFsaXplZFR4Jyk7XG4gICAgICB0eG4yLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnc2lnbmFibGVIZXgnKTtcbiAgICAgIHR4bjIuc2hvdWxkLmhhc093blByb3BlcnR5KCdzY2FuSW5kZXgnKTtcbiAgICAgIHR4bjIuc2NhbkluZGV4LnNob3VsZC5lcXVhbCgzKTtcbiAgICAgIHR4bjIuc2hvdWxkLmhhc093blByb3BlcnR5KCdjb2luJyk7XG4gICAgICB0eG4yLmNvaW4uc2hvdWxkLmVxdWFsKCd0dGFvJyk7XG4gICAgICB0eG4yLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnZGVyaXZhdGlvblBhdGgnKTtcbiAgICAgIHR4bjIuZGVyaXZhdGlvblBhdGguc2hvdWxkLmVxdWFsKCdtLzMnKTtcblxuICAgICAgdHhuMi5zaG91bGQuaGFzT3duUHJvcGVydHkoJ2NvaW5TcGVjaWZpYycpO1xuICAgICAgY29uc3QgY29pblNwZWNpZmljMiA9IHR4bjIuY29pblNwZWNpZmljO1xuICAgICAgY29pblNwZWNpZmljMi5zaG91bGQuaGFzT3duUHJvcGVydHkoJ2NvbW1vbktleWNoYWluJyk7XG4gICAgICBjb2luU3BlY2lmaWMyLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnZmlyc3RWYWxpZCcpO1xuICAgICAgY29pblNwZWNpZmljMi5maXJzdFZhbGlkLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS53ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIpO1xuICAgICAgY29pblNwZWNpZmljMi5zaG91bGQuaGFzT3duUHJvcGVydHkoJ21heER1cmF0aW9uJyk7XG4gICAgICBjb2luU3BlY2lmaWMyLm1heER1cmF0aW9uLnNob3VsZC5lcXVhbChiYXNlQ29pbi5NQVhfVkFMSURJVFlfRFVSQVRJT04pO1xuICAgICAgY29pblNwZWNpZmljMi5zaG91bGQuaGFzT3duUHJvcGVydHkoJ2NvbW1vbktleWNoYWluJyk7XG4gICAgICBjb2luU3BlY2lmaWMyLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnbGFzdFNjYW5JbmRleCcpO1xuICAgICAgY29pblNwZWNpZmljMi5sYXN0U2NhbkluZGV4LnNob3VsZC5lcXVhbCgzKTtcblxuICAgICAgLy8gZGVzZXJpYWxpemUgdGhlIHR4biBhbmQgdmVyaWZ5IHRoZSBmaWVsZHMgYXJlIHdoYXQgd2UgZXhwZWN0XG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gYmFzZUNvaW4uZ2V0QnVpbGRlcigpLmZyb20odHhuMi5zZXJpYWxpemVkVHgpO1xuICAgICAgLy8gc29tZSBpbmZvcm1hdGlvbiBpc24ndCBkZXNlcmlhbGl6ZWQgYnkgdGhlIGZyb20gbWV0aG9kLCBzbyB3ZSB3aWxsXG4gICAgICAvLyBzdXBwbHkgaXQgYWdhaW4gaW4gb3JkZXIgdG8gcmUtYnVpbGQgdGhlIHR4blxuICAgICAgdHhCdWlsZGVyMlxuICAgICAgICAudmFsaWRpdHkoe1xuICAgICAgICAgIGZpcnN0VmFsaWQ6IHRlc3REYXRhLndlc3RlbmRCbG9jay5ibG9ja051bWJlcixcbiAgICAgICAgICBtYXhEdXJhdGlvbjogYmFzZUNvaW4uTUFYX1ZBTElESVRZX0RVUkFUSU9OLFxuICAgICAgICB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2sodGVzdERhdGEud2VzdGVuZEJsb2NrLmhhc2gpXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uV3J3VXNlci53YWxsZXRBZGRyZXNzMyB9KTtcbiAgICAgIGNvbnN0IHR4MiA9IGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbjIgPSB0eDIudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbjIuc2VuZGVyLCB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uV3J3VXNlci53YWxsZXRBZGRyZXNzMyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbjIuYmxvY2tOdW1iZXIsIHRlc3REYXRhLndlc3RlbmRCbG9jay5ibG9ja051bWJlcik7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbjIucmVmZXJlbmNlQmxvY2ssIHRlc3REYXRhLndlc3RlbmRCbG9jay5oYXNoKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uMi5nZW5lc2lzSGFzaCwgZ2VuZXNpc0hhc2gpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24yLnNwZWNWZXJzaW9uLCBzcGVjVmVyc2lvbik7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbjIubm9uY2UsIG5vbmNlKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uMi50aXAsIDApO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24yLnRyYW5zYWN0aW9uVmVyc2lvbiwgdHhWZXJzaW9uKTtcbiAgICAgIC8vIHNob3VsZC5kZWVwRXF1YWwodHhKc29uMi5jaGFpbk5hbWUsIGNoYWluTmFtZSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbjIuZXJhUGVyaW9kLCBlcmFQZXJpb2QpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24yLnRvLCBiYXNlQWRkcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNraXAgYnVpbGRpbmcgY29uc29saWRhdGUgdHJhbnNhY3Rpb24gaWYgYmFsYW5jZSBpcyBlcXVhbCB0byB6ZXJvJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYmFzZUNvaW5cbiAgICAgICAgLnJlY292ZXJDb25zb2xpZGF0aW9ucyh7XG4gICAgICAgICAgdXNlcktleTogdGVzdERhdGEuY29uc29saWRhdGlvbldyd1VzZXIudXNlcktleSxcbiAgICAgICAgICBiYWNrdXBLZXk6IHRlc3REYXRhLmNvbnNvbGlkYXRpb25XcndVc2VyLmJhY2t1cEtleSxcbiAgICAgICAgICBiaXRnb0tleTogdGVzdERhdGEuY29uc29saWRhdGlvbldyd1VzZXIuYml0Z29LZXksXG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogdGVzdERhdGEuY29uc29saWRhdGlvbldyd1VzZXIud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogMSxcbiAgICAgICAgICBlbmRpbmdTY2FuSW5kZXg6IDIsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQucmVqZWN0ZWRXaXRoKCdEaWQgbm90IGZpbmQgYW4gYWRkcmVzcyB3aXRoIGZ1bmRzIHRvIHJlY292ZXInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgc3RhcnRpbmdTY2FuSW5kZXggaXMgbm90IGdlIHRvIDEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBiYXNlQ29pblxuICAgICAgICAucmVjb3ZlckNvbnNvbGlkYXRpb25zKHtcbiAgICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uV3J3VXNlci51c2VyS2V5LFxuICAgICAgICAgIGJhY2t1cEtleTogdGVzdERhdGEuY29uc29saWRhdGlvbldyd1VzZXIuYmFja3VwS2V5LFxuICAgICAgICAgIGJpdGdvS2V5OiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uV3J3VXNlci5iaXRnb0tleSxcbiAgICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogLTEsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgICdJbnZhbGlkIHN0YXJ0aW5nIG9yIGVuZGluZyBpbmRleCB0byBzY2FuIGZvciBhZGRyZXNzZXMuIHN0YXJ0aW5nU2NhbkluZGV4OiAtMSwgZW5kaW5nU2NhbkluZGV4OiAxOS4nXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIHNjYW4gZmFjdG9yIGlzIHRvbyBoaWdoJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgYmFzZUNvaW5cbiAgICAgICAgLnJlY292ZXJDb25zb2xpZGF0aW9ucyh7XG4gICAgICAgICAgdXNlcktleTogdGVzdERhdGEuY29uc29saWRhdGlvbldyd1VzZXIudXNlcktleSxcbiAgICAgICAgICBiYWNrdXBLZXk6IHRlc3REYXRhLmNvbnNvbGlkYXRpb25XcndVc2VyLmJhY2t1cEtleSxcbiAgICAgICAgICBiaXRnb0tleTogdGVzdERhdGEuY29uc29saWRhdGlvbldyd1VzZXIuYml0Z29LZXksXG4gICAgICAgICAgc3RhcnRpbmdTY2FuSW5kZXg6IDEsXG4gICAgICAgICAgZW5kaW5nU2NhbkluZGV4OiAzMDAsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgICdJbnZhbGlkIHN0YXJ0aW5nIG9yIGVuZGluZyBpbmRleCB0byBzY2FuIGZvciBhZGRyZXNzZXMuIHN0YXJ0aW5nU2NhbkluZGV4OiAxLCBlbmRpbmdTY2FuSW5kZXg6IDMwMC4nXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -1,8 +0,0 @@
1
- import { BaseCoin as CoinConfig, DotNetwork } from '@bitgo-beta/statics';
2
- export interface TestDotNetwork extends DotNetwork {
3
- genesisHash: string;
4
- specVersion: number;
5
- metadataRpc: `0x${string}`;
6
- }
7
- export declare const buildTestConfig: () => Readonly<CoinConfig>;
8
- //# sourceMappingURL=base.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/base.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAS,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAUhF,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;CAC5B;AAED,eAAO,MAAM,eAAe,QAAO,QAAQ,CAAC,UAAU,CAErD,CAAC"}