@onemrvapublic/design-system 18.2.16-develop.8 → 18.2.16-develop.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/shared/src/lib/adapters/index.mjs +4 -3
- package/esm2022/shared/src/lib/adapters/luxon.date.adapter.mjs +248 -0
- package/esm2022/shared/src/lib/adapters/luxon.utils.mjs +23 -0
- package/esm2022/shared/src/lib/adapters/luxon.year-month.date.adapter.mjs +248 -0
- package/esm2022/shared/src/lib/adapters/native.date.adapter.mjs +66 -0
- package/esm2022/shared/src/lib/adapters/native.year-month.date.adapter.mjs +59 -0
- package/esm2022/shared/src/lib/providers/onemrva.date.luxon.provider.mjs +9 -8
- package/esm2022/shared/src/lib/providers/onemrva.date.luxon.year.month.provider.mjs +10 -9
- package/esm2022/shared/src/lib/providers/onemrva.date.native.provider.mjs +4 -10
- package/esm2022/shared/src/lib/providers/onemrva.date.native.year.month.provider.mjs +4 -10
- package/fesm2022/onemrvapublic-design-system-shared.mjs +287 -30
- package/fesm2022/onemrvapublic-design-system-shared.mjs.map +1 -1
- package/package.json +1 -1
- package/shared/src/lib/adapters/index.d.ts +3 -2
- package/shared/src/lib/adapters/luxon.date.adapter.d.ts +50 -0
- package/shared/src/lib/adapters/luxon.utils.d.ts +26 -0
- package/shared/src/lib/adapters/luxon.year-month.date.adapter.d.ts +50 -0
- package/shared/src/lib/adapters/{date.adapter.d.ts → native.date.adapter.d.ts} +3 -3
- package/shared/src/lib/adapters/{year-month.adapter.d.ts → native.year-month.date.adapter.d.ts} +3 -3
- package/esm2022/shared/src/lib/adapters/date.adapter.mjs +0 -66
- package/esm2022/shared/src/lib/adapters/year-month.adapter.mjs +0 -59
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export * from './date.adapter';
|
|
2
|
-
export * from './
|
|
3
|
-
|
|
1
|
+
export * from './native.date.adapter';
|
|
2
|
+
export * from './luxon.date.adapter';
|
|
3
|
+
export * from './native.year-month.date.adapter';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmVtcnZhL2Rlc2lnbi1zeXN0ZW0vc2hhcmVkL3NyYy9saWIvYWRhcHRlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsa0NBQWtDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL25hdGl2ZS5kYXRlLmFkYXB0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9sdXhvbi5kYXRlLmFkYXB0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9uYXRpdmUueWVhci1tb250aC5kYXRlLmFkYXB0ZXInO1xuIl19
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Google LLC All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://angular.dev/license
|
|
7
|
+
*/
|
|
8
|
+
import { Injectable, inject } from '@angular/core';
|
|
9
|
+
import { DateAdapter, MAT_DATE_LOCALE } from '@angular/material/core';
|
|
10
|
+
import { DateTime as LuxonDateTime, Info as LuxonInfo, } from 'luxon';
|
|
11
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
12
|
+
import { luxonRange, MAT_LUXON_DATE_ADAPTER_OPTIONS, } from './luxon.utils';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "@ngx-translate/core";
|
|
15
|
+
/** Adapts Luxon Dates for use with Angular Material. */
|
|
16
|
+
export class OnemrvaLuxonDateAdapter extends DateAdapter {
|
|
17
|
+
constructor(translateService) {
|
|
18
|
+
super();
|
|
19
|
+
this.translateService = translateService;
|
|
20
|
+
const dateLocale = inject(MAT_DATE_LOCALE, { optional: true });
|
|
21
|
+
const options = inject(MAT_LUXON_DATE_ADAPTER_OPTIONS, {
|
|
22
|
+
optional: true,
|
|
23
|
+
});
|
|
24
|
+
this._useUTC = !!options?.useUtc;
|
|
25
|
+
this._firstDayOfWeek = options?.firstDayOfWeek || 0;
|
|
26
|
+
this._defaultOutputCalendar = options?.defaultOutputCalendar || 'gregory';
|
|
27
|
+
this.setLocale(dateLocale || LuxonDateTime.local().locale);
|
|
28
|
+
this.setLocale(this.translateService.currentLang);
|
|
29
|
+
if (this.translateService !== undefined) {
|
|
30
|
+
this.translateService.onLangChange
|
|
31
|
+
.pipe(takeUntilDestroyed())
|
|
32
|
+
.subscribe(({ lang }) => {
|
|
33
|
+
this.setLocale(lang);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
getYear(date) {
|
|
38
|
+
return date.year;
|
|
39
|
+
}
|
|
40
|
+
getMonth(date) {
|
|
41
|
+
// Luxon works with 1-indexed months whereas our code expects 0-indexed.
|
|
42
|
+
return date.month - 1;
|
|
43
|
+
}
|
|
44
|
+
getDate(date) {
|
|
45
|
+
return date.day;
|
|
46
|
+
}
|
|
47
|
+
getDayOfWeek(date) {
|
|
48
|
+
return date.weekday;
|
|
49
|
+
}
|
|
50
|
+
getMonthNames(style) {
|
|
51
|
+
// Adding outputCalendar option, because LuxonInfo doesn't get effected by LuxonSettings
|
|
52
|
+
return LuxonInfo.months(style, {
|
|
53
|
+
locale: this.locale,
|
|
54
|
+
outputCalendar: this._defaultOutputCalendar,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
getDateNames() {
|
|
58
|
+
// At the time of writing, Luxon doesn't offer similar
|
|
59
|
+
// functionality so we have to fall back to the Intl API.
|
|
60
|
+
const dtf = new Intl.DateTimeFormat(this.locale, {
|
|
61
|
+
day: 'numeric',
|
|
62
|
+
timeZone: 'utc',
|
|
63
|
+
});
|
|
64
|
+
// Format a UTC date in order to avoid DST issues.
|
|
65
|
+
return luxonRange(31, i => dtf.format(LuxonDateTime.utc(2017, 1, i + 1).toJSDate()));
|
|
66
|
+
}
|
|
67
|
+
getDayOfWeekNames(style) {
|
|
68
|
+
// Note that we shift the array once, because Luxon returns Monday as the
|
|
69
|
+
// first day of the week, whereas our logic assumes that it's Sunday. See:
|
|
70
|
+
// https://moment.github.io/luxon/api-docs/index.html#infoweekdays
|
|
71
|
+
const days = LuxonInfo.weekdays(style, { locale: this.locale });
|
|
72
|
+
days.unshift(days.pop());
|
|
73
|
+
return days;
|
|
74
|
+
}
|
|
75
|
+
getYearName(date) {
|
|
76
|
+
return date.toFormat('yyyy', this._getOptions());
|
|
77
|
+
}
|
|
78
|
+
getFirstDayOfWeek() {
|
|
79
|
+
return this._firstDayOfWeek;
|
|
80
|
+
}
|
|
81
|
+
getNumDaysInMonth(date) {
|
|
82
|
+
return date.daysInMonth;
|
|
83
|
+
}
|
|
84
|
+
clone(date) {
|
|
85
|
+
return LuxonDateTime.fromObject(date.toObject(), this._getOptions());
|
|
86
|
+
}
|
|
87
|
+
createDate(year, month, date) {
|
|
88
|
+
const options = this._getOptions();
|
|
89
|
+
if (month < 0 || month > 11) {
|
|
90
|
+
throw Error(`Invalid month index "${month}". Month index has to be between 0 and 11.`);
|
|
91
|
+
}
|
|
92
|
+
if (date < 1) {
|
|
93
|
+
throw Error(`Invalid date "${date}". Date has to be greater than 0.`);
|
|
94
|
+
}
|
|
95
|
+
// Luxon uses 1-indexed months so we need to add one to the month.
|
|
96
|
+
const result = this._useUTC
|
|
97
|
+
? LuxonDateTime.utc(year, month + 1, date, options)
|
|
98
|
+
: LuxonDateTime.local(year, month + 1, date, options);
|
|
99
|
+
if (!this.isValid(result)) {
|
|
100
|
+
throw Error(`Invalid date "${date}". Reason: "${result.invalidReason}".`);
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
today() {
|
|
105
|
+
const options = this._getOptions();
|
|
106
|
+
return this._useUTC
|
|
107
|
+
? LuxonDateTime.utc(options)
|
|
108
|
+
: LuxonDateTime.local(options);
|
|
109
|
+
}
|
|
110
|
+
parse(value, parseFormat) {
|
|
111
|
+
const options = this._getOptions();
|
|
112
|
+
if (typeof value == 'string' && value.length > 0) {
|
|
113
|
+
const iso8601Date = LuxonDateTime.fromISO(value, options);
|
|
114
|
+
if (this.isValid(iso8601Date)) {
|
|
115
|
+
return iso8601Date;
|
|
116
|
+
}
|
|
117
|
+
const formats = Array.isArray(parseFormat) ? parseFormat : [parseFormat];
|
|
118
|
+
if (!parseFormat.length) {
|
|
119
|
+
throw Error('Formats array must not be empty.');
|
|
120
|
+
}
|
|
121
|
+
for (const format of formats) {
|
|
122
|
+
const fromFormat = LuxonDateTime.fromFormat(value, format, options);
|
|
123
|
+
if (this.isValid(fromFormat)) {
|
|
124
|
+
return fromFormat;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return this.invalid();
|
|
128
|
+
}
|
|
129
|
+
else if (typeof value === 'number') {
|
|
130
|
+
return LuxonDateTime.fromMillis(value, options);
|
|
131
|
+
}
|
|
132
|
+
else if (value instanceof Date) {
|
|
133
|
+
return LuxonDateTime.fromJSDate(value, options);
|
|
134
|
+
}
|
|
135
|
+
else if (value instanceof LuxonDateTime) {
|
|
136
|
+
return LuxonDateTime.fromMillis(value.toMillis(), options);
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
format(date, displayFormat) {
|
|
141
|
+
if (!this.isValid(date)) {
|
|
142
|
+
throw Error('LuxonDateAdapter: Cannot format invalid date.');
|
|
143
|
+
}
|
|
144
|
+
if (this._useUTC) {
|
|
145
|
+
return date.setLocale(this.locale).setZone('utc').toFormat(displayFormat);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
return date.setLocale(this.locale).toFormat(displayFormat);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
addCalendarYears(date, years) {
|
|
152
|
+
return date.reconfigure(this._getOptions()).plus({ years });
|
|
153
|
+
}
|
|
154
|
+
addCalendarMonths(date, months) {
|
|
155
|
+
return date.reconfigure(this._getOptions()).plus({ months });
|
|
156
|
+
}
|
|
157
|
+
addCalendarDays(date, days) {
|
|
158
|
+
return date.reconfigure(this._getOptions()).plus({ days });
|
|
159
|
+
}
|
|
160
|
+
toIso8601(date) {
|
|
161
|
+
return date.toISO();
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Returns the given value if given a valid Luxon or null. Deserializes valid ISO 8601 strings
|
|
165
|
+
* (https://www.ietf.org/rfc/rfc3339.txt) and valid Date objects into valid DateTime and empty
|
|
166
|
+
* string into null. Returns an invalid date for all other values.
|
|
167
|
+
*/
|
|
168
|
+
deserialize(value) {
|
|
169
|
+
const options = this._getOptions();
|
|
170
|
+
let date;
|
|
171
|
+
if (value instanceof Date) {
|
|
172
|
+
date = LuxonDateTime.fromJSDate(value, options);
|
|
173
|
+
}
|
|
174
|
+
if (typeof value === 'string') {
|
|
175
|
+
if (!value) {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
date = LuxonDateTime.fromISO(value, options);
|
|
179
|
+
}
|
|
180
|
+
if (date && this.isValid(date)) {
|
|
181
|
+
return date;
|
|
182
|
+
}
|
|
183
|
+
return super.deserialize(value);
|
|
184
|
+
}
|
|
185
|
+
isDateInstance(obj) {
|
|
186
|
+
return obj instanceof LuxonDateTime;
|
|
187
|
+
}
|
|
188
|
+
isValid(date) {
|
|
189
|
+
return date.isValid;
|
|
190
|
+
}
|
|
191
|
+
invalid() {
|
|
192
|
+
return LuxonDateTime.invalid('Invalid Luxon DateTime object.');
|
|
193
|
+
}
|
|
194
|
+
setTime(target, hours, minutes, seconds) {
|
|
195
|
+
//if (typeof ngDevMode === 'undefined' || ngDevMode) {
|
|
196
|
+
if (hours < 0 || hours > 23) {
|
|
197
|
+
throw Error(`Invalid hours "${hours}". Hours value must be between 0 and 23.`);
|
|
198
|
+
}
|
|
199
|
+
if (minutes < 0 || minutes > 59) {
|
|
200
|
+
throw Error(`Invalid minutes "${minutes}". Minutes value must be between 0 and 59.`);
|
|
201
|
+
}
|
|
202
|
+
if (seconds < 0 || seconds > 59) {
|
|
203
|
+
throw Error(`Invalid seconds "${seconds}". Seconds value must be between 0 and 59.`);
|
|
204
|
+
}
|
|
205
|
+
//}
|
|
206
|
+
return this.clone(target).set({
|
|
207
|
+
hour: hours,
|
|
208
|
+
minute: minutes,
|
|
209
|
+
second: seconds,
|
|
210
|
+
millisecond: 0,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
getHours(date) {
|
|
214
|
+
return date.hour;
|
|
215
|
+
}
|
|
216
|
+
getMinutes(date) {
|
|
217
|
+
return date.minute;
|
|
218
|
+
}
|
|
219
|
+
getSeconds(date) {
|
|
220
|
+
return date.second;
|
|
221
|
+
}
|
|
222
|
+
parseTime(value, parseFormat) {
|
|
223
|
+
const result = this.parse(value, parseFormat);
|
|
224
|
+
if ((!result || !this.isValid(result)) && typeof value === 'string') {
|
|
225
|
+
// It seems like Luxon doesn't work well cross-browser for strings that have
|
|
226
|
+
// additional characters around the time. Try parsing without those characters.
|
|
227
|
+
return (this.parse(value.replace(/[^0-9:(AM|PM)]/gi, ''), parseFormat) || result);
|
|
228
|
+
}
|
|
229
|
+
return result;
|
|
230
|
+
}
|
|
231
|
+
addSeconds(date, amount) {
|
|
232
|
+
return date.reconfigure(this._getOptions()).plus({ seconds: amount });
|
|
233
|
+
}
|
|
234
|
+
/** Gets the options that should be used when constructing a new `DateTime` object. */
|
|
235
|
+
_getOptions() {
|
|
236
|
+
return {
|
|
237
|
+
zone: this._useUTC ? 'utc' : undefined,
|
|
238
|
+
locale: this.locale,
|
|
239
|
+
outputCalendar: this._defaultOutputCalendar,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: OnemrvaLuxonDateAdapter, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
243
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: OnemrvaLuxonDateAdapter }); }
|
|
244
|
+
}
|
|
245
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: OnemrvaLuxonDateAdapter, decorators: [{
|
|
246
|
+
type: Injectable
|
|
247
|
+
}], ctorParameters: () => [{ type: i1.TranslateService }] });
|
|
248
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHV4b24uZGF0ZS5hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lbXJ2YS9kZXNpZ24tc3lzdGVtL3NoYXJlZC9zcmMvbGliL2FkYXB0ZXJzL2x1eG9uLmRhdGUuYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RFLE9BQU8sRUFDTCxRQUFRLElBQUksYUFBYSxFQUN6QixJQUFJLElBQUksU0FBUyxHQUdsQixNQUFNLE9BQU8sQ0FBQztBQUVmLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFDTCxVQUFVLEVBQ1YsOEJBQThCLEdBRS9CLE1BQU0sZUFBZSxDQUFDOzs7QUFFdkIsd0RBQXdEO0FBRXhELE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxXQUEwQjtJQUtyRSxZQUFvQixnQkFBa0M7UUFDcEQsS0FBSyxFQUFFLENBQUM7UUFEVSxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBR3BELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxlQUFlLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMvRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQ3BCLDhCQUE4QixFQUM5QjtZQUNFLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQztRQUNqQyxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sRUFBRSxjQUFjLElBQUksQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxzQkFBc0IsR0FB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TyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDcEUsNEVBQTRFO1lBQzVFLCtFQUErRTtZQUMvRSxPQUFPLENBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxJQUFJLE1BQU0sQ0FDekUsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsVUFBVSxDQUFDLElBQW1CLEVBQUUsTUFBYztRQUM1QyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELHNGQUFzRjtJQUM5RSxXQUFXO1FBQ2pCLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3RDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixjQUFjLEVBQUUsSUFBSSxDQUFDLHNCQUFzQjtTQUM1QyxDQUFDO0lBQ0osQ0FBQzs4R0F6U1UsdUJBQXVCO2tIQUF2Qix1QkFBdUI7OzJGQUF2Qix1QkFBdUI7a0JBRG5DLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5kZXYvbGljZW5zZVxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIsIE1BVF9EQVRFX0xPQ0FMRSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHtcbiAgRGF0ZVRpbWUgYXMgTHV4b25EYXRlVGltZSxcbiAgSW5mbyBhcyBMdXhvbkluZm8sXG4gIERhdGVUaW1lT3B0aW9ucyBhcyBMdXhvbkRhdGVUaW1lT3B0aW9ucyxcbiAgQ2FsZW5kYXJTeXN0ZW0gYXMgTHV4b25DYWxlbmRhclN5c3RlbSxcbn0gZnJvbSAnbHV4b24nO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtcbiAgbHV4b25SYW5nZSxcbiAgTUFUX0xVWE9OX0RBVEVfQURBUFRFUl9PUFRJT05TLFxuICBNYXRMdXhvbkRhdGVBZGFwdGVyT3B0aW9ucyxcbn0gZnJvbSAnLi9sdXhvbi51dGlscyc7XG5cbi8qKiBBZGFwdHMgTHV4b24gRGF0ZXMgZm9yIHVzZSB3aXRoIEFuZ3VsYXIgTWF0ZXJpYWwuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgT25lbXJ2YUx1eG9uRGF0ZUFkYXB0ZXIgZXh0ZW5kcyBEYXRlQWRhcHRlcjxMdXhvbkRhdGVUaW1lPiB7XG4gIHByaXZhdGUgX3VzZVVUQzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfZmlyc3REYXlPZldlZWs6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZGVmYXVsdE91dHB1dENhbGVuZGFyOiBMdXhvbkNhbGVuZGFyU3lzdGVtO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb25zdCBkYXRlTG9jYWxlID0gaW5qZWN0KE1BVF9EQVRFX0xPQ0FMRSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgICBjb25zdCBvcHRpb25zID0gaW5qZWN0PE1hdEx1eG9uRGF0ZUFkYXB0ZXJPcHRpb25zPihcbiAgICAgIE1BVF9MVVhPTl9EQVRFX0FEQVBURVJfT1BUSU9OUyxcbiAgICAgIHtcbiAgICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0aGlzLl91c2VVVEMgPSAhIW9wdGlvbnM/LnVzZVV0YztcbiAgICB0aGlzLl9maXJzdERheU9mV2VlayA9IG9wdGlvbnM/LmZpcnN0RGF5T2ZXZWVrIHx8IDA7XG4gICAgdGhpcy5fZGVmYXVsdE91dHB1dENhbGVuZGFyID0gb3B0aW9ucz8uZGVmYXVsdE91dHB1dENhbGVuZGFyIHx8ICdncmVnb3J5JztcbiAgICB0aGlzLnNldExvY2FsZShkYXRlTG9jYWxlIHx8IEx1eG9uRGF0ZVRpbWUubG9jYWwoKS5sb2NhbGUpO1xuXG4gICAgdGhpcy5zZXRMb2NhbGUodGhpcy50cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nKTtcbiAgICBpZiAodGhpcy50cmFuc2xhdGVTZXJ2aWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5vbkxhbmdDaGFuZ2VcbiAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKHsgbGFuZyB9KSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXRMb2NhbGUobGFuZyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldFllYXIoZGF0ZTogTHV4b25EYXRlVGltZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGRhdGUueWVhcjtcbiAgfVxuXG4gIGdldE1vbnRoKGRhdGU6IEx1eG9uRGF0ZVRpbWUpOiBudW1iZXIge1xuICAgIC8vIEx1eG9uIHdvcmtzIHdpdGggMS1pbmRleGVkIG1vbnRocyB3aGVyZWFzIG91ciBjb2RlIGV4cGVjdHMgMC1pbmRleGVkLlxuICAgIHJldHVybiBkYXRlLm1vbnRoIC0gMTtcbiAgfVxuXG4gIGdldERhdGUoZGF0ZTogTHV4b25EYXRlVGltZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGRhdGUuZGF5O1xuICB9XG5cbiAgZ2V0RGF5T2ZXZWVrKGRhdGU6IEx1eG9uRGF0ZVRpbWUpOiBudW1iZXIge1xuICAgIHJldHVybiBkYXRlLndlZWtkYXk7XG4gIH1cblxuICBnZXRNb250aE5hbWVzKHN0eWxlOiAnbG9uZycgfCAnc2hvcnQnIHwgJ25hcnJvdycpOiBzdHJpbmdbXSB7XG4gICAgLy8gQWRkaW5nIG91dHB1dENhbGVuZGFyIG9wdGlvbiwgYmVjYXVzZSBMdXhvbkluZm8gZG9lc24ndCBnZXQgZWZmZWN0ZWQgYnkgTHV4b25TZXR0aW5nc1xuICAgIHJldHVybiBMdXhvbkluZm8ubW9udGhzKHN0eWxlLCB7XG4gICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgb3V0cHV0Q2FsZW5kYXI6IHRoaXMuX2RlZmF1bHRPdXRwdXRDYWxlbmRhcixcbiAgICB9KTtcbiAgfVxuXG4gIGdldERhdGVOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgLy8gQXQgdGhlIHRpbWUgb2Ygd3JpdGluZywgTHV4b24gZG9lc24ndCBvZmZlciBzaW1pbGFyXG4gICAgLy8gZnVuY3Rpb25hbGl0eSBzbyB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byB0aGUgSW50bCBBUEkuXG4gICAgY29uc3QgZHRmID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5sb2NhbGUsIHtcbiAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgdGltZVpvbmU6ICd1dGMnLFxuICAgIH0pO1xuXG4gICAgLy8gRm9ybWF0IGEgVVRDIGRhdGUgaW4gb3JkZXIgdG8gYXZvaWQgRFNUIGlzc3Vlcy5cbiAgICByZXR1cm4gbHV4b25SYW5nZSgzMSwgaSA9PlxuICAgICAgZHRmLmZvcm1hdChMdXhvbkRhdGVUaW1lLnV0YygyMDE3LCAxLCBpICsgMSkudG9KU0RhdGUoKSksXG4gICAgKTtcbiAgfVxuXG4gIGdldERheU9mV2Vla05hbWVzKHN0eWxlOiAnbG9uZycgfCAnc2hvcnQnIHwgJ25hcnJvdycpOiBzdHJpbmdbXSB7XG4gICAgLy8gTm90ZSB0aGF0IHdlIHNoaWZ0IHRoZSBhcnJheSBvbmNlLCBiZWNhdXNlIEx1eG9uIHJldHVybnMgTW9uZGF5IGFzIHRoZVxuICAgIC8vIGZpcnN0IGRheSBvZiB0aGUgd2Vlaywgd2hlcmVhcyBvdXIgbG9naWMgYXNzdW1lcyB0aGF0IGl0J3MgU3VuZGF5LiBTZWU6XG4gICAgLy8gaHR0cHM6Ly9tb21lbnQuZ2l0aHViLmlvL2x1eG9uL2FwaS1kb2NzL2luZGV4Lmh0bWwjaW5mb3dlZWtkYXlzXG4gICAgY29uc3QgZGF5cyA9IEx1eG9uSW5mby53ZWVrZGF5cyhzdHlsZSwgeyBsb2NhbGU6IHRoaXMubG9jYWxlIH0pO1xuICAgIGRheXMudW5zaGlmdChkYXlzLnBvcCgpISk7XG4gICAgcmV0dXJuIGRheXM7XG4gIH1cblxuICBnZXRZZWFyTmFtZShkYXRlOiBMdXhvbkRhdGVUaW1lKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZGF0ZS50b0Zvcm1hdCgneXl5eScsIHRoaXMuX2dldE9wdGlvbnMoKSk7XG4gIH1cblxuICBnZXRGaXJzdERheU9mV2VlaygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9maXJzdERheU9mV2VlaztcbiAgfVxuXG4gIGdldE51bURheXNJbk1vbnRoKGRhdGU6IEx1eG9uRGF0ZVRpbWUpOiBudW1iZXIge1xuICAgIHJldHVybiBkYXRlLmRheXNJbk1vbnRoITtcbiAgfVxuXG4gIGNsb25lKGRhdGU6IEx1eG9uRGF0ZVRpbWUpOiBMdXhvbkRhdGVUaW1lIHtcbiAgICByZXR1cm4gTHV4b25EYXRlVGltZS5mcm9tT2JqZWN0KGRhdGUudG9PYmplY3QoKSwgdGhpcy5fZ2V0T3B0aW9ucygpKTtcbiAgfVxuXG4gIGNyZWF0ZURhdGUoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyLCBkYXRlOiBudW1iZXIpOiBMdXhvbkRhdGVUaW1lIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZ2V0T3B0aW9ucygpO1xuXG4gICAgaWYgKG1vbnRoIDwgMCB8fCBtb250aCA+IDExKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgbW9udGggaW5kZXggXCIke21vbnRofVwiLiBNb250aCBpbmRleCBoYXMgdG8gYmUgYmV0d2VlbiAwIGFuZCAxMS5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZGF0ZSA8IDEpIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGRhdGUgXCIke2RhdGV9XCIuIERhdGUgaGFzIHRvIGJlIGdyZWF0ZXIgdGhhbiAwLmApO1xuICAgIH1cblxuICAgIC8vIEx1eG9uIHVzZXMgMS1pbmRleGVkIG1vbnRocyBzbyB3ZSBuZWVkIHRvIGFkZCBvbmUgdG8gdGhlIG1vbnRoLlxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3VzZVVUQ1xuICAgICAgPyBMdXhvbkRhdGVUaW1lLnV0Yyh5ZWFyLCBtb250aCArIDEsIGRhdGUsIG9wdGlvbnMpXG4gICAgICA6IEx1eG9uRGF0ZVRpbWUubG9jYWwoeWVhciwgbW9udGggKyAxLCBkYXRlLCBvcHRpb25zKTtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKHJlc3VsdCkpIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGRhdGUgXCIke2RhdGV9XCIuIFJlYXNvbjogXCIke3Jlc3VsdC5pbnZhbGlkUmVhc29ufVwiLmApO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB0b2RheSgpOiBMdXhvbkRhdGVUaW1lIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZ2V0T3B0aW9ucygpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3VzZVVUQ1xuICAgICAgPyBMdXhvbkRhdGVUaW1lLnV0YyhvcHRpb25zKVxuICAgICAgOiBMdXhvbkRhdGVUaW1lLmxvY2FsKG9wdGlvbnMpO1xuICB9XG5cbiAgcGFyc2UodmFsdWU6IGFueSwgcGFyc2VGb3JtYXQ6IHN0cmluZyB8IHN0cmluZ1tdKTogTHV4b25EYXRlVGltZSB8IG51bGwge1xuICAgIGNvbnN0IG9wdGlvbnM6IEx1eG9uRGF0ZVRpbWVPcHRpb25zID0gdGhpcy5fZ2V0T3B0aW9ucygpO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpc284NjAxRGF0ZSA9IEx1eG9uRGF0ZVRpbWUuZnJvbUlTTyh2YWx1ZSwgb3B0aW9ucyk7XG5cbiAgICAgIGlmICh0aGlzLmlzVmFsaWQoaXNvODYwMURhdGUpKSB7XG4gICAgICAgIHJldHVybiBpc284NjAxRGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0cyA9IEFycmF5LmlzQXJyYXkocGFyc2VGb3JtYXQpID8gcGFyc2VGb3JtYXQgOiBbcGFyc2VGb3JtYXRdO1xuXG4gICAgICBpZiAoIXBhcnNlRm9ybWF0Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBFcnJvcignRm9ybWF0cyBhcnJheSBtdXN0IG5vdCBiZSBlbXB0eS4nKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBmb3JtYXQgb2YgZm9ybWF0cykge1xuICAgICAgICBjb25zdCBmcm9tRm9ybWF0ID0gTHV4b25EYXRlVGltZS5mcm9tRm9ybWF0KHZhbHVlLCBmb3JtYXQsIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzVmFsaWQoZnJvbUZvcm1hdCkpIHtcbiAgICAgICAgICByZXR1cm4gZnJvbUZvcm1hdDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gTHV4b25EYXRlVGltZS5mcm9tTWlsbGlzKHZhbHVlLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuIEx1eG9uRGF0ZVRpbWUuZnJvbUpTRGF0ZSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEx1eG9uRGF0ZVRpbWUpIHtcbiAgICAgIHJldHVybiBMdXhvbkRhdGVUaW1lLmZyb21NaWxsaXModmFsdWUudG9NaWxsaXMoKSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmb3JtYXQoZGF0ZTogTHV4b25EYXRlVGltZSwgZGlzcGxheUZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZChkYXRlKSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0x1eG9uRGF0ZUFkYXB0ZXI6IENhbm5vdCBmb3JtYXQgaW52YWxpZCBkYXRlLicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdXNlVVRDKSB7XG4gICAgICByZXR1cm4gZGF0ZS5zZXRMb2NhbGUodGhpcy5sb2NhbGUpLnNldFpvbmUoJ3V0YycpLnRvRm9ybWF0KGRpc3BsYXlGb3JtYXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGF0ZS5zZXRMb2NhbGUodGhpcy5sb2NhbGUpLnRvRm9ybWF0KGRpc3BsYXlGb3JtYXQpO1xuICAgIH1cbiAgfVxuXG4gIGFkZENhbGVuZGFyWWVhcnMoZGF0ZTogTHV4b25EYXRlVGltZSwgeWVhcnM6IG51bWJlcik6IEx1eG9uRGF0ZVRpbWUge1xuICAgIHJldHVybiBkYXRlLnJlY29uZmlndXJlKHRoaXMuX2dldE9wdGlvbnMoKSkucGx1cyh7IHllYXJzIH0pO1xuICB9XG5cbiAgYWRkQ2FsZW5kYXJNb250aHMoZGF0ZTogTHV4b25EYXRlVGltZSwgbW9udGhzOiBudW1iZXIpOiBMdXhvbkRhdGVUaW1lIHtcbiAgICByZXR1cm4gZGF0ZS5yZWNvbmZpZ3VyZSh0aGlzLl9nZXRPcHRpb25zKCkpLnBsdXMoeyBtb250aHMgfSk7XG4gIH1cblxuICBhZGRDYWxlbmRhckRheXMoZGF0ZTogTHV4b25EYXRlVGltZSwgZGF5czogbnVtYmVyKTogTHV4b25EYXRlVGltZSB7XG4gICAgcmV0dXJuIGRhdGUucmVjb25maWd1cmUodGhpcy5fZ2V0T3B0aW9ucygpKS5wbHVzKHsgZGF5cyB9KTtcbiAgfVxuXG4gIHRvSXNvODYwMShkYXRlOiBMdXhvbkRhdGVUaW1lKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZGF0ZS50b0lTTygpITtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB2YWx1ZSBpZiBnaXZlbiBhIHZhbGlkIEx1eG9uIG9yIG51bGwuIERlc2VyaWFsaXplcyB2YWxpZCBJU08gODYwMSBzdHJpbmdzXG4gICAqIChodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzMzOS50eHQpIGFuZCB2YWxpZCBEYXRlIG9iamVjdHMgaW50byB2YWxpZCBEYXRlVGltZSBhbmQgZW1wdHlcbiAgICogc3RyaW5nIGludG8gbnVsbC4gUmV0dXJucyBhbiBpbnZhbGlkIGRhdGUgZm9yIGFsbCBvdGhlciB2YWx1ZXMuXG4gICAqL1xuICBvdmVycmlkZSBkZXNlcmlhbGl6ZSh2YWx1ZTogYW55KTogTHV4b25EYXRlVGltZSB8IG51bGwge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9nZXRPcHRpb25zKCk7XG4gICAgbGV0IGRhdGU6IEx1eG9uRGF0ZVRpbWUgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgZGF0ZSA9IEx1eG9uRGF0ZVRpbWUuZnJvbUpTRGF0ZSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgZGF0ZSA9IEx1eG9uRGF0ZVRpbWUuZnJvbUlTTyh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmIChkYXRlICYmIHRoaXMuaXNWYWxpZChkYXRlKSkge1xuICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5kZXNlcmlhbGl6ZSh2YWx1ZSk7XG4gIH1cblxuICBpc0RhdGVJbnN0YW5jZShvYmo6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBMdXhvbkRhdGVUaW1lO1xuICB9XG5cbiAgaXNWYWxpZChkYXRlOiBMdXhvbkRhdGVUaW1lKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGRhdGUuaXNWYWxpZDtcbiAgfVxuXG4gIGludmFsaWQoKTogTHV4b25EYXRlVGltZSB7XG4gICAgcmV0dXJuIEx1eG9uRGF0ZVRpbWUuaW52YWxpZCgnSW52YWxpZCBMdXhvbiBEYXRlVGltZSBvYmplY3QuJyk7XG4gIH1cblxuICBzZXRUaW1lKFxuICAgIHRhcmdldDogTHV4b25EYXRlVGltZSxcbiAgICBob3VyczogbnVtYmVyLFxuICAgIG1pbnV0ZXM6IG51bWJlcixcbiAgICBzZWNvbmRzOiBudW1iZXIsXG4gICk6IEx1eG9uRGF0ZVRpbWUge1xuICAgIC8vaWYgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkge1xuICAgIGlmIChob3VycyA8IDAgfHwgaG91cnMgPiAyMykge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGhvdXJzIFwiJHtob3Vyc31cIi4gSG91cnMgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDIzLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtaW51dGVzIDwgMCB8fCBtaW51dGVzID4gNTkpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBtaW51dGVzIFwiJHttaW51dGVzfVwiLiBNaW51dGVzIHZhbHVlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA1OS5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoc2Vjb25kcyA8IDAgfHwgc2Vjb25kcyA+IDU5KSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgc2Vjb25kcyBcIiR7c2Vjb25kc31cIi4gU2Vjb25kcyB2YWx1ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNTkuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vfVxuXG4gICAgcmV0dXJuIHRoaXMuY2xvbmUodGFyZ2V0KS5zZXQoe1xuICAgICAgaG91cjogaG91cnMsXG4gICAgICBtaW51dGU6IG1pbnV0ZXMsXG4gICAgICBzZWNvbmQ6IHNlY29uZHMsXG4gICAgICBtaWxsaXNlY29uZDogMCxcbiAgICB9KTtcbiAgfVxuXG4gIGdldEhvdXJzKGRhdGU6IEx1eG9uRGF0ZVRpbWUpOiBudW1iZXIge1xuICAgIHJldHVybiBkYXRlLmhvdXI7XG4gIH1cblxuICBnZXRNaW51dGVzKGRhdGU6IEx1eG9uRGF0ZVRpbWUpOiBudW1iZXIge1xuICAgIHJldHVybiBkYXRlLm1pbnV0ZTtcbiAgfVxuXG4gIGdldFNlY29uZHMoZGF0ZTogTHV4b25EYXRlVGltZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGRhdGUuc2Vjb25kO1xuICB9XG5cbiAgcGFyc2VUaW1lKHZhbHVlOiBhbnksIHBhcnNlRm9ybWF0OiBzdHJpbmcgfCBzdHJpbmdbXSk6IEx1eG9uRGF0ZVRpbWUgfCBudWxsIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBhcnNlKHZhbHVlLCBwYXJzZUZvcm1hdCk7XG5cbiAgICBpZiAoKCFyZXN1bHQgfHwgIXRoaXMuaXNWYWxpZChyZXN1bHQpKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBJdCBzZWVtcyBsaWtlIEx1eG9uIGRvZXNuJ3Qgd29yayB3ZWxsIGNyb3NzLWJyb3dzZXIgZm9yIHN0cmluZ3MgdGhhdCBoYXZlXG4gICAgICAvLyBhZGRpdGlvbmFsIGNoYXJhY3RlcnMgYXJvdW5kIHRoZSB0aW1lLiBUcnkgcGFyc2luZyB3aXRob3V0IHRob3NlIGNoYXJhY3RlcnMuXG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnBhcnNlKHZhbHVlLnJlcGxhY2UoL1teMC05OihBTXxQTSldL2dpLCAnJyksIHBhcnNlRm9ybWF0KSB8fCByZXN1bHRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFkZFNlY29uZHMoZGF0ZTogTHV4b25EYXRlVGltZSwgYW1vdW50OiBudW1iZXIpOiBMdXhvbkRhdGVUaW1lIHtcbiAgICByZXR1cm4gZGF0ZS5yZWNvbmZpZ3VyZSh0aGlzLl9nZXRPcHRpb25zKCkpLnBsdXMoeyBzZWNvbmRzOiBhbW91bnQgfSk7XG4gIH1cblxuICAvKiogR2V0cyB0aGUgb3B0aW9ucyB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gY29uc3RydWN0aW5nIGEgbmV3IGBEYXRlVGltZWAgb2JqZWN0LiAqL1xuICBwcml2YXRlIF9nZXRPcHRpb25zKCk6IEx1eG9uRGF0ZVRpbWVPcHRpb25zIHtcbiAgICByZXR1cm4ge1xuICAgICAgem9uZTogdGhpcy5fdXNlVVRDID8gJ3V0YycgOiB1bmRlZmluZWQsXG4gICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgb3V0cHV0Q2FsZW5kYXI6IHRoaXMuX2RlZmF1bHRPdXRwdXRDYWxlbmRhcixcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
/** InjectionToken for LuxonDateAdapter to configure options. */
|
|
3
|
+
export const MAT_LUXON_DATE_ADAPTER_OPTIONS = new InjectionToken('MAT_LUXON_DATE_ADAPTER_OPTIONS', {
|
|
4
|
+
providedIn: 'root',
|
|
5
|
+
factory: MAT_LUXON_DATE_ADAPTER_OPTIONS_FACTORY,
|
|
6
|
+
});
|
|
7
|
+
/** @docs-private */
|
|
8
|
+
export function MAT_LUXON_DATE_ADAPTER_OPTIONS_FACTORY() {
|
|
9
|
+
return {
|
|
10
|
+
useUtc: false,
|
|
11
|
+
firstDayOfWeek: 0,
|
|
12
|
+
defaultOutputCalendar: 'gregory',
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/** Creates an array and fills it with values. */
|
|
16
|
+
export function luxonRange(length, valueFunction) {
|
|
17
|
+
const valuesArray = Array(length);
|
|
18
|
+
for (let i = 0; i < length; i++) {
|
|
19
|
+
valuesArray[i] = valueFunction(i);
|
|
20
|
+
}
|
|
21
|
+
return valuesArray;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHV4b24udXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmVtcnZhL2Rlc2lnbi1zeXN0ZW0vc2hhcmVkL3NyYy9saWIvYWRhcHRlcnMvbHV4b24udXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQXVCL0MsZ0VBQWdFO0FBQ2hFLE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUN6QyxJQUFJLGNBQWMsQ0FDaEIsZ0NBQWdDLEVBQ2hDO0lBQ0UsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLHNDQUFzQztDQUNoRCxDQUNGLENBQUM7QUFFSixvQkFBb0I7QUFDcEIsTUFBTSxVQUFVLHNDQUFzQztJQUNwRCxPQUFPO1FBQ0wsTUFBTSxFQUFFLEtBQUs7UUFDYixjQUFjLEVBQUUsQ0FBQztRQUNqQixxQkFBcUIsRUFBRSxTQUFTO0tBQ2pDLENBQUM7QUFDSixDQUFDO0FBRUQsaURBQWlEO0FBQ2pELE1BQU0sVUFBVSxVQUFVLENBQ3hCLE1BQWMsRUFDZCxhQUFtQztJQUVuQyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2hDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDYWxlbmRhclN5c3RlbSBhcyBMdXhvbkNhbGVuZGFyU3lzdGVtIH0gZnJvbSAnbHV4b24vc3JjL21pc2MnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqIENvbmZpZ3VyYWJsZSBvcHRpb25zIGZvciB0aGUgYEx1eG9uRGF0ZUFkYXB0ZXJgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXRMdXhvbkRhdGVBZGFwdGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUdXJucyB0aGUgdXNlIG9mIHV0YyBkYXRlcyBvbiBvciBvZmYuXG4gICAqIENoYW5naW5nIHRoaXMgd2lsbCBjaGFuZ2UgaG93IEFuZ3VsYXIgTWF0ZXJpYWwgY29tcG9uZW50cyBsaWtlIERhdGVQaWNrZXIgb3V0cHV0IGRhdGVzLlxuICAgKi9cbiAgdXNlVXRjOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBmaXJzdCBkYXkgb2Ygd2Vlay5cbiAgICogQ2hhbmdpbmcgdGhpcyB3aWxsIGNoYW5nZSBob3cgQW5ndWxhciBNYXRlcmlhbCBjb21wb25lbnRzIGxpa2UgRGF0ZVBpY2tlciBzaG93cyBzdGFydCBvZiB3ZWVrLlxuICAgKi9cbiAgZmlyc3REYXlPZldlZWs6IG51bWJlcjtcblxuICAvKipcbiAgICogU2V0cyB0aGUgb3V0cHV0IENhbGVuZGFyLlxuICAgKiBDaGFuZ2luZyB0aGlzIHdpbGwgY2hhbmdlIGhvdyBBbmd1bGFyIE1hdGVyaWFsIGNvbXBvbmVudHMgbGlrZSBEYXRlUGlja2VyIG91dHB1dCBkYXRlcy5cbiAgICovXG4gIGRlZmF1bHRPdXRwdXRDYWxlbmRhcjogTHV4b25DYWxlbmRhclN5c3RlbTtcbn1cblxuLyoqIEluamVjdGlvblRva2VuIGZvciBMdXhvbkRhdGVBZGFwdGVyIHRvIGNvbmZpZ3VyZSBvcHRpb25zLiAqL1xuZXhwb3J0IGNvbnN0IE1BVF9MVVhPTl9EQVRFX0FEQVBURVJfT1BUSU9OUyA9XG4gIG5ldyBJbmplY3Rpb25Ub2tlbjxNYXRMdXhvbkRhdGVBZGFwdGVyT3B0aW9ucz4oXG4gICAgJ01BVF9MVVhPTl9EQVRFX0FEQVBURVJfT1BUSU9OUycsXG4gICAge1xuICAgICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICAgICAgZmFjdG9yeTogTUFUX0xVWE9OX0RBVEVfQURBUFRFUl9PUFRJT05TX0ZBQ1RPUlksXG4gICAgfSxcbiAgKTtcblxuLyoqIEBkb2NzLXByaXZhdGUgKi9cbmV4cG9ydCBmdW5jdGlvbiBNQVRfTFVYT05fREFURV9BREFQVEVSX09QVElPTlNfRkFDVE9SWSgpOiBNYXRMdXhvbkRhdGVBZGFwdGVyT3B0aW9ucyB7XG4gIHJldHVybiB7XG4gICAgdXNlVXRjOiBmYWxzZSxcbiAgICBmaXJzdERheU9mV2VlazogMCxcbiAgICBkZWZhdWx0T3V0cHV0Q2FsZW5kYXI6ICdncmVnb3J5JyxcbiAgfTtcbn1cblxuLyoqIENyZWF0ZXMgYW4gYXJyYXkgYW5kIGZpbGxzIGl0IHdpdGggdmFsdWVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGx1eG9uUmFuZ2U8VD4oXG4gIGxlbmd0aDogbnVtYmVyLFxuICB2YWx1ZUZ1bmN0aW9uOiAoaW5kZXg6IG51bWJlcikgPT4gVCxcbik6IFRbXSB7XG4gIGNvbnN0IHZhbHVlc0FycmF5ID0gQXJyYXkobGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIHZhbHVlc0FycmF5W2ldID0gdmFsdWVGdW5jdGlvbihpKTtcbiAgfVxuICByZXR1cm4gdmFsdWVzQXJyYXk7XG59XG4iXX0=
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Google LLC All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://angular.dev/license
|
|
7
|
+
*/
|
|
8
|
+
import { Injectable, inject } from '@angular/core';
|
|
9
|
+
import { DateAdapter, MAT_DATE_LOCALE } from '@angular/material/core';
|
|
10
|
+
import { DateTime as LuxonDateTime, Info as LuxonInfo, } from 'luxon';
|
|
11
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
12
|
+
import { luxonRange, MAT_LUXON_DATE_ADAPTER_OPTIONS, } from './luxon.utils';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "@ngx-translate/core";
|
|
15
|
+
/** Adapts Luxon Dates for use with Angular Material. */
|
|
16
|
+
export class OnemrvaLuxonYearMonthDateAdapter extends DateAdapter {
|
|
17
|
+
constructor(translateService) {
|
|
18
|
+
super();
|
|
19
|
+
this.translateService = translateService;
|
|
20
|
+
const dateLocale = inject(MAT_DATE_LOCALE, { optional: true });
|
|
21
|
+
const options = inject(MAT_LUXON_DATE_ADAPTER_OPTIONS, {
|
|
22
|
+
optional: true,
|
|
23
|
+
});
|
|
24
|
+
this._useUTC = !!options?.useUtc;
|
|
25
|
+
this._firstDayOfWeek = options?.firstDayOfWeek || 0;
|
|
26
|
+
this._defaultOutputCalendar = options?.defaultOutputCalendar || 'gregory';
|
|
27
|
+
this.setLocale(dateLocale || LuxonDateTime.local().locale);
|
|
28
|
+
this.setLocale(this.translateService.currentLang);
|
|
29
|
+
if (this.translateService !== undefined) {
|
|
30
|
+
this.translateService.onLangChange
|
|
31
|
+
.pipe(takeUntilDestroyed())
|
|
32
|
+
.subscribe(({ lang }) => {
|
|
33
|
+
this.setLocale(lang);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
getYear(date) {
|
|
38
|
+
return date.year;
|
|
39
|
+
}
|
|
40
|
+
getMonth(date) {
|
|
41
|
+
// Luxon works with 1-indexed months whereas our code expects 0-indexed.
|
|
42
|
+
return date.month - 1;
|
|
43
|
+
}
|
|
44
|
+
getDate(date) {
|
|
45
|
+
return date.day;
|
|
46
|
+
}
|
|
47
|
+
getDayOfWeek(date) {
|
|
48
|
+
return date.weekday;
|
|
49
|
+
}
|
|
50
|
+
getMonthNames(style) {
|
|
51
|
+
// Adding outputCalendar option, because LuxonInfo doesn't get effected by LuxonSettings
|
|
52
|
+
return LuxonInfo.months(style, {
|
|
53
|
+
locale: this.locale,
|
|
54
|
+
outputCalendar: this._defaultOutputCalendar,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
getDateNames() {
|
|
58
|
+
// At the time of writing, Luxon doesn't offer similar
|
|
59
|
+
// functionality so we have to fall back to the Intl API.
|
|
60
|
+
const dtf = new Intl.DateTimeFormat(this.locale, {
|
|
61
|
+
day: 'numeric',
|
|
62
|
+
timeZone: 'utc',
|
|
63
|
+
});
|
|
64
|
+
// Format a UTC date in order to avoid DST issues.
|
|
65
|
+
return luxonRange(31, i => dtf.format(LuxonDateTime.utc(2017, 1, i + 1).toJSDate()));
|
|
66
|
+
}
|
|
67
|
+
getDayOfWeekNames(style) {
|
|
68
|
+
// Note that we shift the array once, because Luxon returns Monday as the
|
|
69
|
+
// first day of the week, whereas our logic assumes that it's Sunday. See:
|
|
70
|
+
// https://moment.github.io/luxon/api-docs/index.html#infoweekdays
|
|
71
|
+
const days = LuxonInfo.weekdays(style, { locale: this.locale });
|
|
72
|
+
days.unshift(days.pop());
|
|
73
|
+
return days;
|
|
74
|
+
}
|
|
75
|
+
getYearName(date) {
|
|
76
|
+
return date.toFormat('yyyy', this._getOptions());
|
|
77
|
+
}
|
|
78
|
+
getFirstDayOfWeek() {
|
|
79
|
+
return this._firstDayOfWeek;
|
|
80
|
+
}
|
|
81
|
+
getNumDaysInMonth(date) {
|
|
82
|
+
return date.daysInMonth;
|
|
83
|
+
}
|
|
84
|
+
clone(date) {
|
|
85
|
+
return LuxonDateTime.fromObject(date.toObject(), this._getOptions());
|
|
86
|
+
}
|
|
87
|
+
createDate(year, month, date) {
|
|
88
|
+
const options = this._getOptions();
|
|
89
|
+
if (month < 0 || month > 11) {
|
|
90
|
+
throw Error(`Invalid month index "${month}". Month index has to be between 0 and 11.`);
|
|
91
|
+
}
|
|
92
|
+
if (date < 1) {
|
|
93
|
+
throw Error(`Invalid date "${date}". Date has to be greater than 0.`);
|
|
94
|
+
}
|
|
95
|
+
// Luxon uses 1-indexed months so we need to add one to the month.
|
|
96
|
+
const result = this._useUTC
|
|
97
|
+
? LuxonDateTime.utc(year, month + 1, date, options)
|
|
98
|
+
: LuxonDateTime.local(year, month + 1, date, options);
|
|
99
|
+
if (!this.isValid(result)) {
|
|
100
|
+
throw Error(`Invalid date "${date}". Reason: "${result.invalidReason}".`);
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
today() {
|
|
105
|
+
const options = this._getOptions();
|
|
106
|
+
return this._useUTC
|
|
107
|
+
? LuxonDateTime.utc(options)
|
|
108
|
+
: LuxonDateTime.local(options);
|
|
109
|
+
}
|
|
110
|
+
parse(value, parseFormat) {
|
|
111
|
+
const options = this._getOptions();
|
|
112
|
+
if (typeof value == 'string' && value.length > 0) {
|
|
113
|
+
const iso8601Date = LuxonDateTime.fromISO(value, options);
|
|
114
|
+
if (this.isValid(iso8601Date)) {
|
|
115
|
+
return iso8601Date;
|
|
116
|
+
}
|
|
117
|
+
const formats = Array.isArray(parseFormat) ? parseFormat : [parseFormat];
|
|
118
|
+
if (!parseFormat.length) {
|
|
119
|
+
throw Error('Formats array must not be empty.');
|
|
120
|
+
}
|
|
121
|
+
for (const format of formats) {
|
|
122
|
+
const fromFormat = LuxonDateTime.fromFormat(value, format, options);
|
|
123
|
+
if (this.isValid(fromFormat)) {
|
|
124
|
+
return fromFormat;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return this.invalid();
|
|
128
|
+
}
|
|
129
|
+
else if (typeof value === 'number') {
|
|
130
|
+
return LuxonDateTime.fromMillis(value, options);
|
|
131
|
+
}
|
|
132
|
+
else if (value instanceof Date) {
|
|
133
|
+
return LuxonDateTime.fromJSDate(value, options);
|
|
134
|
+
}
|
|
135
|
+
else if (value instanceof LuxonDateTime) {
|
|
136
|
+
return LuxonDateTime.fromMillis(value.toMillis(), options);
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
format(date, displayFormat) {
|
|
141
|
+
if (!this.isValid(date)) {
|
|
142
|
+
throw Error('LuxonDateAdapter: Cannot format invalid date.');
|
|
143
|
+
}
|
|
144
|
+
if (this._useUTC) {
|
|
145
|
+
return date.setLocale(this.locale).setZone('utc').toFormat(displayFormat);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
return date.setLocale(this.locale).toFormat(displayFormat);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
addCalendarYears(date, years) {
|
|
152
|
+
return date.reconfigure(this._getOptions()).plus({ years });
|
|
153
|
+
}
|
|
154
|
+
addCalendarMonths(date, months) {
|
|
155
|
+
return date.reconfigure(this._getOptions()).plus({ months });
|
|
156
|
+
}
|
|
157
|
+
addCalendarDays(date, days) {
|
|
158
|
+
return date.reconfigure(this._getOptions()).plus({ days });
|
|
159
|
+
}
|
|
160
|
+
toIso8601(date) {
|
|
161
|
+
return date.toISO();
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Returns the given value if given a valid Luxon or null. Deserializes valid ISO 8601 strings
|
|
165
|
+
* (https://www.ietf.org/rfc/rfc3339.txt) and valid Date objects into valid DateTime and empty
|
|
166
|
+
* string into null. Returns an invalid date for all other values.
|
|
167
|
+
*/
|
|
168
|
+
deserialize(value) {
|
|
169
|
+
const options = this._getOptions();
|
|
170
|
+
let date;
|
|
171
|
+
if (value instanceof Date) {
|
|
172
|
+
date = LuxonDateTime.fromJSDate(value, options);
|
|
173
|
+
}
|
|
174
|
+
if (typeof value === 'string') {
|
|
175
|
+
if (!value) {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
date = LuxonDateTime.fromISO(value, options);
|
|
179
|
+
}
|
|
180
|
+
if (date && this.isValid(date)) {
|
|
181
|
+
return date;
|
|
182
|
+
}
|
|
183
|
+
return super.deserialize(value);
|
|
184
|
+
}
|
|
185
|
+
isDateInstance(obj) {
|
|
186
|
+
return obj instanceof LuxonDateTime;
|
|
187
|
+
}
|
|
188
|
+
isValid(date) {
|
|
189
|
+
return date.isValid;
|
|
190
|
+
}
|
|
191
|
+
invalid() {
|
|
192
|
+
return LuxonDateTime.invalid('Invalid Luxon DateTime object.');
|
|
193
|
+
}
|
|
194
|
+
setTime(target, hours, minutes, seconds) {
|
|
195
|
+
//if (typeof ngDevMode === 'undefined' || ngDevMode) {
|
|
196
|
+
if (hours < 0 || hours > 23) {
|
|
197
|
+
throw Error(`Invalid hours "${hours}". Hours value must be between 0 and 23.`);
|
|
198
|
+
}
|
|
199
|
+
if (minutes < 0 || minutes > 59) {
|
|
200
|
+
throw Error(`Invalid minutes "${minutes}". Minutes value must be between 0 and 59.`);
|
|
201
|
+
}
|
|
202
|
+
if (seconds < 0 || seconds > 59) {
|
|
203
|
+
throw Error(`Invalid seconds "${seconds}". Seconds value must be between 0 and 59.`);
|
|
204
|
+
}
|
|
205
|
+
//}
|
|
206
|
+
return this.clone(target).set({
|
|
207
|
+
hour: hours,
|
|
208
|
+
minute: minutes,
|
|
209
|
+
second: seconds,
|
|
210
|
+
millisecond: 0,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
getHours(date) {
|
|
214
|
+
return date.hour;
|
|
215
|
+
}
|
|
216
|
+
getMinutes(date) {
|
|
217
|
+
return date.minute;
|
|
218
|
+
}
|
|
219
|
+
getSeconds(date) {
|
|
220
|
+
return date.second;
|
|
221
|
+
}
|
|
222
|
+
parseTime(value, parseFormat) {
|
|
223
|
+
const result = this.parse(value, parseFormat);
|
|
224
|
+
if ((!result || !this.isValid(result)) && typeof value === 'string') {
|
|
225
|
+
// It seems like Luxon doesn't work well cross-browser for strings that have
|
|
226
|
+
// additional characters around the time. Try parsing without those characters.
|
|
227
|
+
return (this.parse(value.replace(/[^0-9:(AM|PM)]/gi, ''), parseFormat) || result);
|
|
228
|
+
}
|
|
229
|
+
return result;
|
|
230
|
+
}
|
|
231
|
+
addSeconds(date, amount) {
|
|
232
|
+
return date.reconfigure(this._getOptions()).plus({ seconds: amount });
|
|
233
|
+
}
|
|
234
|
+
/** Gets the options that should be used when constructing a new `DateTime` object. */
|
|
235
|
+
_getOptions() {
|
|
236
|
+
return {
|
|
237
|
+
zone: this._useUTC ? 'utc' : undefined,
|
|
238
|
+
locale: this.locale,
|
|
239
|
+
outputCalendar: this._defaultOutputCalendar,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: OnemrvaLuxonYearMonthDateAdapter, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
243
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: OnemrvaLuxonYearMonthDateAdapter }); }
|
|
244
|
+
}
|
|
245
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: OnemrvaLuxonYearMonthDateAdapter, decorators: [{
|
|
246
|
+
type: Injectable
|
|
247
|
+
}], ctorParameters: () => [{ type: i1.TranslateService }] });
|
|
248
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHV4b24ueWVhci1tb250aC5kYXRlLmFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmVtcnZhL2Rlc2lnbi1zeXN0ZW0vc2hhcmVkL3NyYy9saWIvYWRhcHRlcnMvbHV4b24ueWVhci1tb250aC5kYXRlLmFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RSxPQUFPLEVBQ0wsUUFBUSxJQUFJLGFBQWEsRUFDekIsSUFBSSxJQUFJLFNBQVMsR0FHbEIsTUFBTSxPQUFPLENBQUM7QUFFZixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsVUFBVSxFQUNWLDhCQUE4QixHQUUvQixNQUFNLGVBQWUsQ0FBQzs7O0FBRXZCLHdEQUF3RDtBQUV4RCxNQUFNLE9BQU8sZ0NBQWlDLFNBQVEsV0FBMEI7SUFLOUUsWUFBb0IsZ0JBQWtDO1FBQ3BELEtBQUssRUFBRSxDQUFDO1FBRFUscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUdwRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsZUFBZSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUNwQiw4QkFBOEIsRUFDOUI7WUFDRSxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQ0YsQ0FBQztRQUVGLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUM7UUFDakMsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLEVBQUUsY0FBYyxJQUFJLENBQUMsQ0FBQztRQUNw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QUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3BFLDRFQUE0RTtZQUM1RSwrRUFBK0U7WUFDL0UsT0FBTyxDQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsRUFBRSxXQUFXLENBQUMsSUFBSSxNQUFNLENBQ3pFLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFtQixFQUFFLE1BQWM7UUFDNUMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxzRkFBc0Y7SUFDOUUsV0FBVztRQUNqQixPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUztZQUN0QyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsY0FBYyxFQUFFLElBQUksQ0FBQyxzQkFBc0I7U0FDNUMsQ0FBQztJQUNKLENBQUM7OEdBelNVLGdDQUFnQztrSEFBaEMsZ0NBQWdDOzsyRkFBaEMsZ0NBQWdDO2tCQUQ1QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuZGV2L2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdGVBZGFwdGVyLCBNQVRfREFURV9MT0NBTEUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7XG4gIERhdGVUaW1lIGFzIEx1eG9uRGF0ZVRpbWUsXG4gIEluZm8gYXMgTHV4b25JbmZvLFxuICBEYXRlVGltZU9wdGlvbnMgYXMgTHV4b25EYXRlVGltZU9wdGlvbnMsXG4gIENhbGVuZGFyU3lzdGVtIGFzIEx1eG9uQ2FsZW5kYXJTeXN0ZW0sXG59IGZyb20gJ2x1eG9uJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7XG4gIGx1eG9uUmFuZ2UsXG4gIE1BVF9MVVhPTl9EQVRFX0FEQVBURVJfT1BUSU9OUyxcbiAgTWF0THV4b25EYXRlQWRhcHRlck9wdGlvbnMsXG59IGZyb20gJy4vbHV4b24udXRpbHMnO1xuXG4vKiogQWRhcHRzIEx1eG9uIERhdGVzIGZvciB1c2Ugd2l0aCBBbmd1bGFyIE1hdGVyaWFsLiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9uZW1ydmFMdXhvblllYXJNb250aERhdGVBZGFwdGVyIGV4dGVuZHMgRGF0ZUFkYXB0ZXI8THV4b25EYXRlVGltZT4ge1xuICBwcml2YXRlIF91c2VVVEM6IGJvb2xlYW47XG4gIHByaXZhdGUgX2ZpcnN0RGF5T2ZXZWVrOiBudW1iZXI7XG4gIHByaXZhdGUgX2RlZmF1bHRPdXRwdXRDYWxlbmRhcjogTHV4b25DYWxlbmRhclN5c3RlbTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29uc3QgZGF0ZUxvY2FsZSA9IGluamVjdChNQVRfREFURV9MT0NBTEUsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGluamVjdDxNYXRMdXhvbkRhdGVBZGFwdGVyT3B0aW9ucz4oXG4gICAgICBNQVRfTFVYT05fREFURV9BREFQVEVSX09QVElPTlMsXG4gICAgICB7XG4gICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5fdXNlVVRDID0gISFvcHRpb25zPy51c2VVdGM7XG4gICAgdGhpcy5fZmlyc3REYXlPZldlZWsgPSBvcHRpb25zPy5maXJzdERheU9mV2VlayB8fCAwO1xuICAgIHRoaXMuX2RlZmF1bHRPdXRwdXRDYWxlbmRhciA9IG9wdGlvbnM/LmRlZmF1bHRPdXRwdXRDYWxlbmRhciB8fCAnZ3JlZ29yeSc7XG4gICAgdGhpcy5zZXRMb2NhbGUoZGF0ZUxvY2FsZSB8fCBMdXhvbkRhdGVUaW1lLmxvY2FsKCkubG9jYWxlKTtcblxuICAgIHRoaXMuc2V0TG9jYWxlKHRoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZyk7XG4gICAgaWYgKHRoaXMudHJhbnNsYXRlU2VydmljZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uub25MYW5nQ2hhbmdlXG4gICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgICAuc3Vic2NyaWJlKCh7IGxhbmcgfSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0TG9jYWxlKGxhbmcpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXRZZWFyKGRhdGU6IEx1eG9uRGF0ZVRpbWUpOiBudW1iZXIge1xuICAgIHJldHVybiBkYXRlLnllYXI7XG4gIH1cblxuICBnZXRNb250aChkYXRlOiBMdXhvbkRhdGVUaW1lKTogbnVtYmVyIHtcbiAgICAvLyBMdXhvbiB3b3JrcyB3aXRoIDEtaW5kZXhlZCBtb250aHMgd2hlcmVhcyBvdXIgY29kZSBleHBlY3RzIDAtaW5kZXhlZC5cbiAgICByZXR1cm4gZGF0ZS5tb250aCAtIDE7XG4gIH1cblxuICBnZXREYXRlKGRhdGU6IEx1eG9uRGF0ZVRpbWUpOiBudW1iZXIge1xuICAgIHJldHVybiBkYXRlLmRheTtcbiAgfVxuXG4gIGdldERheU9mV2VlayhkYXRlOiBMdXhvbkRhdGVUaW1lKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZGF0ZS53ZWVrZGF5O1xuICB9XG5cbiAgZ2V0TW9udGhOYW1lcyhzdHlsZTogJ2xvbmcnIHwgJ3Nob3J0JyB8ICduYXJyb3cnKTogc3RyaW5nW10ge1xuICAgIC8vIEFkZGluZyBvdXRwdXRDYWxlbmRhciBvcHRpb24sIGJlY2F1c2UgTHV4b25JbmZvIGRvZXNuJ3QgZ2V0IGVmZmVjdGVkIGJ5IEx1eG9uU2V0dGluZ3NcbiAgICByZXR1cm4gTHV4b25JbmZvLm1vbnRocyhzdHlsZSwge1xuICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgIG91dHB1dENhbGVuZGFyOiB0aGlzLl9kZWZhdWx0T3V0cHV0Q2FsZW5kYXIsXG4gICAgfSk7XG4gIH1cblxuICBnZXREYXRlTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIC8vIEF0IHRoZSB0aW1lIG9mIHdyaXRpbmcsIEx1eG9uIGRvZXNuJ3Qgb2ZmZXIgc2ltaWxhclxuICAgIC8vIGZ1bmN0aW9uYWxpdHkgc28gd2UgaGF2ZSB0byBmYWxsIGJhY2sgdG8gdGhlIEludGwgQVBJLlxuICAgIGNvbnN0IGR0ZiA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMubG9jYWxlLCB7XG4gICAgICBkYXk6ICdudW1lcmljJyxcbiAgICAgIHRpbWVab25lOiAndXRjJyxcbiAgICB9KTtcblxuICAgIC8vIEZvcm1hdCBhIFVUQyBkYXRlIGluIG9yZGVyIHRvIGF2b2lkIERTVCBpc3N1ZXMuXG4gICAgcmV0dXJuIGx1eG9uUmFuZ2UoMzEsIGkgPT5cbiAgICAgIGR0Zi5mb3JtYXQoTHV4b25EYXRlVGltZS51dGMoMjAxNywgMSwgaSArIDEpLnRvSlNEYXRlKCkpLFxuICAgICk7XG4gIH1cblxuICBnZXREYXlPZldlZWtOYW1lcyhzdHlsZTogJ2xvbmcnIHwgJ3Nob3J0JyB8ICduYXJyb3cnKTogc3RyaW5nW10ge1xuICAgIC8vIE5vdGUgdGhhdCB3ZSBzaGlmdCB0aGUgYXJyYXkgb25jZSwgYmVjYXVzZSBMdXhvbiByZXR1cm5zIE1vbmRheSBhcyB0aGVcbiAgICAvLyBmaXJzdCBkYXkgb2YgdGhlIHdlZWssIHdoZXJlYXMgb3VyIGxvZ2ljIGFzc3VtZXMgdGhhdCBpdCdzIFN1bmRheS4gU2VlOlxuICAgIC8vIGh0dHBzOi8vbW9tZW50LmdpdGh1Yi5pby9sdXhvbi9hcGktZG9jcy9pbmRleC5odG1sI2luZm93ZWVrZGF5c1xuICAgIGNvbnN0IGRheXMgPSBMdXhvbkluZm8ud2Vla2RheXMoc3R5bGUsIHsgbG9jYWxlOiB0aGlzLmxvY2FsZSB9KTtcbiAgICBkYXlzLnVuc2hpZnQoZGF5cy5wb3AoKSEpO1xuICAgIHJldHVybiBkYXlzO1xuICB9XG5cbiAgZ2V0WWVhck5hbWUoZGF0ZTogTHV4b25EYXRlVGltZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRhdGUudG9Gb3JtYXQoJ3l5eXknLCB0aGlzLl9nZXRPcHRpb25zKCkpO1xuICB9XG5cbiAgZ2V0Rmlyc3REYXlPZldlZWsoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZmlyc3REYXlPZldlZWs7XG4gIH1cblxuICBnZXROdW1EYXlzSW5Nb250aChkYXRlOiBMdXhvbkRhdGVUaW1lKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZGF0ZS5kYXlzSW5Nb250aCE7XG4gIH1cblxuICBjbG9uZShkYXRlOiBMdXhvbkRhdGVUaW1lKTogTHV4b25EYXRlVGltZSB7XG4gICAgcmV0dXJuIEx1eG9uRGF0ZVRpbWUuZnJvbU9iamVjdChkYXRlLnRvT2JqZWN0KCksIHRoaXMuX2dldE9wdGlvbnMoKSk7XG4gIH1cblxuICBjcmVhdGVEYXRlKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF0ZTogbnVtYmVyKTogTHV4b25EYXRlVGltZSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX2dldE9wdGlvbnMoKTtcblxuICAgIGlmIChtb250aCA8IDAgfHwgbW9udGggPiAxMSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIG1vbnRoIGluZGV4IFwiJHttb250aH1cIi4gTW9udGggaW5kZXggaGFzIHRvIGJlIGJldHdlZW4gMCBhbmQgMTEuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGUgPCAxKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBkYXRlIFwiJHtkYXRlfVwiLiBEYXRlIGhhcyB0byBiZSBncmVhdGVyIHRoYW4gMC5gKTtcbiAgICB9XG5cbiAgICAvLyBMdXhvbiB1c2VzIDEtaW5kZXhlZCBtb250aHMgc28gd2UgbmVlZCB0byBhZGQgb25lIHRvIHRoZSBtb250aC5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLl91c2VVVENcbiAgICAgID8gTHV4b25EYXRlVGltZS51dGMoeWVhciwgbW9udGggKyAxLCBkYXRlLCBvcHRpb25zKVxuICAgICAgOiBMdXhvbkRhdGVUaW1lLmxvY2FsKHllYXIsIG1vbnRoICsgMSwgZGF0ZSwgb3B0aW9ucyk7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZChyZXN1bHQpKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBkYXRlIFwiJHtkYXRlfVwiLiBSZWFzb246IFwiJHtyZXN1bHQuaW52YWxpZFJlYXNvbn1cIi5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdG9kYXkoKTogTHV4b25EYXRlVGltZSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX2dldE9wdGlvbnMoKTtcblxuICAgIHJldHVybiB0aGlzLl91c2VVVENcbiAgICAgID8gTHV4b25EYXRlVGltZS51dGMob3B0aW9ucylcbiAgICAgIDogTHV4b25EYXRlVGltZS5sb2NhbChvcHRpb25zKTtcbiAgfVxuXG4gIHBhcnNlKHZhbHVlOiBhbnksIHBhcnNlRm9ybWF0OiBzdHJpbmcgfCBzdHJpbmdbXSk6IEx1eG9uRGF0ZVRpbWUgfCBudWxsIHtcbiAgICBjb25zdCBvcHRpb25zOiBMdXhvbkRhdGVUaW1lT3B0aW9ucyA9IHRoaXMuX2dldE9wdGlvbnMoKTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaXNvODYwMURhdGUgPSBMdXhvbkRhdGVUaW1lLmZyb21JU08odmFsdWUsIG9wdGlvbnMpO1xuXG4gICAgICBpZiAodGhpcy5pc1ZhbGlkKGlzbzg2MDFEYXRlKSkge1xuICAgICAgICByZXR1cm4gaXNvODYwMURhdGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdHMgPSBBcnJheS5pc0FycmF5KHBhcnNlRm9ybWF0KSA/IHBhcnNlRm9ybWF0IDogW3BhcnNlRm9ybWF0XTtcblxuICAgICAgaWYgKCFwYXJzZUZvcm1hdC5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0Zvcm1hdHMgYXJyYXkgbXVzdCBub3QgYmUgZW1wdHkuJyk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZm9ybWF0IG9mIGZvcm1hdHMpIHtcbiAgICAgICAgY29uc3QgZnJvbUZvcm1hdCA9IEx1eG9uRGF0ZVRpbWUuZnJvbUZvcm1hdCh2YWx1ZSwgZm9ybWF0LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKGZyb21Gb3JtYXQpKSB7XG4gICAgICAgICAgcmV0dXJuIGZyb21Gb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZCgpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIEx1eG9uRGF0ZVRpbWUuZnJvbU1pbGxpcyh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHJldHVybiBMdXhvbkRhdGVUaW1lLmZyb21KU0RhdGUodmFsdWUsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBMdXhvbkRhdGVUaW1lKSB7XG4gICAgICByZXR1cm4gTHV4b25EYXRlVGltZS5mcm9tTWlsbGlzKHZhbHVlLnRvTWlsbGlzKCksIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9ybWF0KGRhdGU6IEx1eG9uRGF0ZVRpbWUsIGRpc3BsYXlGb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQoZGF0ZSkpIHtcbiAgICAgIHRocm93IEVycm9yKCdMdXhvbkRhdGVBZGFwdGVyOiBDYW5ub3QgZm9ybWF0IGludmFsaWQgZGF0ZS4nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3VzZVVUQykge1xuICAgICAgcmV0dXJuIGRhdGUuc2V0TG9jYWxlKHRoaXMubG9jYWxlKS5zZXRab25lKCd1dGMnKS50b0Zvcm1hdChkaXNwbGF5Rm9ybWF0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRhdGUuc2V0TG9jYWxlKHRoaXMubG9jYWxlKS50b0Zvcm1hdChkaXNwbGF5Rm9ybWF0KTtcbiAgICB9XG4gIH1cblxuICBhZGRDYWxlbmRhclllYXJzKGRhdGU6IEx1eG9uRGF0ZVRpbWUsIHllYXJzOiBudW1iZXIpOiBMdXhvbkRhdGVUaW1lIHtcbiAgICByZXR1cm4gZGF0ZS5yZWNvbmZpZ3VyZSh0aGlzLl9nZXRPcHRpb25zKCkpLnBsdXMoeyB5ZWFycyB9KTtcbiAgfVxuXG4gIGFkZENhbGVuZGFyTW9udGhzKGRhdGU6IEx1eG9uRGF0ZVRpbWUsIG1vbnRoczogbnVtYmVyKTogTHV4b25EYXRlVGltZSB7XG4gICAgcmV0dXJuIGRhdGUucmVjb25maWd1cmUodGhpcy5fZ2V0T3B0aW9ucygpKS5wbHVzKHsgbW9udGhzIH0pO1xuICB9XG5cbiAgYWRkQ2FsZW5kYXJEYXlzKGRhdGU6IEx1eG9uRGF0ZVRpbWUsIGRheXM6IG51bWJlcik6IEx1eG9uRGF0ZVRpbWUge1xuICAgIHJldHVybiBkYXRlLnJlY29uZmlndXJlKHRoaXMuX2dldE9wdGlvbnMoKSkucGx1cyh7IGRheXMgfSk7XG4gIH1cblxuICB0b0lzbzg2MDEoZGF0ZTogTHV4b25EYXRlVGltZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRhdGUudG9JU08oKSE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdmFsdWUgaWYgZ2l2ZW4gYSB2YWxpZCBMdXhvbiBvciBudWxsLiBEZXNlcmlhbGl6ZXMgdmFsaWQgSVNPIDg2MDEgc3RyaW5nc1xuICAgKiAoaHR0cHM6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzMzMzkudHh0KSBhbmQgdmFsaWQgRGF0ZSBvYmplY3RzIGludG8gdmFsaWQgRGF0ZVRpbWUgYW5kIGVtcHR5XG4gICAqIHN0cmluZyBpbnRvIG51bGwuIFJldHVybnMgYW4gaW52YWxpZCBkYXRlIGZvciBhbGwgb3RoZXIgdmFsdWVzLlxuICAgKi9cbiAgb3ZlcnJpZGUgZGVzZXJpYWxpemUodmFsdWU6IGFueSk6IEx1eG9uRGF0ZVRpbWUgfCBudWxsIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZ2V0T3B0aW9ucygpO1xuICAgIGxldCBkYXRlOiBMdXhvbkRhdGVUaW1lIHwgdW5kZWZpbmVkO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIGRhdGUgPSBMdXhvbkRhdGVUaW1lLmZyb21KU0RhdGUodmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGRhdGUgPSBMdXhvbkRhdGVUaW1lLmZyb21JU08odmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoZGF0ZSAmJiB0aGlzLmlzVmFsaWQoZGF0ZSkpIHtcbiAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuZGVzZXJpYWxpemUodmFsdWUpO1xuICB9XG5cbiAgaXNEYXRlSW5zdGFuY2Uob2JqOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgTHV4b25EYXRlVGltZTtcbiAgfVxuXG4gIGlzVmFsaWQoZGF0ZTogTHV4b25EYXRlVGltZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkYXRlLmlzVmFsaWQ7XG4gIH1cblxuICBpbnZhbGlkKCk6IEx1eG9uRGF0ZVRpbWUge1xuICAgIHJldHVybiBMdXhvbkRhdGVUaW1lLmludmFsaWQoJ0ludmFsaWQgTHV4b24gRGF0ZVRpbWUgb2JqZWN0LicpO1xuICB9XG5cbiAgc2V0VGltZShcbiAgICB0YXJnZXQ6IEx1eG9uRGF0ZVRpbWUsXG4gICAgaG91cnM6IG51bWJlcixcbiAgICBtaW51dGVzOiBudW1iZXIsXG4gICAgc2Vjb25kczogbnVtYmVyLFxuICApOiBMdXhvbkRhdGVUaW1lIHtcbiAgICAvL2lmICh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpIHtcbiAgICBpZiAoaG91cnMgPCAwIHx8IGhvdXJzID4gMjMpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBob3VycyBcIiR7aG91cnN9XCIuIEhvdXJzIHZhbHVlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyMy5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWludXRlcyA8IDAgfHwgbWludXRlcyA+IDU5KSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgbWludXRlcyBcIiR7bWludXRlc31cIi4gTWludXRlcyB2YWx1ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNTkuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHNlY29uZHMgPCAwIHx8IHNlY29uZHMgPiA1OSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIHNlY29uZHMgXCIke3NlY29uZHN9XCIuIFNlY29uZHMgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDU5LmAsXG4gICAgICApO1xuICAgIH1cbiAgICAvL31cblxuICAgIHJldHVybiB0aGlzLmNsb25lKHRhcmdldCkuc2V0KHtcbiAgICAgIGhvdXI6IGhvdXJzLFxuICAgICAgbWludXRlOiBtaW51dGVzLFxuICAgICAgc2Vjb25kOiBzZWNvbmRzLFxuICAgICAgbWlsbGlzZWNvbmQ6IDAsXG4gICAgfSk7XG4gIH1cblxuICBnZXRIb3VycyhkYXRlOiBMdXhvbkRhdGVUaW1lKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZGF0ZS5ob3VyO1xuICB9XG5cbiAgZ2V0TWludXRlcyhkYXRlOiBMdXhvbkRhdGVUaW1lKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZGF0ZS5taW51dGU7XG4gIH1cblxuICBnZXRTZWNvbmRzKGRhdGU6IEx1eG9uRGF0ZVRpbWUpOiBudW1iZXIge1xuICAgIHJldHVybiBkYXRlLnNlY29uZDtcbiAgfVxuXG4gIHBhcnNlVGltZSh2YWx1ZTogYW55LCBwYXJzZUZvcm1hdDogc3RyaW5nIHwgc3RyaW5nW10pOiBMdXhvbkRhdGVUaW1lIHwgbnVsbCB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wYXJzZSh2YWx1ZSwgcGFyc2VGb3JtYXQpO1xuXG4gICAgaWYgKCghcmVzdWx0IHx8ICF0aGlzLmlzVmFsaWQocmVzdWx0KSkgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSXQgc2VlbXMgbGlrZSBMdXhvbiBkb2Vzbid0IHdvcmsgd2VsbCBjcm9zcy1icm93c2VyIGZvciBzdHJpbmdzIHRoYXQgaGF2ZVxuICAgICAgLy8gYWRkaXRpb25hbCBjaGFyYWN0ZXJzIGFyb3VuZCB0aGUgdGltZS4gVHJ5IHBhcnNpbmcgd2l0aG91dCB0aG9zZSBjaGFyYWN0ZXJzLlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5wYXJzZSh2YWx1ZS5yZXBsYWNlKC9bXjAtOTooQU18UE0pXS9naSwgJycpLCBwYXJzZUZvcm1hdCkgfHwgcmVzdWx0XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhZGRTZWNvbmRzKGRhdGU6IEx1eG9uRGF0ZVRpbWUsIGFtb3VudDogbnVtYmVyKTogTHV4b25EYXRlVGltZSB7XG4gICAgcmV0dXJuIGRhdGUucmVjb25maWd1cmUodGhpcy5fZ2V0T3B0aW9ucygpKS5wbHVzKHsgc2Vjb25kczogYW1vdW50IH0pO1xuICB9XG5cbiAgLyoqIEdldHMgdGhlIG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIGNvbnN0cnVjdGluZyBhIG5ldyBgRGF0ZVRpbWVgIG9iamVjdC4gKi9cbiAgcHJpdmF0ZSBfZ2V0T3B0aW9ucygpOiBMdXhvbkRhdGVUaW1lT3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHpvbmU6IHRoaXMuX3VzZVVUQyA/ICd1dGMnIDogdW5kZWZpbmVkLFxuICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgIG91dHB1dENhbGVuZGFyOiB0aGlzLl9kZWZhdWx0T3V0cHV0Q2FsZW5kYXIsXG4gICAgfTtcbiAgfVxufVxuIl19
|