@appium/support 2.55.3 → 2.56.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 (55) hide show
  1. package/build/lib/env.js +102 -0
  2. package/build/lib/fs.js +74 -56
  3. package/build/lib/image-util.js +4 -339
  4. package/build/lib/index.js +18 -6
  5. package/build/lib/log-internal.js +2 -4
  6. package/build/lib/logger.js +2 -4
  7. package/build/lib/logging.js +2 -4
  8. package/build/lib/mjpeg.js +2 -4
  9. package/build/lib/mkdirp.js +7 -11
  10. package/build/lib/net.js +2 -4
  11. package/build/lib/node.js +99 -2
  12. package/build/lib/npm.js +240 -0
  13. package/build/lib/plist.js +2 -4
  14. package/build/lib/process.js +2 -4
  15. package/build/lib/system.js +2 -4
  16. package/build/lib/tempdir.js +2 -4
  17. package/build/lib/timing.js +2 -4
  18. package/build/lib/util.js +6 -8
  19. package/build/lib/zip.js +4 -8
  20. package/lib/env.js +162 -0
  21. package/lib/fs.js +193 -69
  22. package/lib/image-util.js +3 -578
  23. package/lib/index.js +8 -2
  24. package/lib/log-internal.js +2 -2
  25. package/lib/logging.js +1 -1
  26. package/lib/mkdirp.js +3 -6
  27. package/lib/net.js +4 -4
  28. package/lib/node.js +104 -1
  29. package/lib/npm.js +335 -0
  30. package/lib/tempdir.js +6 -6
  31. package/lib/util.js +28 -24
  32. package/lib/zip.js +7 -8
  33. package/package.json +21 -9
  34. package/build/test/assets/sample_binary.plist +0 -0
  35. package/build/test/assets/sample_text.plist +0 -28
  36. package/build/test/fs-specs.js +0 -264
  37. package/build/test/helpers.js +0 -35
  38. package/build/test/image-util-e2e-specs.js +0 -227
  39. package/build/test/index-specs.js +0 -49
  40. package/build/test/log-internals-specs.js +0 -97
  41. package/build/test/logger/helpers.js +0 -71
  42. package/build/test/logger/logger-force-specs.js +0 -41
  43. package/build/test/logger/logger-normal-specs.js +0 -113
  44. package/build/test/logger/logger-test-specs.js +0 -40
  45. package/build/test/mjpeg-e2e-specs.js +0 -96
  46. package/build/test/net-e2e-specs.js +0 -32
  47. package/build/test/node-e2e-specs.js +0 -22
  48. package/build/test/plist-specs.js +0 -54
  49. package/build/test/process-specs.js +0 -104
  50. package/build/test/system-specs.js +0 -136
  51. package/build/test/tempdir-specs.js +0 -86
  52. package/build/test/timing-specs.js +0 -125
  53. package/build/test/util-e2e-specs.js +0 -136
  54. package/build/test/util-specs.js +0 -537
  55. package/build/test/zip-e2e-specs.js +0 -233
@@ -1,537 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- require("source-map-support/register");
6
-
7
- var _lib = require("../lib");
8
-
9
- var _bluebird = _interopRequireDefault(require("bluebird"));
10
-
11
- var _sinon = _interopRequireDefault(require("sinon"));
12
-
13
- var _os = _interopRequireDefault(require("os"));
14
-
15
- var _path = _interopRequireDefault(require("path"));
16
-
17
- var _lodash = _interopRequireDefault(require("lodash"));
18
-
19
- const {
20
- W3C_WEB_ELEMENT_IDENTIFIER
21
- } = _lib.util;
22
- describe('util', function () {
23
- describe('hasValue', function () {
24
- it('should exist', function () {
25
- should.exist(_lib.util.hasValue);
26
- });
27
- it('should handle undefined', function () {
28
- _lib.util.hasValue(undefined).should.be.false;
29
- });
30
- it('should handle not a number', function () {
31
- _lib.util.hasValue(NaN).should.be.false;
32
- });
33
- it('should handle null', function () {
34
- _lib.util.hasValue(null).should.be.false;
35
- });
36
- it('should handle functions', function () {
37
- _lib.util.hasValue(function () {}).should.be.true;
38
- });
39
- it('should handle empty arrays', function () {
40
- _lib.util.hasValue({}).should.be.true;
41
- });
42
- it('should handle zero', function () {
43
- _lib.util.hasValue(0).should.be.true;
44
- });
45
- it('should handle simple string', function () {
46
- _lib.util.hasValue('string').should.be.true;
47
- });
48
- it('should handle booleans', function () {
49
- _lib.util.hasValue(false).should.be.true;
50
- });
51
- it('should handle empty strings', function () {
52
- _lib.util.hasValue('').should.be.true;
53
- });
54
- });
55
- describe('hasContent', function () {
56
- it('should exist', function () {
57
- should.exist(_lib.util.hasContent);
58
- });
59
- it('should handle undefined', function () {
60
- _lib.util.hasContent(undefined).should.be.false;
61
- });
62
- it('should handle not a number', function () {
63
- _lib.util.hasContent(NaN).should.be.false;
64
- });
65
- it('should handle null', function () {
66
- _lib.util.hasContent(null).should.be.false;
67
- });
68
- it('should handle functions', function () {
69
- _lib.util.hasContent(function () {}).should.be.false;
70
- });
71
- it('should handle empty arrays', function () {
72
- _lib.util.hasContent({}).should.be.false;
73
- });
74
- it('should handle zero', function () {
75
- _lib.util.hasContent(0).should.be.false;
76
- });
77
- it('should handle simple string', function () {
78
- _lib.util.hasContent('string').should.be.true;
79
- });
80
- it('should handle booleans', function () {
81
- _lib.util.hasContent(false).should.be.false;
82
- });
83
- it('should handle empty strings', function () {
84
- _lib.util.hasContent('').should.be.false;
85
- });
86
- });
87
- describe('escapeSpace', function () {
88
- it('should do nothing to a string without space', function () {
89
- let actual = 'appium';
90
- let expected = 'appium';
91
-
92
- _lib.util.escapeSpace(actual).should.equal(expected);
93
- });
94
- it('should do escape spaces', function () {
95
- let actual = '/Applications/ Xcode 6.1.1.app/Contents/Developer';
96
- let expected = '/Applications/\\ Xcode\\ 6.1.1.app/Contents/Developer';
97
-
98
- _lib.util.escapeSpace(actual).should.equal(expected);
99
- });
100
- it('should escape consecutive spaces', function () {
101
- let actual = 'appium space';
102
- let expected = 'appium\\ \\ \\ space';
103
-
104
- _lib.util.escapeSpace(actual).should.equal(expected);
105
- });
106
- });
107
- describe('localIp', function () {
108
- it('should find a local ip address', function () {
109
- let ifConfigOut = {
110
- lo0: [{
111
- address: '::1',
112
- netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
113
- family: 'IPv6',
114
- mac: '00:00:00:00:00:00',
115
- scopeid: 0,
116
- internal: true
117
- }, {
118
- address: '127.0.0.1',
119
- netmask: '255.0.0.0',
120
- family: 'IPv4',
121
- mac: '00:00:00:00:00:00',
122
- internal: true
123
- }, {
124
- address: 'fe80::1',
125
- netmask: 'ffff:ffff:ffff:ffff::',
126
- family: 'IPv6',
127
- mac: '00:00:00:00:00:00',
128
- scopeid: 1,
129
- internal: true
130
- }],
131
- en0: [{
132
- address: 'xxx',
133
- netmask: 'ffff:ffff:ffff:ffff::',
134
- family: 'IPv6',
135
- mac: 'd0:e1:40:93:56:9a',
136
- scopeid: 4,
137
- internal: false
138
- }, {
139
- address: '123.123.123.123',
140
- netmask: '255.255.254.0',
141
- family: 'IPv4',
142
- mac: 'xxx',
143
- internal: false
144
- }],
145
- awdl0: [{
146
- address: 'xxx',
147
- netmask: 'ffff:ffff:ffff:ffff::',
148
- family: 'IPv6',
149
- mac: 'xxx',
150
- scopeid: 7,
151
- internal: false
152
- }]
153
- };
154
-
155
- let osMock = _sinon.default.mock(_os.default);
156
-
157
- osMock.expects('networkInterfaces').returns(ifConfigOut);
158
- ifConfigOut = '';
159
-
160
- let ip = _lib.util.localIp();
161
-
162
- ip.should.eql('123.123.123.123');
163
- osMock.verify();
164
- });
165
- });
166
- describe('cancellableDelay', function () {
167
- it('should delay', async function () {
168
- await _lib.util.cancellableDelay('10');
169
- });
170
- it('cancel should work', async function () {
171
- let delay = _lib.util.cancellableDelay('1000');
172
-
173
- await _bluebird.default.delay(10);
174
- delay.cancel();
175
- await delay.should.eventually.be.rejectedWith(/cancellation error/);
176
- });
177
- });
178
- describe('safeJsonParse', function () {
179
- it('should pass object through', function () {
180
- const obj = {
181
- a: 'a',
182
- b: 'b'
183
- };
184
-
185
- _lib.util.safeJsonParse(obj).should.equal(obj);
186
- });
187
- it('should correctly parse json string', function () {
188
- const obj = {
189
- a: 'a',
190
- b: 'b'
191
- };
192
-
193
- _lib.util.safeJsonParse(JSON.stringify(obj)).should.eql(obj);
194
- });
195
- it('should pass an array through', function () {
196
- const arr = ['a', 'b'];
197
-
198
- _lib.util.safeJsonParse(arr).should.eql(arr);
199
- });
200
- it('should correctly parse json array', function () {
201
- const arr = ['a', 'b'];
202
-
203
- _lib.util.safeJsonParse(JSON.stringify(arr)).should.eql(arr);
204
- });
205
- it('should pass null through', function () {
206
- const obj = null;
207
- _lodash.default.isNull(_lib.util.safeJsonParse(obj)).should.be.true;
208
- });
209
- it('should pass simple string through', function () {
210
- const str = 'str';
211
-
212
- _lib.util.safeJsonParse(str).should.eql(str);
213
- });
214
- it('should pass a number through', function () {
215
- const num = 42;
216
-
217
- _lib.util.safeJsonParse(num).should.eql(num);
218
- });
219
- it('should make a number from a string representation', function () {
220
- const num = 42;
221
-
222
- _lib.util.safeJsonParse(String(num)).should.eql(num);
223
- });
224
- });
225
- describe('jsonStringify', function () {
226
- it('should use JSON.stringify if no Buffer involved', function () {
227
- const obj = {
228
- k1: 'v1',
229
- k2: 'v2',
230
- k3: 'v3'
231
- };
232
- const jsonString = JSON.stringify(obj, null, 2);
233
-
234
- _lib.util.jsonStringify(obj).should.eql(jsonString);
235
- });
236
- it('should serialize a Buffer', function () {
237
- const obj = {
238
- k1: 'v1',
239
- k2: 'v2',
240
- k3: Buffer.from('hi how are you today')
241
- };
242
-
243
- _lib.util.jsonStringify(obj).should.include('hi how are you today');
244
- });
245
- it('should use the replacer function on non-buffer values', function () {
246
- const obj = {
247
- k1: 'v1',
248
- k2: 'v2',
249
- k3: 'v3'
250
- };
251
-
252
- function replacer(key, value) {
253
- return _lodash.default.isString(value) ? value.toUpperCase() : value;
254
- }
255
-
256
- const jsonString = _lib.util.jsonStringify(obj, replacer);
257
-
258
- jsonString.should.include('V1');
259
- jsonString.should.include('V2');
260
- jsonString.should.include('V3');
261
- });
262
- it('should use the replacer function on buffers', function () {
263
- const obj = {
264
- k1: 'v1',
265
- k2: 'v2',
266
- k3: Buffer.from('hi how are you today')
267
- };
268
-
269
- function replacer(key, value) {
270
- return _lodash.default.isString(value) ? value.toUpperCase() : value;
271
- }
272
-
273
- const jsonString = _lib.util.jsonStringify(obj, replacer);
274
-
275
- jsonString.should.include('V1');
276
- jsonString.should.include('V2');
277
- jsonString.should.include('HI HOW ARE YOU TODAY');
278
- });
279
- it('should use the replacer function recursively', function () {
280
- const obj = {
281
- k1: 'v1',
282
- k2: 'v2',
283
- k3: Buffer.from('hi how are you today'),
284
- k4: {
285
- k5: 'v5'
286
- }
287
- };
288
-
289
- function replacer(key, value) {
290
- return _lodash.default.isString(value) ? value.toUpperCase() : value;
291
- }
292
-
293
- const jsonString = _lib.util.jsonStringify(obj, replacer);
294
-
295
- jsonString.should.include('V1');
296
- jsonString.should.include('V2');
297
- jsonString.should.include('HI HOW ARE YOU TODAY');
298
- jsonString.should.include('V5');
299
- });
300
- });
301
- describe('unwrapElement', function () {
302
- it('should pass through an unwrapped element', function () {
303
- let el = 4;
304
-
305
- _lib.util.unwrapElement(el).should.equal(el);
306
- });
307
- it('should pass through an element that is an object', function () {
308
- let el = {
309
- RANDOM: 4
310
- };
311
-
312
- _lib.util.unwrapElement(el).should.equal(el);
313
- });
314
- it('should unwrap a wrapped element', function () {
315
- let el = {
316
- ELEMENT: 4
317
- };
318
-
319
- _lib.util.unwrapElement(el).should.eql(4);
320
- });
321
- it('should unwrap a wrapped element that uses W3C element identifier', function () {
322
- let el = {
323
- [W3C_WEB_ELEMENT_IDENTIFIER]: 5
324
- };
325
-
326
- _lib.util.unwrapElement(el).should.eql(5);
327
- });
328
- it('should unwrap a wrapped element and prioritize W3C element identifier', function () {
329
- let el = {
330
- ELEMENT: 7,
331
- [W3C_WEB_ELEMENT_IDENTIFIER]: 6
332
- };
333
-
334
- _lib.util.unwrapElement(el).should.eql(6);
335
- });
336
- });
337
- describe('wrapElement', function () {
338
- it('should include ELEMENT and w3c element', function () {
339
- _lib.util.wrapElement(123).should.eql({
340
- [_lib.util.W3C_WEB_ELEMENT_IDENTIFIER]: 123,
341
- ELEMENT: 123
342
- });
343
- });
344
- });
345
- describe('toReadableSizeString', function () {
346
- it('should fail if cannot convert to Bytes', function () {
347
- (() => _lib.util.toReadableSizeString('asdasd')).should.throw(/Cannot convert/);
348
- });
349
- it('should properly convert to Bytes', function () {
350
- _lib.util.toReadableSizeString(0).should.equal('0 B');
351
- });
352
- it('should properly convert to KBytes', function () {
353
- _lib.util.toReadableSizeString(2048 + 12).should.equal('2.01 KB');
354
- });
355
- it('should properly convert to MBytes', function () {
356
- _lib.util.toReadableSizeString(1024 * 1024 * 3 + 1024 * 10).should.equal('3.01 MB');
357
- });
358
- it('should properly convert to GBytes', function () {
359
- _lib.util.toReadableSizeString(1024 * 1024 * 1024 * 5).should.equal('5.00 GB');
360
- });
361
- });
362
- describe('filterObject', function () {
363
- describe('with undefined predicate', function () {
364
- it('should filter out undefineds', function () {
365
- let obj = {
366
- a: 'a',
367
- b: 'b',
368
- c: undefined
369
- };
370
-
371
- _lib.util.filterObject(obj).should.eql({
372
- a: 'a',
373
- b: 'b'
374
- });
375
- });
376
- it('should leave nulls alone', function () {
377
- let obj = {
378
- a: 'a',
379
- b: 'b',
380
- c: null
381
- };
382
-
383
- _lib.util.filterObject(obj).should.eql({
384
- a: 'a',
385
- b: 'b',
386
- c: null
387
- });
388
- });
389
- });
390
- describe('with value predicate', function () {
391
- it('should filter elements by their value', function () {
392
- let obj = {
393
- a: 'a',
394
- b: 'b',
395
- c: 'c',
396
- d: 'a'
397
- };
398
-
399
- _lib.util.filterObject(obj, 'a').should.eql({
400
- a: 'a',
401
- d: 'a'
402
- });
403
- });
404
- });
405
- describe('with function predicate', function () {
406
- it('should filter elements', function () {
407
- let obj = {
408
- a: 'a',
409
- b: 'b',
410
- c: 'c'
411
- };
412
-
413
- _lib.util.filterObject(obj, v => v === 'a' || v === 'c').should.eql({
414
- a: 'a',
415
- c: 'c'
416
- });
417
- });
418
- });
419
- });
420
- describe('isSubPath', function () {
421
- it('should detect simple subpath', function () {
422
- _lib.util.isSubPath('/root/some', '/root').should.be.true;
423
- });
424
- it('should detect complex subpath', function () {
425
- _lib.util.isSubPath('/root/some/other/../../.', '/root').should.be.true;
426
- });
427
- it('should detect subpath ending with a slash', function () {
428
- _lib.util.isSubPath('/root/some/', '/root').should.be.true;
429
- });
430
- it('should detect if a path is not a subpath', function () {
431
- _lib.util.isSubPath('/root/some//../..', '/root').should.be.false;
432
- });
433
- it('should throw if any of the given paths is not absolute', function () {
434
- should.throw(() => _lib.util.isSubPath('some/..', '/root'), /absolute/);
435
- });
436
- });
437
- describe('isSameDestination', function () {
438
- let path1;
439
- let path2;
440
- let tmpDir;
441
- before(async function () {
442
- tmpDir = await _lib.tempDir.openDir();
443
- path1 = _path.default.resolve(tmpDir, 'path1.txt');
444
- path2 = _path.default.resolve(tmpDir, 'path2.txt');
445
-
446
- for (const p of [path1, path2]) {
447
- await _lib.fs.writeFile(p, p, 'utf8');
448
- }
449
- });
450
- after(async function () {
451
- await _lib.fs.rimraf(tmpDir);
452
- });
453
- it('should match paths to the same file/folder', async function () {
454
- (await _lib.util.isSameDestination(path1, _path.default.resolve(tmpDir, '..', _path.default.basename(tmpDir), _path.default.basename(path1)))).should.be.true;
455
- });
456
- it('should not match paths if they point to non existing items', async function () {
457
- (await _lib.util.isSameDestination(path1, 'blabla')).should.be.false;
458
- });
459
- it('should not match paths to different files', async function () {
460
- (await _lib.util.isSameDestination(path1, path2)).should.be.false;
461
- });
462
- });
463
- describe('compareVersions', function () {
464
- it('should compare two correct version numbers', function () {
465
- _lib.util.compareVersions('10.0', '<', '11.0').should.eql(true);
466
-
467
- _lib.util.compareVersions('11.0', '>=', '11.0').should.eql(true);
468
-
469
- _lib.util.compareVersions('11.0', '==', '11.0').should.eql(true);
470
-
471
- _lib.util.compareVersions('13.10', '>', '13.5').should.eql(true);
472
-
473
- _lib.util.compareVersions('11.1', '!=', '11.10').should.eql(true);
474
-
475
- _lib.util.compareVersions('12.0', '<', 10).should.eql(false);
476
- });
477
- it('should throw if any of version arguments is invalid', function () {
478
- should.throw(() => _lib.util.compareVersions(undefined, '<', '11.0'));
479
- should.throw(() => _lib.util.compareVersions('11.0', '==', null));
480
- });
481
- it('should throw if comparison operator is unsupported', function () {
482
- should.throw(() => _lib.util.compareVersions('12.0', 'abc', 10));
483
- });
484
- });
485
- describe('quote', function () {
486
- it('should quote a string with a space', function () {
487
- _lib.util.quote(['a', 'b', 'c d']).should.eql('a b \'c d\'');
488
- });
489
- it('should escape double quotes', function () {
490
- _lib.util.quote(['a', 'b', `it's a "neat thing"`]).should.eql(`a b "it's a \\"neat thing\\""`);
491
- });
492
- it("should escape $ ` and '", function () {
493
- _lib.util.quote(['$', '`', `'`]).should.eql('\\$ \\` "\'"');
494
- });
495
- it('should handle empty array', function () {
496
- _lib.util.quote([]).should.eql('');
497
- });
498
- it('should quote a string with newline', function () {
499
- _lib.util.quote(['a\nb']).should.eql(`'a\nb'`);
500
- });
501
- it('should stringify booleans', function () {
502
- _lib.util.quote(['a', 1, true, false]).should.eql('a 1 true false');
503
- });
504
- it('should stringify null and undefined', function () {
505
- _lib.util.quote(['a', 1, null, undefined]).should.eql('a 1 null undefined');
506
- });
507
- });
508
- describe('unleakString', function () {
509
- it('should unleak a string', function () {
510
- _lib.util.unleakString('yolo').should.eql('yolo');
511
- });
512
- it('should unleak a multiline string', function () {
513
- _lib.util.unleakString(' yolo\nbolo ').should.eql(' yolo\nbolo ');
514
- });
515
- it('should convert an object to a string', function () {
516
- for (const obj of [{}, null, undefined, [], 0]) {
517
- _lib.util.unleakString(obj).should.eql(`${obj}`);
518
- }
519
- });
520
- });
521
- describe('pluralize', function () {
522
- it('should pluralize a string', function () {
523
- _lib.util.pluralize('word', 2).should.eql('words');
524
- });
525
- it('should pluralize a string and prepend the number through boolean', function () {
526
- _lib.util.pluralize('word', 2, true).should.eql('2 words');
527
- });
528
- it('should pluralize a string and prepend the number through options', function () {
529
- _lib.util.pluralize('word', 2, {
530
- inclusive: true
531
- }).should.eql('2 words');
532
- });
533
- });
534
- });require('source-map-support').install();
535
-
536
-
537
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvdXRpbC1zcGVjcy5qcyJdLCJuYW1lcyI6WyJXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUiIsInV0aWwiLCJkZXNjcmliZSIsIml0Iiwic2hvdWxkIiwiZXhpc3QiLCJoYXNWYWx1ZSIsInVuZGVmaW5lZCIsImJlIiwiZmFsc2UiLCJOYU4iLCJ0cnVlIiwiaGFzQ29udGVudCIsImFjdHVhbCIsImV4cGVjdGVkIiwiZXNjYXBlU3BhY2UiLCJlcXVhbCIsImlmQ29uZmlnT3V0IiwibG8wIiwiYWRkcmVzcyIsIm5ldG1hc2siLCJmYW1pbHkiLCJtYWMiLCJzY29wZWlkIiwiaW50ZXJuYWwiLCJlbjAiLCJhd2RsMCIsIm9zTW9jayIsInNpbm9uIiwibW9jayIsIm9zIiwiZXhwZWN0cyIsInJldHVybnMiLCJpcCIsImxvY2FsSXAiLCJlcWwiLCJ2ZXJpZnkiLCJjYW5jZWxsYWJsZURlbGF5IiwiZGVsYXkiLCJCIiwiY2FuY2VsIiwiZXZlbnR1YWxseSIsInJlamVjdGVkV2l0aCIsIm9iaiIsImEiLCJiIiwic2FmZUpzb25QYXJzZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJhcnIiLCJfIiwiaXNOdWxsIiwic3RyIiwibnVtIiwiU3RyaW5nIiwiazEiLCJrMiIsImszIiwianNvblN0cmluZyIsImpzb25TdHJpbmdpZnkiLCJCdWZmZXIiLCJmcm9tIiwiaW5jbHVkZSIsInJlcGxhY2VyIiwia2V5IiwidmFsdWUiLCJpc1N0cmluZyIsInRvVXBwZXJDYXNlIiwiazQiLCJrNSIsImVsIiwidW53cmFwRWxlbWVudCIsIlJBTkRPTSIsIkVMRU1FTlQiLCJ3cmFwRWxlbWVudCIsInRvUmVhZGFibGVTaXplU3RyaW5nIiwidGhyb3ciLCJjIiwiZmlsdGVyT2JqZWN0IiwiZCIsInYiLCJpc1N1YlBhdGgiLCJwYXRoMSIsInBhdGgyIiwidG1wRGlyIiwiYmVmb3JlIiwidGVtcERpciIsIm9wZW5EaXIiLCJwYXRoIiwicmVzb2x2ZSIsInAiLCJmcyIsIndyaXRlRmlsZSIsImFmdGVyIiwicmltcmFmIiwiaXNTYW1lRGVzdGluYXRpb24iLCJiYXNlbmFtZSIsImNvbXBhcmVWZXJzaW9ucyIsInF1b3RlIiwidW5sZWFrU3RyaW5nIiwicGx1cmFsaXplIiwiaW5jbHVzaXZlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNO0FBQUNBLEVBQUFBO0FBQUQsSUFBK0JDLFNBQXJDO0FBSUFDLFFBQVEsQ0FBQyxNQUFELEVBQVMsWUFBWTtBQUMzQkEsRUFBQUEsUUFBUSxDQUFDLFVBQUQsRUFBYSxZQUFZO0FBQy9CQyxJQUFBQSxFQUFFLENBQUMsY0FBRCxFQUFpQixZQUFZO0FBQzdCQyxNQUFBQSxNQUFNLENBQUNDLEtBQVAsQ0FBYUosVUFBS0ssUUFBbEI7QUFDRCxLQUZDLENBQUY7QUFJQUgsSUFBQUEsRUFBRSxDQUFDLHlCQUFELEVBQTRCLFlBQVk7QUFDeENGLGdCQUFLSyxRQUFMLENBQWNDLFNBQWQsRUFBeUJILE1BQXpCLENBQWdDSSxFQUFoQyxDQUFtQ0MsS0FBbkM7QUFDRCxLQUZDLENBQUY7QUFJQU4sSUFBQUEsRUFBRSxDQUFDLDRCQUFELEVBQStCLFlBQVk7QUFDM0NGLGdCQUFLSyxRQUFMLENBQWNJLEdBQWQsRUFBbUJOLE1BQW5CLENBQTBCSSxFQUExQixDQUE2QkMsS0FBN0I7QUFDRCxLQUZDLENBQUY7QUFJQU4sSUFBQUEsRUFBRSxDQUFDLG9CQUFELEVBQXVCLFlBQVk7QUFDbkNGLGdCQUFLSyxRQUFMLENBQWMsSUFBZCxFQUFvQkYsTUFBcEIsQ0FBMkJJLEVBQTNCLENBQThCQyxLQUE5QjtBQUNELEtBRkMsQ0FBRjtBQUlBTixJQUFBQSxFQUFFLENBQUMseUJBQUQsRUFBNEIsWUFBWTtBQUN4Q0YsZ0JBQUtLLFFBQUwsQ0FBYyxZQUFZLENBQUUsQ0FBNUIsRUFBOEJGLE1BQTlCLENBQXFDSSxFQUFyQyxDQUF3Q0csSUFBeEM7QUFDRCxLQUZDLENBQUY7QUFJQVIsSUFBQUEsRUFBRSxDQUFD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cG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5jb25zdCB7VzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVJ9ID0gdXRpbDtcblxuXG5cbmRlc2NyaWJlKCd1dGlsJywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnaGFzVmFsdWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBleGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5leGlzdCh1dGlsLmhhc1ZhbHVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHVuZGVmaW5lZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaGFzVmFsdWUodW5kZWZpbmVkKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBub3QgYSBudW1iZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmhhc1ZhbHVlKE5hTikuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbnVsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaGFzVmFsdWUobnVsbCkuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZnVuY3Rpb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5oYXNWYWx1ZShmdW5jdGlvbiAoKSB7fSkuc2hvdWxkLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSBhcnJheXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmhhc1ZhbHVlKHt9KS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHplcm8nLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmhhc1ZhbHVlKDApLnNob3VsZC5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgc2ltcGxlIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaGFzVmFsdWUoJ3N0cmluZycpLnNob3VsZC5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgYm9vbGVhbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmhhc1ZhbHVlKGZhbHNlKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGVtcHR5IHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmhhc1ZhbHVlKCcnKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2hhc0NvbnRlbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBleGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5leGlzdCh1dGlsLmhhc0NvbnRlbnQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgdW5kZWZpbmVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5oYXNDb250ZW50KHVuZGVmaW5lZCkuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbm90IGEgbnVtYmVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5oYXNDb250ZW50KE5hTikuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbnVsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaGFzQ29udGVudChudWxsKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBmdW5jdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmhhc0NvbnRlbnQoZnVuY3Rpb24gKCkge30pLnNob3VsZC5iZS5mYWxzZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGVtcHR5IGFycmF5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaGFzQ29udGVudCh7fSkuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgemVybycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaGFzQ29udGVudCgwKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBzaW1wbGUgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5oYXNDb250ZW50KCdzdHJpbmcnKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGJvb2xlYW5zJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5oYXNDb250ZW50KGZhbHNlKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSBzdHJpbmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5oYXNDb250ZW50KCcnKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlc2NhcGVTcGFjZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGRvIG5vdGhpbmcgdG8gYSBzdHJpbmcgd2l0aG91dCBzcGFjZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBhY3R1YWwgPSAnYXBwaXVtJztcbiAgICAgIGxldCBleHBlY3RlZCA9ICdhcHBpdW0nO1xuICAgICAgdXRpbC5lc2NhcGVTcGFjZShhY3R1YWwpLnNob3VsZC5lcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRvIGVzY2FwZSBzcGFjZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgYWN0dWFsID0gJy9BcHBsaWNhdGlvbnMvIFhjb2RlIDYuMS4xLmFwcC9Db250ZW50cy9EZXZlbG9wZXInO1xuICAgICAgbGV0IGV4cGVjdGVkID0gJy9BcHBsaWNhdGlvbnMvXFxcXCBYY29kZVxcXFwgNi4xLjEuYXBwL0NvbnRlbnRzL0RldmVsb3Blcic7XG4gICAgICB1dGlsLmVzY2FwZVNwYWNlKGFjdHVhbCkuc2hvdWxkLmVxdWFsKGV4cGVjdGVkKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXNjYXBlIGNvbnNlY3V0aXZlIHNwYWNlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBhY3R1YWwgPSAnYXBwaXVtICAgc3BhY2UnO1xuICAgICAgbGV0IGV4cGVjdGVkID0gJ2FwcGl1bVxcXFwgXFxcXCBcXFxcIHNwYWNlJztcbiAgICAgIHV0aWwuZXNjYXBlU3BhY2UoYWN0dWFsKS5zaG91bGQuZXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbG9jYWxJcCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGZpbmQgYSBsb2NhbCBpcCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGlmQ29uZmlnT3V0ID0ge1xuICAgICAgICBsbzA6XG4gICAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnOjoxJyxcbiAgICAgICAgICAgICAgbmV0bWFzazogJ2ZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZicsXG4gICAgICAgICAgICAgIGZhbWlseTogJ0lQdjYnLFxuICAgICAgICAgICAgICBtYWM6ICcwMDowMDowMDowMDowMDowMCcsXG4gICAgICAgICAgICAgIHNjb3BlaWQ6IDAsXG4gICAgICAgICAgICAgIGludGVybmFsOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogJzEyNy4wLjAuMScsXG4gICAgICAgICAgICAgIG5ldG1hc2s6ICcyNTUuMC4wLjAnLFxuICAgICAgICAgICAgICBmYW1pbHk6ICdJUHY0JyxcbiAgICAgICAgICAgICAgbWFjOiAnMDA6MDA6MDA6MDA6MDA6MDAnLFxuICAgICAgICAgICAgICBpbnRlcm5hbDogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICdmZTgwOjoxJyxcbiAgICAgICAgICAgICAgbmV0bWFzazogJ2ZmZmY6ZmZmZjpmZmZmOmZmZmY6OicsXG4gICAgICAgICAgICAgIGZhbWlseTogJ0lQdjYnLFxuICAgICAgICAgICAgICBtYWM6ICcwMDowMDowMDowMDowMDowMCcsXG4gICAgICAgICAgICAgIHNjb3BlaWQ6IDEsXG4gICAgICAgICAgICAgIGludGVybmFsOiB0cnVlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgIGVuMDpcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICd4eHgnLFxuICAgICAgICAgICAgICBuZXRtYXNrOiAnZmZmZjpmZmZmOmZmZmY6ZmZmZjo6JyxcbiAgICAgICAgICAgICAgZmFtaWx5OiAnSVB2NicsXG4gICAgICAgICAgICAgIG1hYzogJ2QwOmUxOjQwOjkzOjU2OjlhJyxcbiAgICAgICAgICAgICAgc2NvcGVpZDogNCxcbiAgICAgICAgICAgICAgaW50ZXJuYWw6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogJzEyMy4xMjMuMTIzLjEyMycsXG4gICAgICAgICAgICAgIG5ldG1hc2s6ICcyNTUuMjU1LjI1NC4wJyxcbiAgICAgICAgICAgICAgZmFtaWx5OiAnSVB2NCcsXG4gICAgICAgICAgICAgIG1hYzogJ3h4eCcsXG4gICAgICAgICAgICAgIGludGVybmFsOiBmYWxzZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICBhd2RsMDpcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICd4eHgnLFxuICAgICAgICAgICAgICBuZXRtYXNrOiAnZmZmZjpmZmZmOmZmZmY6ZmZmZjo6JyxcbiAgICAgICAgICAgICAgZmFtaWx5OiAnSVB2NicsXG4gICAgICAgICAgICAgIG1hYzogJ3h4eCcsXG4gICAgICAgICAgICAgIHNjb3BlaWQ6IDcsXG4gICAgICAgICAgICAgIGludGVybmFsOiBmYWxzZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGxldCBvc01vY2sgPSBzaW5vbi5tb2NrKG9zKTtcbiAgICAgIG9zTW9jay5leHBlY3RzKCduZXR3b3JrSW50ZXJmYWNlcycpLnJldHVybnMoaWZDb25maWdPdXQpO1xuICAgICAgaWZDb25maWdPdXQgPSAnJztcbiAgICAgIGxldCBpcCA9IHV0aWwubG9jYWxJcCgpO1xuICAgICAgaXAuc2hvdWxkLmVxbCgnMTIzLjEyMy4xMjMuMTIzJyk7XG4gICAgICBvc01vY2sudmVyaWZ5KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjYW5jZWxsYWJsZURlbGF5JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZGVsYXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB1dGlsLmNhbmNlbGxhYmxlRGVsYXkoJzEwJyk7XG4gICAgfSk7XG4gICAgaXQoJ2NhbmNlbCBzaG91bGQgd29yaycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBkZWxheSA9IHV0aWwuY2FuY2VsbGFibGVEZWxheSgnMTAwMCcpO1xuICAgICAgYXdhaXQgQi5kZWxheSgxMCk7XG4gICAgICBkZWxheS5jYW5jZWwoKTtcbiAgICAgIGF3YWl0IGRlbGF5LnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aCgvY2FuY2VsbGF0aW9uIGVycm9yLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzYWZlSnNvblBhcnNlJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcGFzcyBvYmplY3QgdGhyb3VnaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9iaiA9IHthOiAnYScsIGI6ICdiJ307XG4gICAgICB1dGlsLnNhZmVKc29uUGFyc2Uob2JqKS5zaG91bGQuZXF1YWwob2JqKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBwYXJzZSBqc29uIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9iaiA9IHthOiAnYScsIGI6ICdiJ307XG4gICAgICB1dGlsLnNhZmVKc29uUGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSkuc2hvdWxkLmVxbChvYmopO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcGFzcyBhbiBhcnJheSB0aHJvdWdoJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYXJyID0gWydhJywgJ2InXTtcbiAgICAgIHV0aWwuc2FmZUpzb25QYXJzZShhcnIpLnNob3VsZC5lcWwoYXJyKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBwYXJzZSBqc29uIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYXJyID0gWydhJywgJ2InXTtcbiAgICAgIHV0aWwuc2FmZUpzb25QYXJzZShKU09OLnN0cmluZ2lmeShhcnIpKS5zaG91bGQuZXFsKGFycik7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwYXNzIG51bGwgdGhyb3VnaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9iaiA9IG51bGw7XG4gICAgICBfLmlzTnVsbCh1dGlsLnNhZmVKc29uUGFyc2Uob2JqKSkuc2hvdWxkLmJlLnRydWU7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwYXNzIHNpbXBsZSBzdHJpbmcgdGhyb3VnaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0ciA9ICdzdHInO1xuICAgICAgdXRpbC5zYWZlSnNvblBhcnNlKHN0cikuc2hvdWxkLmVxbChzdHIpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcGFzcyBhIG51bWJlciB0aHJvdWdoJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbnVtID0gNDI7XG4gICAgICB1dGlsLnNhZmVKc29uUGFyc2UobnVtKS5zaG91bGQuZXFsKG51bSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBtYWtlIGEgbnVtYmVyIGZyb20gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBudW0gPSA0MjtcbiAgICAgIHV0aWwuc2FmZUpzb25QYXJzZShTdHJpbmcobnVtKSkuc2hvdWxkLmVxbChudW0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnanNvblN0cmluZ2lmeScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHVzZSBKU09OLnN0cmluZ2lmeSBpZiBubyBCdWZmZXIgaW52b2x2ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvYmogPSB7XG4gICAgICAgIGsxOiAndjEnLFxuICAgICAgICBrMjogJ3YyJyxcbiAgICAgICAgazM6ICd2MycsXG4gICAgICB9O1xuICAgICAgY29uc3QganNvblN0cmluZyA9IEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMik7XG4gICAgICB1dGlsLmpzb25TdHJpbmdpZnkob2JqKS5zaG91bGQuZXFsKGpzb25TdHJpbmcpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgc2VyaWFsaXplIGEgQnVmZmVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb2JqID0ge1xuICAgICAgICBrMTogJ3YxJyxcbiAgICAgICAgazI6ICd2MicsXG4gICAgICAgIGszOiBCdWZmZXIuZnJvbSgnaGkgaG93IGFyZSB5b3UgdG9kYXknKSxcbiAgICAgIH07XG4gICAgICB1dGlsLmpzb25TdHJpbmdpZnkob2JqKS5zaG91bGQuaW5jbHVkZSgnaGkgaG93IGFyZSB5b3UgdG9kYXknKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHVzZSB0aGUgcmVwbGFjZXIgZnVuY3Rpb24gb24gbm9uLWJ1ZmZlciB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvYmogPSB7XG4gICAgICAgIGsxOiAndjEnLFxuICAgICAgICBrMjogJ3YyJyxcbiAgICAgICAgazM6ICd2MycsXG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gcmVwbGFjZXIgKGtleSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF8uaXNTdHJpbmcodmFsdWUpID8gdmFsdWUudG9VcHBlckNhc2UoKSA6IHZhbHVlO1xuICAgICAgfVxuICAgICAgY29uc3QganNvblN0cmluZyA9IHV0aWwuanNvblN0cmluZ2lmeShvYmosIHJlcGxhY2VyKTtcbiAgICAgIGpzb25TdHJpbmcuc2hvdWxkLmluY2x1ZGUoJ1YxJyk7XG4gICAgICBqc29uU3RyaW5nLnNob3VsZC5pbmNsdWRlKCdWMicpO1xuICAgICAganNvblN0cmluZy5zaG91bGQuaW5jbHVkZSgnVjMnKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHVzZSB0aGUgcmVwbGFjZXIgZnVuY3Rpb24gb24gYnVmZmVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgICAgazE6ICd2MScsXG4gICAgICAgIGsyOiAndjInLFxuICAgICAgICBrMzogQnVmZmVyLmZyb20oJ2hpIGhvdyBhcmUgeW91IHRvZGF5JyksXG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gcmVwbGFjZXIgKGtleSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF8uaXNTdHJpbmcodmFsdWUpID8gdmFsdWUudG9VcHBlckNhc2UoKSA6IHZhbHVlO1xuICAgICAgfVxuICAgICAgY29uc3QganNvblN0cmluZyA9IHV0aWwuanNvblN0cmluZ2lmeShvYmosIHJlcGxhY2VyKTtcbiAgICAgIGpzb25TdHJpbmcuc2hvdWxkLmluY2x1ZGUoJ1YxJyk7XG4gICAgICBqc29uU3RyaW5nLnNob3VsZC5pbmNsdWRlKCdWMicpO1xuICAgICAganNvblN0cmluZy5zaG91bGQuaW5jbHVkZSgnSEkgSE9XIEFSRSBZT1UgVE9EQVknKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHVzZSB0aGUgcmVwbGFjZXIgZnVuY3Rpb24gcmVjdXJzaXZlbHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvYmogPSB7XG4gICAgICAgIGsxOiAndjEnLFxuICAgICAgICBrMjogJ3YyJyxcbiAgICAgICAgazM6IEJ1ZmZlci5mcm9tKCdoaSBob3cgYXJlIHlvdSB0b2RheScpLFxuICAgICAgICBrNDoge1xuICAgICAgICAgIGs1OiAndjUnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGZ1bmN0aW9uIHJlcGxhY2VyIChrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfLmlzU3RyaW5nKHZhbHVlKSA/IHZhbHVlLnRvVXBwZXJDYXNlKCkgOiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSB1dGlsLmpzb25TdHJpbmdpZnkob2JqLCByZXBsYWNlcik7XG4gICAgICBqc29uU3RyaW5nLnNob3VsZC5pbmNsdWRlKCdWMScpO1xuICAgICAganNvblN0cmluZy5zaG91bGQuaW5jbHVkZSgnVjInKTtcbiAgICAgIGpzb25TdHJpbmcuc2hvdWxkLmluY2x1ZGUoJ0hJIEhPVyBBUkUgWU9VIFRPREFZJyk7XG4gICAgICBqc29uU3RyaW5nLnNob3VsZC5pbmNsdWRlKCdWNScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndW53cmFwRWxlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHBhc3MgdGhyb3VnaCBhbiB1bndyYXBwZWQgZWxlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBlbCA9IDQ7XG4gICAgICB1dGlsLnVud3JhcEVsZW1lbnQoZWwpLnNob3VsZC5lcXVhbChlbCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwYXNzIHRocm91Z2ggYW4gZWxlbWVudCB0aGF0IGlzIGFuIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBlbCA9IHtSQU5ET006IDR9O1xuICAgICAgdXRpbC51bndyYXBFbGVtZW50KGVsKS5zaG91bGQuZXF1YWwoZWwpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdW53cmFwIGEgd3JhcHBlZCBlbGVtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGVsID0ge0VMRU1FTlQ6IDR9O1xuICAgICAgdXRpbC51bndyYXBFbGVtZW50KGVsKS5zaG91bGQuZXFsKDQpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdW53cmFwIGEgd3JhcHBlZCBlbGVtZW50IHRoYXQgdXNlcyBXM0MgZWxlbWVudCBpZGVudGlmaWVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGVsID0ge1xuICAgICAgICBbVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVJdOiA1XG4gICAgICB9O1xuICAgICAgdXRpbC51bndyYXBFbGVtZW50KGVsKS5zaG91bGQuZXFsKDUpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdW53cmFwIGEgd3JhcHBlZCBlbGVtZW50IGFuZCBwcmlvcml0aXplIFczQyBlbGVtZW50IGlkZW50aWZpZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgZWwgPSB7XG4gICAgICAgIEVMRU1FTlQ6IDcsXG4gICAgICAgIFtXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUl06IDYsXG4gICAgICB9O1xuICAgICAgdXRpbC51bndyYXBFbGVtZW50KGVsKS5zaG91bGQuZXFsKDYpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnd3JhcEVsZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBpbmNsdWRlIEVMRU1FTlQgYW5kIHczYyBlbGVtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC53cmFwRWxlbWVudCgxMjMpLnNob3VsZC5lcWwoe1xuICAgICAgICBbdXRpbC5XM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUl06IDEyMyxcbiAgICAgICAgRUxFTUVOVDogMTIzLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd0b1JlYWRhYmxlU2l6ZVN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGZhaWwgaWYgY2Fubm90IGNvbnZlcnQgdG8gQnl0ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAoKCkgPT4gdXRpbC50b1JlYWRhYmxlU2l6ZVN0cmluZygnYXNkYXNkJykpLnNob3VsZC50aHJvdygvQ2Fubm90IGNvbnZlcnQvKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHByb3Blcmx5IGNvbnZlcnQgdG8gQnl0ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnRvUmVhZGFibGVTaXplU3RyaW5nKDApLnNob3VsZC5lcXVhbCgnMCBCJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwcm9wZXJseSBjb252ZXJ0IHRvIEtCeXRlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwudG9SZWFkYWJsZVNpemVTdHJpbmcoMjA0OCArIDEyKS5zaG91bGQuZXF1YWwoJzIuMDEgS0InKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHByb3Blcmx5IGNvbnZlcnQgdG8gTUJ5dGVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC50b1JlYWRhYmxlU2l6ZVN0cmluZygxMDI0ICogMTAyNCAqIDMgKyAxMDI0ICogMTApLnNob3VsZC5lcXVhbCgnMy4wMSBNQicpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcHJvcGVybHkgY29udmVydCB0byBHQnl0ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnRvUmVhZGFibGVTaXplU3RyaW5nKDEwMjQgKiAxMDI0ICogMTAyNCAqIDUpLnNob3VsZC5lcXVhbCgnNS4wMCBHQicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZmlsdGVyT2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgIGRlc2NyaWJlKCd3aXRoIHVuZGVmaW5lZCBwcmVkaWNhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGZpbHRlciBvdXQgdW5kZWZpbmVkcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICBhOiAnYScsXG4gICAgICAgICAgYjogJ2InLFxuICAgICAgICAgIGM6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgICAgdXRpbC5maWx0ZXJPYmplY3Qob2JqKS5zaG91bGQuZXFsKHtcbiAgICAgICAgICBhOiAnYScsXG4gICAgICAgICAgYjogJ2InLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBsZWF2ZSBudWxscyBhbG9uZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICBhOiAnYScsXG4gICAgICAgICAgYjogJ2InLFxuICAgICAgICAgIGM6IG51bGwsXG4gICAgICAgIH07XG4gICAgICAgIHV0aWwuZmlsdGVyT2JqZWN0KG9iaikuc2hvdWxkLmVxbCh7XG4gICAgICAgICAgYTogJ2EnLFxuICAgICAgICAgIGI6ICdiJyxcbiAgICAgICAgICBjOiBudWxsLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCd3aXRoIHZhbHVlIHByZWRpY2F0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgZmlsdGVyIGVsZW1lbnRzIGJ5IHRoZWlyIHZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgIGE6ICdhJyxcbiAgICAgICAgICBiOiAnYicsXG4gICAgICAgICAgYzogJ2MnLFxuICAgICAgICAgIGQ6ICdhJyxcbiAgICAgICAgfTtcbiAgICAgICAgdXRpbC5maWx0ZXJPYmplY3Qob2JqLCAnYScpLnNob3VsZC5lcWwoe1xuICAgICAgICAgIGE6ICdhJyxcbiAgICAgICAgICBkOiAnYScsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJ3dpdGggZnVuY3Rpb24gcHJlZGljYXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBmaWx0ZXIgZWxlbWVudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgYTogJ2EnLFxuICAgICAgICAgIGI6ICdiJyxcbiAgICAgICAgICBjOiAnYycsXG4gICAgICAgIH07XG4gICAgICAgIHV0aWwuZmlsdGVyT2JqZWN0KG9iaiwgKHYpID0+IHYgPT09ICdhJyB8fCB2ID09PSAnYycpLnNob3VsZC5lcWwoe1xuICAgICAgICAgIGE6ICdhJyxcbiAgICAgICAgICBjOiAnYycsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1N1YlBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBkZXRlY3Qgc2ltcGxlIHN1YnBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmlzU3ViUGF0aCgnL3Jvb3Qvc29tZScsICcvcm9vdCcpLnNob3VsZC5iZS50cnVlO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZGV0ZWN0IGNvbXBsZXggc3VicGF0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaXNTdWJQYXRoKCcvcm9vdC9zb21lL290aGVyLy4uLy4uLy4nLCAnL3Jvb3QnKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGRldGVjdCBzdWJwYXRoIGVuZGluZyB3aXRoIGEgc2xhc2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmlzU3ViUGF0aCgnL3Jvb3Qvc29tZS8nLCAnL3Jvb3QnKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGRldGVjdCBpZiBhIHBhdGggaXMgbm90IGEgc3VicGF0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaXNTdWJQYXRoKCcvcm9vdC9zb21lLy8uLi8uLicsICcvcm9vdCcpLnNob3VsZC5iZS5mYWxzZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGFueSBvZiB0aGUgZ2l2ZW4gcGF0aHMgaXMgbm90IGFic29sdXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLnRocm93KCgpID0+IHV0aWwuaXNTdWJQYXRoKCdzb21lLy4uJywgJy9yb290JyksIC9hYnNvbHV0ZS8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNTYW1lRGVzdGluYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHBhdGgxO1xuICAgIGxldCBwYXRoMjtcbiAgICBsZXQgdG1wRGlyO1xuICAgIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICB0bXBEaXIgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICAgIHBhdGgxID0gcGF0aC5yZXNvbHZlKHRtcERpciwgJ3BhdGgxLnR4dCcpO1xuICAgICAgcGF0aDIgPSBwYXRoLnJlc29sdmUodG1wRGlyLCAncGF0aDIudHh0Jyk7XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgW3BhdGgxLCBwYXRoMl0pIHtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHAsIHAsICd1dGY4Jyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgYWZ0ZXIoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcERpcik7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBtYXRjaCBwYXRocyB0byB0aGUgc2FtZSBmaWxlL2ZvbGRlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIChhd2FpdCB1dGlsLmlzU2FtZURlc3RpbmF0aW9uKHBhdGgxLCBwYXRoLnJlc29sdmUodG1wRGlyLCAnLi4nLCBwYXRoLmJhc2VuYW1lKHRtcERpciksIHBhdGguYmFzZW5hbWUocGF0aDEpKSkpXG4gICAgICAgIC5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG5vdCBtYXRjaCBwYXRocyBpZiB0aGV5IHBvaW50IHRvIG5vbiBleGlzdGluZyBpdGVtcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIChhd2FpdCB1dGlsLmlzU2FtZURlc3RpbmF0aW9uKHBhdGgxLCAnYmxhYmxhJykpLnNob3VsZC5iZS5mYWxzZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG5vdCBtYXRjaCBwYXRocyB0byBkaWZmZXJlbnQgZmlsZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAoYXdhaXQgdXRpbC5pc1NhbWVEZXN0aW5hdGlvbihwYXRoMSwgcGF0aDIpKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb21wYXJlVmVyc2lvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjb21wYXJlIHR3byBjb3JyZWN0IHZlcnNpb24gbnVtYmVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuY29tcGFyZVZlcnNpb25zKCcxMC4wJywgJzwnLCAnMTEuMCcpLnNob3VsZC5lcWwodHJ1ZSk7XG4gICAgICB1dGlsLmNvbXBhcmVWZXJzaW9ucygnMTEuMCcsICc+PScsICcxMS4wJykuc2hvdWxkLmVxbCh0cnVlKTtcbiAgICAgIHV0aWwuY29tcGFyZVZlcnNpb25zKCcxMS4wJywgJz09JywgJzExLjAnKS5zaG91bGQuZXFsKHRydWUpO1xuICAgICAgdXRpbC5jb21wYXJlVmVyc2lvbnMoJzEzLjEwJywgJz4nLCAnMTMuNScpLnNob3VsZC5lcWwodHJ1ZSk7XG4gICAgICB1dGlsLmNvbXBhcmVWZXJzaW9ucygnMTEuMScsICchPScsICcxMS4xMCcpLnNob3VsZC5lcWwodHJ1ZSk7XG4gICAgICB1dGlsLmNvbXBhcmVWZXJzaW9ucygnMTIuMCcsICc8JywgMTApLnNob3VsZC5lcWwoZmFsc2UpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgYW55IG9mIHZlcnNpb24gYXJndW1lbnRzIGlzIGludmFsaWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQudGhyb3coKCkgPT4gdXRpbC5jb21wYXJlVmVyc2lvbnModW5kZWZpbmVkLCAnPCcsICcxMS4wJykpO1xuICAgICAgc2hvdWxkLnRocm93KCgpID0+IHV0aWwuY29tcGFyZVZlcnNpb25zKCcxMS4wJywgJz09JywgbnVsbCkpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgY29tcGFyaXNvbiBvcGVyYXRvciBpcyB1bnN1cHBvcnRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC50aHJvdygoKSA9PiB1dGlsLmNvbXBhcmVWZXJzaW9ucygnMTIuMCcsICdhYmMnLCAxMCkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncXVvdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBxdW90ZSBhIHN0cmluZyB3aXRoIGEgc3BhY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnF1b3RlKFsnYScsICdiJywgJ2MgZCddKS5zaG91bGQuZXFsKCdhIGIgXFwnYyBkXFwnJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBlc2NhcGUgZG91YmxlIHF1b3RlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwucXVvdGUoWydhJywgJ2InLCBgaXQncyBhIFwibmVhdCB0aGluZ1wiYF0pLnNob3VsZC5lcWwoYGEgYiBcIml0J3MgYSBcXFxcXCJuZWF0IHRoaW5nXFxcXFwiXCJgKTtcbiAgICB9KTtcbiAgICBpdChcInNob3VsZCBlc2NhcGUgJCBgIGFuZCAnXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwucXVvdGUoWyckJywgJ2AnLCBgJ2BdKS5zaG91bGQuZXFsKCdcXFxcJCBcXFxcYCBcIlxcJ1wiJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZW1wdHkgYXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnF1b3RlKFtdKS5zaG91bGQuZXFsKCcnKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHF1b3RlIGEgc3RyaW5nIHdpdGggbmV3bGluZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwucXVvdGUoWydhXFxuYiddKS5zaG91bGQuZXFsKGAnYVxcbmInYCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBzdHJpbmdpZnkgYm9vbGVhbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnF1b3RlKFsnYScsIDEsIHRydWUsIGZhbHNlXSkuc2hvdWxkLmVxbCgnYSAxIHRydWUgZmFsc2UnKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHN0cmluZ2lmeSBudWxsIGFuZCB1bmRlZmluZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnF1b3RlKFsnYScsIDEsIG51bGwsIHVuZGVmaW5lZF0pLnNob3VsZC5lcWwoJ2EgMSBudWxsIHVuZGVmaW5lZCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndW5sZWFrU3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdW5sZWFrIGEgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC51bmxlYWtTdHJpbmcoJ3lvbG8nKS5zaG91bGQuZXFsKCd5b2xvJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB1bmxlYWsgYSBtdWx0aWxpbmUgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC51bmxlYWtTdHJpbmcoJyB5b2xvXFxuYm9sbyAnKS5zaG91bGQuZXFsKCcgeW9sb1xcbmJvbG8gJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IGFuIG9iamVjdCB0byBhIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3Qgb2JqIG9mIFt7fSwgbnVsbCwgdW5kZWZpbmVkLCBbXSwgMF0pIHtcbiAgICAgICAgdXRpbC51bmxlYWtTdHJpbmcob2JqKS5zaG91bGQuZXFsKGAke29ian1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3BsdXJhbGl6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAvKlxuICAgICAqIFRoZSBwbHVyYWxpemUgbGlicmFyeSAoaHR0cHM6Ly9naXRodWIuY29tL2JsYWtlZW1icmV5L3BsdXJhbGl6ZSlcbiAgICAgKiBoYXMgYSByb2J1c3Qgc2V0IG9mIHRlc3RzLiBIZXJlIHdlIGp1c3QgbmVlZCB0byB2ZXJpZnkgdGhhdCBpdFxuICAgICAqIGlzIHVzYWJsZSB0aHJvdWdoIHRoZSBleHBvcnRlZCBwYWNrYWdlLCBhbmQgdGhlIGFyZ3VtZW50cyBhcmUgY29ycmVjdFxuICAgICAqL1xuICAgIGl0KCdzaG91bGQgcGx1cmFsaXplIGEgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5wbHVyYWxpemUoJ3dvcmQnLCAyKS5zaG91bGQuZXFsKCd3b3JkcycpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcGx1cmFsaXplIGEgc3RyaW5nIGFuZCBwcmVwZW5kIHRoZSBudW1iZXIgdGhyb3VnaCBib29sZWFuJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5wbHVyYWxpemUoJ3dvcmQnLCAyLCB0cnVlKS5zaG91bGQuZXFsKCcyIHdvcmRzJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwbHVyYWxpemUgYSBzdHJpbmcgYW5kIHByZXBlbmQgdGhlIG51bWJlciB0aHJvdWdoIG9wdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnBsdXJhbGl6ZSgnd29yZCcsIDIsIHtpbmNsdXNpdmU6IHRydWV9KS5zaG91bGQuZXFsKCcyIHdvcmRzJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvdXRpbC1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9