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)

312 lines (300 loc) 28.5 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common')) : typeof define === 'function' && define.amd ? define('ng-timeparser', ['exports', '@angular/core', '@angular/common'], factory) : (factory((global['ng-timeparser'] = {}),global.ng.core,global.ng.common)); }(this, (function (exports,core,common) { 'use strict'; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var TimeParserService = (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: core.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 = (function () { function TimeParserDirective(timeParserService) { this.timeParserService = timeParserService; this.ngModelChange = new core.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: core.Directive, args: [{ selector: '[timeParser]' },] }, ]; /** @nocollapse */ TimeParserDirective.ctorParameters = function () { return [ { type: TimeParserService, }, ]; }; TimeParserDirective.propDecorators = { "militaryTime": [{ type: core.Input },], "ngModelChange": [{ type: core.Output },], "onBlur": [{ type: core.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 = (function () { function TimeParserModule() { } TimeParserModule.decorators = [ { type: core.NgModule, args: [{ imports: [ common.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 */ exports.TimeParserDirective = TimeParserDirective; exports.TimeParserService = TimeParserService; exports.TimeParserModule = TimeParserModule; Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdGltZXBhcnNlci51bWQuanMubWFwIiwic291cmNlcyI6WyJuZzovL25nLXRpbWVwYXJzZXIvc3JjL2FwcC90aW1lLXBhcnNlci9zZXJ2aWNlcy90aW1lLXBhcnNlci5zZXJ2aWNlLnRzIiwibmc6Ly9uZy10aW1lcGFyc2VyL3NyYy9hcHAvdGltZS1wYXJzZXIvZGlyZWN0aXZlcy90aW1lLXBhcnNlci5kaXJlY3RpdmUudHMiLCJuZzovL25nLXRpbWVwYXJzZXIvc3JjL2FwcC90aW1lLXBhcnNlci90aW1lLXBhcnNlci5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGltZVBhcnNlclNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBnaXZlbiB0aW1lLXN0cmluZyB0byBhIGNvcnJlY3QgNCBkaWdpdCB0aW1lIG9yIGVtcHR5IGlmIGl0J3MgYW4gaW52YWxpZCB0aW1lXG4gICAqIEBwYXJhbSBpbnB1dFRpbWUgVGltZS1zdHJpbmcgdG8gcGFyc2VcbiAgICogQHBhcmFtIG1pbGl0YXJ5VGltZSBVc2UgbWlsaXRhcnkgdGltZSAoMjQgaG91ciBmb3JtYXQpXG4gICAqL1xuICBwdWJsaWMgcGFyc2VUaW1lKGlucHV0VGltZTogc3RyaW5nLCBtaWxpdGFyeVRpbWU6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgbGV0IHJldHVyblRpbWUgPSAnJztcbiAgICBsZXQgY29ycmVjdEZvcm1hdCA9IGZhbHNlO1xuICAgIGxldCB0aW1lID0gaW5wdXRUaW1lO1xuXG4gICAgLy8gRW5nbGlzaCAoMTIgaG91cnMgcGF0dGVybilcbiAgICBpZiAoIW1pbGl0YXJ5VGltZSkge1xuICAgICAgaWYgKG5ldyBSZWdFeHAoL15bMi05XVswLTldLiokLykudGVzdCh0aW1lKSAmJiAodGltZS5tYXRjaCgvXFxkL2cpIHx8IFtdKS5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyAyMiBvciAyMiBQTSBidXQgbm90IDMyMSBvciAzMjEgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IGZhbHNlO1xuICAgICAgICB0aW1lID0gJyc7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC0xXVswLTldOlswLTVdWzAtOV0uKiQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgZm9yIGV4YW1wbGUgMDc6MzAgb3IgMDc6MzAgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSB0aGlzLmFkZEFNb3JQTSh0aW1lLCAwLCA1KTtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTFdWzAtOV1bMC01XVswLTldLiokLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIGZvciBleGFtcGxlIDA3MzAgb3IgMDczMCBQTS9BTVxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IHRoaXMuYWRkQU1vclBNKHRpbWUsIDAsIDQpO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtOV06WzAtNV1bMC05XS4qJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyBmb3IgZXhhbXBsZSA5OjMzIGFuZCA5OjMzIFBNL0FNXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gYDAke3RoaXMuYWRkQU1vclBNKHRpbWUsIDAsIDQpfWA7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC05XVswLTVdWzAtOV0uKiQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgZm9yIGV4YW1wbGUgOTMzIGFuZCA5MzMgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSBgMCR7dGhpcy5hZGRBTW9yUE0odGltZSwgMCwgMyl9YDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTFdWzAtMl0uKiQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgMTIgb3IgMTIgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSB0aGlzLmFkZEFNb3JQTSh0aW1lLCAwLCAyKTtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTldLiokLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIGZvciBleGFtcGxlIDMgYW5kIDMgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSB0aGlzLmFkZEFNb3JQTSh0aW1lLCAwLCAxKTtcbiAgICAgIH1cbiAgICAgIC8vIEZyZW5jaCAvIE1pbGl0YXJ5IFRpbWUgKDI0IGhvdXJzIHBhdHRlcm4pXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuZXcgUmVnRXhwKC9eWzAtMl1bMC05XTpbMC01XVswLTldJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyAxNzozMFxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTJdWzAtOV1bMC01XVswLTldJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyAxNzMwXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtMl1bMC05XTpbMC01XSQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgMjI6M1xuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IGAke3RpbWV9MGA7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC0yXVswLTldWzAtNV0kLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIDIyM1xuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IGAke3RpbWV9MGA7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC05XTpbMC01XVswLTldJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyA3OjMwXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gYDAke3RpbWV9YDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTldWzAtNV1bMC05XSQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgNzMwXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gYDAke3RpbWV9YDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTJdWzAtOV0vKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgMTlcbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSBgJHt0aW1lfTAwYDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTldLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIDlcbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSBgMCR7dGltZX0wMGA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHJldHVybiBkYXRhXG4gICAgaWYgKGNvcnJlY3RGb3JtYXQpIHtcbiAgICAgIHRpbWUgPSB0aW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICB0aW1lID0gdGhpcy5tYWtlVGltZTREaWdpdCh0aW1lKTtcbiAgICAgIHJldHVyblRpbWUgPSB0aGlzLmFkZENvbG9uSWZNaXNzaW5nKHRpbWUpO1xuXG4gICAgICBpZiAobWlsaXRhcnlUaW1lKSB7XG4gICAgICAgIHJldHVyblRpbWUgPSByZXR1cm5UaW1lLnN1YnN0cmluZygwLCA1KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuVGltZSA9ICcnO1xuICAgIH1cblxuICAgIHJldHVybiByZXR1cm5UaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhIHZhbGlkIHRpbWUgdG8gYSA0IGRpZ2l0IHRpbWVcbiAgICogRm9yIGV4YW1wbGUgNCBQTSB0byAwNDowMCBQTSBvciA0OjMwIFBNIHRvIDA0OjMwIFBNXG4gICAqIEBwYXJhbSB0aW1lIFRpbWUtc3RyaW5nIHRvIHBhcnNlIHRvIDQgZGlnaXRcbiAgICovXG4gIHByaXZhdGUgbWFrZVRpbWU0RGlnaXQodGltZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlQU1vclBNID0gJyc7XG4gICAgbGV0IHBhcnNlZCA9IHRpbWU7XG5cbiAgICAvLyBHZXQgYW55IGV4aXN0aW5nIEFNL1BNXG4gICAgaWYgKG5ldyBSZWdFeHAoL1BNL2kpLnRlc3QodGltZSkpIHtcbiAgICAgIHByZUFNb3JQTSA9ICdQTSc7XG4gICAgICBwYXJzZWQgPSBwYXJzZWQucmVwbGFjZSgvUE0vaSwgJycpO1xuICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvQU0vaSkudGVzdCh0aW1lKSkge1xuICAgICAgcHJlQU1vclBNID0gJ0FNJztcbiAgICAgIHBhcnNlZCA9IHBhcnNlZC5yZXBsYWNlKC9BTS9pLCAnJyk7XG4gICAgfVxuXG4gICAgcGFyc2VkID0gcGFyc2VkLnJlcGxhY2UoJzonLCAnJyk7XG4gICAgcGFyc2VkID0gcGFyc2VkLnJlcGxhY2UoLyAvZywgJycpO1xuICAgIGlmIChwYXJzZWQubGVuZ3RoID09PSAxKSB7XG4gICAgICBwYXJzZWQgPSBgMCR7cGFyc2VkfTAwYDtcbiAgICB9IGVsc2UgaWYgKHBhcnNlZC5sZW5ndGggPT09IDIpIHtcbiAgICAgIHBhcnNlZCA9IGAke3BhcnNlZH0wMGA7XG4gICAgfSBlbHNlIGlmIChwYXJzZWQubGVuZ3RoID09PSAzKSB7XG4gICAgICBpZiAobmV3IFJlZ0V4cCgvXlswLTFdWzAtOV1bMC01XS8pLnRlc3QocGFyc2VkKSkge1xuICAgICAgICBwYXJzZWQgPSBgJHtwYXJzZWR9MGA7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC05XVswLTVdWzAtOV0vKS50ZXN0KHBhcnNlZCkpIHtcbiAgICAgICAgcGFyc2VkID0gYDAke3BhcnNlZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBgJHtwYXJzZWR9JHtwcmVBTW9yUE0gPyAnICcgKyBwcmVBTW9yUE0gOiAnJ31gO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb2xvbiBpZiBpdCdzIG1pc3NpbmcgdG8gZ2l2ZW4gdGltZS1zdHJpbmdcbiAgICogRm9yIGV4YW1wbGUgMDQwMCB0byAwNDowMFxuICAgKiBAcGFyYW0gdGltZSBUaW1lLXN0cmluZyB0byBhZGQgbWlzc2luZyBjb2xvbiB0b1xuICAgKi9cbiAgcHJpdmF0ZSBhZGRDb2xvbklmTWlzc2luZyh0aW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aW1lLmluZGV4T2YoJzonKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBgJHt0aW1lLnN1YnN0cmluZygwLCAyKX06JHt0aW1lLnN1YnN0cmluZygyKX1gO1xuICAgIH1cbiAgICByZXR1cm4gdGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBzdGFydCBhbmQgZW5kIG9mIHRpbWUtc3RyaW5nIGFuZCB0aGVuIGFkZHMgY29ycmVjdCBBTS9QTVxuICAgKiBAcGFyYW0gdGltZSBUaW1lLXN0cmluZyB0byBhZGQgQU0gb3IgUE0gdG9vXG4gICAqIEBwYXJhbSBzdGFydCBXaGVyZSB0aW1lIHN0YXJ0cyBpbiBzdHJpbmdcbiAgICogQHBhcmFtIGVuZCBXaGVyZSB0aW1lIGVuZHMgaW4gc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIGFkZEFNb3JQTSh0aW1lOiBzdHJpbmcsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgvUE0vaSkudGVzdCh0aW1lKSkge1xuICAgICAgcmV0dXJuIGAke3RpbWUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpfSBQTWA7XG4gICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9BTS9pKS50ZXN0KHRpbWUpKSB7XG4gICAgICByZXR1cm4gYCR7dGltZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCl9IEFNYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGAke3RpbWUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpfSBQTWA7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFRpbWVQYXJzZXJTZXJ2aWNlIH0gZnJvbSAnLi8uLi9zZXJ2aWNlcyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1t0aW1lUGFyc2VyXSdcbn0pXG5leHBvcnQgY2xhc3MgVGltZVBhcnNlckRpcmVjdGl2ZSB7XG4gIEBJbnB1dCgpIG1pbGl0YXJ5VGltZTogYm9vbGVhbjtcbiAgQE91dHB1dCgpIG5nTW9kZWxDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0aW1lUGFyc2VyU2VydmljZTogVGltZVBhcnNlclNlcnZpY2UpIHtcbiAgICB0aGlzLm1pbGl0YXJ5VGltZSA9IHRoaXMubWlsaXRhcnlUaW1lIHx8IGZhbHNlO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignYmx1cicsIFsnJGV2ZW50J10pIG9uQmx1cihldmVudCkge1xuICAgIHRoaXMubmdNb2RlbENoYW5nZS5lbWl0KHRoaXMudGltZVBhcnNlclNlcnZpY2UucGFyc2VUaW1lKGV2ZW50LnRhcmdldC52YWx1ZSwgdGhpcy5taWxpdGFyeVRpbWUpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7IFRpbWVQYXJzZXJTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBUaW1lUGFyc2VyRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZVxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtUaW1lUGFyc2VyRGlyZWN0aXZlXSxcbiAgcHJvdmlkZXJzOiBbVGltZVBhcnNlclNlcnZpY2VdLFxuICBleHBvcnRzOiBbVGltZVBhcnNlckRpcmVjdGl2ZV1cbn0pXG5leHBvcnQgY2xhc3MgVGltZVBhcnNlck1vZHVsZSB7IH1cbiJdLCJuYW1lcyI6WyJJbmplY3RhYmxlIiwiRXZlbnRFbWl0dGVyIiwiRGlyZWN0aXZlIiwiSW5wdXQiLCJPdXRwdXQiLCJIb3N0TGlzdGVuZXIiLCJOZ01vZHVsZSIsIkNvbW1vbk1vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO1FBS0U7U0FBaUI7Ozs7Ozs7UUFPVixxQ0FBUzs7Ozs7O3NCQUFDLFNBQWlCLEVBQUUsWUFBNkI7Z0JBQTdCLDZCQUFBO29CQUFBLG9CQUE2Qjs7Z0JBQy9ELHFCQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7Z0JBQ3BCLHFCQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7Z0JBQzFCLHFCQUFJLElBQUksR0FBRyxTQUFTLENBQUM7O2dCQUdyQixJQUFJLENBQUMsWUFBWSxFQUFFO29CQUNqQixJQUFJLElBQUksTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFF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