@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
587 lines • 46 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: datepicker-cdk-overlay.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { Component, forwardRef, Input, TemplateRef, Output, EventEmitter, ElementRef, ViewContainerRef, Renderer2, HostListener } from '@angular/core';
import { CdkOverlayOrigin } from '@angular/cdk/overlay';
import { AppendToBodyDirectionsConfig } from '@duoduo-oba/ng-devui/utils';
import { SelectDateChangeReason } from './date-change-event-args.model';
import { DatePickerConfigService as DatePickerConfig } from './date-picker.config.service';
import { I18nService } from '@duoduo-oba/ng-devui/i18n';
import { DefaultDateConverter } from '@duoduo-oba/ng-devui/utils';
import { cornerFadeInOut } from '@duoduo-oba/ng-devui/utils';
import { fromEvent } from 'rxjs';
import { debounceTime } from 'rxjs/operators';
var DatePickerAppendToBodyComponent = /** @class */ (function () {
function DatePickerAppendToBodyComponent(elementRef, viewContainerRef, renderer2, datePickerConfig, i18n) {
var _this = this;
this.elementRef = elementRef;
this.viewContainerRef = viewContainerRef;
this.renderer2 = renderer2;
this.datePickerConfig = datePickerConfig;
this.i18n = i18n;
this.yearNumber = 12;
this.autoOpen = false;
this.selectedDateChange = new EventEmitter();
this.isOpen = false;
this.datepickerPosition = 'bottom';
this.clickShow = false;
this.appendToBodyDirections = [
'rightDown', 'leftDown', 'rightUp', 'leftUp'
];
this.onChange = (/**
* @param {?} _
* @return {?}
*/
function (_) { return null; });
this.onTouched = (/**
* @return {?}
*/
function () { return null; });
this.clearAll = (/**
* @return {?}
*/
function () {
_this.writeValue(null);
});
this._dateConfig = datePickerConfig['dateConfig'];
this.dateConverter = datePickerConfig['dateConfig'].dateConverter || new DefaultDateConverter();
this.inputSub = fromEvent(this.elementRef.nativeElement, 'input')
.pipe(debounceTime(300)).subscribe((/**
* @param {?} event
* @return {?}
*/
function (event) {
_this.transUserInputToDatepicker(event);
}));
}
Object.defineProperty(DatePickerAppendToBodyComponent.prototype, "dateConfig", {
get: /**
* @return {?}
*/
function () {
return this._dateConfig;
},
set: /**
* @param {?} dateConfig
* @return {?}
*/
function (dateConfig) {
if (dateConfig) {
this._dateConfig = dateConfig;
this._dateFormat = this.showTime ? dateConfig.format.time : dateConfig.format.date;
}
else {
this._dateConfig = this.datePickerConfig.dateConfig;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatePickerAppendToBodyComponent.prototype, "dateFormat", {
get: /**
* @return {?}
*/
function () {
return this._dateFormat;
},
set: /**
* @param {?} dateFormat
* @return {?}
*/
function (dateFormat) {
if (this._dateFormat !== dateFormat) {
this._dateFormat = dateFormat;
this.writeModelValue({ selectedDate: this.selectedDate, reason: SelectDateChangeReason.format });
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatePickerAppendToBodyComponent.prototype, "maxDate", {
get: /**
* @return {?}
*/
function () {
return this._maxDate;
},
set: /**
* @param {?} date
* @return {?}
*/
function (date) {
/** @type {?} */
var parseDate = this.dateConverter.parse(date, this.dateFormat, this.locale || this.i18nLocale);
if (parseDate) {
this._maxDate = parseDate;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatePickerAppendToBodyComponent.prototype, "minDate", {
get: /**
* @return {?}
*/
function () {
return this._minDate;
},
set: /**
* @param {?} date
* @return {?}
*/
function (date) {
/** @type {?} */
var parseDate = this.dateConverter.parse(date, this.dateFormat, this.locale || this.i18nLocale);
if (parseDate) {
this._minDate = parseDate;
}
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
DatePickerAppendToBodyComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.showTime = this.showTime || this.dateConfig.timePicker;
this._minDate = this.minDate ? new Date(this.minDate) : new Date(this.dateConfig.min, 0, 1, 0, 0, 0);
this._maxDate = this.maxDate ? new Date(this.maxDate) : new Date(this.dateConfig.max, 11, 31, 23, 59, 59);
this.setPositions();
this.setI18nText();
this.updateCdkConnectedOverlayOrigin();
if (this.autoOpen) {
this.isOpen = true;
}
};
/**
* @param {?} changes
* @return {?}
*/
DatePickerAppendToBodyComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes['appendToBodyDirections']) {
this.setPositions();
}
};
/**
* @param {?} fn
* @return {?}
*/
DatePickerAppendToBodyComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChange = fn;
};
/**
* @param {?} fn
* @return {?}
*/
DatePickerAppendToBodyComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/**
* @param {?} obj
* @return {?}
*/
DatePickerAppendToBodyComponent.prototype.writeValue = /**
* @param {?} obj
* @return {?}
*/
function (obj) {
this.selectedDate = obj ?
this.dateConverter.parse(obj, this.dateFormat, this.locale || this.i18nLocale) : null;
/** @type {?} */
var value = this.selectedDate ? this.dateConverter.format(this.selectedDate, this.dateFormat, this.locale || this.i18nLocale) : '';
this.renderer2.setProperty(this.elementRef.nativeElement, 'value', value);
};
/**
* @return {?}
*/
DatePickerAppendToBodyComponent.prototype.setI18nText = /**
* @return {?}
*/
function () {
var _this = this;
this.i18nLocale = this.i18n.getI18nText().locale;
this.i18nSubscription = this.i18n.langChange().subscribe((/**
* @param {?} data
* @return {?}
*/
function (data) {
_this.i18nLocale = data.locale;
}));
};
/**
* @param {?} data
* @return {?}
*/
DatePickerAppendToBodyComponent.prototype.timeChange = /**
* @param {?} data
* @return {?}
*/
function (data) {
this.writeValue(data['selectedDate']);
this.writeModelValue(data);
if (data['reason'] === SelectDateChangeReason.date && !this.showTime ||
data['reason'] === SelectDateChangeReason.button) {
this.isOpen = false;
}
};
/**
* @return {?}
*/
DatePickerAppendToBodyComponent.prototype.updateCdkConnectedOverlayOrigin = /**
* @return {?}
*/
function () {
if (this.elementRef.nativeElement) {
this.cdkConnectedOverlayOrigin = new CdkOverlayOrigin(this.elementRef.nativeElement);
}
};
/**
* @param {?} $event
* @param {?=} clickShow
* @return {?}
*/
DatePickerAppendToBodyComponent.prototype.toggle = /**
* @param {?} $event
* @param {?=} clickShow
* @return {?}
*/
function ($event, clickShow) {
this.isOpen = !this.isOpen;
this.clickShow = clickShow;
};
/**
* @return {?}
*/
DatePickerAppendToBodyComponent.prototype.hide = /**
* @return {?}
*/
function () {
this.isOpen = false;
};
/**
* @private
* @param {?} selectDateObj
* @return {?}
*/
DatePickerAppendToBodyComponent.prototype.writeModelValue = /**
* @private
* @param {?} selectDateObj
* @return {?}
*/
function (selectDateObj) {
/** @type {?} */
var selectDate;
/** @type {?} */
var dateReason = SelectDateChangeReason.time;
if (selectDateObj && typeof selectDateObj === 'object' && selectDateObj.hasOwnProperty('selectedDate')) {
selectDate = selectDateObj.selectedDate;
dateReason = selectDateObj.reason;
}
else {
selectDate = selectDateObj;
}
if (selectDate) {
selectDate = new Date(selectDate);
}
else {
selectDate = null;
}
this.onChange(selectDate); // 这行代码能触发ngModel绑定的变量值发生变化
this.selectedDateChange.emit({
reason: dateReason,
selectedDate: this.selectedDate
});
};
/**
* @param {?} $event
* @return {?}
*/
DatePickerAppendToBodyComponent.prototype.onBlur = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
this.onTouched();
};
/**
* @param {?} $event
* @return {?}
*/
DatePickerAppendToBodyComponent.prototype.onDocumentClick = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
if (this.elementRef.nativeElement !== $event.target && !this.clickShow) {
this.isOpen = false;
}
else {
this.clickShow = false;
}
};
/**
* @param {?} position
* @return {?}
*/
DatePickerAppendToBodyComponent.prototype.onPositionChange = /**
* @param {?} position
* @return {?}
*/
function (position) {
switch (position.connectionPair.overlayY) {
case 'top':
case 'center':
this.datepickerPosition = 'bottom';
break;
case 'bottom':
this.datepickerPosition = 'top';
}
};
/**
* @return {?}
*/
DatePickerAppendToBodyComponent.prototype.setPositions = /**
* @return {?}
*/
function () {
if (this.appendToBodyDirections && this.appendToBodyDirections.length > 0) {
this.positions = this.appendToBodyDirections.map((/**
* @param {?} position
* @return {?}
*/
function (position) {
if (typeof position === 'string') {
return AppendToBodyDirectionsConfig[position];
}
else {
return position;
}
})).filter((/**
* @param {?} position
* @return {?}
*/
function (position) { return position !== undefined; }));
}
else {
this.positions = undefined;
}
};
/**
* @private
* @param {?} event
* @return {?}
*/
DatePickerAppendToBodyComponent.prototype.transUserInputToDatepicker = /**
* @private
* @param {?} event
* @return {?}
*/
function (event) {
if (!this.showTime && !this.disabled) {
/** @type {?} */
var value = event.target.value;
/** @type {?} */
var valueDate = new Date(value);
/** @type {?} */
var valueFormat = this.dateConverter.format(valueDate, this.dateFormat, this.locale || this.i18nLocale);
if (value && value === valueFormat) {
if (valueDate.getTime() < this.minDate.getTime() || valueDate.getTime() > this.maxDate.getTime()) {
this.writeValue(this.selectedDate);
}
else {
this.selectedDate = new Date(value);
this.writeModelValue(value);
}
}
else if (!value) {
this.writeValue(null);
}
}
else {
this.writeValue(this.selectedDate);
}
};
/**
* @return {?}
*/
DatePickerAppendToBodyComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
if (this.inputSub) {
this.inputSub.unsubscribe();
}
if (this.i18nSubscription) {
this.i18nSubscription.unsubscribe();
}
};
DatePickerAppendToBodyComponent.decorators = [
{ type: Component, args: [{
selector: '[dDatepicker][appendToBody]',
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return DatePickerAppendToBodyComponent; })),
multi: true
}],
exportAs: 'datepicker',
template: "\n <ng-template cdk-connected-overlay\n [cdkConnectedOverlayOrigin]=\"cdkConnectedOverlayOrigin\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n (backdropClick)=\"isOpen=false\"\n (positionChange)=\"onPositionChange($event)\">\n <d-datepicker [@cornerFadeInOut]=\"isOpen ? datepickerPosition : 'void'\" [locale]=\"locale || i18nLocale\"\n [showTime]=\"showTime\" [cssClass]=\"cssClass\" [selectedDate]=\"selectedDate\"\n [disabled]=\"disabled\" [dateConverter]=\"dateConverter\" (selectedDateChange)=\"timeChange($event)\"\n [yearNumber]=\"yearNumber\" [dateFormat]=\"dateFormat\" [dateConfig]=\"dateConfig\"\n [customViewTemplate]=\"customViewTemplate\" [maxDate]=\"maxDate\"\n [minDate]=\"minDate\" class=\"devui-datepicker\"></d-datepicker>\n </ng-template>\n ",
animations: [
cornerFadeInOut
],
styles: [".devui-datepicker{-webkit-transform:perspective(1px) translate3d(0,0,0);transform:perspective(1px) translate3d(0,0,0)}"]
}] }
];
/** @nocollapse */
DatePickerAppendToBodyComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: ViewContainerRef },
{ type: Renderer2 },
{ type: DatePickerConfig },
{ type: I18nService }
]; };
DatePickerAppendToBodyComponent.propDecorators = {
locale: [{ type: Input }],
showTime: [{ type: Input }],
cssClass: [{ type: Input }],
disabled: [{ type: Input }],
dateConverter: [{ type: Input }],
yearNumber: [{ type: Input }],
customViewTemplate: [{ type: Input }],
autoOpen: [{ type: Input }],
selectedDateChange: [{ type: Output }],
dateConfig: [{ type: Input }],
dateFormat: [{ type: Input }],
maxDate: [{ type: Input }],
minDate: [{ type: Input }],
appendToBodyDirections: [{ type: Input }],
onBlur: [{ type: HostListener, args: ['blur', ['$event'],] }],
onDocumentClick: [{ type: HostListener, args: ['document:click', ['$event'],] }]
};
return DatePickerAppendToBodyComponent;
}());
export { DatePickerAppendToBodyComponent };
if (false) {
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.locale;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.showTime;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.cssClass;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.disabled;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.dateConverter;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.yearNumber;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.customViewTemplate;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.autoOpen;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.selectedDateChange;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.selectedDate;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.isOpen;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype._dateConfig;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.positions;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.datepickerPosition;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype._dateFormat;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype._maxDate;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype._minDate;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype.clickShow;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype.inputSub;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype.i18nSubscription;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.i18nLocale;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.cdkConnectedOverlayOrigin;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.appendToBodyDirections;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype.onChange;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype.onTouched;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.clearAll;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype.elementRef;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype.viewContainerRef;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype.renderer2;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype.datePickerConfig;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype.i18n;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1jZGstb3ZlcmxheS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS9kYXRlcGlja2VyLyIsInNvdXJjZXMiOlsiZGF0ZXBpY2tlci1jZGstb3ZlcmxheS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBRVYsS0FBSyxFQUNMLFdBQVcsRUFDWCxNQUFNLEVBQ04sWUFBWSxFQUNaLFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULFlBQVksRUFJYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQTRFLE1BQU0sc0JBQXNCLENBQUM7QUFFbEksT0FBTyxFQUF5Qiw0QkFBNEIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJGLE9BQU8sRUFBNkIsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRyxPQUFPLEVBQUUsdUJBQXVCLElBQUksZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRixPQUFPLEVBQUUsV0FBVyxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFNBQVMsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlDO0lBeUdFLHlDQUFvQixVQUFzQixFQUFVLGdCQUFrQyxFQUNsRSxTQUFvQixFQUFVLGdCQUFrQyxFQUFVLElBQWlCO1FBRC9HLGlCQVlDO1FBWm1CLGVBQVUsR0FBVixVQUFVLENBQVk7UUFBVSxxQkFBZ0IsR0FBaEIsZ0JBQWdC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c291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBmb3J3YXJkUmVmLFxyXG4gIE9uSW5pdCxcclxuICBJbnB1dCxcclxuICBUZW1wbGF0ZVJlZixcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgVmlld0NvbnRhaW5lclJlZixcclxuICBSZW5kZXJlcjIsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIE9uQ2hhbmdlcyxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIE9uRGVzdHJveVxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDZGtPdmVybGF5T3JpZ2luLCBDb25uZWN0ZWRQb3NpdGlvbiwgQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlLCBWZXJ0aWNhbENvbm5lY3Rpb25Qb3MgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcblxyXG5pbXBvcnQgeyBBcHBlbmRUb0JvZHlEaXJlY3Rpb24sIEFwcGVuZFRvQm9keURpcmVjdGlvbnNDb25maWcgfSBmcm9tICduZy1kZXZ1aS91dGlscyc7XHJcbmltcG9ydCB7IERhdGVDb252ZXJ0ZXIgfSBmcm9tICduZy1kZXZ1aS91dGlscyc7XHJcbmltcG9ydCB7IFNlbGVjdERhdGVDaGFuZ2VFdmVudEFyZ3MsIFNlbGVjdERhdGVDaGFuZ2VSZWFzb24gfSBmcm9tICcuL2RhdGUtY2hhbmdlLWV2ZW50LWFyZ3MubW9kZWwnO1xyXG5pbXBvcnQgeyBEYXRlUGlja2VyQ29uZmlnU2VydmljZSBhcyBEYXRlUGlja2VyQ29uZmlnIH0gZnJvbSAnLi9kYXRlLXBpY2tlci5jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IEkxOG5TZXJ2aWNlLCBJMThuSW50ZXJmYWNlIH0gZnJvbSAnbmctZGV2dWkvaTE4bic7XHJcbmltcG9ydCB7IERlZmF1bHREYXRlQ29udmVydGVyIH0gZnJvbSAnbmctZGV2dWkvdXRpbHMnO1xyXG5pbXBvcnQgeyBjb3JuZXJGYWRlSW5PdXQgfSBmcm9tICduZy1kZXZ1aS91dGlscyc7XHJcbmltcG9ydCB7IGZyb21FdmVudCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnW2REYXRlcGlja2VyXVthcHBlbmRUb0JvZHldJyxcclxuICBwcm92aWRlcnM6IFt7XHJcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVQaWNrZXJBcHBlbmRUb0JvZHlDb21wb25lbnQpLFxyXG4gICAgbXVsdGk6IHRydWVcclxuICB9XSxcclxuICBleHBvcnRBczogJ2RhdGVwaWNrZXInLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8bmctdGVtcGxhdGUgY2RrLWNvbm5lY3RlZC1vdmVybGF5XHJcbiAgICAgICAgICAgICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwiY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpblwiXHJcbiAgICAgICAgICAgICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnNdPVwicG9zaXRpb25zXCJcclxuICAgICAgICAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwiaXNPcGVuXCJcclxuICAgICAgICAgICAgICAgICAoYmFja2Ryb3BDbGljayk9XCJpc09wZW49ZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgIChwb3NpdGlvbkNoYW5nZSk9XCJvblBvc2l0aW9uQ2hhbmdlKCRldmVudClcIj5cclxuICAgICAgPGQtZGF0ZXBpY2tlciBbQGNvcm5lckZhZGVJbk91dF09XCJpc09wZW4gPyBkYXRlcGlja2VyUG9zaXRpb24gOiAndm9pZCdcIiBbbG9jYWxlXT1cImxvY2FsZSB8fCBpMThuTG9jYWxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzaG93VGltZV09XCJzaG93VGltZVwiIFtjc3NDbGFzc109XCJjc3NDbGFzc1wiIFtzZWxlY3RlZERhdGVdPVwic2VsZWN0ZWREYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFtkYXRlQ29udmVydGVyXT1cImRhdGVDb252ZXJ0ZXJcIiAoc2VsZWN0ZWREYXRlQ2hhbmdlKT1cInRpbWVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbeWVhck51bWJlcl09XCJ5ZWFyTnVtYmVyXCIgW2RhdGVGb3JtYXRdPVwiZGF0ZUZvcm1hdFwiIFtkYXRlQ29uZmlnXT1cImRhdGVDb25maWdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2N1c3RvbVZpZXdUZW1wbGF0ZV09XCJjdXN0b21WaWV3VGVtcGxhdGVcIiBbbWF4RGF0ZV09XCJtYXhEYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFttaW5EYXRlXT1cIm1pbkRhdGVcIiBjbGFzcz1cImRldnVpLWRhdGVwaWNrZXJcIj48L2QtZGF0ZXBpY2tlcj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgYCxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICBjb3JuZXJGYWRlSW5PdXRcclxuICBdLFxyXG4gIHN0eWxlVXJsczogWycuL2RhdGVwaWNrZXItY2RrLW92ZXJsYXkuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0ZVBpY2tlckFwcGVuZFRvQm9keUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICBASW5wdXQoKSBsb2NhbGU6IHN0cmluZztcclxuICBASW5wdXQoKSBzaG93VGltZTogYm9vbGVhbjtcclxuICBASW5wdXQoKSBjc3NDbGFzczogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGRhdGVDb252ZXJ0ZXI6IERhdGVDb252ZXJ0ZXI7XHJcbiAgQElucHV0KCkgeWVhck51bWJlciA9IDEyO1xyXG4gIEBJbnB1dCgpIGN1c3RvbVZpZXdUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuICBASW5wdXQoKSBhdXRvT3BlbiA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZERhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdERhdGVDaGFuZ2VFdmVudEFyZ3M+KCk7XHJcbiAgc2VsZWN0ZWREYXRlOiBEYXRlO1xyXG4gIGlzT3BlbiA9IGZhbHNlO1xyXG4gIF9kYXRlQ29uZmlnOiBhbnk7XHJcbiAgcG9zaXRpb25zOiBDb25uZWN0ZWRQb3NpdGlvbltdO1xyXG4gIGRhdGVwaWNrZXJQb3NpdGlvbjogVmVydGljYWxDb25uZWN0aW9uUG9zID0gJ2JvdHRvbSc7XHJcbiAgcHJpdmF0ZSBfZGF0ZUZvcm1hdDogc3RyaW5nO1xyXG4gIHByaXZhdGUgX21heERhdGU6IERhdGU7XHJcbiAgcHJpdmF0ZSBfbWluRGF0ZTogRGF0ZTtcclxuICBwcml2YXRlIGNsaWNrU2hvdyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgaW5wdXRTdWI6IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIGkxOG5TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBwdWJsaWMgaTE4bkxvY2FsZTogSTE4bkludGVyZmFjZVsnbG9jYWxlJ107XHJcblxyXG5cclxuICBASW5wdXQoKSBzZXQgZGF0ZUNvbmZpZyhkYXRlQ29uZmlnOiBhbnkpIHtcclxuICAgIGlmIChkYXRlQ29uZmlnKSB7XHJcbiAgICAgIHRoaXMuX2RhdGVDb25maWcgPSBkYXRlQ29uZmlnO1xyXG4gICAgICB0aGlzLl9kYXRlRm9ybWF0ID0gdGhpcy5zaG93VGltZSA/IGRhdGVDb25maWcuZm9ybWF0LnRpbWUgOiBkYXRlQ29uZmlnLmZvcm1hdC5kYXRlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fZGF0ZUNvbmZpZyA9IHRoaXMuZGF0ZVBpY2tlckNvbmZpZy5kYXRlQ29uZmlnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGVDb25maWcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0ZUNvbmZpZztcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNldCBkYXRlRm9ybWF0KGRhdGVGb3JtYXQ6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuX2RhdGVGb3JtYXQgIT09IGRhdGVGb3JtYXQpIHtcclxuICAgICAgdGhpcy5fZGF0ZUZvcm1hdCA9IGRhdGVGb3JtYXQ7XHJcbiAgICAgIHRoaXMud3JpdGVNb2RlbFZhbHVlKHtzZWxlY3RlZERhdGU6IHRoaXMuc2VsZWN0ZWREYXRlLCByZWFzb246IFNlbGVjdERhdGVDaGFuZ2VSZWFzb24uZm9ybWF0fSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgZGF0ZUZvcm1hdCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRlRm9ybWF0O1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IG1heERhdGUoZGF0ZTogRGF0ZSB8IGFueSkge1xyXG4gICAgY29uc3QgcGFyc2VEYXRlID0gdGhpcy5kYXRlQ29udmVydGVyLnBhcnNlKGRhdGUsIHRoaXMuZGF0ZUZvcm1hdCwgdGhpcy5sb2NhbGUgfHwgdGhpcy5pMThuTG9jYWxlKTtcclxuICAgIGlmIChwYXJzZURhdGUpIHtcclxuICAgICAgdGhpcy5fbWF4RGF0ZSA9IHBhcnNlRGF0ZTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0IG1heERhdGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbWF4RGF0ZTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNldCBtaW5EYXRlKGRhdGU6IERhdGUgfCBhbnkpIHtcclxuICAgIGNvbnN0IHBhcnNlRGF0ZSA9IHRoaXMuZGF0ZUNvbnZlcnRlci5wYXJzZShkYXRlLCB0aGlzLmRhdGVGb3JtYXQsIHRoaXMubG9jYWxlIHx8IHRoaXMuaTE4bkxvY2FsZSk7XHJcbiAgICBpZiAocGFyc2VEYXRlKSB7XHJcbiAgICAgIHRoaXMuX21pbkRhdGUgPSBwYXJzZURhdGU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBtaW5EYXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX21pbkRhdGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbjogYW55O1xyXG5cclxuICBASW5wdXQoKSBhcHBlbmRUb0JvZHlEaXJlY3Rpb25zOiBBcnJheTxBcHBlbmRUb0JvZHlEaXJlY3Rpb24gfCBDb25uZWN0ZWRQb3NpdGlvbj4gPSBbXHJcbiAgICAncmlnaHREb3duJywgJ2xlZnREb3duJywgJ3JpZ2h0VXAnLCAnbGVmdFVwJ1xyXG4gIF07XHJcblxyXG4gIHByaXZhdGUgb25DaGFuZ2UgPSAoXzogYW55KSA9PiBudWxsO1xyXG4gIHByaXZhdGUgb25Ub3VjaGVkID0gKCkgPT4gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBkYXRlUGlja2VyQ29uZmlnOiBEYXRlUGlja2VyQ29uZmlnLCBwcml2YXRlIGkxOG46IEkxOG5TZXJ2aWNlKSB7XHJcbiAgICB0aGlzLl9kYXRlQ29uZmlnID0gZGF0ZVBpY2tlckNvbmZpZ1snZGF0ZUNvbmZpZyddO1xyXG4gICAgdGhpcy5kYXRlQ29udmVydGVyID0gZGF0ZVBpY2tlckNvbmZpZ1snZGF0ZUNvbmZpZyddLmRhdGVDb252ZXJ0ZXIgfHwgbmV3IERlZmF1bHREYXRlQ29udmVydGVyKCk7XHJcblxyXG5cclxuICAgIHRoaXMuaW5wdXRTdWIgPSBmcm9tRXZlbnQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdpbnB1dCcpXHJcbiAgICAgLnBpcGUoXHJcbiAgICAgIGRlYm91bmNlVGltZSgzMDApXHJcbiAgICAgKS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgIHRoaXMudHJhbnNVc2VySW5wdXRUb0RhdGVwaWNrZXIoZXZlbnQpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5zaG93VGltZSA9IHRoaXMuc2hvd1RpbWUgfHwgdGhpcy5kYXRlQ29uZmlnLnRpbWVQaWNrZXI7XHJcbiAgICB0aGlzLl9taW5EYXRlID0gdGhpcy5taW5EYXRlID8gbmV3IERhdGUodGhpcy5taW5EYXRlKSA6IG5ldyBEYXRlKHRoaXMuZGF0ZUNvbmZpZy5taW4sIDAsIDEsIDAsIDAsIDApO1xyXG4gICAgdGhpcy5fbWF4RGF0ZSA9IHRoaXMubWF4RGF0ZSA/IG5ldyBEYXRlKHRoaXMubWF4RGF0ZSkgOiBuZXcgRGF0ZSh0aGlzLmRhdGVDb25maWcubWF4LCAxMSwgMzEsIDIzLCA1OSwgNTkpO1xyXG4gICAgdGhpcy5zZXRQb3NpdGlvbnMoKTtcclxuICAgIHRoaXMuc2V0STE4blRleHQoKTtcclxuICAgIHRoaXMudXBkYXRlQ2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbigpO1xyXG4gICAgaWYgKHRoaXMuYXV0b09wZW4pIHtcclxuICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXNbJ2FwcGVuZFRvQm9keURpcmVjdGlvbnMnXSkge1xyXG4gICAgICB0aGlzLnNldFBvc2l0aW9ucygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSBvYmogP1xyXG4gICAgICB0aGlzLmRhdGVDb252ZXJ0ZXIucGFyc2Uob2JqLCB0aGlzLmRhdGVGb3JtYXQsIHRoaXMubG9jYWxlIHx8IHRoaXMuaTE4bkxvY2FsZSkgOiBudWxsO1xyXG4gICAgY29uc3QgdmFsdWUgPVxyXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA/IHRoaXMuZGF0ZUNvbnZlcnRlci5mb3JtYXQodGhpcy5zZWxlY3RlZERhdGUsIHRoaXMuZGF0ZUZvcm1hdCwgdGhpcy5sb2NhbGUgfHwgdGhpcy5pMThuTG9jYWxlKSA6ICcnO1xyXG4gICAgdGhpcy5yZW5kZXJlcjIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHNldEkxOG5UZXh0KCkge1xyXG4gICAgdGhpcy5pMThuTG9jYWxlID0gdGhpcy5pMThuLmdldEkxOG5UZXh0KCkubG9jYWxlO1xyXG4gICAgdGhpcy5pMThuU3Vic2NyaXB0aW9uID0gdGhpcy5pMThuLmxhbmdDaGFuZ2UoKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuICAgICAgdGhpcy5pMThuTG9jYWxlID0gZGF0YS5sb2NhbGU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRpbWVDaGFuZ2UoZGF0YSkge1xyXG4gICAgdGhpcy53cml0ZVZhbHVlKGRhdGFbJ3NlbGVjdGVkRGF0ZSddKTtcclxuICAgIHRoaXMud3JpdGVNb2RlbFZhbHVlKGRhdGEpO1xyXG4gICAgaWYgKGRhdGFbJ3JlYXNvbiddID09PSBTZWxlY3REYXRlQ2hhbmdlUmVhc29uLmRhdGUgJiYgIXRoaXMuc2hvd1RpbWUgfHxcclxuICAgICBkYXRhWydyZWFzb24nXSA9PT0gU2VsZWN0RGF0ZUNoYW5nZVJlYXNvbi5idXR0b24pIHtcclxuICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZUNka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW4oKSB7XHJcbiAgICBpZiAodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5jZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luID0gbmV3IENka092ZXJsYXlPcmlnaW4odGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlKCRldmVudDogRXZlbnQsIGNsaWNrU2hvdz86IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaXNPcGVuID0gIXRoaXMuaXNPcGVuO1xyXG4gICAgdGhpcy5jbGlja1Nob3cgPSBjbGlja1Nob3c7XHJcbiAgfVxyXG5cclxuICBoaWRlKCkge1xyXG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgd3JpdGVNb2RlbFZhbHVlKHNlbGVjdERhdGVPYmo6IGFueSkge1xyXG4gICAgbGV0IHNlbGVjdERhdGU7XHJcbiAgICBsZXQgZGF0ZVJlYXNvbiA9IFNlbGVjdERhdGVDaGFuZ2VSZWFzb24udGltZTtcclxuICAgIGlmIChzZWxlY3REYXRlT2JqICYmIHR5cGVvZiBzZWxlY3REYXRlT2JqID09PSAnb2JqZWN0JyAmJiBzZWxlY3REYXRlT2JqLmhhc093blByb3BlcnR5KCdzZWxlY3RlZERhdGUnKSkge1xyXG4gICAgICBzZWxlY3REYXRlID0gc2VsZWN0RGF0ZU9iai5zZWxlY3RlZERhdGU7XHJcbiAgICAgIGRhdGVSZWFzb24gPSBzZWxlY3REYXRlT2JqLnJlYXNvbjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNlbGVjdERhdGUgPSBzZWxlY3REYXRlT2JqO1xyXG4gICAgfVxyXG4gICAgaWYgKHNlbGVjdERhdGUpIHtcclxuICAgICAgc2VsZWN0RGF0ZSA9IG5ldyBEYXRlKHNlbGVjdERhdGUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VsZWN0RGF0ZSA9IG51bGw7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9uQ2hhbmdlKHNlbGVjdERhdGUpOyAvLyDov5nooYzku6PnoIHog73op6blj5FuZ01vZGVs57uR5a6a55qE5Y+Y6YeP5YC85Y+R55Sf5Y+Y5YyWXHJcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZUNoYW5nZS5lbWl0KHtcclxuICAgICAgcmVhc29uOiBkYXRlUmVhc29uLFxyXG4gICAgICBzZWxlY3RlZERhdGU6IHRoaXMuc2VsZWN0ZWREYXRlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInLCBbJyRldmVudCddKVxyXG4gIG9uQmx1cigkZXZlbnQpIHtcclxuICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgb25Eb2N1bWVudENsaWNrKCRldmVudCkge1xyXG4gICAgaWYgKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50ICE9PSAkZXZlbnQudGFyZ2V0ICYmICF0aGlzLmNsaWNrU2hvdykge1xyXG4gICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jbGlja1Nob3cgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uUG9zaXRpb25DaGFuZ2UocG9zaXRpb246IENvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZSkge1xyXG4gICAgc3dpdGNoIChwb3NpdGlvbi5jb25uZWN0aW9uUGFpci5vdmVybGF5WSkge1xyXG4gICAgICBjYXNlICd0b3AnOlxyXG4gICAgICBjYXNlICdjZW50ZXInOlxyXG4gICAgICAgIHRoaXMuZGF0ZXBpY2tlclBvc2l0aW9uID0gJ2JvdHRvbSc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XHJcbiAgICAgICAgdGhpcy5kYXRlcGlja2VyUG9zaXRpb24gPSAndG9wJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldFBvc2l0aW9ucygpIHtcclxuICAgIGlmICh0aGlzLmFwcGVuZFRvQm9keURpcmVjdGlvbnMgJiYgdGhpcy5hcHBlbmRUb0JvZHlEaXJlY3Rpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5wb3NpdGlvbnMgPSB0aGlzLmFwcGVuZFRvQm9keURpcmVjdGlvbnMubWFwKHBvc2l0aW9uID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgcmV0dXJuIEFwcGVuZFRvQm9keURpcmVjdGlvbnNDb25maWdbcG9zaXRpb25dO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gcG9zaXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9KS5maWx0ZXIocG9zaXRpb24gPT4gcG9zaXRpb24gIT09IHVuZGVmaW5lZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBvc2l0aW9ucyA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdHJhbnNVc2VySW5wdXRUb0RhdGVwaWNrZXIoZXZlbnQpIHtcclxuICAgIGlmICghdGhpcy5zaG93VGltZSAmJiAhdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICBjb25zdCB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAgICAgY29uc3QgdmFsdWVEYXRlID0gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgICBjb25zdCB2YWx1ZUZvcm1hdCA9IHRoaXMuZGF0ZUNvbnZlcnRlci5mb3JtYXQodmFsdWVEYXRlLCB0aGlzLmRhdGVGb3JtYXQsIHRoaXMubG9jYWxlIHx8IHRoaXMuaTE4bkxvY2FsZSk7XHJcbiAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSA9PT0gdmFsdWVGb3JtYXQpIHtcclxuICAgICAgICBpZiAodmFsdWVEYXRlLmdldFRpbWUoKSA8IHRoaXMubWluRGF0ZS5nZXRUaW1lKCkgfHwgdmFsdWVEYXRlLmdldFRpbWUoKSA+IHRoaXMubWF4RGF0ZS5nZXRUaW1lKCkpIHtcclxuICAgICAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgICAgICAgdGhpcy53cml0ZU1vZGVsVmFsdWUodmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICghdmFsdWUpIHtcclxuICAgICAgICB0aGlzLndyaXRlVmFsdWUobnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGVhckFsbCA9ICgpID0+IHtcclxuICAgIHRoaXMud3JpdGVWYWx1ZShudWxsKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgaWYgKHRoaXMuaW5wdXRTdWIpIHtcclxuICAgICAgdGhpcy5pbnB1dFN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaTE4blN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLmkxOG5TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19