@oneluiz/dual-datepicker 3.5.0 → 3.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,13 +3,34 @@ import { CommonModule } from '@angular/common';
3
3
  import { FormsModule, ReactiveFormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
4
4
  import { DATE_ADAPTER } from './date-adapter';
5
5
  import { NativeDateAdapter } from './native-date-adapter';
6
+ import { DualDateRangeStore } from './core/dual-date-range.store';
6
7
  import * as i0 from "@angular/core";
7
8
  import * as i1 from "@angular/common";
8
9
  export class DualDatepickerComponent {
9
10
  elementRef;
10
11
  placeholder = 'Select date range';
11
- startDate = '';
12
- endDate = '';
12
+ set startDate(value) {
13
+ if (value) {
14
+ const date = this.dateAdapter.parse(value);
15
+ if (date)
16
+ this.rangeStore.setStart(date);
17
+ }
18
+ }
19
+ get startDate() {
20
+ const date = this.rangeStore.startDate();
21
+ return date ? this.formatDate(date) : '';
22
+ }
23
+ set endDate(value) {
24
+ if (value) {
25
+ const date = this.dateAdapter.parse(value);
26
+ if (date)
27
+ this.rangeStore.setEnd(date);
28
+ }
29
+ }
30
+ get endDate() {
31
+ const date = this.rangeStore.endDate();
32
+ return date ? this.formatDate(date) : '';
33
+ }
13
34
  showPresets = true;
14
35
  showClearButton = false;
15
36
  multiRange = false;
@@ -40,37 +61,71 @@ export class DualDatepickerComponent {
40
61
  multiDateRangeSelected = new EventEmitter();
41
62
  // Date adapter injection
42
63
  dateAdapter = inject(DATE_ADAPTER);
43
- // Signals for reactive state
64
+ // Headless store for date range state (v3.5.0+)
65
+ rangeStore = inject(DualDateRangeStore);
66
+ // UI-only signals
44
67
  showDatePicker = signal(false);
45
- dateRangeText = signal('');
46
- selectingStartDate = signal(true);
47
68
  currentMonth = signal(this.dateAdapter.today());
48
69
  previousMonth = signal(this.dateAdapter.today());
49
70
  currentMonthDays = signal([]);
50
71
  previousMonthDays = signal([]);
51
72
  isDisabled = signal(false);
52
- // Apply/Confirm support
53
- pendingStartDate = '';
54
- pendingEndDate = '';
55
- hasPendingChanges = signal(false);
56
- // Time picker support
57
- startHour = 0;
58
- startMinute = 0;
59
- endHour = 23;
60
- endMinute = 59;
61
73
  showStartTimePicker = signal(false);
62
74
  showEndTimePicker = signal(false);
63
- // Hover range preview
64
75
  hoverDate = signal(null);
65
- // Multi-range support
76
+ // Computed time properties from store
77
+ get startHour() {
78
+ const time = this.rangeStore.startTime();
79
+ return this.parseTime(time).hour;
80
+ }
81
+ get startMinute() {
82
+ const time = this.rangeStore.startTime();
83
+ return this.parseTime(time).minute;
84
+ }
85
+ get endHour() {
86
+ const time = this.rangeStore.endTime();
87
+ return this.parseTime(time).hour;
88
+ }
89
+ get endMinute() {
90
+ const time = this.rangeStore.endTime();
91
+ return this.parseTime(time).minute;
92
+ }
93
+ setStartHourMinute(hour, minute) {
94
+ const timeStr = this.formatTime(hour, minute);
95
+ this.rangeStore.setStartTime(timeStr);
96
+ }
97
+ setEndHourMinute(hour, minute) {
98
+ const timeStr = this.formatTime(hour, minute);
99
+ this.rangeStore.setEndTime(timeStr);
100
+ }
101
+ // Multi-range support (UI-specific)
66
102
  selectedRanges = signal([]);
67
103
  currentRangeIndex = signal(-1);
68
- // Keyboard navigation
69
- focusedDay = signal(null); // monthIndex: 0 = previous, 1 = current
104
+ // Keyboard navigation (UI-specific)
105
+ focusedDay = signal(null);
70
106
  // Computed values
71
107
  currentMonthName = computed(() => this.getMonthName(this.currentMonth()));
72
108
  previousMonthName = computed(() => this.getMonthName(this.previousMonth()));
73
109
  weekDayNames = computed(() => this.getDayNames());
110
+ // Computed from store
111
+ dateRangeText = computed(() => this.rangeStore.rangeText());
112
+ selectingStartDate = computed(() => this.rangeStore.selectingStart());
113
+ hasPendingChanges = computed(() => this.rangeStore.hasPendingChanges());
114
+ // Computed for template access to pending dates (requireApply mode)
115
+ get pendingStartDate() {
116
+ // In requireApply mode, store keeps pending values
117
+ // For now, use actual store values as pending (store handles this)
118
+ if (!this.requireApply)
119
+ return '';
120
+ const date = this.rangeStore.startDate();
121
+ return date && this.hasPendingChanges() ? this.formatDate(date) : '';
122
+ }
123
+ get pendingEndDate() {
124
+ if (!this.requireApply)
125
+ return '';
126
+ const date = this.rangeStore.endDate();
127
+ return date && this.hasPendingChanges() ? this.formatDate(date) : '';
128
+ }
74
129
  defaultMonthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
75
130
  defaultMonthNamesShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
76
131
  defaultDayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
@@ -80,10 +135,10 @@ export class DualDatepickerComponent {
80
135
  onTouched = () => { };
81
136
  constructor(elementRef) {
82
137
  this.elementRef = elementRef;
83
- // Effect to emit changes when dates change
138
+ // Effect to emit changes when dates change in store
84
139
  effect(() => {
85
- const range = this.dateRangeText();
86
- if (this.startDate || this.endDate) {
140
+ const range = this.rangeStore.range();
141
+ if (range.start || range.end) {
87
142
  this.onChange(this.getDateRangeValue());
88
143
  }
89
144
  });
@@ -387,29 +442,54 @@ export class DualDatepickerComponent {
387
442
  return focused !== null && focused.date === date && focused.monthIndex === monthIndex;
388
443
  }
389
444
  ngOnInit() {
390
- // Initialize time picker with default times
391
- if (this.enableTimePicker) {
392
- const startTime = this.parseTime(this.defaultStartTime);
393
- this.startHour = startTime.hour;
394
- this.startMinute = startTime.minute;
395
- const endTime = this.parseTime(this.defaultEndTime);
396
- this.endHour = endTime.hour;
397
- this.endMinute = endTime.minute;
445
+ // Configure the headless store
446
+ this.rangeStore.configure({
447
+ enableTimePicker: this.enableTimePicker,
448
+ defaultStartTime: this.defaultStartTime,
449
+ defaultEndTime: this.defaultEndTime,
450
+ disabledDates: this.disabledDates
451
+ });
452
+ // Initialize dates in store if provided
453
+ if (this.startDate) {
454
+ const date = this.dateAdapter.parse(this.startDate);
455
+ if (date)
456
+ this.rangeStore.setStart(date);
457
+ }
458
+ if (this.endDate) {
459
+ const date = this.dateAdapter.parse(this.endDate);
460
+ if (date)
461
+ this.rangeStore.setEnd(date);
398
462
  }
399
463
  if (this.startDate && this.endDate) {
400
- this.updateDateRangeText();
401
464
  this.generateCalendars();
402
465
  }
403
466
  }
404
467
  ngOnChanges(changes) {
405
468
  if (changes['startDate'] || changes['endDate']) {
469
+ // Sync with store
470
+ if (changes['startDate'] && this.startDate) {
471
+ const date = this.dateAdapter.parse(this.startDate);
472
+ if (date)
473
+ this.rangeStore.setStart(date);
474
+ }
475
+ if (changes['endDate'] && this.endDate) {
476
+ const date = this.dateAdapter.parse(this.endDate);
477
+ if (date)
478
+ this.rangeStore.setEnd(date);
479
+ }
406
480
  if (this.startDate && this.endDate) {
407
- this.updateDateRangeText();
408
481
  this.generateCalendars();
409
482
  }
410
- else if (!this.startDate && !this.endDate) {
411
- this.dateRangeText.set('');
412
- }
483
+ }
484
+ // Update store configuration if relevant inputs change
485
+ if (changes['enableTimePicker'] || changes['defaultStartTime'] ||
486
+ changes['defaultEndTime'] || changes['disabledDates']) {
487
+ this.rangeStore.configure({
488
+ enableTimePicker: this.enableTimePicker,
489
+ defaultStartTime: this.defaultStartTime,
490
+ defaultEndTime: this.defaultEndTime,
491
+ disabledDates: this.disabledDates
492
+ });
413
493
  }
414
494
  }
415
495
  formatDate(date) {
@@ -444,20 +524,15 @@ export class DualDatepickerComponent {
444
524
  formatted = formatted.replace(/D/g, String(day));
445
525
  return formatted;
446
526
  }
527
+ // Note: updateDateRangeText is now handled by computed dateRangeText from store
528
+ // Keeping this method for backward compatibility but it's a no-op
447
529
  updateDateRangeText() {
448
- if (this.startDate && this.endDate) {
449
- const start = this.formatDateDisplay(this.startDate);
450
- const end = this.formatDateDisplay(this.endDate);
451
- this.dateRangeText.set(`${start} - ${end}`);
452
- }
453
- else {
454
- this.dateRangeText.set('');
455
- }
530
+ // Text is now automatically computed from store.rangeText()
456
531
  }
457
532
  toggleDatePicker() {
458
533
  this.showDatePicker.update(value => !value);
459
534
  if (this.showDatePicker()) {
460
- this.selectingStartDate.set(true);
535
+ // selectingStart is managed by store, no need to set here
461
536
  const currentMonthValue = this.currentMonth();
462
537
  const year = this.dateAdapter.getYear(currentMonthValue);
463
538
  const month = this.dateAdapter.getMonth(currentMonthValue);
@@ -502,11 +577,15 @@ export class DualDatepickerComponent {
502
577
  for (let day = 1; day <= daysInMonth; day++) {
503
578
  const dayDate = this.dateAdapter.createDate(year, month, day);
504
579
  const dateStr = this.formatDate(dayDate);
505
- // Check if date is in pending range (for requireApply mode)
506
- const isPendingStart = this.requireApply && this.pendingStartDate === dateStr;
507
- const isPendingEnd = this.requireApply && this.pendingEndDate === dateStr;
508
- const inPendingRange = this.requireApply && this.pendingStartDate && this.pendingEndDate &&
509
- dateStr >= this.pendingStartDate && dateStr <= this.pendingEndDate;
580
+ // Get pending dates from store (for requireApply mode)
581
+ const pendingStart = this.rangeStore.startDate(); // In pending mode, store holds pending values
582
+ const pendingEnd = this.rangeStore.endDate();
583
+ const pendingStartStr = pendingStart ? this.formatDate(pendingStart) : '';
584
+ const pendingEndStr = pendingEnd ? this.formatDate(pendingEnd) : '';
585
+ const isPendingStart = this.requireApply && pendingStartStr === dateStr;
586
+ const isPendingEnd = this.requireApply && pendingEndStr === dateStr;
587
+ const inPendingRange = this.requireApply && pendingStartStr && pendingEndStr &&
588
+ dateStr >= pendingStartStr && dateStr <= pendingEndStr;
510
589
  // Check if date is in hover preview range
511
590
  const inHoverRange = this.isInHoverRange(dateStr);
512
591
  monthDays.push({
@@ -560,31 +639,34 @@ export class DualDatepickerComponent {
560
639
  if (this.multiRange) {
561
640
  if (this.selectingStartDate())
562
641
  return false;
563
- if (!this.startDate)
642
+ const currentStart = this.startDate;
643
+ if (!currentStart)
564
644
  return false;
565
- const minDate = this.startDate < hover ? this.startDate : hover;
566
- const maxDate = this.startDate > hover ? this.startDate : hover;
645
+ const minDate = currentStart < hover ? currentStart : hover;
646
+ const maxDate = currentStart > hover ? currentStart : hover;
567
647
  return dateStr >= minDate && dateStr <= maxDate;
568
648
  }
569
649
  else {
570
- // In single range mode with requireApply
650
+ // In single range mode
651
+ if (this.selectingStartDate())
652
+ return false;
571
653
  if (this.requireApply) {
572
- if (this.selectingStartDate())
654
+ // Use pending dates from store
655
+ const pendingStart = this.rangeStore.startDate();
656
+ if (!pendingStart)
573
657
  return false;
574
- if (!this.pendingStartDate)
575
- return false;
576
- const minDate = this.pendingStartDate < hover ? this.pendingStartDate : hover;
577
- const maxDate = this.pendingStartDate > hover ? this.pendingStartDate : hover;
658
+ const pendingStartStr = this.formatDate(pendingStart);
659
+ const minDate = pendingStartStr < hover ? pendingStartStr : hover;
660
+ const maxDate = pendingStartStr > hover ? pendingStartStr : hover;
578
661
  return dateStr >= minDate && dateStr <= maxDate;
579
662
  }
580
663
  else {
581
- // In single range mode without requireApply
582
- if (this.selectingStartDate())
583
- return false;
584
- if (!this.startDate)
664
+ // Use actual dates
665
+ const currentStart = this.startDate;
666
+ if (!currentStart)
585
667
  return false;
586
- const minDate = this.startDate < hover ? this.startDate : hover;
587
- const maxDate = this.startDate > hover ? this.startDate : hover;
668
+ const minDate = currentStart < hover ? currentStart : hover;
669
+ const maxDate = currentStart > hover ? currentStart : hover;
588
670
  return dateStr >= minDate && dateStr <= maxDate;
589
671
  }
590
672
  }
@@ -604,35 +686,38 @@ export class DualDatepickerComponent {
604
686
  selectDay(dayObj) {
605
687
  if (!dayObj.isCurrentMonth || this.isDisabled() || dayObj.isDisabled)
606
688
  return;
689
+ const selectedDate = this.dateAdapter.parse(dayObj.date);
690
+ if (!selectedDate)
691
+ return;
607
692
  if (this.multiRange) {
608
693
  // Multi-range mode: add ranges to array
609
694
  if (this.selectingStartDate()) {
610
- this.startDate = dayObj.date;
611
- this.endDate = '';
612
- this.dateRangeText.set('');
613
- this.selectingStartDate.set(false);
695
+ this.rangeStore.setStart(selectedDate);
696
+ this.rangeStore.setEnd(null);
614
697
  }
615
698
  else {
616
- if (dayObj.date < this.startDate) {
617
- this.endDate = this.startDate;
618
- this.startDate = dayObj.date;
699
+ const currentStart = this.rangeStore.startDate();
700
+ if (currentStart && selectedDate < currentStart) {
701
+ // Swap: selected becomes start, current start becomes end
702
+ this.rangeStore.setStart(selectedDate);
703
+ this.rangeStore.setEnd(currentStart);
619
704
  }
620
705
  else {
621
- this.endDate = dayObj.date;
706
+ this.rangeStore.setEnd(selectedDate);
622
707
  }
623
708
  // Add the new range to the array
709
+ const range = this.rangeStore.range();
624
710
  const newRange = {
625
- startDate: this.startDate,
626
- endDate: this.endDate,
627
- rangeText: this.formatDateDisplay(this.startDate) + ' – ' + this.formatDateDisplay(this.endDate)
711
+ startDate: range.start,
712
+ endDate: range.end,
713
+ rangeText: this.formatDateDisplay(range.start) + ' – ' + this.formatDateDisplay(range.end),
714
+ ...(this.enableTimePicker && { startTime: range.startTime, endTime: range.endTime })
628
715
  };
629
716
  const currentRanges = [...this.selectedRanges()];
630
717
  currentRanges.push(newRange);
631
718
  this.selectedRanges.set(currentRanges);
632
719
  // Reset for next range selection
633
- this.startDate = '';
634
- this.endDate = '';
635
- this.selectingStartDate.set(true);
720
+ this.rangeStore.reset();
636
721
  // Update display text
637
722
  this.updateMultiRangeText();
638
723
  // Don't close if multiRange, allow adding more ranges
@@ -645,50 +730,46 @@ export class DualDatepickerComponent {
645
730
  this.generateCalendars();
646
731
  }
647
732
  else {
648
- // Single range mode (original behavior)
733
+ // Single range mode
649
734
  if (this.requireApply) {
650
735
  // Apply mode: use pending dates, don't emit until Apply is clicked
651
736
  if (this.selectingStartDate()) {
652
- this.pendingStartDate = dayObj.date;
653
- this.pendingEndDate = '';
654
- this.selectingStartDate.set(false);
655
- this.hasPendingChanges.set(true);
737
+ this.rangeStore.setPendingStart(selectedDate);
738
+ this.rangeStore.setPendingEnd(null);
656
739
  }
657
740
  else {
658
- if (dayObj.date < this.pendingStartDate) {
659
- this.pendingEndDate = this.pendingStartDate;
660
- this.pendingStartDate = dayObj.date;
741
+ const pendingStart = this.rangeStore.startDate();
742
+ if (pendingStart && selectedDate < pendingStart) {
743
+ // Swap
744
+ this.rangeStore.setPendingStart(selectedDate);
745
+ this.rangeStore.setPendingEnd(pendingStart);
661
746
  }
662
747
  else {
663
- this.pendingEndDate = dayObj.date;
748
+ this.rangeStore.setPendingEnd(selectedDate);
664
749
  }
665
- this.selectingStartDate.set(true);
666
- this.hasPendingChanges.set(true);
667
750
  }
668
751
  this.generateCalendars();
669
752
  }
670
753
  else {
671
754
  // Immediate mode: emit changes immediately
672
755
  if (this.selectingStartDate()) {
673
- this.startDate = dayObj.date;
674
- this.endDate = '';
675
- this.dateRangeText.set('');
676
- this.selectingStartDate.set(false);
756
+ this.rangeStore.setStart(selectedDate);
757
+ this.rangeStore.setEnd(null);
677
758
  this.emitChange();
678
759
  }
679
760
  else {
680
- if (dayObj.date < this.startDate) {
681
- this.endDate = this.startDate;
682
- this.startDate = dayObj.date;
761
+ const currentStart = this.rangeStore.startDate();
762
+ if (currentStart && selectedDate < currentStart) {
763
+ // Swap
764
+ this.rangeStore.setStart(selectedDate);
765
+ this.rangeStore.setEnd(currentStart);
683
766
  }
684
767
  else {
685
- this.endDate = dayObj.date;
768
+ this.rangeStore.setEnd(selectedDate);
686
769
  }
687
- this.updateDateRangeText();
688
770
  if (this.closeOnSelection) {
689
771
  this.showDatePicker.set(false);
690
772
  }
691
- this.selectingStartDate.set(true);
692
773
  this.emitChange();
693
774
  this.emitSelection();
694
775
  }
@@ -699,27 +780,17 @@ export class DualDatepickerComponent {
699
780
  applySelection() {
700
781
  if (!this.hasPendingChanges())
701
782
  return;
702
- // Apply pending dates
703
- this.startDate = this.pendingStartDate;
704
- this.endDate = this.pendingEndDate;
705
- this.updateDateRangeText();
706
- // Clear pending state
707
- this.pendingStartDate = '';
708
- this.pendingEndDate = '';
709
- this.hasPendingChanges.set(false);
783
+ // Apply pending dates through store
784
+ this.rangeStore.applyPending();
710
785
  // Emit changes
711
786
  this.emitChange();
712
787
  this.emitSelection();
713
788
  // Close picker
714
789
  this.showDatePicker.set(false);
715
- this.selectingStartDate.set(true);
716
790
  }
717
791
  cancelSelection() {
718
- // Discard pending changes
719
- this.pendingStartDate = '';
720
- this.pendingEndDate = '';
721
- this.hasPendingChanges.set(false);
722
- this.selectingStartDate.set(true);
792
+ // Discard pending changes through store
793
+ this.rangeStore.cancelPending();
723
794
  // Regenerate calendars to clear pending visual state
724
795
  this.generateCalendars();
725
796
  }
@@ -748,9 +819,11 @@ export class DualDatepickerComponent {
748
819
  return;
749
820
  }
750
821
  const range = preset.getValue();
751
- this.startDate = range.start;
752
- this.endDate = range.end;
753
- this.updateDateRangeText();
822
+ const startDate = this.dateAdapter.parse(range.start);
823
+ const endDate = this.dateAdapter.parse(range.end);
824
+ if (startDate && endDate) {
825
+ this.rangeStore.setRange(startDate, endDate);
826
+ }
754
827
  this.generateCalendars();
755
828
  if (this.closeOnPresetSelection) {
756
829
  this.showDatePicker.set(false);
@@ -758,11 +831,8 @@ export class DualDatepickerComponent {
758
831
  this.emitSelection();
759
832
  }
760
833
  clear() {
761
- this.startDate = '';
762
- this.endDate = '';
763
- this.dateRangeText.set('');
834
+ this.rangeStore.reset();
764
835
  this.showDatePicker.set(false);
765
- this.selectingStartDate.set(true);
766
836
  if (this.multiRange) {
767
837
  this.selectedRanges.set([]);
768
838
  this.currentRangeIndex.set(-1);
@@ -787,37 +857,32 @@ export class DualDatepickerComponent {
787
857
  }
788
858
  updateMultiRangeText() {
789
859
  const count = this.selectedRanges().length;
790
- if (count === 0) {
791
- this.dateRangeText.set('');
792
- }
793
- else if (count === 1) {
794
- this.dateRangeText.set('1 range selected');
795
- }
796
- else {
797
- this.dateRangeText.set(`${count} ranges selected`);
798
- }
860
+ // Note: dateRangeText is now computed from store, this is for multi-range UI only
861
+ // We could store this in a separate signal if needed, but for now just track ranges count
799
862
  }
800
863
  emitChange() {
864
+ const storeRange = this.rangeStore.range();
801
865
  const range = {
802
- startDate: this.startDate,
803
- endDate: this.endDate,
866
+ startDate: storeRange.start,
867
+ endDate: storeRange.end,
804
868
  rangeText: this.dateRangeText()
805
869
  };
806
870
  if (this.enableTimePicker) {
807
- range.startTime = this.formatTime(this.startHour, this.startMinute);
808
- range.endTime = this.formatTime(this.endHour, this.endMinute);
871
+ range.startTime = storeRange.startTime;
872
+ range.endTime = storeRange.endTime;
809
873
  }
810
874
  this.dateRangeChange.emit(range);
811
875
  }
812
876
  emitSelection() {
877
+ const storeRange = this.rangeStore.range();
813
878
  const range = {
814
- startDate: this.startDate,
815
- endDate: this.endDate,
879
+ startDate: storeRange.start,
880
+ endDate: storeRange.end,
816
881
  rangeText: this.dateRangeText()
817
882
  };
818
883
  if (this.enableTimePicker) {
819
- range.startTime = this.formatTime(this.startHour, this.startMinute);
820
- range.endTime = this.formatTime(this.endHour, this.endMinute);
884
+ range.startTime = storeRange.startTime;
885
+ range.endTime = storeRange.endTime;
821
886
  }
822
887
  this.dateRangeSelected.emit(range);
823
888
  }
@@ -832,14 +897,15 @@ export class DualDatepickerComponent {
832
897
  });
833
898
  }
834
899
  getDateRangeValue() {
900
+ const storeRange = this.rangeStore.range();
835
901
  const range = {
836
- startDate: this.startDate,
837
- endDate: this.endDate,
902
+ startDate: storeRange.start,
903
+ endDate: storeRange.end,
838
904
  rangeText: this.dateRangeText()
839
905
  };
840
906
  if (this.enableTimePicker) {
841
- range.startTime = this.formatTime(this.startHour, this.startMinute);
842
- range.endTime = this.formatTime(this.endHour, this.endMinute);
907
+ range.startTime = storeRange.startTime;
908
+ range.endTime = storeRange.endTime;
843
909
  }
844
910
  return range;
845
911
  }
@@ -857,80 +923,64 @@ export class DualDatepickerComponent {
857
923
  this.showStartTimePicker.set(false);
858
924
  }
859
925
  incrementStartHour() {
860
- this.startHour = (this.startHour + 1) % 24;
861
- if (this.requireApply) {
862
- this.hasPendingChanges.set(true);
863
- }
864
- else {
926
+ const newHour = (this.startHour + 1) % 24;
927
+ this.setStartHourMinute(newHour, this.startMinute);
928
+ if (!this.requireApply) {
865
929
  this.emitChange();
866
930
  }
867
931
  }
868
932
  decrementStartHour() {
869
- this.startHour = this.startHour === 0 ? 23 : this.startHour - 1;
870
- if (this.requireApply) {
871
- this.hasPendingChanges.set(true);
872
- }
873
- else {
933
+ const newHour = this.startHour === 0 ? 23 : this.startHour - 1;
934
+ this.setStartHourMinute(newHour, this.startMinute);
935
+ if (!this.requireApply) {
874
936
  this.emitChange();
875
937
  }
876
938
  }
877
939
  incrementStartMinute() {
878
- this.startMinute = (this.startMinute + this.minuteStep) % 60;
879
- if (this.requireApply) {
880
- this.hasPendingChanges.set(true);
881
- }
882
- else {
940
+ const newMinute = (this.startMinute + this.minuteStep) % 60;
941
+ this.setStartHourMinute(this.startHour, newMinute);
942
+ if (!this.requireApply) {
883
943
  this.emitChange();
884
944
  }
885
945
  }
886
946
  decrementStartMinute() {
887
- this.startMinute = this.startMinute - this.minuteStep;
888
- if (this.startMinute < 0) {
889
- this.startMinute = 60 - this.minuteStep;
947
+ let newMinute = this.startMinute - this.minuteStep;
948
+ if (newMinute < 0) {
949
+ newMinute = 60 - this.minuteStep;
890
950
  }
891
- if (this.requireApply) {
892
- this.hasPendingChanges.set(true);
893
- }
894
- else {
951
+ this.setStartHourMinute(this.startHour, newMinute);
952
+ if (!this.requireApply) {
895
953
  this.emitChange();
896
954
  }
897
955
  }
898
956
  incrementEndHour() {
899
- this.endHour = (this.endHour + 1) % 24;
900
- if (this.requireApply) {
901
- this.hasPendingChanges.set(true);
902
- }
903
- else {
957
+ const newHour = (this.endHour + 1) % 24;
958
+ this.setEndHourMinute(newHour, this.endMinute);
959
+ if (!this.requireApply) {
904
960
  this.emitChange();
905
961
  }
906
962
  }
907
963
  decrementEndHour() {
908
- this.endHour = this.endHour === 0 ? 23 : this.endHour - 1;
909
- if (this.requireApply) {
910
- this.hasPendingChanges.set(true);
911
- }
912
- else {
964
+ const newHour = this.endHour === 0 ? 23 : this.endHour - 1;
965
+ this.setEndHourMinute(newHour, this.endMinute);
966
+ if (!this.requireApply) {
913
967
  this.emitChange();
914
968
  }
915
969
  }
916
970
  incrementEndMinute() {
917
- this.endMinute = (this.endMinute + this.minuteStep) % 60;
918
- if (this.requireApply) {
919
- this.hasPendingChanges.set(true);
920
- }
921
- else {
971
+ const newMinute = (this.endMinute + this.minuteStep) % 60;
972
+ this.setEndHourMinute(this.endHour, newMinute);
973
+ if (!this.requireApply) {
922
974
  this.emitChange();
923
975
  }
924
976
  }
925
977
  decrementEndMinute() {
926
- this.endMinute = this.endMinute - this.minuteStep;
927
- if (this.endMinute < 0) {
928
- this.endMinute = 60 - this.minuteStep;
929
- }
930
- if (this.requireApply) {
931
- this.hasPendingChanges.set(true);
978
+ let newMinute = this.endMinute - this.minuteStep;
979
+ if (newMinute < 0) {
980
+ newMinute = 60 - this.minuteStep;
932
981
  }
933
- else {
982
+ this.setEndHourMinute(this.endHour, newMinute);
983
+ if (!this.requireApply) {
934
984
  this.emitChange();
935
985
  }
936
986
  }
@@ -973,29 +1023,23 @@ export class DualDatepickerComponent {
973
1023
  // ControlValueAccessor implementation
974
1024
  writeValue(value) {
975
1025
  if (value) {
1026
+ // Use setters which delegate to store
976
1027
  this.startDate = value.startDate || '';
977
1028
  this.endDate = value.endDate || '';
978
1029
  if (this.enableTimePicker) {
979
1030
  if (value.startTime) {
980
- const startTime = this.parseTime(value.startTime);
981
- this.startHour = startTime.hour;
982
- this.startMinute = startTime.minute;
1031
+ this.rangeStore.setStartTime(value.startTime);
983
1032
  }
984
1033
  if (value.endTime) {
985
- const endTime = this.parseTime(value.endTime);
986
- this.endHour = endTime.hour;
987
- this.endMinute = endTime.minute;
1034
+ this.rangeStore.setEndTime(value.endTime);
988
1035
  }
989
1036
  }
990
1037
  if (this.startDate && this.endDate) {
991
- this.updateDateRangeText();
992
1038
  this.generateCalendars();
993
1039
  }
994
1040
  }
995
1041
  else {
996
- this.startDate = '';
997
- this.endDate = '';
998
- this.dateRangeText.set('');
1042
+ this.rangeStore.reset();
999
1043
  }
1000
1044
  }
1001
1045
  registerOnChange(fn) {
@@ -1102,4 +1146,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1102
1146
  type: HostListener,
1103
1147
  args: ['keydown', ['$event']]
1104
1148
  }] } });
1105
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVhbC1kYXRlcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kdWFsLWRhdGVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vc3JjL2R1YWwtZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFvQyxZQUFZLEVBQWMsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqTCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRyxPQUFPLEVBQWUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7OztBQW9EMUQsTUFBTSxPQUFPLHVCQUF1QjtJQW9GZDtJQW5GWCxXQUFXLEdBQVcsbUJBQW1CLENBQUM7SUFDMUMsU0FBUyxHQUFXLEVBQUUsQ0FBQztJQUN2QixPQUFPLEdBQVcsRUFBRSxDQUFDO0lBQ3JCLFdBQVcsR0FBWSxJQUFJLENBQUM7SUFDNUIsZUFBZSxHQUFZLEtBQUssQ0FBQztJQUNqQyxVQUFVLEdBQVksS0FBSyxDQUFDO0lBQzVCLGdCQUFnQixHQUFZLElBQUksQ0FBQztJQUNqQyxzQkFBc0IsR0FBWSxJQUFJLENBQUM7SUFDdkMsbUJBQW1CLEdBQVksSUFBSSxDQUFDO0lBQ3BDLHdCQUF3QixHQUFZLElBQUksQ0FBQztJQUN6QyxPQUFPLEdBQW1CLEVBQUUsQ0FBQztJQUM3QixLQUFLLEdBQWMsU0FBUyxDQUFDO0lBQzdCLG9CQUFvQixHQUFXLE1BQU0sQ0FBQztJ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QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFDRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBK0RQLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFXMUMsd0JBQXdCO3NCQUR2QixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgSG9zdExpc3RlbmVyLCBFbGVtZW50UmVmLCBmb3J3YXJkUmVmLCBzaWduYWwsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEYXRlQWRhcHRlciwgREFURV9BREFQVEVSIH0gZnJvbSAnLi9kYXRlLWFkYXB0ZXInO1xuaW1wb3J0IHsgTmF0aXZlRGF0ZUFkYXB0ZXIgfSBmcm9tICcuL25hdGl2ZS1kYXRlLWFkYXB0ZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVSYW5nZSB7XG4gIHN0YXJ0RGF0ZTogc3RyaW5nO1xuICBlbmREYXRlOiBzdHJpbmc7XG4gIHJhbmdlVGV4dDogc3RyaW5nO1xuICBzdGFydFRpbWU/OiBzdHJpbmc7IC8vIEhIOm1tIGZvcm1hdCAob3B0aW9uYWwpXG4gIGVuZFRpbWU/OiBzdHJpbmc7IC8vIEhIOm1tIGZvcm1hdCAob3B0aW9uYWwpXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGlEYXRlUmFuZ2Uge1xuICByYW5nZXM6IERhdGVSYW5nZVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByZXNldFJhbmdlIHtcbiAgc3RhcnQ6IHN0cmluZztcbiAgZW5kOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJlc2V0Q29uZmlnIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgZ2V0VmFsdWU6ICgpID0+IFByZXNldFJhbmdlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsZUNvbmZpZyB7XG4gIG1vbnRoTmFtZXM/OiBzdHJpbmdbXTtcbiAgbW9udGhOYW1lc1Nob3J0Pzogc3RyaW5nW107XG4gIGRheU5hbWVzPzogc3RyaW5nW107XG4gIGRheU5hbWVzU2hvcnQ/OiBzdHJpbmdbXTtcbiAgZmlyc3REYXlPZldlZWs/OiBudW1iZXI7IC8vIDAgPSBTdW5kYXksIDEgPSBNb25kYXksIGV0Yy5cbn1cblxuZXhwb3J0IHR5cGUgVGhlbWVUeXBlID0gJ2RlZmF1bHQnIHwgJ2Jvb3RzdHJhcCcgfCAnYnVsbWEnIHwgJ2ZvdW5kYXRpb24nIHwgJ3RhaWx3aW5kJyB8ICdjdXN0b20nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZHVhbC1kYXRlcGlja2VyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vZHVhbC1kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2R1YWwtZGF0ZXBpY2tlci5jb21wb25lbnQuc2NzcycsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRHVhbERhdGVwaWNrZXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IERBVEVfQURBUFRFUixcbiAgICAgIHVzZUNsYXNzOiBOYXRpdmVEYXRlQWRhcHRlclxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEdWFsRGF0ZXBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VsZWN0IGRhdGUgcmFuZ2UnO1xuICBASW5wdXQoKSBzdGFydERhdGU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBlbmREYXRlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgc2hvd1ByZXNldHM6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93Q2xlYXJCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbXVsdGlSYW5nZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjbG9zZU9uU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgY2xvc2VPblByZXNldFNlbGVjdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGNsb3NlT25DbGlja091dHNpZGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBlbmFibGVLZXlib2FyZE5hdmlnYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBwcmVzZXRzOiBQcmVzZXRDb25maWdbXSA9IFtdO1xuICBASW5wdXQoKSB0aGVtZTogVGhlbWVUeXBlID0gJ2RlZmF1bHQnO1xuICBASW5wdXQoKSBpbnB1dEJhY2tncm91bmRDb2xvcjogc3RyaW5nID0gJyNmZmYnO1xuICBASW5wdXQoKSBpbnB1dFRleHRDb2xvcjogc3RyaW5nID0gJyM0OTUwNTcnO1xuICBASW5wdXQoKSBpbnB1dEJvcmRlckNvbG9yOiBzdHJpbmcgPSAnI2NlZDRkYSc7XG4gIEBJbnB1dCgpIGlucHV0Qm9yZGVyQ29sb3JIb3Zlcjogc3RyaW5nID0gJyNjZWQ0ZGEnO1xuICBASW5wdXQoKSBpbnB1dEJvcmRlckNvbG9yRm9jdXM6IHN0cmluZyA9ICcjODBiZGZmJztcbiAgQElucHV0KCkgaW5wdXRQYWRkaW5nOiBzdHJpbmcgPSAnMC4zNzVyZW0gMC43NXJlbSc7XG4gIEBJbnB1dCgpIGxvY2FsZTogTG9jYWxlQ29uZmlnID0ge307XG4gIEBJbnB1dCgpIGRpc2FibGVkRGF0ZXM6IERhdGVbXSB8ICgoZGF0ZTogRGF0ZSkgPT4gYm9vbGVhbikgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIGRpc3BsYXlGb3JtYXQ6IHN0cmluZyA9ICdEIE1NTSc7IC8vIEZvcm1hdCBmb3IgZGlzcGxheWluZyBkYXRlcyBpbiBpbnB1dFxuICBASW5wdXQoKSByZXF1aXJlQXBwbHk6IGJvb2xlYW4gPSBmYWxzZTsgLy8gUmVxdWlyZSBBcHBseSBidXR0b24gY29uZmlybWF0aW9uXG4gIEBJbnB1dCgpIGVuYWJsZVRpbWVQaWNrZXI6IGJvb2xlYW4gPSBmYWxzZTsgLy8gRW5hYmxlIHRpbWUgc2VsZWN0aW9uXG4gIEBJbnB1dCgpIHRpbWVGb3JtYXQ6ICcxMmgnIHwgJzI0aCcgPSAnMjRoJzsgLy8gVGltZSBmb3JtYXRcbiAgQElucHV0KCkgbWludXRlU3RlcDogbnVtYmVyID0gMTU7IC8vIFN0ZXAgZm9yIG1pbnV0ZSBzZWxlY3RvciAoMSwgNSwgMTUsIDMwKVxuICBASW5wdXQoKSBkZWZhdWx0U3RhcnRUaW1lOiBzdHJpbmcgPSAnMDA6MDAnOyAvLyBEZWZhdWx0IHN0YXJ0IHRpbWUgSEg6bW1cbiAgQElucHV0KCkgZGVmYXVsdEVuZFRpbWU6IHN0cmluZyA9ICcyMzo1OSc7IC8vIERlZmF1bHQgZW5kIHRpbWUgSEg6bW1cblxuICBAT3V0cHV0KCkgZGF0ZVJhbmdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlUmFuZ2U+KCk7XG4gIEBPdXRwdXQoKSBkYXRlUmFuZ2VTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZVJhbmdlPigpO1xuICBAT3V0cHV0KCkgbXVsdGlEYXRlUmFuZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE11bHRpRGF0ZVJhbmdlPigpO1xuICBAT3V0cHV0KCkgbXVsdGlEYXRlUmFuZ2VTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TXVsdGlEYXRlUmFuZ2U+KCk7XG5cbiAgLy8gRGF0ZSBhZGFwdGVyIGluamVjdGlvblxuICBwcml2YXRlIGRhdGVBZGFwdGVyID0gaW5qZWN0PERhdGVBZGFwdGVyPihEQVRFX0FEQVBURVIpO1xuXG4gIC8vIFNpZ25hbHMgZm9yIHJlYWN0aXZlIHN0YXRlXG4gIHNob3dEYXRlUGlja2VyID0gc2lnbmFsKGZhbHNlKTtcbiAgZGF0ZVJhbmdlVGV4dCA9IHNpZ25hbCgnJyk7XG4gIHNlbGVjdGluZ1N0YXJ0RGF0ZSA9IHNpZ25hbCh0cnVlKTtcbiAgY3VycmVudE1vbnRoID0gc2lnbmFsKHRoaXMuZGF0ZUFkYXB0ZXIudG9kYXkoKSk7XG4gIHByZXZpb3VzTW9udGggPSBzaWduYWwodGhpcy5kYXRlQWRhcHRlci50b2RheSgpKTtcbiAgY3VycmVudE1vbnRoRGF5cyA9IHNpZ25hbDxhbnlbXT4oW10pO1xuICBwcmV2aW91c01vbnRoRGF5cyA9IHNpZ25hbDxhbnlbXT4oW10pO1xuICBpc0Rpc2FibGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgXG4gIC8vIEFwcGx5L0NvbmZpcm0gc3VwcG9ydFxuICBwZW5kaW5nU3RhcnREYXRlOiBzdHJpbmcgPSAnJztcbiAgcGVuZGluZ0VuZERhdGU6IHN0cmluZyA9ICcnO1xuICBoYXNQZW5kaW5nQ2hhbmdlcyA9IHNpZ25hbChmYWxzZSk7XG4gIFxuICAvLyBUaW1lIHBpY2tlciBzdXBwb3J0XG4gIHN0YXJ0SG91cjogbnVtYmVyID0gMDtcbiAgc3RhcnRNaW51dGU6IG51bWJlciA9IDA7XG4gIGVuZEhvdXI6IG51bWJlciA9IDIzO1xuICBlbmRNaW51dGU6IG51bWJlciA9IDU5O1xuICBzaG93U3RhcnRUaW1lUGlja2VyID0gc2lnbmFsKGZhbHNlKTtcbiAgc2hvd0VuZFRpbWVQaWNrZXIgPSBzaWduYWwoZmFsc2UpO1xuICBcbiAgLy8gSG92ZXIgcmFuZ2UgcHJldmlld1xuICBob3ZlckRhdGUgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIFxuICAvLyBNdWx0aS1yYW5nZSBzdXBwb3J0XG4gIHNlbGVjdGVkUmFuZ2VzID0gc2lnbmFsPERhdGVSYW5nZVtdPihbXSk7XG4gIGN1cnJlbnRSYW5nZUluZGV4ID0gc2lnbmFsPG51bWJlcj4oLTEpO1xuXG4gIC8vIEtleWJvYXJkIG5hdmlnYXRpb25cbiAgZm9jdXNlZERheSA9IHNpZ25hbDx7IGRhdGU6IHN0cmluZzsgbW9udGhJbmRleDogbnVtYmVyIH0gfCBudWxsPihudWxsKTsgLy8gbW9udGhJbmRleDogMCA9IHByZXZpb3VzLCAxID0gY3VycmVudFxuICBcbiAgLy8gQ29tcHV0ZWQgdmFsdWVzXG4gIGN1cnJlbnRNb250aE5hbWUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmdldE1vbnRoTmFtZSh0aGlzLmN1cnJlbnRNb250aCgpKSk7XG4gIHByZXZpb3VzTW9udGhOYW1lID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5nZXRNb250aE5hbWUodGhpcy5wcmV2aW91c01vbnRoKCkpKTtcbiAgd2Vla0RheU5hbWVzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5nZXREYXlOYW1lcygpKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRNb250aE5hbWVzID0gWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ107XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdE1vbnRoTmFtZXNTaG9ydCA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0RGF5TmFtZXMgPSBbJ1N1bmRheScsICdNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5J107XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdERheU5hbWVzU2hvcnQgPSBbJ1MnLCAnTScsICdUJywgJ1cnLCAnVCcsICdGJywgJ1MnXTtcblxuICAvLyBDb250cm9sVmFsdWVBY2Nlc3NvciBjYWxsYmFja3NcbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBEYXRlUmFuZ2UgfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgLy8gRWZmZWN0IHRvIGVtaXQgY2hhbmdlcyB3aGVuIGRhdGVzIGNoYW5nZVxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCByYW5nZSA9IHRoaXMuZGF0ZVJhbmdlVGV4dCgpO1xuICAgICAgaWYgKHRoaXMuc3RhcnREYXRlIHx8IHRoaXMuZW5kRGF0ZSkge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuZ2V0RGF0ZVJhbmdlVmFsdWUoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uQ2xpY2tPdXRzaWRlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2hvd0RhdGVQaWNrZXIoKSAmJiB0aGlzLmNsb3NlT25DbGlja091dHNpZGUpIHtcbiAgICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpO1xuICAgICAgaWYgKCFjbGlja2VkSW5zaWRlKSB7XG4gICAgICAgIHRoaXMuY2xvc2VEYXRlUGlja2VyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUtleWJvYXJkTmF2aWdhdGlvbihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVLZXlib2FyZE5hdmlnYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2hvd0RhdGVQaWNrZXIoKSkge1xuICAgICAgLy8gV2hlbiBwaWNrZXIgaXMgY2xvc2VkLCBhbGxvdyBFbnRlci9TcGFjZSB0byBvcGVuIGl0XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2RhdGVwaWNrZXItaW5wdXQnKSkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy50b2dnbGVEYXRlUGlja2VyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXaGVuIHBpY2tlciBpcyBvcGVuXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY2xvc2VEYXRlUGlja2VyKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5tb3ZlRm9jdXNWZXJ0aWNhbCgtMSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm1vdmVGb2N1c1ZlcnRpY2FsKDEpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5tb3ZlRm9jdXNIb3Jpem9udGFsKC0xKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm1vdmVGb2N1c0hvcml6b250YWwoMSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICBjYXNlICcgJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RGb2N1c2VkRGF5KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdIb21lJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5tb3ZlRm9jdXNUb0ZpcnN0RGF5KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFbmQnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm1vdmVGb2N1c1RvTGFzdERheSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnUGFnZVVwJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgdGhpcy5tb3ZlRm9jdXNZZWFyKC0xKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNoYW5nZU1vbnRoKC0xKTtcbiAgICAgICAgICB0aGlzLmFkanVzdEZvY3VzQWZ0ZXJNb250aENoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdQYWdlRG93bic6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgIHRoaXMubW92ZUZvY3VzWWVhcigxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNoYW5nZU1vbnRoKDEpO1xuICAgICAgICAgIHRoaXMuYWRqdXN0Rm9jdXNBZnRlck1vbnRoQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy8gS2V5Ym9hcmQgbmF2aWdhdGlvbiBtZXRob2RzXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUZvY3VzKCk6IHZvaWQge1xuICAgIC8vIFNldCBpbml0aWFsIGZvY3VzIHRvIHN0YXJ0IGRhdGUsIGVuZCBkYXRlLCBvciBmaXJzdCBhdmFpbGFibGUgZGF5XG4gICAgaWYgKHRoaXMuc3RhcnREYXRlKSB7XG4gICAgICBjb25zdCBpblByZXZNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aCh0aGlzLnN0YXJ0RGF0ZSwgdGhpcy5wcmV2aW91c01vbnRoKCkpO1xuICAgICAgY29uc3QgaW5DdXJyTW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgodGhpcy5zdGFydERhdGUsIHRoaXMuY3VycmVudE1vbnRoKCkpO1xuICAgICAgXG4gICAgICBpZiAoaW5QcmV2TW9udGggfHwgaW5DdXJyTW9udGgpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7IGRhdGU6IHRoaXMuc3RhcnREYXRlLCBtb250aEluZGV4OiBpblByZXZNb250aCA/IDAgOiAxIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc3RhcnREYXRlIGlzIG5vdCB2aXNpYmxlLCBmb2N1cyBvbiB0b2RheSBpZiB2aXNpYmxlXG4gICAgICAgIGNvbnN0IHRvZGF5ID0gdGhpcy5kYXRlQWRhcHRlci5mb3JtYXQodGhpcy5kYXRlQWRhcHRlci50b2RheSgpLCAneXl5eS1NTS1kZCcpO1xuICAgICAgICBjb25zdCBpbkN1cnJNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aCh0b2RheSwgdGhpcy5jdXJyZW50TW9udGgoKSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoaW5DdXJyTW9udGgpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgZGF0ZTogdG9kYXksIG1vbnRoSW5kZXg6IDEgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudE1vbnRoRGF5cyA9IHRoaXMuY3VycmVudE1vbnRoRGF5cygpO1xuICAgICAgICAgIGNvbnN0IGZpcnN0RGF5ID0gY3VycmVudE1vbnRoRGF5cy5maW5kKGRheSA9PiBkYXkuaXNDdXJyZW50TW9udGgpO1xuICAgICAgICAgIGlmIChmaXJzdERheSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7IGRhdGU6IGZpcnN0RGF5LmRhdGUsIG1vbnRoSW5kZXg6IDEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmVuZERhdGUpIHtcbiAgICAgIGNvbnN0IGluUHJldk1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKHRoaXMuZW5kRGF0ZSwgdGhpcy5wcmV2aW91c01vbnRoKCkpO1xuICAgICAgY29uc3QgaW5DdXJyTW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgodGhpcy5lbmREYXRlLCB0aGlzLmN1cnJlbnRNb250aCgpKTtcbiAgICAgIFxuICAgICAgaWYgKGluUHJldk1vbnRoIHx8IGluQ3Vyck1vbnRoKSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQoeyBkYXRlOiB0aGlzLmVuZERhdGUsIG1vbnRoSW5kZXg6IGluUHJldk1vbnRoID8gMCA6IDEgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBlbmREYXRlIGlzIG5vdCB2aXNpYmxlLCBmb2N1cyBvbiB0b2RheSBpZiB2aXNpYmxlXG4gICAgICAgIGNvbnN0IHRvZGF5ID0gdGhpcy5kYXRlQWRhcHRlci5mb3JtYXQodGhpcy5kYXRlQWRhcHRlci50b2RheSgpLCAneXl5eS1NTS1kZCcpO1xuICAgICAgICBjb25zdCBpbkN1cnJNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aCh0b2RheSwgdGhpcy5jdXJyZW50TW9udGgoKSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoaW5DdXJyTW9udGgpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgZGF0ZTogdG9kYXksIG1vbnRoSW5kZXg6IDEgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudE1vbnRoRGF5cyA9IHRoaXMuY3VycmVudE1vbnRoRGF5cygpO1xuICAgICAgICAgIGNvbnN0IGZpcnN0RGF5ID0gY3VycmVudE1vbnRoRGF5cy5maW5kKGRheSA9PiBkYXkuaXNDdXJyZW50TW9udGgpO1xuICAgICAgICAgIGlmIChmaXJzdERheSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7IGRhdGU6IGZpcnN0RGF5LmRhdGUsIG1vbnRoSW5kZXg6IDEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvY3VzIG9uIHRvZGF5IGlmIHZpc2libGUsIG90aGVyd2lzZSBmaXJzdCBkYXkgb2YgY3VycmVudCBtb250aFxuICAgICAgY29uc3QgdG9kYXkgPSB0aGlzLmRhdGVBZGFwdGVyLmZvcm1hdCh0aGlzLmRhdGVBZGFwdGVyLnRvZGF5KCksICd5eXl5LU1NLWRkJyk7XG4gICAgICBjb25zdCBpbkN1cnJNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aCh0b2RheSwgdGhpcy5jdXJyZW50TW9udGgoKSk7XG4gICAgICBcbiAgICAgIGlmIChpbkN1cnJNb250aCkge1xuICAgICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgZGF0ZTogdG9kYXksIG1vbnRoSW5kZXg6IDEgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUb2RheSBpcyBub3QgaW4gY3VycmVudCBtb250aCwgZm9jdXMgb24gZmlyc3QgZGF5IG9mIGN1cnJlbnQgbW9udGhcbiAgICAgICAgY29uc3QgY3VycmVudE1vbnRoRGF5cyA9IHRoaXMuY3VycmVudE1vbnRoRGF5cygpO1xuICAgICAgICBjb25zdCBmaXJzdERheSA9IGN1cnJlbnRNb250aERheXMuZmluZChkYXkgPT4gZGF5LmlzQ3VycmVudE1vbnRoKTtcbiAgICAgICAgaWYgKGZpcnN0RGF5KSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7IGRhdGU6IGZpcnN0RGF5LmRhdGUsIG1vbnRoSW5kZXg6IDEgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzRGF0ZUluTW9udGgoZGF0ZVN0cjogc3RyaW5nLCBtb250aERhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlQWRhcHRlci5wYXJzZShkYXRlU3RyKTtcbiAgICBpZiAoIWRhdGUpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB5ZWFyID0gdGhpcy5kYXRlQWRhcHRlci5nZXRZZWFyKGRhdGUpO1xuICAgIGNvbnN0IG1vbnRoID0gdGhpcy5kYXRlQWRhcHRlci5nZXRNb250aChkYXRlKTtcbiAgICBjb25zdCBtb250aFllYXIgPSB0aGlzLmRhdGVBZGFwdGVyLmdldFllYXIobW9udGhEYXRlKTtcbiAgICBjb25zdCBtb250aE1vbnRoID0gdGhpcy5kYXRlQWRhcHRlci5nZXRNb250aChtb250aERhdGUpO1xuICAgIHJldHVybiB5ZWFyID09PSBtb250aFllYXIgJiYgbW9udGggPT09IG1vbnRoTW9udGg7XG4gIH1cblxuICBwcml2YXRlIG1vdmVGb2N1c0hvcml6b250YWwoZGlyZWN0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmb2N1c2VkID0gdGhpcy5mb2N1c2VkRGF5KCk7XG4gICAgaWYgKCFmb2N1c2VkKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVGb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnREYXRlID0gdGhpcy5kYXRlQWRhcHRlci5wYXJzZShmb2N1c2VkLmRhdGUpO1xuICAgIGlmICghY3VycmVudERhdGUpIHJldHVybjtcblxuICAgIGNvbnN0IG5ld0RhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLmFkZERheXMoY3VycmVudERhdGUsIGRpcmVjdGlvbik7XG4gICAgY29uc3QgbmV3RGF0ZVN0ciA9IHRoaXMuZm9ybWF0RGF0ZShuZXdEYXRlKTtcblxuICAgIC8vIERldGVybWluZSB3aGljaCBtb250aCB0aGUgbmV3IGRhdGUgYmVsb25ncyB0b1xuICAgIGxldCBpblByZXZNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aChuZXdEYXRlU3RyLCB0aGlzLnByZXZpb3VzTW9udGgoKSk7XG4gICAgbGV0IGluQ3Vyck1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKG5ld0RhdGVTdHIsIHRoaXMuY3VycmVudE1vbnRoKCkpO1xuXG4gICAgaWYgKGluUHJldk1vbnRoIHx8IGluQ3Vyck1vbnRoKSB7XG4gICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgXG4gICAgICAgIGRhdGU6IG5ld0RhdGVTdHIsIFxuICAgICAgICBtb250aEluZGV4OiBpblByZXZNb250aCA/IDAgOiAxIFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERhdGUgaXMgb3V0c2lkZSB2aXNpYmxlIG1vbnRocywgbmF2aWdhdGUgbW9udGhcbiAgICAgIGlmIChkaXJlY3Rpb24gPiAwKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlTW9udGgoMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNoYW5nZU1vbnRoKC0xKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUmVjYWxjdWxhdGUgYWZ0ZXIgbW9udGggY2hhbmdlXG4gICAgICBpblByZXZNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aChuZXdEYXRlU3RyLCB0aGlzLnByZXZpb3VzTW9udGgoKSk7XG4gICAgICBpbkN1cnJNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aChuZXdEYXRlU3RyLCB0aGlzLmN1cnJlbnRNb250aCgpKTtcbiAgICAgIFxuICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7IFxuICAgICAgICBkYXRlOiBuZXdEYXRlU3RyLCBcbiAgICAgICAgbW9udGhJbmRleDogaW5QcmV2TW9udGggPyAwIDogKGluQ3Vyck1vbnRoID8gMSA6IDApXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1vdmVGb2N1c1ZlcnRpY2FsKGRpcmVjdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZm9jdXNlZCA9IHRoaXMuZm9jdXNlZERheSgpO1xuICAgIGlmICghZm9jdXNlZCkge1xuICAgICAgdGhpcy5pbml0aWFsaXplRm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50RGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIucGFyc2UoZm9jdXNlZC5kYXRlKTtcbiAgICBpZiAoIWN1cnJlbnREYXRlKSByZXR1cm47XG5cbiAgICBjb25zdCBuZXdEYXRlID0gdGhpcy5kYXRlQWRhcHRlci5hZGREYXlzKGN1cnJlbnREYXRlLCBkaXJlY3Rpb24gKiA3KTsgLy8gTW92ZSBieSB3ZWVrXG4gICAgY29uc3QgbmV3RGF0ZVN0ciA9IHRoaXMuZm9ybWF0RGF0ZShuZXdEYXRlKTtcblxuICAgIGxldCBpblByZXZNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aChuZXdEYXRlU3RyLCB0aGlzLnByZXZpb3VzTW9udGgoKSk7XG4gICAgbGV0IGluQ3Vyck1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKG5ld0RhdGVTdHIsIHRoaXMuY3VycmVudE1vbnRoKCkpO1xuXG4gICAgaWYgKGluUHJldk1vbnRoIHx8IGluQ3Vyck1vbnRoKSB7XG4gICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgXG4gICAgICAgIGRhdGU6IG5ld0RhdGVTdHIsIFxuICAgICAgICBtb250aEluZGV4OiBpblByZXZNb250aCA/IDAgOiAxIFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5hdmlnYXRlIHRvIG1vbnRoIGNvbnRhaW5pbmcgdGhlIG5ldyBkYXRlXG4gICAgICBpZiAoZGlyZWN0aW9uID4gMCkge1xuICAgICAgICB0aGlzLmNoYW5nZU1vbnRoKDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VNb250aCgtMSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFJlY2FsY3VsYXRlIGFmdGVyIG1vbnRoIGNoYW5nZVxuICAgICAgaW5QcmV2TW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgobmV3RGF0ZVN0ciwgdGhpcy5wcmV2aW91c01vbnRoKCkpO1xuICAgICAgaW5DdXJyTW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgobmV3RGF0ZVN0ciwgdGhpcy5jdXJyZW50TW9udGgoKSk7XG4gICAgICBcbiAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQoeyBcbiAgICAgICAgZGF0ZTogbmV3RGF0ZVN0ciwgXG4gICAgICAgIG1vbnRoSW5kZXg6IGluUHJldk1vbnRoID8gMCA6IChpbkN1cnJNb250aCA/IDEgOiAwKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlRm9jdXNUb0ZpcnN0RGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IHByZXZNb250aERheXMgPSB0aGlzLnByZXZpb3VzTW9udGhEYXlzKCk7XG4gICAgY29uc3QgZmlyc3REYXkgPSBwcmV2TW9udGhEYXlzLmZpbmQoZGF5ID0+IGRheS5pc0N1cnJlbnRNb250aCk7XG4gICAgaWYgKGZpcnN0RGF5KSB7XG4gICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgZGF0ZTogZmlyc3REYXkuZGF0ZSwgbW9udGhJbmRleDogMCB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1vdmVGb2N1c1RvTGFzdERheSgpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyTW9udGhEYXlzID0gdGhpcy5jdXJyZW50TW9udGhEYXlzKCk7XG4gICAgY29uc3QgdmFsaWREYXlzID0gY3Vyck1vbnRoRGF5cy5maWx0ZXIoZGF5ID0+IGRheS5pc0N1cnJlbnRNb250aCk7XG4gICAgY29uc3QgbGFzdERheSA9IHZhbGlkRGF5c1t2YWxpZERheXMubGVuZ3RoIC0gMV07XG4gICAgaWYgKGxhc3REYXkpIHtcbiAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQoeyBkYXRlOiBsYXN0RGF5LmRhdGUsIG1vbnRoSW5kZXg6IDEgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlRm9jdXNZZWFyKGRpcmVjdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZm9jdXNlZCA9IHRoaXMuZm9jdXNlZERheSgpO1xuICAgIGlmICghZm9jdXNlZCkge1xuICAgICAgdGhpcy5pbml0aWFsaXplRm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50RGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIucGFyc2UoZm9jdXNlZC5kYXRlKTtcbiAgICBpZiAoIWN1cnJlbnREYXRlKSByZXR1cm47XG5cbiAgICBjb25zdCBjdXJyZW50WWVhciA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhcihjdXJyZW50RGF0ZSk7XG4gICAgY29uc3QgY3VycmVudE1vbnRoID0gdGhpcy5kYXRlQWRhcHRlci5nZXRNb250aChjdXJyZW50RGF0ZSk7XG4gICAgY29uc3QgY3VycmVudERheSA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0RGF0ZShjdXJyZW50RGF0ZSk7XG4gICAgXG4gICAgY29uc3QgbmV3RGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShjdXJyZW50WWVhciArIGRpcmVjdGlvbiwgY3VycmVudE1vbnRoLCBjdXJyZW50RGF5KTtcbiAgICBjb25zdCBuZXdEYXRlU3RyID0gdGhpcy5mb3JtYXREYXRlKG5ld0RhdGUpO1xuXG4gICAgLy8gVXBkYXRlIG1vbnRocyB0byBzaG93IHRoZSBuZXcgeWVhclxuICAgIHRoaXMuY3VycmVudE1vbnRoLnNldCh0aGlzLmRhdGVBZGFwdGVyLmNyZWF0ZURhdGUoY3VycmVudFllYXIgKyBkaXJlY3Rpb24sIGN1cnJlbnRNb250aCwgMSkpO1xuICAgIHRoaXMucHJldmlvdXNNb250aC5zZXQodGhpcy5kYXRlQWRhcHRlci5jcmVhdGVEYXRlKGN1cnJlbnRZZWFyICsgZGlyZWN0aW9uLCBjdXJyZW50TW9udGggLSAxLCAxKSk7XG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFycygpO1xuXG4gICAgY29uc3QgaW5QcmV2TW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgobmV3RGF0ZVN0ciwgdGhpcy5wcmV2aW91c01vbnRoKCkpO1xuICAgIHRoaXMuZm9jdXNlZERheS5zZXQoeyBcbiAgICAgIGRhdGU6IG5ld0RhdGVTdHIsIFxuICAgICAgbW9udGhJbmRleDogaW5QcmV2TW9udGggPyAwIDogMSBcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRqdXN0Rm9jdXNBZnRlck1vbnRoQ2hhbmdlKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvY3VzZWQgPSB0aGlzLmZvY3VzZWREYXkoKTtcbiAgICBpZiAoIWZvY3VzZWQpIHJldHVybjtcblxuICAgIGNvbnN0IGluUHJldk1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKGZvY3VzZWQuZGF0ZSwgdGhpcy5wcmV2aW91c01vbnRoKCkpO1xuICAgIGNvbnN0IGluQ3Vyck1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKGZvY3VzZWQuZGF0ZSwgdGhpcy5jdXJyZW50TW9udGgoKSk7XG5cbiAgICBpZiAoIWluUHJldk1vbnRoICYmICFpbkN1cnJNb250aCkge1xuICAgICAgLy8gRm9jdXNlZCBkYXkgaXMgbm8gbG9uZ2VyIHZpc2libGUsIG1vdmUgdG8gZXF1aXZhbGVudCBkYXkgaW4gdmlzaWJsZSBtb250aHNcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZSBtb250aCBpbmRleCBpZiBuZWVkZWRcbiAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQoe1xuICAgICAgICBkYXRlOiBmb2N1c2VkLmRhdGUsXG4gICAgICAgIG1vbnRoSW5kZXg6IGluUHJldk1vbnRoID8gMCA6IDFcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0Rm9jdXNlZERheSgpOiB2b2lkIHtcbiAgICBjb25zdCBmb2N1c2VkID0gdGhpcy5mb2N1c2VkRGF5KCk7XG4gICAgaWYgKCFmb2N1c2VkKSByZXR1cm47XG5cbiAgICBjb25zdCBtb250aERheXMgPSBmb2N1c2VkLm1vbnRoSW5kZXggPT09IDAgPyB0aGlzLnByZXZpb3VzTW9udGhEYXlzKCkgOiB0aGlzLmN1cnJlbnRNb250aERheXMoKTtcbiAgICBjb25zdCBkYXlPYmogPSBtb250aERheXMuZmluZChkYXkgPT4gZGF5LmRhdGUgPT09IGZvY3VzZWQuZGF0ZSAmJiBkYXkuaXNDdXJyZW50TW9udGgpO1xuICAgIFxuICAgIGlmIChkYXlPYmopIHtcbiAgICAgIHRoaXMuc2VsZWN0RGF5KGRheU9iaik7XG4gICAgfVxuICB9XG5cbiAgaGFzS2V5Ym9hcmRGb2N1cyhkYXRlOiBzdHJpbmcsIG1vbnRoSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZvY3VzZWQgPSB0aGlzLmZvY3VzZWREYXkoKTtcbiAgICByZXR1cm4gZm9jdXNlZCAhPT0gbnVsbCAmJiBmb2N1c2VkLmRhdGUgPT09IGRhdGUgJiYgZm9jdXNlZC5tb250aEluZGV4ID09PSBtb250aEluZGV4O1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gSW5pdGlhbGl6ZSB0aW1lIHBpY2tlciB3aXRoIGRlZmF1bHQgdGltZXNcbiAgICBpZiAodGhpcy5lbmFibGVUaW1lUGlja2VyKSB7XG4gICAgICBjb25zdCBzdGFydFRpbWUgPSB0aGlzLnBhcnNlVGltZSh0aGlzLmRlZmF1bHRTdGFydFRpbWUpO1xuICAgICAgdGhpcy5zdGFydEhvdXIgPSBzdGFydFRpbWUuaG91cjtcbiAgICAgIHRoaXMuc3RhcnRNaW51dGUgPSBzdGFydFRpbWUubWludXRlO1xuICAgICAgXG4gICAgICBjb25zdCBlbmRUaW1lID0gdGhpcy5wYXJzZVRpbWUodGhpcy5kZWZhdWx0RW5kVGltZSk7XG4gICAgICB0aGlzLmVuZEhvdXIgPSBlbmRUaW1lLmhvdXI7XG4gICAgICB0aGlzLmVuZE1pbnV0ZSA9IGVuZFRpbWUubWludXRlO1xuICAgIH1cbiAgICBcbiAgICBpZiAodGhpcy5zdGFydERhdGUgJiYgdGhpcy5lbmREYXRlKSB7XG4gICAgICB0aGlzLnVwZGF0ZURhdGVSYW5nZVRleHQoKTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3N0YXJ0RGF0ZSddIHx8IGNoYW5nZXNbJ2VuZERhdGUnXSkge1xuICAgICAgaWYgKHRoaXMuc3RhcnREYXRlICYmIHRoaXMuZW5kRGF0ZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZURhdGVSYW5nZVRleHQoKTtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFycygpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5zdGFydERhdGUgJiYgIXRoaXMuZW5kRGF0ZSkge1xuICAgICAgICB0aGlzLmRhdGVSYW5nZVRleHQuc2V0KCcnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3JtYXREYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IHllYXIgPSB0aGlzLmRhdGVBZGFwdGVyLmdldFllYXIoZGF0ZSk7XG4gICAgY29uc3QgbW9udGggPSBTdHJpbmcodGhpcy5kYXRlQWRhcHRlci5nZXRNb250aChkYXRlKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgZGF5ID0gU3RyaW5nKHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0RGF0ZShkYXRlKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YDtcbiAgfVxuXG4gIGZvcm1hdERhdGVEaXNwbGF5KGRhdGVTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFkYXRlU3RyKSByZXR1cm4gJyc7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIucGFyc2UoZGF0ZVN0cik7XG4gICAgaWYgKCFkYXRlKSByZXR1cm4gJyc7XG4gICAgXG4gICAgY29uc3QgeWVhciA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKTtcbiAgICBjb25zdCBtb250aCA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZGF0ZSk7XG4gICAgY29uc3QgZGF5ID0gdGhpcy5kYXRlQWRhcHRlci5nZXREYXRlKGRhdGUpO1xuICAgIFxuICAgIGNvbnN0IG1vbnRoTmFtZXMgPSB0aGlzLmxvY2FsZS5tb250aE5hbWVzIHx8IHRoaXMuZGVmYXVsdE1vbnRoTmFtZXM7XG4gICAgY29uc3QgbW9udGhOYW1lc1Nob3J0ID0gdGhpcy5sb2NhbGUubW9udGhOYW1lc1Nob3J0IHx8IHRoaXMuZGVmYXVsdE1vbnRoTmFtZXNTaG9ydDtcbiAgICBcbiAgICAvLyBSZXBsYWNlIGZvcm1hdCB0b2tlbnMgd2l0aCB2YWx1ZXNcbiAgICBsZXQgZm9ybWF0dGVkID0gdGhpcy5kaXNwbGF5Rm9ybWF0O1xuICAgIFxuICAgIC8vIFllYXIgdG9rZW5zXG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL1lZWVkvZywgU3RyaW5nKHllYXIpKTtcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvWVkvZywgU3RyaW5nKHllYXIpLnNsaWNlKC0yKSk7XG4gICAgXG4gICAgLy8gTW9udGggdG9rZW5zIChvcmRlciBtYXR0ZXJzOiBNTU1NIGJlZm9yZSBNTU0gYmVmb3JlIE1NIGJlZm9yZSBNKVxuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9NTU1NL2csIG1vbnRoTmFtZXNbbW9udGhdKTtcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvTU1NL2csIG1vbnRoTmFtZXNTaG9ydFttb250aF0pO1xuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9NTS9nLCBTdHJpbmcobW9udGggKyAxKS5wYWRTdGFydCgyLCAnMCcpKTtcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvTS9nLCBTdHJpbmcobW9udGggKyAxKSk7XG4gICAgXG4gICAgLy8gRGF5IHRva2VucyAob3JkZXIgbWF0dGVyczogREQgYmVmb3JlIEQpXG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL0REL2csIFN0cmluZyhkYXkpLnBhZFN0YXJ0KDIsICcwJykpO1xuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9EL2csIFN0cmluZyhkYXkpKTtcbiAgICBcbiAgICByZXR1cm4gZm9ybWF0dGVkO1xuICB9XG5cbiAgdXBkYXRlRGF0ZVJhbmdlVGV4dCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGFydERhdGUgJiYgdGhpcy5lbmREYXRlKSB7XG4gICAgICBjb25zdCBzdGFydCA9IHRoaXMuZm9ybWF0RGF0ZURpc3BsYXkodGhpcy5zdGFydERhdGUpO1xuICAgICAgY29uc3QgZW5kID0gdGhpcy5mb3JtYXREYXRlRGlzcGxheSh0aGlzLmVuZERhdGUpO1xuICAgICAgdGhpcy5kYXRlUmFuZ2VUZXh0LnNldChgJHtzdGFydH0gLSAke2VuZH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRlUmFuZ2VUZXh0LnNldCgnJyk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlRGF0ZVBpY2tlcigpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dEYXRlUGlja2VyLnVwZGF0ZSh2YWx1ZSA9PiAhdmFsdWUpO1xuICAgIGlmICh0aGlzLnNob3dEYXRlUGlja2VyKCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW5nU3RhcnREYXRlLnNldCh0cnVlKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRNb250aFZhbHVlID0gdGhpcy5jdXJyZW50TW9udGgoKTtcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmRhdGVBZGFwdGVyLmdldFllYXIoY3VycmVudE1vbnRoVmFsdWUpO1xuICAgICAgY29uc3QgbW9udGggPSB0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoKGN1cnJlbnRNb250aFZhbHVlKTtcbiAgICAgIGNvbnN0IHByZXZpb3VzTW9udGhEYXRlID0gdGhpcy5kYXRlQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoIC0gMSwgMSk7XG4gICAgICB0aGlzLnByZXZpb3VzTW9udGguc2V0KHByZXZpb3VzTW9udGhEYXRlKTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcbiAgICAgIC8vIEluaXRpYWxpemUga2V5Ym9hcmQgZm9jdXMgb25seSBpZiBrZXlib2FyZCBuYXZpZ2F0aW9uIGlzIGVuYWJsZWRcbiAgICAgIGlmICh0aGlzLmVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbikge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVGb2N1cygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDbGVhciBmb2N1cyB3aGVuIGNsb3NpbmdcbiAgICAgIGlmICh0aGlzLmVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbikge1xuICAgICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgY2xvc2VEYXRlUGlja2VyKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0RhdGVQaWNrZXIuc2V0KGZhbHNlKTtcbiAgICBpZiAodGhpcy5lbmFibGVLZXlib2FyZE5hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQobnVsbCk7XG4gICAgfVxuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICBnZW5lcmF0ZUNhbGVuZGFycygpOiB2b2lkIHtcbiAgICB0aGlzLnByZXZpb3VzTW9udGhEYXlzLnNldCh0aGlzLmdlbmVyYXRlTW9udGhDYWxlbmRhcih0aGlzLnByZXZpb3VzTW9udGgoKSkpO1xuICAgIHRoaXMuY3VycmVudE1vbnRoRGF5cy5zZXQodGhpcy5nZW5lcmF0ZU1vbnRoQ2FsZW5kYXIodGhpcy5jdXJyZW50TW9udGgoKSkpO1xuICB9XG5cbiAgZ2VuZXJhdGVNb250aENhbGVuZGFyKGRhdGU6IERhdGUpOiBhbnlbXSB7XG4gICAgY29uc3QgeWVhciA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKTtcbiAgICBjb25zdCBtb250aCA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZGF0ZSk7XG4gICAgY29uc3QgZmlyc3REYXkgPSB0aGlzLmRhdGVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIDEpO1xuICAgIGNvbnN0IGxhc3REYXkgPSB0aGlzLmRhdGVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGggKyAxLCAwKTtcbiAgICBjb25zdCBkYXlzSW5Nb250aCA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0RGF0ZShsYXN0RGF5KTtcbiAgICBjb25zdCBmaXJzdERheU9mV2VlayA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0RGF5KGZpcnN0RGF5KTtcblxuICAgIGNvbnN0IG1vbnRoRGF5cyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXJzdERheU9mV2VlazsgaSsrKSB7XG4gICAgICBtb250aERheXMucHVzaCh7IGRheTogbnVsbCwgaXNDdXJyZW50TW9udGg6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIGZvciAobGV0IGRheSA9IDE7IGRheSA8PSBkYXlzSW5Nb250aDsgZGF5KyspIHtcbiAgICAgIGNvbnN0IGRheURhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIGRheSk7XG4gICAgICBjb25zdCBkYXRlU3RyID0gdGhpcy5mb3JtYXREYXRlKGRheURhdGUpO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBpZiBkYXRlIGlzIGluIHBlbmRpbmcgcmFuZ2UgKGZvciByZXF1aXJlQXBwbHkgbW9kZSlcbiAgICAgIGNvbnN0IGlzUGVuZGluZ1N0YXJ0ID0gdGhpcy5yZXF1aXJlQXBwbHkgJiYgdGhpcy5wZW5kaW5nU3RhcnREYXRlID09PSBkYXRlU3RyO1xuICAgICAgY29uc3QgaXNQZW5kaW5nRW5kID0gdGhpcy5yZXF1aXJlQXBwbHkgJiYgdGhpcy5wZW5kaW5nRW5kRGF0ZSA9PT0gZGF0ZVN0cjtcbiAgICAgIGNvbnN0IGluUGVuZGluZ1JhbmdlID0gdGhpcy5yZXF1aXJlQXBwbHkgJiYgdGhpcy5wZW5kaW5nU3RhcnREYXRlICYmIHRoaXMucGVuZGluZ0VuZERhdGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZVN0ciA+PSB0aGlzLnBlbmRpbmdTdGFydERhdGUgJiYgZGF0ZVN0ciA8PSB0aGlzLnBlbmRpbmdFbmREYXRlO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBpZiBkYXRlIGlzIGluIGhvdmVyIHByZXZpZXcgcmFuZ2VcbiAgICAgIGNvbnN0IGluSG92ZXJSYW5nZSA9IHRoaXMuaXNJbkhvdmVyUmFuZ2UoZGF0ZVN0cik7XG4gICAgICBcbiAgICAgIG1vbnRoRGF5cy5wdXNoKHtcbiAgICAgICAgZGF5OiBkYXksXG4gICAgICAgIGRhdGU6IGRhdGVTdHIsXG4gICAgICAgIGlzQ3VycmVudE1vbnRoOiB0cnVlLFxuICAgICAgICBpc1N0YXJ0OiB0aGlzLnN0YXJ0RGF0ZSA9PT0gZGF0ZVN0ciB8fCBpc1BlbmRpbmdTdGFydCxcbiAgICAgICAgaXNFbmQ6IHRoaXMuZW5kRGF0ZSA9PT0gZGF0ZVN0ciB8fCBpc1BlbmRpbmdFbmQsXG4gICAgICAgIGluUmFuZ2U6IHRoaXMuaXNJblJhbmdlKGRhdGVTdHIpIHx8IGluUGVuZGluZ1JhbmdlLFxuICAgICAgICBpbkhvdmVyUmFuZ2U6IGluSG92ZXJSYW5nZSxcbiAgICAgICAgaXNEaXNhYmxlZDogdGhpcy5pc0RhdGVEaXNhYmxlZChkYXlEYXRlKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vbnRoRGF5cztcbiAgfVxuXG4gIGlzSW5SYW5nZShkYXRlU3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5tdWx0aVJhbmdlKSB7XG4gICAgICAvLyBDaGVjayBpZiBkYXRlIGlzIGluIGFueSBvZiB0aGUgc2VsZWN0ZWQgcmFuZ2VzXG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJhbmdlcygpLnNvbWUocmFuZ2UgPT4ge1xuICAgICAgICByZXR1cm4gZGF0ZVN0ciA+PSByYW5nZS5zdGFydERhdGUgJiYgZGF0ZVN0ciA8PSByYW5nZS5lbmREYXRlO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghdGhpcy5zdGFydERhdGUgfHwgIXRoaXMuZW5kRGF0ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGRhdGVTdHIgPj0gdGhpcy5zdGFydERhdGUgJiYgZGF0ZVN0ciA8PSB0aGlzLmVuZERhdGU7XG4gICAgfVxuICB9XG5cbiAgaXNEYXRlRGlzYWJsZWQoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZERhdGVzKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodHlwZW9mIHRoaXMuZGlzYWJsZWREYXRlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gSWYgaXQncyBhIGZ1bmN0aW9uLCBjYWxsIGl0IHdpdGggdGhlIGRhdGVcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkRGF0ZXMoZGF0ZSk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZGlzYWJsZWREYXRlcykpIHtcbiAgICAgIC8vIElmIGl0J3MgYW4gYXJyYXksIGNoZWNrIGlmIHRoZSBkYXRlIG1hdGNoZXMgYW55IGRpc2FibGVkIGRhdGVcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkRGF0ZXMuc29tZShkaXNhYmxlZERhdGUgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlQWRhcHRlci5nZXRZZWFyKGRhdGUpID09PSB0aGlzLmRhdGVBZGFwdGVyLmdldFllYXIoZGlzYWJsZWREYXRlKSAmJlxuICAgICAgICAgICAgICAgdGhpcy5kYXRlQWRhcHRlci5nZXRNb250aChkYXRlKSA9PT0gdGhpcy5kYXRlQWRhcHRlci5nZXRNb250aChkaXNhYmxlZERhdGUpICYmXG4gICAgICAgICAgICAgICB0aGlzLmRhdGVBZGFwdGVyLmdldERhdGUoZGF0ZSkgPT09IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0RGF0ZShkaXNhYmxlZERhdGUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlzSW5Ib3ZlclJhbmdlKGRhdGVTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhvdmVyID0gdGhpcy5ob3ZlckRhdGUoKTtcbiAgICBpZiAoIWhvdmVyKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBJbiBtdWx0aVJhbmdlIG1vZGUsIG9ubHkgc2hvdyBob3ZlciBwcmV2aWV3IHdoZW4gc2VsZWN0aW5nIGVuZCBkYXRlXG4gICAgaWYgKHRoaXMubXVsdGlSYW5nZSkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0aW5nU3RhcnREYXRlKCkpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghdGhpcy5zdGFydERhdGUpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IG1pbkRhdGUgPSB0aGlzLnN0YXJ0RGF0ZSA8IGhvdmVyID8gdGhpcy5zdGFydERhdGUgOiBob3ZlcjtcbiAgICAgIGNvbnN0IG1heERhdGUgPSB0aGlzLnN0YXJ0RGF0ZSA+IGhvdmVyID8gdGhpcy5zdGFydERhdGUgOiBob3ZlcjtcbiAgICAgIHJldHVybiBkYXRlU3RyID49IG1pbkRhdGUgJiYgZGF0ZVN0ciA8PSBtYXhEYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbiBzaW5nbGUgcmFuZ2UgbW9kZSB3aXRoIHJlcXVpcmVBcHBseVxuICAgICAgaWYgKHRoaXMucmVxdWlyZUFwcGx5KSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGluZ1N0YXJ0RGF0ZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghdGhpcy5wZW5kaW5nU3RhcnREYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IG1pbkRhdGUgPSB0aGlzLnBlbmRpbmdTdGFydERhdGUgPCBob3ZlciA/IHRoaXMucGVuZGluZ1N0YXJ0RGF0ZSA6IGhvdmVyO1xuICAgICAgICBjb25zdCBtYXhEYXRlID0gdGhpcy5wZW5kaW5nU3RhcnREYXRlID4gaG92ZXIgPyB0aGlzLnBlbmRpbmdTdGFydERhdGUgOiBob3ZlcjtcbiAgICAgICAgcmV0dXJuIGRhdGVTdHIgPj0gbWluRGF0ZSAmJiBkYXRlU3RyIDw9IG1heERhdGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJbiBzaW5nbGUgcmFuZ2UgbW9kZSB3aXRob3V0IHJlcXVpcmVBcHBseVxuICAgICAgICBpZiAodGhpcy5zZWxlY3RpbmdTdGFydERhdGUoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIXRoaXMuc3RhcnREYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IG1pbkRhdGUgPSB0aGlzLnN0YXJ0RGF0ZSA8IGhvdmVyID8gdGhpcy5zdGFydERhdGUgOiBob3ZlcjtcbiAgICAgICAgY29uc3QgbWF4RGF0ZSA9IHRoaXMuc3RhcnREYXRlID4gaG92ZXIgPyB0aGlzLnN0YXJ0RGF0ZSA6IGhvdmVyO1xuICAgICAgICByZXR1cm4gZGF0ZVN0ciA+PSBtaW5EYXRlICYmIGRhdGVTdHIgPD0gbWF4RGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkRheUhvdmVyKGRheU9iajogYW55KTogdm9pZCB7XG4gICAgaWYgKCFkYXlPYmouaXNDdXJyZW50TW9udGggfHwgdGhpcy5pc0Rpc2FibGVkKCkgfHwgZGF5T2JqLmlzRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuaG92ZXJEYXRlLnNldChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ob3ZlckRhdGUuc2V0KGRheU9iai5kYXRlKTtcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG4gIH1cblxuICBjbGVhckRheUhvdmVyKCk6IHZvaWQge1xuICAgIHRoaXMuaG92ZXJEYXRlLnNldChudWxsKTtcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG4gIH1cblxuICBzZWxlY3REYXkoZGF5T2JqOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWRheU9iai5pc0N1cnJlbnRNb250aCB8fCB0aGlzLmlzRGlzYWJsZWQoKSB8fCBkYXlPYmouaXNEaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMubXVsdGlSYW5nZSkge1xuICAgICAgLy8gTXVsdGktcmFuZ2UgbW9kZTogYWRkIHJhbmdlcyB0byBhcnJheVxuICAgICAgaWYgKHRoaXMuc2VsZWN0aW5nU3RhcnREYXRlKCkpIHtcbiAgICAgICAgdGhpcy5zdGFydERhdGUgPSBkYXlPYmouZGF0ZTtcbiAgICAgICAgdGhpcy5lbmREYXRlID0gJyc7XG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlVGV4dC5zZXQoJycpO1xuICAgICAgICB0aGlzLnNlbGVjdGluZ1N0YXJ0RGF0ZS5zZXQoZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGRheU9iai5kYXRlIDwgdGhpcy5zdGFydERhdGUpIHtcbiAgICAgICAgICB0aGlzLmVuZERhdGUgPSB0aGlzLnN0YXJ0RGF0ZTtcbiAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IGRheU9iai5kYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZW5kRGF0ZSA9IGRheU9iai5kYXRlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBBZGQgdGhlIG5ldyByYW5nZSB0byB0aGUgYXJyYXlcbiAgICAgICAgY29uc3QgbmV3UmFuZ2U6IERhdGVSYW5nZSA9IHtcbiAgICAgICAgICBzdGFydERhdGU6IHRoaXMuc3RhcnREYXRlLFxuICAgICAgICAgIGVuZERhdGU6IHRoaXMuZW5kRGF0ZSxcbiAgICAgICAgICByYW5nZVRleHQ6IHRoaXMuZm9ybWF0RGF0ZURpc3BsYXkodGhpcy5zdGFydERhdGUpICsgJyDigJMgJyArIHRoaXMuZm9ybWF0RGF0ZURpc3BsYXkodGhpcy5lbmREYXRlKVxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgY29uc3QgY3VycmVudFJhbmdlcyA9IFsuLi50aGlzLnNlbGVjdGVkUmFuZ2VzKCldO1xuICAgICAgICBjdXJyZW50UmFuZ2VzLnB1c2gobmV3UmFuZ2UpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUmFuZ2VzLnNldChjdXJyZW50UmFuZ2VzKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFJlc2V0IGZvciBuZXh0IHJhbmdlIHNlbGVjdGlvblxuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9ICcnO1xuICAgICAgICB0aGlzLmVuZERhdGUgPSAnJztcbiAgICAgICAgdGhpcy5zZWxlY3RpbmdTdGFydERhdGUuc2V0KHRydWUpO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGRpc3BsYXkgdGV4dFxuICAgICAgICB0aGlzLnVwZGF0ZU11bHRpUmFuZ2VUZXh0KCk7XG4gICAgICAgIFxuICAgICAgICAvLyBEb24ndCBjbG9zZSBpZiBtdWx0aVJhbmdlLCBhbGxvdyBhZGRpbmcgbW9yZSByYW5nZXNcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VPblNlbGVjdGlvbiAmJiAhdGhpcy5tdWx0aVJhbmdlKSB7XG4gICAgICAgICAgdGhpcy5zaG93RGF0ZVBpY2tlci5zZXQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLmVtaXRNdWx0aUNoYW5nZSgpO1xuICAgICAgICB0aGlzLmVtaXRNdWx0aVNlbGVjdGlvbigpO1xuICAgICAgfVxuICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFycygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTaW5nbGUgcmFuZ2UgbW9kZSAob3JpZ2luYWwgYmVoYXZpb3IpXG4gICAgICBpZiAodGhpcy5yZXF1aXJlQXBwbHkpIHtcbiAgICAgICAgLy8gQXBwbHkgbW9kZTogdXNlIHBlbmRpbmcgZGF0ZXMsIGRvbid0IGVtaXQgdW50aWwgQXBwbHkgaXMgY2xpY2tlZFxuICAgICAgICBpZiAodGhpcy5zZWxlY3RpbmdTdGFydERhdGUoKSkge1xuICAgICAgICAgIHRoaXMucGVuZGluZ1N0YXJ0RGF0ZSA9IGRheU9iai5kYXRlO1xuICAgICAgICAgIHRoaXMucGVuZGluZ0VuZERhdGUgPSAnJztcbiAgICAgICAgICB0aGlzLnNlbGVjdGluZ1N0YXJ0RGF0ZS5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuaGFzUGVuZGluZ0NoYW5nZXMuc2V0KHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChkYXlPYmouZGF0ZSA8IHRoaXMucGVuZGluZ1N0YXJ0RGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nRW5kRGF0ZSA9IHRoaXMucGVuZGluZ1N0YXJ0RGF0ZTtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1N0YXJ0RGF0ZSA9IGRheU9iai5kYXRlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdFbmREYXRlID0gZGF5T2JqLmRhdGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2VsZWN0aW5nU3RhcnREYXRlLnNldCh0cnVlKTtcbiAgICAgICAgICB0aGlzLmhhc1BlbmRpbmdDaGFuZ2VzLnNldCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJbW1lZGlhdGUgbW9kZTogZW1pdCBjaGFuZ2VzIGltbWVkaWF0ZWx5XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGluZ1N0YXJ0RGF0ZSgpKSB7XG4gICAgICAgICAgdGhpcy5zdGFydERhdGUgPSBkYXlPYmouZGF0ZTtcbiAgICAgICAgICB0aGlzLmVuZERhdGUgPSAnJztcbiAgICAgICAgICB0aGlzLmRhdGVSYW5nZVRleHQuc2V0KCcnKTtcbiAgICAgICAgICB0aGlzLnNlbGVjdGluZ1N0YXJ0RGF0ZS5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChkYXlPYmouZGF0ZSA8IHRoaXMuc3RhcnREYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmVuZERhdGUgPSB0aGlzLnN0YXJ0RGF0ZTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlID0gZGF5T2JqLmRhdGU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW5kRGF0ZSA9IGRheU9iai5kYXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnVwZGF0ZURhdGVSYW5nZVRleHQoKTtcbiAgICAgICAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dEYXRlUGlja2VyLnNldChmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2VsZWN0aW5nU3RhcnREYXRlLnNldCh0cnVlKTtcbiAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICAgICAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXBwbHlTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHJldHVybjtcbiAgICBcbiAgICAvLyBBcHBseSBwZW5kaW5nIGRhdGVzXG4gICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLnBlbmRpbmdTdGFydERhdGU7XG4gICAgdGhpcy5lbmREYXRlID0gdGhpcy5wZW5kaW5nRW5kRGF0ZTtcbiAgICB0aGlzLnVwZGF0ZURhdGVSYW5nZVRleHQoKTtcbiAgICBcbiAgICAvLyBDbGVhciBwZW5kaW5nIHN0YXRlXG4gICAgdGhpcy5wZW5kaW5nU3RhcnREYXRlID0gJyc7XG4gICAgdGhpcy5wZW5kaW5nRW5kRGF0ZSA9ICcnO1xuICAgIHRoaXMuaGFzUGVuZGluZ0NoYW5nZXMuc2V0KGZhbHNlKTtcbiAgICBcbiAgICAvLyBFbWl0IGNoYW5nZXNcbiAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgICBcbiAgICAvLyBDbG9zZSBwaWNrZXJcbiAgICB0aGlzLnNob3dEYXRlUGlja2VyLnNldChmYWxzZSk7XG4gICAgdGhpcy5zZWxlY3RpbmdTdGFydERhdGUuc2V0KHRydWUpO1xuICB9XG5cbiAgY2FuY2VsU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIC8vIERpc2NhcmQgcGVuZGluZyBjaGFuZ2VzXG4gICAgdGhpcy5wZW5kaW5nU3RhcnREYXRlID0gJyc7XG4gICAgdGhpcy5wZW5kaW5nRW5kRGF0ZSA9ICcnO1xuICAgIHRoaXMuaGFzUGVuZGluZ0NoYW5nZXMuc2V0KGZhbHNlKTtcbiAgICB0aGlzLnNlbGVjdGluZ1N0YXJ0RGF0ZS5zZXQodHJ1ZSk7XG4gICAgXG4gICAgLy8gUmVnZW5lcmF0ZSBjYWxlbmRhcnMgdG8gY2xlYXIgcGVuZGluZyB2aXN1YWwgc3RhdGVcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG4gIH1cblxuICBjaGFuZ2VNb250aChkaXJlY3Rpb246IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRNb250aFZhbHVlID0gdGhpcy5jdXJyZW50TW9udGgoKTtcbiAgICBjb25zdCB5ZWFyID0gdGhpcy5kYXRlQWRhcHRlci5nZXRZZWFyKGN1cnJlbnRNb250aFZhbHVlKTtcbiAgICBjb25zdCBtb250aCA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoY3VycmVudE1vbnRoVmFsdWUpO1xuICAgIGNvbnN0IG5ld0N1cnJlbnRNb250aCA9IHRoaXMuZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCArIGRpcmVjdGlvbiwgMSk7XG4gICAgdGhpcy5jdXJyZW50TW9udGguc2V0KG5ld0N1cnJlbnRNb250aCk7XG4gICAgXG4gICAgY29uc3QgbmV3WWVhciA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhcihuZXdDdXJyZW50TW9udGgpO1xuICAgIGNvbnN0IG5ld01vbnRoID0gdGhpcy5kYXRlQWRhcHRlci5nZXRNb250aChuZXdDdXJyZW50TW9udGgpO1xuICAgIGNvbnN0IG5ld1ByZXZpb3VzTW9udGggPSB0aGlzLmRhdGVBZGFwdGVyLmNyZWF0ZURhdGUobmV3WWVhciwgbmV3TW9udGggLSAxLCAxKTtcbiAgICB0aGlzLnByZXZpb3VzTW9udGguc2V0KG5ld1ByZXZpb3VzTW9udGgpO1xuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcbiAgfVxuXG4gIGdldE1vbnRoTmFtZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICBjb25zdCBtb250aE5hbWVzID0gdGhpcy5sb2NhbGUubW9udGhOYW1lcyB8fCB0aGlzLmRlZmF1bHRNb250aE5hbWVzO1xuICAgIHJldHVybiBgJHttb250aE5hbWVzW3RoaXMuZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZGF0ZSldfSAke3RoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKX1gO1xuICB9XG5cbiAgZ2V0RGF5TmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmxvY2FsZS5kYXlOYW1lc1Nob3J0IHx8IHRoaXMuZGVmYXVsdERheU5hbWVzU2hvcnQ7XG4gIH1cblxuICBzZWxlY3RQcmVzZXRSYW5nZShwcmVzZXQ6IFByZXNldENvbmZpZyk6IHZvaWQge1xuICAgIGlmICghcHJlc2V0LmdldFZhbHVlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdQcmVzZXRDb25maWcgbXVzdCBoYXZlIGdldFZhbHVlKCkgZnVuY3Rpb24nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByYW5nZSA9IHByZXNldC5nZXRWYWx1ZSgpO1xuICAgIHRoaXMuc3RhcnREYXRlID0gcmFuZ2Uuc3RhcnQ7XG4gICAgdGhpcy5lbmREYXRlID0gcmFuZ2UuZW5kO1xuICAgIHRoaXMudXBkYXRlRGF0ZVJhbmdlVGV4dCgpO1xuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcbiAgICBpZiAodGhpcy5jbG9zZU9uUHJlc2V0U2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLnNob3dEYXRlUGlja2VyLnNldChmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5zdGFydERhdGUgPSAnJztcbiAgICB0aGlzLmVuZERhdGUgPSAnJztcbiAgICB0aGlzLmRhdGVSYW5nZVRleHQuc2V0KCcnKTtcbiAgICB0aGlzLnNob3dEYXRlUGlja2VyLnNldChmYWxzZSk7XG4gICAgdGhpcy5zZWxlY3RpbmdTdGFydERhdGUuc2V0KHRydWUpO1xuICAgIFxuICAgIGlmICh0aGlzLm11bHRpUmFuZ2UpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSYW5nZXMuc2V0KFtdKTtcbiAgICAgIHRoaXMuY3VycmVudFJhbmdlSW5kZXguc2V0KC0xKTtcbiAgICAgIHRoaXMuZW1pdE11bHRpQ2hhbmdlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcbiAgfVxuICBcbiAgcmVtb3ZlUmFuZ2UoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5tdWx0aVJhbmdlKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgY3VycmVudFJhbmdlcyA9IFsuLi50aGlzLnNlbGVjdGVkUmFuZ2VzKCldO1xuICAgIGN1cnJlbnRSYW5nZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLnNlbGVjdGVkUmFuZ2VzLnNldChjdXJyZW50UmFuZ2VzKTtcbiAgICBcbiAgICB0aGlzLnVwZGF0ZU11bHRpUmFuZ2VUZXh0KCk7XG4gICAgdGhpcy5lbWl0TXVsdGlDaGFuZ2UoKTtcbiAgICB0aGlzLmVtaXRNdWx0aVNlbGVjdGlvbigpO1xuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSB1cGRhdGVNdWx0aVJhbmdlVGV4dCgpOiB2b2lkIHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuc2VsZWN0ZWRSYW5nZXMoKS5sZW5ndGg7XG4gICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICB0aGlzLmRhdGVSYW5nZVRleHQuc2V0KCcnKTtcbiAgICB9IGVsc2UgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgICB0aGlzLmRhdGVSYW5nZVRleHQuc2V0KCcxIHJhbmdlIHNlbGVjdGVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0ZVJhbmdlVGV4dC5zZXQoYCR7Y291bnR9IHJhbmdlcyBzZWxlY3RlZGApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdENoYW5nZSgpOiB2b2lkIHtcbiAgICBjb25zdCByYW5nZTogRGF0ZVJhbmdlID0ge1xuICAgICAgc3RhcnREYXRlOiB0aGlzLnN0YXJ0RGF0ZSxcbiAgICAgIGVuZERhdGU6IHRoaXMuZW5kRGF0ZSxcbiAgICAgIHJhbmdlVGV4dDogdGhpcy5kYXRlUmFuZ2VUZXh0KClcbiAgICB9O1xuICAgIFxuICAgIGlmICh0aGlzLmVuYWJsZVRpbWVQaWNrZXIpIHtcbiAgICAgIHJhbmdlLnN0YXJ0VGltZSA9IHRoaXMuZm9ybWF0VGltZSh0aGlzLnN0YXJ0SG91ciwgdGhpcy5zdGFydE1pbnV0ZSk7XG4gICAgICByYW5nZS5lbmRUaW1lID0gdGhpcy5mb3JtYXRUaW1lKHRoaXMuZW5kSG91ciwgdGhpcy5lbmRNaW51dGUpO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmRhdGVSYW5nZUNoYW5nZS5lbWl0KHJhbmdlKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCByYW5nZTogRGF0ZVJhbmdlID0ge1xuICAgICAgc3RhcnREYXRlOiB0aGlzLnN0YXJ0RGF0ZSxcbiAgICAgIGVuZERhdGU6IHRoaXMuZW5kRGF0ZSxcbiAgICAgIHJhbmdlVGV4dDogdGhpcy5kYXRlUmFuZ2VUZXh0KClcbiAgICB9O1xuICAgIFxuICAgIGlmICh0aGlzLmVuYWJsZVRpbWVQaWNrZXIpIHtcbiAgICAgIHJhbmdlLnN0YXJ0VGltZSA9IHRoaXMuZm9ybWF0VGltZSh0aGlzLnN0YXJ0SG91ciwgdGhpcy5zdGFydE1pbnV0ZSk7XG4gICAgICByYW5nZS5lbmRUaW1lID0gdGhpcy5mb3JtYXRUaW1lKHRoaXMuZW5kSG91ciwgdGhpcy5lbmRNaW51dGUpO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmRhdGVSYW5nZVNlbGVjdGVkLmVtaXQocmFuZ2UpO1xuICB9XG4gIFxuICBwcml2YXRlIGVtaXRNdWx0aUNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLm11bHRpRGF0ZVJhbmdlQ2hhbmdlLmVtaXQoe1xuICAgICAgcmFuZ2VzOiB0aGlzLnNlbGVjdGVkUmFuZ2VzKClcbiAgICB9KTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBlbWl0TXVsdGlTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5tdWx0aURhdGVSYW5nZVNlbGVjdGVkLmVtaXQoe1xuICAgICAgcmFuZ2VzOiB0aGlzLnNlbGVjdGVkUmFuZ2VzKClcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGF0ZVJhbmdlVmFsdWUoKTogRGF0ZVJhbmdlIHtcbiAgICBjb25zdCByYW5nZTogRGF0ZVJhbmdlID0ge1xuICAgICAgc3RhcnREYXRlOiB0aGlzLnN0YXJ0RGF0ZSxcbiAgICAgIGVuZERhdGU6IHRoaXMuZW5kRGF0ZSxcbiAgICAgIHJhbmdlVGV4dDogdGhpcy5kYXRlUmFuZ2VUZXh0KClcbiAgICB9O1xuICAgIFxuICAgIGlmICh0aGlzLmVuYWJsZVRpbWVQaWNrZXIpIHtcbiAgICAgIHJhbmdlLnN0YXJ0VGltZSA9IHRoaXMuZm9ybWF0VGltZSh0aGlzLnN0YXJ0SG91ciwgdGhpcy5zdGFydE1pbnV0ZSk7XG4gICAgICByYW5nZS5lbmRUaW1lID0gdGhpcy5mb3JtYXRUaW1lKHRoaXMuZW5kSG91ciwgdGhpcy5lbmRNaW51dGUpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gcmFuZ2U7XG4gIH1cblxuICAvLyBUaW1lIFBpY2tlciBNZXRob2RzXG4gIHRvZ2dsZVN0YXJ0VGltZVBpY2tlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlVGltZVBpY2tlcikgcmV0dXJuO1xuICAgIHRoaXMuc2hvd1N0YXJ0VGltZVBpY2tlci5zZXQoIXRoaXMuc2hvd1N0YXJ0VGltZVBpY2tlcigpKTtcbiAgICB0aGlzLnNob3dFbmRUaW1lUGlja2VyLnNldChmYWxzZSk7XG4gIH1cblxuICB0b2dnbGVFbmRUaW1lUGlja2VyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVUaW1lUGlja2VyKSByZXR1cm47XG4gICAgdGhpcy5zaG93RW5kVGltZVBpY2tlci5zZXQoIXRoaXMuc2hvd0VuZFRpbWVQaWNrZXIoKSk7XG4gICAgdGhpcy5zaG93U3RhcnRUaW1lUGlja2VyLnNldChmYWxzZSk7XG4gIH1cblxuICBpbmNyZW1lbnRTdGFydEhvdXIoKTogdm9pZCB7XG4gICAgdGhpcy5zdGFydEhvdXIgPSAodGhpcy5zdGFydEhvdXIgKyAxKSAlIDI0O1xuICAgIGlmICh0aGlzLnJlcXVpcmVBcHBseSkge1xuICAgICAgdGhpcy5oYXNQZW5kaW5nQ2hhbmdlcy5zZXQodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlY3JlbWVudFN0YXJ0SG91cigpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0SG91ciA9IHRoaXMuc3RhcnRIb3VyID09PSAwID8gMjMgOiB0aGlzLnN0YXJ0SG91ciAtIDE7XG4gICAgaWYgKHRoaXMucmVxdWlyZUFwcGx5KSB7XG4gICAgICB0aGlzLmhhc1BlbmRpbmdDaGFuZ2VzLnNldCh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuICB9XG5cbiAgaW5jcmVtZW50U3RhcnRNaW51dGUoKTogdm9pZCB7XG4gICAgdGhpcy5zdGFydE1pbnV0ZSA9ICh0aGlzLnN0YXJ0TWludXRlICsgdGhpcy5taW51dGVTdGVwKSAlIDYwO1xuICAgIGlmICh0aGlzLnJlcXVpcmVBcHBseSkge1xuICAgICAgdGhpcy5oYXNQZW5kaW5nQ2hhbmdlcy5zZXQodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlY3JlbWVudFN0YXJ0TWludXRlKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhcnRNaW51dGUgPSB0aGlzLnN0YXJ0TWludXRlIC0gdGhpcy5taW51dGVTdGVwO1xuICAgIGlmICh0aGlzLnN0YXJ0TWludXRlIDwgMCkge1xuICAgICAgdGhpcy5zdGFydE1pbnV0ZSA9IDYwIC0gdGhpcy5taW51dGVTdGVwO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZXF1aXJlQXBwbHkpIHtcbiAgICAgIHRoaXMuaGFzUGVuZGluZ0NoYW5nZXMuc2V0KHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICBpbmNyZW1lbnRFbmRIb3VyKCk6IHZvaWQge1xuICAgIHRoaXMuZW5kSG91ciA9ICh0aGlzLmVuZEhvdXIgKyAxKSAlIDI0O1xuICAgIGlmICh0aGlzLnJlcXVpcmVBcHBseSkge1xuICAgICAgdGhpcy5oYXNQZW5kaW5nQ2hhbmdlcy5zZXQodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlY3JlbWVudEVuZEhvdXIoKTogdm9pZCB7XG4gICAgdGhpcy5lbmRIb3VyID0gdGhpcy5lbmRIb3VyID09PSAwID8gMjMgOiB0aGlzLmVuZEhvdXIgLSAxO1xuICAgIGlmICh0aGlzLnJlcXVpcmVBcHBseSkge1xuICAgICAgdGhpcy5oYXNQZW5kaW5nQ2hhbmdlcy5zZXQodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIGluY3JlbWVudEVuZE1pbnV0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmVuZE1pbnV0ZSA9ICh0aGlzLmVuZE1pbnV0ZSArIHRoaXMubWludXRlU3RlcCkgJSA2MDtcbiAgICBpZiAodGhpcy5yZXF1aXJlQXBwbHkpIHtcbiAgICAgIHRoaXMuaGFzUGVuZGluZ0NoYW5nZXMuc2V0KHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICBkZWNyZW1lbnRFbmRNaW51dGUoKTogdm9pZCB7XG4gICAgdGhpcy5lbmRNaW51dGUgPSB0aGlzLmVuZE1pbnV0ZSAtIHRoaXMubWludXRlU3RlcDtcbiAgICBpZiAodGhpcy5lbmRNaW51dGUgPCAwKSB7XG4gICAgICB0aGlzLmVuZE1pbnV0ZSA9IDYwIC0gdGhpcy5taW51dGVTdGVwO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZXF1aXJlQXBwbHkpIHtcbiAgICAgIHRoaXMuaGFzUGVuZGluZ0NoYW5nZXMuc2V0KHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRUaW1lKGhvdXI6IG51bWJlciwgbWludXRlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGggPSBob3VyLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBtID0gbWludXRlLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBcbiAgICBpZiAodGhpcy50aW1lRm9ybWF0ID09PSAnMTJoJykge1xuICAgICAgY29uc3QgaXNQTSA9IGhvdXIgPj0gMTI7XG4gICAgICBjb25zdCBob3VyMTIgPSBob3VyID09PSAwID8gMTIgOiBob3VyID4gMTIgPyBob3VyIC0gMTIgOiBob3VyO1xuICAgICAgY29uc3QgcGVyaW9kID0gaXNQTSA/ICdQTScgOiAnQU0nO1xuICAgICAgcmV0dXJuIGAke2hvdXIxMi50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7bX0gJHtwZXJpb2R9YDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGAke2h9OiR7bX1gO1xuICB9XG5cbiAgcGFyc2VUaW1lKHRpbWVTdHJpbmc6IHN0cmluZyk6IHsgaG91cjogbnVtYmVyOyBtaW51dGU6IG51bWJlciB9IHtcbiAgICBpZiAoIXRpbWVTdHJpbmcpIHJldHVybiB7IGhvdXI6IDAsIG1pbnV0ZTogMCB9O1xuICAgIFxuICAgIGNvbnN0IHRpbWUxMmhSZWdleCA9IC9eKFxcZHsxLDJ9KTooXFxkezJ9KVxccz8oQU18UE0pJC9pO1xuICAgIGNvbnN0IHRpbWUyNGhSZWdleCA9IC9eKFxcZHsxLDJ9KTooXFxkezJ9KSQvO1xuICAgIFxuICAgIGxldCBtYXRjaCA9IHRpbWVTdHJpbmcubWF0Y2godGltZTEyaFJlZ2V4KTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGxldCBob3VyID0gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcbiAgICAgIGNvbnN0IG1pbnV0ZSA9IHBhcnNlSW50KG1hdGNoWzJdLCAxMCk7XG4gICAgICBjb25zdCBwZXJpb2QgPSBtYXRjaFszXS50b1VwcGVyQ2FzZSgpO1xuICAgICAgXG4gICAgICBpZiAocGVyaW9kID09PSAnUE0nICYmIGhvdXIgIT09IDEyKSBob3VyICs9IDEyO1xuICAgICAgaWYgKHBlcmlvZCA9PT0gJ0FNJyAmJiBob3VyID09PSAxMikgaG91ciA9IDA7XG4gICAgICBcbiAgICAgIHJldHVybiB7IGhvdXIsIG1pbnV0ZSB9O1xuICAgIH1cbiAgICBcbiAgICBtYXRjaCA9IHRpbWVTdHJpbmcubWF0Y2godGltZTI0aFJlZ2V4KTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhvdXI6IHBhcnNlSW50KG1hdGNoWzFdLCAxMCksXG4gICAgICAgIG1pbnV0ZTogcGFyc2VJbnQobWF0Y2hbMl0sIDEwKVxuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHsgaG91cjogMCwgbWludXRlOiAwIH07XG4gIH1cblxuICAvLyBDb250cm9sVmFsdWVBY2Nlc3NvciBpbXBsZW1lbnRhdGlvblxuICB3cml0ZVZhbHVlKHZhbHVlOiBEYXRlUmFuZ2UgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHZhbHVlLnN0YXJ0RGF0ZSB8fCAnJztcbiAgICAgIHRoaXMuZW5kRGF0ZSA9IHZhbHVlLmVuZERhdGUgfHwgJyc7XG4gICAgICBcbiAgICAgIGlmICh0aGlzLmVuYWJsZVRpbWVQaWNrZXIpIHtcbiAgICAgICAgaWYgKHZhbHVlLnN0YXJ0VGltZSkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IHRoaXMucGFyc2VUaW1lKHZhbHVlLnN0YXJ0VGltZSk7XG4gICAgICAgICAgdGhpcy5zdGFydEhvdXIgPSBzdGFydFRpbWUuaG91cjtcbiAgICAgICAgICB0aGlzLnN0YXJ0TWludXRlID0gc3RhcnRUaW1lLm1pbnV0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUuZW5kVGltZSkge1xuICAgICAgICAgIGNvbnN0IGVuZFRpbWUgPSB0aGlzLnBhcnNlVGltZSh2YWx1ZS5lbmRUaW1lKTtcbiAgICAgICAgICB0aGlzLmVuZEhvdXIgPSBlbmRUaW1lLmhvdXI7XG4gICAgICAgICAgdGhpcy5lbmRNaW51dGUgPSBlbmRUaW1lLm1pbnV0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodGhpcy5zdGFydERhdGUgJiYgdGhpcy5lbmREYXRlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRGF0ZVJhbmdlVGV4dCgpO1xuICAgICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gJyc7XG4gICAgICB0aGlzLmVuZERhdGUgPSAnJztcbiAgICAgIHRoaXMuZGF0ZVJhbmdlVGV4dC5zZXQoJycpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogRGF0ZVJhbmdlIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaXNEaXNhYmxlZC5zZXQoaXNEaXNhYmxlZCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLXdyYXBwZXJcIiBcbiAgW2NsYXNzXT1cIid0aGVtZS0nICsgdGhlbWVcIlxuICBbc3R5bGUuLS1pbnB1dC1ib3JkZXItaG92ZXJdPVwiaW5wdXRCb3JkZXJDb2xvckhvdmVyXCJcbiAgW3N0eWxlLi0taW5wdXQtYm9yZGVyLWZvY3VzXT1cImlucHV0Qm9yZGVyQ29sb3JGb2N1c1wiPlxuICA8aW5wdXQgXG4gICAgdHlwZT1cInRleHRcIiBcbiAgICBjbGFzcz1cImRhdGVwaWNrZXItaW5wdXRcIiBcbiAgICBbdmFsdWVdPVwiZGF0ZVJhbmdlVGV4dCgpXCIgXG4gICAgKGNsaWNrKT1cInRvZ2dsZURhdGVQaWNrZXIoKVwiIFxuICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQoKVwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJwbGFjZWhvbGRlclwiXG4gICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJzaG93RGF0ZVBpY2tlcigpXCJcbiAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cIidkaWFsb2cnXCJcbiAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogaW5wdXRCYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAnY29sb3InOiBpbnB1dFRleHRDb2xvcixcbiAgICAgICdib3JkZXItY29sb3InOiBpbnB1dEJvcmRlckNvbG9yLFxuICAgICAgJ3BhZGRpbmcnOiBpbnB1dFBhZGRpbmdcbiAgICB9XCJcbiAgICByZWFkb25seT5cblxuICBAaWYgKHNob3dEYXRlUGlja2VyKCkpIHtcbiAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWRyb3Bkb3duXCI+XG4gICAgQGlmIChzaG93UHJlc2V0cykge1xuICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1wcmVzZXRzXCI+XG4gICAgICBAZm9yIChwcmVzZXQgb2YgcHJlc2V0czsgdHJhY2sgcHJlc2V0LmxhYmVsKSB7XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwic2VsZWN0UHJlc2V0UmFuZ2UocHJlc2V0KVwiPnt7IHByZXNldC5sYWJlbCB9fTwvYnV0dG9uPlxuICAgICAgfVxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2UtY2FsZW5kYXJcIiAoY2xpY2spPVwiY2xvc2VEYXRlUGlja2VyKClcIiB0aXRsZT1cIkNsb3NlXCI+XG4gICAgICAgIMOXXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKCFzaG93UHJlc2V0cykge1xuICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1oZWFkZXItb25seS1jbG9zZVwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2UtY2FsZW5kYXJcIiAoY2xpY2spPVwiY2xvc2VEYXRlUGlja2VyKClcIiB0aXRsZT1cIkNsb3NlXCI+XG4gICAgICAgIMOXXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8IS0tIENhbGVuZGFycyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItY2FsZW5kYXJzXCI+XG4gICAgICA8IS0tIFByZXZpb3VzIG1vbnRoIGNhbGVuZGFyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWNhbGVuZGFyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1oZWFkZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2hhbmdlTW9udGgoLTEpXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTExLjM1NCAxLjY0NmEuNS41IDAgMCAxIDAgLjcwOEw1LjcwNyA4bDUuNjQ3IDUuNjQ2YS41LjUgMCAwIDEtLjcwOC43MDhsLTYtNmEuNS41IDAgMCAxIDAtLjcwOGw2LTZhLjUuNSAwIDAgMSAuNzA4IDB6XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPHNwYW4+e3sgcHJldmlvdXNNb250aE5hbWUoKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBzdHlsZT1cInZpc2liaWxpdHk6IGhpZGRlbjtcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj5cbiAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNC42NDYgMS42NDZhLjUuNSAwIDAgMSAuNzA4IDBsNiA2YS41LjUgMCAwIDEgMCAuNzA4bC02IDZhLjUuNSAwIDAgMS0uNzA4LS43MDhMMTAuMjkzIDggNC42NDYgMi4zNTRhLjUuNSAwIDAgMSAwLS43MDh6XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItd2Vla2RheXNcIj5cbiAgICAgICAgICBAZm9yIChkYXlOYW1lIG9mIHdlZWtEYXlOYW1lcygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxzcGFuPnt7IGRheU5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWRheXNcIj5cbiAgICAgICAgICBAZm9yIChkYXlPYmogb2YgcHJldmlvdXNNb250aERheXMoKTsgdHJhY2sgZGF5T2JqLmRhdGUgfHwgJGluZGV4KSB7XG4gICAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJkYXRlLXBpY2tlci1kYXlcIiBcbiAgICAgICAgICAgICAgW2NsYXNzLmVtcHR5XT1cIiFkYXlPYmouaXNDdXJyZW50TW9udGhcIlxuICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiZGF5T2JqLmlzU3RhcnQgfHwgZGF5T2JqLmlzRW5kXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmluLXJhbmdlXT1cImRheU9iai5pblJhbmdlICYmICFkYXlPYmouaXNTdGFydCAmJiAhZGF5T2JqLmlzRW5kXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmluLWhvdmVyLXJhbmdlXT1cImRheU9iai5pbkhvdmVyUmFuZ2UgJiYgIWRheU9iai5pc1N0YXJ0ICYmICFkYXlPYmouaXNFbmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZGF5T2JqLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbY2xhc3Mua2V5Ym9hcmQtZm9jdXNlZF09XCJlbmFibGVLZXlib2FyZE5hdmlnYXRpb24gJiYgaGFzS2V5Ym9hcmRGb2N1cyhkYXlPYmouZGF0ZSwgMClcIlxuICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJlbmFibGVLZXlib2FyZE5hdmlnYXRpb24gJiYgZGF5T2JqLmlzQ3VycmVudE1vbnRoICYmIGhhc0tleWJvYXJkRm9jdXMoZGF5T2JqLmRhdGUsIDApID8gMCA6IC0xXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJmb3JtYXREYXRlRGlzcGxheShkYXlPYmouZGF0ZSlcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImRheU9iai5pc1N0YXJ0IHx8IGRheU9iai5pc0VuZFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJkYXlPYmouaXNTdGFydCA/ICdkYXRlJyA6IG51bGxcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRheU9iai5pc0Rpc2FibGVkXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERheShkYXlPYmopXCJcbiAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25EYXlIb3ZlcihkYXlPYmopXCJcbiAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwiY2xlYXJEYXlIb3ZlcigpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFkYXlPYmouaXNDdXJyZW50TW9udGggfHwgZGF5T2JqLmlzRGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAge3sgZGF5T2JqLmRheSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEN1cnJlbnQgbW9udGggY2FsZW5kYXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItY2FsZW5kYXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWhlYWRlclwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHN0eWxlPVwidmlzaWJpbGl0eTogaGlkZGVuO1wiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xMS4zNTQgMS42NDZhLjUuNSAwIDAgMSAwIC43MDhMNS43MDcgOGw1LjY0NyA1LjY0NmEuNS41IDAgMCAxLS43MDguNzA4bC02LTZhLjUuNSAwIDAgMSAwLS43MDhsNi02YS41LjUgMCAwIDEgLjcwOCAwelwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxzcGFuPnt7IGN1cnJlbnRNb250aE5hbWUoKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2hhbmdlTW9udGgoMSlcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj5cbiAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNC42NDYgMS42NDZhLjUuNSAwIDAgMSAuNzA4IDBsNiA2YS41LjUgMCAwIDEgMCAuNzA4bC02IDZhLjUuNSAwIDAgMS0uNzA4LS43MDhMMTAuMjkzIDggNC42NDYgMi4zNTRhLjUuNSAwIDAgMSAwLS43MDh6XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItd2Vla2RheXNcIj5cbiAgICAgICAgICBAZm9yIChkYXlOYW1lIG9mIHdlZWtEYXlOYW1lcygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxzcGFuPnt7IGRheU5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWRheXNcIj5cbiAgICAgICAgICBAZm9yIChkYXlPYmogb2YgY3VycmVudE1vbnRoRGF5cygpOyB0cmFjayBkYXlPYmouZGF0ZSB8fCAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImRhdGUtcGlja2VyLWRheVwiIFxuICAgICAgICAgICAgICBbY2xhc3MuZW1wdHldPVwiIWRheU9iai5pc0N1cnJlbnRNb250aFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJkYXlPYmouaXNTdGFydCB8fCBkYXlPYmouaXNFbmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuaW4tcmFuZ2VdPVwiZGF5T2JqLmluUmFuZ2UgJiYgIWRheU9iai5pc1N0YXJ0ICYmICFkYXlPYmouaXNFbmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuaW4taG92ZXItcmFuZ2VdPVwiZGF5T2JqLmluSG92ZXJSYW5nZSAmJiAhZGF5T2JqLmlzU3RhcnQgJiYgIWRheU9iai5pc0VuZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJkYXlPYmouaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5rZXlib2FyZC1mb2N1c2VkXT1cImVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbiAmJiBoYXNLZXlib2FyZEZvY3VzKGRheU9iai5kYXRlLCAxKVwiXG4gICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbiAmJiBkYXlPYmouaXNDdXJyZW50TW9udGggJiYgaGFzS2V5Ym9hcmRGb2N1cyhkYXlPYmouZGF0ZSwgMSkgPyAwIDogLTFcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImZvcm1hdERhdGVEaXNwbGF5KGRheU9iai5kYXRlKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiZGF5T2JqLmlzU3RhcnQgfHwgZGF5T2JqLmlzRW5kXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cImRheU9iai5pc1N0YXJ0ID8gJ2RhdGUnIDogbnVsbFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGF5T2JqLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF5KGRheU9iailcIlxuICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbkRheUhvdmVyKGRheU9iailcIlxuICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJjbGVhckRheUhvdmVyKClcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWRheU9iai5pc0N1cnJlbnRNb250aCB8fCBkYXlPYmouaXNEaXNhYmxlZFwiPlxuICAgICAgICAgICAgICB7eyBkYXlPYmouZGF5IH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIE11bHRpLVJhbmdlIExpc3QgLS0+XG4gICAgQGlmIChtdWx0aVJhbmdlICYmIHNlbGVjdGVkUmFuZ2VzKCkubGVuZ3RoID4gMCkge1xuICAgIDxkaXYgY2xhc3M9XCJtdWx0aS1yYW5nZS1saXN0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibXVsdGktcmFuZ2UtaGVhZGVyXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibXVsdGktcmFuZ2UtdGl0bGVcIj5TZWxlY3RlZCBSYW5nZXMgKHt7IHNlbGVjdGVkUmFuZ2VzKCkubGVuZ3RoIH19KTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm11bHRpLXJhbmdlLWl0ZW1zXCI+XG4gICAgICAgIEBmb3IgKHJhbmdlIG9mIHNlbGVjdGVkUmFuZ2VzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibXVsdGktcmFuZ2UtaXRlbVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXVsdGktcmFuZ2UtdGV4dFwiPnt7IHJhbmdlLnJhbmdlVGV4dCB9fTwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgY2xhc3M9XCJidG4tcmVtb3ZlLXJhbmdlXCIgXG4gICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlUmFuZ2UoJGluZGV4KVwiXG4gICAgICAgICAgICB0aXRsZT1cIlJlbW92ZSB0aGlzIHJhbmdlXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMi4xNDYgMi44NTRhLjUuNSAwIDEgMSAuNzA4LS43MDhMOCA3LjI5M2w1LjE0Ni01LjE0N2EuNS41IDAgMCAxIC43MDguNzA4TDguNzA3IDhsNS4xNDcgNS4xNDZhLjUuNSAwIDAgMS0uNzA4LjcwOEw4IDguNzA3bC01LjE0NiA1LjE0N2EuNS41IDAgMCAxLS43MDgtLjcwOEw3LjI5MyA4IDIuMTQ2IDIuODU0WlwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPCEtLSBUaW1lIFBpY2tlciAtLT5cbiAgICBAaWYgKGVuYWJsZVRpbWVQaWNrZXIpIHtcbiAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItY29udGFpbmVyXCI+XG4gICAgICA8IS0tIFN0YXJ0IFRpbWUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItbGFiZWxcIj5TdGFydCBUaW1lPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci1pbnB1dHNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1pbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgICBjbGFzcz1cInRpbWUtYnRuIHRpbWUtYnRuLXVwXCIgXG4gICAgICAgICAgICAgIChjbGljayk9XCJpbmNyZW1lbnRTdGFydEhvdXIoKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiSW5jcmVtZW50IGhvdXJcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNDcgNC44NmwtNC43OTYgNS40ODFjLS41NjYuNjQ3LS4xMDYgMS42NTkuNzUzIDEuNjU5aDkuNTkyYTEgMSAwIDAgMCAuNzUzLTEuNjU5bC00Ljc5Ni01LjQ4YTEgMSAwIDAgMC0xLjUwNiAwelwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1pbnB1dFwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJzdGFydEhvdXIudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXCJcbiAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgICAgdGl0bGU9XCJTdGFydCBob3VyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1idG4gdGltZS1idG4tZG93blwiIFxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGVjcmVtZW50U3RhcnRIb3VyKClcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkRlY3JlbWVudCBob3VyXCI+XG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcuMjQ3IDExLjE0bC00Ljc5Ni01LjQ4MUMxLjg4NSA1LjAxMyAyLjM0NSA0IDMuMjA0IDRoOS41OTJhMSAxIDAgMCAxIC43NTMgMS42NTlsLTQuNzk2IDUuNDhhMSAxIDAgMCAxLTEuNTA2IDB6XCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGltZS1zZXBhcmF0b3JcIj46PC9zcGFuPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1idG4gdGltZS1idG4tdXBcIiBcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImluY3JlbWVudFN0YXJ0TWludXRlKClcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkluY3JlbWVudCBtaW51dGVcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNDcgNC44NmwtNC43OTYgNS40ODFjLS41NjYuNjQ3LS4xMDYgMS42NTkuNzUzIDEuNjU5aDkuNTkyYTEgMSAwIDAgMCAuNzUzLTEuNjU5bC00Ljc5Ni01LjQ4YTEgMSAwIDAgMC0xLjUwNiAwelwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1pbnB1dFwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJzdGFydE1pbnV0ZS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJylcIlxuICAgICAgICAgICAgICByZWFkb25seVxuICAgICAgICAgICAgICB0aXRsZT1cIlN0YXJ0IG1pbnV0ZVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgICBjbGFzcz1cInRpbWUtYnRuIHRpbWUtYnRuLWRvd25cIiBcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudFN0YXJ0TWludXRlKClcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkRlY3JlbWVudCBtaW51dGVcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNDcgMTEuMTRsLTQuNzk2LTUuNDgxQzEuODg1IDUuMDEzIDIuMzQ1IDQgMy4yMDQgNGg5LjU5MmExIDEgMCAwIDEgLjc1MyAxLjY1OWwtNC43OTYgNS40OGExIDEgMCAwIDEtMS41MDYgMHpcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmICh0aW1lRm9ybWF0ID09PSAnMTJoJykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBlcmlvZFwiPlxuICAgICAgICAgICAge3sgc3RhcnRIb3VyID49IDEyID8gJ1BNJyA6ICdBTScgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU2VwYXJhdG9yIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRpbWUtc2VwYXJhdG9yLXZlcnRpY2FsXCI+PC9kaXY+XG5cbiAgICAgIDwhLS0gRW5kIFRpbWUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItbGFiZWxcIj5FbmQgVGltZTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItaW5wdXRzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWJ0biB0aW1lLWJ0bi11cFwiIFxuICAgICAgICAgICAgICAoY2xpY2spPVwiaW5jcmVtZW50RW5kSG91cigpXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJJbmNyZW1lbnQgaG91clwiPlxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk03LjI0NyA0Ljg2bC00Ljc5NiA1LjQ4MWMtLjU2Ni42NDctLjEwNiAxLjY1OS43NTMgMS42NTloOS41OTJhMSAxIDAgMCAwIC43NTMtMS42NTlsLTQuNzk2LTUuNDhhMSAxIDAgMCAwLTEuNTA2IDB6XCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImVuZEhvdXIudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXCJcbiAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgICAgdGl0bGU9XCJFbmQgaG91clwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgICBjbGFzcz1cInRpbWUtYnRuIHRpbWUtYnRuLWRvd25cIiBcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudEVuZEhvdXIoKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiRGVjcmVtZW50IGhvdXJcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNDcgMTEuMTRsLTQuNzk2LTUuNDgxQzEuODg1IDUuMDEzIDIuMzQ1IDQgMy4yMDQgNGg5LjU5MmExIDEgMCAwIDEgLjc1MyAxLjY1OWwtNC43OTYgNS40OGExIDEgMCAwIDEtMS41MDYgMHpcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lLXNlcGFyYXRvclwiPjo8L3NwYW4+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWJ0biB0aW1lLWJ0bi11cFwiIFxuICAgICAgICAgICAgICAoY2xpY2spPVwiaW5jcmVtZW50RW5kTWludXRlKClcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkluY3JlbWVudCBtaW51dGVcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNDcgNC44NmwtNC43OTYgNS40ODFjLS41NjYuNjQ3LS4xMDYgMS42NTkuNzUzIDEuNjU5aDkuNTkyYTEgMSAwIDAgMCAuNzUzLTEuNjU5bC00Ljc5Ni01LjQ4YTEgMSAwIDAgMC0xLjUwNiAwelwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1pbnB1dFwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJlbmRNaW51dGUudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXCJcbiAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgICAgdGl0bGU9XCJFbmQgbWludXRlXCI+XG4gICAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1idG4gdGltZS1idG4tZG93blwiIFxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGVjcmVtZW50RW5kTWludXRlKClcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkRlY3JlbWVudCBtaW51dGVcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNDcgMTEuMTRsLTQuNzk2LTUuNDgxQzEuODg1IDUuMDEzIDIuMzQ1IDQgMy4yMDQgNGg5LjU5MmExIDEgMCAwIDEgLjc1MyAxLjY1OWwtNC43OTYgNS40OGExIDEgMCAwIDEtMS41MDYgMHpcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmICh0aW1lRm9ybWF0ID09PSAnMTJoJykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBlcmlvZFwiPlxuICAgICAgICAgICAge3sgZW5kSG91ciA+PSAxMiA/ICdQTScgOiAnQU0nIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIH1cblxuICAgIDwhLS0gRm9vdGVyIHdpdGggYnV0dG9ucyAtLT5cbiAgICBAaWYgKHNob3dDbGVhckJ1dHRvbiB8fCBtdWx0aVJhbmdlIHx8IHJlcXVpcmVBcHBseSkge1xuICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1mb290ZXJcIj5cbiAgICAgIEBpZiAocmVxdWlyZUFwcGx5ICYmICFtdWx0aVJhbmdlKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHBseS1mb290ZXItYWN0aW9uc1wiPlxuICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICBjbGFzcz1cImJ0bi1jYW5jZWxcIiBcbiAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWxTZWxlY3Rpb24oKVwiIFxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNQZW5kaW5nQ2hhbmdlcygpXCJcbiAgICAgICAgICAgIHRpdGxlPVwiQ2FuY2VsIHNlbGVjdGlvblwiPlxuICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuLWFwcGx5XCIgXG4gICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlTZWxlY3Rpb24oKVwiIFxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNQZW5kaW5nQ2hhbmdlcygpIHx8ICFwZW5kaW5nU3RhcnREYXRlIHx8ICFwZW5kaW5nRW5kRGF0ZVwiXG4gICAgICAgICAgICB0aXRsZT1cIkFwcGx5IHNlbGVjdGlvblwiPlxuICAgICAgICAgICAgQXBwbHlcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKG11bHRpUmFuZ2UpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm11bHRpLXJhbmdlLWZvb3Rlci1hY3Rpb25zXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xlYXJcIiAoY2xpY2spPVwiY2xlYXIoKVwiIHRpdGxlPVwiQ2xlYXIgYWxsIHJhbmdlc1wiPlxuICAgICAgICAgICAgQ2xlYXIgQWxsXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tZG9uZVwiIChjbGljayk9XCJjbG9zZURhdGVQaWNrZXIoKVwiIHRpdGxlPVwiRG9uZSBzZWxlY3RpbmdcIj5cbiAgICAgICAgICAgIERvbmVcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKCFtdWx0aVJhbmdlICYmICFyZXF1aXJlQXBwbHkgJiYgc2hvd0NsZWFyQnV0dG9uKSB7XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsZWFyXCIgKGNsaWNrKT1cImNsZWFyKClcIiB0aXRsZT1cIkNsZWFyIHNlbGVjdGlvblwiPlxuICAgICAgICAgIENsZWFyXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuIl19
1149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVhbC1kYXRlcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kdWFsLWRhdGVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vc3JjL2R1YWwtZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFvQyxZQUFZLEVBQWMsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqTCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRyxPQUFPLEVBQWUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7OztBQW9EbEUsTUFBTSxPQUFPLHVCQUF1QjtJQThJZDtJQTdJWCxXQUFXLEdBQVcsbUJBQW1CLENBQUM7SUFDbkQsSUFBYSxTQUFTLENBQUMsS0FBYTtRQUNsQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0MsSUFBSSxJQUFJO2dCQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxTQUFTO1FBQ1gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN6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Z0JBRUksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLHNCQUFzQjtzQkFBL0IsTUFBTTtnQkFzR1AsY0FBYztzQkFEYixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVcxQyx3QkFBd0I7c0JBRHZCLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBIb3N0TGlzdGVuZXIsIEVsZW1lbnRSZWYsIGZvcndhcmRSZWYsIHNpZ25hbCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERhdGVBZGFwdGVyLCBEQVRFX0FEQVBURVIgfSBmcm9tICcuL2RhdGUtYWRhcHRlcic7XG5pbXBvcnQgeyBOYXRpdmVEYXRlQWRhcHRlciB9IGZyb20gJy4vbmF0aXZlLWRhdGUtYWRhcHRlcic7XG5pbXBvcnQgeyBEdWFsRGF0ZVJhbmdlU3RvcmUgfSBmcm9tICcuL2NvcmUvZHVhbC1kYXRlLXJhbmdlLnN0b3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBEYXRlUmFuZ2Uge1xuICBzdGFydERhdGU6IHN0cmluZztcbiAgZW5kRGF0ZTogc3RyaW5nO1xuICByYW5nZVRleHQ6IHN0cmluZztcbiAgc3RhcnRUaW1lPzogc3RyaW5nOyAvLyBISDptbSBmb3JtYXQgKG9wdGlvbmFsKVxuICBlbmRUaW1lPzogc3RyaW5nOyAvLyBISDptbSBmb3JtYXQgKG9wdGlvbmFsKVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpRGF0ZVJhbmdlIHtcbiAgcmFuZ2VzOiBEYXRlUmFuZ2VbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmVzZXRSYW5nZSB7XG4gIHN0YXJ0OiBzdHJpbmc7XG4gIGVuZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByZXNldENvbmZpZyB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGdldFZhbHVlOiAoKSA9PiBQcmVzZXRSYW5nZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2NhbGVDb25maWcge1xuICBtb250aE5hbWVzPzogc3RyaW5nW107XG4gIG1vbnRoTmFtZXNTaG9ydD86IHN0cmluZ1tdO1xuICBkYXlOYW1lcz86IHN0cmluZ1tdO1xuICBkYXlOYW1lc1Nob3J0Pzogc3RyaW5nW107XG4gIGZpcnN0RGF5T2ZXZWVrPzogbnVtYmVyOyAvLyAwID0gU3VuZGF5LCAxID0gTW9uZGF5LCBldGMuXG59XG5cbmV4cG9ydCB0eXBlIFRoZW1lVHlwZSA9ICdkZWZhdWx0JyB8ICdib290c3RyYXAnIHwgJ2J1bG1hJyB8ICdmb3VuZGF0aW9uJyB8ICd0YWlsd2luZCcgfCAnY3VzdG9tJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWR1YWwtZGF0ZXBpY2tlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2R1YWwtZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kdWFsLWRhdGVwaWNrZXIuY29tcG9uZW50LnNjc3MnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IER1YWxEYXRlcGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBEQVRFX0FEQVBURVIsXG4gICAgICB1c2VDbGFzczogTmF0aXZlRGF0ZUFkYXB0ZXJcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRHVhbERhdGVwaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlbGVjdCBkYXRlIHJhbmdlJztcbiAgQElucHV0KCkgc2V0IHN0YXJ0RGF0ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlQWRhcHRlci5wYXJzZSh2YWx1ZSk7XG4gICAgICBpZiAoZGF0ZSkgdGhpcy5yYW5nZVN0b3JlLnNldFN0YXJ0KGRhdGUpO1xuICAgIH1cbiAgfVxuICBnZXQgc3RhcnREYXRlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMucmFuZ2VTdG9yZS5zdGFydERhdGUoKTtcbiAgICByZXR1cm4gZGF0ZSA/IHRoaXMuZm9ybWF0RGF0ZShkYXRlKSA6ICcnO1xuICB9XG4gIFxuICBASW5wdXQoKSBzZXQgZW5kRGF0ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlQWRhcHRlci5wYXJzZSh2YWx1ZSk7XG4gICAgICBpZiAoZGF0ZSkgdGhpcy5yYW5nZVN0b3JlLnNldEVuZChkYXRlKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGVuZERhdGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRlID0gdGhpcy5yYW5nZVN0b3JlLmVuZERhdGUoKTtcbiAgICByZXR1cm4gZGF0ZSA/IHRoaXMuZm9ybWF0RGF0ZShkYXRlKSA6ICcnO1xuICB9XG4gIEBJbnB1dCgpIHNob3dQcmVzZXRzOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0NsZWFyQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG11bHRpUmFuZ2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY2xvc2VPblNlbGVjdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGNsb3NlT25QcmVzZXRTZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBjbG9zZU9uQ2xpY2tPdXRzaWRlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgZW5hYmxlS2V5Ym9hcmROYXZpZ2F0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgcHJlc2V0czogUHJlc2V0Q29uZmlnW10gPSBbXTtcbiAgQElucHV0KCkgdGhlbWU6IFRoZW1lVHlwZSA9ICdkZWZhdWx0JztcbiAgQElucHV0KCkgaW5wdXRCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZyA9ICcjZmZmJztcbiAgQElucHV0KCkgaW5wdXRUZXh0Q29sb3I6IHN0cmluZyA9ICcjNDk1MDU3JztcbiAgQElucHV0KCkgaW5wdXRCb3JkZXJDb2xvcjogc3RyaW5nID0gJyNjZWQ0ZGEnO1xuICBASW5wdXQoKSBpbnB1dEJvcmRlckNvbG9ySG92ZXI6IHN0cmluZyA9ICcjY2VkNGRhJztcbiAgQElucHV0KCkgaW5wdXRCb3JkZXJDb2xvckZvY3VzOiBzdHJpbmcgPSAnIzgwYmRmZic7XG4gIEBJbnB1dCgpIGlucHV0UGFkZGluZzogc3RyaW5nID0gJzAuMzc1cmVtIDAuNzVyZW0nO1xuICBASW5wdXQoKSBsb2NhbGU6IExvY2FsZUNvbmZpZyA9IHt9O1xuICBASW5wdXQoKSBkaXNhYmxlZERhdGVzOiBEYXRlW10gfCAoKGRhdGU6IERhdGUpID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBkaXNwbGF5Rm9ybWF0OiBzdHJpbmcgPSAnRCBNTU0nOyAvLyBGb3JtYXQgZm9yIGRpc3BsYXlpbmcgZGF0ZXMgaW4gaW5wdXRcbiAgQElucHV0KCkgcmVxdWlyZUFwcGx5OiBib29sZWFuID0gZmFsc2U7IC8vIFJlcXVpcmUgQXBwbHkgYnV0dG9uIGNvbmZpcm1hdGlvblxuICBASW5wdXQoKSBlbmFibGVUaW1lUGlja2VyOiBib29sZWFuID0gZmFsc2U7IC8vIEVuYWJsZSB0aW1lIHNlbGVjdGlvblxuICBASW5wdXQoKSB0aW1lRm9ybWF0OiAnMTJoJyB8ICcyNGgnID0gJzI0aCc7IC8vIFRpbWUgZm9ybWF0XG4gIEBJbnB1dCgpIG1pbnV0ZVN0ZXA6IG51bWJlciA9IDE1OyAvLyBTdGVwIGZvciBtaW51dGUgc2VsZWN0b3IgKDEsIDUsIDE1LCAzMClcbiAgQElucHV0KCkgZGVmYXVsdFN0YXJ0VGltZTogc3RyaW5nID0gJzAwOjAwJzsgLy8gRGVmYXVsdCBzdGFydCB0aW1lIEhIOm1tXG4gIEBJbnB1dCgpIGRlZmF1bHRFbmRUaW1lOiBzdHJpbmcgPSAnMjM6NTknOyAvLyBEZWZhdWx0IGVuZCB0aW1lIEhIOm1tXG5cbiAgQE91dHB1dCgpIGRhdGVSYW5nZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZVJhbmdlPigpO1xuICBAT3V0cHV0KCkgZGF0ZVJhbmdlU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGVSYW5nZT4oKTtcbiAgQE91dHB1dCgpIG11bHRpRGF0ZVJhbmdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNdWx0aURhdGVSYW5nZT4oKTtcbiAgQE91dHB1dCgpIG11bHRpRGF0ZVJhbmdlU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE11bHRpRGF0ZVJhbmdlPigpO1xuXG4gIC8vIERhdGUgYWRhcHRlciBpbmplY3Rpb25cbiAgcHJpdmF0ZSBkYXRlQWRhcHRlciA9IGluamVjdDxEYXRlQWRhcHRlcj4oREFURV9BREFQVEVSKTtcbiAgXG4gIC8vIEhlYWRsZXNzIHN0b3JlIGZvciBkYXRlIHJhbmdlIHN0YXRlICh2My41LjArKVxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmFuZ2VTdG9yZSA9IGluamVjdChEdWFsRGF0ZVJhbmdlU3RvcmUpO1xuXG4gIC8vIFVJLW9ubHkgc2lnbmFsc1xuICBzaG93RGF0ZVBpY2tlciA9IHNpZ25hbChmYWxzZSk7XG4gIGN1cnJlbnRNb250aCA9IHNpZ25hbCh0aGlzLmRhdGVBZGFwdGVyLnRvZGF5KCkpO1xuICBwcmV2aW91c01vbnRoID0gc2lnbmFsKHRoaXMuZGF0ZUFkYXB0ZXIudG9kYXkoKSk7XG4gIGN1cnJlbnRNb250aERheXMgPSBzaWduYWw8YW55W10+KFtdKTtcbiAgcHJldmlvdXNNb250aERheXMgPSBzaWduYWw8YW55W10+KFtdKTtcbiAgaXNEaXNhYmxlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHNob3dTdGFydFRpbWVQaWNrZXIgPSBzaWduYWwoZmFsc2UpO1xuICBzaG93RW5kVGltZVBpY2tlciA9IHNpZ25hbChmYWxzZSk7XG4gIGhvdmVyRGF0ZSA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgXG4gIC8vIENvbXB1dGVkIHRpbWUgcHJvcGVydGllcyBmcm9tIHN0b3JlXG4gIGdldCBzdGFydEhvdXIoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0aW1lID0gdGhpcy5yYW5nZVN0b3JlLnN0YXJ0VGltZSgpO1xuICAgIHJldHVybiB0aGlzLnBhcnNlVGltZSh0aW1lKS5ob3VyO1xuICB9XG4gIFxuICBnZXQgc3RhcnRNaW51dGUoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0aW1lID0gdGhpcy5yYW5nZVN0b3JlLnN0YXJ0VGltZSgpO1xuICAgIHJldHVybiB0aGlzLnBhcnNlVGltZSh0aW1lKS5taW51dGU7XG4gIH1cbiAgXG4gIGdldCBlbmRIb3VyKCk6IG51bWJlciB7XG4gICAgY29uc3QgdGltZSA9IHRoaXMucmFuZ2VTdG9yZS5lbmRUaW1lKCk7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VUaW1lKHRpbWUpLmhvdXI7XG4gIH1cbiAgXG4gIGdldCBlbmRNaW51dGUoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0aW1lID0gdGhpcy5yYW5nZVN0b3JlLmVuZFRpbWUoKTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZVRpbWUodGltZSkubWludXRlO1xuICB9XG4gIFxuICBwcml2YXRlIHNldFN0YXJ0SG91ck1pbnV0ZShob3VyOiBudW1iZXIsIG1pbnV0ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdGltZVN0ciA9IHRoaXMuZm9ybWF0VGltZShob3VyLCBtaW51dGUpO1xuICAgIHRoaXMucmFuZ2VTdG9yZS5zZXRTdGFydFRpbWUodGltZVN0cik7XG4gIH1cbiAgXG4gIHByaXZhdGUgc2V0RW5kSG91ck1pbnV0ZShob3VyOiBudW1iZXIsIG1pbnV0ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdGltZVN0ciA9IHRoaXMuZm9ybWF0VGltZShob3VyLCBtaW51dGUpO1xuICAgIHRoaXMucmFuZ2VTdG9yZS5zZXRFbmRUaW1lKHRpbWVTdHIpO1xuICB9XG4gIFxuICAvLyBNdWx0aS1yYW5nZSBzdXBwb3J0IChVSS1zcGVjaWZpYylcbiAgc2VsZWN0ZWRSYW5nZXMgPSBzaWduYWw8RGF0ZVJhbmdlW10+KFtdKTtcbiAgY3VycmVudFJhbmdlSW5kZXggPSBzaWduYWw8bnVtYmVyPigtMSk7XG5cbiAgLy8gS2V5Ym9hcmQgbmF2aWdhdGlvbiAoVUktc3BlY2lmaWMpXG4gIGZvY3VzZWREYXkgPSBzaWduYWw8eyBkYXRlOiBzdHJpbmc7IG1vbnRoSW5kZXg6IG51bWJlciB9IHwgbnVsbD4obnVsbCk7XG4gIFxuICAvLyBDb21wdXRlZCB2YWx1ZXNcbiAgY3VycmVudE1vbnRoTmFtZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZ2V0TW9udGhOYW1lKHRoaXMuY3VycmVudE1vbnRoKCkpKTtcbiAgcHJldmlvdXNNb250aE5hbWUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmdldE1vbnRoTmFtZSh0aGlzLnByZXZpb3VzTW9udGgoKSkpO1xuICB3ZWVrRGF5TmFtZXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmdldERheU5hbWVzKCkpO1xuICBcbiAgLy8gQ29tcHV0ZWQgZnJvbSBzdG9yZVxuICBkYXRlUmFuZ2VUZXh0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5yYW5nZVN0b3JlLnJhbmdlVGV4dCgpKTtcbiAgc2VsZWN0aW5nU3RhcnREYXRlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5yYW5nZVN0b3JlLnNlbGVjdGluZ1N0YXJ0KCkpO1xuICBoYXNQZW5kaW5nQ2hhbmdlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMucmFuZ2VTdG9yZS5oYXNQZW5kaW5nQ2hhbmdlcygpKTtcbiAgXG4gIC8vIENvbXB1dGVkIGZvciB0ZW1wbGF0ZSBhY2Nlc3MgdG8gcGVuZGluZyBkYXRlcyAocmVxdWlyZUFwcGx5IG1vZGUpXG4gIGdldCBwZW5kaW5nU3RhcnREYXRlKCk6IHN0cmluZyB7XG4gICAgLy8gSW4gcmVxdWlyZUFwcGx5IG1vZGUsIHN0b3JlIGtlZXBzIHBlbmRpbmcgdmFsdWVzXG4gICAgLy8gRm9yIG5vdywgdXNlIGFjdHVhbCBzdG9yZSB2YWx1ZXMgYXMgcGVuZGluZyAoc3RvcmUgaGFuZGxlcyB0aGlzKVxuICAgIGlmICghdGhpcy5yZXF1aXJlQXBwbHkpIHJldHVybiAnJztcbiAgICBjb25zdCBkYXRlID0gdGhpcy5yYW5nZVN0b3JlLnN0YXJ0RGF0ZSgpO1xuICAgIHJldHVybiBkYXRlICYmIHRoaXMuaGFzUGVuZGluZ0NoYW5nZXMoKSA/IHRoaXMuZm9ybWF0RGF0ZShkYXRlKSA6ICcnO1xuICB9XG4gIFxuICBnZXQgcGVuZGluZ0VuZERhdGUoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucmVxdWlyZUFwcGx5KSByZXR1cm4gJyc7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMucmFuZ2VTdG9yZS5lbmREYXRlKCk7XG4gICAgcmV0dXJuIGRhdGUgJiYgdGhpcy5oYXNQZW5kaW5nQ2hhbmdlcygpID8gdGhpcy5mb3JtYXREYXRlKGRhdGUpIDogJyc7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRNb250aE5hbWVzID0gWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ107XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdE1vbnRoTmFtZXNTaG9ydCA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0RGF5TmFtZXMgPSBbJ1N1bmRheScsICdNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5J107XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdERheU5hbWVzU2hvcnQgPSBbJ1MnLCAnTScsICdUJywgJ1cnLCAnVCcsICdGJywgJ1MnXTtcblxuICAvLyBDb250cm9sVmFsdWVBY2Nlc3NvciBjYWxsYmFja3NcbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBEYXRlUmFuZ2UgfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgLy8gRWZmZWN0IHRvIGVtaXQgY2hhbmdlcyB3aGVuIGRhdGVzIGNoYW5nZSBpbiBzdG9yZVxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCByYW5nZSA9IHRoaXMucmFuZ2VTdG9yZS5yYW5nZSgpO1xuICAgICAgaWYgKHJhbmdlLnN0YXJ0IHx8IHJhbmdlLmVuZCkge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuZ2V0RGF0ZVJhbmdlVmFsdWUoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uQ2xpY2tPdXRzaWRlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2hvd0RhdGVQaWNrZXIoKSAmJiB0aGlzLmNsb3NlT25DbGlja091dHNpZGUpIHtcbiAgICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpO1xuICAgICAgaWYgKCFjbGlja2VkSW5zaWRlKSB7XG4gICAgICAgIHRoaXMuY2xvc2VEYXRlUGlja2VyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUtleWJvYXJkTmF2aWdhdGlvbihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVLZXlib2FyZE5hdmlnYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2hvd0RhdGVQaWNrZXIoKSkge1xuICAgICAgLy8gV2hlbiBwaWNrZXIgaXMgY2xvc2VkLCBhbGxvdyBFbnRlci9TcGFjZSB0byBvcGVuIGl0XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2RhdGVwaWNrZXItaW5wdXQnKSkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy50b2dnbGVEYXRlUGlja2VyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXaGVuIHBpY2tlciBpcyBvcGVuXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY2xvc2VEYXRlUGlja2VyKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5tb3ZlRm9jdXNWZXJ0aWNhbCgtMSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm1vdmVGb2N1c1ZlcnRpY2FsKDEpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5tb3ZlRm9jdXNIb3Jpem9udGFsKC0xKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm1vdmVGb2N1c0hvcml6b250YWwoMSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICBjYXNlICcgJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RGb2N1c2VkRGF5KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdIb21lJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5tb3ZlRm9jdXNUb0ZpcnN0RGF5KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFbmQnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm1vdmVGb2N1c1RvTGFzdERheSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnUGFnZVVwJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgdGhpcy5tb3ZlRm9jdXNZZWFyKC0xKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNoYW5nZU1vbnRoKC0xKTtcbiAgICAgICAgICB0aGlzLmFkanVzdEZvY3VzQWZ0ZXJNb250aENoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdQYWdlRG93bic6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgIHRoaXMubW92ZUZvY3VzWWVhcigxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNoYW5nZU1vbnRoKDEpO1xuICAgICAgICAgIHRoaXMuYWRqdXN0Rm9jdXNBZnRlck1vbnRoQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy8gS2V5Ym9hcmQgbmF2aWdhdGlvbiBtZXRob2RzXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUZvY3VzKCk6IHZvaWQge1xuICAgIC8vIFNldCBpbml0aWFsIGZvY3VzIHRvIHN0YXJ0IGRhdGUsIGVuZCBkYXRlLCBvciBmaXJzdCBhdmFpbGFibGUgZGF5XG4gICAgaWYgKHRoaXMuc3RhcnREYXRlKSB7XG4gICAgICBjb25zdCBpblByZXZNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aCh0aGlzLnN0YXJ0RGF0ZSwgdGhpcy5wcmV2aW91c01vbnRoKCkpO1xuICAgICAgY29uc3QgaW5DdXJyTW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgodGhpcy5zdGFydERhdGUsIHRoaXMuY3VycmVudE1vbnRoKCkpO1xuICAgICAgXG4gICAgICBpZiAoaW5QcmV2TW9udGggfHwgaW5DdXJyTW9udGgpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7IGRhdGU6IHRoaXMuc3RhcnREYXRlLCBtb250aEluZGV4OiBpblByZXZNb250aCA/IDAgOiAxIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc3RhcnREYXRlIGlzIG5vdCB2aXNpYmxlLCBmb2N1cyBvbiB0b2RheSBpZiB2aXNpYmxlXG4gICAgICAgIGNvbnN0IHRvZGF5ID0gdGhpcy5kYXRlQWRhcHRlci5mb3JtYXQodGhpcy5kYXRlQWRhcHRlci50b2RheSgpLCAneXl5eS1NTS1kZCcpO1xuICAgICAgICBjb25zdCBpbkN1cnJNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aCh0b2RheSwgdGhpcy5jdXJyZW50TW9udGgoKSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoaW5DdXJyTW9udGgpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgZGF0ZTogdG9kYXksIG1vbnRoSW5kZXg6IDEgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudE1vbnRoRGF5cyA9IHRoaXMuY3VycmVudE1vbnRoRGF5cygpO1xuICAgICAgICAgIGNvbnN0IGZpcnN0RGF5ID0gY3VycmVudE1vbnRoRGF5cy5maW5kKGRheSA9PiBkYXkuaXNDdXJyZW50TW9udGgpO1xuICAgICAgICAgIGlmIChmaXJzdERheSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7IGRhdGU6IGZpcnN0RGF5LmRhdGUsIG1vbnRoSW5kZXg6IDEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmVuZERhdGUpIHtcbiAgICAgIGNvbnN0IGluUHJldk1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKHRoaXMuZW5kRGF0ZSwgdGhpcy5wcmV2aW91c01vbnRoKCkpO1xuICAgICAgY29uc3QgaW5DdXJyTW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgodGhpcy5lbmREYXRlLCB0aGlzLmN1cnJlbnRNb250aCgpKTtcbiAgICAgIFxuICAgICAgaWYgKGluUHJldk1vbnRoIHx8IGluQ3Vyck1vbnRoKSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQoeyBkYXRlOiB0aGlzLmVuZERhdGUsIG1vbnRoSW5kZXg6IGluUHJldk1vbnRoID8gMCA6IDEgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBlbmREYXRlIGlzIG5vdCB2aXNpYmxlLCBmb2N1cyBvbiB0b2RheSBpZiB2aXNpYmxlXG4gICAgICAgIGNvbnN0IHRvZGF5ID0gdGhpcy5kYXRlQWRhcHRlci5mb3JtYXQodGhpcy5kYXRlQWRhcHRlci50b2RheSgpLCAneXl5eS1NTS1kZCcpO1xuICAgICAgICBjb25zdCBpbkN1cnJNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aCh0b2RheSwgdGhpcy5jdXJyZW50TW9udGgoKSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoaW5DdXJyTW9udGgpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgZGF0ZTogdG9kYXksIG1vbnRoSW5kZXg6IDEgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudE1vbnRoRGF5cyA9IHRoaXMuY3VycmVudE1vbnRoRGF5cygpO1xuICAgICAgICAgIGNvbnN0IGZpcnN0RGF5ID0gY3VycmVudE1vbnRoRGF5cy5maW5kKGRheSA9PiBkYXkuaXNDdXJyZW50TW9udGgpO1xuICAgICAgICAgIGlmIChmaXJzdERheSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7IGRhdGU6IGZpcnN0RGF5LmRhdGUsIG1vbnRoSW5kZXg6IDEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvY3VzIG9uIHRvZGF5IGlmIHZpc2libGUsIG90aGVyd2lzZSBmaXJzdCBkYXkgb2YgY3VycmVudCBtb250aFxuICAgICAgY29uc3QgdG9kYXkgPSB0aGlzLmRhdGVBZGFwdGVyLmZvcm1hdCh0aGlzLmRhdGVBZGFwdGVyLnRvZGF5KCksICd5eXl5LU1NLWRkJyk7XG4gICAgICBjb25zdCBpbkN1cnJNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aCh0b2RheSwgdGhpcy5jdXJyZW50TW9udGgoKSk7XG4gICAgICBcbiAgICAgIGlmIChpbkN1cnJNb250aCkge1xuICAgICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgZGF0ZTogdG9kYXksIG1vbnRoSW5kZXg6IDEgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUb2RheSBpcyBub3QgaW4gY3VycmVudCBtb250aCwgZm9jdXMgb24gZmlyc3QgZGF5IG9mIGN1cnJlbnQgbW9udGhcbiAgICAgICAgY29uc3QgY3VycmVudE1vbnRoRGF5cyA9IHRoaXMuY3VycmVudE1vbnRoRGF5cygpO1xuICAgICAgICBjb25zdCBmaXJzdERheSA9IGN1cnJlbnRNb250aERheXMuZmluZChkYXkgPT4gZGF5LmlzQ3VycmVudE1vbnRoKTtcbiAgICAgICAgaWYgKGZpcnN0RGF5KSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7IGRhdGU6IGZpcnN0RGF5LmRhdGUsIG1vbnRoSW5kZXg6IDEgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzRGF0ZUluTW9udGgoZGF0ZVN0cjogc3RyaW5nLCBtb250aERhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlQWRhcHRlci5wYXJzZShkYXRlU3RyKTtcbiAgICBpZiAoIWRhdGUpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB5ZWFyID0gdGhpcy5kYXRlQWRhcHRlci5nZXRZZWFyKGRhdGUpO1xuICAgIGNvbnN0IG1vbnRoID0gdGhpcy5kYXRlQWRhcHRlci5nZXRNb250aChkYXRlKTtcbiAgICBjb25zdCBtb250aFllYXIgPSB0aGlzLmRhdGVBZGFwdGVyLmdldFllYXIobW9udGhEYXRlKTtcbiAgICBjb25zdCBtb250aE1vbnRoID0gdGhpcy5kYXRlQWRhcHRlci5nZXRNb250aChtb250aERhdGUpO1xuICAgIHJldHVybiB5ZWFyID09PSBtb250aFllYXIgJiYgbW9udGggPT09IG1vbnRoTW9udGg7XG4gIH1cblxuICBwcml2YXRlIG1vdmVGb2N1c0hvcml6b250YWwoZGlyZWN0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmb2N1c2VkID0gdGhpcy5mb2N1c2VkRGF5KCk7XG4gICAgaWYgKCFmb2N1c2VkKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVGb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnREYXRlID0gdGhpcy5kYXRlQWRhcHRlci5wYXJzZShmb2N1c2VkLmRhdGUpO1xuICAgIGlmICghY3VycmVudERhdGUpIHJldHVybjtcblxuICAgIGNvbnN0IG5ld0RhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLmFkZERheXMoY3VycmVudERhdGUsIGRpcmVjdGlvbik7XG4gICAgY29uc3QgbmV3RGF0ZVN0ciA9IHRoaXMuZm9ybWF0RGF0ZShuZXdEYXRlKTtcblxuICAgIC8vIERldGVybWluZSB3aGljaCBtb250aCB0aGUgbmV3IGRhdGUgYmVsb25ncyB0b1xuICAgIGxldCBpblByZXZNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aChuZXdEYXRlU3RyLCB0aGlzLnByZXZpb3VzTW9udGgoKSk7XG4gICAgbGV0IGluQ3Vyck1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKG5ld0RhdGVTdHIsIHRoaXMuY3VycmVudE1vbnRoKCkpO1xuXG4gICAgaWYgKGluUHJldk1vbnRoIHx8IGluQ3Vyck1vbnRoKSB7XG4gICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgXG4gICAgICAgIGRhdGU6IG5ld0RhdGVTdHIsIFxuICAgICAgICBtb250aEluZGV4OiBpblByZXZNb250aCA/IDAgOiAxIFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERhdGUgaXMgb3V0c2lkZSB2aXNpYmxlIG1vbnRocywgbmF2aWdhdGUgbW9udGhcbiAgICAgIGlmIChkaXJlY3Rpb24gPiAwKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlTW9udGgoMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNoYW5nZU1vbnRoKC0xKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUmVjYWxjdWxhdGUgYWZ0ZXIgbW9udGggY2hhbmdlXG4gICAgICBpblByZXZNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aChuZXdEYXRlU3RyLCB0aGlzLnByZXZpb3VzTW9udGgoKSk7XG4gICAgICBpbkN1cnJNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aChuZXdEYXRlU3RyLCB0aGlzLmN1cnJlbnRNb250aCgpKTtcbiAgICAgIFxuICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7IFxuICAgICAgICBkYXRlOiBuZXdEYXRlU3RyLCBcbiAgICAgICAgbW9udGhJbmRleDogaW5QcmV2TW9udGggPyAwIDogKGluQ3Vyck1vbnRoID8gMSA6IDApXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1vdmVGb2N1c1ZlcnRpY2FsKGRpcmVjdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZm9jdXNlZCA9IHRoaXMuZm9jdXNlZERheSgpO1xuICAgIGlmICghZm9jdXNlZCkge1xuICAgICAgdGhpcy5pbml0aWFsaXplRm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50RGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIucGFyc2UoZm9jdXNlZC5kYXRlKTtcbiAgICBpZiAoIWN1cnJlbnREYXRlKSByZXR1cm47XG5cbiAgICBjb25zdCBuZXdEYXRlID0gdGhpcy5kYXRlQWRhcHRlci5hZGREYXlzKGN1cnJlbnREYXRlLCBkaXJlY3Rpb24gKiA3KTsgLy8gTW92ZSBieSB3ZWVrXG4gICAgY29uc3QgbmV3RGF0ZVN0ciA9IHRoaXMuZm9ybWF0RGF0ZShuZXdEYXRlKTtcblxuICAgIGxldCBpblByZXZNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aChuZXdEYXRlU3RyLCB0aGlzLnByZXZpb3VzTW9udGgoKSk7XG4gICAgbGV0IGluQ3Vyck1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKG5ld0RhdGVTdHIsIHRoaXMuY3VycmVudE1vbnRoKCkpO1xuXG4gICAgaWYgKGluUHJldk1vbnRoIHx8IGluQ3Vyck1vbnRoKSB7XG4gICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgXG4gICAgICAgIGRhdGU6IG5ld0RhdGVTdHIsIFxuICAgICAgICBtb250aEluZGV4OiBpblByZXZNb250aCA/IDAgOiAxIFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5hdmlnYXRlIHRvIG1vbnRoIGNvbnRhaW5pbmcgdGhlIG5ldyBkYXRlXG4gICAgICBpZiAoZGlyZWN0aW9uID4gMCkge1xuICAgICAgICB0aGlzLmNoYW5nZU1vbnRoKDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VNb250aCgtMSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFJlY2FsY3VsYXRlIGFmdGVyIG1vbnRoIGNoYW5nZVxuICAgICAgaW5QcmV2TW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgobmV3RGF0ZVN0ciwgdGhpcy5wcmV2aW91c01vbnRoKCkpO1xuICAgICAgaW5DdXJyTW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgobmV3RGF0ZVN0ciwgdGhpcy5jdXJyZW50TW9udGgoKSk7XG4gICAgICBcbiAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQoeyBcbiAgICAgICAgZGF0ZTogbmV3RGF0ZVN0ciwgXG4gICAgICAgIG1vbnRoSW5kZXg6IGluUHJldk1vbnRoID8gMCA6IChpbkN1cnJNb250aCA/IDEgOiAwKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlRm9jdXNUb0ZpcnN0RGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IHByZXZNb250aERheXMgPSB0aGlzLnByZXZpb3VzTW9udGhEYXlzKCk7XG4gICAgY29uc3QgZmlyc3REYXkgPSBwcmV2TW9udGhEYXlzLmZpbmQoZGF5ID0+IGRheS5pc0N1cnJlbnRNb250aCk7XG4gICAgaWYgKGZpcnN0RGF5KSB7XG4gICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgZGF0ZTogZmlyc3REYXkuZGF0ZSwgbW9udGhJbmRleDogMCB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1vdmVGb2N1c1RvTGFzdERheSgpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyTW9udGhEYXlzID0gdGhpcy5jdXJyZW50TW9udGhEYXlzKCk7XG4gICAgY29uc3QgdmFsaWREYXlzID0gY3Vyck1vbnRoRGF5cy5maWx0ZXIoZGF5ID0+IGRheS5pc0N1cnJlbnRNb250aCk7XG4gICAgY29uc3QgbGFzdERheSA9IHZhbGlkRGF5c1t2YWxpZERheXMubGVuZ3RoIC0gMV07XG4gICAgaWYgKGxhc3REYXkpIHtcbiAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQoeyBkYXRlOiBsYXN0RGF5LmRhdGUsIG1vbnRoSW5kZXg6IDEgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlRm9jdXNZZWFyKGRpcmVjdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZm9jdXNlZCA9IHRoaXMuZm9jdXNlZERheSgpO1xuICAgIGlmICghZm9jdXNlZCkge1xuICAgICAgdGhpcy5pbml0aWFsaXplRm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50RGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIucGFyc2UoZm9jdXNlZC5kYXRlKTtcbiAgICBpZiAoIWN1cnJlbnREYXRlKSByZXR1cm47XG5cbiAgICBjb25zdCBjdXJyZW50WWVhciA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhcihjdXJyZW50RGF0ZSk7XG4gICAgY29uc3QgY3VycmVudE1vbnRoID0gdGhpcy5kYXRlQWRhcHRlci5nZXRNb250aChjdXJyZW50RGF0ZSk7XG4gICAgY29uc3QgY3VycmVudERheSA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0RGF0ZShjdXJyZW50RGF0ZSk7XG4gICAgXG4gICAgY29uc3QgbmV3RGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShjdXJyZW50WWVhciArIGRpcmVjdGlvbiwgY3VycmVudE1vbnRoLCBjdXJyZW50RGF5KTtcbiAgICBjb25zdCBuZXdEYXRlU3RyID0gdGhpcy5mb3JtYXREYXRlKG5ld0RhdGUpO1xuXG4gICAgLy8gVXBkYXRlIG1vbnRocyB0byBzaG93IHRoZSBuZXcgeWVhclxuICAgIHRoaXMuY3VycmVudE1vbnRoLnNldCh0aGlzLmRhdGVBZGFwdGVyLmNyZWF0ZURhdGUoY3VycmVudFllYXIgKyBkaXJlY3Rpb24sIGN1cnJlbnRNb250aCwgMSkpO1xuICAgIHRoaXMucHJldmlvdXNNb250aC5zZXQodGhpcy5kYXRlQWRhcHRlci5jcmVhdGVEYXRlKGN1cnJlbnRZZWFyICsgZGlyZWN0aW9uLCBjdXJyZW50TW9udGggLSAxLCAxKSk7XG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFycygpO1xuXG4gICAgY29uc3QgaW5QcmV2TW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgobmV3RGF0ZVN0ciwgdGhpcy5wcmV2aW91c01vbnRoKCkpO1xuICAgIHRoaXMuZm9jdXNlZERheS5zZXQoeyBcbiAgICAgIGRhdGU6IG5ld0RhdGVTdHIsIFxuICAgICAgbW9udGhJbmRleDogaW5QcmV2TW9udGggPyAwIDogMSBcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRqdXN0Rm9jdXNBZnRlck1vbnRoQ2hhbmdlKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvY3VzZWQgPSB0aGlzLmZvY3VzZWREYXkoKTtcbiAgICBpZiAoIWZvY3VzZWQpIHJldHVybjtcblxuICAgIGNvbnN0IGluUHJldk1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKGZvY3VzZWQuZGF0ZSwgdGhpcy5wcmV2aW91c01vbnRoKCkpO1xuICAgIGNvbnN0IGluQ3Vyck1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKGZvY3VzZWQuZGF0ZSwgdGhpcy5jdXJyZW50TW9udGgoKSk7XG5cbiAgICBpZiAoIWluUHJldk1vbnRoICYmICFpbkN1cnJNb250aCkge1xuICAgICAgLy8gRm9jdXNlZCBkYXkgaXMgbm8gbG9uZ2VyIHZpc2libGUsIG1vdmUgdG8gZXF1aXZhbGVudCBkYXkgaW4gdmlzaWJsZSBtb250aHNcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZSBtb250aCBpbmRleCBpZiBuZWVkZWRcbiAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQoe1xuICAgICAgICBkYXRlOiBmb2N1c2VkLmRhdGUsXG4gICAgICAgIG1vbnRoSW5kZXg6IGluUHJldk1vbnRoID8gMCA6IDFcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0Rm9jdXNlZERheSgpOiB2b2lkIHtcbiAgICBjb25zdCBmb2N1c2VkID0gdGhpcy5mb2N1c2VkRGF5KCk7XG4gICAgaWYgKCFmb2N1c2VkKSByZXR1cm47XG5cbiAgICBjb25zdCBtb250aERheXMgPSBmb2N1c2VkLm1vbnRoSW5kZXggPT09IDAgPyB0aGlzLnByZXZpb3VzTW9udGhEYXlzKCkgOiB0aGlzLmN1cnJlbnRNb250aERheXMoKTtcbiAgICBjb25zdCBkYXlPYmogPSBtb250aERheXMuZmluZChkYXkgPT4gZGF5LmRhdGUgPT09IGZvY3VzZWQuZGF0ZSAmJiBkYXkuaXNDdXJyZW50TW9udGgpO1xuICAgIFxuICAgIGlmIChkYXlPYmopIHtcbiAgICAgIHRoaXMuc2VsZWN0RGF5KGRheU9iaik7XG4gICAgfVxuICB9XG5cbiAgaGFzS2V5Ym9hcmRGb2N1cyhkYXRlOiBzdHJpbmcsIG1vbnRoSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZvY3VzZWQgPSB0aGlzLmZvY3VzZWREYXkoKTtcbiAgICByZXR1cm4gZm9jdXNlZCAhPT0gbnVsbCAmJiBmb2N1c2VkLmRhdGUgPT09IGRhdGUgJiYgZm9jdXNlZC5tb250aEluZGV4ID09PSBtb250aEluZGV4O1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gQ29uZmlndXJlIHRoZSBoZWFkbGVzcyBzdG9yZVxuICAgIHRoaXMucmFuZ2VTdG9yZS5jb25maWd1cmUoe1xuICAgICAgZW5hYmxlVGltZVBpY2tlcjogdGhpcy5lbmFibGVUaW1lUGlja2VyLFxuICAgICAgZGVmYXVsdFN0YXJ0VGltZTogdGhpcy5kZWZhdWx0U3RhcnRUaW1lLFxuICAgICAgZGVmYXVsdEVuZFRpbWU6IHRoaXMuZGVmYXVsdEVuZFRpbWUsXG4gICAgICBkaXNhYmxlZERhdGVzOiB0aGlzLmRpc2FibGVkRGF0ZXNcbiAgICB9KTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGRhdGVzIGluIHN0b3JlIGlmIHByb3ZpZGVkXG4gICAgaWYgKHRoaXMuc3RhcnREYXRlKSB7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlQWRhcHRlci5wYXJzZSh0aGlzLnN0YXJ0RGF0ZSk7XG4gICAgICBpZiAoZGF0ZSkgdGhpcy5yYW5nZVN0b3JlLnNldFN0YXJ0KGRhdGUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5lbmREYXRlKSB7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlQWRhcHRlci5wYXJzZSh0aGlzLmVuZERhdGUpO1xuICAgICAgaWYgKGRhdGUpIHRoaXMucmFuZ2VTdG9yZS5zZXRFbmQoZGF0ZSk7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLnN0YXJ0RGF0ZSAmJiB0aGlzLmVuZERhdGUpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3N0YXJ0RGF0ZSddIHx8IGNoYW5nZXNbJ2VuZERhdGUnXSkge1xuICAgICAgLy8gU3luYyB3aXRoIHN0b3JlXG4gICAgICBpZiAoY2hhbmdlc1snc3RhcnREYXRlJ10gJiYgdGhpcy5zdGFydERhdGUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIucGFyc2UodGhpcy5zdGFydERhdGUpO1xuICAgICAgICBpZiAoZGF0ZSkgdGhpcy5yYW5nZVN0b3JlLnNldFN0YXJ0KGRhdGUpO1xuICAgICAgfVxuICAgICAgaWYgKGNoYW5nZXNbJ2VuZERhdGUnXSAmJiB0aGlzLmVuZERhdGUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIucGFyc2UodGhpcy5lbmREYXRlKTtcbiAgICAgICAgaWYgKGRhdGUpIHRoaXMucmFuZ2VTdG9yZS5zZXRFbmQoZGF0ZSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICh0aGlzLnN0YXJ0RGF0ZSAmJiB0aGlzLmVuZERhdGUpIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFycygpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBVcGRhdGUgc3RvcmUgY29uZmlndXJhdGlvbiBpZiByZWxldmFudCBpbnB1dHMgY2hhbmdlXG4gICAgaWYgKGNoYW5nZXNbJ2VuYWJsZVRpbWVQaWNrZXInXSB8fCBjaGFuZ2VzWydkZWZhdWx0U3RhcnRUaW1lJ10gfHwgXG4gICAgICAgIGNoYW5nZXNbJ2RlZmF1bHRFbmRUaW1lJ10gfHwgY2hhbmdlc1snZGlzYWJsZWREYXRlcyddKSB7XG4gICAgICB0aGlzLnJhbmdlU3RvcmUuY29uZmlndXJlKHtcbiAgICAgICAgZW5hYmxlVGltZVBpY2tlcjogdGhpcy5lbmFibGVUaW1lUGlja2VyLFxuICAgICAgICBkZWZhdWx0U3RhcnRUaW1lOiB0aGlzLmRlZmF1bHRTdGFydFRpbWUsXG4gICAgICAgIGRlZmF1bHRFbmRUaW1lOiB0aGlzLmRlZmF1bHRFbmRUaW1lLFxuICAgICAgICBkaXNhYmxlZERhdGVzOiB0aGlzLmRpc2FibGVkRGF0ZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgeWVhciA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKTtcbiAgICBjb25zdCBtb250aCA9IFN0cmluZyh0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoKGRhdGUpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBkYXkgPSBTdHJpbmcodGhpcy5kYXRlQWRhcHRlci5nZXREYXRlKGRhdGUpKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1gO1xuICB9XG5cbiAgZm9ybWF0RGF0ZURpc3BsYXkoZGF0ZVN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWRhdGVTdHIpIHJldHVybiAnJztcbiAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlQWRhcHRlci5wYXJzZShkYXRlU3RyKTtcbiAgICBpZiAoIWRhdGUpIHJldHVybiAnJztcbiAgICBcbiAgICBjb25zdCB5ZWFyID0gdGhpcy5kYXRlQWRhcHRlci5nZXRZZWFyKGRhdGUpO1xuICAgIGNvbnN0IG1vbnRoID0gdGhpcy5kYXRlQWRhcHRlci5nZXRNb250aChkYXRlKTtcbiAgICBjb25zdCBkYXkgPSB0aGlzLmRhdGVBZGFwdGVyLmdldERhdGUoZGF0ZSk7XG4gICAgXG4gICAgY29uc3QgbW9udGhOYW1lcyA9IHRoaXMubG9jYWxlLm1vbnRoTmFtZXMgfHwgdGhpcy5kZWZhdWx0TW9udGhOYW1lcztcbiAgICBjb25zdCBtb250aE5hbWVzU2hvcnQgPSB0aGlzLmxvY2FsZS5tb250aE5hbWVzU2hvcnQgfHwgdGhpcy5kZWZhdWx0TW9udGhOYW1lc1Nob3J0O1xuICAgIFxuICAgIC8vIFJlcGxhY2UgZm9ybWF0IHRva2VucyB3aXRoIHZhbHVlc1xuICAgIGxldCBmb3JtYXR0ZWQgPSB0aGlzLmRpc3BsYXlGb3JtYXQ7XG4gICAgXG4gICAgLy8gWWVhciB0b2tlbnNcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvWVlZWS9nLCBTdHJpbmcoeWVhcikpO1xuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9ZWS9nLCBTdHJpbmcoeWVhcikuc2xpY2UoLTIpKTtcbiAgICBcbiAgICAvLyBNb250aCB0b2tlbnMgKG9yZGVyIG1hdHRlcnM6IE1NTU0gYmVmb3JlIE1NTSBiZWZvcmUgTU0gYmVmb3JlIE0pXG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL01NTU0vZywgbW9udGhOYW1lc1ttb250aF0pO1xuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9NTU0vZywgbW9udGhOYW1lc1Nob3J0W21vbnRoXSk7XG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL01NL2csIFN0cmluZyhtb250aCArIDEpLnBhZFN0YXJ0KDIsICcwJykpO1xuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9NL2csIFN0cmluZyhtb250aCArIDEpKTtcbiAgICBcbiAgICAvLyBEYXkgdG9rZW5zIChvcmRlciBtYXR0ZXJzOiBERCBiZWZvcmUgRClcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvREQvZywgU3RyaW5nKGRheSkucGFkU3RhcnQoMiwgJzAnKSk7XG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL0QvZywgU3RyaW5nKGRheSkpO1xuICAgIFxuICAgIHJldHVybiBmb3JtYXR0ZWQ7XG4gIH1cblxuICAvLyBOb3RlOiB1cGRhdGVEYXRlUmFuZ2VUZXh0IGlzIG5vdyBoYW5kbGVkIGJ5IGNvbXB1dGVkIGRhdGVSYW5nZVRleHQgZnJvbSBzdG9yZVxuICAvLyBLZWVwaW5nIHRoaXMgbWV0aG9kIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGJ1dCBpdCdzIGEgbm8tb3BcbiAgdXBkYXRlRGF0ZVJhbmdlVGV4dCgpOiB2b2lkIHtcbiAgICAvLyBUZXh0IGlzIG5vdyBhdXRvbWF0aWNhbGx5IGNvbXB1dGVkIGZyb20gc3RvcmUucmFuZ2VUZXh0KClcbiAgfVxuXG4gIHRvZ2dsZURhdGVQaWNrZXIoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93RGF0ZVBpY2tlci51cGRhdGUodmFsdWUgPT4gIXZhbHVlKTtcbiAgICBpZiAodGhpcy5zaG93RGF0ZVBpY2tlcigpKSB7XG4gICAgICAvLyBzZWxlY3RpbmdTdGFydCBpcyBtYW5hZ2VkIGJ5IHN0b3JlLCBubyBuZWVkIHRvIHNldCBoZXJlXG4gICAgICBjb25zdCBjdXJyZW50TW9udGhWYWx1ZSA9IHRoaXMuY3VycmVudE1vbnRoKCk7XG4gICAgICBjb25zdCB5ZWFyID0gdGhpcy5kYXRlQWRhcHRlci5nZXRZZWFyKGN1cnJlbnRNb250aFZhbHVlKTtcbiAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5kYXRlQWRhcHRlci5nZXRNb250aChjdXJyZW50TW9udGhWYWx1ZSk7XG4gICAgICBjb25zdCBwcmV2aW91c01vbnRoRGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCAtIDEsIDEpO1xuICAgICAgdGhpcy5wcmV2aW91c01vbnRoLnNldChwcmV2aW91c01vbnRoRGF0ZSk7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG4gICAgICAvLyBJbml0aWFsaXplIGtleWJvYXJkIGZvY3VzIG9ubHkgaWYga2V5Ym9hcmQgbmF2aWdhdGlvbiBpcyBlbmFibGVkXG4gICAgICBpZiAodGhpcy5lbmFibGVLZXlib2FyZE5hdmlnYXRpb24pIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplRm9jdXMoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2xlYXIgZm9jdXMgd2hlbiBjbG9zaW5nXG4gICAgICBpZiAodGhpcy5lbmFibGVLZXlib2FyZE5hdmlnYXRpb24pIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldChudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgfVxuXG4gIGNsb3NlRGF0ZVBpY2tlcigpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dEYXRlUGlja2VyLnNldChmYWxzZSk7XG4gICAgaWYgKHRoaXMuZW5hYmxlS2V5Ym9hcmROYXZpZ2F0aW9uKSB7XG4gICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KG51bGwpO1xuICAgIH1cbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgZ2VuZXJhdGVDYWxlbmRhcnMoKTogdm9pZCB7XG4gICAgdGhpcy5wcmV2aW91c01vbnRoRGF5cy5zZXQodGhpcy5nZW5lcmF0ZU1vbnRoQ2FsZW5kYXIodGhpcy5wcmV2aW91c01vbnRoKCkpKTtcbiAgICB0aGlzLmN1cnJlbnRNb250aERheXMuc2V0KHRoaXMuZ2VuZXJhdGVNb250aENhbGVuZGFyKHRoaXMuY3VycmVudE1vbnRoKCkpKTtcbiAgfVxuXG4gIGdlbmVyYXRlTW9udGhDYWxlbmRhcihkYXRlOiBEYXRlKTogYW55W10ge1xuICAgIGNvbnN0IHllYXIgPSB0aGlzLmRhdGVBZGFwdGVyLmdldFllYXIoZGF0ZSk7XG4gICAgY29uc3QgbW9udGggPSB0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoKGRhdGUpO1xuICAgIGNvbnN0IGZpcnN0RGF5ID0gdGhpcy5kYXRlQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoLCAxKTtcbiAgICBjb25zdCBsYXN0RGF5ID0gdGhpcy5kYXRlQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoICsgMSwgMCk7XG4gICAgY29uc3QgZGF5c0luTW9udGggPSB0aGlzLmRhdGVBZGFwdGVyLmdldERhdGUobGFzdERheSk7XG4gICAgY29uc3QgZmlyc3REYXlPZldlZWsgPSB0aGlzLmRhdGVBZGFwdGVyLmdldERheShmaXJzdERheSk7XG5cbiAgICBjb25zdCBtb250aERheXMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlyc3REYXlPZldlZWs7IGkrKykge1xuICAgICAgbW9udGhEYXlzLnB1c2goeyBkYXk6IG51bGwsIGlzQ3VycmVudE1vbnRoOiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBkYXkgPSAxOyBkYXkgPD0gZGF5c0luTW9udGg7IGRheSsrKSB7XG4gICAgICBjb25zdCBkYXlEYXRlID0gdGhpcy5kYXRlQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoLCBkYXkpO1xuICAgICAgY29uc3QgZGF0ZVN0ciA9IHRoaXMuZm9ybWF0RGF0ZShkYXlEYXRlKTtcbiAgICAgIFxuICAgICAgIC8vIEdldCBwZW5kaW5nIGRhdGVzIGZyb20gc3RvcmUgKGZvciByZXF1aXJlQXBwbHkgbW9kZSlcbiAgICAgIGNvbnN0IHBlbmRpbmdTdGFydCA9IHRoaXMucmFuZ2VTdG9yZS5zdGFydERhdGUoKTsgLy8gSW4gcGVuZGluZyBtb2RlLCBzdG9yZSBob2xkcyBwZW5kaW5nIHZhbHVlc1xuICAgICAgY29uc3QgcGVuZGluZ0VuZCA9IHRoaXMucmFuZ2VTdG9yZS5lbmREYXRlKCk7XG4gICAgICBjb25zdCBwZW5kaW5nU3RhcnRTdHIgPSBwZW5kaW5nU3RhcnQgPyB0aGlzLmZvcm1hdERhdGUocGVuZGluZ1N0YXJ0KSA6ICcnO1xuICAgICAgY29uc3QgcGVuZGluZ0VuZFN0ciA9IHBlbmRpbmdFbmQgPyB0aGlzLmZvcm1hdERhdGUocGVuZGluZ0VuZCkgOiAnJztcbiAgICAgIFxuICAgICAgY29uc3QgaXNQZW5kaW5nU3RhcnQgPSB0aGlzLnJlcXVpcmVBcHBseSAmJiBwZW5kaW5nU3RhcnRTdHIgPT09IGRhdGVTdHI7XG4gICAgICBjb25zdCBpc1BlbmRpbmdFbmQgPSB0aGlzLnJlcXVpcmVBcHBseSAmJiBwZW5kaW5nRW5kU3RyID09PSBkYXRlU3RyO1xuICAgICAgY29uc3QgaW5QZW5kaW5nUmFuZ2UgPSB0aGlzLnJlcXVpcmVBcHBseSAmJiBwZW5kaW5nU3RhcnRTdHIgJiYgcGVuZGluZ0VuZFN0ciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlU3RyID49IHBlbmRpbmdTdGFydFN0ciAmJiBkYXRlU3RyIDw9IHBlbmRpbmdFbmRTdHI7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGRhdGUgaXMgaW4gaG92ZXIgcHJldmlldyByYW5nZVxuICAgICAgY29uc3QgaW5Ib3ZlclJhbmdlID0gdGhpcy5pc0luSG92ZXJSYW5nZShkYXRlU3RyKTtcbiAgICAgIFxuICAgICAgbW9udGhEYXlzLnB1c2goe1xuICAgICAgICBkYXk6IGRheSxcbiAgICAgICAgZGF0ZTogZGF0ZVN0cixcbiAgICAgICAgaXNDdXJyZW50TW9udGg6IHRydWUsXG4gICAgICAgIGlzU3RhcnQ6IHRoaXMuc3RhcnREYXRlID09PSBkYXRlU3RyIHx8IGlzUGVuZGluZ1N0YXJ0LFxuICAgICAgICBpc0VuZDogdGhpcy5lbmREYXRlID09PSBkYXRlU3RyIHx8IGlzUGVuZGluZ0VuZCxcbiAgICAgICAgaW5SYW5nZTogdGhpcy5pc0luUmFuZ2UoZGF0ZVN0cikgfHwgaW5QZW5kaW5nUmFuZ2UsXG4gICAgICAgIGluSG92ZXJSYW5nZTogaW5Ib3ZlclJhbmdlLFxuICAgICAgICBpc0Rpc2FibGVkOiB0aGlzLmlzRGF0ZURpc2FibGVkKGRheURhdGUpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW9udGhEYXlzO1xuICB9XG5cbiAgaXNJblJhbmdlKGRhdGVTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm11bHRpUmFuZ2UpIHtcbiAgICAgIC8vIENoZWNrIGlmIGRhdGUgaXMgaW4gYW55IG9mIHRoZSBzZWxlY3RlZCByYW5nZXNcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkUmFuZ2VzKCkuc29tZShyYW5nZSA9PiB7XG4gICAgICAgIHJldHVybiBkYXRlU3RyID49IHJhbmdlLnN0YXJ0RGF0ZSAmJiBkYXRlU3RyIDw9IHJhbmdlLmVuZERhdGU7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLnN0YXJ0RGF0ZSB8fCAhdGhpcy5lbmREYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gZGF0ZVN0ciA+PSB0aGlzLnN0YXJ0RGF0ZSAmJiBkYXRlU3RyIDw9IHRoaXMuZW5kRGF0ZTtcbiAgICB9XG4gIH1cblxuICBpc0RhdGVEaXNhYmxlZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkRGF0ZXMpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0eXBlb2YgdGhpcy5kaXNhYmxlZERhdGVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBJZiBpdCdzIGEgZnVuY3Rpb24sIGNhbGwgaXQgd2l0aCB0aGUgZGF0ZVxuICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWREYXRlcyhkYXRlKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kaXNhYmxlZERhdGVzKSkge1xuICAgICAgLy8gSWYgaXQncyBhbiBhcnJheSwgY2hlY2sgaWYgdGhlIGRhdGUgbWF0Y2hlcyBhbnkgZGlzYWJsZWQgZGF0ZVxuICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWREYXRlcy5zb21lKGRpc2FibGVkRGF0ZSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVBZGFwdGVyLmdldFllYXIoZGF0ZSkgPT09IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkaXNhYmxlZERhdGUpICYmXG4gICAgICAgICAgICAgICB0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoKGRhdGUpID09PSB0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoKGRpc2FibGVkRGF0ZSkgJiZcbiAgICAgICAgICAgICAgIHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0RGF0ZShkYXRlKSA9PT0gdGhpcy5kYXRlQWRhcHRlci5nZXREYXRlKGRpc2FibGVkRGF0ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaXNJbkhvdmVyUmFuZ2UoZGF0ZVN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaG92ZXIgPSB0aGlzLmhvdmVyRGF0ZSgpO1xuICAgIGlmICghaG92ZXIpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIEluIG11bHRpUmFuZ2UgbW9kZSwgb25seSBzaG93IGhvdmVyIHByZXZpZXcgd2hlbiBzZWxlY3RpbmcgZW5kIGRhdGVcbiAgICBpZiAodGhpcy5tdWx0aVJhbmdlKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RpbmdTdGFydERhdGUoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgY3VycmVudFN0YXJ0ID0gdGhpcy5zdGFydERhdGU7XG4gICAgICBpZiAoIWN1cnJlbnRTdGFydCkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgbWluRGF0ZSA9IGN1cnJlbnRTdGFydCA8IGhvdmVyID8gY3VycmVudFN0YXJ0IDogaG92ZXI7XG4gICAgICBjb25zdCBtYXhEYXRlID0gY3VycmVudFN0YXJ0ID4gaG92ZXIgPyBjdXJyZW50U3RhcnQgOiBob3ZlcjtcbiAgICAgIHJldHVybiBkYXRlU3RyID49IG1pbkRhdGUgJiYgZGF0ZVN0ciA8PSBtYXhEYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbiBzaW5nbGUgcmFuZ2UgbW9kZSAgXG4gICAgICBpZiAodGhpcy5zZWxlY3RpbmdTdGFydERhdGUoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgXG4gICAgICBpZiAodGhpcy5yZXF1aXJlQXBwbHkpIHtcbiAgICAgICAgLy8gVXNlIHBlbmRpbmcgZGF0ZXMgZnJvbSBzdG9yZVxuICAgICAgICBjb25zdCBwZW5kaW5nU3RhcnQgPSB0aGlzLnJhbmdlU3RvcmUuc3RhcnREYXRlKCk7XG4gICAgICAgIGlmICghcGVuZGluZ1N0YXJ0KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHBlbmRpbmdTdGFydFN0ciA9IHRoaXMuZm9ybWF0RGF0ZShwZW5kaW5nU3RhcnQpO1xuICAgICAgICBjb25zdCBtaW5EYXRlID0gcGVuZGluZ1N0YXJ0U3RyIDwgaG92ZXIgPyBwZW5kaW5nU3RhcnRTdHIgOiBob3ZlcjtcbiAgICAgICAgY29uc3QgbWF4RGF0ZSA9IHBlbmRpbmdTdGFydFN0ciA+IGhvdmVyID8gcGVuZGluZ1N0YXJ0U3RyIDogaG92ZXI7XG4gICAgICAgIHJldHVybiBkYXRlU3RyID49IG1pbkRhdGUgJiYgZGF0ZVN0ciA8PSBtYXhEYXRlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXNlIGFjdHVhbCBkYXRlc1xuICAgICAgICBjb25zdCBjdXJyZW50U3RhcnQgPSB0aGlzLnN0YXJ0RGF0ZTtcbiAgICAgICAgaWYgKCFjdXJyZW50U3RhcnQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgbWluRGF0ZSA9IGN1cnJlbnRTdGFydCA8IGhvdmVyID8gY3VycmVudFN0YXJ0IDogaG92ZXI7XG4gICAgICAgIGNvbnN0IG1heERhdGUgPSBjdXJyZW50U3RhcnQgPiBob3ZlciA/IGN1cnJlbnRTdGFydCA6IGhvdmVyO1xuICAgICAgICByZXR1cm4gZGF0ZVN0ciA+PSBtaW5EYXRlICYmIGRhdGVTdHIgPD0gbWF4RGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkRheUhvdmVyKGRheU9iajogYW55KTogdm9pZCB7XG4gICAgaWYgKCFkYXlPYmouaXNDdXJyZW50TW9udGggfHwgdGhpcy5pc0Rpc2FibGVkKCkgfHwgZGF5T2JqLmlzRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuaG92ZXJEYXRlLnNldChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ob3ZlckRhdGUuc2V0KGRheU9iai5kYXRlKTtcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG4gIH1cblxuICBjbGVhckRheUhvdmVyKCk6IHZvaWQge1xuICAgIHRoaXMuaG92ZXJEYXRlLnNldChudWxsKTtcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG4gIH1cblxuICBzZWxlY3REYXkoZGF5T2JqOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWRheU9iai5pc0N1cnJlbnRNb250aCB8fCB0aGlzLmlzRGlzYWJsZWQoKSB8fCBkYXlPYmouaXNEaXNhYmxlZCkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IHNlbGVjdGVkRGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIucGFyc2UoZGF5T2JqLmRhdGUpO1xuICAgIGlmICghc2VsZWN0ZWREYXRlKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5tdWx0aVJhbmdlKSB7XG4gICAgICAvLyBNdWx0aS1yYW5nZSBtb2RlOiBhZGQgcmFuZ2VzIHRvIGFycmF5XG4gICAgICBpZiAodGhpcy5zZWxlY3RpbmdTdGFydERhdGUoKSkge1xuICAgICAgICB0aGlzLnJhbmdlU3RvcmUuc2V0U3RhcnQoc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgdGhpcy5yYW5nZVN0b3JlLnNldEVuZChudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGFydCA9IHRoaXMucmFuZ2VTdG9yZS5zdGFydERhdGUoKTtcbiAgICAgICAgaWYgKGN1cnJlbnRTdGFydCAmJiBzZWxlY3RlZERhdGUgPCBjdXJyZW50U3RhcnQpIHtcbiAgICAgICAgICAvLyBTd2FwOiBzZWxlY3RlZCBiZWNvbWVzIHN0YXJ0LCBjdXJyZW50IHN0YXJ0IGJlY29tZXMgZW5kXG4gICAgICAgICAgdGhpcy5yYW5nZVN0b3JlLnNldFN0YXJ0KHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgdGhpcy5yYW5nZVN0b3JlLnNldEVuZChjdXJyZW50U3RhcnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmFuZ2VTdG9yZS5zZXRFbmQoc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQWRkIHRoZSBuZXcgcmFuZ2UgdG8gdGhlIGFycmF5XG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5yYW5nZVN0b3JlLnJhbmdlKCk7XG4gICAgICAgIGNvbnN0IG5ld1JhbmdlOiBEYXRlUmFuZ2UgPSB7XG4gICAgICAgICAgc3RhcnREYXRlOiByYW5nZS5zdGFydCxcbiAgICAgICAgICBlbmREYXRlOiByYW5nZS5lbmQsXG4gICAgICAgICAgcmFuZ2VUZXh0OiB0aGlzLmZvcm1hdERhdGVEaXNwbGF5KHJhbmdlLnN0YXJ0KSArICcg4oCTICcgKyB0aGlzLmZvcm1hdERhdGVEaXNwbGF5KHJhbmdlLmVuZCksXG4gICAgICAgICAgLi4uKHRoaXMuZW5hYmxlVGltZVBpY2tlciAmJiB7IHN0YXJ0VGltZTogcmFuZ2Uuc3RhcnRUaW1lLCBlbmRUaW1lOiByYW5nZS5lbmRUaW1lIH0pXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBjb25zdCBjdXJyZW50UmFuZ2VzID0gWy4uLnRoaXMuc2VsZWN0ZWRSYW5nZXMoKV07XG4gICAgICAgIGN1cnJlbnRSYW5nZXMucHVzaChuZXdSYW5nZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSYW5nZXMuc2V0KGN1cnJlbnRSYW5nZXMpO1xuICAgICAgICBcbiAgICAgICAgLy8gUmVzZXQgZm9yIG5leHQgcmFuZ2Ugc2VsZWN0aW9uXG4gICAgICAgIHRoaXMucmFuZ2VTdG9yZS5yZXNldCgpO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGRpc3BsYXkgdGV4dFxuICAgICAgICB0aGlzLnVwZGF0ZU11bHRpUmFuZ2VUZXh0KCk7XG4gICAgICAgIFxuICAgICAgICAvLyBEb24ndCBjbG9zZSBpZiBtdWx0aVJhbmdlLCBhbGxvdyBhZGRpbmcgbW9yZSByYW5nZXNcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VPblNlbGVjdGlvbiAmJiAhdGhpcy5tdWx0aVJhbmdlKSB7XG4gICAgICAgICAgdGhpcy5zaG93RGF0ZVBpY2tlci5zZXQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLmVtaXRNdWx0aUNoYW5nZSgpO1xuICAgICAgICB0aGlzLmVtaXRNdWx0aVNlbGVjdGlvbigpO1xuICAgICAgfVxuICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFycygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTaW5nbGUgcmFuZ2UgbW9kZVxuICAgICAgaWYgKHRoaXMucmVxdWlyZUFwcGx5KSB7XG4gICAgICAgIC8vIEFwcGx5IG1vZGU6IHVzZSBwZW5kaW5nIGRhdGVzLCBkb24ndCBlbWl0IHVudGlsIEFwcGx5IGlzIGNsaWNrZWRcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW5nU3RhcnREYXRlKCkpIHtcbiAgICAgICAgICB0aGlzLnJhbmdlU3RvcmUuc2V0UGVuZGluZ1N0YXJ0KHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgdGhpcy5yYW5nZVN0b3JlLnNldFBlbmRpbmdFbmQobnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcGVuZGluZ1N0YXJ0ID0gdGhpcy5yYW5nZVN0b3JlLnN0YXJ0RGF0ZSgpO1xuICAgICAgICAgIGlmIChwZW5kaW5nU3RhcnQgJiYgc2VsZWN0ZWREYXRlIDwgcGVuZGluZ1N0YXJ0KSB7XG4gICAgICAgICAgICAvLyBTd2FwXG4gICAgICAgICAgICB0aGlzLnJhbmdlU3RvcmUuc2V0UGVuZGluZ1N0YXJ0KHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnJhbmdlU3RvcmUuc2V0UGVuZGluZ0VuZChwZW5kaW5nU3RhcnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJhbmdlU3RvcmUuc2V0UGVuZGluZ0VuZChzZWxlY3RlZERhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJbW1lZGlhdGUgbW9kZTogZW1pdCBjaGFuZ2VzIGltbWVkaWF0ZWx5XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGluZ1N0YXJ0RGF0ZSgpKSB7XG4gICAgICAgICAgdGhpcy5yYW5nZVN0b3JlLnNldFN0YXJ0KHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgdGhpcy5yYW5nZVN0b3JlLnNldEVuZChudWxsKTtcbiAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50U3RhcnQgPSB0aGlzLnJhbmdlU3RvcmUuc3RhcnREYXRlKCk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRTdGFydCAmJiBzZWxlY3RlZERhdGUgPCBjdXJyZW50U3RhcnQpIHtcbiAgICAgICAgICAgIC8vIFN3YXBcbiAgICAgICAgICAgIHRoaXMucmFuZ2VTdG9yZS5zZXRTdGFydChzZWxlY3RlZERhdGUpO1xuICAgICAgICAgICAgdGhpcy5yYW5nZVN0b3JlLnNldEVuZChjdXJyZW50U3RhcnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJhbmdlU3RvcmUuc2V0RW5kKHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGlmICh0aGlzLmNsb3NlT25TZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0RhdGVQaWNrZXIuc2V0KGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgICAgICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFycygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFwcGx5U2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNQZW5kaW5nQ2hhbmdlcygpKSByZXR1cm47XG4gICAgXG4gICAgLy8gQXBwbHkgcGVuZGluZyBkYXRlcyB0aHJvdWdoIHN0b3JlXG4gICAgdGhpcy5yYW5nZVN0b3JlLmFwcGx5UGVuZGluZygpO1xuICAgIFxuICAgIC8vIEVtaXQgY2hhbmdlc1xuICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICAgIFxuICAgIC8vIENsb3NlIHBpY2tlclxuICAgIHRoaXMuc2hvd0RhdGVQaWNrZXIuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIGNhbmNlbFNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICAvLyBEaXNjYXJkIHBlbmRpbmcgY2hhbmdlcyB0aHJvdWdoIHN0b3JlXG4gICAgdGhpcy5yYW5nZVN0b3JlLmNhbmNlbFBlbmRpbmcoKTtcbiAgICBcbiAgICAvLyBSZWdlbmVyYXRlIGNhbGVuZGFycyB0byBjbGVhciBwZW5kaW5nIHZpc3VhbCBzdGF0ZVxuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcbiAgfVxuXG4gIGNoYW5nZU1vbnRoKGRpcmVjdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudE1vbnRoVmFsdWUgPSB0aGlzLmN1cnJlbnRNb250aCgpO1xuICAgIGNvbnN0IHllYXIgPSB0aGlzLmRhdGVBZGFwdGVyLmdldFllYXIoY3VycmVudE1vbnRoVmFsdWUpO1xuICAgIGNvbnN0IG1vbnRoID0gdGhpcy5kYXRlQWRhcHRlci5nZXRNb250aChjdXJyZW50TW9udGhWYWx1ZSk7XG4gICAgY29uc3QgbmV3Q3VycmVudE1vbnRoID0gdGhpcy5kYXRlQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoICsgZGlyZWN0aW9uLCAxKTtcbiAgICB0aGlzLmN1cnJlbnRNb250aC5zZXQobmV3Q3VycmVudE1vbnRoKTtcbiAgICBcbiAgICBjb25zdCBuZXdZZWFyID0gdGhpcy5kYXRlQWRhcHRlci5nZXRZZWFyKG5ld0N1cnJlbnRNb250aCk7XG4gICAgY29uc3QgbmV3TW9udGggPSB0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoKG5ld0N1cnJlbnRNb250aCk7XG4gICAgY29uc3QgbmV3UHJldmlvdXNNb250aCA9IHRoaXMuZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShuZXdZZWFyLCBuZXdNb250aCAtIDEsIDEpO1xuICAgIHRoaXMucHJldmlvdXNNb250aC5zZXQobmV3UHJldmlvdXNNb250aCk7XG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFycygpO1xuICB9XG5cbiAgZ2V0TW9udGhOYW1lKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1vbnRoTmFtZXMgPSB0aGlzLmxvY2FsZS5tb250aE5hbWVzIHx8IHRoaXMuZGVmYXVsdE1vbnRoTmFtZXM7XG4gICAgcmV0dXJuIGAke21vbnRoTmFtZXNbdGhpcy5kYXRlQWRhcHRlci5nZXRNb250aChkYXRlKV19ICR7dGhpcy5kYXRlQWRhcHRlci5nZXRZZWFyKGRhdGUpfWA7XG4gIH1cblxuICBnZXREYXlOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxlLmRheU5hbWVzU2hvcnQgfHwgdGhpcy5kZWZhdWx0RGF5TmFtZXNTaG9ydDtcbiAgfVxuXG4gIHNlbGVjdFByZXNldFJhbmdlKHByZXNldDogUHJlc2V0Q29uZmlnKTogdm9pZCB7XG4gICAgaWYgKCFwcmVzZXQuZ2V0VmFsdWUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1ByZXNldENvbmZpZyBtdXN0IGhhdmUgZ2V0VmFsdWUoKSBmdW5jdGlvbicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJhbmdlID0gcHJlc2V0LmdldFZhbHVlKCk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5kYXRlQWRhcHRlci5wYXJzZShyYW5nZS5zdGFydCk7XG4gICAgY29uc3QgZW5kRGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIucGFyc2UocmFuZ2UuZW5kKTtcbiAgICBcbiAgICBpZiAoc3RhcnREYXRlICYmIGVuZERhdGUpIHtcbiAgICAgIHRoaXMucmFuZ2VTdG9yZS5zZXRSYW5nZShzdGFydERhdGUsIGVuZERhdGUpO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG4gICAgaWYgKHRoaXMuY2xvc2VPblByZXNldFNlbGVjdGlvbikge1xuICAgICAgdGhpcy5zaG93RGF0ZVBpY2tlci5zZXQoZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMucmFuZ2VTdG9yZS5yZXNldCgpO1xuICAgIHRoaXMuc2hvd0RhdGVQaWNrZXIuc2V0KGZhbHNlKTtcbiAgICBcbiAgICBpZiAodGhpcy5tdWx0aVJhbmdlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUmFuZ2VzLnNldChbXSk7XG4gICAgICB0aGlzLmN1cnJlbnRSYW5nZUluZGV4LnNldCgtMSk7XG4gICAgICB0aGlzLmVtaXRNdWx0aUNoYW5nZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG4gIH1cbiAgXG4gIHJlbW92ZVJhbmdlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubXVsdGlSYW5nZSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IGN1cnJlbnRSYW5nZXMgPSBbLi4udGhpcy5zZWxlY3RlZFJhbmdlcygpXTtcbiAgICBjdXJyZW50UmFuZ2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5zZWxlY3RlZFJhbmdlcy5zZXQoY3VycmVudFJhbmdlcyk7XG4gICAgXG4gICAgdGhpcy51cGRhdGVNdWx0aVJhbmdlVGV4dCgpO1xuICAgIHRoaXMuZW1pdE11bHRpQ2hhbmdlKCk7XG4gICAgdGhpcy5lbWl0TXVsdGlTZWxlY3Rpb24oKTtcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG4gIH1cbiAgXG4gIHByaXZhdGUgdXBkYXRlTXVsdGlSYW5nZVRleHQoKTogdm9pZCB7XG4gICAgY29uc3QgY291bnQgPSB0aGlzLnNlbGVjdGVkUmFuZ2VzKCkubGVuZ3RoO1xuICAgIC8vIE5vdGU6IGRhdGVSYW5nZVRleHQgaXMgbm93IGNvbXB1dGVkIGZyb20gc3RvcmUsIHRoaXMgaXMgZm9yIG11bHRpLXJhbmdlIFVJIG9ubHlcbiAgICAvLyBXZSBjb3VsZCBzdG9yZSB0aGlzIGluIGEgc2VwYXJhdGUgc2lnbmFsIGlmIG5lZWRlZCwgYnV0IGZvciBub3cganVzdCB0cmFjayByYW5nZXMgY291bnRcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENoYW5nZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzdG9yZVJhbmdlID0gdGhpcy5yYW5nZVN0b3JlLnJhbmdlKCk7XG4gICAgY29uc3QgcmFuZ2U6IERhdGVSYW5nZSA9IHtcbiAgICAgIHN0YXJ0RGF0ZTogc3RvcmVSYW5nZS5zdGFydCxcbiAgICAgIGVuZERhdGU6IHN0b3JlUmFuZ2UuZW5kLFxuICAgICAgcmFuZ2VUZXh0OiB0aGlzLmRhdGVSYW5nZVRleHQoKVxuICAgIH07XG4gICAgXG4gICAgaWYgKHRoaXMuZW5hYmxlVGltZVBpY2tlcikge1xuICAgICAgcmFuZ2Uuc3RhcnRUaW1lID0gc3RvcmVSYW5nZS5zdGFydFRpbWU7XG4gICAgICByYW5nZS5lbmRUaW1lID0gc3RvcmVSYW5nZS5lbmRUaW1lO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmRhdGVSYW5nZUNoYW5nZS5lbWl0KHJhbmdlKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBzdG9yZVJhbmdlID0gdGhpcy5yYW5nZVN0b3JlLnJhbmdlKCk7XG4gICAgY29uc3QgcmFuZ2U6IERhdGVSYW5nZSA9IHtcbiAgICAgIHN0YXJ0RGF0ZTogc3RvcmVSYW5nZS5zdGFydCxcbiAgICAgIGVuZERhdGU6IHN0b3JlUmFuZ2UuZW5kLFxuICAgICAgcmFuZ2VUZXh0OiB0aGlzLmRhdGVSYW5nZVRleHQoKVxuICAgIH07XG4gICAgXG4gICAgaWYgKHRoaXMuZW5hYmxlVGltZVBpY2tlcikge1xuICAgICAgcmFuZ2Uuc3RhcnRUaW1lID0gc3RvcmVSYW5nZS5zdGFydFRpbWU7XG4gICAgICByYW5nZS5lbmRUaW1lID0gc3RvcmVSYW5nZS5lbmRUaW1lO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmRhdGVSYW5nZVNlbGVjdGVkLmVtaXQocmFuZ2UpO1xuICB9XG4gIFxuICBwcml2YXRlIGVtaXRNdWx0aUNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLm11bHRpRGF0ZVJhbmdlQ2hhbmdlLmVtaXQoe1xuICAgICAgcmFuZ2VzOiB0aGlzLnNlbGVjdGVkUmFuZ2VzKClcbiAgICB9KTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBlbWl0TXVsdGlTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5tdWx0aURhdGVSYW5nZVNlbGVjdGVkLmVtaXQoe1xuICAgICAgcmFuZ2VzOiB0aGlzLnNlbGVjdGVkUmFuZ2VzKClcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGF0ZVJhbmdlVmFsdWUoKTogRGF0ZVJhbmdlIHtcbiAgICBjb25zdCBzdG9yZVJhbmdlID0gdGhpcy5yYW5nZVN0b3JlLnJhbmdlKCk7XG4gICAgY29uc3QgcmFuZ2U6IERhdGVSYW5nZSA9IHtcbiAgICAgIHN0YXJ0RGF0ZTogc3RvcmVSYW5nZS5zdGFydCxcbiAgICAgIGVuZERhdGU6IHN0b3JlUmFuZ2UuZW5kLFxuICAgICAgcmFuZ2VUZXh0OiB0aGlzLmRhdGVSYW5nZVRleHQoKVxuICAgIH07XG4gICAgXG4gICAgaWYgKHRoaXMuZW5hYmxlVGltZVBpY2tlcikge1xuICAgICAgcmFuZ2Uuc3RhcnRUaW1lID0gc3RvcmVSYW5nZS5zdGFydFRpbWU7XG4gICAgICByYW5nZS5lbmRUaW1lID0gc3RvcmVSYW5nZS5lbmRUaW1lO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gcmFuZ2U7XG4gIH1cblxuICAvLyBUaW1lIFBpY2tlciBNZXRob2RzXG4gIHRvZ2dsZVN0YXJ0VGltZVBpY2tlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlVGltZVBpY2tlcikgcmV0dXJuO1xuICAgIHRoaXMuc2hvd1N0YXJ0VGltZVBpY2tlci5zZXQoIXRoaXMuc2hvd1N0YXJ0VGltZVBpY2tlcigpKTtcbiAgICB0aGlzLnNob3dFbmRUaW1lUGlja2VyLnNldChmYWxzZSk7XG4gIH1cblxuICB0b2dnbGVFbmRUaW1lUGlja2VyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVUaW1lUGlja2VyKSByZXR1cm47XG4gICAgdGhpcy5zaG93RW5kVGltZVBpY2tlci5zZXQoIXRoaXMuc2hvd0VuZFRpbWVQaWNrZXIoKSk7XG4gICAgdGhpcy5zaG93U3RhcnRUaW1lUGlja2VyLnNldChmYWxzZSk7XG4gIH1cblxuICBpbmNyZW1lbnRTdGFydEhvdXIoKTogdm9pZCB7XG4gICAgY29uc3QgbmV3SG91ciA9ICh0aGlzLnN0YXJ0SG91ciArIDEpICUgMjQ7XG4gICAgdGhpcy5zZXRTdGFydEhvdXJNaW51dGUobmV3SG91ciwgdGhpcy5zdGFydE1pbnV0ZSk7XG4gICAgaWYgKCF0aGlzLnJlcXVpcmVBcHBseSkge1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuICB9XG5cbiAgZGVjcmVtZW50U3RhcnRIb3VyKCk6IHZvaWQge1xuICAgIGNvbnN0IG5ld0hvdXIgPSB0aGlzLnN0YXJ0SG91ciA9PT0gMCA/IDIzIDogdGhpcy5zdGFydEhvdXIgLSAxO1xuICAgIHRoaXMuc2V0U3RhcnRIb3VyTWludXRlKG5ld0hvdXIsIHRoaXMuc3RhcnRNaW51dGUpO1xuICAgIGlmICghdGhpcy5yZXF1aXJlQXBwbHkpIHtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIGluY3JlbWVudFN0YXJ0TWludXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IG5ld01pbnV0ZSA9ICh0aGlzLnN0YXJ0TWludXRlICsgdGhpcy5taW51dGVTdGVwKSAlIDYwO1xuICAgIHRoaXMuc2V0U3RhcnRIb3VyTWludXRlKHRoaXMuc3RhcnRIb3VyLCBuZXdNaW51dGUpO1xuICAgIGlmICghdGhpcy5yZXF1aXJlQXBwbHkpIHtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlY3JlbWVudFN0YXJ0TWludXRlKCk6IHZvaWQge1xuICAgIGxldCBuZXdNaW51dGUgPSB0aGlzLnN0YXJ0TWludXRlIC0gdGhpcy5taW51dGVTdGVwO1xuICAgIGlmIChuZXdNaW51dGUgPCAwKSB7XG4gICAgICBuZXdNaW51dGUgPSA2MCAtIHRoaXMubWludXRlU3RlcDtcbiAgICB9XG4gICAgdGhpcy5zZXRTdGFydEhvdXJNaW51dGUodGhpcy5zdGFydEhvdXIsIG5ld01pbnV0ZSk7XG4gICAgaWYgKCF0aGlzLnJlcXVpcmVBcHBseSkge1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuICB9XG5cbiAgaW5jcmVtZW50RW5kSG91cigpOiB2b2lkIHtcbiAgICBjb25zdCBuZXdIb3VyID0gKHRoaXMuZW5kSG91ciArIDEpICUgMjQ7XG4gICAgdGhpcy5zZXRFbmRIb3VyTWludXRlKG5ld0hvdXIsIHRoaXMuZW5kTWludXRlKTtcbiAgICBpZiAoIXRoaXMucmVxdWlyZUFwcGx5KSB7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICBkZWNyZW1lbnRFbmRIb3VyKCk6IHZvaWQge1xuICAgIGNvbnN0IG5ld0hvdXIgPSB0aGlzLmVuZEhvdXIgPT09IDAgPyAyMyA6IHRoaXMuZW5kSG91ciAtIDE7XG4gICAgdGhpcy5zZXRFbmRIb3VyTWludXRlKG5ld0hvdXIsIHRoaXMuZW5kTWludXRlKTtcbiAgICBpZiAoIXRoaXMucmVxdWlyZUFwcGx5KSB7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICBpbmNyZW1lbnRFbmRNaW51dGUoKTogdm9pZCB7XG4gICAgY29uc3QgbmV3TWludXRlID0gKHRoaXMuZW5kTWludXRlICsgdGhpcy5taW51dGVTdGVwKSAlIDYwO1xuICAgIHRoaXMuc2V0RW5kSG91ck1pbnV0ZSh0aGlzLmVuZEhvdXIsIG5ld01pbnV0ZSk7XG4gICAgaWYgKCF0aGlzLnJlcXVpcmVBcHBseSkge1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuICB9XG5cbiAgZGVjcmVtZW50RW5kTWludXRlKCk6IHZvaWQge1xuICAgIGxldCBuZXdNaW51dGUgPSB0aGlzLmVuZE1pbnV0ZSAtIHRoaXMubWludXRlU3RlcDtcbiAgICBpZiAobmV3TWludXRlIDwgMCkge1xuICAgICAgbmV3TWludXRlID0gNjAgLSB0aGlzLm1pbnV0ZVN0ZXA7XG4gICAgfVxuICAgIHRoaXMuc2V0RW5kSG91ck1pbnV0ZSh0aGlzLmVuZEhvdXIsIG5ld01pbnV0ZSk7XG4gICAgaWYgKCF0aGlzLnJlcXVpcmVBcHBseSkge1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuICB9XG5cbiAgZm9ybWF0VGltZShob3VyOiBudW1iZXIsIG1pbnV0ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBoID0gaG91ci50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgbSA9IG1pbnV0ZS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgXG4gICAgaWYgKHRoaXMudGltZUZvcm1hdCA9PT0gJzEyaCcpIHtcbiAgICAgIGNvbnN0IGlzUE0gPSBob3VyID49IDEyO1xuICAgICAgY29uc3QgaG91cjEyID0gaG91ciA9PT0gMCA/IDEyIDogaG91ciA+IDEyID8gaG91ciAtIDEyIDogaG91cjtcbiAgICAgIGNvbnN0IHBlcmlvZCA9IGlzUE0gPyAnUE0nIDogJ0FNJztcbiAgICAgIHJldHVybiBgJHtob3VyMTIudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke219ICR7cGVyaW9kfWA7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBgJHtofToke219YDtcbiAgfVxuXG4gIHBhcnNlVGltZSh0aW1lU3RyaW5nOiBzdHJpbmcpOiB7IGhvdXI6IG51bWJlcjsgbWludXRlOiBudW1iZXIgfSB7XG4gICAgaWYgKCF0aW1lU3RyaW5nKSByZXR1cm4geyBob3VyOiAwLCBtaW51dGU6IDAgfTtcbiAgICBcbiAgICBjb25zdCB0aW1lMTJoUmVnZXggPSAvXihcXGR7MSwyfSk6KFxcZHsyfSlcXHM/KEFNfFBNKSQvaTtcbiAgICBjb25zdCB0aW1lMjRoUmVnZXggPSAvXihcXGR7MSwyfSk6KFxcZHsyfSkkLztcbiAgICBcbiAgICBsZXQgbWF0Y2ggPSB0aW1lU3RyaW5nLm1hdGNoKHRpbWUxMmhSZWdleCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBsZXQgaG91ciA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG4gICAgICBjb25zdCBtaW51dGUgPSBwYXJzZUludChtYXRjaFsyXSwgMTApO1xuICAgICAgY29uc3QgcGVyaW9kID0gbWF0Y2hbM10udG9VcHBlckNhc2UoKTtcbiAgICAgIFxuICAgICAgaWYgKHBlcmlvZCA9PT0gJ1BNJyAmJiBob3VyICE9PSAxMikgaG91ciArPSAxMjtcbiAgICAgIGlmIChwZXJpb2QgPT09ICdBTScgJiYgaG91ciA9PT0gMTIpIGhvdXIgPSAwO1xuICAgICAgXG4gICAgICByZXR1cm4geyBob3VyLCBtaW51dGUgfTtcbiAgICB9XG4gICAgXG4gICAgbWF0Y2ggPSB0aW1lU3RyaW5nLm1hdGNoKHRpbWUyNGhSZWdleCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBob3VyOiBwYXJzZUludChtYXRjaFsxXSwgMTApLFxuICAgICAgICBtaW51dGU6IHBhcnNlSW50KG1hdGNoWzJdLCAxMClcbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7IGhvdXI6IDAsIG1pbnV0ZTogMCB9O1xuICB9XG5cbiAgLy8gQ29udHJvbFZhbHVlQWNjZXNzb3IgaW1wbGVtZW50YXRpb25cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogRGF0ZVJhbmdlIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgLy8gVXNlIHNldHRlcnMgd2hpY2ggZGVsZWdhdGUgdG8gc3RvcmVcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gdmFsdWUuc3RhcnREYXRlIHx8ICcnO1xuICAgICAgdGhpcy5lbmREYXRlID0gdmFsdWUuZW5kRGF0ZSB8fCAnJztcbiAgICAgIFxuICAgICAgaWYgKHRoaXMuZW5hYmxlVGltZVBpY2tlcikge1xuICAgICAgICBpZiAodmFsdWUuc3RhcnRUaW1lKSB7XG4gICAgICAgICAgdGhpcy5yYW5nZVN0b3JlLnNldFN0YXJ0VGltZSh2YWx1ZS5zdGFydFRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZS5lbmRUaW1lKSB7XG4gICAgICAgICAgdGhpcy5yYW5nZVN0b3JlLnNldEVuZFRpbWUodmFsdWUuZW5kVGltZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHRoaXMuc3RhcnREYXRlICYmIHRoaXMuZW5kRGF0ZSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmFuZ2VTdG9yZS5yZXNldCgpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogRGF0ZVJhbmdlIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaXNEaXNhYmxlZC5zZXQoaXNEaXNhYmxlZCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLXdyYXBwZXJcIiBcbiAgW2NsYXNzXT1cIid0aGVtZS0nICsgdGhlbWVcIlxuICBbc3R5bGUuLS1pbnB1dC1ib3JkZXItaG92ZXJdPVwiaW5wdXRCb3JkZXJDb2xvckhvdmVyXCJcbiAgW3N0eWxlLi0taW5wdXQtYm9yZGVyLWZvY3VzXT1cImlucHV0Qm9yZGVyQ29sb3JGb2N1c1wiPlxuICA8aW5wdXQgXG4gICAgdHlwZT1cInRleHRcIiBcbiAgICBjbGFzcz1cImRhdGVwaWNrZXItaW5wdXRcIiBcbiAgICBbdmFsdWVdPVwiZGF0ZVJhbmdlVGV4dCgpXCIgXG4gICAgKGNsaWNrKT1cInRvZ2dsZURhdGVQaWNrZXIoKVwiIFxuICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQoKVwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJwbGFjZWhvbGRlclwiXG4gICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJzaG93RGF0ZVBpY2tlcigpXCJcbiAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cIidkaWFsb2cnXCJcbiAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogaW5wdXRCYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAnY29sb3InOiBpbnB1dFRleHRDb2xvcixcbiAgICAgICdib3JkZXItY29sb3InOiBpbnB1dEJvcmRlckNvbG9yLFxuICAgICAgJ3BhZGRpbmcnOiBpbnB1dFBhZGRpbmdcbiAgICB9XCJcbiAgICByZWFkb25seT5cblxuICBAaWYgKHNob3dEYXRlUGlja2VyKCkpIHtcbiAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWRyb3Bkb3duXCI+XG4gICAgQGlmIChzaG93UHJlc2V0cykge1xuICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1wcmVzZXRzXCI+XG4gICAgICBAZm9yIChwcmVzZXQgb2YgcHJlc2V0czsgdHJhY2sgcHJlc2V0LmxhYmVsKSB7XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwic2VsZWN0UHJlc2V0UmFuZ2UocHJlc2V0KVwiPnt7IHByZXNldC5sYWJlbCB9fTwvYnV0dG9uPlxuICAgICAgfVxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2UtY2FsZW5kYXJcIiAoY2xpY2spPVwiY2xvc2VEYXRlUGlja2VyKClcIiB0aXRsZT1cIkNsb3NlXCI+XG4gICAgICAgIMOXXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKCFzaG93UHJlc2V0cykge1xuICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1oZWFkZXItb25seS1jbG9zZVwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2UtY2FsZW5kYXJcIiAoY2xpY2spPVwiY2xvc2VEYXRlUGlja2VyKClcIiB0aXRsZT1cIkNsb3NlXCI+XG4gICAgICAgIMOXXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8IS0tIENhbGVuZGFycyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItY2FsZW5kYXJzXCI+XG4gICAgICA8IS0tIFByZXZpb3VzIG1vbnRoIGNhbGVuZGFyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWNhbGVuZGFyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1oZWFkZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2hhbmdlTW9udGgoLTEpXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTExLjM1NCAxLjY0NmEuNS41IDAgMCAxIDAgLjcwOEw1LjcwNyA4bDUuNjQ3IDUuNjQ2YS41LjUgMCAwIDEtLjcwOC43MDhsLTYtNmEuNS41IDAgMCAxIDAtLjcwOGw2LTZhLjUuNSAwIDAgMSAuNzA4IDB6XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPHNwYW4+e3sgcHJldmlvdXNNb250aE5hbWUoKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBzdHlsZT1cInZpc2liaWxpdHk6IGhpZGRlbjtcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj5cbiAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNC42NDYgMS42NDZhLjUuNSAwIDAgMSAuNzA4IDBsNiA2YS41LjUgMCAwIDEgMCAuNzA4bC02IDZhLjUuNSAwIDAgMS0uNzA4LS43MDhMMTAuMjkzIDggNC42NDYgMi4zNTRhLjUuNSAwIDAgMSAwLS43MDh6XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItd2Vla2RheXNcIj5cbiAgICAgICAgICBAZm9yIChkYXlOYW1lIG9mIHdlZWtEYXlOYW1lcygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxzcGFuPnt7IGRheU5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWRheXNcIj5cbiAgICAgICAgICBAZm9yIChkYXlPYmogb2YgcHJldmlvdXNNb250aERheXMoKTsgdHJhY2sgZGF5T2JqLmRhdGUgfHwgJGluZGV4KSB7XG4gICAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJkYXRlLXBpY2tlci1kYXlcIiBcbiAgICAgICAgICAgICAgW2NsYXNzLmVtcHR5XT1cIiFkYXlPYmouaXNDdXJyZW50TW9udGhcIlxuICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiZGF5T2JqLmlzU3RhcnQgfHwgZGF5T2JqLmlzRW5kXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmluLXJhbmdlXT1cImRheU9iai5pblJhbmdlICYmICFkYXlPYmouaXNTdGFydCAmJiAhZGF5T2JqLmlzRW5kXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmluLWhvdmVyLXJhbmdlXT1cImRheU9iai5pbkhvdmVyUmFuZ2UgJiYgIWRheU9iai5pc1N0YXJ0ICYmICFkYXlPYmouaXNFbmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZGF5T2JqLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbY2xhc3Mua2V5Ym9hcmQtZm9jdXNlZF09XCJlbmFibGVLZXlib2FyZE5hdmlnYXRpb24gJiYgaGFzS2V5Ym9hcmRGb2N1cyhkYXlPYmouZGF0ZSwgMClcIlxuICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJlbmFibGVLZXlib2FyZE5hdmlnYXRpb24gJiYgZGF5T2JqLmlzQ3VycmVudE1vbnRoICYmIGhhc0tleWJvYXJkRm9jdXMoZGF5T2JqLmRhdGUsIDApID8gMCA6IC0xXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJmb3JtYXREYXRlRGlzcGxheShkYXlPYmouZGF0ZSlcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImRheU9iai5pc1N0YXJ0IHx8IGRheU9iai5pc0VuZFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJkYXlPYmouaXNTdGFydCA/ICdkYXRlJyA6IG51bGxcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRheU9iai5pc0Rpc2FibGVkXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERheShkYXlPYmopXCJcbiAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25EYXlIb3ZlcihkYXlPYmopXCJcbiAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwiY2xlYXJEYXlIb3ZlcigpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFkYXlPYmouaXNDdXJyZW50TW9udGggfHwgZGF5T2JqLmlzRGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAge3sgZGF5T2JqLmRheSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEN1cnJlbnQgbW9udGggY2FsZW5kYXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItY2FsZW5kYXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWhlYWRlclwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHN0eWxlPVwidmlzaWJpbGl0eTogaGlkZGVuO1wiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xMS4zNTQgMS42NDZhLjUuNSAwIDAgMSAwIC43MDhMNS43MDcgOGw1LjY0NyA1LjY0NmEuNS41IDAgMCAxLS43MDguNzA4bC02LTZhLjUuNSAwIDAgMSAwLS43MDhsNi02YS41LjUgMCAwIDEgLjcwOCAwelwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxzcGFuPnt7IGN1cnJlbnRNb250aE5hbWUoKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2hhbmdlTW9udGgoMSlcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj5cbiAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNC42NDYgMS42NDZhLjUuNSAwIDAgMSAuNzA4IDBsNiA2YS41LjUgMCAwIDEgMCAuNzA4bC02IDZhLjUuNSAwIDAgMS0uNzA4LS43MDhMMTAuMjkzIDggNC42NDYgMi4zNTRhLjUuNSAwIDAgMSAwLS43MDh6XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItd2Vla2RheXNcIj5cbiAgICAgICAgICBAZm9yIChkYXlOYW1lIG9mIHdlZWtEYXlOYW1lcygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxzcGFuPnt7IGRheU5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWRheXNcIj5cbiAgICAgICAgICBAZm9yIChkYXlPYmogb2YgY3VycmVudE1vbnRoRGF5cygpOyB0cmFjayBkYXlPYmouZGF0ZSB8fCAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImRhdGUtcGlja2VyLWRheVwiIFxuICAgICAgICAgICAgICBbY2xhc3MuZW1wdHldPVwiIWRheU9iai5pc0N1cnJlbnRNb250aFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJkYXlPYmouaXNTdGFydCB8fCBkYXlPYmouaXNFbmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuaW4tcmFuZ2VdPVwiZGF5T2JqLmluUmFuZ2UgJiYgIWRheU9iai5pc1N0YXJ0ICYmICFkYXlPYmouaXNFbmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuaW4taG92ZXItcmFuZ2VdPVwiZGF5T2JqLmluSG92ZXJSYW5nZSAmJiAhZGF5T2JqLmlzU3RhcnQgJiYgIWRheU9iai5pc0VuZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJkYXlPYmouaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5rZXlib2FyZC1mb2N1c2VkXT1cImVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbiAmJiBoYXNLZXlib2FyZEZvY3VzKGRheU9iai5kYXRlLCAxKVwiXG4gICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbiAmJiBkYXlPYmouaXNDdXJyZW50TW9udGggJiYgaGFzS2V5Ym9hcmRGb2N1cyhkYXlPYmouZGF0ZSwgMSkgPyAwIDogLTFcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImZvcm1hdERhdGVEaXNwbGF5KGRheU9iai5kYXRlKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiZGF5T2JqLmlzU3RhcnQgfHwgZGF5T2JqLmlzRW5kXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cImRheU9iai5pc1N0YXJ0ID8gJ2RhdGUnIDogbnVsbFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGF5T2JqLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF5KGRheU9iailcIlxuICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbkRheUhvdmVyKGRheU9iailcIlxuICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJjbGVhckRheUhvdmVyKClcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWRheU9iai5pc0N1cnJlbnRNb250aCB8fCBkYXlPYmouaXNEaXNhYmxlZFwiPlxuICAgICAgICAgICAgICB7eyBkYXlPYmouZGF5IH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIE11bHRpLVJhbmdlIExpc3QgLS0+XG4gICAgQGlmIChtdWx0aVJhbmdlICYmIHNlbGVjdGVkUmFuZ2VzKCkubGVuZ3RoID4gMCkge1xuICAgIDxkaXYgY2xhc3M9XCJtdWx0aS1yYW5nZS1saXN0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibXVsdGktcmFuZ2UtaGVhZGVyXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibXVsdGktcmFuZ2UtdGl0bGVcIj5TZWxlY3RlZCBSYW5nZXMgKHt7IHNlbGVjdGVkUmFuZ2VzKCkubGVuZ3RoIH19KTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm11bHRpLXJhbmdlLWl0ZW1zXCI+XG4gICAgICAgIEBmb3IgKHJhbmdlIG9mIHNlbGVjdGVkUmFuZ2VzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibXVsdGktcmFuZ2UtaXRlbVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXVsdGktcmFuZ2UtdGV4dFwiPnt7IHJhbmdlLnJhbmdlVGV4dCB9fTwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgY2xhc3M9XCJidG4tcmVtb3ZlLXJhbmdlXCIgXG4gICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlUmFuZ2UoJGluZGV4KVwiXG4gICAgICAgICAgICB0aXRsZT1cIlJlbW92ZSB0aGlzIHJhbmdlXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMi4xNDYgMi44NTRhLjUuNSAwIDEgMSAuNzA4LS43MDhMOCA3LjI5M2w1LjE0Ni01LjE0N2EuNS41IDAgMCAxIC43MDguNzA4TDguNzA3IDhsNS4xNDcgNS4xNDZhLjUuNSAwIDAgMS0uNzA4LjcwOEw4IDguNzA3bC01LjE0NiA1LjE0N2EuNS41IDAgMCAxLS43MDgtLjcwOEw3LjI5MyA4IDIuMTQ2IDIuODU0WlwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPCEtLSBUaW1lIFBpY2tlciAtLT5cbiAgICBAaWYgKGVuYWJsZVRpbWVQaWNrZXIpIHtcbiAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItY29udGFpbmVyXCI+XG4gICAgICA8IS0tIFN0YXJ0IFRpbWUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItbGFiZWxcIj5TdGFydCBUaW1lPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci1pbnB1dHNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1pbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgICBjbGFzcz1cInRpbWUtYnRuIHRpbWUtYnRuLXVwXCIgXG4gICAgICAgICAgICAgIChjbGljayk9XCJpbmNyZW1lbnRTdGFydEhvdXIoKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiSW5jcmVtZW50IGhvdXJcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNDcgNC44NmwtNC43OTYgNS40ODFjLS41NjYuNjQ3LS4xMDYgMS42NTkuNzUzIDEuNjU5aDkuNTkyYTEgMSAwIDAgMCAuNzUzLTEuNjU5bC00Ljc5Ni01LjQ4YTEgMSAwIDAgMC0xLjUwNiAwelwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1pbnB1dFwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJzdGFydEhvdXIudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXCJcbiAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgICAgdGl0bGU9XCJTdGFydCBob3VyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1idG4gdGltZS1idG4tZG93blwiIFxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGVjcmVtZW50U3RhcnRIb3VyKClcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkRlY3JlbWVudCBob3VyXCI+XG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcuMjQ3IDExLjE0bC00Ljc5Ni01LjQ4MUMxLjg4NSA1LjAxMyAyLjM0NSA0IDMuMjA0IDRoOS41OTJhMSAxIDAgMCAxIC43NTMgMS42NTlsLTQuNzk2IDUuNDhhMSAxIDAgMCAxLTEuNTA2IDB6XCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGltZS1zZXBhcmF0b3JcIj46PC9zcGFuPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1idG4gdGltZS1idG4tdXBcIiBcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImluY3JlbWVudFN0YXJ0TWludXRlKClcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkluY3JlbWVudCBtaW51dGVcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNDcgNC44NmwtNC43OTYgNS40ODFjLS41NjYuNjQ3LS4xMDYgMS42NTkuNzUzIDEuNjU5aDkuNTkyYTEgMSAwIDAgMCAuNzUzLTEuNjU5bC00Ljc5Ni01LjQ4YTEgMSAwIDAgMC0xLjUwNiAwelwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1pbnB1dFwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJzdGFydE1pbnV0ZS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJylcIlxuICAgICAgICAgICAgICByZWFkb25seVxuICAgICAgICAgICAgICB0aXRsZT1cIlN0YXJ0IG1pbnV0ZVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgICBjbGFzcz1cInRpbWUtYnRuIHRpbWUtYnRuLWRvd25cIiBcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudFN0YXJ0TWludXRlKClcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkRlY3JlbWVudCBtaW51dGVcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNDcgMTEuMTRsLTQuNzk2LTUuNDgxQzEuODg1IDUuMDEzIDIuMzQ1IDQgMy4yMDQgNGg5LjU5MmExIDEgMCAwIDEgLjc1MyAxLjY1OWwtNC43OTYgNS40OGExIDEgMCAwIDEtMS41MDYgMHpcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmICh0aW1lRm9ybWF0ID09PSAnMTJoJykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBlcmlvZFwiPlxuICAgICAgICAgICAge3sgc3RhcnRIb3VyID49IDEyID8gJ1BNJyA6ICdBTScgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU2VwYXJhdG9yIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRpbWUtc2VwYXJhdG9yLXZlcnRpY2FsXCI+PC9kaXY+XG5cbiAgICAgIDwhLS0gRW5kIFRpbWUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItbGFiZWxcIj5FbmQgVGltZTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItaW5wdXRzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWJ0biB0aW1lLWJ0bi11cFwiIFxuICAgICAgICAgICAgICAoY2xpY2spPVwiaW5jcmVtZW50RW5kSG91cigpXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJJbmNyZW1lbnQgaG91clwiPlxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk03LjI0NyA0Ljg2bC00Ljc5NiA1LjQ4MWMtLjU2Ni42NDctLjEwNiAxLjY1OS43NTMgMS42NTloOS41OTJhMSAxIDAgMCAwIC43NTMtMS42NTlsLTQuNzk2LTUuNDhhMSAxIDAgMCAwLTEuNTA2IDB6XCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImVuZEhvdXIudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXCJcbiAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgICAgdGl0bGU9XCJFbmQgaG91clwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgICBjbGFzcz1cInRpbWUtYnRuIHRpbWUtYnRuLWRvd25cIiBcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudEVuZEhvdXIoKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiRGVjcmVtZW50IGhvdXJcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNDcgMTEuMTRsLTQuNzk2LTUuNDgxQzEuODg1IDUuMDEzIDIuMzQ1IDQgMy4yMDQgNGg5LjU5MmExIDEgMCAwIDEgLjc1MyAxLjY1OWwtNC43OTYgNS40OGExIDEgMCAwIDEtMS41MDYgMHpcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lLXNlcGFyYXRvclwiPjo8L3NwYW4+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWJ0biB0aW1lLWJ0bi11cFwiIFxuICAgICAgICAgICAgICAoY2xpY2spPVwiaW5jcmVtZW50RW5kTWludXRlKClcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkluY3JlbWVudCBtaW51dGVcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNDcgNC44NmwtNC43OTYgNS40ODFjLS41NjYuNjQ3LS4xMDYgMS42NTkuNzUzIDEuNjU5aDkuNTkyYTEgMSAwIDAgMCAuNzUzLTEuNjU5bC00Ljc5Ni01LjQ4YTEgMSAwIDAgMC0xLjUwNiAwelwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1pbnB1dFwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJlbmRNaW51dGUudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXCJcbiAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgICAgdGl0bGU9XCJFbmQgbWludXRlXCI+XG4gICAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1idG4gdGltZS1idG4tZG93blwiIFxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGVjcmVtZW50RW5kTWludXRlKClcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkRlY3JlbWVudCBtaW51dGVcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNDcgMTEuMTRsLTQuNzk2LTUuNDgxQzEuODg1IDUuMDEzIDIuMzQ1IDQgMy4yMDQgNGg5LjU5MmExIDEgMCAwIDEgLjc1MyAxLjY1OWwtNC43OTYgNS40OGExIDEgMCAwIDEtMS41MDYgMHpcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmICh0aW1lRm9ybWF0ID09PSAnMTJoJykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBlcmlvZFwiPlxuICAgICAgICAgICAge3sgZW5kSG91ciA+PSAxMiA/ICdQTScgOiAnQU0nIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIH1cblxuICAgIDwhLS0gRm9vdGVyIHdpdGggYnV0dG9ucyAtLT5cbiAgICBAaWYgKHNob3dDbGVhckJ1dHRvbiB8fCBtdWx0aVJhbmdlIHx8IHJlcXVpcmVBcHBseSkge1xuICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1mb290ZXJcIj5cbiAgICAgIEBpZiAocmVxdWlyZUFwcGx5ICYmICFtdWx0aVJhbmdlKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHBseS1mb290ZXItYWN0aW9uc1wiPlxuICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICBjbGFzcz1cImJ0bi1jYW5jZWxcIiBcbiAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWxTZWxlY3Rpb24oKVwiIFxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNQZW5kaW5nQ2hhbmdlcygpXCJcbiAgICAgICAgICAgIHRpdGxlPVwiQ2FuY2VsIHNlbGVjdGlvblwiPlxuICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuLWFwcGx5XCIgXG4gICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlTZWxlY3Rpb24oKVwiIFxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNQZW5kaW5nQ2hhbmdlcygpIHx8ICFwZW5kaW5nU3RhcnREYXRlIHx8ICFwZW5kaW5nRW5kRGF0ZVwiXG4gICAgICAgICAgICB0aXRsZT1cIkFwcGx5IHNlbGVjdGlvblwiPlxuICAgICAgICAgICAgQXBwbHlcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKG11bHRpUmFuZ2UpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm11bHRpLXJhbmdlLWZvb3Rlci1hY3Rpb25zXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xlYXJcIiAoY2xpY2spPVwiY2xlYXIoKVwiIHRpdGxlPVwiQ2xlYXIgYWxsIHJhbmdlc1wiPlxuICAgICAgICAgICAgQ2xlYXIgQWxsXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tZG9uZVwiIChjbGljayk9XCJjbG9zZURhdGVQaWNrZXIoKVwiIHRpdGxlPVwiRG9uZSBzZWxlY3RpbmdcIj5cbiAgICAgICAgICAgIERvbmVcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKCFtdWx0aVJhbmdlICYmICFyZXF1aXJlQXBwbHkgJiYgc2hvd0NsZWFyQnV0dG9uKSB7XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsZWFyXCIgKGNsaWNrKT1cImNsZWFyKClcIiB0aXRsZT1cIkNsZWFyIHNlbGVjdGlvblwiPlxuICAgICAgICAgIENsZWFyXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuIl19