mis-crystal-design-system 18.1.7-signal-16-test → 18.1.7

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 (38) hide show
  1. package/async-search-dropdown/async-dropdown.component.d.ts +44 -3
  2. package/daterangepicker_v2/tz-drp-container/tz-drp-container.component.d.ts +9 -2
  3. package/esm2022/async-search-dropdown/async-dropdown.component.mjs +147 -37
  4. package/esm2022/datepicker_v2/tz-dp-container/tz-dp-container.component.mjs +35 -22
  5. package/esm2022/daterangepicker_v2/tz-daterangepicker.directive.mjs +6 -3
  6. package/esm2022/daterangepicker_v2/tz-drp-container/tz-drp-container.component.mjs +270 -187
  7. package/esm2022/dynamic-form/dynamic-form.component.mjs +30 -21
  8. package/esm2022/loader/loader.component.mjs +12 -6
  9. package/esm2022/slider/slider.component.mjs +2 -2
  10. package/esm2022/table/sort-icons.directive.mjs +24 -5
  11. package/esm2022/table/table.component.mjs +200 -93
  12. package/esm2022/table/table.module.mjs +7 -5
  13. package/esm2022/timepicker/timepicker.component.mjs +41 -14
  14. package/esm2022/timerangepicker/timerangepicker.component.mjs +73 -23
  15. package/fesm2022/mis-crystal-design-system-async-search-dropdown.mjs +146 -36
  16. package/fesm2022/mis-crystal-design-system-async-search-dropdown.mjs.map +1 -1
  17. package/fesm2022/mis-crystal-design-system-datepicker_v2.mjs +34 -21
  18. package/fesm2022/mis-crystal-design-system-datepicker_v2.mjs.map +1 -1
  19. package/fesm2022/mis-crystal-design-system-daterangepicker_v2.mjs +274 -188
  20. package/fesm2022/mis-crystal-design-system-daterangepicker_v2.mjs.map +1 -1
  21. package/fesm2022/mis-crystal-design-system-dynamic-form.mjs +29 -20
  22. package/fesm2022/mis-crystal-design-system-dynamic-form.mjs.map +1 -1
  23. package/fesm2022/mis-crystal-design-system-loader.mjs +11 -5
  24. package/fesm2022/mis-crystal-design-system-loader.mjs.map +1 -1
  25. package/fesm2022/mis-crystal-design-system-slider.mjs +2 -2
  26. package/fesm2022/mis-crystal-design-system-slider.mjs.map +1 -1
  27. package/fesm2022/mis-crystal-design-system-table.mjs +227 -99
  28. package/fesm2022/mis-crystal-design-system-table.mjs.map +1 -1
  29. package/fesm2022/mis-crystal-design-system-timepicker.mjs +40 -13
  30. package/fesm2022/mis-crystal-design-system-timepicker.mjs.map +1 -1
  31. package/fesm2022/mis-crystal-design-system-timerangepicker.mjs +72 -22
  32. package/fesm2022/mis-crystal-design-system-timerangepicker.mjs.map +1 -1
  33. package/loader/loader.component.d.ts +7 -1
  34. package/package.json +18 -18
  35. package/table/table.component.d.ts +16 -4
  36. package/table/table.module.d.ts +2 -1
  37. package/timepicker/timepicker.component.d.ts +3 -1
  38. package/timerangepicker/timerangepicker.component.d.ts +5 -1
@@ -1,4 +1,4 @@
1
- import { Component, HostListener, Inject, signal, computed, effect } from "@angular/core";
1
+ import { Component, HostListener, Inject, signal, computed } from "@angular/core";
2
2
  import { CONTAINER_DATA, DATE_FORMAT } from "../daterangepicker-constants";
3
3
  import { getMonth } from "../utils";
4
4
  import dayjs from 'dayjs';
@@ -194,6 +194,57 @@ dayjs.extend(customParseFormat);
194
194
  dayjs.extend(isSameOrAfter);
195
195
  dayjs.extend(isSameOrBefore);
196
196
  export class TzDrpContainerComponent {
197
+ /**
198
+ * Parse date string using configured format with fallback
199
+ */
200
+ parseDateWithMultipleFormats(dateString) {
201
+ if (!dateString || dateString === 'Invalid Date' || dateString === 'undefined' || dateString === 'null') {
202
+ return dayjs('invalid');
203
+ }
204
+ // First try the configured format
205
+ const configuredFormat = this.data().dpConfig?.format;
206
+ if (configuredFormat) {
207
+ try {
208
+ const parsed = dayjs(dateString, configuredFormat);
209
+ if (parsed.isValid()) {
210
+ return parsed;
211
+ }
212
+ }
213
+ catch (error) {
214
+ // Continue to fallback formats
215
+ }
216
+ }
217
+ // Fallback to common formats if configured format fails
218
+ const fallbackFormats = [
219
+ 'DD/MMM/YYYY',
220
+ 'DD/MM/YYYY',
221
+ 'DD-MMM-YYYY',
222
+ 'DD-MM-YYYY',
223
+ 'YYYY-MM-DD'
224
+ ];
225
+ for (const format of fallbackFormats) {
226
+ try {
227
+ const parsed = dayjs(dateString, format);
228
+ if (parsed.isValid()) {
229
+ return parsed;
230
+ }
231
+ }
232
+ catch (error) {
233
+ // Continue to next format
234
+ }
235
+ }
236
+ // If all formats fail, try parsing without format (let dayjs guess)
237
+ try {
238
+ const parsed = dayjs(dateString);
239
+ if (parsed.isValid()) {
240
+ return parsed;
241
+ }
242
+ }
243
+ catch (error) {
244
+ console.warn('Failed to parse date with any format:', dateString, error);
245
+ }
246
+ return dayjs('invalid');
247
+ }
197
248
  constructor(injectedData, toast) {
198
249
  this.injectedData = injectedData;
199
250
  this.toast = toast;
@@ -298,35 +349,10 @@ export class TzDrpContainerComponent {
298
349
  format: DATE_FORMAT
299
350
  };
300
351
  }
301
- effect(() => {
302
- const localSelectedDates = this.localSelectedDatesSignal();
303
- let selectedStartDate;
304
- if (localSelectedDates?.startDate) {
305
- // Use the robust helper for parsing
306
- selectedStartDate = this.parseDateWithMultipleFormats(localSelectedDates.startDate);
307
- }
308
- else {
309
- selectedStartDate = dayjs('invalid');
310
- }
311
- if (selectedStartDate.isValid()) {
312
- this.currentYearNumberSignal.set(selectedStartDate.year());
313
- this.nextYearNumberSignal.set(selectedStartDate.add(1, "month").year());
314
- this.currentMonthNumberSignal.set(selectedStartDate.get("month"));
315
- this.nextMonthNumberSignal.set(selectedStartDate.add(1, "month").month());
316
- const selectedEndDate = localSelectedDates?.endDate ? this.parseDateWithMultipleFormats(localSelectedDates.endDate) : null;
317
- // Logic for next month being set by end date
318
- if (selectedEndDate && selectedEndDate.isValid() && selectedEndDate.isAfter(selectedStartDate, 'month')) {
319
- this.nextMonthNumberSignal.set(selectedEndDate.month());
320
- this.nextYearNumberSignal.set(selectedEndDate.year());
321
- }
322
- // Update calendar dates to reflect the selected dates
323
- this.currentMonthDatesSignal.set(this.generateDates(this.currentMonthNumberSignal(), this.currentYearNumberSignal()));
324
- this.nextMonthDatesSignal.set(this.generateDates(this.nextMonthNumberSignal(), this.nextYearNumberSignal()));
325
- }
326
- }, { allowSignalWrites: true });
352
+ // Update calendar from initial selected dates
353
+ this.updateCalendarFromSelectedDates();
327
354
  }
328
355
  ngOnInit() {
329
- console.log('ngOnInit');
330
356
  this.calculateMinMaxDays();
331
357
  this.initializeTimeValues();
332
358
  if (this.data()?.showPrevMonth && !this.isPreviousMonthDisabled) {
@@ -360,8 +386,8 @@ export class TzDrpContainerComponent {
360
386
  }
361
387
  this.currentMonthNumberSignal.set(thisMonth.month());
362
388
  this.nextMonthNumberSignal.set(thisMonth.clone().add(1, "month").month());
363
- this.currentMonthSignal.set(getMonth(this.currentMonthNumber()));
364
- this.nextMonthSignal.set(getMonth(this.nextMonthNumber()));
389
+ this.currentMonthSignal.set(getMonth(this.currentMonthNumberSignal()));
390
+ this.nextMonthSignal.set(getMonth(this.nextMonthNumberSignal()));
365
391
  if (this.nextMonthNumberSignal() === 0 && direction === "PREVIOUS") {
366
392
  this.currentYearNumberSignal.set(this.currentYearNumberSignal() - 1);
367
393
  }
@@ -381,46 +407,36 @@ export class TzDrpContainerComponent {
381
407
  this.nextMonthDatesSignal.set(this.generateDates(this.nextMonthNumber(), this.nextYearNumber()));
382
408
  this.calculateMinMaxDays();
383
409
  }
384
- parseDateWithMultipleFormats(dateString) {
385
- if (!dateString || dateString === 'Invalid Date' || dateString === 'undefined' || dateString === 'null') {
386
- return dayjs('invalid');
387
- }
388
- const configuredFormat = this.data()?.dpConfig?.format;
389
- if (configuredFormat) {
390
- try {
391
- const parsed = dayjs(dateString, configuredFormat);
392
- if (parsed.isValid()) {
393
- return parsed;
394
- }
395
- }
396
- catch (error) {
397
- // Continue to fallback formats
398
- }
410
+ /**
411
+ * Update calendar month/year based on selected dates
412
+ * This method is called whenever localSelectedDatesSignal changes to keep calendar in sync
413
+ */
414
+ updateCalendarFromSelectedDates() {
415
+ const localSelectedDates = this.localSelectedDatesSignal();
416
+ let selectedStartDate;
417
+ if (localSelectedDates?.startDate) {
418
+ selectedStartDate = this.parseDateWithMultipleFormats(localSelectedDates.startDate);
399
419
  }
400
- const fallbackFormats = [
401
- 'DD/MMM/YYYY', 'DD/MM/YYYY', 'DD-MMM-YYYY', 'DD-MM-YYYY', 'YYYY-MM-DD'
402
- ];
403
- for (const format of fallbackFormats) {
404
- try {
405
- const parsed = dayjs(dateString, format);
406
- if (parsed.isValid()) {
407
- return parsed;
408
- }
409
- }
410
- catch (error) {
411
- // Continue to next format
412
- }
420
+ else {
421
+ selectedStartDate = dayjs('invalid');
413
422
  }
414
- try {
415
- const parsed = dayjs(dateString);
416
- if (parsed.isValid()) {
417
- return parsed;
423
+ if (selectedStartDate.isValid()) {
424
+ this.currentYearNumberSignal.set(selectedStartDate.year());
425
+ this.nextYearNumberSignal.set(selectedStartDate.add(1, "month").year());
426
+ this.currentMonthNumberSignal.set(selectedStartDate.get("month"));
427
+ this.nextMonthNumberSignal.set(selectedStartDate.add(1, "month").month());
428
+ const selectedEndDate = localSelectedDates?.endDate ? this.parseDateWithMultipleFormats(localSelectedDates.endDate) : null;
429
+ if (selectedEndDate && selectedEndDate.isValid() && selectedEndDate.isAfter(selectedStartDate, 'month')) {
430
+ this.nextMonthNumberSignal.set(selectedEndDate.month());
431
+ this.nextYearNumberSignal.set(selectedEndDate.year());
418
432
  }
433
+ // Update month labels
434
+ this.currentMonthSignal.set(getMonth(this.currentMonthNumberSignal()));
435
+ this.nextMonthSignal.set(getMonth(this.nextMonthNumberSignal()));
436
+ // Update calendar dates to reflect the selected dates
437
+ this.currentMonthDatesSignal.set(this.generateDates(this.currentMonthNumberSignal(), this.currentYearNumberSignal()));
438
+ this.nextMonthDatesSignal.set(this.generateDates(this.nextMonthNumberSignal(), this.nextYearNumberSignal()));
419
439
  }
420
- catch (error) {
421
- console.warn('Failed to parse date with any format:', dateString, error);
422
- }
423
- return dayjs('invalid');
424
440
  }
425
441
  generateDates(month, currentYearNumber) {
426
442
  let dates = [];
@@ -472,13 +488,38 @@ export class TzDrpContainerComponent {
472
488
  const isCurrentDay = this.dayjsInstance().year(currentYearNumber).month(month).date(currentDate).format(this.data().dpConfig.format) ===
473
489
  this.dayjsInstance().format(this.data().dpConfig.format);
474
490
  // Extract date part for comparison (handle both date-only and datetime formats)
475
- const startDateString = (this.localSelectedDatesSignal()?.startDate && typeof this.localSelectedDatesSignal()?.startDate === 'string')
476
- ? this.localSelectedDatesSignal().startDate.split(' ')[0]
477
- : this.localSelectedDatesSignal()?.startDate;
478
- const endDateString = (this.localSelectedDatesSignal()?.endDate && typeof this.localSelectedDatesSignal()?.endDate === 'string')
479
- ? this.localSelectedDatesSignal().endDate.split(' ')[0]
480
- : this.localSelectedDatesSignal()?.endDate;
481
- // Use the custom format for comparison instead of hardcoded DD/MM/YYYY
491
+ let startDateString = this.localSelectedDatesSignal()?.startDate;
492
+ let endDateString = this.localSelectedDatesSignal()?.endDate;
493
+ // Only extract date part if the format contains time components
494
+ if (this.data().dpConfig.format.includes('HH') || this.data().dpConfig.format.includes('mm') || this.data().dpConfig.format.includes('A')) {
495
+ // For datetime formats, we need to extract just the date part
496
+ // Try to parse the full string and then format it as date-only for comparison
497
+ if (startDateString) {
498
+ const parsedStart = this.parseDateWithMultipleFormats(startDateString);
499
+ if (parsedStart.isValid()) {
500
+ // Extract date part by finding the time boundary - handle spaces in date part
501
+ const timeStartMatch = this.data().dpConfig.format.match(/(\s+)(HH|mm|ss|A|a)/);
502
+ if (timeStartMatch) {
503
+ const timeStartIndex = this.data().dpConfig.format.indexOf(timeStartMatch[0]);
504
+ const dateOnlyFormat = this.data().dpConfig.format.substring(0, timeStartIndex);
505
+ startDateString = parsedStart.format(dateOnlyFormat);
506
+ }
507
+ }
508
+ }
509
+ if (endDateString) {
510
+ const parsedEnd = this.parseDateWithMultipleFormats(endDateString);
511
+ if (parsedEnd.isValid()) {
512
+ // Extract date part by finding the time boundary - handle spaces in date part
513
+ const timeStartMatch = this.data().dpConfig.format.match(/(\s+)(HH|mm|ss|A|a)/);
514
+ if (timeStartMatch) {
515
+ const timeStartIndex = this.data().dpConfig.format.indexOf(timeStartMatch[0]);
516
+ const dateOnlyFormat = this.data().dpConfig.format.substring(0, timeStartIndex);
517
+ endDateString = parsedEnd.format(dateOnlyFormat);
518
+ }
519
+ }
520
+ }
521
+ }
522
+ // Parse the selected dates to get proper dayjs instances for comparison
482
523
  const startDateParsed = startDateString ? this.parseDateWithMultipleFormats(startDateString) : null;
483
524
  const endDateParsed = endDateString ? this.parseDateWithMultipleFormats(endDateString) : null;
484
525
  const isSelectedStartDay = !isDisabledDay &&
@@ -489,7 +530,7 @@ export class TzDrpContainerComponent {
489
530
  endDateParsed &&
490
531
  endDateParsed.isValid() &&
491
532
  date.isSame(endDateParsed, 'day');
492
- // For range calculation, parse dates properly using custom format
533
+ // For range calculation, use the already parsed dates
493
534
  const isAfterSelectedStartDate = startDateParsed ? this.dayjsInstance(date).isAfter(startDateParsed, "day") : false;
494
535
  const isBeforeSelectedEndDate = endDateParsed ? this.dayjsInstance(date).isBefore(endDateParsed, "day") : false;
495
536
  const inRangeDay = startDateParsed && endDateParsed &&
@@ -513,93 +554,143 @@ export class TzDrpContainerComponent {
513
554
  return dates;
514
555
  }
515
556
  selectDay(from, day) {
516
- if (day.date <= 0) {
557
+ if (day.date <= 0)
517
558
  return;
518
- }
519
559
  if (!day.isDisabledDay) {
520
560
  this.selectedItemLabelSignal.set(this.CUSTOM_RANGE_LABEL);
521
- // Calculate the day being selected
522
- const dayjsDay = dayjs()
523
- .year(from === "LEFT" ? this.currentYearNumberSignal() : this.nextYearNumberSignal())
524
- .month(from === "LEFT" ? this.currentMonthNumberSignal() : this.nextMonthNumberSignal())
525
- .date(day.date);
526
- let formattedDate = dayjsDay.format(this.data().dpConfig.format);
527
- this.localSelectedDatesSignal.update(current => {
528
- let updatedDates = { ...current };
529
- // Start Date for comparison (using helper for robust check)
530
- const startDate = current.startDate ? this.parseDateWithMultipleFormats(current.startDate) : null;
531
- // FIX 4: Append time if enabled
532
- if (this.data().dpConfig.enableTime === true) {
533
- // The time is set to NOW, as per original non-signal component's logic
534
- formattedDate = this.appendCurrentTime(dayjsDay);
535
- }
536
- if (this.selectionStarted()) {
537
- // If the selected date is the same as the start date (New in your previous signal code, but valid)
538
- if (startDate && dayjsDay.isSame(startDate, "day")) {
539
- this.selectionStartedSignal.set(false);
540
- this.isDatesValidSignal.set(true); // Manually setting validity (can be computed later)
541
- return {
542
- startDate: formattedDate,
543
- endDate: formattedDate,
544
- selectedRangeLabel: this.CUSTOM_RANGE_LABEL
545
- };
546
- }
547
- // If the selected date is before the start date, make it the new start date
548
- if (startDate && dayjsDay.isBefore(startDate, "day")) {
549
- // Start selection over
550
- this.selectionStartedSignal.set(true);
551
- this.isDatesValidSignal.set(false);
552
- return {
553
- startDate: formattedDate,
554
- endDate: null,
555
- selectedRangeLabel: this.CUSTOM_RANGE_LABEL
556
- };
561
+ if (this.selectionStartedSignal()) {
562
+ const dayjsDay = dayjs()
563
+ .year(from === "LEFT" ? this.currentYearNumberSignal() : this.nextYearNumberSignal())
564
+ .month(from === "LEFT" ? this.currentMonthNumberSignal() : this.nextMonthNumberSignal())
565
+ .date(day.date);
566
+ // Extract date part from existing start date for comparison
567
+ let startDateString = this.localSelectedDatesSignal().startDate;
568
+ // Only extract date part if the format contains time components
569
+ if (this.data().dpConfig.format.includes('HH') || this.data().dpConfig.format.includes('mm') || this.data().dpConfig.format.includes('A')) {
570
+ // For datetime formats, we need to extract just the date part
571
+ // Try to parse the full string and then format it as date-only for comparison
572
+ if (startDateString) {
573
+ const parsedStart = this.parseDateWithMultipleFormats(startDateString);
574
+ if (parsedStart.isValid()) {
575
+ // Extract date part by finding the time boundary - handle spaces in date part
576
+ const timeStartMatch = this.data().dpConfig.format.match(/(\s+)(HH|mm|ss|A|a)/);
577
+ if (timeStartMatch) {
578
+ const timeStartIndex = this.data().dpConfig.format.indexOf(timeStartMatch[0]);
579
+ const dateOnlyFormat = this.data().dpConfig.format.substring(0, timeStartIndex);
580
+ startDateString = parsedStart.format(dateOnlyFormat);
581
+ }
582
+ }
557
583
  }
558
- // End selection
559
- this.selectionStartedSignal.set(false);
560
- this.isDatesValidSignal.set(true);
561
- return {
562
- ...current,
563
- endDate: formattedDate,
564
- selectedRangeLabel: this.CUSTOM_RANGE_LABEL
565
- };
566
584
  }
567
- else {
568
- // Start selection
569
- this.selectionStartedSignal.set(true);
570
- this.isDatesValidSignal.set(false);
571
- return {
585
+ const startDate = startDateString ? this.parseDateWithMultipleFormats(startDateString) : null;
586
+ // If the selected date is before the start date, make it the new start date
587
+ if (startDate && dayjsDay.isBefore(startDate, "day")) {
588
+ let formattedDate = dayjsDay.format(this.data().dpConfig.format);
589
+ // If time is enabled, append current time to the date
590
+ if (this.data().dpConfig.enableTime === true) {
591
+ const now = dayjs();
592
+ // Extract date part from the configured format - handle spaces in date part
593
+ // Look for the pattern where time starts (HH, mm, ss, A, a)
594
+ const timeStartMatch = this.data().dpConfig.format.match(/(\s+)(HH|mm|ss|A|a)/);
595
+ if (timeStartMatch) {
596
+ const timeStartIndex = this.data().dpConfig.format.indexOf(timeStartMatch[0]);
597
+ const dateOnlyFormat = this.data().dpConfig.format.substring(0, timeStartIndex);
598
+ const timeOnlyFormat = this.data().dpConfig.format.substring(timeStartIndex + timeStartMatch[1].length);
599
+ const dateString = dayjsDay.format(dateOnlyFormat);
600
+ const timeString = now.format(timeOnlyFormat);
601
+ formattedDate = dateString + timeStartMatch[1] + timeString;
602
+ }
603
+ else {
604
+ // Fallback if no time pattern found
605
+ formattedDate = dayjsDay.format(this.data().dpConfig.format);
606
+ }
607
+ }
608
+ this.localSelectedDatesSignal.set({
572
609
  startDate: formattedDate,
573
610
  endDate: null,
574
611
  selectedRangeLabel: this.CUSTOM_RANGE_LABEL
575
- };
612
+ });
613
+ this.updateCalendarFromSelectedDates();
614
+ return;
576
615
  }
577
- });
578
- // The date arrays are COMPUTED, so no need for manual set()
579
- this.isDatesValidSignal.set(!!(this.localSelectedDatesSignal().startDate && this.localSelectedDatesSignal().endDate));
616
+ this.selectionStartedSignal.set(false);
617
+ let formattedEndDate = dayjsDay.format(this.data().dpConfig.format);
618
+ // If time is enabled, append current time to the date
619
+ if (this.data().dpConfig.enableTime === true) {
620
+ const now = dayjs();
621
+ // Extract date part from the configured format - handle spaces in date part
622
+ // Look for the pattern where time starts (HH, mm, ss, A, a)
623
+ const timeStartMatch = this.data().dpConfig.format.match(/(\s+)(HH|mm|ss|A|a)/);
624
+ if (timeStartMatch) {
625
+ const timeStartIndex = this.data().dpConfig.format.indexOf(timeStartMatch[0]);
626
+ const dateOnlyFormat = this.data().dpConfig.format.substring(0, timeStartIndex);
627
+ const timeOnlyFormat = this.data().dpConfig.format.substring(timeStartIndex + timeStartMatch[1].length);
628
+ const dateString = dayjsDay.format(dateOnlyFormat);
629
+ const timeString = now.format(timeOnlyFormat);
630
+ formattedEndDate = dateString + timeStartMatch[1] + timeString;
631
+ }
632
+ else {
633
+ // Fallback if no time pattern found
634
+ formattedEndDate = dayjsDay.format(this.data().dpConfig.format);
635
+ }
636
+ }
637
+ this.localSelectedDatesSignal.set({
638
+ ...this.localSelectedDatesSignal(),
639
+ endDate: formattedEndDate,
640
+ selectedRangeLabel: this.CUSTOM_RANGE_LABEL
641
+ });
642
+ this.updateCalendarFromSelectedDates();
643
+ }
644
+ else {
645
+ this.selectionStartedSignal.set(true);
646
+ let formattedStartDate = dayjs()
647
+ .year(from === "LEFT" ? this.currentYearNumberSignal() : this.nextYearNumberSignal())
648
+ .month(from === "LEFT" ? this.currentMonthNumberSignal() : this.nextMonthNumberSignal())
649
+ .date(day.date)
650
+ .format(this.data().dpConfig.format);
651
+ // If time is enabled, append current time to the date
652
+ if (this.data().dpConfig.enableTime === true) {
653
+ const now = dayjs();
654
+ // Extract date part from the configured format - handle spaces in date part
655
+ // Look for the pattern where time starts (HH, mm, ss, A, a)
656
+ const timeStartMatch = this.data().dpConfig.format.match(/(\s+)(HH|mm|ss|A|a)/);
657
+ if (timeStartMatch) {
658
+ const timeStartIndex = this.data().dpConfig.format.indexOf(timeStartMatch[0]);
659
+ const dateOnlyFormat = this.data().dpConfig.format.substring(0, timeStartIndex);
660
+ const timeOnlyFormat = this.data().dpConfig.format.substring(timeStartIndex + timeStartMatch[1].length);
661
+ const dateString = dayjs()
662
+ .year(from === "LEFT" ? this.currentYearNumberSignal() : this.nextYearNumberSignal())
663
+ .month(from === "LEFT" ? this.currentMonthNumberSignal() : this.nextMonthNumberSignal())
664
+ .date(day.date)
665
+ .format(dateOnlyFormat);
666
+ const timeString = now.format(timeOnlyFormat);
667
+ formattedStartDate = dateString + timeStartMatch[1] + timeString;
668
+ }
669
+ else {
670
+ // Fallback if no time pattern found
671
+ formattedStartDate = dayjs()
672
+ .year(from === "LEFT" ? this.currentYearNumberSignal() : this.nextYearNumberSignal())
673
+ .month(from === "LEFT" ? this.currentMonthNumberSignal() : this.nextMonthNumberSignal())
674
+ .date(day.date)
675
+ .format(this.data().dpConfig.format);
676
+ }
677
+ }
678
+ this.localSelectedDatesSignal.set({
679
+ startDate: formattedStartDate,
680
+ endDate: null,
681
+ selectedRangeLabel: this.CUSTOM_RANGE_LABEL
682
+ });
683
+ this.updateCalendarFromSelectedDates();
684
+ }
685
+ this.isDatesValidSignal.set(false);
686
+ if (this.localSelectedDatesSignal().startDate && this.localSelectedDatesSignal().endDate) {
687
+ this.isDatesValidSignal.set(true);
688
+ }
580
689
  }
581
690
  if (day.toastMessage) {
582
691
  this.toast.displayMsg(day.toastMessage, 4000);
583
692
  }
584
693
  }
585
- // Helper method to append current time (replicates original selectDay complex formatting logic)
586
- appendCurrentTime(date) {
587
- if (!this.data().dpConfig.enableTime)
588
- return date.format(this.data().dpConfig.format);
589
- // This complex formatting logic must be replicated exactly for backward compatibility
590
- const now = dayjs();
591
- const timeStartMatch = this.data().dpConfig.format.match(/(\s+)(HH|mm|ss|A|a)/);
592
- if (timeStartMatch) {
593
- const timeStartIndex = this.data().dpConfig.format.indexOf(timeStartMatch[0]);
594
- const dateOnlyFormat = this.data().dpConfig.format.substring(0, timeStartIndex);
595
- const timeOnlyFormat = this.data().dpConfig.format.substring(timeStartIndex + timeStartMatch[1].length);
596
- const dateString = date.format(dateOnlyFormat);
597
- const timeString = now.format(timeOnlyFormat);
598
- return dateString + timeStartMatch[1] + timeString;
599
- }
600
- // Fallback if no time pattern found
601
- return date.format(this.data().dpConfig.format);
602
- }
603
694
  selectRange(item) {
604
695
  if (!item)
605
696
  return;
@@ -607,11 +698,9 @@ export class TzDrpContainerComponent {
607
698
  let endDate = this.dayjsInstance(item.value[1]);
608
699
  const startDateStr = startDate.format(this.data().dpConfig.format);
609
700
  const endDateStr = endDate.format(this.data().dpConfig.format);
610
- // Note: The original datesDisabled check uses the custom dayjsInstance, which is good.
611
701
  const isAnyDateDisabled = this.data().datesDisabled.some((date) => this.dayjsInstance(date, this.data().dpConfig.format).isBetween(startDateStr, endDateStr, null, '[]'));
612
- // FIX 4: Use robust parsing for minDate/maxDate comparison
613
- const minDate = !!this.data().dpConfig.minDate ? this.parseDateWithMultipleFormats(this.data().dpConfig.minDate) : dayjs('invalid');
614
- const maxDate = !!this.data().dpConfig.maxDate ? this.parseDateWithMultipleFormats(this.data().dpConfig.maxDate) : dayjs('invalid');
702
+ const minDate = !!this.data().dpConfig.minDate ? this.dayjsInstance(this.data().dpConfig.minDate, this.data().dpConfig.format) : dayjs('invalid');
703
+ const maxDate = !!this.data().dpConfig.maxDate ? this.dayjsInstance(this.data().dpConfig.maxDate, this.data().dpConfig.format) : dayjs('invalid');
615
704
  const isWithinLimits = (!minDate.isValid() || !startDate.isBefore(minDate, "day")) &&
616
705
  (!maxDate.isValid() || !endDate.isAfter(maxDate, "day"));
617
706
  if (!isWithinLimits || isAnyDateDisabled) {
@@ -621,7 +710,6 @@ export class TzDrpContainerComponent {
621
710
  this.selectedItemLabelSignal.set(item.label);
622
711
  this.currentMonthNumberSignal.set(startDate.month());
623
712
  this.currentYearNumberSignal.set(startDate.year());
624
- // Month/Year rollover logic is kept as is to match original functionality
625
713
  if (this.currentMonthNumberSignal() === 11) {
626
714
  this.nextMonthNumberSignal.set(0);
627
715
  this.nextYearNumberSignal.set(this.currentYearNumberSignal() + 1);
@@ -635,8 +723,10 @@ export class TzDrpContainerComponent {
635
723
  endDate: endDateStr,
636
724
  selectedRangeLabel: item.label
637
725
  });
638
- // The month/date computed properties (currentMonth, currentMonthDates, etc.)
639
- // update automatically now.
726
+ this.currentMonthSignal.set(getMonth(this.currentMonthNumberSignal()));
727
+ this.nextMonthSignal.set(getMonth(this.nextMonthNumberSignal()));
728
+ this.currentMonthDatesSignal.set(this.generateDates(this.currentMonthNumberSignal(), this.currentYearNumberSignal()));
729
+ this.nextMonthDatesSignal.set(this.generateDates(this.nextMonthNumberSignal(), this.nextYearNumberSignal()));
640
730
  this.isDatesValidSignal.set(!!(this.localSelectedDatesSignal().startDate && this.localSelectedDatesSignal().endDate));
641
731
  }
642
732
  resetRange() {
@@ -651,13 +741,11 @@ export class TzDrpContainerComponent {
651
741
  this.currentMonthDatesSignal.set(this.generateDates(this.currentMonthNumber(), this.currentYearNumber()));
652
742
  this.nextMonthDatesSignal.set(this.generateDates(this.nextMonthNumber(), this.nextYearNumber()));
653
743
  }
654
- // TzDrpContainerComponent (Signal-Migrated)
655
744
  applyDates() {
656
745
  // If time is enabled, append time to the dates before applying
657
746
  if (this.data().dpConfig.enableTime === true) {
658
747
  let startTime;
659
748
  let endTime;
660
- // Use signal accessors
661
749
  if (this.is12HourFormat()) {
662
750
  startTime = this.formatTime(this.startHour(), this.startMinute(), this.startAmPm());
663
751
  endTime = this.formatTime(this.endHour(), this.endMinute(), this.endAmPm());
@@ -666,41 +754,36 @@ export class TzDrpContainerComponent {
666
754
  startTime = this.formatTime(this.startHour24(), this.startMinute(), '');
667
755
  endTime = this.formatTime(this.endHour24(), this.endMinute(), '');
668
756
  }
757
+ // Extract only the date part (before any existing time) and append the selected time
669
758
  const localDates = this.localSelectedDatesSignal();
670
759
  let startDateOnly = localDates.startDate;
671
760
  let endDateOnly = localDates.endDate;
672
- // FIX 4: Use robust parsing/formatting for date part extraction
673
- if (startDateOnly) {
674
- const parsedStart = this.parseDateWithMultipleFormats(startDateOnly);
675
- // This is a complex date format extraction in the original, simplified here
676
- // by taking the date part only (assuming time is always separated by space)
677
- // For true fidelity, the original logic for date part extraction with time must be preserved.
678
- if (parsedStart.isValid()) {
679
- // Preserve original date formatting logic: extract only the date part
680
- // using the configured format elements BEFORE the time components.
681
- const timeStartMatch = this.data().dpConfig.format.match(/(\s+)(HH|mm|ss|A|a)/);
682
- if (timeStartMatch) {
683
- const timeStartIndex = this.data().dpConfig.format.indexOf(timeStartMatch[0]);
684
- const dateOnlyFormat = this.data().dpConfig.format.substring(0, timeStartIndex);
685
- startDateOnly = parsedStart.format(dateOnlyFormat);
686
- }
687
- else {
688
- // Fallback to splitting if format is date-only
689
- startDateOnly = (typeof startDateOnly === 'string') ? startDateOnly.split(' ')[0] : startDateOnly;
761
+ // Only extract date part if the format contains time components
762
+ if (this.data().dpConfig.format.includes('HH') || this.data().dpConfig.format.includes('mm') || this.data().dpConfig.format.includes('A')) {
763
+ // For datetime formats, we need to extract just the date part
764
+ // Try to parse the full string and then format it as date-only for comparison
765
+ if (startDateOnly) {
766
+ const parsedStart = this.parseDateWithMultipleFormats(startDateOnly);
767
+ if (parsedStart.isValid()) {
768
+ // Extract date part by finding the time boundary - handle spaces in date part
769
+ const timeStartMatch = this.data().dpConfig.format.match(/(\s+)(HH|mm|ss|A|a)/);
770
+ if (timeStartMatch) {
771
+ const timeStartIndex = this.data().dpConfig.format.indexOf(timeStartMatch[0]);
772
+ const dateOnlyFormat = this.data().dpConfig.format.substring(0, timeStartIndex);
773
+ startDateOnly = parsedStart.format(dateOnlyFormat);
774
+ }
690
775
  }
691
776
  }
692
- }
693
- if (endDateOnly) {
694
- const parsedEnd = this.parseDateWithMultipleFormats(endDateOnly);
695
- if (parsedEnd.isValid()) {
696
- const timeStartMatch = this.data().dpConfig.format.match(/(\s+)(HH|mm|ss|A|a)/);
697
- if (timeStartMatch) {
698
- const timeStartIndex = this.data().dpConfig.format.indexOf(timeStartMatch[0]);
699
- const dateOnlyFormat = this.data().dpConfig.format.substring(0, timeStartIndex);
700
- endDateOnly = parsedEnd.format(dateOnlyFormat);
701
- }
702
- else {
703
- endDateOnly = (typeof endDateOnly === 'string') ? endDateOnly.split(' ')[0] : endDateOnly;
777
+ if (endDateOnly) {
778
+ const parsedEnd = this.parseDateWithMultipleFormats(endDateOnly);
779
+ if (parsedEnd.isValid()) {
780
+ // Extract date part by finding the time boundary - handle spaces in date part
781
+ const timeStartMatch = this.data().dpConfig.format.match(/(\s+)(HH|mm|ss|A|a)/);
782
+ if (timeStartMatch) {
783
+ const timeStartIndex = this.data().dpConfig.format.indexOf(timeStartMatch[0]);
784
+ const dateOnlyFormat = this.data().dpConfig.format.substring(0, timeStartIndex);
785
+ endDateOnly = parsedEnd.format(dateOnlyFormat);
786
+ }
704
787
  }
705
788
  }
706
789
  }
@@ -1073,4 +1156,4 @@ export class TzDrpContainerComponent {
1073
1156
  args: ["keydown.esc"]
1074
1157
  }] }); })();
1075
1158
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TzDrpContainerComponent, { className: "TzDrpContainerComponent" }); })();
1076
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHotZHJwLWNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9taXMtY29tcG9uZW50cy9kYXRlcmFuZ2VwaWNrZXJfdjIvdHotZHJwLWNvbnRhaW5lci90ei1kcnAtY29udGFpbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21pcy1jb21wb25lbnRzL2RhdGVyYW5nZXBpY2tlcl92Mi90ei1kcnAtY29udGFpbmVyL3R6LWRycC1jb250YWluZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFVLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFM0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUdwQyxPQUFPLEtBQWdCLE1BQU0sT0FBTyxDQUFDO0FBQ3JDLE9BQU8sUUFBUSxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sR0FBRyxNQUFNLGtCQUFrQixDQUFDO0FBQ25DLE9BQU8sYUFBYSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sY0FBYyxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8saUJBQWlCLE1BQU0sZ0NBQWdDLENBQUE7QUFDOUQsT0FBTyxTQUFTLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7Ozs7SUNQdkMsQUFERiwyQkFBMEQsaUJBS3ZEO0lBRkMsb05BQVMsMkJBQWlCLEtBQUM7SUFHM0IsWUFDRjtJQUNGLEFBREUsaUJBQVMsRUFDTDs7OztJQU5KLGNBQWlFO0lBQWpFLGtHQUFpRTtJQUkvRCxjQUNGO0lBREUsOENBQ0Y7Ozs7SUFSSiwrQkFBNEY7SUFDMUYsK0VB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QUEwQztZQUExQyw4S0FBMEM7WUFvQjFDLGVBRUU7WUFGRixvRkFFRTtZQVNHLGVBQStDO1lBQS9DLGlGQUErQztZQVNwRCxlQUVFO1lBRkYsZ0ZBRUU7WUFZa0UsZUFBYTtZQUFiLHdDQUFhO1lBZS9ELGVBQXNCO1lBQXRCLGlEQUFzQjtZQWdCbkMsZUFBeUM7WUFBekMsMkVBQXlDO1lBTTlDLGNBRUU7WUFGRixnRkFFRTtZQVlrRSxlQUFhO1lBQWIsd0NBQWE7WUFlL0QsZUFBbUI7WUFBbkIsOENBQW1CO1lBZ0JDLGNBQXlDO1lBQXpDLDhEQUF5QztZQW9FTCxlQUE0QjtZQUE1Qiw4Q0FBNEI7OztpRkR0TG5HLHVCQUF1QjtjQUxuQyxTQUFTOzJCQUNFLFlBQVk7O3NCQXlFVCxNQUFNO3VCQUFDLGNBQWM7Z0RBNEZsQyxVQUFVO2tCQURULFlBQVk7bUJBQUMsYUFBYTs7a0ZBaEtoQix1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgSW5qZWN0LCBPbkluaXQsIHNpZ25hbCwgY29tcHV0ZWQsIGVmZmVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDT05UQUlORVJfREFUQSwgREFURV9GT1JNQVQgfSBmcm9tIFwiLi4vZGF0ZXJhbmdlcGlja2VyLWNvbnN0YW50c1wiO1xuaW1wb3J0IHsgSUN1cnJlbnRNb250aCwgSUN1cnJlbnRNb250aERhdGVzLCBJRGF0ZVBpY2tlckRhdGEsIElXZWVrRGF5LCBJU2VsZWN0ZWREYXRlc0NvbmZpZywgUmFuZ2VJdGVtIH0gZnJvbSBcIi4uL21vZGVscy9kcnAtY29uZmlnLm1vZGVsXCI7XG5pbXBvcnQgeyBnZXRNb250aCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSBcIm1pcy1jcnlzdGFsLWRlc2lnbi1zeXN0ZW0vdG9hc3RcIjtcblxuaW1wb3J0IGRheWpzLCB7IERheWpzIH0gZnJvbSAnZGF5anMnO1xuaW1wb3J0IHRpbWV6b25lIGZyb20gJ2RheWpzL3BsdWdpbi90aW1lem9uZSc7XG5pbXBvcnQgdXRjIGZyb20gJ2RheWpzL3BsdWdpbi91dGMnO1xuaW1wb3J0IGlzU2FtZU9yQWZ0ZXIgZnJvbSAnZGF5anMvcGx1Z2luL2lzU2FtZU9yQWZ0ZXInO1xuaW1wb3J0IGlzU2FtZU9yQmVmb3JlIGZyb20gJ2RheWpzL3BsdWdpbi9pc1NhbWVPckJlZm9yZSc7XG5pbXBvcnQgY3VzdG9tUGFyc2VGb3JtYXQgZnJvbSAnZGF5anMvcGx1Z2luL2N1c3RvbVBhcnNlRm9ybWF0J1xuaW1wb3J0IGlzQmV0d2VlbiBmcm9tICdkYXlqcy9wbHVnaW4vaXNCZXR3ZWVuJztcbmRheWpzLmV4dGVuZChpc0JldHdlZW4pO1xuZGF5anMuZXh0ZW5kKHV0Yyk7XG5kYXlqcy5leHRlbmQodGltZXpvbmUpO1xuZGF5anMuZXh0ZW5kKGN1c3RvbVBhcnNlRm9ybWF0KTtcbmRheWpzLmV4dGVuZChpc1NhbWVPckFmdGVyKTtcbmRheWpzLmV4dGVuZChpc1NhbWVPckJlZm9yZSk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJtaXMtdHotZHJwXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vdHotZHJwLWNvbnRhaW5lci5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vdHotZHJwLWNvbnRhaW5lci5jb21wb25lbnQuc2Nzc1wiXVxufSlcbmV4cG9ydCBjbGFzcyBUekRycENvbnRhaW5lckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ1VTVE9NX1JBTkdFX0xBQkVMID0gXCJDdXN0b20gUmFuZ2VcIjtcbiAgcmVhZG9ubHkgZGF0YSA9IHNpZ25hbDxJRGF0ZVBpY2tlckRhdGE+KHRoaXMuaW5qZWN0ZWREYXRhKTtcbiAgcHJpdmF0ZSBkYXlqc0luc3RhbmNlID0gKC4uLmFyZ3MpID0+IHtcbiAgICByZXR1cm4gZGF5anMoLi4uYXJncyk7XG4gIH07XG4gIHByaXZhdGUgcmF3V2Vla0RheXM6IHN0cmluZ1tdID0gW1wiU1VOXCIsIFwiTU9OXCIsIFwiVFVFXCIsIFwiV0VEXCIsIFwiVEhVXCIsIFwiRlJJXCIsIFwiU0FUXCJdO1xuICBcbiAgLy8gU2lnbmFsLWJhc2VkIHN0YXRlIG1hbmFnZW1lbnRcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWVrRGF5c1NpZ25hbCA9IHNpZ25hbDxJV2Vla0RheVtdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY3VycmVudE1vbnRoTnVtYmVyU2lnbmFsID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY3VycmVudE1vbnRoU2lnbmFsID0gc2lnbmFsPElDdXJyZW50TW9udGg+KFwiSmFudWFyeVwiKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW50WWVhck51bWJlclNpZ25hbCA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRNb250aERhdGVzU2lnbmFsID0gc2lnbmFsPElDdXJyZW50TW9udGhEYXRlc1tdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmV4dE1vbnRoTnVtYmVyU2lnbmFsID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmV4dE1vbnRoU2lnbmFsID0gc2lnbmFsPElDdXJyZW50TW9udGg+KFwiSmFudWFyeVwiKTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXh0WWVhck51bWJlclNpZ25hbCA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcml2YXRlIHJlYWRvbmx5IG5leHRNb250aERhdGVzU2lnbmFsID0gc2lnbmFsPElDdXJyZW50TW9udGhEYXRlc1tdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNQcmV2aW91c01vbnRoRGlzYWJsZWRTaWduYWwgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzTmV4dE1vbnRoRGlzYWJsZWRTaWduYWwgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdGlvblN0YXJ0ZWRTaWduYWwgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbCA9IHNpZ25hbDxJU2VsZWN0ZWREYXRlc0NvbmZpZz4oeyBzdGFydERhdGU6IG51bGwsIGVuZERhdGU6IG51bGwgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNEYXRlc1ZhbGlkU2lnbmFsID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3RlZEl0ZW1MYWJlbFNpZ25hbCA9IHNpZ25hbDxzdHJpbmc+KHRoaXMuQ1VTVE9NX1JBTkdFX0xBQkVMKTtcbiAgXG4gIC8vIFRpbWUgc2VsZWN0aW9uIHNpZ25hbHNcbiAgcmVhZG9ubHkgc3RhcnRIb3VyU2lnbmFsID0gc2lnbmFsPG51bWJlcj4oMTIpO1xuICByZWFkb25seSBzdGFydE1pbnV0ZVNpZ25hbCA9IHNpZ25hbDxudW1iZXI+KDApO1xuICByZWFkb25seSBzdGFydEFtUG1TaWduYWwgPSBzaWduYWw8c3RyaW5nPignQU0nKTtcbiAgcmVhZG9ubHkgZW5kSG91clNpZ25hbCA9IHNpZ25hbDxudW1iZXI+KDEyKTtcbiAgcmVhZG9ubHkgZW5kTWludXRlU2lnbmFsID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHJlYWRvbmx5IGVuZEFtUG1TaWduYWwgPSBzaWduYWw8c3RyaW5nPignQU0nKTtcbiAgcmVhZG9ubHkgc3RhcnRIb3VyMjRTaWduYWwgPSBzaWduYWw8bnVtYmVyPigxMik7XG4gIHJlYWRvbmx5IGVuZEhvdXIyNFNpZ25hbCA9IHNpZ25hbDxudW1iZXI+KDEyKTtcbiAgXG4gIC8vIENvbXB1dGVkIHByb3BlcnRpZXMgZm9yIHRlbXBsYXRlIGFjY2Vzc1xuICB3ZWVrRGF5cyA9IGNvbXB1dGVkKCgpID0+IHRoaXMud2Vla0RheXNTaWduYWwoKSk7XG4gIGN1cnJlbnRNb250aE51bWJlciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY3VycmVudE1vbnRoTnVtYmVyU2lnbmFsKCkpO1xuICBjdXJyZW50TW9udGggPSBjb21wdXRlZCgoKSA9PiB0aGlzLmN1cnJlbnRNb250aFNpZ25hbCgpKTtcbiAgY3VycmVudFllYXJOdW1iZXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmN1cnJlbnRZZWFyTnVtYmVyU2lnbmFsKCkpO1xuICBuZXh0TW9udGhOdW1iZXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm5leHRNb250aE51bWJlclNpZ25hbCgpKTtcbiAgbmV4dE1vbnRoID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5uZXh0TW9udGhTaWduYWwoKSk7XG4gIG5leHRZZWFyTnVtYmVyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5uZXh0WWVhck51bWJlclNpZ25hbCgpKTtcbiAgaXNQcmV2aW91c01vbnRoRGlzYWJsZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmlzUHJldmlvdXNNb250aERpc2FibGVkU2lnbmFsKCkpO1xuICBpc05leHRNb250aERpc2FibGVkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5pc05leHRNb250aERpc2FibGVkU2lnbmFsKCkpO1xuICBzZWxlY3Rpb25TdGFydGVkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zZWxlY3Rpb25TdGFydGVkU2lnbmFsKCkpO1xuICBsb2NhbFNlbGVjdGVkRGF0ZXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbCgpKTtcbiAgaXNEYXRlc1ZhbGlkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5pc0RhdGVzVmFsaWRTaWduYWwoKSk7XG4gIHNlbGVjdGVkSXRlbUxhYmVsID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zZWxlY3RlZEl0ZW1MYWJlbFNpZ25hbCgpKTtcbiAgY3VycmVudE1vbnRoRGF0ZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgLy8gRGVwZW5kZW5jaWVzOiBjdXJyZW50TW9udGhOdW1iZXJTaWduYWwsIGN1cnJlbnRZZWFyTnVtYmVyU2lnbmFsLCBsb2NhbFNlbGVjdGVkRGF0ZXNTaWduYWxcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZURhdGVzKHRoaXMuY3VycmVudE1vbnRoTnVtYmVyU2lnbmFsKCksIHRoaXMuY3VycmVudFllYXJOdW1iZXJTaWduYWwoKSk7XG4gIH0pO1xuICBuZXh0TW9udGhEYXRlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIC8vIERlcGVuZGVuY2llczogbmV4dE1vbnRoTnVtYmVyU2lnbmFsLCBuZXh0WWVhck51bWJlclNpZ25hbCwgbG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsXG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZURhdGVzKHRoaXMubmV4dE1vbnRoTnVtYmVyU2lnbmFsKCksIHRoaXMubmV4dFllYXJOdW1iZXJTaWduYWwoKSk7XG4gIH0pO1xuXG5cbiAgLy8gVGltZSBmdW5jdGlvbmFsaXR5IGNvbXB1dGVkIHByb3BlcnRpZXNcbiAgc3RhcnRIb3VyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdGFydEhvdXJTaWduYWwoKSk7XG4gIHN0YXJ0TWludXRlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdGFydE1pbnV0ZVNpZ25hbCgpKTtcbiAgc3RhcnRBbVBtID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdGFydEFtUG1TaWduYWwoKSk7XG4gIGVuZEhvdXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmVuZEhvdXJTaWduYWwoKSk7XG4gIGVuZE1pbnV0ZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZW5kTWludXRlU2lnbmFsKCkpO1xuICBlbmRBbVBtID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5lbmRBbVBtU2lnbmFsKCkpO1xuICBzdGFydEhvdXIyNCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhcnRIb3VyMjRTaWduYWwoKSk7XG4gIGVuZEhvdXIyNCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZW5kSG91cjI0U2lnbmFsKCkpO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoQ09OVEFJTkVSX0RBVEEpIHByaXZhdGUgaW5qZWN0ZWREYXRhOiBJRGF0ZVBpY2tlckRhdGEsIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSkge1xuICAgIHRoaXMuZGF0YSA9IHNpZ25hbDxJRGF0ZVBpY2tlckRhdGE+KHRoaXMuaW5qZWN0ZWREYXRhKTsgXG4gICAgdGhpcy5sb2NhbFNlbGVjdGVkRGF0ZXNTaWduYWwuc2V0KHRoaXMuZGF0YSgpLmRhdGVzKTtcbiAgICB0aGlzLmlzRGF0ZXNWYWxpZFNpZ25hbC5zZXQoZmFsc2UpO1xuICAgIGlmICh0aGlzLmRhdGEoKS5kYXRlcy5zdGFydERhdGUgJiYgdGhpcy5kYXRhKCkuZGF0ZXMuZW5kRGF0ZSkge1xuICAgICAgdGhpcy5pc0RhdGVzVmFsaWRTaWduYWwuc2V0KHRydWUpO1xuICAgIH1cbiAgICBcbiAgICAvLyBJbml0aWFsaXplIHNlbGVjdGVkSXRlbUxhYmVsIGZyb20gZGF0YS5zZWxlY3RlZFJhbmdlTGFiZWwgaWYgYXZhaWxhYmxlXG4gICAgaWYgKHRoaXMuZGF0YSgpLnNlbGVjdGVkUmFuZ2VMYWJlbCkge1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1MYWJlbFNpZ25hbC5zZXQodGhpcy5kYXRhKCkuc2VsZWN0ZWRSYW5nZUxhYmVsKTtcbiAgICB9XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBkYXlqc0luc3RhbmNlIHdpdGggdGltZXpvbmUgaGFuZGxpbmdcbiAgICBpZiAodGhpcy5kYXRhKCk/LmRwQ29uZmlnPy50aW1lem9uZSkge1xuICAgICAgdGhpcy5kYXlqc0luc3RhbmNlID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gZGF5anMudHooYXJnc1swXSwgYXJnc1sxXSB8fCAnREQvTU0vWVlZWScsIHRoaXMuZGF0YSgpLmRwQ29uZmlnLnRpbWV6b25lKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0Vycm9yIHBhcnNpbmcgZGF0ZSB3aXRoIHRpbWV6b25lOicsIGVycm9yLCAnYXJnczonLCBhcmdzKTtcbiAgICAgICAgICByZXR1cm4gZGF5anMoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gU2V0IGRlZmF1bHQgdmFsdWVzIHNhZmVseSB1c2luZyBzaWduYWxzXG4gICAgdGhpcy5jdXJyZW50TW9udGhOdW1iZXJTaWduYWwuc2V0KHRoaXMuZGF5anNJbnN0YW5jZSgpLm1vbnRoKCkpO1xuICAgIHRoaXMubmV4dE1vbnRoTnVtYmVyU2lnbmFsLnNldCh0aGlzLmRheWpzSW5zdGFuY2UoKS5hZGQoMSwgXCJtb250aFwiKS5tb250aCgpKTtcbiAgICB0aGlzLmN1cnJlbnRNb250aFNpZ25hbC5zZXQoZ2V0TW9udGgodGhpcy5jdXJyZW50TW9udGhOdW1iZXJTaWduYWwoKSkpO1xuICAgIHRoaXMubmV4dE1vbnRoU2lnbmFsLnNldChnZXRNb250aCh0aGlzLm5leHRNb250aE51bWJlclNpZ25hbCgpKSk7XG4gICAgdGhpcy5jdXJyZW50WWVhck51bWJlclNpZ25hbC5zZXQodGhpcy5kYXlqc0luc3RhbmNlKCkueWVhcigpKTtcbiAgICB0aGlzLm5leHRZZWFyTnVtYmVyU2lnbmFsLnNldCh0aGlzLmRheWpzSW5zdGFuY2UoKS5hZGQoMSwgXCJtb250aFwiKS55ZWFyKCkpO1xuICAgIHRoaXMud2Vla0RheXNTaWduYWwuc2V0KHRoaXMucmF3V2Vla0RheXMubWFwKChkYXksIGluZGV4KSA9PiAoe1xuICAgICAgbGFiZWw6IGAke2RheVswXX0ke2RheS5zbGljZSgxKS50b0xvd2VyQ2FzZSgpfWAsXG4gICAgICBpc0N1cnJlbnREYXk6IHRoaXMuZGF5anNJbnN0YW5jZSgpLmRheSgpID09PSBpbmRleFxuICAgIH0pKSk7XG4gICAgXG4gICAgaWYgKCF0aGlzLmRhdGEoKT8uZHBDb25maWc/LmZvcm1hdCkge1xuICAgICAgdGhpcy5kYXRhKCkuZHBDb25maWcgPSB7XG4gICAgICAgIC4uLnRoaXMuZGF0YSgpLmRwQ29uZmlnLFxuICAgICAgICBmb3JtYXQ6IERBVEVfRk9STUFUXG4gICAgICB9O1xuICAgIH1cblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBsb2NhbFNlbGVjdGVkRGF0ZXMgPSB0aGlzLmxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbCgpO1xuICAgICAgbGV0IHNlbGVjdGVkU3RhcnREYXRlOiBEYXlqcztcblxuICAgICAgaWYgKGxvY2FsU2VsZWN0ZWREYXRlcz8uc3RhcnREYXRlKSB7XG4gICAgICAgICAgLy8gVXNlIHRoZSByb2J1c3QgaGVscGVyIGZvciBwYXJzaW5nXG4gICAgICAgICAgc2VsZWN0ZWRTdGFydERhdGUgPSB0aGlzLnBhcnNlRGF0ZVdpdGhNdWx0aXBsZUZvcm1hdHMobG9jYWxTZWxlY3RlZERhdGVzLnN0YXJ0RGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdGVkU3RhcnREYXRlID0gZGF5anMoJ2ludmFsaWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdGVkU3RhcnREYXRlLmlzVmFsaWQoKSkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFllYXJOdW1iZXJTaWduYWwuc2V0KHNlbGVjdGVkU3RhcnREYXRlLnllYXIoKSk7XG4gICAgICAgICAgdGhpcy5uZXh0WWVhck51bWJlclNpZ25hbC5zZXQoc2VsZWN0ZWRTdGFydERhdGUuYWRkKDEsIFwibW9udGhcIikueWVhcigpKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRNb250aE51bWJlclNpZ25hbC5zZXQoc2VsZWN0ZWRTdGFydERhdGUuZ2V0KFwibW9udGhcIikpO1xuICAgICAgICAgIHRoaXMubmV4dE1vbnRoTnVtYmVyU2lnbmFsLnNldChzZWxlY3RlZFN0YXJ0RGF0ZS5hZGQoMSwgXCJtb250aFwiKS5tb250aCgpKTtcbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZEVuZERhdGUgPSBsb2NhbFNlbGVjdGVkRGF0ZXM/LmVuZERhdGUgPyB0aGlzLnBhcnNlRGF0ZVdpdGhNdWx0aXBsZUZvcm1hdHMobG9jYWxTZWxlY3RlZERhdGVzLmVuZERhdGUpIDogbnVsbDtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBMb2dpYyBmb3IgbmV4dCBtb250aCBiZWluZyBzZXQgYnkgZW5kIGRhdGVcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRFbmREYXRlICYmIHNlbGVjdGVkRW5kRGF0ZS5pc1ZhbGlkKCkgJiYgc2VsZWN0ZWRFbmREYXRlLmlzQWZ0ZXIoc2VsZWN0ZWRTdGFydERhdGUsICdtb250aCcpKSB7XG4gICAgICAgICAgICAgIHRoaXMubmV4dE1vbnRoTnVtYmVyU2lnbmFsLnNldChzZWxlY3RlZEVuZERhdGUubW9udGgoKSk7XG4gICAgICAgICAgICAgIHRoaXMubmV4dFllYXJOdW1iZXJTaWduYWwuc2V0KHNlbGVjdGVkRW5kRGF0ZS55ZWFyKCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFVwZGF0ZSBjYWxlbmRhciBkYXRlcyB0byByZWZsZWN0IHRoZSBzZWxlY3RlZCBkYXRlc1xuICAgICAgICAgIHRoaXMuY3VycmVudE1vbnRoRGF0ZXNTaWduYWwuc2V0KHRoaXMuZ2VuZXJhdGVEYXRlcyh0aGlzLmN1cnJlbnRNb250aE51bWJlclNpZ25hbCgpLCB0aGlzLmN1cnJlbnRZZWFyTnVtYmVyU2lnbmFsKCkpKTtcbiAgICAgICAgICB0aGlzLm5leHRNb250aERhdGVzU2lnbmFsLnNldCh0aGlzLmdlbmVyYXRlRGF0ZXModGhpcy5uZXh0TW9udGhOdW1iZXJTaWduYWwoKSwgdGhpcy5uZXh0WWVhck51bWJlclNpZ25hbCgpKSk7XG4gICAgICB9XG4gIH0sIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSk7XG5cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCduZ09uSW5pdCcpO1xuICAgIHRoaXMuY2FsY3VsYXRlTWluTWF4RGF5cygpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVRpbWVWYWx1ZXMoKTtcblxuICAgIGlmKHRoaXMuZGF0YSgpPy5zaG93UHJldk1vbnRoICYmICF0aGlzLmlzUHJldmlvdXNNb250aERpc2FibGVkKXtcbiAgICAgIHRoaXMubmF2aWdhdGVNb250aCgnUFJFVklPVVMnKTtcbiAgICB9XG4gIH1cblxuICByZXRyYWN0RGF5TW9udGgoZGF5OiBhbnksIG1vbnRoOiBhbnksIHllYXI6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIGAke2RheX0gJHttb250aH0gJHt5ZWFyfWA7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKFwia2V5ZG93bi5lc2NcIilcbiAgY2xvc2VPbkVzYygpIHtcbiAgICB0aGlzLmNhbmNlbERhdGVQaWNrZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlTWluTWF4RGF5cygpIHtcbiAgICBjb25zdCBjdXJyZW50SW5zdGFuY2UgPSB0aGlzLmRheWpzSW5zdGFuY2UoKS55ZWFyKHRoaXMuY3VycmVudFllYXJOdW1iZXJTaWduYWwoKSkubW9udGgodGhpcy5jdXJyZW50TW9udGhOdW1iZXJTaWduYWwoKSk7XG4gICAgY29uc3QgbWluRGF0ZSA9ICEhdGhpcy5kYXRhKCkuZHBDb25maWcubWluRGF0ZSA/IHRoaXMuZGF5anNJbnN0YW5jZSh0aGlzLmRhdGEoKS5kcENvbmZpZy5taW5EYXRlLCB0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQpIDogZGF5anMoJ2ludmFsaWQnKTtcbiAgICBpZiAobWluRGF0ZS5pc1ZhbGlkKCkpIHtcbiAgICAgIHRoaXMuaXNQcmV2aW91c01vbnRoRGlzYWJsZWRTaWduYWwuc2V0KG1pbkRhdGUuaXNTYW1lT3JBZnRlcihjdXJyZW50SW5zdGFuY2UsIFwibW9udGhcIikpO1xuICAgIH1cbiAgICBjb25zdCBtYXhEYXRlID0gISF0aGlzLmRhdGEoKS5kcENvbmZpZy5tYXhEYXRlID8gdGhpcy5kYXlqc0luc3RhbmNlKHRoaXMuZGF0YSgpLmRwQ29uZmlnLm1heERhdGUsIHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdCkgOiBkYXlqcygnaW52YWxpZCcpO1xuICAgIGlmIChtYXhEYXRlLmlzVmFsaWQoKSkge1xuICAgICAgdGhpcy5pc05leHRNb250aERpc2FibGVkU2lnbmFsLnNldChtYXhEYXRlLmlzU2FtZU9yQmVmb3JlKGN1cnJlbnRJbnN0YW5jZSwgXCJtb250aFwiKSk7XG4gICAgfVxuICB9XG5cbiAgbmF2aWdhdGVNb250aChkaXJlY3Rpb246IFwiTkVYVFwiIHwgXCJQUkVWSU9VU1wiKTogdm9pZCB7XG4gICAgbGV0IHRoaXNNb250aDogRGF5anMgPSBkYXlqcygpLnllYXIodGhpcy5jdXJyZW50WWVhck51bWJlclNpZ25hbCgpKS5tb250aCh0aGlzLmN1cnJlbnRNb250aE51bWJlclNpZ25hbCgpKTtcbiAgICBpZiAoZGlyZWN0aW9uID09PSBcIk5FWFRcIikge1xuICAgICB0aGlzTW9udGggPSB0aGlzTW9udGguYWRkKDEsIFwibW9udGhcIik7XG4gICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09IFwiUFJFVklPVVNcIikge1xuICAgICB0aGlzTW9udGggPSB0aGlzTW9udGguc3VidHJhY3QoMSwgXCJtb250aFwiKTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50TW9udGhOdW1iZXJTaWduYWwuc2V0KHRoaXNNb250aC5tb250aCgpKTtcbiAgICB0aGlzLm5leHRNb250aE51bWJlclNpZ25hbC5zZXQodGhpc01vbnRoLmNsb25lKCkuYWRkKDEsIFwibW9udGhcIikubW9udGgoKSk7XG4gICAgdGhpcy5jdXJyZW50TW9udGhTaWduYWwuc2V0KGdldE1vbnRoKHRoaXMuY3VycmVudE1vbnRoTnVtYmVyKCkpKTtcbiAgICB0aGlzLm5leHRNb250aFNpZ25hbC5zZXQoZ2V0TW9udGgodGhpcy5uZXh0TW9udGhOdW1iZXIoKSkpO1xuICAgIGlmICh0aGlzLm5leHRNb250aE51bWJlclNpZ25hbCgpID09PSAwICYmIGRpcmVjdGlvbiA9PT0gXCJQUkVWSU9VU1wiKSB7XG4gICAgIHRoaXMuY3VycmVudFllYXJOdW1iZXJTaWduYWwuc2V0KHRoaXMuY3VycmVudFllYXJOdW1iZXJTaWduYWwoKSAtIDEpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50TW9udGhOdW1iZXJTaWduYWwoKSA9PT0gMTEgJiYgZGlyZWN0aW9uID09PSBcIk5FWFRcIikge1xuICAgICB0aGlzLm5leHRZZWFyTnVtYmVyU2lnbmFsLnNldCh0aGlzLm5leHRZZWFyTnVtYmVyU2lnbmFsKCkgKyAxKTtcbiAgICB9ZWxzZSBpZiAodGhpcy5jdXJyZW50TW9udGhOdW1iZXJTaWduYWwoKSA9PT0gMCAmJiBkaXJlY3Rpb24gPT09IFwiTkVYVFwiKSB7XG4gICAgIHRoaXMuY3VycmVudFllYXJOdW1iZXJTaWduYWwuc2V0KHRoaXMuY3VycmVudFllYXJOdW1iZXJTaWduYWwoKSArIDEpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5uZXh0TW9udGhOdW1iZXJTaWduYWwoKSA9PT0gMTEgJiYgZGlyZWN0aW9uID09PSBcIlBSRVZJT1VTXCIpIHtcbiAgICAgdGhpcy5uZXh0WWVhck51bWJlclNpZ25hbC5zZXQodGhpcy5uZXh0WWVhck51bWJlclNpZ25hbCgpIC0gMSk7XG4gICAgfWVsc2V7XG4gICAgIHRoaXMubmV4dFllYXJOdW1iZXJTaWduYWwuc2V0KHRoaXMuY3VycmVudFllYXJOdW1iZXJTaWduYWwoKSk7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudE1vbnRoRGF0ZXNTaWduYWwuc2V0KHRoaXMuZ2VuZXJhdGVEYXRlcyh0aGlzLmN1cnJlbnRNb250aE51bWJlcigpLCB0aGlzLmN1cnJlbnRZZWFyTnVtYmVyKCkpKTtcbiAgICB0aGlzLm5leHRNb250aERhdGVzU2lnbmFsLnNldCh0aGlzLmdlbmVyYXRlRGF0ZXModGhpcy5uZXh0TW9udGhOdW1iZXIoKSwgdGhpcy5uZXh0WWVhck51bWJlcigpKSk7XG4gICAgdGhpcy5jYWxjdWxhdGVNaW5NYXhEYXlzKCk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlRGF0ZVdpdGhNdWx0aXBsZUZvcm1hdHMoZGF0ZVN0cmluZzogc3RyaW5nKTogZGF5anMuRGF5anMge1xuICAgIGlmICghZGF0ZVN0cmluZyB8fCBkYXRlU3RyaW5nID09PSAnSW52YWxpZCBEYXRlJyB8fCBkYXRlU3RyaW5nID09PSAndW5kZWZpbmVkJyB8fCBkYXRlU3RyaW5nID09PSAnbnVsbCcpIHtcbiAgICAgICAgcmV0dXJuIGRheWpzKCdpbnZhbGlkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlndXJlZEZvcm1hdCA9IHRoaXMuZGF0YSgpPy5kcENvbmZpZz8uZm9ybWF0O1xuICAgIGlmIChjb25maWd1cmVkRm9ybWF0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBkYXlqcyhkYXRlU3RyaW5nLCBjb25maWd1cmVkRm9ybWF0KTtcbiAgICAgICAgICAgIGlmIChwYXJzZWQuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIENvbnRpbnVlIHRvIGZhbGxiYWNrIGZvcm1hdHNcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZhbGxiYWNrRm9ybWF0cyA9IFtcbiAgICAgICAgJ0REL01NTS9ZWVlZJywgJ0REL01NL1lZWVknLCAnREQtTU1NLVlZWVknLCAnREQtTU0tWVlZWScsICdZWVlZLU1NLUREJ1xuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IGZvcm1hdCBvZiBmYWxsYmFja0Zvcm1hdHMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IGRheWpzKGRhdGVTdHJpbmcsIGZvcm1hdCk7XG4gICAgICAgICAgICBpZiAocGFyc2VkLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBDb250aW51ZSB0byBuZXh0IGZvcm1hdFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gZGF5anMoZGF0ZVN0cmluZyk7XG4gICAgICAgIGlmIChwYXJzZWQuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VkO1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gcGFyc2UgZGF0ZSB3aXRoIGFueSBmb3JtYXQ6JywgZGF0ZVN0cmluZywgZXJyb3IpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXlqcygnaW52YWxpZCcpO1xufVxuXG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZURhdGVzKG1vbnRoOiBudW1iZXIsIGN1cnJlbnRZZWFyTnVtYmVyOiBudW1iZXIpOiBJQ3VycmVudE1vbnRoRGF0ZXNbXSB7XG4gICAgbGV0IGRhdGVzOiBJQ3VycmVudE1vbnRoRGF0ZXNbXSA9IFtdO1xuICAgIGNvbnN0IGRheXNJbk1vbnRoID0gZGF5anMoKS55ZWFyKGN1cnJlbnRZZWFyTnVtYmVyKS5tb250aChtb250aCkuZGF5c0luTW9udGgoKTtcbiAgICBmb3IgKGxldCBjdXJyZW50RGF0ZSA9IDE7IGN1cnJlbnREYXRlIDw9IGRheXNJbk1vbnRoOyBjdXJyZW50RGF0ZSsrKSB7XG4gICAgICBjb25zdCBkYXRlID0gZGF5anMoKS55ZWFyKGN1cnJlbnRZZWFyTnVtYmVyKS5tb250aChtb250aCkuZGF0ZShjdXJyZW50RGF0ZSk7XG4gICAgICBjb25zdCBkYXRlU3RyaW5nID0gZGF0ZS5mb3JtYXQodGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0KTtcbiAgICAgIGxldCBpc0Rpc2FibGVkRGF5ID0gdGhpcy5kYXRhKCkuZGF0ZXNEaXNhYmxlZC5zb21lKGQgPT4gZCA9PT0gZGF0ZVN0cmluZyk7XG4gICAgICAvLyBQYXJzZSBtaW4vbWF4IGRhdGVzIHNhZmVseSAtIHRyeSBkYXRlLW9ubHkgZm9ybWF0IGZpcnN0LCB0aGVuIGZ1bGwgZm9ybWF0XG4gICAgICBsZXQgbWluRGF0ZSA9IG51bGw7XG4gICAgICBsZXQgbWF4RGF0ZSA9IG51bGw7XG4gICAgICBcbiAgICBcbiAgICAgIGlmICh0aGlzLmRhdGEoKS5kcENvbmZpZy5taW5EYXRlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbWluRGF0ZVN0ciA9IHRoaXMuZGF0YSgpLmRwQ29uZmlnLm1pbkRhdGUuc3BsaXQoJyAnKVswXTtcbiAgICAgICAgICBtaW5EYXRlID0gdGhpcy5wYXJzZURhdGVXaXRoTXVsdGlwbGVGb3JtYXRzKG1pbkRhdGVTdHIpO1xuICAgICAgICAgIGlmICghbWluRGF0ZS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIG1pbkRhdGUgPSBkYXlqcyh0aGlzLmRhdGEoKS5kcENvbmZpZy5taW5EYXRlLCB0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0Vycm9yIHBhcnNpbmcgbWluIGRhdGU6JywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICh0aGlzLmRhdGEoKS5kcENvbmZpZy5tYXhEYXRlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbWF4RGF0ZVN0ciA9IHRoaXMuZGF0YSgpLmRwQ29uZmlnLm1heERhdGUuc3BsaXQoJyAnKVswXTtcbiAgICAgICAgICBtYXhEYXRlID0gdGhpcy5wYXJzZURhdGVXaXRoTXVsdGlwbGVGb3JtYXRzKG1heERhdGVTdHIpO1xuICAgICAgICAgIGlmICghbWF4RGF0ZS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIG1heERhdGUgPSBkYXlqcyh0aGlzLmRhdGEoKS5kcENvbmZpZy5tYXhEYXRlLCB0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0Vycm9yIHBhcnNpbmcgbWF4IGRhdGU6JywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICghaXNEaXNhYmxlZERheSAmJiBtaW5EYXRlICYmIG1pbkRhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgaXNEaXNhYmxlZERheSA9IG1pbkRhdGUuaXNBZnRlcihkYXRlLCBcImRheVwiKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNEaXNhYmxlZERheSAmJiBtYXhEYXRlICYmIG1heERhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgaXNEaXNhYmxlZERheSA9IG1heERhdGUuaXNCZWZvcmUoZGF0ZSwgXCJkYXlcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5kYXRhKCk/LmRwQ29uZmlnPy5tYXhBbGxvd2VkUmFuZ2UgPiAwICYmXG4gICAgICAgICFpc0Rpc2FibGVkRGF5ICYmXG4gICAgICAgICh0aGlzLmxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbCgpPy5zdGFydERhdGUgPz8gZmFsc2UpICYmICghKHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsKCkuZW5kRGF0ZSA/PyBmYWxzZSkpXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5wYXJzZURhdGVXaXRoTXVsdGlwbGVGb3JtYXRzKHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsKCk/LnN0YXJ0RGF0ZSkuc3RhcnRPZignZGF5Jyk7XG4gICAgICAgIGNvbnN0IG1heEVuZERhdGUgPSBzdGFydERhdGUuY2xvbmUoKS5hZGQodGhpcy5kYXRhKCkuZHBDb25maWcubWF4QWxsb3dlZFJhbmdlIC0gMSwgJ2RheXMnKTtcbiAgICAgICAgaXNEaXNhYmxlZERheSA9IGRhdGUuaXNBZnRlcihtYXhFbmREYXRlLCAnZGF5JykgXG4gICAgICB9XG4gICAgICBjb25zdCBpc0N1cnJlbnREYXkgPVxuICAgICAgICB0aGlzLmRheWpzSW5zdGFuY2UoKS55ZWFyKGN1cnJlbnRZZWFyTnVtYmVyKS5tb250aChtb250aCkuZGF0ZShjdXJyZW50RGF0ZSkuZm9ybWF0KHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdCkgPT09XG4gICAgICAgIHRoaXMuZGF5anNJbnN0YW5jZSgpLmZvcm1hdCh0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQpO1xuICAgICAgXG4gICAgICAvLyBFeHRyYWN0IGRhdGUgcGFydCBmb3IgY29tcGFyaXNvbiAoaGFuZGxlIGJvdGggZGF0ZS1vbmx5IGFuZCBkYXRldGltZSBmb3JtYXRzKVxuICAgICAgY29uc3Qgc3RhcnREYXRlU3RyaW5nID0gKHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsKCk/LnN0YXJ0RGF0ZSAmJiB0eXBlb2YgdGhpcy5sb2NhbFNlbGVjdGVkRGF0ZXNTaWduYWwoKT8uc3RhcnREYXRlID09PSAnc3RyaW5nJykgXG4gICAgICAgID8gdGhpcy5sb2NhbFNlbGVjdGVkRGF0ZXNTaWduYWwoKS5zdGFydERhdGUuc3BsaXQoJyAnKVswXSBcbiAgICAgICAgOiB0aGlzLmxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbCgpPy5zdGFydERhdGU7XG4gICAgICBjb25zdCBlbmREYXRlU3RyaW5nID0gKHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsKCk/LmVuZERhdGUgJiYgdHlwZW9mIHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsKCk/LmVuZERhdGUgPT09ICdzdHJpbmcnKSBcbiAgICAgICAgPyB0aGlzLmxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbCgpLmVuZERhdGUuc3BsaXQoJyAnKVswXSBcbiAgICAgICAgOiB0aGlzLmxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbCgpPy5lbmREYXRlO1xuICAgICAgXG4gICAgICAvLyBVc2UgdGhlIGN1c3RvbSBmb3JtYXQgZm9yIGNvbXBhcmlzb24gaW5zdGVhZCBvZiBoYXJkY29kZWQgREQvTU0vWVlZWVxuICAgICAgXG4gICAgICBjb25zdCBzdGFydERhdGVQYXJzZWQgPSBzdGFydERhdGVTdHJpbmcgPyB0aGlzLnBhcnNlRGF0ZVdpdGhNdWx0aXBsZUZvcm1hdHMoc3RhcnREYXRlU3RyaW5nKSA6IG51bGw7XG4gICAgICBjb25zdCBlbmREYXRlUGFyc2VkID0gZW5kRGF0ZVN0cmluZyA/IHRoaXMucGFyc2VEYXRlV2l0aE11bHRpcGxlRm9ybWF0cyhlbmREYXRlU3RyaW5nKSA6IG51bGw7XG4gICAgICBcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWRTdGFydERheSA9XG4gICAgICAgICAgIWlzRGlzYWJsZWREYXkgJiZcbiAgICAgICAgICBzdGFydERhdGVQYXJzZWQgJiZcbiAgICAgICAgICBzdGFydERhdGVQYXJzZWQuaXNWYWxpZCgpICYmXG4gICAgICAgICAgZGF0ZS5pc1NhbWUoc3RhcnREYXRlUGFyc2VkLCAnZGF5Jyk7XG4gICAgICAgICAgXG4gICAgICBjb25zdCBpc1NlbGVjdGVkRW5kRGF5ID1cbiAgICAgICAgICAhaXNEaXNhYmxlZERheSAmJlxuICAgICAgICAgIGVuZERhdGVQYXJzZWQgJiZcbiAgICAgICAgICBlbmREYXRlUGFyc2VkLmlzVmFsaWQoKSAmJlxuICAgICAgICAgIGRhdGUuaXNTYW1lKGVuZERhdGVQYXJzZWQsICdkYXknKTtcblxuICAgICAgICBcbiAgICAgIC8vIEZvciByYW5nZSBjYWxjdWxhdGlvbiwgcGFyc2UgZGF0ZXMgcHJvcGVybHkgdXNpbmcgY3VzdG9tIGZvcm1hdFxuICAgICAgY29uc3QgaXNBZnRlclNlbGVjdGVkU3RhcnREYXRlID0gc3RhcnREYXRlUGFyc2VkID8gdGhpcy5kYXlqc0luc3RhbmNlKGRhdGUpLmlzQWZ0ZXIoc3RhcnREYXRlUGFyc2VkLCBcImRheVwiKSA6IGZhbHNlO1xuICAgICAgY29uc3QgaXNCZWZvcmVTZWxlY3RlZEVuZERhdGUgPSBlbmREYXRlUGFyc2VkID8gdGhpcy5kYXlqc0luc3RhbmNlKGRhdGUpLmlzQmVmb3JlKGVuZERhdGVQYXJzZWQsIFwiZGF5XCIpIDogZmFsc2U7XG5cbiAgICAgIFxuICAgICAgY29uc3QgaW5SYW5nZURheSA9XG4gICAgICBzdGFydERhdGVQYXJzZWQgJiYgZW5kRGF0ZVBhcnNlZCAmJlxuICAgICAgc3RhcnREYXRlUGFyc2VkLmlzVmFsaWQoKSAmJiBlbmREYXRlUGFyc2VkLmlzVmFsaWQoKSAmJlxuICAgICAgaXNBZnRlclNlbGVjdGVkU3RhcnREYXRlICYmXG4gICAgICBpc0JlZm9yZVNlbGVjdGVkRW5kRGF0ZTtcbiAgICAgIGRhdGVzLnB1c2goe1xuICAgICAgICBkYXRlOiBjdXJyZW50RGF0ZSxcbiAgICAgICAgd2Vla0RheTogZGF0ZS5kYXkoKSxcbiAgICAgICAgaXNDdXJyZW50RGF5LFxuICAgICAgICBpc1NlbGVjdGVkU3RhcnREYXksXG4gICAgICAgIGlzU2VsZWN0ZWRFbmREYXksXG4gICAgICAgIGluUmFuZ2VEYXksXG4gICAgICAgIHRvYXN0TWVzc2FnZTogdGhpcy5kYXRhKCkubWVzc2FnZXMuZmluZChxID0+IGRhdGUuZm9ybWF0KHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdCkgPT09IHEuZGF0ZSk/Lm1lc3NhZ2UgfHwgXCJcIixcbiAgICAgICAgaXNEaXNhYmxlZERheVxuICAgICAgfSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBkYXRlc1swXS53ZWVrRGF5OyBpID4gMDsgaS0tKSB7XG4gICAgICBkYXRlcy51bnNoaWZ0KHsgZGF0ZTogMCwgd2Vla0RheTogaSAtIDEgfSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlcztcbiAgfVxuXG5zZWxlY3REYXkoZnJvbTogXCJMRUZUXCIgfCBcIlJJR0hUXCIsIGRheTogSUN1cnJlbnRNb250aERhdGVzKSB7XG4gICAgXG4gIGlmIChkYXkuZGF0ZSA8PSAwKSB7XG4gICAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFkYXkuaXNEaXNhYmxlZERheSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1MYWJlbFNpZ25hbC5zZXQodGhpcy5DVVNUT01fUkFOR0VfTEFCRUwpO1xuICAgICAgXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIGRheSBiZWluZyBzZWxlY3RlZFxuICAgICAgY29uc3QgZGF5anNEYXkgPSBkYXlqcygpXG4gICAgICAgICAgLnllYXIoZnJvbSA9PT0gXCJMRUZUXCIgPyB0aGlzLmN1cnJlbnRZZWFyTnVtYmVyU2lnbmFsKCkgOiB0aGlzLm5leHRZZWFyTnVtYmVyU2lnbmFsKCkpXG4gICAgICAgICAgLm1vbnRoKGZyb20gPT09IFwiTEVGVFwiID8gdGhpcy5jdXJyZW50TW9udGhOdW1iZXJTaWduYWwoKSA6IHRoaXMubmV4dE1vbnRoTnVtYmVyU2lnbmFsKCkpXG4gICAgICAgICAgLmRhdGUoZGF5LmRhdGUpO1xuICAgICAgXG4gICAgICBsZXQgZm9ybWF0dGVkRGF0ZSA9IGRheWpzRGF5LmZvcm1hdCh0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQpO1xuICAgICAgXG4gICAgICB0aGlzLmxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgbGV0IHVwZGF0ZWREYXRlcyA9IHsgLi4uY3VycmVudCB9O1xuXG4gICAgICAgICAgLy8gU3RhcnQgRGF0ZSBmb3IgY29tcGFyaXNvbiAodXNpbmcgaGVscGVyIGZvciByb2J1c3QgY2hlY2spXG4gICAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gY3VycmVudC5zdGFydERhdGUgPyB0aGlzLnBhcnNlRGF0ZVdpdGhNdWx0aXBsZUZvcm1hdHMoY3VycmVudC5zdGFydERhdGUpIDogbnVsbDtcblxuICAgICAgICAgIC8vIEZJWCA0OiBBcHBlbmQgdGltZSBpZiBlbmFibGVkXG4gICAgICAgICAgaWYgKHRoaXMuZGF0YSgpLmRwQ29uZmlnLmVuYWJsZVRpbWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgLy8gVGhlIHRpbWUgaXMgc2V0IHRvIE5PVywgYXMgcGVyIG9yaWdpbmFsIG5vbi1zaWduYWwgY29tcG9uZW50J3MgbG9naWNcbiAgICAgICAgICAgICAgZm9ybWF0dGVkRGF0ZSA9IHRoaXMuYXBwZW5kQ3VycmVudFRpbWUoZGF5anNEYXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25TdGFydGVkKCkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGVkIGRhdGUgaXMgdGhlIHNhbWUgYXMgdGhlIHN0YXJ0IGRhdGUgKE5ldyBpbiB5b3VyIHByZXZpb3VzIHNpZ25hbCBjb2RlLCBidXQgdmFsaWQpXG4gICAgICAgICAgICAgIGlmIChzdGFydERhdGUgJiYgZGF5anNEYXkuaXNTYW1lKHN0YXJ0RGF0ZSwgXCJkYXlcIikpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU3RhcnRlZFNpZ25hbC5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5pc0RhdGVzVmFsaWRTaWduYWwuc2V0KHRydWUpOyAvLyBNYW51YWxseSBzZXR0aW5nIHZhbGlkaXR5IChjYW4gYmUgY29tcHV0ZWQgbGF0ZXIpXG4gICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZTogZm9ybWF0dGVkRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICBlbmREYXRlOiBmb3JtYXR0ZWREYXRlLFxuICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUmFuZ2VMYWJlbDogdGhpcy5DVVNUT01fUkFOR0VfTEFCRUxcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIElmIHRoZSBzZWxlY3RlZCBkYXRlIGlzIGJlZm9yZSB0aGUgc3RhcnQgZGF0ZSwgbWFrZSBpdCB0aGUgbmV3IHN0YXJ0IGRhdGVcbiAgICAgICAgICAgICAgaWYgKHN0YXJ0RGF0ZSAmJiBkYXlqc0RheS5pc0JlZm9yZShzdGFydERhdGUsIFwiZGF5XCIpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBTdGFydCBzZWxlY3Rpb24gb3ZlclxuICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydGVkU2lnbmFsLnNldCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaXNEYXRlc1ZhbGlkU2lnbmFsLnNldChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZTogZm9ybWF0dGVkRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICBlbmREYXRlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUmFuZ2VMYWJlbDogdGhpcy5DVVNUT01fUkFOR0VfTEFCRUxcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIEVuZCBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydGVkU2lnbmFsLnNldChmYWxzZSk7XG4gICAgICAgICAgICAgIHRoaXMuaXNEYXRlc1ZhbGlkU2lnbmFsLnNldCh0cnVlKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICBlbmREYXRlOiBmb3JtYXR0ZWREYXRlLFxuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSYW5nZUxhYmVsOiB0aGlzLkNVU1RPTV9SQU5HRV9MQUJFTFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFN0YXJ0IHNlbGVjdGlvblxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvblN0YXJ0ZWRTaWduYWwuc2V0KHRydWUpO1xuICAgICAgICAgICAgICB0aGlzLmlzRGF0ZXNWYWxpZFNpZ25hbC5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgc3RhcnREYXRlOiBmb3JtYXR0ZWREYXRlLFxuICAgICAgICAgICAgICAgICAgZW5kRGF0ZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUmFuZ2VMYWJlbDogdGhpcy5DVVNUT01fUkFOR0VfTEFCRUxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gVGhlIGRhdGUgYXJyYXlzIGFyZSBDT01QVVRFRCwgc28gbm8gbmVlZCBmb3IgbWFudWFsIHNldCgpXG4gICAgICB0aGlzLmlzRGF0ZXNWYWxpZFNpZ25hbC5zZXQoISEodGhpcy5sb2NhbFNlbGVjdGVkRGF0ZXNTaWduYWwoKS5zdGFydERhdGUgJiYgdGhpcy5sb2NhbFNlbGVjdGVkRGF0ZXNTaWduYWwoKS5lbmREYXRlKSk7XG4gIH1cbiAgaWYgKGRheS50b2FzdE1lc3NhZ2UpIHtcbiAgICAgIHRoaXMudG9hc3QuZGlzcGxheU1zZyhkYXkudG9hc3RNZXNzYWdlLCA0MDAwKTtcbiAgfVxufVxuXG4vLyBIZWxwZXIgbWV0aG9kIHRvIGFwcGVuZCBjdXJyZW50IHRpbWUgKHJlcGxpY2F0ZXMgb3JpZ2luYWwgc2VsZWN0RGF5IGNvbXBsZXggZm9ybWF0dGluZyBsb2dpYylcbnByaXZhdGUgYXBwZW5kQ3VycmVudFRpbWUoZGF0ZTogRGF5anMpOiBzdHJpbmcge1xuICBpZiAoIXRoaXMuZGF0YSgpLmRwQ29uZmlnLmVuYWJsZVRpbWUpIHJldHVybiBkYXRlLmZvcm1hdCh0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQpO1xuXG4gIC8vIFRoaXMgY29tcGxleCBmb3JtYXR0aW5nIGxvZ2ljIG11c3QgYmUgcmVwbGljYXRlZCBleGFjdGx5IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gIGNvbnN0IG5vdyA9IGRheWpzKCk7XG4gIGNvbnN0IHRpbWVTdGFydE1hdGNoID0gdGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0Lm1hdGNoKC8oXFxzKykoSEh8bW18c3N8QXxhKS8pO1xuICBcbiAgaWYgKHRpbWVTdGFydE1hdGNoKSB7XG4gICAgICBjb25zdCB0aW1lU3RhcnRJbmRleCA9IHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdC5pbmRleE9mKHRpbWVTdGFydE1hdGNoWzBdKTtcbiAgICAgIGNvbnN0IGRhdGVPbmx5Rm9ybWF0ID0gdGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0LnN1YnN0cmluZygwLCB0aW1lU3RhcnRJbmRleCk7XG4gICAgICBjb25zdCB0aW1lT25seUZvcm1hdCA9IHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdC5zdWJzdHJpbmcodGltZVN0YXJ0SW5kZXggKyB0aW1lU3RhcnRNYXRjaFsxXS5sZW5ndGgpO1xuICAgICAgXG4gICAgICBjb25zdCBkYXRlU3RyaW5nID0gZGF0ZS5mb3JtYXQoZGF0ZU9ubHlGb3JtYXQpO1xuICAgICAgY29uc3QgdGltZVN0cmluZyA9IG5vdy5mb3JtYXQodGltZU9ubHlGb3JtYXQpO1xuICAgICAgcmV0dXJuIGRhdGVTdHJpbmcgKyB0aW1lU3RhcnRNYXRjaFsxXSArIHRpbWVTdHJpbmc7XG4gIH1cbiAgLy8gRmFsbGJhY2sgaWYgbm8gdGltZSBwYXR0ZXJuIGZvdW5kXG4gIHJldHVybiBkYXRlLmZvcm1hdCh0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQpO1xufVxuXG5zZWxlY3RSYW5nZShpdGVtOiBSYW5nZUl0ZW0pIHtcbiAgaWYgKCFpdGVtKSByZXR1cm47XG5cbiAgbGV0IHN0YXJ0RGF0ZSA9IHRoaXMuZGF5anNJbnN0YW5jZShpdGVtLnZhbHVlWzBdKTtcbiAgbGV0IGVuZERhdGUgPSB0aGlzLmRheWpzSW5zdGFuY2UoaXRlbS52YWx1ZVsxXSk7XG5cbiAgY29uc3Qgc3RhcnREYXRlU3RyID0gc3RhcnREYXRlLmZvcm1hdCh0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQpO1xuICBjb25zdCBlbmREYXRlU3RyID0gZW5kRGF0ZS5mb3JtYXQodGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0KTtcblxuICAvLyBOb3RlOiBUaGUgb3JpZ2luYWwgZGF0ZXNEaXNhYmxlZCBjaGVjayB1c2VzIHRoZSBjdXN0b20gZGF5anNJbnN0YW5jZSwgd2hpY2ggaXMgZ29vZC5cbiAgY29uc3QgaXNBbnlEYXRlRGlzYWJsZWQgPSB0aGlzLmRhdGEoKS5kYXRlc0Rpc2FibGVkLnNvbWUoKGRhdGUpID0+XG4gICAgICB0aGlzLmRheWpzSW5zdGFuY2UoZGF0ZSAsIHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdCkuaXNCZXR3ZWVuKHN0YXJ0RGF0ZVN0ciwgZW5kRGF0ZVN0ciwgbnVsbCwgJ1tdJylcbiAgKTtcbiAgXG4gIC8vIEZJWCA0OiBVc2Ugcm9idXN0IHBhcnNpbmcgZm9yIG1pbkRhdGUvbWF4RGF0ZSBjb21wYXJpc29uXG4gIGNvbnN0IG1pbkRhdGUgPSAhIXRoaXMuZGF0YSgpLmRwQ29uZmlnLm1pbkRhdGUgPyB0aGlzLnBhcnNlRGF0ZVdpdGhNdWx0aXBsZUZvcm1hdHModGhpcy5kYXRhKCkuZHBDb25maWcubWluRGF0ZSkgOiBkYXlqcygnaW52YWxpZCcpO1xuICBjb25zdCBtYXhEYXRlID0gISF0aGlzLmRhdGEoKS5kcENvbmZpZy5tYXhEYXRlID8gdGhpcy5wYXJzZURhdGVXaXRoTXVsdGlwbGVGb3JtYXRzKHRoaXMuZGF0YSgpLmRwQ29uZmlnLm1heERhdGUpIDogZGF5anMoJ2ludmFsaWQnKTtcblxuICBjb25zdCBpc1dpdGhpbkxpbWl0cyA9XG4gICAgICAoIW1pbkRhdGUuaXNWYWxpZCgpIHx8ICFzdGFydERhdGUuaXNCZWZvcmUobWluRGF0ZSwgXCJkYXlcIikpICYmXG4gICAgICAoIW1heERhdGUuaXNWYWxpZCgpIHx8ICFlbmREYXRlLmlzQWZ0ZXIobWF4RGF0ZSwgXCJkYXlcIikpO1xuXG4gIGlmICghaXNXaXRoaW5MaW1pdHMgfHwgaXNBbnlEYXRlRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMudG9hc3QuZGlzcGxheU1zZyhcIlNlbGVjdGVkIHJhbmdlIGNvbnRhaW5zIGRpc2FibGVkIGRhdGVzIG9yIGlzIG91dCBvZiBib3VuZHMuXCIsIDQwMDApO1xuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5zZWxlY3RlZEl0ZW1MYWJlbFNpZ25hbC5zZXQoaXRlbS5sYWJlbCk7XG4gIHRoaXMuY3VycmVudE1vbnRoTnVtYmVyU2lnbmFsLnNldChzdGFydERhdGUubW9udGgoKSk7XG4gIHRoaXMuY3VycmVudFllYXJOdW1iZXJTaWduYWwuc2V0KHN0YXJ0RGF0ZS55ZWFyKCkpO1xuXG4gIC8vIE1vbnRoL1llYXIgcm9sbG92ZXIgbG9naWMgaXMga2VwdCBhcyBpcyB0byBtYXRjaCBvcmlnaW5hbCBmdW5jdGlvbmFsaXR5XG4gIGlmICh0aGlzLmN1cnJlbnRNb250aE51bWJlclNpZ25hbCgpID09PSAxMSkge1xuICAgICAgdGhpcy5uZXh0TW9udGhOdW1iZXJTaWduYWwuc2V0KDApO1xuICAgICAgdGhpcy5uZXh0WWVhck51bWJlclNpZ25hbC5zZXQodGhpcy5jdXJyZW50WWVhck51bWJlclNpZ25hbCgpICsgMSk7XG4gIH0gZWxzZSB7XG4gICAgICB0aGlzLm5leHRNb250aE51bWJlclNpZ25hbC5zZXQodGhpcy5jdXJyZW50TW9udGhOdW1iZXJTaWduYWwoKSArIDEpO1xuICAgICAgdGhpcy5uZXh0WWVhck51bWJlclNpZ25hbC5zZXQodGhpcy5jdXJyZW50WWVhck51bWJlclNpZ25hbCgpKTtcbiAgfVxuXG4gIHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsLnNldCh7XG4gICAgICBzdGFydERhdGU6IHN0YXJ0RGF0ZVN0cixcbiAgICAgIGVuZERhdGU6IGVuZERhdGVTdHIsXG4gICAgICBzZWxlY3RlZFJhbmdlTGFiZWw6IGl0ZW0ubGFiZWxcbiAgfSk7XG4gIC8vIFRoZSBtb250aC9kYXRlIGNvbXB1dGVkIHByb3BlcnRpZXMgKGN1cnJlbnRNb250aCwgY3VycmVudE1vbnRoRGF0ZXMsIGV0Yy4pIFxuICAvLyB1cGRhdGUgYXV0b21hdGljYWxseSBub3cuXG5cbiAgdGhpcy5pc0RhdGVzVmFsaWRTaWduYWwuc2V0KCEhKHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsKCkuc3RhcnREYXRlICYmIHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsKCkuZW5kRGF0ZSkpO1xufVxuXG4gIHJlc2V0UmFuZ2UoKSB7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1MYWJlbFNpZ25hbC5zZXQodGhpcy5DVVNUT01fUkFOR0VfTEFCRUwpO1xuICAgIHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsLnNldCh7XG4gICAgICBzdGFydERhdGU6IG51bGwsXG4gICAgICBlbmREYXRlOiBudWxsLFxuICAgICAgc2VsZWN0ZWRSYW5nZUxhYmVsOiB0aGlzLkNVU1RPTV9SQU5HRV9MQUJFTFxuICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0aW9uU3RhcnRlZFNpZ25hbC5zZXQoZmFsc2UpO1xuICAgIHRoaXMuaXNEYXRlc1ZhbGlkU2lnbmFsLnNldChmYWxzZSk7XG4gICAgdGhpcy5jdXJyZW50TW9udGhEYXRlc1NpZ25hbC5zZXQodGhpcy5nZW5lcmF0ZURhdGVzKHRoaXMuY3VycmVudE1vbnRoTnVtYmVyKCksIHRoaXMuY3VycmVudFllYXJOdW1iZXIoKSkpO1xuICAgIHRoaXMubmV4dE1vbnRoRGF0ZXNTaWduYWwuc2V0KHRoaXMuZ2VuZXJhdGVEYXRlcyh0aGlzLm5leHRNb250aE51bWJlcigpLCB0aGlzLm5leHRZZWFyTnVtYmVyKCkpKTtcbiAgfVxuICBcbi8vIFR6RHJwQ29udGFpbmVyQ29tcG9uZW50IChTaWduYWwtTWlncmF0ZWQpXG5hcHBseURhdGVzKCkge1xuICAvLyBJZiB0aW1lIGlzIGVuYWJsZWQsIGFwcGVuZCB0aW1lIHRvIHRoZSBkYXRlcyBiZWZvcmUgYXBwbHlpbmdcbiAgaWYgKHRoaXMuZGF0YSgpLmRwQ29uZmlnLmVuYWJsZVRpbWUgPT09IHRydWUpIHtcbiAgICAgIGxldCBzdGFydFRpbWU6IHN0cmluZztcbiAgICAgIGxldCBlbmRUaW1lOiBzdHJpbmc7XG5cbiAgICAgIC8vIFVzZSBzaWduYWwgYWNjZXNzb3JzXG4gICAgICBpZiAodGhpcy5pczEySG91ckZvcm1hdCgpKSB7XG4gICAgICAgICAgc3RhcnRUaW1lID0gdGhpcy5mb3JtYXRUaW1lKHRoaXMuc3RhcnRIb3VyKCksIHRoaXMuc3RhcnRNaW51dGUoKSwgdGhpcy5zdGFydEFtUG0oKSk7XG4gICAgICAgICAgZW5kVGltZSA9IHRoaXMuZm9ybWF0VGltZSh0aGlzLmVuZEhvdXIoKSwgdGhpcy5lbmRNaW51dGUoKSwgdGhpcy5lbmRBbVBtKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGFydFRpbWUgPSB0aGlzLmZvcm1hdFRpbWUodGhpcy5zdGFydEhvdXIyNCgpLCB0aGlzLnN0YXJ0TWludXRlKCksICcnKTtcbiAgICAgICAgICBlbmRUaW1lID0gdGhpcy5mb3JtYXRUaW1lKHRoaXMuZW5kSG91cjI0KCksIHRoaXMuZW5kTWludXRlKCksICcnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9jYWxEYXRlcyA9IHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsKCk7XG4gICAgICBsZXQgc3RhcnREYXRlT25seSA9IGxvY2FsRGF0ZXMuc3RhcnREYXRlO1xuICAgICAgbGV0IGVuZERhdGVPbmx5ID0gbG9jYWxEYXRlcy5lbmREYXRlO1xuICAgICAgXG4gICAgICAvLyBGSVggNDogVXNlIHJvYnVzdCBwYXJzaW5nL2Zvcm1hdHRpbmcgZm9yIGRhdGUgcGFydCBleHRyYWN0aW9uXG4gICAgICBpZiAoc3RhcnREYXRlT25seSkge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZFN0YXJ0ID0gdGhpcy5wYXJzZURhdGVXaXRoTXVsdGlwbGVGb3JtYXRzKHN0YXJ0RGF0ZU9ubHkpO1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSBjb21wbGV4IGRhdGUgZm9ybWF0IGV4dHJhY3Rpb24gaW4gdGhlIG9yaWdpbmFsLCBzaW1wbGlmaWVkIGhlcmUgXG4gICAgICAgICAgLy8gYnkgdGFraW5nIHRoZSBkYXRlIHBhcnQgb25seSAoYXNzdW1pbmcgdGltZSBpcyBhbHdheXMgc2VwYXJhdGVkIGJ5IHNwYWNlKVxuICAgICAgICAgIC8vIEZvciB0cnVlIGZpZGVsaXR5LCB0aGUgb3JpZ2luYWwgbG9naWMgZm9yIGRhdGUgcGFydCBleHRyYWN0aW9uIHdpdGggdGltZSBtdXN0IGJlIHByZXNlcnZlZC5cbiAgICAgICAgICBpZiAocGFyc2VkU3RhcnQuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgIC8vIFByZXNlcnZlIG9yaWdpbmFsIGRhdGUgZm9ybWF0dGluZyBsb2dpYzogZXh0cmFjdCBvbmx5IHRoZSBkYXRlIHBhcnQgXG4gICAgICAgICAgICAgIC8vIHVzaW5nIHRoZSBjb25maWd1cmVkIGZvcm1hdCBlbGVtZW50cyBCRUZPUkUgdGhlIHRpbWUgY29tcG9uZW50cy5cbiAgICAgICAgICAgICAgY29uc3QgdGltZVN0YXJ0TWF0Y2ggPSB0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQubWF0Y2goLyhcXHMrKShISHxtbXxzc3xBfGEpLyk7XG4gICAgICAgICAgICAgIGlmICh0aW1lU3RhcnRNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdGltZVN0YXJ0SW5kZXggPSB0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQuaW5kZXhPZih0aW1lU3RhcnRNYXRjaFswXSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBkYXRlT25seUZvcm1hdCA9IHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdC5zdWJzdHJpbmcoMCwgdGltZVN0YXJ0SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgc3RhcnREYXRlT25seSA9IHBhcnNlZFN0YXJ0LmZvcm1hdChkYXRlT25seUZvcm1hdCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBGYWxsYmFjayB0byBzcGxpdHRpbmcgaWYgZm9ybWF0IGlzIGRhdGUtb25seVxuICAgICAgICAgICAgICAgICAgc3RhcnREYXRlT25seSA9ICh0eXBlb2Ygc3RhcnREYXRlT25seSA9PT0gJ3N0cmluZycpID8gc3RhcnREYXRlT25seS5zcGxpdCgnICcpWzBdIDogc3RhcnREYXRlT25seTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlbmREYXRlT25seSkge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZEVuZCA9IHRoaXMucGFyc2VEYXRlV2l0aE11bHRpcGxlRm9ybWF0cyhlbmREYXRlT25seSk7XG4gICAgICAgICAgaWYgKHBhcnNlZEVuZC5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgdGltZVN0YXJ0TWF0Y2ggPSB0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQubWF0Y2goLyhcXHMrKShISHxtbXxzc3xBfGEpLyk7XG4gICAgICAgICAgICAgIGlmICh0aW1lU3RhcnRNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdGltZVN0YXJ0SW5kZXggPSB0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQuaW5kZXhPZih0aW1lU3RhcnRNYXRjaFswXSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBkYXRlT25seUZvcm1hdCA9IHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdC5zdWJzdHJpbmcoMCwgdGltZVN0YXJ0SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgZW5kRGF0ZU9ubHkgPSBwYXJzZWRFbmQuZm9ybWF0KGRhdGVPbmx5Rm9ybWF0KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGVuZERhdGVPbmx5ID0gKHR5cGVvZiBlbmREYXRlT25seSA9PT0gJ3N0cmluZycpID8gZW5kRGF0ZU9ubHkuc3BsaXQoJyAnKVswXSA6IGVuZERhdGVPbmx5O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBzdGFydERhdGVXaXRoVGltZSA9IHN0YXJ0RGF0ZU9ubHkgKyAnICcgKyBzdGFydFRpbWU7XG4gICAgICBjb25zdCBlbmREYXRlV2l0aFRpbWUgPSBlbmREYXRlT25seSArICcgJyArIGVuZFRpbWU7XG4gICAgICBcbiAgICAgIHRoaXMuZGF0YSgpLmRhdGVDaGFuZ2Uoe1xuICAgICAgICAgIHN0YXJ0RGF0ZTogc3RhcnREYXRlV2l0aFRpbWUsXG4gICAgICAgICAgZW5kRGF0ZTogZW5kRGF0ZVdpdGhUaW1lXG4gICAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YSgpLmRhdGVDaGFuZ2UodGhpcy5sb2NhbFNlbGVjdGVkRGF0ZXNTaWduYWwoKSk7XG4gIH1cbn1cblxuICBcbiAgY2FuY2VsRGF0ZVBpY2tlcigpIHtcbiAgICB0aGlzLmRhdGEoKS5jbG9zZSgpO1xuICB9XG4gIFxuICAvLyBUaW1lLXJlbGF0ZWQgbWV0aG9kc1xuICBvblN0YXJ0SG91cklucHV0KCkge1xuICAgIGlmICh0aGlzLmlzMTJIb3VyRm9ybWF0KCkpIHtcbiAgICAgIHRoaXMuc3RhcnRIb3VyU2lnbmFsLnNldCh0aGlzLnZhbGlkYXRlSG91cklucHV0KHRoaXMuc3RhcnRIb3VyKCkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGFydEhvdXIyNFNpZ25hbC5zZXQodGhpcy52YWxpZGF0ZUhvdXJJbnB1dDI0KHRoaXMuc3RhcnRIb3VyMjQoKSkpO1xuICAgIH1cbiAgfVxuICBcbiAgb25TdGFydE1pbnV0ZUlucHV0KCkge1xuICAgIHRoaXMuc3RhcnRNaW51dGVTaWduYWwuc2V0KHRoaXMudmFsaWRhdGVNaW51dGVJbnB1dCh0aGlzLnN0YXJ0TWludXRlKCkpKTtcbiAgfVxuICBcbiAgb25FbmRIb3VySW5wdXQoKSB7XG4gICAgaWYgKHRoaXMuaXMxMkhvdXJGb3JtYXQoKSkge1xuICAgICAgdGhpcy5lbmRIb3VyU2lnbmFsLnNldCh0aGlzLnZhbGlkYXRlSG91cklucHV0KHRoaXMuZW5kSG91cigpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5kSG91cjI0U2lnbmFsLnNldCh0aGlzLnZhbGlkYXRlSG91cklucHV0MjQodGhpcy5lbmRIb3VyMjQoKSkpO1xuICAgIH1cbiAgfVxuICBcbiAgb25FbmRNaW51dGVJbnB1dCgpIHtcbiAgICB0aGlzLmVuZE1pbnV0ZVNpZ25hbC5zZXQodGhpcy52YWxpZGF0ZU1pbnV0ZUlucHV0KHRoaXMuZW5kTWludXRlKCkpKTtcbiAgfVxuICBcbiAgdmFsaWRhdGVIb3VySW5wdXQoaG91cjogbnVtYmVyKSB7XG4gICAgLy8gQXBwbHkgYm91bmRzIGJhc2VkIG9uIGZvcm1hdFxuICAgIGlmICh0aGlzLmlzMTJIb3VyRm9ybWF0KCkpIHtcbiAgICAgIC8vIDEyLWhvdXIgZm9ybWF0OiAxLTEyXG4gICAgICBpZiAoaG91ciA8IDEpIGhvdXIgPSAxO1xuICAgICAgaWYgKGhvdXIgPiAxMikgaG91ciA9IDEyO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyAyNC1ob3VyIGZvcm1hdDogMC0yM1xuICAgICAgaWYgKGhvdXIgPCAwKSBob3VyID0gMDtcbiAgICAgIGlmIChob3VyID4gMjMpIGhvdXIgPSAyMztcbiAgICB9XG4gICAgcmV0dXJuIGhvdXI7XG4gIH1cbiAgXG4gIC8vIFNwZWNpYWwgdmFsaWRhdGlvbiBmb3IgMjQtaG91ciBmb3JtYXRcbiAgdmFsaWRhdGVIb3VySW5wdXQyNChob3VyOiBudW1iZXIpIHtcbiAgICBpZiAoaG91ciA8IDApIGhvdXIgPSAwO1xuICAgIGlmIChob3VyID4gMjMpIGhvdXIgPSAyMztcbiAgICByZXR1cm4gaG91cjtcbiAgfVxuICBcbiAgdmFsaWRhdGVNaW51dGVJbnB1dChtaW51dGU6IG51bWJlcikge1xuICAgIGlmIChtaW51dGUgPCAwKSBtaW51dGUgPSAwO1xuICAgIGlmIChtaW51dGUgPiA1OSkgbWludXRlID0gNTk7XG4gICAgcmV0dXJuIG1pbnV0ZTtcbiAgfVxuICBcbiAgcHVibGljIGlzMTJIb3VyRm9ybWF0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQuaW5jbHVkZXMoJ0EnKSB8fCB0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQuaW5jbHVkZXMoJ2EnKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBmb3JtYXRUaW1lKGhvdXI6IG51bWJlciwgbWludXRlOiBudW1iZXIsIGFtUG06IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXMxMkhvdXJGb3JtYXQoKSkge1xuICAgICAgcmV0dXJuIGAke2hvdXIudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke21pbnV0ZS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9ICR7YW1QbX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgMjQtaG91ciBmb3JtYXQsIGp1c3QgcmV0dXJuIHRoZSBob3VyIGFuZCBtaW51dGVcbiAgICAgIHJldHVybiBgJHtob3VyLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX06JHttaW51dGUudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVGltZVZhbHVlcygpOiB2b2lkIHtcbiAgICAvLyBJbml0aWFsaXplIHRpbWUgdmFsdWVzIGZyb20gZXhpc3Rpbmcgc2VsZWN0ZWQgZGF0ZXMgaWYgdGhleSBjb250YWluIHRpbWVcbiAgICBsZXQgc3RhcnRUaW1lSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICBsZXQgZW5kVGltZUluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgXG4gICAgaWYgKHRoaXMuZGF0YSgpLmRwQ29uZmlnLmVuYWJsZVRpbWUgJiYgdGhpcy5sb2NhbFNlbGVjdGVkRGF0ZXNTaWduYWwoKS5zdGFydERhdGUgJiYgdHlwZW9mIHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsKCkuc3RhcnREYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3Qgc3RhcnREYXRlUGFydHMgPSB0aGlzLmxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbCgpLnN0YXJ0RGF0ZS5zcGxpdCgnICcpO1xuICAgICAgaWYgKHN0YXJ0RGF0ZVBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc3QgdGltZVBhcnQgPSBzdGFydERhdGVQYXJ0cy5zbGljZSgxKS5qb2luKCcgJyk7IC8vIEhhbmRsZSBtdWx0aXBsZSBzcGFjZXNcbiAgICAgICAgdGhpcy5wYXJzZVRpbWVTdHJpbmcodGltZVBhcnQsIHRydWUpO1xuICAgICAgICBzdGFydFRpbWVJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLmRhdGEoKS5kcENvbmZpZy5lbmFibGVUaW1lICYmIHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsKCkuZW5kRGF0ZSAmJiB0eXBlb2YgdGhpcy5sb2NhbFNlbGVjdGVkRGF0ZXNTaWduYWwoKS5lbmREYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgZW5kRGF0ZVBhcnRzID0gdGhpcy5sb2NhbFNlbGVjdGVkRGF0ZXNTaWduYWwoKS5lbmREYXRlLnNwbGl0KCcgJyk7XG4gICAgICBpZiAoZW5kRGF0ZVBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc3QgdGltZVBhcnQgPSBlbmREYXRlUGFydHMuc2xpY2UoMSkuam9pbignICcpOyAvLyBIYW5kbGUgbXVsdGlwbGUgc3BhY2VzXG4gICAgICAgIHRoaXMucGFyc2VUaW1lU3RyaW5nKHRpbWVQYXJ0LCBmYWxzZSk7XG4gICAgICAgIGVuZFRpbWVJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIElmIG5vIGV4aXN0aW5nIHRpbWUgZm91bmQsIHNldCBjdXJyZW50IHRpbWUgYXMgZGVmYXVsdFxuICAgIGlmICh0aGlzLmRhdGEoKS5kcENvbmZpZy5lbmFibGVUaW1lKSB7XG4gICAgICBpZiAoIXN0YXJ0VGltZUluaXRpYWxpemVkKSB7XG4gICAgICAgIHRoaXMuc2V0Q3VycmVudFRpbWVBc0RlZmF1bHQodHJ1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoIWVuZFRpbWVJbml0aWFsaXplZCkge1xuICAgICAgICB0aGlzLnNldEN1cnJlbnRUaW1lQXNEZWZhdWx0KGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEN1cnJlbnRUaW1lQXNEZWZhdWx0KGlzU3RhcnQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBub3cgPSBkYXlqcygpO1xuICAgIGNvbnN0IGN1cnJlbnRIb3VyID0gbm93LmhvdXIoKTtcbiAgICBjb25zdCBjdXJyZW50TWludXRlID0gbm93Lm1pbnV0ZSgpO1xuICAgIFxuICAgIGlmICh0aGlzLmlzMTJIb3VyRm9ybWF0KCkpIHtcbiAgICAgIC8vIENvbnZlcnQgY3VycmVudCB0aW1lIHRvIDEyLWhvdXIgZm9ybWF0XG4gICAgICBsZXQgaG91cjEyID0gY3VycmVudEhvdXI7XG4gICAgICBsZXQgYW1QbSA9ICdBTSc7XG4gICAgICBcbiAgICAgIGlmIChjdXJyZW50SG91ciA9PT0gMCkge1xuICAgICAgICBob3VyMTIgPSAxMjtcbiAgICAgICAgYW1QbSA9ICdBTSc7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRIb3VyID09PSAxMikge1xuICAgICAgICBob3VyMTIgPSAxMjtcbiAgICAgICAgYW1QbSA9ICdQTSc7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRIb3VyID4gMTIpIHtcbiAgICAgICAgaG91cjEyID0gY3VycmVudEhvdXIgLSAxMjtcbiAgICAgICAgYW1QbSA9ICdQTSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbVBtID0gJ0FNJztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGlzU3RhcnQpIHtcbiAgICAgICAgdGhpcy5zdGFydEhvdXJTaWduYWwuc2V0KGhvdXIxMik7XG4gICAgICAgIHRoaXMuc3RhcnRNaW51dGVTaWduYWwuc2V0KGN1cnJlbnRNaW51dGUpO1xuICAgICAgICB0aGlzLnN0YXJ0QW1QbVNpZ25hbC5zZXQoYW1QbSk7XG4gICAgICAgIHRoaXMuc3RhcnRIb3VyMjRTaWduYWwuc2V0KGN1cnJlbnRIb3VyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZW5kSG91clNpZ25hbC5zZXQoaG91cjEyKTtcbiAgICAgICAgdGhpcy5lbmRNaW51dGVTaWduYWwuc2V0KGN1cnJlbnRNaW51dGUpO1xuICAgICAgICB0aGlzLmVuZEFtUG1TaWduYWwuc2V0KGFtUG0pO1xuICAgICAgICB0aGlzLmVuZEhvdXIyNFNpZ25hbC5zZXQoY3VycmVudEhvdXIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVc2UgY3VycmVudCB0aW1lIGRpcmVjdGx5IGZvciAyNC1ob3VyIGZvcm1hdFxuICAgICAgaWYgKGlzU3RhcnQpIHtcbiAgICAgICAgdGhpcy5zdGFydEhvdXIyNFNpZ25hbC5zZXQoY3VycmVudEhvdXIpO1xuICAgICAgICB0aGlzLnN0YXJ0TWludXRlU2lnbmFsLnNldChjdXJyZW50TWludXRlKTtcbiAgICAgICAgLy8gQWxzbyBzZXQgMTItaG91ciB2YWx1ZXMgZm9yIGNvbnNpc3RlbmN5XG4gICAgICAgIGlmIChjdXJyZW50SG91ciA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuc3RhcnRIb3VyU2lnbmFsLnNldCgxMik7XG4gICAgICAgICAgdGhpcy5zdGFydEFtUG1TaWduYWwuc2V0KCdBTScpO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRIb3VyID09PSAxMikge1xuICAgICAgICAgIHRoaXMuc3RhcnRIb3VyU2lnbmFsLnNldCgxMik7XG4gICAgICAgICAgdGhpcy5zdGFydEFtUG1TaWduYWwuc2V0KCdQTScpO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRIb3VyID4gMTIpIHtcbiAgICAgICAgICB0aGlzLnN0YXJ0SG91clNpZ25hbC5zZXQoY3VycmVudEhvdXIgLSAxMik7XG4gICAgICAgICAgdGhpcy5zdGFydEFtUG1TaWduYWwuc2V0KCdQTScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3RhcnRIb3VyU2lnbmFsLnNldChjdXJyZW50SG91cik7XG4gICAgICAgICAgdGhpcy5zdGFydEFtUG1TaWduYWwuc2V0KCdBTScpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVuZEhvdXIyNFNpZ25hbC5zZXQoY3VycmVudEhvdXIpO1xuICAgICAgICB0aGlzLmVuZE1pbnV0ZVNpZ25hbC5zZXQoY3VycmVudE1pbnV0ZSk7XG4gICAgICAgIC8vIEFsc28gc2V0IDEyLWhvdXIgdmFsdWVzIGZvciBjb25zaXN0ZW5jeVxuICAgICAgICBpZiAoY3VycmVudEhvdXIgPT09IDApIHtcbiAgICAgICAgICB0aGlzLmVuZEhvdXJTaWduYWwuc2V0KDEyKTtcbiAgICAgICAgICB0aGlzLmVuZEFtUG1TaWduYWwuc2V0KCdBTScpO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRIb3VyID09PSAxMikge1xuICAgICAgICAgIHRoaXMuZW5kSG91clNpZ25hbC5zZXQoMTIpO1xuICAgICAgICAgIHRoaXMuZW5kQW1QbVNpZ25hbC5zZXQoJ1BNJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEhvdXIgPiAxMikge1xuICAgICAgICAgIHRoaXMuZW5kSG91clNpZ25hbC5zZXQoY3VycmVudEhvdXIgLSAxMik7XG4gICAgICAgICAgdGhpcy5lbmRBbVBtU2lnbmFsLnNldCgnUE0nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVuZEhvdXJTaWduYWwuc2V0KGN1cnJlbnRIb3VyKTtcbiAgICAgICAgICB0aGlzLmVuZEFtUG1TaWduYWwuc2V0KCdBTScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVRpbWVTdHJpbmcodGltZVN0cmluZzogc3RyaW5nLCBpc1N0YXJ0OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXMxMkhvdXJGb3JtYXQoKSkge1xuICAgICAgLy8gUGFyc2UgMTItaG91ciBmb3JtYXQ6IFwiMTA6MDAgUE1cIlxuICAgICAgY29uc3QgbWF0Y2ggPSB0aW1lU3RyaW5nLm1hdGNoKC8oXFxkKyk6KFxcZCspXFxzKihBTXxQTSkvaSk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgY29uc3QgaG91ciA9IHBhcnNlSW50KG1hdGNoWzFdKTtcbiAgICAgICAgY29uc3QgbWludXRlID0gcGFyc2VJbnQobWF0Y2hbMl0pO1xuICAgICAgICBjb25zdCBhbVBtID0gbWF0Y2hbM10udG9VcHBlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChpc1N0YXJ0KSB7XG4gICAgICAgICAgdGhpcy5zdGFydEhvdXJTaWduYWwuc2V0KGhvdXIpO1xuICAgICAgICAgIHRoaXMuc3RhcnRNaW51dGVTaWduYWwuc2V0KG1pbnV0ZSk7XG4gICAgICAgICAgdGhpcy5zdGFydEFtUG1TaWduYWwuc2V0KGFtUG0pO1xuICAgICAgICAgIC8vIEFsc28gc2V0IDI0LWhvdXIgdmFsdWUgZm9yIGNvbnNpc3RlbmN5XG4gICAgICAgICAgdGhpcy5zdGFydEhvdXIyNFNpZ25hbC5zZXQoaG91ciA9PT0gMTIgPyAoYW1QbSA9PT0gJ1BNJyA/IDEyIDogMCkgOiAoYW1QbSA9PT0gJ1BNJyA/IGhvdXIgKyAxMiA6IGhvdXIpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVuZEhvdXJTaWduYWwuc2V0KGhvdXIpO1xuICAgICAgICAgIHRoaXMuZW5kTWludXRlU2lnbmFsLnNldChtaW51dGUpO1xuICAgICAgICAgIHRoaXMuZW5kQW1QbVNpZ25hbC5zZXQoYW1QbSk7XG4gICAgICAgICAgLy8gQWxzbyBzZXQgMjQtaG91ciB2YWx1ZSBmb3IgY29uc2lzdGVuY3lcbiAgICAgICAgICB0aGlzLmVuZEhvdXIyNFNpZ25hbC5zZXQoaG91ciA9PT0gMTIgPyAoYW1QbSA9PT0gJ1BNJyA/IDEyIDogMCkgOiAoYW1QbSA9PT0gJ1BNJyA/IGhvdXIgKyAxMiA6IGhvdXIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQYXJzZSAyNC1ob3VyIGZvcm1hdDogXCIyMjowMFwiXG4gICAgICBjb25zdCBtYXRjaCA9IHRpbWVTdHJpbmcubWF0Y2goLyhcXGQrKTooXFxkKykvKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBjb25zdCBob3VyMjQgPSBwYXJzZUludChtYXRjaFsxXSk7XG4gICAgICAgIGNvbnN0IG1pbnV0ZSA9IHBhcnNlSW50KG1hdGNoWzJdKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChpc1N0YXJ0KSB7XG4gICAgICAgICAgLy8gU3RvcmUgZGlyZWN0bHkgaW4gMjQtaG91ciBmb3JtYXRcbiAgICAgICAgICB0aGlzLnN0YXJ0SG91cjI0U2lnbmFsLnNldChob3VyMjQpO1xuICAgICAgICAgIHRoaXMuc3RhcnRNaW51dGVTaWduYWwuc2V0KG1pbnV0ZSk7XG4gICAgICAgICAgLy8gQWxzbyBzZXQgMTItaG91ciB2YWx1ZXMgZm9yIGNvbnNpc3RlbmN5ICh0aG91Z2ggbm90IHVzZWQgaW4gMjQtaG91ciBtb2RlKVxuICAgICAgICAgIGlmIChob3VyMjQgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRIb3VyU2lnbmFsLnNldCgxMik7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0QW1QbVNpZ25hbC5zZXQoJ0FNJyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChob3VyMjQgPT09IDEyKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0SG91clNpZ25hbC5zZXQoMTIpO1xuICAgICAgICAgICAgdGhpcy5zdGFydEFtUG1TaWduYWwuc2V0KCdQTScpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaG91cjI0ID4gMTIpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRIb3VyU2lnbmFsLnNldChob3VyMjQgLSAxMik7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0QW1QbVNpZ25hbC5zZXQoJ1BNJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRIb3VyU2lnbmFsLnNldChob3VyMjQpO1xuICAgICAgICAgICAgdGhpcy5zdGFydEFtUG1TaWduYWwuc2V0KCdBTScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTdG9yZSBkaXJlY3RseSBpbiAyNC1ob3VyIGZvcm1hdFxuICAgICAgICAgIHRoaXMuZW5kSG91cjI0U2lnbmFsLnNldChob3VyMjQpO1xuICAgICAgICAgIHRoaXMuZW5kTWludXRlU2lnbmFsLnNldChtaW51dGUpO1xuICAgICAgICAgIC8vIEFsc28gc2V0IDEyLWhvdXIgdmFsdWVzIGZvciBjb25zaXN0ZW5jeSAodGhvdWdoIG5vdCB1c2VkIGluIDI0LWhvdXIgbW9kZSlcbiAgICAgICAgICBpZiAoaG91cjI0ID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmVuZEhvdXJTaWduYWwuc2V0KDEyKTtcbiAgICAgICAgICAgIHRoaXMuZW5kQW1QbVNpZ25hbC5zZXQoJ0FNJyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChob3VyMjQgPT09IDEyKSB7XG4gICAgICAgICAgICB0aGlzLmVuZEhvdXJTaWduYWwuc2V0KDEyKTtcbiAgICAgICAgICAgIHRoaXMuZW5kQW1QbVNpZ25hbC5zZXQoJ1BNJyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChob3VyMjQgPiAxMikge1xuICAgICAgICAgICAgdGhpcy5lbmRIb3VyU2lnbmFsLnNldChob3VyMjQgLSAxMik7XG4gICAgICAgICAgICB0aGlzLmVuZEFtUG1TaWduYWwuc2V0KCdQTScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVuZEhvdXJTaWduYWwuc2V0KGhvdXIyNCk7XG4gICAgICAgICAgICB0aGlzLmVuZEFtUG1TaWduYWwuc2V0KCdBTScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImRhdGVyYW5nZXBpY2tlci1jb250YWluZXJcIiBhcmlhLWxhYmVsPVwiZGF0ZSByYW5nZSBwaWNrZXJcIiBjZGtUcmFwRm9jdXMgW2Nka1RyYXBGb2N1c0F1dG9DYXB0dXJlXT1cInRydWVcIj5cbiAgPGRpdiBjbGFzcz1cImRhdGVyYW5nZXBpY2tlci1jb250YWluZXJfX3ZpZXdcIj5cbiAgICA8ZGl2IHRhYmluZGV4PVwiLTFcIiBjZGtGb2N1c0luaXRpYWw+PC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImRhdGEoKT8uZHBDb25maWc/LnJhbmdlcz8ubGVuZ3RoID4gMFwiIGNsYXNzPVwiZGF0ZXJhbmdlcGlja2VyLWNvbnRhaW5lcl9fcmFuZ2VzXCI+XG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRhdGEoKT8uZHBDb25maWc/LnJhbmdlcyA/PyBbXVwiID5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGl2ZS1yYW5nZScgOiBzZWxlY3RlZEl0ZW1MYWJlbCgpID09PSBpdGVtLmxhYmVsfVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFJhbmdlKGl0ZW0pXCJcbiAgICAgICAgICBjbGFzcz1cIm1pcy1idG5cIlxuICAgICAgICA+XG4gICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj4gPGJ1dHRvbiBjbGFzcz1cIm1pcy1idG5cIiBbbmdDbGFzc109XCJ7J2FjdGl2ZS1yYW5nZScgOiBzZWxlY3RlZEl0ZW1MYWJlbCgpID09PSAnQ3VzdG9tIFJhbmdlJ31cIiAoY2xpY2spPVwicmVzZXRSYW5nZSgpXCI+Q3VzdG9tIFJhbmdlPC9idXR0b24+IDwvZGl2PlxuICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlcl9fbGVmdFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRhdGVyYW5nZXBpY2tlci1jb250YWluZXJfX2hlYWRlcl9fcHJhYnVcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZGF0ZXJhbmdlcGlja2VyLWNvbnRhaW5lcl9fYXJyb3dfX2ljb25cIlxuICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgKGNsaWNrKT1cIiFpc1ByZXZpb3VzTW9udGhEaXNhYmxlZCgpICYmIG5hdmlnYXRlTW9udGgoJ1BSRVZJT1VTJylcIlxuICAgICAgICAgIChrZXl1cC5lbnRlcik9XCIhaXNQcmV2aW91c01vbnRoRGlzYWJsZWQoKSAmJiBuYXZpZ2F0ZU1vbnRoKCdQUkVWSU9VUycpXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiUHJldmlvdXMgTW9udGhcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdkaXNhYmxlZC1tb250aCc6IGlzUHJldmlvdXNNb250aERpc2FibGVkKClcbiAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyMCAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk0xOS43MDcxIDguNzA3MTFDMjAuMDk3NiA4LjMxNjU4IDIwLjA5NzYgNy42ODM0MiAxOS43MDcxIDcuMjkyODlMMTMuMzQzMSAwLjkyODkzM0MxMi45NTI2IDAuNTM4NDA5IDEyLjMxOTUgMC41Mzg0MDkgMTEuOTI4OSAwLjkyODkzM0MxMS41Mzg0IDEuMzE5NDYgMTEuNTM4NCAxLjk1MjYyIDExLjkyODkgMi4zNDMxNUwxNy41ODU4IDhMMTEuOTI4OSAxMy42NTY5QzExLjUzODQgMTQuMDQ3NCAxMS41Mzg0IDE0LjY4MDUgMTEuOTI4OSAxNS4wNzExQzEyLjMxOTUgMTUuNDYxNiAxMi45NTI2IDE1LjQ2MTYgMTMuMzQzMSAxNS4wNzExTDE5LjcwNzEgOC43MDcxMVpNLTguNzQyMjhlLTA4IDlMMTkgOUwxOSA3TDguNzQyMjhlLTA4IDdMLTguNzQyMjhlLTA4IDlaXCJcbiAgICAgICAgICAgICAgZmlsbD1cIiMxODFGMzNcIlxuICAgICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzcGFuPiB7eyBjdXJyZW50TW9udGgoKSB9fSB7eyBjdXJyZW50WWVhck51bWJlcigpIH19IDwvc3Bhbj5cbiAgICAgICAgPGRpdj48L2Rpdj5cbiAgICAgICAgPCEtLSBCdXR0b24gdmlzaWJsZSBpbiBtb2JpbGUgdmlldyAtLT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZGF0ZXJhbmdlcGlja2VyLWNvbnRhaW5lcl9fYXJyb3dfX2ljb24gbW9iaWxlX3ZpZXdcIlxuICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgKGNsaWNrKT1cIiFpc05leHRNb250aERpc2FibGVkKCkgJiYgbmF2aWdhdGVNb250aCgnTkVYVCcpXCJcbiAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiIWlzTmV4dE1vbnRoRGlzYWJsZWQoKSAmJiBuYXZpZ2F0ZU1vbnRoKCdORVhUJylcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJOZXh0IE1vbnRoXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnZGlzYWJsZWQtbW9udGgnOiBpc05leHRNb250aERpc2FibGVkKClcbiAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyMCAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk0xOS43MDcxIDguNzA3MTFDMjAuMDk3NiA4LjMxNjU4IDIwLjA5NzYgNy42ODM0MiAxOS43MDcxIDcuMjkyODlMMTMuMzQzMSAwLjkyODkzM0MxMi45NTI2IDAuNTM4NDA5IDEyLjMxOTUgMC41Mzg0MDkgMTEuOTI4OSAwLjkyODkzM0MxMS41Mzg0IDEuMzE5NDYgMTEuNTM4NCAxLjk1MjYyIDExLjkyODkgMi4zNDMxNUwxNy41ODU4IDhMMTEuOTI4OSAxMy42NTY5QzExLjUzODQgMTQuMDQ3NCAxMS41Mzg0IDE0LjY4MDUgMTEuOTI4OSAxNS4wNzExQzEyLjMxOTUgMTUuNDYxNiAxMi45NTI2IDE1LjQ2MTYgMTMuMzQzMSAxNS4wNzExTDE5LjcwNzEgOC43MDcxMVpNLTguNzQyMjhlLTA4IDlMMTkgOUwxOSA3TDguNzQyMjhlLTA4IDdMLTguNzQyMjhlLTA4IDlaXCJcbiAgICAgICAgICAgICAgZmlsbD1cIiMxODFGMzNcIlxuICAgICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYXRlcmFuZ2VwaWNrZXItY29udGFpbmVyX19ib2R5XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlcmFuZ2VwaWNrZXItY29udGFpbmVyX193ZWVrZGF5c1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlcmFuZ2VwaWNrZXItY29udGFpbmVyX193ZWVrZGF5XCIgKm5nRm9yPVwibGV0IHdlZWtEYXkgb2Ygd2Vla0RheXMoKVwiPlxuICAgICAgICAgICAgPHNwYW4+e3sgd2Vla0RheS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlcmFuZ2VwaWNrZXItY29udGFpbmVyX19kYXlzXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJkYXRlcmFuZ2VwaWNrZXItY29udGFpbmVyX19kYXlcIiBcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgJ3NlbGVjdGVkLXNhbWUtZGF5JzogZGF5LmlzU2VsZWN0ZWRTdGFydERheSAmJiBkYXkuaXNTZWxlY3RlZEVuZERheSxcbiAgICAgICAgICAgICAgJ3NlbGVjdGVkLXN0YXJ0LWRheSc6IGRheS5pc1NlbGVjdGVkU3RhcnREYXksXG4gICAgICAgICAgICAgICdzZWxlY3RlZC1lbmQtZGF5JzogZGF5LmlzU2VsZWN0ZWRFbmREYXksXG4gICAgICAgICAgICAgICdkaXNhYmxlZC1kYXknOiBkYXkuaXNEaXNhYmxlZERheSxcbiAgICAgICAgICAgICAgJ2luLXJhbmdlLWRheSc6IGRheS5pblJhbmdlRGF5LFxuICAgICAgICAgICAgICAnaXMtdmFsaWQtZGF0ZSc6IGRheS5kYXRlID4gMCAmJiAhKGRheS5pc1NlbGVjdGVkU3RhcnREYXkgJiYgZGF5LmlzU2VsZWN0ZWRFbmREYXkpXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBkYXkgb2YgY3VycmVudE1vbnRoRGF0ZXMoKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF5KCdMRUZUJywgZGF5KVwiXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2VsZWN0RGF5KCdMRUZUJywgZGF5KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJkYXkuZGF0ZSA+IDBcIlxuICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiZGF5LmlzRGlzYWJsZWREYXkgPyAtMSA6IDBcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInJldHJhY3REYXlNb250aChkYXkuZGF0ZSwgY3VycmVudE1vbnRoKCksIGN1cnJlbnRZZWFyTnVtYmVyKCkpXCI+XG4gICAgICAgICAgICAgIHt7IGRheS5kYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRhdGVwaWNrZXJfX3JpZ2h0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGF0ZXJhbmdlcGlja2VyLWNvbnRhaW5lcl9faGVhZGVyX19wcmFidVwiPlxuICAgICAgICA8ZGl2PjwvZGl2PlxuICAgICAgICA8c3Bhbj4ge3sgbmV4dE1vbnRoKCkgfX0ge3sgbmV4dFllYXJOdW1iZXIoKSB9fSA8L3NwYW4+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImRhdGVyYW5nZXBpY2tlci1jb250YWluZXJfX2Fycm93X19pY29uIHBjX3ZpZXdcIlxuICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgKGNsaWNrKT1cIiFpc05leHRNb250aERpc2FibGVkKCkgJiYgbmF2aWdhdGVNb250aCgnTkVYVCcpXCJcbiAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiIWlzTmV4dE1vbnRoRGlzYWJsZWQoKSAmJiBuYXZpZ2F0ZU1vbnRoKCdORVhUJylcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdkaXNhYmxlZC1tb250aCc6IGlzTmV4dE1vbnRoRGlzYWJsZWQoKVxuICAgICAgICAgIH1cIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDIwIDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTE5LjcwNzEgOC43MDcxMUMyMC4wOTc2IDguMzE2NTggMjAuMDk3NiA3LjY4MzQyIDE5LjcwNzEgNy4yOTI4OUwxMy4zNDMxIDAuOTI4OTMzQzEyLjk1MjYgMC41Mzg0MDkgMTIuMzE5NSAwLjUzODQwOSAxMS45Mjg5IDAuOTI4OTMzQzExLjUzODQgMS4zMTk0NiAxMS41Mzg0IDEuOTUyNjIgMTEuOTI4OSAyLjM0MzE1TDE3LjU4NTggOEwxMS45Mjg5IDEzLjY1NjlDMTEuNTM4NCAxNC4wNDc0IDExLjUzODQgMTQuNjgwNSAxMS45Mjg5IDE1LjA3MTFDMTIuMzE5NSAxNS40NjE2IDEyLjk1MjYgMTUuNDYxNiAxMy4zNDMxIDE1LjA3MTFMMTkuNzA3MSA4LjcwNzExWk0tOC43NDIyOGUtMDggOUwxOSA5TDE5IDdMOC43NDIyOGUtMDggN0wtOC43NDIyOGUtMDggOVpcIlxuICAgICAgICAgICAgICBmaWxsPVwiIzE4MUYzM1wiXG4gICAgICAgICAgICA+PC9wYXRoPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRhdGVyYW5nZXBpY2tlci1jb250YWluZXJfX2JvZHlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGVyYW5nZXBpY2tlci1jb250YWluZXJfX3dlZWtkYXlzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGVyYW5nZXBpY2tlci1jb250YWluZXJfX3dlZWtkYXlcIiAqbmdGb3I9XCJsZXQgd2Vla0RheSBvZiB3ZWVrRGF5cygpXCI+XG4gICAgICAgICAgICA8c3Bhbj57eyB3ZWVrRGF5LmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGVyYW5nZXBpY2tlci1jb250YWluZXJfX2RheXNcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImRhdGVyYW5nZXBpY2tlci1jb250YWluZXJfX2RheVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICdzZWxlY3RlZC1zYW1lLWRheSc6IGRheS5pc1NlbGVjdGVkU3RhcnREYXkgJiYgZGF5LmlzU2VsZWN0ZWRFbmREYXksXG4gICAgICAgICAgICAgICdzZWxlY3RlZC1zdGFydC1kYXknOiBkYXkuaXNTZWxlY3RlZFN0YXJ0RGF5LFxuICAgICAgICAgICAgICAnc2VsZWN0ZWQtZW5kLWRheSc6IGRheS5pc1NlbGVjdGVkRW5kRGF5LFxuICAgICAgICAgICAgICAnZGlzYWJsZWQtZGF5JzogZGF5LmlzRGlzYWJsZWREYXksXG4gICAgICAgICAgICAgICdpbi1yYW5nZS1kYXknOiBkYXkuaW5SYW5nZURheSxcbiAgICAgICAgICAgICAgJ2lzLXZhbGlkLWRhdGUnOiBkYXkuZGF0ZSA+IDAgJiYgIShkYXkuaXNTZWxlY3RlZFN0YXJ0RGF5ICYmIGRheS5pc1NlbGVjdGVkRW5kRGF5KVxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF5IG9mIG5leHRNb250aERhdGVzKClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERheSgnUklHSFQnLCBkYXkpXCJcbiAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZWxlY3REYXkoJ1JJR0hUJywgZGF5KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJkYXkuZGF0ZSA+IDBcIlxuICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiZGF5LmlzRGlzYWJsZWREYXkgPyAtMSA6IDBcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInJldHJhY3REYXlNb250aChkYXkuZGF0ZSwgbmV4dE1vbnRoKCksIG5leHRZZWFyTnVtYmVyKCkpXCI+XG4gICAgICAgICAgICAgIHt7IGRheS5kYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICBcbiAgPCEtLSBUaW1lIFNlbGVjdGlvbiBTZWN0aW9uIC0tPlxuICA8ZGl2IGNsYXNzPVwiZGF0ZXJhbmdlcGlja2VyLWNvbnRhaW5lcl9fdGltZVwiICpuZ0lmPVwiZGF0YSgpLmRwQ29uZmlnLmVuYWJsZVRpbWUgPT09IHRydWVcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGltZS1zZWN0aW9uXCI+XG4gICAgICA8aDQ+RnJvbTwvaDQ+XG4gICAgICA8ZGl2IGNsYXNzPVwidGltZS1pbnB1dHNcIj5cbiAgICAgICAgPGlucHV0IFxuICAgICAgICAgIHR5cGU9XCJudW1iZXJcIiBcbiAgICAgICAgICBbbmdNb2RlbF09XCJpczEySG91ckZvcm1hdCgpID8gc3RhcnRIb3VyKCkgOiBzdGFydEhvdXIyNCgpXCIgXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiaXMxMkhvdXJGb3JtYXQoKSA/IHN0YXJ0SG91clNpZ25hbC5zZXQoJGV2ZW50KSA6IHN0YXJ0SG91cjI0U2lnbmFsLnNldCgkZXZlbnQpOyBvblN0YXJ0SG91cklucHV0KClcIlxuICAgICAgICAgIFttaW5dPVwiaXMxMkhvdXJGb3JtYXQoKSA/IDEgOiAwXCIgXG4gICAgICAgICAgW21heF09XCJpczEySG91ckZvcm1hdCgpID8gMTIgOiAyM1wiIFxuICAgICAgICAgIHN0ZXA9XCIxXCJcbiAgICAgICAgICBjbGFzcz1cInRpbWUtaW5wdXQgaG91ci1pbnB1dFwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJISFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRpbWUtc2VwYXJhdG9yXCI+Ojwvc3Bhbj5cbiAgICAgICAgPGlucHV0IFxuICAgICAgICAgIHR5cGU9XCJudW1iZXJcIiBcbiAgICAgICAgICBbbmdNb2RlbF09XCJzdGFydE1pbnV0ZSgpXCIgKG5nTW9kZWxDaGFuZ2UpPVwic3RhcnRNaW51dGVTaWduYWwuc2V0KCRldmVudClcIiBcbiAgICAgICAgICAoaW5wdXQpPVwib25TdGFydE1pbnV0ZUlucHV0KClcIlxuICAgICAgICAgIG1pbj1cIjBcIiBcbiAgICAgICAgICBtYXg9XCI1OVwiIFxuICAgICAgICAgIHN0ZXA9XCIxXCJcbiAgICAgICAgICBjbGFzcz1cInRpbWUtaW5wdXQgbWludXRlLWlucHV0XCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIk1NXCI+XG4gICAgICAgIDxzZWxlY3QgXG4gICAgICAgICAgW25nTW9kZWxdPVwic3RhcnRBbVBtKClcIiAobmdNb2RlbENoYW5nZSk9XCJzdGFydEFtUG1TaWduYWwuc2V0KCRldmVudClcIiBcbiAgICAgICAgICBjbGFzcz1cImFtLXBtLXNlbGVjdG9yXCJcbiAgICAgICAgICAqbmdJZj1cImlzMTJIb3VyRm9ybWF0KClcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiQU1cIj5BTTwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJQTVwiPlBNPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgXG4gICAgPGRpdiBjbGFzcz1cInRpbWUtc2VjdGlvblwiPlxuICAgICAgPGg0PlRvPC9oND5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWlucHV0c1wiPlxuICAgICAgICA8aW5wdXQgXG4gICAgICAgICAgdHlwZT1cIm51bWJlclwiIFxuICAgICAgICAgIFtuZ01vZGVsXT1cImlzMTJIb3VyRm9ybWF0KCkgPyBlbmRIb3VyKCkgOiBlbmRIb3VyMjQoKVwiIFxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImlzMTJIb3VyRm9ybWF0KCkgPyBlbmRIb3VyU2lnbmFsLnNldCgkZXZlbnQpIDogZW5kSG91cjI0U2lnbmFsLnNldCgkZXZlbnQpOyBvbkVuZEhvdXJJbnB1dCgpXCJcbiAgICAgICAgICBbbWluXT1cImlzMTJIb3VyRm9ybWF0KCkgPyAxIDogMFwiIFxuICAgICAgICAgIFttYXhdPVwiaXMxMkhvdXJGb3JtYXQoKSA/IDEyIDogMjNcIiBcbiAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0IGhvdXItaW5wdXRcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiSEhcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lLXNlcGFyYXRvclwiPjo8L3NwYW4+XG4gICAgICAgIDxpbnB1dCBcbiAgICAgICAgICB0eXBlPVwibnVtYmVyXCIgXG4gICAgICAgICAgW25nTW9kZWxdPVwiZW5kTWludXRlKClcIiAobmdNb2RlbENoYW5nZSk9XCJlbmRNaW51dGVTaWduYWwuc2V0KCRldmVudClcIiBcbiAgICAgICAgICAoaW5wdXQpPVwib25FbmRNaW51dGVJbnB1dCgpXCJcbiAgICAgICAgICBtaW49XCIwXCIgXG4gICAgICAgICAgbWF4PVwiNTlcIiBcbiAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0IG1pbnV0ZS1pbnB1dFwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJNTVwiPlxuICAgICAgICA8c2VsZWN0IFxuICAgICAgICAgIFtuZ01vZGVsXT1cImVuZEFtUG0oKVwiIChuZ01vZGVsQ2hhbmdlKT1cImVuZEFtUG1TaWduYWwuc2V0KCRldmVudClcIiBcbiAgICAgICAgICBjbGFzcz1cImFtLXBtLXNlbGVjdG9yXCJcbiAgICAgICAgICAqbmdJZj1cImlzMTJIb3VyRm9ybWF0KClcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiQU1cIj5BTTwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJQTVwiPlBNPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICBcbiAgPGRpdiBjbGFzcz1cImRhdGVyYW5nZXBpY2tlcl9fZm9vdGVyXCI+XG4gICAgPGJ1dHRvbiBtaXMtYnV0dG9uIHR5cGU9XCJub25lXCIgaWQ9J21vYmlsZS1mb290ZXItYnRuJyAoY2xpY2spPVwiY2FuY2VsRGF0ZVBpY2tlcigpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgPGJ1dHRvbiBtaXMtYnV0dG9uIHR5cGU9XCJwcmltYXJ5XCIgaWQ9XCJtb2JpbGUtZm9vdGVyLWJ0blwiIChjbGljayk9XCJhcHBseURhdGVzKClcIiBbZGlzYWJsZWRdPVwiIWlzRGF0ZXNWYWxpZCgpXCI+QXBwbHk8L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
1159
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHotZHJwLWNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9taXMtY29tcG9uZW50cy9kYXRlcmFuZ2VwaWNrZXJfdjIvdHotZHJwLWNvbnRhaW5lci90ei1kcnAtY29udGFpbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21pcy1jb21wb25lbnRzL2RhdGVyYW5nZXBpY2tlcl92Mi90ei1kcnAtY29udGFpbmVyL3R6LWRycC1jb250YWluZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFVLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUzRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBR3BDLE9BQU8sS0FBZ0IsTUFBTSxPQUFPLENBQUM7QUFDckMsT0FBTyxRQUFRLE1BQU0sdUJBQXVCLENBQUM7QUFDN0MsT0FBTyxHQUFHLE1BQU0sa0JBQWtCLENBQUM7QUFDbkMsT0FBTyxhQUFhLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxjQUFjLE1BQU0sNkJBQTZCLENBQUM7QUFDekQsT0FBTyxpQkFBaUIsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUM5RCxPQUFPLFNBQVMsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7OztJQ1B2QyxBQURGLDJCQUEwRCxpQkFLdkQ7SUFGQyxvTkFBUywyQkFBaUIsS0FBQztJQUczQixZQUNGO0lBQ0YsQUFERSxpQkFBUyxFQUNMOzs7O0lBTkosY0FBaUU7SUFBakUsa0dBQWlFO0lBSS9ELGNBQ0Y7SUFERSw4Q0FDRjs7OztJQVJKLCtCQUE0RjtJQUMxRiwrRUFBMEQ7SUFTcEQs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SCxBQURFLEFBRG9ILGlCQUFTLEVBQ3ZILEVBQ0Y7OztZQWpONkUsOENBQWdDO1lBR3pHLGVBQTBDO1lBQTFDLDhLQUEwQztZQW9CMUMsZUFFRTtZQUZGLG9GQUVFO1lBU0csZUFBK0M7WUFBL0MsaUZBQStDO1lBU3BELGVBRUU7WUFGRixnRkFFRTtZQVlrRSxlQUFhO1lBQWIsd0NBQWE7WUFlL0QsZUFBc0I7WUFBdEIsaURBQXNCO1lBZ0JuQyxlQUF5QztZQUF6QywyRUFBeUM7WUFNOUMsY0FFRTtZQUZGLGdGQUVFO1lBWWtFLGVBQWE7WUFBYix3Q0FBYTtZQWUvRCxlQUFtQjtZQUFuQiw4Q0FBbUI7WUFnQkMsY0FBeUM7WUFBekMsOERBQXlDO1lBb0VMLGVBQTRCO1lBQTVCLDhDQUE0Qjs7O2lGRHRMbkcsdUJBQXVCO2NBTG5DLFNBQVM7MkJBQ0UsWUFBWTs7c0JBK0hULE1BQU07dUJBQUMsY0FBYztnREE4RGxDLFVBQVU7a0JBRFQsWUFBWTttQkFBQyxhQUFhOztrRkF4TGhCLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBJbmplY3QsIE9uSW5pdCwgc2lnbmFsLCBjb21wdXRlZCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDT05UQUlORVJfREFUQSwgREFURV9GT1JNQVQgfSBmcm9tIFwiLi4vZGF0ZXJhbmdlcGlja2VyLWNvbnN0YW50c1wiO1xuaW1wb3J0IHsgSUN1cnJlbnRNb250aCwgSUN1cnJlbnRNb250aERhdGVzLCBJRGF0ZVBpY2tlckRhdGEsIElXZWVrRGF5LCBJU2VsZWN0ZWREYXRlc0NvbmZpZywgUmFuZ2VJdGVtIH0gZnJvbSBcIi4uL21vZGVscy9kcnAtY29uZmlnLm1vZGVsXCI7XG5pbXBvcnQgeyBnZXRNb250aCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSBcIm1pcy1jcnlzdGFsLWRlc2lnbi1zeXN0ZW0vdG9hc3RcIjtcblxuaW1wb3J0IGRheWpzLCB7IERheWpzIH0gZnJvbSAnZGF5anMnO1xuaW1wb3J0IHRpbWV6b25lIGZyb20gJ2RheWpzL3BsdWdpbi90aW1lem9uZSc7XG5pbXBvcnQgdXRjIGZyb20gJ2RheWpzL3BsdWdpbi91dGMnO1xuaW1wb3J0IGlzU2FtZU9yQWZ0ZXIgZnJvbSAnZGF5anMvcGx1Z2luL2lzU2FtZU9yQWZ0ZXInO1xuaW1wb3J0IGlzU2FtZU9yQmVmb3JlIGZyb20gJ2RheWpzL3BsdWdpbi9pc1NhbWVPckJlZm9yZSc7XG5pbXBvcnQgY3VzdG9tUGFyc2VGb3JtYXQgZnJvbSAnZGF5anMvcGx1Z2luL2N1c3RvbVBhcnNlRm9ybWF0J1xuaW1wb3J0IGlzQmV0d2VlbiBmcm9tICdkYXlqcy9wbHVnaW4vaXNCZXR3ZWVuJztcbmRheWpzLmV4dGVuZChpc0JldHdlZW4pO1xuZGF5anMuZXh0ZW5kKHV0Yyk7XG5kYXlqcy5leHRlbmQodGltZXpvbmUpO1xuZGF5anMuZXh0ZW5kKGN1c3RvbVBhcnNlRm9ybWF0KTtcbmRheWpzLmV4dGVuZChpc1NhbWVPckFmdGVyKTtcbmRheWpzLmV4dGVuZChpc1NhbWVPckJlZm9yZSk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJtaXMtdHotZHJwXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vdHotZHJwLWNvbnRhaW5lci5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vdHotZHJwLWNvbnRhaW5lci5jb21wb25lbnQuc2Nzc1wiXVxufSlcbmV4cG9ydCBjbGFzcyBUekRycENvbnRhaW5lckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ1VTVE9NX1JBTkdFX0xBQkVMID0gXCJDdXN0b20gUmFuZ2VcIjtcbiAgcmVhZG9ubHkgZGF0YSA9IHNpZ25hbDxJRGF0ZVBpY2tlckRhdGE+KHRoaXMuaW5qZWN0ZWREYXRhKTtcbiAgcHJpdmF0ZSBkYXlqc0luc3RhbmNlID0gKC4uLmFyZ3MpID0+IHtcbiAgICByZXR1cm4gZGF5anMoLi4uYXJncyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFBhcnNlIGRhdGUgc3RyaW5nIHVzaW5nIGNvbmZpZ3VyZWQgZm9ybWF0IHdpdGggZmFsbGJhY2tcbiAgICovXG4gIHByaXZhdGUgcGFyc2VEYXRlV2l0aE11bHRpcGxlRm9ybWF0cyhkYXRlU3RyaW5nOiBzdHJpbmcpOiBkYXlqcy5EYXlqcyB7XG4gICAgaWYgKCFkYXRlU3RyaW5nIHx8IGRhdGVTdHJpbmcgPT09ICdJbnZhbGlkIERhdGUnIHx8IGRhdGVTdHJpbmcgPT09ICd1bmRlZmluZWQnIHx8IGRhdGVTdHJpbmcgPT09ICdudWxsJykge1xuICAgICAgcmV0dXJuIGRheWpzKCdpbnZhbGlkJyk7XG4gICAgfVxuXG4gICAgLy8gRmlyc3QgdHJ5IHRoZSBjb25maWd1cmVkIGZvcm1hdFxuICAgIGNvbnN0IGNvbmZpZ3VyZWRGb3JtYXQgPSB0aGlzLmRhdGEoKS5kcENvbmZpZz8uZm9ybWF0O1xuICAgIGlmIChjb25maWd1cmVkRm9ybWF0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBkYXlqcyhkYXRlU3RyaW5nLCBjb25maWd1cmVkRm9ybWF0KTtcbiAgICAgICAgaWYgKHBhcnNlZC5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VkO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBDb250aW51ZSB0byBmYWxsYmFjayBmb3JtYXRzXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgdG8gY29tbW9uIGZvcm1hdHMgaWYgY29uZmlndXJlZCBmb3JtYXQgZmFpbHNcbiAgICBjb25zdCBmYWxsYmFja0Zvcm1hdHMgPSBbXG4gICAgICAnREQvTU1NL1lZWVknLFxuICAgICAgJ0REL01NL1lZWVknLFxuICAgICAgJ0RELU1NTS1ZWVlZJyxcbiAgICAgICdERC1NTS1ZWVlZJyxcbiAgICAgICdZWVlZLU1NLUREJ1xuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IGZvcm1hdCBvZiBmYWxsYmFja0Zvcm1hdHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGRheWpzKGRhdGVTdHJpbmcsIGZvcm1hdCk7XG4gICAgICAgIGlmIChwYXJzZWQuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gQ29udGludWUgdG8gbmV4dCBmb3JtYXRcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBhbGwgZm9ybWF0cyBmYWlsLCB0cnkgcGFyc2luZyB3aXRob3V0IGZvcm1hdCAobGV0IGRheWpzIGd1ZXNzKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBkYXlqcyhkYXRlU3RyaW5nKTtcbiAgICAgIGlmIChwYXJzZWQuaXNWYWxpZCgpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHBhcnNlIGRhdGUgd2l0aCBhbnkgZm9ybWF0OicsIGRhdGVTdHJpbmcsIGVycm9yKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF5anMoJ2ludmFsaWQnKTtcbiAgfVxuICBwcml2YXRlIHJhd1dlZWtEYXlzOiBzdHJpbmdbXSA9IFtcIlNVTlwiLCBcIk1PTlwiLCBcIlRVRVwiLCBcIldFRFwiLCBcIlRIVVwiLCBcIkZSSVwiLCBcIlNBVFwiXTtcbiAgXG4gIC8vIFNpZ25hbC1iYXNlZCBzdGF0ZSBtYW5hZ2VtZW50XG4gIHByaXZhdGUgcmVhZG9ubHkgd2Vla0RheXNTaWduYWwgPSBzaWduYWw8SVdlZWtEYXlbXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRNb250aE51bWJlclNpZ25hbCA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRNb250aFNpZ25hbCA9IHNpZ25hbDxJQ3VycmVudE1vbnRoPihcIkphbnVhcnlcIik7XG4gIHByaXZhdGUgcmVhZG9ubHkgY3VycmVudFllYXJOdW1iZXJTaWduYWwgPSBzaWduYWw8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW50TW9udGhEYXRlc1NpZ25hbCA9IHNpZ25hbDxJQ3VycmVudE1vbnRoRGF0ZXNbXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IG5leHRNb250aE51bWJlclNpZ25hbCA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcml2YXRlIHJlYWRvbmx5IG5leHRNb250aFNpZ25hbCA9IHNpZ25hbDxJQ3VycmVudE1vbnRoPihcIkphbnVhcnlcIik7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmV4dFllYXJOdW1iZXJTaWduYWwgPSBzaWduYWw8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXh0TW9udGhEYXRlc1NpZ25hbCA9IHNpZ25hbDxJQ3VycmVudE1vbnRoRGF0ZXNbXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzUHJldmlvdXNNb250aERpc2FibGVkU2lnbmFsID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpc05leHRNb250aERpc2FibGVkU2lnbmFsID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3Rpb25TdGFydGVkU2lnbmFsID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhbFNlbGVjdGVkRGF0ZXNTaWduYWwgPSBzaWduYWw8SVNlbGVjdGVkRGF0ZXNDb25maWc+KHsgc3RhcnREYXRlOiBudWxsLCBlbmREYXRlOiBudWxsIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzRGF0ZXNWYWxpZFNpZ25hbCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0ZWRJdGVtTGFiZWxTaWduYWwgPSBzaWduYWw8c3RyaW5nPih0aGlzLkNVU1RPTV9SQU5HRV9MQUJFTCk7XG4gIFxuICAvLyBUaW1lIHNlbGVjdGlvbiBzaWduYWxzXG4gIHJlYWRvbmx5IHN0YXJ0SG91clNpZ25hbCA9IHNpZ25hbDxudW1iZXI+KDEyKTtcbiAgcmVhZG9ubHkgc3RhcnRNaW51dGVTaWduYWwgPSBzaWduYWw8bnVtYmVyPigwKTtcbiAgcmVhZG9ubHkgc3RhcnRBbVBtU2lnbmFsID0gc2lnbmFsPHN0cmluZz4oJ0FNJyk7XG4gIHJlYWRvbmx5IGVuZEhvdXJTaWduYWwgPSBzaWduYWw8bnVtYmVyPigxMik7XG4gIHJlYWRvbmx5IGVuZE1pbnV0ZVNpZ25hbCA9IHNpZ25hbDxudW1iZXI+KDApO1xuICByZWFkb25seSBlbmRBbVBtU2lnbmFsID0gc2lnbmFsPHN0cmluZz4oJ0FNJyk7XG4gIHJlYWRvbmx5IHN0YXJ0SG91cjI0U2lnbmFsID0gc2lnbmFsPG51bWJlcj4oMTIpO1xuICByZWFkb25seSBlbmRIb3VyMjRTaWduYWwgPSBzaWduYWw8bnVtYmVyPigxMik7XG4gIFxuICAvLyBDb21wdXRlZCBwcm9wZXJ0aWVzIGZvciB0ZW1wbGF0ZSBhY2Nlc3NcbiAgd2Vla0RheXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLndlZWtEYXlzU2lnbmFsKCkpO1xuICBjdXJyZW50TW9udGhOdW1iZXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmN1cnJlbnRNb250aE51bWJlclNpZ25hbCgpKTtcbiAgY3VycmVudE1vbnRoID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jdXJyZW50TW9udGhTaWduYWwoKSk7XG4gIGN1cnJlbnRZZWFyTnVtYmVyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jdXJyZW50WWVhck51bWJlclNpZ25hbCgpKTtcbiAgbmV4dE1vbnRoTnVtYmVyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5uZXh0TW9udGhOdW1iZXJTaWduYWwoKSk7XG4gIG5leHRNb250aCA9IGNvbXB1dGVkKCgpID0+IHRoaXMubmV4dE1vbnRoU2lnbmFsKCkpO1xuICBuZXh0WWVhck51bWJlciA9IGNvbXB1dGVkKCgpID0+IHRoaXMubmV4dFllYXJOdW1iZXJTaWduYWwoKSk7XG4gIGlzUHJldmlvdXNNb250aERpc2FibGVkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5pc1ByZXZpb3VzTW9udGhEaXNhYmxlZFNpZ25hbCgpKTtcbiAgaXNOZXh0TW9udGhEaXNhYmxlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaXNOZXh0TW9udGhEaXNhYmxlZFNpZ25hbCgpKTtcbiAgc2VsZWN0aW9uU3RhcnRlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VsZWN0aW9uU3RhcnRlZFNpZ25hbCgpKTtcbiAgbG9jYWxTZWxlY3RlZERhdGVzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5sb2NhbFNlbGVjdGVkRGF0ZXNTaWduYWwoKSk7XG4gIGlzRGF0ZXNWYWxpZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaXNEYXRlc1ZhbGlkU2lnbmFsKCkpO1xuICBzZWxlY3RlZEl0ZW1MYWJlbCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VsZWN0ZWRJdGVtTGFiZWxTaWduYWwoKSk7XG4gIGN1cnJlbnRNb250aERhdGVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIC8vIERlcGVuZGVuY2llczogY3VycmVudE1vbnRoTnVtYmVyU2lnbmFsLCBjdXJyZW50WWVhck51bWJlclNpZ25hbCwgbG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsXG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVEYXRlcyh0aGlzLmN1cnJlbnRNb250aE51bWJlclNpZ25hbCgpLCB0aGlzLmN1cnJlbnRZZWFyTnVtYmVyU2lnbmFsKCkpO1xuICB9KTtcbiAgbmV4dE1vbnRoRGF0ZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAvLyBEZXBlbmRlbmNpZXM6IG5leHRNb250aE51bWJlclNpZ25hbCwgbmV4dFllYXJOdW1iZXJTaWduYWwsIGxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbFxuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVEYXRlcyh0aGlzLm5leHRNb250aE51bWJlclNpZ25hbCgpLCB0aGlzLm5leHRZZWFyTnVtYmVyU2lnbmFsKCkpO1xuICB9KTtcblxuXG4gIC8vIFRpbWUgZnVuY3Rpb25hbGl0eSBjb21wdXRlZCBwcm9wZXJ0aWVzXG4gIHN0YXJ0SG91ciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhcnRIb3VyU2lnbmFsKCkpO1xuICBzdGFydE1pbnV0ZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhcnRNaW51dGVTaWduYWwoKSk7XG4gIHN0YXJ0QW1QbSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhcnRBbVBtU2lnbmFsKCkpO1xuICBlbmRIb3VyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5lbmRIb3VyU2lnbmFsKCkpO1xuICBlbmRNaW51dGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmVuZE1pbnV0ZVNpZ25hbCgpKTtcbiAgZW5kQW1QbSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZW5kQW1QbVNpZ25hbCgpKTtcbiAgc3RhcnRIb3VyMjQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnN0YXJ0SG91cjI0U2lnbmFsKCkpO1xuICBlbmRIb3VyMjQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmVuZEhvdXIyNFNpZ25hbCgpKTtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KENPTlRBSU5FUl9EQVRBKSBwcml2YXRlIGluamVjdGVkRGF0YTogSURhdGVQaWNrZXJEYXRhLCBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UpIHtcbiAgICB0aGlzLmRhdGEgPSBzaWduYWw8SURhdGVQaWNrZXJEYXRhPih0aGlzLmluamVjdGVkRGF0YSk7IFxuICAgIHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsLnNldCh0aGlzLmRhdGEoKS5kYXRlcyk7XG4gICAgdGhpcy5pc0RhdGVzVmFsaWRTaWduYWwuc2V0KGZhbHNlKTtcbiAgICBpZiAodGhpcy5kYXRhKCkuZGF0ZXMuc3RhcnREYXRlICYmIHRoaXMuZGF0YSgpLmRhdGVzLmVuZERhdGUpIHtcbiAgICAgIHRoaXMuaXNEYXRlc1ZhbGlkU2lnbmFsLnNldCh0cnVlKTtcbiAgICB9XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBzZWxlY3RlZEl0ZW1MYWJlbCBmcm9tIGRhdGEuc2VsZWN0ZWRSYW5nZUxhYmVsIGlmIGF2YWlsYWJsZVxuICAgIGlmICh0aGlzLmRhdGEoKS5zZWxlY3RlZFJhbmdlTGFiZWwpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtTGFiZWxTaWduYWwuc2V0KHRoaXMuZGF0YSgpLnNlbGVjdGVkUmFuZ2VMYWJlbCk7XG4gICAgfVxuICAgIFxuICAgIC8vIEluaXRpYWxpemUgZGF5anNJbnN0YW5jZSB3aXRoIHRpbWV6b25lIGhhbmRsaW5nXG4gICAgaWYgKHRoaXMuZGF0YSgpPy5kcENvbmZpZz8udGltZXpvbmUpIHtcbiAgICAgIHRoaXMuZGF5anNJbnN0YW5jZSA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGRheWpzLnR6KGFyZ3NbMF0sIGFyZ3NbMV0gfHwgJ0REL01NL1lZWVknLCB0aGlzLmRhdGEoKS5kcENvbmZpZy50aW1lem9uZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciBwYXJzaW5nIGRhdGUgd2l0aCB0aW1lem9uZTonLCBlcnJvciwgJ2FyZ3M6JywgYXJncyk7XG4gICAgICAgICAgcmV0dXJuIGRheWpzKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFNldCBkZWZhdWx0IHZhbHVlcyBzYWZlbHkgdXNpbmcgc2lnbmFsc1xuICAgIHRoaXMuY3VycmVudE1vbnRoTnVtYmVyU2lnbmFsLnNldCh0aGlzLmRheWpzSW5zdGFuY2UoKS5tb250aCgpKTtcbiAgICB0aGlzLm5leHRNb250aE51bWJlclNpZ25hbC5zZXQodGhpcy5kYXlqc0luc3RhbmNlKCkuYWRkKDEsIFwibW9udGhcIikubW9udGgoKSk7XG4gICAgdGhpcy5jdXJyZW50TW9udGhTaWduYWwuc2V0KGdldE1vbnRoKHRoaXMuY3VycmVudE1vbnRoTnVtYmVyU2lnbmFsKCkpKTtcbiAgICB0aGlzLm5leHRNb250aFNpZ25hbC5zZXQoZ2V0TW9udGgodGhpcy5uZXh0TW9udGhOdW1iZXJTaWduYWwoKSkpO1xuICAgIHRoaXMuY3VycmVudFllYXJOdW1iZXJTaWduYWwuc2V0KHRoaXMuZGF5anNJbnN0YW5jZSgpLnllYXIoKSk7XG4gICAgdGhpcy5uZXh0WWVhck51bWJlclNpZ25hbC5zZXQodGhpcy5kYXlqc0luc3RhbmNlKCkuYWRkKDEsIFwibW9udGhcIikueWVhcigpKTtcbiAgICB0aGlzLndlZWtEYXlzU2lnbmFsLnNldCh0aGlzLnJhd1dlZWtEYXlzLm1hcCgoZGF5LCBpbmRleCkgPT4gKHtcbiAgICAgIGxhYmVsOiBgJHtkYXlbMF19JHtkYXkuc2xpY2UoMSkudG9Mb3dlckNhc2UoKX1gLFxuICAgICAgaXNDdXJyZW50RGF5OiB0aGlzLmRheWpzSW5zdGFuY2UoKS5kYXkoKSA9PT0gaW5kZXhcbiAgICB9KSkpO1xuICAgIFxuICAgIGlmICghdGhpcy5kYXRhKCk/LmRwQ29uZmlnPy5mb3JtYXQpIHtcbiAgICAgIHRoaXMuZGF0YSgpLmRwQ29uZmlnID0ge1xuICAgICAgICAuLi50aGlzLmRhdGEoKS5kcENvbmZpZyxcbiAgICAgICAgZm9ybWF0OiBEQVRFX0ZPUk1BVFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY2FsZW5kYXIgZnJvbSBpbml0aWFsIHNlbGVjdGVkIGRhdGVzXG4gICAgdGhpcy51cGRhdGVDYWxlbmRhckZyb21TZWxlY3RlZERhdGVzKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbGN1bGF0ZU1pbk1heERheXMoKTtcbiAgICB0aGlzLmluaXRpYWxpemVUaW1lVmFsdWVzKCk7XG5cbiAgICBpZih0aGlzLmRhdGEoKT8uc2hvd1ByZXZNb250aCAmJiAhdGhpcy5pc1ByZXZpb3VzTW9udGhEaXNhYmxlZCl7XG4gICAgICB0aGlzLm5hdmlnYXRlTW9udGgoJ1BSRVZJT1VTJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0cmFjdERheU1vbnRoKGRheTogYW55LCBtb250aDogYW55LCB5ZWFyOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiBgJHtkYXl9ICR7bW9udGh9ICR7eWVhcn1gO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcihcImtleWRvd24uZXNjXCIpXG4gIGNsb3NlT25Fc2MoKSB7XG4gICAgdGhpcy5jYW5jZWxEYXRlUGlja2VyKCk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZU1pbk1heERheXMoKSB7XG4gICAgY29uc3QgY3VycmVudEluc3RhbmNlID0gdGhpcy5kYXlqc0luc3RhbmNlKCkueWVhcih0aGlzLmN1cnJlbnRZZWFyTnVtYmVyU2lnbmFsKCkpLm1vbnRoKHRoaXMuY3VycmVudE1vbnRoTnVtYmVyU2lnbmFsKCkpO1xuICAgIGNvbnN0IG1pbkRhdGUgPSAhIXRoaXMuZGF0YSgpLmRwQ29uZmlnLm1pbkRhdGUgPyB0aGlzLmRheWpzSW5zdGFuY2UodGhpcy5kYXRhKCkuZHBDb25maWcubWluRGF0ZSwgdGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0KSA6IGRheWpzKCdpbnZhbGlkJyk7XG4gICAgaWYgKG1pbkRhdGUuaXNWYWxpZCgpKSB7XG4gICAgICB0aGlzLmlzUHJldmlvdXNNb250aERpc2FibGVkU2lnbmFsLnNldChtaW5EYXRlLmlzU2FtZU9yQWZ0ZXIoY3VycmVudEluc3RhbmNlLCBcIm1vbnRoXCIpKTtcbiAgICB9XG4gICAgY29uc3QgbWF4RGF0ZSA9ICEhdGhpcy5kYXRhKCkuZHBDb25maWcubWF4RGF0ZSA/IHRoaXMuZGF5anNJbnN0YW5jZSh0aGlzLmRhdGEoKS5kcENvbmZpZy5tYXhEYXRlLCB0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQpIDogZGF5anMoJ2ludmFsaWQnKTtcbiAgICBpZiAobWF4RGF0ZS5pc1ZhbGlkKCkpIHtcbiAgICAgIHRoaXMuaXNOZXh0TW9udGhEaXNhYmxlZFNpZ25hbC5zZXQobWF4RGF0ZS5pc1NhbWVPckJlZm9yZShjdXJyZW50SW5zdGFuY2UsIFwibW9udGhcIikpO1xuICAgIH1cbiAgfVxuXG4gIG5hdmlnYXRlTW9udGgoZGlyZWN0aW9uOiBcIk5FWFRcIiB8IFwiUFJFVklPVVNcIik6IHZvaWQge1xuICAgIGxldCB0aGlzTW9udGg6IERheWpzID0gZGF5anMoKS55ZWFyKHRoaXMuY3VycmVudFllYXJOdW1iZXJTaWduYWwoKSkubW9udGgodGhpcy5jdXJyZW50TW9udGhOdW1iZXJTaWduYWwoKSk7XG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gXCJORVhUXCIpIHtcbiAgICAgdGhpc01vbnRoID0gdGhpc01vbnRoLmFkZCgxLCBcIm1vbnRoXCIpO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSBcIlBSRVZJT1VTXCIpIHtcbiAgICAgdGhpc01vbnRoID0gdGhpc01vbnRoLnN1YnRyYWN0KDEsIFwibW9udGhcIik7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudE1vbnRoTnVtYmVyU2lnbmFsLnNldCh0aGlzTW9udGgubW9udGgoKSk7XG4gICAgdGhpcy5uZXh0TW9udGhOdW1iZXJTaWduYWwuc2V0KHRoaXNNb250aC5jbG9uZSgpLmFkZCgxLCBcIm1vbnRoXCIpLm1vbnRoKCkpO1xuICAgIHRoaXMuY3VycmVudE1vbnRoU2lnbmFsLnNldChnZXRNb250aCh0aGlzLmN1cnJlbnRNb250aE51bWJlclNpZ25hbCgpKSk7XG4gICAgdGhpcy5uZXh0TW9udGhTaWduYWwuc2V0KGdldE1vbnRoKHRoaXMubmV4dE1vbnRoTnVtYmVyU2lnbmFsKCkpKTtcbiAgICBpZiAodGhpcy5uZXh0TW9udGhOdW1iZXJTaWduYWwoKSA9PT0gMCAmJiBkaXJlY3Rpb24gPT09IFwiUFJFVklPVVNcIikge1xuICAgICB0aGlzLmN1cnJlbnRZZWFyTnVtYmVyU2lnbmFsLnNldCh0aGlzLmN1cnJlbnRZZWFyTnVtYmVyU2lnbmFsKCkgLSAxKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudE1vbnRoTnVtYmVyU2lnbmFsKCkgPT09IDExICYmIGRpcmVjdGlvbiA9PT0gXCJORVhUXCIpIHtcbiAgICAgdGhpcy5uZXh0WWVhck51bWJlclNpZ25hbC5zZXQodGhpcy5uZXh0WWVhck51bWJlclNpZ25hbCgpICsgMSk7XG4gICAgfWVsc2UgaWYgKHRoaXMuY3VycmVudE1vbnRoTnVtYmVyU2lnbmFsKCkgPT09IDAgJiYgZGlyZWN0aW9uID09PSBcIk5FWFRcIikge1xuICAgICB0aGlzLmN1cnJlbnRZZWFyTnVtYmVyU2lnbmFsLnNldCh0aGlzLmN1cnJlbnRZZWFyTnVtYmVyU2lnbmFsKCkgKyAxKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubmV4dE1vbnRoTnVtYmVyU2lnbmFsKCkgPT09IDExICYmIGRpcmVjdGlvbiA9PT0gXCJQUkVWSU9VU1wiKSB7XG4gICAgIHRoaXMubmV4dFllYXJOdW1iZXJTaWduYWwuc2V0KHRoaXMubmV4dFllYXJOdW1iZXJTaWduYWwoKSAtIDEpO1xuICAgIH1lbHNle1xuICAgICB0aGlzLm5leHRZZWFyTnVtYmVyU2lnbmFsLnNldCh0aGlzLmN1cnJlbnRZZWFyTnVtYmVyU2lnbmFsKCkpO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRNb250aERhdGVzU2lnbmFsLnNldCh0aGlzLmdlbmVyYXRlRGF0ZXModGhpcy5jdXJyZW50TW9udGhOdW1iZXIoKSwgdGhpcy5jdXJyZW50WWVhck51bWJlcigpKSk7XG4gICAgdGhpcy5uZXh0TW9udGhEYXRlc1NpZ25hbC5zZXQodGhpcy5nZW5lcmF0ZURhdGVzKHRoaXMubmV4dE1vbnRoTnVtYmVyKCksIHRoaXMubmV4dFllYXJOdW1iZXIoKSkpO1xuICAgIHRoaXMuY2FsY3VsYXRlTWluTWF4RGF5cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjYWxlbmRhciBtb250aC95ZWFyIGJhc2VkIG9uIHNlbGVjdGVkIGRhdGVzXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciBsb2NhbFNlbGVjdGVkRGF0ZXNTaWduYWwgY2hhbmdlcyB0byBrZWVwIGNhbGVuZGFyIGluIHN5bmNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ2FsZW5kYXJGcm9tU2VsZWN0ZWREYXRlcygpOiB2b2lkIHtcbiAgICBjb25zdCBsb2NhbFNlbGVjdGVkRGF0ZXMgPSB0aGlzLmxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbCgpO1xuICAgIGxldCBzZWxlY3RlZFN0YXJ0RGF0ZTogRGF5anM7XG5cbiAgICBpZiAobG9jYWxTZWxlY3RlZERhdGVzPy5zdGFydERhdGUpIHtcbiAgICAgICAgc2VsZWN0ZWRTdGFydERhdGUgPSB0aGlzLnBhcnNlRGF0ZVdpdGhNdWx0aXBsZUZvcm1hdHMobG9jYWxTZWxlY3RlZERhdGVzLnN0YXJ0RGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0ZWRTdGFydERhdGUgPSBkYXlqcygnaW52YWxpZCcpO1xuICAgIH1cblxuICAgIGlmIChzZWxlY3RlZFN0YXJ0RGF0ZS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50WWVhck51bWJlclNpZ25hbC5zZXQoc2VsZWN0ZWRTdGFydERhdGUueWVhcigpKTtcbiAgICAgICAgdGhpcy5uZXh0WWVhck51bWJlclNpZ25hbC5zZXQoc2VsZWN0ZWRTdGFydERhdGUuYWRkKDEsIFwibW9udGhcIikueWVhcigpKTtcbiAgICAgICAgdGhpcy5jdXJyZW50TW9udGhOdW1iZXJTaWduYWwuc2V0KHNlbGVjdGVkU3RhcnREYXRlLmdldChcIm1vbnRoXCIpKTtcbiAgICAgICAgdGhpcy5uZXh0TW9udGhOdW1iZXJTaWduYWwuc2V0KHNlbGVjdGVkU3RhcnREYXRlLmFkZCgxLCBcIm1vbnRoXCIpLm1vbnRoKCkpO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbmREYXRlID0gbG9jYWxTZWxlY3RlZERhdGVzPy5lbmREYXRlID8gdGhpcy5wYXJzZURhdGVXaXRoTXVsdGlwbGVGb3JtYXRzKGxvY2FsU2VsZWN0ZWREYXRlcy5lbmREYXRlKSA6IG51bGw7XG4gICAgICAgIFxuICAgICAgICBpZiAoc2VsZWN0ZWRFbmREYXRlICYmIHNlbGVjdGVkRW5kRGF0ZS5pc1ZhbGlkKCkgJiYgc2VsZWN0ZWRFbmREYXRlLmlzQWZ0ZXIoc2VsZWN0ZWRTdGFydERhdGUsICdtb250aCcpKSB7XG4gICAgICAgICAgICB0aGlzLm5leHRNb250aE51bWJlclNpZ25hbC5zZXQoc2VsZWN0ZWRFbmREYXRlLm1vbnRoKCkpO1xuICAgICAgICAgICAgdGhpcy5uZXh0WWVhck51bWJlclNpZ25hbC5zZXQoc2VsZWN0ZWRFbmREYXRlLnllYXIoKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgbW9udGggbGFiZWxzXG4gICAgICAgIHRoaXMuY3VycmVudE1vbnRoU2lnbmFsLnNldChnZXRNb250aCh0aGlzLmN1cnJlbnRNb250aE51bWJlclNpZ25hbCgpKSk7XG4gICAgICAgIHRoaXMubmV4dE1vbnRoU2lnbmFsLnNldChnZXRNb250aCh0aGlzLm5leHRNb250aE51bWJlclNpZ25hbCgpKSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGNhbGVuZGFyIGRhdGVzIHRvIHJlZmxlY3QgdGhlIHNlbGVjdGVkIGRhdGVzXG4gICAgICAgIHRoaXMuY3VycmVudE1vbnRoRGF0ZXNTaWduYWwuc2V0KHRoaXMuZ2VuZXJhdGVEYXRlcyh0aGlzLmN1cnJlbnRNb250aE51bWJlclNpZ25hbCgpLCB0aGlzLmN1cnJlbnRZZWFyTnVtYmVyU2lnbmFsKCkpKTtcbiAgICAgICAgdGhpcy5uZXh0TW9udGhEYXRlc1NpZ25hbC5zZXQodGhpcy5nZW5lcmF0ZURhdGVzKHRoaXMubmV4dE1vbnRoTnVtYmVyU2lnbmFsKCksIHRoaXMubmV4dFllYXJOdW1iZXJTaWduYWwoKSkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVEYXRlcyhtb250aDogbnVtYmVyLCBjdXJyZW50WWVhck51bWJlcjogbnVtYmVyKTogSUN1cnJlbnRNb250aERhdGVzW10ge1xuICAgIGxldCBkYXRlczogSUN1cnJlbnRNb250aERhdGVzW10gPSBbXTtcbiAgICBjb25zdCBkYXlzSW5Nb250aCA9IGRheWpzKCkueWVhcihjdXJyZW50WWVhck51bWJlcikubW9udGgobW9udGgpLmRheXNJbk1vbnRoKCk7XG4gICAgZm9yIChsZXQgY3VycmVudERhdGUgPSAxOyBjdXJyZW50RGF0ZSA8PSBkYXlzSW5Nb250aDsgY3VycmVudERhdGUrKykge1xuICAgICAgY29uc3QgZGF0ZSA9IGRheWpzKCkueWVhcihjdXJyZW50WWVhck51bWJlcikubW9udGgobW9udGgpLmRhdGUoY3VycmVudERhdGUpO1xuICAgICAgY29uc3QgZGF0ZVN0cmluZyA9IGRhdGUuZm9ybWF0KHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdCk7XG4gICAgICBsZXQgaXNEaXNhYmxlZERheSA9IHRoaXMuZGF0YSgpLmRhdGVzRGlzYWJsZWQuc29tZShkID0+IGQgPT09IGRhdGVTdHJpbmcpO1xuICAgICAgLy8gUGFyc2UgbWluL21heCBkYXRlcyBzYWZlbHkgLSB0cnkgZGF0ZS1vbmx5IGZvcm1hdCBmaXJzdCwgdGhlbiBmdWxsIGZvcm1hdFxuICAgICAgbGV0IG1pbkRhdGUgPSBudWxsO1xuICAgICAgbGV0IG1heERhdGUgPSBudWxsO1xuICAgICAgXG4gICAgXG4gICAgICBpZiAodGhpcy5kYXRhKCkuZHBDb25maWcubWluRGF0ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1pbkRhdGVTdHIgPSB0aGlzLmRhdGEoKS5kcENvbmZpZy5taW5EYXRlLnNwbGl0KCcgJylbMF07XG4gICAgICAgICAgbWluRGF0ZSA9IHRoaXMucGFyc2VEYXRlV2l0aE11bHRpcGxlRm9ybWF0cyhtaW5EYXRlU3RyKTtcbiAgICAgICAgICBpZiAoIW1pbkRhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICBtaW5EYXRlID0gZGF5anModGhpcy5kYXRhKCkuZHBDb25maWcubWluRGF0ZSwgdGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciBwYXJzaW5nIG1pbiBkYXRlOicsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodGhpcy5kYXRhKCkuZHBDb25maWcubWF4RGF0ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1heERhdGVTdHIgPSB0aGlzLmRhdGEoKS5kcENvbmZpZy5tYXhEYXRlLnNwbGl0KCcgJylbMF07XG4gICAgICAgICAgbWF4RGF0ZSA9IHRoaXMucGFyc2VEYXRlV2l0aE11bHRpcGxlRm9ybWF0cyhtYXhEYXRlU3RyKTtcbiAgICAgICAgICBpZiAoIW1heERhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICBtYXhEYXRlID0gZGF5anModGhpcy5kYXRhKCkuZHBDb25maWcubWF4RGF0ZSwgdGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciBwYXJzaW5nIG1heCBkYXRlOicsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoIWlzRGlzYWJsZWREYXkgJiYgbWluRGF0ZSAmJiBtaW5EYXRlLmlzVmFsaWQoKSkge1xuICAgICAgICAgIGlzRGlzYWJsZWREYXkgPSBtaW5EYXRlLmlzQWZ0ZXIoZGF0ZSwgXCJkYXlcIik7XG4gICAgICB9XG4gICAgICBpZiAoIWlzRGlzYWJsZWREYXkgJiYgbWF4RGF0ZSAmJiBtYXhEYXRlLmlzVmFsaWQoKSkge1xuICAgICAgICAgIGlzRGlzYWJsZWREYXkgPSBtYXhEYXRlLmlzQmVmb3JlKGRhdGUsIFwiZGF5XCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZGF0YSgpPy5kcENvbmZpZz8ubWF4QWxsb3dlZFJhbmdlID4gMCAmJlxuICAgICAgICAhaXNEaXNhYmxlZERheSAmJlxuICAgICAgICAodGhpcy5sb2NhbFNlbGVjdGVkRGF0ZXNTaWduYWwoKT8uc3RhcnREYXRlID8/IGZhbHNlKSAmJiAoISh0aGlzLmxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbCgpLmVuZERhdGUgPz8gZmFsc2UpKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMucGFyc2VEYXRlV2l0aE11bHRpcGxlRm9ybWF0cyh0aGlzLmxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbCgpPy5zdGFydERhdGUpLnN0YXJ0T2YoJ2RheScpO1xuICAgICAgICBjb25zdCBtYXhFbmREYXRlID0gc3RhcnREYXRlLmNsb25lKCkuYWRkKHRoaXMuZGF0YSgpLmRwQ29uZmlnLm1heEFsbG93ZWRSYW5nZSAtIDEsICdkYXlzJyk7XG4gICAgICAgIGlzRGlzYWJsZWREYXkgPSBkYXRlLmlzQWZ0ZXIobWF4RW5kRGF0ZSwgJ2RheScpIFxuICAgICAgfVxuICAgICAgY29uc3QgaXNDdXJyZW50RGF5ID1cbiAgICAgICAgdGhpcy5kYXlqc0luc3RhbmNlKCkueWVhcihjdXJyZW50WWVhck51bWJlcikubW9udGgobW9udGgpLmRhdGUoY3VycmVudERhdGUpLmZvcm1hdCh0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQpID09PVxuICAgICAgICB0aGlzLmRheWpzSW5zdGFuY2UoKS5mb3JtYXQodGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0KTtcbiAgICAgIFxuICAgICAgLy8gRXh0cmFjdCBkYXRlIHBhcnQgZm9yIGNvbXBhcmlzb24gKGhhbmRsZSBib3RoIGRhdGUtb25seSBhbmQgZGF0ZXRpbWUgZm9ybWF0cylcbiAgICAgIGxldCBzdGFydERhdGVTdHJpbmcgPSB0aGlzLmxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbCgpPy5zdGFydERhdGU7XG4gICAgICBsZXQgZW5kRGF0ZVN0cmluZyA9IHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsKCk/LmVuZERhdGU7XG4gICAgICBcbiAgICAgIC8vIE9ubHkgZXh0cmFjdCBkYXRlIHBhcnQgaWYgdGhlIGZvcm1hdCBjb250YWlucyB0aW1lIGNvbXBvbmVudHNcbiAgICAgIGlmICh0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQuaW5jbHVkZXMoJ0hIJykgfHwgdGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0LmluY2x1ZGVzKCdtbScpIHx8IHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdC5pbmNsdWRlcygnQScpKSB7XG4gICAgICAgIC8vIEZvciBkYXRldGltZSBmb3JtYXRzLCB3ZSBuZWVkIHRvIGV4dHJhY3QganVzdCB0aGUgZGF0ZSBwYXJ0XG4gICAgICAgIC8vIFRyeSB0byBwYXJzZSB0aGUgZnVsbCBzdHJpbmcgYW5kIHRoZW4gZm9ybWF0IGl0IGFzIGRhdGUtb25seSBmb3IgY29tcGFyaXNvblxuICAgICAgICBpZiAoc3RhcnREYXRlU3RyaW5nKSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkU3RhcnQgPSB0aGlzLnBhcnNlRGF0ZVdpdGhNdWx0aXBsZUZvcm1hdHMoc3RhcnREYXRlU3RyaW5nKTtcbiAgICAgICAgICBpZiAocGFyc2VkU3RhcnQuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAvLyBFeHRyYWN0IGRhdGUgcGFydCBieSBmaW5kaW5nIHRoZSB0aW1lIGJvdW5kYXJ5IC0gaGFuZGxlIHNwYWNlcyBpbiBkYXRlIHBhcnRcbiAgICAgICAgICAgIGNvbnN0IHRpbWVTdGFydE1hdGNoID0gdGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0Lm1hdGNoKC8oXFxzKykoSEh8bW18c3N8QXxhKS8pO1xuICAgICAgICAgICAgaWYgKHRpbWVTdGFydE1hdGNoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRpbWVTdGFydEluZGV4ID0gdGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0LmluZGV4T2YodGltZVN0YXJ0TWF0Y2hbMF0pO1xuICAgICAgICAgICAgICBjb25zdCBkYXRlT25seUZvcm1hdCA9IHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdC5zdWJzdHJpbmcoMCwgdGltZVN0YXJ0SW5kZXgpO1xuICAgICAgICAgICAgICBzdGFydERhdGVTdHJpbmcgPSBwYXJzZWRTdGFydC5mb3JtYXQoZGF0ZU9ubHlGb3JtYXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kRGF0ZVN0cmluZykge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZEVuZCA9IHRoaXMucGFyc2VEYXRlV2l0aE11bHRpcGxlRm9ybWF0cyhlbmREYXRlU3RyaW5nKTtcbiAgICAgICAgICBpZiAocGFyc2VkRW5kLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgLy8gRXh0cmFjdCBkYXRlIHBhcnQgYnkgZmluZGluZyB0aGUgdGltZSBib3VuZGFyeSAtIGhhbmRsZSBzcGFjZXMgaW4gZGF0ZSBwYXJ0XG4gICAgICAgICAgICBjb25zdCB0aW1lU3RhcnRNYXRjaCA9IHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdC5tYXRjaCgvKFxccyspKEhIfG1tfHNzfEF8YSkvKTtcbiAgICAgICAgICAgIGlmICh0aW1lU3RhcnRNYXRjaCkge1xuICAgICAgICAgICAgICBjb25zdCB0aW1lU3RhcnRJbmRleCA9IHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdC5pbmRleE9mKHRpbWVTdGFydE1hdGNoWzBdKTtcbiAgICAgICAgICAgICAgY29uc3QgZGF0ZU9ubHlGb3JtYXQgPSB0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQuc3Vic3RyaW5nKDAsIHRpbWVTdGFydEluZGV4KTtcbiAgICAgICAgICAgICAgZW5kRGF0ZVN0cmluZyA9IHBhcnNlZEVuZC5mb3JtYXQoZGF0ZU9ubHlGb3JtYXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBQYXJzZSB0aGUgc2VsZWN0ZWQgZGF0ZXMgdG8gZ2V0IHByb3BlciBkYXlqcyBpbnN0YW5jZXMgZm9yIGNvbXBhcmlzb25cbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZVBhcnNlZCA9IHN0YXJ0RGF0ZVN0cmluZyA/IHRoaXMucGFyc2VEYXRlV2l0aE11bHRpcGxlRm9ybWF0cyhzdGFydERhdGVTdHJpbmcpIDogbnVsbDtcbiAgICAgIGNvbnN0IGVuZERhdGVQYXJzZWQgPSBlbmREYXRlU3RyaW5nID8gdGhpcy5wYXJzZURhdGVXaXRoTXVsdGlwbGVGb3JtYXRzKGVuZERhdGVTdHJpbmcpIDogbnVsbDtcbiAgICAgIFxuICAgICAgY29uc3QgaXNTZWxlY3RlZFN0YXJ0RGF5ID1cbiAgICAgICAgIWlzRGlzYWJsZWREYXkgJiZcbiAgICAgICAgc3RhcnREYXRlUGFyc2VkICYmXG4gICAgICAgIHN0YXJ0RGF0ZVBhcnNlZC5pc1ZhbGlkKCkgJiZcbiAgICAgICAgZGF0ZS5pc1NhbWUoc3RhcnREYXRlUGFyc2VkLCAnZGF5Jyk7XG4gICAgICAgIFxuICAgICAgY29uc3QgaXNTZWxlY3RlZEVuZERheSA9XG4gICAgICAgICFpc0Rpc2FibGVkRGF5ICYmXG4gICAgICAgIGVuZERhdGVQYXJzZWQgJiZcbiAgICAgICAgZW5kRGF0ZVBhcnNlZC5pc1ZhbGlkKCkgJiZcbiAgICAgICAgZGF0ZS5pc1NhbWUoZW5kRGF0ZVBhcnNlZCwgJ2RheScpO1xuICAgICAgICBcbiAgICAgIC8vIEZvciByYW5nZSBjYWxjdWxhdGlvbiwgdXNlIHRoZSBhbHJlYWR5IHBhcnNlZCBkYXRlc1xuICAgICAgY29uc3QgaXNBZnRlclNlbGVjdGVkU3RhcnREYXRlID0gc3RhcnREYXRlUGFyc2VkID8gdGhpcy5kYXlqc0luc3RhbmNlKGRhdGUpLmlzQWZ0ZXIoc3RhcnREYXRlUGFyc2VkLCBcImRheVwiKSA6IGZhbHNlO1xuICAgICAgY29uc3QgaXNCZWZvcmVTZWxlY3RlZEVuZERhdGUgPSBlbmREYXRlUGFyc2VkID8gdGhpcy5kYXlqc0luc3RhbmNlKGRhdGUpLmlzQmVmb3JlKGVuZERhdGVQYXJzZWQsIFwiZGF5XCIpIDogZmFsc2U7XG4gICAgICBcbiAgICAgIGNvbnN0IGluUmFuZ2VEYXkgPVxuICAgICAgICBzdGFydERhdGVQYXJzZWQgJiYgZW5kRGF0ZVBhcnNlZCAmJlxuICAgICAgICBzdGFydERhdGVQYXJzZWQuaXNWYWxpZCgpICYmIGVuZERhdGVQYXJzZWQuaXNWYWxpZCgpICYmXG4gICAgICAgIGlzQWZ0ZXJTZWxlY3RlZFN0YXJ0RGF0ZSAmJlxuICAgICAgICBpc0JlZm9yZVNlbGVjdGVkRW5kRGF0ZTtcbiAgICAgIGRhdGVzLnB1c2goe1xuICAgICAgICBkYXRlOiBjdXJyZW50RGF0ZSxcbiAgICAgICAgd2Vla0RheTogZGF0ZS5kYXkoKSxcbiAgICAgICAgaXNDdXJyZW50RGF5LFxuICAgICAgICBpc1NlbGVjdGVkU3RhcnREYXksXG4gICAgICAgIGlzU2VsZWN0ZWRFbmREYXksXG4gICAgICAgIGluUmFuZ2VEYXksXG4gICAgICAgIHRvYXN0TWVzc2FnZTogdGhpcy5kYXRhKCkubWVzc2FnZXMuZmluZChxID0+IGRhdGUuZm9ybWF0KHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdCkgPT09IHEuZGF0ZSk/Lm1lc3NhZ2UgfHwgXCJcIixcbiAgICAgICAgaXNEaXNhYmxlZERheVxuICAgICAgfSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBkYXRlc1swXS53ZWVrRGF5OyBpID4gMDsgaS0tKSB7XG4gICAgICBkYXRlcy51bnNoaWZ0KHsgZGF0ZTogMCwgd2Vla0RheTogaSAtIDEgfSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlcztcbiAgfVxuXG5zZWxlY3REYXkoZnJvbTogXCJMRUZUXCIgfCBcIlJJR0hUXCIsIGRheTogSUN1cnJlbnRNb250aERhdGVzKSB7XG4gIGlmIChkYXkuZGF0ZSA8PSAwKSByZXR1cm47XG4gIGlmICghZGF5LmlzRGlzYWJsZWREYXkpIHtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbUxhYmVsU2lnbmFsLnNldCh0aGlzLkNVU1RPTV9SQU5HRV9MQUJFTCk7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uU3RhcnRlZFNpZ25hbCgpKSB7XG4gICAgICBjb25zdCBkYXlqc0RheSA9IGRheWpzKClcbiAgICAgICAgLnllYXIoZnJvbSA9PT0gXCJMRUZUXCIgPyB0aGlzLmN1cnJlbnRZZWFyTnVtYmVyU2lnbmFsKCkgOiB0aGlzLm5leHRZZWFyTnVtYmVyU2lnbmFsKCkpXG4gICAgICAgIC5tb250aChmcm9tID09PSBcIkxFRlRcIiA/IHRoaXMuY3VycmVudE1vbnRoTnVtYmVyU2lnbmFsKCkgOiB0aGlzLm5leHRNb250aE51bWJlclNpZ25hbCgpKVxuICAgICAgICAuZGF0ZShkYXkuZGF0ZSk7XG4gICAgICAgIFxuICAgICAgLy8gRXh0cmFjdCBkYXRlIHBhcnQgZnJvbSBleGlzdGluZyBzdGFydCBkYXRlIGZvciBjb21wYXJpc29uXG4gICAgICBsZXQgc3RhcnREYXRlU3RyaW5nID0gdGhpcy5sb2NhbFNlbGVjdGVkRGF0ZXNTaWduYWwoKS5zdGFydERhdGU7XG4gICAgICBcbiAgICAgIC8vIE9ubHkgZXh0cmFjdCBkYXRlIHBhcnQgaWYgdGhlIGZvcm1hdCBjb250YWlucyB0aW1lIGNvbXBvbmVudHNcbiAgICAgIGlmICh0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQuaW5jbHVkZXMoJ0hIJykgfHwgdGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0LmluY2x1ZGVzKCdtbScpIHx8IHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdC5pbmNsdWRlcygnQScpKSB7XG4gICAgICAgIC8vIEZvciBkYXRldGltZSBmb3JtYXRzLCB3ZSBuZWVkIHRvIGV4dHJhY3QganVzdCB0aGUgZGF0ZSBwYXJ0XG4gICAgICAgIC8vIFRyeSB0byBwYXJzZSB0aGUgZnVsbCBzdHJpbmcgYW5kIHRoZW4gZm9ybWF0IGl0IGFzIGRhdGUtb25seSBmb3IgY29tcGFyaXNvblxuICAgICAgICBpZiAoc3RhcnREYXRlU3RyaW5nKSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkU3RhcnQgPSB0aGlzLnBhcnNlRGF0ZVdpdGhNdWx0aXBsZUZvcm1hdHMoc3RhcnREYXRlU3RyaW5nKTtcbiAgICAgICAgICBpZiAocGFyc2VkU3RhcnQuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAvLyBFeHRyYWN0IGRhdGUgcGFydCBieSBmaW5kaW5nIHRoZSB0aW1lIGJvdW5kYXJ5IC0gaGFuZGxlIHNwYWNlcyBpbiBkYXRlIHBhcnRcbiAgICAgICAgICAgIGNvbnN0IHRpbWVTdGFydE1hdGNoID0gdGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0Lm1hdGNoKC8oXFxzKykoSEh8bW18c3N8QXxhKS8pO1xuICAgICAgICAgICAgaWYgKHRpbWVTdGFydE1hdGNoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRpbWVTdGFydEluZGV4ID0gdGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0LmluZGV4T2YodGltZVN0YXJ0TWF0Y2hbMF0pO1xuICAgICAgICAgICAgICBjb25zdCBkYXRlT25seUZvcm1hdCA9IHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdC5zdWJzdHJpbmcoMCwgdGltZVN0YXJ0SW5kZXgpO1xuICAgICAgICAgICAgICBzdGFydERhdGVTdHJpbmcgPSBwYXJzZWRTdGFydC5mb3JtYXQoZGF0ZU9ubHlGb3JtYXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBzdGFydERhdGUgPSBzdGFydERhdGVTdHJpbmcgPyB0aGlzLnBhcnNlRGF0ZVdpdGhNdWx0aXBsZUZvcm1hdHMoc3RhcnREYXRlU3RyaW5nKSA6IG51bGw7XG4gICAgICBcbiAgICAgIC8vIElmIHRoZSBzZWxlY3RlZCBkYXRlIGlzIGJlZm9yZSB0aGUgc3RhcnQgZGF0ZSwgbWFrZSBpdCB0aGUgbmV3IHN0YXJ0IGRhdGVcbiAgICAgIGlmIChzdGFydERhdGUgJiYgZGF5anNEYXkuaXNCZWZvcmUoc3RhcnREYXRlLCBcImRheVwiKSkge1xuICAgICAgICBsZXQgZm9ybWF0dGVkRGF0ZSA9IGRheWpzRGF5LmZvcm1hdCh0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQpO1xuICAgICAgICBcbiAgICAgICAgLy8gSWYgdGltZSBpcyBlbmFibGVkLCBhcHBlbmQgY3VycmVudCB0aW1lIHRvIHRoZSBkYXRlXG4gICAgICAgIGlmICh0aGlzLmRhdGEoKS5kcENvbmZpZy5lbmFibGVUaW1lID09PSB0cnVlKSB7XG4gICAgICAgICAgY29uc3Qgbm93ID0gZGF5anMoKTtcbiAgICAgICAgICAvLyBFeHRyYWN0IGRhdGUgcGFydCBmcm9tIHRoZSBjb25maWd1cmVkIGZvcm1hdCAtIGhhbmRsZSBzcGFjZXMgaW4gZGF0ZSBwYXJ0XG4gICAgICAgICAgLy8gTG9vayBmb3IgdGhlIHBhdHRlcm4gd2hlcmUgdGltZSBzdGFydHMgKEhILCBtbSwgc3MsIEEsIGEpXG4gICAgICAgICAgY29uc3QgdGltZVN0YXJ0TWF0Y2ggPSB0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQubWF0Y2goLyhcXHMrKShISHxtbXxzc3xBfGEpLyk7XG4gICAgICAgICAgaWYgKHRpbWVTdGFydE1hdGNoKSB7XG4gICAgICAgICAgICBjb25zdCB0aW1lU3RhcnRJbmRleCA9IHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdC5pbmRleE9mKHRpbWVTdGFydE1hdGNoWzBdKTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGVPbmx5Rm9ybWF0ID0gdGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0LnN1YnN0cmluZygwLCB0aW1lU3RhcnRJbmRleCk7XG4gICAgICAgICAgICBjb25zdCB0aW1lT25seUZvcm1hdCA9IHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdC5zdWJzdHJpbmcodGltZVN0YXJ0SW5kZXggKyB0aW1lU3RhcnRNYXRjaFsxXS5sZW5ndGgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZGF5anNEYXkuZm9ybWF0KGRhdGVPbmx5Rm9ybWF0KTtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVTdHJpbmcgPSBub3cuZm9ybWF0KHRpbWVPbmx5Rm9ybWF0KTtcbiAgICAgICAgICAgIGZvcm1hdHRlZERhdGUgPSBkYXRlU3RyaW5nICsgdGltZVN0YXJ0TWF0Y2hbMV0gKyB0aW1lU3RyaW5nO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFjayBpZiBubyB0aW1lIHBhdHRlcm4gZm91bmRcbiAgICAgICAgICAgIGZvcm1hdHRlZERhdGUgPSBkYXlqc0RheS5mb3JtYXQodGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsLnNldCh7XG4gICAgICAgICAgc3RhcnREYXRlOiBmb3JtYXR0ZWREYXRlLFxuICAgICAgICAgIGVuZERhdGU6IG51bGwsXG4gICAgICAgICAgc2VsZWN0ZWRSYW5nZUxhYmVsOiB0aGlzLkNVU1RPTV9SQU5HRV9MQUJFTFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVDYWxlbmRhckZyb21TZWxlY3RlZERhdGVzKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0aW9uU3RhcnRlZFNpZ25hbC5zZXQoZmFsc2UpO1xuICAgICAgXG4gICAgICBsZXQgZm9ybWF0dGVkRW5kRGF0ZSA9IGRheWpzRGF5LmZvcm1hdCh0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQpO1xuICAgICAgXG4gICAgICAvLyBJZiB0aW1lIGlzIGVuYWJsZWQsIGFwcGVuZCBjdXJyZW50IHRpbWUgdG8gdGhlIGRhdGVcbiAgICAgIGlmICh0aGlzLmRhdGEoKS5kcENvbmZpZy5lbmFibGVUaW1lID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IGRheWpzKCk7XG4gICAgICAgIC8vIEV4dHJhY3QgZGF0ZSBwYXJ0IGZyb20gdGhlIGNvbmZpZ3VyZWQgZm9ybWF0IC0gaGFuZGxlIHNwYWNlcyBpbiBkYXRlIHBhcnRcbiAgICAgICAgLy8gTG9vayBmb3IgdGhlIHBhdHRlcm4gd2hlcmUgdGltZSBzdGFydHMgKEhILCBtbSwgc3MsIEEsIGEpXG4gICAgICAgIGNvbnN0IHRpbWVTdGFydE1hdGNoID0gdGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0Lm1hdGNoKC8oXFxzKykoSEh8bW18c3N8QXxhKS8pO1xuICAgICAgICBpZiAodGltZVN0YXJ0TWF0Y2gpIHtcbiAgICAgICAgICBjb25zdCB0aW1lU3RhcnRJbmRleCA9IHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdC5pbmRleE9mKHRpbWVTdGFydE1hdGNoWzBdKTtcbiAgICAgICAgICBjb25zdCBkYXRlT25seUZvcm1hdCA9IHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdC5zdWJzdHJpbmcoMCwgdGltZVN0YXJ0SW5kZXgpO1xuICAgICAgICAgIGNvbnN0IHRpbWVPbmx5Rm9ybWF0ID0gdGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0LnN1YnN0cmluZyh0aW1lU3RhcnRJbmRleCArIHRpbWVTdGFydE1hdGNoWzFdLmxlbmd0aCk7XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgZGF0ZVN0cmluZyA9IGRheWpzRGF5LmZvcm1hdChkYXRlT25seUZvcm1hdCk7XG4gICAgICAgICAgY29uc3QgdGltZVN0cmluZyA9IG5vdy5mb3JtYXQodGltZU9ubHlGb3JtYXQpO1xuICAgICAgICAgIGZvcm1hdHRlZEVuZERhdGUgPSBkYXRlU3RyaW5nICsgdGltZVN0YXJ0TWF0Y2hbMV0gKyB0aW1lU3RyaW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIGlmIG5vIHRpbWUgcGF0dGVybiBmb3VuZFxuICAgICAgICAgIGZvcm1hdHRlZEVuZERhdGUgPSBkYXlqc0RheS5mb3JtYXQodGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLmxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbC5zZXQoe1xuICAgICAgICAuLi50aGlzLmxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbCgpLFxuICAgICAgICBlbmREYXRlOiBmb3JtYXR0ZWRFbmREYXRlLFxuICAgICAgICBzZWxlY3RlZFJhbmdlTGFiZWw6IHRoaXMuQ1VTVE9NX1JBTkdFX0xBQkVMXG4gICAgICB9KTtcbiAgICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJGcm9tU2VsZWN0ZWREYXRlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGlvblN0YXJ0ZWRTaWduYWwuc2V0KHRydWUpO1xuICAgICAgXG4gICAgICBsZXQgZm9ybWF0dGVkU3RhcnREYXRlID0gZGF5anMoKVxuICAgICAgICAueWVhcihmcm9tID09PSBcIkxFRlRcIiA/IHRoaXMuY3VycmVudFllYXJOdW1iZXJTaWduYWwoKSA6IHRoaXMubmV4dFllYXJOdW1iZXJTaWduYWwoKSlcbiAgICAgICAgLm1vbnRoKGZyb20gPT09IFwiTEVGVFwiID8gdGhpcy5jdXJyZW50TW9udGhOdW1iZXJTaWduYWwoKSA6IHRoaXMubmV4dE1vbnRoTnVtYmVyU2lnbmFsKCkpXG4gICAgICAgIC5kYXRlKGRheS5kYXRlKVxuICAgICAgICAuZm9ybWF0KHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdCk7XG4gICAgICBcbiAgICAgIC8vIElmIHRpbWUgaXMgZW5hYmxlZCwgYXBwZW5kIGN1cnJlbnQgdGltZSB0byB0aGUgZGF0ZVxuICAgICAgaWYgKHRoaXMuZGF0YSgpLmRwQ29uZmlnLmVuYWJsZVRpbWUgPT09IHRydWUpIHtcbiAgICAgICAgY29uc3Qgbm93ID0gZGF5anMoKTtcbiAgICAgICAgLy8gRXh0cmFjdCBkYXRlIHBhcnQgZnJvbSB0aGUgY29uZmlndXJlZCBmb3JtYXQgLSBoYW5kbGUgc3BhY2VzIGluIGRhdGUgcGFydFxuICAgICAgICAvLyBMb29rIGZvciB0aGUgcGF0dGVybiB3aGVyZSB0aW1lIHN0YXJ0cyAoSEgsIG1tLCBzcywgQSwgYSlcbiAgICAgICAgY29uc3QgdGltZVN0YXJ0TWF0Y2ggPSB0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQubWF0Y2goLyhcXHMrKShISHxtbXxzc3xBfGEpLyk7XG4gICAgICAgIGlmICh0aW1lU3RhcnRNYXRjaCkge1xuICAgICAgICAgIGNvbnN0IHRpbWVTdGFydEluZGV4ID0gdGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0LmluZGV4T2YodGltZVN0YXJ0TWF0Y2hbMF0pO1xuICAgICAgICAgIGNvbnN0IGRhdGVPbmx5Rm9ybWF0ID0gdGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0LnN1YnN0cmluZygwLCB0aW1lU3RhcnRJbmRleCk7XG4gICAgICAgICAgY29uc3QgdGltZU9ubHlGb3JtYXQgPSB0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQuc3Vic3RyaW5nKHRpbWVTdGFydEluZGV4ICsgdGltZVN0YXJ0TWF0Y2hbMV0ubGVuZ3RoKTtcbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZGF5anMoKVxuICAgICAgICAgICAgLnllYXIoZnJvbSA9PT0gXCJMRUZUXCIgPyB0aGlzLmN1cnJlbnRZZWFyTnVtYmVyU2lnbmFsKCkgOiB0aGlzLm5leHRZZWFyTnVtYmVyU2lnbmFsKCkpXG4gICAgICAgICAgICAubW9udGgoZnJvbSA9PT0gXCJMRUZUXCIgPyB0aGlzLmN1cnJlbnRNb250aE51bWJlclNpZ25hbCgpIDogdGhpcy5uZXh0TW9udGhOdW1iZXJTaWduYWwoKSlcbiAgICAgICAgICAgIC5kYXRlKGRheS5kYXRlKVxuICAgICAgICAgICAgLmZvcm1hdChkYXRlT25seUZvcm1hdCk7XG4gICAgICAgICAgY29uc3QgdGltZVN0cmluZyA9IG5vdy5mb3JtYXQodGltZU9ubHlGb3JtYXQpO1xuICAgICAgICAgIGZvcm1hdHRlZFN0YXJ0RGF0ZSA9IGRhdGVTdHJpbmcgKyB0aW1lU3RhcnRNYXRjaFsxXSArIHRpbWVTdHJpbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgaWYgbm8gdGltZSBwYXR0ZXJuIGZvdW5kXG4gICAgICAgICAgZm9ybWF0dGVkU3RhcnREYXRlID0gZGF5anMoKVxuICAgICAgICAgICAgLnllYXIoZnJvbSA9PT0gXCJMRUZUXCIgPyB0aGlzLmN1cnJlbnRZZWFyTnVtYmVyU2lnbmFsKCkgOiB0aGlzLm5leHRZZWFyTnVtYmVyU2lnbmFsKCkpXG4gICAgICAgICAgICAubW9udGgoZnJvbSA9PT0gXCJMRUZUXCIgPyB0aGlzLmN1cnJlbnRNb250aE51bWJlclNpZ25hbCgpIDogdGhpcy5uZXh0TW9udGhOdW1iZXJTaWduYWwoKSlcbiAgICAgICAgICAgIC5kYXRlKGRheS5kYXRlKVxuICAgICAgICAgICAgLmZvcm1hdCh0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsLnNldCh7XG4gICAgICAgIHN0YXJ0RGF0ZTogZm9ybWF0dGVkU3RhcnREYXRlLFxuICAgICAgICBlbmREYXRlOiBudWxsLFxuICAgICAgICBzZWxlY3RlZFJhbmdlTGFiZWw6IHRoaXMuQ1VTVE9NX1JBTkdFX0xBQkVMXG4gICAgICB9KTtcbiAgICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJGcm9tU2VsZWN0ZWREYXRlcygpO1xuICAgIH1cbiAgICB0aGlzLmlzRGF0ZXNWYWxpZFNpZ25hbC5zZXQoZmFsc2UpO1xuICAgIGlmICh0aGlzLmxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbCgpLnN0YXJ0RGF0ZSAmJiB0aGlzLmxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbCgpLmVuZERhdGUpIHtcbiAgICAgIHRoaXMuaXNEYXRlc1ZhbGlkU2lnbmFsLnNldCh0cnVlKTtcbiAgICB9XG4gIH1cbiAgaWYgKGRheS50b2FzdE1lc3NhZ2UpIHtcbiAgICB0aGlzLnRvYXN0LmRpc3BsYXlNc2coZGF5LnRvYXN0TWVzc2FnZSwgNDAwMCk7XG4gIH1cbn1cbnNlbGVjdFJhbmdlKGl0ZW06IFJhbmdlSXRlbSkge1xuICBpZiAoIWl0ZW0pIHJldHVybjtcblxuICBsZXQgc3RhcnREYXRlID0gdGhpcy5kYXlqc0luc3RhbmNlKGl0ZW0udmFsdWVbMF0pOyAgXG4gIGxldCBlbmREYXRlID0gdGhpcy5kYXlqc0luc3RhbmNlKGl0ZW0udmFsdWVbMV0pOyAgXG5cbiAgY29uc3Qgc3RhcnREYXRlU3RyID0gc3RhcnREYXRlLmZvcm1hdCh0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQpO1xuICBjb25zdCBlbmREYXRlU3RyID0gZW5kRGF0ZS5mb3JtYXQodGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0KTtcblxuICBjb25zdCBpc0FueURhdGVEaXNhYmxlZCA9IHRoaXMuZGF0YSgpLmRhdGVzRGlzYWJsZWQuc29tZSgoZGF0ZSkgPT5cbiAgICB0aGlzLmRheWpzSW5zdGFuY2UoZGF0ZSAsIHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdCkuaXNCZXR3ZWVuKHN0YXJ0RGF0ZVN0ciwgZW5kRGF0ZVN0ciwgbnVsbCwgJ1tdJylcbiAgKTtcblxuICBjb25zdCBtaW5EYXRlID0gISF0aGlzLmRhdGEoKS5kcENvbmZpZy5taW5EYXRlID8gdGhpcy5kYXlqc0luc3RhbmNlKHRoaXMuZGF0YSgpLmRwQ29uZmlnLm1pbkRhdGUsIHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdCkgOiBkYXlqcygnaW52YWxpZCcpO1xuICBjb25zdCBtYXhEYXRlID0gISF0aGlzLmRhdGEoKS5kcENvbmZpZy5tYXhEYXRlID8gdGhpcy5kYXlqc0luc3RhbmNlKHRoaXMuZGF0YSgpLmRwQ29uZmlnLm1heERhdGUsIHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdCkgOiBkYXlqcygnaW52YWxpZCcpO1xuXG4gIGNvbnN0IGlzV2l0aGluTGltaXRzID1cbiAgICAoIW1pbkRhdGUuaXNWYWxpZCgpIHx8ICFzdGFydERhdGUuaXNCZWZvcmUobWluRGF0ZSwgXCJkYXlcIikpICYmXG4gICAgKCFtYXhEYXRlLmlzVmFsaWQoKSB8fCAhZW5kRGF0ZS5pc0FmdGVyKG1heERhdGUsIFwiZGF5XCIpKTtcblxuICBpZiAoIWlzV2l0aGluTGltaXRzIHx8IGlzQW55RGF0ZURpc2FibGVkKSB7XG4gICAgdGhpcy50b2FzdC5kaXNwbGF5TXNnKFwiU2VsZWN0ZWQgcmFuZ2UgY29udGFpbnMgZGlzYWJsZWQgZGF0ZXMgb3IgaXMgb3V0IG9mIGJvdW5kcy5cIiwgNDAwMCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5zZWxlY3RlZEl0ZW1MYWJlbFNpZ25hbC5zZXQoaXRlbS5sYWJlbCk7XG4gIHRoaXMuY3VycmVudE1vbnRoTnVtYmVyU2lnbmFsLnNldChzdGFydERhdGUubW9udGgoKSk7XG4gIHRoaXMuY3VycmVudFllYXJOdW1iZXJTaWduYWwuc2V0KHN0YXJ0RGF0ZS55ZWFyKCkpO1xuXG4gIGlmICh0aGlzLmN1cnJlbnRNb250aE51bWJlclNpZ25hbCgpID09PSAxMSkge1xuICAgIHRoaXMubmV4dE1vbnRoTnVtYmVyU2lnbmFsLnNldCgwKTtcbiAgICB0aGlzLm5leHRZZWFyTnVtYmVyU2lnbmFsLnNldCh0aGlzLmN1cnJlbnRZZWFyTnVtYmVyU2lnbmFsKCkgKyAxKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLm5leHRNb250aE51bWJlclNpZ25hbC5zZXQodGhpcy5jdXJyZW50TW9udGhOdW1iZXJTaWduYWwoKSArIDEpO1xuICAgIHRoaXMubmV4dFllYXJOdW1iZXJTaWduYWwuc2V0KHRoaXMuY3VycmVudFllYXJOdW1iZXJTaWduYWwoKSk7XG4gIH1cblxuICB0aGlzLmxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbC5zZXQoeyBcbiAgICBzdGFydERhdGU6IHN0YXJ0RGF0ZVN0ciwgXG4gICAgZW5kRGF0ZTogZW5kRGF0ZVN0cixcbiAgICBzZWxlY3RlZFJhbmdlTGFiZWw6IGl0ZW0ubGFiZWxcbiAgfSk7XG5cbiAgdGhpcy5jdXJyZW50TW9udGhTaWduYWwuc2V0KGdldE1vbnRoKHRoaXMuY3VycmVudE1vbnRoTnVtYmVyU2lnbmFsKCkpKTtcbiAgdGhpcy5uZXh0TW9udGhTaWduYWwuc2V0KGdldE1vbnRoKHRoaXMubmV4dE1vbnRoTnVtYmVyU2lnbmFsKCkpKTtcbiAgdGhpcy5jdXJyZW50TW9udGhEYXRlc1NpZ25hbC5zZXQodGhpcy5nZW5lcmF0ZURhdGVzKHRoaXMuY3VycmVudE1vbnRoTnVtYmVyU2lnbmFsKCksIHRoaXMuY3VycmVudFllYXJOdW1iZXJTaWduYWwoKSkpO1xuICB0aGlzLm5leHRNb250aERhdGVzU2lnbmFsLnNldCh0aGlzLmdlbmVyYXRlRGF0ZXModGhpcy5uZXh0TW9udGhOdW1iZXJTaWduYWwoKSwgdGhpcy5uZXh0WWVhck51bWJlclNpZ25hbCgpKSk7XG5cbiAgdGhpcy5pc0RhdGVzVmFsaWRTaWduYWwuc2V0KCEhKHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsKCkuc3RhcnREYXRlICYmIHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsKCkuZW5kRGF0ZSkpO1xufVxuXG4gIHJlc2V0UmFuZ2UoKSB7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1MYWJlbFNpZ25hbC5zZXQodGhpcy5DVVNUT01fUkFOR0VfTEFCRUwpO1xuICAgIHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsLnNldCh7XG4gICAgICBzdGFydERhdGU6IG51bGwsXG4gICAgICBlbmREYXRlOiBudWxsLFxuICAgICAgc2VsZWN0ZWRSYW5nZUxhYmVsOiB0aGlzLkNVU1RPTV9SQU5HRV9MQUJFTFxuICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0aW9uU3RhcnRlZFNpZ25hbC5zZXQoZmFsc2UpO1xuICAgIHRoaXMuaXNEYXRlc1ZhbGlkU2lnbmFsLnNldChmYWxzZSk7XG4gICAgdGhpcy5jdXJyZW50TW9udGhEYXRlc1NpZ25hbC5zZXQodGhpcy5nZW5lcmF0ZURhdGVzKHRoaXMuY3VycmVudE1vbnRoTnVtYmVyKCksIHRoaXMuY3VycmVudFllYXJOdW1iZXIoKSkpO1xuICAgIHRoaXMubmV4dE1vbnRoRGF0ZXNTaWduYWwuc2V0KHRoaXMuZ2VuZXJhdGVEYXRlcyh0aGlzLm5leHRNb250aE51bWJlcigpLCB0aGlzLm5leHRZZWFyTnVtYmVyKCkpKTtcbiAgfVxuXG4gIFxuICBhcHBseURhdGVzKCkge1xuICAgIC8vIElmIHRpbWUgaXMgZW5hYmxlZCwgYXBwZW5kIHRpbWUgdG8gdGhlIGRhdGVzIGJlZm9yZSBhcHBseWluZ1xuICAgIGlmICh0aGlzLmRhdGEoKS5kcENvbmZpZy5lbmFibGVUaW1lID09PSB0cnVlKSB7XG4gICAgICBsZXQgc3RhcnRUaW1lOiBzdHJpbmc7XG4gICAgICBsZXQgZW5kVGltZTogc3RyaW5nO1xuICAgICAgXG4gICAgICBpZiAodGhpcy5pczEySG91ckZvcm1hdCgpKSB7XG4gICAgICAgIHN0YXJ0VGltZSA9IHRoaXMuZm9ybWF0VGltZSh0aGlzLnN0YXJ0SG91cigpLCB0aGlzLnN0YXJ0TWludXRlKCksIHRoaXMuc3RhcnRBbVBtKCkpO1xuICAgICAgICBlbmRUaW1lID0gdGhpcy5mb3JtYXRUaW1lKHRoaXMuZW5kSG91cigpLCB0aGlzLmVuZE1pbnV0ZSgpLCB0aGlzLmVuZEFtUG0oKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydFRpbWUgPSB0aGlzLmZvcm1hdFRpbWUodGhpcy5zdGFydEhvdXIyNCgpLCB0aGlzLnN0YXJ0TWludXRlKCksICcnKTtcbiAgICAgICAgZW5kVGltZSA9IHRoaXMuZm9ybWF0VGltZSh0aGlzLmVuZEhvdXIyNCgpLCB0aGlzLmVuZE1pbnV0ZSgpLCAnJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEV4dHJhY3Qgb25seSB0aGUgZGF0ZSBwYXJ0IChiZWZvcmUgYW55IGV4aXN0aW5nIHRpbWUpIGFuZCBhcHBlbmQgdGhlIHNlbGVjdGVkIHRpbWVcbiAgICAgIGNvbnN0IGxvY2FsRGF0ZXMgPSB0aGlzLmxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbCgpO1xuICAgICAgbGV0IHN0YXJ0RGF0ZU9ubHkgPSBsb2NhbERhdGVzLnN0YXJ0RGF0ZTtcbiAgICAgIGxldCBlbmREYXRlT25seSA9IGxvY2FsRGF0ZXMuZW5kRGF0ZTtcbiAgICAgIFxuICAgICAgLy8gT25seSBleHRyYWN0IGRhdGUgcGFydCBpZiB0aGUgZm9ybWF0IGNvbnRhaW5zIHRpbWUgY29tcG9uZW50c1xuICAgICAgaWYgKHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdC5pbmNsdWRlcygnSEgnKSB8fCB0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQuaW5jbHVkZXMoJ21tJykgfHwgdGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0LmluY2x1ZGVzKCdBJykpIHtcbiAgICAgICAgLy8gRm9yIGRhdGV0aW1lIGZvcm1hdHMsIHdlIG5lZWQgdG8gZXh0cmFjdCBqdXN0IHRoZSBkYXRlIHBhcnRcbiAgICAgICAgLy8gVHJ5IHRvIHBhcnNlIHRoZSBmdWxsIHN0cmluZyBhbmQgdGhlbiBmb3JtYXQgaXQgYXMgZGF0ZS1vbmx5IGZvciBjb21wYXJpc29uXG4gICAgICAgIGlmIChzdGFydERhdGVPbmx5KSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkU3RhcnQgPSB0aGlzLnBhcnNlRGF0ZVdpdGhNdWx0aXBsZUZvcm1hdHMoc3RhcnREYXRlT25seSk7XG4gICAgICAgICAgaWYgKHBhcnNlZFN0YXJ0LmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgLy8gRXh0cmFjdCBkYXRlIHBhcnQgYnkgZmluZGluZyB0aGUgdGltZSBib3VuZGFyeSAtIGhhbmRsZSBzcGFjZXMgaW4gZGF0ZSBwYXJ0XG4gICAgICAgICAgICBjb25zdCB0aW1lU3RhcnRNYXRjaCA9IHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdC5tYXRjaCgvKFxccyspKEhIfG1tfHNzfEF8YSkvKTtcbiAgICAgICAgICAgIGlmICh0aW1lU3RhcnRNYXRjaCkge1xuICAgICAgICAgICAgICBjb25zdCB0aW1lU3RhcnRJbmRleCA9IHRoaXMuZGF0YSgpLmRwQ29uZmlnLmZvcm1hdC5pbmRleE9mKHRpbWVTdGFydE1hdGNoWzBdKTtcbiAgICAgICAgICAgICAgY29uc3QgZGF0ZU9ubHlGb3JtYXQgPSB0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQuc3Vic3RyaW5nKDAsIHRpbWVTdGFydEluZGV4KTtcbiAgICAgICAgICAgICAgc3RhcnREYXRlT25seSA9IHBhcnNlZFN0YXJ0LmZvcm1hdChkYXRlT25seUZvcm1hdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbmREYXRlT25seSkge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZEVuZCA9IHRoaXMucGFyc2VEYXRlV2l0aE11bHRpcGxlRm9ybWF0cyhlbmREYXRlT25seSk7XG4gICAgICAgICAgaWYgKHBhcnNlZEVuZC5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIEV4dHJhY3QgZGF0ZSBwYXJ0IGJ5IGZpbmRpbmcgdGhlIHRpbWUgYm91bmRhcnkgLSBoYW5kbGUgc3BhY2VzIGluIGRhdGUgcGFydFxuICAgICAgICAgICAgY29uc3QgdGltZVN0YXJ0TWF0Y2ggPSB0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQubWF0Y2goLyhcXHMrKShISHxtbXxzc3xBfGEpLyk7XG4gICAgICAgICAgICBpZiAodGltZVN0YXJ0TWF0Y2gpIHtcbiAgICAgICAgICAgICAgY29uc3QgdGltZVN0YXJ0SW5kZXggPSB0aGlzLmRhdGEoKS5kcENvbmZpZy5mb3JtYXQuaW5kZXhPZih0aW1lU3RhcnRNYXRjaFswXSk7XG4gICAgICAgICAgICAgIGNvbnN0IGRhdGVPbmx5Rm9ybWF0ID0gdGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0LnN1YnN0cmluZygwLCB0aW1lU3RhcnRJbmRleCk7XG4gICAgICAgICAgICAgIGVuZERhdGVPbmx5ID0gcGFyc2VkRW5kLmZvcm1hdChkYXRlT25seUZvcm1hdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZVdpdGhUaW1lID0gc3RhcnREYXRlT25seSArICcgJyArIHN0YXJ0VGltZTtcbiAgICAgIGNvbnN0IGVuZERhdGVXaXRoVGltZSA9IGVuZERhdGVPbmx5ICsgJyAnICsgZW5kVGltZTtcbiAgICAgIFxuICAgICAgdGhpcy5kYXRhKCkuZGF0ZUNoYW5nZSh7XG4gICAgICAgIHN0YXJ0RGF0ZTogc3RhcnREYXRlV2l0aFRpbWUsXG4gICAgICAgIGVuZERhdGU6IGVuZERhdGVXaXRoVGltZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YSgpLmRhdGVDaGFuZ2UodGhpcy5sb2NhbFNlbGVjdGVkRGF0ZXNTaWduYWwoKSk7XG4gICAgfVxuICB9XG5cbiAgXG4gIGNhbmNlbERhdGVQaWNrZXIoKSB7XG4gICAgdGhpcy5kYXRhKCkuY2xvc2UoKTtcbiAgfVxuICBcbiAgLy8gVGltZS1yZWxhdGVkIG1ldGhvZHNcbiAgb25TdGFydEhvdXJJbnB1dCgpIHtcbiAgICBpZiAodGhpcy5pczEySG91ckZvcm1hdCgpKSB7XG4gICAgICB0aGlzLnN0YXJ0SG91clNpZ25hbC5zZXQodGhpcy52YWxpZGF0ZUhvdXJJbnB1dCh0aGlzLnN0YXJ0SG91cigpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhcnRIb3VyMjRTaWduYWwuc2V0KHRoaXMudmFsaWRhdGVIb3VySW5wdXQyNCh0aGlzLnN0YXJ0SG91cjI0KCkpKTtcbiAgICB9XG4gIH1cbiAgXG4gIG9uU3RhcnRNaW51dGVJbnB1dCgpIHtcbiAgICB0aGlzLnN0YXJ0TWludXRlU2lnbmFsLnNldCh0aGlzLnZhbGlkYXRlTWludXRlSW5wdXQodGhpcy5zdGFydE1pbnV0ZSgpKSk7XG4gIH1cbiAgXG4gIG9uRW5kSG91cklucHV0KCkge1xuICAgIGlmICh0aGlzLmlzMTJIb3VyRm9ybWF0KCkpIHtcbiAgICAgIHRoaXMuZW5kSG91clNpZ25hbC5zZXQodGhpcy52YWxpZGF0ZUhvdXJJbnB1dCh0aGlzLmVuZEhvdXIoKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVuZEhvdXIyNFNpZ25hbC5zZXQodGhpcy52YWxpZGF0ZUhvdXJJbnB1dDI0KHRoaXMuZW5kSG91cjI0KCkpKTtcbiAgICB9XG4gIH1cbiAgXG4gIG9uRW5kTWludXRlSW5wdXQoKSB7XG4gICAgdGhpcy5lbmRNaW51dGVTaWduYWwuc2V0KHRoaXMudmFsaWRhdGVNaW51dGVJbnB1dCh0aGlzLmVuZE1pbnV0ZSgpKSk7XG4gIH1cbiAgXG4gIHZhbGlkYXRlSG91cklucHV0KGhvdXI6IG51bWJlcikge1xuICAgIC8vIEFwcGx5IGJvdW5kcyBiYXNlZCBvbiBmb3JtYXRcbiAgICBpZiAodGhpcy5pczEySG91ckZvcm1hdCgpKSB7XG4gICAgICAvLyAxMi1ob3VyIGZvcm1hdDogMS0xMlxuICAgICAgaWYgKGhvdXIgPCAxKSBob3VyID0gMTtcbiAgICAgIGlmIChob3VyID4gMTIpIGhvdXIgPSAxMjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gMjQtaG91ciBmb3JtYXQ6IDAtMjNcbiAgICAgIGlmIChob3VyIDwgMCkgaG91ciA9IDA7XG4gICAgICBpZiAoaG91ciA+IDIzKSBob3VyID0gMjM7XG4gICAgfVxuICAgIHJldHVybiBob3VyO1xuICB9XG4gIFxuICAvLyBTcGVjaWFsIHZhbGlkYXRpb24gZm9yIDI0LWhvdXIgZm9ybWF0XG4gIHZhbGlkYXRlSG91cklucHV0MjQoaG91cjogbnVtYmVyKSB7XG4gICAgaWYgKGhvdXIgPCAwKSBob3VyID0gMDtcbiAgICBpZiAoaG91ciA+IDIzKSBob3VyID0gMjM7XG4gICAgcmV0dXJuIGhvdXI7XG4gIH1cbiAgXG4gIHZhbGlkYXRlTWludXRlSW5wdXQobWludXRlOiBudW1iZXIpIHtcbiAgICBpZiAobWludXRlIDwgMCkgbWludXRlID0gMDtcbiAgICBpZiAobWludXRlID4gNTkpIG1pbnV0ZSA9IDU5O1xuICAgIHJldHVybiBtaW51dGU7XG4gIH1cbiAgXG4gIHB1YmxpYyBpczEySG91ckZvcm1hdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0LmluY2x1ZGVzKCdBJykgfHwgdGhpcy5kYXRhKCkuZHBDb25maWcuZm9ybWF0LmluY2x1ZGVzKCdhJyk7XG4gIH1cbiAgXG4gIHByaXZhdGUgZm9ybWF0VGltZShob3VyOiBudW1iZXIsIG1pbnV0ZTogbnVtYmVyLCBhbVBtOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzMTJIb3VyRm9ybWF0KCkpIHtcbiAgICAgIHJldHVybiBgJHtob3VyLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX06JHttaW51dGUudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfSAke2FtUG19YDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIDI0LWhvdXIgZm9ybWF0LCBqdXN0IHJldHVybiB0aGUgaG91ciBhbmQgbWludXRlXG4gICAgICByZXR1cm4gYCR7aG91ci50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7bWludXRlLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX1gO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVRpbWVWYWx1ZXMoKTogdm9pZCB7XG4gICAgLy8gSW5pdGlhbGl6ZSB0aW1lIHZhbHVlcyBmcm9tIGV4aXN0aW5nIHNlbGVjdGVkIGRhdGVzIGlmIHRoZXkgY29udGFpbiB0aW1lXG4gICAgbGV0IHN0YXJ0VGltZUluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgbGV0IGVuZFRpbWVJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIFxuICAgIGlmICh0aGlzLmRhdGEoKS5kcENvbmZpZy5lbmFibGVUaW1lICYmIHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsKCkuc3RhcnREYXRlICYmIHR5cGVvZiB0aGlzLmxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbCgpLnN0YXJ0RGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZVBhcnRzID0gdGhpcy5sb2NhbFNlbGVjdGVkRGF0ZXNTaWduYWwoKS5zdGFydERhdGUuc3BsaXQoJyAnKTtcbiAgICAgIGlmIChzdGFydERhdGVQYXJ0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnN0IHRpbWVQYXJ0ID0gc3RhcnREYXRlUGFydHMuc2xpY2UoMSkuam9pbignICcpOyAvLyBIYW5kbGUgbXVsdGlwbGUgc3BhY2VzXG4gICAgICAgIHRoaXMucGFyc2VUaW1lU3RyaW5nKHRpbWVQYXJ0LCB0cnVlKTtcbiAgICAgICAgc3RhcnRUaW1lSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpZiAodGhpcy5kYXRhKCkuZHBDb25maWcuZW5hYmxlVGltZSAmJiB0aGlzLmxvY2FsU2VsZWN0ZWREYXRlc1NpZ25hbCgpLmVuZERhdGUgJiYgdHlwZW9mIHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsKCkuZW5kRGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGVuZERhdGVQYXJ0cyA9IHRoaXMubG9jYWxTZWxlY3RlZERhdGVzU2lnbmFsKCkuZW5kRGF0ZS5zcGxpdCgnICcpO1xuICAgICAgaWYgKGVuZERhdGVQYXJ0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnN0IHRpbWVQYXJ0ID0gZW5kRGF0ZVBhcnRzLnNsaWNlKDEpLmpvaW4oJyAnKTsgLy8gSGFuZGxlIG11bHRpcGxlIHNwYWNlc1xuICAgICAgICB0aGlzLnBhcnNlVGltZVN0cmluZyh0aW1lUGFydCwgZmFsc2UpO1xuICAgICAgICBlbmRUaW1lSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBJZiBubyBleGlzdGluZyB0aW1lIGZvdW5kLCBzZXQgY3VycmVudCB0aW1lIGFzIGRlZmF1bHRcbiAgICBpZiAodGhpcy5kYXRhKCkuZHBDb25maWcuZW5hYmxlVGltZSkge1xuICAgICAgaWYgKCFzdGFydFRpbWVJbml0aWFsaXplZCkge1xuICAgICAgICB0aGlzLnNldEN1cnJlbnRUaW1lQXNEZWZhdWx0KHRydWUpO1xuICAgICAgfVxuICAgICAgaWYgKCFlbmRUaW1lSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgdGhpcy5zZXRDdXJyZW50VGltZUFzRGVmYXVsdChmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRDdXJyZW50VGltZUFzRGVmYXVsdChpc1N0YXJ0OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3Qgbm93ID0gZGF5anMoKTtcbiAgICBjb25zdCBjdXJyZW50SG91ciA9IG5vdy5ob3VyKCk7XG4gICAgY29uc3QgY3VycmVudE1pbnV0ZSA9IG5vdy5taW51dGUoKTtcbiAgICBcbiAgICBpZiAodGhpcy5pczEySG91ckZvcm1hdCgpKSB7XG4gICAgICAvLyBDb252ZXJ0IGN1cnJlbnQgdGltZSB0byAxMi1ob3VyIGZvcm1hdFxuICAgICAgbGV0IGhvdXIxMiA9IGN1cnJlbnRIb3VyO1xuICAgICAgbGV0IGFtUG0gPSAnQU0nO1xuICAgICAgXG4gICAgICBpZiAoY3VycmVudEhvdXIgPT09IDApIHtcbiAgICAgICAgaG91cjEyID0gMTI7XG4gICAgICAgIGFtUG0gPSAnQU0nO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50SG91ciA9PT0gMTIpIHtcbiAgICAgICAgaG91cjEyID0gMTI7XG4gICAgICAgIGFtUG0gPSAnUE0nO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50SG91ciA+IDEyKSB7XG4gICAgICAgIGhvdXIxMiA9IGN1cnJlbnRIb3VyIC0gMTI7XG4gICAgICAgIGFtUG0gPSAnUE0nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYW1QbSA9ICdBTSc7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChpc1N0YXJ0KSB7XG4gICAgICAgIHRoaXMuc3RhcnRIb3VyU2lnbmFsLnNldChob3VyMTIpO1xuICAgICAgICB0aGlzLnN0YXJ0TWludXRlU2lnbmFsLnNldChjdXJyZW50TWludXRlKTtcbiAgICAgICAgdGhpcy5zdGFydEFtUG1TaWduYWwuc2V0KGFtUG0pO1xuICAgICAgICB0aGlzLnN0YXJ0SG91cjI0U2lnbmFsLnNldChjdXJyZW50SG91cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVuZEhvdXJTaWduYWwuc2V0KGhvdXIxMik7XG4gICAgICAgIHRoaXMuZW5kTWludXRlU2lnbmFsLnNldChjdXJyZW50TWludXRlKTtcbiAgICAgICAgdGhpcy5lbmRBbVBtU2lnbmFsLnNldChhbVBtKTtcbiAgICAgICAgdGhpcy5lbmRIb3VyMjRTaWduYWwuc2V0KGN1cnJlbnRIb3VyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXNlIGN1cnJlbnQgdGltZSBkaXJlY3RseSBmb3IgMjQtaG91ciBmb3JtYXRcbiAgICAgIGlmIChpc1N0YXJ0KSB7XG4gICAgICAgIHRoaXMuc3RhcnRIb3VyMjRTaWduYWwuc2V0KGN1cnJlbnRIb3VyKTtcbiAgICAgICAgdGhpcy5zdGFydE1pbnV0ZVNpZ25hbC5zZXQoY3VycmVudE1pbnV0ZSk7XG4gICAgICAgIC8vIEFsc28gc2V0IDEyLWhvdXIgdmFsdWVzIGZvciBjb25zaXN0ZW5jeVxuICAgICAgICBpZiAoY3VycmVudEhvdXIgPT09IDApIHtcbiAgICAgICAgICB0aGlzLnN0YXJ0SG91clNpZ25hbC5zZXQoMTIpO1xuICAgICAgICAgIHRoaXMuc3RhcnRBbVBtU2lnbmFsLnNldCgnQU0nKTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50SG91ciA9PT0gMTIpIHtcbiAgICAgICAgICB0aGlzLnN0YXJ0SG91clNpZ25hbC5zZXQoMTIpO1xuICAgICAgICAgIHRoaXMuc3RhcnRBbVBtU2lnbmFsLnNldCgnUE0nKTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50SG91ciA+IDEyKSB7XG4gICAgICAgICAgdGhpcy5zdGFydEhvdXJTaWduYWwuc2V0KGN1cnJlbnRIb3VyIC0gMTIpO1xuICAgICAgICAgIHRoaXMuc3RhcnRBbVBtU2lnbmFsLnNldCgnUE0nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0YXJ0SG91clNpZ25hbC5zZXQoY3VycmVudEhvdXIpO1xuICAgICAgICAgIHRoaXMuc3RhcnRBbVBtU2lnbmFsLnNldCgnQU0nKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbmRIb3VyMjRTaWduYWwuc2V0KGN1cnJlbnRIb3VyKTtcbiAgICAgICAgdGhpcy5lbmRNaW51dGVTaWduYWwuc2V0KGN1cnJlbnRNaW51dGUpO1xuICAgICAgICAvLyBBbHNvIHNldCAxMi1ob3VyIHZhbHVlcyBmb3IgY29uc2lzdGVuY3lcbiAgICAgICAgaWYgKGN1cnJlbnRIb3VyID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5lbmRIb3VyU2lnbmFsLnNldCgxMik7XG4gICAgICAgICAgdGhpcy5lbmRBbVBtU2lnbmFsLnNldCgnQU0nKTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50SG91ciA9PT0gMTIpIHtcbiAgICAgICAgICB0aGlzLmVuZEhvdXJTaWduYWwuc2V0KDEyKTtcbiAgICAgICAgICB0aGlzLmVuZEFtUG1TaWduYWwuc2V0KCdQTScpO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRIb3VyID4gMTIpIHtcbiAgICAgICAgICB0aGlzLmVuZEhvdXJTaWduYWwuc2V0KGN1cnJlbnRIb3VyIC0gMTIpO1xuICAgICAgICAgIHRoaXMuZW5kQW1QbVNpZ25hbC5zZXQoJ1BNJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lbmRIb3VyU2lnbmFsLnNldChjdXJyZW50SG91cik7XG4gICAgICAgICAgdGhpcy5lbmRBbVBtU2lnbmFsLnNldCgnQU0nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VUaW1lU3RyaW5nKHRpbWVTdHJpbmc6IHN0cmluZywgaXNTdGFydDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzMTJIb3VyRm9ybWF0KCkpIHtcbiAgICAgIC8vIFBhcnNlIDEyLWhvdXIgZm9ybWF0OiBcIjEwOjAwIFBNXCJcbiAgICAgIGNvbnN0IG1hdGNoID0gdGltZVN0cmluZy5tYXRjaCgvKFxcZCspOihcXGQrKVxccyooQU18UE0pL2kpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGhvdXIgPSBwYXJzZUludChtYXRjaFsxXSk7XG4gICAgICAgIGNvbnN0IG1pbnV0ZSA9IHBhcnNlSW50KG1hdGNoWzJdKTtcbiAgICAgICAgY29uc3QgYW1QbSA9IG1hdGNoWzNdLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoaXNTdGFydCkge1xuICAgICAgICAgIHRoaXMuc3RhcnRIb3VyU2lnbmFsLnNldChob3VyKTtcbiAgICAgICAgICB0aGlzLnN0YXJ0TWludXRlU2lnbmFsLnNldChtaW51dGUpO1xuICAgICAgICAgIHRoaXMuc3RhcnRBbVBtU2lnbmFsLnNldChhbVBtKTtcbiAgICAgICAgICAvLyBBbHNvIHNldCAyNC1ob3VyIHZhbHVlIGZvciBjb25zaXN0ZW5jeVxuICAgICAgICAgIHRoaXMuc3RhcnRIb3VyMjRTaWduYWwuc2V0KGhvdXIgPT09IDEyID8gKGFtUG0gPT09ICdQTScgPyAxMiA6IDApIDogKGFtUG0gPT09ICdQTScgPyBob3VyICsgMTIgOiBob3VyKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lbmRIb3VyU2lnbmFsLnNldChob3VyKTtcbiAgICAgICAgICB0aGlzLmVuZE1pbnV0ZVNpZ25hbC5zZXQobWludXRlKTtcbiAgICAgICAgICB0aGlzLmVuZEFtUG1TaWduYWwuc2V0KGFtUG0pO1xuICAgICAgICAgIC8vIEFsc28gc2V0IDI0LWhvdXIgdmFsdWUgZm9yIGNvbnNpc3RlbmN5XG4gICAgICAgICAgdGhpcy5lbmRIb3VyMjRTaWduYWwuc2V0KGhvdXIgPT09IDEyID8gKGFtUG0gPT09ICdQTScgPyAxMiA6IDApIDogKGFtUG0gPT09ICdQTScgPyBob3VyICsgMTIgOiBob3VyKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUGFyc2UgMjQtaG91ciBmb3JtYXQ6IFwiMjI6MDBcIlxuICAgICAgY29uc3QgbWF0Y2ggPSB0aW1lU3RyaW5nLm1hdGNoKC8oXFxkKyk6KFxcZCspLyk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgY29uc3QgaG91cjI0ID0gcGFyc2VJbnQobWF0Y2hbMV0pO1xuICAgICAgICBjb25zdCBtaW51dGUgPSBwYXJzZUludChtYXRjaFsyXSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoaXNTdGFydCkge1xuICAgICAgICAgIC8vIFN0b3JlIGRpcmVjdGx5IGluIDI0LWhvdXIgZm9ybWF0XG4gICAgICAgICAgdGhpcy5zdGFydEhvdXIyNFNpZ25hbC5zZXQoaG91cjI0KTtcbiAgICAgICAgICB0aGlzLnN0YXJ0TWludXRlU2lnbmFsLnNldChtaW51dGUpO1xuICAgICAgICAgIC8vIEFsc28gc2V0IDEyLWhvdXIgdmFsdWVzIGZvciBjb25zaXN0ZW5jeSAodGhvdWdoIG5vdCB1c2VkIGluIDI0LWhvdXIgbW9kZSlcbiAgICAgICAgICBpZiAoaG91cjI0ID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0SG91clNpZ25hbC5zZXQoMTIpO1xuICAgICAgICAgICAgdGhpcy5zdGFydEFtUG1TaWduYWwuc2V0KCdBTScpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaG91cjI0ID09PSAxMikge1xuICAgICAgICAgICAgdGhpcy5zdGFydEhvdXJTaWduYWwuc2V0KDEyKTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRBbVBtU2lnbmFsLnNldCgnUE0nKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIyNCA+IDEyKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0SG91clNpZ25hbC5zZXQoaG91cjI0IC0gMTIpO1xuICAgICAgICAgICAgdGhpcy5zdGFydEFtUG1TaWduYWwuc2V0KCdQTScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0SG91clNpZ25hbC5zZXQoaG91cjI0KTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRBbVBtU2lnbmFsLnNldCgnQU0nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU3RvcmUgZGlyZWN0bHkgaW4gMjQtaG91ciBmb3JtYXRcbiAgICAgICAgICB0aGlzLmVuZEhvdXIyNFNpZ25hbC5zZXQoaG91cjI0KTtcbiAgICAgICAgICB0aGlzLmVuZE1pbnV0ZVNpZ25hbC5zZXQobWludXRlKTtcbiAgICAgICAgICAvLyBBbHNvIHNldCAxMi1ob3VyIHZhbHVlcyBmb3IgY29uc2lzdGVuY3kgKHRob3VnaCBub3QgdXNlZCBpbiAyNC1ob3VyIG1vZGUpXG4gICAgICAgICAgaWYgKGhvdXIyNCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5lbmRIb3VyU2lnbmFsLnNldCgxMik7XG4gICAgICAgICAgICB0aGlzLmVuZEFtUG1TaWduYWwuc2V0KCdBTScpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaG91cjI0ID09PSAxMikge1xuICAgICAgICAgICAgdGhpcy5lbmRIb3VyU2lnbmFsLnNldCgxMik7XG4gICAgICAgICAgICB0aGlzLmVuZEFtUG1TaWduYWwuc2V0KCdQTScpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaG91cjI0ID4gMTIpIHtcbiAgICAgICAgICAgIHRoaXMuZW5kSG91clNpZ25hbC5zZXQoaG91cjI0IC0gMTIpO1xuICAgICAgICAgICAgdGhpcy5lbmRBbVBtU2lnbmFsLnNldCgnUE0nKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbmRIb3VyU2lnbmFsLnNldChob3VyMjQpO1xuICAgICAgICAgICAgdGhpcy5lbmRBbVBtU2lnbmFsLnNldCgnQU0nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkYXRlcmFuZ2VwaWNrZXItY29udGFpbmVyXCIgYXJpYS1sYWJlbD1cImRhdGUgcmFuZ2UgcGlja2VyXCIgY2RrVHJhcEZvY3VzIFtjZGtUcmFwRm9jdXNBdXRvQ2FwdHVyZV09XCJ0cnVlXCI+XG4gIDxkaXYgY2xhc3M9XCJkYXRlcmFuZ2VwaWNrZXItY29udGFpbmVyX192aWV3XCI+XG4gICAgPGRpdiB0YWJpbmRleD1cIi0xXCIgY2RrRm9jdXNJbml0aWFsPjwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJkYXRhKCk/LmRwQ29uZmlnPy5yYW5nZXM/Lmxlbmd0aCA+IDBcIiBjbGFzcz1cImRhdGVyYW5nZXBpY2tlci1jb250YWluZXJfX3Jhbmdlc1wiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkYXRhKCk/LmRwQ29uZmlnPy5yYW5nZXMgPz8gW11cIiA+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgW25nQ2xhc3NdPVwieydhY3RpdmUtcmFuZ2UnIDogc2VsZWN0ZWRJdGVtTGFiZWwoKSA9PT0gaXRlbS5sYWJlbH1cIlxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RSYW5nZShpdGVtKVwiXG4gICAgICAgICAgY2xhc3M9XCJtaXMtYnRuXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGl0ZW0ubGFiZWwgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+IDxidXR0b24gY2xhc3M9XCJtaXMtYnRuXCIgW25nQ2xhc3NdPVwieydhY3RpdmUtcmFuZ2UnIDogc2VsZWN0ZWRJdGVtTGFiZWwoKSA9PT0gJ0N1c3RvbSBSYW5nZSd9XCIgKGNsaWNrKT1cInJlc2V0UmFuZ2UoKVwiPkN1c3RvbSBSYW5nZTwvYnV0dG9uPiA8L2Rpdj5cbiAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRhdGVwaWNrZXJfX2xlZnRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYXRlcmFuZ2VwaWNrZXItY29udGFpbmVyX19oZWFkZXJfX3ByYWJ1XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImRhdGVyYW5nZXBpY2tlci1jb250YWluZXJfX2Fycm93X19pY29uXCJcbiAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgIChjbGljayk9XCIhaXNQcmV2aW91c01vbnRoRGlzYWJsZWQoKSAmJiBuYXZpZ2F0ZU1vbnRoKCdQUkVWSU9VUycpXCJcbiAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiIWlzUHJldmlvdXNNb250aERpc2FibGVkKCkgJiYgbmF2aWdhdGVNb250aCgnUFJFVklPVVMnKVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIlByZXZpb3VzIE1vbnRoXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnZGlzYWJsZWQtbW9udGgnOiBpc1ByZXZpb3VzTW9udGhEaXNhYmxlZCgpXG4gICAgICAgICAgfVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjAgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMTkuNzA3MSA4LjcwNzExQzIwLjA5NzYgOC4zMTY1OCAyMC4wOTc2IDcuNjgzNDIgMTkuNzA3MSA3LjI5Mjg5TDEzLjM0MzEgMC45Mjg5MzNDMTIuOTUyNiAwLjUzODQwOSAxMi4zMTk1IDAuNTM4NDA5IDExLjkyODkgMC45Mjg5MzNDMTEuNTM4NCAxLjMxOTQ2IDExLjUzODQgMS45NTI2MiAxMS45Mjg5IDIuMzQzMTVMMTcuNTg1OCA4TDExLjkyODkgMTMuNjU2OUMxMS41Mzg0IDE0LjA0NzQgMTEuNTM4NCAxNC42ODA1IDExLjkyODkgMTUuMDcxMUMxMi4zMTk1IDE1LjQ2MTYgMTIuOTUyNiAxNS40NjE2IDEzLjM0MzEgMTUuMDcxMUwxOS43MDcxIDguNzA3MTFaTS04Ljc0MjI4ZS0wOCA5TDE5IDlMMTkgN0w4Ljc0MjI4ZS0wOCA3TC04Ljc0MjI4ZS0wOCA5WlwiXG4gICAgICAgICAgICAgIGZpbGw9XCIjMTgxRjMzXCJcbiAgICAgICAgICAgID48L3BhdGg+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c3Bhbj4ge3sgY3VycmVudE1vbnRoKCkgfX0ge3sgY3VycmVudFllYXJOdW1iZXIoKSB9fSA8L3NwYW4+XG4gICAgICAgIDxkaXY+PC9kaXY+XG4gICAgICAgIDwhLS0gQnV0dG9uIHZpc2libGUgaW4gbW9iaWxlIHZpZXcgLS0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImRhdGVyYW5nZXBpY2tlci1jb250YWluZXJfX2Fycm93X19pY29uIG1vYmlsZV92aWV3XCJcbiAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgIChjbGljayk9XCIhaXNOZXh0TW9udGhEaXNhYmxlZCgpICYmIG5hdmlnYXRlTW9udGgoJ05FWFQnKVwiXG4gICAgICAgICAgKGtleXVwLmVudGVyKT1cIiFpc05leHRNb250aERpc2FibGVkKCkgJiYgbmF2aWdhdGVNb250aCgnTkVYVCcpXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiTmV4dCBNb250aFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ2Rpc2FibGVkLW1vbnRoJzogaXNOZXh0TW9udGhEaXNhYmxlZCgpXG4gICAgICAgICAgfVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjAgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMTkuNzA3MSA4LjcwNzExQzIwLjA5NzYgOC4zMTY1OCAyMC4wOTc2IDcuNjgzNDIgMTkuNzA3MSA3LjI5Mjg5TDEzLjM0MzEgMC45Mjg5MzNDMTIuOTUyNiAwLjUzODQwOSAxMi4zMTk1IDAuNTM4NDA5IDExLjkyODkgMC45Mjg5MzNDMTEuNTM4NCAxLjMxOTQ2IDExLjUzODQgMS45NTI2MiAxMS45Mjg5IDIuMzQzMTVMMTcuNTg1OCA4TDExLjkyODkgMTMuNjU2OUMxMS41Mzg0IDE0LjA0NzQgMTEuNTM4NCAxNC42ODA1IDExLjkyODkgMTUuMDcxMUMxMi4zMTk1IDE1LjQ2MTYgMTIuOTUyNiAxNS40NjE2IDEzLjM0MzEgMTUuMDcxMUwxOS43MDcxIDguNzA3MTFaTS04Ljc0MjI4ZS0wOCA5TDE5IDlMMTkgN0w4Ljc0MjI4ZS0wOCA3TC04Ljc0MjI4ZS0wOCA5WlwiXG4gICAgICAgICAgICAgIGZpbGw9XCIjMTgxRjMzXCJcbiAgICAgICAgICAgID48L3BhdGg+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGF0ZXJhbmdlcGlja2VyLWNvbnRhaW5lcl9fYm9keVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZXJhbmdlcGlja2VyLWNvbnRhaW5lcl9fd2Vla2RheXNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZXJhbmdlcGlja2VyLWNvbnRhaW5lcl9fd2Vla2RheVwiICpuZ0Zvcj1cImxldCB3ZWVrRGF5IG9mIHdlZWtEYXlzKClcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7IHdlZWtEYXkubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZXJhbmdlcGlja2VyLWNvbnRhaW5lcl9fZGF5c1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZGF0ZXJhbmdlcGlja2VyLWNvbnRhaW5lcl9fZGF5XCIgXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICdzZWxlY3RlZC1zYW1lLWRheSc6IGRheS5pc1NlbGVjdGVkU3RhcnREYXkgJiYgZGF5LmlzU2VsZWN0ZWRFbmREYXksXG4gICAgICAgICAgICAgICdzZWxlY3RlZC1zdGFydC1kYXknOiBkYXkuaXNTZWxlY3RlZFN0YXJ0RGF5LFxuICAgICAgICAgICAgICAnc2VsZWN0ZWQtZW5kLWRheSc6IGRheS5pc1NlbGVjdGVkRW5kRGF5LFxuICAgICAgICAgICAgICAnZGlzYWJsZWQtZGF5JzogZGF5LmlzRGlzYWJsZWREYXksXG4gICAgICAgICAgICAgICdpbi1yYW5nZS1kYXknOiBkYXkuaW5SYW5nZURheSxcbiAgICAgICAgICAgICAgJ2lzLXZhbGlkLWRhdGUnOiBkYXkuZGF0ZSA+IDAgJiYgIShkYXkuaXNTZWxlY3RlZFN0YXJ0RGF5ICYmIGRheS5pc1NlbGVjdGVkRW5kRGF5KVxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF5IG9mIGN1cnJlbnRNb250aERhdGVzKClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERheSgnTEVGVCcsIGRheSlcIlxuICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cInNlbGVjdERheSgnTEVGVCcsIGRheSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZGF5LmRhdGUgPiAwXCJcbiAgICAgICAgICAgICAgW3RhYmluZGV4XT1cImRheS5pc0Rpc2FibGVkRGF5ID8gLTEgOiAwXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJyZXRyYWN0RGF5TW9udGgoZGF5LmRhdGUsIGN1cnJlbnRNb250aCgpLCBjdXJyZW50WWVhck51bWJlcigpKVwiPlxuICAgICAgICAgICAgICB7eyBkYXkuZGF0ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkYXRlcGlja2VyX19yaWdodFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRhdGVyYW5nZXBpY2tlci1jb250YWluZXJfX2hlYWRlcl9fcHJhYnVcIj5cbiAgICAgICAgPGRpdj48L2Rpdj5cbiAgICAgICAgPHNwYW4+IHt7IG5leHRNb250aCgpIH19IHt7IG5leHRZZWFyTnVtYmVyKCkgfX0gPC9zcGFuPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJkYXRlcmFuZ2VwaWNrZXItY29udGFpbmVyX19hcnJvd19faWNvbiBwY192aWV3XCJcbiAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgIChjbGljayk9XCIhaXNOZXh0TW9udGhEaXNhYmxlZCgpICYmIG5hdmlnYXRlTW9udGgoJ05FWFQnKVwiXG4gICAgICAgICAgKGtleXVwLmVudGVyKT1cIiFpc05leHRNb250aERpc2FibGVkKCkgJiYgbmF2aWdhdGVNb250aCgnTkVYVCcpXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnZGlzYWJsZWQtbW9udGgnOiBpc05leHRNb250aERpc2FibGVkKClcbiAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyMCAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk0xOS43MDcxIDguNzA3MTFDMjAuMDk3NiA4LjMxNjU4IDIwLjA5NzYgNy42ODM0MiAxOS43MDcxIDcuMjkyODlMMTMuMzQzMSAwLjkyODkzM0MxMi45NTI2IDAuNTM4NDA5IDEyLjMxOTUgMC41Mzg0MDkgMTEuOTI4OSAwLjkyODkzM0MxMS41Mzg0IDEuMzE5NDYgMTEuNTM4NCAxLjk1MjYyIDExLjkyODkgMi4zNDMxNUwxNy41ODU4IDhMMTEuOTI4OSAxMy42NTY5QzExLjUzODQgMTQuMDQ3NCAxMS41Mzg0IDE0LjY4MDUgMTEuOTI4OSAxNS4wNzExQzEyLjMxOTUgMTUuNDYxNiAxMi45NTI2IDE1LjQ2MTYgMTMuMzQzMSAxNS4wNzExTDE5LjcwNzEgOC43MDcxMVpNLTguNzQyMjhlLTA4IDlMMTkgOUwxOSA3TDguNzQyMjhlLTA4IDdMLTguNzQyMjhlLTA4IDlaXCJcbiAgICAgICAgICAgICAgZmlsbD1cIiMxODFGMzNcIlxuICAgICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYXRlcmFuZ2VwaWNrZXItY29udGFpbmVyX19ib2R5XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlcmFuZ2VwaWNrZXItY29udGFpbmVyX193ZWVrZGF5c1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlcmFuZ2VwaWNrZXItY29udGFpbmVyX193ZWVrZGF5XCIgKm5nRm9yPVwibGV0IHdlZWtEYXkgb2Ygd2Vla0RheXMoKVwiPlxuICAgICAgICAgICAgPHNwYW4+e3sgd2Vla0RheS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlcmFuZ2VwaWNrZXItY29udGFpbmVyX19kYXlzXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJkYXRlcmFuZ2VwaWNrZXItY29udGFpbmVyX19kYXlcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAnc2VsZWN0ZWQtc2FtZS1kYXknOiBkYXkuaXNTZWxlY3RlZFN0YXJ0RGF5ICYmIGRheS5pc1NlbGVjdGVkRW5kRGF5LFxuICAgICAgICAgICAgICAnc2VsZWN0ZWQtc3RhcnQtZGF5JzogZGF5LmlzU2VsZWN0ZWRTdGFydERheSxcbiAgICAgICAgICAgICAgJ3NlbGVjdGVkLWVuZC1kYXknOiBkYXkuaXNTZWxlY3RlZEVuZERheSxcbiAgICAgICAgICAgICAgJ2Rpc2FibGVkLWRheSc6IGRheS5pc0Rpc2FibGVkRGF5LFxuICAgICAgICAgICAgICAnaW4tcmFuZ2UtZGF5JzogZGF5LmluUmFuZ2VEYXksXG4gICAgICAgICAgICAgICdpcy12YWxpZC1kYXRlJzogZGF5LmRhdGUgPiAwICYmICEoZGF5LmlzU2VsZWN0ZWRTdGFydERheSAmJiBkYXkuaXNTZWxlY3RlZEVuZERheSlcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRheSBvZiBuZXh0TW9udGhEYXRlcygpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXkoJ1JJR0hUJywgZGF5KVwiXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2VsZWN0RGF5KCdSSUdIVCcsIGRheSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZGF5LmRhdGUgPiAwXCJcbiAgICAgICAgICAgICAgW3RhYmluZGV4XT1cImRheS5pc0Rpc2FibGVkRGF5ID8gLTEgOiAwXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJyZXRyYWN0RGF5TW9udGgoZGF5LmRhdGUsIG5leHRNb250aCgpLCBuZXh0WWVhck51bWJlcigpKVwiPlxuICAgICAgICAgICAgICB7eyBkYXkuZGF0ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgXG4gIDwhLS0gVGltZSBTZWxlY3Rpb24gU2VjdGlvbiAtLT5cbiAgPGRpdiBjbGFzcz1cImRhdGVyYW5nZXBpY2tlci1jb250YWluZXJfX3RpbWVcIiAqbmdJZj1cImRhdGEoKS5kcENvbmZpZy5lbmFibGVUaW1lID09PSB0cnVlXCI+XG4gICAgPGRpdiBjbGFzcz1cInRpbWUtc2VjdGlvblwiPlxuICAgICAgPGg0PkZyb208L2g0PlxuICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXRzXCI+XG4gICAgICAgIDxpbnB1dCBcbiAgICAgICAgICB0eXBlPVwibnVtYmVyXCIgXG4gICAgICAgICAgW25nTW9kZWxdPVwiaXMxMkhvdXJGb3JtYXQoKSA/IHN0YXJ0SG91cigpIDogc3RhcnRIb3VyMjQoKVwiIFxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImlzMTJIb3VyRm9ybWF0KCkgPyBzdGFydEhvdXJTaWduYWwuc2V0KCRldmVudCkgOiBzdGFydEhvdXIyNFNpZ25hbC5zZXQoJGV2ZW50KTsgb25TdGFydEhvdXJJbnB1dCgpXCJcbiAgICAgICAgICBbbWluXT1cImlzMTJIb3VyRm9ybWF0KCkgPyAxIDogMFwiIFxuICAgICAgICAgIFttYXhdPVwiaXMxMkhvdXJGb3JtYXQoKSA/IDEyIDogMjNcIiBcbiAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0IGhvdXItaW5wdXRcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiSEhcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lLXNlcGFyYXRvclwiPjo8L3NwYW4+XG4gICAgICAgIDxpbnB1dCBcbiAgICAgICAgICB0eXBlPVwibnVtYmVyXCIgXG4gICAgICAgICAgW25nTW9kZWxdPVwic3RhcnRNaW51dGUoKVwiIChuZ01vZGVsQ2hhbmdlKT1cInN0YXJ0TWludXRlU2lnbmFsLnNldCgkZXZlbnQpXCIgXG4gICAgICAgICAgKGlucHV0KT1cIm9uU3RhcnRNaW51dGVJbnB1dCgpXCJcbiAgICAgICAgICBtaW49XCIwXCIgXG4gICAgICAgICAgbWF4PVwiNTlcIiBcbiAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0IG1pbnV0ZS1pbnB1dFwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJNTVwiPlxuICAgICAgICA8c2VsZWN0IFxuICAgICAgICAgIFtuZ01vZGVsXT1cInN0YXJ0QW1QbSgpXCIgKG5nTW9kZWxDaGFuZ2UpPVwic3RhcnRBbVBtU2lnbmFsLnNldCgkZXZlbnQpXCIgXG4gICAgICAgICAgY2xhc3M9XCJhbS1wbS1zZWxlY3RvclwiXG4gICAgICAgICAgKm5nSWY9XCJpczEySG91ckZvcm1hdCgpXCI+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkFNXCI+QU08L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiUE1cIj5QTTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIFxuICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXNlY3Rpb25cIj5cbiAgICAgIDxoND5UbzwvaDQ+XG4gICAgICA8ZGl2IGNsYXNzPVwidGltZS1pbnB1dHNcIj5cbiAgICAgICAgPGlucHV0IFxuICAgICAgICAgIHR5cGU9XCJudW1iZXJcIiBcbiAgICAgICAgICBbbmdNb2RlbF09XCJpczEySG91ckZvcm1hdCgpID8gZW5kSG91cigpIDogZW5kSG91cjI0KClcIiBcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJpczEySG91ckZvcm1hdCgpID8gZW5kSG91clNpZ25hbC5zZXQoJGV2ZW50KSA6IGVuZEhvdXIyNFNpZ25hbC5zZXQoJGV2ZW50KTsgb25FbmRIb3VySW5wdXQoKVwiXG4gICAgICAgICAgW21pbl09XCJpczEySG91ckZvcm1hdCgpID8gMSA6IDBcIiBcbiAgICAgICAgICBbbWF4XT1cImlzMTJIb3VyRm9ybWF0KCkgPyAxMiA6IDIzXCIgXG4gICAgICAgICAgc3RlcD1cIjFcIlxuICAgICAgICAgIGNsYXNzPVwidGltZS1pbnB1dCBob3VyLWlucHV0XCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIkhIXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGltZS1zZXBhcmF0b3JcIj46PC9zcGFuPlxuICAgICAgICA8aW5wdXQgXG4gICAgICAgICAgdHlwZT1cIm51bWJlclwiIFxuICAgICAgICAgIFtuZ01vZGVsXT1cImVuZE1pbnV0ZSgpXCIgKG5nTW9kZWxDaGFuZ2UpPVwiZW5kTWludXRlU2lnbmFsLnNldCgkZXZlbnQpXCIgXG4gICAgICAgICAgKGlucHV0KT1cIm9uRW5kTWludXRlSW5wdXQoKVwiXG4gICAgICAgICAgbWluPVwiMFwiIFxuICAgICAgICAgIG1heD1cIjU5XCIgXG4gICAgICAgICAgc3RlcD1cIjFcIlxuICAgICAgICAgIGNsYXNzPVwidGltZS1pbnB1dCBtaW51dGUtaW5wdXRcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiTU1cIj5cbiAgICAgICAgPHNlbGVjdCBcbiAgICAgICAgICBbbmdNb2RlbF09XCJlbmRBbVBtKClcIiAobmdNb2RlbENoYW5nZSk9XCJlbmRBbVBtU2lnbmFsLnNldCgkZXZlbnQpXCIgXG4gICAgICAgICAgY2xhc3M9XCJhbS1wbS1zZWxlY3RvclwiXG4gICAgICAgICAgKm5nSWY9XCJpczEySG91ckZvcm1hdCgpXCI+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkFNXCI+QU08L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiUE1cIj5QTTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgXG4gIDxkaXYgY2xhc3M9XCJkYXRlcmFuZ2VwaWNrZXJfX2Zvb3RlclwiPlxuICAgIDxidXR0b24gbWlzLWJ1dHRvbiB0eXBlPVwibm9uZVwiIGlkPSdtb2JpbGUtZm9vdGVyLWJ0bicgKGNsaWNrKT1cImNhbmNlbERhdGVQaWNrZXIoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgIDxidXR0b24gbWlzLWJ1dHRvbiB0eXBlPVwicHJpbWFyeVwiIGlkPVwibW9iaWxlLWZvb3Rlci1idG5cIiAoY2xpY2spPVwiYXBwbHlEYXRlcygpXCIgW2Rpc2FibGVkXT1cIiFpc0RhdGVzVmFsaWQoKVwiPkFwcGx5PC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+Il19