@bitgo/sdk-coin-polyx 1.16.4 → 1.17.1

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