vitest 0.5.3 → 0.5.6

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 (44) hide show
  1. package/dist/chunk-api-setup.ab3a8330.js +4444 -0
  2. package/dist/chunk-constants.a1a50d89.js +32 -0
  3. package/dist/chunk-defaults.8ca84d7b.js +1833 -0
  4. package/dist/chunk-install-pkg.7ce2052a.js +1643 -0
  5. package/dist/chunk-integrations-globals.9bda85f1.js +24 -0
  6. package/dist/chunk-magic-string.6c8f4a10.js +1361 -0
  7. package/dist/chunk-runtime-chain.d86ab074.js +5946 -0
  8. package/dist/chunk-runtime-hooks.aef17670.js +42 -0
  9. package/dist/chunk-runtime-rpc.1832c38c.js +6 -0
  10. package/dist/chunk-utils-base.39767f3e.js +225 -0
  11. package/dist/chunk-utils-source-map.be2b14e2.js +3407 -0
  12. package/dist/chunk-vite-node-externalize.e6096d90.js +10515 -0
  13. package/dist/chunk-vite-node-utils.952694b8.js +9451 -0
  14. package/dist/cli.js +13 -15
  15. package/dist/config.cjs +1 -1
  16. package/dist/config.d.ts +8 -0
  17. package/dist/config.js +1 -1
  18. package/dist/entry.js +26 -16
  19. package/dist/index.d.ts +27 -2
  20. package/dist/index.js +5 -5
  21. package/dist/node.d.ts +8 -0
  22. package/dist/node.js +11 -11
  23. package/dist/{_commonjsHelpers-c9e3b764.js → vendor-_commonjsHelpers.91d4f591.js} +1 -1
  24. package/dist/vendor-index.665a6ba4.js +5708 -0
  25. package/dist/vendor-index.76be1f4d.js +187 -0
  26. package/dist/vendor-index.f6809970.js +1111 -0
  27. package/dist/worker.js +5 -5
  28. package/package.json +3 -3
  29. package/dist/cli-api-fad4785e.js +0 -10497
  30. package/dist/client-4904f549.js +0 -9451
  31. package/dist/constants-c746dc5b.js +0 -32
  32. package/dist/diff-d3ddd21a.js +0 -1833
  33. package/dist/globals-5a96d13e.js +0 -24
  34. package/dist/index-013ecdfe.js +0 -225
  35. package/dist/index-072c45fd.js +0 -5708
  36. package/dist/index-0996637f.js +0 -1111
  37. package/dist/index-1488b423.js +0 -187
  38. package/dist/index-1945a7c3.js +0 -1643
  39. package/dist/index-8353ea65.js +0 -42
  40. package/dist/magic-string.es-94000aea.js +0 -1361
  41. package/dist/rpc-377d999b.js +0 -6
  42. package/dist/setup-047a81dd.js +0 -4444
  43. package/dist/source-map-b4f7fd10.js +0 -3407
  44. package/dist/vi-3bad443e.js +0 -5943
@@ -1,1361 +0,0 @@
1
- var charToInteger = {};
2
- var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
3
- for (var i = 0; i < chars.length; i++) {
4
- charToInteger[chars.charCodeAt(i)] = i;
5
- }
6
- function encode(decoded) {
7
- var sourceFileIndex = 0; // second field
8
- var sourceCodeLine = 0; // third field
9
- var sourceCodeColumn = 0; // fourth field
10
- var nameIndex = 0; // fifth field
11
- var mappings = '';
12
- for (var i = 0; i < decoded.length; i++) {
13
- var line = decoded[i];
14
- if (i > 0)
15
- mappings += ';';
16
- if (line.length === 0)
17
- continue;
18
- var generatedCodeColumn = 0; // first field
19
- var lineMappings = [];
20
- for (var _i = 0, line_1 = line; _i < line_1.length; _i++) {
21
- var segment = line_1[_i];
22
- var segmentMappings = encodeInteger(segment[0] - generatedCodeColumn);
23
- generatedCodeColumn = segment[0];
24
- if (segment.length > 1) {
25
- segmentMappings +=
26
- encodeInteger(segment[1] - sourceFileIndex) +
27
- encodeInteger(segment[2] - sourceCodeLine) +
28
- encodeInteger(segment[3] - sourceCodeColumn);
29
- sourceFileIndex = segment[1];
30
- sourceCodeLine = segment[2];
31
- sourceCodeColumn = segment[3];
32
- }
33
- if (segment.length === 5) {
34
- segmentMappings += encodeInteger(segment[4] - nameIndex);
35
- nameIndex = segment[4];
36
- }
37
- lineMappings.push(segmentMappings);
38
- }
39
- mappings += lineMappings.join(',');
40
- }
41
- return mappings;
42
- }
43
- function encodeInteger(num) {
44
- var result = '';
45
- num = num < 0 ? (-num << 1) | 1 : num << 1;
46
- do {
47
- var clamped = num & 31;
48
- num >>>= 5;
49
- if (num > 0) {
50
- clamped |= 32;
51
- }
52
- result += chars[clamped];
53
- } while (num > 0);
54
- return result;
55
- }
56
-
57
- var BitSet = function BitSet(arg) {
58
- this.bits = arg instanceof BitSet ? arg.bits.slice() : [];
59
- };
60
-
61
- BitSet.prototype.add = function add (n) {
62
- this.bits[n >> 5] |= 1 << (n & 31);
63
- };
64
-
65
- BitSet.prototype.has = function has (n) {
66
- return !!(this.bits[n >> 5] & (1 << (n & 31)));
67
- };
68
-
69
- var Chunk = function Chunk(start, end, content) {
70
- this.start = start;
71
- this.end = end;
72
- this.original = content;
73
-
74
- this.intro = '';
75
- this.outro = '';
76
-
77
- this.content = content;
78
- this.storeName = false;
79
- this.edited = false;
80
-
81
- // we make these non-enumerable, for sanity while debugging
82
- Object.defineProperties(this, {
83
- previous: { writable: true, value: null },
84
- next: { writable: true, value: null }
85
- });
86
- };
87
-
88
- Chunk.prototype.appendLeft = function appendLeft (content) {
89
- this.outro += content;
90
- };
91
-
92
- Chunk.prototype.appendRight = function appendRight (content) {
93
- this.intro = this.intro + content;
94
- };
95
-
96
- Chunk.prototype.clone = function clone () {
97
- var chunk = new Chunk(this.start, this.end, this.original);
98
-
99
- chunk.intro = this.intro;
100
- chunk.outro = this.outro;
101
- chunk.content = this.content;
102
- chunk.storeName = this.storeName;
103
- chunk.edited = this.edited;
104
-
105
- return chunk;
106
- };
107
-
108
- Chunk.prototype.contains = function contains (index) {
109
- return this.start < index && index < this.end;
110
- };
111
-
112
- Chunk.prototype.eachNext = function eachNext (fn) {
113
- var chunk = this;
114
- while (chunk) {
115
- fn(chunk);
116
- chunk = chunk.next;
117
- }
118
- };
119
-
120
- Chunk.prototype.eachPrevious = function eachPrevious (fn) {
121
- var chunk = this;
122
- while (chunk) {
123
- fn(chunk);
124
- chunk = chunk.previous;
125
- }
126
- };
127
-
128
- Chunk.prototype.edit = function edit (content, storeName, contentOnly) {
129
- this.content = content;
130
- if (!contentOnly) {
131
- this.intro = '';
132
- this.outro = '';
133
- }
134
- this.storeName = storeName;
135
-
136
- this.edited = true;
137
-
138
- return this;
139
- };
140
-
141
- Chunk.prototype.prependLeft = function prependLeft (content) {
142
- this.outro = content + this.outro;
143
- };
144
-
145
- Chunk.prototype.prependRight = function prependRight (content) {
146
- this.intro = content + this.intro;
147
- };
148
-
149
- Chunk.prototype.split = function split (index) {
150
- var sliceIndex = index - this.start;
151
-
152
- var originalBefore = this.original.slice(0, sliceIndex);
153
- var originalAfter = this.original.slice(sliceIndex);
154
-
155
- this.original = originalBefore;
156
-
157
- var newChunk = new Chunk(index, this.end, originalAfter);
158
- newChunk.outro = this.outro;
159
- this.outro = '';
160
-
161
- this.end = index;
162
-
163
- if (this.edited) {
164
- // TODO is this block necessary?...
165
- newChunk.edit('', false);
166
- this.content = '';
167
- } else {
168
- this.content = originalBefore;
169
- }
170
-
171
- newChunk.next = this.next;
172
- if (newChunk.next) { newChunk.next.previous = newChunk; }
173
- newChunk.previous = this;
174
- this.next = newChunk;
175
-
176
- return newChunk;
177
- };
178
-
179
- Chunk.prototype.toString = function toString () {
180
- return this.intro + this.content + this.outro;
181
- };
182
-
183
- Chunk.prototype.trimEnd = function trimEnd (rx) {
184
- this.outro = this.outro.replace(rx, '');
185
- if (this.outro.length) { return true; }
186
-
187
- var trimmed = this.content.replace(rx, '');
188
-
189
- if (trimmed.length) {
190
- if (trimmed !== this.content) {
191
- this.split(this.start + trimmed.length).edit('', undefined, true);
192
- }
193
- return true;
194
-
195
- } else {
196
- this.edit('', undefined, true);
197
-
198
- this.intro = this.intro.replace(rx, '');
199
- if (this.intro.length) { return true; }
200
- }
201
- };
202
-
203
- Chunk.prototype.trimStart = function trimStart (rx) {
204
- this.intro = this.intro.replace(rx, '');
205
- if (this.intro.length) { return true; }
206
-
207
- var trimmed = this.content.replace(rx, '');
208
-
209
- if (trimmed.length) {
210
- if (trimmed !== this.content) {
211
- this.split(this.end - trimmed.length);
212
- this.edit('', undefined, true);
213
- }
214
- return true;
215
-
216
- } else {
217
- this.edit('', undefined, true);
218
-
219
- this.outro = this.outro.replace(rx, '');
220
- if (this.outro.length) { return true; }
221
- }
222
- };
223
-
224
- var btoa = function () {
225
- throw new Error('Unsupported environment: `window.btoa` or `Buffer` should be supported.');
226
- };
227
- if (typeof window !== 'undefined' && typeof window.btoa === 'function') {
228
- btoa = function (str) { return window.btoa(unescape(encodeURIComponent(str))); };
229
- } else if (typeof Buffer === 'function') {
230
- btoa = function (str) { return Buffer.from(str, 'utf-8').toString('base64'); };
231
- }
232
-
233
- var SourceMap = function SourceMap(properties) {
234
- this.version = 3;
235
- this.file = properties.file;
236
- this.sources = properties.sources;
237
- this.sourcesContent = properties.sourcesContent;
238
- this.names = properties.names;
239
- this.mappings = encode(properties.mappings);
240
- };
241
-
242
- SourceMap.prototype.toString = function toString () {
243
- return JSON.stringify(this);
244
- };
245
-
246
- SourceMap.prototype.toUrl = function toUrl () {
247
- return 'data:application/json;charset=utf-8;base64,' + btoa(this.toString());
248
- };
249
-
250
- function guessIndent(code) {
251
- var lines = code.split('\n');
252
-
253
- var tabbed = lines.filter(function (line) { return /^\t+/.test(line); });
254
- var spaced = lines.filter(function (line) { return /^ {2,}/.test(line); });
255
-
256
- if (tabbed.length === 0 && spaced.length === 0) {
257
- return null;
258
- }
259
-
260
- // More lines tabbed than spaced? Assume tabs, and
261
- // default to tabs in the case of a tie (or nothing
262
- // to go on)
263
- if (tabbed.length >= spaced.length) {
264
- return '\t';
265
- }
266
-
267
- // Otherwise, we need to guess the multiple
268
- var min = spaced.reduce(function (previous, current) {
269
- var numSpaces = /^ +/.exec(current)[0].length;
270
- return Math.min(numSpaces, previous);
271
- }, Infinity);
272
-
273
- return new Array(min + 1).join(' ');
274
- }
275
-
276
- function getRelativePath(from, to) {
277
- var fromParts = from.split(/[/\\]/);
278
- var toParts = to.split(/[/\\]/);
279
-
280
- fromParts.pop(); // get dirname
281
-
282
- while (fromParts[0] === toParts[0]) {
283
- fromParts.shift();
284
- toParts.shift();
285
- }
286
-
287
- if (fromParts.length) {
288
- var i = fromParts.length;
289
- while (i--) { fromParts[i] = '..'; }
290
- }
291
-
292
- return fromParts.concat(toParts).join('/');
293
- }
294
-
295
- var toString = Object.prototype.toString;
296
-
297
- function isObject(thing) {
298
- return toString.call(thing) === '[object Object]';
299
- }
300
-
301
- function getLocator(source) {
302
- var originalLines = source.split('\n');
303
- var lineOffsets = [];
304
-
305
- for (var i = 0, pos = 0; i < originalLines.length; i++) {
306
- lineOffsets.push(pos);
307
- pos += originalLines[i].length + 1;
308
- }
309
-
310
- return function locate(index) {
311
- var i = 0;
312
- var j = lineOffsets.length;
313
- while (i < j) {
314
- var m = (i + j) >> 1;
315
- if (index < lineOffsets[m]) {
316
- j = m;
317
- } else {
318
- i = m + 1;
319
- }
320
- }
321
- var line = i - 1;
322
- var column = index - lineOffsets[line];
323
- return { line: line, column: column };
324
- };
325
- }
326
-
327
- var Mappings = function Mappings(hires) {
328
- this.hires = hires;
329
- this.generatedCodeLine = 0;
330
- this.generatedCodeColumn = 0;
331
- this.raw = [];
332
- this.rawSegments = this.raw[this.generatedCodeLine] = [];
333
- this.pending = null;
334
- };
335
-
336
- Mappings.prototype.addEdit = function addEdit (sourceIndex, content, loc, nameIndex) {
337
- if (content.length) {
338
- var segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];
339
- if (nameIndex >= 0) {
340
- segment.push(nameIndex);
341
- }
342
- this.rawSegments.push(segment);
343
- } else if (this.pending) {
344
- this.rawSegments.push(this.pending);
345
- }
346
-
347
- this.advance(content);
348
- this.pending = null;
349
- };
350
-
351
- Mappings.prototype.addUneditedChunk = function addUneditedChunk (sourceIndex, chunk, original, loc, sourcemapLocations) {
352
- var originalCharIndex = chunk.start;
353
- var first = true;
354
-
355
- while (originalCharIndex < chunk.end) {
356
- if (this.hires || first || sourcemapLocations.has(originalCharIndex)) {
357
- this.rawSegments.push([this.generatedCodeColumn, sourceIndex, loc.line, loc.column]);
358
- }
359
-
360
- if (original[originalCharIndex] === '\n') {
361
- loc.line += 1;
362
- loc.column = 0;
363
- this.generatedCodeLine += 1;
364
- this.raw[this.generatedCodeLine] = this.rawSegments = [];
365
- this.generatedCodeColumn = 0;
366
- first = true;
367
- } else {
368
- loc.column += 1;
369
- this.generatedCodeColumn += 1;
370
- first = false;
371
- }
372
-
373
- originalCharIndex += 1;
374
- }
375
-
376
- this.pending = null;
377
- };
378
-
379
- Mappings.prototype.advance = function advance (str) {
380
- if (!str) { return; }
381
-
382
- var lines = str.split('\n');
383
-
384
- if (lines.length > 1) {
385
- for (var i = 0; i < lines.length - 1; i++) {
386
- this.generatedCodeLine++;
387
- this.raw[this.generatedCodeLine] = this.rawSegments = [];
388
- }
389
- this.generatedCodeColumn = 0;
390
- }
391
-
392
- this.generatedCodeColumn += lines[lines.length - 1].length;
393
- };
394
-
395
- var n = '\n';
396
-
397
- var warned = {
398
- insertLeft: false,
399
- insertRight: false,
400
- storeName: false
401
- };
402
-
403
- var MagicString = function MagicString(string, options) {
404
- if ( options === void 0 ) options = {};
405
-
406
- var chunk = new Chunk(0, string.length, string);
407
-
408
- Object.defineProperties(this, {
409
- original: { writable: true, value: string },
410
- outro: { writable: true, value: '' },
411
- intro: { writable: true, value: '' },
412
- firstChunk: { writable: true, value: chunk },
413
- lastChunk: { writable: true, value: chunk },
414
- lastSearchedChunk: { writable: true, value: chunk },
415
- byStart: { writable: true, value: {} },
416
- byEnd: { writable: true, value: {} },
417
- filename: { writable: true, value: options.filename },
418
- indentExclusionRanges: { writable: true, value: options.indentExclusionRanges },
419
- sourcemapLocations: { writable: true, value: new BitSet() },
420
- storedNames: { writable: true, value: {} },
421
- indentStr: { writable: true, value: guessIndent(string) }
422
- });
423
-
424
- this.byStart[0] = chunk;
425
- this.byEnd[string.length] = chunk;
426
- };
427
-
428
- MagicString.prototype.addSourcemapLocation = function addSourcemapLocation (char) {
429
- this.sourcemapLocations.add(char);
430
- };
431
-
432
- MagicString.prototype.append = function append (content) {
433
- if (typeof content !== 'string') { throw new TypeError('outro content must be a string'); }
434
-
435
- this.outro += content;
436
- return this;
437
- };
438
-
439
- MagicString.prototype.appendLeft = function appendLeft (index, content) {
440
- if (typeof content !== 'string') { throw new TypeError('inserted content must be a string'); }
441
-
442
- this._split(index);
443
-
444
- var chunk = this.byEnd[index];
445
-
446
- if (chunk) {
447
- chunk.appendLeft(content);
448
- } else {
449
- this.intro += content;
450
- }
451
- return this;
452
- };
453
-
454
- MagicString.prototype.appendRight = function appendRight (index, content) {
455
- if (typeof content !== 'string') { throw new TypeError('inserted content must be a string'); }
456
-
457
- this._split(index);
458
-
459
- var chunk = this.byStart[index];
460
-
461
- if (chunk) {
462
- chunk.appendRight(content);
463
- } else {
464
- this.outro += content;
465
- }
466
- return this;
467
- };
468
-
469
- MagicString.prototype.clone = function clone () {
470
- var cloned = new MagicString(this.original, { filename: this.filename });
471
-
472
- var originalChunk = this.firstChunk;
473
- var clonedChunk = (cloned.firstChunk = cloned.lastSearchedChunk = originalChunk.clone());
474
-
475
- while (originalChunk) {
476
- cloned.byStart[clonedChunk.start] = clonedChunk;
477
- cloned.byEnd[clonedChunk.end] = clonedChunk;
478
-
479
- var nextOriginalChunk = originalChunk.next;
480
- var nextClonedChunk = nextOriginalChunk && nextOriginalChunk.clone();
481
-
482
- if (nextClonedChunk) {
483
- clonedChunk.next = nextClonedChunk;
484
- nextClonedChunk.previous = clonedChunk;
485
-
486
- clonedChunk = nextClonedChunk;
487
- }
488
-
489
- originalChunk = nextOriginalChunk;
490
- }
491
-
492
- cloned.lastChunk = clonedChunk;
493
-
494
- if (this.indentExclusionRanges) {
495
- cloned.indentExclusionRanges = this.indentExclusionRanges.slice();
496
- }
497
-
498
- cloned.sourcemapLocations = new BitSet(this.sourcemapLocations);
499
-
500
- cloned.intro = this.intro;
501
- cloned.outro = this.outro;
502
-
503
- return cloned;
504
- };
505
-
506
- MagicString.prototype.generateDecodedMap = function generateDecodedMap (options) {
507
- var this$1$1 = this;
508
-
509
- options = options || {};
510
-
511
- var sourceIndex = 0;
512
- var names = Object.keys(this.storedNames);
513
- var mappings = new Mappings(options.hires);
514
-
515
- var locate = getLocator(this.original);
516
-
517
- if (this.intro) {
518
- mappings.advance(this.intro);
519
- }
520
-
521
- this.firstChunk.eachNext(function (chunk) {
522
- var loc = locate(chunk.start);
523
-
524
- if (chunk.intro.length) { mappings.advance(chunk.intro); }
525
-
526
- if (chunk.edited) {
527
- mappings.addEdit(
528
- sourceIndex,
529
- chunk.content,
530
- loc,
531
- chunk.storeName ? names.indexOf(chunk.original) : -1
532
- );
533
- } else {
534
- mappings.addUneditedChunk(sourceIndex, chunk, this$1$1.original, loc, this$1$1.sourcemapLocations);
535
- }
536
-
537
- if (chunk.outro.length) { mappings.advance(chunk.outro); }
538
- });
539
-
540
- return {
541
- file: options.file ? options.file.split(/[/\\]/).pop() : null,
542
- sources: [options.source ? getRelativePath(options.file || '', options.source) : null],
543
- sourcesContent: options.includeContent ? [this.original] : [null],
544
- names: names,
545
- mappings: mappings.raw
546
- };
547
- };
548
-
549
- MagicString.prototype.generateMap = function generateMap (options) {
550
- return new SourceMap(this.generateDecodedMap(options));
551
- };
552
-
553
- MagicString.prototype.getIndentString = function getIndentString () {
554
- return this.indentStr === null ? '\t' : this.indentStr;
555
- };
556
-
557
- MagicString.prototype.indent = function indent (indentStr, options) {
558
- var pattern = /^[^\r\n]/gm;
559
-
560
- if (isObject(indentStr)) {
561
- options = indentStr;
562
- indentStr = undefined;
563
- }
564
-
565
- indentStr = indentStr !== undefined ? indentStr : this.indentStr || '\t';
566
-
567
- if (indentStr === '') { return this; } // noop
568
-
569
- options = options || {};
570
-
571
- // Process exclusion ranges
572
- var isExcluded = {};
573
-
574
- if (options.exclude) {
575
- var exclusions =
576
- typeof options.exclude[0] === 'number' ? [options.exclude] : options.exclude;
577
- exclusions.forEach(function (exclusion) {
578
- for (var i = exclusion[0]; i < exclusion[1]; i += 1) {
579
- isExcluded[i] = true;
580
- }
581
- });
582
- }
583
-
584
- var shouldIndentNextCharacter = options.indentStart !== false;
585
- var replacer = function (match) {
586
- if (shouldIndentNextCharacter) { return ("" + indentStr + match); }
587
- shouldIndentNextCharacter = true;
588
- return match;
589
- };
590
-
591
- this.intro = this.intro.replace(pattern, replacer);
592
-
593
- var charIndex = 0;
594
- var chunk = this.firstChunk;
595
-
596
- while (chunk) {
597
- var end = chunk.end;
598
-
599
- if (chunk.edited) {
600
- if (!isExcluded[charIndex]) {
601
- chunk.content = chunk.content.replace(pattern, replacer);
602
-
603
- if (chunk.content.length) {
604
- shouldIndentNextCharacter = chunk.content[chunk.content.length - 1] === '\n';
605
- }
606
- }
607
- } else {
608
- charIndex = chunk.start;
609
-
610
- while (charIndex < end) {
611
- if (!isExcluded[charIndex]) {
612
- var char = this.original[charIndex];
613
-
614
- if (char === '\n') {
615
- shouldIndentNextCharacter = true;
616
- } else if (char !== '\r' && shouldIndentNextCharacter) {
617
- shouldIndentNextCharacter = false;
618
-
619
- if (charIndex === chunk.start) {
620
- chunk.prependRight(indentStr);
621
- } else {
622
- this._splitChunk(chunk, charIndex);
623
- chunk = chunk.next;
624
- chunk.prependRight(indentStr);
625
- }
626
- }
627
- }
628
-
629
- charIndex += 1;
630
- }
631
- }
632
-
633
- charIndex = chunk.end;
634
- chunk = chunk.next;
635
- }
636
-
637
- this.outro = this.outro.replace(pattern, replacer);
638
-
639
- return this;
640
- };
641
-
642
- MagicString.prototype.insert = function insert () {
643
- throw new Error('magicString.insert(...) is deprecated. Use prependRight(...) or appendLeft(...)');
644
- };
645
-
646
- MagicString.prototype.insertLeft = function insertLeft (index, content) {
647
- if (!warned.insertLeft) {
648
- console.warn('magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead'); // eslint-disable-line no-console
649
- warned.insertLeft = true;
650
- }
651
-
652
- return this.appendLeft(index, content);
653
- };
654
-
655
- MagicString.prototype.insertRight = function insertRight (index, content) {
656
- if (!warned.insertRight) {
657
- console.warn('magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead'); // eslint-disable-line no-console
658
- warned.insertRight = true;
659
- }
660
-
661
- return this.prependRight(index, content);
662
- };
663
-
664
- MagicString.prototype.move = function move (start, end, index) {
665
- if (index >= start && index <= end) { throw new Error('Cannot move a selection inside itself'); }
666
-
667
- this._split(start);
668
- this._split(end);
669
- this._split(index);
670
-
671
- var first = this.byStart[start];
672
- var last = this.byEnd[end];
673
-
674
- var oldLeft = first.previous;
675
- var oldRight = last.next;
676
-
677
- var newRight = this.byStart[index];
678
- if (!newRight && last === this.lastChunk) { return this; }
679
- var newLeft = newRight ? newRight.previous : this.lastChunk;
680
-
681
- if (oldLeft) { oldLeft.next = oldRight; }
682
- if (oldRight) { oldRight.previous = oldLeft; }
683
-
684
- if (newLeft) { newLeft.next = first; }
685
- if (newRight) { newRight.previous = last; }
686
-
687
- if (!first.previous) { this.firstChunk = last.next; }
688
- if (!last.next) {
689
- this.lastChunk = first.previous;
690
- this.lastChunk.next = null;
691
- }
692
-
693
- first.previous = newLeft;
694
- last.next = newRight || null;
695
-
696
- if (!newLeft) { this.firstChunk = first; }
697
- if (!newRight) { this.lastChunk = last; }
698
- return this;
699
- };
700
-
701
- MagicString.prototype.overwrite = function overwrite (start, end, content, options) {
702
- if (typeof content !== 'string') { throw new TypeError('replacement content must be a string'); }
703
-
704
- while (start < 0) { start += this.original.length; }
705
- while (end < 0) { end += this.original.length; }
706
-
707
- if (end > this.original.length) { throw new Error('end is out of bounds'); }
708
- if (start === end)
709
- { throw new Error('Cannot overwrite a zero-length range – use appendLeft or prependRight instead'); }
710
-
711
- this._split(start);
712
- this._split(end);
713
-
714
- if (options === true) {
715
- if (!warned.storeName) {
716
- console.warn('The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string'); // eslint-disable-line no-console
717
- warned.storeName = true;
718
- }
719
-
720
- options = { storeName: true };
721
- }
722
- var storeName = options !== undefined ? options.storeName : false;
723
- var contentOnly = options !== undefined ? options.contentOnly : false;
724
-
725
- if (storeName) {
726
- var original = this.original.slice(start, end);
727
- this.storedNames[original] = true;
728
- }
729
-
730
- var first = this.byStart[start];
731
- var last = this.byEnd[end];
732
-
733
- if (first) {
734
- if (end > first.end && first.next !== this.byStart[first.end]) {
735
- throw new Error('Cannot overwrite across a split point');
736
- }
737
-
738
- first.edit(content, storeName, contentOnly);
739
-
740
- if (first !== last) {
741
- var chunk = first.next;
742
- while (chunk !== last) {
743
- chunk.edit('', false);
744
- chunk = chunk.next;
745
- }
746
-
747
- chunk.edit('', false);
748
- }
749
- } else {
750
- // must be inserting at the end
751
- var newChunk = new Chunk(start, end, '').edit(content, storeName);
752
-
753
- // TODO last chunk in the array may not be the last chunk, if it's moved...
754
- last.next = newChunk;
755
- newChunk.previous = last;
756
- }
757
- return this;
758
- };
759
-
760
- MagicString.prototype.prepend = function prepend (content) {
761
- if (typeof content !== 'string') { throw new TypeError('outro content must be a string'); }
762
-
763
- this.intro = content + this.intro;
764
- return this;
765
- };
766
-
767
- MagicString.prototype.prependLeft = function prependLeft (index, content) {
768
- if (typeof content !== 'string') { throw new TypeError('inserted content must be a string'); }
769
-
770
- this._split(index);
771
-
772
- var chunk = this.byEnd[index];
773
-
774
- if (chunk) {
775
- chunk.prependLeft(content);
776
- } else {
777
- this.intro = content + this.intro;
778
- }
779
- return this;
780
- };
781
-
782
- MagicString.prototype.prependRight = function prependRight (index, content) {
783
- if (typeof content !== 'string') { throw new TypeError('inserted content must be a string'); }
784
-
785
- this._split(index);
786
-
787
- var chunk = this.byStart[index];
788
-
789
- if (chunk) {
790
- chunk.prependRight(content);
791
- } else {
792
- this.outro = content + this.outro;
793
- }
794
- return this;
795
- };
796
-
797
- MagicString.prototype.remove = function remove (start, end) {
798
- while (start < 0) { start += this.original.length; }
799
- while (end < 0) { end += this.original.length; }
800
-
801
- if (start === end) { return this; }
802
-
803
- if (start < 0 || end > this.original.length) { throw new Error('Character is out of bounds'); }
804
- if (start > end) { throw new Error('end must be greater than start'); }
805
-
806
- this._split(start);
807
- this._split(end);
808
-
809
- var chunk = this.byStart[start];
810
-
811
- while (chunk) {
812
- chunk.intro = '';
813
- chunk.outro = '';
814
- chunk.edit('');
815
-
816
- chunk = end > chunk.end ? this.byStart[chunk.end] : null;
817
- }
818
- return this;
819
- };
820
-
821
- MagicString.prototype.lastChar = function lastChar () {
822
- if (this.outro.length)
823
- { return this.outro[this.outro.length - 1]; }
824
- var chunk = this.lastChunk;
825
- do {
826
- if (chunk.outro.length)
827
- { return chunk.outro[chunk.outro.length - 1]; }
828
- if (chunk.content.length)
829
- { return chunk.content[chunk.content.length - 1]; }
830
- if (chunk.intro.length)
831
- { return chunk.intro[chunk.intro.length - 1]; }
832
- } while (chunk = chunk.previous);
833
- if (this.intro.length)
834
- { return this.intro[this.intro.length - 1]; }
835
- return '';
836
- };
837
-
838
- MagicString.prototype.lastLine = function lastLine () {
839
- var lineIndex = this.outro.lastIndexOf(n);
840
- if (lineIndex !== -1)
841
- { return this.outro.substr(lineIndex + 1); }
842
- var lineStr = this.outro;
843
- var chunk = this.lastChunk;
844
- do {
845
- if (chunk.outro.length > 0) {
846
- lineIndex = chunk.outro.lastIndexOf(n);
847
- if (lineIndex !== -1)
848
- { return chunk.outro.substr(lineIndex + 1) + lineStr; }
849
- lineStr = chunk.outro + lineStr;
850
- }
851
-
852
- if (chunk.content.length > 0) {
853
- lineIndex = chunk.content.lastIndexOf(n);
854
- if (lineIndex !== -1)
855
- { return chunk.content.substr(lineIndex + 1) + lineStr; }
856
- lineStr = chunk.content + lineStr;
857
- }
858
-
859
- if (chunk.intro.length > 0) {
860
- lineIndex = chunk.intro.lastIndexOf(n);
861
- if (lineIndex !== -1)
862
- { return chunk.intro.substr(lineIndex + 1) + lineStr; }
863
- lineStr = chunk.intro + lineStr;
864
- }
865
- } while (chunk = chunk.previous);
866
- lineIndex = this.intro.lastIndexOf(n);
867
- if (lineIndex !== -1)
868
- { return this.intro.substr(lineIndex + 1) + lineStr; }
869
- return this.intro + lineStr;
870
- };
871
-
872
- MagicString.prototype.slice = function slice (start, end) {
873
- if ( start === void 0 ) start = 0;
874
- if ( end === void 0 ) end = this.original.length;
875
-
876
- while (start < 0) { start += this.original.length; }
877
- while (end < 0) { end += this.original.length; }
878
-
879
- var result = '';
880
-
881
- // find start chunk
882
- var chunk = this.firstChunk;
883
- while (chunk && (chunk.start > start || chunk.end <= start)) {
884
- // found end chunk before start
885
- if (chunk.start < end && chunk.end >= end) {
886
- return result;
887
- }
888
-
889
- chunk = chunk.next;
890
- }
891
-
892
- if (chunk && chunk.edited && chunk.start !== start)
893
- { throw new Error(("Cannot use replaced character " + start + " as slice start anchor.")); }
894
-
895
- var startChunk = chunk;
896
- while (chunk) {
897
- if (chunk.intro && (startChunk !== chunk || chunk.start === start)) {
898
- result += chunk.intro;
899
- }
900
-
901
- var containsEnd = chunk.start < end && chunk.end >= end;
902
- if (containsEnd && chunk.edited && chunk.end !== end)
903
- { throw new Error(("Cannot use replaced character " + end + " as slice end anchor.")); }
904
-
905
- var sliceStart = startChunk === chunk ? start - chunk.start : 0;
906
- var sliceEnd = containsEnd ? chunk.content.length + end - chunk.end : chunk.content.length;
907
-
908
- result += chunk.content.slice(sliceStart, sliceEnd);
909
-
910
- if (chunk.outro && (!containsEnd || chunk.end === end)) {
911
- result += chunk.outro;
912
- }
913
-
914
- if (containsEnd) {
915
- break;
916
- }
917
-
918
- chunk = chunk.next;
919
- }
920
-
921
- return result;
922
- };
923
-
924
- // TODO deprecate this? not really very useful
925
- MagicString.prototype.snip = function snip (start, end) {
926
- var clone = this.clone();
927
- clone.remove(0, start);
928
- clone.remove(end, clone.original.length);
929
-
930
- return clone;
931
- };
932
-
933
- MagicString.prototype._split = function _split (index) {
934
- if (this.byStart[index] || this.byEnd[index]) { return; }
935
-
936
- var chunk = this.lastSearchedChunk;
937
- var searchForward = index > chunk.end;
938
-
939
- while (chunk) {
940
- if (chunk.contains(index)) { return this._splitChunk(chunk, index); }
941
-
942
- chunk = searchForward ? this.byStart[chunk.end] : this.byEnd[chunk.start];
943
- }
944
- };
945
-
946
- MagicString.prototype._splitChunk = function _splitChunk (chunk, index) {
947
- if (chunk.edited && chunk.content.length) {
948
- // zero-length edited chunks are a special case (overlapping replacements)
949
- var loc = getLocator(this.original)(index);
950
- throw new Error(
951
- ("Cannot split a chunk that has already been edited (" + (loc.line) + ":" + (loc.column) + " – \"" + (chunk.original) + "\")")
952
- );
953
- }
954
-
955
- var newChunk = chunk.split(index);
956
-
957
- this.byEnd[index] = chunk;
958
- this.byStart[index] = newChunk;
959
- this.byEnd[newChunk.end] = newChunk;
960
-
961
- if (chunk === this.lastChunk) { this.lastChunk = newChunk; }
962
-
963
- this.lastSearchedChunk = chunk;
964
- return true;
965
- };
966
-
967
- MagicString.prototype.toString = function toString () {
968
- var str = this.intro;
969
-
970
- var chunk = this.firstChunk;
971
- while (chunk) {
972
- str += chunk.toString();
973
- chunk = chunk.next;
974
- }
975
-
976
- return str + this.outro;
977
- };
978
-
979
- MagicString.prototype.isEmpty = function isEmpty () {
980
- var chunk = this.firstChunk;
981
- do {
982
- if (chunk.intro.length && chunk.intro.trim() ||
983
- chunk.content.length && chunk.content.trim() ||
984
- chunk.outro.length && chunk.outro.trim())
985
- { return false; }
986
- } while (chunk = chunk.next);
987
- return true;
988
- };
989
-
990
- MagicString.prototype.length = function length () {
991
- var chunk = this.firstChunk;
992
- var length = 0;
993
- do {
994
- length += chunk.intro.length + chunk.content.length + chunk.outro.length;
995
- } while (chunk = chunk.next);
996
- return length;
997
- };
998
-
999
- MagicString.prototype.trimLines = function trimLines () {
1000
- return this.trim('[\\r\\n]');
1001
- };
1002
-
1003
- MagicString.prototype.trim = function trim (charType) {
1004
- return this.trimStart(charType).trimEnd(charType);
1005
- };
1006
-
1007
- MagicString.prototype.trimEndAborted = function trimEndAborted (charType) {
1008
- var rx = new RegExp((charType || '\\s') + '+$');
1009
-
1010
- this.outro = this.outro.replace(rx, '');
1011
- if (this.outro.length) { return true; }
1012
-
1013
- var chunk = this.lastChunk;
1014
-
1015
- do {
1016
- var end = chunk.end;
1017
- var aborted = chunk.trimEnd(rx);
1018
-
1019
- // if chunk was trimmed, we have a new lastChunk
1020
- if (chunk.end !== end) {
1021
- if (this.lastChunk === chunk) {
1022
- this.lastChunk = chunk.next;
1023
- }
1024
-
1025
- this.byEnd[chunk.end] = chunk;
1026
- this.byStart[chunk.next.start] = chunk.next;
1027
- this.byEnd[chunk.next.end] = chunk.next;
1028
- }
1029
-
1030
- if (aborted) { return true; }
1031
- chunk = chunk.previous;
1032
- } while (chunk);
1033
-
1034
- return false;
1035
- };
1036
-
1037
- MagicString.prototype.trimEnd = function trimEnd (charType) {
1038
- this.trimEndAborted(charType);
1039
- return this;
1040
- };
1041
- MagicString.prototype.trimStartAborted = function trimStartAborted (charType) {
1042
- var rx = new RegExp('^' + (charType || '\\s') + '+');
1043
-
1044
- this.intro = this.intro.replace(rx, '');
1045
- if (this.intro.length) { return true; }
1046
-
1047
- var chunk = this.firstChunk;
1048
-
1049
- do {
1050
- var end = chunk.end;
1051
- var aborted = chunk.trimStart(rx);
1052
-
1053
- if (chunk.end !== end) {
1054
- // special case...
1055
- if (chunk === this.lastChunk) { this.lastChunk = chunk.next; }
1056
-
1057
- this.byEnd[chunk.end] = chunk;
1058
- this.byStart[chunk.next.start] = chunk.next;
1059
- this.byEnd[chunk.next.end] = chunk.next;
1060
- }
1061
-
1062
- if (aborted) { return true; }
1063
- chunk = chunk.next;
1064
- } while (chunk);
1065
-
1066
- return false;
1067
- };
1068
-
1069
- MagicString.prototype.trimStart = function trimStart (charType) {
1070
- this.trimStartAborted(charType);
1071
- return this;
1072
- };
1073
-
1074
- var hasOwnProp = Object.prototype.hasOwnProperty;
1075
-
1076
- var Bundle = function Bundle(options) {
1077
- if ( options === void 0 ) options = {};
1078
-
1079
- this.intro = options.intro || '';
1080
- this.separator = options.separator !== undefined ? options.separator : '\n';
1081
- this.sources = [];
1082
- this.uniqueSources = [];
1083
- this.uniqueSourceIndexByFilename = {};
1084
- };
1085
-
1086
- Bundle.prototype.addSource = function addSource (source) {
1087
- if (source instanceof MagicString) {
1088
- return this.addSource({
1089
- content: source,
1090
- filename: source.filename,
1091
- separator: this.separator
1092
- });
1093
- }
1094
-
1095
- if (!isObject(source) || !source.content) {
1096
- throw new Error('bundle.addSource() takes an object with a `content` property, which should be an instance of MagicString, and an optional `filename`');
1097
- }
1098
-
1099
- ['filename', 'indentExclusionRanges', 'separator'].forEach(function (option) {
1100
- if (!hasOwnProp.call(source, option)) { source[option] = source.content[option]; }
1101
- });
1102
-
1103
- if (source.separator === undefined) {
1104
- // TODO there's a bunch of this sort of thing, needs cleaning up
1105
- source.separator = this.separator;
1106
- }
1107
-
1108
- if (source.filename) {
1109
- if (!hasOwnProp.call(this.uniqueSourceIndexByFilename, source.filename)) {
1110
- this.uniqueSourceIndexByFilename[source.filename] = this.uniqueSources.length;
1111
- this.uniqueSources.push({ filename: source.filename, content: source.content.original });
1112
- } else {
1113
- var uniqueSource = this.uniqueSources[this.uniqueSourceIndexByFilename[source.filename]];
1114
- if (source.content.original !== uniqueSource.content) {
1115
- throw new Error(("Illegal source: same filename (" + (source.filename) + "), different contents"));
1116
- }
1117
- }
1118
- }
1119
-
1120
- this.sources.push(source);
1121
- return this;
1122
- };
1123
-
1124
- Bundle.prototype.append = function append (str, options) {
1125
- this.addSource({
1126
- content: new MagicString(str),
1127
- separator: (options && options.separator) || ''
1128
- });
1129
-
1130
- return this;
1131
- };
1132
-
1133
- Bundle.prototype.clone = function clone () {
1134
- var bundle = new Bundle({
1135
- intro: this.intro,
1136
- separator: this.separator
1137
- });
1138
-
1139
- this.sources.forEach(function (source) {
1140
- bundle.addSource({
1141
- filename: source.filename,
1142
- content: source.content.clone(),
1143
- separator: source.separator
1144
- });
1145
- });
1146
-
1147
- return bundle;
1148
- };
1149
-
1150
- Bundle.prototype.generateDecodedMap = function generateDecodedMap (options) {
1151
- var this$1$1 = this;
1152
- if ( options === void 0 ) options = {};
1153
-
1154
- var names = [];
1155
- this.sources.forEach(function (source) {
1156
- Object.keys(source.content.storedNames).forEach(function (name) {
1157
- if (!~names.indexOf(name)) { names.push(name); }
1158
- });
1159
- });
1160
-
1161
- var mappings = new Mappings(options.hires);
1162
-
1163
- if (this.intro) {
1164
- mappings.advance(this.intro);
1165
- }
1166
-
1167
- this.sources.forEach(function (source, i) {
1168
- if (i > 0) {
1169
- mappings.advance(this$1$1.separator);
1170
- }
1171
-
1172
- var sourceIndex = source.filename ? this$1$1.uniqueSourceIndexByFilename[source.filename] : -1;
1173
- var magicString = source.content;
1174
- var locate = getLocator(magicString.original);
1175
-
1176
- if (magicString.intro) {
1177
- mappings.advance(magicString.intro);
1178
- }
1179
-
1180
- magicString.firstChunk.eachNext(function (chunk) {
1181
- var loc = locate(chunk.start);
1182
-
1183
- if (chunk.intro.length) { mappings.advance(chunk.intro); }
1184
-
1185
- if (source.filename) {
1186
- if (chunk.edited) {
1187
- mappings.addEdit(
1188
- sourceIndex,
1189
- chunk.content,
1190
- loc,
1191
- chunk.storeName ? names.indexOf(chunk.original) : -1
1192
- );
1193
- } else {
1194
- mappings.addUneditedChunk(
1195
- sourceIndex,
1196
- chunk,
1197
- magicString.original,
1198
- loc,
1199
- magicString.sourcemapLocations
1200
- );
1201
- }
1202
- } else {
1203
- mappings.advance(chunk.content);
1204
- }
1205
-
1206
- if (chunk.outro.length) { mappings.advance(chunk.outro); }
1207
- });
1208
-
1209
- if (magicString.outro) {
1210
- mappings.advance(magicString.outro);
1211
- }
1212
- });
1213
-
1214
- return {
1215
- file: options.file ? options.file.split(/[/\\]/).pop() : null,
1216
- sources: this.uniqueSources.map(function (source) {
1217
- return options.file ? getRelativePath(options.file, source.filename) : source.filename;
1218
- }),
1219
- sourcesContent: this.uniqueSources.map(function (source) {
1220
- return options.includeContent ? source.content : null;
1221
- }),
1222
- names: names,
1223
- mappings: mappings.raw
1224
- };
1225
- };
1226
-
1227
- Bundle.prototype.generateMap = function generateMap (options) {
1228
- return new SourceMap(this.generateDecodedMap(options));
1229
- };
1230
-
1231
- Bundle.prototype.getIndentString = function getIndentString () {
1232
- var indentStringCounts = {};
1233
-
1234
- this.sources.forEach(function (source) {
1235
- var indentStr = source.content.indentStr;
1236
-
1237
- if (indentStr === null) { return; }
1238
-
1239
- if (!indentStringCounts[indentStr]) { indentStringCounts[indentStr] = 0; }
1240
- indentStringCounts[indentStr] += 1;
1241
- });
1242
-
1243
- return (
1244
- Object.keys(indentStringCounts).sort(function (a, b) {
1245
- return indentStringCounts[a] - indentStringCounts[b];
1246
- })[0] || '\t'
1247
- );
1248
- };
1249
-
1250
- Bundle.prototype.indent = function indent (indentStr) {
1251
- var this$1$1 = this;
1252
-
1253
- if (!arguments.length) {
1254
- indentStr = this.getIndentString();
1255
- }
1256
-
1257
- if (indentStr === '') { return this; } // noop
1258
-
1259
- var trailingNewline = !this.intro || this.intro.slice(-1) === '\n';
1260
-
1261
- this.sources.forEach(function (source, i) {
1262
- var separator = source.separator !== undefined ? source.separator : this$1$1.separator;
1263
- var indentStart = trailingNewline || (i > 0 && /\r?\n$/.test(separator));
1264
-
1265
- source.content.indent(indentStr, {
1266
- exclude: source.indentExclusionRanges,
1267
- indentStart: indentStart //: trailingNewline || /\r?\n$/.test( separator ) //true///\r?\n/.test( separator )
1268
- });
1269
-
1270
- trailingNewline = source.content.lastChar() === '\n';
1271
- });
1272
-
1273
- if (this.intro) {
1274
- this.intro =
1275
- indentStr +
1276
- this.intro.replace(/^[^\n]/gm, function (match, index) {
1277
- return index > 0 ? indentStr + match : match;
1278
- });
1279
- }
1280
-
1281
- return this;
1282
- };
1283
-
1284
- Bundle.prototype.prepend = function prepend (str) {
1285
- this.intro = str + this.intro;
1286
- return this;
1287
- };
1288
-
1289
- Bundle.prototype.toString = function toString () {
1290
- var this$1$1 = this;
1291
-
1292
- var body = this.sources
1293
- .map(function (source, i) {
1294
- var separator = source.separator !== undefined ? source.separator : this$1$1.separator;
1295
- var str = (i > 0 ? separator : '') + source.content.toString();
1296
-
1297
- return str;
1298
- })
1299
- .join('');
1300
-
1301
- return this.intro + body;
1302
- };
1303
-
1304
- Bundle.prototype.isEmpty = function isEmpty () {
1305
- if (this.intro.length && this.intro.trim())
1306
- { return false; }
1307
- if (this.sources.some(function (source) { return !source.content.isEmpty(); }))
1308
- { return false; }
1309
- return true;
1310
- };
1311
-
1312
- Bundle.prototype.length = function length () {
1313
- return this.sources.reduce(function (length, source) { return length + source.content.length(); }, this.intro.length);
1314
- };
1315
-
1316
- Bundle.prototype.trimLines = function trimLines () {
1317
- return this.trim('[\\r\\n]');
1318
- };
1319
-
1320
- Bundle.prototype.trim = function trim (charType) {
1321
- return this.trimStart(charType).trimEnd(charType);
1322
- };
1323
-
1324
- Bundle.prototype.trimStart = function trimStart (charType) {
1325
- var rx = new RegExp('^' + (charType || '\\s') + '+');
1326
- this.intro = this.intro.replace(rx, '');
1327
-
1328
- if (!this.intro) {
1329
- var source;
1330
- var i = 0;
1331
-
1332
- do {
1333
- source = this.sources[i++];
1334
- if (!source) {
1335
- break;
1336
- }
1337
- } while (!source.content.trimStartAborted(charType));
1338
- }
1339
-
1340
- return this;
1341
- };
1342
-
1343
- Bundle.prototype.trimEnd = function trimEnd (charType) {
1344
- var rx = new RegExp((charType || '\\s') + '+$');
1345
-
1346
- var source;
1347
- var i = this.sources.length - 1;
1348
-
1349
- do {
1350
- source = this.sources[i--];
1351
- if (!source) {
1352
- this.intro = this.intro.replace(rx, '');
1353
- break;
1354
- }
1355
- } while (!source.content.trimEndAborted(charType));
1356
-
1357
- return this;
1358
- };
1359
-
1360
- export { Bundle, SourceMap, MagicString as default };
1361
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFnaWMtc3RyaW5nLmVzLTk0MDAwYWVhLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vc291cmNlbWFwLWNvZGVjQDEuNC44L25vZGVfbW9kdWxlcy9zb3VyY2VtYXAtY29kZWMvZGlzdC9zb3VyY2VtYXAtY29kZWMuZXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vbWFnaWMtc3RyaW5nQDAuMjUuNy9ub2RlX21vZHVsZXMvbWFnaWMtc3RyaW5nL2Rpc3QvbWFnaWMtc3RyaW5nLmVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBjaGFyVG9JbnRlZ2VyID0ge307XG52YXIgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nO1xuZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykge1xuICAgIGNoYXJUb0ludGVnZXJbY2hhcnMuY2hhckNvZGVBdChpKV0gPSBpO1xufVxuZnVuY3Rpb24gZGVjb2RlKG1hcHBpbmdzKSB7XG4gICAgdmFyIGRlY29kZWQgPSBbXTtcbiAgICB2YXIgbGluZSA9IFtdO1xuICAgIHZhciBzZWdtZW50ID0gW1xuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgIF07XG4gICAgdmFyIGogPSAwO1xuICAgIGZvciAodmFyIGkgPSAwLCBzaGlmdCA9IDAsIHZhbHVlID0gMDsgaSA8IG1hcHBpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjID0gbWFwcGluZ3MuY2hhckNvZGVBdChpKTtcbiAgICAgICAgaWYgKGMgPT09IDQ0KSB7IC8vIFwiLFwiXG4gICAgICAgICAgICBzZWdtZW50aWZ5KGxpbmUsIHNlZ21lbnQsIGopO1xuICAgICAgICAgICAgaiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYyA9PT0gNTkpIHsgLy8gXCI7XCJcbiAgICAgICAgICAgIHNlZ21lbnRpZnkobGluZSwgc2VnbWVudCwgaik7XG4gICAgICAgICAgICBqID0gMDtcbiAgICAgICAgICAgIGRlY29kZWQucHVzaChsaW5lKTtcbiAgICAgICAgICAgIGxpbmUgPSBbXTtcbiAgICAgICAgICAgIHNlZ21lbnRbMF0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGludGVnZXIgPSBjaGFyVG9JbnRlZ2VyW2NdO1xuICAgICAgICAgICAgaWYgKGludGVnZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjaGFyYWN0ZXIgKCcgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpICsgJyknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBoYXNDb250aW51YXRpb25CaXQgPSBpbnRlZ2VyICYgMzI7XG4gICAgICAgICAgICBpbnRlZ2VyICY9IDMxO1xuICAgICAgICAgICAgdmFsdWUgKz0gaW50ZWdlciA8PCBzaGlmdDtcbiAgICAgICAgICAgIGlmIChoYXNDb250aW51YXRpb25CaXQpIHtcbiAgICAgICAgICAgICAgICBzaGlmdCArPSA1O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHNob3VsZE5lZ2F0ZSA9IHZhbHVlICYgMTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA+Pj49IDE7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZE5lZ2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID09PSAwID8gLTB4ODAwMDAwMDAgOiAtdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNlZ21lbnRbal0gKz0gdmFsdWU7XG4gICAgICAgICAgICAgICAgaisrO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gc2hpZnQgPSAwOyAvLyByZXNldFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHNlZ21lbnRpZnkobGluZSwgc2VnbWVudCwgaik7XG4gICAgZGVjb2RlZC5wdXNoKGxpbmUpO1xuICAgIHJldHVybiBkZWNvZGVkO1xufVxuZnVuY3Rpb24gc2VnbWVudGlmeShsaW5lLCBzZWdtZW50LCBqKSB7XG4gICAgLy8gVGhpcyBsb29rcyB1Z2x5LCBidXQgd2UncmUgY3JlYXRpbmcgc3BlY2lhbGl6ZWQgYXJyYXlzIHdpdGggYSBzcGVjaWZpY1xuICAgIC8vIGxlbmd0aC4gVGhpcyBpcyBtdWNoIGZhc3RlciB0aGFuIGNyZWF0aW5nIGEgbmV3IGFycmF5ICh3aGljaCB2OCBleHBhbmRzIHRvXG4gICAgLy8gYSBjYXBhY2l0eSBvZiAxNyBhZnRlciBwdXNoaW5nIHRoZSBmaXJzdCBpdGVtKSwgb3Igc2xpY2luZyBvdXQgYSBzdWJhcnJheVxuICAgIC8vICh3aGljaCBpcyBzbG93KS4gTGVuZ3RoIDQgaXMgYXNzdW1lZCB0byBiZSB0aGUgbW9zdCBmcmVxdWVudCwgZm9sbG93ZWQgYnlcbiAgICAvLyBsZW5ndGggNSAoc2luY2Ugbm90IGV2ZXJ5dGhpbmcgd2lsbCBoYXZlIGFuIGFzc29jaWF0ZWQgbmFtZSksIGZvbGxvd2VkIGJ5XG4gICAgLy8gbGVuZ3RoIDEgKGl0J3MgcHJvYmFibHkgcmFyZSBmb3IgYSBzb3VyY2Ugc3Vic3RyaW5nIHRvIG5vdCBoYXZlIGFuXG4gICAgLy8gYXNzb2NpYXRlZCBzZWdtZW50IGRhdGEpLlxuICAgIGlmIChqID09PSA0KVxuICAgICAgICBsaW5lLnB1c2goW3NlZ21lbnRbMF0sIHNlZ21lbnRbMV0sIHNlZ21lbnRbMl0sIHNlZ21lbnRbM11dKTtcbiAgICBlbHNlIGlmIChqID09PSA1KVxuICAgICAgICBsaW5lLnB1c2goW3NlZ21lbnRbMF0sIHNlZ21lbnRbMV0sIHNlZ21lbnRbMl0sIHNlZ21lbnRbM10sIHNlZ21lbnRbNF1dKTtcbiAgICBlbHNlIGlmIChqID09PSAxKVxuICAgICAgICBsaW5lLnB1c2goW3NlZ21lbnRbMF1dKTtcbn1cbmZ1bmN0aW9uIGVuY29kZShkZWNvZGVkKSB7XG4gICAgdmFyIHNvdXJjZUZpbGVJbmRleCA9IDA7IC8vIHNlY29uZCBmaWVsZFxuICAgIHZhciBzb3VyY2VDb2RlTGluZSA9IDA7IC8vIHRoaXJkIGZpZWxkXG4gICAgdmFyIHNvdXJjZUNvZGVDb2x1bW4gPSAwOyAvLyBmb3VydGggZmllbGRcbiAgICB2YXIgbmFtZUluZGV4ID0gMDsgLy8gZmlmdGggZmllbGRcbiAgICB2YXIgbWFwcGluZ3MgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlY29kZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGxpbmUgPSBkZWNvZGVkW2ldO1xuICAgICAgICBpZiAoaSA+IDApXG4gICAgICAgICAgICBtYXBwaW5ncyArPSAnOyc7XG4gICAgICAgIGlmIChsaW5lLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB2YXIgZ2VuZXJhdGVkQ29kZUNvbHVtbiA9IDA7IC8vIGZpcnN0IGZpZWxkXG4gICAgICAgIHZhciBsaW5lTWFwcGluZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBsaW5lXzEgPSBsaW5lOyBfaSA8IGxpbmVfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBzZWdtZW50ID0gbGluZV8xW19pXTtcbiAgICAgICAgICAgIHZhciBzZWdtZW50TWFwcGluZ3MgPSBlbmNvZGVJbnRlZ2VyKHNlZ21lbnRbMF0gLSBnZW5lcmF0ZWRDb2RlQ29sdW1uKTtcbiAgICAgICAgICAgIGdlbmVyYXRlZENvZGVDb2x1bW4gPSBzZWdtZW50WzBdO1xuICAgICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHNlZ21lbnRNYXBwaW5ncyArPVxuICAgICAgICAgICAgICAgICAgICBlbmNvZGVJbnRlZ2VyKHNlZ21lbnRbMV0gLSBzb3VyY2VGaWxlSW5kZXgpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUludGVnZXIoc2VnbWVudFsyXSAtIHNvdXJjZUNvZGVMaW5lKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVJbnRlZ2VyKHNlZ21lbnRbM10gLSBzb3VyY2VDb2RlQ29sdW1uKTtcbiAgICAgICAgICAgICAgICBzb3VyY2VGaWxlSW5kZXggPSBzZWdtZW50WzFdO1xuICAgICAgICAgICAgICAgIHNvdXJjZUNvZGVMaW5lID0gc2VnbWVudFsyXTtcbiAgICAgICAgICAgICAgICBzb3VyY2VDb2RlQ29sdW1uID0gc2VnbWVudFszXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWdtZW50Lmxlbmd0aCA9PT0gNSkge1xuICAgICAgICAgICAgICAgIHNlZ21lbnRNYXBwaW5ncyArPSBlbmNvZGVJbnRlZ2VyKHNlZ21lbnRbNF0gLSBuYW1lSW5kZXgpO1xuICAgICAgICAgICAgICAgIG5hbWVJbmRleCA9IHNlZ21lbnRbNF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsaW5lTWFwcGluZ3MucHVzaChzZWdtZW50TWFwcGluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIG1hcHBpbmdzICs9IGxpbmVNYXBwaW5ncy5qb2luKCcsJyk7XG4gICAgfVxuICAgIHJldHVybiBtYXBwaW5ncztcbn1cbmZ1bmN0aW9uIGVuY29kZUludGVnZXIobnVtKSB7XG4gICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgIG51bSA9IG51bSA8IDAgPyAoLW51bSA8PCAxKSB8IDEgOiBudW0gPDwgMTtcbiAgICBkbyB7XG4gICAgICAgIHZhciBjbGFtcGVkID0gbnVtICYgMzE7XG4gICAgICAgIG51bSA+Pj49IDU7XG4gICAgICAgIGlmIChudW0gPiAwKSB7XG4gICAgICAgICAgICBjbGFtcGVkIHw9IDMyO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCArPSBjaGFyc1tjbGFtcGVkXTtcbiAgICB9IHdoaWxlIChudW0gPiAwKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgeyBkZWNvZGUsIGVuY29kZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c291cmNlbWFwLWNvZGVjLmVzLmpzLm1hcFxuIiwiaW1wb3J0IHsgZW5jb2RlIH0gZnJvbSAnc291cmNlbWFwLWNvZGVjJztcblxudmFyIEJpdFNldCA9IGZ1bmN0aW9uIEJpdFNldChhcmcpIHtcblx0dGhpcy5iaXRzID0gYXJnIGluc3RhbmNlb2YgQml0U2V0ID8gYXJnLmJpdHMuc2xpY2UoKSA6IFtdO1xufTtcblxuQml0U2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQgKG4pIHtcblx0dGhpcy5iaXRzW24gPj4gNV0gfD0gMSA8PCAobiAmIDMxKTtcbn07XG5cbkJpdFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gaGFzIChuKSB7XG5cdHJldHVybiAhISh0aGlzLmJpdHNbbiA+PiA1XSAmICgxIDw8IChuICYgMzEpKSk7XG59O1xuXG52YXIgQ2h1bmsgPSBmdW5jdGlvbiBDaHVuayhzdGFydCwgZW5kLCBjb250ZW50KSB7XG5cdHRoaXMuc3RhcnQgPSBzdGFydDtcblx0dGhpcy5lbmQgPSBlbmQ7XG5cdHRoaXMub3JpZ2luYWwgPSBjb250ZW50O1xuXG5cdHRoaXMuaW50cm8gPSAnJztcblx0dGhpcy5vdXRybyA9ICcnO1xuXG5cdHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG5cdHRoaXMuc3RvcmVOYW1lID0gZmFsc2U7XG5cdHRoaXMuZWRpdGVkID0gZmFsc2U7XG5cblx0Ly8gd2UgbWFrZSB0aGVzZSBub24tZW51bWVyYWJsZSwgZm9yIHNhbml0eSB3aGlsZSBkZWJ1Z2dpbmdcblx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuXHRcdHByZXZpb3VzOiB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogbnVsbCB9LFxuXHRcdG5leHQ6ICAgICB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogbnVsbCB9XG5cdH0pO1xufTtcblxuQ2h1bmsucHJvdG90eXBlLmFwcGVuZExlZnQgPSBmdW5jdGlvbiBhcHBlbmRMZWZ0IChjb250ZW50KSB7XG5cdHRoaXMub3V0cm8gKz0gY29udGVudDtcbn07XG5cbkNodW5rLnByb3RvdHlwZS5hcHBlbmRSaWdodCA9IGZ1bmN0aW9uIGFwcGVuZFJpZ2h0IChjb250ZW50KSB7XG5cdHRoaXMuaW50cm8gPSB0aGlzLmludHJvICsgY29udGVudDtcbn07XG5cbkNodW5rLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIGNsb25lICgpIHtcblx0dmFyIGNodW5rID0gbmV3IENodW5rKHRoaXMuc3RhcnQsIHRoaXMuZW5kLCB0aGlzLm9yaWdpbmFsKTtcblxuXHRjaHVuay5pbnRybyA9IHRoaXMuaW50cm87XG5cdGNodW5rLm91dHJvID0gdGhpcy5vdXRybztcblx0Y2h1bmsuY29udGVudCA9IHRoaXMuY29udGVudDtcblx0Y2h1bmsuc3RvcmVOYW1lID0gdGhpcy5zdG9yZU5hbWU7XG5cdGNodW5rLmVkaXRlZCA9IHRoaXMuZWRpdGVkO1xuXG5cdHJldHVybiBjaHVuaztcbn07XG5cbkNodW5rLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIGNvbnRhaW5zIChpbmRleCkge1xuXHRyZXR1cm4gdGhpcy5zdGFydCA8IGluZGV4ICYmIGluZGV4IDwgdGhpcy5lbmQ7XG59O1xuXG5DaHVuay5wcm90b3R5cGUuZWFjaE5leHQgPSBmdW5jdGlvbiBlYWNoTmV4dCAoZm4pIHtcblx0dmFyIGNodW5rID0gdGhpcztcblx0d2hpbGUgKGNodW5rKSB7XG5cdFx0Zm4oY2h1bmspO1xuXHRcdGNodW5rID0gY2h1bmsubmV4dDtcblx0fVxufTtcblxuQ2h1bmsucHJvdG90eXBlLmVhY2hQcmV2aW91cyA9IGZ1bmN0aW9uIGVhY2hQcmV2aW91cyAoZm4pIHtcblx0dmFyIGNodW5rID0gdGhpcztcblx0d2hpbGUgKGNodW5rKSB7XG5cdFx0Zm4oY2h1bmspO1xuXHRcdGNodW5rID0gY2h1bmsucHJldmlvdXM7XG5cdH1cbn07XG5cbkNodW5rLnByb3RvdHlwZS5lZGl0ID0gZnVuY3Rpb24gZWRpdCAoY29udGVudCwgc3RvcmVOYW1lLCBjb250ZW50T25seSkge1xuXHR0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuXHRpZiAoIWNvbnRlbnRPbmx5KSB7XG5cdFx0dGhpcy5pbnRybyA9ICcnO1xuXHRcdHRoaXMub3V0cm8gPSAnJztcblx0fVxuXHR0aGlzLnN0b3JlTmFtZSA9IHN0b3JlTmFtZTtcblxuXHR0aGlzLmVkaXRlZCA9IHRydWU7XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5DaHVuay5wcm90b3R5cGUucHJlcGVuZExlZnQgPSBmdW5jdGlvbiBwcmVwZW5kTGVmdCAoY29udGVudCkge1xuXHR0aGlzLm91dHJvID0gY29udGVudCArIHRoaXMub3V0cm87XG59O1xuXG5DaHVuay5wcm90b3R5cGUucHJlcGVuZFJpZ2h0ID0gZnVuY3Rpb24gcHJlcGVuZFJpZ2h0IChjb250ZW50KSB7XG5cdHRoaXMuaW50cm8gPSBjb250ZW50ICsgdGhpcy5pbnRybztcbn07XG5cbkNodW5rLnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uIHNwbGl0IChpbmRleCkge1xuXHR2YXIgc2xpY2VJbmRleCA9IGluZGV4IC0gdGhpcy5zdGFydDtcblxuXHR2YXIgb3JpZ2luYWxCZWZvcmUgPSB0aGlzLm9yaWdpbmFsLnNsaWNlKDAsIHNsaWNlSW5kZXgpO1xuXHR2YXIgb3JpZ2luYWxBZnRlciA9IHRoaXMub3JpZ2luYWwuc2xpY2Uoc2xpY2VJbmRleCk7XG5cblx0dGhpcy5vcmlnaW5hbCA9IG9yaWdpbmFsQmVmb3JlO1xuXG5cdHZhciBuZXdDaHVuayA9IG5ldyBDaHVuayhpbmRleCwgdGhpcy5lbmQsIG9yaWdpbmFsQWZ0ZXIpO1xuXHRuZXdDaHVuay5vdXRybyA9IHRoaXMub3V0cm87XG5cdHRoaXMub3V0cm8gPSAnJztcblxuXHR0aGlzLmVuZCA9IGluZGV4O1xuXG5cdGlmICh0aGlzLmVkaXRlZCkge1xuXHRcdC8vIFRPRE8gaXMgdGhpcyBibG9jayBuZWNlc3Nhcnk/Li4uXG5cdFx0bmV3Q2h1bmsuZWRpdCgnJywgZmFsc2UpO1xuXHRcdHRoaXMuY29udGVudCA9ICcnO1xuXHR9IGVsc2Uge1xuXHRcdHRoaXMuY29udGVudCA9IG9yaWdpbmFsQmVmb3JlO1xuXHR9XG5cblx0bmV3Q2h1bmsubmV4dCA9IHRoaXMubmV4dDtcblx0aWYgKG5ld0NodW5rLm5leHQpIHsgbmV3Q2h1bmsubmV4dC5wcmV2aW91cyA9IG5ld0NodW5rOyB9XG5cdG5ld0NodW5rLnByZXZpb3VzID0gdGhpcztcblx0dGhpcy5uZXh0ID0gbmV3Q2h1bms7XG5cblx0cmV0dXJuIG5ld0NodW5rO1xufTtcblxuQ2h1bmsucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuXHRyZXR1cm4gdGhpcy5pbnRybyArIHRoaXMuY29udGVudCArIHRoaXMub3V0cm87XG59O1xuXG5DaHVuay5wcm90b3R5cGUudHJpbUVuZCA9IGZ1bmN0aW9uIHRyaW1FbmQgKHJ4KSB7XG5cdHRoaXMub3V0cm8gPSB0aGlzLm91dHJvLnJlcGxhY2UocngsICcnKTtcblx0aWYgKHRoaXMub3V0cm8ubGVuZ3RoKSB7IHJldHVybiB0cnVlOyB9XG5cblx0dmFyIHRyaW1tZWQgPSB0aGlzLmNvbnRlbnQucmVwbGFjZShyeCwgJycpO1xuXG5cdGlmICh0cmltbWVkLmxlbmd0aCkge1xuXHRcdGlmICh0cmltbWVkICE9PSB0aGlzLmNvbnRlbnQpIHtcblx0XHRcdHRoaXMuc3BsaXQodGhpcy5zdGFydCArIHRyaW1tZWQubGVuZ3RoKS5lZGl0KCcnLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9IGVsc2Uge1xuXHRcdHRoaXMuZWRpdCgnJywgdW5kZWZpbmVkLCB0cnVlKTtcblxuXHRcdHRoaXMuaW50cm8gPSB0aGlzLmludHJvLnJlcGxhY2UocngsICcnKTtcblx0XHRpZiAodGhpcy5pbnRyby5sZW5ndGgpIHsgcmV0dXJuIHRydWU7IH1cblx0fVxufTtcblxuQ2h1bmsucHJvdG90eXBlLnRyaW1TdGFydCA9IGZ1bmN0aW9uIHRyaW1TdGFydCAocngpIHtcblx0dGhpcy5pbnRybyA9IHRoaXMuaW50cm8ucmVwbGFjZShyeCwgJycpO1xuXHRpZiAodGhpcy5pbnRyby5sZW5ndGgpIHsgcmV0dXJuIHRydWU7IH1cblxuXHR2YXIgdHJpbW1lZCA9IHRoaXMuY29udGVudC5yZXBsYWNlKHJ4LCAnJyk7XG5cblx0aWYgKHRyaW1tZWQubGVuZ3RoKSB7XG5cdFx0aWYgKHRyaW1tZWQgIT09IHRoaXMuY29udGVudCkge1xuXHRcdFx0dGhpcy5zcGxpdCh0aGlzLmVuZCAtIHRyaW1tZWQubGVuZ3RoKTtcblx0XHRcdHRoaXMuZWRpdCgnJywgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fSBlbHNlIHtcblx0XHR0aGlzLmVkaXQoJycsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cblx0XHR0aGlzLm91dHJvID0gdGhpcy5vdXRyby5yZXBsYWNlKHJ4LCAnJyk7XG5cdFx0aWYgKHRoaXMub3V0cm8ubGVuZ3RoKSB7IHJldHVybiB0cnVlOyB9XG5cdH1cbn07XG5cbnZhciBidG9hID0gZnVuY3Rpb24gKCkge1xuXHR0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGVudmlyb25tZW50OiBgd2luZG93LmJ0b2FgIG9yIGBCdWZmZXJgIHNob3VsZCBiZSBzdXBwb3J0ZWQuJyk7XG59O1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuYnRvYSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRidG9hID0gZnVuY3Rpb24gKHN0cikgeyByZXR1cm4gd2luZG93LmJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpKTsgfTtcbn0gZWxzZSBpZiAodHlwZW9mIEJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRidG9hID0gZnVuY3Rpb24gKHN0cikgeyByZXR1cm4gQnVmZmVyLmZyb20oc3RyLCAndXRmLTgnKS50b1N0cmluZygnYmFzZTY0Jyk7IH07XG59XG5cbnZhciBTb3VyY2VNYXAgPSBmdW5jdGlvbiBTb3VyY2VNYXAocHJvcGVydGllcykge1xuXHR0aGlzLnZlcnNpb24gPSAzO1xuXHR0aGlzLmZpbGUgPSBwcm9wZXJ0aWVzLmZpbGU7XG5cdHRoaXMuc291cmNlcyA9IHByb3BlcnRpZXMuc291cmNlcztcblx0dGhpcy5zb3VyY2VzQ29udGVudCA9IHByb3BlcnRpZXMuc291cmNlc0NvbnRlbnQ7XG5cdHRoaXMubmFtZXMgPSBwcm9wZXJ0aWVzLm5hbWVzO1xuXHR0aGlzLm1hcHBpbmdzID0gZW5jb2RlKHByb3BlcnRpZXMubWFwcGluZ3MpO1xufTtcblxuU291cmNlTWFwLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcblx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpO1xufTtcblxuU291cmNlTWFwLnByb3RvdHlwZS50b1VybCA9IGZ1bmN0aW9uIHRvVXJsICgpIHtcblx0cmV0dXJuICdkYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsJyArIGJ0b2EodGhpcy50b1N0cmluZygpKTtcbn07XG5cbmZ1bmN0aW9uIGd1ZXNzSW5kZW50KGNvZGUpIHtcblx0dmFyIGxpbmVzID0gY29kZS5zcGxpdCgnXFxuJyk7XG5cblx0dmFyIHRhYmJlZCA9IGxpbmVzLmZpbHRlcihmdW5jdGlvbiAobGluZSkgeyByZXR1cm4gL15cXHQrLy50ZXN0KGxpbmUpOyB9KTtcblx0dmFyIHNwYWNlZCA9IGxpbmVzLmZpbHRlcihmdW5jdGlvbiAobGluZSkgeyByZXR1cm4gL14gezIsfS8udGVzdChsaW5lKTsgfSk7XG5cblx0aWYgKHRhYmJlZC5sZW5ndGggPT09IDAgJiYgc3BhY2VkLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gTW9yZSBsaW5lcyB0YWJiZWQgdGhhbiBzcGFjZWQ/IEFzc3VtZSB0YWJzLCBhbmRcblx0Ly8gZGVmYXVsdCB0byB0YWJzIGluIHRoZSBjYXNlIG9mIGEgdGllIChvciBub3RoaW5nXG5cdC8vIHRvIGdvIG9uKVxuXHRpZiAodGFiYmVkLmxlbmd0aCA+PSBzcGFjZWQubGVuZ3RoKSB7XG5cdFx0cmV0dXJuICdcXHQnO1xuXHR9XG5cblx0Ly8gT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIGd1ZXNzIHRoZSBtdWx0aXBsZVxuXHR2YXIgbWluID0gc3BhY2VkLnJlZHVjZShmdW5jdGlvbiAocHJldmlvdXMsIGN1cnJlbnQpIHtcblx0XHR2YXIgbnVtU3BhY2VzID0gL14gKy8uZXhlYyhjdXJyZW50KVswXS5sZW5ndGg7XG5cdFx0cmV0dXJuIE1hdGgubWluKG51bVNwYWNlcywgcHJldmlvdXMpO1xuXHR9LCBJbmZpbml0eSk7XG5cblx0cmV0dXJuIG5ldyBBcnJheShtaW4gKyAxKS5qb2luKCcgJyk7XG59XG5cbmZ1bmN0aW9uIGdldFJlbGF0aXZlUGF0aChmcm9tLCB0bykge1xuXHR2YXIgZnJvbVBhcnRzID0gZnJvbS5zcGxpdCgvWy9cXFxcXS8pO1xuXHR2YXIgdG9QYXJ0cyA9IHRvLnNwbGl0KC9bL1xcXFxdLyk7XG5cblx0ZnJvbVBhcnRzLnBvcCgpOyAvLyBnZXQgZGlybmFtZVxuXG5cdHdoaWxlIChmcm9tUGFydHNbMF0gPT09IHRvUGFydHNbMF0pIHtcblx0XHRmcm9tUGFydHMuc2hpZnQoKTtcblx0XHR0b1BhcnRzLnNoaWZ0KCk7XG5cdH1cblxuXHRpZiAoZnJvbVBhcnRzLmxlbmd0aCkge1xuXHRcdHZhciBpID0gZnJvbVBhcnRzLmxlbmd0aDtcblx0XHR3aGlsZSAoaS0tKSB7IGZyb21QYXJ0c1tpXSA9ICcuLic7IH1cblx0fVxuXG5cdHJldHVybiBmcm9tUGFydHMuY29uY2F0KHRvUGFydHMpLmpvaW4oJy8nKTtcbn1cblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuZnVuY3Rpb24gaXNPYmplY3QodGhpbmcpIHtcblx0cmV0dXJuIHRvU3RyaW5nLmNhbGwodGhpbmcpID09PSAnW29iamVjdCBPYmplY3RdJztcbn1cblxuZnVuY3Rpb24gZ2V0TG9jYXRvcihzb3VyY2UpIHtcblx0dmFyIG9yaWdpbmFsTGluZXMgPSBzb3VyY2Uuc3BsaXQoJ1xcbicpO1xuXHR2YXIgbGluZU9mZnNldHMgPSBbXTtcblxuXHRmb3IgKHZhciBpID0gMCwgcG9zID0gMDsgaSA8IG9yaWdpbmFsTGluZXMubGVuZ3RoOyBpKyspIHtcblx0XHRsaW5lT2Zmc2V0cy5wdXNoKHBvcyk7XG5cdFx0cG9zICs9IG9yaWdpbmFsTGluZXNbaV0ubGVuZ3RoICsgMTtcblx0fVxuXG5cdHJldHVybiBmdW5jdGlvbiBsb2NhdGUoaW5kZXgpIHtcblx0XHR2YXIgaSA9IDA7XG5cdFx0dmFyIGogPSBsaW5lT2Zmc2V0cy5sZW5ndGg7XG5cdFx0d2hpbGUgKGkgPCBqKSB7XG5cdFx0XHR2YXIgbSA9IChpICsgaikgPj4gMTtcblx0XHRcdGlmIChpbmRleCA8IGxpbmVPZmZzZXRzW21dKSB7XG5cdFx0XHRcdGogPSBtO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aSA9IG0gKyAxO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR2YXIgbGluZSA9IGkgLSAxO1xuXHRcdHZhciBjb2x1bW4gPSBpbmRleCAtIGxpbmVPZmZzZXRzW2xpbmVdO1xuXHRcdHJldHVybiB7IGxpbmU6IGxpbmUsIGNvbHVtbjogY29sdW1uIH07XG5cdH07XG59XG5cbnZhciBNYXBwaW5ncyA9IGZ1bmN0aW9uIE1hcHBpbmdzKGhpcmVzKSB7XG5cdHRoaXMuaGlyZXMgPSBoaXJlcztcblx0dGhpcy5nZW5lcmF0ZWRDb2RlTGluZSA9IDA7XG5cdHRoaXMuZ2VuZXJhdGVkQ29kZUNvbHVtbiA9IDA7XG5cdHRoaXMucmF3ID0gW107XG5cdHRoaXMucmF3U2VnbWVudHMgPSB0aGlzLnJhd1t0aGlzLmdlbmVyYXRlZENvZGVMaW5lXSA9IFtdO1xuXHR0aGlzLnBlbmRpbmcgPSBudWxsO1xufTtcblxuTWFwcGluZ3MucHJvdG90eXBlLmFkZEVkaXQgPSBmdW5jdGlvbiBhZGRFZGl0IChzb3VyY2VJbmRleCwgY29udGVudCwgbG9jLCBuYW1lSW5kZXgpIHtcblx0aWYgKGNvbnRlbnQubGVuZ3RoKSB7XG5cdFx0dmFyIHNlZ21lbnQgPSBbdGhpcy5nZW5lcmF0ZWRDb2RlQ29sdW1uLCBzb3VyY2VJbmRleCwgbG9jLmxpbmUsIGxvYy5jb2x1bW5dO1xuXHRcdGlmIChuYW1lSW5kZXggPj0gMCkge1xuXHRcdFx0c2VnbWVudC5wdXNoKG5hbWVJbmRleCk7XG5cdFx0fVxuXHRcdHRoaXMucmF3U2VnbWVudHMucHVzaChzZWdtZW50KTtcblx0fSBlbHNlIGlmICh0aGlzLnBlbmRpbmcpIHtcblx0XHR0aGlzLnJhd1NlZ21lbnRzLnB1c2godGhpcy5wZW5kaW5nKTtcblx0fVxuXG5cdHRoaXMuYWR2YW5jZShjb250ZW50KTtcblx0dGhpcy5wZW5kaW5nID0gbnVsbDtcbn07XG5cbk1hcHBpbmdzLnByb3RvdHlwZS5hZGRVbmVkaXRlZENodW5rID0gZnVuY3Rpb24gYWRkVW5lZGl0ZWRDaHVuayAoc291cmNlSW5kZXgsIGNodW5rLCBvcmlnaW5hbCwgbG9jLCBzb3VyY2VtYXBMb2NhdGlvbnMpIHtcblx0dmFyIG9yaWdpbmFsQ2hhckluZGV4ID0gY2h1bmsuc3RhcnQ7XG5cdHZhciBmaXJzdCA9IHRydWU7XG5cblx0d2hpbGUgKG9yaWdpbmFsQ2hhckluZGV4IDwgY2h1bmsuZW5kKSB7XG5cdFx0aWYgKHRoaXMuaGlyZXMgfHwgZmlyc3QgfHwgc291cmNlbWFwTG9jYXRpb25zLmhhcyhvcmlnaW5hbENoYXJJbmRleCkpIHtcblx0XHRcdHRoaXMucmF3U2VnbWVudHMucHVzaChbdGhpcy5nZW5lcmF0ZWRDb2RlQ29sdW1uLCBzb3VyY2VJbmRleCwgbG9jLmxpbmUsIGxvYy5jb2x1bW5dKTtcblx0XHR9XG5cblx0XHRpZiAob3JpZ2luYWxbb3JpZ2luYWxDaGFySW5kZXhdID09PSAnXFxuJykge1xuXHRcdFx0bG9jLmxpbmUgKz0gMTtcblx0XHRcdGxvYy5jb2x1bW4gPSAwO1xuXHRcdFx0dGhpcy5nZW5lcmF0ZWRDb2RlTGluZSArPSAxO1xuXHRcdFx0dGhpcy5yYXdbdGhpcy5nZW5lcmF0ZWRDb2RlTGluZV0gPSB0aGlzLnJhd1NlZ21lbnRzID0gW107XG5cdFx0XHR0aGlzLmdlbmVyYXRlZENvZGVDb2x1bW4gPSAwO1xuXHRcdFx0Zmlyc3QgPSB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsb2MuY29sdW1uICs9IDE7XG5cdFx0XHR0aGlzLmdlbmVyYXRlZENvZGVDb2x1bW4gKz0gMTtcblx0XHRcdGZpcnN0ID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0b3JpZ2luYWxDaGFySW5kZXggKz0gMTtcblx0fVxuXG5cdHRoaXMucGVuZGluZyA9IG51bGw7XG59O1xuXG5NYXBwaW5ncy5wcm90b3R5cGUuYWR2YW5jZSA9IGZ1bmN0aW9uIGFkdmFuY2UgKHN0cikge1xuXHRpZiAoIXN0cikgeyByZXR1cm47IH1cblxuXHR2YXIgbGluZXMgPSBzdHIuc3BsaXQoJ1xcbicpO1xuXG5cdGlmIChsaW5lcy5sZW5ndGggPiAxKSB7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGggLSAxOyBpKyspIHtcblx0XHRcdHRoaXMuZ2VuZXJhdGVkQ29kZUxpbmUrKztcblx0XHRcdHRoaXMucmF3W3RoaXMuZ2VuZXJhdGVkQ29kZUxpbmVdID0gdGhpcy5yYXdTZWdtZW50cyA9IFtdO1xuXHRcdH1cblx0XHR0aGlzLmdlbmVyYXRlZENvZGVDb2x1bW4gPSAwO1xuXHR9XG5cblx0dGhpcy5nZW5lcmF0ZWRDb2RlQ29sdW1uICs9IGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLmxlbmd0aDtcbn07XG5cbnZhciBuID0gJ1xcbic7XG5cbnZhciB3YXJuZWQgPSB7XG5cdGluc2VydExlZnQ6IGZhbHNlLFxuXHRpbnNlcnRSaWdodDogZmFsc2UsXG5cdHN0b3JlTmFtZTogZmFsc2Vcbn07XG5cbnZhciBNYWdpY1N0cmluZyA9IGZ1bmN0aW9uIE1hZ2ljU3RyaW5nKHN0cmluZywgb3B0aW9ucykge1xuXHRpZiAoIG9wdGlvbnMgPT09IHZvaWQgMCApIG9wdGlvbnMgPSB7fTtcblxuXHR2YXIgY2h1bmsgPSBuZXcgQ2h1bmsoMCwgc3RyaW5nLmxlbmd0aCwgc3RyaW5nKTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG5cdFx0b3JpZ2luYWw6ICAgICAgICAgICAgICB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogc3RyaW5nIH0sXG5cdFx0b3V0cm86ICAgICAgICAgICAgICAgICB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogJycgfSxcblx0XHRpbnRybzogICAgICAgICAgICAgICAgIHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiAnJyB9LFxuXHRcdGZpcnN0Q2h1bms6ICAgICAgICAgICAgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IGNodW5rIH0sXG5cdFx0bGFzdENodW5rOiAgICAgICAgICAgICB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogY2h1bmsgfSxcblx0XHRsYXN0U2VhcmNoZWRDaHVuazogICAgIHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBjaHVuayB9LFxuXHRcdGJ5U3RhcnQ6ICAgICAgICAgICAgICAgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHt9IH0sXG5cdFx0YnlFbmQ6ICAgICAgICAgICAgICAgICB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZToge30gfSxcblx0XHRmaWxlbmFtZTogICAgICAgICAgICAgIHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBvcHRpb25zLmZpbGVuYW1lIH0sXG5cdFx0aW5kZW50RXhjbHVzaW9uUmFuZ2VzOiB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogb3B0aW9ucy5pbmRlbnRFeGNsdXNpb25SYW5nZXMgfSxcblx0XHRzb3VyY2VtYXBMb2NhdGlvbnM6ICAgIHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBuZXcgQml0U2V0KCkgfSxcblx0XHRzdG9yZWROYW1lczogICAgICAgICAgIHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB7fSB9LFxuXHRcdGluZGVudFN0cjogICAgICAgICAgICAgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IGd1ZXNzSW5kZW50KHN0cmluZykgfVxuXHR9KTtcblxuXHR0aGlzLmJ5U3RhcnRbMF0gPSBjaHVuaztcblx0dGhpcy5ieUVuZFtzdHJpbmcubGVuZ3RoXSA9IGNodW5rO1xufTtcblxuTWFnaWNTdHJpbmcucHJvdG90eXBlLmFkZFNvdXJjZW1hcExvY2F0aW9uID0gZnVuY3Rpb24gYWRkU291cmNlbWFwTG9jYXRpb24gKGNoYXIpIHtcblx0dGhpcy5zb3VyY2VtYXBMb2NhdGlvbnMuYWRkKGNoYXIpO1xufTtcblxuTWFnaWNTdHJpbmcucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIGFwcGVuZCAoY29udGVudCkge1xuXHRpZiAodHlwZW9mIGNvbnRlbnQgIT09ICdzdHJpbmcnKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ291dHJvIGNvbnRlbnQgbXVzdCBiZSBhIHN0cmluZycpOyB9XG5cblx0dGhpcy5vdXRybyArPSBjb250ZW50O1xuXHRyZXR1cm4gdGhpcztcbn07XG5cbk1hZ2ljU3RyaW5nLnByb3RvdHlwZS5hcHBlbmRMZWZ0ID0gZnVuY3Rpb24gYXBwZW5kTGVmdCAoaW5kZXgsIGNvbnRlbnQpIHtcblx0aWYgKHR5cGVvZiBjb250ZW50ICE9PSAnc3RyaW5nJykgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnNlcnRlZCBjb250ZW50IG11c3QgYmUgYSBzdHJpbmcnKTsgfVxuXG5cdHRoaXMuX3NwbGl0KGluZGV4KTtcblxuXHR2YXIgY2h1bmsgPSB0aGlzLmJ5RW5kW2luZGV4XTtcblxuXHRpZiAoY2h1bmspIHtcblx0XHRjaHVuay5hcHBlbmRMZWZ0KGNvbnRlbnQpO1xuXHR9IGVsc2Uge1xuXHRcdHRoaXMuaW50cm8gKz0gY29udGVudDtcblx0fVxuXHRyZXR1cm4gdGhpcztcbn07XG5cbk1hZ2ljU3RyaW5nLnByb3RvdHlwZS5hcHBlbmRSaWdodCA9IGZ1bmN0aW9uIGFwcGVuZFJpZ2h0IChpbmRleCwgY29udGVudCkge1xuXHRpZiAodHlwZW9mIGNvbnRlbnQgIT09ICdzdHJpbmcnKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ2luc2VydGVkIGNvbnRlbnQgbXVzdCBiZSBhIHN0cmluZycpOyB9XG5cblx0dGhpcy5fc3BsaXQoaW5kZXgpO1xuXG5cdHZhciBjaHVuayA9IHRoaXMuYnlTdGFydFtpbmRleF07XG5cblx0aWYgKGNodW5rKSB7XG5cdFx0Y2h1bmsuYXBwZW5kUmlnaHQoY29udGVudCk7XG5cdH0gZWxzZSB7XG5cdFx0dGhpcy5vdXRybyArPSBjb250ZW50O1xuXHR9XG5cdHJldHVybiB0aGlzO1xufTtcblxuTWFnaWNTdHJpbmcucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gY2xvbmUgKCkge1xuXHR2YXIgY2xvbmVkID0gbmV3IE1hZ2ljU3RyaW5nKHRoaXMub3JpZ2luYWwsIHsgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUgfSk7XG5cblx0dmFyIG9yaWdpbmFsQ2h1bmsgPSB0aGlzLmZpcnN0Q2h1bms7XG5cdHZhciBjbG9uZWRDaHVuayA9IChjbG9uZWQuZmlyc3RDaHVuayA9IGNsb25lZC5sYXN0U2VhcmNoZWRDaHVuayA9IG9yaWdpbmFsQ2h1bmsuY2xvbmUoKSk7XG5cblx0d2hpbGUgKG9yaWdpbmFsQ2h1bmspIHtcblx0XHRjbG9uZWQuYnlTdGFydFtjbG9uZWRDaHVuay5zdGFydF0gPSBjbG9uZWRDaHVuaztcblx0XHRjbG9uZWQuYnlFbmRbY2xvbmVkQ2h1bmsuZW5kXSA9IGNsb25lZENodW5rO1xuXG5cdFx0dmFyIG5leHRPcmlnaW5hbENodW5rID0gb3JpZ2luYWxDaHVuay5uZXh0O1xuXHRcdHZhciBuZXh0Q2xvbmVkQ2h1bmsgPSBuZXh0T3JpZ2luYWxDaHVuayAmJiBuZXh0T3JpZ2luYWxDaHVuay5jbG9uZSgpO1xuXG5cdFx0aWYgKG5leHRDbG9uZWRDaHVuaykge1xuXHRcdFx0Y2xvbmVkQ2h1bmsubmV4dCA9IG5leHRDbG9uZWRDaHVuaztcblx0XHRcdG5leHRDbG9uZWRDaHVuay5wcmV2aW91cyA9IGNsb25lZENodW5rO1xuXG5cdFx0XHRjbG9uZWRDaHVuayA9IG5leHRDbG9uZWRDaHVuaztcblx0XHR9XG5cblx0XHRvcmlnaW5hbENodW5rID0gbmV4dE9yaWdpbmFsQ2h1bms7XG5cdH1cblxuXHRjbG9uZWQubGFzdENodW5rID0gY2xvbmVkQ2h1bms7XG5cblx0aWYgKHRoaXMuaW5kZW50RXhjbHVzaW9uUmFuZ2VzKSB7XG5cdFx0Y2xvbmVkLmluZGVudEV4Y2x1c2lvblJhbmdlcyA9IHRoaXMuaW5kZW50RXhjbHVzaW9uUmFuZ2VzLnNsaWNlKCk7XG5cdH1cblxuXHRjbG9uZWQuc291cmNlbWFwTG9jYXRpb25zID0gbmV3IEJpdFNldCh0aGlzLnNvdXJjZW1hcExvY2F0aW9ucyk7XG5cblx0Y2xvbmVkLmludHJvID0gdGhpcy5pbnRybztcblx0Y2xvbmVkLm91dHJvID0gdGhpcy5vdXRybztcblxuXHRyZXR1cm4gY2xvbmVkO1xufTtcblxuTWFnaWNTdHJpbmcucHJvdG90eXBlLmdlbmVyYXRlRGVjb2RlZE1hcCA9IGZ1bmN0aW9uIGdlbmVyYXRlRGVjb2RlZE1hcCAob3B0aW9ucykge1xuXHRcdHZhciB0aGlzJDEgPSB0aGlzO1xuXG5cdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdHZhciBzb3VyY2VJbmRleCA9IDA7XG5cdHZhciBuYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuc3RvcmVkTmFtZXMpO1xuXHR2YXIgbWFwcGluZ3MgPSBuZXcgTWFwcGluZ3Mob3B0aW9ucy5oaXJlcyk7XG5cblx0dmFyIGxvY2F0ZSA9IGdldExvY2F0b3IodGhpcy5vcmlnaW5hbCk7XG5cblx0aWYgKHRoaXMuaW50cm8pIHtcblx0XHRtYXBwaW5ncy5hZHZhbmNlKHRoaXMuaW50cm8pO1xuXHR9XG5cblx0dGhpcy5maXJzdENodW5rLmVhY2hOZXh0KGZ1bmN0aW9uIChjaHVuaykge1xuXHRcdHZhciBsb2MgPSBsb2NhdGUoY2h1bmsuc3RhcnQpO1xuXG5cdFx0aWYgKGNodW5rLmludHJvLmxlbmd0aCkgeyBtYXBwaW5ncy5hZHZhbmNlKGNodW5rLmludHJvKTsgfVxuXG5cdFx0aWYgKGNodW5rLmVkaXRlZCkge1xuXHRcdFx0bWFwcGluZ3MuYWRkRWRpdChcblx0XHRcdFx0c291cmNlSW5kZXgsXG5cdFx0XHRcdGNodW5rLmNvbnRlbnQsXG5cdFx0XHRcdGxvYyxcblx0XHRcdFx0Y2h1bmsuc3RvcmVOYW1lID8gbmFtZXMuaW5kZXhPZihjaHVuay5vcmlnaW5hbCkgOiAtMVxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWFwcGluZ3MuYWRkVW5lZGl0ZWRDaHVuayhzb3VyY2VJbmRleCwgY2h1bmssIHRoaXMkMS5vcmlnaW5hbCwgbG9jLCB0aGlzJDEuc291cmNlbWFwTG9jYXRpb25zKTtcblx0XHR9XG5cblx0XHRpZiAoY2h1bmsub3V0cm8ubGVuZ3RoKSB7IG1hcHBpbmdzLmFkdmFuY2UoY2h1bmsub3V0cm8pOyB9XG5cdH0pO1xuXG5cdHJldHVybiB7XG5cdFx0ZmlsZTogb3B0aW9ucy5maWxlID8gb3B0aW9ucy5maWxlLnNwbGl0KC9bL1xcXFxdLykucG9wKCkgOiBudWxsLFxuXHRcdHNvdXJjZXM6IFtvcHRpb25zLnNvdXJjZSA/IGdldFJlbGF0aXZlUGF0aChvcHRpb25zLmZpbGUgfHwgJycsIG9wdGlvbnMuc291cmNlKSA6IG51bGxdLFxuXHRcdHNvdXJjZXNDb250ZW50OiBvcHRpb25zLmluY2x1ZGVDb250ZW50ID8gW3RoaXMub3JpZ2luYWxdIDogW251bGxdLFxuXHRcdG5hbWVzOiBuYW1lcyxcblx0XHRtYXBwaW5nczogbWFwcGluZ3MucmF3XG5cdH07XG59O1xuXG5NYWdpY1N0cmluZy5wcm90b3R5cGUuZ2VuZXJhdGVNYXAgPSBmdW5jdGlvbiBnZW5lcmF0ZU1hcCAob3B0aW9ucykge1xuXHRyZXR1cm4gbmV3IFNvdXJjZU1hcCh0aGlzLmdlbmVyYXRlRGVjb2RlZE1hcChvcHRpb25zKSk7XG59O1xuXG5NYWdpY1N0cmluZy5wcm90b3R5cGUuZ2V0SW5kZW50U3RyaW5nID0gZnVuY3Rpb24gZ2V0SW5kZW50U3RyaW5nICgpIHtcblx0cmV0dXJuIHRoaXMuaW5kZW50U3RyID09PSBudWxsID8gJ1xcdCcgOiB0aGlzLmluZGVudFN0cjtcbn07XG5cbk1hZ2ljU3RyaW5nLnByb3RvdHlwZS5pbmRlbnQgPSBmdW5jdGlvbiBpbmRlbnQgKGluZGVudFN0ciwgb3B0aW9ucykge1xuXHR2YXIgcGF0dGVybiA9IC9eW15cXHJcXG5dL2dtO1xuXG5cdGlmIChpc09iamVjdChpbmRlbnRTdHIpKSB7XG5cdFx0b3B0aW9ucyA9IGluZGVudFN0cjtcblx0XHRpbmRlbnRTdHIgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRpbmRlbnRTdHIgPSBpbmRlbnRTdHIgIT09IHVuZGVmaW5lZCA/IGluZGVudFN0ciA6IHRoaXMuaW5kZW50U3RyIHx8ICdcXHQnO1xuXG5cdGlmIChpbmRlbnRTdHIgPT09ICcnKSB7IHJldHVybiB0aGlzOyB9IC8vIG5vb3BcblxuXHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHQvLyBQcm9jZXNzIGV4Y2x1c2lvbiByYW5nZXNcblx0dmFyIGlzRXhjbHVkZWQgPSB7fTtcblxuXHRpZiAob3B0aW9ucy5leGNsdWRlKSB7XG5cdFx0dmFyIGV4Y2x1c2lvbnMgPVxuXHRcdFx0dHlwZW9mIG9wdGlvbnMuZXhjbHVkZVswXSA9PT0gJ251bWJlcicgPyBbb3B0aW9ucy5leGNsdWRlXSA6IG9wdGlvbnMuZXhjbHVkZTtcblx0XHRleGNsdXNpb25zLmZvckVhY2goZnVuY3Rpb24gKGV4Y2x1c2lvbikge1xuXHRcdFx0Zm9yICh2YXIgaSA9IGV4Y2x1c2lvblswXTsgaSA8IGV4Y2x1c2lvblsxXTsgaSArPSAxKSB7XG5cdFx0XHRcdGlzRXhjbHVkZWRbaV0gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0dmFyIHNob3VsZEluZGVudE5leHRDaGFyYWN0ZXIgPSBvcHRpb25zLmluZGVudFN0YXJ0ICE9PSBmYWxzZTtcblx0dmFyIHJlcGxhY2VyID0gZnVuY3Rpb24gKG1hdGNoKSB7XG5cdFx0aWYgKHNob3VsZEluZGVudE5leHRDaGFyYWN0ZXIpIHsgcmV0dXJuIChcIlwiICsgaW5kZW50U3RyICsgbWF0Y2gpOyB9XG5cdFx0c2hvdWxkSW5kZW50TmV4dENoYXJhY3RlciA9IHRydWU7XG5cdFx0cmV0dXJuIG1hdGNoO1xuXHR9O1xuXG5cdHRoaXMuaW50cm8gPSB0aGlzLmludHJvLnJlcGxhY2UocGF0dGVybiwgcmVwbGFjZXIpO1xuXG5cdHZhciBjaGFySW5kZXggPSAwO1xuXHR2YXIgY2h1bmsgPSB0aGlzLmZpcnN0Q2h1bms7XG5cblx0d2hpbGUgKGNodW5rKSB7XG5cdFx0dmFyIGVuZCA9IGNodW5rLmVuZDtcblxuXHRcdGlmIChjaHVuay5lZGl0ZWQpIHtcblx0XHRcdGlmICghaXNFeGNsdWRlZFtjaGFySW5kZXhdKSB7XG5cdFx0XHRcdGNodW5rLmNvbnRlbnQgPSBjaHVuay5jb250ZW50LnJlcGxhY2UocGF0dGVybiwgcmVwbGFjZXIpO1xuXG5cdFx0XHRcdGlmIChjaHVuay5jb250ZW50Lmxlbmd0aCkge1xuXHRcdFx0XHRcdHNob3VsZEluZGVudE5leHRDaGFyYWN0ZXIgPSBjaHVuay5jb250ZW50W2NodW5rLmNvbnRlbnQubGVuZ3RoIC0gMV0gPT09ICdcXG4nO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNoYXJJbmRleCA9IGNodW5rLnN0YXJ0O1xuXG5cdFx0XHR3aGlsZSAoY2hhckluZGV4IDwgZW5kKSB7XG5cdFx0XHRcdGlmICghaXNFeGNsdWRlZFtjaGFySW5kZXhdKSB7XG5cdFx0XHRcdFx0dmFyIGNoYXIgPSB0aGlzLm9yaWdpbmFsW2NoYXJJbmRleF07XG5cblx0XHRcdFx0XHRpZiAoY2hhciA9PT0gJ1xcbicpIHtcblx0XHRcdFx0XHRcdHNob3VsZEluZGVudE5leHRDaGFyYWN0ZXIgPSB0cnVlO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoY2hhciAhPT0gJ1xccicgJiYgc2hvdWxkSW5kZW50TmV4dENoYXJhY3Rlcikge1xuXHRcdFx0XHRcdFx0c2hvdWxkSW5kZW50TmV4dENoYXJhY3RlciA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0XHRpZiAoY2hhckluZGV4ID09PSBjaHVuay5zdGFydCkge1xuXHRcdFx0XHRcdFx0XHRjaHVuay5wcmVwZW5kUmlnaHQoaW5kZW50U3RyKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX3NwbGl0Q2h1bmsoY2h1bmssIGNoYXJJbmRleCk7XG5cdFx0XHRcdFx0XHRcdGNodW5rID0gY2h1bmsubmV4dDtcblx0XHRcdFx0XHRcdFx0Y2h1bmsucHJlcGVuZFJpZ2h0KGluZGVudFN0cik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y2hhckluZGV4ICs9IDE7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y2hhckluZGV4ID0gY2h1bmsuZW5kO1xuXHRcdGNodW5rID0gY2h1bmsubmV4dDtcblx0fVxuXG5cdHRoaXMub3V0cm8gPSB0aGlzLm91dHJvLnJlcGxhY2UocGF0dGVybiwgcmVwbGFjZXIpO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxuTWFnaWNTdHJpbmcucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIGluc2VydCAoKSB7XG5cdHRocm93IG5ldyBFcnJvcignbWFnaWNTdHJpbmcuaW5zZXJ0KC4uLikgaXMgZGVwcmVjYXRlZC4gVXNlIHByZXBlbmRSaWdodCguLi4pIG9yIGFwcGVuZExlZnQoLi4uKScpO1xufTtcblxuTWFnaWNTdHJpbmcucHJvdG90eXBlLmluc2VydExlZnQgPSBmdW5jdGlvbiBpbnNlcnRMZWZ0IChpbmRleCwgY29udGVudCkge1xuXHRpZiAoIXdhcm5lZC5pbnNlcnRMZWZ0KSB7XG5cdFx0Y29uc29sZS53YXJuKCdtYWdpY1N0cmluZy5pbnNlcnRMZWZ0KC4uLikgaXMgZGVwcmVjYXRlZC4gVXNlIG1hZ2ljU3RyaW5nLmFwcGVuZExlZnQoLi4uKSBpbnN0ZWFkJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuXHRcdHdhcm5lZC5pbnNlcnRMZWZ0ID0gdHJ1ZTtcblx0fVxuXG5cdHJldHVybiB0aGlzLmFwcGVuZExlZnQoaW5kZXgsIGNvbnRlbnQpO1xufTtcblxuTWFnaWNTdHJpbmcucHJvdG90eXBlLmluc2VydFJpZ2h0ID0gZnVuY3Rpb24gaW5zZXJ0UmlnaHQgKGluZGV4LCBjb250ZW50KSB7XG5cdGlmICghd2FybmVkLmluc2VydFJpZ2h0KSB7XG5cdFx0Y29uc29sZS53YXJuKCdtYWdpY1N0cmluZy5pbnNlcnRSaWdodCguLi4pIGlzIGRlcHJlY2F0ZWQuIFVzZSBtYWdpY1N0cmluZy5wcmVwZW5kUmlnaHQoLi4uKSBpbnN0ZWFkJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuXHRcdHdhcm5lZC5pbnNlcnRSaWdodCA9IHRydWU7XG5cdH1cblxuXHRyZXR1cm4gdGhpcy5wcmVwZW5kUmlnaHQoaW5kZXgsIGNvbnRlbnQpO1xufTtcblxuTWFnaWNTdHJpbmcucHJvdG90eXBlLm1vdmUgPSBmdW5jdGlvbiBtb3ZlIChzdGFydCwgZW5kLCBpbmRleCkge1xuXHRpZiAoaW5kZXggPj0gc3RhcnQgJiYgaW5kZXggPD0gZW5kKSB7IHRocm93IG5ldyBFcnJvcignQ2Fubm90IG1vdmUgYSBzZWxlY3Rpb24gaW5zaWRlIGl0c2VsZicpOyB9XG5cblx0dGhpcy5fc3BsaXQoc3RhcnQpO1xuXHR0aGlzLl9zcGxpdChlbmQpO1xuXHR0aGlzLl9zcGxpdChpbmRleCk7XG5cblx0dmFyIGZpcnN0ID0gdGhpcy5ieVN0YXJ0W3N0YXJ0XTtcblx0dmFyIGxhc3QgPSB0aGlzLmJ5RW5kW2VuZF07XG5cblx0dmFyIG9sZExlZnQgPSBmaXJzdC5wcmV2aW91cztcblx0dmFyIG9sZFJpZ2h0ID0gbGFzdC5uZXh0O1xuXG5cdHZhciBuZXdSaWdodCA9IHRoaXMuYnlTdGFydFtpbmRleF07XG5cdGlmICghbmV3UmlnaHQgJiYgbGFzdCA9PT0gdGhpcy5sYXN0Q2h1bmspIHsgcmV0dXJuIHRoaXM7IH1cblx0dmFyIG5ld0xlZnQgPSBuZXdSaWdodCA/IG5ld1JpZ2h0LnByZXZpb3VzIDogdGhpcy5sYXN0Q2h1bms7XG5cblx0aWYgKG9sZExlZnQpIHsgb2xkTGVmdC5uZXh0ID0gb2xkUmlnaHQ7IH1cblx0aWYgKG9sZFJpZ2h0KSB7IG9sZFJpZ2h0LnByZXZpb3VzID0gb2xkTGVmdDsgfVxuXG5cdGlmIChuZXdMZWZ0KSB7IG5ld0xlZnQubmV4dCA9IGZpcnN0OyB9XG5cdGlmIChuZXdSaWdodCkgeyBuZXdSaWdodC5wcmV2aW91cyA9IGxhc3Q7IH1cblxuXHRpZiAoIWZpcnN0LnByZXZpb3VzKSB7IHRoaXMuZmlyc3RDaHVuayA9IGxhc3QubmV4dDsgfVxuXHRpZiAoIWxhc3QubmV4dCkge1xuXHRcdHRoaXMubGFzdENodW5rID0gZmlyc3QucHJldmlvdXM7XG5cdFx0dGhpcy5sYXN0Q2h1bmsubmV4dCA9IG51bGw7XG5cdH1cblxuXHRmaXJzdC5wcmV2aW91cyA9IG5ld0xlZnQ7XG5cdGxhc3QubmV4dCA9IG5ld1JpZ2h0IHx8IG51bGw7XG5cblx0aWYgKCFuZXdMZWZ0KSB7IHRoaXMuZmlyc3RDaHVuayA9IGZpcnN0OyB9XG5cdGlmICghbmV3UmlnaHQpIHsgdGhpcy5sYXN0Q2h1bmsgPSBsYXN0OyB9XG5cdHJldHVybiB0aGlzO1xufTtcblxuTWFnaWNTdHJpbmcucHJvdG90eXBlLm92ZXJ3cml0ZSA9IGZ1bmN0aW9uIG92ZXJ3cml0ZSAoc3RhcnQsIGVuZCwgY29udGVudCwgb3B0aW9ucykge1xuXHRpZiAodHlwZW9mIGNvbnRlbnQgIT09ICdzdHJpbmcnKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlcGxhY2VtZW50IGNvbnRlbnQgbXVzdCBiZSBhIHN0cmluZycpOyB9XG5cblx0d2hpbGUgKHN0YXJ0IDwgMCkgeyBzdGFydCArPSB0aGlzLm9yaWdpbmFsLmxlbmd0aDsgfVxuXHR3aGlsZSAoZW5kIDwgMCkgeyBlbmQgKz0gdGhpcy5vcmlnaW5hbC5sZW5ndGg7IH1cblxuXHRpZiAoZW5kID4gdGhpcy5vcmlnaW5hbC5sZW5ndGgpIHsgdGhyb3cgbmV3IEVycm9yKCdlbmQgaXMgb3V0IG9mIGJvdW5kcycpOyB9XG5cdGlmIChzdGFydCA9PT0gZW5kKVxuXHRcdHsgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgb3ZlcndyaXRlIGEgemVyby1sZW5ndGggcmFuZ2Ug4oCTIHVzZSBhcHBlbmRMZWZ0IG9yIHByZXBlbmRSaWdodCBpbnN0ZWFkJyk7IH1cblxuXHR0aGlzLl9zcGxpdChzdGFydCk7XG5cdHRoaXMuX3NwbGl0KGVuZCk7XG5cblx0aWYgKG9wdGlvbnMgPT09IHRydWUpIHtcblx0XHRpZiAoIXdhcm5lZC5zdG9yZU5hbWUpIHtcblx0XHRcdGNvbnNvbGUud2FybignVGhlIGZpbmFsIGFyZ3VtZW50IHRvIG1hZ2ljU3RyaW5nLm92ZXJ3cml0ZSguLi4pIHNob3VsZCBiZSBhbiBvcHRpb25zIG9iamVjdC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yaWNoLWhhcnJpcy9tYWdpYy1zdHJpbmcnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG5cdFx0XHR3YXJuZWQuc3RvcmVOYW1lID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRvcHRpb25zID0geyBzdG9yZU5hbWU6IHRydWUgfTtcblx0fVxuXHR2YXIgc3RvcmVOYW1lID0gb3B0aW9ucyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zdG9yZU5hbWUgOiBmYWxzZTtcblx0dmFyIGNvbnRlbnRPbmx5ID0gb3B0aW9ucyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5jb250ZW50T25seSA6IGZhbHNlO1xuXG5cdGlmIChzdG9yZU5hbWUpIHtcblx0XHR2YXIgb3JpZ2luYWwgPSB0aGlzLm9yaWdpbmFsLnNsaWNlKHN0YXJ0LCBlbmQpO1xuXHRcdHRoaXMuc3RvcmVkTmFtZXNbb3JpZ2luYWxdID0gdHJ1ZTtcblx0fVxuXG5cdHZhciBmaXJzdCA9IHRoaXMuYnlTdGFydFtzdGFydF07XG5cdHZhciBsYXN0ID0gdGhpcy5ieUVuZFtlbmRdO1xuXG5cdGlmIChmaXJzdCkge1xuXHRcdGlmIChlbmQgPiBmaXJzdC5lbmQgJiYgZmlyc3QubmV4dCAhPT0gdGhpcy5ieVN0YXJ0W2ZpcnN0LmVuZF0pIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignQ2Fubm90IG92ZXJ3cml0ZSBhY3Jvc3MgYSBzcGxpdCBwb2ludCcpO1xuXHRcdH1cblxuXHRcdGZpcnN0LmVkaXQoY29udGVudCwgc3RvcmVOYW1lLCBjb250ZW50T25seSk7XG5cblx0XHRpZiAoZmlyc3QgIT09IGxhc3QpIHtcblx0XHRcdHZhciBjaHVuayA9IGZpcnN0Lm5leHQ7XG5cdFx0XHR3aGlsZSAoY2h1bmsgIT09IGxhc3QpIHtcblx0XHRcdFx0Y2h1bmsuZWRpdCgnJywgZmFsc2UpO1xuXHRcdFx0XHRjaHVuayA9IGNodW5rLm5leHQ7XG5cdFx0XHR9XG5cblx0XHRcdGNodW5rLmVkaXQoJycsIGZhbHNlKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gbXVzdCBiZSBpbnNlcnRpbmcgYXQgdGhlIGVuZFxuXHRcdHZhciBuZXdDaHVuayA9IG5ldyBDaHVuayhzdGFydCwgZW5kLCAnJykuZWRpdChjb250ZW50LCBzdG9yZU5hbWUpO1xuXG5cdFx0Ly8gVE9ETyBsYXN0IGNodW5rIGluIHRoZSBhcnJheSBtYXkgbm90IGJlIHRoZSBsYXN0IGNodW5rLCBpZiBpdCdzIG1vdmVkLi4uXG5cdFx0bGFzdC5uZXh0ID0gbmV3Q2h1bms7XG5cdFx0bmV3Q2h1bmsucHJldmlvdXMgPSBsYXN0O1xuXHR9XG5cdHJldHVybiB0aGlzO1xufTtcblxuTWFnaWNTdHJpbmcucHJvdG90eXBlLnByZXBlbmQgPSBmdW5jdGlvbiBwcmVwZW5kIChjb250ZW50KSB7XG5cdGlmICh0eXBlb2YgY29udGVudCAhPT0gJ3N0cmluZycpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignb3V0cm8gY29udGVudCBtdXN0IGJlIGEgc3RyaW5nJyk7IH1cblxuXHR0aGlzLmludHJvID0gY29udGVudCArIHRoaXMuaW50cm87XG5cdHJldHVybiB0aGlzO1xufTtcblxuTWFnaWNTdHJpbmcucHJvdG90eXBlLnByZXBlbmRMZWZ0ID0gZnVuY3Rpb24gcHJlcGVuZExlZnQgKGluZGV4LCBjb250ZW50KSB7XG5cdGlmICh0eXBlb2YgY29udGVudCAhPT0gJ3N0cmluZycpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignaW5zZXJ0ZWQgY29udGVudCBtdXN0IGJlIGEgc3RyaW5nJyk7IH1cblxuXHR0aGlzLl9zcGxpdChpbmRleCk7XG5cblx0dmFyIGNodW5rID0gdGhpcy5ieUVuZFtpbmRleF07XG5cblx0aWYgKGNodW5rKSB7XG5cdFx0Y2h1bmsucHJlcGVuZExlZnQoY29udGVudCk7XG5cdH0gZWxzZSB7XG5cdFx0dGhpcy5pbnRybyA9IGNvbnRlbnQgKyB0aGlzLmludHJvO1xuXHR9XG5cdHJldHVybiB0aGlzO1xufTtcblxuTWFnaWNTdHJpbmcucHJvdG90eXBlLnByZXBlbmRSaWdodCA9IGZ1bmN0aW9uIHByZXBlbmRSaWdodCAoaW5kZXgsIGNvbnRlbnQpIHtcblx0aWYgKHR5cGVvZiBjb250ZW50ICE9PSAnc3RyaW5nJykgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnNlcnRlZCBjb250ZW50IG11c3QgYmUgYSBzdHJpbmcnKTsgfVxuXG5cdHRoaXMuX3NwbGl0KGluZGV4KTtcblxuXHR2YXIgY2h1bmsgPSB0aGlzLmJ5U3RhcnRbaW5kZXhdO1xuXG5cdGlmIChjaHVuaykge1xuXHRcdGNodW5rLnByZXBlbmRSaWdodChjb250ZW50KTtcblx0fSBlbHNlIHtcblx0XHR0aGlzLm91dHJvID0gY29udGVudCArIHRoaXMub3V0cm87XG5cdH1cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5NYWdpY1N0cmluZy5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlIChzdGFydCwgZW5kKSB7XG5cdHdoaWxlIChzdGFydCA8IDApIHsgc3RhcnQgKz0gdGhpcy5vcmlnaW5hbC5sZW5ndGg7IH1cblx0d2hpbGUgKGVuZCA8IDApIHsgZW5kICs9IHRoaXMub3JpZ2luYWwubGVuZ3RoOyB9XG5cblx0aWYgKHN0YXJ0ID09PSBlbmQpIHsgcmV0dXJuIHRoaXM7IH1cblxuXHRpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRoaXMub3JpZ2luYWwubGVuZ3RoKSB7IHRocm93IG5ldyBFcnJvcignQ2hhcmFjdGVyIGlzIG91dCBvZiBib3VuZHMnKTsgfVxuXHRpZiAoc3RhcnQgPiBlbmQpIHsgdGhyb3cgbmV3IEVycm9yKCdlbmQgbXVzdCBiZSBncmVhdGVyIHRoYW4gc3RhcnQnKTsgfVxuXG5cdHRoaXMuX3NwbGl0KHN0YXJ0KTtcblx0dGhpcy5fc3BsaXQoZW5kKTtcblxuXHR2YXIgY2h1bmsgPSB0aGlzLmJ5U3RhcnRbc3RhcnRdO1xuXG5cdHdoaWxlIChjaHVuaykge1xuXHRcdGNodW5rLmludHJvID0gJyc7XG5cdFx0Y2h1bmsub3V0cm8gPSAnJztcblx0XHRjaHVuay5lZGl0KCcnKTtcblxuXHRcdGNodW5rID0gZW5kID4gY2h1bmsuZW5kID8gdGhpcy5ieVN0YXJ0W2NodW5rLmVuZF0gOiBudWxsO1xuXHR9XG5cdHJldHVybiB0aGlzO1xufTtcblxuTWFnaWNTdHJpbmcucHJvdG90eXBlLmxhc3RDaGFyID0gZnVuY3Rpb24gbGFzdENoYXIgKCkge1xuXHRpZiAodGhpcy5vdXRyby5sZW5ndGgpXG5cdFx0eyByZXR1cm4gdGhpcy5vdXRyb1t0aGlzLm91dHJvLmxlbmd0aCAtIDFdOyB9XG5cdHZhciBjaHVuayA9IHRoaXMubGFzdENodW5rO1xuXHRkbyB7XG5cdFx0aWYgKGNodW5rLm91dHJvLmxlbmd0aClcblx0XHRcdHsgcmV0dXJuIGNodW5rLm91dHJvW2NodW5rLm91dHJvLmxlbmd0aCAtIDFdOyB9XG5cdFx0aWYgKGNodW5rLmNvbnRlbnQubGVuZ3RoKVxuXHRcdFx0eyByZXR1cm4gY2h1bmsuY29udGVudFtjaHVuay5jb250ZW50Lmxlbmd0aCAtIDFdOyB9XG5cdFx0aWYgKGNodW5rLmludHJvLmxlbmd0aClcblx0XHRcdHsgcmV0dXJuIGNodW5rLmludHJvW2NodW5rLmludHJvLmxlbmd0aCAtIDFdOyB9XG5cdH0gd2hpbGUgKGNodW5rID0gY2h1bmsucHJldmlvdXMpO1xuXHRpZiAodGhpcy5pbnRyby5sZW5ndGgpXG5cdFx0eyByZXR1cm4gdGhpcy5pbnRyb1t0aGlzLmludHJvLmxlbmd0aCAtIDFdOyB9XG5cdHJldHVybiAnJztcbn07XG5cbk1hZ2ljU3RyaW5nLnByb3RvdHlwZS5sYXN0TGluZSA9IGZ1bmN0aW9uIGxhc3RMaW5lICgpIHtcblx0dmFyIGxpbmVJbmRleCA9IHRoaXMub3V0cm8ubGFzdEluZGV4T2Yobik7XG5cdGlmIChsaW5lSW5kZXggIT09IC0xKVxuXHRcdHsgcmV0dXJuIHRoaXMub3V0cm8uc3Vic3RyKGxpbmVJbmRleCArIDEpOyB9XG5cdHZhciBsaW5lU3RyID0gdGhpcy5vdXRybztcblx0dmFyIGNodW5rID0gdGhpcy5sYXN0Q2h1bms7XG5cdGRvIHtcblx0XHRpZiAoY2h1bmsub3V0cm8ubGVuZ3RoID4gMCkge1xuXHRcdFx0bGluZUluZGV4ID0gY2h1bmsub3V0cm8ubGFzdEluZGV4T2Yobik7XG5cdFx0XHRpZiAobGluZUluZGV4ICE9PSAtMSlcblx0XHRcdFx0eyByZXR1cm4gY2h1bmsub3V0cm8uc3Vic3RyKGxpbmVJbmRleCArIDEpICsgbGluZVN0cjsgfVxuXHRcdFx0bGluZVN0ciA9IGNodW5rLm91dHJvICsgbGluZVN0cjtcblx0XHR9XG5cblx0XHRpZiAoY2h1bmsuY29udGVudC5sZW5ndGggPiAwKSB7XG5cdFx0XHRsaW5lSW5kZXggPSBjaHVuay5jb250ZW50Lmxhc3RJbmRleE9mKG4pO1xuXHRcdFx0aWYgKGxpbmVJbmRleCAhPT0gLTEpXG5cdFx0XHRcdHsgcmV0dXJuIGNodW5rLmNvbnRlbnQuc3Vic3RyKGxpbmVJbmRleCArIDEpICsgbGluZVN0cjsgfVxuXHRcdFx0bGluZVN0ciA9IGNodW5rLmNvbnRlbnQgKyBsaW5lU3RyO1xuXHRcdH1cblxuXHRcdGlmIChjaHVuay5pbnRyby5sZW5ndGggPiAwKSB7XG5cdFx0XHRsaW5lSW5kZXggPSBjaHVuay5pbnRyby5sYXN0SW5kZXhPZihuKTtcblx0XHRcdGlmIChsaW5lSW5kZXggIT09IC0xKVxuXHRcdFx0XHR7IHJldHVybiBjaHVuay5pbnRyby5zdWJzdHIobGluZUluZGV4ICsgMSkgKyBsaW5lU3RyOyB9XG5cdFx0XHRsaW5lU3RyID0gY2h1bmsuaW50cm8gKyBsaW5lU3RyO1xuXHRcdH1cblx0fSB3aGlsZSAoY2h1bmsgPSBjaHVuay5wcmV2aW91cyk7XG5cdGxpbmVJbmRleCA9IHRoaXMuaW50cm8ubGFzdEluZGV4T2Yobik7XG5cdGlmIChsaW5lSW5kZXggIT09IC0xKVxuXHRcdHsgcmV0dXJuIHRoaXMuaW50cm8uc3Vic3RyKGxpbmVJbmRleCArIDEpICsgbGluZVN0cjsgfVxuXHRyZXR1cm4gdGhpcy5pbnRybyArIGxpbmVTdHI7XG59O1xuXG5NYWdpY1N0cmluZy5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuXHRcdGlmICggc3RhcnQgPT09IHZvaWQgMCApIHN0YXJ0ID0gMDtcblx0XHRpZiAoIGVuZCA9PT0gdm9pZCAwICkgZW5kID0gdGhpcy5vcmlnaW5hbC5sZW5ndGg7XG5cblx0d2hpbGUgKHN0YXJ0IDwgMCkgeyBzdGFydCArPSB0aGlzLm9yaWdpbmFsLmxlbmd0aDsgfVxuXHR3aGlsZSAoZW5kIDwgMCkgeyBlbmQgKz0gdGhpcy5vcmlnaW5hbC5sZW5ndGg7IH1cblxuXHR2YXIgcmVzdWx0ID0gJyc7XG5cblx0Ly8gZmluZCBzdGFydCBjaHVua1xuXHR2YXIgY2h1bmsgPSB0aGlzLmZpcnN0Q2h1bms7XG5cdHdoaWxlIChjaHVuayAmJiAoY2h1bmsuc3RhcnQgPiBzdGFydCB8fCBjaHVuay5lbmQgPD0gc3RhcnQpKSB7XG5cdFx0Ly8gZm91bmQgZW5kIGNodW5rIGJlZm9yZSBzdGFydFxuXHRcdGlmIChjaHVuay5zdGFydCA8IGVuZCAmJiBjaHVuay5lbmQgPj0gZW5kKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdGNodW5rID0gY2h1bmsubmV4dDtcblx0fVxuXG5cdGlmIChjaHVuayAmJiBjaHVuay5lZGl0ZWQgJiYgY2h1bmsuc3RhcnQgIT09IHN0YXJ0KVxuXHRcdHsgdGhyb3cgbmV3IEVycm9yKChcIkNhbm5vdCB1c2UgcmVwbGFjZWQgY2hhcmFjdGVyIFwiICsgc3RhcnQgKyBcIiBhcyBzbGljZSBzdGFydCBhbmNob3IuXCIpKTsgfVxuXG5cdHZhciBzdGFydENodW5rID0gY2h1bms7XG5cdHdoaWxlIChjaHVuaykge1xuXHRcdGlmIChjaHVuay5pbnRybyAmJiAoc3RhcnRDaHVuayAhPT0gY2h1bmsgfHwgY2h1bmsuc3RhcnQgPT09IHN0YXJ0KSkge1xuXHRcdFx0cmVzdWx0ICs9IGNodW5rLmludHJvO1xuXHRcdH1cblxuXHRcdHZhciBjb250YWluc0VuZCA9IGNodW5rLnN0YXJ0IDwgZW5kICYmIGNodW5rLmVuZCA+PSBlbmQ7XG5cdFx0aWYgKGNvbnRhaW5zRW5kICYmIGNodW5rLmVkaXRlZCAmJiBjaHVuay5lbmQgIT09IGVuZClcblx0XHRcdHsgdGhyb3cgbmV3IEVycm9yKChcIkNhbm5vdCB1c2UgcmVwbGFjZWQgY2hhcmFjdGVyIFwiICsgZW5kICsgXCIgYXMgc2xpY2UgZW5kIGFuY2hvci5cIikpOyB9XG5cblx0XHR2YXIgc2xpY2VTdGFydCA9IHN0YXJ0Q2h1bmsgPT09IGNodW5rID8gc3RhcnQgLSBjaHVuay5zdGFydCA6IDA7XG5cdFx0dmFyIHNsaWNlRW5kID0gY29udGFpbnNFbmQgPyBjaHVuay5jb250ZW50Lmxlbmd0aCArIGVuZCAtIGNodW5rLmVuZCA6IGNodW5rLmNvbnRlbnQubGVuZ3RoO1xuXG5cdFx0cmVzdWx0ICs9IGNodW5rLmNvbnRlbnQuc2xpY2Uoc2xpY2VTdGFydCwgc2xpY2VFbmQpO1xuXG5cdFx0aWYgKGNodW5rLm91dHJvICYmICghY29udGFpbnNFbmQgfHwgY2h1bmsuZW5kID09PSBlbmQpKSB7XG5cdFx0XHRyZXN1bHQgKz0gY2h1bmsub3V0cm87XG5cdFx0fVxuXG5cdFx0aWYgKGNvbnRhaW5zRW5kKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRjaHVuayA9IGNodW5rLm5leHQ7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gVE9ETyBkZXByZWNhdGUgdGhpcz8gbm90IHJlYWxseSB2ZXJ5IHVzZWZ1bFxuTWFnaWNTdHJpbmcucHJvdG90eXBlLnNuaXAgPSBmdW5jdGlvbiBzbmlwIChzdGFydCwgZW5kKSB7XG5cdHZhciBjbG9uZSA9IHRoaXMuY2xvbmUoKTtcblx0Y2xvbmUucmVtb3ZlKDAsIHN0YXJ0KTtcblx0Y2xvbmUucmVtb3ZlKGVuZCwgY2xvbmUub3JpZ2luYWwubGVuZ3RoKTtcblxuXHRyZXR1cm4gY2xvbmU7XG59O1xuXG5NYWdpY1N0cmluZy5wcm90b3R5cGUuX3NwbGl0ID0gZnVuY3Rpb24gX3NwbGl0IChpbmRleCkge1xuXHRpZiAodGhpcy5ieVN0YXJ0W2luZGV4XSB8fCB0aGlzLmJ5RW5kW2luZGV4XSkgeyByZXR1cm47IH1cblxuXHR2YXIgY2h1bmsgPSB0aGlzLmxhc3RTZWFyY2hlZENodW5rO1xuXHR2YXIgc2VhcmNoRm9yd2FyZCA9IGluZGV4ID4gY2h1bmsuZW5kO1xuXG5cdHdoaWxlIChjaHVuaykge1xuXHRcdGlmIChjaHVuay5jb250YWlucyhpbmRleCkpIHsgcmV0dXJuIHRoaXMuX3NwbGl0Q2h1bmsoY2h1bmssIGluZGV4KTsgfVxuXG5cdFx0Y2h1bmsgPSBzZWFyY2hGb3J3YXJkID8gdGhpcy5ieVN0YXJ0W2NodW5rLmVuZF0gOiB0aGlzLmJ5RW5kW2NodW5rLnN0YXJ0XTtcblx0fVxufTtcblxuTWFnaWNTdHJpbmcucHJvdG90eXBlLl9zcGxpdENodW5rID0gZnVuY3Rpb24gX3NwbGl0Q2h1bmsgKGNodW5rLCBpbmRleCkge1xuXHRpZiAoY2h1bmsuZWRpdGVkICYmIGNodW5rLmNvbnRlbnQubGVuZ3RoKSB7XG5cdFx0Ly8gemVyby1sZW5ndGggZWRpdGVkIGNodW5rcyBhcmUgYSBzcGVjaWFsIGNhc2UgKG92ZXJsYXBwaW5nIHJlcGxhY2VtZW50cylcblx0XHR2YXIgbG9jID0gZ2V0TG9jYXRvcih0aGlzLm9yaWdpbmFsKShpbmRleCk7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0KFwiQ2Fubm90IHNwbGl0IGEgY2h1bmsgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGVkaXRlZCAoXCIgKyAobG9jLmxpbmUpICsgXCI6XCIgKyAobG9jLmNvbHVtbikgKyBcIiDigJMgXFxcIlwiICsgKGNodW5rLm9yaWdpbmFsKSArIFwiXFxcIilcIilcblx0XHQpO1xuXHR9XG5cblx0dmFyIG5ld0NodW5rID0gY2h1bmsuc3BsaXQoaW5kZXgpO1xuXG5cdHRoaXMuYnlFbmRbaW5kZXhdID0gY2h1bms7XG5cdHRoaXMuYnlTdGFydFtpbmRleF0gPSBuZXdDaHVuaztcblx0dGhpcy5ieUVuZFtuZXdDaHVuay5lbmRdID0gbmV3Q2h1bms7XG5cblx0aWYgKGNodW5rID09PSB0aGlzLmxhc3RDaHVuaykgeyB0aGlzLmxhc3RDaHVuayA9IG5ld0NodW5rOyB9XG5cblx0dGhpcy5sYXN0U2VhcmNoZWRDaHVuayA9IGNodW5rO1xuXHRyZXR1cm4gdHJ1ZTtcbn07XG5cbk1hZ2ljU3RyaW5nLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcblx0dmFyIHN0ciA9IHRoaXMuaW50cm87XG5cblx0dmFyIGNodW5rID0gdGhpcy5maXJzdENodW5rO1xuXHR3aGlsZSAoY2h1bmspIHtcblx0XHRzdHIgKz0gY2h1bmsudG9TdHJpbmcoKTtcblx0XHRjaHVuayA9IGNodW5rLm5leHQ7XG5cdH1cblxuXHRyZXR1cm4gc3RyICsgdGhpcy5vdXRybztcbn07XG5cbk1hZ2ljU3RyaW5nLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gaXNFbXB0eSAoKSB7XG5cdHZhciBjaHVuayA9IHRoaXMuZmlyc3RDaHVuaztcblx0ZG8ge1xuXHRcdGlmIChjaHVuay5pbnRyby5sZW5ndGggJiYgY2h1bmsuaW50cm8udHJpbSgpIHx8XG5cdFx0XHRcdGNodW5rLmNvbnRlbnQubGVuZ3RoICYmIGNodW5rLmNvbnRlbnQudHJpbSgpIHx8XG5cdFx0XHRcdGNodW5rLm91dHJvLmxlbmd0aCAmJiBjaHVuay5vdXRyby50cmltKCkpXG5cdFx0XHR7IHJldHVybiBmYWxzZTsgfVxuXHR9IHdoaWxlIChjaHVuayA9IGNodW5rLm5leHQpO1xuXHRyZXR1cm4gdHJ1ZTtcbn07XG5cbk1hZ2ljU3RyaW5nLnByb3RvdHlwZS5sZW5ndGggPSBmdW5jdGlvbiBsZW5ndGggKCkge1xuXHR2YXIgY2h1bmsgPSB0aGlzLmZpcnN0Q2h1bms7XG5cdHZhciBsZW5ndGggPSAwO1xuXHRkbyB7XG5cdFx0bGVuZ3RoICs9IGNodW5rLmludHJvLmxlbmd0aCArIGNodW5rLmNvbnRlbnQubGVuZ3RoICsgY2h1bmsub3V0cm8ubGVuZ3RoO1xuXHR9IHdoaWxlIChjaHVuayA9IGNodW5rLm5leHQpO1xuXHRyZXR1cm4gbGVuZ3RoO1xufTtcblxuTWFnaWNTdHJpbmcucHJvdG90eXBlLnRyaW1MaW5lcyA9IGZ1bmN0aW9uIHRyaW1MaW5lcyAoKSB7XG5cdHJldHVybiB0aGlzLnRyaW0oJ1tcXFxcclxcXFxuXScpO1xufTtcblxuTWFnaWNTdHJpbmcucHJvdG90eXBlLnRyaW0gPSBmdW5jdGlvbiB0cmltIChjaGFyVHlwZSkge1xuXHRyZXR1cm4gdGhpcy50cmltU3RhcnQoY2hhclR5cGUpLnRyaW1FbmQoY2hhclR5cGUpO1xufTtcblxuTWFnaWNTdHJpbmcucHJvdG90eXBlLnRyaW1FbmRBYm9ydGVkID0gZnVuY3Rpb24gdHJpbUVuZEFib3J0ZWQgKGNoYXJUeXBlKSB7XG5cdHZhciByeCA9IG5ldyBSZWdFeHAoKGNoYXJUeXBlIHx8ICdcXFxccycpICsgJyskJyk7XG5cblx0dGhpcy5vdXRybyA9IHRoaXMub3V0cm8ucmVwbGFjZShyeCwgJycpO1xuXHRpZiAodGhpcy5vdXRyby5sZW5ndGgpIHsgcmV0dXJuIHRydWU7IH1cblxuXHR2YXIgY2h1bmsgPSB0aGlzLmxhc3RDaHVuaztcblxuXHRkbyB7XG5cdFx0dmFyIGVuZCA9IGNodW5rLmVuZDtcblx0XHR2YXIgYWJvcnRlZCA9IGNodW5rLnRyaW1FbmQocngpO1xuXG5cdFx0Ly8gaWYgY2h1bmsgd2FzIHRyaW1tZWQsIHdlIGhhdmUgYSBuZXcgbGFzdENodW5rXG5cdFx0aWYgKGNodW5rLmVuZCAhPT0gZW5kKSB7XG5cdFx0XHRpZiAodGhpcy5sYXN0Q2h1bmsgPT09IGNodW5rKSB7XG5cdFx0XHRcdHRoaXMubGFzdENodW5rID0gY2h1bmsubmV4dDtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5ieUVuZFtjaHVuay5lbmRdID0gY2h1bms7XG5cdFx0XHR0aGlzLmJ5U3RhcnRbY2h1bmsubmV4dC5zdGFydF0gPSBjaHVuay5uZXh0O1xuXHRcdFx0dGhpcy5ieUVuZFtjaHVuay5uZXh0LmVuZF0gPSBjaHVuay5uZXh0O1xuXHRcdH1cblxuXHRcdGlmIChhYm9ydGVkKSB7IHJldHVybiB0cnVlOyB9XG5cdFx0Y2h1bmsgPSBjaHVuay5wcmV2aW91cztcblx0fSB3aGlsZSAoY2h1bmspO1xuXG5cdHJldHVybiBmYWxzZTtcbn07XG5cbk1hZ2ljU3RyaW5nLnByb3RvdHlwZS50cmltRW5kID0gZnVuY3Rpb24gdHJpbUVuZCAoY2hhclR5cGUpIHtcblx0dGhpcy50cmltRW5kQWJvcnRlZChjaGFyVHlwZSk7XG5cdHJldHVybiB0aGlzO1xufTtcbk1hZ2ljU3RyaW5nLnByb3RvdHlwZS50cmltU3RhcnRBYm9ydGVkID0gZnVuY3Rpb24gdHJpbVN0YXJ0QWJvcnRlZCAoY2hhclR5cGUpIHtcblx0dmFyIHJ4ID0gbmV3IFJlZ0V4cCgnXicgKyAoY2hhclR5cGUgfHwgJ1xcXFxzJykgKyAnKycpO1xuXG5cdHRoaXMuaW50cm8gPSB0aGlzLmludHJvLnJlcGxhY2UocngsICcnKTtcblx0aWYgKHRoaXMuaW50cm8ubGVuZ3RoKSB7IHJldHVybiB0cnVlOyB9XG5cblx0dmFyIGNodW5rID0gdGhpcy5maXJzdENodW5rO1xuXG5cdGRvIHtcblx0XHR2YXIgZW5kID0gY2h1bmsuZW5kO1xuXHRcdHZhciBhYm9ydGVkID0gY2h1bmsudHJpbVN0YXJ0KHJ4KTtcblxuXHRcdGlmIChjaHVuay5lbmQgIT09IGVuZCkge1xuXHRcdFx0Ly8gc3BlY2lhbCBjYXNlLi4uXG5cdFx0XHRpZiAoY2h1bmsgPT09IHRoaXMubGFzdENodW5rKSB7IHRoaXMubGFzdENodW5rID0gY2h1bmsubmV4dDsgfVxuXG5cdFx0XHR0aGlzLmJ5RW5kW2NodW5rLmVuZF0gPSBjaHVuaztcblx0XHRcdHRoaXMuYnlTdGFydFtjaHVuay5uZXh0LnN0YXJ0XSA9IGNodW5rLm5leHQ7XG5cdFx0XHR0aGlzLmJ5RW5kW2NodW5rLm5leHQuZW5kXSA9IGNodW5rLm5leHQ7XG5cdFx0fVxuXG5cdFx0aWYgKGFib3J0ZWQpIHsgcmV0dXJuIHRydWU7IH1cblx0XHRjaHVuayA9IGNodW5rLm5leHQ7XG5cdH0gd2hpbGUgKGNodW5rKTtcblxuXHRyZXR1cm4gZmFsc2U7XG59O1xuXG5NYWdpY1N0cmluZy5wcm90b3R5cGUudHJpbVN0YXJ0ID0gZnVuY3Rpb24gdHJpbVN0YXJ0IChjaGFyVHlwZSkge1xuXHR0aGlzLnRyaW1TdGFydEFib3J0ZWQoY2hhclR5cGUpO1xuXHRyZXR1cm4gdGhpcztcbn07XG5cbnZhciBoYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIEJ1bmRsZSA9IGZ1bmN0aW9uIEJ1bmRsZShvcHRpb25zKSB7XG5cdGlmICggb3B0aW9ucyA9PT0gdm9pZCAwICkgb3B0aW9ucyA9IHt9O1xuXG5cdHRoaXMuaW50cm8gPSBvcHRpb25zLmludHJvIHx8ICcnO1xuXHR0aGlzLnNlcGFyYXRvciA9IG9wdGlvbnMuc2VwYXJhdG9yICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnNlcGFyYXRvciA6ICdcXG4nO1xuXHR0aGlzLnNvdXJjZXMgPSBbXTtcblx0dGhpcy51bmlxdWVTb3VyY2VzID0gW107XG5cdHRoaXMudW5pcXVlU291cmNlSW5kZXhCeUZpbGVuYW1lID0ge307XG59O1xuXG5CdW5kbGUucHJvdG90eXBlLmFkZFNvdXJjZSA9IGZ1bmN0aW9uIGFkZFNvdXJjZSAoc291cmNlKSB7XG5cdGlmIChzb3VyY2UgaW5zdGFuY2VvZiBNYWdpY1N0cmluZykge1xuXHRcdHJldHVybiB0aGlzLmFkZFNvdXJjZSh7XG5cdFx0XHRjb250ZW50OiBzb3VyY2UsXG5cdFx0XHRmaWxlbmFtZTogc291cmNlLmZpbGVuYW1lLFxuXHRcdFx0c2VwYXJhdG9yOiB0aGlzLnNlcGFyYXRvclxuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCFpc09iamVjdChzb3VyY2UpIHx8ICFzb3VyY2UuY29udGVudCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignYnVuZGxlLmFkZFNvdXJjZSgpIHRha2VzIGFuIG9iamVjdCB3aXRoIGEgYGNvbnRlbnRgIHByb3BlcnR5LCB3aGljaCBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgTWFnaWNTdHJpbmcsIGFuZCBhbiBvcHRpb25hbCBgZmlsZW5hbWVgJyk7XG5cdH1cblxuXHRbJ2ZpbGVuYW1lJywgJ2luZGVudEV4Y2x1c2lvblJhbmdlcycsICdzZXBhcmF0b3InXS5mb3JFYWNoKGZ1bmN0aW9uIChvcHRpb24pIHtcblx0XHRpZiAoIWhhc093blByb3AuY2FsbChzb3VyY2UsIG9wdGlvbikpIHsgc291cmNlW29wdGlvbl0gPSBzb3VyY2UuY29udGVudFtvcHRpb25dOyB9XG5cdH0pO1xuXG5cdGlmIChzb3VyY2Uuc2VwYXJhdG9yID09PSB1bmRlZmluZWQpIHtcblx0XHQvLyBUT0RPIHRoZXJlJ3MgYSBidW5jaCBvZiB0aGlzIHNvcnQgb2YgdGhpbmcsIG5lZWRzIGNsZWFuaW5nIHVwXG5cdFx0c291cmNlLnNlcGFyYXRvciA9IHRoaXMuc2VwYXJhdG9yO1xuXHR9XG5cblx0aWYgKHNvdXJjZS5maWxlbmFtZSkge1xuXHRcdGlmICghaGFzT3duUHJvcC5jYWxsKHRoaXMudW5pcXVlU291cmNlSW5kZXhCeUZpbGVuYW1lLCBzb3VyY2UuZmlsZW5hbWUpKSB7XG5cdFx0XHR0aGlzLnVuaXF1ZVNvdXJjZUluZGV4QnlGaWxlbmFtZVtzb3VyY2UuZmlsZW5hbWVdID0gdGhpcy51bmlxdWVTb3VyY2VzLmxlbmd0aDtcblx0XHRcdHRoaXMudW5pcXVlU291cmNlcy5wdXNoKHsgZmlsZW5hbWU6IHNvdXJjZS5maWxlbmFtZSwgY29udGVudDogc291cmNlLmNvbnRlbnQub3JpZ2luYWwgfSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciB1bmlxdWVTb3VyY2UgPSB0aGlzLnVuaXF1ZVNvdXJjZXNbdGhpcy51bmlxdWVTb3VyY2VJbmRleEJ5RmlsZW5hbWVbc291cmNlLmZpbGVuYW1lXV07XG5cdFx0XHRpZiAoc291cmNlLmNvbnRlbnQub3JpZ2luYWwgIT09IHVuaXF1ZVNvdXJjZS5jb250ZW50KSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcigoXCJJbGxlZ2FsIHNvdXJjZTogc2FtZSBmaWxlbmFtZSAoXCIgKyAoc291cmNlLmZpbGVuYW1lKSArIFwiKSwgZGlmZmVyZW50IGNvbnRlbnRzXCIpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHR0aGlzLnNvdXJjZXMucHVzaChzb3VyY2UpO1xuXHRyZXR1cm4gdGhpcztcbn07XG5cbkJ1bmRsZS5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gYXBwZW5kIChzdHIsIG9wdGlvbnMpIHtcblx0dGhpcy5hZGRTb3VyY2Uoe1xuXHRcdGNvbnRlbnQ6IG5ldyBNYWdpY1N0cmluZyhzdHIpLFxuXHRcdHNlcGFyYXRvcjogKG9wdGlvbnMgJiYgb3B0aW9ucy5zZXBhcmF0b3IpIHx8ICcnXG5cdH0pO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxuQnVuZGxlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIGNsb25lICgpIHtcblx0dmFyIGJ1bmRsZSA9IG5ldyBCdW5kbGUoe1xuXHRcdGludHJvOiB0aGlzLmludHJvLFxuXHRcdHNlcGFyYXRvcjogdGhpcy5zZXBhcmF0b3Jcblx0fSk7XG5cblx0dGhpcy5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZSkge1xuXHRcdGJ1bmRsZS5hZGRTb3VyY2Uoe1xuXHRcdFx0ZmlsZW5hbWU6IHNvdXJjZS5maWxlbmFtZSxcblx0XHRcdGNvbnRlbnQ6IHNvdXJjZS5jb250ZW50LmNsb25lKCksXG5cdFx0XHRzZXBhcmF0b3I6IHNvdXJjZS5zZXBhcmF0b3Jcblx0XHR9KTtcblx0fSk7XG5cblx0cmV0dXJuIGJ1bmRsZTtcbn07XG5cbkJ1bmRsZS5wcm90b3R5cGUuZ2VuZXJhdGVEZWNvZGVkTWFwID0gZnVuY3Rpb24gZ2VuZXJhdGVEZWNvZGVkTWFwIChvcHRpb25zKSB7XG5cdFx0dmFyIHRoaXMkMSA9IHRoaXM7XG5cdFx0aWYgKCBvcHRpb25zID09PSB2b2lkIDAgKSBvcHRpb25zID0ge307XG5cblx0dmFyIG5hbWVzID0gW107XG5cdHRoaXMuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2UpIHtcblx0XHRPYmplY3Qua2V5cyhzb3VyY2UuY29udGVudC5zdG9yZWROYW1lcykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuXHRcdFx0aWYgKCF+bmFtZXMuaW5kZXhPZihuYW1lKSkgeyBuYW1lcy5wdXNoKG5hbWUpOyB9XG5cdFx0fSk7XG5cdH0pO1xuXG5cdHZhciBtYXBwaW5ncyA9IG5ldyBNYXBwaW5ncyhvcHRpb25zLmhpcmVzKTtcblxuXHRpZiAodGhpcy5pbnRybykge1xuXHRcdG1hcHBpbmdzLmFkdmFuY2UodGhpcy5pbnRybyk7XG5cdH1cblxuXHR0aGlzLnNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlLCBpKSB7XG5cdFx0aWYgKGkgPiAwKSB7XG5cdFx0XHRtYXBwaW5ncy5hZHZhbmNlKHRoaXMkMS5zZXBhcmF0b3IpO1xuXHRcdH1cblxuXHRcdHZhciBzb3VyY2VJbmRleCA9IHNvdXJjZS5maWxlbmFtZSA/IHRoaXMkMS51bmlxdWVTb3VyY2VJbmRleEJ5RmlsZW5hbWVbc291cmNlLmZpbGVuYW1lXSA6IC0xO1xuXHRcdHZhciBtYWdpY1N0cmluZyA9IHNvdXJjZS5jb250ZW50O1xuXHRcdHZhciBsb2NhdGUgPSBnZXRMb2NhdG9yKG1hZ2ljU3RyaW5nLm9yaWdpbmFsKTtcblxuXHRcdGlmIChtYWdpY1N0cmluZy5pbnRybykge1xuXHRcdFx0bWFwcGluZ3MuYWR2YW5jZShtYWdpY1N0cmluZy5pbnRybyk7XG5cdFx0fVxuXG5cdFx0bWFnaWNTdHJpbmcuZmlyc3RDaHVuay5lYWNoTmV4dChmdW5jdGlvbiAoY2h1bmspIHtcblx0XHRcdHZhciBsb2MgPSBsb2NhdGUoY2h1bmsuc3RhcnQpO1xuXG5cdFx0XHRpZiAoY2h1bmsuaW50cm8ubGVuZ3RoKSB7IG1hcHBpbmdzLmFkdmFuY2UoY2h1bmsuaW50cm8pOyB9XG5cblx0XHRcdGlmIChzb3VyY2UuZmlsZW5hbWUpIHtcblx0XHRcdFx0aWYgKGNodW5rLmVkaXRlZCkge1xuXHRcdFx0XHRcdG1hcHBpbmdzLmFkZEVkaXQoXG5cdFx0XHRcdFx0XHRzb3VyY2VJbmRleCxcblx0XHRcdFx0XHRcdGNodW5rLmNvbnRlbnQsXG5cdFx0XHRcdFx0XHRsb2MsXG5cdFx0XHRcdFx0XHRjaHVuay5zdG9yZU5hbWUgPyBuYW1lcy5pbmRleE9mKGNodW5rLm9yaWdpbmFsKSA6IC0xXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtYXBwaW5ncy5hZGRVbmVkaXRlZENodW5rKFxuXHRcdFx0XHRcdFx0c291cmNlSW5kZXgsXG5cdFx0XHRcdFx0XHRjaHVuayxcblx0XHRcdFx0XHRcdG1hZ2ljU3RyaW5nLm9yaWdpbmFsLFxuXHRcdFx0XHRcdFx0bG9jLFxuXHRcdFx0XHRcdFx0bWFnaWNTdHJpbmcuc291cmNlbWFwTG9jYXRpb25zXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWFwcGluZ3MuYWR2YW5jZShjaHVuay5jb250ZW50KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNodW5rLm91dHJvLmxlbmd0aCkgeyBtYXBwaW5ncy5hZHZhbmNlKGNodW5rLm91dHJvKTsgfVxuXHRcdH0pO1xuXG5cdFx0aWYgKG1hZ2ljU3RyaW5nLm91dHJvKSB7XG5cdFx0XHRtYXBwaW5ncy5hZHZhbmNlKG1hZ2ljU3RyaW5nLm91dHJvKTtcblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiB7XG5cdFx0ZmlsZTogb3B0aW9ucy5maWxlID8gb3B0aW9ucy5maWxlLnNwbGl0KC9bL1xcXFxdLykucG9wKCkgOiBudWxsLFxuXHRcdHNvdXJjZXM6IHRoaXMudW5pcXVlU291cmNlcy5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMuZmlsZSA/IGdldFJlbGF0aXZlUGF0aChvcHRpb25zLmZpbGUsIHNvdXJjZS5maWxlbmFtZSkgOiBzb3VyY2UuZmlsZW5hbWU7XG5cdFx0fSksXG5cdFx0c291cmNlc0NvbnRlbnQ6IHRoaXMudW5pcXVlU291cmNlcy5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMuaW5jbHVkZUNvbnRlbnQgPyBzb3VyY2UuY29udGVudCA6IG51bGw7XG5cdFx0fSksXG5cdFx0bmFtZXM6IG5hbWVzLFxuXHRcdG1hcHBpbmdzOiBtYXBwaW5ncy5yYXdcblx0fTtcbn07XG5cbkJ1bmRsZS5wcm90b3R5cGUuZ2VuZXJhdGVNYXAgPSBmdW5jdGlvbiBnZW5lcmF0ZU1hcCAob3B0aW9ucykge1xuXHRyZXR1cm4gbmV3IFNvdXJjZU1hcCh0aGlzLmdlbmVyYXRlRGVjb2RlZE1hcChvcHRpb25zKSk7XG59O1xuXG5CdW5kbGUucHJvdG90eXBlLmdldEluZGVudFN0cmluZyA9IGZ1bmN0aW9uIGdldEluZGVudFN0cmluZyAoKSB7XG5cdHZhciBpbmRlbnRTdHJpbmdDb3VudHMgPSB7fTtcblxuXHR0aGlzLnNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlKSB7XG5cdFx0dmFyIGluZGVudFN0ciA9IHNvdXJjZS5jb250ZW50LmluZGVudFN0cjtcblxuXHRcdGlmIChpbmRlbnRTdHIgPT09IG51bGwpIHsgcmV0dXJuOyB9XG5cblx0XHRpZiAoIWluZGVudFN0cmluZ0NvdW50c1tpbmRlbnRTdHJdKSB7IGluZGVudFN0cmluZ0NvdW50c1tpbmRlbnRTdHJdID0gMDsgfVxuXHRcdGluZGVudFN0cmluZ0NvdW50c1tpbmRlbnRTdHJdICs9IDE7XG5cdH0pO1xuXG5cdHJldHVybiAoXG5cdFx0T2JqZWN0LmtleXMoaW5kZW50U3RyaW5nQ291bnRzKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG5cdFx0XHRyZXR1cm4gaW5kZW50U3RyaW5nQ291bnRzW2FdIC0gaW5kZW50U3RyaW5nQ291bnRzW2JdO1xuXHRcdH0pWzBdIHx8ICdcXHQnXG5cdCk7XG59O1xuXG5CdW5kbGUucHJvdG90eXBlLmluZGVudCA9IGZ1bmN0aW9uIGluZGVudCAoaW5kZW50U3RyKSB7XG5cdFx0dmFyIHRoaXMkMSA9IHRoaXM7XG5cblx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0aW5kZW50U3RyID0gdGhpcy5nZXRJbmRlbnRTdHJpbmcoKTtcblx0fVxuXG5cdGlmIChpbmRlbnRTdHIgPT09ICcnKSB7IHJldHVybiB0aGlzOyB9IC8vIG5vb3BcblxuXHR2YXIgdHJhaWxpbmdOZXdsaW5lID0gIXRoaXMuaW50cm8gfHwgdGhpcy5pbnRyby5zbGljZSgtMSkgPT09ICdcXG4nO1xuXG5cdHRoaXMuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2UsIGkpIHtcblx0XHR2YXIgc2VwYXJhdG9yID0gc291cmNlLnNlcGFyYXRvciAhPT0gdW5kZWZpbmVkID8gc291cmNlLnNlcGFyYXRvciA6IHRoaXMkMS5zZXBhcmF0b3I7XG5cdFx0dmFyIGluZGVudFN0YXJ0ID0gdHJhaWxpbmdOZXdsaW5lIHx8IChpID4gMCAmJiAvXFxyP1xcbiQvLnRlc3Qoc2VwYXJhdG9yKSk7XG5cblx0XHRzb3VyY2UuY29udGVudC5pbmRlbnQoaW5kZW50U3RyLCB7XG5cdFx0XHRleGNsdWRlOiBzb3VyY2UuaW5kZW50RXhjbHVzaW9uUmFuZ2VzLFxuXHRcdFx0aW5kZW50U3RhcnQ6IGluZGVudFN0YXJ0IC8vOiB0cmFpbGluZ05ld2xpbmUgfHwgL1xccj9cXG4kLy50ZXN0KCBzZXBhcmF0b3IgKSAgLy90cnVlLy8vXFxyP1xcbi8udGVzdCggc2VwYXJhdG9yIClcblx0XHR9KTtcblxuXHRcdHRyYWlsaW5nTmV3bGluZSA9IHNvdXJjZS5jb250ZW50Lmxhc3RDaGFyKCkgPT09ICdcXG4nO1xuXHR9KTtcblxuXHRpZiAodGhpcy5pbnRybykge1xuXHRcdHRoaXMuaW50cm8gPVxuXHRcdFx0aW5kZW50U3RyICtcblx0XHRcdHRoaXMuaW50cm8ucmVwbGFjZSgvXlteXFxuXS9nbSwgZnVuY3Rpb24gKG1hdGNoLCBpbmRleCkge1xuXHRcdFx0XHRyZXR1cm4gaW5kZXggPiAwID8gaW5kZW50U3RyICsgbWF0Y2ggOiBtYXRjaDtcblx0XHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5CdW5kbGUucHJvdG90eXBlLnByZXBlbmQgPSBmdW5jdGlvbiBwcmVwZW5kIChzdHIpIHtcblx0dGhpcy5pbnRybyA9IHN0ciArIHRoaXMuaW50cm87XG5cdHJldHVybiB0aGlzO1xufTtcblxuQnVuZGxlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcblx0XHR2YXIgdGhpcyQxID0gdGhpcztcblxuXHR2YXIgYm9keSA9IHRoaXMuc291cmNlc1xuXHRcdC5tYXAoZnVuY3Rpb24gKHNvdXJjZSwgaSkge1xuXHRcdFx0dmFyIHNlcGFyYXRvciA9IHNvdXJjZS5zZXBhcmF0b3IgIT09IHVuZGVmaW5lZCA/IHNvdXJjZS5zZXBhcmF0b3IgOiB0aGlzJDEuc2VwYXJhdG9yO1xuXHRcdFx0dmFyIHN0ciA9IChpID4gMCA/IHNlcGFyYXRvciA6ICcnKSArIHNvdXJjZS5jb250ZW50LnRvU3RyaW5nKCk7XG5cblx0XHRcdHJldHVybiBzdHI7XG5cdFx0fSlcblx0XHQuam9pbignJyk7XG5cblx0cmV0dXJuIHRoaXMuaW50cm8gKyBib2R5O1xufTtcblxuQnVuZGxlLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gaXNFbXB0eSAoKSB7XG5cdGlmICh0aGlzLmludHJvLmxlbmd0aCAmJiB0aGlzLmludHJvLnRyaW0oKSlcblx0XHR7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodGhpcy5zb3VyY2VzLnNvbWUoZnVuY3Rpb24gKHNvdXJjZSkgeyByZXR1cm4gIXNvdXJjZS5jb250ZW50LmlzRW1wdHkoKTsgfSkpXG5cdFx0eyByZXR1cm4gZmFsc2U7IH1cblx0cmV0dXJuIHRydWU7XG59O1xuXG5CdW5kbGUucHJvdG90eXBlLmxlbmd0aCA9IGZ1bmN0aW9uIGxlbmd0aCAoKSB7XG5cdHJldHVybiB0aGlzLnNvdXJjZXMucmVkdWNlKGZ1bmN0aW9uIChsZW5ndGgsIHNvdXJjZSkgeyByZXR1cm4gbGVuZ3RoICsgc291cmNlLmNvbnRlbnQubGVuZ3RoKCk7IH0sIHRoaXMuaW50cm8ubGVuZ3RoKTtcbn07XG5cbkJ1bmRsZS5wcm90b3R5cGUudHJpbUxpbmVzID0gZnVuY3Rpb24gdHJpbUxpbmVzICgpIHtcblx0cmV0dXJuIHRoaXMudHJpbSgnW1xcXFxyXFxcXG5dJyk7XG59O1xuXG5CdW5kbGUucHJvdG90eXBlLnRyaW0gPSBmdW5jdGlvbiB0cmltIChjaGFyVHlwZSkge1xuXHRyZXR1cm4gdGhpcy50cmltU3RhcnQoY2hhclR5cGUpLnRyaW1FbmQoY2hhclR5cGUpO1xufTtcblxuQnVuZGxlLnByb3RvdHlwZS50cmltU3RhcnQgPSBmdW5jdGlvbiB0cmltU3RhcnQgKGNoYXJUeXBlKSB7XG5cdHZhciByeCA9IG5ldyBSZWdFeHAoJ14nICsgKGNoYXJUeXBlIHx8ICdcXFxccycpICsgJysnKTtcblx0dGhpcy5pbnRybyA9IHRoaXMuaW50cm8ucmVwbGFjZShyeCwgJycpO1xuXG5cdGlmICghdGhpcy5pbnRybykge1xuXHRcdHZhciBzb3VyY2U7XG5cdFx0dmFyIGkgPSAwO1xuXG5cdFx0ZG8ge1xuXHRcdFx0c291cmNlID0gdGhpcy5zb3VyY2VzW2krK107XG5cdFx0XHRpZiAoIXNvdXJjZSkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9IHdoaWxlICghc291cmNlLmNvbnRlbnQudHJpbVN0YXJ0QWJvcnRlZChjaGFyVHlwZSkpO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5CdW5kbGUucHJvdG90eXBlLnRyaW1FbmQgPSBmdW5jdGlvbiB0cmltRW5kIChjaGFyVHlwZSkge1xuXHR2YXIgcnggPSBuZXcgUmVnRXhwKChjaGFyVHlwZSB8fCAnXFxcXHMnKSArICcrJCcpO1xuXG5cdHZhciBzb3VyY2U7XG5cdHZhciBpID0gdGhpcy5zb3VyY2VzLmxlbmd0aCAtIDE7XG5cblx0ZG8ge1xuXHRcdHNvdXJjZSA9IHRoaXMuc291cmNlc1tpLS1dO1xuXHRcdGlmICghc291cmNlKSB7XG5cdFx0XHR0aGlzLmludHJvID0gdGhpcy5pbnRyby5yZXBsYWNlKHJ4LCAnJyk7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH0gd2hpbGUgKCFzb3VyY2UuY29udGVudC50cmltRW5kQWJvcnRlZChjaGFyVHlwZSkpO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTWFnaWNTdHJpbmc7XG5leHBvcnQgeyBCdW5kbGUsIFNvdXJjZU1hcCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWFnaWMtc3RyaW5nLmVzLmpzLm1hcFxuIl0sIm5hbWVzIjpbInRoaXMkMSJdLCJtYXBwaW5ncyI6IkFBQUEsSUFBSSxhQUFhLEdB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LE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwQjtBQUNBLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNqQyxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDNUI7QUFDQSxDQUFDLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7QUFDOUIsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQzFCO0FBQ0EsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3BDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUU7QUFDM0QsQ0FBQyxJQUFJLE9BQU8sR0FBRyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0FBQzdEO0FBQ0EsQ0FBQyxJQUFJLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLEVBQUU7QUFDMUMsQ0FBQyxJQUFJLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLEVBQUU7QUFDL0M7QUFDQSxDQUFDLElBQUksT0FBTyxFQUFFLEVBQUUsT0FBTyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRTtBQUN2QyxDQUFDLElBQUksUUFBUSxFQUFFLEVBQUUsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRTtBQUM1QztBQUNBLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUN0RCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO0FBQ2pCLEVBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQzdCLEVBQUU7QUFDRjtBQUNBLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7QUFDMUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsSUFBSSxJQUFJLENBQUM7QUFDOUI7QUFDQSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxFQUFFO0FBQzNDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEVBQUU7QUFDMUMsQ0FBQyxPQUFPLElBQUksQ0FBQztBQUNiLENBQUMsQ0FBQztBQUNGO0FBQ0EsV0FBVyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxTQUFTLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3BGLENBQUMsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLHNDQUFzQyxDQUFDLENBQUMsRUFBRTtBQUNsRztBQUNBLENBQUMsT0FBTyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDckQsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNqRDtBQUNBLENBQUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUMsRUFBRTtBQUM3RSxDQUFDLElBQUksS0FBSyxLQUFLLEdBQUc7QUFDbEIsRUFBRSxFQUFF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R0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztBQUNuQyxHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQ2hDLEdBQUcsU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVDLEdBQUcsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDO0FBQ3ZCLElBQUksRUFBRSxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRTtBQUM3RCxHQUFHLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUNyQyxHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQzlCLEdBQUcsU0FBUyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFDLEdBQUcsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDO0FBQ3ZCLElBQUksRUFBRSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRTtBQUMzRCxHQUFHLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztBQUNuQyxHQUFHO0FBQ0gsRUFBRSxRQUFRLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFO0FBQ2xDLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLENBQUMsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDO0FBQ3JCLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBRyxP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