UNPKG

fundamental-ngx

Version:

SAP Fiori Fundamentals, implemented in Angular

636 lines 51.9 kB
/** * @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