@pie-lib/graphing 4.0.24-beta.13 → 4.0.24-beta.15

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.
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
4
5
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
5
6
  var _testUtils = require("@pie-lib/test-utils");
6
7
  var _react = _interopRequireDefault(require("react"));
@@ -44,6 +45,613 @@ describe('MarkLabel', function () {
44
45
  });
45
46
  });
46
47
  });
48
+ describe('MarkLabel - editing', function () {
49
+ var onChange;
50
+ var onBlur;
51
+ beforeEach(function () {
52
+ onChange = jest.fn();
53
+ onBlur = jest.fn();
54
+ });
55
+
56
+ // the label input is the only input MarkLabel renders (react-input-autosize)
57
+ var input = function input(container) {
58
+ return container.querySelector('input');
59
+ };
60
+ var renderComponent = function renderComponent(extras) {
61
+ var defaults = {
62
+ onChange: onChange,
63
+ onBlur: onBlur,
64
+ inputRef: jest.fn(),
65
+ mark: {
66
+ x: 1,
67
+ y: 1,
68
+ label: ''
69
+ },
70
+ graphProps: (0, _utils.graphProps)(0, 10, 0, 10)
71
+ };
72
+ var props = _objectSpread(_objectSpread({}, defaults), extras);
73
+ var result = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_markLabel.MarkLabel, props));
74
+ return _objectSpread(_objectSpread({}, result), {}, {
75
+ input: input(result.container),
76
+ rerenderWith: function rerenderWith(next) {
77
+ return result.rerender(/*#__PURE__*/_react["default"].createElement(_markLabel.MarkLabel, (0, _extends2["default"])({}, props, next)));
78
+ }
79
+ });
80
+ };
81
+ describe('autoFocus', function () {
82
+ it('focuses the input so a new label can be typed into right away', function () {
83
+ var _renderComponent3 = renderComponent({
84
+ autoFocus: true
85
+ }),
86
+ input = _renderComponent3.input;
87
+ expect(document.activeElement).toBe(input);
88
+ });
89
+ it('leaves the caret at the end of an existing label', function () {
90
+ var _renderComponent4 = renderComponent({
91
+ autoFocus: true,
92
+ mark: {
93
+ x: 1,
94
+ y: 1,
95
+ label: 'AB'
96
+ }
97
+ }),
98
+ input = _renderComponent4.input;
99
+ expect(document.activeElement).toBe(input);
100
+ expect(input.selectionStart).toBe(2);
101
+ expect(input.selectionEnd).toBe(2);
102
+ });
103
+ it('does not focus the input of an existing label when autoFocus is not set', function () {
104
+ var _renderComponent5 = renderComponent({
105
+ mark: {
106
+ x: 1,
107
+ y: 1,
108
+ label: 'A'
109
+ }
110
+ }),
111
+ input = _renderComponent5.input;
112
+ expect(document.activeElement).not.toBe(input);
113
+ });
114
+ it('does not focus the input when disabled', function () {
115
+ var _renderComponent6 = renderComponent({
116
+ autoFocus: true,
117
+ disabled: true,
118
+ mark: {
119
+ x: 1,
120
+ y: 1,
121
+ label: 'A'
122
+ }
123
+ }),
124
+ input = _renderComponent6.input;
125
+ expect(document.activeElement).not.toBe(input);
126
+ });
127
+ it('does not focus the input of a disabled mark', function () {
128
+ var _renderComponent7 = renderComponent({
129
+ autoFocus: true,
130
+ mark: {
131
+ x: 1,
132
+ y: 1,
133
+ label: 'A',
134
+ disabled: true
135
+ }
136
+ }),
137
+ input = _renderComponent7.input;
138
+ expect(document.activeElement).not.toBe(input);
139
+ });
140
+
141
+ // the focus can go away without this component hearing about it - the input node gets replaced
142
+ // by a render higher up, so no blur is fired and autoFocus is still on
143
+ it('takes the focus back on the next render while it is still being edited', function () {
144
+ var _renderComponent8 = renderComponent({
145
+ autoFocus: true,
146
+ mark: {
147
+ x: 1,
148
+ y: 1,
149
+ label: 'A'
150
+ }
151
+ }),
152
+ input = _renderComponent8.input,
153
+ rerenderWith = _renderComponent8.rerenderWith;
154
+ expect(document.activeElement).toBe(input);
155
+ input.blur();
156
+ expect(document.activeElement).not.toBe(input);
157
+ rerenderWith({
158
+ mark: {
159
+ x: 1,
160
+ y: 1,
161
+ label: 'A'
162
+ }
163
+ });
164
+ expect(document.activeElement).toBe(input);
165
+ });
166
+ it('leaves the caret where the user put it while the input has the focus', function () {
167
+ var _renderComponent9 = renderComponent({
168
+ autoFocus: true,
169
+ mark: {
170
+ x: 1,
171
+ y: 1,
172
+ label: 'ABC'
173
+ }
174
+ }),
175
+ input = _renderComponent9.input,
176
+ rerenderWith = _renderComponent9.rerenderWith;
177
+ input.setSelectionRange(1, 1);
178
+ rerenderWith({
179
+ mark: {
180
+ x: 1,
181
+ y: 1,
182
+ label: 'ABC'
183
+ }
184
+ });
185
+ expect(document.activeElement).toBe(input);
186
+ expect(input.selectionStart).toBe(1);
187
+ });
188
+ it('focuses the input once it is no longer disabled', function () {
189
+ var _renderComponent0 = renderComponent({
190
+ autoFocus: true,
191
+ disabled: true
192
+ }),
193
+ rerenderWith = _renderComponent0.rerenderWith,
194
+ container = _renderComponent0.container;
195
+ rerenderWith({
196
+ disabled: false
197
+ });
198
+ expect(document.activeElement).toBe(input(container));
199
+ });
200
+
201
+ // the host saves the model with an api call and the model that comes back can replace the
202
+ // input node - the label has to keep the focus across that remount
203
+ it('re-focuses the input when it is remounted while being edited', function () {
204
+ var props = {
205
+ autoFocus: true,
206
+ onChange: onChange,
207
+ inputRef: jest.fn(),
208
+ mark: {
209
+ x: 1,
210
+ y: 1,
211
+ label: 'A'
212
+ },
213
+ graphProps: (0, _utils.graphProps)(0, 10, 0, 10)
214
+ };
215
+ var _render = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_markLabel.MarkLabel, (0, _extends2["default"])({
216
+ key: "first"
217
+ }, props))),
218
+ container = _render.container,
219
+ rerender = _render.rerender;
220
+ var first = input(container);
221
+ expect(document.activeElement).toBe(first);
222
+ rerender(/*#__PURE__*/_react["default"].createElement(_markLabel.MarkLabel, (0, _extends2["default"])({
223
+ key: "second"
224
+ }, props)));
225
+ var second = input(container);
226
+ expect(second).not.toBe(first);
227
+ expect(document.activeElement).toBe(second);
228
+ });
229
+ });
230
+
231
+ // the tool asks for the focus with autoFocus, but its state can be gone before the input renders:
232
+ // the marks come back from the host asynchronously and can remount the tool. An empty label in
233
+ // label mode is a label the user has just added, so the input can tell on its own.
234
+ describe('a label that was just added', function () {
235
+ it('focuses itself without the tool asking', function () {
236
+ var _renderComponent1 = renderComponent({
237
+ mark: {
238
+ x: 1,
239
+ y: 1,
240
+ label: ''
241
+ }
242
+ }),
243
+ input = _renderComponent1.input;
244
+ expect(document.activeElement).toBe(input);
245
+ });
246
+ it('focuses itself again when it is remounted before it was typed into', function () {
247
+ var props = {
248
+ onChange: onChange,
249
+ onBlur: onBlur,
250
+ inputRef: jest.fn(),
251
+ mark: {
252
+ x: 1,
253
+ y: 1,
254
+ label: ''
255
+ },
256
+ graphProps: (0, _utils.graphProps)(0, 10, 0, 10)
257
+ };
258
+ var _render2 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_markLabel.MarkLabel, (0, _extends2["default"])({
259
+ key: "first"
260
+ }, props))),
261
+ container = _render2.container,
262
+ rerender = _render2.rerender;
263
+ var first = input(container);
264
+ rerender(/*#__PURE__*/_react["default"].createElement(_markLabel.MarkLabel, (0, _extends2["default"])({
265
+ key: "second"
266
+ }, props)));
267
+ var second = input(container);
268
+ expect(second).not.toBe(first);
269
+ expect(document.activeElement).toBe(second);
270
+ });
271
+ it('stops chasing the focus once it has been left', function () {
272
+ var _renderComponent10 = renderComponent({
273
+ mark: {
274
+ x: 1,
275
+ y: 1,
276
+ label: ''
277
+ }
278
+ }),
279
+ input = _renderComponent10.input,
280
+ rerenderWith = _renderComponent10.rerenderWith;
281
+ expect(document.activeElement).toBe(input);
282
+ input.blur();
283
+ rerenderWith({
284
+ mark: {
285
+ x: 1,
286
+ y: 1,
287
+ label: ''
288
+ }
289
+ });
290
+ expect(document.activeElement).not.toBe(input);
291
+ });
292
+
293
+ // outside of label mode the input is disabled, which is how an empty label that was loaded with
294
+ // the item is told apart from one the user has just added - label mode always starts off
295
+ // the config draws the background marks into the correct answer graphs as disabled marks
296
+ it('is not rendered at all while it cannot be edited', function () {
297
+ var _renderComponent11 = renderComponent({
298
+ disabled: true,
299
+ mark: {
300
+ x: 1,
301
+ y: 1,
302
+ label: ''
303
+ }
304
+ }),
305
+ container = _renderComponent11.container;
306
+ expect(container.querySelector('input')).toBe(null);
307
+ });
308
+ it('is still rendered uneditable once it has text', function () {
309
+ var _renderComponent12 = renderComponent({
310
+ disabled: true,
311
+ mark: {
312
+ x: 1,
313
+ y: 1,
314
+ label: 'A'
315
+ }
316
+ }),
317
+ container = _renderComponent12.container;
318
+ expect(container.querySelector('input').value).toBe('A');
319
+ });
320
+ it('is not focused when label mode is turned on afterwards', function () {
321
+ var _renderComponent13 = renderComponent({
322
+ disabled: true,
323
+ mark: {
324
+ x: 1,
325
+ y: 1,
326
+ label: ''
327
+ }
328
+ }),
329
+ rerenderWith = _renderComponent13.rerenderWith,
330
+ container = _renderComponent13.container;
331
+ rerenderWith({
332
+ disabled: false
333
+ });
334
+ expect(input(container)).not.toBe(null);
335
+ expect(document.activeElement).not.toBe(input(container));
336
+ });
337
+ it('is not rendered for a disabled mark while it is empty', function () {
338
+ var _renderComponent14 = renderComponent({
339
+ mark: {
340
+ x: 1,
341
+ y: 1,
342
+ label: '',
343
+ disabled: true
344
+ }
345
+ }),
346
+ container = _renderComponent14.container;
347
+ expect(container.querySelector('input')).toBe(null);
348
+ });
349
+
350
+ // an input sized to its content is 2px wide while it is empty, and chrome paints the caret of
351
+ // an input inside an svg foreignObject as a hairline that never blinks - so an empty label that
352
+ // has the focus has to be wide enough to be seen as a box waiting for text
353
+ it('is wide enough to be seen while it is empty', function () {
354
+ var _renderComponent15 = renderComponent({
355
+ mark: {
356
+ x: 1,
357
+ y: 1,
358
+ label: ''
359
+ }
360
+ }),
361
+ input = _renderComponent15.input;
362
+ expect(parseInt(input.style.width, 10)).toBeGreaterThanOrEqual(30);
363
+ });
364
+ it('is only as wide as its text once it cannot be edited', function () {
365
+ var _renderComponent16 = renderComponent({
366
+ disabled: true,
367
+ mark: {
368
+ x: 1,
369
+ y: 1,
370
+ label: 'A'
371
+ }
372
+ }),
373
+ container = _renderComponent16.container;
374
+ expect(parseInt(container.querySelector('input').style.width, 10)).toBeLessThan(30);
375
+ });
376
+ });
377
+ describe('syncing mark.label into the input', function () {
378
+ it('picks up a new mark.label while the input does not have the focus', function () {
379
+ var _renderComponent17 = renderComponent({
380
+ mark: {
381
+ x: 1,
382
+ y: 1,
383
+ label: 'A'
384
+ }
385
+ }),
386
+ rerenderWith = _renderComponent17.rerenderWith,
387
+ container = _renderComponent17.container;
388
+ rerenderWith({
389
+ mark: {
390
+ x: 1,
391
+ y: 1,
392
+ label: 'updated'
393
+ }
394
+ });
395
+ expect(input(container).value).toBe('updated');
396
+ });
397
+
398
+ // a mark coming back from an (async) model save can carry an older label - applying it would
399
+ // wipe out the characters typed in the meantime
400
+ it('keeps what the user typed while the input has the focus', function () {
401
+ var _renderComponent18 = renderComponent({
402
+ autoFocus: true
403
+ }),
404
+ input = _renderComponent18.input,
405
+ rerenderWith = _renderComponent18.rerenderWith;
406
+ expect(document.activeElement).toBe(input);
407
+ _testUtils.fireEvent.change(input, {
408
+ target: {
409
+ value: 'AB'
410
+ }
411
+ });
412
+ expect(input.value).toBe('AB');
413
+
414
+ // the host echoes back the label as it was one keystroke ago
415
+ rerenderWith({
416
+ mark: {
417
+ x: 1,
418
+ y: 1,
419
+ label: 'A'
420
+ }
421
+ });
422
+ expect(input.value).toBe('AB');
423
+ });
424
+ });
425
+
426
+ // the characters land at the document's caret, not at the focused node. In the authoring
427
+ // environment the input ends up focused with no caret anywhere: keypress fires and nothing is
428
+ // inserted. jsdom never reports a caret either, so this is that state - the focus cycle that
429
+ // repairs it must not hand the label over to the blur handling.
430
+ describe('a focused input with no caret', function () {
431
+ it('is repaired without reporting the label as removed', function () {
432
+ var _renderComponent19 = renderComponent({
433
+ autoFocus: true,
434
+ mark: {
435
+ x: 1,
436
+ y: 1,
437
+ label: ''
438
+ }
439
+ }),
440
+ input = _renderComponent19.input;
441
+ expect(document.activeElement).toBe(input);
442
+ expect(onChange).not.toHaveBeenCalled();
443
+ expect(onBlur).not.toHaveBeenCalled();
444
+ });
445
+ it('leaves the caret at the end of a label that already has text', function () {
446
+ var _renderComponent20 = renderComponent({
447
+ autoFocus: true,
448
+ mark: {
449
+ x: 1,
450
+ y: 1,
451
+ label: 'AB'
452
+ }
453
+ }),
454
+ input = _renderComponent20.input;
455
+ expect(document.activeElement).toBe(input);
456
+ expect(input.selectionStart).toBe(2);
457
+ expect(onChange).not.toHaveBeenCalled();
458
+ });
459
+ });
460
+
461
+ // clicking another window, the devtools, or the host moving the focus while it saves the model:
462
+ // the label is not being left, so it must survive and take the focus back
463
+ describe('while the window is away', function () {
464
+ var windowGoesAway = function windowGoesAway() {
465
+ return window.dispatchEvent(new Event('blur'));
466
+ };
467
+ var windowComesBack = function windowComesBack() {
468
+ return window.dispatchEvent(new Event('focus'));
469
+ };
470
+ it('keeps an empty label instead of reporting it as removed', function () {
471
+ var _renderComponent21 = renderComponent({
472
+ mark: {
473
+ x: 1,
474
+ y: 1,
475
+ label: ''
476
+ }
477
+ }),
478
+ input = _renderComponent21.input;
479
+ windowGoesAway();
480
+ _testUtils.fireEvent.blur(input);
481
+ expect(onChange).not.toHaveBeenCalled();
482
+ expect(onBlur).not.toHaveBeenCalled();
483
+ });
484
+ it('takes the focus back when the window comes back', function () {
485
+ var _renderComponent22 = renderComponent({
486
+ autoFocus: true,
487
+ mark: {
488
+ x: 1,
489
+ y: 1,
490
+ label: ''
491
+ }
492
+ }),
493
+ input = _renderComponent22.input;
494
+
495
+ // the focus is moved to another input rather than with input.blur(): jsdom fires a window
496
+ // focus event as part of blur(), which is the very thing being tested here
497
+ var elsewhere = document.createElement('input');
498
+ document.body.appendChild(elsewhere);
499
+ windowGoesAway();
500
+ elsewhere.focus();
501
+ expect(document.activeElement).toBe(elsewhere);
502
+ windowComesBack();
503
+ expect(document.activeElement).toBe(input);
504
+ elsewhere.remove();
505
+ });
506
+ it('still reports a label the user leaves once the window is back', function () {
507
+ var _renderComponent23 = renderComponent({
508
+ mark: {
509
+ x: 1,
510
+ y: 1,
511
+ label: ''
512
+ }
513
+ }),
514
+ input = _renderComponent23.input;
515
+ windowGoesAway();
516
+ windowComesBack();
517
+ _testUtils.fireEvent.blur(input);
518
+ expect(onChange).toHaveBeenCalledWith('');
519
+ });
520
+ });
521
+ describe('onBlur', function () {
522
+ it('is called so the tool stops auto focusing the label', function () {
523
+ var _renderComponent24 = renderComponent({
524
+ autoFocus: true,
525
+ mark: {
526
+ x: 1,
527
+ y: 1,
528
+ label: 'A'
529
+ }
530
+ }),
531
+ input = _renderComponent24.input;
532
+ _testUtils.fireEvent.blur(input);
533
+ expect(onBlur).toHaveBeenCalled();
534
+ });
535
+
536
+ // clicking a button or anything else interactive blurs the label while the debounce is pending
537
+ it('saves what was typed straight away', function () {
538
+ var _renderComponent25 = renderComponent({
539
+ mark: {
540
+ x: 1,
541
+ y: 1,
542
+ label: ''
543
+ }
544
+ }),
545
+ input = _renderComponent25.input;
546
+ _testUtils.fireEvent.change(input, {
547
+ target: {
548
+ value: 'AB'
549
+ }
550
+ });
551
+ _testUtils.fireEvent.blur(input);
552
+ expect(onChange).toHaveBeenCalledWith('AB');
553
+ });
554
+ it('does not save it twice when the debounce catches up', function () {
555
+ jest.useFakeTimers();
556
+ var _renderComponent26 = renderComponent({
557
+ mark: {
558
+ x: 1,
559
+ y: 1,
560
+ label: ''
561
+ }
562
+ }),
563
+ input = _renderComponent26.input;
564
+ _testUtils.fireEvent.change(input, {
565
+ target: {
566
+ value: 'AB'
567
+ }
568
+ });
569
+ _testUtils.fireEvent.blur(input);
570
+ (0, _testUtils.act)(function () {
571
+ return jest.advanceTimersByTime(1000);
572
+ });
573
+ expect(onChange).toHaveBeenCalledTimes(1);
574
+ expect(onChange).toHaveBeenCalledWith('AB');
575
+ jest.useRealTimers();
576
+ });
577
+ it('reports an empty label on blur', function () {
578
+ var _renderComponent27 = renderComponent({
579
+ mark: {
580
+ x: 1,
581
+ y: 1,
582
+ label: 'A'
583
+ }
584
+ }),
585
+ input = _renderComponent27.input;
586
+ _testUtils.fireEvent.change(input, {
587
+ target: {
588
+ value: ''
589
+ }
590
+ });
591
+ _testUtils.fireEvent.blur(input);
592
+ expect(onChange).toHaveBeenCalledWith('');
593
+ });
594
+ });
595
+ describe('debounce', function () {
596
+ beforeEach(function () {
597
+ return jest.useFakeTimers();
598
+ });
599
+ afterEach(function () {
600
+ return jest.useRealTimers();
601
+ });
602
+ it('does not report the typed label before the debounce delay elapses', function () {
603
+ var _renderComponent28 = renderComponent({
604
+ autoFocus: true
605
+ }),
606
+ input = _renderComponent28.input;
607
+ _testUtils.fireEvent.change(input, {
608
+ target: {
609
+ value: 'A'
610
+ }
611
+ });
612
+ (0, _testUtils.act)(function () {
613
+ return jest.advanceTimersByTime(499);
614
+ });
615
+ expect(onChange).not.toHaveBeenCalled();
616
+ (0, _testUtils.act)(function () {
617
+ return jest.advanceTimersByTime(1);
618
+ });
619
+ expect(onChange).toHaveBeenCalledWith('A');
620
+ });
621
+ it('reports the label once for a burst of keystrokes', function () {
622
+ var _renderComponent29 = renderComponent({
623
+ autoFocus: true
624
+ }),
625
+ input = _renderComponent29.input;
626
+ _testUtils.fireEvent.change(input, {
627
+ target: {
628
+ value: 'A'
629
+ }
630
+ });
631
+ (0, _testUtils.act)(function () {
632
+ return jest.advanceTimersByTime(300);
633
+ });
634
+ _testUtils.fireEvent.change(input, {
635
+ target: {
636
+ value: 'AB'
637
+ }
638
+ });
639
+ (0, _testUtils.act)(function () {
640
+ return jest.advanceTimersByTime(300);
641
+ });
642
+ _testUtils.fireEvent.change(input, {
643
+ target: {
644
+ value: 'ABC'
645
+ }
646
+ });
647
+ (0, _testUtils.act)(function () {
648
+ return jest.advanceTimersByTime(500);
649
+ });
650
+ expect(onChange).toHaveBeenCalledTimes(1);
651
+ expect(onChange).toHaveBeenCalledWith('ABC');
652
+ });
653
+ });
654
+ });
47
655
  describe('position', function () {
48
656
  var assertPosition = function assertPosition(mark, rect, expected) {
49
657
  it("".concat(mark.x, ",").concat(mark.y, " + ").concat(rect.width, ",").concat(rect.height, " => ").concat(expected), function () {
@@ -130,4 +738,4 @@ describe('coordinates', function () {
130
738
  top: 5
131
739
  });
132
740
  });
133
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdGVzdFV0aWxzIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbWFya0xhYmVsIiwiX3V0aWxzIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJkZXNjcmliZSIsIm9uQ2hhbmdlIiwiamVzdCIsImZuIiwiaW5wdXRSZWYiLCJyZW5kZXJDb21wb25lbnQiLCJleHRyYXMiLCJkZWZhdWx0cyIsImNsYXNzZXMiLCJjbGFzc05hbWUiLCJtYXJrIiwieCIsInkiLCJncmFwaFByb3BzIiwiZ2V0R3JhcGhQcm9wcyIsInByb3BzIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsIk1hcmtMYWJlbCIsIml0IiwiX3JlbmRlckNvbXBvbmVudCIsImNvbnRhaW5lciIsImV4cGVjdCIsImZpcnN0Q2hpbGQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsIl9yZW5kZXJDb21wb25lbnQyIiwiYXNzZXJ0UG9zaXRpb24iLCJyZWN0IiwiZXhwZWN0ZWQiLCJjb25jYXQiLCJ3aWR0aCIsImhlaWdodCIsInJlc3VsdCIsInBvc2l0aW9uIiwidG9FcXVhbCIsImFzc2VydENvb3JkaW5hdGVzIiwicG9zIiwibGVmdCIsInRvcCIsImNvb3JkaW5hdGVzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9tYXJrLWxhYmVsLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlbmRlciB9IGZyb20gJ0BwaWUtbGliL3Rlc3QtdXRpbHMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNvb3JkaW5hdGVzLCBNYXJrTGFiZWwsIHBvc2l0aW9uIH0gZnJvbSAnLi4vbWFyay1sYWJlbCc7XG5pbXBvcnQgeyBncmFwaFByb3BzIGFzIGdldEdyYXBoUHJvcHMgfSBmcm9tICcuL3V0aWxzJztcblxuZGVzY3JpYmUoJ01hcmtMYWJlbCcsICgpID0+IHtcbiAgbGV0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICBsZXQgaW5wdXRSZWYgPSBqZXN0LmZuKCk7XG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgY2xhc3NOYW1lOiAnY2xhc3NOYW1lJyxcbiAgICAgIG9uQ2hhbmdlLFxuICAgICAgaW5wdXRSZWYsXG4gICAgICBtYXJrOiB7IHg6IDEsIHk6IDEgfSxcbiAgICAgIGdyYXBoUHJvcHM6IGdldEdyYXBoUHJvcHMoMCwgMTAsIDAsIDEwKSxcbiAgICB9O1xuICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0cywgLi4uZXh0cmFzIH07XG4gICAgcmV0dXJuIHJlbmRlcig8TWFya0xhYmVsIHsuLi5wcm9wc30gLz4pO1xuICB9O1xuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBkaWZmZXJlbnQgbWFyayBwb3NpdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiB7IHg6IDEwLCB5OiAxMCB9IH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgncG9zaXRpb24nLCAoKSA9PiB7XG4gIGNvbnN0IGFzc2VydFBvc2l0aW9uID0gKG1hcmssIHJlY3QsIGV4cGVjdGVkKSA9PiB7XG4gICAgaXQoYCR7bWFyay54fSwke21hcmsueX0gKyAke3JlY3Qud2lkdGh9LCR7cmVjdC5oZWlnaHR9ID0+ICR7ZXhwZWN0ZWR9YCwgKCkgPT4ge1xuICAgICAgLy8gd2Ugc2V0IHJhbmdlLm1pbiB0byBhIHZhbHVlIGJlY2F1c2UgaW4gcGl4ZWxzIC0gdGhlIGdyZWF0ZXIgdGhlIFkgdGhlIGxvd2VyIGRvd24gb24gdGhlIHNjcmVlbi5cbiAgICAgIGNvbnN0IGdyYXBoUHJvcHMgPSBnZXRHcmFwaFByb3BzKDAsIDEyLCAxMiwgMCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBwb3NpdGlvbihncmFwaFByb3BzLCBtYXJrLCByZWN0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9O1xuXG4gIGFzc2VydFBvc2l0aW9uKHsgeDogMCwgeTogMCB9LCB7IHdpZHRoOiAxMCwgaGVpZ2h0OiAxMCB9LCAndG9wLWxlZnQnKTtcbiAgYXNzZXJ0UG9zaXRpb24oeyB4OiAwLCB5OiAwIH0sIHsgd2lkdGg6IDEsIGhlaWdodDogMSB9LCAnYm90dG9tLXJpZ2h0Jyk7XG4gIGFzc2VydFBvc2l0aW9uKHsgeDogMCwgeTogMCB9LCB7IHdpZHRoOiAxMCwgaGVpZ2h0OiAwIH0sICdib3R0b20tbGVmdCcpO1xuICBhc3NlcnRQb3NpdGlvbih7IHg6IDAsIHk6IDAgfSwgeyB3aWR0aDogMCwgaGVpZ2h0OiAxMCB9LCAndG9wLXJpZ2h0Jyk7XG59KTtcblxuZGVzY3JpYmUoJ2Nvb3JkaW5hdGVzJywgKCkgPT4ge1xuICBjb25zdCBhc3NlcnRDb29yZGluYXRlcyA9IChtYXJrLCByZWN0LCBwb3MsIGV4cGVjdGVkKSA9PiB7XG4gICAgaXQoYCR7bWFyay54fSwgJHttYXJrLnl9IC0+ICR7cG9zfSA9ICR7ZXhwZWN0ZWQubGVmdH0sICR7ZXhwZWN0ZWQudG9wfWAsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvb3JkaW5hdGVzKGdldEdyYXBoUHJvcHMoKSwgbWFyaywgcmVjdCwgcG9zKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9O1xuICBhc3NlcnRDb29yZGluYXRlcyh7IHg6IDAsIHk6IDAgfSwgeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0sICd0b3AtbGVmdCcsIHsgbGVmdDogLTUsIHRvcDogLTUgfSk7XG4gIGFzc2VydENvb3JkaW5hdGVzKHsgeDogMCwgeTogMCB9LCB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSwgJ2JvdHRvbS1sZWZ0JywgeyBsZWZ0OiAtNSwgdG9wOiA1IH0pO1xuICBhc3NlcnRDb29yZGluYXRlcyh7IHg6IDAsIHk6IDAgfSwgeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0sICd0b3AtcmlnaHQnLCB7IGxlZnQ6IDUsIHRvcDogLTUgfSk7XG4gIGFzc2VydENvb3JkaW5hdGVzKHsgeDogMCwgeTogMCB9LCB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSwgJ2JvdHRvbS1yaWdodCcsIHtcbiAgICBsZWZ0OiA1LFxuICAgIHRvcDogNSxcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUFBLFVBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLFVBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQUFzRCxTQUFBSyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixDQUFBLFFBQUFBLENBQUEsT0FBQUYsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsT0FBQWEsT0FBQSxXQUFBZCxDQUFBLFFBQUFlLGdCQUFBLGFBQUFoQixDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxDQUFBRCxDQUFBLFNBQUFFLE1BQUEsQ0FBQWMseUJBQUEsR0FBQWQsTUFBQSxDQUFBZSxnQkFBQSxDQUFBbEIsQ0FBQSxFQUFBRyxNQUFBLENBQUFjLHlCQUFBLENBQUFmLENBQUEsS0FBQUgsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsR0FBQWEsT0FBQSxXQUFBZCxDQUFBLElBQUFFLE1BQUEsQ0FBQWdCLGNBQUEsQ0FBQW5CLENBQUEsRUFBQUMsQ0FBQSxFQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFOLENBQUEsRUFBQUQsQ0FBQSxpQkFBQUQsQ0FBQTtBQUV0RG9CLFFBQVEsQ0FBQyxXQUFXLEVBQUUsWUFBTTtFQUMxQixJQUFJQyxRQUFRLEdBQUdDLElBQUksQ0FBQ0MsRUFBRSxDQUFDLENBQUM7RUFDeEIsSUFBSUMsUUFBUSxHQUFHRixJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO0VBQ3hCLElBQU1FLGVBQWUsR0FBRyxTQUFsQkEsZUFBZUEsQ0FBSUMsTUFBTSxFQUFLO0lBQ2xDLElBQU1DLFFBQVEsR0FBRztNQUNmQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO01BQ1hDLFNBQVMsRUFBRSxXQUFXO01BQ3RCUixRQUFRLEVBQVJBLFFBQVE7TUFDUkcsUUFBUSxFQUFSQSxRQUFRO01BQ1JNLElBQUksRUFBRTtRQUFFQyxDQUFDLEVBQUUsQ0FBQztRQUFFQyxDQUFDLEVBQUU7TUFBRSxDQUFDO01BQ3BCQyxVQUFVLEVBQUUsSUFBQUMsaUJBQWEsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQ3hDLENBQUM7SUFDRCxJQUFNQyxLQUFLLEdBQUF2QixhQUFBLENBQUFBLGFBQUEsS0FBUWUsUUFBUSxHQUFLRCxNQUFNLENBQUU7SUFDeEMsT0FBTyxJQUFBVSxpQkFBTSxlQUFDekMsTUFBQSxZQUFBMEMsYUFBQSxDQUFDeEMsVUFBQSxDQUFBeUMsU0FBUyxFQUFLSCxLQUFRLENBQUMsQ0FBQztFQUN6QyxDQUFDO0VBQ0RmLFFBQVEsQ0FBQyxXQUFXLEVBQUUsWUFBTTtJQUMxQm1CLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxZQUFNO01BQ25DLElBQUFDLGdCQUFBLEdBQXNCZixlQUFlLENBQUMsQ0FBQztRQUEvQmdCLFNBQVMsR0FBQUQsZ0JBQUEsQ0FBVEMsU0FBUztNQUNqQkMsTUFBTSxDQUFDRCxTQUFTLENBQUNFLFVBQVUsQ0FBQyxDQUFDQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQztJQUNGTCxFQUFFLENBQUMsc0NBQXNDLEVBQUUsWUFBTTtNQUMvQyxJQUFBTSxpQkFBQSxHQUFzQnBCLGVBQWUsQ0FBQztVQUFFSyxJQUFJLEVBQUU7WUFBRUMsQ0FBQyxFQUFFLEVBQUU7WUFBRUMsQ0FBQyxFQUFFO1VBQUc7UUFBRSxDQUFDLENBQUM7UUFBekRTLFNBQVMsR0FBQUksaUJBQUEsQ0FBVEosU0FBUztNQUNqQkMsTUFBTSxDQUFDRCxTQUFTLENBQUNFLFVBQVUsQ0FBQyxDQUFDQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGeEIsUUFBUSxDQUFDLFVBQVUsRUFBRSxZQUFNO0VBQ3pCLElBQU0wQixjQUFjLEdBQUcsU0FBakJBLGNBQWNBLENBQUloQixJQUFJLEVBQUVpQixJQUFJLEVBQUVDLFFBQVEsRUFBSztJQUMvQ1QsRUFBRSxJQUFBVSxNQUFBLENBQUluQixJQUFJLENBQUNDLENBQUMsT0FBQWtCLE1BQUEsQ0FBSW5CLElBQUksQ0FBQ0UsQ0FBQyxTQUFBaUIsTUFBQSxDQUFNRixJQUFJLENBQUNHLEtBQUssT0FBQUQsTUFBQSxDQUFJRixJQUFJLENBQUNJLE1BQU0sVUFBQUYsTUFBQSxDQUFPRCxRQUFRLEdBQUksWUFBTTtNQUM1RTtNQUNBLElBQU1mLFVBQVUsR0FBRyxJQUFBQyxpQkFBYSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztNQUM5QyxJQUFNa0IsTUFBTSxHQUFHLElBQUFDLG1CQUFRLEVBQUNwQixVQUFVLEVBQUVILElBQUksRUFBRWlCLElBQUksQ0FBQztNQUMvQ0wsTUFBTSxDQUFDVSxNQUFNLENBQUMsQ0FBQ0UsT0FBTyxDQUFDTixRQUFRLENBQUM7SUFDbEMsQ0FBQyxDQUFDO0VBQ0osQ0FBQztFQUVERixjQUFjLENBQUM7SUFBRWYsQ0FBQyxFQUFFLENBQUM7SUFBRUMsQ0FBQyxFQUFFO0VBQUUsQ0FBQyxFQUFFO0lBQUVrQixLQUFLLEVBQUUsRUFBRTtJQUFFQyxNQUFNLEVBQUU7RUFBRyxDQUFDLEVBQUUsVUFBVSxDQUFDO0VBQ3JFTCxjQUFjLENBQUM7SUFBRWYsQ0FBQyxFQUFFLENBQUM7SUFBRUMsQ0FBQyxFQUFFO0VBQUUsQ0FBQyxFQUFFO0lBQUVrQixLQUFLLEVBQUUsQ0FBQztJQUFFQyxNQUFNLEVBQUU7RUFBRSxDQUFDLEVBQUUsY0FBYyxDQUFDO0VBQ3ZFTCxjQUFjLENBQUM7SUFBRWYsQ0FBQyxFQUFFLENBQUM7SUFBRUMsQ0FBQyxFQUFFO0VBQUUsQ0FBQyxFQUFFO0lBQUVrQixLQUFLLEVBQUUsRUFBRTtJQUFFQyxNQUFNLEVBQUU7RUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDO0VBQ3ZFTCxjQUFjLENBQUM7SUFBRWYsQ0FBQyxFQUFFLENBQUM7SUFBRUMsQ0FBQyxFQUFFO0VBQUUsQ0FBQyxFQUFFO0lBQUVrQixLQUFLLEVBQUUsQ0FBQztJQUFFQyxNQUFNLEVBQUU7RUFBRyxDQUFDLEVBQUUsV0FBVyxDQUFDO0FBQ3ZFLENBQUMsQ0FBQztBQUVGL0IsUUFBUSxDQUFDLGFBQWEsRUFBRSxZQUFNO0VBQzVCLElBQU1tQyxpQkFBaUIsR0FBRyxTQUFwQkEsaUJBQWlCQSxDQUFJekIsSUFBSSxFQUFFaUIsSUFBSSxFQUFFUyxHQUFHLEVBQUVSLFFBQVEsRUFBSztJQUN2RFQsRUFBRSxJQUFBVSxNQUFBLENBQUluQixJQUFJLENBQUNDLENBQUMsUUFBQWtCLE1BQUEsQ0FBS25CLElBQUksQ0FBQ0UsQ0FBQyxVQUFBaUIsTUFBQSxDQUFPTyxHQUFHLFNBQUFQLE1BQUEsQ0FBTUQsUUFBUSxDQUFDUyxJQUFJLFFBQUFSLE1BQUEsQ0FBS0QsUUFBUSxDQUFDVSxHQUFHLEdBQUksWUFBTTtNQUM3RSxJQUFNTixNQUFNLEdBQUcsSUFBQU8sc0JBQVcsRUFBQyxJQUFBekIsaUJBQWEsRUFBQyxDQUFDLEVBQUVKLElBQUksRUFBRWlCLElBQUksRUFBRVMsR0FBRyxDQUFDO01BQzVEZCxNQUFNLENBQUNVLE1BQU0sQ0FBQyxDQUFDRSxPQUFPLENBQUNOLFFBQVEsQ0FBQztJQUNsQyxDQUFDLENBQUM7RUFDSixDQUFDO0VBQ0RPLGlCQUFpQixDQUFDO0lBQUV4QixDQUFDLEVBQUUsQ0FBQztJQUFFQyxDQUFDLEVBQUU7RUFBRSxDQUFDLEVBQUU7SUFBRWtCLEtBQUssRUFBRSxDQUFDO0lBQUVDLE1BQU0sRUFBRTtFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUU7SUFBRU0sSUFBSSxFQUFFLENBQUMsQ0FBQztJQUFFQyxHQUFHLEVBQUUsQ0FBQztFQUFFLENBQUMsQ0FBQztFQUM3RkgsaUJBQWlCLENBQUM7SUFBRXhCLENBQUMsRUFBRSxDQUFDO0lBQUVDLENBQUMsRUFBRTtFQUFFLENBQUMsRUFBRTtJQUFFa0IsS0FBSyxFQUFFLENBQUM7SUFBRUMsTUFBTSxFQUFFO0VBQUUsQ0FBQyxFQUFFLGFBQWEsRUFBRTtJQUFFTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQUVDLEdBQUcsRUFBRTtFQUFFLENBQUMsQ0FBQztFQUMvRkgsaUJBQWlCLENBQUM7SUFBRXhCLENBQUMsRUFBRSxDQUFDO0lBQUVDLENBQUMsRUFBRTtFQUFFLENBQUMsRUFBRTtJQUFFa0IsS0FBSyxFQUFFLENBQUM7SUFBRUMsTUFBTSxFQUFFO0VBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRTtJQUFFTSxJQUFJLEVBQUUsQ0FBQztJQUFFQyxHQUFHLEVBQUUsQ0FBQztFQUFFLENBQUMsQ0FBQztFQUM3RkgsaUJBQWlCLENBQUM7SUFBRXhCLENBQUMsRUFBRSxDQUFDO0lBQUVDLENBQUMsRUFBRTtFQUFFLENBQUMsRUFBRTtJQUFFa0IsS0FBSyxFQUFFLENBQUM7SUFBRUMsTUFBTSxFQUFFO0VBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBRTtJQUN6RU0sSUFBSSxFQUFFLENBQUM7SUFDUEMsR0FBRyxFQUFFO0VBQ1AsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119
741
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdGVzdFV0aWxzIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbWFya0xhYmVsIiwiX3V0aWxzIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJkZXNjcmliZSIsIm9uQ2hhbmdlIiwiamVzdCIsImZuIiwiaW5wdXRSZWYiLCJyZW5kZXJDb21wb25lbnQiLCJleHRyYXMiLCJkZWZhdWx0cyIsImNsYXNzZXMiLCJjbGFzc05hbWUiLCJtYXJrIiwieCIsInkiLCJncmFwaFByb3BzIiwiZ2V0R3JhcGhQcm9wcyIsInByb3BzIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsIk1hcmtMYWJlbCIsIml0IiwiX3JlbmRlckNvbXBvbmVudCIsImNvbnRhaW5lciIsImV4cGVjdCIsImZpcnN0Q2hpbGQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsIl9yZW5kZXJDb21wb25lbnQyIiwib25CbHVyIiwiYmVmb3JlRWFjaCIsImlucHV0IiwicXVlcnlTZWxlY3RvciIsImxhYmVsIiwicmVzdWx0IiwicmVyZW5kZXJXaXRoIiwibmV4dCIsInJlcmVuZGVyIiwiX2V4dGVuZHMyIiwiX3JlbmRlckNvbXBvbmVudDMiLCJhdXRvRm9jdXMiLCJkb2N1bWVudCIsImFjdGl2ZUVsZW1lbnQiLCJ0b0JlIiwiX3JlbmRlckNvbXBvbmVudDQiLCJzZWxlY3Rpb25TdGFydCIsInNlbGVjdGlvbkVuZCIsIl9yZW5kZXJDb21wb25lbnQ1Iiwibm90IiwiX3JlbmRlckNvbXBvbmVudDYiLCJkaXNhYmxlZCIsIl9yZW5kZXJDb21wb25lbnQ3IiwiX3JlbmRlckNvbXBvbmVudDgiLCJibHVyIiwiX3JlbmRlckNvbXBvbmVudDkiLCJzZXRTZWxlY3Rpb25SYW5nZSIsIl9yZW5kZXJDb21wb25lbnQwIiwiX3JlbmRlciIsImtleSIsImZpcnN0Iiwic2Vjb25kIiwiX3JlbmRlckNvbXBvbmVudDEiLCJfcmVuZGVyMiIsIl9yZW5kZXJDb21wb25lbnQxMCIsIl9yZW5kZXJDb21wb25lbnQxMSIsIl9yZW5kZXJDb21wb25lbnQxMiIsInZhbHVlIiwiX3JlbmRlckNvbXBvbmVudDEzIiwiX3JlbmRlckNvbXBvbmVudDE0IiwiX3JlbmRlckNvbXBvbmVudDE1IiwicGFyc2VJbnQiLCJzdHlsZSIsIndpZHRoIiwidG9CZUdyZWF0ZXJUaGFuT3JFcXVhbCIsIl9yZW5kZXJDb21wb25lbnQxNiIsInRvQmVMZXNzVGhhbiIsIl9yZW5kZXJDb21wb25lbnQxNyIsIl9yZW5kZXJDb21wb25lbnQxOCIsImZpcmVFdmVudCIsImNoYW5nZSIsInRhcmdldCIsIl9yZW5kZXJDb21wb25lbnQxOSIsInRvSGF2ZUJlZW5DYWxsZWQiLCJfcmVuZGVyQ29tcG9uZW50MjAiLCJ3aW5kb3dHb2VzQXdheSIsIndpbmRvdyIsImRpc3BhdGNoRXZlbnQiLCJFdmVudCIsIndpbmRvd0NvbWVzQmFjayIsIl9yZW5kZXJDb21wb25lbnQyMSIsIl9yZW5kZXJDb21wb25lbnQyMiIsImVsc2V3aGVyZSIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImZvY3VzIiwicmVtb3ZlIiwiX3JlbmRlckNvbXBvbmVudDIzIiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJfcmVuZGVyQ29tcG9uZW50MjQiLCJfcmVuZGVyQ29tcG9uZW50MjUiLCJ1c2VGYWtlVGltZXJzIiwiX3JlbmRlckNvbXBvbmVudDI2IiwiYWN0IiwiYWR2YW5jZVRpbWVyc0J5VGltZSIsInRvSGF2ZUJlZW5DYWxsZWRUaW1lcyIsInVzZVJlYWxUaW1lcnMiLCJfcmVuZGVyQ29tcG9uZW50MjciLCJhZnRlckVhY2giLCJfcmVuZGVyQ29tcG9uZW50MjgiLCJfcmVuZGVyQ29tcG9uZW50MjkiLCJhc3NlcnRQb3NpdGlvbiIsInJlY3QiLCJleHBlY3RlZCIsImNvbmNhdCIsImhlaWdodCIsInBvc2l0aW9uIiwidG9FcXVhbCIsImFzc2VydENvb3JkaW5hdGVzIiwicG9zIiwibGVmdCIsInRvcCIsImNvb3JkaW5hdGVzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9tYXJrLWxhYmVsLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFjdCwgZmlyZUV2ZW50LCByZW5kZXIgfSBmcm9tICdAcGllLWxpYi90ZXN0LXV0aWxzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjb29yZGluYXRlcywgTWFya0xhYmVsLCBwb3NpdGlvbiB9IGZyb20gJy4uL21hcmstbGFiZWwnO1xuaW1wb3J0IHsgZ3JhcGhQcm9wcyBhcyBnZXRHcmFwaFByb3BzIH0gZnJvbSAnLi91dGlscyc7XG5cbmRlc2NyaWJlKCdNYXJrTGFiZWwnLCAoKSA9PiB7XG4gIGxldCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgbGV0IGlucHV0UmVmID0gamVzdC5mbigpO1xuICBjb25zdCByZW5kZXJDb21wb25lbnQgPSAoZXh0cmFzKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICBjbGFzc2VzOiB7fSxcbiAgICAgIGNsYXNzTmFtZTogJ2NsYXNzTmFtZScsXG4gICAgICBvbkNoYW5nZSxcbiAgICAgIGlucHV0UmVmLFxuICAgICAgbWFyazogeyB4OiAxLCB5OiAxIH0sXG4gICAgICBncmFwaFByb3BzOiBnZXRHcmFwaFByb3BzKDAsIDEwLCAwLCAxMCksXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMsIC4uLmV4dHJhcyB9O1xuICAgIHJldHVybiByZW5kZXIoPE1hcmtMYWJlbCB7Li4ucHJvcHN9IC8+KTtcbiAgfTtcbiAgZGVzY3JpYmUoJ3JlbmRlcmluZycsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyB3aXRob3V0IGNyYXNoaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICAgIGl0KCdyZW5kZXJzIHdpdGggZGlmZmVyZW50IG1hcmsgcG9zaXRpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFyazogeyB4OiAxMCwgeTogMTAgfSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ01hcmtMYWJlbCAtIGVkaXRpbmcnLCAoKSA9PiB7XG4gIGxldCBvbkNoYW5nZTtcbiAgbGV0IG9uQmx1cjtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICBvbkJsdXIgPSBqZXN0LmZuKCk7XG4gIH0pO1xuXG4gIC8vIHRoZSBsYWJlbCBpbnB1dCBpcyB0aGUgb25seSBpbnB1dCBNYXJrTGFiZWwgcmVuZGVycyAocmVhY3QtaW5wdXQtYXV0b3NpemUpXG4gIGNvbnN0IGlucHV0ID0gKGNvbnRhaW5lcikgPT4gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG5cbiAgY29uc3QgcmVuZGVyQ29tcG9uZW50ID0gKGV4dHJhcykgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgICAgb25DaGFuZ2UsXG4gICAgICBvbkJsdXIsXG4gICAgICBpbnB1dFJlZjogamVzdC5mbigpLFxuICAgICAgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJycgfSxcbiAgICAgIGdyYXBoUHJvcHM6IGdldEdyYXBoUHJvcHMoMCwgMTAsIDAsIDEwKSxcbiAgICB9O1xuICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0cywgLi4uZXh0cmFzIH07XG4gICAgY29uc3QgcmVzdWx0ID0gcmVuZGVyKDxNYXJrTGFiZWwgey4uLnByb3BzfSAvPik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzdWx0LFxuICAgICAgaW5wdXQ6IGlucHV0KHJlc3VsdC5jb250YWluZXIpLFxuICAgICAgcmVyZW5kZXJXaXRoOiAobmV4dCkgPT4gcmVzdWx0LnJlcmVuZGVyKDxNYXJrTGFiZWwgey4uLnByb3BzfSB7Li4ubmV4dH0gLz4pLFxuICAgIH07XG4gIH07XG5cbiAgZGVzY3JpYmUoJ2F1dG9Gb2N1cycsICgpID0+IHtcbiAgICBpdCgnZm9jdXNlcyB0aGUgaW5wdXQgc28gYSBuZXcgbGFiZWwgY2FuIGJlIHR5cGVkIGludG8gcmlnaHQgYXdheScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHJlbmRlckNvbXBvbmVudCh7IGF1dG9Gb2N1czogdHJ1ZSB9KTtcblxuICAgICAgZXhwZWN0KGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLnRvQmUoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2xlYXZlcyB0aGUgY2FyZXQgYXQgdGhlIGVuZCBvZiBhbiBleGlzdGluZyBsYWJlbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHJlbmRlckNvbXBvbmVudCh7IGF1dG9Gb2N1czogdHJ1ZSwgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJ0FCJyB9IH0pO1xuXG4gICAgICBleHBlY3QoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkudG9CZShpbnB1dCk7XG4gICAgICBleHBlY3QoaW5wdXQuc2VsZWN0aW9uU3RhcnQpLnRvQmUoMik7XG4gICAgICBleHBlY3QoaW5wdXQuc2VsZWN0aW9uRW5kKS50b0JlKDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGZvY3VzIHRoZSBpbnB1dCBvZiBhbiBleGlzdGluZyBsYWJlbCB3aGVuIGF1dG9Gb2N1cyBpcyBub3Qgc2V0JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJ0EnIH0gfSk7XG5cbiAgICAgIGV4cGVjdChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS5ub3QudG9CZShpbnB1dCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgZm9jdXMgdGhlIGlucHV0IHdoZW4gZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGlucHV0IH0gPSByZW5kZXJDb21wb25lbnQoeyBhdXRvRm9jdXM6IHRydWUsIGRpc2FibGVkOiB0cnVlLCBtYXJrOiB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnQScgfSB9KTtcblxuICAgICAgZXhwZWN0KGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLm5vdC50b0JlKGlucHV0KTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCBmb2N1cyB0aGUgaW5wdXQgb2YgYSBkaXNhYmxlZCBtYXJrJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgYXV0b0ZvY3VzOiB0cnVlLCBtYXJrOiB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnQScsIGRpc2FibGVkOiB0cnVlIH0gfSk7XG5cbiAgICAgIGV4cGVjdChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS5ub3QudG9CZShpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyB0aGUgZm9jdXMgY2FuIGdvIGF3YXkgd2l0aG91dCB0aGlzIGNvbXBvbmVudCBoZWFyaW5nIGFib3V0IGl0IC0gdGhlIGlucHV0IG5vZGUgZ2V0cyByZXBsYWNlZFxuICAgIC8vIGJ5IGEgcmVuZGVyIGhpZ2hlciB1cCwgc28gbm8gYmx1ciBpcyBmaXJlZCBhbmQgYXV0b0ZvY3VzIGlzIHN0aWxsIG9uXG4gICAgaXQoJ3Rha2VzIHRoZSBmb2N1cyBiYWNrIG9uIHRoZSBuZXh0IHJlbmRlciB3aGlsZSBpdCBpcyBzdGlsbCBiZWluZyBlZGl0ZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGlucHV0LCByZXJlbmRlcldpdGggfSA9IHJlbmRlckNvbXBvbmVudCh7IGF1dG9Gb2N1czogdHJ1ZSwgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJ0EnIH0gfSk7XG5cbiAgICAgIGV4cGVjdChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS50b0JlKGlucHV0KTtcblxuICAgICAgaW5wdXQuYmx1cigpO1xuICAgICAgZXhwZWN0KGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLm5vdC50b0JlKGlucHV0KTtcblxuICAgICAgcmVyZW5kZXJXaXRoKHsgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJ0EnIH0gfSk7XG5cbiAgICAgIGV4cGVjdChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS50b0JlKGlucHV0KTtcbiAgICB9KTtcblxuICAgIGl0KCdsZWF2ZXMgdGhlIGNhcmV0IHdoZXJlIHRoZSB1c2VyIHB1dCBpdCB3aGlsZSB0aGUgaW5wdXQgaGFzIHRoZSBmb2N1cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQsIHJlcmVuZGVyV2l0aCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgYXV0b0ZvY3VzOiB0cnVlLCBtYXJrOiB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnQUJDJyB9IH0pO1xuXG4gICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSgxLCAxKTtcblxuICAgICAgcmVyZW5kZXJXaXRoKHsgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJ0FCQycgfSB9KTtcblxuICAgICAgZXhwZWN0KGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLnRvQmUoaW5wdXQpO1xuICAgICAgZXhwZWN0KGlucHV0LnNlbGVjdGlvblN0YXJ0KS50b0JlKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZvY3VzZXMgdGhlIGlucHV0IG9uY2UgaXQgaXMgbm8gbG9uZ2VyIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyByZXJlbmRlcldpdGgsIGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgYXV0b0ZvY3VzOiB0cnVlLCBkaXNhYmxlZDogdHJ1ZSB9KTtcblxuICAgICAgcmVyZW5kZXJXaXRoKHsgZGlzYWJsZWQ6IGZhbHNlIH0pO1xuXG4gICAgICBleHBlY3QoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkudG9CZShpbnB1dChjb250YWluZXIpKTtcbiAgICB9KTtcblxuICAgIC8vIHRoZSBob3N0IHNhdmVzIHRoZSBtb2RlbCB3aXRoIGFuIGFwaSBjYWxsIGFuZCB0aGUgbW9kZWwgdGhhdCBjb21lcyBiYWNrIGNhbiByZXBsYWNlIHRoZVxuICAgIC8vIGlucHV0IG5vZGUgLSB0aGUgbGFiZWwgaGFzIHRvIGtlZXAgdGhlIGZvY3VzIGFjcm9zcyB0aGF0IHJlbW91bnRcbiAgICBpdCgncmUtZm9jdXNlcyB0aGUgaW5wdXQgd2hlbiBpdCBpcyByZW1vdW50ZWQgd2hpbGUgYmVpbmcgZWRpdGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIGF1dG9Gb2N1czogdHJ1ZSxcbiAgICAgICAgb25DaGFuZ2UsXG4gICAgICAgIGlucHV0UmVmOiBqZXN0LmZuKCksXG4gICAgICAgIG1hcms6IHsgeDogMSwgeTogMSwgbGFiZWw6ICdBJyB9LFxuICAgICAgICBncmFwaFByb3BzOiBnZXRHcmFwaFByb3BzKDAsIDEwLCAwLCAxMCksXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIsIHJlcmVuZGVyIH0gPSByZW5kZXIoPE1hcmtMYWJlbCBrZXk9XCJmaXJzdFwiIHsuLi5wcm9wc30gLz4pO1xuICAgICAgY29uc3QgZmlyc3QgPSBpbnB1dChjb250YWluZXIpO1xuXG4gICAgICBleHBlY3QoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkudG9CZShmaXJzdCk7XG5cbiAgICAgIHJlcmVuZGVyKDxNYXJrTGFiZWwga2V5PVwic2Vjb25kXCIgey4uLnByb3BzfSAvPik7XG4gICAgICBjb25zdCBzZWNvbmQgPSBpbnB1dChjb250YWluZXIpO1xuXG4gICAgICBleHBlY3Qoc2Vjb25kKS5ub3QudG9CZShmaXJzdCk7XG4gICAgICBleHBlY3QoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkudG9CZShzZWNvbmQpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyB0aGUgdG9vbCBhc2tzIGZvciB0aGUgZm9jdXMgd2l0aCBhdXRvRm9jdXMsIGJ1dCBpdHMgc3RhdGUgY2FuIGJlIGdvbmUgYmVmb3JlIHRoZSBpbnB1dCByZW5kZXJzOlxuICAvLyB0aGUgbWFya3MgY29tZSBiYWNrIGZyb20gdGhlIGhvc3QgYXN5bmNocm9ub3VzbHkgYW5kIGNhbiByZW1vdW50IHRoZSB0b29sLiBBbiBlbXB0eSBsYWJlbCBpblxuICAvLyBsYWJlbCBtb2RlIGlzIGEgbGFiZWwgdGhlIHVzZXIgaGFzIGp1c3QgYWRkZWQsIHNvIHRoZSBpbnB1dCBjYW4gdGVsbCBvbiBpdHMgb3duLlxuICBkZXNjcmliZSgnYSBsYWJlbCB0aGF0IHdhcyBqdXN0IGFkZGVkJywgKCkgPT4ge1xuICAgIGl0KCdmb2N1c2VzIGl0c2VsZiB3aXRob3V0IHRoZSB0b29sIGFza2luZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHJlbmRlckNvbXBvbmVudCh7IG1hcms6IHsgeDogMSwgeTogMSwgbGFiZWw6ICcnIH0gfSk7XG5cbiAgICAgIGV4cGVjdChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS50b0JlKGlucHV0KTtcbiAgICB9KTtcblxuICAgIGl0KCdmb2N1c2VzIGl0c2VsZiBhZ2FpbiB3aGVuIGl0IGlzIHJlbW91bnRlZCBiZWZvcmUgaXQgd2FzIHR5cGVkIGludG8nLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgb25DaGFuZ2UsXG4gICAgICAgIG9uQmx1cixcbiAgICAgICAgaW5wdXRSZWY6IGplc3QuZm4oKSxcbiAgICAgICAgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJycgfSxcbiAgICAgICAgZ3JhcGhQcm9wczogZ2V0R3JhcGhQcm9wcygwLCAxMCwgMCwgMTApLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyLCByZXJlbmRlciB9ID0gcmVuZGVyKDxNYXJrTGFiZWwga2V5PVwiZmlyc3RcIiB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGZpcnN0ID0gaW5wdXQoY29udGFpbmVyKTtcblxuICAgICAgcmVyZW5kZXIoPE1hcmtMYWJlbCBrZXk9XCJzZWNvbmRcIiB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IHNlY29uZCA9IGlucHV0KGNvbnRhaW5lcik7XG5cbiAgICAgIGV4cGVjdChzZWNvbmQpLm5vdC50b0JlKGZpcnN0KTtcbiAgICAgIGV4cGVjdChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS50b0JlKHNlY29uZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3RvcHMgY2hhc2luZyB0aGUgZm9jdXMgb25jZSBpdCBoYXMgYmVlbiBsZWZ0JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBpbnB1dCwgcmVyZW5kZXJXaXRoIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnJyB9IH0pO1xuXG4gICAgICBleHBlY3QoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkudG9CZShpbnB1dCk7XG5cbiAgICAgIGlucHV0LmJsdXIoKTtcbiAgICAgIHJlcmVuZGVyV2l0aCh7IG1hcms6IHsgeDogMSwgeTogMSwgbGFiZWw6ICcnIH0gfSk7XG5cbiAgICAgIGV4cGVjdChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS5ub3QudG9CZShpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBvdXRzaWRlIG9mIGxhYmVsIG1vZGUgdGhlIGlucHV0IGlzIGRpc2FibGVkLCB3aGljaCBpcyBob3cgYW4gZW1wdHkgbGFiZWwgdGhhdCB3YXMgbG9hZGVkIHdpdGhcbiAgICAvLyB0aGUgaXRlbSBpcyB0b2xkIGFwYXJ0IGZyb20gb25lIHRoZSB1c2VyIGhhcyBqdXN0IGFkZGVkIC0gbGFiZWwgbW9kZSBhbHdheXMgc3RhcnRzIG9mZlxuICAgIC8vIHRoZSBjb25maWcgZHJhd3MgdGhlIGJhY2tncm91bmQgbWFya3MgaW50byB0aGUgY29ycmVjdCBhbnN3ZXIgZ3JhcGhzIGFzIGRpc2FibGVkIG1hcmtzXG4gICAgaXQoJ2lzIG5vdCByZW5kZXJlZCBhdCBhbGwgd2hpbGUgaXQgY2Fubm90IGJlIGVkaXRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBkaXNhYmxlZDogdHJ1ZSwgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJycgfSB9KTtcblxuICAgICAgZXhwZWN0KGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpKS50b0JlKG51bGwpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIHN0aWxsIHJlbmRlcmVkIHVuZWRpdGFibGUgb25jZSBpdCBoYXMgdGV4dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBkaXNhYmxlZDogdHJ1ZSwgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJ0EnIH0gfSk7XG5cbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignaW5wdXQnKS52YWx1ZSkudG9CZSgnQScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIG5vdCBmb2N1c2VkIHdoZW4gbGFiZWwgbW9kZSBpcyB0dXJuZWQgb24gYWZ0ZXJ3YXJkcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcmVyZW5kZXJXaXRoLCBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGRpc2FibGVkOiB0cnVlLCBtYXJrOiB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnJyB9IH0pO1xuXG4gICAgICByZXJlbmRlcldpdGgoeyBkaXNhYmxlZDogZmFsc2UgfSk7XG5cbiAgICAgIGV4cGVjdChpbnB1dChjb250YWluZXIpKS5ub3QudG9CZShudWxsKTtcbiAgICAgIGV4cGVjdChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS5ub3QudG9CZShpbnB1dChjb250YWluZXIpKTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBub3QgcmVuZGVyZWQgZm9yIGEgZGlzYWJsZWQgbWFyayB3aGlsZSBpdCBpcyBlbXB0eScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnJywgZGlzYWJsZWQ6IHRydWUgfSB9KTtcblxuICAgICAgZXhwZWN0KGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpKS50b0JlKG51bGwpO1xuICAgIH0pO1xuXG4gICAgLy8gYW4gaW5wdXQgc2l6ZWQgdG8gaXRzIGNvbnRlbnQgaXMgMnB4IHdpZGUgd2hpbGUgaXQgaXMgZW1wdHksIGFuZCBjaHJvbWUgcGFpbnRzIHRoZSBjYXJldCBvZlxuICAgIC8vIGFuIGlucHV0IGluc2lkZSBhbiBzdmcgZm9yZWlnbk9iamVjdCBhcyBhIGhhaXJsaW5lIHRoYXQgbmV2ZXIgYmxpbmtzIC0gc28gYW4gZW1wdHkgbGFiZWwgdGhhdFxuICAgIC8vIGhhcyB0aGUgZm9jdXMgaGFzIHRvIGJlIHdpZGUgZW5vdWdoIHRvIGJlIHNlZW4gYXMgYSBib3ggd2FpdGluZyBmb3IgdGV4dFxuICAgIGl0KCdpcyB3aWRlIGVub3VnaCB0byBiZSBzZWVuIHdoaWxlIGl0IGlzIGVtcHR5JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJycgfSB9KTtcblxuICAgICAgZXhwZWN0KHBhcnNlSW50KGlucHV0LnN0eWxlLndpZHRoLCAxMCkpLnRvQmVHcmVhdGVyVGhhbk9yRXF1YWwoMzApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIG9ubHkgYXMgd2lkZSBhcyBpdHMgdGV4dCBvbmNlIGl0IGNhbm5vdCBiZSBlZGl0ZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgZGlzYWJsZWQ6IHRydWUsIG1hcms6IHsgeDogMSwgeTogMSwgbGFiZWw6ICdBJyB9IH0pO1xuXG4gICAgICBleHBlY3QocGFyc2VJbnQoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jykuc3R5bGUud2lkdGgsIDEwKSkudG9CZUxlc3NUaGFuKDMwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3N5bmNpbmcgbWFyay5sYWJlbCBpbnRvIHRoZSBpbnB1dCcsICgpID0+IHtcbiAgICBpdCgncGlja3MgdXAgYSBuZXcgbWFyay5sYWJlbCB3aGlsZSB0aGUgaW5wdXQgZG9lcyBub3QgaGF2ZSB0aGUgZm9jdXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHJlcmVuZGVyV2l0aCwgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnQScgfSB9KTtcblxuICAgICAgcmVyZW5kZXJXaXRoKHsgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJ3VwZGF0ZWQnIH0gfSk7XG5cbiAgICAgIGV4cGVjdChpbnB1dChjb250YWluZXIpLnZhbHVlKS50b0JlKCd1cGRhdGVkJyk7XG4gICAgfSk7XG5cbiAgICAvLyBhIG1hcmsgY29taW5nIGJhY2sgZnJvbSBhbiAoYXN5bmMpIG1vZGVsIHNhdmUgY2FuIGNhcnJ5IGFuIG9sZGVyIGxhYmVsIC0gYXBwbHlpbmcgaXQgd291bGRcbiAgICAvLyB3aXBlIG91dCB0aGUgY2hhcmFjdGVycyB0eXBlZCBpbiB0aGUgbWVhbnRpbWVcbiAgICBpdCgna2VlcHMgd2hhdCB0aGUgdXNlciB0eXBlZCB3aGlsZSB0aGUgaW5wdXQgaGFzIHRoZSBmb2N1cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQsIHJlcmVuZGVyV2l0aCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgYXV0b0ZvY3VzOiB0cnVlIH0pO1xuXG4gICAgICBleHBlY3QoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkudG9CZShpbnB1dCk7XG5cbiAgICAgIGZpcmVFdmVudC5jaGFuZ2UoaW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAnQUInIH0gfSk7XG4gICAgICBleHBlY3QoaW5wdXQudmFsdWUpLnRvQmUoJ0FCJyk7XG5cbiAgICAgIC8vIHRoZSBob3N0IGVjaG9lcyBiYWNrIHRoZSBsYWJlbCBhcyBpdCB3YXMgb25lIGtleXN0cm9rZSBhZ29cbiAgICAgIHJlcmVuZGVyV2l0aCh7IG1hcms6IHsgeDogMSwgeTogMSwgbGFiZWw6ICdBJyB9IH0pO1xuXG4gICAgICBleHBlY3QoaW5wdXQudmFsdWUpLnRvQmUoJ0FCJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIHRoZSBjaGFyYWN0ZXJzIGxhbmQgYXQgdGhlIGRvY3VtZW50J3MgY2FyZXQsIG5vdCBhdCB0aGUgZm9jdXNlZCBub2RlLiBJbiB0aGUgYXV0aG9yaW5nXG4gIC8vIGVudmlyb25tZW50IHRoZSBpbnB1dCBlbmRzIHVwIGZvY3VzZWQgd2l0aCBubyBjYXJldCBhbnl3aGVyZToga2V5cHJlc3MgZmlyZXMgYW5kIG5vdGhpbmcgaXNcbiAgLy8gaW5zZXJ0ZWQuIGpzZG9tIG5ldmVyIHJlcG9ydHMgYSBjYXJldCBlaXRoZXIsIHNvIHRoaXMgaXMgdGhhdCBzdGF0ZSAtIHRoZSBmb2N1cyBjeWNsZSB0aGF0XG4gIC8vIHJlcGFpcnMgaXQgbXVzdCBub3QgaGFuZCB0aGUgbGFiZWwgb3ZlciB0byB0aGUgYmx1ciBoYW5kbGluZy5cbiAgZGVzY3JpYmUoJ2EgZm9jdXNlZCBpbnB1dCB3aXRoIG5vIGNhcmV0JywgKCkgPT4ge1xuICAgIGl0KCdpcyByZXBhaXJlZCB3aXRob3V0IHJlcG9ydGluZyB0aGUgbGFiZWwgYXMgcmVtb3ZlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHJlbmRlckNvbXBvbmVudCh7IGF1dG9Gb2N1czogdHJ1ZSwgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJycgfSB9KTtcblxuICAgICAgZXhwZWN0KGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLnRvQmUoaW5wdXQpO1xuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgZXhwZWN0KG9uQmx1cikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdsZWF2ZXMgdGhlIGNhcmV0IGF0IHRoZSBlbmQgb2YgYSBsYWJlbCB0aGF0IGFscmVhZHkgaGFzIHRleHQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGlucHV0IH0gPSByZW5kZXJDb21wb25lbnQoeyBhdXRvRm9jdXM6IHRydWUsIG1hcms6IHsgeDogMSwgeTogMSwgbGFiZWw6ICdBQicgfSB9KTtcblxuICAgICAgZXhwZWN0KGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLnRvQmUoaW5wdXQpO1xuICAgICAgZXhwZWN0KGlucHV0LnNlbGVjdGlvblN0YXJ0KS50b0JlKDIpO1xuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBjbGlja2luZyBhbm90aGVyIHdpbmRvdywgdGhlIGRldnRvb2xzLCBvciB0aGUgaG9zdCBtb3ZpbmcgdGhlIGZvY3VzIHdoaWxlIGl0IHNhdmVzIHRoZSBtb2RlbDpcbiAgLy8gdGhlIGxhYmVsIGlzIG5vdCBiZWluZyBsZWZ0LCBzbyBpdCBtdXN0IHN1cnZpdmUgYW5kIHRha2UgdGhlIGZvY3VzIGJhY2tcbiAgZGVzY3JpYmUoJ3doaWxlIHRoZSB3aW5kb3cgaXMgYXdheScsICgpID0+IHtcbiAgICBjb25zdCB3aW5kb3dHb2VzQXdheSA9ICgpID0+IHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnYmx1cicpKTtcbiAgICBjb25zdCB3aW5kb3dDb21lc0JhY2sgPSAoKSA9PiB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2ZvY3VzJykpO1xuXG4gICAgaXQoJ2tlZXBzIGFuIGVtcHR5IGxhYmVsIGluc3RlYWQgb2YgcmVwb3J0aW5nIGl0IGFzIHJlbW92ZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGlucHV0IH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnJyB9IH0pO1xuXG4gICAgICB3aW5kb3dHb2VzQXdheSgpO1xuICAgICAgZmlyZUV2ZW50LmJsdXIoaW5wdXQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICBleHBlY3Qob25CbHVyKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rha2VzIHRoZSBmb2N1cyBiYWNrIHdoZW4gdGhlIHdpbmRvdyBjb21lcyBiYWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgYXV0b0ZvY3VzOiB0cnVlLCBtYXJrOiB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnJyB9IH0pO1xuXG4gICAgICAvLyB0aGUgZm9jdXMgaXMgbW92ZWQgdG8gYW5vdGhlciBpbnB1dCByYXRoZXIgdGhhbiB3aXRoIGlucHV0LmJsdXIoKToganNkb20gZmlyZXMgYSB3aW5kb3dcbiAgICAgIC8vIGZvY3VzIGV2ZW50IGFzIHBhcnQgb2YgYmx1cigpLCB3aGljaCBpcyB0aGUgdmVyeSB0aGluZyBiZWluZyB0ZXN0ZWQgaGVyZVxuICAgICAgY29uc3QgZWxzZXdoZXJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcblxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbHNld2hlcmUpO1xuXG4gICAgICB3aW5kb3dHb2VzQXdheSgpO1xuICAgICAgZWxzZXdoZXJlLmZvY3VzKCk7XG4gICAgICBleHBlY3QoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkudG9CZShlbHNld2hlcmUpO1xuXG4gICAgICB3aW5kb3dDb21lc0JhY2soKTtcblxuICAgICAgZXhwZWN0KGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLnRvQmUoaW5wdXQpO1xuXG4gICAgICBlbHNld2hlcmUucmVtb3ZlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3RpbGwgcmVwb3J0cyBhIGxhYmVsIHRoZSB1c2VyIGxlYXZlcyBvbmNlIHRoZSB3aW5kb3cgaXMgYmFjaycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHJlbmRlckNvbXBvbmVudCh7IG1hcms6IHsgeDogMSwgeTogMSwgbGFiZWw6ICcnIH0gfSk7XG5cbiAgICAgIHdpbmRvd0dvZXNBd2F5KCk7XG4gICAgICB3aW5kb3dDb21lc0JhY2soKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGlucHV0KTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvbkJsdXInLCAoKSA9PiB7XG4gICAgaXQoJ2lzIGNhbGxlZCBzbyB0aGUgdG9vbCBzdG9wcyBhdXRvIGZvY3VzaW5nIHRoZSBsYWJlbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHJlbmRlckNvbXBvbmVudCh7IGF1dG9Gb2N1czogdHJ1ZSwgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJ0EnIH0gfSk7XG5cbiAgICAgIGZpcmVFdmVudC5ibHVyKGlucHV0KTtcblxuICAgICAgZXhwZWN0KG9uQmx1cikudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gY2xpY2tpbmcgYSBidXR0b24gb3IgYW55dGhpbmcgZWxzZSBpbnRlcmFjdGl2ZSBibHVycyB0aGUgbGFiZWwgd2hpbGUgdGhlIGRlYm91bmNlIGlzIHBlbmRpbmdcbiAgICBpdCgnc2F2ZXMgd2hhdCB3YXMgdHlwZWQgc3RyYWlnaHQgYXdheScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHJlbmRlckNvbXBvbmVudCh7IG1hcms6IHsgeDogMSwgeTogMSwgbGFiZWw6ICcnIH0gfSk7XG5cbiAgICAgIGZpcmVFdmVudC5jaGFuZ2UoaW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAnQUInIH0gfSk7XG4gICAgICBmaXJlRXZlbnQuYmx1cihpbnB1dCk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ0FCJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3Qgc2F2ZSBpdCB0d2ljZSB3aGVuIHRoZSBkZWJvdW5jZSBjYXRjaGVzIHVwJywgKCkgPT4ge1xuICAgICAgamVzdC51c2VGYWtlVGltZXJzKCk7XG4gICAgICBjb25zdCB7IGlucHV0IH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnJyB9IH0pO1xuXG4gICAgICBmaXJlRXZlbnQuY2hhbmdlKGlucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJ0FCJyB9IH0pO1xuICAgICAgZmlyZUV2ZW50LmJsdXIoaW5wdXQpO1xuICAgICAgYWN0KCgpID0+IGplc3QuYWR2YW5jZVRpbWVyc0J5VGltZSgxMDAwKSk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnQUInKTtcbiAgICAgIGplc3QudXNlUmVhbFRpbWVycygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlcG9ydHMgYW4gZW1wdHkgbGFiZWwgb24gYmx1cicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHJlbmRlckNvbXBvbmVudCh7IG1hcms6IHsgeDogMSwgeTogMSwgbGFiZWw6ICdBJyB9IH0pO1xuXG4gICAgICBmaXJlRXZlbnQuY2hhbmdlKGlucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJycgfSB9KTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGlucHV0KTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkZWJvdW5jZScsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IGplc3QudXNlRmFrZVRpbWVycygpKTtcbiAgICBhZnRlckVhY2goKCkgPT4gamVzdC51c2VSZWFsVGltZXJzKCkpO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlcG9ydCB0aGUgdHlwZWQgbGFiZWwgYmVmb3JlIHRoZSBkZWJvdW5jZSBkZWxheSBlbGFwc2VzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgYXV0b0ZvY3VzOiB0cnVlIH0pO1xuXG4gICAgICBmaXJlRXZlbnQuY2hhbmdlKGlucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJ0EnIH0gfSk7XG5cbiAgICAgIGFjdCgoKSA9PiBqZXN0LmFkdmFuY2VUaW1lcnNCeVRpbWUoNDk5KSk7XG4gICAgICBleHBlY3Qob25DaGFuZ2UpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG5cbiAgICAgIGFjdCgoKSA9PiBqZXN0LmFkdmFuY2VUaW1lcnNCeVRpbWUoMSkpO1xuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnQScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlcG9ydHMgdGhlIGxhYmVsIG9uY2UgZm9yIGEgYnVyc3Qgb2Yga2V5c3Ryb2tlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHJlbmRlckNvbXBvbmVudCh7IGF1dG9Gb2N1czogdHJ1ZSB9KTtcblxuICAgICAgZmlyZUV2ZW50LmNoYW5nZShpbnB1dCwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdBJyB9IH0pO1xuICAgICAgYWN0KCgpID0+IGplc3QuYWR2YW5jZVRpbWVyc0J5VGltZSgzMDApKTtcbiAgICAgIGZpcmVFdmVudC5jaGFuZ2UoaW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAnQUInIH0gfSk7XG4gICAgICBhY3QoKCkgPT4gamVzdC5hZHZhbmNlVGltZXJzQnlUaW1lKDMwMCkpO1xuICAgICAgZmlyZUV2ZW50LmNoYW5nZShpbnB1dCwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdBQkMnIH0gfSk7XG4gICAgICBhY3QoKCkgPT4gamVzdC5hZHZhbmNlVGltZXJzQnlUaW1lKDUwMCkpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ0FCQycpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgncG9zaXRpb24nLCAoKSA9PiB7XG4gIGNvbnN0IGFzc2VydFBvc2l0aW9uID0gKG1hcmssIHJlY3QsIGV4cGVjdGVkKSA9PiB7XG4gICAgaXQoYCR7bWFyay54fSwke21hcmsueX0gKyAke3JlY3Qud2lkdGh9LCR7cmVjdC5oZWlnaHR9ID0+ICR7ZXhwZWN0ZWR9YCwgKCkgPT4ge1xuICAgICAgLy8gd2Ugc2V0IHJhbmdlLm1pbiB0byBhIHZhbHVlIGJlY2F1c2UgaW4gcGl4ZWxzIC0gdGhlIGdyZWF0ZXIgdGhlIFkgdGhlIGxvd2VyIGRvd24gb24gdGhlIHNjcmVlbi5cbiAgICAgIGNvbnN0IGdyYXBoUHJvcHMgPSBnZXRHcmFwaFByb3BzKDAsIDEyLCAxMiwgMCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBwb3NpdGlvbihncmFwaFByb3BzLCBtYXJrLCByZWN0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9O1xuXG4gIGFzc2VydFBvc2l0aW9uKHsgeDogMCwgeTogMCB9LCB7IHdpZHRoOiAxMCwgaGVpZ2h0OiAxMCB9LCAndG9wLWxlZnQnKTtcbiAgYXNzZXJ0UG9zaXRpb24oeyB4OiAwLCB5OiAwIH0sIHsgd2lkdGg6IDEsIGhlaWdodDogMSB9LCAnYm90dG9tLXJpZ2h0Jyk7XG4gIGFzc2VydFBvc2l0aW9uKHsgeDogMCwgeTogMCB9LCB7IHdpZHRoOiAxMCwgaGVpZ2h0OiAwIH0sICdib3R0b20tbGVmdCcpO1xuICBhc3NlcnRQb3NpdGlvbih7IHg6IDAsIHk6IDAgfSwgeyB3aWR0aDogMCwgaGVpZ2h0OiAxMCB9LCAndG9wLXJpZ2h0Jyk7XG59KTtcblxuZGVzY3JpYmUoJ2Nvb3JkaW5hdGVzJywgKCkgPT4ge1xuICBjb25zdCBhc3NlcnRDb29yZGluYXRlcyA9IChtYXJrLCByZWN0LCBwb3MsIGV4cGVjdGVkKSA9PiB7XG4gICAgaXQoYCR7bWFyay54fSwgJHttYXJrLnl9IC0+ICR7cG9zfSA9ICR7ZXhwZWN0ZWQubGVmdH0sICR7ZXhwZWN0ZWQudG9wfWAsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvb3JkaW5hdGVzKGdldEdyYXBoUHJvcHMoKSwgbWFyaywgcmVjdCwgcG9zKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9O1xuICBhc3NlcnRDb29yZGluYXRlcyh7IHg6IDAsIHk6IDAgfSwgeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0sICd0b3AtbGVmdCcsIHsgbGVmdDogLTUsIHRvcDogLTUgfSk7XG4gIGFzc2VydENvb3JkaW5hdGVzKHsgeDogMCwgeTogMCB9LCB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSwgJ2JvdHRvbS1sZWZ0JywgeyBsZWZ0OiAtNSwgdG9wOiA1IH0pO1xuICBhc3NlcnRDb29yZGluYXRlcyh7IHg6IDAsIHk6IDAgfSwgeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0sICd0b3AtcmlnaHQnLCB7IGxlZnQ6IDUsIHRvcDogLTUgfSk7XG4gIGFzc2VydENvb3JkaW5hdGVzKHsgeDogMCwgeTogMCB9LCB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSwgJ2JvdHRvbS1yaWdodCcsIHtcbiAgICBsZWZ0OiA1LFxuICAgIHRvcDogNSxcbiAgfSk7XG59KTtcbiJdLCJt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