UNPKG

ng-timeparser

Version:

[![npm version](https://badge.fury.io/js/ng-timeparser.svg)](https://badge.fury.io/js/ng-timeparser) [![Build Status](https://travis-ci.org/feeloor/ng-timeparser.svg?branch=master)](https://travis-ci.org/feeloor/ng-timeparser)

299 lines (289 loc) 26 kB
import { Injectable, Directive, HostListener, Output, EventEmitter, Input, NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var TimeParserService = /** @class */ (function () { function TimeParserService() { } /** * Parses given time-string to a correct 4 digit time or empty if it's an invalid time * @param {?} inputTime Time-string to parse * @param {?=} militaryTime Use military time (24 hour format) * @return {?} */ TimeParserService.prototype.parseTime = /** * Parses given time-string to a correct 4 digit time or empty if it's an invalid time * @param {?} inputTime Time-string to parse * @param {?=} militaryTime Use military time (24 hour format) * @return {?} */ function (inputTime, militaryTime) { if (militaryTime === void 0) { militaryTime = false; } var /** @type {?} */ returnTime = ''; var /** @type {?} */ correctFormat = false; var /** @type {?} */ time = inputTime; // English (12 hours pattern) if (!militaryTime) { if (new RegExp(/^[2-9][0-9].*$/).test(time) && (time.match(/\d/g) || []).length !== 3) { // Matches 22 or 22 PM but not 321 or 321 PM/AM correctFormat = false; time = ''; } else if (new RegExp(/^[0-1][0-9]:[0-5][0-9].*$/).test(time)) { // Matches for example 07:30 or 07:30 PM/AM correctFormat = true; time = this.addAMorPM(time, 0, 5); } else if (new RegExp(/^[0-1][0-9][0-5][0-9].*$/).test(time)) { // Matches for example 0730 or 0730 PM/AM correctFormat = true; time = this.addAMorPM(time, 0, 4); } else if (new RegExp(/^[0-9]:[0-5][0-9].*$/).test(time)) { // Matches for example 9:33 and 9:33 PM/AM correctFormat = true; time = "0" + this.addAMorPM(time, 0, 4); } else if (new RegExp(/^[0-9][0-5][0-9].*$/).test(time)) { // Matches for example 933 and 933 PM/AM correctFormat = true; time = "0" + this.addAMorPM(time, 0, 3); } else if (new RegExp(/^[0-1][0-2].*$/).test(time)) { // Matches 12 or 12 PM/AM correctFormat = true; time = this.addAMorPM(time, 0, 2); } else if (new RegExp(/^[0-9].*$/).test(time)) { // Matches for example 3 and 3 PM/AM correctFormat = true; time = this.addAMorPM(time, 0, 1); } // French / Military Time (24 hours pattern) } else { if (new RegExp(/^[0-2][0-9]:[0-5][0-9]$/).test(time)) { // Matches 17:30 correctFormat = true; } else if (new RegExp(/^[0-2][0-9][0-5][0-9]$/).test(time)) { // Matches 1730 correctFormat = true; } else if (new RegExp(/^[0-2][0-9]:[0-5]$/).test(time)) { // Matches 22:3 correctFormat = true; time = time + "0"; } else if (new RegExp(/^[0-2][0-9][0-5]$/).test(time)) { // Matches 223 correctFormat = true; time = time + "0"; } else if (new RegExp(/^[0-9]:[0-5][0-9]$/).test(time)) { // Matches 7:30 correctFormat = true; time = "0" + time; } else if (new RegExp(/^[0-9][0-5][0-9]$/).test(time)) { // Matches 730 correctFormat = true; time = "0" + time; } else if (new RegExp(/^[0-2][0-9]/).test(time)) { // Matches 19 correctFormat = true; time = time + "00"; } else if (new RegExp(/^[0-9]/).test(time)) { // Matches 9 correctFormat = true; time = "0" + time + "00"; } } // Create return data if (correctFormat) { time = time.toUpperCase(); time = this.makeTime4Digit(time); returnTime = this.addColonIfMissing(time); if (militaryTime) { returnTime = returnTime.substring(0, 5); } } else { returnTime = ''; } return returnTime; }; /** * Parses a valid time to a 4 digit time * For example 4 PM to 04:00 PM or 4:30 PM to 04:30 PM * @param {?} time Time-string to parse to 4 digit * @return {?} */ TimeParserService.prototype.makeTime4Digit = /** * Parses a valid time to a 4 digit time * For example 4 PM to 04:00 PM or 4:30 PM to 04:30 PM * @param {?} time Time-string to parse to 4 digit * @return {?} */ function (time) { var /** @type {?} */ preAMorPM = ''; var /** @type {?} */ parsed = time; // Get any existing AM/PM if (new RegExp(/PM/i).test(time)) { preAMorPM = 'PM'; parsed = parsed.replace(/PM/i, ''); } else if (new RegExp(/AM/i).test(time)) { preAMorPM = 'AM'; parsed = parsed.replace(/AM/i, ''); } parsed = parsed.replace(':', ''); parsed = parsed.replace(/ /g, ''); if (parsed.length === 1) { parsed = "0" + parsed + "00"; } else if (parsed.length === 2) { parsed = parsed + "00"; } else if (parsed.length === 3) { if (new RegExp(/^[0-1][0-9][0-5]/).test(parsed)) { parsed = parsed + "0"; } else if (new RegExp(/^[0-9][0-5][0-9]/).test(parsed)) { parsed = "0" + parsed; } } return "" + parsed + (preAMorPM ? ' ' + preAMorPM : ''); }; /** * Adds a colon if it's missing to given time-string * For example 0400 to 04:00 * @param {?} time Time-string to add missing colon to * @return {?} */ TimeParserService.prototype.addColonIfMissing = /** * Adds a colon if it's missing to given time-string * For example 0400 to 04:00 * @param {?} time Time-string to add missing colon to * @return {?} */ function (time) { if (time.indexOf(':') === -1) { return time.substring(0, 2) + ":" + time.substring(2); } return time; }; /** * Takes start and end of time-string and then adds correct AM/PM * @param {?} time Time-string to add AM or PM too * @param {?} start Where time starts in string * @param {?} end Where time ends in string * @return {?} */ TimeParserService.prototype.addAMorPM = /** * Takes start and end of time-string and then adds correct AM/PM * @param {?} time Time-string to add AM or PM too * @param {?} start Where time starts in string * @param {?} end Where time ends in string * @return {?} */ function (time, start, end) { if (new RegExp(/PM/i).test(time)) { return time.substring(start, end) + " PM"; } else if (new RegExp(/AM/i).test(time)) { return time.substring(start, end) + " AM"; } else { return time.substring(start, end) + " PM"; } }; TimeParserService.decorators = [ { type: Injectable }, ]; /** @nocollapse */ TimeParserService.ctorParameters = function () { return []; }; return TimeParserService; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var TimeParserDirective = /** @class */ (function () { function TimeParserDirective(timeParserService) { this.timeParserService = timeParserService; this.ngModelChange = new EventEmitter(); this.militaryTime = this.militaryTime || false; } /** * @param {?} event * @return {?} */ TimeParserDirective.prototype.onBlur = /** * @param {?} event * @return {?} */ function (event) { this.ngModelChange.emit(this.timeParserService.parseTime(event.target.value, this.militaryTime)); }; TimeParserDirective.decorators = [ { type: Directive, args: [{ selector: '[timeParser]' },] }, ]; /** @nocollapse */ TimeParserDirective.ctorParameters = function () { return [ { type: TimeParserService, }, ]; }; TimeParserDirective.propDecorators = { "militaryTime": [{ type: Input },], "ngModelChange": [{ type: Output },], "onBlur": [{ type: HostListener, args: ['blur', ['$event'],] },], }; return TimeParserDirective; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var TimeParserModule = /** @class */ (function () { function TimeParserModule() { } TimeParserModule.decorators = [ { type: NgModule, args: [{ imports: [ CommonModule ], declarations: [TimeParserDirective], providers: [TimeParserService], exports: [TimeParserDirective] },] }, ]; return TimeParserModule; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ export { TimeParserDirective, TimeParserService, TimeParserModule }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdGltZXBhcnNlci5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbmctdGltZXBhcnNlci9zcmMvYXBwL3RpbWUtcGFyc2VyL3NlcnZpY2VzL3RpbWUtcGFyc2VyLnNlcnZpY2UudHMiLCJuZzovL25nLXRpbWVwYXJzZXIvc3JjL2FwcC90aW1lLXBhcnNlci9kaXJlY3RpdmVzL3RpbWUtcGFyc2VyLmRpcmVjdGl2ZS50cyIsIm5nOi8vbmctdGltZXBhcnNlci9zcmMvYXBwL3RpbWUtcGFyc2VyL3RpbWUtcGFyc2VyLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUaW1lUGFyc2VyU2VydmljZSB7XG5cbiAgY29uc3RydWN0b3IoKSB7IH1cblxuICAvKipcbiAgICogUGFyc2VzIGdpdmVuIHRpbWUtc3RyaW5nIHRvIGEgY29ycmVjdCA0IGRpZ2l0IHRpbWUgb3IgZW1wdHkgaWYgaXQncyBhbiBpbnZhbGlkIHRpbWVcbiAgICogQHBhcmFtIGlucHV0VGltZSBUaW1lLXN0cmluZyB0byBwYXJzZVxuICAgKiBAcGFyYW0gbWlsaXRhcnlUaW1lIFVzZSBtaWxpdGFyeSB0aW1lICgyNCBob3VyIGZvcm1hdClcbiAgICovXG4gIHB1YmxpYyBwYXJzZVRpbWUoaW5wdXRUaW1lOiBzdHJpbmcsIG1pbGl0YXJ5VGltZTogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICBsZXQgcmV0dXJuVGltZSA9ICcnO1xuICAgIGxldCBjb3JyZWN0Rm9ybWF0ID0gZmFsc2U7XG4gICAgbGV0IHRpbWUgPSBpbnB1dFRpbWU7XG5cbiAgICAvLyBFbmdsaXNoICgxMiBob3VycyBwYXR0ZXJuKVxuICAgIGlmICghbWlsaXRhcnlUaW1lKSB7XG4gICAgICBpZiAobmV3IFJlZ0V4cCgvXlsyLTldWzAtOV0uKiQvKS50ZXN0KHRpbWUpICYmICh0aW1lLm1hdGNoKC9cXGQvZykgfHwgW10pLmxlbmd0aCAhPT0gMykge1xuICAgICAgICAvLyBNYXRjaGVzIDIyIG9yIDIyIFBNIGJ1dCBub3QgMzIxIG9yIDMyMSBQTS9BTVxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gZmFsc2U7XG4gICAgICAgIHRpbWUgPSAnJztcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTFdWzAtOV06WzAtNV1bMC05XS4qJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyBmb3IgZXhhbXBsZSAwNzozMCBvciAwNzozMCBQTS9BTVxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IHRoaXMuYWRkQU1vclBNKHRpbWUsIDAsIDUpO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtMV1bMC05XVswLTVdWzAtOV0uKiQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgZm9yIGV4YW1wbGUgMDczMCBvciAwNzMwIFBNL0FNXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gdGhpcy5hZGRBTW9yUE0odGltZSwgMCwgNCk7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC05XTpbMC01XVswLTldLiokLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIGZvciBleGFtcGxlIDk6MzMgYW5kIDk6MzMgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSBgMCR7dGhpcy5hZGRBTW9yUE0odGltZSwgMCwgNCl9YDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTldWzAtNV1bMC05XS4qJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyBmb3IgZXhhbXBsZSA5MzMgYW5kIDkzMyBQTS9BTVxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IGAwJHt0aGlzLmFkZEFNb3JQTSh0aW1lLCAwLCAzKX1gO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtMV1bMC0yXS4qJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyAxMiBvciAxMiBQTS9BTVxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IHRoaXMuYWRkQU1vclBNKHRpbWUsIDAsIDIpO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtOV0uKiQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgZm9yIGV4YW1wbGUgMyBhbmQgMyBQTS9BTVxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IHRoaXMuYWRkQU1vclBNKHRpbWUsIDAsIDEpO1xuICAgICAgfVxuICAgICAgLy8gRnJlbmNoIC8gTWlsaXRhcnkgVGltZSAoMjQgaG91cnMgcGF0dGVybilcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG5ldyBSZWdFeHAoL15bMC0yXVswLTldOlswLTVdWzAtOV0kLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIDE3OjMwXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtMl1bMC05XVswLTVdWzAtOV0kLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIDE3MzBcbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC0yXVswLTldOlswLTVdJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyAyMjozXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gYCR7dGltZX0wYDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTJdWzAtOV1bMC01XSQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgMjIzXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gYCR7dGltZX0wYDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTldOlswLTVdWzAtOV0kLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIDc6MzBcbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSBgMCR7dGltZX1gO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtOV1bMC01XVswLTldJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyA3MzBcbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSBgMCR7dGltZX1gO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtMl1bMC05XS8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyAxOVxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IGAke3RpbWV9MDBgO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtOV0vKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgOVxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IGAwJHt0aW1lfTAwYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgcmV0dXJuIGRhdGFcbiAgICBpZiAoY29ycmVjdEZvcm1hdCkge1xuICAgICAgdGltZSA9IHRpbWUudG9VcHBlckNhc2UoKTtcbiAgICAgIHRpbWUgPSB0aGlzLm1ha2VUaW1lNERpZ2l0KHRpbWUpO1xuICAgICAgcmV0dXJuVGltZSA9IHRoaXMuYWRkQ29sb25JZk1pc3NpbmcodGltZSk7XG5cbiAgICAgIGlmIChtaWxpdGFyeVRpbWUpIHtcbiAgICAgICAgcmV0dXJuVGltZSA9IHJldHVyblRpbWUuc3Vic3RyaW5nKDAsIDUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm5UaW1lID0gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVyblRpbWU7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGEgdmFsaWQgdGltZSB0byBhIDQgZGlnaXQgdGltZVxuICAgKiBGb3IgZXhhbXBsZSA0IFBNIHRvIDA0OjAwIFBNIG9yIDQ6MzAgUE0gdG8gMDQ6MzAgUE1cbiAgICogQHBhcmFtIHRpbWUgVGltZS1zdHJpbmcgdG8gcGFyc2UgdG8gNCBkaWdpdFxuICAgKi9cbiAgcHJpdmF0ZSBtYWtlVGltZTREaWdpdCh0aW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBwcmVBTW9yUE0gPSAnJztcbiAgICBsZXQgcGFyc2VkID0gdGltZTtcblxuICAgIC8vIEdldCBhbnkgZXhpc3RpbmcgQU0vUE1cbiAgICBpZiAobmV3IFJlZ0V4cCgvUE0vaSkudGVzdCh0aW1lKSkge1xuICAgICAgcHJlQU1vclBNID0gJ1BNJztcbiAgICAgIHBhcnNlZCA9IHBhcnNlZC5yZXBsYWNlKC9QTS9pLCAnJyk7XG4gICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9BTS9pKS50ZXN0KHRpbWUpKSB7XG4gICAgICBwcmVBTW9yUE0gPSAnQU0nO1xuICAgICAgcGFyc2VkID0gcGFyc2VkLnJlcGxhY2UoL0FNL2ksICcnKTtcbiAgICB9XG5cbiAgICBwYXJzZWQgPSBwYXJzZWQucmVwbGFjZSgnOicsICcnKTtcbiAgICBwYXJzZWQgPSBwYXJzZWQucmVwbGFjZSgvIC9nLCAnJyk7XG4gICAgaWYgKHBhcnNlZC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHBhcnNlZCA9IGAwJHtwYXJzZWR9MDBgO1xuICAgIH0gZWxzZSBpZiAocGFyc2VkLmxlbmd0aCA9PT0gMikge1xuICAgICAgcGFyc2VkID0gYCR7cGFyc2VkfTAwYDtcbiAgICB9IGVsc2UgaWYgKHBhcnNlZC5sZW5ndGggPT09IDMpIHtcbiAgICAgIGlmIChuZXcgUmVnRXhwKC9eWzAtMV1bMC05XVswLTVdLykudGVzdChwYXJzZWQpKSB7XG4gICAgICAgIHBhcnNlZCA9IGAke3BhcnNlZH0wYDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTldWzAtNV1bMC05XS8pLnRlc3QocGFyc2VkKSkge1xuICAgICAgICBwYXJzZWQgPSBgMCR7cGFyc2VkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3BhcnNlZH0ke3ByZUFNb3JQTSA/ICcgJyArIHByZUFNb3JQTSA6ICcnfWA7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbG9uIGlmIGl0J3MgbWlzc2luZyB0byBnaXZlbiB0aW1lLXN0cmluZ1xuICAgKiBGb3IgZXhhbXBsZSAwNDAwIHRvIDA0OjAwXG4gICAqIEBwYXJhbSB0aW1lIFRpbWUtc3RyaW5nIHRvIGFkZCBtaXNzaW5nIGNvbG9uIHRvXG4gICAqL1xuICBwcml2YXRlIGFkZENvbG9uSWZNaXNzaW5nKHRpbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRpbWUuaW5kZXhPZignOicpID09PSAtMSkge1xuICAgICAgcmV0dXJuIGAke3RpbWUuc3Vic3RyaW5nKDAsIDIpfToke3RpbWUuc3Vic3RyaW5nKDIpfWA7XG4gICAgfVxuICAgIHJldHVybiB0aW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIHN0YXJ0IGFuZCBlbmQgb2YgdGltZS1zdHJpbmcgYW5kIHRoZW4gYWRkcyBjb3JyZWN0IEFNL1BNXG4gICAqIEBwYXJhbSB0aW1lIFRpbWUtc3RyaW5nIHRvIGFkZCBBTSBvciBQTSB0b29cbiAgICogQHBhcmFtIHN0YXJ0IFdoZXJlIHRpbWUgc3RhcnRzIGluIHN0cmluZ1xuICAgKiBAcGFyYW0gZW5kIFdoZXJlIHRpbWUgZW5kcyBpbiBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgYWRkQU1vclBNKHRpbWU6IHN0cmluZywgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChuZXcgUmVnRXhwKC9QTS9pKS50ZXN0KHRpbWUpKSB7XG4gICAgICByZXR1cm4gYCR7dGltZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCl9IFBNYDtcbiAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL0FNL2kpLnRlc3QodGltZSkpIHtcbiAgICAgIHJldHVybiBgJHt0aW1lLnN1YnN0cmluZyhzdGFydCwgZW5kKX0gQU1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYCR7dGltZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCl9IFBNYDtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdExpc3RlbmVyLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgVGltZVBhcnNlclNlcnZpY2UgfSBmcm9tICcuLy4uL3NlcnZpY2VzJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3RpbWVQYXJzZXJdJ1xufSlcbmV4cG9ydCBjbGFzcyBUaW1lUGFyc2VyRGlyZWN0aXZlIHtcbiAgQElucHV0KCkgbWlsaXRhcnlUaW1lOiBib29sZWFuO1xuICBAT3V0cHV0KCkgbmdNb2RlbENoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRpbWVQYXJzZXJTZXJ2aWNlOiBUaW1lUGFyc2VyU2VydmljZSkge1xuICAgIHRoaXMubWlsaXRhcnlUaW1lID0gdGhpcy5taWxpdGFyeVRpbWUgfHwgZmFsc2U7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdibHVyJywgWyckZXZlbnQnXSkgb25CbHVyKGV2ZW50KSB7XG4gICAgdGhpcy5uZ01vZGVsQ2hhbmdlLmVtaXQodGhpcy50aW1lUGFyc2VyU2VydmljZS5wYXJzZVRpbWUoZXZlbnQudGFyZ2V0LnZhbHVlLCB0aGlzLm1pbGl0YXJ5VGltZSkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHsgVGltZVBhcnNlclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzJztcbmltcG9ydCB7IFRpbWVQYXJzZXJEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW1RpbWVQYXJzZXJEaXJlY3RpdmVdLFxuICBwcm92aWRlcnM6IFtUaW1lUGFyc2VyU2VydmljZV0sXG4gIGV4cG9ydHM6IFtUaW1lUGFyc2VyRGlyZWN0aXZlXVxufSlcbmV4cG9ydCBjbGFzcyBUaW1lUGFyc2VyTW9kdWxlIHsgfVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtJQUtFO0tBQWlCOzs7Ozs7O0lBT1YscUNBQVM7Ozs7OztjQUFDLFNBQWlCLEVBQUUsWUFBNkI7UUFBN0IsNkJBQUEsRUFBQSxvQkFBNkI7UUFDL0QscUJBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNwQixxQkFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzFCLHFCQUFJLElBQUksR0FBRyxTQUFTLENBQUM7O1FBR3JCLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDakIsSUFBSSxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sS0FBSyxDQUFDLEVBQUU7O2dCQUVyRixhQUFhLEdBQUcsS0FBSyxDQUFDO2dCQUN0QixJQUFJLEdBQUcsRUFBRSxDQUFDO2FBQ1g7aUJBQU0sSUFBSSxJQUFJLE1BQU0sQ0FBQywy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