@bitgo-beta/sdk-coin-iota 1.0.1-beta.32 → 1.0.1-beta.321

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 (63) hide show
  1. package/README.md +1 -1
  2. package/dist/src/iota.d.ts +13 -2
  3. package/dist/src/iota.d.ts.map +1 -1
  4. package/dist/src/iota.js +142 -22
  5. package/dist/src/lib/constants.d.ts +10 -6
  6. package/dist/src/lib/constants.d.ts.map +1 -1
  7. package/dist/src/lib/constants.js +12 -8
  8. package/dist/src/lib/iface.d.ts +33 -1
  9. package/dist/src/lib/iface.d.ts.map +1 -1
  10. package/dist/src/lib/iface.js +1 -1
  11. package/dist/src/lib/index.d.ts +1 -0
  12. package/dist/src/lib/index.d.ts.map +1 -1
  13. package/dist/src/lib/index.js +4 -2
  14. package/dist/src/lib/transaction.d.ts +72 -5
  15. package/dist/src/lib/transaction.d.ts.map +1 -1
  16. package/dist/src/lib/transaction.js +270 -6
  17. package/dist/src/lib/transactionBuilder.d.ts +70 -9
  18. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  19. package/dist/src/lib/transactionBuilder.js +155 -14
  20. package/dist/src/lib/transactionBuilderFactory.d.ts +15 -2
  21. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  22. package/dist/src/lib/transactionBuilderFactory.js +45 -5
  23. package/dist/src/lib/transferBuilder.d.ts +10 -2
  24. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  25. package/dist/src/lib/transferBuilder.js +45 -3
  26. package/dist/src/lib/transferTransaction.d.ts +28 -0
  27. package/dist/src/lib/transferTransaction.d.ts.map +1 -0
  28. package/dist/src/lib/transferTransaction.js +173 -0
  29. package/dist/src/lib/utils.d.ts +2 -0
  30. package/dist/src/lib/utils.d.ts.map +1 -1
  31. package/dist/src/lib/utils.js +28 -4
  32. package/dist/test/resources/iota.d.ts +35 -0
  33. package/dist/test/resources/iota.d.ts.map +1 -0
  34. package/dist/test/resources/iota.js +93 -0
  35. package/dist/test/unit/index.d.ts +2 -0
  36. package/dist/test/unit/index.d.ts.map +1 -0
  37. package/dist/test/unit/index.js +16 -0
  38. package/dist/test/unit/iota.d.ts +2 -0
  39. package/dist/test/unit/iota.d.ts.map +1 -0
  40. package/dist/test/unit/iota.js +603 -0
  41. package/dist/test/unit/keyPair.d.ts +2 -0
  42. package/dist/test/unit/keyPair.d.ts.map +1 -0
  43. package/dist/test/unit/keyPair.js +135 -0
  44. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
  45. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  46. package/dist/test/unit/transactionBuilder/transactionBuilder.js +306 -0
  47. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts +2 -0
  48. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts.map +1 -0
  49. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +243 -0
  50. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  51. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  52. package/dist/test/unit/transactionBuilder/transferBuilder.js +400 -0
  53. package/dist/test/unit/transferTransaction.d.ts +2 -0
  54. package/dist/test/unit/transferTransaction.d.ts.map +1 -0
  55. package/dist/test/unit/transferTransaction.js +465 -0
  56. package/dist/test/unit/utils.d.ts +2 -0
  57. package/dist/test/unit/utils.d.ts.map +1 -0
  58. package/dist/test/unit/utils.js +278 -0
  59. package/dist/tsconfig.tsbuildinfo +1 -0
  60. package/package.json +16 -10
  61. package/.eslintignore +0 -5
  62. package/.mocharc.yml +0 -8
  63. package/CHANGELOG.md +0 -0
@@ -0,0 +1,278 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const testData = __importStar(require("../resources/iota"));
40
+ const should_1 = __importDefault(require("should"));
41
+ const utils_1 = __importDefault(require("../../src/lib/utils"));
42
+ const src_1 = require("../../src");
43
+ const statics_1 = require("@bitgo-beta/statics");
44
+ describe('Iota util library', function () {
45
+ describe('isValidAddress', function () {
46
+ it('should succeed to validate addresses', function () {
47
+ for (const address of testData.addresses.validAddresses) {
48
+ should_1.default.equal(utils_1.default.isValidAddress(address), true);
49
+ }
50
+ });
51
+ it('should fail to validate invalid addresses', function () {
52
+ for (const address of testData.addresses.invalidAddresses) {
53
+ should_1.default.doesNotThrow(() => utils_1.default.isValidAddress(address));
54
+ should_1.default.equal(utils_1.default.isValidAddress(address), false);
55
+ }
56
+ // @ts-expect-error Testing for missing param, should not throw an error
57
+ should_1.default.doesNotThrow(() => utils_1.default.isValidAddress(undefined));
58
+ // @ts-expect-error Testing for missing param, should return false
59
+ should_1.default.equal(utils_1.default.isValidAddress(undefined), false);
60
+ });
61
+ it('should validate addresses with correct length', function () {
62
+ // IOTA addresses are 64 characters hex with 0x prefix
63
+ const validAddress = '0x' + 'a'.repeat(64);
64
+ should_1.default.equal(utils_1.default.isValidAddress(validAddress), true);
65
+ });
66
+ it('should reject addresses with incorrect length', function () {
67
+ const shortAddress = '0x' + 'a'.repeat(32);
68
+ const longAddress = '0x' + 'a'.repeat(128);
69
+ should_1.default.equal(utils_1.default.isValidAddress(shortAddress), false);
70
+ should_1.default.equal(utils_1.default.isValidAddress(longAddress), false);
71
+ });
72
+ it('should reject addresses without 0x prefix', function () {
73
+ const addressWithoutPrefix = 'a'.repeat(64);
74
+ should_1.default.equal(utils_1.default.isValidAddress(addressWithoutPrefix), false);
75
+ });
76
+ it('should reject addresses with non-hex characters', function () {
77
+ const invalidHex = '0x' + 'g'.repeat(64);
78
+ should_1.default.equal(utils_1.default.isValidAddress(invalidHex), false);
79
+ });
80
+ });
81
+ describe('isValidPublicKey', function () {
82
+ it('should validate correct public keys', function () {
83
+ // without 0x prefix (64 hex chars)
84
+ should_1.default.equal(true, utils_1.default.isValidPublicKey('b2051899478edeb36a79d1d16dfec56dc3a6ebd29fbbbb4a4ef2dfaf46043355'));
85
+ should_1.default.equal(true, utils_1.default.isValidPublicKey(testData.sender.publicKey));
86
+ });
87
+ it('should reject public keys with 0x prefix', function () {
88
+ should_1.default.equal(false, utils_1.default.isValidPublicKey('0x413f7fa8beb54459e1e9ede3af3b12e5a4a3550390bb616da30dd72017701263'));
89
+ });
90
+ it('should reject invalid public keys', function () {
91
+ should_1.default.equal(false, utils_1.default.isValidPublicKey('invalid'));
92
+ should_1.default.equal(false, utils_1.default.isValidPublicKey(''));
93
+ should_1.default.equal(false, utils_1.default.isValidPublicKey('123'));
94
+ });
95
+ it('should reject public keys with incorrect length', function () {
96
+ should_1.default.equal(false, utils_1.default.isValidPublicKey('a'.repeat(32))); // Too short
97
+ should_1.default.equal(false, utils_1.default.isValidPublicKey('a'.repeat(128))); // Too long
98
+ });
99
+ });
100
+ describe('isValidPrivateKey', function () {
101
+ it('should validate ed25519 secret keys', function () {
102
+ // Ed25519 secret keys (as used by tweetnacl) are 64 bytes (128 hex chars)
103
+ // This includes the 32-byte seed + 32-byte public key
104
+ const validSecretKey = '0'.repeat(128);
105
+ should_1.default.equal(utils_1.default.isValidPrivateKey(validSecretKey), true);
106
+ });
107
+ it('should reject invalid private keys', function () {
108
+ should_1.default.equal(utils_1.default.isValidPrivateKey('invalid'), false);
109
+ should_1.default.equal(utils_1.default.isValidPrivateKey(''), false);
110
+ should_1.default.equal(utils_1.default.isValidPrivateKey('123'), false);
111
+ });
112
+ it('should reject private keys with wrong length', function () {
113
+ should_1.default.equal(utils_1.default.isValidPrivateKey('a'.repeat(32)), false); // Too short (16 bytes)
114
+ should_1.default.equal(utils_1.default.isValidPrivateKey('a'.repeat(64)), false); // Seed length, not full secret key (32 bytes)
115
+ should_1.default.equal(utils_1.default.isValidPrivateKey('a'.repeat(256)), false); // Too long (128 bytes)
116
+ });
117
+ });
118
+ describe('isValidTransactionId', function () {
119
+ it('should validate correct transaction IDs', function () {
120
+ should_1.default.equal(true, utils_1.default.isValidTransactionId('BftEk3BeKUWTj9uzVGntd4Ka16QZG8hUnr6KsAb7q7bt'));
121
+ });
122
+ it('should reject invalid transaction IDs', function () {
123
+ should_1.default.equal(false, utils_1.default.isValidTransactionId('0xff86b121181a43d03df52e8930785af3dda944ec87654cdba3a378ff518cd75b'));
124
+ should_1.default.equal(false, utils_1.default.isValidTransactionId('BftEk3BeKUWTj9uzVGntd4Ka16QZG8hUnr6KsAb7q7b53t')); // Wrong length
125
+ });
126
+ it('should reject hex strings', function () {
127
+ should_1.default.equal(false, utils_1.default.isValidTransactionId('0xabcdef123456'));
128
+ });
129
+ it('should reject empty strings', function () {
130
+ should_1.default.equal(false, utils_1.default.isValidTransactionId(''));
131
+ });
132
+ });
133
+ describe('isValidBlockId', function () {
134
+ it('should validate correct block IDs', function () {
135
+ should_1.default.equal(true, utils_1.default.isValidBlockId('GZXZvvLS3ZnuE4E9CxQJJ2ij5xeNsvUXdAKVrPCQKrPz'));
136
+ });
137
+ it('should reject invalid block IDs', function () {
138
+ should_1.default.equal(false, utils_1.default.isValidBlockId('0x9ac6a0c313c4a0563a169dad29f1d018647683be54a314ed229a2693293dfc98'));
139
+ should_1.default.equal(false, utils_1.default.isValidBlockId('GZXZvvLS3ZnuE4E9CxQJJ2ij5xeNsvUXdAK56VrPCQKrPz')); // Wrong length
140
+ });
141
+ it('should reject hex strings', function () {
142
+ should_1.default.equal(false, utils_1.default.isValidBlockId('0xabcdef'));
143
+ });
144
+ it('should reject empty strings', function () {
145
+ should_1.default.equal(false, utils_1.default.isValidBlockId(''));
146
+ });
147
+ });
148
+ describe('isValidSignature', function () {
149
+ it('should validate correct signatures', function () {
150
+ should_1.default.equal(true, utils_1.default.isValidSignature('iXrcUjgQgpYUsa7O90KZicdTmIdJSjB99+tJW6l6wPCqI/lUTou6sQ2sLoZgC0n4qQKX+vFDz+lBIXl7J/ZgCg=='));
151
+ });
152
+ it('should reject invalid signatures', function () {
153
+ should_1.default.equal(false, utils_1.default.isValidSignature('0x9ac6a0c313c4a0563a169dad29f1d018647683be54a314ed229a2693293dfc98'));
154
+ should_1.default.equal(false, utils_1.default.isValidSignature('goppBTDgLuBbcU5tP90n3igvZGHmcE23HCoxLfdJwOCcbyztVh9r0TPacJRXmjZ6'));
155
+ });
156
+ it('should reject signatures with incorrect length', function () {
157
+ should_1.default.equal(false, utils_1.default.isValidSignature('dG9vU2hvcnQ=')); // Too short base64
158
+ });
159
+ it('should reject non-base64 strings', function () {
160
+ should_1.default.equal(false, utils_1.default.isValidSignature('not a base64 string!!!'));
161
+ should_1.default.equal(false, utils_1.default.isValidSignature(''));
162
+ });
163
+ });
164
+ describe('isValidHex', function () {
165
+ it('should validate correct hex strings', function () {
166
+ should_1.default.equal(true, utils_1.default.isValidHex('0xabcdef', 6));
167
+ should_1.default.equal(true, utils_1.default.isValidHex('0x123456', 6));
168
+ should_1.default.equal(true, utils_1.default.isValidHex('0XABCDEF', 6));
169
+ });
170
+ it('should reject hex strings with incorrect length', function () {
171
+ should_1.default.equal(false, utils_1.default.isValidHex('0xabcd', 6));
172
+ should_1.default.equal(false, utils_1.default.isValidHex('0xabcdefgh', 6));
173
+ });
174
+ it('should reject hex strings without prefix', function () {
175
+ should_1.default.equal(false, utils_1.default.isValidHex('abcdef', 6));
176
+ });
177
+ it('should reject hex strings with non-hex characters', function () {
178
+ should_1.default.equal(false, utils_1.default.isValidHex('0xghijkl', 6));
179
+ should_1.default.equal(false, utils_1.default.isValidHex('0xabcdeg', 6));
180
+ });
181
+ it('should handle uppercase and lowercase', function () {
182
+ should_1.default.equal(true, utils_1.default.isValidHex('0xABCDEF', 6));
183
+ should_1.default.equal(true, utils_1.default.isValidHex('0xabcdef', 6));
184
+ should_1.default.equal(true, utils_1.default.isValidHex('0xAbCdEf', 6));
185
+ });
186
+ });
187
+ describe('getAddressFromPublicKey', function () {
188
+ it('should generate valid address from public key', function () {
189
+ const address = utils_1.default.getAddressFromPublicKey(testData.sender.publicKey);
190
+ should_1.default.exist(address);
191
+ should_1.default.equal(utils_1.default.isValidAddress(address), true);
192
+ });
193
+ it('should generate consistent addresses', function () {
194
+ const address1 = utils_1.default.getAddressFromPublicKey(testData.sender.publicKey);
195
+ const address2 = utils_1.default.getAddressFromPublicKey(testData.sender.publicKey);
196
+ should_1.default.equal(address1, address2);
197
+ });
198
+ it('should generate different addresses for different keys', function () {
199
+ const address1 = utils_1.default.getAddressFromPublicKey(testData.sender.publicKey);
200
+ const address2 = utils_1.default.getAddressFromPublicKey(testData.gasSponsor.publicKey);
201
+ should_1.default.notEqual(address1, address2);
202
+ });
203
+ });
204
+ describe('getBase64String', function () {
205
+ it('should convert Uint8Array to base64', function () {
206
+ const uint8Array = new Uint8Array([72, 101, 108, 108, 111]); // "Hello"
207
+ const result = utils_1.default.getBase64String(uint8Array);
208
+ should_1.default.exist(result);
209
+ should_1.default.equal(typeof result, 'string');
210
+ should_1.default.equal(result.length > 0, true);
211
+ });
212
+ it('should convert hex string to base64', function () {
213
+ const hexString = '48656c6c6f'; // "Hello" in hex
214
+ const result = utils_1.default.getBase64String(hexString);
215
+ should_1.default.exist(result);
216
+ should_1.default.equal(typeof result, 'string');
217
+ should_1.default.equal(result.length > 0, true);
218
+ });
219
+ it('should handle empty Uint8Array', function () {
220
+ const emptyArray = new Uint8Array([]);
221
+ const result = utils_1.default.getBase64String(emptyArray);
222
+ should_1.default.exist(result);
223
+ should_1.default.equal(typeof result, 'string');
224
+ });
225
+ it('should handle Buffer conversion to base64', function () {
226
+ const buffer = Buffer.from('Hello World');
227
+ const uint8Array = new Uint8Array(buffer);
228
+ const result = utils_1.default.getBase64String(uint8Array);
229
+ should_1.default.exist(result);
230
+ should_1.default.equal(typeof result, 'string');
231
+ should_1.default.equal(result.length > 0, true);
232
+ });
233
+ it('should consistently convert same input to same output', function () {
234
+ const uint8Array = new Uint8Array([1, 2, 3, 4, 5]);
235
+ const result1 = utils_1.default.getBase64String(uint8Array);
236
+ const result2 = utils_1.default.getBase64String(new Uint8Array([1, 2, 3, 4, 5]));
237
+ should_1.default.equal(result1, result2);
238
+ });
239
+ });
240
+ describe('isValidRawTransaction', function () {
241
+ it('should validate proper raw transactions', async function () {
242
+ const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tiota'));
243
+ const txBuilder = factory.getTransferBuilder();
244
+ txBuilder.sender(testData.sender.address);
245
+ txBuilder.recipients(testData.recipients);
246
+ txBuilder.paymentObjects(testData.paymentObjects);
247
+ txBuilder.gasData(testData.gasData);
248
+ const tx = await txBuilder.build();
249
+ const rawTx = await tx.toBroadcastFormat();
250
+ should_1.default.equal(utils_1.default.isValidRawTransaction(rawTx), true);
251
+ });
252
+ it('should validate raw transactions as Uint8Array', async function () {
253
+ const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tiota'));
254
+ const txBuilder = factory.getTransferBuilder();
255
+ txBuilder.sender(testData.sender.address);
256
+ txBuilder.recipients(testData.recipients);
257
+ txBuilder.paymentObjects(testData.paymentObjects);
258
+ txBuilder.gasData(testData.gasData);
259
+ const tx = await txBuilder.build();
260
+ const rawTx = await tx.toBroadcastFormat();
261
+ const rawTxBytes = Buffer.from(rawTx, 'base64');
262
+ should_1.default.equal(utils_1.default.isValidRawTransaction(rawTxBytes), true);
263
+ });
264
+ it('should reject invalid raw transactions', function () {
265
+ should_1.default.equal(utils_1.default.isValidRawTransaction('invalidRawTx'), false);
266
+ should_1.default.equal(utils_1.default.isValidRawTransaction(''), false);
267
+ should_1.default.equal(utils_1.default.isValidRawTransaction('0x123456'), false);
268
+ });
269
+ it('should reject invalid base64 strings', function () {
270
+ should_1.default.equal(utils_1.default.isValidRawTransaction('not-base64!!!'), false);
271
+ });
272
+ it('should reject malformed transaction data', function () {
273
+ const malformedBase64 = Buffer.from('malformed data').toString('base64');
274
+ should_1.default.equal(utils_1.default.isValidRawTransaction(malformedBase64), false);
275
+ });
276
+ });
277
+ });
278
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0REFBOEM7QUFDOUMsb0RBQTRCO0FBQzVCLGdFQUF3QztBQUN4QyxtQ0FBc0Q7QUFDdEQsaURBQTRDO0FBRTVDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtJQUM1QixRQUFRLENBQUMsZ0JBQWdCLEVBQUU7UUFDekIsRUFBRSxDQUFDLHNDQUFzQyxFQUFFO1lBQ3pDLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDeEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkNBQTJDLEVBQUU7WUFDOUMsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQzFELGdCQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDekQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNyRCxDQUFDO1lBQ0Qsd0VBQXdFO1lBQ3hFLGdCQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQUssQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMzRCxrRUFBa0U7WUFDbEUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxL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LGVBQUssQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUU7WUFDN0MsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbURBQW1ELEVBQUU7WUFDdEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdUNBQXVDLEVBQUU7WUFDMUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyx5QkFBeUIsRUFBRTtRQUNsQyxFQUFFLENBQUMsK0NBQStDLEVBQUU7WUFDbEQsTUFBTSxPQUFPLEdBQUcsZUFBSyxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDekUsZ0JB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SyxDQUFDLGVBQUssQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM5RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRTtZQUMzQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDakUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JELGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRTtZQUN6QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUU7WUFDN0MsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN6RSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL2lvdGEnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuXG5kZXNjcmliZSgnSW90YSB1dGlsIGxpYnJhcnknLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdpc1ZhbGlkQWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gdmFsaWRhdGUgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCBhZGRyZXNzIG9mIHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlcykge1xuICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyksIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZhbGlkYXRlIGludmFsaWQgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCBhZGRyZXNzIG9mIHRlc3REYXRhLmFkZHJlc3Nlcy5pbnZhbGlkQWRkcmVzc2VzKSB7XG4gICAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykpO1xuICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyksIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVGVzdGluZyBmb3IgbWlzc2luZyBwYXJhbSwgc2hvdWxkIG5vdCB0aHJvdyBhbiBlcnJvclxuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB1dGlscy5pc1ZhbGlkQWRkcmVzcyh1bmRlZmluZWQpKTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVGVzdGluZyBmb3IgbWlzc2luZyBwYXJhbSwgc2hvdWxkIHJldHVybiBmYWxzZVxuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKHVuZGVmaW5lZCksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYWRkcmVzc2VzIHdpdGggY29ycmVjdCBsZW5ndGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBJT1RBIGFkZHJlc3NlcyBhcmUgNjQgY2hhcmFjdGVycyBoZXggd2l0aCAweCBwcmVmaXhcbiAgICAgIGNvbnN0IHZhbGlkQWRkcmVzcyA9ICcweCcgKyAnYScucmVwZWF0KDY0KTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyh2YWxpZEFkZHJlc3MpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFkZHJlc3NlcyB3aXRoIGluY29ycmVjdCBsZW5ndGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzaG9ydEFkZHJlc3MgPSAnMHgnICsgJ2EnLnJlcGVhdCgzMik7XG4gICAgICBjb25zdCBsb25nQWRkcmVzcyA9ICcweCcgKyAnYScucmVwZWF0KDEyOCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3Moc2hvcnRBZGRyZXNzKSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKGxvbmdBZGRyZXNzKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYWRkcmVzc2VzIHdpdGhvdXQgMHggcHJlZml4JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzc1dpdGhvdXRQcmVmaXggPSAnYScucmVwZWF0KDY0KTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzV2l0aG91dFByZWZpeCksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFkZHJlc3NlcyB3aXRoIG5vbi1oZXggY2hhcmFjdGVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGludmFsaWRIZXggPSAnMHgnICsgJ2cnLnJlcGVhdCg2NCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoaW52YWxpZEhleCksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRQdWJsaWNLZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHB1YmxpYyBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gd2l0aG91dCAweCBwcmVmaXggKDY0IGhleCBjaGFycylcbiAgICAgIHNob3VsZC5lcXVhbCh0cnVlLCB1dGlscy5pc1ZhbGlkUHVibGljS2V5KCdiMjA1MTg5OTQ3OGVkZWIzNmE3OWQxZDE2ZGZlYzU2ZGMzYTZlYmQyOWZiYmJiNGE0ZWYyZGZhZjQ2MDQzMzU1JykpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRydWUsIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkodGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgcHVibGljIGtleXMgd2l0aCAweCBwcmVmaXgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoJzB4NDEzZjdmYThiZWI1NDQ1OWUxZTllZGUzYWYzYjEyZTVhNGEzNTUwMzkwYmI2MTZkYTMwZGQ3MjAxNzcwMTI2MycpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGludmFsaWQgcHVibGljIGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoJ2ludmFsaWQnKSk7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoJycpKTtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZFB1YmxpY0tleSgnMTIzJykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgcHVibGljIGtleXMgd2l0aCBpbmNvcnJlY3QgbGVuZ3RoJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKGZhbHNlLCB1dGlscy5pc1ZhbGlkUHVibGljS2V5KCdhJy5yZXBlYXQoMzIpKSk7IC8vIFRvbyBzaG9ydFxuICAgICAgc2hvdWxkLmVxdWFsKGZhbHNlLCB1dGlscy5pc1ZhbGlkUHVibGljS2V5KCdhJy5yZXBlYXQoMTI4KSkpOyAvLyBUb28gbG9uZ1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZFByaXZhdGVLZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBlZDI1NTE5IHNlY3JldCBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gRWQyNTUxOSBzZWNyZXQga2V5cyAoYXMgdXNlZCBieSB0d2VldG5hY2wpIGFyZSA2NCBieXRlcyAoMTI4IGhleCBjaGFycylcbiAgICAgIC8vIFRoaXMgaW5jbHVkZXMgdGhlIDMyLWJ5dGUgc2VlZCArIDMyLWJ5dGUgcHVibGljIGtleVxuICAgICAgY29uc3QgdmFsaWRTZWNyZXRLZXkgPSAnMCcucmVwZWF0KDEyOCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFByaXZhdGVLZXkodmFsaWRTZWNyZXRLZXkpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGludmFsaWQgcHJpdmF0ZSBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KCdpbnZhbGlkJyksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleSgnJyksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleSgnMTIzJyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHByaXZhdGUga2V5cyB3aXRoIHdyb25nIGxlbmd0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleSgnYScucmVwZWF0KDMyKSksIGZhbHNlKTsgLy8gVG9vIHNob3J0ICgxNiBieXRlcylcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleSgnYScucmVwZWF0KDY0KSksIGZhbHNlKTsgLy8gU2VlZCBsZW5ndGgsIG5vdCBmdWxsIHNlY3JldCBrZXkgKDMyIGJ5dGVzKVxuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KCdhJy5yZXBlYXQoMjU2KSksIGZhbHNlKTsgLy8gVG9vIGxvbmcgKDEyOCBieXRlcylcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRUcmFuc2FjdGlvbklkJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCB0cmFuc2FjdGlvbiBJRHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwodHJ1ZSwgdXRpbHMuaXNWYWxpZFRyYW5zYWN0aW9uSWQoJ0JmdEVrM0JlS1VXVGo5dXpWR250ZDRLYTE2UVpHOGhVbnI2S3NBYjdxN2J0JykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaW52YWxpZCB0cmFuc2FjdGlvbiBJRHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB1dGlscy5pc1ZhbGlkVHJhbnNhY3Rpb25JZCgnMHhmZjg2YjEyMTE4MWE0M2QwM2RmNTJlODkzMDc4NWFmM2RkYTk0NGVjODc2NTRjZGJhM2EzNzhmZjUxOGNkNzViJylcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRUcmFuc2FjdGlvbklkKCdCZnRFazNCZUtVV1RqOXV6VkdudGQ0S2ExNlFaRzhoVW5yNktzQWI3cTdiNTN0JykpOyAvLyBXcm9uZyBsZW5ndGhcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGhleCBzdHJpbmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKGZhbHNlLCB1dGlscy5pc1ZhbGlkVHJhbnNhY3Rpb25JZCgnMHhhYmNkZWYxMjM0NTYnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBlbXB0eSBzdHJpbmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKGZhbHNlLCB1dGlscy5pc1ZhbGlkVHJhbnNhY3Rpb25JZCgnJykpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZEJsb2NrSWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IGJsb2NrIElEcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5lcXVhbCh0cnVlLCB1dGlscy5pc1ZhbGlkQmxvY2tJZCgnR1pYWnZ2TFMzWm51RTRFOUN4UUpKMmlqNXhlTnN2VVhkQUtWclBDUUtyUHonKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpbnZhbGlkIGJsb2NrIElEcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZEJsb2NrSWQoJzB4OWFjNmEwYzMxM2M0YTA1NjNhMTY5ZGFkMjlmMWQwMTg2NDc2ODNiZTU0YTMxNGVkMjI5YTI2OTMyOTNkZmM5OCcpKTtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZEJsb2NrSWQoJ0daWFp2dkxTM1pudUU0RTlDeFFKSjJpajV4ZU5zdlVYZEFLNTZWclBDUUtyUHonKSk7IC8vIFdyb25nIGxlbmd0aFxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaGV4IHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRCbG9ja0lkKCcweGFiY2RlZicpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGVtcHR5IHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRCbG9ja0lkKCcnKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkU2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBzaWduYXR1cmVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICB0cnVlLFxuICAgICAgICB1dGlscy5pc1ZhbGlkU2lnbmF0dXJlKFxuICAgICAgICAgICdpWHJjVWpnUWdwWVVzYTdPOTBLWmljZFRtSWRKU2pCOTkrdEpXNmw2d1BDcUkvbFVUb3U2c1Eyc0xvWmdDMG40cVFLWCt2RkR6K2xCSVhsN0ovWmdDZz09J1xuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaW52YWxpZCBzaWduYXR1cmVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKGZhbHNlLCB1dGlscy5pc1ZhbGlkU2lnbmF0dXJlKCcweDlhYzZhMGMzMTNjNGEwNTYzYTE2OWRhZDI5ZjFkMDE4NjQ3NjgzYmU1NGEzMTRlZDIyOWEyNjkzMjkzZGZjOTgnKSk7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRTaWduYXR1cmUoJ2dvcHBCVERnTHVCYmNVNXRQOTBuM2lndlpHSG1jRTIzSENveExmZEp3T0NjYnl6dFZoOXIwVFBhY0pSWG1qWjYnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBzaWduYXR1cmVzIHdpdGggaW5jb3JyZWN0IGxlbmd0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZFNpZ25hdHVyZSgnZEc5dlUyaHZjblE9JykpOyAvLyBUb28gc2hvcnQgYmFzZTY0XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBub24tYmFzZTY0IHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRTaWduYXR1cmUoJ25vdCBhIGJhc2U2NCBzdHJpbmchISEnKSk7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRTaWduYXR1cmUoJycpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRIZXgnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IGhleCBzdHJpbmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKHRydWUsIHV0aWxzLmlzVmFsaWRIZXgoJzB4YWJjZGVmJywgNikpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRydWUsIHV0aWxzLmlzVmFsaWRIZXgoJzB4MTIzNDU2JywgNikpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRydWUsIHV0aWxzLmlzVmFsaWRIZXgoJzBYQUJDREVGJywgNikpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaGV4IHN0cmluZ3Mgd2l0aCBpbmNvcnJlY3QgbGVuZ3RoJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKGZhbHNlLCB1dGlscy5pc1ZhbGlkSGV4KCcweGFiY2QnLCA2KSk7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRIZXgoJzB4YWJjZGVmZ2gnLCA2KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBoZXggc3RyaW5ncyB3aXRob3V0IHByZWZpeCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZEhleCgnYWJjZGVmJywgNikpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaGV4IHN0cmluZ3Mgd2l0aCBub24taGV4IGNoYXJhY3RlcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRIZXgoJzB4Z2hpamtsJywgNikpO1xuICAgICAgc2hvdWxkLmVxdWFsKGZhbHNlLCB1dGlscy5pc1ZhbGlkSGV4KCcweGFiY2RlZycsIDYpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKHRydWUsIHV0aWxzLmlzVmFsaWRIZXgoJzB4QUJDREVGJywgNikpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRydWUsIHV0aWxzLmlzVmFsaWRIZXgoJzB4YWJjZGVmJywgNikpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRydWUsIHV0aWxzLmlzVmFsaWRIZXgoJzB4QWJDZEVmJywgNikpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSB2YWxpZCBhZGRyZXNzIGZyb20gcHVibGljIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleSh0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5KTtcbiAgICAgIHNob3VsZC5leGlzdChhZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGNvbnNpc3RlbnQgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzczEgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleSh0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5KTtcbiAgICAgIGNvbnN0IGFkZHJlc3MyID0gdXRpbHMuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkodGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSk7XG4gICAgICBzaG91bGQuZXF1YWwoYWRkcmVzczEsIGFkZHJlc3MyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgZGlmZmVyZW50IGFkZHJlc3NlcyBmb3IgZGlmZmVyZW50IGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzMSA9IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkpO1xuICAgICAgY29uc3QgYWRkcmVzczIgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleSh0ZXN0RGF0YS5nYXNTcG9uc29yLnB1YmxpY0tleSk7XG4gICAgICBzaG91bGQubm90RXF1YWwoYWRkcmVzczEsIGFkZHJlc3MyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEJhc2U2NFN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgVWludDhBcnJheSB0byBiYXNlNjQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB1aW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoWzcyLCAxMDEsIDEwOCwgMTA4LCAxMTFdKTsgLy8gXCJIZWxsb1wiXG4gICAgICBjb25zdCByZXN1bHQgPSB1dGlscy5nZXRCYXNlNjRTdHJpbmcodWludDhBcnJheSk7XG4gICAgICBzaG91bGQuZXhpc3QocmVzdWx0KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eXBlb2YgcmVzdWx0LCAnc3RyaW5nJyk7XG4gICAgICBzaG91bGQuZXF1YWwocmVzdWx0Lmxlbmd0aCA+IDAsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IGhleCBzdHJpbmcgdG8gYmFzZTY0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaGV4U3RyaW5nID0gJzQ4NjU2YzZjNmYnOyAvLyBcIkhlbGxvXCIgaW4gaGV4XG4gICAgICBjb25zdCByZXN1bHQgPSB1dGlscy5nZXRCYXNlNjRTdHJpbmcoaGV4U3RyaW5nKTtcbiAgICAgIHNob3VsZC5leGlzdChyZXN1bHQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR5cGVvZiByZXN1bHQsICdzdHJpbmcnKTtcbiAgICAgIHNob3VsZC5lcXVhbChyZXN1bHQubGVuZ3RoID4gMCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSBVaW50OEFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZW1wdHlBcnJheSA9IG5ldyBVaW50OEFycmF5KFtdKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHV0aWxzLmdldEJhc2U2NFN0cmluZyhlbXB0eUFycmF5KTtcbiAgICAgIHNob3VsZC5leGlzdChyZXN1bHQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR5cGVvZiByZXN1bHQsICdzdHJpbmcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIEJ1ZmZlciBjb252ZXJzaW9uIHRvIGJhc2U2NCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKCdIZWxsbyBXb3JsZCcpO1xuICAgICAgY29uc3QgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgICBjb25zdCByZXN1bHQgPSB1dGlscy5nZXRCYXNlNjRTdHJpbmcodWludDhBcnJheSk7XG4gICAgICBzaG91bGQuZXhpc3QocmVzdWx0KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eXBlb2YgcmVzdWx0LCAnc3RyaW5nJyk7XG4gICAgICBzaG91bGQuZXF1YWwocmVzdWx0Lmxlbmd0aCA+IDAsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb25zaXN0ZW50bHkgY29udmVydCBzYW1lIGlucHV0IHRvIHNhbWUgb3V0cHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KFsxLCAyLCAzLCA0LCA1XSk7XG4gICAgICBjb25zdCByZXN1bHQxID0gdXRpbHMuZ2V0QmFzZTY0U3RyaW5nKHVpbnQ4QXJyYXkpO1xuICAgICAgY29uc3QgcmVzdWx0MiA9IHV0aWxzLmdldEJhc2U2NFN0cmluZyhuZXcgVWludDhBcnJheShbMSwgMiwgMywgNCwgNV0pKTtcbiAgICAgIHNob3VsZC5lcXVhbChyZXN1bHQxLCByZXN1bHQyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRSYXdUcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHByb3BlciByYXcgdHJhbnNhY3Rpb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGlvdGEnKSk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gYXdhaXQgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSByYXcgdHJhbnNhY3Rpb25zIGFzIFVpbnQ4QXJyYXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0aW90YScpKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSBhd2FpdCB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3QgcmF3VHhCeXRlcyA9IEJ1ZmZlci5mcm9tKHJhd1R4LCAnYmFzZTY0Jyk7XG5cbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHhCeXRlcyksIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaW52YWxpZCByYXcgdHJhbnNhY3Rpb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbignaW52YWxpZFJhd1R4JyksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24oJycpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKCcweDEyMzQ1NicpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpbnZhbGlkIGJhc2U2NCBzdHJpbmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbignbm90LWJhc2U2NCEhIScpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBtYWxmb3JtZWQgdHJhbnNhY3Rpb24gZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1hbGZvcm1lZEJhc2U2NCA9IEJ1ZmZlci5mcm9tKCdtYWxmb3JtZWQgZGF0YScpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24obWFsZm9ybWVkQmFzZTY0KSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19