@cute-dw/core
Version:
This TypeScript library is the main part of a more powerfull package designed for the fast WEB software development. The cornerstone of the library is the **DataStore** class, which might be useful when you need a full control of the data, but do not need
393 lines • 64.7 kB
JavaScript
import { Objects } from "../../Objects";
import { Arrays } from "../../Arrays";
import { Strings } from "../../Strings";
import { Locale } from "../Locale";
import { Dates } from "../../Dates";
import { Time } from "../../type/Time";
import { DateFormat } from "./DateFormat";
const NUMBER_OF_PATTERNS = 2;
// Regexes and supporting functions are cached through closure
//const tokenRe = /d{1,4}|D{3,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|W{1,2}|[LlopSZN]|"[^"]*"|'[^']*'/g;
const tokenRe = /d{1,2}|E{1,4}|M{1,4}|T{2,4}|yy(?:yy)?|([Hhms])\1?|w{1,2}|W{1,2}|S{1,3}|X{1,3}|[uaAzZD]|"[^"]*"|'[^']*'/g;
const timezoneRe = /\b(?:[A-Z]{1,3}[A-Z][TC])(?:[-+]\d{4})?|((?:Australian )?(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time)\b/g;
const timezoneClipRe = /[^-+\dA-Z]/g;
// Internationalization strings
export const i18n = {
"de": {
shortDayNames: ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."],
longDayNames: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"],
shortMonthNames: ["Jan.", "Feb.", "März", "Apr.", "Mai", "Juni", "Juli", "Aug.", "Sept.", "Okt.", "Nov.", "Dez."],
longMonthNames: ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"],
},
"en": {
shortDayNames: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
longDayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
shortMonthNames: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
longMonthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
},
"fr": {
shortDayNames: ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."],
longDayNames: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"],
shortMonthNames: ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."],
longMonthNames: ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"],
},
"ru": {
shortDayNames: ["вс", "пн", "вт", "ср", "чт", "пт", "сб"],
longDayNames: ["воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота"],
shortMonthNames: ["янв.", "февр.", "март", "апр.", "май", "июнь", "июль", "авг.", "сент.", "окт.", "нояб.", "дек."],
longMonthNames: ["январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"],
},
};
const pad = (val, len = 2) => String(val).padStart(len, '0');
const parts = (date, utc) => {
const _ = () => (utc ? "getUTC" : "get");
return {
d: () => date[_() + "Date"](),
D: () => date[_() + "Day"](),
M: () => date[_() + "Month"](),
y: () => date[_() + "FullYear"](),
H: () => date[_() + "Hours"](),
m: () => date[_() + "Minutes"](),
s: () => date[_() + "Seconds"](),
S: () => date[_() + "Milliseconds"](),
o: () => (utc ? 0 : date.getTimezoneOffset()),
w: () => Dates.getWeek(date),
W: () => Dates.getWeekOfMonth(date),
u: () => Dates.getDayOfWeek(date),
V: () => Dates.getDayOfYear(date),
};
};
const DIVISIONS = [
{ amount: 60, name: 'seconds' },
{ amount: 60, name: 'minutes' },
{ amount: 24, name: 'hours' },
{ amount: 7, name: 'days' },
{ amount: 4.34524, name: 'weeks' },
{ amount: 12, name: 'months' },
{ amount: Number.POSITIVE_INFINITY, name: 'years' }
];
/*
* This class is based on: https://github.com/felixge/node-dateformat and
* Steven Levithan's excellent [dateFormat()](https://blog.stevenlevithan.com/archives/javascript-date-format) function
* (c) 2007-2009 Steven Levithan stevenlevithan.com, MIT license
*/
/**
* Java compatible class for date/time formatting subclasses which formats and parses dates and/or time in a language-independent manner.
* Date and time formats are specified by date and time _pattern strings_. Within date and time pattern strings, unquoted letters from 'A' to 'Z' and from 'a' to 'z' are interpreted as pattern letters representing the components of a date or time string.
*
* Date and time display formats can have two sections. The first is required and contains the format for dates and times; the second is optional and specifies how to represent nulls:
* `date-time-format;null-format`
*
* Characters with special meaning in _date_ section of display format:
* |Character| Meaning | Example |
* |--- | --- | --- |
* | `d` | Day number with no leading zero | 9 |
* | `dd` | Day number with leading zero if appropriate | 09 |
* | `D` | Day number in year | 189 |
* | `E` | Day name in week, gives starting 1 letter | M |
* | `EEE` | Day name in week, gives starting 2 letters | Mo |
* | `EEE` | Day name in week, gives starting 3 letters | Mon |
* | `EEEE` | Day name in week | Monday |
* | `M` | Month number with no leading zero | 6 |
* | `MM` | Month number with leading zero if appropriate| 06 |
* | `MMM` | Month name abbreviation | Jun |
* | `MMMM` | Month name | June |
* | `yy` | Two-digit year | 97 |
* | `yyyy` | Four-digit year | 1997 |
* | `u` | ISO 8601 day number of the week (1 = Monday, ..., 7 = Sunday) | 1 |
* | `w` | ISO 8601 week number of the year | 8 |
* | `ww` | ISO 8601 week number of the year, leading zero for single-digit | 08 |
* | `W` | ISO 8601 week number of the month | 3 |
* | `WW` | ISO 8601 week number of the month, leading zero for single-digit| 03 |
*
* Colons, slashes, and spaces display as entered in the mask.
*
* You can use the following keywords as date display formats when you want to determine a localized appropriate format to use:
* - [Default]
* - [ShortDate]
* - [MediumDate]
* - [LongDate]
* - [FullDate]
* - [IsoDate]
*
* Note that [Date] is not a valid display format.
*
* Character meaning in _time_ section of the display format:
*
* |Character| Meaning | Example |
* |--- | --- | --- |
* |`h` | Hours; no leading zero for single-digit hours (12-hour clock) | 1 |
* |`hh` | Hours; leading zero for single-digit hours (12-hour clock) | 01 |
* |`H` | Hours; no leading zero for single-digit hours (24-hour clock) | 3 |
* |`HH` | Hours; leading zero for single-digit hours (24-hour clock) | 03 |
* |`m` | Minute with no leading zero (must follow h or hh)| 5 |
* |`mm` | Minute with leading zero if appropriate (must follow h or hh)| 05 |
* |`s` | Second with no leading zero (must follow m or mm)| 7 |
* |`ss` | Second with leading zero (must follow m or mm) | 07 |
* |`S` | Milliseconds; gives 1 digits | 3 |
* |`SS` | Milliseconds; gives 2 digits | 25 |
* |`SSS` | Milliseconds; gives 3 digits | 248 |
* |`a` | Am/pm marker in lower case | am |
* |`A` | Am/pm marker in upper case | PM |
* |`z` | Timezone abbreviation, e.g. GMT+0700, UTC | GMT-05:00 |
* |`Z` | RFC 822 timezone offset, e.g. -0500 or +0230 | +0400 |
* |`X` | ISO 8601 timezone offset, e.g. Z, +04 | +04 |
* |`XX` | ISO 8601 timezone offset, e.g. Z, -0500 | +0400 |
* |`XXX` | ISO 8601 timezone offset, e.g. Z, +02:30 | +04:00|
* |`TT` | Time between the date and the current date (narrow style)| -8 h |
* |`TTT` | Time between the date and the current date (short style) | in 10 hr. |
* |`TTTT` | Time between the date and the current date (long style) | in 10 hours |
*
* Colons, slashes, and spaces display as entered in the mask.
*
* You can use the following keywords as a time display formats when you want to determine a localized appropriate format to use:
* - [Time]
* - [ShortTime]
* - [LongTime]
* - [IsoTime]
* - [LongTimeAgo]
* - [ShortTimeAgo]
*
* For display both date and time values apply the following keywords:
* - [DateTime]
* - [IsoDateTime]
* - [IsoDateTimeTZ]
* - [IsoDateTimeUTC]
* @example
* console.log( new DateTimeFormat("EEEE, MMMM dd, yyyy, h:mm:ss a").format(Date.now()) ); // Saturday, June 09, 2007, 5:46:21 PM
* @since 0.5.0
* @license MIT, (c) 2022 ALEXANDER STRELKOV, alv.strelkov@gmail.com
*/
export class SimpleDateFormat extends DateFormat {
constructor(pattern = "[Default]", options) {
super();
this._rtFormatter = [undefined, undefined, undefined];
this._subpatterns = [];
this._utcgmt = undefined;
const locales = options?.locales instanceof Locale ? options.locales.fullName : options?.locales;
this._locale = new Locale(locales, options);
this._options = { ...options };
this._pattern = Strings.trimAll(pattern) || "[Default]";
this._subpatterns = Arrays.padEnd(this._pattern.split(";"), NUMBER_OF_PATTERNS, "");
this._subpatterns.map((val, idx, arr) => arr[idx] = val.trim());
if (this._subpatterns[0].charAt(0) == "[") {
let keyword = this._subpatterns[0].toLowerCase();
keyword = Strings.replaceAll(keyword, " ", "");
switch (keyword) {
//case "[date]":
case DateFormat.SHORTDATE:
this._dtFormatter = new Intl.DateTimeFormat(locales, { dateStyle: "short" });
break;
case DateFormat.MEDIUMDATE:
this._dtFormatter = new Intl.DateTimeFormat(locales, { dateStyle: "medium" });
break;
case DateFormat.LONGDATE:
this._dtFormatter = new Intl.DateTimeFormat(locales, { dateStyle: "long" });
break;
case DateFormat.FULLDATE:
this._dtFormatter = new Intl.DateTimeFormat(locales, { dateStyle: "full" });
break;
case DateFormat.ISODATE:
this._subpatterns[0] = "yyyy-MM-dd";
break;
case DateFormat.TIME:
this._subpatterns[0] = "HH:mm:ss.SSS";
break;
case DateFormat.LONGTIMEAGO:
this._subpatterns[0] = "TTTT";
break;
case DateFormat.SHORTTIMEAGO:
this._subpatterns[0] = "TTT";
break;
case DateFormat.ISOTIME:
case DateFormat.MEDIUMTIME:
this._dtFormatter = new Intl.DateTimeFormat(locales, { timeStyle: "medium" });
break;
case DateFormat.SHORTTIME:
this._dtFormatter = new Intl.DateTimeFormat(locales, { timeStyle: "short" });
break;
case DateFormat.LONGTIME:
this._dtFormatter = new Intl.DateTimeFormat(locales, { timeStyle: "long" });
break;
case DateFormat.FULLTIME:
this._dtFormatter = new Intl.DateTimeFormat(locales, { timeStyle: "full" });
break;
case DateFormat.DATETIME:
this._dtFormatter = new Intl.DateTimeFormat(locales, { dateStyle: "short", timeStyle: "medium" });
break;
case DateFormat.ISODATETIME:
this._subpatterns[0] = "yyyy-MM-dd'T'HH:mm:ss";
break;
case DateFormat.ISODATETIMETZ:
this._subpatterns[0] = "yyyy-MM-dd'T'HH:mm:ssXX";
break;
case DateFormat.ISODATETIMEUTC:
this._subpatterns[0] = "UTC:yyyy-MM-dd'T'HH:mm:ss'Z'";
break;
case "[expiresheaderformat]":
this._subpatterns[0] = "EEE, dd MMM yyyy HH:mm:ss Z";
break;
default:
this._dtFormatter = new Intl.DateTimeFormat(locales, { dateStyle: "full", timeStyle: "full", ...this._options });
}
}
else {
// Allow setting the utc/gmt argument via the mask
const maskSlice = pattern.slice(0, 4);
if (maskSlice === "UTC:" || maskSlice === "GMT:") {
this._subpatterns[0] = pattern.slice(4);
this._utcgmt = maskSlice.slice(0, 3);
}
}
}
_decompose(date) {
const utc = this._utcgmt !== undefined;
const $ = parts(date, utc);
const localeName = this._locale.language || "en";
const I18N = (localeName in i18n) ? i18n[localeName] : i18n["en"];
return {
d: () => $.d(),
dd: () => pad($.d()),
E: () => Strings.left(I18N.shortDayNames[$.D()], 1),
EE: () => Strings.left(I18N.shortDayNames[$.D()], 2),
EEE: () => I18N.shortDayNames[$.D()],
EEEE: () => I18N.longDayNames[$.D()],
TT: () => this.formatTimeAgo(date, "narrow"),
TTT: () => this.formatTimeAgo(date, "short"),
TTTT: () => this.formatTimeAgo(date, "long"),
D: () => $.V(),
M: () => $.M() + 1,
MM: () => pad($.M() + 1),
MMM: () => I18N.shortMonthNames[$.M()],
MMMM: () => I18N.longMonthNames[$.M()],
yy: () => String($.y()).slice(2),
yyyy: () => pad($.y(), 4),
h: () => $.H() % 12 || 12,
hh: () => pad($.H() % 12 || 12),
H: () => $.H(),
HH: () => pad($.H()),
m: () => $.m(),
mm: () => pad($.m()),
s: () => $.s(),
ss: () => pad($.s()),
S: () => Math.floor($.S() / 100),
SS: () => pad(Math.floor($.S() / 10), 2),
SSS: () => pad($.S(), 3),
a: () => $.H() < 12 ? 'am' : 'pm',
A: () => $.H() < 12 ? 'AM' : 'PM',
z: () => utc
? this._utcgmt
: SimpleDateFormat.formatTimezone(date),
Z: () => {
const tzo = $.o();
return (tzo > 0 ? "-" : "+") + pad(Math.floor(Math.abs(tzo) / 60) * 100 + (Math.abs(tzo) % 60), 4);
},
X: () => {
const tzo = $.o();
return tzo === 0 ? "Z" : (tzo > 0 ? "-" : "+") + pad(Math.floor(Math.abs(tzo) / 60), 2);
},
XX: () => {
const tzo = $.o();
return tzo === 0 ? "Z" : (tzo > 0 ? "-" : "+") + pad(Math.floor(Math.abs(tzo) / 60), 2) + pad(Math.floor(Math.abs(tzo) % 60), 2);
},
XXX: () => {
const tzo = $.o();
return tzo === 0 ? "Z" : (tzo > 0 ? "-" : "+") + pad(Math.floor(Math.abs(tzo) / 60), 2) + ":" + pad(Math.floor(Math.abs(tzo) % 60), 2);
},
/*
S: () => {
const d = $.d();
return ["th", "st", "nd", "rd"][
d % 10 > 3 ? 0 : ((d % 100 - d % 10) != 10 ? 1 : 0) * d % 10
]
},
*/
u: () => $.u(),
w: () => $.w(),
ww: () => pad($.w()),
W: () => $.W(),
WW: () => pad($.W()),
};
}
;
formatTimeAgo(date, style = "long") {
let duration = (date.getTime() - Date.now()) / 1000;
let formatter;
switch (style) {
case "short":
if (!this._rtFormatter[1]) {
this._rtFormatter[1] = new Intl.RelativeTimeFormat(this._locale.baseName, { numeric: "auto", style: "short" });
}
formatter = this._rtFormatter[1];
break;
case "narrow":
if (!this._rtFormatter[2]) {
this._rtFormatter[2] = new Intl.RelativeTimeFormat(this._locale.baseName, { numeric: "auto", style: "narrow" });
}
formatter = this._rtFormatter[2];
break;
default:
if (!this._rtFormatter[0]) {
this._rtFormatter[0] = new Intl.RelativeTimeFormat(this._locale.baseName, { numeric: "auto", style: "long" });
}
formatter = this._rtFormatter[0];
break;
}
for (let i = 0; i < DIVISIONS.length; i++) {
const division = DIVISIONS[i];
if (Math.abs(duration) < division.amount) {
return formatter.format(Math.round(duration), division.name);
}
duration /= division.amount;
}
return "???";
}
/**
* Get proper timezone abbreviation or timezone offset.
*
* This will fall back to `GMT+xxxx` if it does not recognize the
* timezone within the `timezone` RegEx above. Currently only common
* American and Australian timezone abbreviations are supported.
*
* @param {String | Date} date
* @return {String}
*/
static formatTimezone(date) {
return (String(date).match(timezoneRe) || [""])
.pop()
.replace(timezoneClipRe, "")
.replace(/GMT\+0000/g, "UTC");
}
;
/**
* @override
*/
format(value) {
if (value == null) {
return this._subpatterns[1] || "";
}
else if (Objects.isNumber(value) && !Number.isInteger(value)) {
return this._subpatterns[1] || "";
}
if (!(value instanceof Date)) {
if (value instanceof Time) {
value = value.toDate();
}
else {
value = new Date(value);
}
}
if (this._dtFormatter) {
return this._dtFormatter.format(value);
}
const funcs = this._decompose(value);
const pattern = this._subpatterns[0];
return pattern.replace(tokenRe, (match) => {
if (match in funcs) {
return funcs[match]();
}
return match.slice(1, match.length - 1);
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2ltcGxlRGF0ZUZvcm1hdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2N1dGUtY29yZS9zcmMvbGliL3V0aWwvaTE4bi90ZXh0L1NpbXBsZURhdGVGb3JtYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBSTFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBRTdCLDhEQUE4RDtBQUM5RCxtR0FBbUc7QUFDbkcsTUFBTSxPQUFPLEdBQUcseUdBQXlHLENBQUM7QUFDMUgsTUFBTSxVQUFVLEdBQUcsa0pBQWtKLENBQUM7QUFDdEssTUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDO0FBRXJDLCtCQUErQjtBQUMvQixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUc7SUFDbEIsSUFBSSxFQUFFO1FBQ0osYUFBYSxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1FBQ2hFLFlBQVksRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQztRQUMvRixlQUFlLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxF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QUFDO1NBQ3hDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXJDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN4QyxJQUFJLEtBQUssSUFBSSxLQUFLLEVBQUU7Z0JBQ2xCLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7YUFDdkI7WUFDRCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFFTCxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYmplY3RzIH0gZnJvbSBcIi4uLy4uL09iamVjdHNcIjtcbmltcG9ydCB7IEFycmF5cyB9IGZyb20gXCIuLi8uLi9BcnJheXNcIjtcbmltcG9ydCB7IFN0cmluZ3MgfSBmcm9tIFwiLi4vLi4vU3RyaW5nc1wiO1xuaW1wb3J0IHsgTG9jYWxlIH0gZnJvbSBcIi4uL0xvY2FsZVwiO1xuaW1wb3J0IHsgRGF0ZXMgfSBmcm9tIFwiLi4vLi4vRGF0ZXNcIjtcbmltcG9ydCB7IFRpbWUgfSBmcm9tIFwiLi4vLi4vdHlwZS9UaW1lXCI7XG5pbXBvcnQgeyBEYXRlRm9ybWF0IH0gZnJvbSBcIi4vRGF0ZUZvcm1hdFwiO1xuXG5leHBvcnQgdHlwZSBEYXRlVGltZUZvcm1hdE9wdGlvbnMgPSBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyAmIHsgbG9jYWxlcz86IHN0cmluZyB8IExvY2FsZSB9O1xuXG5jb25zdCBOVU1CRVJfT0ZfUEFUVEVSTlMgPSAyO1xuXG4vLyBSZWdleGVzIGFuZCBzdXBwb3J0aW5nIGZ1bmN0aW9ucyBhcmUgY2FjaGVkIHRocm91Z2ggY2xvc3VyZVxuLy9jb25zdCB0b2tlblJlID0gL2R7MSw0fXxEezMsNH18bXsxLDR9fHl5KD86eXkpP3woW0hoTXNUdF0pXFwxP3xXezEsMn18W0xsb3BTWk5dfFwiW15cIl0qXCJ8J1teJ10qJy9nO1xuY29uc3QgdG9rZW5SZSA9IC9kezEsMn18RXsxLDR9fE17MSw0fXxUezIsNH18eXkoPzp5eSk/fChbSGhtc10pXFwxP3x3ezEsMn18V3sxLDJ9fFN7MSwzfXxYezEsM318W3VhQXpaRF18XCJbXlwiXSpcInwnW14nXSonL2c7XG5jb25zdCB0aW1lem9uZVJlID0gL1xcYig/OltBLVpdezEsM31bQS1aXVtUQ10pKD86Wy0rXVxcZHs0fSk/fCgoPzpBdXN0cmFsaWFuICk/KD86UGFjaWZpY3xNb3VudGFpbnxDZW50cmFsfEVhc3Rlcm58QXRsYW50aWMpICg/OlN0YW5kYXJkfERheWxpZ2h0fFByZXZhaWxpbmcpIFRpbWUpXFxiL2c7XG5jb25zdCB0aW1lem9uZUNsaXBSZSA9IC9bXi0rXFxkQS1aXS9nO1xuXG4vLyBJbnRlcm5hdGlvbmFsaXphdGlvbiBzdHJpbmdzXG5leHBvcnQgY29uc3QgaTE4biA9IHtcbiAgXCJkZVwiOiB7XG4gICAgc2hvcnREYXlOYW1lczogW1wiU28uXCIsIFwiTW8uXCIsIFwiRGkuXCIsIFwiTWkuXCIsIFwiRG8uXCIsIFwiRnIuXCIsIFwiU2EuXCJdLFxuICAgIGxvbmdEYXlOYW1lczogW1wiU29ubnRhZ1wiLCBcIk1vbnRhZ1wiLCBcIkRpZW5zdGFnXCIsIFwiTWl0dHdvY2hcIiwgXCJEb25uZXJzdGFnXCIsIFwiRnJlaXRhZ1wiLCBcIlNhbXN0YWdcIl0sXG4gICAgc2hvcnRNb250aE5hbWVzOiBbXCJKYW4uXCIsIFwiRmViLlwiLCBcIk3DpHJ6XCIsIFwiQXByLlwiLCBcIk1haVwiLCBcIkp1bmlcIiwgXCJKdWxpXCIsIFwiQXVnLlwiLCBcIlNlcHQuXCIsIFwiT2t0LlwiLCBcIk5vdi5cIiwgXCJEZXouXCJdLFxuICAgIGxvbmdNb250aE5hbWVzOiBbXCJKYW51YXJcIiwgXCJGZWJydWFyXCIsIFwiTcOkcnpcIiwgXCJBcHJpbFwiLCBcIk1haVwiLCBcIkp1bmlcIiwgXCJKdWxpXCIsIFwiQXVndXN0XCIsIFwiU2VwdGVtYmVyXCIsIFwiT2t0b2JlclwiLCBcIk5vdmVtYmVyXCIsIFwiRGV6ZW1iZXJcIl0sXG4gIH0sXG4gIFwiZW5cIjoge1xuICAgIHNob3J0RGF5TmFtZXM6IFtcIlN1blwiLCBcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiXSxcbiAgICBsb25nRGF5TmFtZXM6IFtcIlN1bmRheVwiLCBcIk1vbmRheVwiLCBcIlR1ZXNkYXlcIiwgXCJXZWRuZXNkYXlcIiwgXCJUaHVyc2RheVwiLCBcIkZyaWRheVwiLCBcIlNhdHVyZGF5XCJdLFxuICAgIHNob3J0TW9udGhOYW1lczogW1wiSmFuXCIsIFwiRmViXCIsIFwiTWFyXCIsIFwiQXByXCIsIFwiTWF5XCIsIFwiSnVuXCIsIFwiSnVsXCIsIFwiQXVnXCIsIFwiU2VwXCIsIFwiT2N0XCIsIFwiTm92XCIsIFwiRGVjXCJdLFxuICAgIGxvbmdNb250aE5hbWVzOiBbXCJKYW51YXJ5XCIsIFwiRmVicnVhcnlcIiwgXCJNYXJjaFwiLCBcIkFwcmlsXCIsIFwiTWF5XCIsIFwiSnVuZVwiLCBcIkp1bHlcIiwgXCJBdWd1c3RcIiwgXCJTZXB0ZW1iZXJcIiwgXCJPY3RvYmVyXCIsIFwiTm92ZW1iZXJcIiwgXCJEZWNlbWJlclwiXSxcbiAgfSxcbiAgXCJmclwiOiB7XG4gICAgc2hvcnREYXlOYW1lczogW1wiZGltLlwiLCBcImx1bi5cIiwgXCJtYXIuXCIsIFwibWVyLlwiLCBcImpldS5cIiwgXCJ2ZW4uXCIsIFwic2FtLlwiXSxcbiAgICBsb25nRGF5TmFtZXM6IFtcImRpbWFuY2hlXCIsIFwibHVuZGlcIiwgXCJtYXJkaVwiLCBcIm1lcmNyZWRpXCIsIFwiamV1ZGlcIiwgXCJ2ZW5kcmVkaVwiLCBcInNhbWVkaVwiXSxcbiAgICBzaG9ydE1vbnRoTmFtZXM6IFtcImphbnYuXCIsIFwiZsOpdnIuXCIsIFwibWFyc1wiLCBcImF2ci5cIiwgXCJtYWlcIiwgXCJqdWluXCIsIFwianVpbC5cIiwgXCJhb8O7dFwiLCBcInNlcHQuXCIsIFwib2N0LlwiLCBcIm5vdi5cIiwgXCJkw6ljLlwiXSxcbiAgICBsb25nTW9udGhOYW1lczogW1wiamFudmllclwiLCBcImbDqXZyaWVyXCIsIFwibWFyc1wiLCBcImF2cmlsXCIsIFwibWFpXCIsIFwianVpblwiLCBcImp1aWxsZXRcIiwgXCJhb8O7dFwiLCBcInNlcHRlbWJyZVwiLCBcIm9jdG9icmVcIiwgXCJub3ZlbWJyZVwiLCBcImTDqWNlbWJyZVwiXSxcbiAgfSxcbiAgXCJydVwiOiB7XG4gICAgc2hvcnREYXlOYW1lczogW1wi0LLRgVwiLCBcItC/0L1cIiwgXCLQstGCXCIsIFwi0YHRgFwiLCBcItGH0YJcIiwgXCLQv9GCXCIsIFwi0YHQsVwiXSxcbiAgICBsb25nRGF5TmFtZXM6IFtcItCy0L7RgdC60YDQtdGB0LXQvdGM0LVcIiwgXCLQv9C+0L3QtdC00LXQu9GM0L3QuNC6XCIsIFwi0LLRgtC+0YDQvdC40LpcIiwgXCLRgdGA0LXQtNCwXCIsIFwi0YfQtdGC0LLQtdGA0LNcIiwgXCLQv9GP0YLQvdC40YbQsFwiLCBcItGB0YPQsdCx0L7RgtCwXCJdLFxuICAgIHNob3J0TW9udGhOYW1lczogW1wi0Y/QvdCyLlwiLCBcItGE0LXQstGALlwiLCBcItC80LDRgNGCXCIsIFwi0LDQv9GALlwiLCBcItC80LDQuVwiLCBcItC40Y7QvdGMXCIsIFwi0LjRjtC70YxcIiwgXCLQsNCy0LMuXCIsIFwi0YHQtdC90YIuXCIsIFwi0L7QutGCLlwiLCBcItC90L7Rj9CxLlwiLCBcItC00LXQui5cIl0sXG4gICAgbG9uZ01vbnRoTmFtZXM6IFtcItGP0L3QstCw0YDRjFwiLCBcItGE0LXQstGA0LDQu9GMXCIsIFwi0LzQsNGA0YJcIiwgXCLQsNC/0YDQtdC70YxcIiwgXCLQvNCw0LlcIiwgXCLQuNGO0L3RjFwiLCBcItC40Y7Qu9GMXCIsIFwi0LDQstCz0YPRgdGCXCIsIFwi0YHQtdC90YLRj9Cx0YDRjFwiLCBcItC+0LrRgtGP0LHRgNGMXCIsIFwi0L3QvtGP0LHRgNGMXCIsIFwi0LTQtdC60LDQsdGA0YxcIl0sXG4gIH0sXG59O1xuXG5jb25zdCBwYWQ6IEZ1bmN0aW9uID0gKHZhbDogYW55LCBsZW4gPSAyKSA9PiBTdHJpbmcodmFsKS5wYWRTdGFydChsZW4sICcwJyk7XG5cbmNvbnN0IHBhcnRzOiBGdW5jdGlvbiA9IChkYXRlOiBhbnksIHV0YzogYm9vbGVhbik6IGFueSA9PiB7XG4gIGNvbnN0IF8gPSAoKSA9PiAodXRjID8gXCJnZXRVVENcIiA6IFwiZ2V0XCIpO1xuICByZXR1cm4ge1xuICAgIGQ6ICgpID0+IGRhdGVbXygpICsgXCJEYXRlXCJdKCksXG4gICAgRDogKCkgPT4gZGF0ZVtfKCkgKyBcIkRheVwiXSgpLFxuICAgIE06ICgpID0+IGRhdGVbXygpICsgXCJNb250aFwiXSgpLFxuICAgIHk6ICgpID0+IGRhdGVbXygpICsgXCJGdWxsWWVhclwiXSgpLFxuICAgIEg6ICgpID0+IGRhdGVbXygpICsgXCJIb3Vyc1wiXSgpLFxuICAgIG06ICgpID0+IGRhdGVbXygpICsgXCJNaW51dGVzXCJdKCksXG4gICAgczogKCkgPT4gZGF0ZVtfKCkgKyBcIlNlY29uZHNcIl0oKSxcbiAgICBTOiAoKSA9PiBkYXRlW18oKSArIFwiTWlsbGlzZWNvbmRzXCJdKCksXG4gICAgbzogKCkgPT4gKHV0YyA/IDAgOiBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkpLFxuICAgIHc6ICgpID0+IERhdGVzLmdldFdlZWsoZGF0ZSksXG4gICAgVzogKCkgPT4gRGF0ZXMuZ2V0V2Vla09mTW9udGgoZGF0ZSksXG4gICAgdTogKCkgPT4gRGF0ZXMuZ2V0RGF5T2ZXZWVrKGRhdGUpLFxuICAgIFY6ICgpID0+IERhdGVzLmdldERheU9mWWVhcihkYXRlKSxcbiAgfTtcbn07XG5cbmNvbnN0IERJVklTSU9OUzogeyBhbW91bnQ6IG51bWJlciwgbmFtZTogSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXRVbml0IH1bXSA9IFtcbiAgeyBhbW91bnQ6IDYwLCBuYW1lOiAnc2Vjb25kcycgfSxcbiAgeyBhbW91bnQ6IDYwLCBuYW1lOiAnbWludXRlcycgfSxcbiAgeyBhbW91bnQ6IDI0LCBuYW1lOiAnaG91cnMnIH0sXG4gIHsgYW1vdW50OiA3LCBuYW1lOiAnZGF5cycgfSxcbiAgeyBhbW91bnQ6IDQuMzQ1MjQsIG5hbWU6ICd3ZWVrcycgfSxcbiAgeyBhbW91bnQ6IDEyLCBuYW1lOiAnbW9udGhzJyB9LFxuICB7IGFtb3VudDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBuYW1lOiAneWVhcnMnIH1cbl07XG5cbi8qXG4gKiBUaGlzIGNsYXNzIGlzIGJhc2VkIG9uOiBodHRwczovL2dpdGh1Yi5jb20vZmVsaXhnZS9ub2RlLWRhdGVmb3JtYXQgYW5kXG4gKiBTdGV2ZW4gTGV2aXRoYW4ncyBleGNlbGxlbnQgW2RhdGVGb3JtYXQoKV0oaHR0cHM6Ly9ibG9nLnN0ZXZlbmxldml0aGFuLmNvbS9hcmNoaXZlcy9qYXZhc2NyaXB0LWRhdGUtZm9ybWF0KSBmdW5jdGlvblxuICogKGMpIDIwMDctMjAwOSBTdGV2ZW4gTGV2aXRoYW4gc3RldmVubGV2aXRoYW4uY29tLCBNSVQgbGljZW5zZVxuICovXG4vKipcbiAqIEphdmEgY29tcGF0aWJsZSBjbGFzcyBmb3IgZGF0ZS90aW1lIGZvcm1hdHRpbmcgc3ViY2xhc3NlcyB3aGljaCBmb3JtYXRzIGFuZCBwYXJzZXMgZGF0ZXMgYW5kL29yIHRpbWUgaW4gYSBsYW5ndWFnZS1pbmRlcGVuZGVudCBtYW5uZXIuXG4gKiBEYXRlIGFuZCB0aW1lIGZvcm1hdHMgYXJlIHNwZWNpZmllZCBieSBkYXRlIGFuZCB0aW1lIF9wYXR0ZXJuIHN0cmluZ3NfLiBXaXRoaW4gZGF0ZSBhbmQgdGltZSBwYXR0ZXJuIHN0cmluZ3MsIHVucXVvdGVkIGxldHRlcnMgZnJvbSAnQScgdG8gJ1onIGFuZCBmcm9tICdhJyB0byAneicgYXJlIGludGVycHJldGVkIGFzIHBhdHRlcm4gbGV0dGVycyByZXByZXNlbnRpbmcgdGhlIGNvbXBvbmVudHMgb2YgYSBkYXRlIG9yIHRpbWUgc3RyaW5nLlxuICpcbiAqIERhdGUgYW5kIHRpbWUgZGlzcGxheSBmb3JtYXRzIGNhbiBoYXZlIHR3byBzZWN0aW9ucy4gVGhlIGZpcnN0IGlzIHJlcXVpcmVkIGFuZCBjb250YWlucyB0aGUgZm9ybWF0IGZvciBkYXRlcyBhbmQgdGltZXM7IHRoZSBzZWNvbmQgaXMgb3B0aW9uYWwgYW5kIHNwZWNpZmllcyBob3cgdG8gcmVwcmVzZW50IG51bGxzOlxuICogYGRhdGUtdGltZS1mb3JtYXQ7bnVsbC1mb3JtYXRgXG4gKlxuICogQ2hhcmFjdGVycyB3aXRoIHNwZWNpYWwgbWVhbmluZyBpbiBfZGF0ZV8gc2VjdGlvbiBvZiBkaXNwbGF5IGZvcm1hdDpcbiAqIHxDaGFyYWN0ZXJ8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFeGFtcGxlIHxcbiAqIHwtLS0gICAgICB8IC0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAtLS0gICAgIHxcbiAqIHwgYGRgICAgICB8IERheSBudW1iZXIgd2l0aCBubyBsZWFkaW5nIHplcm8gICAgICAgICAgICAgfCA5ICAgICAgIHxcbiAqIHwgYGRkYCAgICB8IERheSBudW1iZXIgd2l0aCBsZWFkaW5nIHplcm8gaWYgYXBwcm9wcmlhdGUgfCAwOSAgICAgIHxcbiAqIHwgYERgICAgICB8IERheSBudW1iZXIgaW4geWVhciAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxODkgICAgIHxcbiAqIHwgYEVgICAgICB8IERheSBuYW1lIGluIHdlZWssIGdpdmVzIHN0YXJ0aW5nIDEgbGV0dGVyICAgfCBNICAgICAgIHxcbiAqIHwgYEVFRWAgICB8IERheSBuYW1lIGluIHdlZWssIGdpdmVzIHN0YXJ0aW5nIDIgbGV0dGVycyAgfCBNbyAgICAgIHxcbiAqIHwgYEVFRWAgICB8IERheSBuYW1lIGluIHdlZWssIGdpdmVzIHN0YXJ0aW5nIDMgbGV0dGVycyAgfCBNb24gICAgIHxcbiAqIHwgYEVFRUVgICB8IERheSBuYW1lIGluIHdlZWsgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNb25kYXkgIHxcbiAqIHwgYE1gICAgICB8IE1vbnRoIG51bWJlciB3aXRoIG5vIGxlYWRpbmcgemVybyAgICAgICAgICAgfCA2ICAgICAgIHxcbiAqIHwgYE1NYCAgICB8IE1vbnRoIG51bWJlciB3aXRoIGxlYWRpbmcgemVybyBpZiBhcHByb3ByaWF0ZXwgMDYgICAgIHxcbiAqIHwgYE1NTWAgICB8IE1vbnRoIG5hbWUgYWJicmV2aWF0aW9uICAgICAgICAgICAgICAgICAgICAgfCBKdW4gICAgIHxcbiAqIHwgYE1NTU1gICB8IE1vbnRoIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBKdW5lICAgIHxcbiAqIHwgYHl5YCAgICB8IFR3by1kaWdpdCB5ZWFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA5NyAgICAgIHxcbiAqIHwgYHl5eXlgICB8IEZvdXItZGlnaXQgeWVhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxOTk3ICAgIHxcbiAqIHwgYHVgICAgICB8IElTTyA4NjAxIGRheSBudW1iZXIgb2YgdGhlIHdlZWsgKDEgPSBNb25kYXksIC4uLiwgNyA9IFN1bmRheSkgICB8IDEgICAgICB8XG4gKiB8IGB3YCAgICAgfCBJU08gODYwMSB3ZWVrIG51bWJlciBvZiB0aGUgeWVhciAgICAgICAgICAgIHwgOCAgICAgICB8XG4gKiB8IGB3d2AgICAgfCBJU08gODYwMSB3ZWVrIG51bWJlciBvZiB0aGUgeWVhciwgbGVhZGluZyB6ZXJvIGZvciBzaW5nbGUtZGlnaXQgfCAwOCAgICAgfFxuICogfCBgV2AgICAgIHwgSVNPIDg2MDEgd2VlayBudW1iZXIgb2YgdGhlIG1vbnRoICAgICAgICAgICB8IDMgICAgICAgfFxuICogfCBgV1dgICAgIHwgSVNPIDg2MDEgd2VlayBudW1iZXIgb2YgdGhlIG1vbnRoLCBsZWFkaW5nIHplcm8gZm9yIHNpbmdsZS1kaWdpdHwgMDMgICAgIHxcbiAqXG4gKiBDb2xvbnMsIHNsYXNoZXMsIGFuZCBzcGFjZXMgZGlzcGxheSBhcyBlbnRlcmVkIGluIHRoZSBtYXNrLlxuICpcbiAqIFlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcga2V5d29yZHMgYXMgZGF0ZSBkaXNwbGF5IGZvcm1hdHMgd2hlbiB5b3Ugd2FudCB0byBkZXRlcm1pbmUgYSBsb2NhbGl6ZWQgYXBwcm9wcmlhdGUgZm9ybWF0IHRvIHVzZTpcbiAqIC0gW0RlZmF1bHRdXG4gKiAtIFtTaG9ydERhdGVdXG4gKiAtIFtNZWRpdW1EYXRlXVxuICogLSBbTG9uZ0RhdGVdXG4gKiAtIFtGdWxsRGF0ZV1cbiAqIC0gW0lzb0RhdGVdXG4gKlxuICogTm90ZSB0aGF0IFtEYXRlXSBpcyBub3QgYSB2YWxpZCBkaXNwbGF5IGZvcm1hdC5cbiAqXG4gKiBDaGFyYWN0ZXIgbWVhbmluZyBpbiBfdGltZV8gc2VjdGlvbiBvZiB0aGUgZGlzcGxheSBmb3JtYXQ6XG4gKlxuICogfENoYXJhY3RlcnwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRXhhbXBsZSB8XG4gKiB8LS0tICAgICAgfCAtLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAtLS0gICAgIHxcbiAqIHxgaGAgICAgICB8IEhvdXJzOyBubyBsZWFkaW5nIHplcm8gZm9yIHNpbmdsZS1kaWdpdCBob3VycyAoMTItaG91ciBjbG9jaykgICAgfCAxICAgICAgIHxcbiAqIHxgaGhgICAgICB8IEhvdXJzOyBsZWFkaW5nIHplcm8gZm9yIHNpbmdsZS1kaWdpdCBob3VycyAoMTItaG91ciBjbG9jaykgICAgICAgfCAwMSAgICAgIHxcbiAqIHxgSGAgICAgICB8IEhvdXJzOyBubyBsZWFkaW5nIHplcm8gZm9yIHNpbmdsZS1kaWdpdCBob3VycyAoMjQtaG91ciBjbG9jaykgICAgfCAzICAgICAgIHxcbiAqIHxgSEhgICAgICB8IEhvdXJzOyBsZWFkaW5nIHplcm8gZm9yIHNpbmdsZS1kaWdpdCBob3VycyAoMjQtaG91ciBjbG9jaykgICAgICAgfCAwMyAgICAgIHxcbiAqIHxgbWAgICAgICB8IE1pbnV0ZSB3aXRoIG5vIGxlYWRpbmcgemVybyAobXVzdCBmb2xsb3cgaCBvciBoaCl8IDUgICB8XG4gKiB8YG1tYCAgICAgfCBNaW51dGUgd2l0aCBsZWFkaW5nIHplcm8gaWYgYXBwcm9wcmlhdGUgKG11c3QgZm9sbG93IGggb3IgaGgpfCAwNSAgfFxuICogfGBzYCAgICAgIHwgU2Vjb25kIHdpdGggbm8gbGVhZGluZyB6ZXJvIChtdXN0IGZvbGxvdyBtIG9yIG1tKXwgNyAgIHxcbiAqIHxgc3NgICAgICB8IFNlY29uZCB3aXRoIGxlYWRpbmcgemVybyAobXVzdCBmb2xsb3cgbSBvciBtbSkgICB8IDA3ICB8XG4gKiB8YFNgICAgICAgfCBNaWxsaXNlY29uZHM7IGdpdmVzIDEgZGlnaXRzICAgICAgICAgICAgICAgICAgICAgfCAzICAgfFxuICogfGBTU2AgICAgIHwgTWlsbGlzZWNvbmRzOyBnaXZlcyAyIGRpZ2l0cyAgICAgICAgICAgICAgICAgICAgIHwg