UNPKG

@singleton-i18n/angular-client

Version:

Singleton client code for Angular 10.

571 lines 72.9 kB
/* * Copyright 2019-2021 VMware, Inc. * SPDX-License-Identifier: EPL-2.0 */ import { Injectable } from '@angular/core'; export class DateFormatter { constructor() { } /** * Convert number or string to standard time * @param date * @return instance of Date or origin string */ getStandardTime(date) { const NUMBER_STRING = /^-?\d+$/; if (typeof date === 'string') { date = NUMBER_STRING.test(date) ? toInt(date) : getDateByString(date); } if (typeof date === 'number') { date = new Date(date); } return date; } /** * Get locale date time from standard date string * @return Formatted locale date time string */ getformattedString(date, pattern, localeData, minusSign = '-', timezone) { this.localeData = localeData; const rules = this.getRulesByPattern(pattern, localeData); const parts = this.patternFilter(rules); let dateTimezoneOffset = date.getTimezoneOffset(); if (timezone) { dateTimezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset); date = convertTimezoneToLocal(date, timezone); } let text = ''; parts.forEach(value => { const fn = this.getFormatFunctionByRule(value, minusSign); text += fn ? fn(date, dateTimezoneOffset) : value === '\'\'' ? '\'' : value.replace(/(^'|'$)/g, '').replace(/''/g, '\''); }); return text; } getRulesByPattern(pattern, localeData) { this.localeData = localeData; return this.getRules(pattern) ? this.getRules(pattern) : pattern; } /** * Get rules from pattern by type * @return The function to get locale string */ getRules(pattern) { let rules; switch (pattern) { case 'shortTime': rules = this.getRulesInPattern('time', 'short'); break; case 'mediumTime': rules = this.getRulesInPattern('time', 'medium'); break; case 'longTime': rules = this.getRulesInPattern('time', 'long'); break; case 'fullTime': rules = this.getRulesInPattern('time', 'full'); break; case 'shortDate': rules = this.getRulesInPattern('date', 'short'); break; case 'mediumDate': rules = this.getRulesInPattern('date', 'medium'); break; case 'longDate': rules = this.getRulesInPattern('date', 'long'); break; case 'fullDate': rules = this.getRulesInPattern('date', 'full'); break; case 'short': const shortDate = this.getRulesInPattern('date', 'short'); const shortTime = this.getRulesInPattern('time', 'short'); rules = this.formatDateTimeRules('short', [shortTime, shortDate]); break; case 'medium': const mediumDate = this.getRulesInPattern('date', 'medium'); const mediumTime = this.getRulesInPattern('time', 'medium'); rules = this.formatDateTimeRules('medium', [mediumTime, mediumDate]); break; case 'full': const fullDate = this.getRulesInPattern('date', 'full'); const fullTime = this.getRulesInPattern('time', 'full'); rules = this.formatDateTimeRules('full', [fullTime, fullDate]); break; case 'long': const longDate = this.getRulesInPattern('date', 'long'); const longTime = this.getRulesInPattern('time', 'long'); rules = this.formatDateTimeRules('long', [longTime, longDate]); break; default: rules = this.getRulesInPattern('dateTime', pattern); } return rules; } getRulesInPattern(name, type) { const rules = name !== 'dateTime' ? this.localeData[name + 'Formats'][type] : this.localeData[name + 'Formats']['availableFormats'][type]; return rules; } /** * The date-time pattern shows how to combine separate patterns for date (represented by {1}) * and time (represented by {0}) into a single pattern. */ formatDateTimeRules(type, rulesArray) { const format = this.localeData.dateTimeFormats[type]; const rules = format.replace(/\{([^}]+)}/g, function (match, key) { return (rulesArray != null && key in rulesArray) ? rulesArray[key] : match; }); return rules; } /** * Get locale date string from pattern */ dateStrGetter(name, width, type = 'format') { return (date) => { let text = ''; switch (name) { case 'Day': text = this.getLocaleString(date, name, width, type); break; case 'Month': text = this.getLocaleString(date, name, width, type); break; case 'dayPeriods': text = this.getDaysPeriods(date, name, width); break; case 'eras': text = this.getEras(date, name, width); break; } return text; }; } getLocaleString(date, name, width, type = 'format') { const firstLetter = type.slice(0, 1); type = type.replace(firstLetter, firstLetter.toUpperCase()); const namestr = name + 's'; const patternName = namestr.toLowerCase() + type; const value = getPartOfDate(date, name); const pattern = this.localeData[patternName][width]; return pattern[value]; } /** * Get periods of the day */ getDaysPeriods(date, name, width) { const pattern = this.localeData.dayPeriodsFormat[width]; return date.getHours() < 12 ? pattern[0] : pattern[1]; } /** * Get eras */ getEras(date, name, width) { const pattern = this.localeData.eras[width]; return date.getFullYear() < 0 ? pattern[0] : pattern[1]; } /** * Convert pattern string to pattern array */ patternFilter(pattern) { let parts = [], match; const mainWord = 'GyMLwWdEahHKmsSzZO', wordRange = 'G{1,5}|y{1,4}|M{1,5}|L{1,5}|w{1,2}|W{1}|d{1,2}|E{1,6}|a{1,5}|h{1,2}|H{1,2}|K{1,2}|m{1,2}|s{1,2}|S{1,3}|z{1,4}|Z{1,5}|O{1,4}'; const reg = `((?:[^` + mainWord + `']+)|(?:'(?:[^']|'')*')|(?:` + wordRange + '))([\\s\\S]*)'; const DATE_FORMATS_SPLIT = new RegExp(reg); while (pattern) { match = DATE_FORMATS_SPLIT.exec(pattern); if (match) { parts = this.concat(parts, match, 1); pattern = parts.pop(); } else { parts.push(pattern); pattern = null; } } return parts; } concat(array1, array2, index) { return array1.concat([].slice.call(array2, index)); } /** * Corresponding function of the rule */ getFormatFunctionByRule(rule, minusSign) { let fn = null; switch (rule) { // Era string for the current date case 'G': case 'GG': case 'GGG': fn = this.dateStrGetter('eras', 'abbreviated'); break; case 'GGGG': fn = this.dateStrGetter('eras', 'wide'); break; case 'GGGGG': fn = this.dateStrGetter('eras', 'narrow'); break; // Calendar year (numeric). case 'y': fn = dateGetter('FullYear', 1, 0, false, true); break; case 'yy': fn = dateGetter('FullYear', 2, 0, true, true); break; case 'yyy': fn = dateGetter('FullYear', 3, 0, false, true); break; case 'yyyy': fn = dateGetter('FullYear', 4, 0, false, true); break; // Month number/name, format style (intended to be used in conjunction with ‘d’ for day number). case 'M': case 'L': fn = dateGetter('Month', 1, 1); break; case 'MM': case 'LL': fn = dateGetter('Month', 2, 1); break; case 'MMM': fn = this.dateStrGetter('Month', 'abbreviated'); break; case 'MMMM': fn = this.dateStrGetter('Month', 'wide'); break; case 'MMMMM': fn = this.dateStrGetter('Month', 'narrow'); break; // Stand-Alone Month number/name (intended to be used without ‘d’ for day number). case 'LLL': fn = this.dateStrGetter('Month', 'abbreviated', 'standalone'); break; case 'LLLL': fn = this.dateStrGetter('Month', 'wide', 'standalone'); break; case 'LLLLL': fn = this.dateStrGetter('Month', 'narrow', 'standalone'); break; // Week of Year (numeric). case 'w': fn = weekGetter(1); break; case 'ww': fn = weekGetter(2); break; // Week of Month (numeric) case 'W': fn = weekGetter(1, true); break; // Day of month (numeric). case 'd': fn = dateGetter('Date', 1); break; case 'dd': fn = dateGetter('Date', 2); break; // Day of week name, format style. case 'E': case 'EE': case 'EEE': fn = this.dateStrGetter('Day', 'abbreviated'); break; case 'EEEE': fn = this.dateStrGetter('Day', 'wide'); break; case 'EEEEE': fn = this.dateStrGetter('Day', 'narrow'); break; case 'EEEEEE': fn = this.dateStrGetter('Day', 'short'); break; // AM, PM case 'a': case 'aa': case 'aaa': fn = this.dateStrGetter('dayPeriods', 'abbreviated'); break; case 'aaaa': fn = this.dateStrGetter('dayPeriods', 'wide'); break; case 'aaaaa': fn = this.dateStrGetter('dayPeriods', 'narrow'); break; // Hour [1-12]. case 'h': fn = dateGetter('Hours', 1, -12); break; case 'hh': fn = dateGetter('Hours', 2, -12); break; // Hour [0-23]. case 'H': fn = dateGetter('Hours', 1); break; case 'HH': fn = dateGetter('Hours', 2); break; // Hour K [0-11] case 'K': fn = dateGetter('Hours', 1, -13); break; case 'KK': fn = dateGetter('Hours', 2, -13); break; // Minute (numeric). case 'm': fn = dateGetter('Minutes', 1); break; case 'mm': fn = dateGetter('Minutes', 2); break; // Second (numeric). case 's': fn = dateGetter('Seconds', 1); break; case 'ss': fn = dateGetter('Seconds', 2); break; // Fractional second padded case 'S': fn = dateGetter('Milliseconds', 1); break; case 'SS': fn = dateGetter('Milliseconds', 2); break; case 'SSS': fn = dateGetter('Milliseconds', 3); break; // Timezone ISO8601 short format (-0430) case 'Z': case 'ZZ': case 'ZZZ': fn = timeZoneGetter('short', minusSign); break; case 'ZZZZZ': fn = timeZoneGetter('extended', minusSign); break; // Timezone GMT short format (GMT+4) case 'O': case 'OO': case 'OOO': case 'z': case 'zz': case 'zzz': fn = timeZoneGetter('shortGMT', minusSign); break; case 'OOOO': case 'ZZZZ': case 'zzzz': fn = timeZoneGetter('long', minusSign); break; default: return null; } return fn; } } DateFormatter.decorators = [ { type: Injectable } ]; DateFormatter.ctorParameters = () => []; /** * Format date from iso8601 time string */ function IsoToDate(match) { const date = new Date(0), dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear, timeSetter = match[8] ? date.setUTCHours : date.setHours; let tzHour = 0, tzMin = 0; if (match[9]) { tzHour = toInt(match[9] + match[10]); tzMin = toInt(match[9] + match[11]); } dateSetter.call(date, toInt(match[1]), toInt(match[2]) - 1, toInt(match[3])); const h = toInt(match[4] || 0) - tzHour; const m = toInt(match[5] || 0) - tzMin; const s = toInt(match[6] || 0); const ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000); timeSetter.call(date, h, m, s, ms); return date; } function padNumber(num, digits, trim, negWrap) { const ZERO_CHAR = '0'; let neg = ''; if (num < 0 || (negWrap && num <= 0)) { if (negWrap) { num = -num + 1; } else { num = -num; neg = '-'; } } num = '' + num; while (num.length < digits) { num = ZERO_CHAR + num; } if (trim) { num = num.substr(num.length - digits); } return neg + num; } /** * Convert string to standard date string * @param dateString eg '2017,12,06' R_ISO8601_STR-> '2015/06/15T09:03:01+0900' * @return Date / string */ function getDateByString(dateString) { let string; const isIE = navigator.userAgent.indexOf('Trident'); const isSafari = navigator.userAgent.indexOf('Safari') > -1 && navigator.userAgent.indexOf('Chrome') < 0; string = dateString.indexOf('/') ? dateString.replace(/\//g, '-') : dateString; if ((isSafari || isIE) && string.indexOf('T') < 0) { string = string.replace(/-/g, '/'); } let match; const R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/; if ((match = string.match(R_ISO8601_STR))) { return IsoToDate(match); } else { const date = new Date(string); if (date.toString() === 'Invalid Date') { return dateString; } return date; } } /** * Get date string from date * @param name * @param size * @param offset * @param trim * @param negWrap */ function dateGetter(name, size, offset, trim, negWrap) { offset = offset || 0; return function (date) { let value = getPartOfDate(date, name); if (offset > 0 || value > -offset) { value += offset; } if (value === 0 && offset === -12) { value = 12; } return padNumber(value, size, trim, negWrap); }; } function getPartOfDate(date, name) { switch (name) { case 'FullYear': return date.getFullYear(); case 'Month': return date.getMonth(); case 'Date': return date.getDate(); case 'Hours': return date.getHours(); case 'Minutes': return date.getMinutes(); case 'Seconds': return date.getSeconds(); case 'Milliseconds': return date.getMilliseconds(); case 'Day': return date.getDay(); default: throw new Error(`Unknown DateType value "${name}".`); } } /** * Get time difference from timezone */ function timezoneToOffset(timezone, fallback) { // Support military time zone Z // Date.parse not support to handle military time zone in Firefox. // TODO: Need better support for time zones, offset/time zone names/other abbreviations if (timezone === 'Z') { return 0; } const ALL_COLONS = /:/g; // Support: IE 9-11 only, Edge 13-15+ // IE/Edge do not "understand" colon (`:`) in timezone timezone = timezone.replace(ALL_COLONS, ''); const requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000; const isNaN = Number.isNaN || function isNumberNaN(num) { return num !== num; }; return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset; } function convertTimezoneToLocal(date, timezone) { // get Time difference between local time and GMT const dateTimezoneOffset = date.getTimezoneOffset(); // get Time difference between timezone time and GMT const timezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset); return addDateMinutes(date, -1 * (timezoneOffset - dateTimezoneOffset)); } /** *Returns a date formatter that transforms a date and an offset into a timezone with ISO8601 or * GMT format depending on the width (eg: short = +0430, short:GMT = GMT+4, long = GMT+04:30) */ function timeZoneGetter(type, minusSign) { return (date, offset) => { const zone = -1 * offset; const hours = zone > 0 ? Math.floor(zone / 60) : Math.ceil(zone / 60); switch (type) { case 'short': return ((zone >= 0) ? '+' : '') + padNumber(hours, 2) + padNumber(Math.abs(zone % 60), 2); case 'shortGMT': return 'GMT' + ((zone >= 0) ? '+' : '') + padNumber(hours, 1); case 'long': return 'GMT' + ((zone >= 0) ? '+' : '') + padNumber(hours, 2) + ':' + padNumber(Math.abs(zone % 60), 2); case 'extended': if (offset === 0) { return 'Z'; } else { return ((zone >= 0) ? '+' : '') + padNumber(hours, 2) + ':' + padNumber(Math.abs(zone % 60), 2); } } }; } function addDateMinutes(date, minutes) { date = new Date(date.getTime()); date.setMinutes(date.getMinutes() + minutes); return date; } function getFirstThursdayOfYear(year) { // 0 = index of January const dayOfWeekOnFirst = (new Date(year, 0, 1)).getDay(); // 4 = index of Thursday (+1 to account for 1st = 5) // 11 = index of *next* Thursday (+1 account for 1st = 12) return new Date(year, 0, ((dayOfWeekOnFirst <= 4) ? 5 : 12) - dayOfWeekOnFirst); } function getThursdayThisWeek(datetime) { return new Date(datetime.getFullYear(), datetime.getMonth(), // 4 = index of Thursday datetime.getDate() + (4 - datetime.getDay())); } function weekGetter(size, isWeek = false) { return function (date) { let result; if (isWeek) { const nbDaysBefore1stDayOfMonth = new Date(date.getFullYear(), date.getMonth(), 1).getDay() - 1; const today = date.getDate(); result = 1 + Math.floor((today + nbDaysBefore1stDayOfMonth) / 7); } else { const firstThurs = getFirstThursdayOfYear(date.getFullYear()), thisThurs = getThursdayThisWeek(date); const diff = +thisThurs - +firstThurs; result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week } return padNumber(result, size); }; } function toInt(str) { return parseInt(str, 10); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5mb3JtYXR0ZXIuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvcmxpZ2VuZy9Qcm9qZWN0cy9EZXZvcHMvQ2xpZW50X0FuZ3VsYXJfR2l0SHViX05wbWpzL3ZpcC9jaS9wdWIyb3JnL0NsaWVudF9Bbmd1bGFyX0dpdEh1Yl9OcG1qcy9zaW5nbGV0b24vcHJvamVjdHMvYW5ndWxhci1jbGllbnQvIiwic291cmNlcyI6WyJzcmMvZm9ybWF0dGVycy9kYXRlLmZvcm1hdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE1BQU0sT0FBTyxhQUFhO0lBRXRCLGdCQUFlLENBQUM7SUFDaEI7Ozs7TUFJRTtJQUNLLGVBQWUsQ0FBQyxJQUFTO1FBQzVCLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQztRQUNoQyxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUMxQixJQUFJLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekU7UUFDRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUMxQixJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksa0JBQWtCLENBQUMsSUFBVSxFQUFFLE9BQWUsRUFBRSxVQUFlLEVBQUUsWUFBb0IsR0FBRyxFQUFFLFFBQWlCO1FBQzlHLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsTUFBTSxLQUFLLEdB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Q0FBQyxDQUFDLENBQUMsc0JBQXNCO1NBQ2xFO1FBQ0QsT0FBTyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLEtBQUssQ0FBQyxHQUFXO0lBQ3RCLE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE5LTIwMjEgVk13YXJlLCBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEYXRlRm9ybWF0dGVyIHtcbiAgICBwcml2YXRlIGxvY2FsZURhdGE6IGFueTtcbiAgICBjb25zdHJ1Y3RvcigpIHt9XG4gICAgLyoqXG4gICAgICogQ29udmVydCBudW1iZXIgb3Igc3RyaW5nIHRvIHN0YW5kYXJkIHRpbWVcbiAgICAgKiBAcGFyYW0gZGF0ZVxuICAgICAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgRGF0ZSBvciBvcmlnaW4gc3RyaW5nXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0U3RhbmRhcmRUaW1lKGRhdGU6IGFueSApOiBhbnkge1xuICAgICAgICBjb25zdCBOVU1CRVJfU1RSSU5HID0gL14tP1xcZCskLztcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZGF0ZSA9IE5VTUJFUl9TVFJJTkcudGVzdChkYXRlKSA/IHRvSW50KGRhdGUpIDogZ2V0RGF0ZUJ5U3RyaW5nKGRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGF0ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgbG9jYWxlIGRhdGUgdGltZSBmcm9tIHN0YW5kYXJkIGRhdGUgc3RyaW5nXG4gICAgICogQHJldHVybiBGb3JtYXR0ZWQgbG9jYWxlIGRhdGUgdGltZSBzdHJpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Zm9ybWF0dGVkU3RyaW5nKGRhdGU6IERhdGUsIHBhdHRlcm46IHN0cmluZywgbG9jYWxlRGF0YTogYW55LCBtaW51c1NpZ246IHN0cmluZyA9ICctJywgdGltZXpvbmU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICB0aGlzLmxvY2FsZURhdGEgPSBsb2NhbGVEYXRhO1xuICAgICAgICBjb25zdCBydWxlcyA9IHRoaXMuZ2V0UnVsZXNCeVBhdHRlcm4ocGF0dGVybiwgbG9jYWxlRGF0YSk7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gdGhpcy5wYXR0ZXJuRmlsdGVyKHJ1bGVzKTtcbiAgICAgICAgbGV0IGRhdGVUaW1lem9uZU9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICAgICAgaWYgKHRpbWV6b25lKSB7XG4gICAgICAgICAgICBkYXRlVGltZXpvbmVPZmZzZXQgPSB0aW1lem9uZVRvT2Zmc2V0KHRpbWV6b25lLCBkYXRlVGltZXpvbmVPZmZzZXQpO1xuICAgICAgICAgICAgZGF0ZSA9IGNvbnZlcnRUaW1lem9uZVRvTG9jYWwoZGF0ZSwgdGltZXpvbmUpO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0ZXh0ID0gJyc7XG4gICAgICAgIHBhcnRzLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm4gPSB0aGlzLmdldEZvcm1hdEZ1bmN0aW9uQnlSdWxlKHZhbHVlLCBtaW51c1NpZ24pO1xuICAgICAgICAgICAgdGV4dCArPSBmbiA/IGZuKGRhdGUsIGRhdGVUaW1lem9uZU9mZnNldClcbiAgICAgICAgICAgIDogdmFsdWUgPT09ICdcXCdcXCcnID8gJ1xcJycgOiB2YWx1ZS5yZXBsYWNlKC8oXid8JyQpL2csICcnKS5yZXBsYWNlKC8nJy9nLCAnXFwnJyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UnVsZXNCeVBhdHRlcm4ocGF0dGVybjogc3RyaW5nLCBsb2NhbGVEYXRhOiBhbnkpIHtcbiAgICAgICAgdGhpcy5sb2NhbGVEYXRhID0gbG9jYWxlRGF0YTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UnVsZXMocGF0dGVybikgPyB0aGlzLmdldFJ1bGVzKHBhdHRlcm4pIDogcGF0dGVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgcnVsZXMgZnJvbSBwYXR0ZXJuIGJ5IHR5cGVcbiAgICAgKiBAcmV0dXJuIFRoZSBmdW5jdGlvbiB0byBnZXQgbG9jYWxlIHN0cmluZ1xuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0UnVsZXMocGF0dGVybjogc3RyaW5nKTogc3RyaW5nfHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCBydWxlcztcbiAgICAgICAgc3dpdGNoIChwYXR0ZXJuKSB7XG4gICAgICAgICAgICBjYXNlICdzaG9ydFRpbWUnOiBydWxlcyA9IHRoaXMuZ2V0UnVsZXNJblBhdHRlcm4oJ3RpbWUnLCAnc2hvcnQnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWVkaXVtVGltZSc6IHJ1bGVzID0gdGhpcy5nZXRSdWxlc0luUGF0dGVybigndGltZScsICdtZWRpdW0nKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbG9uZ1RpbWUnOiBydWxlcyA9IHRoaXMuZ2V0UnVsZXNJblBhdHRlcm4oJ3RpbWUnLCAnbG9uZycpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmdWxsVGltZSc6IHJ1bGVzID0gdGhpcy5nZXRSdWxlc0luUGF0dGVybigndGltZScsICdmdWxsJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3Nob3J0RGF0ZSc6IHJ1bGVzID0gdGhpcy5nZXRSdWxlc0luUGF0dGVybignZGF0ZScsICdzaG9ydCcpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtZWRpdW1EYXRlJzogcnVsZXMgPSB0aGlzLmdldFJ1bGVzSW5QYXR0ZXJuKCdkYXRlJywgJ21lZGl1bScpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdsb25nRGF0ZSc6IHJ1bGVzID0gdGhpcy5nZXRSdWxlc0luUGF0dGVybignZGF0ZScsICdsb25nJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Z1bGxEYXRlJzogcnVsZXMgPSB0aGlzLmdldFJ1bGVzSW5QYXR0ZXJuKCdkYXRlJywgJ2Z1bGwnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2hvcnQnOlxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0RGF0ZSA9IHRoaXMuZ2V0UnVsZXNJblBhdHRlcm4oJ2RhdGUnLCAnc2hvcnQnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaG9ydFRpbWUgPSB0aGlzLmdldFJ1bGVzSW5QYXR0ZXJuKCd0aW1lJywgJ3Nob3J0Jyk7XG4gICAgICAgICAgICAgICAgcnVsZXMgPSB0aGlzLmZvcm1hdERhdGVUaW1lUnVsZXMoICdzaG9ydCcsIFtzaG9ydFRpbWUsIHNob3J0RGF0ZV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtZWRpdW0nOlxuICAgICAgICAgICAgICAgIGNvbnN0IG1lZGl1bURhdGUgPSB0aGlzLmdldFJ1bGVzSW5QYXR0ZXJuKCdkYXRlJywgJ21lZGl1bScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lZGl1bVRpbWUgPSB0aGlzLmdldFJ1bGVzSW5QYXR0ZXJuKCd0aW1lJywgJ21lZGl1bScpO1xuICAgICAgICAgICAgICAgIHJ1bGVzID0gdGhpcy5mb3JtYXREYXRlVGltZVJ1bGVzKCAnbWVkaXVtJywgW21lZGl1bVRpbWUsIG1lZGl1bURhdGVdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZnVsbCc6XG4gICAgICAgICAgICAgICAgY29uc3QgZnVsbERhdGUgPSB0aGlzLmdldFJ1bGVzSW5QYXR0ZXJuKCdkYXRlJywgJ2Z1bGwnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmdWxsVGltZSA9IHRoaXMuZ2V0UnVsZXNJblBhdHRlcm4oJ3RpbWUnLCAnZnVsbCcpO1xuICAgICAgICAgICAgICAgIHJ1bGVzID0gdGhpcy5mb3JtYXREYXRlVGltZVJ1bGVzKCAnZnVsbCcsIFtmdWxsVGltZSwgZnVsbERhdGVdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbG9uZyc6XG4gICAgICAgICAgICAgICAgY29uc3QgbG9uZ0RhdGUgPSB0aGlzLmdldFJ1bGVzSW5QYXR0ZXJuKCdkYXRlJywgJ2xvbmcnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBsb25nVGltZSA9IHRoaXMuZ2V0UnVsZXNJblBhdHRlcm4oJ3RpbWUnLCAnbG9uZycpO1xuICAgICAgICAgICAgICAgIHJ1bGVzID0gdGhpcy5mb3JtYXREYXRlVGltZVJ1bGVzKCAnbG9uZycsIFtsb25nVGltZSwgbG9uZ0RhdGVdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBydWxlcyA9IHRoaXMuZ2V0UnVsZXNJblBhdHRlcm4oJ2RhdG