ng-wsl-library 0.20.0 → 0.22.0

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.
@@ -23,9 +23,10 @@ export class WslDatetimePickerComponent {
23
23
  this.disabled = false;
24
24
  this.disableCalendar = false;
25
25
  this.calendarPosition = 'dynamic';
26
+ this.placeholder = null;
26
27
  this.internalFormat = INPUT_DATE_FORMATS.DATE_ONLY;
27
28
  this._standardFormat = INPUT_DATE_FORMATS.EU_DATE_DASH;
28
- this.placeholder = '';
29
+ this._placeholder = '';
29
30
  this.startDate = { year: 0, month: 0 };
30
31
  this.showTimePickerToggle = false;
31
32
  this.datetime = new DateTimeModel();
@@ -523,11 +524,19 @@ export class WslDatetimePickerComponent {
523
524
  }
524
525
  }
525
526
  setPlaceholder() {
526
- this.placeholder =
527
- this.dateConfig?.placeholder?.toLowerCase() ||
528
- INPUT_DATE_FORMATS.DATE_ONLY.toLowerCase();
527
+ if (this.placeholder && this.placeholder !== '') {
528
+ this._placeholder = this.placeholder.toLowerCase();
529
+ }
530
+ else {
531
+ this._placeholder =
532
+ this.dateConfig?.placeholder?.toLowerCase() ||
533
+ INPUT_DATE_FORMATS.DATE_ONLY.toLowerCase();
534
+ }
529
535
  if (this.showTimeControls) {
530
- this.placeholder += this._seconds ? ' hh:mm:ss' : ' hh:mm';
536
+ if (this._placeholder?.includes('hh:mm')) {
537
+ return;
538
+ }
539
+ this._placeholder += this._seconds ? ' hh:mm:ss' : ' hh:mm';
531
540
  }
532
541
  }
533
542
  writeValue(newModel) {
@@ -631,17 +640,51 @@ export class WslDatetimePickerComponent {
631
640
  }
632
641
  }
633
642
  formatDate(date) {
634
- if (!date) {
643
+ if (!date)
635
644
  return '';
636
- }
637
- const delimiter = this.getDelimiter();
638
645
  const dayFormatted = date.day < 10 ? '0' + date.day : date.day.toString();
639
646
  const monthFormatted = date.month < 10 ? '0' + date.month : date.month.toString();
640
647
  const yearFormatted = date.year.toString();
641
- if (this.dateConfig?.dayFirst) {
642
- return `${dayFormatted}${delimiter}${monthFormatted}${delimiter}${yearFormatted}`;
648
+ const hourFormatted = date.hours != null
649
+ ? date.hours < 10
650
+ ? '0' + date.hours
651
+ : date.hours.toString()
652
+ : '00';
653
+ const minuteFormatted = date.minutes != null
654
+ ? date.minutes < 10
655
+ ? '0' + date.minutes
656
+ : date.minutes.toString()
657
+ : '00';
658
+ const secondFormatted = date.seconds != null
659
+ ? date.seconds < 10
660
+ ? '0' + date.seconds
661
+ : date.seconds.toString()
662
+ : '00';
663
+ const format = this.inputDatetimeFormat;
664
+ const tokens = {
665
+ yyyy: yearFormatted,
666
+ MM: monthFormatted,
667
+ dd: dayFormatted,
668
+ HH: hourFormatted,
669
+ mm: minuteFormatted,
670
+ ss: secondFormatted,
671
+ };
672
+ if (format) {
673
+ const sortedTokens = Object.keys(tokens).sort((a, b) => b.length - a.length);
674
+ let result = format;
675
+ for (const t of sortedTokens) {
676
+ result = result.replace(new RegExp(t, 'g'), tokens[t]);
677
+ }
678
+ return result;
679
+ }
680
+ let formattedDate = `${yearFormatted}-${monthFormatted}-${dayFormatted}`;
681
+ if (date.hours != null) {
682
+ formattedDate += ` ${hourFormatted}:${minuteFormatted}`;
683
+ }
684
+ if (date.seconds != null) {
685
+ formattedDate += `:${secondFormatted}`;
643
686
  }
644
- return `${yearFormatted}${delimiter}${monthFormatted}${delimiter}${dayFormatted}`;
687
+ return formattedDate;
645
688
  }
646
689
  onInputChange(event) {
647
690
  const value = event.target.value;
@@ -649,7 +692,6 @@ export class WslDatetimePickerComponent {
649
692
  this.datetime = new DateTimeModel();
650
693
  this.dateString = '';
651
694
  this.onChange(this.dateString);
652
- this.cdr.markForCheck();
653
695
  return;
654
696
  }
655
697
  const parsedDate = this.parseDate(value);
@@ -718,21 +760,11 @@ export class WslDatetimePickerComponent {
718
760
  year: this.datetime.year,
719
761
  month: this.datetime.month,
720
762
  day: this.datetime.day,
763
+ hours: this.datetime.hours,
764
+ minutes: this.datetime.minutes,
765
+ seconds: this.datetime.seconds,
721
766
  };
722
- let displayValue = this.formatDate(dateStruct);
723
- if (this.showTimeControls && !this.isDateOnly) {
724
- const hour = this.datetime.hours !== undefined ? this.datetime.hours : 0;
725
- const minute = this.datetime.minutes !== undefined ? this.datetime.minutes : 0;
726
- const second = this.datetime.seconds !== undefined ? this.datetime.seconds : 0;
727
- const hourFormatted = hour < 10 ? '0' + hour : hour.toString();
728
- const minuteFormatted = minute < 10 ? '0' + minute : minute.toString();
729
- const secondFormatted = second < 10 ? '0' + second : second.toString();
730
- displayValue += ` ${hourFormatted}:${minuteFormatted}`;
731
- if (this.seconds) {
732
- displayValue += `:${secondFormatted}`;
733
- }
734
- }
735
- return displayValue;
767
+ return this.formatDate(dateStruct);
736
768
  }
737
769
  return '';
738
770
  }
@@ -800,13 +832,13 @@ export class WslDatetimePickerComponent {
800
832
  }
801
833
  }
802
834
  WslDatetimePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: WslDatetimePickerComponent, deps: [{ token: i0.Injector }, { token: i1.WslConfigService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
803
- WslDatetimePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: WslDatetimePickerComponent, selector: "wsl-datetime-picker", inputs: { dateString: "dateString", inputDatetimeFormat: "inputDatetimeFormat", hoursStep: "hoursStep", minutesStep: "minutesStep", secondsStep: "secondsStep", disabled: "disabled", maxDate: "maxDate", minDate: "minDate", disableCalendar: "disableCalendar", calendarPosition: "calendarPosition", allowedDates: "allowedDates", standardFormat: "standardFormat", seconds: "seconds" }, outputs: { monthChanged: "monthChanged", calendarStateChange: "calendarStateChange" }, host: { listeners: { "document:click": "onDocumentClick($event)", "window:resize": "onWindowResize($event)", "window:scroll": "onWindowScroll($event)" } }, providers: [
835
+ WslDatetimePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: WslDatetimePickerComponent, selector: "wsl-datetime-picker", inputs: { dateString: "dateString", inputDatetimeFormat: "inputDatetimeFormat", hoursStep: "hoursStep", minutesStep: "minutesStep", secondsStep: "secondsStep", disabled: "disabled", maxDate: "maxDate", minDate: "minDate", disableCalendar: "disableCalendar", calendarPosition: "calendarPosition", placeholder: "placeholder", allowedDates: "allowedDates", standardFormat: "standardFormat", seconds: "seconds" }, outputs: { monthChanged: "monthChanged", calendarStateChange: "calendarStateChange" }, host: { listeners: { "document:click": "onDocumentClick($event)", "window:resize": "onWindowResize($event)", "window:scroll": "onWindowScroll($event)" } }, providers: [
804
836
  {
805
837
  provide: NG_VALUE_ACCESSOR,
806
838
  useExisting: forwardRef(() => WslDatetimePickerComponent),
807
839
  multi: true,
808
840
  },
809
- ], usesOnChanges: true, ngImport: i0, template: "<div class=\"datetime-picker-container\">\n <div class=\"input-container\">\n <input\n #dateInput\n [ngClass]=\"{\n 'ng-valid': ngControl?.valid === true,\n 'ng-invalid': ngControl?.invalid === true,\n 'ng-disabled': disabled\n }\"\n class=\"datetime-input\"\n (blur)=\"inputBlur()\"\n [placeholder]=\"placeholder\"\n [ngModel]=\"getDisplayValue()\"\n (change)=\"onInputChange($event)\"\n [disabled]=\"disabled\"\n wslTooltip\n [tooltipIconOverlap]=\"12\"\n tooltipPlacement=\"top\"\n />\n </div>\n\n <button\n type=\"button\"\n class=\"calendar-icon\"\n [disabled]=\"disabled || disableCalendar\"\n [ngClass]=\"{ 'disabled-btn': disabled || disableCalendar }\"\n (click)=\"toggleCalendar($event)\"\n >\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n\n <!-- Custom Calendar Popover -->\n <div\n class=\"calendar-popover\"\n [class.show]=\"showCalendar\"\n [class.hidden]=\"!showCalendar\"\n [ngClass]=\"calendarPositionClass\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"popover-content\">\n <div *ngIf=\"!showTimePickerToggle\">\n <!-- Custom Date Picker -->\n <div class=\"custom-datepicker\">\n <div class=\"datepicker-header\">\n <button\n type=\"button\"\n class=\"nav-btn\"\n (click)=\"navigateMonth(-1)\"\n [disabled]=\"disabled\"\n >\n <i class=\"fa fa-chevron-left\"></i>\n </button>\n <div class=\"month-year-selects\">\n <select\n class=\"month-select\"\n [(ngModel)]=\"currentMonth\"\n (change)=\"onMonthSelect($event)\"\n [disabled]=\"disabled\"\n >\n <option\n *ngFor=\"let month of months; let i = index\"\n [value]=\"i + 1\"\n >\n {{ month }}\n </option>\n </select>\n <select\n class=\"year-select\"\n [(ngModel)]=\"currentYear\"\n (change)=\"onYearSelect($event)\"\n [disabled]=\"disabled\"\n >\n <option *ngFor=\"let year of years\" [value]=\"year\">\n {{ year }}\n </option>\n </select>\n </div>\n <button\n type=\"button\"\n class=\"nav-btn\"\n (click)=\"navigateMonth(1)\"\n [disabled]=\"disabled\"\n >\n <i class=\"fa fa-chevron-right\"></i>\n </button>\n </div>\n\n <div class=\"datepicker-calendar\">\n <div class=\"weekdays\">\n <div class=\"weekday\" *ngFor=\"let day of weekdayLabels\">\n {{ day }}\n </div>\n </div>\n\n <div class=\"days\">\n <div\n class=\"day-cell\"\n *ngFor=\"let day of calendarDays\"\n [class.other-month]=\"day.otherMonth\"\n [class.selected]=\"day.selected\"\n [class.disabled]=\"day.disabled\"\n [class.today]=\"day.today\"\n (click)=\"selectDate(day)\"\n >\n {{ day.day }}\n </div>\n </div>\n </div>\n </div>\n\n <button\n *ngIf=\"showTimeControls && !isDateOnly\"\n class=\"toggle-time-btn\"\n type=\"button\"\n [disabled]=\"!hasValidDate() || disabled\"\n (click)=\"toggleDateTimeState($event)\"\n >\n <i class=\"fa fa-clock fa-clock-o fa-lg\"></i>\n </button>\n </div>\n\n <div *ngIf=\"showTimePickerToggle\">\n <button\n *ngIf=\"showTimeControls && !isDateOnly\"\n class=\"toggle-calendar-btn\"\n type=\"button\"\n (click)=\"toggleDateTimeState($event)\"\n >\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n\n <div\n class=\"time-picker-container\"\n *ngIf=\"showTimeControls && !isDateOnly\"\n >\n <!-- Custom Time Picker -->\n <div class=\"custom-timepicker\">\n <div class=\"time-controls\">\n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.hours || \"HH\" }}</label>\n <div class=\"time-input-group\">\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('hours', hoursStep || 1)\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input\n type=\"number\"\n class=\"time-input\"\n [value]=\"datetime?.hours || 0\"\n (change)=\"onTimeFieldChange('hours', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\"\n max=\"23\"\n />\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('hours', -(hoursStep || 1))\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"time-separator\">:</div>\n\n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.minutes || \"mm\" }}</label>\n <div class=\"time-input-group\">\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('minutes', minutesStep || 1)\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input\n type=\"number\"\n class=\"time-input\"\n [value]=\"datetime?.minutes || 0\"\n (change)=\"onTimeFieldChange('minutes', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\"\n max=\"59\"\n />\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('minutes', -(minutesStep || 1))\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"time-separator\" *ngIf=\"seconds\">:</div>\n\n <div class=\"time-field\" *ngIf=\"seconds\">\n <label>{{ dateConfig?.tokens?.seconds || \"ss\" }}</label>\n <div class=\"time-input-group\">\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('seconds', secondsStep || 1)\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input\n type=\"number\"\n class=\"time-input\"\n [value]=\"datetime?.seconds || 0\"\n (change)=\"onTimeFieldChange('seconds', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\"\n max=\"59\"\n />\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('seconds', -(secondsStep || 1))\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Backdrop for closing popover -->\n<div\n class=\"calendar-backdrop\"\n [class.show]=\"showCalendar\"\n (click)=\"closeCalendar()\"\n></div>\n", styles: [".datetime-picker-container{display:flex;position:relative;width:auto;max-width:300px}.input-container{flex:1;position:relative}.datetime-input{display:block;width:100%;height:-webkit-fill-available;height:-moz-available;height:stretch;padding:.375rem 4px .375rem .75rem;font-size:1rem;font-weight:400;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem 0 0 .25rem;border-right:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;text-transform:none!important}.datetime-input::placeholder{color:#6c757d;opacity:1}.datetime-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 4px #0d6efd}.datetime-input:disabled{background-color:#e9ecef;opacity:1}.datetime-input.ng-invalid{border-color:#dc3545}.datetime-input.ng-invalid:focus{box-shadow:0 0 4px #dc3545}.input-container:has(.datetime-input:focus)+.calendar-icon{border-top-color:#86b7fe;border-right-color:#86b7fe;border-bottom-color:#86b7fe;box-shadow:1px 0 4px #0d6efd}.input-container:has(.datetime-input:disabled)+.calendar-icon{border-top-color:#ced4da;border-right-color:#ced4da;border-bottom-color:#ced4da;background-color:#e9ecef}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon{border-top-color:#dc3545;border-right-color:#dc3545;border-bottom-color:#dc3545}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon:has(+ .input-container > .datetime-input:focus){box-shadow:1px 0 4px #dc3545}.calendar-icon{display:flex;align-items:center;justify-content:center;height:38px;width:auto;min-width:38px;padding:0 10px;background-color:#fff;border:1px solid #ced4da;border-radius:0 .25rem .25rem 0;z-index:1;cursor:pointer;position:relative;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.calendar-icon.disabled-btn{color:#6c757d;background-color:#e9ecef;cursor:not-allowed}.calendar-icon:hover:not(.disabled-btn){background-color:#f8f9fa}.fa-calendar,.fa-clock-o,.fa-clock{font-size:1em;line-height:1;vertical-align:middle}.calendar-popover{position:absolute;top:calc(100% + 2px);right:0;z-index:1060;display:block;min-width:300px;max-width:350px;font-family:inherit;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .5rem 1rem #00000026;opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .3s ease,visibility .3s ease,transform .3s ease}.calendar-popover.show{opacity:1;visibility:visible;transform:translateY(0)}.calendar-popover.hidden{opacity:0;visibility:hidden;transform:translateY(-10px)}.calendar-popover.calendar-position-top{top:auto;bottom:calc(100% + 2px);transform:translateY(10px)}.calendar-popover.calendar-position-top.show{transform:translateY(0)}.calendar-popover.calendar-position-top.hidden{transform:translateY(10px)}.calendar-popover.calendar-position-bottom{top:calc(100% + 2px);bottom:auto}.calendar-popover.calendar-align-left{left:0;right:auto}.calendar-popover.calendar-align-right{left:auto;right:0}.calendar-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1050;background-color:transparent;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}.calendar-backdrop.show{opacity:1;visibility:visible}.popover-content{padding:1rem}.custom-datepicker .datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.custom-datepicker .datepicker-header .nav-btn{background:none;border:none;padding:.25rem .5rem;cursor:pointer;border-radius:.25rem;color:#6c757d}.custom-datepicker .datepicker-header .nav-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-datepicker .datepicker-header .nav-btn:disabled{opacity:.5;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year{font-weight:600;color:#495057;min-width:120px;text-align:center}.custom-datepicker .datepicker-header .month-year-selects{display:flex;gap:8px;align-items:center;min-width:180px;justify-content:center}.custom-datepicker .datepicker-header .month-year-selects select{appearance:none;background-color:#fff;border:1px solid #ced4da;border-radius:4px;padding:4px 24px 4px 8px;font-size:14px;font-weight:500;color:#495057;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23495057' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;background-size:8px}.custom-datepicker .datepicker-header .month-year-selects select:hover:not(:disabled){border-color:#86b7fe}.custom-datepicker .datepicker-header .month-year-selects select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.custom-datepicker .datepicker-header .month-year-selects select:disabled{background-color:#e9ecef;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year-selects .month-select{min-width:100px}.custom-datepicker .datepicker-header .month-year-selects .year-select{min-width:70px}.custom-datepicker .datepicker-calendar .weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.custom-datepicker .datepicker-calendar .weekdays .weekday{text-align:center;font-size:.75rem;font-weight:600;color:#6c757d;padding:.25rem}.custom-datepicker .datepicker-calendar .days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.custom-datepicker .datepicker-calendar .days .day-cell{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:.25rem;font-size:.875rem;transition:all .15s ease-in-out}.custom-datepicker .datepicker-calendar .days .day-cell:hover:not(.disabled){background-color:#e9ecef}.custom-datepicker .datepicker-calendar .days .day-cell.other-month{color:#adb5bd}.custom-datepicker .datepicker-calendar .days .day-cell.selected{background-color:#007bff;color:#fff}.custom-datepicker .datepicker-calendar .days .day-cell.selected:hover{background-color:#0056b3}.custom-datepicker .datepicker-calendar .days .day-cell.today{background-color:#f8f9fa;border:1px solid #007bff;font-weight:600}.custom-datepicker .datepicker-calendar .days .day-cell.today.selected{background-color:#007bff;color:#fff;border-color:#007bff}.custom-datepicker .datepicker-calendar .days .day-cell.disabled{color:#adb5bd;cursor:not-allowed;background-color:transparent}.custom-datepicker .datepicker-calendar .days .day-cell.disabled:hover{background-color:transparent}.custom-timepicker .time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:1rem 0}.custom-timepicker .time-controls .time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.custom-timepicker .time-controls .time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.custom-timepicker .time-controls .time-field .time-input-group{display:flex;flex-direction:column;align-items:center}.custom-timepicker .time-controls .time-field .time-input-group .time-btn{background:none;border:1px solid #dee2e6;width:24px;height:20px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#6c757d;font-size:.75rem}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:first-child{border-radius:.25rem .25rem 0 0;border-bottom:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:last-child{border-radius:0 0 .25rem .25rem;border-top:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:disabled{opacity:.5;cursor:not-allowed}.custom-timepicker .time-controls .time-field .time-input-group .time-input{width:50px;height:32px;text-align:center;border:1px solid #dee2e6;border-top:none;border-bottom:none;outline:none;font-size:.875rem}.custom-timepicker .time-controls .time-field .time-input-group .time-input:focus{border-color:#007bff;box-shadow:0 0 0 .2rem #007bff40}.custom-timepicker .time-controls .time-field .time-input-group .time-input:disabled{background-color:#e9ecef;opacity:1}.custom-timepicker .time-controls .time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:1rem .25rem 0;align-self:center}.custom-datepicker{width:100%}.datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.nav-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;font-size:.875rem;line-height:1;color:#495057;background-color:transparent;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.nav-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.nav-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.nav-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.month-year{font-weight:600;font-size:1rem;color:#212529}.datepicker-calendar{width:100%}.weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.weekday{padding:.5rem .25rem;text-align:center;font-weight:600;font-size:.75rem;color:#6c757d;background-color:#f8f9fa;border-radius:.25rem}.days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.day-cell{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;padding:0;font-size:.875rem;line-height:1;color:#212529;background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.day-cell:hover:not(.disabled){background-color:#e9ecef;border-color:#adb5bd}.day-cell.selected{color:#fff;background-color:#007bff;border-color:#007bff}.day-cell.today{font-weight:600;color:#007bff;border-color:#007bff}.day-cell.other-month{color:#6c757d;opacity:.5}.day-cell.disabled{color:#6c757d;background-color:transparent;cursor:not-allowed;opacity:.5}.toggle-time-btn,.toggle-calendar-btn{display:block;width:100%;padding:.375rem .75rem;margin-top:1rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#6c757d;text-align:center;background-color:transparent;border:1px solid #6c757d;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.toggle-time-btn:hover:not(:disabled),.toggle-calendar-btn:hover:not(:disabled){color:#495057;background-color:#6c757d;border-color:#6c757d}.toggle-time-btn:focus,.toggle-calendar-btn:focus{outline:0;box-shadow:0 0 0 .2rem #6c757d40}.toggle-time-btn:disabled,.toggle-calendar-btn:disabled{color:#6c757d;background-color:transparent;border-color:#6c757d;cursor:not-allowed;opacity:.65}.toggle-time-btn .fa-clock .fa-clock-o,.toggle-time-btn .fa-calendar,.toggle-calendar-btn .fa-clock .fa-clock-o,.toggle-calendar-btn .fa-calendar{margin-right:.5rem}.time-picker-container{margin-top:auto;padding-top:1rem}.custom-timepicker{width:100%}.time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem}.time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;font-size:.75rem;line-height:1;color:#495057;background-color:#f8f9fa;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.time-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.time-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.time-input{width:3rem;padding:.25rem .5rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem;text-align:center;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.time-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-input:disabled{background-color:#e9ecef;opacity:1}.time-input::-webkit-outer-spin-button,.time-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.time-input[type=number]{-moz-appearance:textfield}.time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:0 .25rem 1.75rem;align-self:flex-end}.icon-calendar,.icon-clock,.icon-chevron-left,.icon-chevron-right,.icon-chevron-up,.icon-chevron-down{display:inline-block;font-style:normal;font-feature-settings:normal;font-variant:normal;text-rendering:auto;line-height:1}.icon-calendar,.icon-clock{font-size:1.25rem}.icon-chevron-left,.icon-chevron-right{font-size:1.5rem;font-weight:700}.icon-chevron-up,.icon-chevron-down{font-size:.75rem}@media screen and (max-width: 576px){.calendar-popover,.calendar-popover.calendar-mobile-center{max-width:calc(100vw - 32px)}.calendar-popover:not(.calendar-align-left):not(.calendar-align-right):not(.calendar-mobile-center){max-width:calc(100vw - 32px)}.calendar-popover.calendar-align-left{left:16px;right:auto;max-width:calc(100vw - 32px)}.calendar-popover.calendar-align-right{left:auto;right:16px;max-width:calc(100vw - 32px)}.calendar-popover.calendar-position-top.show{transform:translateY(0)}.calendar-popover.calendar-position-top.hidden{transform:translateY(10px)}.calendar-popover.calendar-position-top.calendar-mobile-center.show{transform:translate(-50%)}.calendar-popover.calendar-position-top.calendar-mobile-center.hidden{transform:translate(-50%,10px)}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.WslTooltipDirective, selector: "[wslTooltip]", inputs: ["tooltipPlacement", "tooltipOffset", "tooltipIconOverlap"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
841
+ ], usesOnChanges: true, ngImport: i0, template: "<div class=\"datetime-picker-container\">\n <div class=\"input-container\">\n <input #dateInput [ngClass]=\"{\n 'ng-valid': ngControl?.valid === true,\n 'ng-invalid': ngControl?.invalid === true,\n 'ng-disabled': disabled\n }\" class=\"datetime-input\" (blur)=\"inputBlur()\" [placeholder]=\"_placeholder\" [ngModel]=\"getDisplayValue()\"\n (change)=\"onInputChange($event)\" [disabled]=\"disabled\" wslTooltip [tooltipIconOverlap]=\"12\"\n tooltipPlacement=\"top\" />\n </div>\n\n <button type=\"button\" class=\"calendar-icon\" [disabled]=\"disabled || disableCalendar\"\n [ngClass]=\"{ 'disabled-btn': disabled || disableCalendar }\" (click)=\"toggleCalendar($event)\">\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n\n <!-- Custom Calendar Popover -->\n <div class=\"calendar-popover\" [class.show]=\"showCalendar\" [class.hidden]=\"!showCalendar\"\n [ngClass]=\"calendarPositionClass\" (click)=\"$event.stopPropagation()\">\n <div class=\"popover-content\">\n <div *ngIf=\"!showTimePickerToggle\">\n <!-- Custom Date Picker -->\n <div class=\"custom-datepicker\">\n <div class=\"datepicker-header\">\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(-1)\" [disabled]=\"disabled\">\n <i class=\"fa fa-chevron-left\"></i>\n </button>\n <div class=\"month-year-selects\">\n <select class=\"month-select\" [(ngModel)]=\"currentMonth\" (change)=\"onMonthSelect($event)\"\n [disabled]=\"disabled\">\n <option *ngFor=\"let month of months; let i = index\" [value]=\"i + 1\">\n {{ month }}\n </option>\n </select>\n <select class=\"year-select\" [(ngModel)]=\"currentYear\" (change)=\"onYearSelect($event)\"\n [disabled]=\"disabled\">\n <option *ngFor=\"let year of years\" [value]=\"year\">\n {{ year }}\n </option>\n </select>\n </div>\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(1)\" [disabled]=\"disabled\">\n <i class=\"fa fa-chevron-right\"></i>\n </button>\n </div>\n\n <div class=\"datepicker-calendar\">\n <div class=\"weekdays\">\n <div class=\"weekday\" *ngFor=\"let day of weekdayLabels\">\n {{ day }}\n </div>\n </div>\n\n <div class=\"days\">\n <div class=\"day-cell\" *ngFor=\"let day of calendarDays\" [class.other-month]=\"day.otherMonth\"\n [class.selected]=\"day.selected\" [class.disabled]=\"day.disabled\" [class.today]=\"day.today\"\n (click)=\"selectDate(day)\">\n {{ day.day }}\n </div>\n </div>\n </div>\n </div>\n\n <button *ngIf=\"showTimeControls && !isDateOnly\" class=\"toggle-time-btn\" type=\"button\"\n [disabled]=\"!hasValidDate() || disabled\" (click)=\"toggleDateTimeState($event)\">\n <i class=\"fa fa-clock fa-clock-o fa-lg\"></i>\n </button>\n </div>\n\n <div *ngIf=\"showTimePickerToggle\">\n <button *ngIf=\"showTimeControls && !isDateOnly\" class=\"toggle-calendar-btn\" type=\"button\"\n (click)=\"toggleDateTimeState($event)\">\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n\n <div class=\"time-picker-container\" *ngIf=\"showTimeControls && !isDateOnly\">\n <!-- Custom Time Picker -->\n <div class=\"custom-timepicker\">\n <div class=\"time-controls\">\n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.hours || \"HH\" }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', hoursStep || 1)\"\n [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" class=\"time-input\" [value]=\"datetime?.hours || 0\"\n (change)=\"onTimeFieldChange('hours', $event)\" [disabled]=\"!hasValidDate() || disabled\" min=\"0\"\n max=\"23\" />\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', -(hoursStep || 1))\"\n [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"time-separator\">:</div>\n\n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.minutes || \"mm\" }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', minutesStep || 1)\"\n [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" class=\"time-input\" [value]=\"datetime?.minutes || 0\"\n (change)=\"onTimeFieldChange('minutes', $event)\" [disabled]=\"!hasValidDate() || disabled\" min=\"0\"\n max=\"59\" />\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', -(minutesStep || 1))\"\n [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"time-separator\" *ngIf=\"seconds\">:</div>\n\n <div class=\"time-field\" *ngIf=\"seconds\">\n <label>{{ dateConfig?.tokens?.seconds || \"ss\" }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', secondsStep || 1)\"\n [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" class=\"time-input\" [value]=\"datetime?.seconds || 0\"\n (change)=\"onTimeFieldChange('seconds', $event)\" [disabled]=\"!hasValidDate() || disabled\" min=\"0\"\n max=\"59\" />\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', -(secondsStep || 1))\"\n [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Backdrop for closing popover -->\n<div class=\"calendar-backdrop\" [class.show]=\"showCalendar\" (click)=\"closeCalendar()\"></div>", styles: [".datetime-picker-container{display:flex;position:relative;width:auto;max-width:300px}.input-container{flex:1;position:relative}.datetime-input{display:block;width:100%;height:-webkit-fill-available;height:-moz-available;height:stretch;padding:.375rem 4px .375rem .75rem;font-size:1rem;font-weight:400;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem 0 0 .25rem;border-right:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;text-transform:none!important}.datetime-input::placeholder{color:#6c757d;opacity:1}.datetime-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 4px #0d6efd}.datetime-input:disabled{background-color:#e9ecef;opacity:1}.datetime-input.ng-invalid{border-color:#dc3545}.datetime-input.ng-invalid:focus{box-shadow:0 0 4px #dc3545}.input-container:has(.datetime-input:focus)+.calendar-icon{border-top-color:#86b7fe;border-right-color:#86b7fe;border-bottom-color:#86b7fe;box-shadow:1px 0 4px #0d6efd}.input-container:has(.datetime-input:disabled)+.calendar-icon{border-top-color:#ced4da;border-right-color:#ced4da;border-bottom-color:#ced4da;background-color:#e9ecef}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon{border-top-color:#dc3545;border-right-color:#dc3545;border-bottom-color:#dc3545}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon:has(+ .input-container > .datetime-input:focus){box-shadow:1px 0 4px #dc3545}.calendar-icon{display:flex;align-items:center;justify-content:center;height:38px;width:auto;min-width:38px;padding:0 10px;background-color:#fff;border:1px solid #ced4da;border-radius:0 .25rem .25rem 0;z-index:1;cursor:pointer;position:relative;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.calendar-icon.disabled-btn{color:#6c757d;background-color:#e9ecef;cursor:not-allowed}.calendar-icon:hover:not(.disabled-btn){background-color:#f8f9fa}.fa-calendar,.fa-clock-o,.fa-clock{font-size:1em;line-height:1;vertical-align:middle}.calendar-popover{position:absolute;top:calc(100% + 2px);right:0;z-index:1060;display:block;min-width:300px;max-width:350px;font-family:inherit;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .5rem 1rem #00000026;opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .3s ease,visibility .3s ease,transform .3s ease}.calendar-popover.show{opacity:1;visibility:visible;transform:translateY(0)}.calendar-popover.hidden{opacity:0;visibility:hidden;transform:translateY(-10px)}.calendar-popover.calendar-position-top{top:auto;bottom:calc(100% + 2px);transform:translateY(10px)}.calendar-popover.calendar-position-top.show{transform:translateY(0)}.calendar-popover.calendar-position-top.hidden{transform:translateY(10px)}.calendar-popover.calendar-position-bottom{top:calc(100% + 2px);bottom:auto}.calendar-popover.calendar-align-left{left:0;right:auto}.calendar-popover.calendar-align-right{left:auto;right:0}.calendar-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1050;background-color:transparent;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}.calendar-backdrop.show{opacity:1;visibility:visible}.popover-content{padding:1rem}.custom-datepicker .datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.custom-datepicker .datepicker-header .nav-btn{background:none;border:none;padding:.25rem .5rem;cursor:pointer;border-radius:.25rem;color:#6c757d}.custom-datepicker .datepicker-header .nav-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-datepicker .datepicker-header .nav-btn:disabled{opacity:.5;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year{font-weight:600;color:#495057;min-width:120px;text-align:center}.custom-datepicker .datepicker-header .month-year-selects{display:flex;gap:8px;align-items:center;min-width:180px;justify-content:center}.custom-datepicker .datepicker-header .month-year-selects select{appearance:none;background-color:#fff;border:1px solid #ced4da;border-radius:4px;padding:4px 24px 4px 8px;font-size:14px;font-weight:500;color:#495057;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23495057' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;background-size:8px}.custom-datepicker .datepicker-header .month-year-selects select:hover:not(:disabled){border-color:#86b7fe}.custom-datepicker .datepicker-header .month-year-selects select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.custom-datepicker .datepicker-header .month-year-selects select:disabled{background-color:#e9ecef;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year-selects .month-select{min-width:100px}.custom-datepicker .datepicker-header .month-year-selects .year-select{min-width:70px}.custom-datepicker .datepicker-calendar .weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.custom-datepicker .datepicker-calendar .weekdays .weekday{text-align:center;font-size:.75rem;font-weight:600;color:#6c757d;padding:.25rem}.custom-datepicker .datepicker-calendar .days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.custom-datepicker .datepicker-calendar .days .day-cell{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:.25rem;font-size:.875rem;transition:all .15s ease-in-out}.custom-datepicker .datepicker-calendar .days .day-cell:hover:not(.disabled){background-color:#e9ecef}.custom-datepicker .datepicker-calendar .days .day-cell.other-month{color:#adb5bd}.custom-datepicker .datepicker-calendar .days .day-cell.selected{background-color:#007bff;color:#fff}.custom-datepicker .datepicker-calendar .days .day-cell.selected:hover{background-color:#0056b3}.custom-datepicker .datepicker-calendar .days .day-cell.today{background-color:#f8f9fa;border:1px solid #007bff;font-weight:600}.custom-datepicker .datepicker-calendar .days .day-cell.today.selected{background-color:#007bff;color:#fff;border-color:#007bff}.custom-datepicker .datepicker-calendar .days .day-cell.disabled{color:#adb5bd;cursor:not-allowed;background-color:transparent}.custom-datepicker .datepicker-calendar .days .day-cell.disabled:hover{background-color:transparent}.custom-timepicker .time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:1rem 0}.custom-timepicker .time-controls .time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.custom-timepicker .time-controls .time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.custom-timepicker .time-controls .time-field .time-input-group{display:flex;flex-direction:column;align-items:center}.custom-timepicker .time-controls .time-field .time-input-group .time-btn{background:none;border:1px solid #dee2e6;width:24px;height:20px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#6c757d;font-size:.75rem}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:first-child{border-radius:.25rem .25rem 0 0;border-bottom:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:last-child{border-radius:0 0 .25rem .25rem;border-top:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:disabled{opacity:.5;cursor:not-allowed}.custom-timepicker .time-controls .time-field .time-input-group .time-input{width:50px;height:32px;text-align:center;border:1px solid #dee2e6;border-top:none;border-bottom:none;outline:none;font-size:.875rem}.custom-timepicker .time-controls .time-field .time-input-group .time-input:focus{border-color:#007bff;box-shadow:0 0 0 .2rem #007bff40}.custom-timepicker .time-controls .time-field .time-input-group .time-input:disabled{background-color:#e9ecef;opacity:1}.custom-timepicker .time-controls .time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:1rem .25rem 0;align-self:center}.custom-datepicker{width:100%}.datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.nav-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;font-size:.875rem;line-height:1;color:#495057;background-color:transparent;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.nav-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.nav-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.nav-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.month-year{font-weight:600;font-size:1rem;color:#212529}.datepicker-calendar{width:100%}.weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.weekday{padding:.5rem .25rem;text-align:center;font-weight:600;font-size:.75rem;color:#6c757d;background-color:#f8f9fa;border-radius:.25rem}.days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.day-cell{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;padding:0;font-size:.875rem;line-height:1;color:#212529;background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.day-cell:hover:not(.disabled){background-color:#e9ecef;border-color:#adb5bd}.day-cell.selected{color:#fff;background-color:#007bff;border-color:#007bff}.day-cell.today{font-weight:600;color:#007bff;border-color:#007bff}.day-cell.other-month{color:#6c757d;opacity:.5}.day-cell.disabled{color:#6c757d;background-color:transparent;cursor:not-allowed;opacity:.5}.toggle-time-btn,.toggle-calendar-btn{display:block;width:100%;padding:.375rem .75rem;margin-top:1rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#6c757d;text-align:center;background-color:transparent;border:1px solid #6c757d;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.toggle-time-btn:hover:not(:disabled),.toggle-calendar-btn:hover:not(:disabled){color:#495057;background-color:#6c757d;border-color:#6c757d}.toggle-time-btn:focus,.toggle-calendar-btn:focus{outline:0;box-shadow:0 0 0 .2rem #6c757d40}.toggle-time-btn:disabled,.toggle-calendar-btn:disabled{color:#6c757d;background-color:transparent;border-color:#6c757d;cursor:not-allowed;opacity:.65}.toggle-time-btn .fa-clock .fa-clock-o,.toggle-time-btn .fa-calendar,.toggle-calendar-btn .fa-clock .fa-clock-o,.toggle-calendar-btn .fa-calendar{margin-right:.5rem}.time-picker-container{margin-top:auto;padding-top:1rem}.custom-timepicker{width:100%}.time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem}.time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;font-size:.75rem;line-height:1;color:#495057;background-color:#f8f9fa;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.time-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.time-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.time-input{width:3rem;padding:.25rem .5rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem;text-align:center;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.time-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-input:disabled{background-color:#e9ecef;opacity:1}.time-input::-webkit-outer-spin-button,.time-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.time-input[type=number]{-moz-appearance:textfield}.time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:0 .25rem 1.75rem;align-self:flex-end}.icon-calendar,.icon-clock,.icon-chevron-left,.icon-chevron-right,.icon-chevron-up,.icon-chevron-down{display:inline-block;font-style:normal;font-feature-settings:normal;font-variant:normal;text-rendering:auto;line-height:1}.icon-calendar,.icon-clock{font-size:1.25rem}.icon-chevron-left,.icon-chevron-right{font-size:1.5rem;font-weight:700}.icon-chevron-up,.icon-chevron-down{font-size:.75rem}@media screen and (max-width: 576px){.calendar-popover,.calendar-popover.calendar-mobile-center{max-width:calc(100vw - 32px)}.calendar-popover:not(.calendar-align-left):not(.calendar-align-right):not(.calendar-mobile-center){max-width:calc(100vw - 32px)}.calendar-popover.calendar-align-left{left:16px;right:auto;max-width:calc(100vw - 32px)}.calendar-popover.calendar-align-right{left:auto;right:16px;max-width:calc(100vw - 32px)}.calendar-popover.calendar-position-top.show{transform:translateY(0)}.calendar-popover.calendar-position-top.hidden{transform:translateY(10px)}.calendar-popover.calendar-position-top.calendar-mobile-center.show{transform:translate(-50%)}.calendar-popover.calendar-position-top.calendar-mobile-center.hidden{transform:translate(-50%,10px)}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.WslTooltipDirective, selector: "[wslTooltip]", inputs: ["tooltipPlacement", "tooltipOffset", "tooltipIconOverlap"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
810
842
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: WslDatetimePickerComponent, decorators: [{
811
843
  type: Component,
812
844
  args: [{ selector: 'wsl-datetime-picker', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
@@ -815,7 +847,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
815
847
  useExisting: forwardRef(() => WslDatetimePickerComponent),
816
848
  multi: true,
817
849
  },
818
- ], template: "<div class=\"datetime-picker-container\">\n <div class=\"input-container\">\n <input\n #dateInput\n [ngClass]=\"{\n 'ng-valid': ngControl?.valid === true,\n 'ng-invalid': ngControl?.invalid === true,\n 'ng-disabled': disabled\n }\"\n class=\"datetime-input\"\n (blur)=\"inputBlur()\"\n [placeholder]=\"placeholder\"\n [ngModel]=\"getDisplayValue()\"\n (change)=\"onInputChange($event)\"\n [disabled]=\"disabled\"\n wslTooltip\n [tooltipIconOverlap]=\"12\"\n tooltipPlacement=\"top\"\n />\n </div>\n\n <button\n type=\"button\"\n class=\"calendar-icon\"\n [disabled]=\"disabled || disableCalendar\"\n [ngClass]=\"{ 'disabled-btn': disabled || disableCalendar }\"\n (click)=\"toggleCalendar($event)\"\n >\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n\n <!-- Custom Calendar Popover -->\n <div\n class=\"calendar-popover\"\n [class.show]=\"showCalendar\"\n [class.hidden]=\"!showCalendar\"\n [ngClass]=\"calendarPositionClass\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"popover-content\">\n <div *ngIf=\"!showTimePickerToggle\">\n <!-- Custom Date Picker -->\n <div class=\"custom-datepicker\">\n <div class=\"datepicker-header\">\n <button\n type=\"button\"\n class=\"nav-btn\"\n (click)=\"navigateMonth(-1)\"\n [disabled]=\"disabled\"\n >\n <i class=\"fa fa-chevron-left\"></i>\n </button>\n <div class=\"month-year-selects\">\n <select\n class=\"month-select\"\n [(ngModel)]=\"currentMonth\"\n (change)=\"onMonthSelect($event)\"\n [disabled]=\"disabled\"\n >\n <option\n *ngFor=\"let month of months; let i = index\"\n [value]=\"i + 1\"\n >\n {{ month }}\n </option>\n </select>\n <select\n class=\"year-select\"\n [(ngModel)]=\"currentYear\"\n (change)=\"onYearSelect($event)\"\n [disabled]=\"disabled\"\n >\n <option *ngFor=\"let year of years\" [value]=\"year\">\n {{ year }}\n </option>\n </select>\n </div>\n <button\n type=\"button\"\n class=\"nav-btn\"\n (click)=\"navigateMonth(1)\"\n [disabled]=\"disabled\"\n >\n <i class=\"fa fa-chevron-right\"></i>\n </button>\n </div>\n\n <div class=\"datepicker-calendar\">\n <div class=\"weekdays\">\n <div class=\"weekday\" *ngFor=\"let day of weekdayLabels\">\n {{ day }}\n </div>\n </div>\n\n <div class=\"days\">\n <div\n class=\"day-cell\"\n *ngFor=\"let day of calendarDays\"\n [class.other-month]=\"day.otherMonth\"\n [class.selected]=\"day.selected\"\n [class.disabled]=\"day.disabled\"\n [class.today]=\"day.today\"\n (click)=\"selectDate(day)\"\n >\n {{ day.day }}\n </div>\n </div>\n </div>\n </div>\n\n <button\n *ngIf=\"showTimeControls && !isDateOnly\"\n class=\"toggle-time-btn\"\n type=\"button\"\n [disabled]=\"!hasValidDate() || disabled\"\n (click)=\"toggleDateTimeState($event)\"\n >\n <i class=\"fa fa-clock fa-clock-o fa-lg\"></i>\n </button>\n </div>\n\n <div *ngIf=\"showTimePickerToggle\">\n <button\n *ngIf=\"showTimeControls && !isDateOnly\"\n class=\"toggle-calendar-btn\"\n type=\"button\"\n (click)=\"toggleDateTimeState($event)\"\n >\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n\n <div\n class=\"time-picker-container\"\n *ngIf=\"showTimeControls && !isDateOnly\"\n >\n <!-- Custom Time Picker -->\n <div class=\"custom-timepicker\">\n <div class=\"time-controls\">\n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.hours || \"HH\" }}</label>\n <div class=\"time-input-group\">\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('hours', hoursStep || 1)\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input\n type=\"number\"\n class=\"time-input\"\n [value]=\"datetime?.hours || 0\"\n (change)=\"onTimeFieldChange('hours', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\"\n max=\"23\"\n />\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('hours', -(hoursStep || 1))\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"time-separator\">:</div>\n\n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.minutes || \"mm\" }}</label>\n <div class=\"time-input-group\">\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('minutes', minutesStep || 1)\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input\n type=\"number\"\n class=\"time-input\"\n [value]=\"datetime?.minutes || 0\"\n (change)=\"onTimeFieldChange('minutes', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\"\n max=\"59\"\n />\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('minutes', -(minutesStep || 1))\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"time-separator\" *ngIf=\"seconds\">:</div>\n\n <div class=\"time-field\" *ngIf=\"seconds\">\n <label>{{ dateConfig?.tokens?.seconds || \"ss\" }}</label>\n <div class=\"time-input-group\">\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('seconds', secondsStep || 1)\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input\n type=\"number\"\n class=\"time-input\"\n [value]=\"datetime?.seconds || 0\"\n (change)=\"onTimeFieldChange('seconds', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\"\n max=\"59\"\n />\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('seconds', -(secondsStep || 1))\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Backdrop for closing popover -->\n<div\n class=\"calendar-backdrop\"\n [class.show]=\"showCalendar\"\n (click)=\"closeCalendar()\"\n></div>\n", styles: [".datetime-picker-container{display:flex;position:relative;width:auto;max-width:300px}.input-container{flex:1;position:relative}.datetime-input{display:block;width:100%;height:-webkit-fill-available;height:-moz-available;height:stretch;padding:.375rem 4px .375rem .75rem;font-size:1rem;font-weight:400;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem 0 0 .25rem;border-right:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;text-transform:none!important}.datetime-input::placeholder{color:#6c757d;opacity:1}.datetime-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 4px #0d6efd}.datetime-input:disabled{background-color:#e9ecef;opacity:1}.datetime-input.ng-invalid{border-color:#dc3545}.datetime-input.ng-invalid:focus{box-shadow:0 0 4px #dc3545}.input-container:has(.datetime-input:focus)+.calendar-icon{border-top-color:#86b7fe;border-right-color:#86b7fe;border-bottom-color:#86b7fe;box-shadow:1px 0 4px #0d6efd}.input-container:has(.datetime-input:disabled)+.calendar-icon{border-top-color:#ced4da;border-right-color:#ced4da;border-bottom-color:#ced4da;background-color:#e9ecef}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon{border-top-color:#dc3545;border-right-color:#dc3545;border-bottom-color:#dc3545}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon:has(+ .input-container > .datetime-input:focus){box-shadow:1px 0 4px #dc3545}.calendar-icon{display:flex;align-items:center;justify-content:center;height:38px;width:auto;min-width:38px;padding:0 10px;background-color:#fff;border:1px solid #ced4da;border-radius:0 .25rem .25rem 0;z-index:1;cursor:pointer;position:relative;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.calendar-icon.disabled-btn{color:#6c757d;background-color:#e9ecef;cursor:not-allowed}.calendar-icon:hover:not(.disabled-btn){background-color:#f8f9fa}.fa-calendar,.fa-clock-o,.fa-clock{font-size:1em;line-height:1;vertical-align:middle}.calendar-popover{position:absolute;top:calc(100% + 2px);right:0;z-index:1060;display:block;min-width:300px;max-width:350px;font-family:inherit;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .5rem 1rem #00000026;opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .3s ease,visibility .3s ease,transform .3s ease}.calendar-popover.show{opacity:1;visibility:visible;transform:translateY(0)}.calendar-popover.hidden{opacity:0;visibility:hidden;transform:translateY(-10px)}.calendar-popover.calendar-position-top{top:auto;bottom:calc(100% + 2px);transform:translateY(10px)}.calendar-popover.calendar-position-top.show{transform:translateY(0)}.calendar-popover.calendar-position-top.hidden{transform:translateY(10px)}.calendar-popover.calendar-position-bottom{top:calc(100% + 2px);bottom:auto}.calendar-popover.calendar-align-left{left:0;right:auto}.calendar-popover.calendar-align-right{left:auto;right:0}.calendar-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1050;background-color:transparent;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}.calendar-backdrop.show{opacity:1;visibility:visible}.popover-content{padding:1rem}.custom-datepicker .datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.custom-datepicker .datepicker-header .nav-btn{background:none;border:none;padding:.25rem .5rem;cursor:pointer;border-radius:.25rem;color:#6c757d}.custom-datepicker .datepicker-header .nav-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-datepicker .datepicker-header .nav-btn:disabled{opacity:.5;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year{font-weight:600;color:#495057;min-width:120px;text-align:center}.custom-datepicker .datepicker-header .month-year-selects{display:flex;gap:8px;align-items:center;min-width:180px;justify-content:center}.custom-datepicker .datepicker-header .month-year-selects select{appearance:none;background-color:#fff;border:1px solid #ced4da;border-radius:4px;padding:4px 24px 4px 8px;font-size:14px;font-weight:500;color:#495057;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23495057' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;background-size:8px}.custom-datepicker .datepicker-header .month-year-selects select:hover:not(:disabled){border-color:#86b7fe}.custom-datepicker .datepicker-header .month-year-selects select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.custom-datepicker .datepicker-header .month-year-selects select:disabled{background-color:#e9ecef;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year-selects .month-select{min-width:100px}.custom-datepicker .datepicker-header .month-year-selects .year-select{min-width:70px}.custom-datepicker .datepicker-calendar .weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.custom-datepicker .datepicker-calendar .weekdays .weekday{text-align:center;font-size:.75rem;font-weight:600;color:#6c757d;padding:.25rem}.custom-datepicker .datepicker-calendar .days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.custom-datepicker .datepicker-calendar .days .day-cell{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:.25rem;font-size:.875rem;transition:all .15s ease-in-out}.custom-datepicker .datepicker-calendar .days .day-cell:hover:not(.disabled){background-color:#e9ecef}.custom-datepicker .datepicker-calendar .days .day-cell.other-month{color:#adb5bd}.custom-datepicker .datepicker-calendar .days .day-cell.selected{background-color:#007bff;color:#fff}.custom-datepicker .datepicker-calendar .days .day-cell.selected:hover{background-color:#0056b3}.custom-datepicker .datepicker-calendar .days .day-cell.today{background-color:#f8f9fa;border:1px solid #007bff;font-weight:600}.custom-datepicker .datepicker-calendar .days .day-cell.today.selected{background-color:#007bff;color:#fff;border-color:#007bff}.custom-datepicker .datepicker-calendar .days .day-cell.disabled{color:#adb5bd;cursor:not-allowed;background-color:transparent}.custom-datepicker .datepicker-calendar .days .day-cell.disabled:hover{background-color:transparent}.custom-timepicker .time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:1rem 0}.custom-timepicker .time-controls .time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.custom-timepicker .time-controls .time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.custom-timepicker .time-controls .time-field .time-input-group{display:flex;flex-direction:column;align-items:center}.custom-timepicker .time-controls .time-field .time-input-group .time-btn{background:none;border:1px solid #dee2e6;width:24px;height:20px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#6c757d;font-size:.75rem}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:first-child{border-radius:.25rem .25rem 0 0;border-bottom:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:last-child{border-radius:0 0 .25rem .25rem;border-top:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:disabled{opacity:.5;cursor:not-allowed}.custom-timepicker .time-controls .time-field .time-input-group .time-input{width:50px;height:32px;text-align:center;border:1px solid #dee2e6;border-top:none;border-bottom:none;outline:none;font-size:.875rem}.custom-timepicker .time-controls .time-field .time-input-group .time-input:focus{border-color:#007bff;box-shadow:0 0 0 .2rem #007bff40}.custom-timepicker .time-controls .time-field .time-input-group .time-input:disabled{background-color:#e9ecef;opacity:1}.custom-timepicker .time-controls .time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:1rem .25rem 0;align-self:center}.custom-datepicker{width:100%}.datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.nav-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;font-size:.875rem;line-height:1;color:#495057;background-color:transparent;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.nav-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.nav-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.nav-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.month-year{font-weight:600;font-size:1rem;color:#212529}.datepicker-calendar{width:100%}.weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.weekday{padding:.5rem .25rem;text-align:center;font-weight:600;font-size:.75rem;color:#6c757d;background-color:#f8f9fa;border-radius:.25rem}.days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.day-cell{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;padding:0;font-size:.875rem;line-height:1;color:#212529;background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.day-cell:hover:not(.disabled){background-color:#e9ecef;border-color:#adb5bd}.day-cell.selected{color:#fff;background-color:#007bff;border-color:#007bff}.day-cell.today{font-weight:600;color:#007bff;border-color:#007bff}.day-cell.other-month{color:#6c757d;opacity:.5}.day-cell.disabled{color:#6c757d;background-color:transparent;cursor:not-allowed;opacity:.5}.toggle-time-btn,.toggle-calendar-btn{display:block;width:100%;padding:.375rem .75rem;margin-top:1rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#6c757d;text-align:center;background-color:transparent;border:1px solid #6c757d;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.toggle-time-btn:hover:not(:disabled),.toggle-calendar-btn:hover:not(:disabled){color:#495057;background-color:#6c757d;border-color:#6c757d}.toggle-time-btn:focus,.toggle-calendar-btn:focus{outline:0;box-shadow:0 0 0 .2rem #6c757d40}.toggle-time-btn:disabled,.toggle-calendar-btn:disabled{color:#6c757d;background-color:transparent;border-color:#6c757d;cursor:not-allowed;opacity:.65}.toggle-time-btn .fa-clock .fa-clock-o,.toggle-time-btn .fa-calendar,.toggle-calendar-btn .fa-clock .fa-clock-o,.toggle-calendar-btn .fa-calendar{margin-right:.5rem}.time-picker-container{margin-top:auto;padding-top:1rem}.custom-timepicker{width:100%}.time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem}.time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;font-size:.75rem;line-height:1;color:#495057;background-color:#f8f9fa;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.time-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.time-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.time-input{width:3rem;padding:.25rem .5rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem;text-align:center;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.time-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-input:disabled{background-color:#e9ecef;opacity:1}.time-input::-webkit-outer-spin-button,.time-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.time-input[type=number]{-moz-appearance:textfield}.time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:0 .25rem 1.75rem;align-self:flex-end}.icon-calendar,.icon-clock,.icon-chevron-left,.icon-chevron-right,.icon-chevron-up,.icon-chevron-down{display:inline-block;font-style:normal;font-feature-settings:normal;font-variant:normal;text-rendering:auto;line-height:1}.icon-calendar,.icon-clock{font-size:1.25rem}.icon-chevron-left,.icon-chevron-right{font-size:1.5rem;font-weight:700}.icon-chevron-up,.icon-chevron-down{font-size:.75rem}@media screen and (max-width: 576px){.calendar-popover,.calendar-popover.calendar-mobile-center{max-width:calc(100vw - 32px)}.calendar-popover:not(.calendar-align-left):not(.calendar-align-right):not(.calendar-mobile-center){max-width:calc(100vw - 32px)}.calendar-popover.calendar-align-left{left:16px;right:auto;max-width:calc(100vw - 32px)}.calendar-popover.calendar-align-right{left:auto;right:16px;max-width:calc(100vw - 32px)}.calendar-popover.calendar-position-top.show{transform:translateY(0)}.calendar-popover.calendar-position-top.hidden{transform:translateY(10px)}.calendar-popover.calendar-position-top.calendar-mobile-center.show{transform:translate(-50%)}.calendar-popover.calendar-position-top.calendar-mobile-center.hidden{transform:translate(-50%,10px)}}\n"] }]
850
+ ], template: "<div class=\"datetime-picker-container\">\n <div class=\"input-container\">\n <input #dateInput [ngClass]=\"{\n 'ng-valid': ngControl?.valid === true,\n 'ng-invalid': ngControl?.invalid === true,\n 'ng-disabled': disabled\n }\" class=\"datetime-input\" (blur)=\"inputBlur()\" [placeholder]=\"_placeholder\" [ngModel]=\"getDisplayValue()\"\n (change)=\"onInputChange($event)\" [disabled]=\"disabled\" wslTooltip [tooltipIconOverlap]=\"12\"\n tooltipPlacement=\"top\" />\n </div>\n\n <button type=\"button\" class=\"calendar-icon\" [disabled]=\"disabled || disableCalendar\"\n [ngClass]=\"{ 'disabled-btn': disabled || disableCalendar }\" (click)=\"toggleCalendar($event)\">\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n\n <!-- Custom Calendar Popover -->\n <div class=\"calendar-popover\" [class.show]=\"showCalendar\" [class.hidden]=\"!showCalendar\"\n [ngClass]=\"calendarPositionClass\" (click)=\"$event.stopPropagation()\">\n <div class=\"popover-content\">\n <div *ngIf=\"!showTimePickerToggle\">\n <!-- Custom Date Picker -->\n <div class=\"custom-datepicker\">\n <div class=\"datepicker-header\">\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(-1)\" [disabled]=\"disabled\">\n <i class=\"fa fa-chevron-left\"></i>\n </button>\n <div class=\"month-year-selects\">\n <select class=\"month-select\" [(ngModel)]=\"currentMonth\" (change)=\"onMonthSelect($event)\"\n [disabled]=\"disabled\">\n <option *ngFor=\"let month of months; let i = index\" [value]=\"i + 1\">\n {{ month }}\n </option>\n </select>\n <select class=\"year-select\" [(ngModel)]=\"currentYear\" (change)=\"onYearSelect($event)\"\n [disabled]=\"disabled\">\n <option *ngFor=\"let year of years\" [value]=\"year\">\n {{ year }}\n </option>\n </select>\n </div>\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(1)\" [disabled]=\"disabled\">\n <i class=\"fa fa-chevron-right\"></i>\n </button>\n </div>\n\n <div class=\"datepicker-calendar\">\n <div class=\"weekdays\">\n <div class=\"weekday\" *ngFor=\"let day of weekdayLabels\">\n {{ day }}\n </div>\n </div>\n\n <div class=\"days\">\n <div class=\"day-cell\" *ngFor=\"let day of calendarDays\" [class.other-month]=\"day.otherMonth\"\n [class.selected]=\"day.selected\" [class.disabled]=\"day.disabled\" [class.today]=\"day.today\"\n (click)=\"selectDate(day)\">\n {{ day.day }}\n </div>\n </div>\n </div>\n </div>\n\n <button *ngIf=\"showTimeControls && !isDateOnly\" class=\"toggle-time-btn\" type=\"button\"\n [disabled]=\"!hasValidDate() || disabled\" (click)=\"toggleDateTimeState($event)\">\n <i class=\"fa fa-clock fa-clock-o fa-lg\"></i>\n </button>\n </div>\n\n <div *ngIf=\"showTimePickerToggle\">\n <button *ngIf=\"showTimeControls && !isDateOnly\" class=\"toggle-calendar-btn\" type=\"button\"\n (click)=\"toggleDateTimeState($event)\">\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n\n <div class=\"time-picker-container\" *ngIf=\"showTimeControls && !isDateOnly\">\n <!-- Custom Time Picker -->\n <div class=\"custom-timepicker\">\n <div class=\"time-controls\">\n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.hours || \"HH\" }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', hoursStep || 1)\"\n [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" class=\"time-input\" [value]=\"datetime?.hours || 0\"\n (change)=\"onTimeFieldChange('hours', $event)\" [disabled]=\"!hasValidDate() || disabled\" min=\"0\"\n max=\"23\" />\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', -(hoursStep || 1))\"\n [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"time-separator\">:</div>\n\n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.minutes || \"mm\" }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', minutesStep || 1)\"\n [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" class=\"time-input\" [value]=\"datetime?.minutes || 0\"\n (change)=\"onTimeFieldChange('minutes', $event)\" [disabled]=\"!hasValidDate() || disabled\" min=\"0\"\n max=\"59\" />\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', -(minutesStep || 1))\"\n [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"time-separator\" *ngIf=\"seconds\">:</div>\n\n <div class=\"time-field\" *ngIf=\"seconds\">\n <label>{{ dateConfig?.tokens?.seconds || \"ss\" }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', secondsStep || 1)\"\n [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" class=\"time-input\" [value]=\"datetime?.seconds || 0\"\n (change)=\"onTimeFieldChange('seconds', $event)\" [disabled]=\"!hasValidDate() || disabled\" min=\"0\"\n max=\"59\" />\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', -(secondsStep || 1))\"\n [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Backdrop for closing popover -->\n<div class=\"calendar-backdrop\" [class.show]=\"showCalendar\" (click)=\"closeCalendar()\"></div>", styles: [".datetime-picker-container{display:flex;position:relative;width:auto;max-width:300px}.input-container{flex:1;position:relative}.datetime-input{display:block;width:100%;height:-webkit-fill-available;height:-moz-available;height:stretch;padding:.375rem 4px .375rem .75rem;font-size:1rem;font-weight:400;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem 0 0 .25rem;border-right:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;text-transform:none!important}.datetime-input::placeholder{color:#6c757d;opacity:1}.datetime-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 4px #0d6efd}.datetime-input:disabled{background-color:#e9ecef;opacity:1}.datetime-input.ng-invalid{border-color:#dc3545}.datetime-input.ng-invalid:focus{box-shadow:0 0 4px #dc3545}.input-container:has(.datetime-input:focus)+.calendar-icon{border-top-color:#86b7fe;border-right-color:#86b7fe;border-bottom-color:#86b7fe;box-shadow:1px 0 4px #0d6efd}.input-container:has(.datetime-input:disabled)+.calendar-icon{border-top-color:#ced4da;border-right-color:#ced4da;border-bottom-color:#ced4da;background-color:#e9ecef}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon{border-top-color:#dc3545;border-right-color:#dc3545;border-bottom-color:#dc3545}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon:has(+ .input-container > .datetime-input:focus){box-shadow:1px 0 4px #dc3545}.calendar-icon{display:flex;align-items:center;justify-content:center;height:38px;width:auto;min-width:38px;padding:0 10px;background-color:#fff;border:1px solid #ced4da;border-radius:0 .25rem .25rem 0;z-index:1;cursor:pointer;position:relative;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.calendar-icon.disabled-btn{color:#6c757d;background-color:#e9ecef;cursor:not-allowed}.calendar-icon:hover:not(.disabled-btn){background-color:#f8f9fa}.fa-calendar,.fa-clock-o,.fa-clock{font-size:1em;line-height:1;vertical-align:middle}.calendar-popover{position:absolute;top:calc(100% + 2px);right:0;z-index:1060;display:block;min-width:300px;max-width:350px;font-family:inherit;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .5rem 1rem #00000026;opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .3s ease,visibility .3s ease,transform .3s ease}.calendar-popover.show{opacity:1;visibility:visible;transform:translateY(0)}.calendar-popover.hidden{opacity:0;visibility:hidden;transform:translateY(-10px)}.calendar-popover.calendar-position-top{top:auto;bottom:calc(100% + 2px);transform:translateY(10px)}.calendar-popover.calendar-position-top.show{transform:translateY(0)}.calendar-popover.calendar-position-top.hidden{transform:translateY(10px)}.calendar-popover.calendar-position-bottom{top:calc(100% + 2px);bottom:auto}.calendar-popover.calendar-align-left{left:0;right:auto}.calendar-popover.calendar-align-right{left:auto;right:0}.calendar-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1050;background-color:transparent;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}.calendar-backdrop.show{opacity:1;visibility:visible}.popover-content{padding:1rem}.custom-datepicker .datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.custom-datepicker .datepicker-header .nav-btn{background:none;border:none;padding:.25rem .5rem;cursor:pointer;border-radius:.25rem;color:#6c757d}.custom-datepicker .datepicker-header .nav-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-datepicker .datepicker-header .nav-btn:disabled{opacity:.5;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year{font-weight:600;color:#495057;min-width:120px;text-align:center}.custom-datepicker .datepicker-header .month-year-selects{display:flex;gap:8px;align-items:center;min-width:180px;justify-content:center}.custom-datepicker .datepicker-header .month-year-selects select{appearance:none;background-color:#fff;border:1px solid #ced4da;border-radius:4px;padding:4px 24px 4px 8px;font-size:14px;font-weight:500;color:#495057;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23495057' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;background-size:8px}.custom-datepicker .datepicker-header .month-year-selects select:hover:not(:disabled){border-color:#86b7fe}.custom-datepicker .datepicker-header .month-year-selects select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.custom-datepicker .datepicker-header .month-year-selects select:disabled{background-color:#e9ecef;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year-selects .month-select{min-width:100px}.custom-datepicker .datepicker-header .month-year-selects .year-select{min-width:70px}.custom-datepicker .datepicker-calendar .weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.custom-datepicker .datepicker-calendar .weekdays .weekday{text-align:center;font-size:.75rem;font-weight:600;color:#6c757d;padding:.25rem}.custom-datepicker .datepicker-calendar .days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.custom-datepicker .datepicker-calendar .days .day-cell{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:.25rem;font-size:.875rem;transition:all .15s ease-in-out}.custom-datepicker .datepicker-calendar .days .day-cell:hover:not(.disabled){background-color:#e9ecef}.custom-datepicker .datepicker-calendar .days .day-cell.other-month{color:#adb5bd}.custom-datepicker .datepicker-calendar .days .day-cell.selected{background-color:#007bff;color:#fff}.custom-datepicker .datepicker-calendar .days .day-cell.selected:hover{background-color:#0056b3}.custom-datepicker .datepicker-calendar .days .day-cell.today{background-color:#f8f9fa;border:1px solid #007bff;font-weight:600}.custom-datepicker .datepicker-calendar .days .day-cell.today.selected{background-color:#007bff;color:#fff;border-color:#007bff}.custom-datepicker .datepicker-calendar .days .day-cell.disabled{color:#adb5bd;cursor:not-allowed;background-color:transparent}.custom-datepicker .datepicker-calendar .days .day-cell.disabled:hover{background-color:transparent}.custom-timepicker .time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:1rem 0}.custom-timepicker .time-controls .time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.custom-timepicker .time-controls .time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.custom-timepicker .time-controls .time-field .time-input-group{display:flex;flex-direction:column;align-items:center}.custom-timepicker .time-controls .time-field .time-input-group .time-btn{background:none;border:1px solid #dee2e6;width:24px;height:20px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#6c757d;font-size:.75rem}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:first-child{border-radius:.25rem .25rem 0 0;border-bottom:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:last-child{border-radius:0 0 .25rem .25rem;border-top:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:disabled{opacity:.5;cursor:not-allowed}.custom-timepicker .time-controls .time-field .time-input-group .time-input{width:50px;height:32px;text-align:center;border:1px solid #dee2e6;border-top:none;border-bottom:none;outline:none;font-size:.875rem}.custom-timepicker .time-controls .time-field .time-input-group .time-input:focus{border-color:#007bff;box-shadow:0 0 0 .2rem #007bff40}.custom-timepicker .time-controls .time-field .time-input-group .time-input:disabled{background-color:#e9ecef;opacity:1}.custom-timepicker .time-controls .time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:1rem .25rem 0;align-self:center}.custom-datepicker{width:100%}.datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.nav-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;font-size:.875rem;line-height:1;color:#495057;background-color:transparent;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.nav-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.nav-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.nav-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.month-year{font-weight:600;font-size:1rem;color:#212529}.datepicker-calendar{width:100%}.weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.weekday{padding:.5rem .25rem;text-align:center;font-weight:600;font-size:.75rem;color:#6c757d;background-color:#f8f9fa;border-radius:.25rem}.days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.day-cell{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;padding:0;font-size:.875rem;line-height:1;color:#212529;background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.day-cell:hover:not(.disabled){background-color:#e9ecef;border-color:#adb5bd}.day-cell.selected{color:#fff;background-color:#007bff;border-color:#007bff}.day-cell.today{font-weight:600;color:#007bff;border-color:#007bff}.day-cell.other-month{color:#6c757d;opacity:.5}.day-cell.disabled{color:#6c757d;background-color:transparent;cursor:not-allowed;opacity:.5}.toggle-time-btn,.toggle-calendar-btn{display:block;width:100%;padding:.375rem .75rem;margin-top:1rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#6c757d;text-align:center;background-color:transparent;border:1px solid #6c757d;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.toggle-time-btn:hover:not(:disabled),.toggle-calendar-btn:hover:not(:disabled){color:#495057;background-color:#6c757d;border-color:#6c757d}.toggle-time-btn:focus,.toggle-calendar-btn:focus{outline:0;box-shadow:0 0 0 .2rem #6c757d40}.toggle-time-btn:disabled,.toggle-calendar-btn:disabled{color:#6c757d;background-color:transparent;border-color:#6c757d;cursor:not-allowed;opacity:.65}.toggle-time-btn .fa-clock .fa-clock-o,.toggle-time-btn .fa-calendar,.toggle-calendar-btn .fa-clock .fa-clock-o,.toggle-calendar-btn .fa-calendar{margin-right:.5rem}.time-picker-container{margin-top:auto;padding-top:1rem}.custom-timepicker{width:100%}.time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem}.time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;font-size:.75rem;line-height:1;color:#495057;background-color:#f8f9fa;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.time-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.time-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.time-input{width:3rem;padding:.25rem .5rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem;text-align:center;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.time-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-input:disabled{background-color:#e9ecef;opacity:1}.time-input::-webkit-outer-spin-button,.time-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.time-input[type=number]{-moz-appearance:textfield}.time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:0 .25rem 1.75rem;align-self:flex-end}.icon-calendar,.icon-clock,.icon-chevron-left,.icon-chevron-right,.icon-chevron-up,.icon-chevron-down{display:inline-block;font-style:normal;font-feature-settings:normal;font-variant:normal;text-rendering:auto;line-height:1}.icon-calendar,.icon-clock{font-size:1.25rem}.icon-chevron-left,.icon-chevron-right{font-size:1.5rem;font-weight:700}.icon-chevron-up,.icon-chevron-down{font-size:.75rem}@media screen and (max-width: 576px){.calendar-popover,.calendar-popover.calendar-mobile-center{max-width:calc(100vw - 32px)}.calendar-popover:not(.calendar-align-left):not(.calendar-align-right):not(.calendar-mobile-center){max-width:calc(100vw - 32px)}.calendar-popover.calendar-align-left{left:16px;right:auto;max-width:calc(100vw - 32px)}.calendar-popover.calendar-align-right{left:auto;right:16px;max-width:calc(100vw - 32px)}.calendar-popover.calendar-position-top.show{transform:translateY(0)}.calendar-popover.calendar-position-top.hidden{transform:translateY(10px)}.calendar-popover.calendar-position-top.calendar-mobile-center.show{transform:translate(-50%)}.calendar-popover.calendar-position-top.calendar-mobile-center.hidden{transform:translate(-50%,10px)}}\n"] }]
819
851
  }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.WslConfigService }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { dateString: [{
820
852
  type: Input
821
853
  }], inputDatetimeFormat: [{
@@ -836,6 +868,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
836
868
  type: Input
837
869
  }], calendarPosition: [{
838
870
  type: Input
871
+ }], placeholder: [{
872
+ type: Input
839
873
  }], allowedDates: [{
840
874
  type: Input
841
875
  }], monthChanged: [{
@@ -856,4 +890,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
856
890
  type: HostListener,
857
891
  args: ['window:scroll', ['$event']]
858
892
  }] } });
859
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3NsLWRhdGV0aW1lLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy13c2wtbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvd3NsLWRhdGV0aW1lLXBpY2tlci93c2wtZGF0ZXRpbWUtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXdzbC1saWJyYXJ5L3NyYy9saWIvY29tcG9uZW50cy93c2wtZGF0ZXRpbWUtcGlja2VyL3dzbC1kYXRldGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1QixPQUFPLEVBQ0wsYUFBYSxHQUdkLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFFWixLQUFLLEVBSUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBSXBFLE9BQU8sRUFBRSxjQUFjLEVBQTJCLE1BQU0sdUJBQXVCLENBQUM7QUFDaEYsT0FBTyxFQUNMLFVBQVUsRUFDVixrQkFBa0IsR0FDbkIsTUFBTSwyQ0FBMkMsQ0FBQzs7Ozs7O0FBK0JuRCxNQUFNLE9BQU8sMEJBQTBCO0lBa0dyQyxZQUNVLEdBQWEsRUFDYixhQUErQixFQUMvQixHQUFzQixFQUN0QixLQUFpQjtRQUhqQixRQUFHLEdBQUgsR0FBRyxDQUFVO1FBQ2Isa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBQy9CLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLFVBQUss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QkFHZCx1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDJCQUEyQixDQUFDOzRCQUN6RCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjt1TEFLUSxVQUFVO3NCQUFsQixLQUFLO2dCQU1GLG1CQUFtQjtzQkFEdEIsS0FBSztnQkFXRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBS0YsWUFBWTtzQkFEZixLQUFLO2dCQXNCSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFzQkgsY0FBYztzQkFEakIsS0FBSztnQkFZRixPQUFPO3NCQURWLEtBQUs7Z0JBeUNOLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFtQjFDLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBUXpDLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBub29wIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBEYXRlVGltZU1vZGVsLFxuICBXc2xEYXRlU3RydWN0LFxuICBXc2xUaW1lU3RydWN0LFxufSBmcm9tICcuLi8uLi9tb2RlbHMvd3NsLWRhdGUtdGltZS5tb2RlbCc7XG5pbXBvcnQge1xuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIE5nQ29udHJvbCxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBnZXREYXRlRm9ybWF0Q29uZmlnIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3dzbC1kYXRlLWZvcm1hdHMnO1xuaW1wb3J0IHsgRGF0ZUZvcm1hdENvbmZpZyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZGF0ZS1mb3JtYXQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFdzbENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25maWcvd3NsLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZ2V0Q3VycmVudERhdGUsIGdldEN1cnJlbnREYXRlVGltZU1vZGVsIH0gZnJvbSAnLi4vLi4vdXRpbHMvZGF0ZS10aW1lJztcbmltcG9ydCB7XG4gIFRJTUVfU1RFUFMsXG4gIElOUFVUX0RBVEVfRk9STUFUUyxcbn0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2RhdGV0aW1lLXBpY2tlci5jb25zdGFudHMnO1xuXG4vLyBXU0wgaW50ZXJmYWNlcyBmb3IgY29tcG9uZW50LXNwZWNpZmljIHR5cGVzXG5leHBvcnQgaW50ZXJmYWNlIFdzbERhdGVwaWNrZXJOYXZpZ2F0ZUV2ZW50IHtcbiAgY3VycmVudDogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXIgfTtcbiAgbmV4dDogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXIgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhckRheSB7XG4gIGRheTogbnVtYmVyO1xuICBtb250aDogbnVtYmVyO1xuICB5ZWFyOiBudW1iZXI7XG4gIG90aGVyTW9udGg6IGJvb2xlYW47XG4gIHNlbGVjdGVkOiBib29sZWFuO1xuICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgdG9kYXk6IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dzbC1kYXRldGltZS1waWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vd3NsLWRhdGV0aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3dzbC1kYXRldGltZS1waWNrZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gV3NsRGF0ZXRpbWVQaWNrZXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgV3NsRGF0ZXRpbWVQaWNrZXJDb21wb25lbnRcbiAgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlc1xue1xuICBASW5wdXQoKSBkYXRlU3RyaW5nITogc3RyaW5nO1xuXG4gIHByaXZhdGUgX2lucHV0RGF0ZXRpbWVGb3JtYXQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBzZXQgaW5wdXREYXRldGltZUZvcm1hdCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRoaXMuX2lucHV0RGF0ZXRpbWVGb3JtYXQgPT09IHZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5faW5wdXREYXRldGltZUZvcm1hdCA9IHZhbHVlO1xuICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUoKTtcbiAgfVxuXG4gIGdldCBpbnB1dERhdGV0aW1lRm9ybWF0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lucHV0RGF0ZXRpbWVGb3JtYXQ7XG4gIH1cblxuICBASW5wdXQoKSBob3Vyc1N0ZXA6IG51bWJlciA9IFRJTUVfU1RFUFMuSE9VUlM7XG4gIEBJbnB1dCgpIG1pbnV0ZXNTdGVwOiBudW1iZXIgPSBUSU1FX1NURVBTLk1JTlVURVM7XG4gIEBJbnB1dCgpIHNlY29uZHNTdGVwOiBudW1iZXIgPSBUSU1FX1NURVBTLlNFQ09ORFM7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1heERhdGU6IFdzbERhdGVTdHJ1Y3Q7XG4gIEBJbnB1dCgpIG1pbkRhdGU6IFdzbERhdGVTdHJ1Y3Q7XG4gIEBJbnB1dCgpIGRpc2FibGVDYWxlbmRhciA9IGZhbHNlO1xuICBASW5wdXQoKSBjYWxlbmRhclBvc2l0aW9uOiAnc3RhdGljJyB8ICdkeW5hbWljJyA9ICdkeW5hbWljJztcblxuICBwcml2YXRlIF9hbGxvd2VkRGF0ZXMhOiBXc2xEYXRlU3RydWN0W107XG5cbiAgQElucHV0KClcbiAgc2V0IGFsbG93ZWREYXRlcyh2YWx1ZTogV3NsRGF0ZVN0cnVjdFtdKSB7XG4gICAgdGhpcy5fYWxsb3dlZERhdGVzID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhbGxvd2VkRGF0ZXMoKTogV3NsRGF0ZVN0cnVjdFtdIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dlZERhdGVzO1xuICB9XG5cbiAgaW50ZXJuYWxGb3JtYXQ6IHN0cmluZyA9IElOUFVUX0RBVEVfRk9STUFUUy5EQVRFX09OTFk7XG4gIHByaXZhdGUgX3N0YW5kYXJkRm9ybWF0OiBzdHJpbmcgPSBJTlBVVF9EQVRFX0ZPUk1BVFMuRVVfREFURV9EQVNIO1xuXG4gIHBsYWNlaG9sZGVyID0gJyc7XG4gIHN0YXJ0RGF0ZTogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXIgfSA9IHsgeWVhcjogMCwgbW9udGg6IDAgfTtcbiAgc2hvd1RpbWVQaWNrZXJUb2dnbGUgPSBmYWxzZTtcbiAgZGF0ZXRpbWU6IERhdGVUaW1lTW9kZWwgPSBuZXcgRGF0ZVRpbWVNb2RlbCgpO1xuICBuZ0NvbnRyb2w6IE5nQ29udHJvbCB8IG51bGwgPSBudWxsO1xuICBkYXRlQ29uZmlnITogRGF0ZUZvcm1hdENvbmZpZztcblxuICBAT3V0cHV0KCkgbW9udGhDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBjYWxlbmRhclN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgb25DaGFuZ2U6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIGxhbmd1YWdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgc2hvd1RpbWVDb250cm9scyA9IGZhbHNlO1xuICBwcml2YXRlIF9zZWNvbmRzID0gZmFsc2U7XG4gIHByaXZhdGUgX3VwZGF0ZVBlbmRpbmcgPSBmYWxzZTtcblxuICBzaG93Q2FsZW5kYXIgPSBmYWxzZTtcbiAgY3VycmVudFllYXI6IG51bWJlcjtcbiAgY3VycmVudE1vbnRoOiBudW1iZXI7XG4gIGNhbGVuZGFyRGF5czogQ2FsZW5kYXJEYXlbXSA9IFtdO1xuICB3ZWVrZGF5TGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNhbGVuZGFyUG9zaXRpb25DbGFzcyA9ICcnO1xuXG4gIG1vbnRoczogc3RyaW5nW10gPSBbXTtcbiAgeWVhcnM6IG51bWJlcltdID0gW107XG4gIGRlZmF1bHRZZWFyUmFuZ2UgPSB7IHN0YXJ0OiAyMDAwLCBlbmQ6IDIwNTAgfTtcblxuICBASW5wdXQoKVxuICBzZXQgc3RhbmRhcmRGb3JtYXQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLl9zdGFuZGFyZEZvcm1hdCA9PT0gdmFsdWUpIHJldHVybjtcbiAgICB0aGlzLl9zdGFuZGFyZEZvcm1hdCA9IHZhbHVlO1xuICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUoKTtcbiAgfVxuXG4gIGdldCBzdGFuZGFyZEZvcm1hdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGFuZGFyZEZvcm1hdDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBzZWNvbmRzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuX3NlY29uZHMgPT09IHZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5fc2Vjb25kcyA9IHZhbHVlO1xuICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUoKTtcbiAgfVxuXG4gIGdldCBzZWNvbmRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWNvbmRzO1xuICB9XG5cbiAgaXNEYXRlT25seSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaW5qOiBJbmplY3RvcixcbiAgICBwcml2YXRlIGNvbmZpZ1NlcnZpY2U6IFdzbENvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWZcbiAgKSB7XG4gICAgY29uc3QgY3VycmVudERhdGUgPSBnZXRDdXJyZW50RGF0ZSgpO1xuICAgIHRoaXMuY3VycmVudFllYXIgPSBjdXJyZW50RGF0ZS55ZWFyO1xuICAgIHRoaXMuY3VycmVudE1vbnRoID0gY3VycmVudERhdGUubW9udGg7XG5cbiAgICB0aGlzLmRhdGVDb25maWcgPSBnZXREYXRlRm9ybWF0Q29uZmlnKCdlbicpO1xuXG4gICAgdGhpcy5sYW5ndWFnZVN1YnNjcmlwdGlvbiA9IHRoaXMuY29uZmlnU2VydmljZVxuICAgICAgLndhdGNoTGFuZ3VhZ2UoKVxuICAgICAgLnN1YnNjcmliZSgobGFuZ3VhZ2UpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmRhdGVDb25maWcgPSBnZXREYXRlRm9ybWF0Q29uZmlnKGxhbmd1YWdlIHx8ICdlbicpO1xuICAgICAgICAgIHRoaXMudXBkYXRlV2Vla2RheUxhYmVscygpO1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmRhdGVDb25maWcgPSBnZXREYXRlRm9ybWF0Q29uZmlnKCdlbicpO1xuICAgICAgICAgIHRoaXMudXBkYXRlV2Vla2RheUxhYmVscygpO1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaG93Q2FsZW5kYXIpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IGNhbGVuZGFyRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jYWxlbmRhci1wb3BvdmVyJyk7XG4gICAgICBjb25zdCBidXR0b25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNhbGVuZGFyLWljb24nKTtcblxuICAgICAgaWYgKFxuICAgICAgICBjYWxlbmRhckVsZW1lbnQgJiZcbiAgICAgICAgYnV0dG9uRWxlbWVudCAmJlxuICAgICAgICAhY2FsZW5kYXJFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkgJiZcbiAgICAgICAgIWJ1dHRvbkVsZW1lbnQuY29udGFpbnModGFyZ2V0KVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY2xvc2VDYWxlbmRhcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxuICBvbldpbmRvd1Jlc2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaG93Q2FsZW5kYXIgJiYgdGhpcy5jYWxlbmRhclBvc2l0aW9uID09PSAnZHluYW1pYycpIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlRHluYW1pY1Bvc2l0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNjcm9sbCcsIFsnJGV2ZW50J10pXG4gIG9uV2luZG93U2Nyb2xsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNob3dDYWxlbmRhciAmJiB0aGlzLmNhbGVuZGFyUG9zaXRpb24gPT09ICdkeW5hbWljJykge1xuICAgICAgdGhpcy5jYWxjdWxhdGVEeW5hbWljUG9zaXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm5nQ29udHJvbCA9IHRoaXMuaW5qLmdldChOZ0NvbnRyb2wpO1xuICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUxhbmd1YWdlQ29uZmlndXJhdGlvbigpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZU1vbnRoc0FuZFllYXJzKCk7XG4gICAgdGhpcy51cGRhdGVXZWVrZGF5TGFiZWxzKCk7XG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVMYW5ndWFnZUNvbmZpZ3VyYXRpb24oKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMYW5ndWFnZSA9IHRoaXMuY29uZmlnU2VydmljZS5sYW5ndWFnZTtcbiAgICAgIHRoaXMuZGF0ZUNvbmZpZyA9IGdldERhdGVGb3JtYXRDb25maWcoY3VycmVudExhbmd1YWdlIHx8ICdlbicpO1xuICAgICAgdGhpcy51cGRhdGVDb25maWd1cmF0aW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZGF0ZUNvbmZpZyA9IGdldERhdGVGb3JtYXRDb25maWcoJ2VuJyk7XG4gICAgICB0aGlzLnVwZGF0ZUNvbmZpZ3VyYXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ21pbkRhdGUnXSB8fCBjaGFuZ2VzWydtYXhEYXRlJ10pIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZU1vbnRoc0FuZFllYXJzKCk7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snYWxsb3dlZERhdGVzJ10pIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxhbmd1YWdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmxhbmd1YWdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlQ2FsZW5kYXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkICYmICF0aGlzLmRpc2FibGVDYWxlbmRhcikge1xuICAgICAgdGhpcy5zaG93Q2FsZW5kYXIgPSAhdGhpcy5zaG93Q2FsZW5kYXI7XG4gICAgICBpZiAodGhpcy5zaG93Q2FsZW5kYXIpIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgICAgIGlmICh0aGlzLmNhbGVuZGFyUG9zaXRpb24gPT09ICdkeW5hbWljJykge1xuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlRHluYW1pY1Bvc2l0aW9uKCk7XG4gICAgICAgICAgLy8gVXBkYXRlIHRyYW5zZm9ybXMgZm9yIHNob3cgc3RhdGVcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlQ2FsZW5kYXJUcmFuc2Zvcm1zKHRydWUpLCAxMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jYWxlbmRhclBvc2l0aW9uQ2xhc3MgPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNhbGVuZGFyU3RhdGVDaGFuZ2UuZW1pdCh0aGlzLnNob3dDYWxlbmRhcik7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZUNhbGVuZGFyKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0NhbGVuZGFyID0gZmFsc2U7XG4gICAgdGhpcy5zaG93VGltZVBpY2tlclRvZ2dsZSA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNhbGVuZGFyU3RhdGVDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUR5bmFtaWNQb3NpdGlvbigpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBjYWxlbmRhckVsZW1lbnQgPSBjb250YWluZXJFbGVtZW50Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAnLmNhbGVuZGFyLXBvcG92ZXInXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICBpZiAoIWNvbnRhaW5lckVsZW1lbnQgfHwgIWNhbGVuZGFyRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gY29udGFpbmVyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGNhbGVuZGFySWNvbkVsZW1lbnQgPSBjb250YWluZXJFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcuY2FsZW5kYXItaWNvbidcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCBpY29uUmVjdCA9XG4gICAgICAgIGNhbGVuZGFySWNvbkVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIHx8IGNvbnRhaW5lclJlY3Q7XG4gICAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICAgIGNvbnN0IGlzTW9iaWxlID0gdmlld3BvcnRXaWR0aCA8PSA1NzY7XG5cbiAgICAgIGNvbnN0IGNhbGVuZGFyV2lkdGggPSBpc01vYmlsZVxuICAgICAgICA/IE1hdGgubWluKGNhbGVuZGFyRWxlbWVudC5vZmZzZXRXaWR0aCB8fCAzNTAsIHZpZXdwb3J0V2lkdGggLSAzMilcbiAgICAgICAgOiBjYWxlbmRhckVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMzUwO1xuICAgICAgY29uc3QgY2FsZW5kYXJIZWlnaHQgPSBjYWxlbmRhckVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDQwMDtcblxuICAgICAgaWYgKGlzTW9iaWxlKSB7XG4gICAgICAgIHRoaXMuYXBwbHlNb2JpbGVQb3NpdGlvbmluZyhcbiAgICAgICAgICBjYWxlbmRhckVsZW1lbnQsXG4gICAgICAgICAgaWNvblJlY3QsXG4gICAgICAgICAgdmlld3BvcnRXaWR0aCxcbiAgICAgICAgICBjYWxlbmRhcldpZHRoXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHZlcnRpY2FsQ2xhc3MgPSB0aGlzLmdldFZlcnRpY2FsUG9zaXRpb25DbGFzcyhcbiAgICAgICAgICBjb250YWluZXJSZWN0LFxuICAgICAgICAgIHZpZXdwb3J0SGVpZ2h0LFxuICAgICAgICAgIGNhbGVuZGFySGVpZ2h0XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJQb3NpdGlvbkNsYXNzID0gdmVydGljYWxDbGFzcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xlYXJJbmxpbmVTdHlsZXMoY2FsZW5kYXJFbGVtZW50KTtcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbENsYXNzID0gdGhpcy5nZXRIb3Jpem9udGFsUG9zaXRpb25DbGFzcyhcbiAgICAgICAgICBjb250YWluZXJSZWN0LFxuICAgICAgICAgIHZpZXdwb3J0V2lkdGgsXG4gICAgICAgICAgY2FsZW5kYXJXaWR0aCxcbiAgICAgICAgICBpc01vYmlsZVxuICAgICAgICApO1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbENsYXNzID0gdGhpcy5nZXRWZXJ0aWNhbFBvc2l0aW9uQ2xhc3MoXG4gICAgICAgICAgY29udGFpbmVyUmVjdCxcbiAgICAgICAgICB2aWV3cG9ydEhlaWdodCxcbiAgICAgICAgICBjYWxlbmRhckhlaWdodFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNhbGVuZGFyUG9zaXRpb25DbGFzcyA9XG4gICAgICAgICAgYCR7aG9yaXpvbnRhbENsYXNzfSAke3ZlcnRpY2FsQ2xhc3N9YC50cmltKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlNb2JpbGVQb3NpdGlvbmluZyhcbiAgICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBpY29uUmVjdDogRE9NUmVjdCxcbiAgICB2aWV3cG9ydFdpZHRoOiBudW1iZXIsXG4gICAgY2FsZW5kYXJXaWR0aDogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBhZGRpbmcgPSAxNjtcbiAgICBjb25zdCB3b3VsZE92ZXJmbG93UmlnaHQgPVxuICAgICAgaWNvblJlY3QucmlnaHQgKyBjYWxlbmRhcldpZHRoICsgcGFkZGluZyA+IHZpZXdwb3J0V2lkdGg7XG4gICAgY29uc3Qgd291bGRPdmVyZmxvd0xlZnQgPSBpY29uUmVjdC5sZWZ0IC0gY2FsZW5kYXJXaWR0aCAtIHBhZGRpbmcgPCAwO1xuXG4gICAgaWYgKHdvdWxkT3ZlcmZsb3dSaWdodCAmJiB3b3VsZE92ZXJmbG93TGVmdCkge1xuICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7KHZpZXdwb3J0V2lkdGggLSBjYWxlbmRhcldpZHRoKSAvIDJ9cHhgO1xuICAgICAgZWxlbWVudC5zdHlsZS5yaWdodCA9ICdhdXRvJztcbiAgICB9IGVsc2UgaWYgKHdvdWxkT3ZlcmZsb3dSaWdodCkge1xuICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gJ3Vuc2V0JztcbiAgICAgIGVsZW1lbnQuc3R5bGUucmlnaHQgPSAnMCc7XG4gICAgfSBlbHNlIGlmICh3b3VsZE92ZXJmbG93TGVmdCkge1xuICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gJzAnO1xuICAgICAgZWxlbWVudC5zdHlsZS5yaWdodCA9ICd1bnNldCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9ICd1bnNldCc7XG4gICAgICBlbGVtZW50LnN0eWxlLnJpZ2h0ID0gJzAnO1xuICAgIH1cblxuICAgIGVsZW1lbnQuc3R5bGUubWF4V2lkdGggPSBgJHtjYWxlbmRhcldpZHRofXB4YDtcbiAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVZKC0xMHB4KSc7XG4gIH1cblxuICBwcml2YXRlIGNsZWFySW5saW5lU3R5bGVzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gJyc7XG4gICAgZWxlbWVudC5zdHlsZS5yaWdodCA9ICcnO1xuICAgIGVsZW1lbnQuc3R5bGUubWF4V2lkdGggPSAnJztcbiAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDYWxlbmRhclRyYW5zZm9ybXMoaXNTaG93OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWNvbnRhaW5lckVsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IGNhbGVuZGFyRWxlbWVudCA9IGNvbnRhaW5lckVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICcuY2FsZW5kYXItcG9wb3ZlcidcbiAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghY2FsZW5kYXJFbGVtZW50KSByZXR1cm47XG5cbiAgICBjb25zdCBpc01vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDw9IDU3NjtcbiAgICBjb25zdCBpc1RvcFBvc2l0aW9uID0gdGhpcy5jYWxlbmRhclBvc2l0aW9uQ2xhc3MuaW5jbHVkZXMoXG4gICAgICAnY2FsZW5kYXItcG9zaXRpb24tdG9wJ1xuICAgICk7XG5cbiAgICBpZiAoXG4gICAgICBpc01vYmlsZSAmJlxuICAgICAgdGhpcy5jYWxlbmRhclBvc2l0aW9uQ2xhc3MuaW5jbHVkZXMoJ2NhbGVuZGFyLW1vYmlsZS1jZW50ZXInKVxuICAgICkge1xuICAgICAgLy8gRHluYW1pYyBtb2JpbGUgY2VudGVyaW5nIHdpdGggcHJvcGVyIHRyYW5zZm9ybXNcbiAgICAgIGlmIChpc1Nob3cpIHtcbiAgICAgICAgY2FsZW5kYXJFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGlzVG9wUG9zaXRpb25cbiAgICAgICAgICA/ICd0cmFuc2xhdGVZKDApJ1xuICAgICAgICAgIDogJ3RyYW5zbGF0ZVkoMCknO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsZW5kYXJFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGlzVG9wUG9zaXRpb25cbiAgICAgICAgICA/ICd0cmFuc2xhdGVZKDEwcHgpJ1xuICAgICAgICAgIDogJ3RyYW5zbGF0ZVkoLTEwcHgpJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEhvcml6b250YWxQb3NpdGlvbkNsYXNzKFxuICAgIGNvbnRhaW5lclJlY3Q6IERPTVJlY3QsXG4gICAgdmlld3BvcnRXaWR0aDogbnVtYmVyLFxuICAgIGNhbGVuZGFyV2lkdGg6IG51bWJlcixcbiAgICBpc01vYmlsZTogYm9vbGVhblxuICApOiBzdHJpbmcge1xuICAgIGlmIChpc01vYmlsZSkge1xuICAgICAgY29uc3QgbW9iaWxlUGFkZGluZyA9IDE2O1xuXG4gICAgICAvLyBDaGVjayBpZiBjYWxlbmRhciB3b3VsZCBvdmVyZmxvdyB3aGVuIGdyb3dpbmcgcmlnaHQgZnJvbSBpY29uIChkZWZhdWx0KVxuICAgICAgY29uc3Qgd291bGRPdmVyZmxvd1JpZ2h0ID1cbiAgICAgICAgY29udGFpbmVyUmVjdC5yaWdodCArIGNhbGVuZGFyV2lkdGggKyBtb2JpbGVQYWRkaW5nID4gdmlld3BvcnRXaWR0aDtcblxuICAgICAgLy8gQ2hlY2sgaWYgY2FsZW5kYXIgd291bGQgb3ZlcmZsb3cgd2hlbiBncm93aW5nIGxlZnQgZnJvbSBsZWZ0IGVkZ2VcbiAgICAgIGNvbnN0IHdvdWxkT3ZlcmZsb3dMZWZ0ID1cbiAgICAgICAgY29udGFpbmVyUmVjdC5sZWZ0IC0gY2FsZW5kYXJXaWR0aCAtIG1vYmlsZVBhZGRpbmcgPCAwO1xuXG4gICAgICBpZiAod291bGRPdmVyZmxvd1JpZ2h0ICYmIHdvdWxkT3ZlcmZsb3dMZWZ0KSB7XG4gICAgICAgIC8vIE5vIHNwYWNlIG9uIGVpdGhlciBzaWRlIC0gY2VudGVyIGl0XG4gICAgICAgIHJldHVybiAnY2FsZW5kYXItbW9iaWxlLWNlbnRlcic7XG4gICAgICB9XG5cbiAgICAgIGlmICghd291bGRPdmVyZmxvd1JpZ2h0KSB7XG4gICAgICAgIC8vIEZpdHMgZ3Jvd2luZyByaWdodCBmcm9tIGljb24gLSBidXQgc3RpbGwgdXNlIHJpZ2h0IGFsaWdubWVudCB0byBlbnN1cmUgcGFkZGluZ1xuICAgICAgICByZXR1cm4gJ2NhbGVuZGFyLWFsaWduLXJpZ2h0JztcbiAgICAgIH1cblxuICAgICAgLy8gV291bGQgb3ZlcmZsb3cgcmlnaHQgYnV0IGZpdHMgb24gbGVmdCAtIGFsaWduIHRvIGxlZnQgZWRnZVxuICAgICAgcmV0dXJuICdjYWxlbmRhci1hbGlnbi1sZWZ0JztcbiAgICB9XG5cbiAgICAvLyBEZXNrdG9wIGxvZ2ljXG4gICAgY29uc3Qgd291bGRPdmVyZmxvd1JpZ2h0ID1cbiAgICAgIGNvbnRhaW5lclJlY3QucmlnaHQgKyBjYWxlbmRhcldpZHRoID4gdmlld3BvcnRXaWR0aDtcblxuICAgIGlmICghd291bGRPdmVyZmxvd1JpZ2h0KSB7XG4gICAgICByZXR1cm4gJyc7IC8vIERlZmF1bHQgcG9zaXRpb25pbmcgKGdyb3dzIHJpZ2h0IGZyb20gaWNvbilcbiAgICB9XG5cbiAgICBjb25zdCBzcGFjZUxlZnQgPSBjb250YWluZXJSZWN0LmxlZnQ7XG4gICAgaWYgKHNwYWNlTGVmdCA+PSBjYWxlbmRhcldpZHRoKSB7XG4gICAgICByZXR1cm4gJ2NhbGVuZGFyLWFsaWduLWxlZnQnOyAvLyBHcm93IHJpZ2h0IGZyb20gbGVmdCBlZGdlXG4gICAgfVxuXG4gICAgcmV0dXJuICcnOyAvLyBVc2UgZGVmYXVsdCBhcyBmYWxsYmFja1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRWZXJ0aWNhbFBvc2l0aW9uQ2xhc3MoXG4gICAgY29udGFpbmVyUmVjdDogRE9NUmVjdCxcbiAgICB2aWV3cG9ydEhlaWdodDogbnVtYmVyLFxuICAgIGNhbGVuZGFySGVpZ2h0OiBudW1iZXJcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBzcGFjZUJlbG93ID0gdmlld3BvcnRIZWlnaHQgLSBjb250YWluZXJSZWN0LmJvdHRvbTtcbiAgICBjb25zdCBzcGFjZUFib3ZlID0gY29udGFpbmVyUmVjdC50b3A7XG5cbiAgICBpZiAoc3BhY2VCZWxvdyA+PSBjYWxlbmRhckhlaWdodCkgcmV0dXJuICdjYWxlbmRhci1wb3NpdGlvbi1ib3R0b20nO1xuICAgIGlmIChzcGFjZUFib3ZlID49IGNhbGVuZGFySGVpZ2h0KSByZXR1cm4gJ2NhbGVuZGFyLXBvc2l0aW9uLXRvcCc7XG4gICAgcmV0dXJuIHNwYWNlQmVsb3cgPj0gc3BhY2VBYm92ZVxuICAgICAgPyAnY2FsZW5kYXItcG9zaXRpb24tYm90dG9tJ1xuICAgICAgOiAnY2FsZW5kYXItcG9zaXRpb24tdG9wJztcbiAgfVxuXG4gIG5hdmlnYXRlTW9udGgoZGlyZWN0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRNb250aCArPSBkaXJlY3Rpb247XG4gICAgaWYgKHRoaXMuY3VycmVudE1vbnRoID4gMTIpIHtcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gMTtcbiAgICAgIHRoaXMuY3VycmVudFllYXIrKztcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudE1vbnRoIDwgMSkge1xuICAgICAgdGhpcy5jdXJyZW50TW9udGggPSAxMjtcbiAgICAgIHRoaXMuY3VycmVudFllYXItLTtcbiAgICB9XG5cbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICB0aGlzLm1vbnRoQ2hhbmdlZC5lbWl0KHRoaXMuY3VycmVudE1vbnRoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHNlbGVjdERhdGUoZGF5OiBDYWxlbmRhckRheSk6IHZvaWQge1xuICAgIGlmIChkYXkuZGlzYWJsZWQpIHJldHVybjtcblxuICAgIGNvbnN0IHNlbGVjdGVkRGF0ZTogV3NsRGF0ZVN0cnVjdCA9IHtcbiAgICAgIHllYXI6IGRheS55ZWFyLFxuICAgICAgbW9udGg6IGRheS5tb250aCxcbiAgICAgIGRheTogZGF5LmRheSxcbiAgICB9O1xuXG4gICAgdGhpcy5vbkRhdGVDaGFuZ2Uoc2VsZWN0ZWREYXRlKTtcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdlbmVyYXRlQ2FsZW5kYXIoKTogdm9pZCB7XG4gICAgY29uc3QgZmlyc3REYXkgPSBuZXcgRGF0ZSh0aGlzLmN1cnJlbnRZZWFyLCB0aGlzLmN1cnJlbnRNb250aCAtIDEsIDEpO1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IG5ldyBEYXRlKGZpcnN0RGF5KTtcbiAgICBjb25zdCB3ZWVrU3RhcnQgPSAodGhpcy5kYXRlQ29uZmlnPy53ZWVrU3RhcnQgPz8gMSkgJSA3O1xuICAgIGNvbnN0IGRheU9mV2VlayA9IChmaXJzdERheS5nZXREYXkoKSArIDcgLSB3ZWVrU3RhcnQpICUgNztcbiAgICBzdGFydERhdGUuc2V0RGF0ZShzdGFydERhdGUuZ2V0RGF0ZSgpIC0gZGF5T2ZXZWVrKTtcblxuICAgIHRoaXMuY2FsZW5kYXJEYXlzID0gW107XG4gICAgY29uc3QgdG9kYXlEYXRlID0gZ2V0Q3VycmVudERhdGUoKTtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKHRvZGF5RGF0ZS55ZWFyLCB0b2RheURhdGUubW9udGggLSAxLCB0b2RheURhdGUuZGF5KTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDI7IGkrKykge1xuICAgICAgY29uc3QgY3VycmVudERhdGUgPSBuZXcgRGF0ZShzdGFydERhdGUpO1xuICAgICAgY3VycmVudERhdGUuc2V0RGF0ZShzdGFydERhdGUuZ2V0RGF0ZSgpICsgaSk7XG5cbiAgICAgIGNvbnN0IGRheVN0cnVjdDogV3NsRGF0ZVN0cnVjdCA9IHtcbiAgICAgICAgeWVhcjogY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgbW9udGg6IGN1cnJlbnREYXRlLmdldE1vbnRoKCkgKyAxLFxuICAgICAgICBkYXk6IGN1cnJlbnREYXRlLmdldERhdGUoKSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGNhbGVuZGFyRGF5OiBDYWxlbmRhckRheSA9IHtcbiAgICAgICAgZGF5OiBjdXJyZW50RGF0ZS5nZXREYXRlKCksXG4gICAgICAgIG1vbnRoOiBjdXJyZW50RGF0ZS5nZXRNb250aCgpICsgMSxcbiAgICAgICAgeWVhcjogY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgb3RoZXJNb250aDogY3VycmVudERhdGUuZ2V0TW9udGgoKSArIDEgIT09IHRoaXMuY3VycmVudE1vbnRoLFxuICAgICAgICBzZWxlY3RlZDogdGhpcy5pc0RhdGVTZWxlY3RlZChkYXlTdHJ1Y3QpLFxuICAgICAgICBkaXNhYmxlZDogdGhpcy5pc0RhdGVEaXNhYmxlZChkYXlTdHJ1Y3QpLFxuICAgICAgICB0b2RheTogdGhpcy5pc1NhbWVEYXRlKGN1cnJlbnREYXRlLCB0b2RheSksXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmNhbGVuZGFyRGF5cy5wdXNoKGNhbGVuZGFyRGF5KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzRGF0ZVNlbGVjdGVkKGRhdGU6IFdzbERhdGVTdHJ1Y3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLmRhdGV0aW1lICYmXG4gICAgICB0aGlzLmRhdGV0aW1lLnllYXIgPT09IGRhdGUueWVhciAmJlxuICAgICAgdGhpcy5kYXRldGltZS5tb250aCA9PT0gZGF0ZS5tb250aCAmJlxuICAgICAgdGhpcy5kYXRldGltZS5kYXkgPT09IGRhdGUuZGF5XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEYXRlRGlzYWJsZWQoZGF0ZTogV3NsRGF0ZVN0cnVjdCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKGRhdGUueWVhciwgZGF0ZS5tb250aCAtIDEsIGRhdGUuZGF5KTtcbiAgICBjb25zdCB0b2RheURhdGUgPSBnZXRDdXJyZW50RGF0ZSgpO1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUodG9kYXlEYXRlLnllYXIsIHRvZGF5RGF0ZS5tb250aCAtIDEsIHRvZGF5RGF0ZS5kYXkpO1xuICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuXG4gICAgaWYgKHRoaXMubWF4RGF0ZSkge1xuICAgICAgY29uc3QgbWF4RGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgICB0aGlzLm1heERhdGUueWVhcixcbiAgICAgICAgdGhpcy5tYXhEYXRlLm1vbnRoIC0gMSxcbiAgICAgICAgdGhpcy5tYXhEYXRlLmRheVxuICAgICAgKTtcbiAgICAgIGlmIChzZWxlY3RlZERhdGUgPiBtYXhEYXRlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm1pbkRhdGUpIHtcbiAgICAgIGNvbnN0IG1pbkRhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgdGhpcy5taW5EYXRlLnllYXIsXG4gICAgICAgIHRoaXMubWluRGF0ZS5tb250aCAtIDEsXG4gICAgICAgIHRoaXMubWluRGF0ZS5kYXlcbiAgICAgICk7XG4gICAgICBpZiAoc2VsZWN0ZWREYXRlIDwgbWluRGF0ZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmFsbG93ZWREYXRlcyAmJlxuICAgICAgdGhpcy5hbGxvd2VkRGF0ZXMubGVuZ3RoID09PSAxICYmXG4gICAgICB0aGlzLmFsbG93ZWREYXRlc1swXS5kYXkgPT09IC0xXG4gICAgKSB7XG4gICAgICByZXR1cm4gc2VsZWN0ZWREYXRlID4gdG9kYXk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmFsbG93ZWREYXRlcyB8fCB0aGlzLmFsbG93ZWREYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGlzQWxsb3dlZCA9IHRoaXMuYWxsb3dlZERhdGVzLmZpbmQoXG4gICAgICAoZGF5QWxsb3dlZCkgPT5cbiAgICAgICAgZGF5QWxsb3dlZC55ZWFyID09PSBkYXRlLnllYXIgJiZcbiAgICAgICAgZGF5QWxsb3dlZC5tb250aCA9PT0gZGF0ZS5tb250aCAmJlxuICAgICAgICBkYXlBbGxvd2VkLmRheSA9PT0gZGF0ZS5kYXlcbiAgICApO1xuXG4gICAgcmV0dXJuICFpc0FsbG93ZWQ7XG4gIH1cblxuICBwcml2YXRlIGlzU2FtZURhdGUoZGF0ZTE6IERhdGUsIGRhdGUyOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGRhdGUxLmdldEZ1bGxZZWFyKCkgPT09IGRhdGUyLmdldEZ1bGxZZWFyKCkgJiZcbiAgICAgIGRhdGUxLmdldE1vbnRoKCkgPT09IGRhdGUyLmdldE1vbnRoKCkgJiZcbiAgICAgIGRhdGUxLmdldERhdGUoKSA9PT0gZGF0ZTIuZ2V0RGF0ZSgpXG4gICAgKTtcbiAgfVxuXG4gIGdldE1vbnRoTmFtZShtb250aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBtb250aEluZGV4ID0gbW9udGggLSAxO1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmRhdGVDb25maWc/Lm1vbnRoTmFtZXM/Llttb250aEluZGV4XSB8fFxuICAgICAgZ2V0RGF0ZUZvcm1hdENvbmZpZygnZW4nKS5tb250aE5hbWVzW21vbnRoSW5kZXhdXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlV2Vla2RheUxhYmVscygpOiB2b2lkIHtcbiAgICB0aGlzLndlZWtkYXlMYWJlbHMgPVxuICAgICAgdGhpcy5kYXRlQ29uZmlnPy53ZWVrZGF5TGFiZWxzIHx8IGdldERhdGVGb3JtYXRDb25maWcoJ2VuJykud2Vla2RheUxhYmVscztcbiAgfVxuXG4gIGFkanVzdFRpbWUoZmllbGQ6ICdob3VycycgfCAnbWludXRlcycgfCAnc2Vjb25kcycsIHN0ZXA6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmRhdGV0aW1lW2ZpZWxkXSB8fCAwO1xuICAgIGxldCBuZXdWYWx1ZTogbnVtYmVyO1xuXG4gICAgaWYgKHN0ZXAgPiAwKSB7XG4gICAgICBuZXdWYWx1ZSA9IGN1cnJlbnRWYWx1ZSArIHN0ZXA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN0ZXBTaXplID0gTWF0aC5hYnMoc3RlcCk7XG4gICAgICBuZXdWYWx1ZSA9IGN1cnJlbnRWYWx1ZSAtIHN0ZXBTaXplO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgaWYgKG5ld1ZhbHVlIDwgMCkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gMjQgKyAobmV3VmFsdWUgJSAyNCk7XG4gICAgICAgIH0gZWxzZSBpZiAobmV3VmFsdWUgPiAyMykge1xuICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUgJSAyNDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgIGlmIChuZXdWYWx1ZSA8IDApIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IDYwICsgKG5ld1ZhbHVlICUgNjApO1xuICAgICAgICB9IGVsc2UgaWYgKG5ld1ZhbHVlID4gNTkpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IG5ld1ZhbHVlICUgNjA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRldGltZVtmaWVsZF0gPSBuZXdWYWx1ZTtcbiAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25UaW1lRmllbGRDaGFuZ2UoXG4gICAgZmllbGQ6ICdob3VycycgfCAnbWludXRlcycgfCAnc2Vjb25kcycsXG4gICAgZXZlbnQ6IEV2ZW50XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgbGV0IHZhbHVlID0gcGFyc2VJbnQoaW5wdXQudmFsdWUsIDEwKTtcblxuICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gMDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMDtcbiAgICAgICAgaWYgKHZhbHVlID4gMjMpIHZhbHVlID0gMjM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWludXRlcyc6XG4gICAgICBjYXNlICdzZWNvbmRzJzpcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAwO1xuICAgICAgICBpZiAodmFsdWUgPiA1OSkgdmFsdWUgPSA1OTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaW5wdXQudmFsdWUgPSB2YWx1ZS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG5cbiAgICB0aGlzLmRhdGV0aW1lW2ZpZWxkXSA9IHZhbHVlO1xuICAgIHRoaXMuc2V0RGF0ZVN0cmluZ01vZGVsKCk7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlVXBkYXRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faXNJbml0aWFsaXplZCB8fCB0aGlzLl91cGRhdGVQZW5kaW5nKSByZXR1cm47XG5cbiAgICB0aGlzLl91cGRhdGVQZW5kaW5nID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX3VwZGF0ZVBlbmRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMudXBkYXRlQ29uZmlndXJhdGlvbigpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb25maWd1cmF0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuZGV0ZWN0VGltZUNvbXBvbmVudHMoKTtcbiAgICB0aGlzLnNldFN0YW5kYXJkRm9ybWF0KCk7XG4gICAgdGhpcy5zZXRQbGFjZWhvbGRlcigpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRlY3RUaW1lQ29tcG9uZW50cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnB1dERhdGV0aW1lRm9ybWF0KSB7XG4gICAgICBjb25zdCBoYXNUaW1lRm9ybWF0ID0gdGhpcy5oYXNUaW1lSW5Gb3JtYXQodGhpcy5pbnB1dERhdGV0aW1lRm9ybWF0KTtcblxuICAgICAgaWYgKCFoYXNUaW1lRm9ybWF0KSB7XG4gICAgICAgIHRoaXMuc2hvd1RpbWVDb250cm9scyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9zZWNvbmRzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNEYXRlT25seSA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zaG93VGltZUNvbnRyb2xzID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNEYXRlT25seSA9IGZhbHNlO1xuICAgICAgdGhpcy5fc2Vjb25kcyA9IHRoaXMuaW5wdXREYXRldGltZUZvcm1hdC5pbmNsdWRlcygnOnNzJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2hvd1RpbWVDb250cm9scyA9IHRoaXMuX3NlY29uZHM7XG4gICAgICB0aGlzLmlzRGF0ZU9ubHkgPSAhdGhpcy5fc2Vjb25kcztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc1RpbWVJbkZvcm1hdChmb3JtYXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmb3JtYXQuaW5jbHVkZXMoJ0hIOicpIHx8XG4gICAgICBmb3JtYXQuaW5jbHVkZXMoJ2hoOicpIHx8XG4gICAgICBmb3JtYXQuaW5jbHVkZXMoJzptbScpIHx8XG4gICAgICBmb3JtYXQuaW5jbHVkZXMoJzpzcycpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U3RhbmRhcmRGb3JtYXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbnRlcm5hbEZvcm1hdCA9XG4gICAgICB0aGlzLmlucHV0RGF0ZXRpbWVGb3JtYXQgfHwgSU5QVVRfREFURV9GT1JNQVRTLkRBVEVfT05MWTtcbiAgICB0aGlzLl9zdGFuZGFyZEZvcm1hdCA9IHRoaXMuaW50ZXJuYWxGb3JtYXQ7XG5cbiAgICBpZiAodGhpcy5zaG93VGltZUNvbnRyb2xzICYmICF0aGlzLmhhc1RpbWVJbkZvcm1hdCh0aGlzLl9zdGFuZGFyZEZvcm1hdCkpIHtcbiAgICAgIHRoaXMuX3N0YW5kYXJkRm9ybWF0ICs9IHRoaXMuX3NlY29uZHMgPyAnIEhIOm1tOnNzJyA6ICcgSEg6bW0nO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0UGxhY2Vob2xkZXIoKTogdm9pZCB7XG4gICAgdGhpcy5wbGFjZWhvbGRlciA9XG4gICAgICB0aGlzLmRhdGVDb25maWc/LnBsYWNlaG9sZGVyPy50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICBJTlBVVF9EQVRFX0ZPUk1BVFMuREFURV9PTkxZLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAodGhpcy5zaG93VGltZUNvbnRyb2xzKSB7XG4gICAgICB0aGlzLnBsYWNlaG9sZGVyICs9IHRoaXMuX3NlY29uZHMgPyAnIGhoOm1tOnNzJyA6ICcgaGg6bW0nO1xuICAgIH1cbiAgfVxuXG4gIHdyaXRlVmFsdWUobmV3TW9kZWw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChuZXdNb2RlbCkge1xuICAgICAgY29uc3QgcGFyc2VkTW9kZWwgPSBEYXRlVGltZU1vZGVsLmZyb21Mb2NhbFN0cmluZyhuZXdNb2RlbCwgZmFsc2UpO1xuXG4gICAgICBpZiAocGFyc2VkTW9kZWwgJiYgdHlwZW9mIHBhcnNlZE1vZGVsLnllYXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHRoaXMuZGF0ZXRpbWUgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIHRoaXMuZGF0ZXRpbWUgfHwgbmV3IERhdGVUaW1lTW9kZWwoKSxcbiAgICAgICAgICBwYXJzZWRNb2RlbFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmRhdGVTdHJpbmcgPSBuZXdNb2RlbDtcbiAgICAgICAgdGhpcy5zZXREYXRlU3RyaW5nTW9kZWwoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRldGltZSA9IG5ldyBEYXRlVGltZU1vZGVsKCk7XG4gICAgICB0aGlzLmRhdGVTdHJpbmcgPSAnJztcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG5hdmlnYXRlKGV2ZW50OiBXc2xEYXRlcGlja2VyTmF2aWdhdGVFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudD8uY3VycmVudCAmJiBldmVudD8uY3VycmVudC5tb250aCAhPT0gZXZlbnQ/Lm5leHQubW9udGgpIHtcbiAgICAgIHRoaXMubW9udGhDaGFuZ2VkLmVtaXQoZXZlbnQ/Lm5leHQubW9udGgpO1xuICAgIH1cbiAgfVxuXG4gIGlzRGlzYWJsZWQoXG4gICAgZGF0ZXM6IFdzbERhdGVTdHJ1Y3RbXVxuICApOiAoXG4gICAgZGF0ZTogV3NsRGF0ZVN0cnVjdCxcbiAgICBjdXJyZW50PzogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXIgfVxuICApID0+IGJvb2xlYW4ge1xuICAgIHJldHVybiAocGlja2VyRGF0ZTogV3NsRGF0ZVN0cnVjdCkgPT4ge1xuICAgICAgY29uc3Qgb3JpZ2luYWxBbGxvd2VkRGF0ZXMgPSB0aGlzLmFsbG93ZWREYXRlcztcbiAgICAgIHRoaXMuYWxsb3dlZERhdGVzID0gZGF0ZXM7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmlzRGF0ZURpc2FibGVkKHBpY2tlckRhdGUpO1xuICAgICAgdGhpcy5hbGxvd2VkRGF0ZXMgPSBvcmlnaW5hbEFsbG93ZWREYXRlcztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICB0b2dnbGVEYXRlVGltZVN0YXRlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhc1ZhbGlkRGF0ZSgpKSB7XG4gICAgICB0aGlzLnNob3dUaW1lUGlja2VyVG9nZ2xlID0gIXRoaXMuc2hvd1RpbWVQaWNrZXJUb2dnbGU7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGdldERlbGltaXRlcigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmRhdGVDb25maWc/LmZvcm1hdCkge1xuICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmRhdGVDb25maWcuZm9ybWF0Lm1hdGNoKC9bXmEtekEtWjAtOV0vKTtcbiAgICAgIGlmIChtYXRjaCAmJiBtYXRjaFswXSkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMF07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhdGVDb25maWc/LmRhdGVTZXBhcmF0b3IgfHwgJy0nO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZURhdGUodmFsdWU6IHN0cmluZyk6IFdzbERhdGVTdHJ1Y3QgfCBudWxsIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkZWxpbWl0ZXIgPSB0aGlzLmdldERlbGltaXRlcigpO1xuICAgIGNvbnN0IGRhdGUgPSB2YWx1ZS5zcGxpdChkZWxpbWl0ZXIpO1xuXG4gICAgaWYgKGRhdGUubGVuZ3RoIDwgMykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmRhdGVDb25maWc/LmRheUZpcnN0KSB7XG4gICAgICAgIGNvbnN0IGRheSA9IHBhcnNlSW50KGRhdGVbMF0sIDEwKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBwYXJzZUludChkYXRlWzFdLCAxMCk7XG4gICAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChkYXRlWzJdLCAxMCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzTmFOKGRheSkgfHxcbiAgICAgICAgICBpc05hTihtb250aCkgfHxcbiAgICAgICAgICBpc05hTih5ZWFyKSB8fFxuICAgICAgICAgIGRheSA8IDEgfHxcbiAgICAgICAgICBkYXkgPiAzMSB8fFxuICAgICAgICAgIG1vbnRoIDwgMSB8fFxuICAgICAgICAgIG1vbnRoID4gMTJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBkYXksIG1vbnRoLCB5ZWFyIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3JtYXQ6IElOUFVUX0RBVEVfRk9STUFUUy5EQVRFX09OTFkgKHl5eXktTU0tZGQpXG4gICAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChkYXRlWzBdLCAxMCk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gcGFyc2VJbnQoZGF0ZVsxXSwgMTApO1xuICAgICAgICBjb25zdCBkYXkgPSBwYXJzZUludChkYXRlWzJdLCAxMCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzTmFOKGRheSkgfHxcbiAgICAgICAgICBpc05hTihtb250aCkgfHxcbiAgICAgICAgICBpc05hTih5ZWFyKSB8fFxuICAgICAgICAgIGRheSA8IDEgfHxcbiAgICAgICAgICBkYXkgPiAzMSB8fFxuICAgICAgICAgIG1vbnRoIDwgMSB8fFxuICAgICAgICAgIG1vbnRoID4gMTJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyB5ZWFyLCBtb250aCwgZGF5IH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0RGF0ZShkYXRlOiBXc2xEYXRlU3RydWN0IHwgbnVsbCk6IHN0cmluZyB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgZGVsaW1pdGVyID0gdGhpcy5nZXREZWxpbWl0ZXIoKTtcbiAgICBjb25zdCBkYXlGb3JtYXR0ZWQgPSBkYXRlLmRheSA8IDEwID8gJzAnICsgZGF0ZS5kYXkgOiBkYXRlLmRheS50b1N0cmluZygpO1xuICAgIGNvbnN0IG1vbnRoRm9ybWF0dGVkID1cbiAgICAgIGRhdGUubW9udGggPCAxMCA/ICcwJyArIGRhdGUubW9udGggOiBkYXRlLm1vbnRoLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgeWVhckZvcm1hdHRlZCA9IGRhdGUueWVhci50b1N0cmluZygpO1xuXG4gICAgaWYgKHRoaXMuZGF0ZUNvbmZpZz8uZGF5Rmlyc3QpIHtcbiAgICAgIHJldHVybiBgJHtkYXlGb3JtYXR0ZWR9JHtkZWxpbWl0ZXJ9JHttb250aEZvcm1hdHRlZH0ke2RlbGltaXRlcn0ke3llYXJGb3JtYXR0ZWR9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7eWVhckZvcm1hdHRlZH0ke2RlbGltaXRlcn0ke21vbnRoRm9ybWF0dGVkfSR7ZGVsaW1pdGVyfSR7ZGF5Rm9ybWF0dGVkfWA7XG4gIH1cblxuICBvbklucHV0Q2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcblxuICAgIGlmICh2YWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aGlzLmRhdGV0aW1lID0gbmV3IERhdGVUaW1lTW9kZWwoKTtcbiAgICAgIHRoaXMuZGF0ZVN0cmluZyA9ICcnO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmRhdGVTdHJpbmcpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkRGF0ZSA9IHRoaXMucGFyc2VEYXRlKHZhbHVlKTtcbiAgICBpZiAocGFyc2VkRGF0ZSkge1xuICAgICAgdGhpcy5kYXRldGltZSA9IG5ldyBEYXRlVGltZU1vZGVsKHtcbiAgICAgICAgeWVhcjogcGFyc2VkRGF0ZS55ZWFyLFxuICAgICAgICBtb250aDogcGFyc2VkRGF0ZS5tb250aCxcbiAgICAgICAgZGF5OiBwYXJzZWREYXRlLmRheSxcbiAgICAgICAgaG91cnM6IHRoaXMuZGF0ZXRpbWU/LmhvdXJzIHx8IDAsXG4gICAgICAgIG1pbnV0ZXM6IHRoaXMuZGF0ZXRpbWU/Lm1pbnV0ZXMgfHwgMCxcbiAgICAgICAgc2Vjb25kczogdGhpcy5kYXRldGltZT8uc2Vjb25kcyB8fCAwLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xuICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZHQgPSBEYXRlVGltZU1vZGVsLmZyb21Mb2NhbFN0cmluZyh2YWx1ZSk7XG4gICAgaWYgKGR0ICYmIGR0LnllYXIpIHtcbiAgICAgIHRoaXMuZGF0ZXRpbWUgPSBkdDtcbiAgICAgIHRoaXMuc2V0RGF0ZVN0cmluZ01vZGVsKCk7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgb25EYXRlQ2hhbmdlKGV2ZW50OiBzdHJpbmcgfCBXc2xEYXRlU3RydWN0KTogdm9pZCB7XG4gICAgbGV0IGRhdGU6IERhdGVUaW1lTW9kZWw7XG5cbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgZGF0ZSA9IG5ldyBEYXRlVGltZU1vZGVsKHRoaXMucGFyc2VEYXRlKGV2ZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGUgPSBuZXcgRGF0ZVRpbWVNb2RlbChldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKCFkYXRlIHx8ICFkYXRlLnllYXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZGF0ZXRpbWUpIHtcbiAgICAgIHRoaXMuZGF0ZXRpbWUgPSBkYXRlO1xuICAgIH1cblxuICAgIHRoaXMuZGF0ZXRpbWUueWVhciA9IGRhdGUueWVhcjtcbiAgICB0aGlzLmRhdGV0aW1lLm1vbnRoID0gZGF0ZS5tb250aDtcbiAgICB0aGlzLmRhdGV0aW1lLmRheSA9IGRhdGUuZGF5O1xuXG4gICAgdGhpcy5jdXJyZW50WWVhciA9IGRhdGUueWVhcjtcbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IGRhdGUubW9udGg7XG5cbiAgICB0aGlzLnN0YXJ0RGF0ZSA9IHtcbiAgICAgIHllYXI6IGRhdGUueWVhcixcbiAgICAgIG1vbnRoOiBkYXRlLm1vbnRoLFxuICAgIH07XG5cbiAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xuICB9XG5cbiAgc2V0RGF0ZVN0cmluZ01vZGVsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGV0aW1lICYmIHR5cGVvZiB0aGlzLmRhdGV0aW1lLnllYXIgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLmRhdGVTdHJpbmcgPSB0aGlzLmRhdGV0aW1lLnRvU3RyaW5nKCk7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuZGF0ZVN0cmluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0ZVN0cmluZyA9ICcnO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmRhdGVTdHJpbmcpO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0RGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZGF0ZXRpbWUgJiYgdGhpcy5kYXRldGltZS55ZWFyKSB7XG4gICAgICBjb25zdCBkYXRlU3RydWN0OiBXc2xEYXRlU3RydWN0ID0ge1xuICAgICAgICB5ZWFyOiB0aGlzLmRhdGV0aW1lLnllYXIsXG4gICAgICAgIG1vbnRoOiB0aGlzLmRhdGV0aW1lLm1vbnRoLFxuICAgICAgICBkYXk6IHRoaXMuZGF0ZXRpbWUuZGF5LFxuICAgICAgfTtcblxuICAgICAgbGV0IGRpc3BsYXlWYWx1ZSA9IHRoaXMuZm9ybWF0RGF0ZShkYXRlU3RydWN0KTtcblxuICAgICAgaWYgKHRoaXMuc2hvd1RpbWVDb250cm9scyAmJiAhdGhpcy5pc0RhdGVPbmx5KSB7XG4gICAgICAgIGNvbnN0IGhvdXIgPVxuICAgICAgICAgIHRoaXMuZGF0ZXRpbWUuaG91cnMgIT09IHVuZGVmaW5lZCA/IHRoaXMuZGF0ZXRpbWUuaG91cnMgOiAwO1xuICAgICAgICBjb25zdCBtaW51dGUgPVxuICAgICAgICAgIHRoaXMuZGF0ZXRpbWUubWludXRlcyAhPT0gdW5kZWZpbmVkID8gdGhpcy5kYXRldGltZS5taW51dGVzIDogMDtcbiAgICAgICAgY29uc3Qgc2Vjb25kID1cbiAgICAgICAgICB0aGlzLmRhdGV0aW1lLnNlY29uZHMgIT09IHVuZGVmaW5lZCA/IHRoaXMuZGF0ZXRpbWUuc2Vjb25kcyA6IDA7XG5cbiAgICAgICAgY29uc3QgaG91ckZvcm1hdHRlZCA9IGhvdXIgPCAxMCA/ICcwJyArIGhvdXIgOiBob3VyLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IG1pbnV0ZUZvcm1hdHRlZCA9IG1pbnV0ZSA8IDEwID8gJzAnICsgbWludXRlIDogbWludXRlLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHNlY29uZEZvcm1hdHRlZCA9IHNlY29uZCA8IDEwID8gJzAnICsgc2Vjb25kIDogc2Vjb25kLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgZGlzcGxheVZhbHVlICs9IGAgJHtob3VyRm9ybWF0dGVkfToke21pbnV0ZUZvcm1hdHRlZH1gO1xuXG4gICAgICAgIGlmICh0aGlzLnNlY29uZHMpIHtcbiAgICAgICAgICBkaXNwbGF5VmFsdWUgKz0gYDoke3NlY29uZEZvcm1hdHRlZH1gO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkaXNwbGF5VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlucHV0Qmx1cigpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgZ2V0RWZmZWN0aXZlRm9ybWF0KCk6IHN0cmluZyB7XG4gICAgbGV0IGZvcm1hdCA9IHRoaXMuaW5wdXREYXRldGltZUZvcm1hdCB8fCBJTlBVVF9EQVRFX0ZPUk1BVFMuREFURV9PTkxZO1xuXG4gICAgaWYgKHRoaXMuc2hvd1RpbWVDb250cm9scyAmJiAhdGhpcy5oYXNUaW1lSW5Gb3JtYXQoZm9ybWF0KSkge1xuICAgICAgZm9ybWF0ICs9IHRoaXMuX3NlY29uZHMgPyAnIEhIOm1tOnNzJyA6ICcgSEg6bW0nO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JtYXQ7XG4gIH1cblxuICBvblRpbWVDaGFuZ2UoZXZlbnQ6IFdzbFRpbWVTdHJ1Y3QpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5kYXRldGltZSA9IG5ldyBEYXRlVGltZU1vZGVsKHtcbiAgICAgIC4uLnRoaXMuZGF0ZXRpbWUsXG4gICAgICBob3VyczogZXZlbnQuaG91cnMsXG4gICAgICBtaW51dGVzOiBldmVudC5taW51dGVzLFxuICAgICAgc2Vjb25kczogZXZlbnQuc2Vjb25kcyxcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0RGF0ZVN0cmluZ01vZGVsKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBoYXNWYWxpZERhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy5kYXRldGltZSAmJlxuICAgICAgdHlwZW9mIHRoaXMuZGF0ZXRpbWUueWVhciA9PT0gJ251bWJlcicgJiZcbiAgICAgIHR5cGVvZiB0aGlzLmRhdGV0aW1lLm1vbnRoID09PSAnbnVtYmVyJyAmJlxuICAgICAgdHlwZW9mIHRoaXMuZGF0ZXRpbWUuZGF5ID09PSAnbnVtYmVyJ1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVNb250aHNBbmRZZWFycygpOiB2b2lkIHtcbiAgICB0aGlzLm1vbnRocyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDEyIH0sIChfLCBpKSA9PlxuICAgICAgdGhpcy5nZXRNb250aE5hbWUoaSArIDEpXG4gICAgKTtcbiAgICBjb25zdCBjdXJyZW50WWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBzdGFydFllYXIgPSB0aGlzLm1pbkRhdGU/LnllYXIgfHwgY3VycmVudFllYXIgLSA1MDtcbiAgICBjb25zdCBlbmRZZWFyID0gdGhpcy5tYXhEYXRlPy55ZWFyIHx8IGN1cnJlbnRZZWFyICsgNTA7XG5cbiAgICB0aGlzLnllYXJzID0gQXJyYXkuZnJvbShcbiAgICAgIHsgbGVuZ3RoOiBlbmRZZWFyIC0gc3RhcnRZZWFyICsgMSB9LFxuICAgICAgKF8sIGkpID0+IGVuZFllYXIgLSBpXG4gICAgKS5zb3J0KChhLCBiKSA9PiBiIC0gYSk7XG4gIH1cblxuICBvbk1vbnRoU2VsZWN0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudDtcbiAgICBjb25zdCBuZXdNb250aCA9IHBhcnNlSW50KHNlbGVjdC52YWx1ZSwgMTApO1xuICAgIGlmIChuZXdNb250aCAhPT0gdGhpcy5jdXJyZW50TW9udGgpIHtcbiAgICAgIGNvbnN0IG9sZE1vbnRoID0gdGhpcy5jdXJyZW50TW9udGg7XG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IG5ld01vbnRoO1xuICAgICAgdGhpcy5tb250aENoYW5nZWQuZW1pdChuZXdNb250aCk7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICAgIHRoaXMubmF2aWdhdGUoe1xuICAgICAgICBjdXJyZW50OiB7IHllYXI6IHRoaXMuY3VycmVudFllYXIsIG1vbnRoOiBvbGRNb250aCB9LFxuICAgICAgICBuZXh0OiB7IHllYXI6IHRoaXMuY3VycmVudFllYXIsIG1vbnRoOiBuZXdNb250aCB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25ZZWFyU2VsZWN0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudDtcbiAgICBjb25zdCBuZXdZZWFyID0gcGFyc2VJbnQoc2VsZWN0LnZhbHVlLCAxMCk7XG4gICAgaWYgKG5ld1llYXIgIT09IHRoaXMuY3VycmVudFllYXIpIHtcbiAgICAgIGNvbnN0IG9sZFllYXIgPSB0aGlzLmN1cnJlbnRZZWFyO1xuICAgICAgdGhpcy5jdXJyZW50WWVhciA9IG5ld1llYXI7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICAgIHRoaXMubmF2aWdhdGUoe1xuICAgICAgICBjdXJyZW50OiB7IHllYXI6IG9sZFllYXIsIG1vbnRoOiB0aGlzLmN1cnJlbnRNb250aCB9LFxuICAgICAgICBuZXh0OiB7IHllYXI6IG5ld1llYXIsIG1vbnRoOiB0aGlzLmN1cnJlbnRNb250aCB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGF0ZXRpbWUtcGlja2VyLWNvbnRhaW5lclwiPlxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29udGFpbmVyXCI+XG4gICAgPGlucHV0XG4gICAgICAjZGF0ZUlucHV0XG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICduZy12YWxpZCc6IG5nQ29udHJvbD8udmFsaWQgPT09IHRydWUsXG4gICAgICAgICduZy1pbnZhbGlkJzogbmdDb250cm9sPy5pbnZhbGlkID09PSB0cnVlLFxuICAgICAgICAnbmctZGlzYWJsZWQnOiBkaXNhYmxlZFxuICAgICAgfVwiXG4gICAgICBjbGFzcz1cImRhdGV0aW1lLWlucHV0XCJcbiAgICAgIChibHVyKT1cImlucHV0Qmx1cigpXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICBbbmdNb2RlbF09XCJnZXREaXNwbGF5VmFsdWUoKVwiXG4gICAgICAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgd3NsVG9vbHRpcFxuICAgICAgW3Rvb2x0aXBJY29uT3ZlcmxhcF09XCIxMlwiXG4gICAgICB0b29sdGlwUGxhY2VtZW50PVwidG9wXCJcbiAgICAvPlxuICA8L2Rpdj5cblxuICA8YnV0dG9uXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgY2xhc3M9XCJjYWxlbmRhci1pY29uXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgZGlzYWJsZUNhbGVuZGFyXCJcbiAgICBbbmdDbGFzc109XCJ7ICdkaXNhYmxlZC1idG4nOiBkaXNhYmxlZCB8fCBkaXNhYmxlQ2FsZW5kYXIgfVwiXG4gICAgKGNsaWNrKT1cInRvZ2dsZUNhbGVuZGFyKCRldmVudClcIlxuICA+XG4gICAgPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhciBmYS1sZ1wiPjwvaT5cbiAgPC9idXR0b24+XG5cbiAgPCEtLSBDdXN0b20gQ2FsZW5kYXIgUG9wb3ZlciAtLT5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY2FsZW5kYXItcG9wb3ZlclwiXG4gICAgW2NsYXNzLnNob3ddPVwic2hvd0NhbGVuZGFyXCJcbiAgICBbY2xhc3MuaGlkZGVuXT1cIiFzaG93Q2FsZW5kYXJcIlxuICAgIFtuZ0NsYXNzXT1cImNhbGVuZGFyUG9zaXRpb25DbGFzc1wiXG4gICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwicG9wb3Zlci1jb250ZW50XCI+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIXNob3dUaW1lUGlja2VyVG9nZ2xlXCI+XG4gICAgICAgIDwhLS0gQ3VzdG9tIERhdGUgUGlja2VyIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWRhdGVwaWNrZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlci1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibmF2LWJ0blwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZU1vbnRoKC0xKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1sZWZ0XCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgteWVhci1zZWxlY3RzXCI+XG4gICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1vbnRoLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50TW9udGhcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Nb250aFNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG1vbnRoIG9mIG1vbnRoczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaSArIDFcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IG1vbnRoIH19XG4gICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ5ZWFyLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50WWVhclwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblllYXJTZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHllYXIgb2YgeWVhcnNcIiBbdmFsdWVdPVwieWVhclwiPlxuICAgICAgICAgICAgICAgICAge3sgeWVhciB9fVxuICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJuYXYtYnRuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlTW9udGgoMSlcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tcmlnaHRcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLWNhbGVuZGFyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2Vla2RheXNcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndlZWtkYXlcIiAqbmdGb3I9XCJsZXQgZGF5IG9mIHdlZWtkYXlMYWJlbHNcIj5cbiAgICAgICAgICAgICAgICB7eyBkYXkgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRheXNcIj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZGF5LWNlbGxcIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBkYXkgb2YgY2FsZW5kYXJEYXlzXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Mub3RoZXItbW9udGhdPVwiZGF5Lm90aGVyTW9udGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJkYXkuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJkYXkuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy50b2RheV09XCJkYXkudG9kYXlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXRlKGRheSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgZGF5LmRheSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJzaG93VGltZUNvbnRyb2xzICYmICFpc0RhdGVPbmx5XCJcbiAgICAgICAgICBjbGFzcz1cInRvZ2dsZS10aW1lLWJ0blwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURhdGVUaW1lU3RhdGUoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNsb2NrIGZhLWNsb2NrLW8gZmEtbGdcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJzaG93VGltZVBpY2tlclRvZ2dsZVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJzaG93VGltZUNvbnRyb2xzICYmICFpc0RhdGVPbmx5XCJcbiAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1jYWxlbmRhci1idG5cIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVEYXRlVGltZVN0YXRlKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhciBmYS1sZ1wiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwidGltZS1waWNrZXItY29udGFpbmVyXCJcbiAgICAgICAgICAqbmdJZj1cInNob3dUaW1lQ29udHJvbHMgJiYgIWlzRGF0ZU9ubHlcIlxuICAgICAgICA+XG4gICAgICAgICAgPCEtLSBDdXN0b20gVGltZSBQaWNrZXIgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10aW1lcGlja2VyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1jb250cm9sc1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyBkYXRlQ29uZmlnPy50b2tlbnM/LmhvdXJzIHx8IFwiSEhcIiB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGltZS1idG5cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRqdXN0VGltZSgnaG91cnMnLCBob3Vyc1N0ZXAgfHwgMSlcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXVwXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGltZS1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJkYXRldGltZT8uaG91cnMgfHwgMFwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25UaW1lRmllbGRDaGFuZ2UoJ2hvdXJzJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBtaW49XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgbWF4PVwiMjNcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGltZS1idG5cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRqdXN0VGltZSgnaG91cnMnLCAtKGhvdXJzU3RlcCB8fCAxKSlcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWRvd25cIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtc2VwYXJhdG9yXCI+OjwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsPnt7IGRhdGVDb25maWc/LnRva2Vucz8ubWludXRlcyB8fCBcIm1tXCIgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRpbWUtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkanVzdFRpbWUoJ21pbnV0ZXMnLCBtaW51dGVzU3RlcCB8fCAxKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tdXBcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImRhdGV0aW1lPy5taW51dGVzIHx8IDBcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVGltZUZpZWxkQ2hhbmdlKCdtaW51dGVzJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBtaW49XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgbWF4PVwiNTlcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGltZS1idG5cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRqdXN0VGltZSgnbWludXRlcycsIC0obWludXRlc1N0ZXAgfHwgMSkpXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1kb3duXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXNlcGFyYXRvclwiICpuZ0lmPVwic2Vjb25kc1wiPjo8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1maWVsZFwiICpuZ0lmPVwic2Vjb25kc1wiPlxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyBkYXRlQ29uZmlnPy50b2tlbnM/LnNlY29uZHMgfHwgXCJzc1wiIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1pbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGp1c3RUaW1lKCdzZWNvbmRzJywgc2Vjb25kc1N0ZXAgfHwgMSlcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXVwXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGltZS1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJkYXRldGltZT8uc2Vjb25kcyB8fCAwXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblRpbWVGaWVsZENoYW5nZSgnc2Vjb25kcycsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgbWluPVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIG1heD1cIjU5XCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRpbWUtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkanVzdFRpbWUoJ3NlY29uZHMnLCAtKHNlY29uZHNTdGVwIHx8IDEpKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tZG93blwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48IS0tIEJhY2tkcm9wIGZvciBjbG9zaW5nIHBvcG92ZXIgLS0+XG48ZGl2XG4gIGNsYXNzPVwiY2FsZW5kYXItYmFja2Ryb3BcIlxuICBbY2xhc3Muc2hvd109XCJzaG93Q2FsZW5kYXJcIlxuICAoY2xpY2spPVwiY2xvc2VDYWxlbmRhcigpXCJcbj48L2Rpdj5cbiJdfQ==
893
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3NsLWRhdGV0aW1lLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy13c2wtbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvd3NsLWRhdGV0aW1lLXBpY2tlci93c2wtZGF0ZXRpbWUtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXdzbC1saWJyYXJ5L3NyYy9saWIvY29tcG9uZW50cy93c2wtZGF0ZXRpbWUtcGlja2VyL3dzbC1kYXRldGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1QixPQUFPLEVBQ0wsYUFBYSxHQUlkLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFFWixLQUFLLEVBSUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBSXBFLE9BQU8sRUFBRSxjQUFjLEVBQTJCLE1BQU0sdUJBQXVCLENBQUM7QUFDaEYsT0FBTyxFQUNMLFVBQVUsRUFDVixrQkFBa0IsR0FDbkIsTUFBTSwyQ0FBMkMsQ0FBQzs7Ozs7O0FBK0JuRCxNQUFNLE9BQU8sMEJBQTBCO0lBbUdyQyxZQUNVLEdBQWEsRUFDYixhQUErQixFQUMvQixHQUFzQixFQUN0QixLQUFpQjtRQUhqQixRQUFHLEdBQUgsR0FBRyxDQUFVO1FBQ2Isa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBQy9CLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLFVBQUss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QU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFLRixZQUFZO3NCQURmLEtBQUs7Z0JBc0JJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQXNCSCxjQUFjO3NCQURqQixLQUFLO2dCQVlGLE9BQU87c0JBRFYsS0FBSztnQkF5Q04sZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQW1CMUMsY0FBYztzQkFEYixZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFRekMsY0FBYztzQkFEYixZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG5vb3AgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIERhdGVUaW1lTW9kZWwsXG4gIFdzbERhdGVTdHJ1Y3QsXG4gIFdzbERhdGVUaW1lU3RydWN0LFxuICBXc2xUaW1lU3RydWN0LFxufSBmcm9tICcuLi8uLi9tb2RlbHMvd3NsLWRhdGUtdGltZS5tb2RlbCc7XG5pbXBvcnQge1xuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIE5nQ29udHJvbCxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBnZXREYXRlRm9ybWF0Q29uZmlnIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3dzbC1kYXRlLWZvcm1hdHMnO1xuaW1wb3J0IHsgRGF0ZUZvcm1hdENvbmZpZyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZGF0ZS1mb3JtYXQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFdzbENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25maWcvd3NsLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZ2V0Q3VycmVudERhdGUsIGdldEN1cnJlbnREYXRlVGltZU1vZGVsIH0gZnJvbSAnLi4vLi4vdXRpbHMvZGF0ZS10aW1lJztcbmltcG9ydCB7XG4gIFRJTUVfU1RFUFMsXG4gIElOUFVUX0RBVEVfRk9STUFUUyxcbn0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2RhdGV0aW1lLXBpY2tlci5jb25zdGFudHMnO1xuXG4vLyBXU0wgaW50ZXJmYWNlcyBmb3IgY29tcG9uZW50LXNwZWNpZmljIHR5cGVzXG5leHBvcnQgaW50ZXJmYWNlIFdzbERhdGVwaWNrZXJOYXZpZ2F0ZUV2ZW50IHtcbiAgY3VycmVudDogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXIgfTtcbiAgbmV4dDogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXIgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhckRheSB7XG4gIGRheTogbnVtYmVyO1xuICBtb250aDogbnVtYmVyO1xuICB5ZWFyOiBudW1iZXI7XG4gIG90aGVyTW9udGg6IGJvb2xlYW47XG4gIHNlbGVjdGVkOiBib29sZWFuO1xuICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgdG9kYXk6IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dzbC1kYXRldGltZS1waWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vd3NsLWRhdGV0aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3dzbC1kYXRldGltZS1waWNrZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gV3NsRGF0ZXRpbWVQaWNrZXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgV3NsRGF0ZXRpbWVQaWNrZXJDb21wb25lbnRcbiAgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlc1xue1xuICBASW5wdXQoKSBkYXRlU3RyaW5nITogc3RyaW5nO1xuXG4gIHByaXZhdGUgX2lucHV0RGF0ZXRpbWVGb3JtYXQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBzZXQgaW5wdXREYXRldGltZUZvcm1hdCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRoaXMuX2lucHV0RGF0ZXRpbWVGb3JtYXQgPT09IHZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5faW5wdXREYXRldGltZUZvcm1hdCA9IHZhbHVlO1xuICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUoKTtcbiAgfVxuXG4gIGdldCBpbnB1dERhdGV0aW1lRm9ybWF0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lucHV0RGF0ZXRpbWVGb3JtYXQ7XG4gIH1cblxuICBASW5wdXQoKSBob3Vyc1N0ZXA6IG51bWJlciA9IFRJTUVfU1RFUFMuSE9VUlM7XG4gIEBJbnB1dCgpIG1pbnV0ZXNTdGVwOiBudW1iZXIgPSBUSU1FX1NURVBTLk1JTlVURVM7XG4gIEBJbnB1dCgpIHNlY29uZHNTdGVwOiBudW1iZXIgPSBUSU1FX1NURVBTLlNFQ09ORFM7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1heERhdGU6IFdzbERhdGVTdHJ1Y3Q7XG4gIEBJbnB1dCgpIG1pbkRhdGU6IFdzbERhdGVTdHJ1Y3Q7XG4gIEBJbnB1dCgpIGRpc2FibGVDYWxlbmRhciA9IGZhbHNlO1xuICBASW5wdXQoKSBjYWxlbmRhclBvc2l0aW9uOiAnc3RhdGljJyB8ICdkeW5hbWljJyA9ICdkeW5hbWljJztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX2FsbG93ZWREYXRlcyE6IFdzbERhdGVTdHJ1Y3RbXTtcblxuICBASW5wdXQoKVxuICBzZXQgYWxsb3dlZERhdGVzKHZhbHVlOiBXc2xEYXRlU3RydWN0W10pIHtcbiAgICB0aGlzLl9hbGxvd2VkRGF0ZXMgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5faXNJbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGFsbG93ZWREYXRlcygpOiBXc2xEYXRlU3RydWN0W10ge1xuICAgIHJldHVybiB0aGlzLl9hbGxvd2VkRGF0ZXM7XG4gIH1cblxuICBpbnRlcm5hbEZvcm1hdDogc3RyaW5nID0gSU5QVVRfREFURV9GT1JNQVRTLkRBVEVfT05MWTtcbiAgcHJpdmF0ZSBfc3RhbmRhcmRGb3JtYXQ6IHN0cmluZyA9IElOUFVUX0RBVEVfRk9STUFUUy5FVV9EQVRFX0RBU0g7XG5cbiAgX3BsYWNlaG9sZGVyID0gJyc7XG4gIHN0YXJ0RGF0ZTogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXIgfSA9IHsgeWVhcjogMCwgbW9udGg6IDAgfTtcbiAgc2hvd1RpbWVQaWNrZXJUb2dnbGUgPSBmYWxzZTtcbiAgZGF0ZXRpbWU6IERhdGVUaW1lTW9kZWwgPSBuZXcgRGF0ZVRpbWVNb2RlbCgpO1xuICBuZ0NvbnRyb2w6IE5nQ29udHJvbCB8IG51bGwgPSBudWxsO1xuICBkYXRlQ29uZmlnITogRGF0ZUZvcm1hdENvbmZpZztcblxuICBAT3V0cHV0KCkgbW9udGhDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBjYWxlbmRhclN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgb25DaGFuZ2U6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIGxhbmd1YWdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgc2hvd1RpbWVDb250cm9scyA9IGZhbHNlO1xuICBwcml2YXRlIF9zZWNvbmRzID0gZmFsc2U7XG4gIHByaXZhdGUgX3VwZGF0ZVBlbmRpbmcgPSBmYWxzZTtcblxuICBzaG93Q2FsZW5kYXIgPSBmYWxzZTtcbiAgY3VycmVudFllYXI6IG51bWJlcjtcbiAgY3VycmVudE1vbnRoOiBudW1iZXI7XG4gIGNhbGVuZGFyRGF5czogQ2FsZW5kYXJEYXlbXSA9IFtdO1xuICB3ZWVrZGF5TGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNhbGVuZGFyUG9zaXRpb25DbGFzcyA9ICcnO1xuXG4gIG1vbnRoczogc3RyaW5nW10gPSBbXTtcbiAgeWVhcnM6IG51bWJlcltdID0gW107XG4gIGRlZmF1bHRZZWFyUmFuZ2UgPSB7IHN0YXJ0OiAyMDAwLCBlbmQ6IDIwNTAgfTtcblxuICBASW5wdXQoKVxuICBzZXQgc3RhbmRhcmRGb3JtYXQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLl9zdGFuZGFyZEZvcm1hdCA9PT0gdmFsdWUpIHJldHVybjtcbiAgICB0aGlzLl9zdGFuZGFyZEZvcm1hdCA9IHZhbHVlO1xuICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUoKTtcbiAgfVxuXG4gIGdldCBzdGFuZGFyZEZvcm1hdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGFuZGFyZEZvcm1hdDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBzZWNvbmRzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuX3NlY29uZHMgPT09IHZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5fc2Vjb25kcyA9IHZhbHVlO1xuICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUoKTtcbiAgfVxuXG4gIGdldCBzZWNvbmRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWNvbmRzO1xuICB9XG5cbiAgaXNEYXRlT25seSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaW5qOiBJbmplY3RvcixcbiAgICBwcml2YXRlIGNvbmZpZ1NlcnZpY2U6IFdzbENvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWZcbiAgKSB7XG4gICAgY29uc3QgY3VycmVudERhdGUgPSBnZXRDdXJyZW50RGF0ZSgpO1xuICAgIHRoaXMuY3VycmVudFllYXIgPSBjdXJyZW50RGF0ZS55ZWFyO1xuICAgIHRoaXMuY3VycmVudE1vbnRoID0gY3VycmVudERhdGUubW9udGg7XG5cbiAgICB0aGlzLmRhdGVDb25maWcgPSBnZXREYXRlRm9ybWF0Q29uZmlnKCdlbicpO1xuXG4gICAgdGhpcy5sYW5ndWFnZVN1YnNjcmlwdGlvbiA9IHRoaXMuY29uZmlnU2VydmljZVxuICAgICAgLndhdGNoTGFuZ3VhZ2UoKVxuICAgICAgLnN1YnNjcmliZSgobGFuZ3VhZ2UpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmRhdGVDb25maWcgPSBnZXREYXRlRm9ybWF0Q29uZmlnKGxhbmd1YWdlIHx8ICdlbicpO1xuICAgICAgICAgIHRoaXMudXBkYXRlV2Vla2RheUxhYmVscygpO1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmRhdGVDb25maWcgPSBnZXREYXRlRm9ybWF0Q29uZmlnKCdlbicpO1xuICAgICAgICAgIHRoaXMudXBkYXRlV2Vla2RheUxhYmVscygpO1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaG93Q2FsZW5kYXIpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IGNhbGVuZGFyRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jYWxlbmRhci1wb3BvdmVyJyk7XG4gICAgICBjb25zdCBidXR0b25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNhbGVuZGFyLWljb24nKTtcblxuICAgICAgaWYgKFxuICAgICAgICBjYWxlbmRhckVsZW1lbnQgJiZcbiAgICAgICAgYnV0dG9uRWxlbWVudCAmJlxuICAgICAgICAhY2FsZW5kYXJFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkgJiZcbiAgICAgICAgIWJ1dHRvbkVsZW1lbnQuY29udGFpbnModGFyZ2V0KVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY2xvc2VDYWxlbmRhcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxuICBvbldpbmRvd1Jlc2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaG93Q2FsZW5kYXIgJiYgdGhpcy5jYWxlbmRhclBvc2l0aW9uID09PSAnZHluYW1pYycpIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlRHluYW1pY1Bvc2l0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNjcm9sbCcsIFsnJGV2ZW50J10pXG4gIG9uV2luZG93U2Nyb2xsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNob3dDYWxlbmRhciAmJiB0aGlzLmNhbGVuZGFyUG9zaXRpb24gPT09ICdkeW5hbWljJykge1xuICAgICAgdGhpcy5jYWxjdWxhdGVEeW5hbWljUG9zaXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm5nQ29udHJvbCA9IHRoaXMuaW5qLmdldChOZ0NvbnRyb2wpO1xuICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUxhbmd1YWdlQ29uZmlndXJhdGlvbigpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZU1vbnRoc0FuZFllYXJzKCk7XG4gICAgdGhpcy51cGRhdGVXZWVrZGF5TGFiZWxzKCk7XG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVMYW5ndWFnZUNvbmZpZ3VyYXRpb24oKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMYW5ndWFnZSA9IHRoaXMuY29uZmlnU2VydmljZS5sYW5ndWFnZTtcbiAgICAgIHRoaXMuZGF0ZUNvbmZpZyA9IGdldERhdGVGb3JtYXRDb25maWcoY3VycmVudExhbmd1YWdlIHx8ICdlbicpO1xuICAgICAgdGhpcy51cGRhdGVDb25maWd1cmF0aW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZGF0ZUNvbmZpZyA9IGdldERhdGVGb3JtYXRDb25maWcoJ2VuJyk7XG4gICAgICB0aGlzLnVwZGF0ZUNvbmZpZ3VyYXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ21pbkRhdGUnXSB8fCBjaGFuZ2VzWydtYXhEYXRlJ10pIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZU1vbnRoc0FuZFllYXJzKCk7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snYWxsb3dlZERhdGVzJ10pIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxhbmd1YWdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmxhbmd1YWdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlQ2FsZW5kYXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkICYmICF0aGlzLmRpc2FibGVDYWxlbmRhcikge1xuICAgICAgdGhpcy5zaG93Q2FsZW5kYXIgPSAhdGhpcy5zaG93Q2FsZW5kYXI7XG4gICAgICBpZiAodGhpcy5zaG93Q2FsZW5kYXIpIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgICAgIGlmICh0aGlzLmNhbGVuZGFyUG9zaXRpb24gPT09ICdkeW5hbWljJykge1xuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlRHluYW1pY1Bvc2l0aW9uKCk7XG4gICAgICAgICAgLy8gVXBkYXRlIHRyYW5zZm9ybXMgZm9yIHNob3cgc3RhdGVcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlQ2FsZW5kYXJUcmFuc2Zvcm1zKHRydWUpLCAxMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jYWxlbmRhclBvc2l0aW9uQ2xhc3MgPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNhbGVuZGFyU3RhdGVDaGFuZ2UuZW1pdCh0aGlzLnNob3dDYWxlbmRhcik7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZUNhbGVuZGFyKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0NhbGVuZGFyID0gZmFsc2U7XG4gICAgdGhpcy5zaG93VGltZVBpY2tlclRvZ2dsZSA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNhbGVuZGFyU3RhdGVDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUR5bmFtaWNQb3NpdGlvbigpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBjYWxlbmRhckVsZW1lbnQgPSBjb250YWluZXJFbGVtZW50Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAnLmNhbGVuZGFyLXBvcG92ZXInXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICBpZiAoIWNvbnRhaW5lckVsZW1lbnQgfHwgIWNhbGVuZGFyRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gY29udGFpbmVyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGNhbGVuZGFySWNvbkVsZW1lbnQgPSBjb250YWluZXJFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcuY2FsZW5kYXItaWNvbidcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCBpY29uUmVjdCA9XG4gICAgICAgIGNhbGVuZGFySWNvbkVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIHx8IGNvbnRhaW5lclJlY3Q7XG4gICAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICAgIGNvbnN0IGlzTW9iaWxlID0gdmlld3BvcnRXaWR0aCA8PSA1NzY7XG5cbiAgICAgIGNvbnN0IGNhbGVuZGFyV2lkdGggPSBpc01vYmlsZVxuICAgICAgICA/IE1hdGgubWluKGNhbGVuZGFyRWxlbWVudC5vZmZzZXRXaWR0aCB8fCAzNTAsIHZpZXdwb3J0V2lkdGggLSAzMilcbiAgICAgICAgOiBjYWxlbmRhckVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMzUwO1xuICAgICAgY29uc3QgY2FsZW5kYXJIZWlnaHQgPSBjYWxlbmRhckVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDQwMDtcblxuICAgICAgaWYgKGlzTW9iaWxlKSB7XG4gICAgICAgIHRoaXMuYXBwbHlNb2JpbGVQb3NpdGlvbmluZyhcbiAgICAgICAgICBjYWxlbmRhckVsZW1lbnQsXG4gICAgICAgICAgaWNvblJlY3QsXG4gICAgICAgICAgdmlld3BvcnRXaWR0aCxcbiAgICAgICAgICBjYWxlbmRhcldpZHRoXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHZlcnRpY2FsQ2xhc3MgPSB0aGlzLmdldFZlcnRpY2FsUG9zaXRpb25DbGFzcyhcbiAgICAgICAgICBjb250YWluZXJSZWN0LFxuICAgICAgICAgIHZpZXdwb3J0SGVpZ2h0LFxuICAgICAgICAgIGNhbGVuZGFySGVpZ2h0XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJQb3NpdGlvbkNsYXNzID0gdmVydGljYWxDbGFzcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xlYXJJbmxpbmVTdHlsZXMoY2FsZW5kYXJFbGVtZW50KTtcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbENsYXNzID0gdGhpcy5nZXRIb3Jpem9udGFsUG9zaXRpb25DbGFzcyhcbiAgICAgICAgICBjb250YWluZXJSZWN0LFxuICAgICAgICAgIHZpZXdwb3J0V2lkdGgsXG4gICAgICAgICAgY2FsZW5kYXJXaWR0aCxcbiAgICAgICAgICBpc01vYmlsZVxuICAgICAgICApO1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbENsYXNzID0gdGhpcy5nZXRWZXJ0aWNhbFBvc2l0aW9uQ2xhc3MoXG4gICAgICAgICAgY29udGFpbmVyUmVjdCxcbiAgICAgICAgICB2aWV3cG9ydEhlaWdodCxcbiAgICAgICAgICBjYWxlbmRhckhlaWdodFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNhbGVuZGFyUG9zaXRpb25DbGFzcyA9XG4gICAgICAgICAgYCR7aG9yaXpvbnRhbENsYXNzfSAke3ZlcnRpY2FsQ2xhc3N9YC50cmltKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlNb2JpbGVQb3NpdGlvbmluZyhcbiAgICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBpY29uUmVjdDogRE9NUmVjdCxcbiAgICB2aWV3cG9ydFdpZHRoOiBudW1iZXIsXG4gICAgY2FsZW5kYXJXaWR0aDogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBhZGRpbmcgPSAxNjtcbiAgICBjb25zdCB3b3VsZE92ZXJmbG93UmlnaHQgPVxuICAgICAgaWNvblJlY3QucmlnaHQgKyBjYWxlbmRhcldpZHRoICsgcGFkZGluZyA+IHZpZXdwb3J0V2lkdGg7XG4gICAgY29uc3Qgd291bGRPdmVyZmxvd0xlZnQgPSBpY29uUmVjdC5sZWZ0IC0gY2FsZW5kYXJXaWR0aCAtIHBhZGRpbmcgPCAwO1xuXG4gICAgaWYgKHdvdWxkT3ZlcmZsb3dSaWdodCAmJiB3b3VsZE92ZXJmbG93TGVmdCkge1xuICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7KHZpZXdwb3J0V2lkdGggLSBjYWxlbmRhcldpZHRoKSAvIDJ9cHhgO1xuICAgICAgZWxlbWVudC5zdHlsZS5yaWdodCA9ICdhdXRvJztcbiAgICB9IGVsc2UgaWYgKHdvdWxkT3ZlcmZsb3dSaWdodCkge1xuICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gJ3Vuc2V0JztcbiAgICAgIGVsZW1lbnQuc3R5bGUucmlnaHQgPSAnMCc7XG4gICAgfSBlbHNlIGlmICh3b3VsZE92ZXJmbG93TGVmdCkge1xuICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gJzAnO1xuICAgICAgZWxlbWVudC5zdHlsZS5yaWdodCA9ICd1bnNldCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9ICd1bnNldCc7XG4gICAgICBlbGVtZW50LnN0eWxlLnJpZ2h0ID0gJzAnO1xuICAgIH1cblxuICAgIGVsZW1lbnQuc3R5bGUubWF4V2lkdGggPSBgJHtjYWxlbmRhcldpZHRofXB4YDtcbiAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVZKC0xMHB4KSc7XG4gIH1cblxuICBwcml2YXRlIGNsZWFySW5saW5lU3R5bGVzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gJyc7XG4gICAgZWxlbWVudC5zdHlsZS5yaWdodCA9ICcnO1xuICAgIGVsZW1lbnQuc3R5bGUubWF4V2lkdGggPSAnJztcbiAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDYWxlbmRhclRyYW5zZm9ybXMoaXNTaG93OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWNvbnRhaW5lckVsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IGNhbGVuZGFyRWxlbWVudCA9IGNvbnRhaW5lckVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICcuY2FsZW5kYXItcG9wb3ZlcidcbiAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghY2FsZW5kYXJFbGVtZW50KSByZXR1cm47XG5cbiAgICBjb25zdCBpc01vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDw9IDU3NjtcbiAgICBjb25zdCBpc1RvcFBvc2l0aW9uID0gdGhpcy5jYWxlbmRhclBvc2l0aW9uQ2xhc3MuaW5jbHVkZXMoXG4gICAgICAnY2FsZW5kYXItcG9zaXRpb24tdG9wJ1xuICAgICk7XG5cbiAgICBpZiAoXG4gICAgICBpc01vYmlsZSAmJlxuICAgICAgdGhpcy5jYWxlbmRhclBvc2l0aW9uQ2xhc3MuaW5jbHVkZXMoJ2NhbGVuZGFyLW1vYmlsZS1jZW50ZXInKVxuICAgICkge1xuICAgICAgLy8gRHluYW1pYyBtb2JpbGUgY2VudGVyaW5nIHdpdGggcHJvcGVyIHRyYW5zZm9ybXNcbiAgICAgIGlmIChpc1Nob3cpIHtcbiAgICAgICAgY2FsZW5kYXJFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGlzVG9wUG9zaXRpb25cbiAgICAgICAgICA/ICd0cmFuc2xhdGVZKDApJ1xuICAgICAgICAgIDogJ3RyYW5zbGF0ZVkoMCknO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsZW5kYXJFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGlzVG9wUG9zaXRpb25cbiAgICAgICAgICA/ICd0cmFuc2xhdGVZKDEwcHgpJ1xuICAgICAgICAgIDogJ3RyYW5zbGF0ZVkoLTEwcHgpJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEhvcml6b250YWxQb3NpdGlvbkNsYXNzKFxuICAgIGNvbnRhaW5lclJlY3Q6IERPTVJlY3QsXG4gICAgdmlld3BvcnRXaWR0aDogbnVtYmVyLFxuICAgIGNhbGVuZGFyV2lkdGg6IG51bWJlcixcbiAgICBpc01vYmlsZTogYm9vbGVhblxuICApOiBzdHJpbmcge1xuICAgIGlmIChpc01vYmlsZSkge1xuICAgICAgY29uc3QgbW9iaWxlUGFkZGluZyA9IDE2O1xuXG4gICAgICAvLyBDaGVjayBpZiBjYWxlbmRhciB3b3VsZCBvdmVyZmxvdyB3aGVuIGdyb3dpbmcgcmlnaHQgZnJvbSBpY29uIChkZWZhdWx0KVxuICAgICAgY29uc3Qgd291bGRPdmVyZmxvd1JpZ2h0ID1cbiAgICAgICAgY29udGFpbmVyUmVjdC5yaWdodCArIGNhbGVuZGFyV2lkdGggKyBtb2JpbGVQYWRkaW5nID4gdmlld3BvcnRXaWR0aDtcblxuICAgICAgLy8gQ2hlY2sgaWYgY2FsZW5kYXIgd291bGQgb3ZlcmZsb3cgd2hlbiBncm93aW5nIGxlZnQgZnJvbSBsZWZ0IGVkZ2VcbiAgICAgIGNvbnN0IHdvdWxkT3ZlcmZsb3dMZWZ0ID1cbiAgICAgICAgY29udGFpbmVyUmVjdC5sZWZ0IC0gY2FsZW5kYXJXaWR0aCAtIG1vYmlsZVBhZGRpbmcgPCAwO1xuXG4gICAgICBpZiAod291bGRPdmVyZmxvd1JpZ2h0ICYmIHdvdWxkT3ZlcmZsb3dMZWZ0KSB7XG4gICAgICAgIC8vIE5vIHNwYWNlIG9uIGVpdGhlciBzaWRlIC0gY2VudGVyIGl0XG4gICAgICAgIHJldHVybiAnY2FsZW5kYXItbW9iaWxlLWNlbnRlcic7XG4gICAgICB9XG5cbiAgICAgIGlmICghd291bGRPdmVyZmxvd1JpZ2h0KSB7XG4gICAgICAgIC8vIEZpdHMgZ3Jvd2luZyByaWdodCBmcm9tIGljb24gLSBidXQgc3RpbGwgdXNlIHJpZ2h0IGFsaWdubWVudCB0byBlbnN1cmUgcGFkZGluZ1xuICAgICAgICByZXR1cm4gJ2NhbGVuZGFyLWFsaWduLXJpZ2h0JztcbiAgICAgIH1cblxuICAgICAgLy8gV291bGQgb3ZlcmZsb3cgcmlnaHQgYnV0IGZpdHMgb24gbGVmdCAtIGFsaWduIHRvIGxlZnQgZWRnZVxuICAgICAgcmV0dXJuICdjYWxlbmRhci1hbGlnbi1sZWZ0JztcbiAgICB9XG5cbiAgICAvLyBEZXNrdG9wIGxvZ2ljXG4gICAgY29uc3Qgd291bGRPdmVyZmxvd1JpZ2h0ID1cbiAgICAgIGNvbnRhaW5lclJlY3QucmlnaHQgKyBjYWxlbmRhcldpZHRoID4gdmlld3BvcnRXaWR0aDtcblxuICAgIGlmICghd291bGRPdmVyZmxvd1JpZ2h0KSB7XG4gICAgICByZXR1cm4gJyc7IC8vIERlZmF1bHQgcG9zaXRpb25pbmcgKGdyb3dzIHJpZ2h0IGZyb20gaWNvbilcbiAgICB9XG5cbiAgICBjb25zdCBzcGFjZUxlZnQgPSBjb250YWluZXJSZWN0LmxlZnQ7XG4gICAgaWYgKHNwYWNlTGVmdCA+PSBjYWxlbmRhcldpZHRoKSB7XG4gICAgICByZXR1cm4gJ2NhbGVuZGFyLWFsaWduLWxlZnQnOyAvLyBHcm93IHJpZ2h0IGZyb20gbGVmdCBlZGdlXG4gICAgfVxuXG4gICAgcmV0dXJuICcnOyAvLyBVc2UgZGVmYXVsdCBhcyBmYWxsYmFja1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRWZXJ0aWNhbFBvc2l0aW9uQ2xhc3MoXG4gICAgY29udGFpbmVyUmVjdDogRE9NUmVjdCxcbiAgICB2aWV3cG9ydEhlaWdodDogbnVtYmVyLFxuICAgIGNhbGVuZGFySGVpZ2h0OiBudW1iZXJcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBzcGFjZUJlbG93ID0gdmlld3BvcnRIZWlnaHQgLSBjb250YWluZXJSZWN0LmJvdHRvbTtcbiAgICBjb25zdCBzcGFjZUFib3ZlID0gY29udGFpbmVyUmVjdC50b3A7XG5cbiAgICBpZiAoc3BhY2VCZWxvdyA+PSBjYWxlbmRhckhlaWdodCkgcmV0dXJuICdjYWxlbmRhci1wb3NpdGlvbi1ib3R0b20nO1xuICAgIGlmIChzcGFjZUFib3ZlID49IGNhbGVuZGFySGVpZ2h0KSByZXR1cm4gJ2NhbGVuZGFyLXBvc2l0aW9uLXRvcCc7XG4gICAgcmV0dXJuIHNwYWNlQmVsb3cgPj0gc3BhY2VBYm92ZVxuICAgICAgPyAnY2FsZW5kYXItcG9zaXRpb24tYm90dG9tJ1xuICAgICAgOiAnY2FsZW5kYXItcG9zaXRpb24tdG9wJztcbiAgfVxuXG4gIG5hdmlnYXRlTW9udGgoZGlyZWN0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRNb250aCArPSBkaXJlY3Rpb247XG4gICAgaWYgKHRoaXMuY3VycmVudE1vbnRoID4gMTIpIHtcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gMTtcbiAgICAgIHRoaXMuY3VycmVudFllYXIrKztcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudE1vbnRoIDwgMSkge1xuICAgICAgdGhpcy5jdXJyZW50TW9udGggPSAxMjtcbiAgICAgIHRoaXMuY3VycmVudFllYXItLTtcbiAgICB9XG5cbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICB0aGlzLm1vbnRoQ2hhbmdlZC5lbWl0KHRoaXMuY3VycmVudE1vbnRoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHNlbGVjdERhdGUoZGF5OiBDYWxlbmRhckRheSk6IHZvaWQge1xuICAgIGlmIChkYXkuZGlzYWJsZWQpIHJldHVybjtcblxuICAgIGNvbnN0IHNlbGVjdGVkRGF0ZTogV3NsRGF0ZVN0cnVjdCA9IHtcbiAgICAgIHllYXI6IGRheS55ZWFyLFxuICAgICAgbW9udGg6IGRheS5tb250aCxcbiAgICAgIGRheTogZGF5LmRheSxcbiAgICB9O1xuXG4gICAgdGhpcy5vbkRhdGVDaGFuZ2Uoc2VsZWN0ZWREYXRlKTtcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdlbmVyYXRlQ2FsZW5kYXIoKTogdm9pZCB7XG4gICAgY29uc3QgZmlyc3REYXkgPSBuZXcgRGF0ZSh0aGlzLmN1cnJlbnRZZWFyLCB0aGlzLmN1cnJlbnRNb250aCAtIDEsIDEpO1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IG5ldyBEYXRlKGZpcnN0RGF5KTtcbiAgICBjb25zdCB3ZWVrU3RhcnQgPSAodGhpcy5kYXRlQ29uZmlnPy53ZWVrU3RhcnQgPz8gMSkgJSA3O1xuICAgIGNvbnN0IGRheU9mV2VlayA9IChmaXJzdERheS5nZXREYXkoKSArIDcgLSB3ZWVrU3RhcnQpICUgNztcbiAgICBzdGFydERhdGUuc2V0RGF0ZShzdGFydERhdGUuZ2V0RGF0ZSgpIC0gZGF5T2ZXZWVrKTtcblxuICAgIHRoaXMuY2FsZW5kYXJEYXlzID0gW107XG4gICAgY29uc3QgdG9kYXlEYXRlID0gZ2V0Q3VycmVudERhdGUoKTtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKHRvZGF5RGF0ZS55ZWFyLCB0b2RheURhdGUubW9udGggLSAxLCB0b2RheURhdGUuZGF5KTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDI7IGkrKykge1xuICAgICAgY29uc3QgY3VycmVudERhdGUgPSBuZXcgRGF0ZShzdGFydERhdGUpO1xuICAgICAgY3VycmVudERhdGUuc2V0RGF0ZShzdGFydERhdGUuZ2V0RGF0ZSgpICsgaSk7XG5cbiAgICAgIGNvbnN0IGRheVN0cnVjdDogV3NsRGF0ZVN0cnVjdCA9IHtcbiAgICAgICAgeWVhcjogY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgbW9udGg6IGN1cnJlbnREYXRlLmdldE1vbnRoKCkgKyAxLFxuICAgICAgICBkYXk6IGN1cnJlbnREYXRlLmdldERhdGUoKSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGNhbGVuZGFyRGF5OiBDYWxlbmRhckRheSA9IHtcbiAgICAgICAgZGF5OiBjdXJyZW50RGF0ZS5nZXREYXRlKCksXG4gICAgICAgIG1vbnRoOiBjdXJyZW50RGF0ZS5nZXRNb250aCgpICsgMSxcbiAgICAgICAgeWVhcjogY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgb3RoZXJNb250aDogY3VycmVudERhdGUuZ2V0TW9udGgoKSArIDEgIT09IHRoaXMuY3VycmVudE1vbnRoLFxuICAgICAgICBzZWxlY3RlZDogdGhpcy5pc0RhdGVTZWxlY3RlZChkYXlTdHJ1Y3QpLFxuICAgICAgICBkaXNhYmxlZDogdGhpcy5pc0RhdGVEaXNhYmxlZChkYXlTdHJ1Y3QpLFxuICAgICAgICB0b2RheTogdGhpcy5pc1NhbWVEYXRlKGN1cnJlbnREYXRlLCB0b2RheSksXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmNhbGVuZGFyRGF5cy5wdXNoKGNhbGVuZGFyRGF5KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzRGF0ZVNlbGVjdGVkKGRhdGU6IFdzbERhdGVTdHJ1Y3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLmRhdGV0aW1lICYmXG4gICAgICB0aGlzLmRhdGV0aW1lLnllYXIgPT09IGRhdGUueWVhciAmJlxuICAgICAgdGhpcy5kYXRldGltZS5tb250aCA9PT0gZGF0ZS5tb250aCAmJlxuICAgICAgdGhpcy5kYXRldGltZS5kYXkgPT09IGRhdGUuZGF5XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEYXRlRGlzYWJsZWQoZGF0ZTogV3NsRGF0ZVN0cnVjdCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKGRhdGUueWVhciwgZGF0ZS5tb250aCAtIDEsIGRhdGUuZGF5KTtcbiAgICBjb25zdCB0b2RheURhdGUgPSBnZXRDdXJyZW50RGF0ZSgpO1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUodG9kYXlEYXRlLnllYXIsIHRvZGF5RGF0ZS5tb250aCAtIDEsIHRvZGF5RGF0ZS5kYXkpO1xuICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuXG4gICAgaWYgKHRoaXMubWF4RGF0ZSkge1xuICAgICAgY29uc3QgbWF4RGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgICB0aGlzLm1heERhdGUueWVhcixcbiAgICAgICAgdGhpcy5tYXhEYXRlLm1vbnRoIC0gMSxcbiAgICAgICAgdGhpcy5tYXhEYXRlLmRheVxuICAgICAgKTtcbiAgICAgIGlmIChzZWxlY3RlZERhdGUgPiBtYXhEYXRlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm1pbkRhdGUpIHtcbiAgICAgIGNvbnN0IG1pbkRhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgdGhpcy5taW5EYXRlLnllYXIsXG4gICAgICAgIHRoaXMubWluRGF0ZS5tb250aCAtIDEsXG4gICAgICAgIHRoaXMubWluRGF0ZS5kYXlcbiAgICAgICk7XG4gICAgICBpZiAoc2VsZWN0ZWREYXRlIDwgbWluRGF0ZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmFsbG93ZWREYXRlcyAmJlxuICAgICAgdGhpcy5hbGxvd2VkRGF0ZXMubGVuZ3RoID09PSAxICYmXG4gICAgICB0aGlzLmFsbG93ZWREYXRlc1swXS5kYXkgPT09IC0xXG4gICAgKSB7XG4gICAgICByZXR1cm4gc2VsZWN0ZWREYXRlID4gdG9kYXk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmFsbG93ZWREYXRlcyB8fCB0aGlzLmFsbG93ZWREYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGlzQWxsb3dlZCA9IHRoaXMuYWxsb3dlZERhdGVzLmZpbmQoXG4gICAgICAoZGF5QWxsb3dlZCkgPT5cbiAgICAgICAgZGF5QWxsb3dlZC55ZWFyID09PSBkYXRlLnllYXIgJiZcbiAgICAgICAgZGF5QWxsb3dlZC5tb250aCA9PT0gZGF0ZS5tb250aCAmJlxuICAgICAgICBkYXlBbGxvd2VkLmRheSA9PT0gZGF0ZS5kYXlcbiAgICApO1xuXG4gICAgcmV0dXJuICFpc0FsbG93ZWQ7XG4gIH1cblxuICBwcml2YXRlIGlzU2FtZURhdGUoZGF0ZTE6IERhdGUsIGRhdGUyOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGRhdGUxLmdldEZ1bGxZZWFyKCkgPT09IGRhdGUyLmdldEZ1bGxZZWFyKCkgJiZcbiAgICAgIGRhdGUxLmdldE1vbnRoKCkgPT09IGRhdGUyLmdldE1vbnRoKCkgJiZcbiAgICAgIGRhdGUxLmdldERhdGUoKSA9PT0gZGF0ZTIuZ2V0RGF0ZSgpXG4gICAgKTtcbiAgfVxuXG4gIGdldE1vbnRoTmFtZShtb250aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBtb250aEluZGV4ID0gbW9udGggLSAxO1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmRhdGVDb25maWc/Lm1vbnRoTmFtZXM/Llttb250aEluZGV4XSB8fFxuICAgICAgZ2V0RGF0ZUZvcm1hdENvbmZpZygnZW4nKS5tb250aE5hbWVzW21vbnRoSW5kZXhdXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlV2Vla2RheUxhYmVscygpOiB2b2lkIHtcbiAgICB0aGlzLndlZWtkYXlMYWJlbHMgPVxuICAgICAgdGhpcy5kYXRlQ29uZmlnPy53ZWVrZGF5TGFiZWxzIHx8IGdldERhdGVGb3JtYXRDb25maWcoJ2VuJykud2Vla2RheUxhYmVscztcbiAgfVxuXG4gIGFkanVzdFRpbWUoZmllbGQ6ICdob3VycycgfCAnbWludXRlcycgfCAnc2Vjb25kcycsIHN0ZXA6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmRhdGV0aW1lW2ZpZWxkXSB8fCAwO1xuICAgIGxldCBuZXdWYWx1ZTogbnVtYmVyO1xuXG4gICAgaWYgKHN0ZXAgPiAwKSB7XG4gICAgICBuZXdWYWx1ZSA9IGN1cnJlbnRWYWx1ZSArIHN0ZXA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN0ZXBTaXplID0gTWF0aC5hYnMoc3RlcCk7XG4gICAgICBuZXdWYWx1ZSA9IGN1cnJlbnRWYWx1ZSAtIHN0ZXBTaXplO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgaWYgKG5ld1ZhbHVlIDwgMCkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gMjQgKyAobmV3VmFsdWUgJSAyNCk7XG4gICAgICAgIH0gZWxzZSBpZiAobmV3VmFsdWUgPiAyMykge1xuICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUgJSAyNDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgIGlmIChuZXdWYWx1ZSA8IDApIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IDYwICsgKG5ld1ZhbHVlICUgNjApO1xuICAgICAgICB9IGVsc2UgaWYgKG5ld1ZhbHVlID4gNTkpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IG5ld1ZhbHVlICUgNjA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRldGltZVtmaWVsZF0gPSBuZXdWYWx1ZTtcbiAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25UaW1lRmllbGRDaGFuZ2UoXG4gICAgZmllbGQ6ICdob3VycycgfCAnbWludXRlcycgfCAnc2Vjb25kcycsXG4gICAgZXZlbnQ6IEV2ZW50XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgbGV0IHZhbHVlID0gcGFyc2VJbnQoaW5wdXQudmFsdWUsIDEwKTtcblxuICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gMDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMDtcbiAgICAgICAgaWYgKHZhbHVlID4gMjMpIHZhbHVlID0gMjM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWludXRlcyc6XG4gICAgICBjYXNlICdzZWNvbmRzJzpcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAwO1xuICAgICAgICBpZiAodmFsdWUgPiA1OSkgdmFsdWUgPSA1OTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaW5wdXQudmFsdWUgPSB2YWx1ZS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG5cbiAgICB0aGlzLmRhdGV0aW1lW2ZpZWxkXSA9IHZhbHVlO1xuICAgIHRoaXMuc2V0RGF0ZVN0cmluZ01vZGVsKCk7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlVXBkYXRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faXNJbml0aWFsaXplZCB8fCB0aGlzLl91cGRhdGVQZW5kaW5nKSByZXR1cm47XG5cbiAgICB0aGlzLl91cGRhdGVQZW5kaW5nID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX3VwZGF0ZVBlbmRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMudXBkYXRlQ29uZmlndXJhdGlvbigpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb25maWd1cmF0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuZGV0ZWN0VGltZUNvbXBvbmVudHMoKTtcbiAgICB0aGlzLnNldFN0YW5kYXJkRm9ybWF0KCk7XG4gICAgdGhpcy5zZXRQbGFjZWhvbGRlcigpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRlY3RUaW1lQ29tcG9uZW50cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnB1dERhdGV0aW1lRm9ybWF0KSB7XG4gICAgICBjb25zdCBoYXNUaW1lRm9ybWF0ID0gdGhpcy5oYXNUaW1lSW5Gb3JtYXQodGhpcy5pbnB1dERhdGV0aW1lRm9ybWF0KTtcblxuICAgICAgaWYgKCFoYXNUaW1lRm9ybWF0KSB7XG4gICAgICAgIHRoaXMuc2hvd1RpbWVDb250cm9scyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9zZWNvbmRzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNEYXRlT25seSA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zaG93VGltZUNvbnRyb2xzID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNEYXRlT25seSA9IGZhbHNlO1xuICAgICAgdGhpcy5fc2Vjb25kcyA9IHRoaXMuaW5wdXREYXRldGltZUZvcm1hdC5pbmNsdWRlcygnOnNzJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2hvd1RpbWVDb250cm9scyA9IHRoaXMuX3NlY29uZHM7XG4gICAgICB0aGlzLmlzRGF0ZU9ubHkgPSAhdGhpcy5fc2Vjb25kcztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc1RpbWVJbkZvcm1hdChmb3JtYXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmb3JtYXQuaW5jbHVkZXMoJ0hIOicpIHx8XG4gICAgICBmb3JtYXQuaW5jbHVkZXMoJ2hoOicpIHx8XG4gICAgICBmb3JtYXQuaW5jbHVkZXMoJzptbScpIHx8XG4gICAgICBmb3JtYXQuaW5jbHVkZXMoJzpzcycpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U3RhbmRhcmRGb3JtYXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbnRlcm5hbEZvcm1hdCA9XG4gICAgICB0aGlzLmlucHV0RGF0ZXRpbWVGb3JtYXQgfHwgSU5QVVRfREFURV9GT1JNQVRTLkRBVEVfT05MWTtcbiAgICB0aGlzLl9zdGFuZGFyZEZvcm1hdCA9IHRoaXMuaW50ZXJuYWxGb3JtYXQ7XG5cbiAgICBpZiAodGhpcy5zaG93VGltZUNvbnRyb2xzICYmICF0aGlzLmhhc1RpbWVJbkZvcm1hdCh0aGlzLl9zdGFuZGFyZEZvcm1hdCkpIHtcbiAgICAgIHRoaXMuX3N0YW5kYXJkRm9ybWF0ICs9IHRoaXMuX3NlY29uZHMgPyAnIEhIOm1tOnNzJyA6ICcgSEg6bW0nO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0UGxhY2Vob2xkZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGxhY2Vob2xkZXIgJiYgdGhpcy5wbGFjZWhvbGRlciAhPT0gJycpIHtcbiAgICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlci50b0xvd2VyQ2FzZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9wbGFjZWhvbGRlciA9XG4gICAgICAgIHRoaXMuZGF0ZUNvbmZpZz8ucGxhY2Vob2xkZXI/LnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgICAgSU5QVVRfREFURV9GT1JNQVRTLkRBVEVfT05MWS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3dUaW1lQ29udHJvbHMpIHtcbiAgICAgIGlmICh0aGlzLl9wbGFjZWhvbGRlcj8uaW5jbHVkZXMoJ2hoOm1tJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9wbGFjZWhvbGRlciArPSB0aGlzLl9zZWNvbmRzID8gJyBoaDptbTpzcycgOiAnIGhoOm1tJztcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKG5ld01vZGVsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAobmV3TW9kZWwpIHtcbiAgICAgIGNvbnN0IHBhcnNlZE1vZGVsID0gRGF0ZVRpbWVNb2RlbC5mcm9tTG9jYWxTdHJpbmcobmV3TW9kZWwsIGZhbHNlKTtcblxuICAgICAgaWYgKHBhcnNlZE1vZGVsICYmIHR5cGVvZiBwYXJzZWRNb2RlbC55ZWFyID09PSAnbnVtYmVyJykge1xuICAgICAgICB0aGlzLmRhdGV0aW1lID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICB0aGlzLmRhdGV0aW1lIHx8IG5ldyBEYXRlVGltZU1vZGVsKCksXG4gICAgICAgICAgcGFyc2VkTW9kZWxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5kYXRlU3RyaW5nID0gbmV3TW9kZWw7XG4gICAgICAgIHRoaXMuc2V0RGF0ZVN0cmluZ01vZGVsKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0ZXRpbWUgPSBuZXcgRGF0ZVRpbWVNb2RlbCgpO1xuICAgICAgdGhpcy5kYXRlU3RyaW5nID0gJyc7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBuYXZpZ2F0ZShldmVudDogV3NsRGF0ZXBpY2tlck5hdmlnYXRlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQ/LmN1cnJlbnQgJiYgZXZlbnQ/LmN1cnJlbnQubW9udGggIT09IGV2ZW50Py5uZXh0Lm1vbnRoKSB7XG4gICAgICB0aGlzLm1vbnRoQ2hhbmdlZC5lbWl0KGV2ZW50Py5uZXh0Lm1vbnRoKTtcbiAgICB9XG4gIH1cblxuICBpc0Rpc2FibGVkKFxuICAgIGRhdGVzOiBXc2xEYXRlU3RydWN0W11cbiAgKTogKFxuICAgIGRhdGU6IFdzbERhdGVTdHJ1Y3QsXG4gICAgY3VycmVudD86IHsgeWVhcjogbnVtYmVyOyBtb250aDogbnVtYmVyIH1cbiAgKSA9PiBib29sZWFuIHtcbiAgICByZXR1cm4gKHBpY2tlckRhdGU6IFdzbERhdGVTdHJ1Y3QpID0+IHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsQWxsb3dlZERhdGVzID0gdGhpcy5hbGxvd2VkRGF0ZXM7XG4gICAgICB0aGlzLmFsbG93ZWREYXRlcyA9IGRhdGVzO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5pc0RhdGVEaXNhYmxlZChwaWNrZXJEYXRlKTtcbiAgICAgIHRoaXMuYWxsb3dlZERhdGVzID0gb3JpZ2luYWxBbGxvd2VkRGF0ZXM7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgdG9nZ2xlRGF0ZVRpbWVTdGF0ZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYXNWYWxpZERhdGUoKSkge1xuICAgICAgdGhpcy5zaG93VGltZVBpY2tlclRvZ2dsZSA9ICF0aGlzLnNob3dUaW1lUGlja2VyVG9nZ2xlO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWxpbWl0ZXIoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5kYXRlQ29uZmlnPy5mb3JtYXQpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5kYXRlQ29uZmlnLmZvcm1hdC5tYXRjaCgvW15hLXpBLVowLTldLyk7XG4gICAgICBpZiAobWF0Y2ggJiYgbWF0Y2hbMF0pIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoWzBdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYXRlQ29uZmlnPy5kYXRlU2VwYXJhdG9yIHx8ICctJztcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VEYXRlKHZhbHVlOiBzdHJpbmcpOiBXc2xEYXRlU3RydWN0IHwgbnVsbCB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZGVsaW1pdGVyID0gdGhpcy5nZXREZWxpbWl0ZXIoKTtcbiAgICBjb25zdCBkYXRlID0gdmFsdWUuc3BsaXQoZGVsaW1pdGVyKTtcblxuICAgIGlmIChkYXRlLmxlbmd0aCA8IDMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5kYXRlQ29uZmlnPy5kYXlGaXJzdCkge1xuICAgICAgICBjb25zdCBkYXkgPSBwYXJzZUludChkYXRlWzBdLCAxMCk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gcGFyc2VJbnQoZGF0ZVsxXSwgMTApO1xuICAgICAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQoZGF0ZVsyXSwgMTApO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc05hTihkYXkpIHx8XG4gICAgICAgICAgaXNOYU4obW9udGgpIHx8XG4gICAgICAgICAgaXNOYU4oeWVhcikgfHxcbiAgICAgICAgICBkYXkgPCAxIHx8XG4gICAgICAgICAgZGF5ID4gMzEgfHxcbiAgICAgICAgICBtb250aCA8IDEgfHxcbiAgICAgICAgICBtb250aCA+IDEyXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgZGF5LCBtb250aCwgeWVhciB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRm9ybWF0OiBJTlBVVF9EQVRFX0ZPUk1BVFMuREFURV9PTkxZICh5eXl5LU1NLWRkKVxuICAgICAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQoZGF0ZVswXSwgMTApO1xuICAgICAgICBjb25zdCBtb250aCA9IHBhcnNlSW50KGRhdGVbMV0sIDEwKTtcbiAgICAgICAgY29uc3QgZGF5ID0gcGFyc2VJbnQoZGF0ZVsyXSwgMTApO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc05hTihkYXkpIHx8XG4gICAgICAgICAgaXNOYU4obW9udGgpIHx8XG4gICAgICAgICAgaXNOYU4oeWVhcikgfHxcbiAgICAgICAgICBkYXkgPCAxIHx8XG4gICAgICAgICAgZGF5ID4gMzEgfHxcbiAgICAgICAgICBtb250aCA8IDEgfHxcbiAgICAgICAgICBtb250aCA+IDEyXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgeWVhciwgbW9udGgsIGRheSB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdERhdGUoZGF0ZTogV3NsRGF0ZVRpbWVTdHJ1Y3QgfCBudWxsKTogc3RyaW5nIHtcbiAgICBpZiAoIWRhdGUpIHJldHVybiAnJztcblxuICAgIGNvbnN0IGRheUZvcm1hdHRlZCA9IGRhdGUuZGF5IDwgMTAgPyAnMCcgKyBkYXRlLmRheSA6IGRhdGUuZGF5LnRvU3RyaW5nKCk7XG4gICAgY29uc3QgbW9udGhGb3JtYXR0ZWQgPVxuICAgICAgZGF0ZS5tb250aCA8IDEwID8gJzAnICsgZGF0ZS5tb250aCA6IGRhdGUubW9udGgudG9TdHJpbmcoKTtcbiAgICBjb25zdCB5ZWFyRm9ybWF0dGVkID0gZGF0ZS55ZWFyLnRvU3RyaW5nKCk7XG5cbiAgICBjb25zdCBob3VyRm9ybWF0dGVkID1cbiAgICAgIGRhdGUuaG91cnMgIT0gbnVsbFxuICAgICAgICA/IGRhdGUuaG91cnMgPCAxMFxuICAgICAgICAgID8gJzAnICsgZGF0ZS5ob3Vyc1xuICAgICAgICAgIDogZGF0ZS5ob3Vycy50b1N0cmluZygpXG4gICAgICAgIDogJzAwJztcbiAgICBjb25zdCBtaW51dGVGb3JtYXR0ZWQgPVxuICAgICAgZGF0ZS5taW51dGVzICE9IG51bGxcbiAgICAgICAgPyBkYXRlLm1pbnV0ZXMgPCAxMFxuICAgICAgICAgID8gJzAnICsgZGF0ZS5taW51dGVzXG4gICAgICAgICAgOiBkYXRlLm1pbnV0ZXMudG9TdHJpbmcoKVxuICAgICAgICA6ICcwMCc7XG4gICAgY29uc3Qgc2Vjb25kRm9ybWF0dGVkID1cbiAgICAgIGRhdGUuc2Vjb25kcyAhPSBudWxsXG4gICAgICAgID8gZGF0ZS5zZWNvbmRzIDwgMTBcbiAgICAgICAgICA/ICcwJyArIGRhdGUuc2Vjb25kc1xuICAgICAgICAgIDogZGF0ZS5zZWNvbmRzLnRvU3RyaW5nKClcbiAgICAgICAgOiAnMDAnO1xuXG4gICAgY29uc3QgZm9ybWF0ID0gdGhpcy5pbnB1dERhdGV0aW1lRm9ybWF0O1xuXG4gICAgY29uc3QgdG9rZW5zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgeXl5eTogeWVhckZvcm1hdHRlZCxcbiAgICAgIE1NOiBtb250aEZvcm1hdHRlZCxcbiAgICAgIGRkOiBkYXlGb3JtYXR0ZWQsXG4gICAgICBISDogaG91ckZvcm1hdHRlZCxcbiAgICAgIG1tOiBtaW51dGVGb3JtYXR0ZWQsXG4gICAgICBzczogc2Vjb25kRm9ybWF0dGVkLFxuICAgIH07XG5cbiAgICBpZiAoZm9ybWF0KSB7XG4gICAgICBjb25zdCBzb3J0ZWRUb2tlbnMgPSBPYmplY3Qua2V5cyh0b2tlbnMpLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBiLmxlbmd0aCAtIGEubGVuZ3RoXG4gICAgICApO1xuXG4gICAgICBsZXQgcmVzdWx0ID0gZm9ybWF0O1xuICAgICAgZm9yIChjb25zdCB0IG9mIHNvcnRlZFRva2Vucykge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShuZXcgUmVnRXhwKHQsICdnJyksIHRva2Vuc1t0XSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgbGV0IGZvcm1hdHRlZERhdGUgPSBgJHt5ZWFyRm9ybWF0dGVkfS0ke21vbnRoRm9ybWF0dGVkfS0ke2RheUZvcm1hdHRlZH1gO1xuICAgIGlmIChkYXRlLmhvdXJzICE9IG51bGwpIHtcbiAgICAgIGZvcm1hdHRlZERhdGUgKz0gYCAke2hvdXJGb3JtYXR0ZWR9OiR7bWludXRlRm9ybWF0dGVkfWA7XG4gICAgfVxuICAgIGlmIChkYXRlLnNlY29uZHMgIT0gbnVsbCkge1xuICAgICAgZm9ybWF0dGVkRGF0ZSArPSBgOiR7c2Vjb25kRm9ybWF0dGVkfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1hdHRlZERhdGU7XG4gIH1cblxuICBvbklucHV0Q2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcblxuICAgIGlmICh2YWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aGlzLmRhdGV0aW1lID0gbmV3IERhdGVUaW1lTW9kZWwoKTtcbiAgICAgIHRoaXMuZGF0ZVN0cmluZyA9ICcnO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmRhdGVTdHJpbmcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZERhdGUgPSB0aGlzLnBhcnNlRGF0ZSh2YWx1ZSk7XG4gICAgaWYgKHBhcnNlZERhdGUpIHtcbiAgICAgIHRoaXMuZGF0ZXRpbWUgPSBuZXcgRGF0ZVRpbWVNb2RlbCh7XG4gICAgICAgIHllYXI6IHBhcnNlZERhdGUueWVhcixcbiAgICAgICAgbW9udGg6IHBhcnNlZERhdGUubW9udGgsXG4gICAgICAgIGRheTogcGFyc2VkRGF0ZS5kYXksXG4gICAgICAgIGhvdXJzOiB0aGlzLmRhdGV0aW1lPy5ob3VycyB8fCAwLFxuICAgICAgICBtaW51dGVzOiB0aGlzLmRhdGV0aW1lPy5taW51dGVzIHx8IDAsXG4gICAgICAgIHNlY29uZHM6IHRoaXMuZGF0ZXRpbWU/LnNlY29uZHMgfHwgMCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZXREYXRlU3RyaW5nTW9kZWwoKTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGR0ID0gRGF0ZVRpbWVNb2RlbC5mcm9tTG9jYWxTdHJpbmcodmFsdWUpO1xuICAgIGlmIChkdCAmJiBkdC55ZWFyKSB7XG4gICAgICB0aGlzLmRhdGV0aW1lID0gZHQ7XG4gICAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xuICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG9uRGF0ZUNoYW5nZShldmVudDogc3RyaW5nIHwgV3NsRGF0ZVN0cnVjdCk6IHZvaWQge1xuICAgIGxldCBkYXRlOiBEYXRlVGltZU1vZGVsO1xuXG4gICAgaWYgKHR5cGVvZiBldmVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRhdGUgPSBuZXcgRGF0ZVRpbWVNb2RlbCh0aGlzLnBhcnNlRGF0ZShldmVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRlID0gbmV3IERhdGVUaW1lTW9kZWwoZXZlbnQpO1xuICAgIH1cblxuICAgIGlmICghZGF0ZSB8fCAhZGF0ZS55ZWFyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRhdGV0aW1lKSB7XG4gICAgICB0aGlzLmRhdGV0aW1lID0gZGF0ZTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGV0aW1lLnllYXIgPSBkYXRlLnllYXI7XG4gICAgdGhpcy5kYXRldGltZS5tb250aCA9IGRhdGUubW9udGg7XG4gICAgdGhpcy5kYXRldGltZS5kYXkgPSBkYXRlLmRheTtcblxuICAgIHRoaXMuY3VycmVudFllYXIgPSBkYXRlLnllYXI7XG4gICAgdGhpcy5jdXJyZW50TW9udGggPSBkYXRlLm1vbnRoO1xuXG4gICAgdGhpcy5zdGFydERhdGUgPSB7XG4gICAgICB5ZWFyOiBkYXRlLnllYXIsXG4gICAgICBtb250aDogZGF0ZS5tb250aCxcbiAgICB9O1xuXG4gICAgdGhpcy5zZXREYXRlU3RyaW5nTW9kZWwoKTtcbiAgfVxuXG4gIHNldERhdGVTdHJpbmdNb2RlbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRldGltZSAmJiB0eXBlb2YgdGhpcy5kYXRldGltZS55ZWFyID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5kYXRlU3RyaW5nID0gdGhpcy5kYXRldGltZS50b1N0cmluZygpO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmRhdGVTdHJpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGVTdHJpbmcgPSAnJztcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5kYXRlU3RyaW5nKTtcbiAgICB9XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldERpc3BsYXlWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmRhdGV0aW1lICYmIHRoaXMuZGF0ZXRpbWUueWVhcikge1xuICAgICAgY29uc3QgZGF0ZVN0cnVjdDogV3NsRGF0ZVRpbWVTdHJ1Y3QgPSB7XG4gICAgICAgIHllYXI6IHRoaXMuZGF0ZXRpbWUueWVhcixcbiAgICAgICAgbW9udGg6IHRoaXMuZGF0ZXRpbWUubW9udGgsXG4gICAgICAgIGRheTogdGhpcy5kYXRldGltZS5kYXksXG4gICAgICAgIGhvdXJzOiB0aGlzLmRhdGV0aW1lLmhvdXJzLFxuICAgICAgICBtaW51dGVzOiB0aGlzLmRhdGV0aW1lLm1pbnV0ZXMsXG4gICAgICAgIHNlY29uZHM6IHRoaXMuZGF0ZXRpbWUuc2Vjb25kcyxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdERhdGUoZGF0ZVN0cnVjdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaW5wdXRCbHVyKCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICBnZXRFZmZlY3RpdmVGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBsZXQgZm9ybWF0ID0gdGhpcy5pbnB1dERhdGV0aW1lRm9ybWF0IHx8IElOUFVUX0RBVEVfRk9STUFUUy5EQVRFX09OTFk7XG5cbiAgICBpZiAodGhpcy5zaG93VGltZUNvbnRyb2xzICYmICF0aGlzLmhhc1RpbWVJbkZvcm1hdChmb3JtYXQpKSB7XG4gICAgICBmb3JtYXQgKz0gdGhpcy5fc2Vjb25kcyA/ICcgSEg6bW06c3MnIDogJyBISDptbSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfVxuXG4gIG9uVGltZUNoYW5nZShldmVudDogV3NsVGltZVN0cnVjdCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICB0aGlzLmRhdGV0aW1lID0gbmV3IERhdGVUaW1lTW9kZWwoe1xuICAgICAgLi4udGhpcy5kYXRldGltZSxcbiAgICAgIGhvdXJzOiBldmVudC5ob3VycyxcbiAgICAgIG1pbnV0ZXM6IGV2ZW50Lm1pbnV0ZXMsXG4gICAgICBzZWNvbmRzOiBldmVudC5zZWNvbmRzLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZXREYXRlU3RyaW5nTW9kZWwoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGhhc1ZhbGlkRGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLmRhdGV0aW1lICYmXG4gICAgICB0eXBlb2YgdGhpcy5kYXRldGltZS55ZWFyID09PSAnbnVtYmVyJyAmJlxuICAgICAgdHlwZW9mIHRoaXMuZGF0ZXRpbWUubW9udGggPT09ICdudW1iZXInICYmXG4gICAgICB0eXBlb2YgdGhpcy5kYXRldGltZS5kYXkgPT09ICdudW1iZXInXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZU1vbnRoc0FuZFllYXJzKCk6IHZvaWQge1xuICAgIHRoaXMubW9udGhzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTIgfSwgKF8sIGkpID0+XG4gICAgICB0aGlzLmdldE1vbnRoTmFtZShpICsgMSlcbiAgICApO1xuICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xuICAgIGNvbnN0IHN0YXJ0WWVhciA9IHRoaXMubWluRGF0ZT8ueWVhciB8fCBjdXJyZW50WWVhciAtIDUwO1xuICAgIGNvbnN0IGVuZFllYXIgPSB0aGlzLm1heERhdGU/LnllYXIgfHwgY3VycmVudFllYXIgKyA1MDtcblxuICAgIHRoaXMueWVhcnMgPSBBcnJheS5mcm9tKFxuICAgICAgeyBsZW5ndGg6IGVuZFllYXIgLSBzdGFydFllYXIgKyAxIH0sXG4gICAgICAoXywgaSkgPT4gZW5kWWVhciAtIGlcbiAgICApLnNvcnQoKGEsIGIpID0+IGIgLSBhKTtcbiAgfVxuXG4gIG9uTW9udGhTZWxlY3QoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50O1xuICAgIGNvbnN0IG5ld01vbnRoID0gcGFyc2VJbnQoc2VsZWN0LnZhbHVlLCAxMCk7XG4gICAgaWYgKG5ld01vbnRoICE9PSB0aGlzLmN1cnJlbnRNb250aCkge1xuICAgICAgY29uc3Qgb2xkTW9udGggPSB0aGlzLmN1cnJlbnRNb250aDtcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gbmV3TW9udGg7XG4gICAgICB0aGlzLm1vbnRoQ2hhbmdlZC5lbWl0KG5ld01vbnRoKTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgICAgdGhpcy5uYXZpZ2F0ZSh7XG4gICAgICAgIGN1cnJlbnQ6IHsgeWVhcjogdGhpcy5jdXJyZW50WWVhciwgbW9udGg6IG9sZE1vbnRoIH0sXG4gICAgICAgIG5leHQ6IHsgeWVhcjogdGhpcy5jdXJyZW50WWVhciwgbW9udGg6IG5ld01vbnRoIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvblllYXJTZWxlY3QoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50O1xuICAgIGNvbnN0IG5ld1llYXIgPSBwYXJzZUludChzZWxlY3QudmFsdWUsIDEwKTtcbiAgICBpZiAobmV3WWVhciAhPT0gdGhpcy5jdXJyZW50WWVhcikge1xuICAgICAgY29uc3Qgb2xkWWVhciA9IHRoaXMuY3VycmVudFllYXI7XG4gICAgICB0aGlzLmN1cnJlbnRZZWFyID0gbmV3WWVhcjtcbiAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgICAgdGhpcy5uYXZpZ2F0ZSh7XG4gICAgICAgIGN1cnJlbnQ6IHsgeWVhcjogb2xkWWVhciwgbW9udGg6IHRoaXMuY3VycmVudE1vbnRoIH0sXG4gICAgICAgIG5leHQ6IHsgeWVhcjogbmV3WWVhciwgbW9udGg6IHRoaXMuY3VycmVudE1vbnRoIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkYXRldGltZS1waWNrZXItY29udGFpbmVyXCI+XG4gIDxkaXYgY2xhc3M9XCJpbnB1dC1jb250YWluZXJcIj5cbiAgICA8aW5wdXQgI2RhdGVJbnB1dCBbbmdDbGFzc109XCJ7XG4gICAgICAgICduZy12YWxpZCc6IG5nQ29udHJvbD8udmFsaWQgPT09IHRydWUsXG4gICAgICAgICduZy1pbnZhbGlkJzogbmdDb250cm9sPy5pbnZhbGlkID09PSB0cnVlLFxuICAgICAgICAnbmctZGlzYWJsZWQnOiBkaXNhYmxlZFxuICAgICAgfVwiIGNsYXNzPVwiZGF0ZXRpbWUtaW5wdXRcIiAoYmx1cik9XCJpbnB1dEJsdXIoKVwiIFtwbGFjZWhvbGRlcl09XCJfcGxhY2Vob2xkZXJcIiBbbmdNb2RlbF09XCJnZXREaXNwbGF5VmFsdWUoKVwiXG4gICAgICAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIHdzbFRvb2x0aXAgW3Rvb2x0aXBJY29uT3ZlcmxhcF09XCIxMlwiXG4gICAgICB0b29sdGlwUGxhY2VtZW50PVwidG9wXCIgLz5cbiAgPC9kaXY+XG5cbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjYWxlbmRhci1pY29uXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IGRpc2FibGVDYWxlbmRhclwiXG4gICAgW25nQ2xhc3NdPVwieyAnZGlzYWJsZWQtYnRuJzogZGlzYWJsZWQgfHwgZGlzYWJsZUNhbGVuZGFyIH1cIiAoY2xpY2spPVwidG9nZ2xlQ2FsZW5kYXIoJGV2ZW50KVwiPlxuICAgIDxpIGNsYXNzPVwiZmEgZmEtY2FsZW5kYXIgZmEtbGdcIj48L2k+XG4gIDwvYnV0dG9uPlxuXG4gIDwhLS0gQ3VzdG9tIENhbGVuZGFyIFBvcG92ZXIgLS0+XG4gIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1wb3BvdmVyXCIgW2NsYXNzLnNob3ddPVwic2hvd0NhbGVuZGFyXCIgW2NsYXNzLmhpZGRlbl09XCIhc2hvd0NhbGVuZGFyXCJcbiAgICBbbmdDbGFzc109XCJjYWxlbmRhclBvc2l0aW9uQ2xhc3NcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgPGRpdiBjbGFzcz1cInBvcG92ZXItY29udGVudFwiPlxuICAgICAgPGRpdiAqbmdJZj1cIiFzaG93VGltZVBpY2tlclRvZ2dsZVwiPlxuICAgICAgICA8IS0tIEN1c3RvbSBEYXRlIFBpY2tlciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1kYXRlcGlja2VyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGVwaWNrZXItaGVhZGVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5hdi1idG5cIiAoY2xpY2spPVwibmF2aWdhdGVNb250aCgtMSlcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWxlZnRcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC15ZWFyLXNlbGVjdHNcIj5cbiAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cIm1vbnRoLXNlbGVjdFwiIFsobmdNb2RlbCldPVwiY3VycmVudE1vbnRoXCIgKGNoYW5nZSk9XCJvbk1vbnRoU2VsZWN0KCRldmVudClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG1vbnRoIG9mIG1vbnRoczsgbGV0IGkgPSBpbmRleFwiIFt2YWx1ZV09XCJpICsgMVwiPlxuICAgICAgICAgICAgICAgICAge3sgbW9udGggfX1cbiAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJ5ZWFyLXNlbGVjdFwiIFsobmdNb2RlbCldPVwiY3VycmVudFllYXJcIiAoY2hhbmdlKT1cIm9uWWVhclNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB5ZWFyIG9mIHllYXJzXCIgW3ZhbHVlXT1cInllYXJcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHllYXIgfX1cbiAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmF2LWJ0blwiIChjbGljayk9XCJuYXZpZ2F0ZU1vbnRoKDEpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1yaWdodFwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGVwaWNrZXItY2FsZW5kYXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWVrZGF5c1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2Vla2RheVwiICpuZ0Zvcj1cImxldCBkYXkgb2Ygd2Vla2RheUxhYmVsc1wiPlxuICAgICAgICAgICAgICAgIHt7IGRheSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF5c1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF5LWNlbGxcIiAqbmdGb3I9XCJsZXQgZGF5IG9mIGNhbGVuZGFyRGF5c1wiIFtjbGFzcy5vdGhlci1tb250aF09XCJkYXkub3RoZXJNb250aFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImRheS5zZWxlY3RlZFwiIFtjbGFzcy5kaXNhYmxlZF09XCJkYXkuZGlzYWJsZWRcIiBbY2xhc3MudG9kYXldPVwiZGF5LnRvZGF5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF0ZShkYXkpXCI+XG4gICAgICAgICAgICAgICAge3sgZGF5LmRheSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2hvd1RpbWVDb250cm9scyAmJiAhaXNEYXRlT25seVwiIGNsYXNzPVwidG9nZ2xlLXRpbWUtYnRuXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiIChjbGljayk9XCJ0b2dnbGVEYXRlVGltZVN0YXRlKCRldmVudClcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNsb2NrIGZhLWNsb2NrLW8gZmEtbGdcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJzaG93VGltZVBpY2tlclRvZ2dsZVwiPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2hvd1RpbWVDb250cm9scyAmJiAhaXNEYXRlT25seVwiIGNsYXNzPVwidG9nZ2xlLWNhbGVuZGFyLWJ0blwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVEYXRlVGltZVN0YXRlKCRldmVudClcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyIGZhLWxnXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItY29udGFpbmVyXCIgKm5nSWY9XCJzaG93VGltZUNvbnRyb2xzICYmICFpc0RhdGVPbmx5XCI+XG4gICAgICAgICAgPCEtLSBDdXN0b20gVGltZSBQaWNrZXIgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10aW1lcGlja2VyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1jb250cm9sc1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyBkYXRlQ29uZmlnPy50b2tlbnM/LmhvdXJzIHx8IFwiSEhcIiB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiYWRqdXN0VGltZSgnaG91cnMnLCBob3Vyc1N0ZXAgfHwgMSlcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi11cFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cInRpbWUtaW5wdXRcIiBbdmFsdWVdPVwiZGF0ZXRpbWU/LmhvdXJzIHx8IDBcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVGltZUZpZWxkQ2hhbmdlKCdob3VycycsICRldmVudClcIiBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCIgbWluPVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIG1heD1cIjIzXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiYWRqdXN0VGltZSgnaG91cnMnLCAtKGhvdXJzU3RlcCB8fCAxKSlcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1kb3duXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXNlcGFyYXRvclwiPjo8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyBkYXRlQ29uZmlnPy50b2tlbnM/Lm1pbnV0ZXMgfHwgXCJtbVwiIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1pbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0aW1lLWJ0blwiIChjbGljayk9XCJhZGp1c3RUaW1lKCdtaW51dGVzJywgbWludXRlc1N0ZXAgfHwgMSlcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi11cFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cInRpbWUtaW5wdXRcIiBbdmFsdWVdPVwiZGF0ZXRpbWU/Lm1pbnV0ZXMgfHwgMFwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25UaW1lRmllbGRDaGFuZ2UoJ21pbnV0ZXMnLCAkZXZlbnQpXCIgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiIG1pbj1cIjBcIlxuICAgICAgICAgICAgICAgICAgICBtYXg9XCI1OVwiIC8+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRpbWUtYnRuXCIgKGNsaWNrKT1cImFkanVzdFRpbWUoJ21pbnV0ZXMnLCAtKG1pbnV0ZXNTdGVwIHx8IDEpKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWRvd25cIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtc2VwYXJhdG9yXCIgKm5nSWY9XCJzZWNvbmRzXCI+OjwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWZpZWxkXCIgKm5nSWY9XCJzZWNvbmRzXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsPnt7IGRhdGVDb25maWc/LnRva2Vucz8uc2Vjb25kcyB8fCBcInNzXCIgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRpbWUtYnRuXCIgKGNsaWNrKT1cImFkanVzdFRpbWUoJ3NlY29uZHMnLCBzZWNvbmRzU3RlcCB8fCAxKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXVwXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwidGltZS1pbnB1dFwiIFt2YWx1ZV09XCJkYXRldGltZT8uc2Vjb25kcyB8fCAwXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblRpbWVGaWVsZENoYW5nZSgnc2Vjb25kcycsICRldmVudClcIiBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCIgbWluPVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIG1heD1cIjU5XCIgLz5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiYWRqdXN0VGltZSgnc2Vjb25kcycsIC0oc2Vjb25kc1N0ZXAgfHwgMSkpXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tZG93blwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48IS0tIEJhY2tkcm9wIGZvciBjbG9zaW5nIHBvcG92ZXIgLS0+XG48ZGl2IGNsYXNzPVwiY2FsZW5kYXItYmFja2Ryb3BcIiBbY2xhc3Muc2hvd109XCJzaG93Q2FsZW5kYXJcIiAoY2xpY2spPVwiY2xvc2VDYWxlbmRhcigpXCI+PC9kaXY+Il19