fundamental-ngx
Version:
SAP Fiori Fundamentals, implemented in Angular
636 lines • 51.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, EventEmitter, forwardRef, Input, Output } from '@angular/core';
import { TimeObject } from './time-object';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
var TimeComponent = /** @class */ (function () {
function TimeComponent() {
/**
* \@Input When set to true, uses the 24 hour clock (hours ranging from 0 to 23)
* and does not display a period control.
*/
this.meridian = false;
/**
* \@Input When set to false, does not set the input field to invalid state on invalid entry.
*/
this.validate = true;
/**
* \@Input When set to false, hides the buttons that increment and decrement the corresponding input.
*/
this.spinners = true;
/**
* \@Input When set to false, hides the input for seconds.
*/
this.displaySeconds = true;
/**
* \@Input An object that contains three integer properties: 'hour' (ranging from 0 to 23),
* 'minute' (ranging from 0 to 59), and 'second' (ranging from 0 to 59). This is the model the component consumes. Example:
*
* ```json
* { hour: 12, minute: 0, second: 0 }
* ```
*
*/
this.time = { hour: 0, minute: 0, second: 0 };
/**
* @hidden
*/
this.isDateTimePicker = false;
/**
* @hidden
*/
this.focusArrowLeft = new EventEmitter();
/**
* @hidden
*/
this.onChange = (/**
* @param {?} time
* @return {?}
*/
function (time) { });
/**
* @hidden
*/
this.onTouched = (/**
* @return {?}
*/
function () { });
}
/** @hidden */
/**
* @hidden
* @return {?}
*/
TimeComponent.prototype.setDisplayedHour = /**
* @hidden
* @return {?}
*/
function () {
if (this.time.hour === 0) {
this.displayedHour = 12;
this.period = 'am';
}
else if (this.time.hour > 12) {
this.displayedHour = this.time.hour - 12;
this.period = 'pm';
}
else if (this.time.hour === 12) {
this.displayedHour = 12;
this.period = 'pm';
}
else {
this.displayedHour = this.time.hour;
this.period = 'am';
}
this.oldPeriod = this.period;
};
/** @hidden */
/**
* @hidden
* @return {?}
*/
TimeComponent.prototype.displayedHourChanged = /**
* @hidden
* @return {?}
*/
function () {
if (this.displayedHour === null && this.time) {
this.time.hour = null;
}
else {
if (this.period === 'am') {
if (this.displayedHour === 12) {
this.time.hour = 0;
}
else {
this.time.hour = this.displayedHour;
}
}
else if (this.period === 'pm') {
if (this.displayedHour === 12) {
this.time.hour = this.displayedHour;
}
else {
this.time.hour = this.displayedHour + 12;
}
}
}
this.onChange(this.time);
};
/** @hidden */
/**
* @hidden
* @param {?} inputType
* @return {?}
*/
TimeComponent.prototype.inputBlur = /**
* @hidden
* @param {?} inputType
* @return {?}
*/
function (inputType) {
if (inputType === 'hour') {
if (this.meridian) {
this.time.hour = Math.round(this.time.hour);
if (this.displayedHour === 0) {
this.time.hour = 0;
this.setDisplayedHour();
this.onChange(this.time);
}
else if (this.displayedHour > 12 && this.displayedHour < 24) {
if (this.period === 'pm') {
this.time.hour = this.displayedHour - 12;
}
this.setDisplayedHour();
this.onChange(this.time);
}
else if (this.displayedHour >= 24) {
this.displayedHour = this.displayedHour % 12;
this.displayedHourChanged();
}
else if (this.displayedHour < 0) {
this.displayedHour = (this.displayedHour * -1) % 12;
this.displayedHourChanged();
}
}
else {
this.time.hour = Math.round(this.time.hour) % 24;
if (this.time.hour < 0) {
this.time.hour = this.time.hour * -1;
this.onChange(this.time);
}
}
}
else if (inputType === 'minute') {
this.time.minute = Math.round(this.time.minute) % 60;
if (this.time.minute < 0) {
this.time.minute = this.time.minute * -1;
}
this.onChange(this.time);
}
else if (inputType === 'second') {
this.time.second = Math.round(this.time.second) % 60;
if (this.time.second < 0) {
this.time.second = this.time.second * -1;
}
this.onChange(this.time);
}
else if (inputType === 'period') {
if (this.period !== 'am' && this.period !== 'pm') {
this.setDisplayedHour();
this.onChange(this.time);
}
}
};
/** @hidden */
/**
* @hidden
* @return {?}
*/
TimeComponent.prototype.ngOnChanges = /**
* @hidden
* @return {?}
*/
function () {
if (this.meridian) {
this.setDisplayedHour();
}
else {
this.displayedHour = this.time.hour;
}
};
/** Increases the hour value by one. */
/**
* Increases the hour value by one.
* @return {?}
*/
TimeComponent.prototype.increaseHour = /**
* Increases the hour value by one.
* @return {?}
*/
function () {
if (this.time.hour === null) {
this.time.hour = 0;
}
else if (this.time.hour === 23) {
this.time.hour = 0;
}
else {
this.time.hour = this.time.hour + 1;
}
if (this.meridian) {
this.setDisplayedHour();
}
this.onChange(this.time);
};
/** Decreases the hour value by one. */
/**
* Decreases the hour value by one.
* @return {?}
*/
TimeComponent.prototype.decreaseHour = /**
* Decreases the hour value by one.
* @return {?}
*/
function () {
if (this.time.hour === null) {
this.time.hour = 0;
}
else if (this.time.hour === 0) {
this.time.hour = 23;
}
else {
this.time.hour = this.time.hour - 1;
}
if (this.meridian) {
this.setDisplayedHour();
}
this.onChange(this.time);
};
/** Increases the minute value by one. */
/**
* Increases the minute value by one.
* @return {?}
*/
TimeComponent.prototype.increaseMinute = /**
* Increases the minute value by one.
* @return {?}
*/
function () {
if (this.time.minute === null) {
this.time.minute = 0;
}
else if (this.time.minute === 59) {
this.time.minute = 0;
this.increaseHour();
}
else {
this.time.minute = this.time.minute + 1;
}
this.onChange(this.time);
};
/** Decreases the minute value by one. */
/**
* Decreases the minute value by one.
* @return {?}
*/
TimeComponent.prototype.decreaseMinute = /**
* Decreases the minute value by one.
* @return {?}
*/
function () {
if (this.time.minute === null) {
this.time.minute = 0;
}
else if (this.time.minute === 0) {
this.time.minute = 59;
this.decreaseHour();
}
else {
this.time.minute = this.time.minute - 1;
}
this.onChange(this.time);
};
/** Increases the second value by one. */
/**
* Increases the second value by one.
* @return {?}
*/
TimeComponent.prototype.increaseSecond = /**
* Increases the second value by one.
* @return {?}
*/
function () {
if (this.displaySeconds) {
if (this.time.second === null) {
this.time.second = 0;
}
else if (this.time.second === 59) {
this.time.second = 0;
this.increaseMinute();
}
else {
this.time.second = this.time.second + 1;
}
}
this.onChange(this.time);
};
/** Decreases the second value by one. */
/**
* Decreases the second value by one.
* @return {?}
*/
TimeComponent.prototype.decreaseSecond = /**
* Decreases the second value by one.
* @return {?}
*/
function () {
if (this.displaySeconds) {
if (this.time.second === null) {
this.time.second = 0;
}
else if (this.time.second === 0) {
this.time.second = 59;
this.decreaseMinute();
}
else {
this.time.second = this.time.second - 1;
}
}
this.onChange(this.time);
};
/** Toggles the period (am/pm). */
/**
* Toggles the period (am/pm).
* @return {?}
*/
TimeComponent.prototype.togglePeriod = /**
* Toggles the period (am/pm).
* @return {?}
*/
function () {
if (this.time.hour < 24 && this.time.hour >= 0) {
if (this.period === 'am') {
this.period = 'pm';
this.periodModelChange();
}
else if (this.period === 'pm') {
this.period = 'am';
this.periodModelChange();
}
}
};
/** @hidden */
/**
* @hidden
* @return {?}
*/
TimeComponent.prototype.hourModelChange = /**
* @hidden
* @return {?}
*/
function () {
if (this.meridian) {
if (!(this.time.hour > 12 || this.time.hour < 0) || !this.validate) {
this.onChange(this.time);
}
}
else {
if (!(this.time.hour > 23 || this.time.hour < 0) || !this.validate) {
this.onChange(this.time);
}
}
};
/** @hidden */
/**
* @hidden
* @return {?}
*/
TimeComponent.prototype.minuteModelChange = /**
* @hidden
* @return {?}
*/
function () {
if (!(this.time.minute > 59 || this.time.minute < 0) || !this.validate) {
this.onChange(this.time);
}
};
/** @hidden */
/**
* @hidden
* @return {?}
*/
TimeComponent.prototype.secondModelChange = /**
* @hidden
* @return {?}
*/
function () {
if (!(this.time.second > 59 || this.time.second < 0) || !this.validate) {
this.onChange(this.time);
}
};
/** @hidden */
/**
* @hidden
* @return {?}
*/
TimeComponent.prototype.periodModelChange = /**
* @hidden
* @return {?}
*/
function () {
this.period = this.period.toLowerCase();
if (this.period !== 'am' && this.period !== 'pm') {
this.periodInvalid = true;
}
else if (this.time.hour < 24 && this.time.hour >= 0) {
if (this.oldPeriod === 'am' && this.period === 'pm') {
this.time.hour = this.time.hour + 12;
}
else if (this.oldPeriod === 'pm' && this.period === 'am') {
if (this.time.hour === null) {
this.time.hour = 0;
}
else {
this.time.hour = this.time.hour - 12;
}
}
this.periodInvalid = false;
this.onChange(this.time);
}
this.setDisplayedHour();
};
/** @hidden */
/**
* @hidden
* @param {?} fn
* @return {?}
*/
TimeComponent.prototype.registerOnChange = /**
* @hidden
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChange = fn;
};
/** @hidden */
/**
* @hidden
* @param {?} fn
* @return {?}
*/
TimeComponent.prototype.registerOnTouched = /**
* @hidden
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/** @hidden */
/**
* @hidden
* @param {?} isDisabled
* @return {?}
*/
TimeComponent.prototype.setDisabledState = /**
* @hidden
* @param {?} isDisabled
* @return {?}
*/
function (isDisabled) {
this.disabled = isDisabled;
};
/** @hidden */
/**
* @hidden
* @param {?} time
* @return {?}
*/
TimeComponent.prototype.writeValue = /**
* @hidden
* @param {?} time
* @return {?}
*/
function (time) {
if (!time) {
return;
}
this.time = time;
this.setDisplayedHour();
};
/** @hidden */
/**
* @hidden
* @param {?} event
* @return {?}
*/
TimeComponent.prototype.lastButtonKeydown = /**
* @hidden
* @param {?} event
* @return {?}
*/
function (event) {
if (event.code === 'Tab' && !event.shiftKey) {
event.preventDefault();
this.focusArrowLeft.emit();
}
};
TimeComponent.decorators = [
{ type: Component, args: [{
selector: 'fd-time',
template: "<div class=\"fd-time__item\">\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"increaseHour()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-up-arrow\"\n aria-label=\"Increase hours\"></button>\n </div>\n <div class=\"fd-time__input\">\n <input *ngIf=\"meridian\"\n (blur)=\"inputBlur('hour')\"\n [ngClass]=\"{'is-disabled': disabled, 'is-invalid': ((displayedHour > 12 || displayedHour < 0) && validate)}\"\n [(ngModel)]=\"displayedHour\"\n (keyup)=\"displayedHourChanged()\"\n class=\"fd-form__control\"\n type=\"number\"\n placeholder=\"hh\"\n aria-label=\"Hours\"/>\n <input *ngIf=\"!meridian\"\n (blur)=\"inputBlur('hour')\"\n [ngClass]=\"{'is-disabled': disabled, 'is-invalid': ((time.hour > 23 || time.hour < 0) && validate)}\"\n [(ngModel)]=\"time.hour\"\n (ngModelChange)=\"hourModelChange()\"\n class=\"fd-form__control\"\n type=\"number\"\n placeholder=\"hh\"\n aria-label=\"Hours\"/>\n </div>\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"decreaseHour()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-down-arrow\"\n aria-label=\"Decrease hours\"></button>\n </div>\n</div>\n\n<div class=\"fd-time__item\">\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"increaseMinute()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-up-arrow\"\n aria-label=\"Increase minutes\"></button>\n </div>\n <div class=\"fd-time__input\">\n <input [(ngModel)]=\"time.minute\"\n (ngModelChange)=\"minuteModelChange()\"\n (blur)=\"inputBlur('minute')\"\n [ngClass]=\"{'is-disabled': disabled, 'is-invalid': ((time.minute > 59 || time.minute < 0) && validate)}\"\n class=\"fd-form__control\"\n type=\"number\"\n placeholder=\"mm\"\n aria-label=\"Minutes\"/>\n </div>\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"decreaseMinute()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-down-arrow\"\n aria-label=\"Decrease minutes\"></button>\n </div>\n</div>\n<div *ngIf=\"displaySeconds\"\n class=\"fd-time__item\">\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"increaseSecond()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-up-arrow\"\n aria-label=\"Increase seconds\"></button>\n </div>\n <div class=\"fd-time__input\">\n <input [(ngModel)]=\"time.second\"\n (ngModelChange)=\"secondModelChange()\"\n (blur)=\"inputBlur('second')\"\n [ngClass]=\"{'is-disabled': disabled, 'is-invalid': ((time.second > 59 || time.second < 0) && validate)}\"\n class=\"fd-form__control\"\n type=\"number\"\n placeholder=\"ss\"\n (keydown)=\"!meridian && !spinners ? lastButtonKeydown($event) : ''\"aria-label=\"Seconds\"/>\n </div>\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"decreaseSecond()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-down-arrow\"\n aria-label=\"Decrease seconds\"\n (keydown)=\"!meridian ? lastButtonKeydown($event) : ''\"></button>\n </div>\n</div>\n<div *ngIf=\"meridian\"\n class=\"fd-time__item\">\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"togglePeriod()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-up-arrow\"\n aria-label=\"Increase period\"></button>\n </div>\n <div class=\"fd-time__input\">\n <input [(ngModel)]=\"period\"\n [ngClass]=\"{'is-disabled': disabled, 'is-invalid': periodInvalid}\"\n class=\"fd-form__control\"\n (blur)=\"inputBlur('period')\"\n (ngModelChange)=\"periodModelChange()\"\n type=\"text\"\n placeholder=\"am\"\n aria-label=\"Period\"/>\n </div>\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"togglePeriod()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-down-arrow\"\n aria-label=\"Decrease period\"\n (keydown)=\"lastButtonKeydown($event)\"></button>\n </div>\n</div>\n",
host: {
'(blur)': 'onTouched()',
class: 'fd-time'
},
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return TimeComponent; })),
multi: true
}
],
styles: ["input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}", ':host {display: block;}']
}] }
];
TimeComponent.propDecorators = {
meridian: [{ type: Input }],
validate: [{ type: Input }],
disabled: [{ type: Input }],
spinners: [{ type: Input }],
displaySeconds: [{ type: Input }],
time: [{ type: Input }],
isDateTimePicker: [{ type: Input }],
focusArrowLeft: [{ type: Output }],
setDisplayedHour: [{ type: Input }]
};
return TimeComponent;
}());
export { TimeComponent };
if (false) {
/**
* \@Input When set to true, uses the 24 hour clock (hours ranging from 0 to 23)
* and does not display a period control.
* @type {?}
*/
TimeComponent.prototype.meridian;
/**
* \@Input When set to false, does not set the input field to invalid state on invalid entry.
* @type {?}
*/
TimeComponent.prototype.validate;
/**
* \@Input Disables the component.
* @type {?}
*/
TimeComponent.prototype.disabled;
/**
* \@Input When set to false, hides the buttons that increment and decrement the corresponding input.
* @type {?}
*/
TimeComponent.prototype.spinners;
/**
* \@Input When set to false, hides the input for seconds.
* @type {?}
*/
TimeComponent.prototype.displaySeconds;
/**
* \@Input An object that contains three integer properties: 'hour' (ranging from 0 to 23),
* 'minute' (ranging from 0 to 59), and 'second' (ranging from 0 to 59). This is the model the component consumes. Example:
*
* ```json
* { hour: 12, minute: 0, second: 0 }
* ```
*
* @type {?}
*/
TimeComponent.prototype.time;
/**
* @hidden
* @type {?}
*/
TimeComponent.prototype.isDateTimePicker;
/**
* @hidden
* @type {?}
*/
TimeComponent.prototype.focusArrowLeft;
/**
* @hidden
* @type {?}
*/
TimeComponent.prototype.period;
/**
* @hidden
* @type {?}
*/
TimeComponent.prototype.oldPeriod;
/**
* @hidden
* @type {?}
*/
TimeComponent.prototype.periodInvalid;
/**
* @hidden
* @type {?}
*/
TimeComponent.prototype.displayedHour;
/**
* @hidden
* @type {?}
*/
TimeComponent.prototype.onChange;
/**
* @hidden
* @type {?}
*/
TimeComponent.prototype.onTouched;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mdW5kYW1lbnRhbC1uZ3gvIiwic291cmNlcyI6WyJsaWIvdGltZS90aW1lLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekU7SUFBQTs7Ozs7UUFxQmEsYUFBUSxHQUFZLEtBQUssQ0FBQzs7OztRQUcxQixhQUFRLEdBQVksSUFBSSxDQUFDOzs7O1FBTXpCLGFBQVEsR0FBWSxJQUFJLENBQUM7Ozs7UUFHekIsbUJBQWMsR0FBWSxJQUFJLENBQUM7Ozs7Ozs7Ozs7UUFXeEMsU0FBSSxHQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7OztRQUlyRCxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7Ozs7UUFJbEMsbUJBQWMsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQzs7OztRQWtDNUQsYUFBUTs7OztRQUFHLFVBQUMsSUFBZ0IsSUFBTSxDQUFDLEVBQUM7Ozs7UUFFcEMsY0FBUzs7O1FBQUcsY0FBTyxDQUFDLEVBQUM7SUFvUXpCLENBQUM7SUExUkcsY0FBYzs7Ozs7SUFFZCx3Q0FBZ0I7Ozs7SUFEaEI7UUFFSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztTQUN0QjthQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJ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LEVBQUU7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVU7Ozs0QkFBQyxjQUFNLE9BQUEsYUFBYSxFQUFiLENBQWEsRUFBQzs0QkFDNUMsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7cUJBQ0o7OEpBQ1EseUJBQXlCO2lCQUNyQzs7OzJCQUtJLEtBQUs7MkJBR0wsS0FBSzsyQkFHTCxLQUFLOzJCQUdMLEtBQUs7aUNBR0wsS0FBSzt1QkFVTCxLQUFLO21DQUlMLEtBQUs7aUNBSUwsTUFBTTttQ0FnQk4sS0FBSzs7SUF5UlYsb0JBQUM7Q0FBQSxBQTVWRCxJQTRWQztTQTNVWSxhQUFhOzs7Ozs7O0lBSXRCLGlDQUFtQzs7Ozs7SUFHbkMsaUNBQWtDOzs7OztJQUdsQyxpQ0FBMkI7Ozs7O0lBRzNCLGlDQUFrQzs7Ozs7SUFHbEMsdUNBQXdDOzs7Ozs7Ozs7OztJQVV4Qyw2QkFDcUQ7Ozs7O0lBR3JELHlDQUNrQzs7Ozs7SUFHbEMsdUNBQzREOzs7OztJQUc1RCwrQkFBZTs7Ozs7SUFHZixrQ0FBa0I7Ozs7O0lBR2xCLHNDQUF1Qjs7Ozs7SUFHdkIsc0NBQXNCOzs7OztJQXNCdEIsaUNBQW9DOzs7OztJQUVwQyxrQ0FBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUaW1lT2JqZWN0IH0gZnJvbSAnLi90aW1lLW9iamVjdCc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZmQtdGltZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RpbWUuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3RpbWUuY29tcG9uZW50LnNjc3MnXSxcbiAgICBob3N0OiB7XG4gICAgICAgICcoYmx1ciknOiAnb25Ub3VjaGVkKCknLFxuICAgICAgICBjbGFzczogJ2ZkLXRpbWUnXG4gICAgfSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUaW1lQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH1cbiAgICBdLFxuICAgIHN0eWxlczogWyc6aG9zdCB7ZGlzcGxheTogYmxvY2s7fSddXG59KVxuZXhwb3J0IGNsYXNzIFRpbWVDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICAgIC8qKiBASW5wdXQgV2hlbiBzZXQgdG8gdHJ1ZSwgdXNlcyB0aGUgMjQgaG91ciBjbG9jayAoaG91cnMgcmFuZ2luZyBmcm9tIDAgdG8gMjMpXG4gICAgICogYW5kIGRvZXMgbm90IGRpc3BsYXkgYSBwZXJpb2QgY29udHJvbC4gKi9cbiAgICBASW5wdXQoKSBtZXJpZGlhbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIEBJbnB1dCBXaGVuIHNldCB0byBmYWxzZSwgZG9lcyBub3Qgc2V0IHRoZSBpbnB1dCBmaWVsZCB0byBpbnZhbGlkIHN0YXRlIG9uIGludmFsaWQgZW50cnkuICovXG4gICAgQElucHV0KCkgdmFsaWRhdGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIEBJbnB1dCBEaXNhYmxlcyB0aGUgY29tcG9uZW50LiAqL1xuICAgIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xuXG4gICAgLyoqIEBJbnB1dCBXaGVuIHNldCB0byBmYWxzZSwgaGlkZXMgdGhlIGJ1dHRvbnMgdGhhdCBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCB0aGUgY29ycmVzcG9uZGluZyBpbnB1dC4gKi9cbiAgICBASW5wdXQoKSBzcGlubmVyczogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiogQElucHV0IFdoZW4gc2V0IHRvIGZhbHNlLCBoaWRlcyB0aGUgaW5wdXQgZm9yIHNlY29uZHMuICovXG4gICAgQElucHV0KCkgZGlzcGxheVNlY29uZHM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQElucHV0IEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRocmVlIGludGVnZXIgcHJvcGVydGllczogJ2hvdXInIChyYW5naW5nIGZyb20gMCB0byAyMyksXG4gICAgICogJ21pbnV0ZScgKHJhbmdpbmcgZnJvbSAwIHRvIDU5KSwgYW5kICdzZWNvbmQnIChyYW5naW5nIGZyb20gMCB0byA1OSkuIFRoaXMgaXMgdGhlIG1vZGVsIHRoZSBjb21wb25lbnQgY29uc3VtZXMuIEV4YW1wbGU6XG4gICAgICpcbiAgICAgKiBgYGBqc29uXG4gICAgICogeyBob3VyOiAxMiwgbWludXRlOiAwLCBzZWNvbmQ6IDAgfVxuICAgICAqIGBgYFxuICAgICAqICovXG4gICAgQElucHV0KClcbiAgICB0aW1lOiBUaW1lT2JqZWN0ID0geyBob3VyOiAwLCBtaW51dGU6IDAsIHNlY29uZDogMCB9O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASW5wdXQoKVxuICAgIGlzRGF0ZVRpbWVQaWNrZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQE91dHB1dCgpXG4gICAgZm9jdXNBcnJvd0xlZnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHBlcmlvZDogc3RyaW5nO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvbGRQZXJpb2Q6IHN0cmluZztcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcGVyaW9kSW52YWxpZDogYm9vbGVhbjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZGlzcGxheWVkSG91cjogbnVtYmVyO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNldERpc3BsYXllZEhvdXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWUuaG91ciA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRIb3VyID0gMTI7XG4gICAgICAgICAgICB0aGlzLnBlcmlvZCA9ICdhbSc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50aW1lLmhvdXIgPiAxMikge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRIb3VyID0gdGhpcy50aW1lLmhvdXIgLSAxMjtcbiAgICAgICAgICAgIHRoaXMucGVyaW9kID0gJ3BtJztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRpbWUuaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkSG91ciA9IDEyO1xuICAgICAgICAgICAgdGhpcy5wZXJpb2QgPSAncG0nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRIb3VyID0gdGhpcy50aW1lLmhvdXI7XG4gICAgICAgICAgICB0aGlzLnBlcmlvZCA9ICdhbSc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbGRQZXJpb2QgPSB0aGlzLnBlcmlvZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9uQ2hhbmdlID0gKHRpbWU6IFRpbWVPYmplY3QpID0+IHt9O1xuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb25Ub3VjaGVkID0gKCkgPT4ge307XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGRpc3BsYXllZEhvdXJDaGFuZ2VkKCkge1xuICAgICAgICBpZiAodGhpcy5kaXNwbGF5ZWRIb3VyID09PSBudWxsICYmIHRoaXMudGltZSkge1xuICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMucGVyaW9kID09PSAnYW0nKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlzcGxheWVkSG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGltZS5ob3VyID0gdGhpcy5kaXNwbGF5ZWRIb3VyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wZXJpb2QgPT09ICdwbScpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kaXNwbGF5ZWRIb3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IHRoaXMuZGlzcGxheWVkSG91cjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IHRoaXMuZGlzcGxheWVkSG91ciArIDEyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBpbnB1dEJsdXIoaW5wdXRUeXBlKSB7XG4gICAgICAgIGlmIChpbnB1dFR5cGUgPT09ICdob3VyJykge1xuICAgICAgICAgICAgaWYgKHRoaXMubWVyaWRpYW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IE1hdGgucm91bmQodGhpcy50aW1lLmhvdXIpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXllZEhvdXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERpc3BsYXllZEhvdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnRpbWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kaXNwbGF5ZWRIb3VyID4gMTIgJiYgdGhpcy5kaXNwbGF5ZWRIb3VyIDwgMjQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGVyaW9kID09PSAncG0nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IHRoaXMuZGlzcGxheWVkSG91ciAtIDEyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheWVkSG91cigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRpc3BsYXllZEhvdXIgPj0gMjQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRIb3VyID0gdGhpcy5kaXNwbGF5ZWRIb3VyICUgMTI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkSG91ckNoYW5nZWQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGlzcGxheWVkSG91ciA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRIb3VyID0gKHRoaXMuZGlzcGxheWVkSG91ciAqIC0xKSAlIDEyO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXllZEhvdXJDaGFuZ2VkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IE1hdGgucm91bmQodGhpcy50aW1lLmhvdXIpICUgMjQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGltZS5ob3VyIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IHRoaXMudGltZS5ob3VyICogLTE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy50aW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXRUeXBlID09PSAnbWludXRlJykge1xuICAgICAgICAgICAgdGhpcy50aW1lLm1pbnV0ZSA9IE1hdGgucm91bmQodGhpcy50aW1lLm1pbnV0ZSkgJSA2MDtcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWUubWludXRlIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZS5taW51dGUgPSB0aGlzLnRpbWUubWludXRlICogLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXRUeXBlID09PSAnc2Vjb25kJykge1xuICAgICAgICAgICAgdGhpcy50aW1lLnNlY29uZCA9IE1hdGgucm91bmQodGhpcy50aW1lLnNlY29uZCkgJSA2MDtcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWUuc2Vjb25kIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZS5zZWNvbmQgPSB0aGlzLnRpbWUuc2Vjb25kICogLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXRUeXBlID09PSAncGVyaW9kJykge1xuICAgICAgICAgICAgaWYgKHRoaXMucGVyaW9kICE9PSAnYW0nICYmIHRoaXMucGVyaW9kICE9PSAncG0nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5ZWRIb3VyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnRpbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uQ2hhbmdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMubWVyaWRpYW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheWVkSG91cigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRIb3VyID0gdGhpcy50aW1lLmhvdXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogSW5jcmVhc2VzIHRoZSBob3VyIHZhbHVlIGJ5IG9uZS4gKi9cbiAgICBpbmNyZWFzZUhvdXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWUuaG91ciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGltZS5ob3VyID09PSAyMykge1xuICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSB0aGlzLnRpbWUuaG91ciArIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWVyaWRpYW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheWVkSG91cigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy50aW1lKTtcbiAgICB9XG5cbiAgICAvKiogRGVjcmVhc2VzIHRoZSBob3VyIHZhbHVlIGJ5IG9uZS4gKi9cbiAgICBkZWNyZWFzZUhvdXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWUuaG91ciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGltZS5ob3VyID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IDIzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSB0aGlzLnRpbWUuaG91ciAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWVyaWRpYW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheWVkSG91cigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy50aW1lKTtcbiAgICB9XG5cbiAgICAvKiogSW5jcmVhc2VzIHRoZSBtaW51dGUgdmFsdWUgYnkgb25lLiAqL1xuICAgIGluY3JlYXNlTWludXRlKCkge1xuICAgICAgICBpZiAodGhpcy50aW1lLm1pbnV0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy50aW1lLm1pbnV0ZSA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50aW1lLm1pbnV0ZSA9PT0gNTkpIHtcbiAgICAgICAgICAgIHRoaXMudGltZS5taW51dGUgPSAwO1xuICAgICAgICAgICAgdGhpcy5pbmNyZWFzZUhvdXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGltZS5taW51dGUgPSB0aGlzLnRpbWUubWludXRlICsgMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgfVxuXG4gICAgLyoqIERlY3JlYXNlcyB0aGUgbWludXRlIHZhbHVlIGJ5IG9uZS4gKi9cbiAgICBkZWNyZWFzZU1pbnV0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMudGltZS5taW51dGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudGltZS5taW51dGUgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGltZS5taW51dGUgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMudGltZS5taW51dGUgPSA1OTtcbiAgICAgICAgICAgIHRoaXMuZGVjcmVhc2VIb3VyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRpbWUubWludXRlID0gdGhpcy50aW1lLm1pbnV0ZSAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnRpbWUpO1xuICAgIH1cblxuICAgIC8qKiBJbmNyZWFzZXMgdGhlIHNlY29uZCB2YWx1ZSBieSBvbmUuICovXG4gICAgaW5jcmVhc2VTZWNvbmQoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc3BsYXlTZWNvbmRzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50aW1lLnNlY29uZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZS5zZWNvbmQgPSAwO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRpbWUuc2Vjb25kID09PSA1OSkge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZS5zZWNvbmQgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jcmVhc2VNaW51dGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lLnNlY29uZCA9IHRoaXMudGltZS5zZWNvbmQgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy50aW1lKTtcbiAgICB9XG5cbiAgICAvKiogRGVjcmVhc2VzIHRoZSBzZWNvbmQgdmFsdWUgYnkgb25lLiAqL1xuICAgIGRlY3JlYXNlU2Vjb25kKCkge1xuICAgICAgICBpZiAodGhpcy5kaXNwbGF5U2Vjb25kcykge1xuICAgICAgICAgICAgaWYgKHRoaXMudGltZS5zZWNvbmQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWUuc2Vjb25kID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy50aW1lLnNlY29uZCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZS5zZWNvbmQgPSA1OTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY3JlYXNlTWludXRlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZS5zZWNvbmQgPSB0aGlzLnRpbWUuc2Vjb25kIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgfVxuXG4gICAgLyoqIFRvZ2dsZXMgdGhlIHBlcmlvZCAoYW0vcG0pLiAqL1xuICAgIHRvZ2dsZVBlcmlvZCgpIHtcbiAgICAgICAgaWYgKHRoaXMudGltZS5ob3VyIDwgMjQgJiYgdGhpcy50aW1lLmhvdXIgPj0gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucGVyaW9kID09PSAnYW0nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJpb2QgPSAncG0nO1xuICAgICAgICAgICAgICAgIHRoaXMucGVyaW9kTW9kZWxDaGFuZ2UoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wZXJpb2QgPT09ICdwbScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlcmlvZCA9ICdhbSc7XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJpb2RNb2RlbENoYW5nZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBob3VyTW9kZWxDaGFuZ2UoKSB7XG4gICAgICAgIGlmICh0aGlzLm1lcmlkaWFuKSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzLnRpbWUuaG91ciA+IDEyIHx8IHRoaXMudGltZS5ob3VyIDwgMCkgfHwgIXRoaXMudmFsaWRhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzLnRpbWUuaG91ciA+IDIzIHx8IHRoaXMudGltZS5ob3VyIDwgMCkgfHwgIXRoaXMudmFsaWRhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG1pbnV0ZU1vZGVsQ2hhbmdlKCkge1xuICAgICAgICBpZiAoISh0aGlzLnRpbWUubWludXRlID4gNTkgfHwgdGhpcy50aW1lLm1pbnV0ZSA8IDApIHx8ICF0aGlzLnZhbGlkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHNlY29uZE1vZGVsQ2hhbmdlKCkge1xuICAgICAgICBpZiAoISh0aGlzLnRpbWUuc2Vjb25kID4gNTkgfHwgdGhpcy50aW1lLnNlY29uZCA8IDApIHx8ICF0aGlzLnZhbGlkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHBlcmlvZE1vZGVsQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnBlcmlvZCA9IHRoaXMucGVyaW9kLnRvTG93ZXJDYXNlKCk7X