ng-devui
Version:
DevUI components based on Angular
276 lines • 49.1 kB
JavaScript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef } from '@angular/core';
import { I18nService } from 'ng-devui/i18n';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { DatepickerProService } from '../datepicker-pro.service';
import * as i0 from "@angular/core";
import * as i1 from "../datepicker-pro.service";
import * as i2 from "ng-devui/i18n";
import * as i3 from "@angular/common";
export class TimepickerPanelComponent {
constructor(el, pickSrv, i18n, cdr) {
this.el = el;
this.pickSrv = pickSrv;
this.i18n = i18n;
this.cdr = cdr;
this.firstList = [];
this.secondList = [];
this.thirdList = [];
this.hourIndex = 0;
this.minIndex = 0;
this.secIndex = 0;
this.typeList = ['hour', 'min', 'sec'];
this.unsubscribe$ = new Subject();
}
ngOnInit() {
this.initDateList();
this.initObservable();
this.setI18nText();
}
setI18nText() {
this.i18nText = this.i18n.getI18nText().datePickerPro;
this.i18nSubscription = this.i18n.langChange().subscribe((data) => {
this.i18nText = data.datePickerPro;
});
}
initObservable() {
this.pickSrv.toggleEvent.pipe(takeUntil(this.unsubscribe$)).subscribe((isOpen) => {
if (isOpen) {
setTimeout(() => {
this.initDateList(true);
this.cdr.detectChanges();
});
}
});
this.pickSrv.updateTimeChange.pipe(takeUntil(this.unsubscribe$)).subscribe((value) => {
if (this.hourIndex !== value.hour) {
this.chooseTime('hour', value.hour);
}
if (this.minIndex !== value.min) {
this.chooseTime('min', value.min);
}
if (this.secIndex !== value.seconds) {
this.chooseTime('sec', value.seconds);
}
this.cdr.detectChanges();
});
if (this.pickSrv.isRange) {
this.pickSrv.activeInputChange.pipe(takeUntil(this.unsubscribe$)).subscribe((type) => {
const isNull = (type === 'start' && !this.pickSrv.curRangeDate[0]) || (type === 'end' && !this.pickSrv.curRangeDate[1]);
if (this.hourIndex !== this.pickSrv.curHour || isNull) {
this.chooseTime('hour', isNull ? null : this.pickSrv.curHour);
}
if (this.minIndex !== this.pickSrv.curMin || isNull) {
this.chooseTime('min', isNull ? null : this.pickSrv.curMin);
}
if (this.secIndex !== this.pickSrv.curSec || isNull) {
this.chooseTime('sec', isNull ? null : this.pickSrv.curSec);
}
});
}
this.pickSrv.selectedDateChange.pipe(takeUntil(this.unsubscribe$)).subscribe(() => {
const isFixTime = this.fixTime();
this.cdr.detectChanges();
if (isFixTime) {
setTimeout(() => {
this.pickSrv.selectedTimeChange.next({
activeInput: this.pickSrv.currentActiveInput,
hour: this.hourIndex,
min: this.minIndex,
seconds: this.secIndex,
});
});
}
});
}
initDateList(justScroll = false) {
if (this.pickSrv.curDate) {
this.hourIndex = this.pickSrv.curDate.getHours();
this.minIndex = this.pickSrv.curDate.getMinutes();
this.secIndex = this.pickSrv.curDate.getSeconds();
}
this.typeList.forEach((type) => {
this.chooseTime(type, this[`${type}Index`], false, justScroll);
});
}
chooseTime(type, index, handle = false, justScroll = false) {
if (this.itemIsDisabled(type, index)) {
return;
}
let fixed;
switch (type) {
case 'hour':
this.hourIndex = index;
fixed = this.fixTime(justScroll);
this.firstList = new Array(24).fill(1).map((t, i) => {
return {
time: i < 10 ? `0${i}` : String(i),
type: 'hour',
active: this.hourIndex === i,
};
});
if (!fixed) {
this.setScroll('first', this.hourIndex, justScroll);
}
break;
case 'min':
this.minIndex = index;
this.fixTime(justScroll);
this.secondList = new Array(60).fill(1).map((t, i) => {
return {
time: i < 10 ? `0${i}` : String(i),
type: 'min',
active: this.minIndex === i,
};
});
if (!fixed) {
this.setScroll('second', this.minIndex, justScroll);
}
break;
case 'sec':
this.secIndex = index;
this.thirdList = new Array(60).fill(1).map((t, i) => {
return {
time: i < 10 ? `0${i}` : String(i),
type: 'sec',
active: this.secIndex === i,
};
});
this.setScroll('third', this.secIndex, justScroll);
break;
default:
}
this.cdr.detectChanges();
if (handle) {
this.pickSrv.selectedTimeChange.next({
activeInput: this.pickSrv.currentActiveInput,
hour: this.hourIndex,
min: this.minIndex,
seconds: this.secIndex,
});
}
}
fixTime(justScroll = false) {
let curTime;
if (this.pickSrv.isRange) {
const target = this.pickSrv.curRangeDate[this.pickSrv.currentActiveInput === 'start' ? 0 : 1];
if (!target) {
return;
}
curTime = new Date(target);
}
else {
if (!this.pickSrv.curDate) {
return;
}
curTime = new Date(this.pickSrv.curDate);
}
curTime.setHours(this.hourIndex);
curTime.setMinutes(this.minIndex);
curTime.setSeconds(this.secIndex);
let isFixTime = false;
if (curTime.getTime() < this.pickSrv.minDate.getTime()) {
this.pickSrv.curDate = this.pickSrv.minDate;
isFixTime = true;
}
if (curTime.getTime() > this.pickSrv.maxDate.getTime()) {
this.pickSrv.curDate = this.pickSrv.maxDate;
isFixTime = true;
}
if (isFixTime) {
this.initDateList(justScroll);
}
return isFixTime;
}
itemIsDisabled(type, index) {
let curTime;
if (this.pickSrv.isRange) {
const target = this.pickSrv.curRangeDate[this.pickSrv.currentActiveInput === 'start' ? 0 : 1];
if (!target) {
return false;
}
curTime = new Date(target);
}
else {
if (!this.pickSrv.curDate) {
return false;
}
curTime = new Date(this.pickSrv.curDate);
}
if (!curTime) {
return false;
}
let flag = false;
let time;
let isTimeBoundary = false;
const maxTime = this.pickSrv.maxDate.getTime();
const minTime = this.pickSrv.minDate.getTime();
switch (type) {
case 'hour':
curTime.setHours(index);
curTime.setMinutes(this.minIndex);
time = curTime.setSeconds(this.secIndex);
isTimeBoundary = time > maxTime ? this.pickSrv.maxDate.getHours() === index : this.pickSrv.minDate.getHours() === index;
break;
case 'min':
curTime.setHours(this.hourIndex);
curTime.setMinutes(index);
time = curTime.setSeconds(this.secIndex);
isTimeBoundary = time > maxTime ? this.pickSrv.maxDate.getMinutes() === index : this.pickSrv.minDate.getMinutes() === index;
break;
case 'sec':
curTime.setHours(this.hourIndex);
curTime.setMinutes(this.minIndex);
time = curTime.setSeconds(index);
break;
default:
}
flag = time > maxTime || time < minTime;
return flag && !isTimeBoundary;
}
setAllScroll(first, second, third, justScroll) {
this.setScroll('first', first, justScroll);
this.setScroll('second', second, justScroll);
this.setScroll('third', third, justScroll);
}
setScroll(whichList, index, justScroll) {
const scroll = (22 + 8) * index;
const duration = justScroll ? 0 : 100;
if (this.el) {
this.scrollTo(this.el.nativeElement.querySelector(`.devui-${whichList}-list`), scroll, duration);
}
}
scrollTo(element, to, duration) {
if (typeof window === undefined || !element) {
return;
}
if (duration <= 0) {
element.scrollTop = to;
return;
}
const difference = to - element.scrollTop;
const perTick = (difference / duration) * 10;
const reqAnimFrame = window.requestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.msRequestAnimationFrame ||
window.oRequestAnimationFrame;
reqAnimFrame(() => {
element.scrollTop = element.scrollTop + perTick;
if (element.scrollTop === to) {
return;
}
this.scrollTo(element, to, duration - 10);
});
}
ngOnDestroy() {
this.unsubscribe$.next();
this.unsubscribe$.complete();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TimepickerPanelComponent, deps: [{ token: i0.ElementRef }, { token: i1.DatepickerProService }, { token: i2.I18nService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TimepickerPanelComponent, selector: "d-timepicker-panel", ngImport: i0, template: "<div class=\"devui-timepicker-panel\">\n <div class=\"devui-time-header\">\n <span class=\"devui-time-header-item\">{{ i18nText?.hour }}</span>\n <span class=\"devui-time-header-item\">{{ i18nText?.min }}</span>\n <span class=\"devui-time-header-item\">{{ i18nText?.second }}</span>\n </div>\n <div class=\"devui-time-picker\">\n <ul *ngIf=\"firstList.length\" class=\"devui-time-list devui-first-list\">\n <li\n *ngFor=\"let item of firstList; let i = index\"\n class=\"devui-time-item devui-first-item\"\n [ngClass]=\"{\n active: item?.active,\n disabled: itemIsDisabled('hour', i)\n }\"\n (click)=\"chooseTime(item.type, i, true)\"\n >\n {{ item?.time }}\n </li>\n </ul>\n <ul *ngIf=\"secondList.length\" class=\"devui-time-list devui-second-list\">\n <li\n *ngFor=\"let item of secondList; let i = index\"\n class=\"devui-time-item devui-second-item\"\n [ngClass]=\"{\n active: item?.active,\n disabled: itemIsDisabled('min', i)\n }\"\n (click)=\"chooseTime(item.type, i, true)\"\n >\n {{ item?.time }}\n </li>\n </ul>\n <ul *ngIf=\"thirdList.length\" class=\"devui-time-list devui-third-list\">\n <li\n *ngFor=\"let item of thirdList; let i = index\"\n class=\"devui-time-item devui-third-item\"\n [ngClass]=\"{\n active: item?.active,\n disabled: itemIsDisabled('sec', i)\n }\"\n (click)=\"chooseTime(item.type, i, true)\"\n >\n {{ item?.time }}\n </li>\n </ul>\n </div>\n</div>\n", styles: [":host{display:inline-block;vertical-align:top;font-size:12px}.devui-timepicker-panel{width:115px;height:306px;text-align:center;border-left:1px solid var(--devui-dividing-line, #f0f0f0)}.devui-timepicker-panel .devui-time-header{display:flex;height:30px;padding:0 12px}.devui-timepicker-panel .devui-time-header-item{flex:1;line-height:30px;margin-right:12px}.devui-timepicker-panel .devui-time-header-item:last-child{margin-right:0}.devui-timepicker-panel .devui-time-picker{display:flex;height:276px;width:114px;padding:0 12px;overflow:hidden;border-radius:var(--devui-border-radius, 2px) var(--devui-border-radius, 2px) 0 0}.devui-timepicker-panel .devui-time-picker .devui-time-list{flex:1;overflow:hidden;scroll-behavior:auto;padding-right:6px;scrollbar-gutter:stable}.devui-timepicker-panel .devui-time-picker .devui-time-list:last-child{padding-right:0}.devui-timepicker-panel .devui-time-picker .devui-time-list::-webkit-scrollbar{width:4px}.devui-timepicker-panel .devui-time-picker .devui-time-list:hover{overflow-y:scroll}.devui-timepicker-panel .devui-time-picker .devui-time-list .devui-time-item{width:100%;height:22px;line-height:22px;text-align:center;cursor:pointer}.devui-timepicker-panel .devui-time-picker .devui-time-list .devui-time-item:not(:last-child){margin-bottom:8px}.devui-timepicker-panel .devui-time-picker .devui-time-list .devui-time-item:last-child{margin-bottom:254px}.devui-timepicker-panel .devui-time-picker .devui-time-list .devui-time-item.disabled{cursor:not-allowed}.devui-timepicker-panel .devui-time-picker:not(.devui-disabled) .devui-time-list .devui-time-item:hover{color:var(--devui-list-item-hover-text, #000000);background-color:var(--devui-list-item-hover-bg, #f2f2f3);border-radius:var(--devui-border-radius-feedback, 4px)}.devui-timepicker-panel .devui-time-picker:not(.devui-disabled) .devui-time-list .devui-time-item.active{color:var(--devui-list-item-active-text, #000000);background-color:var(--devui-list-item-active-bg, #cedefd);border-radius:var(--devui-border-radius-feedback, 4px)}.devui-timepicker-panel .devui-time-picker:not(.devui-disabled) .devui-time-list .devui-time-item.disabled{color:var(--devui-disabled-text, #c2c2c2);background-color:var(--devui-disabled-bg, #f3f3f3);border-radius:var(--devui-border-radius-feedback, 4px)}\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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TimepickerPanelComponent, decorators: [{
type: Component,
args: [{ selector: 'd-timepicker-panel', preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"devui-timepicker-panel\">\n <div class=\"devui-time-header\">\n <span class=\"devui-time-header-item\">{{ i18nText?.hour }}</span>\n <span class=\"devui-time-header-item\">{{ i18nText?.min }}</span>\n <span class=\"devui-time-header-item\">{{ i18nText?.second }}</span>\n </div>\n <div class=\"devui-time-picker\">\n <ul *ngIf=\"firstList.length\" class=\"devui-time-list devui-first-list\">\n <li\n *ngFor=\"let item of firstList; let i = index\"\n class=\"devui-time-item devui-first-item\"\n [ngClass]=\"{\n active: item?.active,\n disabled: itemIsDisabled('hour', i)\n }\"\n (click)=\"chooseTime(item.type, i, true)\"\n >\n {{ item?.time }}\n </li>\n </ul>\n <ul *ngIf=\"secondList.length\" class=\"devui-time-list devui-second-list\">\n <li\n *ngFor=\"let item of secondList; let i = index\"\n class=\"devui-time-item devui-second-item\"\n [ngClass]=\"{\n active: item?.active,\n disabled: itemIsDisabled('min', i)\n }\"\n (click)=\"chooseTime(item.type, i, true)\"\n >\n {{ item?.time }}\n </li>\n </ul>\n <ul *ngIf=\"thirdList.length\" class=\"devui-time-list devui-third-list\">\n <li\n *ngFor=\"let item of thirdList; let i = index\"\n class=\"devui-time-item devui-third-item\"\n [ngClass]=\"{\n active: item?.active,\n disabled: itemIsDisabled('sec', i)\n }\"\n (click)=\"chooseTime(item.type, i, true)\"\n >\n {{ item?.time }}\n </li>\n </ul>\n </div>\n</div>\n", styles: [":host{display:inline-block;vertical-align:top;font-size:12px}.devui-timepicker-panel{width:115px;height:306px;text-align:center;border-left:1px solid var(--devui-dividing-line, #f0f0f0)}.devui-timepicker-panel .devui-time-header{display:flex;height:30px;padding:0 12px}.devui-timepicker-panel .devui-time-header-item{flex:1;line-height:30px;margin-right:12px}.devui-timepicker-panel .devui-time-header-item:last-child{margin-right:0}.devui-timepicker-panel .devui-time-picker{display:flex;height:276px;width:114px;padding:0 12px;overflow:hidden;border-radius:var(--devui-border-radius, 2px) var(--devui-border-radius, 2px) 0 0}.devui-timepicker-panel .devui-time-picker .devui-time-list{flex:1;overflow:hidden;scroll-behavior:auto;padding-right:6px;scrollbar-gutter:stable}.devui-timepicker-panel .devui-time-picker .devui-time-list:last-child{padding-right:0}.devui-timepicker-panel .devui-time-picker .devui-time-list::-webkit-scrollbar{width:4px}.devui-timepicker-panel .devui-time-picker .devui-time-list:hover{overflow-y:scroll}.devui-timepicker-panel .devui-time-picker .devui-time-list .devui-time-item{width:100%;height:22px;line-height:22px;text-align:center;cursor:pointer}.devui-timepicker-panel .devui-time-picker .devui-time-list .devui-time-item:not(:last-child){margin-bottom:8px}.devui-timepicker-panel .devui-time-picker .devui-time-list .devui-time-item:last-child{margin-bottom:254px}.devui-timepicker-panel .devui-time-picker .devui-time-list .devui-time-item.disabled{cursor:not-allowed}.devui-timepicker-panel .devui-time-picker:not(.devui-disabled) .devui-time-list .devui-time-item:hover{color:var(--devui-list-item-hover-text, #000000);background-color:var(--devui-list-item-hover-bg, #f2f2f3);border-radius:var(--devui-border-radius-feedback, 4px)}.devui-timepicker-panel .devui-time-picker:not(.devui-disabled) .devui-time-list .devui-time-item.active{color:var(--devui-list-item-active-text, #000000);background-color:var(--devui-list-item-active-bg, #cedefd);border-radius:var(--devui-border-radius-feedback, 4px)}.devui-timepicker-panel .devui-time-picker:not(.devui-disabled) .devui-time-list .devui-time-item.disabled{color:var(--devui-disabled-text, #c2c2c2);background-color:var(--devui-disabled-bg, #f3f3f3);border-radius:var(--devui-border-radius-feedback, 4px)}\n"] }]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.DatepickerProService }, { type: i2.I18nService }, { type: i0.ChangeDetectorRef }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9kZXZ1aS9kYXRlcGlja2VyLXByby9saWIvdGltZXBpY2tlci1wYW5lbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9kZXZ1aS9kYXRlcGlja2VyLXByby9saWIvdGltZXBpY2tlci1wYW5lbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDckgsT0FBTyxFQUFpQixXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7OztBQWdCakUsTUFBTSxPQUFPLHdCQUF3QjtJQWVuQyxZQUFvQixFQUFjLEVBQVUsT0FBNkIsRUFBWSxJQUFpQixFQUFVLEdBQXNCO1FBQWxILE9BQUUsR0FBRixFQUFFLENBQVk7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFzQjtRQUFZLFNBQUksR0FBSixJQUFJLENBQWE7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQWR0SSxjQUFTLEdBQW1CLEVBQUUsQ0FBQztRQUMvQixlQUFVLEdBQW1CLEVBQUUsQ0FBQztRQUNoQyxjQUFTLEdBQW1CLEVBQUUsQ0FBQztRQUUvQixjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUNiLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFFYixhQUFRLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWxDLGlCQUFZLEdBQUcs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QUM7UUFDRCxJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNsQixPQUFPLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUN2QixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQzFDLE1BQU0sT0FBTyxHQUFHLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM3QyxNQUFNLFlBQVksR0FDZixNQUFjLENBQUMscUJBQXFCO1lBQ3BDLE1BQWMsQ0FBQyx3QkFBd0I7WUFDdkMsTUFBYyxDQUFDLHVCQUF1QjtZQUN0QyxNQUFjLENBQUMsc0JBQXNCLENBQUM7UUFDekMsWUFBWSxDQUFDLEdBQUcsRUFBRTtZQUNoQixPQUFPLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO1lBQ2hELElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDN0IsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDL0IsQ0FBQzsrR0FqU1Usd0JBQXdCO21HQUF4Qix3QkFBd0IsMERDcEJyQyw0bURBZ0RBOzs0RkQ1QmEsd0JBQXdCO2tCQVBwQyxTQUFTOytCQUNFLG9CQUFvQix1QkFHVCxLQUFLLG1CQUNULHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSTE4bkludGVyZmFjZSwgSTE4blNlcnZpY2UgfSBmcm9tICduZy1kZXZ1aS9pMThuJztcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRGF0ZXBpY2tlclByb1NlcnZpY2UgfSBmcm9tICcuLi9kYXRlcGlja2VyLXByby5zZXJ2aWNlJztcclxuXHJcbmludGVyZmFjZSBUaW1lT2JqIHtcclxuICB0aW1lOiBzdHJpbmc7XHJcbiAgdHlwZT86IHN0cmluZztcclxuICBhY3RpdmU/OiBib29sZWFuO1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkLXRpbWVwaWNrZXItcGFuZWwnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90aW1lcGlja2VyLXBhbmVsLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90aW1lcGlja2VyLXBhbmVsLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUaW1lcGlja2VyUGFuZWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgZmlyc3RMaXN0OiBBcnJheTxUaW1lT2JqPiA9IFtdO1xyXG4gIHNlY29uZExpc3Q6IEFycmF5PFRpbWVPYmo+ID0gW107XHJcbiAgdGhpcmRMaXN0OiBBcnJheTxUaW1lT2JqPiA9IFtdO1xyXG5cclxuICBob3VySW5kZXggPSAwO1xyXG4gIG1pbkluZGV4ID0gMDtcclxuICBzZWNJbmRleCA9IDA7XHJcblxyXG4gIHR5cGVMaXN0ID0gWydob3VyJywgJ21pbicsICdzZWMnXTtcclxuXHJcbiAgdW5zdWJzY3JpYmUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBpMThuVGV4dDogSTE4bkludGVyZmFjZVsnZGF0ZVBpY2tlclBybyddO1xyXG4gIGkxOG5TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSBwaWNrU3J2OiBEYXRlcGlja2VyUHJvU2VydmljZSwgcHJvdGVjdGVkIGkxOG46IEkxOG5TZXJ2aWNlLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbml0RGF0ZUxpc3QoKTtcclxuICAgIHRoaXMuaW5pdE9ic2VydmFibGUoKTtcclxuICAgIHRoaXMuc2V0STE4blRleHQoKTtcclxuICB9XHJcblxyXG4gIHNldEkxOG5UZXh0KCkge1xyXG4gICAgdGhpcy5pMThuVGV4dCA9IHRoaXMuaTE4bi5nZXRJMThuVGV4dCgpLmRhdGVQaWNrZXJQcm87XHJcbiAgICB0aGlzLmkxOG5TdWJzY3JpcHRpb24gPSB0aGlzLmkxOG4ubGFuZ0NoYW5nZSgpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLmkxOG5UZXh0ID0gZGF0YS5kYXRlUGlja2VyUHJvO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpbml0T2JzZXJ2YWJsZSgpIHtcclxuICAgIHRoaXMucGlja1Nydi50b2dnbGVFdmVudC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoaXNPcGVuKSA9PiB7XHJcbiAgICAgIGlmIChpc09wZW4pIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuaW5pdERhdGVMaXN0KHRydWUpO1xyXG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnBpY2tTcnYudXBkYXRlVGltZUNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgaWYgKHRoaXMuaG91ckluZGV4ICE9PSB2YWx1ZS5ob3VyKSB7XHJcbiAgICAgICAgdGhpcy5jaG9vc2VUaW1lKCdob3VyJywgdmFsdWUuaG91cik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLm1pbkluZGV4ICE9PSB2YWx1ZS5taW4pIHtcclxuICAgICAgICB0aGlzLmNob29zZVRpbWUoJ21pbicsIHZhbHVlLm1pbik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnNlY0luZGV4ICE9PSB2YWx1ZS5zZWNvbmRzKSB7XHJcbiAgICAgICAgdGhpcy5jaG9vc2VUaW1lKCdzZWMnLCB2YWx1ZS5zZWNvbmRzKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5waWNrU3J2LmlzUmFuZ2UpIHtcclxuICAgICAgdGhpcy5waWNrU3J2LmFjdGl2ZUlucHV0Q2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKCh0eXBlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaXNOdWxsID0gKHR5cGUgPT09ICdzdGFydCcgJiYgIXRoaXMucGlja1Nydi5jdXJSYW5nZURhdGVbMF0pIHx8ICh0eXBlID09PSAnZW5kJyAmJiAhdGhpcy5waWNrU3J2LmN1clJhbmdlRGF0ZVsxXSk7XHJcbiAgICAgICAgaWYgKHRoaXMuaG91ckluZGV4ICE9PSB0aGlzLnBpY2tTcnYuY3VySG91ciB8fCBpc051bGwpIHtcclxuICAgICAgICAgIHRoaXMuY2hvb3NlVGltZSgnaG91cicsIGlzTnVsbCA/IG51bGwgOiB0aGlzLnBpY2tTcnYuY3VySG91cik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5taW5JbmRleCAhPT0gdGhpcy5waWNrU3J2LmN1ck1pbiB8fCBpc051bGwpIHtcclxuICAgICAgICAgIHRoaXMuY2hvb3NlVGltZSgnbWluJywgaXNOdWxsID8gbnVsbCA6IHRoaXMucGlja1Nydi5jdXJNaW4pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VjSW5kZXggIT09IHRoaXMucGlja1Nydi5jdXJTZWMgfHwgaXNOdWxsKSB7XHJcbiAgICAgICAgICB0aGlzLmNob29zZVRpbWUoJ3NlYycsIGlzTnVsbCA/IG51bGwgOiB0aGlzLnBpY2tTcnYuY3VyU2VjKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucGlja1Nydi5zZWxlY3RlZERhdGVDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICBjb25zdCBpc0ZpeFRpbWUgPSB0aGlzLmZpeFRpbWUoKTtcclxuXHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgIGlmIChpc0ZpeFRpbWUpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMucGlja1Nydi5zZWxlY3RlZFRpbWVDaGFuZ2UubmV4dCh7XHJcbiAgICAgICAgICAgIGFjdGl2ZUlucHV0OiB0aGlzLnBpY2tTcnYuY3VycmVudEFjdGl2ZUlucHV0LFxyXG4gICAgICAgICAgICBob3VyOiB0aGlzLmhvdXJJbmRleCxcclxuICAgICAgICAgICAgbWluOiB0aGlzLm1pbkluZGV4LFxyXG4gICAgICAgICAgICBzZWNvbmRzOiB0aGlzLnNlY0luZGV4LFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5pdERhdGVMaXN0KGp1c3RTY3JvbGwgPSBmYWxzZSkge1xyXG4gICAgaWYgKHRoaXMucGlja1Nydi5jdXJEYXRlKSB7XHJcbiAgICAgIHRoaXMuaG91ckluZGV4ID0gdGhpcy5waWNrU3J2LmN1ckRhdGUuZ2V0SG91cnMoKTtcclxuICAgICAgdGhpcy5taW5JbmRleCA9IHRoaXMucGlja1Nydi5jdXJEYXRlLmdldE1pbnV0ZXMoKTtcclxuICAgICAgdGhpcy5zZWNJbmRleCA9IHRoaXMucGlja1Nydi5jdXJEYXRlLmdldFNlY29uZHMoKTtcclxuICAgIH1cclxuICAgIHRoaXMudHlwZUxpc3QuZm9yRWFjaCgodHlwZSkgPT4ge1xyXG4gICAgICB0aGlzLmNob29zZVRpbWUodHlwZSwgdGhpc1tgJHt0eXBlfUluZGV4YF0sIGZhbHNlLCBqdXN0U2Nyb2xsKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2hvb3NlVGltZSh0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIGhhbmRsZSA9IGZhbHNlLCBqdXN0U2Nyb2xsID0gZmFsc2UpIHtcclxuICAgIGlmICh0aGlzLml0ZW1Jc0Rpc2FibGVkKHR5cGUsIGluZGV4KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgZml4ZWQ6IGJvb2xlYW47XHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgIGNhc2UgJ2hvdXInOlxyXG4gICAgICB0aGlzLmhvdXJJbmRleCA9IGluZGV4O1xyXG4gICAgICBmaXhlZCA9IHRoaXMuZml4VGltZShqdXN0U2Nyb2xsKTtcclxuICAgICAgdGhpcy5maXJzdExpc3QgPSBuZXcgQXJyYXkoMjQpLmZpbGwoMSkubWFwKCh0LCBpKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHRpbWU6IGkgPCAxMCA/IGAwJHtpfWAgOiBTdHJpbmcoaSksXHJcbiAgICAgICAgICB0eXBlOiAnaG91cicsXHJcbiAgICAgICAgICBhY3RpdmU6IHRoaXMuaG91ckluZGV4ID09PSBpLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoIWZpeGVkKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTY3JvbGwoJ2ZpcnN0JywgdGhpcy5ob3VySW5kZXgsIGp1c3RTY3JvbGwpO1xyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAnbWluJzpcclxuICAgICAgdGhpcy5taW5JbmRleCA9IGluZGV4O1xyXG4gICAgICB0aGlzLmZpeFRpbWUoanVzdFNjcm9sbCk7XHJcbiAgICAgIHRoaXMuc2Vjb25kTGlzdCA9IG5ldyBBcnJheSg2MCkuZmlsbCgxKS5tYXAoKHQsIGkpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgdGltZTogaSA8IDEwID8gYDAke2l9YCA6IFN0cmluZyhpKSxcclxuICAgICAgICAgIHR5cGU6ICdtaW4nLFxyXG4gICAgICAgICAgYWN0aXZlOiB0aGlzLm1pbkluZGV4ID09PSBpLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoIWZpeGVkKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTY3JvbGwoJ3NlY29uZCcsIHRoaXMubWluSW5kZXgsIGp1c3RTY3JvbGwpO1xyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAnc2VjJzpcclxuICAgICAgdGhpcy5zZWNJbmRleCA9IGluZGV4O1xyXG4gICAgICB0aGlzLnRoaXJkTGlzdCA9IG5ldyBBcnJheSg2MCkuZmlsbCgxKS5tYXAoKHQsIGkpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgdGltZTogaSA8IDEwID8gYDAke2l9YCA6IFN0cmluZyhpKSxcclxuICAgICAgICAgIHR5cGU6ICdzZWMnLFxyXG4gICAgICAgICAgYWN0aXZlOiB0aGlzLnNlY0luZGV4ID09PSBpLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnNldFNjcm9sbCgndGhpcmQnLCB0aGlzLnNlY0luZGV4LCBqdXN0U2Nyb2xsKTtcclxuICAgICAgYnJlYWs7XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICBpZiAoaGFuZGxlKSB7XHJcbiAgICAgIHRoaXMucGlja1Nydi5zZWxlY3RlZFRpbWVDaGFuZ2UubmV4dCh7XHJcbiAgICAgICAgYWN0aXZlSW5wdXQ6IHRoaXMucGlja1Nydi5jdXJyZW50QWN0aXZlSW5wdXQsXHJcbiAgICAgICAgaG91cjogdGhpcy5ob3VySW5kZXgsXHJcbiAgICAgICAgbWluOiB0aGlzLm1pbkluZGV4LFxyXG4gICAgICAgIHNlY29uZHM6IHRoaXMuc2VjSW5kZXgsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZml4VGltZShqdXN0U2Nyb2xsID0gZmFsc2UpIHtcclxuICAgIGxldCBjdXJUaW1lOiBEYXRlO1xyXG5cclxuICAgIGlmICh0aGlzLnBpY2tTcnYuaXNSYW5nZSkge1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnBpY2tTcnYuY3VyUmFuZ2VEYXRlW3RoaXMucGlja1Nydi5jdXJyZW50QWN0aXZlSW5wdXQgPT09ICdzdGFydCcgPyAwIDogMV07XHJcbiAgICAgIGlmICghdGFyZ2V0KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGN1clRpbWUgPSBuZXcgRGF0ZSh0YXJnZXQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCF0aGlzLnBpY2tTcnYuY3VyRGF0ZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjdXJUaW1lID0gbmV3IERhdGUodGhpcy5waWNrU3J2LmN1ckRhdGUpO1xyXG4gICAgfVxyXG4gICAgY3VyVGltZS5zZXRIb3Vycyh0aGlzLmhvdXJJbmRleCk7XHJcbiAgICBjdXJUaW1lLnNldE1pbnV0ZXModGhpcy5taW5JbmRleCk7XHJcbiAgICBjdXJUaW1lLnNldFNlY29uZHModGhpcy5zZWNJbmRleCk7XHJcblxyXG4gICAgbGV0IGlzRml4VGltZSA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChjdXJUaW1lLmdldFRpbWUoKSA8IHRoaXMucGlja1Nydi5taW5EYXRlLmdldFRpbWUoKSkge1xyXG4gICAgICB0aGlzLnBpY2tTcnYuY3VyRGF0ZSA9IHRoaXMucGlja1Nydi5taW5EYXRlO1xyXG4gICAgICBpc0ZpeFRpbWUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjdXJUaW1lLmdldFRpbWUoKSA+IHRoaXMucGlja1Nydi5tYXhEYXRlLmdldFRpbWUoKSkge1xyXG4gICAgICB0aGlzLnBpY2tTcnYuY3VyRGF0ZSA9IHRoaXMucGlja1Nydi5tYXhEYXRlO1xyXG4gICAgICBpc0ZpeFRpbWUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc0ZpeFRpbWUpIHtcclxuICAgICAgdGhpcy5pbml0RGF0ZUxpc3QoanVzdFNjcm9sbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzRml4VGltZTtcclxuICB9XHJcblxyXG4gIGl0ZW1Jc0Rpc2FibGVkKHR5cGUsIGluZGV4KSB7XHJcbiAgICBsZXQgY3VyVGltZTogRGF0ZTtcclxuICAgIGlmICh0aGlzLnBpY2tTcnYuaXNSYW5nZSkge1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnBpY2tTcnYuY3VyUmFuZ2VEYXRlW3RoaXMucGlja1Nydi5jdXJyZW50QWN0aXZlSW5wdXQgPT09ICdzdGFydCcgPyAwIDogMV07XHJcbiAgICAgIGlmICghdGFyZ2V0KSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGN1clRpbWUgPSBuZXcgRGF0ZSh0YXJnZXQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCF0aGlzLnBpY2tTcnYuY3VyRGF0ZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBjdXJUaW1lID0gbmV3IERhdGUodGhpcy5waWNrU3J2LmN1ckRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghY3VyVGltZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGZsYWcgPSBmYWxzZTtcclxuICAgIGxldCB0aW1lO1xyXG4gICAgbGV0IGlzVGltZUJvdW5kYXJ5ID0gZmFsc2U7XHJcbiAgICBjb25zdCBtYXhUaW1lID0gdGhpcy5waWNrU3J2Lm1heERhdGUuZ2V0VGltZSgpO1xyXG4gICAgY29uc3QgbWluVGltZSA9IHRoaXMucGlja1Nydi5taW5EYXRlLmdldFRpbWUoKTtcclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgY2FzZSAnaG91cic6XHJcbiAgICAgIGN1clRpbWUuc2V0SG91cnMoaW5kZXgpO1xyXG4gICAgICBjdXJUaW1lLnNldE1pbnV0ZXModGhpcy5taW5JbmRleCk7XHJcbiAgICAgIHRpbWUgPSBjdXJUaW1lLnNldFNlY29uZHModGhpcy5zZWNJbmRleCk7XHJcbiAgICAgIGlzVGltZUJvdW5kYXJ5ID0gdGltZSA+IG1heFRpbWUgPyB0aGlzLnBpY2tTcnYubWF4RGF0ZS5nZXRIb3VycygpID09PSBpbmRleCA6IHRoaXMucGlja1Nydi5taW5EYXRlLmdldEhvdXJzKCkgPT09IGluZGV4O1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgJ21pbic6XHJcbiAgICAgIGN1clRpbWUuc2V0SG91cnModGhpcy5ob3VySW5kZXgpO1xyXG4gICAgICBjdXJUaW1lLnNldE1pbnV0ZXMoaW5kZXgpO1xyXG4gICAgICB0aW1lID0gY3VyVGltZS5zZXRTZWNvbmRzKHRoaXMuc2VjSW5kZXgpO1xyXG4gICAgICBpc1RpbWVCb3VuZGFyeSA9IHRpbWUgPiBtYXhUaW1lID8gdGhpcy5waWNrU3J2Lm1heERhdGUuZ2V0TWludXRlcygpID09PSBpbmRleCA6IHRoaXMucGlja1Nydi5taW5EYXRlLmdldE1pbnV0ZXMoKSA9PT0gaW5kZXg7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAnc2VjJzpcclxuICAgICAgY3VyVGltZS5zZXRIb3Vycyh0aGlzLmhvdXJJbmRleCk7XHJcbiAgICAgIGN1clRpbWUuc2V0TWludXRlcyh0aGlzLm1pbkluZGV4KTtcclxuICAgICAgdGltZSA9IGN1clRpbWUuc2V0U2Vjb25kcyhpbmRleCk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgZGVmYXVsdDpcclxuICAgIH1cclxuICAgIGZsYWcgPSB0aW1lID4gbWF4VGltZSB8fCB0aW1lIDwgbWluVGltZTtcclxuXHJcbiAgICByZXR1cm4gZmxhZyAmJiAhaXNUaW1lQm91bmRhcnk7XHJcbiAgfVxyXG5cclxuICBzZXRBbGxTY3JvbGwoZmlyc3Q6IG51bWJlciwgc2Vjb25kOiBudW1iZXIsIHRoaXJkOiBudW1iZXIsIGp1c3RTY3JvbGw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuc2V0U2Nyb2xsKCdmaXJzdCcsIGZpcnN0LCBqdXN0U2Nyb2xsKTtcclxuICAgIHRoaXMuc2V0U2Nyb2xsKCdzZWNvbmQnLCBzZWNvbmQsIGp1c3RTY3JvbGwpO1xyXG4gICAgdGhpcy5zZXRTY3JvbGwoJ3RoaXJkJywgdGhpcmQsIGp1c3RTY3JvbGwpO1xyXG4gIH1cclxuXHJcbiAgc2V0U2Nyb2xsKHdoaWNoTGlzdCwgaW5kZXgsIGp1c3RTY3JvbGw/KSB7XHJcbiAgICBjb25zdCBzY3JvbGwgPSAoMjIgKyA4KSAqIGluZGV4O1xyXG4gICAgY29uc3QgZHVyYXRpb24gPSBqdXN0U2Nyb2xsID8gMCA6IDEwMDtcclxuICAgIGlmICh0aGlzLmVsKSB7XHJcbiAgICAgIHRoaXMuc2Nyb2xsVG8odGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYC5kZXZ1aS0ke3doaWNoTGlzdH0tbGlzdGApLCBzY3JvbGwsIGR1cmF0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNjcm9sbFRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0bzogbnVtYmVyLCBkdXJhdGlvbjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gdW5kZWZpbmVkIHx8ICFlbGVtZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChkdXJhdGlvbiA8PSAwKSB7XHJcbiAgICAgIGVsZW1lbnQuc2Nyb2xsVG9wID0gdG87XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGRpZmZlcmVuY2UgPSB0byAtIGVsZW1lbnQuc2Nyb2xsVG9wO1xyXG4gICAgY29uc3QgcGVyVGljayA9IChkaWZmZXJlbmNlIC8gZHVyYXRpb24pICogMTA7XHJcbiAgICBjb25zdCByZXFBbmltRnJhbWUgPVxyXG4gICAgICAod2luZG93IGFzIGFueSkucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XHJcbiAgICAgICh3aW5kb3cgYXMgYW55KS5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcclxuICAgICAgKHdpbmRvdyBhcyBhbnkpLm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XHJcbiAgICAgICh3aW5kb3cgYXMgYW55KS5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xyXG4gICAgcmVxQW5pbUZyYW1lKCgpID0+IHtcclxuICAgICAgZWxlbWVudC5zY3JvbGxUb3AgPSBlbGVtZW50LnNjcm9sbFRvcCArIHBlclRpY2s7XHJcbiAgICAgIGlmIChlbGVtZW50LnNjcm9sbFRvcCA9PT0gdG8pIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zY3JvbGxUbyhlbGVtZW50LCB0bywgZHVyYXRpb24gLSAxMCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy51bnN1YnNjcmliZSQubmV4dCgpO1xyXG4gICAgdGhpcy51bnN1YnNjcmliZSQuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImRldnVpLXRpbWVwaWNrZXItcGFuZWxcIj5cbiAgPGRpdiBjbGFzcz1cImRldnVpLXRpbWUtaGVhZGVyXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJkZXZ1aS10aW1lLWhlYWRlci1pdGVtXCI+e3sgaTE4blRleHQ/LmhvdXIgfX08L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJkZXZ1aS10aW1lLWhlYWRlci1pdGVtXCI+e3sgaTE4blRleHQ/Lm1pbiB9fTwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cImRldnVpLXRpbWUtaGVhZGVyLWl0ZW1cIj57eyBpMThuVGV4dD8uc2Vjb25kIH19PC9zcGFuPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImRldnVpLXRpbWUtcGlja2VyXCI+XG4gICAgPHVsICpuZ0lmPVwiZmlyc3RMaXN0Lmxlbmd0aFwiIGNsYXNzPVwiZGV2dWktdGltZS1saXN0IGRldnVpLWZpcnN0LWxpc3RcIj5cbiAgICAgIDxsaVxuICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaXJzdExpc3Q7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICBjbGFzcz1cImRldnVpLXRpbWUtaXRlbSBkZXZ1aS1maXJzdC1pdGVtXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgIGFjdGl2ZTogaXRlbT8uYWN0aXZlLFxuICAgICAgICAgIGRpc2FibGVkOiBpdGVtSXNEaXNhYmxlZCgnaG91cicsIGkpXG4gICAgICAgIH1cIlxuICAgICAgICAoY2xpY2spPVwiY2hvb3NlVGltZShpdGVtLnR5cGUsIGksIHRydWUpXCJcbiAgICAgID5cbiAgICAgICAge3sgaXRlbT8udGltZSB9fVxuICAgICAgPC9saT5cbiAgICA8L3VsPlxuICAgIDx1bCAqbmdJZj1cInNlY29uZExpc3QubGVuZ3RoXCIgY2xhc3M9XCJkZXZ1aS10aW1lLWxpc3QgZGV2dWktc2Vjb25kLWxpc3RcIj5cbiAgICAgIDxsaVxuICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzZWNvbmRMaXN0OyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgY2xhc3M9XCJkZXZ1aS10aW1lLWl0ZW0gZGV2dWktc2Vjb25kLWl0ZW1cIlxuICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgYWN0aXZlOiBpdGVtPy5hY3RpdmUsXG4gICAgICAgICAgZGlzYWJsZWQ6IGl0ZW1Jc0Rpc2FibGVkKCdtaW4nLCBpKVxuICAgICAgICB9XCJcbiAgICAgICAgKGNsaWNrKT1cImNob29zZVRpbWUoaXRlbS50eXBlLCBpLCB0cnVlKVwiXG4gICAgICA+XG4gICAgICAgIHt7IGl0ZW0/LnRpbWUgfX1cbiAgICAgIDwvbGk+XG4gICAgPC91bD5cbiAgICA8dWwgKm5nSWY9XCJ0aGlyZExpc3QubGVuZ3RoXCIgY2xhc3M9XCJkZXZ1aS10aW1lLWxpc3QgZGV2dWktdGhpcmQtbGlzdFwiPlxuICAgICAgPGxpXG4gICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHRoaXJkTGlzdDsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgIGNsYXNzPVwiZGV2dWktdGltZS1pdGVtIGRldnVpLXRoaXJkLWl0ZW1cIlxuICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgYWN0aXZlOiBpdGVtPy5hY3RpdmUsXG4gICAgICAgICAgZGlzYWJsZWQ6IGl0ZW1Jc0Rpc2FibGVkKCdzZWMnLCBpKVxuICAgICAgICB9XCJcbiAgICAgICAgKGNsaWNrKT1cImNob29zZVRpbWUoaXRlbS50eXBlLCBpLCB0cnVlKVwiXG4gICAgICA+XG4gICAgICAgIHt7IGl0ZW0/LnRpbWUgfX1cbiAgICAgIDwvbGk+XG4gICAgPC91bD5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==