@bitgo-beta/sdk-coin-flrp 1.0.1-beta.8 → 1.0.1-beta.81

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 (91) hide show
  1. package/dist/src/flrp.d.ts +82 -61
  2. package/dist/src/flrp.d.ts.map +1 -1
  3. package/dist/src/flrp.js +293 -134
  4. package/dist/src/lib/atomicTransactionBuilder.d.ts +42 -6
  5. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
  6. package/dist/src/lib/atomicTransactionBuilder.js +233 -29
  7. package/dist/src/lib/constants.d.ts +160 -1
  8. package/dist/src/lib/constants.d.ts.map +1 -1
  9. package/dist/src/lib/constants.js +213 -3
  10. package/dist/src/lib/delegatorTxBuilder.d.ts +58 -0
  11. package/dist/src/lib/delegatorTxBuilder.d.ts.map +1 -0
  12. package/dist/src/lib/delegatorTxBuilder.js +224 -0
  13. package/dist/src/lib/exportInCTxBuilder.d.ts +1 -1
  14. package/dist/src/lib/exportInCTxBuilder.d.ts.map +1 -1
  15. package/dist/src/lib/exportInCTxBuilder.js +46 -17
  16. package/dist/src/lib/exportInPTxBuilder.d.ts +1 -1
  17. package/dist/src/lib/exportInPTxBuilder.d.ts.map +1 -1
  18. package/dist/src/lib/exportInPTxBuilder.js +70 -6
  19. package/dist/src/lib/iface.d.ts +52 -1
  20. package/dist/src/lib/iface.d.ts.map +1 -1
  21. package/dist/src/lib/iface.js +1 -1
  22. package/dist/src/lib/importInCTxBuilder.d.ts +67 -0
  23. package/dist/src/lib/importInCTxBuilder.d.ts.map +1 -0
  24. package/dist/src/lib/importInCTxBuilder.js +403 -0
  25. package/dist/src/lib/importInPTxBuilder.d.ts +73 -0
  26. package/dist/src/lib/importInPTxBuilder.d.ts.map +1 -0
  27. package/dist/src/lib/importInPTxBuilder.js +464 -0
  28. package/dist/src/lib/index.d.ts +7 -0
  29. package/dist/src/lib/index.d.ts.map +1 -1
  30. package/dist/src/lib/index.js +15 -2
  31. package/dist/src/lib/keyPair.d.ts.map +1 -1
  32. package/dist/src/lib/keyPair.js +4 -6
  33. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +81 -0
  34. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
  35. package/dist/src/lib/permissionlessValidatorTxBuilder.js +248 -0
  36. package/dist/src/lib/transaction.d.ts +111 -0
  37. package/dist/src/lib/transaction.d.ts.map +1 -0
  38. package/dist/src/lib/transaction.js +322 -0
  39. package/dist/src/lib/transactionBuilder.d.ts +85 -0
  40. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  41. package/dist/src/lib/transactionBuilder.js +167 -0
  42. package/dist/src/lib/transactionBuilderFactory.d.ts +37 -0
  43. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  44. package/dist/src/lib/transactionBuilderFactory.js +91 -0
  45. package/dist/src/lib/types.d.ts +78 -0
  46. package/dist/src/lib/types.d.ts.map +1 -0
  47. package/dist/src/lib/types.js +5 -0
  48. package/dist/src/lib/utils.d.ts +59 -0
  49. package/dist/src/lib/utils.d.ts.map +1 -1
  50. package/dist/src/lib/utils.js +160 -52
  51. package/dist/src/lib/validatorTxBuilder.d.ts +40 -0
  52. package/dist/src/lib/validatorTxBuilder.d.ts.map +1 -0
  53. package/dist/src/lib/validatorTxBuilder.js +180 -0
  54. package/dist/test/unit/delegatorTxBuilder.test.d.ts +2 -0
  55. package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +1 -0
  56. package/dist/test/unit/delegatorTxBuilder.test.js +233 -0
  57. package/dist/test/unit/lib/atomicTransactionBuilder.js +37 -11
  58. package/dist/test/unit/lib/exportInCTxBuilder.d.ts +2 -0
  59. package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +1 -0
  60. package/dist/test/unit/lib/exportInCTxBuilder.js +584 -0
  61. package/dist/test/unit/lib/exportInPTxBuilder.d.ts +2 -0
  62. package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -0
  63. package/dist/test/unit/lib/exportInPTxBuilder.js +377 -0
  64. package/dist/test/unit/lib/importInCTxBuilder.d.ts +2 -0
  65. package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -0
  66. package/dist/test/unit/lib/importInCTxBuilder.js +257 -0
  67. package/dist/test/unit/lib/importInPTxBuilder.d.ts +2 -0
  68. package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -0
  69. package/dist/test/unit/lib/importInPTxBuilder.js +500 -0
  70. package/dist/test/unit/lib/transaction.d.ts +2 -0
  71. package/dist/test/unit/lib/transaction.d.ts.map +1 -0
  72. package/dist/test/unit/lib/transaction.js +460 -0
  73. package/dist/test/unit/lib/utils.js +55 -1
  74. package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +2 -0
  75. package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +1 -0
  76. package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +271 -0
  77. package/dist/test/unit/transactionBuilder.test.d.ts +2 -0
  78. package/dist/test/unit/transactionBuilder.test.d.ts.map +1 -0
  79. package/dist/test/unit/transactionBuilder.test.js +114 -0
  80. package/dist/test/unit/validatorTxBuilder.test.d.ts +2 -0
  81. package/dist/test/unit/validatorTxBuilder.test.d.ts.map +1 -0
  82. package/dist/test/unit/validatorTxBuilder.test.js +293 -0
  83. package/dist/tsconfig.tsbuildinfo +1 -1
  84. package/package.json +11 -11
  85. package/.eslintignore +0 -5
  86. package/.eslintrc.json +0 -7
  87. package/.mocharc.yml +0 -8
  88. package/CHANGELOG.md +0 -0
  89. package/dist/test/unit/lib/exportTxBuilder.d.ts +0 -2
  90. package/dist/test/unit/lib/exportTxBuilder.d.ts.map +0 -1
  91. package/dist/test/unit/lib/exportTxBuilder.js +0 -45
@@ -0,0 +1,584 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const statics_1 = require("@bitgo-beta/statics");
37
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
38
+ const assert = __importStar(require("assert"));
39
+ const exportInCTxBuilder_1 = require("../../../src/lib/exportInCTxBuilder");
40
+ describe('ExportInCTxBuilder', function () {
41
+ const coinConfig = statics_1.coins.get('tflrp');
42
+ let builder;
43
+ beforeEach(function () {
44
+ builder = new exportInCTxBuilder_1.ExportInCTxBuilder(coinConfig);
45
+ });
46
+ describe('Constructor', function () {
47
+ it('should initialize with coin config', function () {
48
+ assert.ok(builder);
49
+ assert.ok(builder instanceof exportInCTxBuilder_1.ExportInCTxBuilder);
50
+ });
51
+ it('should extend AtomicInCTransactionBuilder', function () {
52
+ // Test inheritance
53
+ assert.ok(builder);
54
+ });
55
+ });
56
+ describe('UTXO Override', function () {
57
+ it('should throw error when trying to set UTXOs', function () {
58
+ const mockUtxos = [{ id: 'test' }];
59
+ assert.throws(() => {
60
+ builder.utxos(mockUtxos);
61
+ }, sdk_core_1.BuildTransactionError, 'Should reject UTXOs for C-chain export transactions');
62
+ });
63
+ it('should throw error for empty UTXO array', function () {
64
+ assert.throws(() => {
65
+ builder.utxos([]);
66
+ }, sdk_core_1.BuildTransactionError, 'Should reject empty UTXO array');
67
+ });
68
+ it('should throw error for any UTXO input', function () {
69
+ const testCases = [[], [{}], ['invalid'], null, undefined];
70
+ testCases.forEach((testCase, index) => {
71
+ assert.throws(() => {
72
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
73
+ builder.utxos(testCase);
74
+ }, sdk_core_1.BuildTransactionError, `Test case ${index} should throw error`);
75
+ });
76
+ });
77
+ });
78
+ describe('Amount Management', function () {
79
+ it('should set valid positive amounts', function () {
80
+ const validAmounts = ['1000', '1000000000000000000', '999999999999999999'];
81
+ validAmounts.forEach((amount) => {
82
+ assert.doesNotThrow(() => {
83
+ builder.amount(amount);
84
+ }, `Should accept amount: ${amount}`);
85
+ });
86
+ });
87
+ it('should set bigint amounts', function () {
88
+ const bigintAmounts = [1000n, 1000000000000000000n, 999999999999999999n];
89
+ bigintAmounts.forEach((amount) => {
90
+ assert.doesNotThrow(() => {
91
+ builder.amount(amount);
92
+ }, `Should accept bigint amount: ${amount}`);
93
+ });
94
+ });
95
+ it('should set numeric amounts', function () {
96
+ const numericAmounts = [1000, 2000000, 999999999];
97
+ numericAmounts.forEach((amount) => {
98
+ assert.doesNotThrow(() => {
99
+ builder.amount(amount);
100
+ }, `Should accept numeric amount: ${amount}`);
101
+ });
102
+ });
103
+ it('should reject zero amount', function () {
104
+ assert.throws(() => {
105
+ builder.amount(0);
106
+ }, /Amount must be positive/);
107
+ assert.throws(() => {
108
+ builder.amount('0');
109
+ }, /Amount must be positive/);
110
+ assert.throws(() => {
111
+ builder.amount(0n);
112
+ }, /Amount must be positive/);
113
+ });
114
+ it('should reject negative amounts', function () {
115
+ const negativeAmounts = ['-1000', '-1'];
116
+ negativeAmounts.forEach((amount) => {
117
+ assert.throws(() => {
118
+ builder.amount(amount);
119
+ }, sdk_core_1.BuildTransactionError, `Should reject negative amount: ${amount}`);
120
+ });
121
+ });
122
+ it('should handle large amounts', function () {
123
+ const largeAmounts = [
124
+ '100000000000000000000000', // Very large amount
125
+ '18446744073709551615', // Near uint64 max
126
+ BigInt('999999999999999999999999999999'),
127
+ ];
128
+ largeAmounts.forEach((amount) => {
129
+ assert.doesNotThrow(() => {
130
+ builder.amount(amount);
131
+ }, `Should handle large amount: ${amount}`);
132
+ });
133
+ });
134
+ it('should chain amount setting with other methods', function () {
135
+ const amount = '1000000000000000000';
136
+ const nonce = 1n;
137
+ assert.doesNotThrow(() => {
138
+ builder.amount(amount).nonce(nonce);
139
+ });
140
+ });
141
+ });
142
+ describe('Nonce Management', function () {
143
+ it('should set valid nonce values', function () {
144
+ const validNonces = [0n, 1n, 1000n, 999999999999n];
145
+ validNonces.forEach((nonce) => {
146
+ assert.doesNotThrow(() => {
147
+ builder.nonce(nonce);
148
+ }, `Should accept nonce: ${nonce}`);
149
+ });
150
+ });
151
+ it('should set string nonce values', function () {
152
+ const stringNonces = ['0', '1', '1000', '999999999999'];
153
+ stringNonces.forEach((nonce) => {
154
+ assert.doesNotThrow(() => {
155
+ builder.nonce(nonce);
156
+ }, `Should accept string nonce: ${nonce}`);
157
+ });
158
+ });
159
+ it('should set numeric nonce values', function () {
160
+ const numericNonces = [0, 1, 1000, 999999];
161
+ numericNonces.forEach((nonce) => {
162
+ assert.doesNotThrow(() => {
163
+ builder.nonce(nonce);
164
+ }, `Should accept numeric nonce: ${nonce}`);
165
+ });
166
+ });
167
+ it('should reject negative nonce values', function () {
168
+ const negativeNonces = [-1n, -1000n];
169
+ negativeNonces.forEach((nonce) => {
170
+ assert.throws(() => {
171
+ builder.nonce(nonce);
172
+ }, sdk_core_1.BuildTransactionError, `Should reject negative nonce: ${nonce}`);
173
+ });
174
+ });
175
+ it('should reject negative string nonce values', function () {
176
+ const negativeStringNonces = ['-1', '-1000'];
177
+ negativeStringNonces.forEach((nonce) => {
178
+ assert.throws(() => {
179
+ builder.nonce(nonce);
180
+ }, sdk_core_1.BuildTransactionError, `Should reject negative string nonce: ${nonce}`);
181
+ });
182
+ });
183
+ it('should handle large nonce values', function () {
184
+ const largeNonces = [
185
+ '18446744073709551615', // Max uint64
186
+ BigInt('999999999999999999999999999999'),
187
+ 1000000000000000000n,
188
+ ];
189
+ largeNonces.forEach((nonce) => {
190
+ assert.doesNotThrow(() => {
191
+ builder.nonce(nonce);
192
+ }, `Should handle large nonce: ${nonce}`);
193
+ });
194
+ });
195
+ it('should chain nonce setting with other methods', function () {
196
+ const nonce = 123n;
197
+ const amount = '1000000000000000000';
198
+ assert.doesNotThrow(() => {
199
+ builder.nonce(nonce).amount(amount);
200
+ });
201
+ });
202
+ });
203
+ describe('Destination Address Management', function () {
204
+ it('should set single destination address', function () {
205
+ const singleAddress = 'P-flare1destination';
206
+ assert.doesNotThrow(() => {
207
+ builder.to(singleAddress);
208
+ });
209
+ });
210
+ it('should set multiple destination addresses', function () {
211
+ const multipleAddresses = ['P-flare1dest1', 'P-flare1dest2', 'P-flare1dest3'];
212
+ assert.doesNotThrow(() => {
213
+ builder.to(multipleAddresses);
214
+ });
215
+ });
216
+ it('should handle comma-separated addresses', function () {
217
+ const commaSeparated = 'P-flare1dest1~P-flare1dest2~P-flare1dest3';
218
+ assert.doesNotThrow(() => {
219
+ builder.to(commaSeparated);
220
+ });
221
+ });
222
+ it('should handle empty address array', function () {
223
+ assert.doesNotThrow(() => {
224
+ builder.to([]);
225
+ });
226
+ });
227
+ it('should chain address setting with other methods', function () {
228
+ const addresses = ['P-flare1dest1', 'P-flare1dest2'];
229
+ const amount = '1000000000000000000';
230
+ assert.doesNotThrow(() => {
231
+ builder.to(addresses).amount(amount);
232
+ });
233
+ });
234
+ });
235
+ describe('Transaction Type Verification', function () {
236
+ it('should verify transaction type (placeholder returns true)', function () {
237
+ const mockTx = { type: 'export' };
238
+ const result = exportInCTxBuilder_1.ExportInCTxBuilder.verifyTxType(mockTx);
239
+ assert.strictEqual(result, true); // Placeholder always returns true
240
+ });
241
+ it('should handle different transaction objects', function () {
242
+ const testCases = [{}, null, undefined, { type: 'import' }, { data: 'test' }];
243
+ testCases.forEach((testCase, index) => {
244
+ const result = exportInCTxBuilder_1.ExportInCTxBuilder.verifyTxType(testCase);
245
+ assert.strictEqual(result, true, `Test case ${index} should return true (placeholder)`);
246
+ });
247
+ });
248
+ it('should verify via instance method', function () {
249
+ const mockTx = { type: 'export' };
250
+ const result = builder.verifyTxType(mockTx);
251
+ assert.strictEqual(result, true);
252
+ });
253
+ });
254
+ describe('Transaction Building', function () {
255
+ it('should handle building when transaction has credentials', function () {
256
+ const mockTx = {
257
+ unsignedTx: {
258
+ networkId: 0, // Match builder's default
259
+ sourceBlockchainId: Buffer.alloc(0), // Match builder's default
260
+ destinationBlockchainId: Buffer.from('test-dest'),
261
+ inputs: [
262
+ {
263
+ address: 'C-flare1test',
264
+ amount: 2000000000000000000n,
265
+ assetId: Buffer.alloc(0), // Match builder's default
266
+ nonce: 1n,
267
+ },
268
+ ],
269
+ outputs: [
270
+ {
271
+ addresses: ['P-flare1dest'],
272
+ amount: 1000000000000000000n,
273
+ assetId: Buffer.alloc(0), // Match builder's default
274
+ },
275
+ ],
276
+ },
277
+ credentials: [],
278
+ };
279
+ builder.initBuilder(mockTx);
280
+ // Should not throw when credentials exist
281
+ assert.doesNotThrow(() => {
282
+ // Access protected method via type assertion
283
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
284
+ builder.buildFlareTransaction();
285
+ });
286
+ });
287
+ it('should require amount for building', function () {
288
+ builder.nonce(1n);
289
+ builder.to(['P-flare1dest']);
290
+ // Mock setting from addresses via transaction initialization
291
+ const mockRawTx = {
292
+ unsignedTx: {
293
+ networkId: 0, // Match builder's default
294
+ sourceBlockchainId: Buffer.alloc(0), // Match builder's default
295
+ destinationBlockchainId: Buffer.from('test-dest'),
296
+ inputs: [
297
+ {
298
+ address: 'C-flare1test',
299
+ amount: 2000000000000000000n,
300
+ assetId: Buffer.alloc(0), // Match builder's default
301
+ nonce: 1n,
302
+ },
303
+ ],
304
+ outputs: [
305
+ {
306
+ addresses: ['P-flare1dest'],
307
+ amount: 1000000000000000000n,
308
+ assetId: Buffer.alloc(0), // Match builder's default
309
+ },
310
+ ],
311
+ },
312
+ credentials: [],
313
+ };
314
+ builder.initBuilder(mockRawTx);
315
+ // Clear amount to test error
316
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
317
+ builder._amount = undefined;
318
+ assert.throws(() => {
319
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
320
+ builder.buildFlareTransaction();
321
+ }, Error);
322
+ });
323
+ });
324
+ describe('Transaction Initialization', function () {
325
+ it('should initialize from raw transaction object', function () {
326
+ const mockRawTx = {
327
+ unsignedTx: {
328
+ networkId: 0, // Match builder's default
329
+ sourceBlockchainId: Buffer.alloc(0), // Match builder's default
330
+ destinationBlockchainId: Buffer.from('test-dest'),
331
+ inputs: [
332
+ {
333
+ address: 'C-flare1test',
334
+ amount: 2000000000000000000n,
335
+ assetId: Buffer.alloc(0), // Match builder's default
336
+ nonce: 1n,
337
+ },
338
+ ],
339
+ outputs: [
340
+ {
341
+ addresses: ['P-flare1dest'],
342
+ amount: 1000000000000000000n,
343
+ assetId: Buffer.alloc(0), // Match builder's default
344
+ },
345
+ ],
346
+ },
347
+ credentials: [],
348
+ };
349
+ assert.doesNotThrow(() => {
350
+ builder.initBuilder(mockRawTx);
351
+ });
352
+ });
353
+ it('should validate blockchain ID during initialization', function () {
354
+ const mockRawTx = {
355
+ unsignedTx: {
356
+ networkId: 0, // Match builder's default
357
+ sourceBlockchainId: Buffer.from('wrong-blockchain'),
358
+ destinationBlockchainId: Buffer.from('test-dest'),
359
+ inputs: [
360
+ {
361
+ address: 'C-flare1test',
362
+ amount: 2000000000000000000n,
363
+ assetId: Buffer.alloc(0), // Match builder's default
364
+ nonce: 1n,
365
+ },
366
+ ],
367
+ outputs: [
368
+ {
369
+ addresses: ['P-flare1dest'],
370
+ amount: 1000000000000000000n,
371
+ assetId: Buffer.alloc(0), // Match builder's default
372
+ },
373
+ ],
374
+ },
375
+ credentials: [],
376
+ };
377
+ assert.throws(() => {
378
+ builder.initBuilder(mockRawTx);
379
+ }, Error);
380
+ });
381
+ it('should validate single output requirement', function () {
382
+ const mockRawTx = {
383
+ unsignedTx: {
384
+ networkId: 0, // Match builder's default
385
+ sourceBlockchainId: Buffer.alloc(0), // Match builder's default // Will match default
386
+ destinationBlockchainId: Buffer.from('test-dest'),
387
+ inputs: [
388
+ {
389
+ address: 'C-flare1test',
390
+ amount: 2000000000000000000n,
391
+ assetId: Buffer.alloc(0), // Match builder's default
392
+ nonce: 1n,
393
+ },
394
+ ],
395
+ outputs: [
396
+ {
397
+ addresses: ['P-flare1dest1'],
398
+ amount: 500000000000000000n,
399
+ assetId: Buffer.alloc(0), // Match builder's default
400
+ },
401
+ {
402
+ addresses: ['P-flare1dest2'],
403
+ amount: 500000000000000000n,
404
+ assetId: Buffer.alloc(0), // Match builder's default
405
+ },
406
+ ],
407
+ },
408
+ credentials: [],
409
+ };
410
+ assert.throws(() => {
411
+ builder.initBuilder(mockRawTx);
412
+ }, sdk_core_1.BuildTransactionError);
413
+ });
414
+ it('should validate single input requirement', function () {
415
+ const mockRawTx = {
416
+ unsignedTx: {
417
+ networkId: 0, // Match builder's default
418
+ sourceBlockchainId: Buffer.alloc(0), // Match builder's default
419
+ destinationBlockchainId: Buffer.from('test-dest'),
420
+ inputs: [
421
+ {
422
+ address: 'C-flare1test1',
423
+ amount: 1000000000000000000n,
424
+ assetId: Buffer.alloc(0), // Match builder's default
425
+ nonce: 1n,
426
+ },
427
+ {
428
+ address: 'C-flare1test2',
429
+ amount: 1000000000000000000n,
430
+ assetId: Buffer.alloc(0), // Match builder's default
431
+ nonce: 2n,
432
+ },
433
+ ],
434
+ outputs: [
435
+ {
436
+ addresses: ['P-flare1dest'],
437
+ amount: 1000000000000000000n,
438
+ assetId: Buffer.alloc(0), // Match builder's default
439
+ },
440
+ ],
441
+ },
442
+ credentials: [],
443
+ };
444
+ assert.throws(() => {
445
+ builder.initBuilder(mockRawTx);
446
+ }, sdk_core_1.BuildTransactionError);
447
+ });
448
+ it('should validate negative fee calculation', function () {
449
+ const mockRawTx = {
450
+ unsignedTx: {
451
+ networkId: 0, // Match builder's default
452
+ sourceBlockchainId: Buffer.alloc(0), // Match builder's default
453
+ destinationBlockchainId: Buffer.from('test-dest'),
454
+ inputs: [
455
+ {
456
+ address: 'C-flare1test',
457
+ amount: 500000000000000000n, // Less than output
458
+ assetId: Buffer.alloc(0), // Match builder's default
459
+ nonce: 1n,
460
+ },
461
+ ],
462
+ outputs: [
463
+ {
464
+ addresses: ['P-flare1dest'],
465
+ amount: 1000000000000000000n, // More than input
466
+ assetId: Buffer.alloc(0), // Match builder's default
467
+ },
468
+ ],
469
+ },
470
+ credentials: [],
471
+ };
472
+ assert.throws(() => {
473
+ builder.initBuilder(mockRawTx);
474
+ }, sdk_core_1.BuildTransactionError);
475
+ });
476
+ });
477
+ describe('From Implementation', function () {
478
+ it('should handle string raw transaction', function () {
479
+ const rawString = 'hex-encoded-transaction';
480
+ assert.doesNotThrow(() => {
481
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
482
+ builder.fromImplementation(rawString);
483
+ });
484
+ });
485
+ it('should handle object raw transaction', function () {
486
+ const mockRawTx = {
487
+ unsignedTx: {
488
+ networkId: 0, // Match builder's default
489
+ sourceBlockchainId: Buffer.alloc(0), // Match builder's default
490
+ destinationBlockchainId: Buffer.from('test-dest'),
491
+ inputs: [
492
+ {
493
+ address: 'C-flare1test',
494
+ amount: 2000000000000000000n,
495
+ assetId: Buffer.alloc(0), // Match builder's default
496
+ nonce: 1n,
497
+ },
498
+ ],
499
+ outputs: [
500
+ {
501
+ addresses: ['P-flare1dest'],
502
+ amount: 1000000000000000000n,
503
+ assetId: Buffer.alloc(0), // Match builder's default
504
+ },
505
+ ],
506
+ },
507
+ credentials: [],
508
+ };
509
+ assert.doesNotThrow(() => {
510
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
511
+ builder.fromImplementation(mockRawTx);
512
+ });
513
+ });
514
+ });
515
+ describe('Integration Tests', function () {
516
+ it('should handle complete export flow preparation', function () {
517
+ const amount = '1000000000000000000'; // 1 FLR
518
+ const nonce = 123n;
519
+ const toAddresses = ['P-flare1destination'];
520
+ // Complete setup
521
+ builder.amount(amount).nonce(nonce).to(toAddresses);
522
+ // All operations should complete without throwing
523
+ assert.ok(true);
524
+ });
525
+ it('should handle method chaining extensively', function () {
526
+ // Test extensive method chaining
527
+ assert.doesNotThrow(() => {
528
+ builder
529
+ .amount('5000000000000000000') // 5 FLR
530
+ .nonce(456n)
531
+ .to(['P-flare1receiver1', 'P-flare1receiver2']);
532
+ });
533
+ });
534
+ it('should handle large transaction values', function () {
535
+ const largeAmount = '100000000000000000000000'; // 100k FLR
536
+ const largeNonce = 999999999999n;
537
+ assert.doesNotThrow(() => {
538
+ builder.amount(largeAmount).nonce(largeNonce);
539
+ });
540
+ });
541
+ it('should handle multiple destination addresses', function () {
542
+ const multipleDestinations = [
543
+ 'P-flare1dest1',
544
+ 'P-flare1dest2',
545
+ 'P-flare1dest3',
546
+ 'P-flare1dest4',
547
+ 'P-flare1dest5',
548
+ ];
549
+ assert.doesNotThrow(() => {
550
+ builder.amount('1000000000000000000').to(multipleDestinations);
551
+ });
552
+ });
553
+ });
554
+ describe('Edge Cases', function () {
555
+ it('should handle zero values appropriately', function () {
556
+ // Zero amount should be rejected
557
+ assert.throws(() => {
558
+ builder.amount(0);
559
+ }, /Amount must be positive/);
560
+ // Zero nonce should be valid
561
+ assert.doesNotThrow(() => {
562
+ builder.nonce(0n);
563
+ });
564
+ });
565
+ it('should handle maximum values', function () {
566
+ const maxBigInt = BigInt('18446744073709551615'); // Max uint64
567
+ assert.doesNotThrow(() => {
568
+ builder.amount(maxBigInt);
569
+ });
570
+ assert.doesNotThrow(() => {
571
+ builder.nonce(maxBigInt);
572
+ });
573
+ });
574
+ it('should maintain state across multiple operations', function () {
575
+ // Build state incrementally
576
+ builder.amount('1000000000000000000');
577
+ builder.nonce(123n);
578
+ builder.to(['P-flare1dest']);
579
+ // State should be maintained across operations
580
+ assert.ok(true);
581
+ });
582
+ });
583
+ });
584
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9leHBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBNEM7QUFDNUMsbURBQTZEO0FBQzdELCtDQUFpQztBQUNqQyw0RUFBeUU7QUFFekUsUUFBUSxDQUFDLG9CQUFvQixFQUFFO0lBQzdCLE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsSUFBSSxPQUEyQixDQUFDO0lBRWhDLFVBQVUsQ0FBQztRQUNULE9BQU8sR0FBRyxJQUFJLHVDQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGFBQWEsRUFBRTtRQUN0QixFQUFFLENBQUMsb0NBQW9DLEVBQUU7WUFDdkMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuQixNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sWUFBWSx1Q0FBa0IsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDJDQUEyQyxFQUFFO1lBQzlDLG1CQUFtQjtZQUNuQixNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZUFBZSxFQUFFO1FBQ3hCLEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRTtZQUNoRCxNQUFNLFNBQVMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFFbkMsTUFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7Z0JBQ0gsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FB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b3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgRXhwb3J0SW5DVHhCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9leHBvcnRJbkNUeEJ1aWxkZXInO1xuXG5kZXNjcmliZSgnRXhwb3J0SW5DVHhCdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KCd0ZmxycCcpO1xuICBsZXQgYnVpbGRlcjogRXhwb3J0SW5DVHhCdWlsZGVyO1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGJ1aWxkZXIgPSBuZXcgRXhwb3J0SW5DVHhCdWlsZGVyKGNvaW5Db25maWcpO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ29uc3RydWN0b3InLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHdpdGggY29pbiBjb25maWcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQub2soYnVpbGRlcik7XG4gICAgICBhc3NlcnQub2soYnVpbGRlciBpbnN0YW5jZW9mIEV4cG9ydEluQ1R4QnVpbGRlcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4dGVuZCBBdG9taWNJbkNUcmFuc2FjdGlvbkJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBUZXN0IGluaGVyaXRhbmNlXG4gICAgICBhc3NlcnQub2soYnVpbGRlcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdVVFhPIE92ZXJyaWRlJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiB0cnlpbmcgdG8gc2V0IFVUWE9zJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1V0eG9zID0gW3sgaWQ6ICd0ZXN0JyB9XTtcblxuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIudXR4b3MobW9ja1V0eG9zKTtcbiAgICAgICAgfSxcbiAgICAgICAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICAgICAgICAnU2hvdWxkIHJlamVjdCBVVFhPcyBmb3IgQy1jaGFpbiBleHBvcnQgdHJhbnNhY3Rpb25zJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGVtcHR5IFVUWE8gYXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci51dHhvcyhbXSk7XG4gICAgICAgIH0sXG4gICAgICAgIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgICAgICAgJ1Nob3VsZCByZWplY3QgZW1wdHkgVVRYTyBhcnJheSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBhbnkgVVRYTyBpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRlc3RDYXNlcyA9IFtbXSwgW3t9XSwgWydpbnZhbGlkJ10sIG51bGwsIHVuZGVmaW5lZF07XG5cbiAgICAgIHRlc3RDYXNlcy5mb3JFYWNoKCh0ZXN0Q2FzZSwgaW5kZXgpID0+IHtcbiAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgYnVpbGRlci51dHhvcyh0ZXN0Q2FzZSBhcyBhbnkpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICAgICAgICAgIGBUZXN0IGNhc2UgJHtpbmRleH0gc2hvdWxkIHRocm93IGVycm9yYFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdBbW91bnQgTWFuYWdlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHNldCB2YWxpZCBwb3NpdGl2ZSBhbW91bnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmFsaWRBbW91bnRzID0gWycxMDAwJywgJzEwMDAwMDAwMDAwMDAwMDAwMDAnLCAnOTk5OTk5OTk5OTk5OTk5OTk5J107XG5cbiAgICAgIHZhbGlkQW1vdW50cy5mb3JFYWNoKChhbW91bnQpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgICAgfSwgYFNob3VsZCBhY2NlcHQgYW1vdW50OiAke2Ftb3VudH1gKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgYmlnaW50IGFtb3VudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiaWdpbnRBbW91bnRzID0gWzEwMDBuLCAxMDAwMDAwMDAwMDAwMDAwMDAwbiwgOTk5OTk5OTk5OTk5OTk5OTk5bl07XG5cbiAgICAgIGJpZ2ludEFtb3VudHMuZm9yRWFjaCgoYW1vdW50KSA9PiB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIuYW1vdW50KGFtb3VudCk7XG4gICAgICAgIH0sIGBTaG91bGQgYWNjZXB0IGJpZ2ludCBhbW91bnQ6ICR7YW1vdW50fWApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBudW1lcmljIGFtb3VudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBudW1lcmljQW1vdW50cyA9IFsxMDAwLCAyMDAwMDAwLCA5OTk5OTk5OTldO1xuXG4gICAgICBudW1lcmljQW1vdW50cy5mb3JFYWNoKChhbW91bnQpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgICAgfSwgYFNob3VsZCBhY2NlcHQgbnVtZXJpYyBhbW91bnQ6ICR7YW1vdW50fWApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCB6ZXJvIGFtb3VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFtb3VudCgwKTtcbiAgICAgIH0sIC9BbW91bnQgbXVzdCBiZSBwb3NpdGl2ZS8pO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hbW91bnQoJzAnKTtcbiAgICAgIH0sIC9BbW91bnQgbXVzdCBiZSBwb3NpdGl2ZS8pO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hbW91bnQoMG4pO1xuICAgICAgfSwgL0Ftb3VudCBtdXN0IGJlIHBvc2l0aXZlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBuZWdhdGl2ZSBhbW91bnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbmVnYXRpdmVBbW91bnRzID0gWyctMTAwMCcsICctMSddO1xuXG4gICAgICBuZWdhdGl2ZUFtb3VudHMuZm9yRWFjaCgoYW1vdW50KSA9PiB7XG4gICAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgYnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgICAgICAgICBgU2hvdWxkIHJlamVjdCBuZWdhdGl2ZSBhbW91bnQ6ICR7YW1vdW50fWBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbGFyZ2UgYW1vdW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGxhcmdlQW1vdW50cyA9IFtcbiAgICAgICAgJzEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsIC8vIFZlcnkgbGFyZ2UgYW1vdW50XG4gICAgICAgICcxODQ0Njc0NDA3MzcwOTU1MTYxNScsIC8vIE5lYXIgdWludDY0IG1heFxuICAgICAgICBCaWdJbnQoJzk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScpLFxuICAgICAgXTtcblxuICAgICAgbGFyZ2VBbW91bnRzLmZvckVhY2goKGFtb3VudCkgPT4ge1xuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLmFtb3VudChhbW91bnQpO1xuICAgICAgICB9LCBgU2hvdWxkIGhhbmRsZSBsYXJnZSBhbW91bnQ6ICR7YW1vdW50fWApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNoYWluIGFtb3VudCBzZXR0aW5nIHdpdGggb3RoZXIgbWV0aG9kcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFtb3VudCA9ICcxMDAwMDAwMDAwMDAwMDAwMDAwJztcbiAgICAgIGNvbnN0IG5vbmNlID0gMW47XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFtb3VudChhbW91bnQpLm5vbmNlKG5vbmNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnTm9uY2UgTWFuYWdlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHNldCB2YWxpZCBub25jZSB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2YWxpZE5vbmNlcyA9IFswbiwgMW4sIDEwMDBuLCA5OTk5OTk5OTk5OTluXTtcblxuICAgICAgdmFsaWROb25jZXMuZm9yRWFjaCgobm9uY2UpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5ub25jZShub25jZSk7XG4gICAgICAgIH0sIGBTaG91bGQgYWNjZXB0IG5vbmNlOiAke25vbmNlfWApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBzdHJpbmcgbm9uY2UgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3RyaW5nTm9uY2VzID0gWycwJywgJzEnLCAnMTAwMCcsICc5OTk5OTk5OTk5OTknXTtcblxuICAgICAgc3RyaW5nTm9uY2VzLmZvckVhY2goKG5vbmNlKSA9PiB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIubm9uY2Uobm9uY2UpO1xuICAgICAgICB9LCBgU2hvdWxkIGFjY2VwdCBzdHJpbmcgbm9uY2U6ICR7bm9uY2V9YCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IG51bWVyaWMgbm9uY2UgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbnVtZXJpY05vbmNlcyA9IFswLCAxLCAxMDAwLCA5OTk5OTldO1xuXG4gICAgICBudW1lcmljTm9uY2VzLmZvckVhY2goKG5vbmNlKSA9PiB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIubm9uY2Uobm9uY2UpO1xuICAgICAgICB9LCBgU2hvdWxkIGFjY2VwdCBudW1lcmljIG5vbmNlOiAke25vbmNlfWApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBuZWdhdGl2ZSBub25jZSB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBuZWdhdGl2ZU5vbmNlcyA9IFstMW4sIC0xMDAwbl07XG5cbiAgICAgIG5lZ2F0aXZlTm9uY2VzLmZvckVhY2goKG5vbmNlKSA9PiB7XG4gICAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgYnVpbGRlci5ub25jZShub25jZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsXG4gICAgICAgICAgYFNob3VsZCByZWplY3QgbmVnYXRpdmUgbm9uY2U6ICR7bm9uY2V9YFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBuZWdhdGl2ZSBzdHJpbmcgbm9uY2UgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbmVnYXRpdmVTdHJpbmdOb25jZXMgPSBbJy0xJywgJy0xMDAwJ107XG5cbiAgICAgIG5lZ2F0aXZlU3RyaW5nTm9uY2VzLmZvckVhY2goKG5vbmNlKSA9PiB7XG4gICAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgYnVpbGRlci5ub25jZShub25jZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsXG4gICAgICAgICAgYFNob3VsZCByZWplY3QgbmVnYXRpdmUgc3RyaW5nIG5vbmNlOiAke25vbmNlfWBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbGFyZ2Ugbm9uY2UgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbGFyZ2VOb25jZXMgPSBbXG4gICAgICAgICcxODQ0Njc0NDA3MzcwOTU1MTYxNScsIC8vIE1heCB1aW50NjRcbiAgICAgICAgQmlnSW50KCc5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTknKSxcbiAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICBdO1xuXG4gICAgICBsYXJnZU5vbmNlcy5mb3JFYWNoKChub25jZSkgPT4ge1xuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLm5vbmNlKG5vbmNlKTtcbiAgICAgICAgfSwgYFNob3VsZCBoYW5kbGUgbGFyZ2Ugbm9uY2U6ICR7bm9uY2V9YCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2hhaW4gbm9uY2Ugc2V0dGluZyB3aXRoIG90aGVyIG1ldGhvZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBub25jZSA9IDEyM247XG4gICAgICBjb25zdCBhbW91bnQgPSAnMTAwMDAwMDAwMDAwMDAwMDAwMCc7XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLm5vbmNlKG5vbmNlKS5hbW91bnQoYW1vdW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRGVzdGluYXRpb24gQWRkcmVzcyBNYW5hZ2VtZW50JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc2V0IHNpbmdsZSBkZXN0aW5hdGlvbiBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2luZ2xlQWRkcmVzcyA9ICdQLWZsYXJlMWRlc3RpbmF0aW9uJztcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudG8oc2luZ2xlQWRkcmVzcyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IG11bHRpcGxlIGRlc3RpbmF0aW9uIGFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG11bHRpcGxlQWRkcmVzc2VzID0gWydQLWZsYXJlMWRlc3QxJywgJ1AtZmxhcmUxZGVzdDInLCAnUC1mbGFyZTFkZXN0MyddO1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci50byhtdWx0aXBsZUFkZHJlc3Nlcyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGNvbW1hLXNlcGFyYXRlZCBhZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb21tYVNlcGFyYXRlZCA9ICdQLWZsYXJlMWRlc3QxflAtZmxhcmUxZGVzdDJ+UC1mbGFyZTFkZXN0Myc7XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnRvKGNvbW1hU2VwYXJhdGVkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZW1wdHkgYWRkcmVzcyBhcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnRvKFtdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjaGFpbiBhZGRyZXNzIHNldHRpbmcgd2l0aCBvdGhlciBtZXRob2RzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzc2VzID0gWydQLWZsYXJlMWRlc3QxJywgJ1AtZmxhcmUxZGVzdDInXTtcbiAgICAgIGNvbnN0IGFtb3VudCA9ICcxMDAwMDAwMDAwMDAwMDAwMDAwJztcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudG8oYWRkcmVzc2VzKS5hbW91bnQoYW1vdW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gVHlwZSBWZXJpZmljYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgdHJhbnNhY3Rpb24gdHlwZSAocGxhY2Vob2xkZXIgcmV0dXJucyB0cnVlKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tUeCA9IHsgdHlwZTogJ2V4cG9ydCcgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IEV4cG9ydEluQ1R4QnVpbGRlci52ZXJpZnlUeFR5cGUobW9ja1R4KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpOyAvLyBQbGFjZWhvbGRlciBhbHdheXMgcmV0dXJucyB0cnVlXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBkaWZmZXJlbnQgdHJhbnNhY3Rpb24gb2JqZWN0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRlc3RDYXNlcyA9IFt7fSwgbnVsbCwgdW5kZWZpbmVkLCB7IHR5cGU6ICdpbXBvcnQnIH0sIHsgZGF0YTogJ3Rlc3QnIH1dO1xuXG4gICAgICB0ZXN0Q2FzZXMuZm9yRWFjaCgodGVzdENhc2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IEV4cG9ydEluQ1R4QnVpbGRlci52ZXJpZnlUeFR5cGUodGVzdENhc2UpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlLCBgVGVzdCBjYXNlICR7aW5kZXh9IHNob3VsZCByZXR1cm4gdHJ1ZSAocGxhY2Vob2xkZXIpYCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IHZpYSBpbnN0YW5jZSBtZXRob2QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2NrVHggPSB7IHR5cGU6ICdleHBvcnQnIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyLnZlcmlmeVR4VHlwZShtb2NrVHgpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBCdWlsZGluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBidWlsZGluZyB3aGVuIHRyYW5zYWN0aW9uIGhhcyBjcmVkZW50aWFscycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tUeCA9IHtcbiAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgIG5ldHdvcmtJZDogMCwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICBzb3VyY2VCbG9ja2NoYWluSWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICBkZXN0aW5hdGlvbkJsb2NrY2hhaW5JZDogQnVmZmVyLmZyb20oJ3Rlc3QtZGVzdCcpLFxuICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnQy1mbGFyZTF0ZXN0JyxcbiAgICAgICAgICAgICAgYW1vdW50OiAyMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgICBub25jZTogMW4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzZXM6IFsnUC1mbGFyZTFkZXN0J10sXG4gICAgICAgICAgICAgIGFtb3VudDogMTAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgY3JlZGVudGlhbHM6IFtdLFxuICAgICAgfTtcbiAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIobW9ja1R4KTtcblxuICAgICAgLy8gU2hvdWxkIG5vdCB0aHJvdyB3aGVuIGNyZWRlbnRpYWxzIGV4aXN0XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgLy8gQWNjZXNzIHByb3RlY3RlZCBtZXRob2QgdmlhIHR5cGUgYXNzZXJ0aW9uXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIChidWlsZGVyIGFzIGFueSkuYnVpbGRGbGFyZVRyYW5zYWN0aW9uKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVxdWlyZSBhbW91bnQgZm9yIGJ1aWxkaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlci5ub25jZSgxbik7XG4gICAgICBidWlsZGVyLnRvKFsnUC1mbGFyZTFkZXN0J10pO1xuXG4gICAgICAvLyBNb2NrIHNldHRpbmcgZnJvbSBhZGRyZXNzZXMgdmlhIHRyYW5zYWN0aW9uIGluaXRpYWxpemF0aW9uXG4gICAgICBjb25zdCBtb2NrUmF3VHggPSB7XG4gICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICBuZXR3b3JrSWQ6IDAsIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgc291cmNlQmxvY2tjaGFpbklkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgZGVzdGluYXRpb25CbG9ja2NoYWluSWQ6IEJ1ZmZlci5mcm9tKCd0ZXN0LWRlc3QnKSxcbiAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogJ0MtZmxhcmUxdGVzdCcsXG4gICAgICAgICAgICAgIGFtb3VudDogMjAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgICAgbm9uY2U6IDFuLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzc2VzOiBbJ1AtZmxhcmUxZGVzdCddLFxuICAgICAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAwMDAwMDAwMDAwMDBuLFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGNyZWRlbnRpYWxzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIobW9ja1Jhd1R4KTtcbiAgICAgIC8vIENsZWFyIGFtb3VudCB0byB0ZXN0IGVycm9yXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgKGJ1aWxkZXIgYXMgYW55KS5fYW1vdW50ID0gdW5kZWZpbmVkO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgKGJ1aWxkZXIgYXMgYW55KS5idWlsZEZsYXJlVHJhbnNhY3Rpb24oKTtcbiAgICAgIH0sIEVycm9yKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIEluaXRpYWxpemF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSBmcm9tIHJhdyB0cmFuc2FjdGlvbiBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2NrUmF3VHggPSB7XG4gICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICBuZXR3b3JrSWQ6IDAsIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgc291cmNlQmxvY2tjaGFpbklkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgZGVzdGluYXRpb25CbG9ja2NoYWluSWQ6IEJ1ZmZlci5mcm9tKCd0ZXN0LWRlc3QnKSxcbiAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogJ0MtZmxhcmUxdGVzdCcsXG4gICAgICAgICAgICAgIGFtb3VudDogMjAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgICAgbm9uY2U6IDFuLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzc2VzOiBbJ1AtZmxhcmUxZGVzdCddLFxuICAgICAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAwMDAwMDAwMDAwMDBuLFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGNyZWRlbnRpYWxzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmluaXRCdWlsZGVyKG1vY2tSYXdUeCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYmxvY2tjaGFpbiBJRCBkdXJpbmcgaW5pdGlhbGl6YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2NrUmF3VHggPSB7XG4gICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICBuZXR3b3JrSWQ6IDAsIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgc291cmNlQmxvY2tjaGFpbklkOiBCdWZmZXIuZnJvbSgnd3JvbmctYmxvY2tjaGFpbicpLFxuICAgICAgICAgIGRlc3RpbmF0aW9uQmxvY2tjaGFpbklkOiBCdWZmZXIuZnJvbSgndGVzdC1kZXN0JyksXG4gICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICdDLWZsYXJlMXRlc3QnLFxuICAgICAgICAgICAgICBhbW91bnQ6IDIwMDAwMDAwMDAwMDAwMDAwMDBuLFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICAgIG5vbmNlOiAxbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3NlczogWydQLWZsYXJlMWRlc3QnXSxcbiAgICAgICAgICAgICAgYW1vdW50OiAxMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBjcmVkZW50aWFsczogW10sXG4gICAgICB9O1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5pbml0QnVpbGRlcihtb2NrUmF3VHgpO1xuICAgICAgfSwgRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBzaW5nbGUgb3V0cHV0IHJlcXVpcmVtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1Jhd1R4ID0ge1xuICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgbmV0d29ya0lkOiAwLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgIHNvdXJjZUJsb2NrY2hhaW5JZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdCAvLyBXaWxsIG1hdGNoIGRlZmF1bHRcbiAgICAgICAgICBkZXN0aW5hdGlvbkJsb2NrY2hhaW5JZDogQnVmZmVyLmZyb20oJ3Rlc3QtZGVzdCcpLFxuICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnQy1mbGFyZTF0ZXN0JyxcbiAgICAgICAgICAgICAgYW1vdW50OiAyMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgICBub25jZTogMW4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzZXM6IFsnUC1mbGFyZTFkZXN0MSddLFxuICAgICAgICAgICAgICBhbW91bnQ6IDUwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3NlczogWydQLWZsYXJlMWRlc3QyJ10sXG4gICAgICAgICAgICAgIGFtb3VudDogNTAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBjcmVkZW50aWFsczogW10sXG4gICAgICB9O1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5pbml0QnVpbGRlcihtb2NrUmF3VHgpO1xuICAgICAgfSwgQnVpbGRUcmFuc2FjdGlvbkVycm9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgc2luZ2xlIGlucHV0IHJlcXVpcmVtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1Jhd1R4ID0ge1xuICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgbmV0d29ya0lkOiAwLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgIHNvdXJjZUJsb2NrY2hhaW5JZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgIGRlc3RpbmF0aW9uQmxvY2tjaGFpbklkOiBCdWZmZXIuZnJvbSgndGVzdC1kZXN0JyksXG4gICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICdDLWZsYXJlMXRlc3QxJyxcbiAgICAgICAgICAgICAgYW1vdW50OiAxMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgICBub25jZTogMW4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnQy1mbGFyZTF0ZXN0MicsXG4gICAgICAgICAgICAgIGFtb3VudDogMTAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgICAgbm9uY2U6IDJuLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzc2VzOiBbJ1AtZmxhcmUxZGVzdCddLFxuICAgICAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAwMDAwMDAwMDAwMDBuLFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGNyZWRlbnRpYWxzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmluaXRCdWlsZGVyKG1vY2tSYXdUeCk7XG4gICAgICB9LCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBuZWdhdGl2ZSBmZWUgY2FsY3VsYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2NrUmF3VHggPSB7XG4gICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICBuZXR3b3JrSWQ6IDAsIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgc291cmNlQmxvY2tjaGFpbklkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgZGVzdGluYXRpb25CbG9ja2NoYWluSWQ6IEJ1ZmZlci5mcm9tKCd0ZXN0LWRlc3QnKSxcbiAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogJ0MtZmxhcmUxdGVzdCcsXG4gICAgICAgICAgICAgIGFtb3VudDogNTAwMDAwMDAwMDAwMDAwMDAwbiwgLy8gTGVzcyB0aGFuIG91dHB1dFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICAgIG5vbmNlOiAxbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3NlczogWydQLWZsYXJlMWRlc3QnXSxcbiAgICAgICAgICAgICAgYW1vdW50OiAxMDAwMDAwMDAwMDAwMDAwMDAwbiwgLy8gTW9yZSB0aGFuIGlucHV0XG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgY3JlZGVudGlhbHM6IFtdLFxuICAgICAgfTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIobW9ja1Jhd1R4KTtcbiAgICAgIH0sIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGcm9tIEltcGxlbWVudGF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgaGFuZGxlIHN0cmluZyByYXcgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByYXdTdHJpbmcgPSAnaGV4LWVuY29kZWQtdHJhbnNhY3Rpb24nO1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgKGJ1aWxkZXIgYXMgYW55KS5mcm9tSW1wbGVtZW50YXRpb24ocmF3U3RyaW5nKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgb2JqZWN0IHJhdyB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tSYXdUeCA9IHtcbiAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgIG5ldHdvcmtJZDogMCwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICBzb3VyY2VCbG9ja2NoYWluSWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICBkZXN0aW5hdGlvbkJsb2NrY2hhaW5JZDogQnVmZmVyLmZyb20oJ3Rlc3QtZGVzdCcpLFxuICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnQy1mbGFyZTF0ZXN0JyxcbiAgICAgICAgICAgICAgYW1vdW50OiAyMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgICBub25jZTogMW4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzZXM6IFsnUC1mbGFyZTFkZXN0J10sXG4gICAgICAgICAgICAgIGFtb3VudDogMTAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgY3JlZGVudGlhbHM6IFtdLFxuICAgICAgfTtcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIChidWlsZGVyIGFzIGFueSkuZnJvbUltcGxlbWVudGF0aW9uKG1vY2tSYXdUeCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ludGVncmF0aW9uIFRlc3RzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgaGFuZGxlIGNvbXBsZXRlIGV4cG9ydCBmbG93IHByZXBhcmF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYW1vdW50ID0gJzEwMDAwMDAwMDAwMDAwMDAwMDAnOyAvLyAxIEZMUlxuICAgICAgY29uc3Qgbm9uY2UgPSAxMjNuO1xuICAgICAgY29uc3QgdG9BZGRyZXNzZXMgPSBbJ1AtZmxhcmUxZGVzdGluYXRpb24nXTtcblxuICAgICAgLy8gQ29tcGxldGUgc2V0dXBcbiAgICAgIGJ1aWxkZXIuYW1vdW50KGFtb3VudCkubm9uY2Uobm9uY2UpLnRvKHRvQWRkcmVzc2VzKTtcblxuICAgICAgLy8gQWxsIG9wZXJhdGlvbnMgc2hvdWxkIGNvbXBsZXRlIHdpdGhvdXQgdGhyb3dpbmdcbiAgICAgIGFzc2VydC5vayh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIG1ldGhvZCBjaGFpbmluZyBleHRlbnNpdmVseScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRlc3QgZXh0ZW5zaXZlIG1ldGhvZCBjaGFpbmluZ1xuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXJcbiAgICAgICAgICAuYW1vdW50KCc1MDAwMDAwMDAwMDAwMDAwMDAwJykgLy8gNSBGTFJcbiAgICAgICAgICAubm9uY2UoNDU2bilcbiAgICAgICAgICAudG8oWydQLWZsYXJlMXJlY2VpdmVyMScsICdQLWZsYXJlMXJlY2VpdmVyMiddKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbGFyZ2UgdHJhbnNhY3Rpb24gdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbGFyZ2VBbW91bnQgPSAnMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJzsgLy8gMTAwayBGTFJcbiAgICAgIGNvbnN0IGxhcmdlTm9uY2UgPSA5OTk5OTk5OTk5OTluO1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hbW91bnQobGFyZ2VBbW91bnQpLm5vbmNlKGxhcmdlTm9uY2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtdWx0aXBsZSBkZXN0aW5hdGlvbiBhZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtdWx0aXBsZURlc3RpbmF0aW9ucyA9IFtcbiAgICAgICAgJ1AtZmxhcmUxZGVzdDEnLFxuICAgICAgICAnUC1mbGFyZTFkZXN0MicsXG4gICAgICAgICdQLWZsYXJlMWRlc3QzJyxcbiAgICAgICAgJ1AtZmxhcmUxZGVzdDQnLFxuICAgICAgICAnUC1mbGFyZTFkZXN0NScsXG4gICAgICBdO1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hbW91bnQoJzEwMDAwMDAwMDAwMDAwMDAwMDAnKS50byhtdWx0aXBsZURlc3RpbmF0aW9ucyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0VkZ2UgQ2FzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgemVybyB2YWx1ZXMgYXBwcm9wcmlhdGVseScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFplcm8gYW1vdW50IHNob3VsZCBiZSByZWplY3RlZFxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuYW1vdW50KDApO1xuICAgICAgfSwgL0Ftb3VudCBtdXN0IGJlIHBvc2l0aXZlLyk7XG5cbiAgICAgIC8vIFplcm8gbm9uY2Ugc2hvdWxkIGJlIHZhbGlkXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5ub25jZSgwbik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIG1heGltdW0gdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbWF4QmlnSW50ID0gQmlnSW50KCcxODQ0Njc0NDA3MzcwOTU1MTYxNScpOyAvLyBNYXggdWludDY0XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFtb3VudChtYXhCaWdJbnQpO1xuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLm5vbmNlKG1heEJpZ0ludCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWFpbnRhaW4gc3RhdGUgYWNyb3NzIG11bHRpcGxlIG9wZXJhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBCdWlsZCBzdGF0ZSBpbmNyZW1lbnRhbGx5XG4gICAgICBidWlsZGVyLmFtb3VudCgnMTAwMDAwMDAwMDAwMDAwMDAwMCcpO1xuICAgICAgYnVpbGRlci5ub25jZSgxMjNuKTtcbiAgICAgIGJ1aWxkZXIudG8oWydQLWZsYXJlMWRlc3QnXSk7XG5cbiAgICAgIC8vIFN0YXRlIHNob3VsZCBiZSBtYWludGFpbmVkIGFjcm9zcyBvcGVyYXRpb25zXG4gICAgICBhc3NlcnQub2sodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=