ng-zenduit 1.0.32 → 1.0.34

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.
@@ -4,17 +4,19 @@ import { DATEPICKER_POSITION } from './datepicker';
4
4
  import { TemplatePortal } from '@angular/cdk/portal';
5
5
  import * as i0 from "@angular/core";
6
6
  import * as i1 from "@angular/cdk/overlay";
7
- import * as i2 from "@angular/common";
8
- import * as i3 from "@angular/forms";
9
- import * as i4 from "../icon/zendu-icon.component";
7
+ import * as i2 from "@ngx-translate/core";
8
+ import * as i3 from "@angular/common";
9
+ import * as i4 from "@angular/forms";
10
+ import * as i5 from "../icon/zendu-icon.component";
10
11
  const defaultHours = '12';
11
12
  const defaultMinuts = '00';
12
13
  const defaultSeconds = '00';
13
14
  export class ZenduDatepickerComponent {
14
- constructor(_element, overlay, viewContainerRef) {
15
+ constructor(_element, overlay, viewContainerRef, _translate) {
15
16
  this._element = _element;
16
17
  this.overlay = overlay;
17
18
  this.viewContainerRef = viewContainerRef;
19
+ this._translate = _translate;
18
20
  /**
19
21
  * callback to emit changes for parent component
20
22
  */
@@ -157,11 +159,20 @@ export class ZenduDatepickerComponent {
157
159
  overlayX: horizontalDirection === DATEPICKER_POSITION.RIGHT ? 'start' : 'end',
158
160
  overlayY: verticalDirection === DATEPICKER_POSITION.BOTTOM ? 'top' : 'bottom'
159
161
  };
162
+ // Determine the vertical position (below or above) and set the vertical offset (0 for below, -20 for above)
163
+ const isBelow = verticalDirection === DATEPICKER_POSITION.BOTTOM;
164
+ const offsetY = isBelow ? 0 : -20;
160
165
  const positionStrategy = this.overlay.position()
161
166
  .flexibleConnectedTo(this.triggerButton)
162
167
  .withPositions([
163
168
  position
164
- ]);
169
+ ])
170
+ // Disable flexible dimensions, meaning the overlay will not resize automatically
171
+ .withFlexibleDimensions(false)
172
+ // Set the vertical offset to avoid overlapping with the parent button
173
+ .withDefaultOffsetY(offsetY)
174
+ // Disable automatic repositioning of the overlay to avoid overlap with other elements
175
+ .withPush(false);
165
176
  this.overlayRef = this.overlay.create({
166
177
  positionStrategy,
167
178
  hasBackdrop: true,
@@ -223,7 +234,9 @@ export class ZenduDatepickerComponent {
223
234
  if (!this.currentSlot) {
224
235
  this.currentSlot = new Date();
225
236
  }
226
- this.daysTitle = moment(this.currentSlot).format("MMM yyyy");
237
+ const enMonth = moment(this.date).format("MMM");
238
+ const translatedMonth = this._translate.instant(enMonth);
239
+ this.daysTitle = moment(this.currentSlot).format("MMM yyyy").replace(enMonth, translatedMonth);
227
240
  this.dayRows = [];
228
241
  let current = moment(this.currentSlot).startOf("month").startOf("week").add(1, "day");
229
242
  let end = moment(this.currentSlot).endOf("month").endOf("week").add(1, "day");
@@ -369,11 +382,18 @@ export class ZenduDatepickerComponent {
369
382
  if (this.boxDesign && moment(this.date).isSame(moment(), "day")) {
370
383
  return 'Today';
371
384
  }
385
+ // get the translated text for day and month
386
+ const enMonth = moment(this.date).format("MMM");
387
+ const enDay = moment(this.date).format("ddd");
388
+ const translatedMonth = this._translate.instant(enMonth);
389
+ const translatedDay = this._translate.instant(enDay);
372
390
  if (this.showDate && !this.showTime && !this.boxDesign) {
373
391
  // Expanded formatting for date only picker
374
- return moment(this.date).format("ddd, DD MMM YYYY");
392
+ return moment(this.date).format("ddd, DD MMM YYYY")
393
+ .replace(enDay, translatedDay)
394
+ .replace(enMonth, translatedMonth);
375
395
  }
376
- return moment(this.date).format("MMM DD, YY");
396
+ return moment(this.date).format("MMM DD, YY").replace(enMonth, translatedMonth);
377
397
  }
378
398
  formattedTime() {
379
399
  if (!this.date) {
@@ -485,12 +505,12 @@ export class ZenduDatepickerComponent {
485
505
  this.updateDays();
486
506
  }
487
507
  }
488
- ZenduDatepickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduDatepickerComponent, deps: [{ token: i0.ElementRef }, { token: i1.Overlay }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
489
- ZenduDatepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduDatepickerComponent, selector: "zen-datepicker", inputs: { date: "date", showTime: "showTime", showDate: "showDate", parentContainer: "parentContainer", containerClass: "containerClass", minDate: "minDate", maxDate: "maxDate", boxDesign: "boxDesign", highlightDays: "highlightDays", autoConfirm: "autoConfirm", hint: "hint", highlightError: "highlightError", disabled: "disabled", readonly: "readonly", xPosition: "xPosition", yPosition: "yPosition", dispalyOverParent: "dispalyOverParent" }, outputs: { dateChange: "dateChange" }, host: { listeners: { "window:mousedown": "outsideHandling($event)", "window:scroll": "scroll()" } }, viewQueries: [{ propertyName: "dateMenu", first: true, predicate: ["dateMenu"], descendants: true }, { propertyName: "triggerButton", first: true, predicate: ["triggerButton"], descendants: true }, { propertyName: "dateMenuTemplate", first: true, predicate: ["dateMenuTemplate"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"date-component\">\n <!-- Material design datepicker toggle -->\n <ng-container *ngIf=\"!boxDesign\">\n <button class=\"date-toggle\"\n #triggerButton\n [disabled]=\"disabled || readonly\"\n (click)=\"togglePicker()\"\n [ngClass]=\"{'active': isPickerVisible,'error': highlightError,'readonly': readonly}\">\n <div class=\"date-content\">\n <!-- date placeholder -->\n <div class=\"date-placeholder\"\n *ngIf=\"!date\">\n Select Date\n </div>\n\n <!-- Selected datetime -->\n <div *ngIf=\"date\">\n <span *ngIf=\"showDate\">{{formattedDate()}}</span>\n <span *ngIf=\"showTime\">&nbsp;{{formattedTime()}}</span>\n </div>\n </div>\n\n <!-- Datepicker icon, depends on picker type -->\n <zen-icon class=\"date-icon\"\n [src]=\"getIcon()\"\n [ngClass]=\"{'filled': date}\">\n </zen-icon>\n </button>\n </ng-container>\n\n <!-- Box design datepicker toggle -->\n <ng-container *ngIf=\"boxDesign\">\n <button class=\"date-toggle new-box-design\"\n #triggerButton\n [disabled]=\"disabled || readonly\"\n (click)=\"togglePicker()\"\n [ngClass]=\"{'active': isPickerVisible,'error': highlightError,'readonly': readonly}\">\n\n <!-- Datepicker icon, depends on picker type -->\n <zen-icon class=\"date-icon\"\n [src]=\"getIcon()\"\n [ngClass]=\"{'filled': date}\">\n </zen-icon>\n\n <div class=\"date-content new-box-design\">\n <!-- date placeholder -->\n <div class=\"date-placeholder\"\n *ngIf=\"!date\">\n Select Date\n </div>\n\n <!-- Selected datetime -->\n <div *ngIf=\"date\">\n <span *ngIf=\"showDate\">{{formattedDate()}}</span>\n <span *ngIf=\"showTime\">&nbsp;{{formattedTime()}}</span>\n </div>\n </div>\n </button>\n </ng-container>\n\n <!-- Datepicker popup -->\n <ng-container *ngTemplateOutlet=\"dateMenuTemplate\">\n</ng-container>\n\n<ng-template #dateMenuTemplate>\n <div #dateMenu *ngIf=\"isPickerVisible\"\n class=\"date-menu\"\n [ngClass]=\"{ 'right': right, 'bottom': bottom }\">\n <div class=\"date-modal\">\n <ng-container *ngIf=\"showDate\">\n <div class=\"days-toolbar\">\n <i (click)=\"prevMonth()\"\n class=\"material-icons\">navigate_before</i>\n <span class=\"title\"\n (click)=\"showMonthPicker()\">{{daysTitle}}</span>\n <i (click)=\"nextMonth()\"\n class=\"material-icons\">navigate_next</i>\n </div>\n <div class=\"days-container\">\n <div class=\"week-days\">\n <div *ngFor=\"let weekDay of weekDays\"\n class=\"week-day\">\n {{weekDay}}\n </div>\n </div>\n <div *ngFor=\"let row of dayRows\"\n class=\"day-row\">\n <div *ngFor=\"let day of row.days\"\n (click)=\"selectDay(day)\"\n class=\"day-item\"\n [class.ousideRange]=\"day.isOutside\"\n [class.selected]=\"day.selected\"\n [class.disabledDay]=\"day.isDisabled\">\n {{day.lbl}}\n <zen-icon *ngIf=\"day.isHighlighted\"\n class=\"highlight-icon\"\n src=\"assets/ng-zenduit/icons/play.svg\"></zen-icon>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div *ngIf=\"showTime\"\n class=\"time-container\">\n\n <div class=\"time-lbl\">\n Select Time:\n </div>\n\n <div class=\"time-picker\">\n <div class=\"input-wrapper\">\n <zen-icon (click)=\"hourUp()\"\n src=\"assets/ng-zenduit/icons/arrow-up-small.svg\"></zen-icon>\n <input [(ngModel)]=\"hour\"\n (ngModelChange)=\"timeChanged()\" />\n <zen-icon (click)=\"hourDown()\"\n src=\"assets/ng-zenduit/icons/arrow-down-small.svg\"></zen-icon>\n </div>\n <label>:</label>\n <div class=\"input-wrapper\">\n <zen-icon (click)=\"minUp()\"\n src=\"assets/ng-zenduit/icons/arrow-up-small.svg\"></zen-icon>\n <input [(ngModel)]=\"min\"\n (ngModelChange)=\"timeChanged()\" />\n <zen-icon (click)=\"minDown()\"\n src=\"assets/ng-zenduit/icons/arrow-down-small.svg\"></zen-icon>\n </div>\n <div class=\"am-pm-picker\">\n <div class=\"main\"\n (click)=\"toggleTime()\">\n {{isPM ? 'PM' : 'AM'}}\n </div>\n <div class=\"sub\"\n (click)=\"toggleTime()\">\n {{isPM ? 'AM' : 'PM'}}\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"hint\"\n *ngIf=\"hint\">\n <div class=\"hint-description\">\n {{hint.description}}\n </div>\n <div class=\"hint-date\"\n (click)=\"selectHintDate(hint.date)\">\n {{hint.maskText}}\n </div>\n </div>\n\n <div class=\"footer\"\n *ngIf=\"!autoConfirm || showTime\">\n <button *ngIf=\"date\"\n (click)=\"clear()\"\n class=\"button-stroked\">\n Clear\n </button>\n <button *ngIf=\"!date\"\n (click)=\"cancel()\"\n class=\"button-stroked\">\n Cancel\n </button>\n <button [disabled]=\"!_dateToSet\"\n (click)=\"apply()\"\n class=\"button-flat\">\n Apply\n </button>\n </div>\n\n <ng-container *ngIf=\"monthPickerVisible\">\n <div class=\"month-picker\">\n <div class=\"days-toolbar\">\n <i (click)=\"prevYear()\"\n class=\"material-icons\">navigate_before</i>\n <span class=\"title\"\n (click)=\"showYearPicker()\">{{ currentSlot | date: 'yyyy' }}</span>\n <i (click)=\"nextYear()\"\n class=\"material-icons\">navigate_next</i>\n </div>\n <div class=\"months-container\">\n <div class=\"month-item\"\n *ngFor=\"let month of months; index as index\"\n (click)=\"selectMonth(index)\">\n {{ month }}\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"yearPickerVisible\">\n <div class=\"month-picker\">\n <div class=\"days-toolbar\">\n <i (click)=\"prevYearGroup()\"\n class=\"material-icons\">navigate_before</i>\n <span class=\"title\"\n (click)=\"showYearPicker()\">{{ currentSlot | date: 'yyyy' }}</span>\n <i (click)=\"nextYearGroup()\"\n class=\"material-icons\">navigate_next</i>\n </div>\n <div class=\"months-container\">\n <div class=\"month-item\"\n *ngFor=\"let year of years\"\n (click)=\"selectYear(year)\">\n {{ year }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"date-modal-extra-space\"></div>\n </div>\n </ng-template>\n</div>\n", styles: [".date-component{width:100%;position:relative}.date-component .date-toggle{display:flex;align-items:center;justify-content:space-between;position:relative;gap:9px;transition:.3s;width:100%;background:var(--color-white-primary, #ffffff);-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:1px solid var(--color-white-tint-4, #d6d6d8);padding:0 0 8px;font-size:14px;font-style:normal;font-weight:400;line-height:130%;color:var(--color-grey-primary, #4f4f4f)}.date-component .date-toggle.new-box-design{border:1px solid var(--color-white-tint-1, #f2f2f2);border-radius:2px;padding:6px 12px;gap:4px!important}.date-component .date-toggle:hover .date-placeholder{color:var(--color-grey-shade-2, #828282)}.date-component .date-toggle:hover .date-icon{background-color:var(--color-grey-shade-2, #828282)}.date-component .date-toggle:focus,.date-component .date-toggle.active{border-color:var(--color-blue-primary, #2188d9)}.date-component .date-toggle:focus .date-icon,.date-component .date-toggle.active .date-icon{background-color:var(--color-blue-primary, #2188d9)!important}.date-component .date-toggle[disabled]{cursor:not-allowed;border-color:var(--color-white-tint-3, #e0e0e0)}.date-component .date-toggle[disabled] .date-content{color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle[disabled] .date-icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle.readonly{cursor:default;border-color:var(--color-white-tint-3, #e0e0e0)}.date-component .date-toggle.readonly .date-content{color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle.readonly .date-icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle.error{border-color:var(--color-error-primary, #dc3e33)}.date-component .date-toggle.error .date-icon{background-color:var(--color-error-primary, #dc3e33)!important}.date-component .date-toggle.error .date-content.new-box-design{color:var(--color-error-primary, #dc3e33)!important}.date-component .date-content{flex:1;font-size:16px;text-align:left;height:18px;min-width:30px;color:var(--color-grey-primary, #4f4f4f);white-space:nowrap;transition:.3s}.date-component .date-content .date-placeholder{transition:.3s;color:var(--color-white-tint-6, #bebebe)}.date-component .date-content.new-box-design{color:var(--color-grey-shade-2, #828282)}.date-component .date-icon{width:24px;height:24px;background-color:var(--color-white-tint-6, #bebebe);transition:.3s}.date-component .date-icon.filled{background-color:var(--color-grey-shade-2, #828282)}.date-component .date-menu{position:absolute;visibility:hidden}.date-component .time-container{display:flex;padding:16px 24px;justify-content:space-between;border-bottom:1px solid #f2f2f2;align-items:center}.date-component .time-container .time-lbl{font-weight:500;font-size:14px;color:var(--color-grey-primary, #4f4f4f);white-space:nowrap}.date-component .time-container .time-picker{display:flex;align-items:center;gap:7px}.date-component .time-container .time-picker .input-wrapper{display:flex;flex-direction:column;align-items:center}.date-component .time-container .time-picker .input-wrapper zen-icon{background-color:var(--color-white-tint-4, #d6d6d8);width:16px;height:16px;cursor:pointer}.date-component .time-container .time-picker .input-wrapper input{width:30px;height:25px;text-align:center;border:1px solid var(--color-white-tint-1, #f2f2f2);font-weight:400;font-size:14px;color:var(--color-grey-primary, #4f4f4f);border-radius:2px}.date-component .time-container .time-picker .input-wrapper input:focus{outline:none;border-color:var(--color-blue-primary, #2188d9)}.date-component .time-container .time-picker .am-pm-picker{font-weight:400;font-size:14px;padding-top:18px;cursor:pointer}.date-component .time-container .time-picker .am-pm-picker .main{color:var(--color-grey-primary, #4f4f4f)}.date-component .time-container .time-picker .am-pm-picker .sub{color:var(--color-white-tint-4, #d6d6d8)}.date-component .hint{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:16px 24px;border-bottom:1px solid #ECECED;font-style:normal;font-weight:400;font-size:14px;line-height:130%;color:#4f4f4f}.date-component .hint .hint-date{cursor:pointer;text-decoration-line:underline}.date-component .footer{display:flex;justify-content:end;gap:16px;padding:16px 24px}.date-component .month-picker{position:absolute;inset:0;background:white}.date-component .month-picker .months-container{display:flex;flex-wrap:wrap;justify-content:space-between;padding:10px 20px}.date-component .month-picker .months-container .month-item{display:inline-flex;align-items:center;justify-content:center;height:50px;width:30%;cursor:pointer;color:var(--color-grey-shade-2, #828282);border-radius:4px}.date-component .month-picker .months-container .month-item:hover{color:#fff;background-color:var(--color-blue-primary, #2188d9)}.date-component .right{right:0}.date-component .bottom{bottom:42px}.date-menu{width:320px;background:transparent;z-index:1200}.date-menu .date-modal{border-radius:8px;width:320px;overflow-y:auto;white-space:initial;background:#ffffff;box-shadow:0 2px 4px -1px #00000008,0 4px 5px #0000003d,0 1px 10px #0000001a}.date-menu .date-modal-extra-space{height:10px;margin:0 0 -10px;background:transparent}.date-menu .days-toolbar{display:flex;align-items:center;justify-content:space-between;padding:16px 34px}.date-menu .days-toolbar .material-icons{color:#333;font-size:20px;cursor:pointer;-webkit-user-select:none;user-select:none}.date-menu .days-toolbar .title{font-size:14px;font-weight:500;color:var(--color-grey-primary, #4f4f4f);cursor:pointer}.date-menu .days-container{border-bottom:1px solid #f2f2f2;padding:0 24px}.date-menu .days-container .week-days{display:flex;align-items:center;justify-content:space-between;font-size:14px;color:var(--color-grey-primary, #4f4f4f);font-weight:500;margin-bottom:8px;cursor:default}.date-menu .days-container .week-days .week-day{width:39px;text-align:center}.date-menu .days-container .day-row{display:flex;align-items:center;justify-content:space-between;font-size:14px;font-weight:400;color:var(--color-grey-primary, #4f4f4f)}.date-menu .days-container .day-row .day-item{position:relative;width:39px;height:39px;display:flex;justify-content:center;align-items:center;cursor:pointer;border-radius:4px}.date-menu .days-container .day-row .day-item .highlight-icon{position:absolute;right:0;height:14px;width:14px;background-color:#5cbb3a}.date-menu .days-container .day-row .day-item:hover{background:var(--color-blue-tint-1, #f4f9fd);color:var(--color-blue-primary, #2188d9)}.date-menu .days-container .day-row .day-item.selected{background:var(--color-primary, #2188d9);color:#fff}.date-menu .days-container .day-row .day-item.selected .highlight-icon{background-color:#fff}.date-menu .days-container .day-row .day-item.ousideRange{color:#b8b9bc}.date-menu .days-container .day-row .day-item.disabledDay{color:#b8b9bc;cursor:not-allowed!important}.date-menu .footer{display:flex;justify-content:end;gap:16px;padding:16px 24px}::ng-deep .custom-backdrop{position:absolute;top:0;left:0;width:100vw;height:100vh}::ng-deep .cdk-overlay-connected-position-bounding-box{position:fixed;width:320px!important;height:343px!important}\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: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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.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: "component", type: i4.ZenduIconComponent, selector: "zen-icon", inputs: ["src"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
508
+ ZenduDatepickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduDatepickerComponent, deps: [{ token: i0.ElementRef }, { token: i1.Overlay }, { token: i0.ViewContainerRef }, { token: i2.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
509
+ ZenduDatepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduDatepickerComponent, selector: "zen-datepicker", inputs: { date: "date", showTime: "showTime", showDate: "showDate", parentContainer: "parentContainer", containerClass: "containerClass", minDate: "minDate", maxDate: "maxDate", boxDesign: "boxDesign", highlightDays: "highlightDays", autoConfirm: "autoConfirm", hint: "hint", highlightError: "highlightError", disabled: "disabled", readonly: "readonly", xPosition: "xPosition", yPosition: "yPosition", dispalyOverParent: "dispalyOverParent" }, outputs: { dateChange: "dateChange" }, host: { listeners: { "window:mousedown": "outsideHandling($event)", "window:scroll": "scroll()" } }, viewQueries: [{ propertyName: "dateMenu", first: true, predicate: ["dateMenu"], descendants: true }, { propertyName: "triggerButton", first: true, predicate: ["triggerButton"], descendants: true }, { propertyName: "dateMenuTemplate", first: true, predicate: ["dateMenuTemplate"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"date-component\">\n <!-- Material design datepicker toggle -->\n <ng-container *ngIf=\"!boxDesign\">\n <button class=\"date-toggle\"\n #triggerButton\n [disabled]=\"disabled || readonly\"\n (click)=\"togglePicker()\"\n [ngClass]=\"{'active': isPickerVisible,'error': highlightError,'readonly': readonly}\">\n <div class=\"date-content\">\n <!-- date placeholder -->\n <div class=\"date-placeholder\"\n *ngIf=\"!date\">\n {{\"Select Date\" | translate}}\n </div>\n\n <!-- Selected datetime -->\n <div *ngIf=\"date\">\n <span *ngIf=\"showDate\">{{formattedDate()}}</span>\n <span *ngIf=\"showTime\">&nbsp;{{formattedTime()}}</span>\n </div>\n </div>\n\n <!-- Datepicker icon, depends on picker type -->\n <zen-icon class=\"date-icon\"\n [src]=\"getIcon()\"\n [ngClass]=\"{'filled': date}\">\n </zen-icon>\n </button>\n </ng-container>\n\n <!-- Box design datepicker toggle -->\n <ng-container *ngIf=\"boxDesign\">\n <button class=\"date-toggle new-box-design\"\n #triggerButton\n [disabled]=\"disabled || readonly\"\n (click)=\"togglePicker()\"\n [ngClass]=\"{'active': isPickerVisible,'error': highlightError,'readonly': readonly}\">\n\n <!-- Datepicker icon, depends on picker type -->\n <zen-icon class=\"date-icon\"\n [src]=\"getIcon()\"\n [ngClass]=\"{'filled': date}\">\n </zen-icon>\n\n <div class=\"date-content new-box-design\">\n <!-- date placeholder -->\n <div class=\"date-placeholder\"\n *ngIf=\"!date\">\n {{\"Select Date\" | translate}}\n </div>\n\n <!-- Selected datetime -->\n <div *ngIf=\"date\">\n <span *ngIf=\"showDate\">{{formattedDate()}}</span>\n <span *ngIf=\"showTime\">&nbsp;{{formattedTime()}}</span>\n </div>\n </div>\n </button>\n </ng-container>\n\n <!-- Datepicker popup -->\n <ng-container *ngTemplateOutlet=\"dateMenuTemplate\">\n </ng-container>\n\n <ng-template #dateMenuTemplate>\n <div #dateMenu\n *ngIf=\"isPickerVisible\"\n class=\"date-menu\"\n [ngClass]=\"{ 'right': right, 'bottom': bottom }\">\n <div class=\"date-modal\">\n <ng-container *ngIf=\"showDate\">\n <div class=\"days-toolbar\">\n <i (click)=\"prevMonth()\"\n class=\"material-icons\">navigate_before</i>\n <span class=\"title\"\n (click)=\"showMonthPicker()\">{{daysTitle}}</span>\n <i (click)=\"nextMonth()\"\n class=\"material-icons\">navigate_next</i>\n </div>\n <div class=\"days-container\">\n <div class=\"week-days\">\n <div *ngFor=\"let weekDay of weekDays\"\n class=\"week-day\">\n {{weekDay}}\n </div>\n </div>\n <div *ngFor=\"let row of dayRows\"\n class=\"day-row\">\n <div *ngFor=\"let day of row.days\"\n (click)=\"selectDay(day)\"\n class=\"day-item\"\n [class.ousideRange]=\"day.isOutside\"\n [class.selected]=\"day.selected\"\n [class.disabledDay]=\"day.isDisabled\">\n {{day.lbl | translate}}\n <zen-icon *ngIf=\"day.isHighlighted\"\n class=\"highlight-icon\"\n src=\"assets/ng-zenduit/icons/play.svg\"></zen-icon>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div *ngIf=\"showTime\"\n class=\"time-container\">\n\n <div class=\"time-lbl\">\n {{\"Select Time\" | translate}}:\n </div>\n\n <div class=\"time-picker\">\n <div class=\"input-wrapper\">\n <zen-icon (click)=\"hourUp()\"\n src=\"assets/ng-zenduit/icons/arrow-up-small.svg\"></zen-icon>\n <input [(ngModel)]=\"hour\"\n (ngModelChange)=\"timeChanged()\" />\n <zen-icon (click)=\"hourDown()\"\n src=\"assets/ng-zenduit/icons/arrow-down-small.svg\"></zen-icon>\n </div>\n <label>:</label>\n <div class=\"input-wrapper\">\n <zen-icon (click)=\"minUp()\"\n src=\"assets/ng-zenduit/icons/arrow-up-small.svg\"></zen-icon>\n <input [(ngModel)]=\"min\"\n (ngModelChange)=\"timeChanged()\" />\n <zen-icon (click)=\"minDown()\"\n src=\"assets/ng-zenduit/icons/arrow-down-small.svg\"></zen-icon>\n </div>\n <div class=\"am-pm-picker\">\n <div class=\"main\"\n (click)=\"toggleTime()\">\n {{(isPM ? 'PM' : 'AM') | translate}}\n </div>\n <div class=\"sub\"\n (click)=\"toggleTime()\">\n {{(isPM ? 'AM' : 'PM') | translate}}\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"hint\"\n *ngIf=\"hint\">\n <div class=\"hint-description\">\n {{hint.description | translate}}\n </div>\n <div class=\"hint-date\"\n (click)=\"selectHintDate(hint.date)\">\n {{hint.maskText | translate}}\n </div>\n </div>\n\n <div class=\"footer\"\n *ngIf=\"!autoConfirm || showTime\">\n <button *ngIf=\"date\"\n (click)=\"clear()\"\n class=\"button-stroked\">\n {{\"Clear\" | translate}}\n </button>\n <button *ngIf=\"!date\"\n (click)=\"cancel()\"\n class=\"button-stroked\">\n {{\"Cancel\" | translate}}\n </button>\n <button [disabled]=\"!_dateToSet\"\n (click)=\"apply()\"\n class=\"button-flat\">\n {{\"Apply\" | translate}}\n </button>\n </div>\n\n <ng-container *ngIf=\"monthPickerVisible\">\n <div class=\"month-picker\">\n <div class=\"days-toolbar\">\n <i (click)=\"prevYear()\"\n class=\"material-icons\">navigate_before</i>\n <span class=\"title\"\n (click)=\"showYearPicker()\">{{ currentSlot | date: 'yyyy' }}</span>\n <i (click)=\"nextYear()\"\n class=\"material-icons\">navigate_next</i>\n </div>\n <div class=\"months-container\">\n <div class=\"month-item\"\n *ngFor=\"let month of months; index as index\"\n (click)=\"selectMonth(index)\">\n {{ month | translate }}\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"yearPickerVisible\">\n <div class=\"month-picker\">\n <div class=\"days-toolbar\">\n <i (click)=\"prevYearGroup()\"\n class=\"material-icons\">navigate_before</i>\n <span class=\"title\"\n (click)=\"showYearPicker()\">{{ currentSlot | date: 'yyyy' }}</span>\n <i (click)=\"nextYearGroup()\"\n class=\"material-icons\">navigate_next</i>\n </div>\n <div class=\"months-container\">\n <div class=\"month-item\"\n *ngFor=\"let year of years\"\n (click)=\"selectYear(year)\">\n {{ year }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"date-modal-extra-space\"></div>\n </div>\n </ng-template>\n</div>\n", styles: [".date-component{width:100%;position:relative}.date-component .date-toggle{display:flex;align-items:center;justify-content:space-between;position:relative;gap:9px;transition:.3s;width:100%;background:var(--color-white-primary, #ffffff);-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:1px solid var(--color-white-tint-4, #d6d6d8);padding:0 0 8px;font-size:14px;font-style:normal;font-weight:400;line-height:130%;color:var(--color-grey-primary, #4f4f4f)}.date-component .date-toggle.new-box-design{border:1px solid var(--color-white-tint-1, #f2f2f2);border-radius:2px;padding:6px 12px;gap:4px!important}.date-component .date-toggle:hover .date-placeholder{color:var(--color-grey-shade-2, #828282)}.date-component .date-toggle:hover .date-icon{background-color:var(--color-grey-shade-2, #828282)}.date-component .date-toggle:focus,.date-component .date-toggle.active{border-color:var(--color-blue-primary, #2188d9)}.date-component .date-toggle:focus .date-icon,.date-component .date-toggle.active .date-icon{background-color:var(--color-blue-primary, #2188d9)!important}.date-component .date-toggle[disabled]{cursor:not-allowed;border-color:var(--color-white-tint-3, #e0e0e0)}.date-component .date-toggle[disabled] .date-content{color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle[disabled] .date-icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle.readonly{cursor:default;border-color:var(--color-white-tint-3, #e0e0e0)}.date-component .date-toggle.readonly .date-content{color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle.readonly .date-icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle.error{border-color:var(--color-error-primary, #dc3e33)}.date-component .date-toggle.error .date-icon{background-color:var(--color-error-primary, #dc3e33)!important}.date-component .date-toggle.error .date-content.new-box-design{color:var(--color-error-primary, #dc3e33)!important}.date-component .date-content{flex:1;font-size:16px;text-align:left;height:18px;min-width:30px;color:var(--color-grey-primary, #4f4f4f);white-space:nowrap;transition:.3s}.date-component .date-content .date-placeholder{transition:.3s;color:var(--color-white-tint-6, #bebebe)}.date-component .date-content.new-box-design{color:var(--color-grey-shade-2, #828282)}.date-component .date-icon{width:24px;height:24px;background-color:var(--color-white-tint-6, #bebebe);transition:.3s}.date-component .date-icon.filled{background-color:var(--color-grey-shade-2, #828282)}.date-component .date-menu{position:absolute;visibility:hidden}.date-component .time-container{display:flex;padding:16px 24px;justify-content:space-between;border-bottom:1px solid #f2f2f2;align-items:center}.date-component .time-container .time-lbl{font-weight:500;font-size:14px;color:var(--color-grey-primary, #4f4f4f);white-space:nowrap}.date-component .time-container .time-picker{display:flex;align-items:center;gap:7px}.date-component .time-container .time-picker .input-wrapper{display:flex;flex-direction:column;align-items:center}.date-component .time-container .time-picker .input-wrapper zen-icon{background-color:var(--color-white-tint-4, #d6d6d8);width:16px;height:16px;cursor:pointer}.date-component .time-container .time-picker .input-wrapper input{width:30px;height:25px;text-align:center;border:1px solid var(--color-white-tint-1, #f2f2f2);font-weight:400;font-size:14px;color:var(--color-grey-primary, #4f4f4f);border-radius:2px}.date-component .time-container .time-picker .input-wrapper input:focus{outline:none;border-color:var(--color-blue-primary, #2188d9)}.date-component .time-container .time-picker .am-pm-picker{font-weight:400;font-size:14px;padding-top:18px;cursor:pointer}.date-component .time-container .time-picker .am-pm-picker .main{color:var(--color-grey-primary, #4f4f4f)}.date-component .time-container .time-picker .am-pm-picker .sub{color:var(--color-white-tint-4, #d6d6d8)}.date-component .hint{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:16px 24px;border-bottom:1px solid #ECECED;font-style:normal;font-weight:400;font-size:14px;line-height:130%;color:#4f4f4f}.date-component .hint .hint-date{cursor:pointer;text-decoration-line:underline}.date-component .footer{display:flex;justify-content:end;gap:16px;padding:16px 24px}.date-component .month-picker{position:absolute;inset:0;background:white}.date-component .month-picker .months-container{display:flex;flex-wrap:wrap;justify-content:space-between;padding:10px 20px}.date-component .month-picker .months-container .month-item{display:inline-flex;align-items:center;justify-content:center;height:50px;width:30%;cursor:pointer;color:var(--color-grey-shade-2, #828282);border-radius:4px}.date-component .month-picker .months-container .month-item:hover{color:#fff;background-color:var(--color-blue-primary, #2188d9)}.date-component .right{right:0}.date-component .bottom{bottom:42px}.date-menu{width:320px;background:transparent;z-index:1200}.date-menu .date-modal{border-radius:8px;width:320px;overflow-y:auto;white-space:initial;background:#ffffff;box-shadow:0 2px 4px -1px #00000008,0 4px 5px #0000003d,0 1px 10px #0000001a}.date-menu .date-modal-extra-space{height:10px;margin:0 0 -10px;background:transparent}.date-menu .days-toolbar{display:flex;align-items:center;justify-content:space-between;padding:16px 34px}.date-menu .days-toolbar .material-icons{color:#333;font-size:20px;cursor:pointer;-webkit-user-select:none;user-select:none}.date-menu .days-toolbar .title{font-size:14px;font-weight:500;color:var(--color-grey-primary, #4f4f4f);cursor:pointer}.date-menu .days-container{border-bottom:1px solid #f2f2f2;padding:0 24px}.date-menu .days-container .week-days{display:flex;align-items:center;justify-content:space-between;font-size:14px;color:var(--color-grey-primary, #4f4f4f);font-weight:500;margin-bottom:8px;cursor:default}.date-menu .days-container .week-days .week-day{width:39px;text-align:center}.date-menu .days-container .day-row{display:flex;align-items:center;justify-content:space-between;font-size:14px;font-weight:400;color:var(--color-grey-primary, #4f4f4f)}.date-menu .days-container .day-row .day-item{position:relative;width:39px;height:39px;display:flex;justify-content:center;align-items:center;cursor:pointer;border-radius:4px}.date-menu .days-container .day-row .day-item .highlight-icon{position:absolute;right:0;height:14px;width:14px;background-color:#5cbb3a}.date-menu .days-container .day-row .day-item:hover{background:var(--color-blue-tint-1, #f4f9fd);color:var(--color-blue-primary, #2188d9)}.date-menu .days-container .day-row .day-item.selected{background:var(--color-primary, #2188d9);color:#fff}.date-menu .days-container .day-row .day-item.selected .highlight-icon{background-color:#fff}.date-menu .days-container .day-row .day-item.ousideRange{color:#b8b9bc}.date-menu .days-container .day-row .day-item.disabledDay{color:#b8b9bc;cursor:not-allowed!important}.date-menu .footer{display:flex;justify-content:end;gap:16px;padding:16px 24px}::ng-deep .custom-backdrop{position:absolute;top:0;left:0;width:100vw;height:100vh}::ng-deep .cdk-overlay-pane.custom-overlay{position:absolute}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.ZenduIconComponent, selector: "zen-icon", inputs: ["src"] }, { kind: "pipe", type: i3.DatePipe, name: "date" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
490
510
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduDatepickerComponent, decorators: [{
491
511
  type: Component,
492
- args: [{ selector: 'zen-datepicker', template: "<div class=\"date-component\">\n <!-- Material design datepicker toggle -->\n <ng-container *ngIf=\"!boxDesign\">\n <button class=\"date-toggle\"\n #triggerButton\n [disabled]=\"disabled || readonly\"\n (click)=\"togglePicker()\"\n [ngClass]=\"{'active': isPickerVisible,'error': highlightError,'readonly': readonly}\">\n <div class=\"date-content\">\n <!-- date placeholder -->\n <div class=\"date-placeholder\"\n *ngIf=\"!date\">\n Select Date\n </div>\n\n <!-- Selected datetime -->\n <div *ngIf=\"date\">\n <span *ngIf=\"showDate\">{{formattedDate()}}</span>\n <span *ngIf=\"showTime\">&nbsp;{{formattedTime()}}</span>\n </div>\n </div>\n\n <!-- Datepicker icon, depends on picker type -->\n <zen-icon class=\"date-icon\"\n [src]=\"getIcon()\"\n [ngClass]=\"{'filled': date}\">\n </zen-icon>\n </button>\n </ng-container>\n\n <!-- Box design datepicker toggle -->\n <ng-container *ngIf=\"boxDesign\">\n <button class=\"date-toggle new-box-design\"\n #triggerButton\n [disabled]=\"disabled || readonly\"\n (click)=\"togglePicker()\"\n [ngClass]=\"{'active': isPickerVisible,'error': highlightError,'readonly': readonly}\">\n\n <!-- Datepicker icon, depends on picker type -->\n <zen-icon class=\"date-icon\"\n [src]=\"getIcon()\"\n [ngClass]=\"{'filled': date}\">\n </zen-icon>\n\n <div class=\"date-content new-box-design\">\n <!-- date placeholder -->\n <div class=\"date-placeholder\"\n *ngIf=\"!date\">\n Select Date\n </div>\n\n <!-- Selected datetime -->\n <div *ngIf=\"date\">\n <span *ngIf=\"showDate\">{{formattedDate()}}</span>\n <span *ngIf=\"showTime\">&nbsp;{{formattedTime()}}</span>\n </div>\n </div>\n </button>\n </ng-container>\n\n <!-- Datepicker popup -->\n <ng-container *ngTemplateOutlet=\"dateMenuTemplate\">\n</ng-container>\n\n<ng-template #dateMenuTemplate>\n <div #dateMenu *ngIf=\"isPickerVisible\"\n class=\"date-menu\"\n [ngClass]=\"{ 'right': right, 'bottom': bottom }\">\n <div class=\"date-modal\">\n <ng-container *ngIf=\"showDate\">\n <div class=\"days-toolbar\">\n <i (click)=\"prevMonth()\"\n class=\"material-icons\">navigate_before</i>\n <span class=\"title\"\n (click)=\"showMonthPicker()\">{{daysTitle}}</span>\n <i (click)=\"nextMonth()\"\n class=\"material-icons\">navigate_next</i>\n </div>\n <div class=\"days-container\">\n <div class=\"week-days\">\n <div *ngFor=\"let weekDay of weekDays\"\n class=\"week-day\">\n {{weekDay}}\n </div>\n </div>\n <div *ngFor=\"let row of dayRows\"\n class=\"day-row\">\n <div *ngFor=\"let day of row.days\"\n (click)=\"selectDay(day)\"\n class=\"day-item\"\n [class.ousideRange]=\"day.isOutside\"\n [class.selected]=\"day.selected\"\n [class.disabledDay]=\"day.isDisabled\">\n {{day.lbl}}\n <zen-icon *ngIf=\"day.isHighlighted\"\n class=\"highlight-icon\"\n src=\"assets/ng-zenduit/icons/play.svg\"></zen-icon>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div *ngIf=\"showTime\"\n class=\"time-container\">\n\n <div class=\"time-lbl\">\n Select Time:\n </div>\n\n <div class=\"time-picker\">\n <div class=\"input-wrapper\">\n <zen-icon (click)=\"hourUp()\"\n src=\"assets/ng-zenduit/icons/arrow-up-small.svg\"></zen-icon>\n <input [(ngModel)]=\"hour\"\n (ngModelChange)=\"timeChanged()\" />\n <zen-icon (click)=\"hourDown()\"\n src=\"assets/ng-zenduit/icons/arrow-down-small.svg\"></zen-icon>\n </div>\n <label>:</label>\n <div class=\"input-wrapper\">\n <zen-icon (click)=\"minUp()\"\n src=\"assets/ng-zenduit/icons/arrow-up-small.svg\"></zen-icon>\n <input [(ngModel)]=\"min\"\n (ngModelChange)=\"timeChanged()\" />\n <zen-icon (click)=\"minDown()\"\n src=\"assets/ng-zenduit/icons/arrow-down-small.svg\"></zen-icon>\n </div>\n <div class=\"am-pm-picker\">\n <div class=\"main\"\n (click)=\"toggleTime()\">\n {{isPM ? 'PM' : 'AM'}}\n </div>\n <div class=\"sub\"\n (click)=\"toggleTime()\">\n {{isPM ? 'AM' : 'PM'}}\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"hint\"\n *ngIf=\"hint\">\n <div class=\"hint-description\">\n {{hint.description}}\n </div>\n <div class=\"hint-date\"\n (click)=\"selectHintDate(hint.date)\">\n {{hint.maskText}}\n </div>\n </div>\n\n <div class=\"footer\"\n *ngIf=\"!autoConfirm || showTime\">\n <button *ngIf=\"date\"\n (click)=\"clear()\"\n class=\"button-stroked\">\n Clear\n </button>\n <button *ngIf=\"!date\"\n (click)=\"cancel()\"\n class=\"button-stroked\">\n Cancel\n </button>\n <button [disabled]=\"!_dateToSet\"\n (click)=\"apply()\"\n class=\"button-flat\">\n Apply\n </button>\n </div>\n\n <ng-container *ngIf=\"monthPickerVisible\">\n <div class=\"month-picker\">\n <div class=\"days-toolbar\">\n <i (click)=\"prevYear()\"\n class=\"material-icons\">navigate_before</i>\n <span class=\"title\"\n (click)=\"showYearPicker()\">{{ currentSlot | date: 'yyyy' }}</span>\n <i (click)=\"nextYear()\"\n class=\"material-icons\">navigate_next</i>\n </div>\n <div class=\"months-container\">\n <div class=\"month-item\"\n *ngFor=\"let month of months; index as index\"\n (click)=\"selectMonth(index)\">\n {{ month }}\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"yearPickerVisible\">\n <div class=\"month-picker\">\n <div class=\"days-toolbar\">\n <i (click)=\"prevYearGroup()\"\n class=\"material-icons\">navigate_before</i>\n <span class=\"title\"\n (click)=\"showYearPicker()\">{{ currentSlot | date: 'yyyy' }}</span>\n <i (click)=\"nextYearGroup()\"\n class=\"material-icons\">navigate_next</i>\n </div>\n <div class=\"months-container\">\n <div class=\"month-item\"\n *ngFor=\"let year of years\"\n (click)=\"selectYear(year)\">\n {{ year }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"date-modal-extra-space\"></div>\n </div>\n </ng-template>\n</div>\n", styles: [".date-component{width:100%;position:relative}.date-component .date-toggle{display:flex;align-items:center;justify-content:space-between;position:relative;gap:9px;transition:.3s;width:100%;background:var(--color-white-primary, #ffffff);-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:1px solid var(--color-white-tint-4, #d6d6d8);padding:0 0 8px;font-size:14px;font-style:normal;font-weight:400;line-height:130%;color:var(--color-grey-primary, #4f4f4f)}.date-component .date-toggle.new-box-design{border:1px solid var(--color-white-tint-1, #f2f2f2);border-radius:2px;padding:6px 12px;gap:4px!important}.date-component .date-toggle:hover .date-placeholder{color:var(--color-grey-shade-2, #828282)}.date-component .date-toggle:hover .date-icon{background-color:var(--color-grey-shade-2, #828282)}.date-component .date-toggle:focus,.date-component .date-toggle.active{border-color:var(--color-blue-primary, #2188d9)}.date-component .date-toggle:focus .date-icon,.date-component .date-toggle.active .date-icon{background-color:var(--color-blue-primary, #2188d9)!important}.date-component .date-toggle[disabled]{cursor:not-allowed;border-color:var(--color-white-tint-3, #e0e0e0)}.date-component .date-toggle[disabled] .date-content{color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle[disabled] .date-icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle.readonly{cursor:default;border-color:var(--color-white-tint-3, #e0e0e0)}.date-component .date-toggle.readonly .date-content{color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle.readonly .date-icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle.error{border-color:var(--color-error-primary, #dc3e33)}.date-component .date-toggle.error .date-icon{background-color:var(--color-error-primary, #dc3e33)!important}.date-component .date-toggle.error .date-content.new-box-design{color:var(--color-error-primary, #dc3e33)!important}.date-component .date-content{flex:1;font-size:16px;text-align:left;height:18px;min-width:30px;color:var(--color-grey-primary, #4f4f4f);white-space:nowrap;transition:.3s}.date-component .date-content .date-placeholder{transition:.3s;color:var(--color-white-tint-6, #bebebe)}.date-component .date-content.new-box-design{color:var(--color-grey-shade-2, #828282)}.date-component .date-icon{width:24px;height:24px;background-color:var(--color-white-tint-6, #bebebe);transition:.3s}.date-component .date-icon.filled{background-color:var(--color-grey-shade-2, #828282)}.date-component .date-menu{position:absolute;visibility:hidden}.date-component .time-container{display:flex;padding:16px 24px;justify-content:space-between;border-bottom:1px solid #f2f2f2;align-items:center}.date-component .time-container .time-lbl{font-weight:500;font-size:14px;color:var(--color-grey-primary, #4f4f4f);white-space:nowrap}.date-component .time-container .time-picker{display:flex;align-items:center;gap:7px}.date-component .time-container .time-picker .input-wrapper{display:flex;flex-direction:column;align-items:center}.date-component .time-container .time-picker .input-wrapper zen-icon{background-color:var(--color-white-tint-4, #d6d6d8);width:16px;height:16px;cursor:pointer}.date-component .time-container .time-picker .input-wrapper input{width:30px;height:25px;text-align:center;border:1px solid var(--color-white-tint-1, #f2f2f2);font-weight:400;font-size:14px;color:var(--color-grey-primary, #4f4f4f);border-radius:2px}.date-component .time-container .time-picker .input-wrapper input:focus{outline:none;border-color:var(--color-blue-primary, #2188d9)}.date-component .time-container .time-picker .am-pm-picker{font-weight:400;font-size:14px;padding-top:18px;cursor:pointer}.date-component .time-container .time-picker .am-pm-picker .main{color:var(--color-grey-primary, #4f4f4f)}.date-component .time-container .time-picker .am-pm-picker .sub{color:var(--color-white-tint-4, #d6d6d8)}.date-component .hint{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:16px 24px;border-bottom:1px solid #ECECED;font-style:normal;font-weight:400;font-size:14px;line-height:130%;color:#4f4f4f}.date-component .hint .hint-date{cursor:pointer;text-decoration-line:underline}.date-component .footer{display:flex;justify-content:end;gap:16px;padding:16px 24px}.date-component .month-picker{position:absolute;inset:0;background:white}.date-component .month-picker .months-container{display:flex;flex-wrap:wrap;justify-content:space-between;padding:10px 20px}.date-component .month-picker .months-container .month-item{display:inline-flex;align-items:center;justify-content:center;height:50px;width:30%;cursor:pointer;color:var(--color-grey-shade-2, #828282);border-radius:4px}.date-component .month-picker .months-container .month-item:hover{color:#fff;background-color:var(--color-blue-primary, #2188d9)}.date-component .right{right:0}.date-component .bottom{bottom:42px}.date-menu{width:320px;background:transparent;z-index:1200}.date-menu .date-modal{border-radius:8px;width:320px;overflow-y:auto;white-space:initial;background:#ffffff;box-shadow:0 2px 4px -1px #00000008,0 4px 5px #0000003d,0 1px 10px #0000001a}.date-menu .date-modal-extra-space{height:10px;margin:0 0 -10px;background:transparent}.date-menu .days-toolbar{display:flex;align-items:center;justify-content:space-between;padding:16px 34px}.date-menu .days-toolbar .material-icons{color:#333;font-size:20px;cursor:pointer;-webkit-user-select:none;user-select:none}.date-menu .days-toolbar .title{font-size:14px;font-weight:500;color:var(--color-grey-primary, #4f4f4f);cursor:pointer}.date-menu .days-container{border-bottom:1px solid #f2f2f2;padding:0 24px}.date-menu .days-container .week-days{display:flex;align-items:center;justify-content:space-between;font-size:14px;color:var(--color-grey-primary, #4f4f4f);font-weight:500;margin-bottom:8px;cursor:default}.date-menu .days-container .week-days .week-day{width:39px;text-align:center}.date-menu .days-container .day-row{display:flex;align-items:center;justify-content:space-between;font-size:14px;font-weight:400;color:var(--color-grey-primary, #4f4f4f)}.date-menu .days-container .day-row .day-item{position:relative;width:39px;height:39px;display:flex;justify-content:center;align-items:center;cursor:pointer;border-radius:4px}.date-menu .days-container .day-row .day-item .highlight-icon{position:absolute;right:0;height:14px;width:14px;background-color:#5cbb3a}.date-menu .days-container .day-row .day-item:hover{background:var(--color-blue-tint-1, #f4f9fd);color:var(--color-blue-primary, #2188d9)}.date-menu .days-container .day-row .day-item.selected{background:var(--color-primary, #2188d9);color:#fff}.date-menu .days-container .day-row .day-item.selected .highlight-icon{background-color:#fff}.date-menu .days-container .day-row .day-item.ousideRange{color:#b8b9bc}.date-menu .days-container .day-row .day-item.disabledDay{color:#b8b9bc;cursor:not-allowed!important}.date-menu .footer{display:flex;justify-content:end;gap:16px;padding:16px 24px}::ng-deep .custom-backdrop{position:absolute;top:0;left:0;width:100vw;height:100vh}::ng-deep .cdk-overlay-connected-position-bounding-box{position:fixed;width:320px!important;height:343px!important}\n"] }]
493
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.Overlay }, { type: i0.ViewContainerRef }]; }, propDecorators: { date: [{
512
+ args: [{ selector: 'zen-datepicker', template: "<div class=\"date-component\">\n <!-- Material design datepicker toggle -->\n <ng-container *ngIf=\"!boxDesign\">\n <button class=\"date-toggle\"\n #triggerButton\n [disabled]=\"disabled || readonly\"\n (click)=\"togglePicker()\"\n [ngClass]=\"{'active': isPickerVisible,'error': highlightError,'readonly': readonly}\">\n <div class=\"date-content\">\n <!-- date placeholder -->\n <div class=\"date-placeholder\"\n *ngIf=\"!date\">\n {{\"Select Date\" | translate}}\n </div>\n\n <!-- Selected datetime -->\n <div *ngIf=\"date\">\n <span *ngIf=\"showDate\">{{formattedDate()}}</span>\n <span *ngIf=\"showTime\">&nbsp;{{formattedTime()}}</span>\n </div>\n </div>\n\n <!-- Datepicker icon, depends on picker type -->\n <zen-icon class=\"date-icon\"\n [src]=\"getIcon()\"\n [ngClass]=\"{'filled': date}\">\n </zen-icon>\n </button>\n </ng-container>\n\n <!-- Box design datepicker toggle -->\n <ng-container *ngIf=\"boxDesign\">\n <button class=\"date-toggle new-box-design\"\n #triggerButton\n [disabled]=\"disabled || readonly\"\n (click)=\"togglePicker()\"\n [ngClass]=\"{'active': isPickerVisible,'error': highlightError,'readonly': readonly}\">\n\n <!-- Datepicker icon, depends on picker type -->\n <zen-icon class=\"date-icon\"\n [src]=\"getIcon()\"\n [ngClass]=\"{'filled': date}\">\n </zen-icon>\n\n <div class=\"date-content new-box-design\">\n <!-- date placeholder -->\n <div class=\"date-placeholder\"\n *ngIf=\"!date\">\n {{\"Select Date\" | translate}}\n </div>\n\n <!-- Selected datetime -->\n <div *ngIf=\"date\">\n <span *ngIf=\"showDate\">{{formattedDate()}}</span>\n <span *ngIf=\"showTime\">&nbsp;{{formattedTime()}}</span>\n </div>\n </div>\n </button>\n </ng-container>\n\n <!-- Datepicker popup -->\n <ng-container *ngTemplateOutlet=\"dateMenuTemplate\">\n </ng-container>\n\n <ng-template #dateMenuTemplate>\n <div #dateMenu\n *ngIf=\"isPickerVisible\"\n class=\"date-menu\"\n [ngClass]=\"{ 'right': right, 'bottom': bottom }\">\n <div class=\"date-modal\">\n <ng-container *ngIf=\"showDate\">\n <div class=\"days-toolbar\">\n <i (click)=\"prevMonth()\"\n class=\"material-icons\">navigate_before</i>\n <span class=\"title\"\n (click)=\"showMonthPicker()\">{{daysTitle}}</span>\n <i (click)=\"nextMonth()\"\n class=\"material-icons\">navigate_next</i>\n </div>\n <div class=\"days-container\">\n <div class=\"week-days\">\n <div *ngFor=\"let weekDay of weekDays\"\n class=\"week-day\">\n {{weekDay}}\n </div>\n </div>\n <div *ngFor=\"let row of dayRows\"\n class=\"day-row\">\n <div *ngFor=\"let day of row.days\"\n (click)=\"selectDay(day)\"\n class=\"day-item\"\n [class.ousideRange]=\"day.isOutside\"\n [class.selected]=\"day.selected\"\n [class.disabledDay]=\"day.isDisabled\">\n {{day.lbl | translate}}\n <zen-icon *ngIf=\"day.isHighlighted\"\n class=\"highlight-icon\"\n src=\"assets/ng-zenduit/icons/play.svg\"></zen-icon>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div *ngIf=\"showTime\"\n class=\"time-container\">\n\n <div class=\"time-lbl\">\n {{\"Select Time\" | translate}}:\n </div>\n\n <div class=\"time-picker\">\n <div class=\"input-wrapper\">\n <zen-icon (click)=\"hourUp()\"\n src=\"assets/ng-zenduit/icons/arrow-up-small.svg\"></zen-icon>\n <input [(ngModel)]=\"hour\"\n (ngModelChange)=\"timeChanged()\" />\n <zen-icon (click)=\"hourDown()\"\n src=\"assets/ng-zenduit/icons/arrow-down-small.svg\"></zen-icon>\n </div>\n <label>:</label>\n <div class=\"input-wrapper\">\n <zen-icon (click)=\"minUp()\"\n src=\"assets/ng-zenduit/icons/arrow-up-small.svg\"></zen-icon>\n <input [(ngModel)]=\"min\"\n (ngModelChange)=\"timeChanged()\" />\n <zen-icon (click)=\"minDown()\"\n src=\"assets/ng-zenduit/icons/arrow-down-small.svg\"></zen-icon>\n </div>\n <div class=\"am-pm-picker\">\n <div class=\"main\"\n (click)=\"toggleTime()\">\n {{(isPM ? 'PM' : 'AM') | translate}}\n </div>\n <div class=\"sub\"\n (click)=\"toggleTime()\">\n {{(isPM ? 'AM' : 'PM') | translate}}\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"hint\"\n *ngIf=\"hint\">\n <div class=\"hint-description\">\n {{hint.description | translate}}\n </div>\n <div class=\"hint-date\"\n (click)=\"selectHintDate(hint.date)\">\n {{hint.maskText | translate}}\n </div>\n </div>\n\n <div class=\"footer\"\n *ngIf=\"!autoConfirm || showTime\">\n <button *ngIf=\"date\"\n (click)=\"clear()\"\n class=\"button-stroked\">\n {{\"Clear\" | translate}}\n </button>\n <button *ngIf=\"!date\"\n (click)=\"cancel()\"\n class=\"button-stroked\">\n {{\"Cancel\" | translate}}\n </button>\n <button [disabled]=\"!_dateToSet\"\n (click)=\"apply()\"\n class=\"button-flat\">\n {{\"Apply\" | translate}}\n </button>\n </div>\n\n <ng-container *ngIf=\"monthPickerVisible\">\n <div class=\"month-picker\">\n <div class=\"days-toolbar\">\n <i (click)=\"prevYear()\"\n class=\"material-icons\">navigate_before</i>\n <span class=\"title\"\n (click)=\"showYearPicker()\">{{ currentSlot | date: 'yyyy' }}</span>\n <i (click)=\"nextYear()\"\n class=\"material-icons\">navigate_next</i>\n </div>\n <div class=\"months-container\">\n <div class=\"month-item\"\n *ngFor=\"let month of months; index as index\"\n (click)=\"selectMonth(index)\">\n {{ month | translate }}\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"yearPickerVisible\">\n <div class=\"month-picker\">\n <div class=\"days-toolbar\">\n <i (click)=\"prevYearGroup()\"\n class=\"material-icons\">navigate_before</i>\n <span class=\"title\"\n (click)=\"showYearPicker()\">{{ currentSlot | date: 'yyyy' }}</span>\n <i (click)=\"nextYearGroup()\"\n class=\"material-icons\">navigate_next</i>\n </div>\n <div class=\"months-container\">\n <div class=\"month-item\"\n *ngFor=\"let year of years\"\n (click)=\"selectYear(year)\">\n {{ year }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"date-modal-extra-space\"></div>\n </div>\n </ng-template>\n</div>\n", styles: [".date-component{width:100%;position:relative}.date-component .date-toggle{display:flex;align-items:center;justify-content:space-between;position:relative;gap:9px;transition:.3s;width:100%;background:var(--color-white-primary, #ffffff);-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:1px solid var(--color-white-tint-4, #d6d6d8);padding:0 0 8px;font-size:14px;font-style:normal;font-weight:400;line-height:130%;color:var(--color-grey-primary, #4f4f4f)}.date-component .date-toggle.new-box-design{border:1px solid var(--color-white-tint-1, #f2f2f2);border-radius:2px;padding:6px 12px;gap:4px!important}.date-component .date-toggle:hover .date-placeholder{color:var(--color-grey-shade-2, #828282)}.date-component .date-toggle:hover .date-icon{background-color:var(--color-grey-shade-2, #828282)}.date-component .date-toggle:focus,.date-component .date-toggle.active{border-color:var(--color-blue-primary, #2188d9)}.date-component .date-toggle:focus .date-icon,.date-component .date-toggle.active .date-icon{background-color:var(--color-blue-primary, #2188d9)!important}.date-component .date-toggle[disabled]{cursor:not-allowed;border-color:var(--color-white-tint-3, #e0e0e0)}.date-component .date-toggle[disabled] .date-content{color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle[disabled] .date-icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle.readonly{cursor:default;border-color:var(--color-white-tint-3, #e0e0e0)}.date-component .date-toggle.readonly .date-content{color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle.readonly .date-icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.date-component .date-toggle.error{border-color:var(--color-error-primary, #dc3e33)}.date-component .date-toggle.error .date-icon{background-color:var(--color-error-primary, #dc3e33)!important}.date-component .date-toggle.error .date-content.new-box-design{color:var(--color-error-primary, #dc3e33)!important}.date-component .date-content{flex:1;font-size:16px;text-align:left;height:18px;min-width:30px;color:var(--color-grey-primary, #4f4f4f);white-space:nowrap;transition:.3s}.date-component .date-content .date-placeholder{transition:.3s;color:var(--color-white-tint-6, #bebebe)}.date-component .date-content.new-box-design{color:var(--color-grey-shade-2, #828282)}.date-component .date-icon{width:24px;height:24px;background-color:var(--color-white-tint-6, #bebebe);transition:.3s}.date-component .date-icon.filled{background-color:var(--color-grey-shade-2, #828282)}.date-component .date-menu{position:absolute;visibility:hidden}.date-component .time-container{display:flex;padding:16px 24px;justify-content:space-between;border-bottom:1px solid #f2f2f2;align-items:center}.date-component .time-container .time-lbl{font-weight:500;font-size:14px;color:var(--color-grey-primary, #4f4f4f);white-space:nowrap}.date-component .time-container .time-picker{display:flex;align-items:center;gap:7px}.date-component .time-container .time-picker .input-wrapper{display:flex;flex-direction:column;align-items:center}.date-component .time-container .time-picker .input-wrapper zen-icon{background-color:var(--color-white-tint-4, #d6d6d8);width:16px;height:16px;cursor:pointer}.date-component .time-container .time-picker .input-wrapper input{width:30px;height:25px;text-align:center;border:1px solid var(--color-white-tint-1, #f2f2f2);font-weight:400;font-size:14px;color:var(--color-grey-primary, #4f4f4f);border-radius:2px}.date-component .time-container .time-picker .input-wrapper input:focus{outline:none;border-color:var(--color-blue-primary, #2188d9)}.date-component .time-container .time-picker .am-pm-picker{font-weight:400;font-size:14px;padding-top:18px;cursor:pointer}.date-component .time-container .time-picker .am-pm-picker .main{color:var(--color-grey-primary, #4f4f4f)}.date-component .time-container .time-picker .am-pm-picker .sub{color:var(--color-white-tint-4, #d6d6d8)}.date-component .hint{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:16px 24px;border-bottom:1px solid #ECECED;font-style:normal;font-weight:400;font-size:14px;line-height:130%;color:#4f4f4f}.date-component .hint .hint-date{cursor:pointer;text-decoration-line:underline}.date-component .footer{display:flex;justify-content:end;gap:16px;padding:16px 24px}.date-component .month-picker{position:absolute;inset:0;background:white}.date-component .month-picker .months-container{display:flex;flex-wrap:wrap;justify-content:space-between;padding:10px 20px}.date-component .month-picker .months-container .month-item{display:inline-flex;align-items:center;justify-content:center;height:50px;width:30%;cursor:pointer;color:var(--color-grey-shade-2, #828282);border-radius:4px}.date-component .month-picker .months-container .month-item:hover{color:#fff;background-color:var(--color-blue-primary, #2188d9)}.date-component .right{right:0}.date-component .bottom{bottom:42px}.date-menu{width:320px;background:transparent;z-index:1200}.date-menu .date-modal{border-radius:8px;width:320px;overflow-y:auto;white-space:initial;background:#ffffff;box-shadow:0 2px 4px -1px #00000008,0 4px 5px #0000003d,0 1px 10px #0000001a}.date-menu .date-modal-extra-space{height:10px;margin:0 0 -10px;background:transparent}.date-menu .days-toolbar{display:flex;align-items:center;justify-content:space-between;padding:16px 34px}.date-menu .days-toolbar .material-icons{color:#333;font-size:20px;cursor:pointer;-webkit-user-select:none;user-select:none}.date-menu .days-toolbar .title{font-size:14px;font-weight:500;color:var(--color-grey-primary, #4f4f4f);cursor:pointer}.date-menu .days-container{border-bottom:1px solid #f2f2f2;padding:0 24px}.date-menu .days-container .week-days{display:flex;align-items:center;justify-content:space-between;font-size:14px;color:var(--color-grey-primary, #4f4f4f);font-weight:500;margin-bottom:8px;cursor:default}.date-menu .days-container .week-days .week-day{width:39px;text-align:center}.date-menu .days-container .day-row{display:flex;align-items:center;justify-content:space-between;font-size:14px;font-weight:400;color:var(--color-grey-primary, #4f4f4f)}.date-menu .days-container .day-row .day-item{position:relative;width:39px;height:39px;display:flex;justify-content:center;align-items:center;cursor:pointer;border-radius:4px}.date-menu .days-container .day-row .day-item .highlight-icon{position:absolute;right:0;height:14px;width:14px;background-color:#5cbb3a}.date-menu .days-container .day-row .day-item:hover{background:var(--color-blue-tint-1, #f4f9fd);color:var(--color-blue-primary, #2188d9)}.date-menu .days-container .day-row .day-item.selected{background:var(--color-primary, #2188d9);color:#fff}.date-menu .days-container .day-row .day-item.selected .highlight-icon{background-color:#fff}.date-menu .days-container .day-row .day-item.ousideRange{color:#b8b9bc}.date-menu .days-container .day-row .day-item.disabledDay{color:#b8b9bc;cursor:not-allowed!important}.date-menu .footer{display:flex;justify-content:end;gap:16px;padding:16px 24px}::ng-deep .custom-backdrop{position:absolute;top:0;left:0;width:100vw;height:100vh}::ng-deep .cdk-overlay-pane.custom-overlay{position:absolute}\n"] }]
513
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.Overlay }, { type: i0.ViewContainerRef }, { type: i2.TranslateService }]; }, propDecorators: { date: [{
494
514
  type: Input
495
515
  }], dateChange: [{
496
516
  type: Output
@@ -542,4 +562,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
542
562
  type: HostListener,
543
563
  args: ['window:scroll', []]
544
564
  }] } });
545
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy16ZW5kdWl0L3NyYy9saWIvZGF0ZXBpY2tlci96ZW5kdS1kYXRlcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9kYXRlcGlja2VyL3plbmR1LWRhdGVwaWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFDOUMsTUFBTSxFQUE4QixTQUFTLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBQzFHLE9BQU8sTUFBTSxNQUFNLGVBQWUsQ0FBQztBQUduQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7QUFFckQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBQzFCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQztBQUMzQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUM7QUFPNUIsTUFBTSxPQUFPLHdCQUF3QjtJQXdGbkMsWUFDVSxRQUFvQixFQUNwQixPQUFnQixFQUNoQixnQkFBa0M7UUFGbEMsYUFBUSxHQUFSLFFBQVEsQ0FBWTtRQUNwQixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFwRjVDOztXQUVHO1FBQ08sZUFBVSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFdkMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVqQixhQUFRLEdBQUcsSUFBSSxDQUFDO1FBRWhCLG9CQUFlLEdBQXVCLElBQUksQ0FBQztRQVEzQyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBRTNCLGtCQUFh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OzBHQUF4Qix3QkFBd0IsaThCQ2xCckMsODlSQXNOQTs0RkRwTWEsd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLGdCQUFnQjtzSkFTakIsSUFBSTtzQkFBWixLQUFLO2dCQUtJLFVBQVU7c0JBQW5CLE1BQU07Z0JBRUUsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFLRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVpQixRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVU7Z0JBRU8sYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlO2dCQUVLLGdCQUFnQjtzQkFBOUMsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBNkM3QixlQUFlO3NCQURkLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBYTVDLE1BQU07c0JBREwsWUFBWTt1QkFBQyxlQUFlLEVBQUUsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LFxuICAgICAgICBPbkNoYW5nZXMsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQvbW9tZW50JztcbmltcG9ydCB7IERhdGVQaWNrZXJEYXkgfSBmcm9tICcuL2RhdGUtcGlja2VyLWRheSc7XG5pbXBvcnQgeyBEYXRlUGlja2VySGludCB9IGZyb20gXCIuL2RhdGUtcGlja2VyLWhpbnRcIjtcbmltcG9ydCB7IERBVEVQSUNLRVJfUE9TSVRJT04gfSBmcm9tICcuL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgT3ZlcmxheVJlZiwgT3ZlcmxheSwgQ29ubmVjdGVkUG9zaXRpb24gfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuXG5jb25zdCBkZWZhdWx0SG91cnMgPSAnMTInO1xuY29uc3QgZGVmYXVsdE1pbnV0cyA9ICcwMCc7XG5jb25zdCBkZWZhdWx0U2Vjb25kcyA9ICcwMCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3plbi1kYXRlcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3plbmR1LWRhdGVwaWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi96ZW5kdS1kYXRlcGlja2VyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgWmVuZHVEYXRlcGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcblxuICAvKipcbiAgICogQ29tcG9uZW50IHByb3BlcnR5XG4gICAqL1xuICBASW5wdXQoKSBkYXRlOiBEYXRlO1xuXG4gIC8qKlxuICAgKiBjYWxsYmFjayB0byBlbWl0IGNoYW5nZXMgZm9yIHBhcmVudCBjb21wb25lbnRcbiAgICovXG4gIEBPdXRwdXQoKSBkYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPigpO1xuXG4gIEBJbnB1dCgpIHNob3dUaW1lID0gZmFsc2U7XG5cbiAgQElucHV0KCkgc2hvd0RhdGUgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIHBhcmVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKSBjb250YWluZXJDbGFzczogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIG1pbkRhdGU6IERhdGU7XG5cbiAgQElucHV0KCkgbWF4RGF0ZTogRGF0ZTtcblxuICBASW5wdXQoKSBib3hEZXNpZ246IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBoaWdobGlnaHREYXlzOiBudW1iZXJbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIGF1dG9Db25maXJtOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgaGludDogRGF0ZVBpY2tlckhpbnQ7XG5cbiAgLyoqXG4gICAqIGRhdGVwaWNrZXIgc3RhdGVzXG4gICAqL1xuICBASW5wdXQoKSBoaWdobGlnaHRFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSB4UG9zaXRpb246IERBVEVQSUNLRVJfUE9TSVRJT04gPSBEQVRFUElDS0VSX1BPU0lUSU9OLkFVVE87XG5cbiAgQElucHV0KCkgeVBvc2l0aW9uOiBEQVRFUElDS0VSX1BPU0lUSU9OID0gREFURVBJQ0tFUl9QT1NJVElPTi5BVVRPO1xuXG4gIEBJbnB1dCgpIGRpc3BhbHlPdmVyUGFyZW50OiBib29sZWFuID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgnZGF0ZU1lbnUnKSBkYXRlTWVudSE6IEVsZW1lbnRSZWY7XG5cbiAgQFZpZXdDaGlsZCgndHJpZ2dlckJ1dHRvbicpIHRyaWdnZXJCdXR0b24hOiBFbGVtZW50UmVmO1xuXG4gIEBWaWV3Q2hpbGQoJ2RhdGVNZW51VGVtcGxhdGUnKSBkYXRlTWVudVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBwcml2YXRlIG92ZXJsYXlSZWY6IE92ZXJsYXlSZWY7XG5cbiAgcHVibGljIHNlbGVjdGVkVGltZTogeyBIcjogbnVtYmVyLCBNaW46IG51bWJlciwgU2VjOiBudW1iZXIgfSA9IHsgSHI6IDEsIE1pbjogMCwgU2VjOiAwIH07XG5cbiAgcHVibGljIGlzUGlja2VyVmlzaWJsZSA9IGZhbHNlO1xuXG4gIHB1YmxpYyBkYXlSb3dzOiBBcnJheTx7IGRheXM6IERhdGVQaWNrZXJEYXlbXSB9PiA9IFtdO1xuXG4gIHB1YmxpYyBkYXlzVGl0bGUgPSBcIlwiO1xuXG4gIHB1YmxpYyB3ZWVrRGF5cyA9IFtcIk1vXCIsIFwiVHVcIiwgXCJXZVwiLCBcIlRoXCIsIFwiRnJpXCIsIFwiU2FcIiwgXCJTdVwiXTtcblxuICBwdWJsaWMgY3VycmVudFNsb3QgPSBuZXcgRGF0ZSgpO1xuXG4gIHB1YmxpYyBob3VyID0gZGVmYXVsdEhvdXJzO1xuXG4gIHB1YmxpYyBtaW4gPSBkZWZhdWx0TWludXRzO1xuXG4gIHB1YmxpYyBzZWMgPSBkZWZhdWx0U2Vjb25kcztcblxuICBwdWJsaWMgaXNQTSA9IGZhbHNlO1xuXG4gIHB1YmxpYyBfZGF0ZVRvU2V0OiBEYXRlO1xuXG4gIHB1YmxpYyBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbiAgcHVibGljIHllYXJzID0gW107XG5cbiAgcHVibGljIG1vbnRoUGlja2VyVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyB5ZWFyUGlja2VyVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHJpZ2h0OiBib29sZWFuID0gZmFsc2U7XG4gIGJvdHRvbTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LFxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZlxuICApIHsgfVxuXG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93Om1vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gIG91dHNpZGVIYW5kbGluZyhldmVudCkge1xuICAgIGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICAvLyBlbGVtZW50IG5vdCBpbiB0aGUgRE9NXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmhpZGVUaW1lUGlja2VyKClcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnLCBbXSlcbiAgc2Nyb2xsKCkge1xuICAgIHRoaXMudXBkYXRlUGxhY2VtZW50KCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGUpIHtcbiAgICAgIHRoaXMuX2RhdGVUb1NldCA9IG5ldyBEYXRlKHRoaXMuZGF0ZSk7XG5cbiAgICAgIHRoaXMuc2VsZWN0ZWRUaW1lID0ge1xuICAgICAgICBIcjogbW9tZW50KHRoaXMuZGF0ZSkuaG91cnMoKSxcbiAgICAgICAgTWluOiBtb21lbnQodGhpcy5kYXRlKS5taW51dGVzKCksXG4gICAgICAgIFNlYzogbW9tZW50KHRoaXMuZGF0ZSkuc2Vjb25kcygpXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVQbGFjZW1lbnQoKSB7XG4gICAgdGhpcy5yaWdodCA9IGZhbHNlO1xuICAgIHRoaXMuYm90dG9tID0gZmFsc2U7XG4gICAgaWYgKHRoaXMueFBvc2l0aW9uID09PSBEQVRFUElDS0VSX1BPU0lUSU9OLkFVVE8gJiYgdGhpcy5nZXRIb3Jpem9udGFsTWVudURpcmVjdGlvbigpID09PSBEQVRFUElDS0VSX1BPU0lUSU9OLkxFRlQpIHtcbiAgICAgIHRoaXMucmlnaHQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy55UG9zaXRpb24gPT09IERBVEVQSUNLRVJfUE9TSVRJT04uQVVUTyAmJiB0aGlzLmdldFZlcnRpY2FsTWVudURpcmVjdGlvbigpID09PSBEQVRFUElDS0VSX1BPU0lUSU9OLlRPUCkge1xuICAgICAgdGhpcy5ib3R0b20gPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy54UG9zaXRpb24gPT09IERBVEVQSUNLRVJfUE9TSVRJT04uUklHSFQpIHtcbiAgICAgIHRoaXMucmlnaHQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy55UG9zaXRpb24gPT09IERBVEVQSUNLRVJfUE9TSVRJT04uVE9QKSB7XG4gICAgICB0aGlzLmJvdHRvbSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRWZXJ0aWNhbE1lbnVEaXJlY3Rpb24oKTogREFURVBJQ0tFUl9QT1NJVElPTiB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCB0b3AgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICBjb25zdCBoZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgaWYgKHRvcCA+IChoZWlnaHQgLyAyKSkge1xuICAgICAgcmV0dXJuIERBVEVQSUNLRVJfUE9TSVRJT04uVE9QXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIERBVEVQSUNLRVJfUE9TSVRJT04uQk9UVE9NO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGdldCBkYXRlcGlja2VyIHBvc2l0aW9uXG4gICAqIEByZXR1cm5zIGVpdGhlciBcImxlZnRcIiBvciBcInJpZ2h0XCJcbiAgICovXG4gIHByaXZhdGUgZ2V0SG9yaXpvbnRhbE1lbnVEaXJlY3Rpb24oKTogREFURVBJQ0tFUl9QT1NJVElPTiB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBsZWZ0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgIGNvbnN0IHdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgaWYgKGxlZnQgPiAod2lkdGggLyAyKSkge1xuICAgICAgcmV0dXJuIERBVEVQSUNLRVJfUE9TSVRJT04uTEVGVDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gREFURVBJQ0tFUl9QT1NJVElPTi5SSUdIVDtcbiAgICB9XG4gIH1cblxuXG4gIHB1YmxpYyB0b2dnbGVQaWNrZXIoKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcblxuICAgIHRoaXMuX2RhdGVUb1NldCA9IHRoaXMuZGF0ZSA/IG5ldyBEYXRlKHRoaXMuZGF0ZSkgOiBudWxsO1xuXG4gICAgdGhpcy5pc1BpY2tlclZpc2libGUgPSAhdGhpcy5pc1BpY2tlclZpc2libGU7XG4gICAgaWYgKHRoaXMuc2hvd0RhdGUpIHtcbiAgICAgIHRoaXMuY3VycmVudFNsb3QgPSB0aGlzLl9kYXRlVG9TZXQgfHwgbmV3IERhdGUoKTtcbiAgICAgIHRoaXMudXBkYXRlRGF5cygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93VGltZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFRpbWUgPSB7XG4gICAgICAgIEhyOiBtb21lbnQodGhpcy5kYXRlKS5ob3VycygpLFxuICAgICAgICBNaW46IG1vbWVudCh0aGlzLmRhdGUpLm1pbnV0ZXMoKSxcbiAgICAgICAgU2VjOiBtb21lbnQodGhpcy5kYXRlKS5zZWNvbmRzKClcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLmRhdGUpIHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gbW9tZW50KHRoaXMuZGF0ZSkuZm9ybWF0KCdoaDptbSBBJyk7XG5cbiAgICAgICAgdGhpcy5pc1BNID0gZm9ybWF0dGVkLmluY2x1ZGVzKCdQTScpO1xuICAgICAgICB0aGlzLmhvdXIgPSBmb3JtYXR0ZWQuc2xpY2UoMCwgMik7XG4gICAgICAgIHRoaXMubWluID0gZm9ybWF0dGVkLnNsaWNlKDMsIDUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5pc1BpY2tlclZpc2libGUpIHtcbiAgICAgIGlmICh0aGlzLmRpc3BhbHlPdmVyUGFyZW50KSB7XG4gICAgICAgIHRoaXMuY3JlYXRlT3ZlcmxheSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVQbGFjZW1lbnQoKTtcbiAgICAgICAgdGhpcy5zeW5jTWVudVBvc2l0aW9uV2l0aERlbGF5KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVPdmVybGF5KCkge1xuICAgIGNvbnN0IHZlcnRpY2FsRGlyZWN0aW9uID0gdGhpcy5nZXRWZXJ0aWNhbE1lbnVEaXJlY3Rpb24oKTtcbiAgICBjb25zdCBob3Jpem9udGFsRGlyZWN0aW9uID0gdGhpcy5nZXRIb3Jpem9udGFsTWVudURpcmVjdGlvbigpO1xuXG4gICAgY29uc3QgcG9zaXRpb246IENvbm5lY3RlZFBvc2l0aW9uID0ge1xuICAgICAgb3JpZ2luWDogaG9yaXpvbnRhbERpcmVjdGlvbiA9PT0gREFURVBJQ0tFUl9QT1NJVElPTi5SSUdIVCA/ICdzdGFydCcgOiAnZW5kJyxcbiAgICAgIG9yaWdpblk6IHZlcnRpY2FsRGlyZWN0aW9uID09PSBEQVRFUElDS0VSX1BPU0lUSU9OLkJPVFRPTSA/ICdib3R0b20nIDogJ3RvcCcsXG4gICAgICBvdmVybGF5WDogaG9yaXpvbnRhbERpcmVjdGlvbiA9PT0gREFURVBJQ0tFUl9QT1NJVElPTi5SSUdIVCA/ICdzdGFydCcgOiAnZW5kJyxcbiAgICAgIG92ZXJsYXlZOiB2ZXJ0aWNhbERpcmVjdGlvbiA9PT0gREFURVBJQ0tFUl9QT1NJVElPTi5CT1RUT00gPyAndG9wJyA6ICdib3R0b20nXG4gICAgfTtcbiAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5LnBvc2l0aW9uKClcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMudHJpZ2dlckJ1dHRvbilcbiAgICAgIC53aXRoUG9zaXRpb25zKFtcbiAgICAgICAgcG9zaXRpb25cbiAgICAgIF0pXG4gICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5LFxuICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICBiYWNrZHJvcENsYXNzOiAnY3VzdG9tLWJhY2tkcm9wJyxcbiAgICAgIHBhbmVsQ2xhc3M6ICdjdXN0b20tb3ZlcmxheScsXG4gICAgfSk7XG5cbiAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLmRhdGVNZW51VGVtcGxhdGUsIHRoaXMudmlld0NvbnRhaW5lclJlZikpO1xuXG4gICAgdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5vdmVybGF5UmVmLmRldGFjaCgpO1xuICAgICAgdGhpcy5pc1BpY2tlclZpc2libGUgPSBmYWxzZTtcbiAgICB9KTtcblxuICB9XG5cbiAgLy8gTWV0aG9kIHRvIGNsb3NlIHRoZSBvdmVybGF5XG4gIHB1YmxpYyBjbG9zZVBpY2tlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vdmVybGF5UmVmKSB7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgfVxuICAgIHRoaXMuaXNQaWNrZXJWaXNpYmxlID0gZmFsc2U7XG4gIH1cblxuICAvLyBDbGVhbnVwIG92ZXJsYXkgb24gY29tcG9uZW50IGRlc3RydWN0aW9uXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5kaXNwb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93RGF0ZVBpY2tlcigpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRhdGVNZW51KSB7XG4gICAgICAgIHRoaXMuZGF0ZU1lbnUubmF0aXZlRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgfVxuICAgIH0sIDApXG4gIH1cblxuICBwcml2YXRlIHN5bmNNZW51UG9zaXRpb25XaXRoRGVsYXkoKSB7XG4gICAgaWYgKCF0aGlzLnBhcmVudENvbnRhaW5lcikge1xuICAgICAgdGhpcy5zaG93RGF0ZVBpY2tlcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudFJlY3QgPSB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBwYXJlbnRSZWN0ID0gdGhpcy5wYXJlbnRDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgdG9wIGRpZmZlcmVuY2UgYmV0d2VlbiBlbGVtZW50IGFuZCBwYXJlbnQgKGlmIGF2YWlsYWJsZSlcbiAgICAgIGNvbnN0IHRvcCA9IHRoaXMuY2FsY3VsYXRlVG9wUG9zaXRpb24oZWxlbWVudFJlY3QsIHBhcmVudFJlY3QpO1xuXG4gICAgICBjb25zdCBkYXRlTWVudVJlY3QgPSB0aGlzLmRhdGVNZW51Py5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMuYm90dG9tID0gZGF0ZU1lbnVSZWN0Py5oZWlnaHQgPCB0b3A7XG4gICAgICB0aGlzLnNob3dEYXRlUGlja2VyKCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZVRvcFBvc2l0aW9uKGVsZW1lbnRSZWN0OiBET01SZWN0LCBwYXJlbnRSZWN0OiBET01SZWN0KTogbnVtYmVyIHtcbiAgICBsZXQgdG9wOiBudW1iZXI7XG4gICAgaWYgKGVsZW1lbnRSZWN0LnRvcCA8IHBhcmVudFJlY3QudG9wKSB7XG4gICAgICB0b3AgPSBwYXJlbnRSZWN0LnRvcCAtIGVsZW1lbnRSZWN0LnRvcDsgLy8gUmV2ZXJzZSBvcmRlciBpZiBjb25kaXRpb24gaXMgbWV0XG4gICAgfSBlbHNlIHtcbiAgICAgIHRvcCA9IGVsZW1lbnRSZWN0LnRvcCAtIHBhcmVudFJlY3QudG9wOyAvLyBOb3JtYWwgY2FsY3VsYXRpb25cbiAgICB9XG4gICAgcmV0dXJuIHRvcDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGF5cygpIHtcbiAgICBpZiAoIXRoaXMuY3VycmVudFNsb3QpIHtcbiAgICAgIHRoaXMuY3VycmVudFNsb3QgPSBuZXcgRGF0ZSgpO1xuICAgIH1cbiAgICB0aGlzLmRheXNUaXRsZSA9IG1vbWVudCh0aGlzLmN1cnJlbnRTbG90KS5mb3JtYXQoXCJNTU0geXl5eVwiKTtcbiAgICB0aGlzLmRheVJvd3MgPSBbXTtcbiAgICBsZXQgY3VycmVudCA9IG1vbWVudCh0aGlzLmN1cnJlbnRTbG90KS5zdGFydE9mKFwibW9udGhcIikuc3RhcnRPZihcIndlZWtcIikuYWRkKDEsIFwiZGF5XCIpO1xuICAgIGxldCBlbmQgPSBtb21lbnQodGhpcy5jdXJyZW50U2xvdCkuZW5kT2YoXCJtb250aFwiKS5lbmRPZihcIndlZWtcIikuYWRkKDEsIFwiZGF5XCIpO1xuXG4gICAgY29uc3QgY3VycmVudE1vbnRoID0gbW9tZW50KHRoaXMuY3VycmVudFNsb3QpLm1vbnRoKCk7XG5cbiAgICBjb25zdCBkYXRlID0gbW9tZW50KHRoaXMuX2RhdGVUb1NldCk7XG5cbiAgICB3aGlsZSAoY3VycmVudCA8PSBlbmQpIHtcbiAgICAgIGNvbnN0IHJvdyA9IHsgZGF5czogW10gYXMgRGF0ZVBpY2tlckRheVtdIH07XG4gICAgICB0aGlzLmRheVJvd3MucHVzaChyb3cpO1xuICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgNzsgaWR4KyspIHtcblxuICAgICAgICBsZXQgaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgIGlzU2VsZWN0ZWQgPSBjdXJyZW50LmRhdGUoKSA9PSBkYXRlLmRhdGUoKSAmJlxuICAgICAgICAgICAgZGF0ZS5tb250aCgpID09IGN1cnJlbnQubW9udGgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpc091dHNpZGUgPSBjdXJyZW50TW9udGggIT0gY3VycmVudC5tb250aCgpO1xuXG4gICAgICAgIGxldCBpc0Rpc2FibGVkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMubWluRGF0ZSAmJiBjdXJyZW50LnRvRGF0ZSgpIDwgdGhpcy5taW5EYXRlKSB7XG4gICAgICAgICAgaXNEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXhEYXRlICYmIGN1cnJlbnQudG9EYXRlKCkgPiB0aGlzLm1heERhdGUpIHtcbiAgICAgICAgICBpc0Rpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpc0hpZ2hsaWdodGVkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0RGF5cyAmJiB0aGlzLmhpZ2hsaWdodERheXMubGVuZ3RoKSB7XG4gICAgICAgICAgaXNIaWdobGlnaHRlZCA9IHRoaXMuaGlnaGxpZ2h0RGF5cy5pbmRleE9mKGN1cnJlbnQudmFsdWVPZigpKSA+PSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcm93LmRheXMucHVzaCh7XG4gICAgICAgICAgZGF0ZTogY3VycmVudC50b0RhdGUoKSxcbiAgICAgICAgICBsYmw6IG1vbWVudChjdXJyZW50KS5kYXRlKCkudG9TdHJpbmcoKSxcbiAgICAgICAgICBpc091dHNpZGU6IGlzT3V0c2lkZSxcbiAgICAgICAgICBzZWxlY3RlZDogaXNTZWxlY3RlZCxcbiAgICAgICAgICBpc0Rpc2FibGVkOiBpc0Rpc2FibGVkLFxuICAgICAgICAgIGlzSGlnaGxpZ2h0ZWQ6IGlzSGlnaGxpZ2h0ZWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY3VycmVudCA9IG1vbWVudChjdXJyZW50KS5hZGQoMSwgXCJkYXlcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5leHRNb250aCgpIHtcbiAgICB0aGlzLmN1cnJlbnRTbG90ID0gbW9tZW50KHRoaXMuY3VycmVudFNsb3QpLmFkZCgxLCBcIm1vbnRoXCIpLnRvRGF0ZSgpO1xuICAgIHRoaXMudXBkYXRlRGF5cygpO1xuICB9XG5cbiAgcHVibGljIHByZXZNb250aCgpIHtcbiAgICB0aGlzLmN1cnJlbnRTbG90ID0gbW9tZW50KHRoaXMuY3VycmVudFNsb3QpLnN1YnRyYWN0KDEsIFwibW9udGhcIikudG9EYXRlKCk7XG4gICAgdGhpcy51cGRhdGVEYXlzKCk7XG4gIH1cblxuICBwdWJsaWMgbmV4dFllYXIoKSB7XG4gICAgdGhpcy5jdXJyZW50U2xvdCA9IG1vbWVudCh0aGlzLmN1cnJlbnRTbG90KS5hZGQoMSwgXCJ5ZWFyXCIpLnRvRGF0ZSgpO1xuICAgIHRoaXMudXBkYXRlRGF5cygpO1xuICB9XG5cbiAgcHVibGljIHByZXZZZWFyKCkge1xuICAgIHRoaXMuY3VycmVudFNsb3QgPSBtb21lbnQodGhpcy5jdXJyZW50U2xvdCkuc3VidHJhY3QoMSwgXCJ5ZWFyXCIpLnRvRGF0ZSgpO1xuICAgIHRoaXMudXBkYXRlRGF5cygpO1xuICB9XG5cbiAgcHVibGljIG5leHRZZWFyR3JvdXAoKSB7XG4gICAgdGhpcy55ZWFycyA9IHRoaXMueWVhcnMubWFwKHllYXIgPT4geWVhciArIDE1KTtcbiAgfVxuXG4gIHB1YmxpYyBwcmV2WWVhckdyb3VwKCkge1xuICAgIHRoaXMueWVhcnMgPSB0aGlzLnllYXJzLm1hcCh5ZWFyID0+IHllYXIgLSAxNSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0RGF5KGRheTogRGF0ZVBpY2tlckRheSkge1xuICAgIGlmIChkYXkuaXNEaXNhYmxlZCkge1xuICAgICAgLy8gZGF5IGlzIGRpc2FibGVkXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvd1RpbWUpIHtcbiAgICAgIHRoaXMuX2RhdGVUb1NldCA9IG1vbWVudChkYXkuZGF0ZSkuaG91cih0aGlzLnNlbGVjdGVkVGltZS5IcikubWludXRlKHRoaXMuc2VsZWN0ZWRUaW1lLk1pbikuc2Vjb25kKHRoaXMuc2VsZWN0ZWRUaW1lLlNlYykudG9EYXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2RhdGVUb1NldCA9IG5ldyBEYXRlKGRheS5kYXRlKTtcblxuICAgICAgaWYgKHRoaXMuYXV0b0NvbmZpcm0pIHtcbiAgICAgICAgdGhpcy5hcHBseSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlRGF5cygpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdE1vbnRoKG1vbnRoOiBudW1iZXIpIHtcbiAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodGhpcy5jdXJyZW50U2xvdCk7XG4gICAgbmV3RGF0ZS5zZXRNb250aChtb250aCk7XG4gICAgdGhpcy5jdXJyZW50U2xvdCA9IG5ld0RhdGU7XG4gICAgdGhpcy51cGRhdGVEYXlzKCk7XG4gICAgdGhpcy5tb250aFBpY2tlclZpc2libGUgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RZZWFyKHllYXI6IG51bWJlcikge1xuICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh0aGlzLmN1cnJlbnRTbG90KTtcbiAgICBuZXdEYXRlLnNldEZ1bGxZZWFyKHllYXIpO1xuICAgIHRoaXMuY3VycmVudFNsb3QgPSBuZXdEYXRlO1xuICAgIHRoaXMudXBkYXRlRGF5cygpO1xuICAgIHRoaXMueWVhclBpY2tlclZpc2libGUgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBoaWRlVGltZVBpY2tlcigpIHtcbiAgICBpZiAoIXRoaXMuZGlzcGFseU92ZXJQYXJlbnQpIHtcbiAgICAgIHRoaXMuaXNQaWNrZXJWaXNpYmxlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cblxuICBwdWJsaWMgdGltZUNoYW5nZWQoKSB7XG4gICAgbGV0IG1pbiA9IHBhcnNlSW50KHRoaXMubWluKTtcbiAgICBsZXQgaG91ciA9IHBhcnNlSW50KHRoaXMuaG91cik7XG4gICAgLy8gUmVwbGFjZSAnMCcgd2l0aCBgdGhpcy5zZWNgLlxuICAgIC8vIEFzIG9mIG5vdyB3ZSBkbyBub3QgaGF2ZSBhcHBsaWNhdGlvbiBvZiBtYWtpbmcgdGhlIHVzZXIgc2VsZWN0IHNlY29uZHMgc28gd2Ugc2V0IGl0IHRvIDAuXG4gICAgbGV0IHNlYyA9IHBhcnNlSW50KCcwJyk7XG4gICAgaWYgKGlzTmFOKGhvdXIpIHx8IGlzTmFOKG1pbikgfHwgaXNOYU4oc2VjKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGhvdXIgPSBNYXRoLm1pbihob3VyLCAxMik7XG4gICAgaG91ciA9IE1hdGgubWF4KGhvdXIsIDEpO1xuXG4gICAgbWluID0gTWF0aC5taW4obWluLCA1OSk7XG4gICAgbWluID0gTWF0aC5tYXgobWluLCAwKTtcblxuICAgIHNlYyA9IE1hdGgubWluKHNlYywgNTkpO1xuICAgIHNlYyA9IE1hdGgubWF4KHNlYywgMCk7XG5cbiAgICBjb25zdCB0aW1lID0gbW9tZW50KGAke2hvdXJ9ICR7bWlufSAke3RoaXMuaXNQTSA/IFwicG1cIiA6IFwiYW1cIn1gLCBcImg6bSBhXCIpO1xuXG4gICAgdGhpcy5zZWxlY3RlZFRpbWUgPSB7XG4gICAgICBIcjogdGltZS5ob3VycygpLFxuICAgICAgTWluOiB0aW1lLm1pbnV0ZXMoKSxcbiAgICAgIFNlYzogdGltZS5zZWNvbmRzKClcbiAgICB9O1xuXG4gICAgLy8gYWRkZWQgYmVsb3cgY29uZGl0aW9uIGJlY2F1c2Ugd2UgY2FuIHNlbGVjdCB0aGUgdGltZSB3aXRob3V0IGRhdGUsIGFuZCBpdCB3YXMgc2hvd2luZyBpbnZhbGlkIGRhdGUgaW4gdGhlIGlucHV0IGJveFxuICAgIC8vIHNlY29uZCBjb25kaXRpb24gaXMgcmVxdWlyZWQgdG8gZGlzYWJsZSBhcHBseSBidXR0b24gd2hlbiBkYXRlIGlzIG5vdCBzZWxlY3RlZFxuICAgIGlmICh0aGlzLl9kYXRlVG9TZXQpIHtcbiAgICAgIHRoaXMuX2RhdGVUb1NldCA9IG1vbWVudCh0aGlzLl9kYXRlVG9TZXQpLmhvdXIodGhpcy5zZWxlY3RlZFRpbWUuSHIpLm1pbnV0ZSh0aGlzLnNlbGVjdGVkVGltZS5NaW4pLnNlY29uZCh0aGlzLnNlbGVjdGVkVGltZS5TZWMpLnRvRGF0ZSgpO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuc2hvd0RhdGUpIHtcbiAgICAgIHRoaXMuX2RhdGVUb1NldCA9IG1vbWVudCgpLmhvdXIodGhpcy5zZWxlY3RlZFRpbWUuSHIpLm1pbnV0ZSh0aGlzLnNlbGVjdGVkVGltZS5NaW4pLnNlY29uZCh0aGlzLnNlbGVjdGVkVGltZS5TZWMpLnRvRGF0ZSgpO1xuICAgIH1cblxuICAgIC8vIGZvcm1hdFxuICAgIGlmIChob3VyIDwgMTApIHtcbiAgICAgIHRoaXMuaG91ciA9IGAwJHtob3VyfWA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5ob3VyID0gYCR7aG91cn1gO1xuICAgIH1cblxuICAgIGlmIChtaW4gPCAxMCkge1xuICAgICAgdGhpcy5taW4gPSBgMCR7bWlufWA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5taW4gPSBgJHttaW59YDtcbiAgICB9XG5cbiAgfVxuXG4gIHB1YmxpYyBmb3JtYXR0ZWREYXRlKCkge1xuICAgIGlmICghdGhpcy5kYXRlKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ib3hEZXNpZ24gJiYgbW9tZW50KHRoaXMuZGF0ZSkuaXNTYW1lKG1vbWVudCgpLCBcImRheVwiKSkge1xuICAgICAgcmV0dXJuICdUb2RheSc7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvd0RhdGUgJiYgIXRoaXMuc2hvd1RpbWUgJiYgIXRoaXMuYm94RGVzaWduKSB7XG4gICAgICAvLyBFeHBhbmRlZCBmb3JtYXR0aW5nIGZvciBkYXRlIG9ubHkgcGlja2VyXG4gICAgICByZXR1cm4gbW9tZW50KHRoaXMuZGF0ZSkuZm9ybWF0KFwiZGRkLCBERCBNTU0gWVlZWVwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW9tZW50KHRoaXMuZGF0ZSkuZm9ybWF0KFwiTU1NIERELCBZWVwiKTtcbiAgfVxuXG4gIHB1YmxpYyBmb3JtYXR0ZWRUaW1lKCkge1xuICAgIGlmICghdGhpcy5kYXRlKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIG1vbWVudCh0aGlzLmRhdGUpLmZvcm1hdChcImg6bW0gQVwiKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVUaW1lKCkge1xuICAgIHRoaXMuaXNQTSA9ICF0aGlzLmlzUE07XG4gICAgdGhpcy50aW1lQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHVibGljIHNob3dNb250aFBpY2tlcigpIHtcbiAgICB0aGlzLm1vbnRoUGlja2VyVmlzaWJsZSA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgc2hvd1llYXJQaWNrZXIoKSB7XG4gICAgdGhpcy55ZWFyUGlja2VyVmlzaWJsZSA9IHRydWU7XG4gICAgdGhpcy55ZWFycyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLmN1cnJlbnRTbG90LmdldEZ1bGxZZWFyKCkgLSA3OyBpIDwgdGhpcy5jdXJyZW50U2xvdC5nZXRGdWxsWWVhcigpICsgODsgaSsrKSB7XG4gICAgICB0aGlzLnllYXJzLnB1c2goaSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhvdXJVcCgpIHtcbiAgICBsZXQgaG91ciA9IHBhcnNlSW50KHRoaXMuaG91cik7XG4gICAgaWYgKGlzTmFOKGhvdXIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGhvdXIrKztcbiAgICB0aGlzLmhvdXIgPSBob3VyLnRvU3RyaW5nKCk7XG4gICAgdGhpcy50aW1lQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHVibGljIGhvdXJEb3duKCkge1xuICAgIGxldCBob3VyID0gcGFyc2VJbnQodGhpcy5ob3VyKTtcbiAgICBpZiAoaXNOYU4oaG91cikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaG91ci0tO1xuICAgIHRoaXMuaG91ciA9IGhvdXIudG9TdHJpbmcoKTtcbiAgICB0aGlzLnRpbWVDaGFuZ2VkKCk7XG4gIH1cblxuICBwdWJsaWMgbWluVXAoKSB7XG4gICAgbGV0IG1pbiA9IHBhcnNlSW50KHRoaXMubWluKTtcbiAgICBpZiAoaXNOYU4obWluKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBtaW4rKztcbiAgICB0aGlzLm1pbiA9IG1pbi50b1N0cmluZygpO1xuICAgIHRoaXMudGltZUNoYW5nZWQoKTtcbiAgfVxuXG4gIHB1YmxpYyBtaW5Eb3duKCkge1xuICAgIGxldCBtaW4gPSBwYXJzZUludCh0aGlzLm1pbik7XG4gICAgaWYgKGlzTmFOKG1pbikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbWluLS07XG4gICAgdGhpcy5taW4gPSBtaW4udG9TdHJpbmcoKTtcbiAgICB0aGlzLnRpbWVDaGFuZ2VkKCk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHkoKSB7XG4gICAgaWYgKHRoaXMuX2RhdGVUb1NldCkge1xuICAgICAgLy8gSWYgdGltZSBzZWxlY3Rpb24gaGFzIGVuYWJsZWQgYW5kIHVzZXIga2VlcHMgZGVmYXVsdCB0aW1lIHRoZW4gdHJpZ2dlcmluZyB0aGUgdGltZUNoYW5nZWQgZnVuY3Rpb25cbiAgICAgIGlmICh0aGlzLnNob3dUaW1lICYmIHRoaXMuaG91ciA9PT0gZGVmYXVsdEhvdXJzICYmIHRoaXMubWluID09PSBkZWZhdWx0TWludXRzICYmIHRoaXMuc2VjID09PSBkZWZhdWx0U2Vjb25kcykge1xuICAgICAgICB0aGlzLnRpbWVDaGFuZ2VkKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGF0ZSA9IG5ldyBEYXRlKHRoaXMuX2RhdGVUb1NldCk7XG4gICAgfVxuICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KHRoaXMuZGF0ZSk7XG4gICAgdGhpcy5kaXNwYWx5T3ZlclBhcmVudCA/IHRoaXMuY2xvc2VQaWNrZXIoKSA6IHRoaXMuaGlkZVRpbWVQaWNrZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBjYW5jZWwoKSB7XG4gICAgdGhpcy5kaXNwYWx5T3ZlclBhcmVudCA/IHRoaXMuY2xvc2VQaWNrZXIoKSA6IHRoaXMuaGlkZVRpbWVQaWNrZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICB0aGlzLl9kYXRlVG9TZXQgPSBudWxsO1xuICAgIHRoaXMuaG91ciA9IGRlZmF1bHRIb3VycztcbiAgICB0aGlzLm1pbiA9IGRlZmF1bHRNaW51dHM7XG4gICAgdGhpcy5kYXRlID0gbnVsbDtcbiAgICB0aGlzLmFwcGx5KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SWNvbigpIHtcbiAgICAvLyBDaGFuZ2UgcGlja2VyIGljb24gYmFzZWQgb24gbW9kZVxuICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgY2FzZSB0aGlzLnNob3dEYXRlICYmIHRoaXMuc2hvd1RpbWU6XG4gICAgICAgIC8vIERhdGUgKyBUaW1lXG4gICAgICAgIHJldHVybiAnYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvZGF0ZS5zdmcnO1xuICAgICAgY2FzZSB0aGlzLnNob3dEYXRlICYmICF0aGlzLnNob3dUaW1lOlxuICAgICAgICAvLyBEYXRlIG9ubHlcbiAgICAgICAgcmV0dXJuICdhc3NldHMvbmctemVuZHVpdC9pY29ucy9jYWxlbmRhci5zdmcnO1xuICAgICAgY2FzZSAhdGhpcy5zaG93RGF0ZSAmJiB0aGlzLnNob3dUaW1lOlxuICAgICAgICAvLyBUaW1lIG9ubHlcbiAgICAgICAgcmV0dXJuICdhc3NldHMvbmctemVuZHVpdC9pY29ucy90aW1lLnN2Zyc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2Fzc2V0cy9uZy16ZW5kdWl0L2ljb25zL2RhdGUuc3ZnJztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0SGludERhdGUoZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBoaW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0ZVRvU2V0ID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgdGhpcy5zZWxlY3RlZFRpbWUgPSB7XG4gICAgICBIcjogbW9tZW50KGRhdGUpLmhvdXJzKCksXG4gICAgICBNaW46IG1vbWVudChkYXRlKS5taW51dGVzKCksXG4gICAgICBTZWM6IG1vbWVudChkYXRlKS5zZWNvbmRzKClcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuYXV0b0NvbmZpcm0pIHtcbiAgICAgIHRoaXMuYXBwbHkoKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZURheXMoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImRhdGUtY29tcG9uZW50XCI+XG4gICAgPCEtLSBNYXRlcmlhbCBkZXNpZ24gZGF0ZXBpY2tlciB0b2dnbGUgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFib3hEZXNpZ25cIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRhdGUtdG9nZ2xlXCJcbiAgICAgICAgICAgICAgICAjdHJpZ2dlckJ1dHRvblxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCByZWFkb25seVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVBpY2tlcigpXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IGlzUGlja2VyVmlzaWJsZSwnZXJyb3InOiBoaWdobGlnaHRFcnJvciwncmVhZG9ubHknOiByZWFkb25seX1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8IS0tIGRhdGUgcGxhY2Vob2xkZXIgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhZGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICBTZWxlY3QgRGF0ZVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBTZWxlY3RlZCBkYXRldGltZSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dEYXRlXCI+e3tmb3JtYXR0ZWREYXRlKCl9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93VGltZVwiPiZuYnNwO3t7Zm9ybWF0dGVkVGltZSgpfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBEYXRlcGlja2VyIGljb24sIGRlcGVuZHMgb24gcGlja2VyIHR5cGUgLS0+XG4gICAgICAgICAgICA8emVuLWljb24gY2xhc3M9XCJkYXRlLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiZ2V0SWNvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ZpbGxlZCc6IGRhdGV9XCI+XG4gICAgICAgICAgICA8L3plbi1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gQm94IGRlc2lnbiBkYXRlcGlja2VyIHRvZ2dsZSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYm94RGVzaWduXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJkYXRlLXRvZ2dsZSBuZXctYm94LWRlc2lnblwiXG4gICAgICAgICAgICAgICAgI3RyaWdnZXJCdXR0b25cbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgcmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVQaWNrZXIoKVwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBpc1BpY2tlclZpc2libGUsJ2Vycm9yJzogaGlnaGxpZ2h0RXJyb3IsJ3JlYWRvbmx5JzogcmVhZG9ubHl9XCI+XG5cbiAgICAgICAgICAgIDwhLS0gRGF0ZXBpY2tlciBpY29uLCBkZXBlbmRzIG9uIHBpY2tlciB0eXBlIC0tPlxuICAgICAgICAgICAgPHplbi1pY29uIGNsYXNzPVwiZGF0ZS1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImdldEljb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydmaWxsZWQnOiBkYXRlfVwiPlxuICAgICAgICAgICAgPC96ZW4taWNvbj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtY29udGVudCBuZXctYm94LWRlc2lnblwiPlxuICAgICAgICAgICAgICAgIDwhLS0gZGF0ZSBwbGFjZWhvbGRlciAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFkYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIFNlbGVjdCBEYXRlXG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIFNlbGVjdGVkIGRhdGV0aW1lIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJkYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd0RhdGVcIj57e2Zvcm1hdHRlZERhdGUoKX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dUaW1lXCI+Jm5ic3A7e3tmb3JtYXR0ZWRUaW1lKCl9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRGF0ZXBpY2tlciBwb3B1cCAtLT5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRhdGVNZW51VGVtcGxhdGVcIj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2RhdGVNZW51VGVtcGxhdGU+XG4gICAgPGRpdiAjZGF0ZU1lbnUgKm5nSWY9XCJpc1BpY2tlclZpc2libGVcIlxuICAgICAgICAgY2xhc3M9XCJkYXRlLW1lbnVcIlxuICAgICAgICAgW25nQ2xhc3NdPVwieyAncmlnaHQnOiByaWdodCwgJ2JvdHRvbSc6IGJvdHRvbSB9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLW1vZGFsXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0RhdGVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF5cy10b29sYmFyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIChjbGljayk9XCJwcmV2TW9udGgoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIj5uYXZpZ2F0ZV9iZWZvcmU8L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd01vbnRoUGlja2VyKClcIj57e2RheXNUaXRsZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8aSAoY2xpY2spPVwibmV4dE1vbnRoKClcIlxuICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+bmF2aWdhdGVfbmV4dDwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF5cy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndlZWstZGF5c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgd2Vla0RheSBvZiB3ZWVrRGF5c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwid2Vlay1kYXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3dlZWtEYXl9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgZGF5Um93c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkYXktcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBkYXkgb2Ygcm93LmRheXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF5KGRheSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRheS1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm91c2lkZVJhbmdlXT1cImRheS5pc091dHNpZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiZGF5LnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkRGF5XT1cImRheS5pc0Rpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkYXkubGJsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWljb24gKm5nSWY9XCJkYXkuaXNIaWdobGlnaHRlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaGlnaGxpZ2h0LWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvbmctemVuZHVpdC9pY29ucy9wbGF5LnN2Z1wiPjwvemVuLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dUaW1lXCJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWNvbnRhaW5lclwiPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtbGJsXCI+XG4gICAgICAgICAgICAgICAgICAgIFNlbGVjdCBUaW1lOlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtcGlja2VyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8emVuLWljb24gKGNsaWNrKT1cImhvdXJVcCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvbmctemVuZHVpdC9pY29ucy9hcnJvdy11cC1zbWFsbC5zdmdcIj48L3plbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwiaG91clwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidGltZUNoYW5nZWQoKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8emVuLWljb24gKGNsaWNrKT1cImhvdXJEb3duKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9uZy16ZW5kdWl0L2ljb25zL2Fycm93LWRvd24tc21hbGwuc3ZnXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD46PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4taWNvbiAoY2xpY2spPVwibWluVXAoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvYXJyb3ctdXAtc21hbGwuc3ZnXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cIm1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidGltZUNoYW5nZWQoKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8emVuLWljb24gKGNsaWNrKT1cIm1pbkRvd24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvYXJyb3ctZG93bi1zbWFsbC5zdmdcIj48L3plbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFtLXBtLXBpY2tlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1haW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlVGltZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpc1BNID8gJ1BNJyA6ICdBTSd9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVRpbWUoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXNQTSA/ICdBTScgOiAnUE0nfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGludFwiXG4gICAgICAgICAgICAgICAgICpuZ0lmPVwiaGludFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoaW50LWRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7aGludC5kZXNjcmlwdGlvbn19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhpbnQtZGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0SGludERhdGUoaGludC5kYXRlKVwiPlxuICAgICAgICAgICAgICAgICAgICB7e2hpbnQubWFza1RleHR9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXJcIlxuICAgICAgICAgICAgICAgICAqbmdJZj1cIiFhdXRvQ29uZmlybSB8fCBzaG93VGltZVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uLXN0cm9rZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgQ2xlYXJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uLXN0cm9rZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiIV9kYXRlVG9TZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b24tZmxhdFwiPlxuICAgICAgICAgICAgICAgICAgICBBcHBseVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb250aFBpY2tlclZpc2libGVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgtcGlja2VyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXlzLXRvb2xiYXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIChjbGljayk9XCJwcmV2WWVhcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIj5uYXZpZ2F0ZV9iZWZvcmU8L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93WWVhclBpY2tlcigpXCI+e3sgY3VycmVudFNsb3QgfCBkYXRlOiAneXl5eScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSAoY2xpY2spPVwibmV4dFllYXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+bmF2aWdhdGVfbmV4dDwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aHMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtb250aCBvZiBtb250aHM7IGluZGV4IGFzIGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdE1vbnRoKGluZGV4KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1vbnRoIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInllYXJQaWNrZXJWaXNpYmxlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXBpY2tlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF5cy10b29sYmFyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSAoY2xpY2spPVwicHJldlllYXJHcm91cCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIj5uYXZpZ2F0ZV9iZWZvcmU8L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93WWVhclBpY2tlcigpXCI+e3sgY3VycmVudFNsb3QgfCBkYXRlOiAneXl5eScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSAoY2xpY2spPVwibmV4dFllYXJHcm91cCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIj5uYXZpZ2F0ZV9uZXh0PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRocy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHllYXIgb2YgeWVhcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0WWVhcih5ZWFyKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHllYXIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtbW9kYWwtZXh0cmEtc3BhY2VcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuIl19
565
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy16ZW5kdWl0L3NyYy9saWIvZGF0ZXBpY2tlci96ZW5kdS1kYXRlcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9kYXRlcGlja2VyL3plbmR1LWRhdGVwaWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFDN0MsTUFBTSxFQUE4QixTQUFTLEVBQzNELE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sTUFBTSxNQUFNLGVBQWUsQ0FBQztBQUduQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7O0FBR3JELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztBQUMxQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDM0IsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBTzVCLE1BQU0sT0FBTyx3QkFBd0I7SUF3RmpDLFlBQ1ksUUFBb0IsRUFDcEIsT0FBZ0IsRUFDaEIsZ0JBQWtDLEVBQ2xDLFVBQTRCO1FBSDVCLGFBQVEsR0FBUixRQUFRLENBQVk7UUFDcEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBckZ4Qzs7V0FFRztRQUNPLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXZDLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsYUFBUSxHQUFHLElBQUksQ0FBQztRQUVoQixvQkFBZSxHQUF1QixJQUFJLENB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QUM7UUFDaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdEI7SUFDTCxDQUFDO0lBRU0sTUFBTTtRQUNULElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDYixPQUFPO1NBQ1Y7UUFDRCxJQUFJLEVBQUUsQ0FBQztRQUNQLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU0sUUFBUTtRQUNYLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDYixPQUFPO1NBQ1Y7UUFDRCxJQUFJLEVBQUUsQ0FBQztRQUNQLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU0sS0FBSztRQUNSLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDWixPQUFPO1NBQ1Y7UUFDRCxHQUFHLEVBQUUsQ0FBQztRQUNOLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU0s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R0FBeEIsd0JBQXdCLGk4QkNyQnJDLDR1VEF1TkE7NEZEbE1hLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDSSxnQkFBZ0I7cUxBU2pCLElBQUk7c0JBQVosS0FBSztnQkFLSSxVQUFVO3NCQUFuQixNQUFNO2dCQUVFLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csY0FBYztzQkFBdEIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFaUIsUUFBUTtzQkFBOUIsU0FBUzt1QkFBQyxVQUFVO2dCQUVPLGFBQWE7c0JBQXhDLFNBQVM7dUJBQUMsZUFBZTtnQkFFSyxnQkFBZ0I7c0JBQTlDLFNBQVM7dUJBQUMsa0JBQWtCO2dCQThDN0IsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWE1QyxNQUFNO3NCQURMLFlBQVk7dUJBQUMsZUFBZSxFQUFFLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LFxuICAgIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQvbW9tZW50JztcbmltcG9ydCB7IERhdGVQaWNrZXJEYXkgfSBmcm9tICcuL2RhdGUtcGlja2VyLWRheSc7XG5pbXBvcnQgeyBEYXRlUGlja2VySGludCB9IGZyb20gXCIuL2RhdGUtcGlja2VyLWhpbnRcIjtcbmltcG9ydCB7IERBVEVQSUNLRVJfUE9TSVRJT04gfSBmcm9tICcuL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgT3ZlcmxheVJlZiwgT3ZlcmxheSwgQ29ubmVjdGVkUG9zaXRpb24gfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5jb25zdCBkZWZhdWx0SG91cnMgPSAnMTInO1xuY29uc3QgZGVmYXVsdE1pbnV0cyA9ICcwMCc7XG5jb25zdCBkZWZhdWx0U2Vjb25kcyA9ICcwMCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnemVuLWRhdGVwaWNrZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi96ZW5kdS1kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi96ZW5kdS1kYXRlcGlja2VyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgWmVuZHVEYXRlcGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcblxuICAgIC8qKlxuICAgICAqIENvbXBvbmVudCBwcm9wZXJ0eVxuICAgICAqL1xuICAgIEBJbnB1dCgpIGRhdGU6IERhdGU7XG5cbiAgICAvKipcbiAgICAgKiBjYWxsYmFjayB0byBlbWl0IGNoYW5nZXMgZm9yIHBhcmVudCBjb21wb25lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcblxuICAgIEBJbnB1dCgpIHNob3dUaW1lID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKSBzaG93RGF0ZSA9IHRydWU7XG5cbiAgICBASW5wdXQoKSBwYXJlbnRDb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBjb250YWluZXJDbGFzczogc3RyaW5nO1xuXG4gICAgQElucHV0KCkgbWluRGF0ZTogRGF0ZTtcblxuICAgIEBJbnB1dCgpIG1heERhdGU6IERhdGU7XG5cbiAgICBASW5wdXQoKSBib3hEZXNpZ246IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpIGhpZ2hsaWdodERheXM6IG51bWJlcltdID0gW107XG5cbiAgICBASW5wdXQoKSBhdXRvQ29uZmlybTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQElucHV0KCkgaGludDogRGF0ZVBpY2tlckhpbnQ7XG5cbiAgICAvKipcbiAgICAgKiBkYXRlcGlja2VyIHN0YXRlc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGhpZ2hsaWdodEVycm9yOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpIHhQb3NpdGlvbjogREFURVBJQ0tFUl9QT1NJVElPTiA9IERBVEVQSUNLRVJfUE9TSVRJT04uQVVUTztcblxuICAgIEBJbnB1dCgpIHlQb3NpdGlvbjogREFURVBJQ0tFUl9QT1NJVElPTiA9IERBVEVQSUNLRVJfUE9TSVRJT04uQVVUTztcblxuICAgIEBJbnB1dCgpIGRpc3BhbHlPdmVyUGFyZW50OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBAVmlld0NoaWxkKCdkYXRlTWVudScpIGRhdGVNZW51ITogRWxlbWVudFJlZjtcblxuICAgIEBWaWV3Q2hpbGQoJ3RyaWdnZXJCdXR0b24nKSB0cmlnZ2VyQnV0dG9uITogRWxlbWVudFJlZjtcblxuICAgIEBWaWV3Q2hpbGQoJ2RhdGVNZW51VGVtcGxhdGUnKSBkYXRlTWVudVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICAgIHByaXZhdGUgb3ZlcmxheVJlZjogT3ZlcmxheVJlZjtcblxuICAgIHB1YmxpYyBzZWxlY3RlZFRpbWU6IHsgSHI6IG51bWJlciwgTWluOiBudW1iZXIsIFNlYzogbnVtYmVyIH0gPSB7IEhyOiAxLCBNaW46IDAsIFNlYzogMCB9O1xuXG4gICAgcHVibGljIGlzUGlja2VyVmlzaWJsZSA9IGZhbHNlO1xuXG4gICAgcHVibGljIGRheVJvd3M6IEFycmF5PHsgZGF5czogRGF0ZVBpY2tlckRheVtdIH0+ID0gW107XG5cbiAgICBwdWJsaWMgZGF5c1RpdGxlID0gXCJcIjtcblxuICAgIHB1YmxpYyB3ZWVrRGF5cyA9IFtcIk1vXCIsIFwiVHVcIiwgXCJXZVwiLCBcIlRoXCIsIFwiRnJpXCIsIFwiU2FcIiwgXCJTdVwiXTtcblxuICAgIHB1YmxpYyBjdXJyZW50U2xvdCA9IG5ldyBEYXRlKCk7XG5cbiAgICBwdWJsaWMgaG91ciA9IGRlZmF1bHRIb3VycztcblxuICAgIHB1YmxpYyBtaW4gPSBkZWZhdWx0TWludXRzO1xuXG4gICAgcHVibGljIHNlYyA9IGRlZmF1bHRTZWNvbmRzO1xuXG4gICAgcHVibGljIGlzUE0gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBfZGF0ZVRvU2V0OiBEYXRlO1xuXG4gICAgcHVibGljIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuICAgIHB1YmxpYyB5ZWFycyA9IFtdO1xuXG4gICAgcHVibGljIG1vbnRoUGlja2VyVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIHllYXJQaWNrZXJWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICByaWdodDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGJvdHRvbTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcbiAgICAgICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBwcml2YXRlIF90cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgICApIHsgfVxuXG5cbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6bW91c2Vkb3duJywgWyckZXZlbnQnXSlcbiAgICBvdXRzaWRlSGFuZGxpbmcoZXZlbnQpIHtcbiAgICAgICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgbm90IGluIHRoZSBET01cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhpZGVUaW1lUGlja2VyKClcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJywgW10pXG4gICAgc2Nyb2xsKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVBsYWNlbWVudCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGVUb1NldCA9IG5ldyBEYXRlKHRoaXMuZGF0ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUaW1lID0ge1xuICAgICAgICAgICAgICAgIEhyOiBtb21lbnQodGhpcy5kYXRlKS5ob3VycygpLFxuICAgICAgICAgICAgICAgIE1pbjogbW9tZW50KHRoaXMuZGF0ZSkubWludXRlcygpLFxuICAgICAgICAgICAgICAgIFNlYzogbW9tZW50KHRoaXMuZGF0ZSkuc2Vjb25kcygpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZVBsYWNlbWVudCgpIHtcbiAgICAgICAgdGhpcy5yaWdodCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJvdHRvbSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy54UG9zaXRpb24gPT09IERBVEVQSUNLRVJfUE9TSVRJT04uQVVUTyAmJiB0aGlzLmdldEhvcml6b250YWxNZW51RGlyZWN0aW9uKCkgPT09IERBVEVQSUNLRVJfUE9TSVRJT04uTEVGVCkge1xuICAgICAgICAgICAgdGhpcy5yaWdodCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMueVBvc2l0aW9uID09PSBEQVRFUElDS0VSX1BPU0lUSU9OLkFVVE8gJiYgdGhpcy5nZXRWZXJ0aWNhbE1lbnVEaXJlY3Rpb24oKSA9PT0gREFURVBJQ0tFUl9QT1NJVElPTi5UT1ApIHtcbiAgICAgICAgICAgIHRoaXMuYm90dG9tID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy54UG9zaXRpb24gPT09IERBVEVQSUNLRVJfUE9TSVRJT04uUklHSFQpIHtcbiAgICAgICAgICAgIHRoaXMucmlnaHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnlQb3NpdGlvbiA9PT0gREFURVBJQ0tFUl9QT1NJVElPTi5UT1ApIHtcbiAgICAgICAgICAgIHRoaXMuYm90dG9tID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VmVydGljYWxNZW51RGlyZWN0aW9uKCk6IERBVEVQSUNLRVJfUE9TSVRJT04ge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCB0b3AgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgICAgICBpZiAodG9wID4gKGhlaWdodCAvIDIpKSB7XG4gICAgICAgICAgICByZXR1cm4gREFURVBJQ0tFUl9QT1NJVElPTi5UT1BcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBEQVRFUElDS0VSX1BPU0lUSU9OLkJPVFRPTTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gZ2V0IGRhdGVwaWNrZXIgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBlaXRoZXIgXCJsZWZ0XCIgb3IgXCJyaWdodFwiXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRIb3Jpem9udGFsTWVudURpcmVjdGlvbigpOiBEQVRFUElDS0VSX1BPU0lUSU9OIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgbGVmdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgICAgaWYgKGxlZnQgPiAod2lkdGggLyAyKSkge1xuICAgICAgICAgICAgcmV0dXJuIERBVEVQSUNLRVJfUE9TSVRJT04uTEVGVDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBEQVRFUElDS0VSX1BPU0lUSU9OLlJJR0hUO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgdG9nZ2xlUGlja2VyKCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuX2RhdGVUb1NldCA9IHRoaXMuZGF0ZSA/IG5ldyBEYXRlKHRoaXMuZGF0ZSkgOiBudWxsO1xuXG4gICAgICAgIHRoaXMuaXNQaWNrZXJWaXNpYmxlID0gIXRoaXMuaXNQaWNrZXJWaXNpYmxlO1xuICAgICAgICBpZiAodGhpcy5zaG93RGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2xvdCA9IHRoaXMuX2RhdGVUb1NldCB8fCBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEYXlzKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2hvd1RpbWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUaW1lID0ge1xuICAgICAgICAgICAgICAgIEhyOiBtb21lbnQodGhpcy5kYXRlKS5ob3VycygpLFxuICAgICAgICAgICAgICAgIE1pbjogbW9tZW50KHRoaXMuZGF0ZSkubWludXRlcygpLFxuICAgICAgICAgICAgICAgIFNlYzogbW9tZW50KHRoaXMuZGF0ZSkuc2Vjb25kcygpXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5kYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gbW9tZW50KHRoaXMuZGF0ZSkuZm9ybWF0KCdoaDptbSBBJyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmlzUE0gPSBmb3JtYXR0ZWQuaW5jbHVkZXMoJ1BNJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3VyID0gZm9ybWF0dGVkLnNsaWNlKDAsIDIpO1xuICAgICAgICAgICAgICAgIHRoaXMubWluID0gZm9ybWF0dGVkLnNsaWNlKDMsIDUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzUGlja2VyVmlzaWJsZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGlzcGFseU92ZXJQYXJlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU92ZXJsYXkoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQbGFjZW1lbnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNNZW51UG9zaXRpb25XaXRoRGVsYXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlT3ZlcmxheSgpIHtcbiAgICAgICAgY29uc3QgdmVydGljYWxEaXJlY3Rpb24gPSB0aGlzLmdldFZlcnRpY2FsTWVudURpcmVjdGlvbigpO1xuICAgICAgICBjb25zdCBob3Jpem9udGFsRGlyZWN0aW9uID0gdGhpcy5nZXRIb3Jpem9udGFsTWVudURpcmVjdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uOiBDb25uZWN0ZWRQb3NpdGlvbiA9IHtcbiAgICAgICAgICAgIG9yaWdpblg6IGhvcml6b250YWxEaXJlY3Rpb24gPT09IERBVEVQSUNLRVJfUE9TSVRJT04uUklHSFQgPyAnc3RhcnQnIDogJ2VuZCcsXG4gICAgICAgICAgICBvcmlnaW5ZOiB2ZXJ0aWNhbERpcmVjdGlvbiA9PT0gREFURVBJQ0tFUl9QT1NJVElPTi5CT1RUT00gPyAnYm90dG9tJyA6ICd0b3AnLFxuICAgICAgICAgICAgb3ZlcmxheVg6IGhvcml6b250YWxEaXJlY3Rpb24gPT09IERBVEVQSUNLRVJfUE9TSVRJT04uUklHSFQgPyAnc3RhcnQnIDogJ2VuZCcsXG4gICAgICAgICAgICBvdmVybGF5WTogdmVydGljYWxEaXJlY3Rpb24gPT09IERBVEVQSUNLRVJfUE9TSVRJT04uQk9UVE9NID8gJ3RvcCcgOiAnYm90dG9tJ1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgdmVydGljYWwgcG9zaXRpb24gKGJlbG93IG9yIGFib3ZlKSBhbmQgc2V0IHRoZSB2ZXJ0aWNhbCBvZmZzZXQgKDAgZm9yIGJlbG93LCAtMjAgZm9yIGFib3ZlKVxuICAgICAgICBjb25zdCBpc0JlbG93ID0gdmVydGljYWxEaXJlY3Rpb24gPT09IERBVEVQSUNLRVJfUE9TSVRJT04uQk9UVE9NO1xuICAgICAgICBjb25zdCBvZmZzZXRZID0gaXNCZWxvdyA/IDAgOiAtMjA7XG5cbiAgICAgICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMub3ZlcmxheS5wb3NpdGlvbigpXG4gICAgICAgICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLnRyaWdnZXJCdXR0b24pXG4gICAgICAgICAgICAud2l0aFBvc2l0aW9ucyhbXG4gICAgICAgICAgICAgICAgcG9zaXRpb25cbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAvLyBEaXNhYmxlIGZsZXhpYmxlIGRpbWVuc2lvbnMsIG1lYW5pbmcgdGhlIG92ZXJsYXkgd2lsbCBub3QgcmVzaXplIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKVxuICAgICAgICAgICAgLy8gU2V0IHRoZSB2ZXJ0aWNhbCBvZmZzZXQgdG8gYXZvaWQgb3ZlcmxhcHBpbmcgd2l0aCB0aGUgcGFyZW50IGJ1dHRvbiBcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdE9mZnNldFkob2Zmc2V0WSlcbiAgICAgICAgICAgIC8vIERpc2FibGUgYXV0b21hdGljIHJlcG9zaXRpb25pbmcgb2YgdGhlIG92ZXJsYXkgdG8gYXZvaWQgb3ZlcmxhcCB3aXRoIG90aGVyIGVsZW1lbnRzXG4gICAgICAgICAgICAud2l0aFB1c2goZmFsc2UpO1xuXG5cbiAgICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XG4gICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5LFxuICAgICAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICAgICAgICBiYWNrZHJvcENsYXNzOiAnY3VzdG9tLWJhY2tkcm9wJyxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6ICdjdXN0b20tb3ZlcmxheScsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub3ZlcmxheVJlZi5hdHRhY2gobmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMuZGF0ZU1lbnVUZW1wbGF0ZSwgdGhpcy52aWV3Q29udGFpbmVyUmVmKSk7XG5cbiAgICAgICAgdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmLmRldGFjaCgpO1xuICAgICAgICAgICAgdGhpcy5pc1BpY2tlclZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICAvLyBNZXRob2QgdG8gY2xvc2UgdGhlIG92ZXJsYXlcbiAgICBwdWJsaWMgY2xvc2VQaWNrZXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzUGlja2VyVmlzaWJsZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENsZWFudXAgb3ZlcmxheSBvbiBjb21wb25lbnQgZGVzdHJ1Y3Rpb25cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3ZlcmxheVJlZikge1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2hvd0RhdGVQaWNrZXIoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0ZU1lbnUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVNZW51Lm5hdGl2ZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMClcbiAgICB9XG5cbiAgICBwcml2YXRlIHN5bmNNZW51UG9zaXRpb25XaXRoRGVsYXkoKSB7XG4gICAgICAgIGlmICghdGhpcy5wYXJlbnRDb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0RhdGVQaWNrZXIoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudFJlY3QgPSB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRSZWN0ID0gdGhpcy5wYXJlbnRDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgdG9wIGRpZmZlcmVuY2UgYmV0d2VlbiBlbGVtZW50IGFuZCBwYXJlbnQgKGlmIGF2YWlsYWJsZSlcbiAgICAgICAgICAgIGNvbnN0IHRvcCA9IHRoaXMuY2FsY3VsYXRlVG9wUG9zaXRpb24oZWxlbWVudFJlY3QsIHBhcmVudFJlY3QpO1xuXG4gICAgICAgICAgICBjb25zdCBkYXRlTWVudVJlY3QgPSB0aGlzLmRhdGVNZW51Py5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHRoaXMuYm90dG9tID0gZGF0ZU1lbnVSZWN0Py5oZWlnaHQgPCB0b3A7XG4gICAgICAgICAgICB0aGlzLnNob3dEYXRlUGlja2VyKCk7XG4gICAgICAgIH0sIDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlVG9wUG9zaXRpb24oZWxlbWVudFJlY3Q6IERPTVJlY3QsIHBhcmVudFJlY3Q6IERPTVJlY3QpOiBudW1iZXIge1xuICAgICAgICBsZXQgdG9wOiBudW1iZXI7XG4gICAgICAgIGlmIChlbGVtZW50UmVjdC50b3AgPCBwYXJlbnRSZWN0LnRvcCkge1xuICAgICAgICAgICAgdG9wID0gcGFyZW50UmVjdC50b3AgLSBlbGVtZW50UmVjdC50b3A7IC8vIFJldmVyc2Ugb3JkZXIgaWYgY29uZGl0aW9uIGlzIG1ldFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdG9wID0gZWxlbWVudFJlY3QudG9wIC0gcGFyZW50UmVjdC50b3A7IC8vIE5vcm1hbCBjYWxjdWxhdGlvblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b3A7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVEYXlzKCkge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudFNsb3QpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNsb3QgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW5Nb250aCA9IG1vbWVudCh0aGlzLmRhdGUpLmZvcm1hdChcIk1NTVwiKTtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZE1vbnRoID0gdGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoZW5Nb250aCk7XG5cbiAgICAgICAgdGhpcy5kYXlzVGl0bGUgPSBtb21lbnQodGhpcy5jdXJyZW50U2xvdCkuZm9ybWF0KFwiTU1NIHl5eXlcIikucmVwbGFjZShlbk1vbnRoLCB0cmFuc2xhdGVkTW9udGgpO1xuICAgICAgICB0aGlzLmRheVJvd3MgPSBbXTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSBtb21lbnQodGhpcy5jdXJyZW50U2xvdCkuc3RhcnRPZihcIm1vbnRoXCIpLnN0YXJ0T2YoXCJ3ZWVrXCIpLmFkZCgxLCBcImRheVwiKTtcbiAgICAgICAgbGV0IGVuZCA9IG1vbWVudCh0aGlzLmN1cnJlbnRTbG90KS5lbmRPZihcIm1vbnRoXCIpLmVuZE9mKFwid2Vla1wiKS5hZGQoMSwgXCJkYXlcIik7XG5cbiAgICAgICAgY29uc3QgY3VycmVudE1vbnRoID0gbW9tZW50KHRoaXMuY3VycmVudFNsb3QpLm1vbnRoKCk7XG5cbiAgICAgICAgY29uc3QgZGF0ZSA9IG1vbWVudCh0aGlzLl9kYXRlVG9TZXQpO1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50IDw9IGVuZCkge1xuICAgICAgICAgICAgY29uc3Qgcm93ID0geyBkYXlzOiBbXSBhcyBEYXRlUGlja2VyRGF5W10gfTtcbiAgICAgICAgICAgIHRoaXMuZGF5Um93cy5wdXNoKHJvdyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCA3OyBpZHgrKykge1xuXG4gICAgICAgICAgICAgICAgbGV0IGlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkID0gY3VycmVudC5kYXRlKCkgPT0gZGF0ZS5kYXRlKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGUubW9udGgoKSA9PSBjdXJyZW50Lm1vbnRoKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGlzT3V0c2lkZSA9IGN1cnJlbnRNb250aCAhPSBjdXJyZW50Lm1vbnRoKCk7XG5cbiAgICAgICAgICAgICAgICBsZXQgaXNEaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWluRGF0ZSAmJiBjdXJyZW50LnRvRGF0ZSgpIDwgdGhpcy5taW5EYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXhEYXRlICYmIGN1cnJlbnQudG9EYXRlKCkgPiB0aGlzLm1heERhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGlzSGlnaGxpZ2h0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodERheXMgJiYgdGhpcy5oaWdobGlnaHREYXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBpc0hpZ2hsaWdodGVkID0gdGhpcy5oaWdobGlnaHREYXlzLmluZGV4T2YoY3VycmVudC52YWx1ZU9mKCkpID49IDA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcm93LmRheXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGU6IGN1cnJlbnQudG9EYXRlKCksXG4gICAgICAgICAgICAgICAgICAgIGxibDogbW9tZW50KGN1cnJlbnQpLmRhdGUoKS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICBpc091dHNpZGU6IGlzT3V0c2lkZSxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGlzU2VsZWN0ZWQsXG4gICAgICAgICAgICAgICAgICAgIGlzRGlzYWJsZWQ6IGlzRGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgIGlzSGlnaGxpZ2h0ZWQ6IGlzSGlnaGxpZ2h0ZWRcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBtb21lbnQoY3VycmVudCkuYWRkKDEsIFwiZGF5XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5leHRNb250aCgpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U2xvdCA9IG1vbWVudCh0aGlzLmN1cnJlbnRTbG90KS5hZGQoMSwgXCJtb250aFwiKS50b0RhdGUoKTtcbiAgICAgICAgdGhpcy51cGRhdGVEYXlzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXZNb250aCgpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U2xvdCA9IG1vbWVudCh0aGlzLmN1cnJlbnRTbG90KS5zdWJ0cmFjdCgxLCBcIm1vbnRoXCIpLnRvRGF0ZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZURheXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmV4dFllYXIoKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFNsb3QgPSBtb21lbnQodGhpcy5jdXJyZW50U2xvdCkuYWRkKDEsIFwieWVhclwiKS50b0RhdGUoKTtcbiAgICAgICAgdGhpcy51cGRhdGVEYXlzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXZZZWFyKCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRTbG90ID0gbW9tZW50KHRoaXMuY3VycmVudFNsb3QpLnN1YnRyYWN0KDEsIFwieWVhclwiKS50b0RhdGUoKTtcbiAgICAgICAgdGhpcy51cGRhdGVEYXlzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5leHRZZWFyR3JvdXAoKSB7XG4gICAgICAgIHRoaXMueWVhcnMgPSB0aGlzLnllYXJzLm1hcCh5ZWFyID0+IHllYXIgKyAxNSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXZZZWFyR3JvdXAoKSB7XG4gICAgICAgIHRoaXMueWVhcnMgPSB0aGlzLnllYXJzLm1hcCh5ZWFyID0+IHllYXIgLSAxNSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdERheShkYXk6IERhdGVQaWNrZXJEYXkpIHtcbiAgICAgICAgaWYgKGRheS5pc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICAvLyBkYXkgaXMgZGlzYWJsZWRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNob3dUaW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9kYXRlVG9TZXQgPSBtb21lbnQoZGF5LmRhdGUpLmhvdXIodGhpcy5zZWxlY3RlZFRpbWUuSHIpLm1pbnV0ZSh0aGlzLnNlbGVjdGVkVGltZS5NaW4pLnNlY29uZCh0aGlzLnNlbGVjdGVkVGltZS5TZWMpLnRvRGF0ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZGF0ZVRvU2V0ID0gbmV3IERhdGUoZGF5LmRhdGUpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvQ29uZmlybSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlRGF5cygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZWxlY3RNb250aChtb250aDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh0aGlzLmN1cnJlbnRTbG90KTtcbiAgICAgICAgbmV3RGF0ZS5zZXRNb250aChtb250aCk7XG4gICAgICAgIHRoaXMuY3VycmVudFNsb3QgPSBuZXdEYXRlO1xuICAgICAgICB0aGlzLnVwZGF0ZURheXMoKTtcbiAgICAgICAgdGhpcy5tb250aFBpY2tlclZpc2libGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0WWVhcih5ZWFyOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHRoaXMuY3VycmVudFNsb3QpO1xuICAgICAgICBuZXdEYXRlLnNldEZ1bGxZZWFyKHllYXIpO1xuICAgICAgICB0aGlzLmN1cnJlbnRTbG90ID0gbmV3RGF0ZTtcbiAgICAgICAgdGhpcy51cGRhdGVEYXlzKCk7XG4gICAgICAgIHRoaXMueWVhclBpY2tlclZpc2libGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGlkZVRpbWVQaWNrZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5kaXNwYWx5T3ZlclBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5pc1BpY2tlclZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgcHVibGljIHRpbWVDaGFuZ2VkKCkge1xuICAgICAgICBsZXQgbWluID0gcGFyc2VJbnQodGhpcy5taW4pO1xuICAgICAgICBsZXQgaG91ciA9IHBhcnNlSW50KHRoaXMuaG91cik7XG4gICAgICAgIC8vIFJlcGxhY2UgJzAnIHdpdGggYHRoaXMuc2VjYC5cbiAgICAgICAgLy8gQXMgb2Ygbm93IHdlIGRvIG5vdCBoYXZlIGFwcGxpY2F0aW9uIG9mIG1ha2luZyB0aGUgdXNlciBzZWxlY3Qgc2Vjb25kcyBzbyB3ZSBzZXQgaXQgdG8gMC5cbiAgICAgICAgbGV0IHNlYyA9IHBhcnNlSW50KCcwJyk7XG4gICAgICAgIGlmIChpc05hTihob3VyKSB8fCBpc05hTihtaW4pIHx8IGlzTmFOKHNlYykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGhvdXIgPSBNYXRoLm1pbihob3VyLCAxMik7XG4gICAgICAgIGhvdXIgPSBNYXRoLm1heChob3VyLCAxKTtcblxuICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIDU5KTtcbiAgICAgICAgbWluID0gTWF0aC5tYXgobWluLCAwKTtcblxuICAgICAgICBzZWMgPSBNYXRoLm1pbihzZWMsIDU5KTtcbiAgICAgICAgc2VjID0gTWF0aC5tYXgoc2VjLCAwKTtcblxuICAgICAgICBjb25zdCB0aW1lID0gbW9tZW50KGAke2hvdXJ9ICR7bWlufSAke3RoaXMuaXNQTSA/IFwicG1cIiA6IFwiYW1cIn1gLCBcImg6bSBhXCIpO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUaW1lID0ge1xuICAgICAgICAgICAgSHI6IHRpbWUuaG91cnMoKSxcbiAgICAgICAgICAgIE1pbjogdGltZS5taW51dGVzKCksXG4gICAgICAgICAgICBTZWM6IHRpbWUuc2Vjb25kcygpXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gYWRkZWQgYmVsb3cgY29uZGl0aW9uIGJlY2F1c2Ugd2UgY2FuIHNlbGVjdCB0aGUgdGltZSB3aXRob3V0IGRhdGUsIGFuZCBpdCB3YXMgc2hvd2luZyBpbnZhbGlkIGRhdGUgaW4gdGhlIGlucHV0IGJveFxuICAgICAgICAvLyBzZWNvbmQgY29uZGl0aW9uIGlzIHJlcXVpcmVkIHRvIGRpc2FibGUgYXBwbHkgYnV0dG9uIHdoZW4gZGF0ZSBpcyBub3Qgc2VsZWN0ZWRcbiAgICAgICAgaWYgKHRoaXMuX2RhdGVUb1NldCkge1xuICAgICAgICAgICAgdGhpcy5fZGF0ZVRvU2V0ID0gbW9tZW50KHRoaXMuX2RhdGVUb1NldCkuaG91cih0aGlzLnNlbGVjdGVkVGltZS5IcikubWludXRlKHRoaXMuc2VsZWN0ZWRUaW1lLk1pbikuc2Vjb25kKHRoaXMuc2VsZWN0ZWRUaW1lLlNlYykudG9EYXRlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc2hvd0RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGVUb1NldCA9IG1vbWVudCgpLmhvdXIodGhpcy5zZWxlY3RlZFRpbWUuSHIpLm1pbnV0ZSh0aGlzLnNlbGVjdGVkVGltZS5NaW4pLnNlY29uZCh0aGlzLnNlbGVjdGVkVGltZS5TZWMpLnRvRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZm9ybWF0XG4gICAgICAgIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgIHRoaXMuaG91ciA9IGAwJHtob3VyfWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhvdXIgPSBgJHtob3VyfWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWluIDwgMTApIHtcbiAgICAgICAgICAgIHRoaXMubWluID0gYDAke21pbn1gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5taW4gPSBgJHttaW59YDtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcHVibGljIGZvcm1hdHRlZERhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5kYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmJveERlc2lnbiAmJiBtb21lbnQodGhpcy5kYXRlKS5pc1NhbWUobW9tZW50KCksIFwiZGF5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1RvZGF5JztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGdldCB0aGUgdHJhbnNsYXRlZCB0ZXh0IGZvciBkYXkgYW5kIG1vbnRoXG4gICAgICAgIGNvbnN0IGVuTW9udGggPSBtb21lbnQodGhpcy5kYXRlKS5mb3JtYXQoXCJNTU1cIik7XG4gICAgICAgIGNvbnN0IGVuRGF5ID0gbW9tZW50KHRoaXMuZGF0ZSkuZm9ybWF0KFwiZGRkXCIpO1xuICAgICAgICBjb25zdCB0cmFuc2xhdGVkTW9udGggPSB0aGlzLl90cmFuc2xhdGUuaW5zdGFudChlbk1vbnRoKTtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZERheSA9IHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KGVuRGF5KTtcblxuICAgICAgICBpZiAodGhpcy5zaG93RGF0ZSAmJiAhdGhpcy5zaG93VGltZSAmJiAhdGhpcy5ib3hEZXNpZ24pIHtcbiAgICAgICAgICAgIC8vIEV4cGFuZGVkIGZvcm1hdHRpbmcgZm9yIGRhdGUgb25seSBwaWNrZXJcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQodGhpcy5kYXRlKS5mb3JtYXQoXCJkZGQsIEREIE1NTSBZWVlZXCIpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoZW5EYXksIHRyYW5zbGF0ZWREYXkpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoZW5Nb250aCwgdHJhbnNsYXRlZE1vbnRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtb21lbnQodGhpcy5kYXRlKS5mb3JtYXQoXCJNTU0gREQsIFlZXCIpLnJlcGxhY2UoZW5Nb250aCwgdHJhbnNsYXRlZE1vbnRoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm9ybWF0dGVkVGltZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtb21lbnQodGhpcy5kYXRlKS5mb3JtYXQoXCJoOm1tIEFcIik7XG4gICAgfVxuXG4gICAgcHVibGljIHRvZ2dsZVRpbWUoKSB7XG4gICAgICAgIHRoaXMuaXNQTSA9ICF0aGlzLmlzUE07XG4gICAgICAgIHRoaXMudGltZUNoYW5nZWQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2hvd01vbnRoUGlja2VyKCkge1xuICAgICAgICB0aGlzLm1vbnRoUGlja2VyVmlzaWJsZSA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIHNob3dZZWFyUGlja2VyKCkge1xuICAgICAgICB0aGlzLnllYXJQaWNrZXJWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy55ZWFycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5jdXJyZW50U2xvdC5nZXRGdWxsWWVhcigpIC0gNzsgaSA8IHRoaXMuY3VycmVudFNsb3QuZ2V0RnVsbFllYXIoKSArIDg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy55ZWFycy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGhvdXJVcCgpIHtcbiAgICAgICAgbGV0IGhvdXIgPSBwYXJzZUludCh0aGlzLmhvdXIpO1xuICAgICAgICBpZiAoaXNOYU4oaG91cikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBob3VyKys7XG4gICAgICAgIHRoaXMuaG91ciA9IGhvdXIudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy50aW1lQ2hhbmdlZCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBob3VyRG93bigpIHtcbiAgICAgICAgbGV0IGhvdXIgPSBwYXJzZUludCh0aGlzLmhvdXIpO1xuICAgICAgICBpZiAoaXNOYU4oaG91cikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBob3VyLS07XG4gICAgICAgIHRoaXMuaG91ciA9IGhvdXIudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy50aW1lQ2hhbmdlZCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBtaW5VcCgpIHtcbiAgICAgICAgbGV0IG1pbiA9IHBhcnNlSW50KHRoaXMubWluKTtcbiAgICAgICAgaWYgKGlzTmFOKG1pbikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBtaW4rKztcbiAgICAgICAgdGhpcy5taW4gPSBtaW4udG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy50aW1lQ2hhbmdlZCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBtaW5Eb3duKCkge1xuICAgICAgICBsZXQgbWluID0gcGFyc2VJbnQodGhpcy5taW4pO1xuICAgICAgICBpZiAoaXNOYU4obWluKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG1pbi0tO1xuICAgICAgICB0aGlzLm1pbiA9IG1pbi50b1N0cmluZygpO1xuICAgICAgICB0aGlzLnRpbWVDaGFuZ2VkKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFwcGx5KCkge1xuICAgICAgICBpZiAodGhpcy5fZGF0ZVRvU2V0KSB7XG4gICAgICAgICAgICAvLyBJZiB0aW1lIHNlbGVjdGlvbiBoYXMgZW5hYmxlZCBhbmQgdXNlciBrZWVwcyBkZWZhdWx0IHRpbWUgdGhlbiB0cmlnZ2VyaW5nIHRoZSB0aW1lQ2hhbmdlZCBmdW5jdGlvblxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd1RpbWUgJiYgdGhpcy5ob3VyID09PSBkZWZhdWx0SG91cnMgJiYgdGhpcy5taW4gPT09IGRlZmF1bHRNaW51dHMgJiYgdGhpcy5zZWMgPT09IGRlZmF1bHRTZWNvbmRzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lQ2hhbmdlZCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmRhdGUgPSBuZXcgRGF0ZSh0aGlzLl9kYXRlVG9TZXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KHRoaXMuZGF0ZSk7XG4gICAgICAgIHRoaXMuZGlzcGFseU92ZXJQYXJlbnQgPyB0aGlzLmNsb3NlUGlja2VyKCkgOiB0aGlzLmhpZGVUaW1lUGlja2VyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5kaXNwYWx5T3ZlclBhcmVudCA/IHRoaXMuY2xvc2VQaWNrZXIoKSA6IHRoaXMuaGlkZVRpbWVQaWNrZXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX2RhdGVUb1NldCA9IG51bGw7XG4gICAgICAgIHRoaXMuaG91ciA9IGRlZmF1bHRIb3VycztcbiAgICAgICAgdGhpcy5taW4gPSBkZWZhdWx0TWludXRzO1xuICAgICAgICB0aGlzLmRhdGUgPSBudWxsO1xuICAgICAgICB0aGlzLmFwcGx5KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEljb24oKSB7XG4gICAgICAgIC8vIENoYW5nZSBwaWNrZXIgaWNvbiBiYXNlZCBvbiBtb2RlXG4gICAgICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgICAgICAgY2FzZSB0aGlzLnNob3dEYXRlICYmIHRoaXMuc2hvd1RpbWU6XG4gICAgICAgICAgICAgICAgLy8gRGF0ZSArIFRpbWVcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Fzc2V0cy9uZy16ZW5kdWl0L2ljb25zL2RhdGUuc3ZnJztcbiAgICAgICAgICAgIGNhc2UgdGhpcy5zaG93RGF0ZSAmJiAhdGhpcy5zaG93VGltZTpcbiAgICAgICAgICAgICAgICAvLyBEYXRlIG9ubHlcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Fzc2V0cy9uZy16ZW5kdWl0L2ljb25zL2NhbGVuZGFyLnN2Zyc7XG4gICAgICAgICAgICBjYXNlICF0aGlzLnNob3dEYXRlICYmIHRoaXMuc2hvd1RpbWU6XG4gICAgICAgICAgICAgICAgLy8gVGltZSBvbmx5XG4gICAgICAgICAgICAgICAgcmV0dXJuICdhc3NldHMvbmctemVuZHVpdC9pY29ucy90aW1lLnN2Zyc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvZGF0ZS5zdmcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdEhpbnREYXRlKGRhdGU6IERhdGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFkYXRlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIGhpbnQnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2RhdGVUb1NldCA9IG5ldyBEYXRlKGRhdGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGltZSA9IHtcbiAgICAgICAgICAgIEhyOiBtb21lbnQoZGF0ZSkuaG91cnMoKSxcbiAgICAgICAgICAgIE1pbjogbW9tZW50KGRhdGUpLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgIFNlYzogbW9tZW50KGRhdGUpLnNlY29uZHMoKVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLmF1dG9Db25maXJtKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZURheXMoKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGF0ZS1jb21wb25lbnRcIj5cbiAgICA8IS0tIE1hdGVyaWFsIGRlc2lnbiBkYXRlcGlja2VyIHRvZ2dsZSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWJveERlc2lnblwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGF0ZS10b2dnbGVcIlxuICAgICAgICAgICAgICAgICN0cmlnZ2VyQnV0dG9uXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGlja2VyKClcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogaXNQaWNrZXJWaXNpYmxlLCdlcnJvcic6IGhpZ2hsaWdodEVycm9yLCdyZWFkb25seSc6IHJlYWRvbmx5fVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDwhLS0gZGF0ZSBwbGFjZWhvbGRlciAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFkYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7XCJTZWxlY3QgRGF0ZVwiIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gU2VsZWN0ZWQgZGF0ZXRpbWUgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93RGF0ZVwiPnt7Zm9ybWF0dGVkRGF0ZSgpfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd1RpbWVcIj4mbmJzcDt7e2Zvcm1hdHRlZFRpbWUoKX19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gRGF0ZXBpY2tlciBpY29uLCBkZXBlbmRzIG9uIHBpY2tlciB0eXBlIC0tPlxuICAgICAgICAgICAgPHplbi1pY29uIGNsYXNzPVwiZGF0ZS1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImdldEljb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydmaWxsZWQnOiBkYXRlfVwiPlxuICAgICAgICAgICAgPC96ZW4taWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIEJveCBkZXNpZ24gZGF0ZXBpY2tlciB0b2dnbGUgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJveERlc2lnblwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGF0ZS10b2dnbGUgbmV3LWJveC1kZXNpZ25cIlxuICAgICAgICAgICAgICAgICN0cmlnZ2VyQnV0dG9uXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGlja2VyKClcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogaXNQaWNrZXJWaXNpYmxlLCdlcnJvcic6IGhpZ2hsaWdodEVycm9yLCdyZWFkb25seSc6IHJlYWRvbmx5fVwiPlxuXG4gICAgICAgICAgICA8IS0tIERhdGVwaWNrZXIgaWNvbiwgZGVwZW5kcyBvbiBwaWNrZXIgdHlwZSAtLT5cbiAgICAgICAgICAgIDx6ZW4taWNvbiBjbGFzcz1cImRhdGUtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJnZXRJY29uKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZmlsbGVkJzogZGF0ZX1cIj5cbiAgICAgICAgICAgIDwvemVuLWljb24+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLWNvbnRlbnQgbmV3LWJveC1kZXNpZ25cIj5cbiAgICAgICAgICAgICAgICA8IS0tIGRhdGUgcGxhY2Vob2xkZXIgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhZGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICB7e1wiU2VsZWN0IERhdGVcIiB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIFNlbGVjdGVkIGRhdGV0aW1lIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJkYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd0RhdGVcIj57e2Zvcm1hdHRlZERhdGUoKX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dUaW1lXCI+Jm5ic3A7e3tmb3JtYXR0ZWRUaW1lKCl9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRGF0ZXBpY2tlciBwb3B1cCAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGF0ZU1lbnVUZW1wbGF0ZVwiPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLXRlbXBsYXRlICNkYXRlTWVudVRlbXBsYXRlPlxuICAgICAgICA8ZGl2ICNkYXRlTWVudVxuICAgICAgICAgICAgICpuZ0lmPVwiaXNQaWNrZXJWaXNpYmxlXCJcbiAgICAgICAgICAgICBjbGFzcz1cImRhdGUtbWVudVwiXG4gICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAncmlnaHQnOiByaWdodCwgJ2JvdHRvbSc6IGJvdHRvbSB9XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1tb2RhbFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF5cy10b29sYmFyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSAoY2xpY2spPVwicHJldk1vbnRoKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPm5hdmlnYXRlX2JlZm9yZTwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dNb250aFBpY2tlcigpXCI+e3tkYXlzVGl0bGV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIChjbGljayk9XCJuZXh0TW9udGgoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+bmF2aWdhdGVfbmV4dDwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXlzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndlZWstZGF5c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHdlZWtEYXkgb2Ygd2Vla0RheXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3ZWVrLWRheVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3dlZWtEYXl9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgZGF5Um93c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGF5LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGRheSBvZiByb3cuZGF5c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF5KGRheSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkYXktaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mub3VzaWRlUmFuZ2VdPVwiZGF5LmlzT3V0c2lkZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiZGF5LnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZERheV09XCJkYXkuaXNEaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2RheS5sYmwgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWljb24gKm5nSWY9XCJkYXkuaXNIaWdobGlnaHRlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhpZ2hsaWdodC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9uZy16ZW5kdWl0L2ljb25zL3BsYXkuc3ZnXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93VGltZVwiXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRpbWUtY29udGFpbmVyXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtbGJsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e1wiU2VsZWN0IFRpbWVcIiB8IHRyYW5zbGF0ZX19OlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1pY29uIChjbGljayk9XCJob3VyVXAoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9uZy16ZW5kdWl0L2ljb25zL2Fycm93LXVwLXNtYWxsLnN2Z1wiPjwvemVuLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwiaG91clwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRpbWVDaGFuZ2VkKClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4taWNvbiAoY2xpY2spPVwiaG91ckRvd24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9uZy16ZW5kdWl0L2ljb25zL2Fycm93LWRvd24tc21hbGwuc3ZnXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWljb24gKGNsaWNrKT1cIm1pblVwKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvbmctemVuZHVpdC9pY29ucy9hcnJvdy11cC1zbWFsbC5zdmdcIj48L3plbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cIm1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRpbWVDaGFuZ2VkKClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4taWNvbiAoY2xpY2spPVwibWluRG93bigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvYXJyb3ctZG93bi1zbWFsbC5zdmdcIj48L3plbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW0tcG0tcGlja2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1haW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVRpbWUoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhpc1BNID8gJ1BNJyA6ICdBTScpIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVUaW1lKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3soaXNQTSA/ICdBTScgOiAnUE0nKSB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGludFwiXG4gICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImhpbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhpbnQtZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7aGludC5kZXNjcmlwdGlvbiB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGludC1kYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0SGludERhdGUoaGludC5kYXRlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3toaW50Lm1hc2tUZXh0IHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWF1dG9Db25maXJtIHx8IHNob3dUaW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b24tc3Ryb2tlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tcIkNsZWFyXCIgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uLXN0cm9rZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7XCJDYW5jZWxcIiB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCIhX2RhdGVUb1NldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uLWZsYXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7XCJBcHBseVwiIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9udGhQaWNrZXJWaXNpYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC1waWNrZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXlzLXRvb2xiYXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSAoY2xpY2spPVwicHJldlllYXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPm5hdmlnYXRlX2JlZm9yZTwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd1llYXJQaWNrZXIoKVwiPnt7IGN1cnJlbnRTbG90IHwgZGF0ZTogJ3l5eXknIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIChjbGljayk9XCJuZXh0WWVhcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+bmF2aWdhdGVfbmV4dDwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRocy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbW9udGggb2YgbW9udGhzOyBpbmRleCBhcyBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TW9udGgoaW5kZXgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1vbnRoIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwieWVhclBpY2tlclZpc2libGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXBpY2tlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRheXMtdG9vbGJhclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIChjbGljayk9XCJwcmV2WWVhckdyb3VwKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIj5uYXZpZ2F0ZV9iZWZvcmU8L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dZZWFyUGlja2VyKClcIj57eyBjdXJyZW50U2xvdCB8IGRhdGU6ICd5eXl5JyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSAoY2xpY2spPVwibmV4dFllYXJHcm91cCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+bmF2aWdhdGVfbmV4dDwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRocy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgeWVhciBvZiB5ZWFyc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0WWVhcih5ZWFyKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB5ZWFyIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLW1vZGFsLWV4dHJhLXNwYWNlXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG48L2Rpdj5cbiJdfQ==