com.phloxui
Version:
PhloxUI Ng2+ Framework
454 lines (453 loc) • 44.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { EventEmitter } from '@angular/core';
import { AbstractHasFormatterInputDataView } from './AbstractHasFormatterInputDataView';
import { DateFormatter } from '../../../share/formatter/DateFormatter';
import { DateTimeUtils } from '../../../share/utils/DateTimeUtils';
import { Option } from '../../../decorator/Option.decorator';
import { EventUtils } from '../../../share/utils/EventUtils';
import { BEFORE_VIEW_SHOW_EVENT, VIEW_SHOW_EVENT, BEFORE_VIEW_HIDE_EVENT, VIEW_HIDE_EVENT } from '../../../share/CustomEventType';
/**
* @abstract
*/
export class AbstractDateTimePicker extends AbstractHasFormatterInputDataView {
/**
* @param {?} elementRef
* @param {?} formatterFactory
* @param {?} phloxAppInfoService
* @param {?} needFocusService
*/
constructor(elementRef, formatterFactory, phloxAppInfoService, needFocusService) {
super(elementRef, formatterFactory, needFocusService);
this.beforeViewShowEvent = new EventEmitter();
this.viewShowEvent = new EventEmitter();
this.beforeViewHideEvent = new EventEmitter();
this.viewHideEvent = new EventEmitter();
phloxAppInfoService.getAppInfo().then((info) => {
this.phloxAppInfo = info;
});
this._useDataPattern = false;
}
/**
* @return {?}
*/
ngOnInit() {
super.ngOnInit();
// Set DateFormatter as default value.
if ((this.formatter === null || this.formatter === undefined) && (this.formatterName === null || this.formatterName === undefined)) {
this.setFormatterName(DateFormatter.NAME);
}
// Set default fomatter's pattern if not specified.
if (this.formatter !== null && this.formatter !== undefined && this.formatter.getName() === DateFormatter.NAME) {
let /** @type {?} */ df = /** @type {?} */ (this.formatter);
if (df.getPattern() === null || df.getPattern() === undefined) {
// Use display format the same as data's pattern.
df.setPattern(this.getDataPattern());
this._useDataPattern = true;
}
}
if (!this.getDate()) {
// Set default data value = current date time.
let /** @type {?} */ now = new Date();
// Ignore milliseconds by default.
now.setMilliseconds(0);
this.setDate(now);
}
// We've to explicitly call this method even if it has been called in super.ngOnInt()
// since the default date may be initialized after the super.ngOnInit() is called.
this.selfSaveData(this.data);
}
/**
* @param {?=} $event
* @return {?}
*/
emitBeforeViewShowEvent($event) {
let /** @type {?} */ data = null;
let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_VIEW_SHOW_EVENT, this, data, $event);
this.beforeViewShowEvent.emit(ev);
}
/**
* @param {?=} $event
* @return {?}
*/
emitViewShowEvent($event) {
let /** @type {?} */ data = null;
let /** @type {?} */ ev = EventUtils.newCustomEvent(VIEW_SHOW_EVENT, this, data, $event);
this.viewShowEvent.emit(ev);
}
/**
* @param {?=} $event
* @return {?}
*/
emitBeforeViewHideEvent($event) {
let /** @type {?} */ data = null;
let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_VIEW_HIDE_EVENT, this, data, $event);
this.beforeViewHideEvent.emit(ev);
}
/**
* @param {?=} $event
* @return {?}
*/
emitViewHideEvent($event) {
let /** @type {?} */ data = null;
let /** @type {?} */ ev = EventUtils.newCustomEvent(VIEW_HIDE_EVENT, this, data, $event);
this.viewHideEvent.emit(ev);
}
/**
* @param {?} data
* @return {?}
*/
selfSaveData(data) {
this.originalDate = this.getDate();
}
/**
* @return {?}
*/
isSelfDataDirty() {
let /** @type {?} */ date = this.getDate();
if (this.originalDate !== null && date === null || this.originalDate === null && date !== null) {
return true;
}
if (typeof this.originalDate !== typeof date) {
return true;
}
if (this.originalDate !== undefined && this.originalDate instanceof Date) {
return this.compareDate(this.originalDate, date) !== 0;
}
else {
try {
return JSON.stringify(this.originalDate) !== JSON.stringify(date);
}
catch (/** @type {?} */ e) {
return false;
}
}
}
/**
* @return {?}
*/
selfResetData() {
this.setDate(this.originalDate);
}
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
compareDate(a, b) {
if (!a && b) {
return -1;
}
if (a && !b) {
return 1;
}
if (!a && !b) {
return 0;
}
return a.compareTo(b);
}
/**
* @param {?} data
* @return {?}
*/
getTimeZoneDiff(data) {
if (this.formatter instanceof DateFormatter) {
let /** @type {?} */ df = /** @type {?} */ (this.formatter);
if (df.getTimeZone() !== null && typeof df.getTimeZone() !== 'undefined') {
let /** @type {?} */ offsetHours = Math.floor(-data.getTimezoneOffset() / 60);
let /** @type {?} */ offsetMins = -data.getTimezoneOffset() % 60;
let /** @type {?} */ diff = (offsetHours * 100 + offsetMins);
let /** @type {?} */ tzDiff = 0;
if (typeof df.getTimeZone() === 'number') {
tzDiff = diff - df.getTimeZone();
}
else if (typeof df.getTimeZone() === 'string') {
tzDiff = diff - DateTimeUtils.parseTimeZone(df.getTimeZone());
}
return tzDiff;
}
}
return 0;
}
/**
* @return {?}
*/
getDate() {
// Get value from "this.data".
let /** @type {?} */ obj = this.getInputValue();
if (obj === null || obj === undefined) {
return obj;
}
if (this.typeOfData === null || this.typeOfData === undefined || this.typeOfData.toLowerCase() === AbstractDateTimePicker.TYPE_AUTO) {
// Try to resolve "typeOfData" automatically.
this.typeOfData = typeof obj;
}
if (this.typeOfData === 'string') {
try {
return Date.parseExact(obj, this.getDataPattern());
}
catch (/** @type {?} */ err) {
}
try {
// Try to parse using Date.parse()
return Date.parse(obj);
}
catch (/** @type {?} */ err) {
}
}
else if (this.typeOfData === 'number') {
try {
return new Date(obj);
}
catch (/** @type {?} */ err) {
}
}
else if (this.typeOfData === 'object') {
if (obj instanceof Date) {
return new Date(obj.getTime());
}
}
// Could not parse data in any cases.
return null;
}
/**
* @param {?} data
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
setDate(data, $event, fireEvent) {
let /** @type {?} */ date;
// We accept these kinds of "data" and parse it into date.
if (typeof data === 'string') {
try {
date = Date.parseExact(data, this.getDataPattern());
}
catch (/** @type {?} */ err) {
}
if (date === null || typeof date === 'undefined') {
try {
date = Date.parse(data);
}
catch (/** @type {?} */ err) {
}
}
}
else if (typeof data === 'number') {
try {
date = new Date(data);
}
catch (/** @type {?} */ err) {
}
}
else if (typeof data === 'object') {
if (data instanceof Date) {
date = new Date(data.getTime());
}
}
// Then, convert parsed "date" into "typeOfData".
let /** @type {?} */ newData = date;
if (newData !== null && newData !== undefined) {
if (this.typeOfData === null || this.typeOfData === undefined || this.typeOfData.toLowerCase() === AbstractDateTimePicker.TYPE_AUTO) {
// Try to resolve "typeOfData" automatically.
this.typeOfData = typeof newData;
}
if (this.typeOfData === 'string') {
newData = date.toString(this.getDataPattern());
}
else if (this.typeOfData === 'number') {
newData = date.getTime();
}
else if (this.typeOfData === 'object') {
newData = date;
}
}
// Save it into "this.data".
this.setInputValue(newData, $event, fireEvent);
}
/**
* @return {?}
*/
getBeforeViewShowEvent() {
return this.beforeViewShowEvent;
}
/**
* @param {?} event
* @return {?}
*/
setBeforeViewShowEvent(event) {
this.beforeViewShowEvent = event;
}
/**
* @return {?}
*/
getViewShowEvent() {
return this.viewShowEvent;
}
/**
* @param {?} event
* @return {?}
*/
setViewShowEvent(event) {
this.viewShowEvent = event;
}
/**
* @return {?}
*/
getBeforeViewHideEvent() {
return this.beforeViewHideEvent;
}
/**
* @param {?} event
* @return {?}
*/
setBeforeViewHideEvent(event) {
this.beforeViewHideEvent = event;
}
/**
* @return {?}
*/
getViewHideEvent() {
return this.viewHideEvent;
}
/**
* @param {?} event
* @return {?}
*/
setViewHideEvent(event) {
this.viewHideEvent = event;
}
/**
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
show($event, fireEvent) {
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
EventUtils.handleBrowserEvent(this, 'beforeViewShowEvent', $event, fireEvent, ($event) => {
// doEvent
this.doShow();
}, ($event) => {
// emitBeforeEvent
this.emitBeforeViewShowEvent($event);
}, ($event, result) => {
// emitAfterEvent
this.emitViewShowEvent($event);
}, ($event) => {
// doPrevented
});
}
/**
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
hide($event, fireEvent) {
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
EventUtils.handleBrowserEvent(this, 'beforeViewHideEvent', $event, fireEvent, ($event) => {
// doEvent
this.doHide();
}, ($event) => {
// emitBeforeEvent
this.emitBeforeViewHideEvent($event);
}, ($event, result) => {
// emitAfterEvent
this.emitViewHideEvent($event);
}, ($event) => {
// doPrevented
});
}
/**
* @return {?}
*/
getDataPattern() {
if (this.dataPattern === null || this.dataPattern === undefined) {
return this.getDataPatternFromSetting();
}
return this.dataPattern;
}
/**
* @param {?} dataPattern
* @return {?}
*/
setDataPattern(dataPattern) {
this.dataPattern = dataPattern;
}
/**
* @return {?}
*/
getOriginalDate() {
return this.originalDate;
}
/**
* @return {?}
*/
getDataPatternFromSetting() {
if (this.phloxAppInfo === null || this.phloxAppInfo === undefined) {
return "yyyy-MM-dd";
}
if (this.phloxAppInfo.settings === null || this.phloxAppInfo.settings === undefined) {
return "yyyy-MM-dd";
}
if (this.phloxAppInfo.settings.DEFAULT_DATA_DATE_PATTERN === null || this.phloxAppInfo.settings.DEFAULT_DATA_DATE_PATTERN === undefined) {
return "yyyy-MM-dd";
}
return this.phloxAppInfo.settings.DEFAULT_DATA_DATE_PATTERN;
}
}
tslib_1.__decorate([
Option('beforeViewShow'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractDateTimePicker.prototype, "beforeViewShowEvent", void 0);
tslib_1.__decorate([
Option('viewShow'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractDateTimePicker.prototype, "viewShowEvent", void 0);
tslib_1.__decorate([
Option('beforeViewHide'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractDateTimePicker.prototype, "beforeViewHideEvent", void 0);
tslib_1.__decorate([
Option('viewHide'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractDateTimePicker.prototype, "viewHideEvent", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], AbstractDateTimePicker.prototype, "dataPattern", void 0);
function AbstractDateTimePicker_tsickle_Closure_declarations() {
/** @type {?} */
AbstractDateTimePicker.prototype.beforeViewShowEvent;
/** @type {?} */
AbstractDateTimePicker.prototype.viewShowEvent;
/** @type {?} */
AbstractDateTimePicker.prototype.beforeViewHideEvent;
/** @type {?} */
AbstractDateTimePicker.prototype.viewHideEvent;
/** @type {?} */
AbstractDateTimePicker.prototype.dataPattern;
/** @type {?} */
AbstractDateTimePicker.prototype.phloxAppInfo;
/** @type {?} */
AbstractDateTimePicker.prototype.originalDate;
/** @type {?} */
AbstractDateTimePicker.prototype._useDataPattern;
/**
* @abstract
* @return {?}
*/
AbstractDateTimePicker.prototype.doHide = function () { };
/**
* @abstract
* @return {?}
*/
AbstractDateTimePicker.prototype.doShow = function () { };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3REYXRlVGltZVBpY2tlci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9BYnN0cmFjdERhdGVUaW1lUGlja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUF5QixZQUFZLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFHaEYsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFeEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFNN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7QUFFbEksTUFBTSw2QkFBdUMsU0FBUSxpQ0FBaUM7Ozs7Ozs7SUFpQnBGLFlBQVksVUFBc0IsRUFBRSxnQkFBa0MsRUFBRSxtQkFBd0MsRUFDNUcsZ0JBQWtDO1FBQ3BDLEtBQUssQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUV0RCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXhDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElB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dCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0SW5wdXREYXRhVmlldyB9IGZyb20gJy4vQWJzdHJhY3RJbnB1dERhdGFWaWV3JztcclxuaW1wb3J0IHsgSUZvcm1hdHRlciB9IGZyb20gJy4uLy4uLy4uL3NoYXJlL2Zvcm1hdHRlci9JRm9ybWF0dGVyJztcclxuaW1wb3J0IHsgQWJzdHJhY3RIYXNGb3JtYXR0ZXJJbnB1dERhdGFWaWV3IH0gZnJvbSAnLi9BYnN0cmFjdEhhc0Zvcm1hdHRlcklucHV0RGF0YVZpZXcnO1xyXG5pbXBvcnQgeyBGb3JtYXR0ZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9Gb3JtYXR0ZXJGYWN0b3J5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRlRm9ybWF0dGVyIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmUvZm9ybWF0dGVyL0RhdGVGb3JtYXR0ZXInO1xyXG5pbXBvcnQgeyBEYXRlVGltZVV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmUvdXRpbHMvRGF0ZVRpbWVVdGlscyc7XHJcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgRGF0YVV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmUvdXRpbHMvRGF0YVV0aWxzJztcclxuaW1wb3J0IHsgcmVhZCB9IGZyb20gJ2ZzJztcclxuaW1wb3J0IHsgUGhsb3hBcHBJbmZvIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50L21vZGVsL1BobG94QXBwSW5mbyc7XHJcbmltcG9ydCB7IFBobG94QXBwSW5mb1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL1BobG94QXBwSW5mb1NlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IE5lZWRGb2N1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL05lZWRGb2N1c1NlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS91dGlscy9FdmVudFV0aWxzJztcclxuaW1wb3J0IHsgQkVGT1JFX1ZJRVdfU0hPV19FVkVOVCwgVklFV19TSE9XX0VWRU5ULCBCRUZPUkVfVklFV19ISURFX0VWRU5ULCBWSUVXX0hJREVfRVZFTlQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS9DdXN0b21FdmVudFR5cGUnO1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGF0ZVRpbWVQaWNrZXIgZXh0ZW5kcyBBYnN0cmFjdEhhc0Zvcm1hdHRlcklucHV0RGF0YVZpZXcgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBAT3B0aW9uKCdiZWZvcmVWaWV3U2hvdycpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZVZpZXdTaG93RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPcHRpb24oJ3ZpZXdTaG93JylcclxuICBwcm90ZWN0ZWQgdmlld1Nob3dFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignYmVmb3JlVmlld0hpZGUnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVWaWV3SGlkZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3B0aW9uKCd2aWV3SGlkZScpXHJcbiAgcHJvdGVjdGVkIHZpZXdIaWRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkYXRhUGF0dGVybjogc3RyaW5nO1xyXG5cclxuICBwcm90ZWN0ZWQgcGhsb3hBcHBJbmZvOiBQaGxveEFwcEluZm87XHJcbiAgcHJvdGVjdGVkIG9yaWdpbmFsRGF0ZTogRGF0ZTtcclxuICBwcm90ZWN0ZWQgX3VzZURhdGFQYXR0ZXJuOiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBmb3JtYXR0ZXJGYWN0b3J5OiBGb3JtYXR0ZXJGYWN0b3J5LCBwaGxveEFwcEluZm9TZXJ2aWNlOiBQaGxveEFwcEluZm9TZXJ2aWNlXHJcbiAgICAsIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UpIHtcclxuICAgIHN1cGVyKGVsZW1lbnRSZWYsIGZvcm1hdHRlckZhY3RvcnksIG5lZWRGb2N1c1NlcnZpY2UpO1xyXG5cclxuICAgIHRoaXMuYmVmb3JlVmlld1Nob3dFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMudmlld1Nob3dFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuYmVmb3JlVmlld0hpZGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMudmlld0hpZGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICBwaGxveEFwcEluZm9TZXJ2aWNlLmdldEFwcEluZm8oKS50aGVuKChpbmZvKSA9PiB7XHJcbiAgICAgIHRoaXMucGhsb3hBcHBJbmZvID0gaW5mbztcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX3VzZURhdGFQYXR0ZXJuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgIC8vIFNldCBEYXRlRm9ybWF0dGVyIGFzIGRlZmF1bHQgdmFsdWUuXHJcbiAgICBpZiAoKHRoaXMuZm9ybWF0dGVyID09PSBudWxsIHx8IHRoaXMuZm9ybWF0dGVyID09PSB1bmRlZmluZWQpICYmICh0aGlzLmZvcm1hdHRlck5hbWUgPT09IG51bGwgfHwgdGhpcy5mb3JtYXR0ZXJOYW1lID09PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgIHRoaXMuc2V0Rm9ybWF0dGVyTmFtZShEYXRlRm9ybWF0dGVyLk5BTUUpO1xyXG4gICAgfVxyXG4gICAgLy8gU2V0IGRlZmF1bHQgZm9tYXR0ZXIncyBwYXR0ZXJuIGlmIG5vdCBzcGVjaWZpZWQuXHJcbiAgICBpZiAodGhpcy5mb3JtYXR0ZXIgIT09IG51bGwgJiYgdGhpcy5mb3JtYXR0ZXIgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmZvcm1hdHRlci5nZXROYW1lKCkgPT09IERhdGVGb3JtYXR0ZXIuTkFNRSkge1xyXG4gICAgICBsZXQgZGY6IERhdGVGb3JtYXR0ZXIgPSA8RGF0ZUZvcm1hdHRlcj50aGlzLmZvcm1hdHRlcjtcclxuXHJcbiAgICAgIGlmIChkZi5nZXRQYXR0ZXJuKCkgPT09IG51bGwgfHwgZGYuZ2V0UGF0dGVybigpID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvLyBVc2UgZGlzcGxheSBmb3JtYXQgdGhlIHNhbWUgYXMgZGF0YSdzIHBhdHRlcm4uXHJcbiAgICAgICAgZGYuc2V0UGF0dGVybih0aGlzLmdldERhdGFQYXR0ZXJuKCkpO1xyXG5cclxuICAgICAgICB0aGlzLl91c2VEYXRhUGF0dGVybiA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZ2V0RGF0ZSgpKSB7XHJcbiAgICAgIC8vIFNldCBkZWZhdWx0IGRhdGEgdmFsdWUgPSBjdXJyZW50IGRhdGUgdGltZS5cclxuICAgICAgbGV0IG5vdzogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcblxyXG4gICAgICAvLyBJZ25vcmUgbWlsbGlzZWNvbmRzIGJ5IGRlZmF1bHQuXHJcbiAgICAgIG5vdy5zZXRNaWxsaXNlY29uZHMoMCk7XHJcblxyXG4gICAgICB0aGlzLnNldERhdGUobm93KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBXZSd2ZSB0byBleHBsaWNpdGx5IGNhbGwgdGhpcyBtZXRob2QgZXZlbiBpZiBpdCBoYXMgYmVlbiBjYWxsZWQgaW4gc3VwZXIubmdPbkludCgpXHJcbiAgICAvLyBzaW5jZSB0aGUgZGVmYXVsdCBkYXRlIG1heSBiZSBpbml0aWFsaXplZCBhZnRlciB0aGUgc3VwZXIubmdPbkluaXQoKSBpcyBjYWxsZWQuXHJcbiAgICB0aGlzLnNlbGZTYXZlRGF0YSh0aGlzLmRhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbWl0QmVmb3JlVmlld1Nob3dFdmVudCgkZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xyXG4gICAgbGV0IGRhdGE6IGFueSA9IG51bGw7XHJcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KEJFRk9SRV9WSUVXX1NIT1dfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XHJcblxyXG4gICAgdGhpcy5iZWZvcmVWaWV3U2hvd0V2ZW50LmVtaXQoZXYpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbWl0Vmlld1Nob3dFdmVudCgkZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xyXG4gICAgbGV0IGRhdGE6IGFueSA9IG51bGw7XHJcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KFZJRVdfU0hPV19FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICB0aGlzLnZpZXdTaG93RXZlbnQuZW1pdChldik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXRCZWZvcmVWaWV3SGlkZUV2ZW50KCRldmVudD86IEV2ZW50KTogdm9pZCB7XHJcbiAgICBsZXQgZGF0YTogYW55ID0gbnVsbDtcclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX1ZJRVdfSElERV9FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICB0aGlzLmJlZm9yZVZpZXdIaWRlRXZlbnQuZW1pdChldik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXRWaWV3SGlkZUV2ZW50KCRldmVudD86IEV2ZW50KTogdm9pZCB7XHJcbiAgICBsZXQgZGF0YTogYW55ID0gbnVsbDtcclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoVklFV19ISURFX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xyXG5cclxuICAgIHRoaXMudmlld0hpZGVFdmVudC5lbWl0KGV2KTtcclxuICB9XHJcblxyXG4gIC8vIE92ZXJyaWRlXHJcbiAgcHVibGljIHNlbGZTYXZlRGF0YShkYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub3JpZ2luYWxEYXRlID0gdGhpcy5nZXREYXRlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBPdmVycmlkZVxyXG4gIHB1YmxpYyBpc1NlbGZEYXRhRGlydHkoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgZGF0ZTogRGF0ZSA9IHRoaXMuZ2V0RGF0ZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLm9yaWdpbmFsRGF0ZSAhPT0gbnVsbCAmJiBkYXRlID09PSBudWxsIHx8IHRoaXMub3JpZ2luYWxEYXRlID09PSBudWxsICYmIGRhdGUgIT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHRoaXMub3JpZ2luYWxEYXRlICE9PSB0eXBlb2YgZGF0ZSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5vcmlnaW5hbERhdGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLm9yaWdpbmFsRGF0ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZURhdGUodGhpcy5vcmlnaW5hbERhdGUsIGRhdGUpICE9PSAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5vcmlnaW5hbERhdGUpICE9PSBKU09OLnN0cmluZ2lmeShkYXRlKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gT3ZlcnJpZGVcclxuICBwdWJsaWMgc2VsZlJlc2V0RGF0YSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0RGF0ZSh0aGlzLm9yaWdpbmFsRGF0ZSk7XHJcbiAgfVxyXG5cclxuICAvLyBTdWIgY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGlnbm9yZSBpcnJlbGV2YW50IGF0dHJpYnV0ZXMuXHJcbiAgLy8gRm9yIGV4YW1wbGUsIGEgdGltZSBwaWNrZXIgc2hvdWxkIG9ubHkgY29tcGFyZSB3aXRoIEhIOm1tOnNzIGlnbm9yaW5nIERvTSBvciBtcy5cclxuICBwdWJsaWMgY29tcGFyZURhdGUoYTogRGF0ZSwgYjogRGF0ZSk6IG51bWJlciB7XHJcbiAgICBpZiAoIWEgJiYgYikge1xyXG4gICAgICByZXR1cm4gLTE7XHJcbiAgICB9XHJcbiAgICBpZiAoYSAmJiAhYikge1xyXG4gICAgICByZXR1cm4gMTtcclxuICAgIH1cclxuICAgIGlmICghYSAmJiAhYikge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYS5jb21wYXJlVG8oYik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0VGltZVpvbmVEaWZmKGRhdGE6IERhdGUpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuZm9ybWF0dGVyIGluc3RhbmNlb2YgRGF0ZUZvcm1hdHRlcikge1xyXG4gICAgICBsZXQgZGY6IERhdGVGb3JtYXR0ZXIgPSA8RGF0ZUZvcm1hdHRlcj50aGlzLmZvcm1hdHRlcjtcclxuXHJcbiAgICAgIGlmIChkZi5nZXRUaW1lWm9uZSgpICE9PSBudWxsICYmIHR5cGVvZiBkZi5nZXRUaW1lWm9uZSgpICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIGxldCBvZmZzZXRIb3VyczogbnVtYmVyID0gTWF0aC5mbG9vcigtZGF0YS5nZXRUaW1lem9uZU9mZnNldCgpIC8gNjApO1xyXG4gICAgICAgIGxldCBvZmZzZXRNaW5zOiBudW1iZXIgPSAtZGF0YS5nZXRUaW1lem9uZU9mZnNldCgpICUgNjA7XHJcbiAgICAgICAgbGV0IGRpZmYgPSAob2Zmc2V0SG91cnMgKiAxMDAgKyBvZmZzZXRNaW5zKTtcclxuICAgICAgICBsZXQgdHpEaWZmOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIGRmLmdldFRpbWVab25lKCkgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICB0ekRpZmYgPSBkaWZmIC0gZGYuZ2V0VGltZVpvbmUoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZi5nZXRUaW1lWm9uZSgpID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgdHpEaWZmID0gZGlmZiAtIERhdGVUaW1lVXRpbHMucGFyc2VUaW1lWm9uZShkZi5nZXRUaW1lWm9uZSgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHR6RGlmZjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERhdGUoKTogRGF0ZSB7XHJcbiAgICAvLyBHZXQgdmFsdWUgZnJvbSBcInRoaXMuZGF0YVwiLlxyXG4gICAgbGV0IG9iajogYW55ID0gdGhpcy5nZXRJbnB1dFZhbHVlKCk7XHJcblxyXG4gICAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnR5cGVPZkRhdGEgPT09IG51bGwgfHwgdGhpcy50eXBlT2ZEYXRhID09PSB1bmRlZmluZWQgfHwgdGhpcy50eXBlT2ZEYXRhLnRvTG93ZXJDYXNlKCkgPT09IEFic3RyYWN0RGF0ZVRpbWVQaWNrZXIuVFlQRV9BVVRPKSB7XHJcbiAgICAgIC8vIFRyeSB0byByZXNvbHZlIFwidHlwZU9mRGF0YVwiIGF1dG9tYXRpY2FsbHkuXHJcbiAgICAgIHRoaXMudHlwZU9mRGF0YSA9IHR5cGVvZiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudHlwZU9mRGF0YSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gRGF0ZS5wYXJzZUV4YWN0KG9iaiwgdGhpcy5nZXREYXRhUGF0dGVybigpKTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gVHJ5IHRvIHBhcnNlIHVzaW5nIERhdGUucGFyc2UoKVxyXG4gICAgICAgIHJldHVybiBEYXRlLnBhcnNlKG9iaik7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZU9mRGF0YSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gbmV3IERhdGUob2JqKTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlT2ZEYXRhID09PSAnb2JqZWN0Jykge1xyXG4gICAgICBpZiAob2JqIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShvYmouZ2V0VGltZSgpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENvdWxkIG5vdCBwYXJzZSBkYXRhIGluIGFueSBjYXNlcy5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldERhdGUoZGF0YTogYW55LCAkZXZlbnQ/OiBFdmVudCwgZmlyZUV2ZW50PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IGRhdGU6IERhdGU7XHJcblxyXG4gICAgLy8gV2UgYWNjZXB0IHRoZXNlIGtpbmRzIG9mIFwiZGF0YVwiIGFuZCBwYXJzZSBpdCBpbnRvIGRhdGUuXHJcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgZGF0ZSA9IERhdGUucGFyc2VFeGFjdChkYXRhLCB0aGlzLmdldERhdGFQYXR0ZXJuKCkpO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGRhdGUgPT09IG51bGwgfHwgdHlwZW9mIGRhdGUgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGRhdGUgPSBEYXRlLnBhcnNlKGRhdGEpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBkYXRlID0gbmV3IERhdGUoZGF0YSk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xyXG4gICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgICBkYXRlID0gbmV3IERhdGUoZGF0YS5nZXRUaW1lKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGhlbiwgY29udmVydCBwYXJzZWQgXCJkYXRlXCIgaW50byBcInR5cGVPZkRhdGFcIi5cclxuICAgIGxldCBuZXdEYXRhOiBhbnkgPSBkYXRlO1xyXG5cclxuICAgIGlmIChuZXdEYXRhICE9PSBudWxsICYmIG5ld0RhdGEgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAodGhpcy50eXBlT2ZEYXRhID09PSBudWxsIHx8IHRoaXMudHlwZU9mRGF0YSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMudHlwZU9mRGF0YS50b0xvd2VyQ2FzZSgpID09PSBBYnN0cmFjdERhdGVUaW1lUGlja2VyLlRZUEVfQVVUTykge1xyXG4gICAgICAgIC8vIFRyeSB0byByZXNvbHZlIFwidHlwZU9mRGF0YVwiIGF1dG9tYXRpY2FsbHkuXHJcbiAgICAgICAgdGhpcy50eXBlT2ZEYXRhID0gdHlwZW9mIG5ld0RhdGE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnR5cGVPZkRhdGEgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgbmV3RGF0YSA9IGRhdGUudG9TdHJpbmcodGhpcy5nZXREYXRhUGF0dGVybigpKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGVPZkRhdGEgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgbmV3RGF0YSA9IGRhdGUuZ2V0VGltZSgpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZU9mRGF0YSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICBuZXdEYXRhID0gZGF0ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFNhdmUgaXQgaW50byBcInRoaXMuZGF0YVwiLlxyXG4gICAgdGhpcy5zZXRJbnB1dFZhbHVlKG5ld0RhdGEsICRldmVudCwgZmlyZUV2ZW50KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRCZWZvcmVWaWV3U2hvd0V2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmJlZm9yZVZpZXdTaG93RXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0QmVmb3JlVmlld1Nob3dFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcclxuICAgIHRoaXMuYmVmb3JlVmlld1Nob3dFdmVudCA9IGV2ZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFZpZXdTaG93RXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMudmlld1Nob3dFdmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRWaWV3U2hvd0V2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xyXG4gICAgdGhpcy52aWV3U2hvd0V2ZW50ID0gZXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QmVmb3JlVmlld0hpZGVFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5iZWZvcmVWaWV3SGlkZUV2ZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEJlZm9yZVZpZXdIaWRlRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XHJcbiAgICB0aGlzLmJlZm9yZVZpZXdIaWRlRXZlbnQgPSBldmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRWaWV3SGlkZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnZpZXdIaWRlRXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Vmlld0hpZGVFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcclxuICAgIHRoaXMudmlld0hpZGVFdmVudCA9IGV2ZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3coJGV2ZW50PzogRXZlbnQsIGZpcmVFdmVudD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgZmlyZUV2ZW50ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBFdmVudFV0aWxzLmhhbmRsZUJyb3dzZXJFdmVudCh0aGlzLCAnYmVmb3JlVmlld1Nob3dFdmVudCcsICRldmVudCwgZmlyZUV2ZW50LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBkb0V2ZW50XHJcbiAgICAgIHRoaXMuZG9TaG93KCk7XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBlbWl0QmVmb3JlRXZlbnRcclxuICAgICAgdGhpcy5lbWl0QmVmb3JlVmlld1Nob3dFdmVudCgkZXZlbnQpO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQsIHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgIC8vIGVtaXRBZnRlckV2ZW50XHJcbiAgICAgIHRoaXMuZW1pdFZpZXdTaG93RXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGRvUHJldmVudGVkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoaWRlKCRldmVudD86IEV2ZW50LCBmaXJlRXZlbnQ/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZVZpZXdIaWRlRXZlbnQnLCAkZXZlbnQsIGZpcmVFdmVudCwgKCRldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgLy8gZG9FdmVudFxyXG4gICAgICB0aGlzLmRvSGlkZSgpO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgLy8gZW1pdEJlZm9yZUV2ZW50XHJcbiAgICAgIHRoaXMuZW1pdEJlZm9yZVZpZXdIaWRlRXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAvLyBlbWl0QWZ0ZXJFdmVudFxyXG4gICAgICB0aGlzLmVtaXRWaWV3SGlkZUV2ZW50KCRldmVudCk7XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBkb1ByZXZlbnRlZFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0YVBhdHRlcm4oKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmRhdGFQYXR0ZXJuID09PSBudWxsIHx8IHRoaXMuZGF0YVBhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXREYXRhUGF0dGVybkZyb21TZXR0aW5nKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhUGF0dGVybjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXREYXRhUGF0dGVybihkYXRhUGF0dGVybjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhdGFQYXR0ZXJuID0gZGF0YVBhdHRlcm47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0T3JpZ2luYWxEYXRlKCk6IERhdGUge1xyXG4gICAgcmV0dXJuIHRoaXMub3JpZ2luYWxEYXRlO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldERhdGFQYXR0ZXJuRnJvbVNldHRpbmcoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnBobG94QXBwSW5mbyA9PT0gbnVsbCB8fCB0aGlzLnBobG94QXBwSW5mbyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiBcInl5eXktTU0tZGRcIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncyA9PT0gbnVsbCB8fCB0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiBcInl5eXktTU0tZGRcIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncy5ERUZBVUxUX0RBVEFfREFURV9QQVRURVJOID09PSBudWxsIHx8IHRoaXMucGhsb3hBcHBJbmZvLnNldHRpbmdzLkRFRkFVTFRfREFUQV9EQVRFX1BBVFRFUk4gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gXCJ5eXl5LU1NLWRkXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucGhsb3hBcHBJbmZvLnNldHRpbmdzLkRFRkFVTFRfREFUQV9EQVRFX1BBVFRFUk47XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZG9IaWRlKCk6IHZvaWQ7XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBkb1Nob3coKTogdm9pZDtcclxufVxyXG4iXX0=