@esfaenza/material-dayjs-adapter 16.2.29 → 17.3.0
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/esfaenza-material-dayjs-adapter.mjs +4 -4
- package/esm2022/lib/adapter/DayjsDateAdapter.mjs +395 -395
- package/esm2022/lib/adapter/MatDayjsDateModule.mjs +34 -34
- package/esm2022/public-api.mjs +5 -5
- package/fesm2022/esfaenza-material-dayjs-adapter.mjs +425 -425
- package/fesm2022/esfaenza-material-dayjs-adapter.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/adapter/DayjsDateAdapter.d.ts +270 -270
- package/lib/adapter/MatDayjsDateModule.d.ts +12 -12
- package/package.json +4 -4
- package/public-api.d.ts +2 -2
|
@@ -1,395 +1,395 @@
|
|
|
1
|
-
// Angular
|
|
2
|
-
import { Inject, Injectable } from "@angular/core";
|
|
3
|
-
import { DateAdapter, MAT_DATE_LOCALE } from "@angular/material/core";
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
/**
|
|
6
|
-
* Adapter per permettere a Material di funzionare senza problemi con DayJs. Per altri provider di date (es. moment) l'adapter viene fornito
|
|
7
|
-
* nativamente da Angular. Per DayJs invece bisogna reimplementarselo
|
|
8
|
-
*/
|
|
9
|
-
export class DayJsDateAdapter extends DateAdapter {
|
|
10
|
-
/**
|
|
11
|
-
* Costruttore
|
|
12
|
-
*
|
|
13
|
-
* @ignore
|
|
14
|
-
*/
|
|
15
|
-
constructor(dateLocale) {
|
|
16
|
-
super();
|
|
17
|
-
this.setLocale(dateLocale);
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Imposta il locale utilizzato per tutte le date
|
|
21
|
-
*
|
|
22
|
-
* @param {string} locale Locale da impostare
|
|
23
|
-
*/
|
|
24
|
-
setLocale(locale) {
|
|
25
|
-
super.setLocale(locale);
|
|
26
|
-
// il localeData si potrebbe prendere da this.dayJs().localeData(); ma io voglio usare le date solo nel formato italiano quindi cablo quello
|
|
27
|
-
switch (locale.toLowerCase()) {
|
|
28
|
-
case 'it-it':
|
|
29
|
-
case 'it':
|
|
30
|
-
import("dayjs/locale/it").then(mod => { this.loadLoacleDataModule(mod.default); });
|
|
31
|
-
break;
|
|
32
|
-
// In dayjs, nel locale "en" e basta non esistono i 3/4 delle info perché sono le cose generiche ereditate dai locali en-gb, en-au ecc...
|
|
33
|
-
// quindi mi baso sul locale inglese Britannico, ma comunque I'ts Coming Rome
|
|
34
|
-
case 'en-us':
|
|
35
|
-
case 'en-gb':
|
|
36
|
-
case 'en':
|
|
37
|
-
import("dayjs/locale/en-gb").then(mod => { this.loadLoacleDataModule(mod.default); });
|
|
38
|
-
break;
|
|
39
|
-
default: throw `Locale non riconosicuto '${locale}'. Locali consentiti: 'it', 'en'`;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Effettua il caricamento del localeData coi nomi dei mesi, giorni ecc partendo dal modulo importato
|
|
44
|
-
*
|
|
45
|
-
* @param {any} mod Modulo caricato contenente il locale desiderato
|
|
46
|
-
*/
|
|
47
|
-
loadLoacleDataModule(mod) {
|
|
48
|
-
this._localeData = {
|
|
49
|
-
firstDayOfWeek: mod.weekStart,
|
|
50
|
-
longMonths: mod.months,
|
|
51
|
-
shortMonths: mod.monthsShort,
|
|
52
|
-
dates: this.range(31, (i) => this.createDate(2017, 0, i + 1).format('D')),
|
|
53
|
-
longDaysOfWeek: mod.weekdays,
|
|
54
|
-
shortDaysOfWeek: mod.weekdaysShort,
|
|
55
|
-
narrowDaysOfWeek: mod.weekdaysMin,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Ottiene le ore da un DayJs
|
|
60
|
-
*
|
|
61
|
-
* @param {Dayjs} date Data Dayjs
|
|
62
|
-
*
|
|
63
|
-
* @returns {number} Ore
|
|
64
|
-
*/
|
|
65
|
-
getHour(date) {
|
|
66
|
-
return date.get("hour");
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Deserializza una data in DayJs
|
|
70
|
-
*
|
|
71
|
-
* @param {any} value Valore di data a caso
|
|
72
|
-
*
|
|
73
|
-
* @returns {Dayjs} data in dayjs
|
|
74
|
-
*/
|
|
75
|
-
deserialize(value) {
|
|
76
|
-
if (!value)
|
|
77
|
-
return null;
|
|
78
|
-
var valueConverted = dayjs(value);
|
|
79
|
-
if (valueConverted == null || this.isDateInstance(valueConverted) && this.isValid(valueConverted))
|
|
80
|
-
return valueConverted;
|
|
81
|
-
return this.invalid();
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Ottiene i minuti da un DayJs
|
|
85
|
-
*
|
|
86
|
-
* @param {Dayjs} date Data Dayjs
|
|
87
|
-
*
|
|
88
|
-
* @returns {number} Minuti
|
|
89
|
-
*/
|
|
90
|
-
getMinute(date) {
|
|
91
|
-
return date.get("minute");
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Ottiene i secondi da un DayJs
|
|
95
|
-
*
|
|
96
|
-
* @param {Dayjs} date Data Dayjs
|
|
97
|
-
*
|
|
98
|
-
* @returns {number} Secondi
|
|
99
|
-
*/
|
|
100
|
-
getSecond(date) {
|
|
101
|
-
return date.get("second");
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Imposta le ore di una data Dayjs
|
|
105
|
-
*
|
|
106
|
-
* @param {Dayjs} date Data da modificare
|
|
107
|
-
* @param {number} value Valore da impostare per le ore
|
|
108
|
-
*/
|
|
109
|
-
setHour(date, value) {
|
|
110
|
-
date.$H = value;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Imposta i minuti di una data Dayjs
|
|
114
|
-
*
|
|
115
|
-
* @param {Dayjs} date Data da modificare
|
|
116
|
-
* @param {number} value Valore da impostare per i minuti
|
|
117
|
-
*/
|
|
118
|
-
setMinute(date, value) {
|
|
119
|
-
date.$m = value;
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Imposta i secondi di una data Dayjs
|
|
123
|
-
*
|
|
124
|
-
* @param {Dayjs} date Data da modificare
|
|
125
|
-
* @param {number} value Valore da impostare per i secondi
|
|
126
|
-
*/
|
|
127
|
-
setSecond(date, value) {
|
|
128
|
-
date.$s = value;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Ottiene l'anno da un DayJs
|
|
132
|
-
*
|
|
133
|
-
* @param {Dayjs} date Data Dayjs
|
|
134
|
-
*
|
|
135
|
-
* @returns {number} Anno
|
|
136
|
-
*/
|
|
137
|
-
getYear(date) {
|
|
138
|
-
return date.get("year");
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Ottiene il mese da un DayJs
|
|
142
|
-
*
|
|
143
|
-
* @param {Dayjs} date Data Dayjs
|
|
144
|
-
*
|
|
145
|
-
* @returns {number} Mese
|
|
146
|
-
*/
|
|
147
|
-
getMonth(date) {
|
|
148
|
-
return date.get("month");
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Ottiene il giorno da un DayJs
|
|
152
|
-
*
|
|
153
|
-
* @param {Dayjs} date Data Dayjs
|
|
154
|
-
*
|
|
155
|
-
* @returns {number} Giorno
|
|
156
|
-
*/
|
|
157
|
-
getDate(date) {
|
|
158
|
-
return date.get("date");
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Ottiene il giorno della settimana da un DayJs
|
|
162
|
-
*
|
|
163
|
-
* @param {Dayjs} date Data Dayjs
|
|
164
|
-
*
|
|
165
|
-
* @returns {number} Giorno della settimana da 1 a 7
|
|
166
|
-
*/
|
|
167
|
-
getDayOfWeek(date) {
|
|
168
|
-
return date.get("day");
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Ottiene i nomi dei mesi
|
|
172
|
-
*
|
|
173
|
-
* @param {"long" | "short" | "narrow"} style Stile dei nomi richiesto
|
|
174
|
-
*
|
|
175
|
-
* @returns {string[]} Lista dei mesi espressi in base al parametro **style**
|
|
176
|
-
*/
|
|
177
|
-
getMonthNames(style) {
|
|
178
|
-
return style == 'long' ? this._localeData.longMonths : this._localeData.shortMonths;
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Ottiene i nomi dei giorni del mese
|
|
182
|
-
*
|
|
183
|
-
* @returns {string[]} Lista dei giorni del mese (da '1' a '31')
|
|
184
|
-
*/
|
|
185
|
-
getDateNames() {
|
|
186
|
-
return this._localeData.dates;
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Ottiene i nomi dei giorni della settimana
|
|
190
|
-
*
|
|
191
|
-
* @param {"long" | "short" | "narrow"} style Stile dei nomi richiesto
|
|
192
|
-
*
|
|
193
|
-
* @returns {string[]} Lista dei giorni della settimana espressi in base al parametro **style**
|
|
194
|
-
*/
|
|
195
|
-
getDayOfWeekNames(style) {
|
|
196
|
-
if (style == 'long')
|
|
197
|
-
return this._localeData.longDaysOfWeek;
|
|
198
|
-
else if (style == 'short')
|
|
199
|
-
return this._localeData.shortDaysOfWeek;
|
|
200
|
-
return this._localeData.narrowDaysOfWeek;
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Ottiene il nome dell'anno
|
|
204
|
-
*
|
|
205
|
-
* @param {Dayjs} date Data Dayjs
|
|
206
|
-
*
|
|
207
|
-
* @returns {string} Anno
|
|
208
|
-
*/
|
|
209
|
-
getYearName(date) {
|
|
210
|
-
return this.getYear(date).toString();
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Ottiene il primo giorno della settimana
|
|
214
|
-
*
|
|
215
|
-
* @returns {number} Indice del primo giorno della settimana
|
|
216
|
-
*/
|
|
217
|
-
getFirstDayOfWeek() {
|
|
218
|
-
return this._localeData.firstDayOfWeek;
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Ottiene il numero di giorni nel mese corrente
|
|
222
|
-
*
|
|
223
|
-
* @param {Dayjs} date Data Dayjs
|
|
224
|
-
*
|
|
225
|
-
* @returns {number} Numero di giorni
|
|
226
|
-
*/
|
|
227
|
-
getNumDaysInMonth(date) {
|
|
228
|
-
return date.daysInMonth();
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* Ottiene il clone di una data Dayjs
|
|
232
|
-
*
|
|
233
|
-
* @param {Dayjs} Data da clonare
|
|
234
|
-
*
|
|
235
|
-
* @returns {Dayjs} Clone
|
|
236
|
-
*/
|
|
237
|
-
clone(date) {
|
|
238
|
-
// Visto che ho modificato l'istanza originale a manazza (vedi setHour, setMinute, setSecond) l'oggetto è danneggiato e per restituire un clone buono
|
|
239
|
-
// devo ricrearlo prendendo pezzo per pezzo
|
|
240
|
-
// Il mese è un indice 0-11 quindi devo dargli un +1 qua
|
|
241
|
-
return dayjs(`${this.getYear(date)}-${this.getMonth(date) + 1}-${this.getDate(date)} ${this.getHour(date)}:${this.getMinute(date)}:${this.getSecond(date)}`);
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* Crea una data partendo da anno, mese e giorno
|
|
245
|
-
*
|
|
246
|
-
* @param {number} year Anno
|
|
247
|
-
* @param {number} month Mese
|
|
248
|
-
* @param {number} date Giorno
|
|
249
|
-
*
|
|
250
|
-
* @returns {Dayjs} Oggetto generato in base ai parametri **year**, **month**, e **date**
|
|
251
|
-
*/
|
|
252
|
-
createDate(year, month, date) {
|
|
253
|
-
if (month < 0 || month > 11)
|
|
254
|
-
throw Error(`Invalid month index "${month}". Month index has to be between 0 and 11.`);
|
|
255
|
-
if (date < 1)
|
|
256
|
-
throw Error(`Invalid date "${date}". Date has to be greater than 0.`);
|
|
257
|
-
//Il mese è un indice 0-11 quindi devo dargli un +1 qua
|
|
258
|
-
const result = dayjs(`${year}-${month + 1}-${date}`);
|
|
259
|
-
if (!result.isValid())
|
|
260
|
-
throw Error(`Invalid date "${date}" for month with index "${month}".`);
|
|
261
|
-
return result;
|
|
262
|
-
}
|
|
263
|
-
/**
|
|
264
|
-
* Restituisce la data che rappresenta la giornata di oggi
|
|
265
|
-
*
|
|
266
|
-
* @returns {Dayjs} Oggi
|
|
267
|
-
*/
|
|
268
|
-
today() {
|
|
269
|
-
return dayjs();
|
|
270
|
-
}
|
|
271
|
-
/**
|
|
272
|
-
* Effettua il parse di una data, eventualmente in base al formato specificato
|
|
273
|
-
*
|
|
274
|
-
* @param {any} value Valore da parsare
|
|
275
|
-
* @param {string} parseFormat Formato in cui leggere il valore
|
|
276
|
-
*
|
|
277
|
-
* @returns {Dayjs} Data generata
|
|
278
|
-
*/
|
|
279
|
-
parse(value, parseFormat) {
|
|
280
|
-
if (value && typeof value == 'string') {
|
|
281
|
-
if (value.length == parseFormat.length)
|
|
282
|
-
return dayjs(value, parseFormat);
|
|
283
|
-
else
|
|
284
|
-
return null;
|
|
285
|
-
}
|
|
286
|
-
return value ? dayjs(value) : null;
|
|
287
|
-
}
|
|
288
|
-
/**
|
|
289
|
-
* Formatta una data in base al formato specificato
|
|
290
|
-
*
|
|
291
|
-
* @param {Dayjs} date Data da formattare
|
|
292
|
-
* @param {string} displayFormat Formato in cui mostrare la data
|
|
293
|
-
*
|
|
294
|
-
* @returns {string} Data formattata
|
|
295
|
-
*/
|
|
296
|
-
format(date, displayFormat) {
|
|
297
|
-
if (!this.isValid(date))
|
|
298
|
-
throw Error('DateAdapter: Cannot format invalid date.');
|
|
299
|
-
return date.format(displayFormat);
|
|
300
|
-
}
|
|
301
|
-
/**
|
|
302
|
-
* Aggiunge ad una data il numero specificato di anni
|
|
303
|
-
*
|
|
304
|
-
* @param {Dayjs} date Data a cui aggiungere gli anni
|
|
305
|
-
* @param {number} years Anni da aggiungere
|
|
306
|
-
*
|
|
307
|
-
* @returns {Dayjs} Data con l'aggiunta degli anni specificati
|
|
308
|
-
*/
|
|
309
|
-
addCalendarYears(date, years) {
|
|
310
|
-
return date.add(years, "year");
|
|
311
|
-
}
|
|
312
|
-
/**
|
|
313
|
-
* Aggiunge ad una data il numero specificato di mesi
|
|
314
|
-
*
|
|
315
|
-
* @param {Dayjs} date Data a cui aggiungere i mesi
|
|
316
|
-
* @param {months} months Mesi da aggiungere
|
|
317
|
-
*
|
|
318
|
-
* @returns {Dayjs} Data con l'aggiunta dei mesi specificati
|
|
319
|
-
*/
|
|
320
|
-
addCalendarMonths(date, months) {
|
|
321
|
-
return date.add(months, "month");
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* Aggiunge ad una data il numero specificato di giorni
|
|
325
|
-
*
|
|
326
|
-
* @param {Dayjs} date Data a cui aggiungere i giorni
|
|
327
|
-
* @param {months} days Giorni da aggiungere
|
|
328
|
-
*
|
|
329
|
-
* @returns {Dayjs} Data con l'aggiunta dei giorni specificati
|
|
330
|
-
*/
|
|
331
|
-
addCalendarDays(date, days) {
|
|
332
|
-
return date.add(days, "day");
|
|
333
|
-
}
|
|
334
|
-
/**
|
|
335
|
-
* Trasforma la data specificata in una stringa ISO8601
|
|
336
|
-
*
|
|
337
|
-
* @param {Dayjs} date Data
|
|
338
|
-
*
|
|
339
|
-
* @returns {string} Rappresentazione in ISO8601
|
|
340
|
-
*/
|
|
341
|
-
toIso8601(date) {
|
|
342
|
-
return date.toISOString();
|
|
343
|
-
}
|
|
344
|
-
/**
|
|
345
|
-
* Controlla se l'oggetto passato è effettivamente un DayJs
|
|
346
|
-
*
|
|
347
|
-
* @param {any} obj Oggetto da verificare se è una data o meno
|
|
348
|
-
*
|
|
349
|
-
* @returns {boolean} **true** se l'oggetto è un DayJs, **false** altrimenti
|
|
350
|
-
*/
|
|
351
|
-
isDateInstance(obj) {
|
|
352
|
-
return dayjs.isDayjs(obj);
|
|
353
|
-
}
|
|
354
|
-
/**
|
|
355
|
-
* Controlla il DayJs passato e verifica se è valido
|
|
356
|
-
*
|
|
357
|
-
* @param {Dayjs} date Data da verificare
|
|
358
|
-
*
|
|
359
|
-
* @returns {boolean} **true** se il DayJs è valido, **false** altrimenti
|
|
360
|
-
*/
|
|
361
|
-
isValid(date) {
|
|
362
|
-
return date.isValid();
|
|
363
|
-
}
|
|
364
|
-
/**
|
|
365
|
-
* Restituisce un DayJs invalido
|
|
366
|
-
*
|
|
367
|
-
* @returns {DayJs} Data Invalida
|
|
368
|
-
*/
|
|
369
|
-
invalid() {
|
|
370
|
-
return dayjs("Invalid Date");
|
|
371
|
-
}
|
|
372
|
-
/**
|
|
373
|
-
* Crea un range di una lunghezza specifica e per ogni indice del range richiama un callback che valorizza l'elemento di quell'indice
|
|
374
|
-
*
|
|
375
|
-
* @param {number} length Lunghezza del range
|
|
376
|
-
* @param {Function} valueFunction Callback che deve generare il valore desiderato per ogni indice
|
|
377
|
-
*
|
|
378
|
-
* @returns {T[]} Array dei valori generati
|
|
379
|
-
*/
|
|
380
|
-
range(length, valueFunction) {
|
|
381
|
-
const valuesArray = Array(length);
|
|
382
|
-
for (let i = 0; i < length; i++)
|
|
383
|
-
valuesArray[i] = valueFunction(i);
|
|
384
|
-
return valuesArray;
|
|
385
|
-
}
|
|
386
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
387
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
388
|
-
}
|
|
389
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
390
|
-
type: Injectable
|
|
391
|
-
}], ctorParameters:
|
|
392
|
-
type: Inject,
|
|
393
|
-
args: [MAT_DATE_LOCALE]
|
|
394
|
-
}] }]
|
|
395
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF5anNEYXRlQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsLWRheWpzLWFkYXB0ZXIvc3JjL2xpYi9hZGFwdGVyL0RheWpzRGF0ZUFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBV3RFOzs7R0FHRztBQUVILE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxXQUFrQjtJQWVwRDs7OztPQUlHO0lBQ0gsWUFBcUMsVUFBa0I7UUFDbkQsS0FBSyxFQUFFLENBQUM7UUFFUixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksU0FBUyxDQUFDLE1BQWM7UUFDM0IsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV4Qiw0SUFBNEk7UUFDNUksUUFBUSxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDMUIsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLElBQUk7Z0JBQUUsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUFDLE1BQU07WUFDcEcseUlBQXlJO1lBQ3pJLDZFQUE2RTtZQUM3RSxLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssT0FBTyxDQUFDO1lBQ2IsS0FBSyxJQUFJO2dCQUFFLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxvQkFB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O0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLEtBQUssQ0FBSSxNQUFjLEVBQUUsYUFBbUM7UUFDaEUsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1lBQzNCLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQzsrR0E5YVEsZ0JBQWdCLGtCQW9CTCxlQUFlO21IQXBCMUIsZ0JBQWdCOzs0RkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVOzswQkFxQk0sTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBEYXRlQWRhcHRlciwgTUFUX0RBVEVfTE9DQUxFIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2NvcmVcIjtcclxuXHJcbi8vIERheWpzXHJcbmltcG9ydCB7IERheWpzIH0gZnJvbSBcImRheWpzXCI7XHJcblxyXG4vKipcclxuICogRGljaGlhcmF6aW9uZSBkZWxsYSB2YXJpYWJpbGUgZ2xvYmFsZSBkYXlqcy4gTCdvbmVyZSBkaSBcImNyZWFybGFcIiDDqCBhZmZpZGF0byBhbGwnYXBwbGljYXppb25lIGNoZSB1dGlsaXp6YSBxdWVzdGEgbGlicmVyaWEsIFxyXG4gKiBjaGUgZG92csOgIGltcG9ydGFyZSBsbyBzY3JpcHQgZ2xvYmFsZSBkaSBkYXlqcyBuZWxsYSBDTElcclxuICovXHJcbmRlY2xhcmUgdmFyIGRheWpzOiBhbnk7XHJcblxyXG4vKipcclxuICogQWRhcHRlciBwZXIgcGVybWV0dGVyZSBhIE1hdGVyaWFsIGRpIGZ1bnppb25hcmUgc2VuemEgcHJvYmxlbWkgY29uIERheUpzLiBQZXIgYWx0cmkgcHJvdmlkZXIgZGkgZGF0ZSAoZXMuIG1vbWVudCkgbCdhZGFwdGVyIHZpZW5lIGZvcm5pdG8gXHJcbiAqIG5hdGl2YW1lbnRlIGRhIEFuZ3VsYXIuIFBlciBEYXlKcyBpbnZlY2UgYmlzb2duYSByZWltcGxlbWVudGFyc2Vsb1xyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgRGF5SnNEYXRlQWRhcHRlciBleHRlbmRzIERhdGVBZGFwdGVyPERheWpzPntcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhY2hlIGRlaSBkYXRpIGRlbCBsb2NhbGUgSXRhbGlhbm9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbG9jYWxlRGF0YToge1xyXG4gICAgICAgIGZpcnN0RGF5T2ZXZWVrOiBudW1iZXIsXHJcbiAgICAgICAgbG9uZ01vbnRoczogc3RyaW5nW10sXHJcbiAgICAgICAgc2hvcnRNb250aHM6IHN0cmluZ1tdLFxyXG4gICAgICAgIGRhdGVzOiBzdHJpbmdbXSxcclxuICAgICAgICBsb25nRGF5c09mV2Vlazogc3RyaW5nW10sXHJcbiAgICAgICAgc2hvcnREYXlzT2ZXZWVrOiBzdHJpbmdbXSxcclxuICAgICAgICBuYXJyb3dEYXlzT2ZXZWVrOiBzdHJpbmdbXVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvc3RydXR0b3JlXHJcbiAgICAgKiBcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoQEluamVjdChNQVRfREFURV9MT0NBTEUpIGRhdGVMb2NhbGU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0TG9jYWxlKGRhdGVMb2NhbGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW1wb3N0YSBpbCBsb2NhbGUgdXRpbGl6emF0byBwZXIgdHV0dGUgbGUgZGF0ZVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxlIExvY2FsZSBkYSBpbXBvc3RhcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldExvY2FsZShsb2NhbGU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyLnNldExvY2FsZShsb2NhbGUpO1xyXG5cclxuICAgICAgICAvLyBpbCBsb2NhbGVEYXRhIHNpIHBvdHJlYmJlIHByZW5kZXJlIGRhIHRoaXMuZGF5SnMoKS5sb2NhbGVEYXRhKCk7IG1hIGlvIHZvZ2xpbyB1c2FyZSBsZSBkYXRlIHNvbG8gbmVsIGZvcm1hdG8gaXRhbGlhbm8gcXVpbmRpIGNhYmxvIHF1ZWxsb1xyXG4gICAgICAgIHN3aXRjaCAobG9jYWxlLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSAnaXQtaXQnOlxyXG4gICAgICAgICAgICBjYXNlICdpdCc6IGltcG9ydChcImRheWpzL2xvY2FsZS9pdFwiKS50aGVuKG1vZCA9PiB7IHRoaXMubG9hZExvYWNsZURhdGFNb2R1bGUobW9kLmRlZmF1bHQpIH0pOyBicmVhaztcclxuICAgICAgICAgICAgLy8gSW4gZGF5anMsIG5lbCBsb2NhbGUgXCJlblwiIGUgYmFzdGEgbm9uIGVzaXN0b25vIGkgMy80IGRlbGxlIGluZm8gcGVyY2jDqSBzb25vIGxlIGNvc2UgZ2VuZXJpY2hlIGVyZWRpdGF0ZSBkYWkgbG9jYWxpIGVuLWdiLCBlbi1hdSBlY2MuLi5cclxuICAgICAgICAgICAgLy8gcXVpbmRpIG1pIGJhc28gc3VsIGxvY2FsZSBpbmdsZXNlIEJyaXRhbm5pY28sIG1hIGNvbXVucXVlIEkndHMgQ29taW5nIFJvbWVcclxuICAgICAgICAgICAgY2FzZSAnZW4tdXMnOlxyXG4gICAgICAgICAgICBjYXNlICdlbi1nYic6XHJcbiAgICAgICAgICAgIGNhc2UgJ2VuJzogaW1wb3J0KFwiZGF5anMvbG9jYWxlL2VuLWdiXCIpLnRoZW4obW9kID0+IHsgdGhpcy5sb2FkTG9hY2xlRGF0YU1vZHVsZShtb2QuZGVmYXVsdCkgfSk7IGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OiB0aHJvdyBgTG9jYWxlIG5vbiByaWNvbm9zaWN1dG8gJyR7bG9jYWxlfScuIExvY2FsaSBjb25zZW50aXRpOiAnaXQnLCAnZW4nYDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFZmZldHR1YSBpbCBjYXJpY2FtZW50byBkZWwgbG9jYWxlRGF0YSBjb2kgbm9taSBkZWkgbWVzaSwgZ2lvcm5pIGVjYyBwYXJ0ZW5kbyBkYWwgbW9kdWxvIGltcG9ydGF0b1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gbW9kIE1vZHVsbyBjYXJpY2F0byBjb250ZW5lbnRlIGlsIGxvY2FsZSBkZXNpZGVyYXRvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgbG9hZExvYWNsZURhdGFNb2R1bGUobW9kOiBhbnkpIHtcclxuICAgICAgICB0aGlzLl9sb2NhbGVEYXRhID0ge1xyXG4gICAgICAgICAgICBmaXJzdERheU9mV2VlazogbW9kLndlZWtTdGFydCxcclxuICAgICAgICAgICAgbG9uZ01vbnRoczogbW9kLm1vbnRocyxcclxuICAgICAgICAgICAgc2hvcnRNb250aHM6IG1vZC5tb250aHNTaG9ydCxcclxuICAgICAgICAgICAgZGF0ZXM6IHRoaXMucmFuZ2UoMzEsIChpKSA9PiB0aGlzLmNyZWF0ZURhdGUoMjAxNywgMCwgaSArIDEpLmZvcm1hdCgnRCcpKSxcclxuICAgICAgICAgICAgbG9uZ0RheXNPZldlZWs6IG1vZC53ZWVrZGF5cyxcclxuICAgICAgICAgICAgc2hvcnREYXlzT2ZXZWVrOiBtb2Qud2Vla2RheXNTaG9ydCxcclxuICAgICAgICAgICAgbmFycm93RGF5c09mV2VlazogbW9kLndlZWtkYXlzTWluLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGxlIG9yZSBkYSB1biBEYXlKc1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0RheWpzfSBkYXRlIERhdGEgRGF5anNcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gT3JlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRIb3VyKGRhdGU6IERheWpzKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gZGF0ZS5nZXQoXCJob3VyXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzZXJpYWxpenphIHVuYSBkYXRhIGluIERheUpzXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBWYWxvcmUgZGkgZGF0YSBhIGNhc29cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge0RheWpzfSBkYXRhIGluIGRheWpzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZXNlcmlhbGl6ZSh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghdmFsdWUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgICB2YXIgdmFsdWVDb252ZXJ0ZWQgPSBkYXlqcyh2YWx1ZSk7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZUNvbnZlcnRlZCA9PSBudWxsIHx8IHRoaXMuaXNEYXRlSW5zdGFuY2UodmFsdWVDb252ZXJ0ZWQpICYmIHRoaXMuaXNWYWxpZCh2YWx1ZUNvbnZlcnRlZCkpXHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZUNvbnZlcnRlZDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBpIG1pbnV0aSBkYSB1biBEYXlKc1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0RheWpzfSBkYXRlIERhdGEgRGF5anNcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gTWludXRpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRNaW51dGUoZGF0ZTogRGF5anMpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBkYXRlLmdldChcIm1pbnV0ZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgaSBzZWNvbmRpIGRhIHVuIERheUpzXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RGF5anN9IGRhdGUgRGF0YSBEYXlqc1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBTZWNvbmRpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTZWNvbmQoZGF0ZTogRGF5anMpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBkYXRlLmdldChcInNlY29uZFwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEltcG9zdGEgbGUgb3JlIGRpIHVuYSBkYXRhIERheWpzXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RGF5anN9IGRhdGUgRGF0YSBkYSBtb2RpZmljYXJlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVmFsb3JlIGRhIGltcG9zdGFyZSBwZXIgbGUgb3JlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRIb3VyKGRhdGU6IERheWpzLCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgKDxhbnk+ZGF0ZSkuJEggPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEltcG9zdGEgaSBtaW51dGkgZGkgdW5hIGRhdGEgRGF5anNcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtEYXlqc30gZGF0ZSBEYXRhIGRhIG1vZGlmaWNhcmVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBWYWxvcmUgZGEgaW1wb3N0YXJlIHBlciBpIG1pbnV0aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0TWludXRlKGRhdGU6IERheWpzLCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgKDxhbnk+ZGF0ZSkuJG0gPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEltcG9zdGEgaSBzZWNvbmRpIGRpIHVuYSBkYXRhIERheWpzXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RGF5anN9IGRhdGUgRGF0YSBkYSBtb2RpZmljYXJlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVmFsb3JlIGRhIGltcG9zdGFyZSBwZXIgaSBzZWNvbmRpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRTZWNvbmQoZGF0ZTogRGF5anMsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICAoPGFueT5kYXRlKS4kcyA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBsJ2Fubm8gZGEgdW4gRGF5SnNcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtEYXlqc30gZGF0ZSBEYXRhIERheWpzXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEFubm9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFllYXIoZGF0ZTogRGF5anMpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBkYXRlLmdldChcInllYXJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGlsIG1lc2UgZGEgdW4gRGF5SnNcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtEYXlqc30gZGF0ZSBEYXRhIERheWpzXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IE1lc2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE1vbnRoKGRhdGU6IERheWpzKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gZGF0ZS5nZXQoXCJtb250aFwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgaWwgZ2lvcm5vIGRhIHVuIERheUpzXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RGF5anN9IGRhdGUgRGF0YSBEYXlqc1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBHaW9ybm9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldERhdGUoZGF0ZTogRGF5anMpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBkYXRlLmdldChcImRhdGVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGlsIGdpb3JubyBkZWxsYSBzZXR0aW1hbmEgZGEgdW4gRGF5SnNcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtEYXlqc30gZGF0ZSBEYXRhIERheWpzXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEdpb3JubyBkZWxsYSBzZXR0aW1hbmEgZGEgMSBhIDdcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldERheU9mV2VlayhkYXRlOiBEYXlqcyk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGUuZ2V0KFwiZGF5XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBpIG5vbWkgZGVpIG1lc2lcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtcImxvbmdcIiB8IFwic2hvcnRcIiB8IFwibmFycm93XCJ9IHN0eWxlIFN0aWxlIGRlaSBub21pIHJpY2hpZXN0b1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119IExpc3RhIGRlaSBtZXNpIGVzcHJlc3NpIGluIGJhc2UgYWwgcGFyYW1ldHJvICoqc3R5bGUqKlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TW9udGhOYW1lcyhzdHlsZTogXCJsb25nXCIgfCBcInNob3J0XCIgfCBcIm5hcnJvd1wiKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiBzdHlsZSA9PSAnbG9uZycgPyB0aGlzLl9sb2NhbGVEYXRhLmxvbmdNb250aHMgOiB0aGlzLl9sb2NhbGVEYXRhLnNob3J0TW9udGhzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBpIG5vbWkgZGVpIGdpb3JuaSBkZWwgbWVzZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119IExpc3RhIGRlaSBnaW9ybmkgZGVsIG1lc2UgKGRhICcxJyBhICczMScpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXREYXRlTmFtZXMoKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGVEYXRhLmRhdGVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBpIG5vbWkgZGVpIGdpb3JuaSBkZWxsYSBzZXR0aW1hbmFcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtcImxvbmdcIiB8IFwic2hvcnRcIiB8IFwibmFycm93XCJ9IHN0eWxlIFN0aWxlIGRlaSBub21pIHJpY2hpZXN0b1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119IExpc3RhIGRlaSBnaW9ybmkgZGVsbGEgc2V0dGltYW5hIGVzcHJlc3NpIGluIGJhc2UgYWwgcGFyYW1ldHJvICoqc3R5bGUqKlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RGF5T2ZXZWVrTmFtZXMoc3R5bGU6ICdsb25nJyB8ICdzaG9ydCcgfCAnbmFycm93Jyk6IHN0cmluZ1tdIHtcclxuICAgICAgICBpZiAoc3R5bGUgPT0gJ2xvbmcnKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlRGF0YS5sb25nRGF5c09mV2VlaztcclxuICAgICAgICBlbHNlIGlmIChzdHlsZSA9PSAnc2hvcnQnKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlRGF0YS5zaG9ydERheXNPZldlZWs7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGVEYXRhLm5hcnJvd0RheXNPZldlZWs7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGlsIG5vbWUgZGVsbCdhbm5vXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RGF5anN9IGRhdGUgRGF0YSBEYXlqc1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBBbm5vXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRZZWFyTmFtZShkYXRlOiBEYXlqcyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0WWVhcihkYXRlKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBpbCBwcmltbyBnaW9ybm8gZGVsbGEgc2V0dGltYW5hXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEluZGljZSBkZWwgcHJpbW8gZ2lvcm5vIGRlbGxhIHNldHRpbWFuYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Rmlyc3REYXlPZldlZWsoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlRGF0YS5maXJzdERheU9mV2VlaztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgaWwgbnVtZXJvIGRpIGdpb3JuaSBuZWwgbWVzZSBjb3JyZW50ZVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0RheWpzfSBkYXRlIERhdGEgRGF5anNcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gTnVtZXJvIGRpIGdpb3JuaVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TnVtRGF5c0luTW9udGgoZGF0ZTogRGF5anMpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBkYXRlLmRheXNJbk1vbnRoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGlsIGNsb25lIGRpIHVuYSBkYXRhIERheWpzXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RGF5anN9IERhdGEgZGEgY2xvbmFyZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7RGF5anN9IENsb25lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbG9uZShkYXRlOiBEYXlqcyk6IERheWpzIHtcclxuICAgICAgICAvLyBWaXN0byBjaGUgaG8gbW9kaWZpY2F0byBsJ2lzdGFuemEgb3JpZ2luYWxlIGEgbWFuYXp6YSAodmVkaSBzZXRIb3VyLCBzZXRNaW51dGUsIHNldFNlY29uZCkgbCdvZ2dldHRvIMOoIGRhbm5lZ2dpYXRvIGUgcGVyIHJlc3RpdHVpcmUgdW4gY2xvbmUgYnVvbm9cclxuICAgICAgICAvLyBkZXZvIHJpY3JlYXJsbyBwcmVuZGVuZG8gcGV6em8gcGVyIHBlenpvXHJcbiAgICAgICAgLy8gSWwgbWVzZSDDqCB1biBpbmRpY2UgMC0xMSBxdWluZGkgZGV2byBkYXJnbGkgdW4gKzEgcXVhXHJcbiAgICAgICAgcmV0dXJuIGRheWpzKGAke3RoaXMuZ2V0WWVhcihkYXRlKX0tJHt0aGlzLmdldE1vbnRoKGRhdGUpICsgMX0tJHt0aGlzLmdldERhdGUoZGF0ZSl9ICR7dGhpcy5nZXRIb3VyKGRhdGUpfToke3RoaXMuZ2V0TWludXRlKGRhdGUpfToke3RoaXMuZ2V0U2Vjb25kKGRhdGUpfWApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYSB1bmEgZGF0YSBwYXJ0ZW5kbyBkYSBhbm5vLCBtZXNlIGUgZ2lvcm5vXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5ZWFyIEFubm9cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtb250aCBNZXNlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGF0ZSBHaW9ybm9cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge0RheWpzfSBPZ2dldHRvIGdlbmVyYXRvIGluIGJhc2UgYWkgcGFyYW1ldHJpICoqeWVhcioqLCAqKm1vbnRoKiosIGUgKipkYXRlKipcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZURhdGUoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyLCBkYXRlOiBudW1iZXIpOiBEYXlqcyB7XHJcbiAgICAgICAgaWYgKG1vbnRoIDwgMCB8fCBtb250aCA+IDExKVxyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBtb250aCBpbmRleCBcIiR7bW9udGh9XCIuIE1vbnRoIGluZGV4IGhhcyB0byBiZSBiZXR3ZWVuIDAgYW5kIDExLmApO1xyXG5cclxuICAgICAgICBpZiAoZGF0ZSA8IDEpXHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGRhdGUgXCIke2RhdGV9XCIuIERhdGUgaGFzIHRvIGJlIGdyZWF0ZXIgdGhhbiAwLmApO1xyXG5cclxuICAgICAgICAvL0lsIG1lc2Ugw6ggdW4gaW5kaWNlIDAtMTEgcXVpbmRpIGRldm8gZGFyZ2xpIHVuICsxIHF1YVxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGRheWpzKGAke3llYXJ9LSR7bW9udGggKyAxfS0ke2RhdGV9YClcclxuXHJcbiAgICAgICAgaWYgKCFyZXN1bHQuaXNWYWxpZCgpKVxyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBkYXRlIFwiJHtkYXRlfVwiIGZvciBtb250aCB3aXRoIGluZGV4IFwiJHttb250aH1cIi5gKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3RpdHVpc2NlIGxhIGRhdGEgY2hlIHJhcHByZXNlbnRhIGxhIGdpb3JuYXRhIGRpIG9nZ2lcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge0RheWpzfSBPZ2dpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b2RheSgpOiBEYXlqcyB7XHJcbiAgICAgICAgcmV0dXJuIGRheWpzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFZmZldHR1YSBpbCBwYXJzZSBkaSB1bmEgZGF0YSwgZXZlbnR1YWxtZW50ZSBpbiBiYXNlIGFsIGZvcm1hdG8gc3BlY2lmaWNhdG9cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IHZhbHVlIFZhbG9yZSBkYSBwYXJzYXJlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyc2VGb3JtYXQgRm9ybWF0byBpbiBjdWkgbGVnZ2VyZSBpbCB2YWxvcmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge0RheWpzfSBEYXRhIGdlbmVyYXRhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwYXJzZSh2YWx1ZTogYW55LCBwYXJzZUZvcm1hdDogc3RyaW5nKTogRGF5anMge1xyXG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgaWYgKCh2YWx1ZSBhcyBzdHJpbmcpLmxlbmd0aCA9PSBwYXJzZUZvcm1hdC5sZW5ndGgpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF5anModmFsdWUsIHBhcnNlRm9ybWF0KTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdmFsdWUgPyBkYXlqcyh2YWx1ZSkgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9ybWF0dGEgdW5hIGRhdGEgaW4gYmFzZSBhbCBmb3JtYXRvIHNwZWNpZmljYXRvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RGF5anN9IGRhdGUgRGF0YSBkYSBmb3JtYXR0YXJlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGlzcGxheUZvcm1hdCBGb3JtYXRvIGluIGN1aSBtb3N0cmFyZSBsYSBkYXRhXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IERhdGEgZm9ybWF0dGF0YVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZm9ybWF0KGRhdGU6IERheWpzLCBkaXNwbGF5Rm9ybWF0OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKGRhdGUpKVxyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcignRGF0ZUFkYXB0ZXI6IENhbm5vdCBmb3JtYXQgaW52YWxpZCBkYXRlLicpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICByZXR1cm4gZGF0ZS5mb3JtYXQoZGlzcGxheUZvcm1hdClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFnZ2l1bmdlIGFkIHVuYSBkYXRhIGlsIG51bWVybyBzcGVjaWZpY2F0byBkaSBhbm5pXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RGF5anN9IGRhdGUgRGF0YSBhIGN1aSBhZ2dpdW5nZXJlIGdsaSBhbm5pXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geWVhcnMgQW5uaSBkYSBhZ2dpdW5nZXJlXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtEYXlqc30gRGF0YSBjb24gbCdhZ2dpdW50YSBkZWdsaSBhbm5pIHNwZWNpZmljYXRpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRDYWxlbmRhclllYXJzKGRhdGU6IERheWpzLCB5ZWFyczogbnVtYmVyKTogRGF5anMge1xyXG4gICAgICAgIHJldHVybiBkYXRlLmFkZCh5ZWFycywgXCJ5ZWFyXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdnaXVuZ2UgYWQgdW5hIGRhdGEgaWwgbnVtZXJvIHNwZWNpZmljYXRvIGRpIG1lc2lcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtEYXlqc30gZGF0ZSBEYXRhIGEgY3VpIGFnZ2l1bmdlcmUgaSBtZXNpXHJcbiAgICAgKiBAcGFyYW0ge21vbnRoc30gbW9udGhzIE1lc2kgZGEgYWdnaXVuZ2VyZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7RGF5anN9IERhdGEgY29uIGwnYWdnaXVudGEgZGVpIG1lc2kgc3BlY2lmaWNhdGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZENhbGVuZGFyTW9udGhzKGRhdGU6IERheWpzLCBtb250aHM6IG51bWJlcik6IERheWpzIHtcclxuICAgICAgICByZXR1cm4gZGF0ZS5hZGQobW9udGhzLCBcIm1vbnRoXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdnaXVuZ2UgYWQgdW5hIGRhdGEgaWwgbnVtZXJvIHNwZWNpZmljYXRvIGRpIGdpb3JuaVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0RheWpzfSBkYXRlIERhdGEgYSBjdWkgYWdnaXVuZ2VyZSBpIGdpb3JuaVxyXG4gICAgICogQHBhcmFtIHttb250aHN9IGRheXMgR2lvcm5pIGRhIGFnZ2l1bmdlcmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge0RheWpzfSBEYXRhIGNvbiBsJ2FnZ2l1bnRhIGRlaSBnaW9ybmkgc3BlY2lmaWNhdGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZENhbGVuZGFyRGF5cyhkYXRlOiBEYXlqcywgZGF5czogbnVtYmVyKTogRGF5anMge1xyXG4gICAgICAgIHJldHVybiBkYXRlLmFkZChkYXlzLCBcImRheVwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYXNmb3JtYSBsYSBkYXRhIHNwZWNpZmljYXRhIGluIHVuYSBzdHJpbmdhIElTTzg2MDFcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtEYXlqc30gZGF0ZSBEYXRhXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJhcHByZXNlbnRhemlvbmUgaW4gSVNPODYwMVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9Jc284NjAxKGRhdGU6IERheWpzKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udHJvbGxhIHNlIGwnb2dnZXR0byBwYXNzYXRvIMOoIGVmZmV0dGl2YW1lbnRlIHVuIERheUpzXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBkYSB2ZXJpZmljYXJlIHNlIMOoIHVuYSBkYXRhIG8gbWVub1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbCdvZ2dldHRvIMOoIHVuIERheUpzLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNEYXRlSW5zdGFuY2Uob2JqOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gZGF5anMuaXNEYXlqcyhvYmopO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udHJvbGxhIGlsIERheUpzIHBhc3NhdG8gZSB2ZXJpZmljYSBzZSDDqCB2YWxpZG9cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtEYXlqc30gZGF0ZSBEYXRhIGRhIHZlcmlmaWNhcmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIGlsIERheUpzIMOoIHZhbGlkbywgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzVmFsaWQoZGF0ZTogRGF5anMpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gZGF0ZS5pc1ZhbGlkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXN0aXR1aXNjZSB1biBEYXlKcyBpbnZhbGlkb1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7RGF5SnN9IERhdGEgSW52YWxpZGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGludmFsaWQoKTogRGF5anMge1xyXG4gICAgICAgIHJldHVybiBkYXlqcyhcIkludmFsaWQgRGF0ZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWEgdW4gcmFuZ2UgZGkgdW5hIGx1bmdoZXp6YSBzcGVjaWZpY2EgZSBwZXIgb2duaSBpbmRpY2UgZGVsIHJhbmdlIHJpY2hpYW1hIHVuIGNhbGxiYWNrIGNoZSB2YWxvcml6emEgbCdlbGVtZW50byBkaSBxdWVsbCdpbmRpY2VcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBMdW5naGV6emEgZGVsIHJhbmdlXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB2YWx1ZUZ1bmN0aW9uIENhbGxiYWNrIGNoZSBkZXZlIGdlbmVyYXJlIGlsIHZhbG9yZSBkZXNpZGVyYXRvIHBlciBvZ25pIGluZGljZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7VFtdfSBBcnJheSBkZWkgdmFsb3JpIGdlbmVyYXRpXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmFuZ2U8VD4obGVuZ3RoOiBudW1iZXIsIHZhbHVlRnVuY3Rpb246IChpbmRleDogbnVtYmVyKSA9PiBUKTogVFtdIHtcclxuICAgICAgICBjb25zdCB2YWx1ZXNBcnJheSA9IEFycmF5KGxlbmd0aCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgdmFsdWVzQXJyYXlbaV0gPSB2YWx1ZUZ1bmN0aW9uKGkpO1xyXG4gICAgICAgIHJldHVybiB2YWx1ZXNBcnJheTtcclxuICAgIH1cclxufSJdfQ==
|
|
1
|
+
// Angular
|
|
2
|
+
import { Inject, Injectable } from "@angular/core";
|
|
3
|
+
import { DateAdapter, MAT_DATE_LOCALE } from "@angular/material/core";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Adapter per permettere a Material di funzionare senza problemi con DayJs. Per altri provider di date (es. moment) l'adapter viene fornito
|
|
7
|
+
* nativamente da Angular. Per DayJs invece bisogna reimplementarselo
|
|
8
|
+
*/
|
|
9
|
+
export class DayJsDateAdapter extends DateAdapter {
|
|
10
|
+
/**
|
|
11
|
+
* Costruttore
|
|
12
|
+
*
|
|
13
|
+
* @ignore
|
|
14
|
+
*/
|
|
15
|
+
constructor(dateLocale) {
|
|
16
|
+
super();
|
|
17
|
+
this.setLocale(dateLocale);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Imposta il locale utilizzato per tutte le date
|
|
21
|
+
*
|
|
22
|
+
* @param {string} locale Locale da impostare
|
|
23
|
+
*/
|
|
24
|
+
setLocale(locale) {
|
|
25
|
+
super.setLocale(locale);
|
|
26
|
+
// il localeData si potrebbe prendere da this.dayJs().localeData(); ma io voglio usare le date solo nel formato italiano quindi cablo quello
|
|
27
|
+
switch (locale.toLowerCase()) {
|
|
28
|
+
case 'it-it':
|
|
29
|
+
case 'it':
|
|
30
|
+
import("dayjs/locale/it").then(mod => { this.loadLoacleDataModule(mod.default); });
|
|
31
|
+
break;
|
|
32
|
+
// In dayjs, nel locale "en" e basta non esistono i 3/4 delle info perché sono le cose generiche ereditate dai locali en-gb, en-au ecc...
|
|
33
|
+
// quindi mi baso sul locale inglese Britannico, ma comunque I'ts Coming Rome
|
|
34
|
+
case 'en-us':
|
|
35
|
+
case 'en-gb':
|
|
36
|
+
case 'en':
|
|
37
|
+
import("dayjs/locale/en-gb").then(mod => { this.loadLoacleDataModule(mod.default); });
|
|
38
|
+
break;
|
|
39
|
+
default: throw `Locale non riconosicuto '${locale}'. Locali consentiti: 'it', 'en'`;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Effettua il caricamento del localeData coi nomi dei mesi, giorni ecc partendo dal modulo importato
|
|
44
|
+
*
|
|
45
|
+
* @param {any} mod Modulo caricato contenente il locale desiderato
|
|
46
|
+
*/
|
|
47
|
+
loadLoacleDataModule(mod) {
|
|
48
|
+
this._localeData = {
|
|
49
|
+
firstDayOfWeek: mod.weekStart,
|
|
50
|
+
longMonths: mod.months,
|
|
51
|
+
shortMonths: mod.monthsShort,
|
|
52
|
+
dates: this.range(31, (i) => this.createDate(2017, 0, i + 1).format('D')),
|
|
53
|
+
longDaysOfWeek: mod.weekdays,
|
|
54
|
+
shortDaysOfWeek: mod.weekdaysShort,
|
|
55
|
+
narrowDaysOfWeek: mod.weekdaysMin,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Ottiene le ore da un DayJs
|
|
60
|
+
*
|
|
61
|
+
* @param {Dayjs} date Data Dayjs
|
|
62
|
+
*
|
|
63
|
+
* @returns {number} Ore
|
|
64
|
+
*/
|
|
65
|
+
getHour(date) {
|
|
66
|
+
return date.get("hour");
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Deserializza una data in DayJs
|
|
70
|
+
*
|
|
71
|
+
* @param {any} value Valore di data a caso
|
|
72
|
+
*
|
|
73
|
+
* @returns {Dayjs} data in dayjs
|
|
74
|
+
*/
|
|
75
|
+
deserialize(value) {
|
|
76
|
+
if (!value)
|
|
77
|
+
return null;
|
|
78
|
+
var valueConverted = dayjs(value);
|
|
79
|
+
if (valueConverted == null || this.isDateInstance(valueConverted) && this.isValid(valueConverted))
|
|
80
|
+
return valueConverted;
|
|
81
|
+
return this.invalid();
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Ottiene i minuti da un DayJs
|
|
85
|
+
*
|
|
86
|
+
* @param {Dayjs} date Data Dayjs
|
|
87
|
+
*
|
|
88
|
+
* @returns {number} Minuti
|
|
89
|
+
*/
|
|
90
|
+
getMinute(date) {
|
|
91
|
+
return date.get("minute");
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Ottiene i secondi da un DayJs
|
|
95
|
+
*
|
|
96
|
+
* @param {Dayjs} date Data Dayjs
|
|
97
|
+
*
|
|
98
|
+
* @returns {number} Secondi
|
|
99
|
+
*/
|
|
100
|
+
getSecond(date) {
|
|
101
|
+
return date.get("second");
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Imposta le ore di una data Dayjs
|
|
105
|
+
*
|
|
106
|
+
* @param {Dayjs} date Data da modificare
|
|
107
|
+
* @param {number} value Valore da impostare per le ore
|
|
108
|
+
*/
|
|
109
|
+
setHour(date, value) {
|
|
110
|
+
date.$H = value;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Imposta i minuti di una data Dayjs
|
|
114
|
+
*
|
|
115
|
+
* @param {Dayjs} date Data da modificare
|
|
116
|
+
* @param {number} value Valore da impostare per i minuti
|
|
117
|
+
*/
|
|
118
|
+
setMinute(date, value) {
|
|
119
|
+
date.$m = value;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Imposta i secondi di una data Dayjs
|
|
123
|
+
*
|
|
124
|
+
* @param {Dayjs} date Data da modificare
|
|
125
|
+
* @param {number} value Valore da impostare per i secondi
|
|
126
|
+
*/
|
|
127
|
+
setSecond(date, value) {
|
|
128
|
+
date.$s = value;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Ottiene l'anno da un DayJs
|
|
132
|
+
*
|
|
133
|
+
* @param {Dayjs} date Data Dayjs
|
|
134
|
+
*
|
|
135
|
+
* @returns {number} Anno
|
|
136
|
+
*/
|
|
137
|
+
getYear(date) {
|
|
138
|
+
return date.get("year");
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Ottiene il mese da un DayJs
|
|
142
|
+
*
|
|
143
|
+
* @param {Dayjs} date Data Dayjs
|
|
144
|
+
*
|
|
145
|
+
* @returns {number} Mese
|
|
146
|
+
*/
|
|
147
|
+
getMonth(date) {
|
|
148
|
+
return date.get("month");
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Ottiene il giorno da un DayJs
|
|
152
|
+
*
|
|
153
|
+
* @param {Dayjs} date Data Dayjs
|
|
154
|
+
*
|
|
155
|
+
* @returns {number} Giorno
|
|
156
|
+
*/
|
|
157
|
+
getDate(date) {
|
|
158
|
+
return date.get("date");
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Ottiene il giorno della settimana da un DayJs
|
|
162
|
+
*
|
|
163
|
+
* @param {Dayjs} date Data Dayjs
|
|
164
|
+
*
|
|
165
|
+
* @returns {number} Giorno della settimana da 1 a 7
|
|
166
|
+
*/
|
|
167
|
+
getDayOfWeek(date) {
|
|
168
|
+
return date.get("day");
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Ottiene i nomi dei mesi
|
|
172
|
+
*
|
|
173
|
+
* @param {"long" | "short" | "narrow"} style Stile dei nomi richiesto
|
|
174
|
+
*
|
|
175
|
+
* @returns {string[]} Lista dei mesi espressi in base al parametro **style**
|
|
176
|
+
*/
|
|
177
|
+
getMonthNames(style) {
|
|
178
|
+
return style == 'long' ? this._localeData.longMonths : this._localeData.shortMonths;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Ottiene i nomi dei giorni del mese
|
|
182
|
+
*
|
|
183
|
+
* @returns {string[]} Lista dei giorni del mese (da '1' a '31')
|
|
184
|
+
*/
|
|
185
|
+
getDateNames() {
|
|
186
|
+
return this._localeData.dates;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Ottiene i nomi dei giorni della settimana
|
|
190
|
+
*
|
|
191
|
+
* @param {"long" | "short" | "narrow"} style Stile dei nomi richiesto
|
|
192
|
+
*
|
|
193
|
+
* @returns {string[]} Lista dei giorni della settimana espressi in base al parametro **style**
|
|
194
|
+
*/
|
|
195
|
+
getDayOfWeekNames(style) {
|
|
196
|
+
if (style == 'long')
|
|
197
|
+
return this._localeData.longDaysOfWeek;
|
|
198
|
+
else if (style == 'short')
|
|
199
|
+
return this._localeData.shortDaysOfWeek;
|
|
200
|
+
return this._localeData.narrowDaysOfWeek;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Ottiene il nome dell'anno
|
|
204
|
+
*
|
|
205
|
+
* @param {Dayjs} date Data Dayjs
|
|
206
|
+
*
|
|
207
|
+
* @returns {string} Anno
|
|
208
|
+
*/
|
|
209
|
+
getYearName(date) {
|
|
210
|
+
return this.getYear(date).toString();
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Ottiene il primo giorno della settimana
|
|
214
|
+
*
|
|
215
|
+
* @returns {number} Indice del primo giorno della settimana
|
|
216
|
+
*/
|
|
217
|
+
getFirstDayOfWeek() {
|
|
218
|
+
return this._localeData.firstDayOfWeek;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Ottiene il numero di giorni nel mese corrente
|
|
222
|
+
*
|
|
223
|
+
* @param {Dayjs} date Data Dayjs
|
|
224
|
+
*
|
|
225
|
+
* @returns {number} Numero di giorni
|
|
226
|
+
*/
|
|
227
|
+
getNumDaysInMonth(date) {
|
|
228
|
+
return date.daysInMonth();
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Ottiene il clone di una data Dayjs
|
|
232
|
+
*
|
|
233
|
+
* @param {Dayjs} Data da clonare
|
|
234
|
+
*
|
|
235
|
+
* @returns {Dayjs} Clone
|
|
236
|
+
*/
|
|
237
|
+
clone(date) {
|
|
238
|
+
// Visto che ho modificato l'istanza originale a manazza (vedi setHour, setMinute, setSecond) l'oggetto è danneggiato e per restituire un clone buono
|
|
239
|
+
// devo ricrearlo prendendo pezzo per pezzo
|
|
240
|
+
// Il mese è un indice 0-11 quindi devo dargli un +1 qua
|
|
241
|
+
return dayjs(`${this.getYear(date)}-${this.getMonth(date) + 1}-${this.getDate(date)} ${this.getHour(date)}:${this.getMinute(date)}:${this.getSecond(date)}`);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Crea una data partendo da anno, mese e giorno
|
|
245
|
+
*
|
|
246
|
+
* @param {number} year Anno
|
|
247
|
+
* @param {number} month Mese
|
|
248
|
+
* @param {number} date Giorno
|
|
249
|
+
*
|
|
250
|
+
* @returns {Dayjs} Oggetto generato in base ai parametri **year**, **month**, e **date**
|
|
251
|
+
*/
|
|
252
|
+
createDate(year, month, date) {
|
|
253
|
+
if (month < 0 || month > 11)
|
|
254
|
+
throw Error(`Invalid month index "${month}". Month index has to be between 0 and 11.`);
|
|
255
|
+
if (date < 1)
|
|
256
|
+
throw Error(`Invalid date "${date}". Date has to be greater than 0.`);
|
|
257
|
+
//Il mese è un indice 0-11 quindi devo dargli un +1 qua
|
|
258
|
+
const result = dayjs(`${year}-${month + 1}-${date}`);
|
|
259
|
+
if (!result.isValid())
|
|
260
|
+
throw Error(`Invalid date "${date}" for month with index "${month}".`);
|
|
261
|
+
return result;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Restituisce la data che rappresenta la giornata di oggi
|
|
265
|
+
*
|
|
266
|
+
* @returns {Dayjs} Oggi
|
|
267
|
+
*/
|
|
268
|
+
today() {
|
|
269
|
+
return dayjs();
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Effettua il parse di una data, eventualmente in base al formato specificato
|
|
273
|
+
*
|
|
274
|
+
* @param {any} value Valore da parsare
|
|
275
|
+
* @param {string} parseFormat Formato in cui leggere il valore
|
|
276
|
+
*
|
|
277
|
+
* @returns {Dayjs} Data generata
|
|
278
|
+
*/
|
|
279
|
+
parse(value, parseFormat) {
|
|
280
|
+
if (value && typeof value == 'string') {
|
|
281
|
+
if (value.length == parseFormat.length)
|
|
282
|
+
return dayjs(value, parseFormat);
|
|
283
|
+
else
|
|
284
|
+
return null;
|
|
285
|
+
}
|
|
286
|
+
return value ? dayjs(value) : null;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Formatta una data in base al formato specificato
|
|
290
|
+
*
|
|
291
|
+
* @param {Dayjs} date Data da formattare
|
|
292
|
+
* @param {string} displayFormat Formato in cui mostrare la data
|
|
293
|
+
*
|
|
294
|
+
* @returns {string} Data formattata
|
|
295
|
+
*/
|
|
296
|
+
format(date, displayFormat) {
|
|
297
|
+
if (!this.isValid(date))
|
|
298
|
+
throw Error('DateAdapter: Cannot format invalid date.');
|
|
299
|
+
return date.format(displayFormat);
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Aggiunge ad una data il numero specificato di anni
|
|
303
|
+
*
|
|
304
|
+
* @param {Dayjs} date Data a cui aggiungere gli anni
|
|
305
|
+
* @param {number} years Anni da aggiungere
|
|
306
|
+
*
|
|
307
|
+
* @returns {Dayjs} Data con l'aggiunta degli anni specificati
|
|
308
|
+
*/
|
|
309
|
+
addCalendarYears(date, years) {
|
|
310
|
+
return date.add(years, "year");
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Aggiunge ad una data il numero specificato di mesi
|
|
314
|
+
*
|
|
315
|
+
* @param {Dayjs} date Data a cui aggiungere i mesi
|
|
316
|
+
* @param {months} months Mesi da aggiungere
|
|
317
|
+
*
|
|
318
|
+
* @returns {Dayjs} Data con l'aggiunta dei mesi specificati
|
|
319
|
+
*/
|
|
320
|
+
addCalendarMonths(date, months) {
|
|
321
|
+
return date.add(months, "month");
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Aggiunge ad una data il numero specificato di giorni
|
|
325
|
+
*
|
|
326
|
+
* @param {Dayjs} date Data a cui aggiungere i giorni
|
|
327
|
+
* @param {months} days Giorni da aggiungere
|
|
328
|
+
*
|
|
329
|
+
* @returns {Dayjs} Data con l'aggiunta dei giorni specificati
|
|
330
|
+
*/
|
|
331
|
+
addCalendarDays(date, days) {
|
|
332
|
+
return date.add(days, "day");
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Trasforma la data specificata in una stringa ISO8601
|
|
336
|
+
*
|
|
337
|
+
* @param {Dayjs} date Data
|
|
338
|
+
*
|
|
339
|
+
* @returns {string} Rappresentazione in ISO8601
|
|
340
|
+
*/
|
|
341
|
+
toIso8601(date) {
|
|
342
|
+
return date.toISOString();
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Controlla se l'oggetto passato è effettivamente un DayJs
|
|
346
|
+
*
|
|
347
|
+
* @param {any} obj Oggetto da verificare se è una data o meno
|
|
348
|
+
*
|
|
349
|
+
* @returns {boolean} **true** se l'oggetto è un DayJs, **false** altrimenti
|
|
350
|
+
*/
|
|
351
|
+
isDateInstance(obj) {
|
|
352
|
+
return dayjs.isDayjs(obj);
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Controlla il DayJs passato e verifica se è valido
|
|
356
|
+
*
|
|
357
|
+
* @param {Dayjs} date Data da verificare
|
|
358
|
+
*
|
|
359
|
+
* @returns {boolean} **true** se il DayJs è valido, **false** altrimenti
|
|
360
|
+
*/
|
|
361
|
+
isValid(date) {
|
|
362
|
+
return date.isValid();
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Restituisce un DayJs invalido
|
|
366
|
+
*
|
|
367
|
+
* @returns {DayJs} Data Invalida
|
|
368
|
+
*/
|
|
369
|
+
invalid() {
|
|
370
|
+
return dayjs("Invalid Date");
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Crea un range di una lunghezza specifica e per ogni indice del range richiama un callback che valorizza l'elemento di quell'indice
|
|
374
|
+
*
|
|
375
|
+
* @param {number} length Lunghezza del range
|
|
376
|
+
* @param {Function} valueFunction Callback che deve generare il valore desiderato per ogni indice
|
|
377
|
+
*
|
|
378
|
+
* @returns {T[]} Array dei valori generati
|
|
379
|
+
*/
|
|
380
|
+
range(length, valueFunction) {
|
|
381
|
+
const valuesArray = Array(length);
|
|
382
|
+
for (let i = 0; i < length; i++)
|
|
383
|
+
valuesArray[i] = valueFunction(i);
|
|
384
|
+
return valuesArray;
|
|
385
|
+
}
|
|
386
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DayJsDateAdapter, deps: [{ token: MAT_DATE_LOCALE }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
387
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DayJsDateAdapter }); }
|
|
388
|
+
}
|
|
389
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DayJsDateAdapter, decorators: [{
|
|
390
|
+
type: Injectable
|
|
391
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
392
|
+
type: Inject,
|
|
393
|
+
args: [MAT_DATE_LOCALE]
|
|
394
|
+
}] }] });
|
|
395
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF5anNEYXRlQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsLWRheWpzLWFkYXB0ZXIvc3JjL2xpYi9hZGFwdGVyL0RheWpzRGF0ZUFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBV3RFOzs7R0FHRztBQUVILE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxXQUFrQjtJQWVwRDs7OztPQUlHO0lBQ0gsWUFBcUMsVUFBa0I7UUFDbkQsS0FBSyxFQUFFLENBQUM7UUFFUixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksU0FBUyxDQUFDLE1BQWM7UUFDM0IsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV4Qiw0SUFBNEk7UUFDNUksUUFBUSxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUMzQixLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssSUFBSTtnQkFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUNwRyx5SUFBeUk7WUFDekksNkVBQTZFO1lBQzdFLEtBQUssT0FBTyxDQUFDO1lBQ2IsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLElBQUk7Z0JBQUUsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFD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Q0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssS0FBSyxDQUFJLE1BQWMsRUFBRSxhQUFtQztRQUNoRSxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUU7WUFDM0IsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDOytHQTlhUSxnQkFBZ0Isa0JBb0JMLGVBQWU7bUhBcEIxQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVU7OzBCQXFCTSxNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IERhdGVBZGFwdGVyLCBNQVRfREFURV9MT0NBTEUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZVwiO1xyXG5cclxuLy8gRGF5anNcclxuaW1wb3J0IHsgRGF5anMgfSBmcm9tIFwiZGF5anNcIjtcclxuXHJcbi8qKlxyXG4gKiBEaWNoaWFyYXppb25lIGRlbGxhIHZhcmlhYmlsZSBnbG9iYWxlIGRheWpzLiBMJ29uZXJlIGRpIFwiY3JlYXJsYVwiIMOoIGFmZmlkYXRvIGFsbCdhcHBsaWNhemlvbmUgY2hlIHV0aWxpenphIHF1ZXN0YSBsaWJyZXJpYSwgXHJcbiAqIGNoZSBkb3Zyw6AgaW1wb3J0YXJlIGxvIHNjcmlwdCBnbG9iYWxlIGRpIGRheWpzIG5lbGxhIENMSVxyXG4gKi9cclxuZGVjbGFyZSB2YXIgZGF5anM6IGFueTtcclxuXHJcbi8qKlxyXG4gKiBBZGFwdGVyIHBlciBwZXJtZXR0ZXJlIGEgTWF0ZXJpYWwgZGkgZnVuemlvbmFyZSBzZW56YSBwcm9ibGVtaSBjb24gRGF5SnMuIFBlciBhbHRyaSBwcm92aWRlciBkaSBkYXRlIChlcy4gbW9tZW50KSBsJ2FkYXB0ZXIgdmllbmUgZm9ybml0byBcclxuICogbmF0aXZhbWVudGUgZGEgQW5ndWxhci4gUGVyIERheUpzIGludmVjZSBiaXNvZ25hIHJlaW1wbGVtZW50YXJzZWxvXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBEYXlKc0RhdGVBZGFwdGVyIGV4dGVuZHMgRGF0ZUFkYXB0ZXI8RGF5anM+e1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FjaGUgZGVpIGRhdGkgZGVsIGxvY2FsZSBJdGFsaWFub1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9sb2NhbGVEYXRhOiB7XHJcbiAgICAgICAgZmlyc3REYXlPZldlZWs6IG51bWJlcixcclxuICAgICAgICBsb25nTW9udGhzOiBzdHJpbmdbXSxcclxuICAgICAgICBzaG9ydE1vbnRoczogc3RyaW5nW10sXHJcbiAgICAgICAgZGF0ZXM6IHN0cmluZ1tdLFxyXG4gICAgICAgIGxvbmdEYXlzT2ZXZWVrOiBzdHJpbmdbXSxcclxuICAgICAgICBzaG9ydERheXNPZldlZWs6IHN0cmluZ1tdLFxyXG4gICAgICAgIG5hcnJvd0RheXNPZldlZWs6IHN0cmluZ1tdXHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29zdHJ1dHRvcmVcclxuICAgICAqIFxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KE1BVF9EQVRFX0xPQ0FMRSkgZGF0ZUxvY2FsZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRMb2NhbGUoZGF0ZUxvY2FsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbXBvc3RhIGlsIGxvY2FsZSB1dGlsaXp6YXRvIHBlciB0dXR0ZSBsZSBkYXRlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbGUgTG9jYWxlIGRhIGltcG9zdGFyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0TG9jYWxlKGxvY2FsZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIuc2V0TG9jYWxlKGxvY2FsZSk7XHJcblxyXG4gICAgICAgIC8vIGlsIGxvY2FsZURhdGEgc2kgcG90cmViYmUgcHJlbmRlcmUgZGEgdGhpcy5kYXlKcygpLmxvY2FsZURhdGEoKTsgbWEgaW8gdm9nbGlvIHVzYXJlIGxlIGRhdGUgc29sbyBuZWwgZm9ybWF0byBpdGFsaWFubyBxdWluZGkgY2FibG8gcXVlbGxvXHJcbiAgICAgICAgc3dpdGNoIChsb2NhbGUudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjYXNlICdpdC1pdCc6XHJcbiAgICAgICAgICAgIGNhc2UgJ2l0JzogaW1wb3J0KFwiZGF5anMvbG9jYWxlL2l0XCIpLnRoZW4obW9kID0+IHsgdGhpcy5sb2FkTG9hY2xlRGF0YU1vZHVsZShtb2QuZGVmYXVsdCkgfSk7IGJyZWFrO1xyXG4gICAgICAgICAgICAvLyBJbiBkYXlqcywgbmVsIGxvY2FsZSBcImVuXCIgZSBiYXN0YSBub24gZXNpc3Rvbm8gaSAzLzQgZGVsbGUgaW5mbyBwZXJjaMOpIHNvbm8gbGUgY29zZSBnZW5lcmljaGUgZXJlZGl0YXRlIGRhaSBsb2NhbGkgZW4tZ2IsIGVuLWF1IGVjYy4uLlxyXG4gICAgICAgICAgICAvLyBxdWluZGkgbWkgYmFzbyBzdWwgbG9jYWxlIGluZ2xlc2UgQnJpdGFubmljbywgbWEgY29tdW5xdWUgSSd0cyBDb21pbmcgUm9tZVxyXG4gICAgICAgICAgICBjYXNlICdlbi11cyc6XHJcbiAgICAgICAgICAgIGNhc2UgJ2VuLWdiJzpcclxuICAgICAgICAgICAgY2FzZSAnZW4nOiBpbXBvcnQoXCJkYXlqcy9sb2NhbGUvZW4tZ2JcIikudGhlbihtb2QgPT4geyB0aGlzLmxvYWRMb2FjbGVEYXRhTW9kdWxlKG1vZC5kZWZhdWx0KSB9KTsgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHRocm93IGBMb2NhbGUgbm9uIHJpY29ub3NpY3V0byAnJHtsb2NhbGV9Jy4gTG9jYWxpIGNvbnNlbnRpdGk6ICdpdCcsICdlbidgO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVmZmV0dHVhIGlsIGNhcmljYW1lbnRvIGRlbCBsb2NhbGVEYXRhIGNvaSBub21pIGRlaSBtZXNpLCBnaW9ybmkgZWNjIHBhcnRlbmRvIGRhbCBtb2R1bG8gaW1wb3J0YXRvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBtb2QgTW9kdWxvIGNhcmljYXRvIGNvbnRlbmVudGUgaWwgbG9jYWxlIGRlc2lkZXJhdG9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBsb2FkTG9hY2xlRGF0YU1vZHVsZShtb2Q6IGFueSkge1xyXG4gICAgICAgIHRoaXMuX2xvY2FsZURhdGEgPSB7XHJcbiAgICAgICAgICAgIGZpcnN0RGF5T2ZXZWVrOiBtb2Qud2Vla1N0YXJ0LFxyXG4gICAgICAgICAgICBsb25nTW9udGhzOiBtb2QubW9udGhzLFxyXG4gICAgICAgICAgICBzaG9ydE1vbnRoczogbW9kLm1vbnRoc1Nob3J0LFxyXG4gICAgICAgICAgICBkYXRlczogdGhpcy5yYW5nZSgzMSwgKGkpID0+IHRoaXMuY3JlYXRlRGF0ZSgyMDE3LCAwLCBpICsgMSkuZm9ybWF0KCdEJykpLFxyXG4gICAgICAgICAgICBsb25nRGF5c09mV2VlazogbW9kLndlZWtkYXlzLFxyXG4gICAgICAgICAgICBzaG9ydERheXNPZldlZWs6IG1vZC53ZWVrZGF5c1Nob3J0LFxyXG4gICAgICAgICAgICBuYXJyb3dEYXlzT2ZXZWVrOiBtb2Qud2Vla2RheXNNaW4sXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgbGUgb3JlIGRhIHVuIERheUpzXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RGF5anN9IGRhdGUgRGF0YSBEYXlqc1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBPcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEhvdXIoZGF0ZTogRGF5anMpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBkYXRlLmdldChcImhvdXJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXNlcmlhbGl6emEgdW5hIGRhdGEgaW4gRGF5SnNcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IHZhbHVlIFZhbG9yZSBkaSBkYXRhIGEgY2Fzb1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7RGF5anN9IGRhdGEgaW4gZGF5anNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlc2VyaWFsaXplKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSlcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIHZhciB2YWx1ZUNvbnZlcnRlZCA9IGRheWpzKHZhbHVlKTtcclxuXHJcbiAgICAgICAgaWYgKHZhbHVlQ29udmVydGVkID09IG51bGwgfHwgdGhpcy5pc0RhdGVJbnN0YW5jZSh2YWx1ZUNvbnZlcnRlZCkgJiYgdGhpcy5pc1ZhbGlkKHZhbHVlQ29udmVydGVkKSlcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlQ29udmVydGVkO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5pbnZhbGlkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGkgbWludXRpIGRhIHVuIERheUpzXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RGF5anN9IGRhdGUgRGF0YSBEYXlqc1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBNaW51dGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE1pbnV0ZShkYXRlOiBEYXlqcyk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGUuZ2V0KFwibWludXRlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBpIHNlY29uZGkgZGEgdW4gRGF5SnNcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtEYXlqc30gZGF0ZSBEYXRhIERheWpzXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFNlY29uZGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNlY29uZChkYXRlOiBEYXlqcyk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGUuZ2V0KFwic2Vjb25kXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW1wb3N0YSBsZSBvcmUgZGkgdW5hIGRhdGEgRGF5anNcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtEYXlqc30gZGF0ZSBEYXRhIGRhIG1vZGlmaWNhcmVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBWYWxvcmUgZGEgaW1wb3N0YXJlIHBlciBsZSBvcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldEhvdXIoZGF0ZTogRGF5anMsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICAoPGFueT5kYXRlKS4kSCA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW1wb3N0YSBpIG1pbnV0aSBkaSB1bmEgZGF0YSBEYXlqc1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0RheWpzfSBkYXRlIERhdGEgZGEgbW9kaWZpY2FyZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFZhbG9yZSBkYSBpbXBvc3RhcmUgcGVyIGkgbWludXRpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRNaW51dGUoZGF0ZTogRGF5anMsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICAoPGFueT5kYXRlKS4kbSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW1wb3N0YSBpIHNlY29uZGkgZGkgdW5hIGRhdGEgRGF5anNcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtEYXlqc30gZGF0ZSBEYXRhIGRhIG1vZGlmaWNhcmVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBWYWxvcmUgZGEgaW1wb3N0YXJlIHBlciBpIHNlY29uZGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFNlY29uZChkYXRlOiBEYXlqcywgdmFsdWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgICg8YW55PmRhdGUpLiRzID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGwnYW5ubyBkYSB1biBEYXlKc1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0RheWpzfSBkYXRlIERhdGEgRGF5anNcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gQW5ub1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0WWVhcihkYXRlOiBEYXlqcyk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGUuZ2V0KFwieWVhclwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgaWwgbWVzZSBkYSB1biBEYXlKc1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0RheWpzfSBkYXRlIERhdGEgRGF5anNcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gTWVzZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TW9udGgoZGF0ZTogRGF5anMpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBkYXRlLmdldChcIm1vbnRoXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBpbCBnaW9ybm8gZGEgdW4gRGF5SnNcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtEYXlqc30gZGF0ZSBEYXRhIERheWpzXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEdpb3Jub1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RGF0ZShkYXRlOiBEYXlqcyk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGUuZ2V0KFwiZGF0ZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgaWwgZ2lvcm5vIGRlbGxhIHNldHRpbWFuYSBkYSB1biBEYXlKc1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0RheWpzfSBkYXRlIERhdGEgRGF5anNcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gR2lvcm5vIGRlbGxhIHNldHRpbWFuYSBkYSAxIGEgN1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RGF5T2ZXZWVrKGRhdGU6IERheWpzKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gZGF0ZS5nZXQoXCJkYXlcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGkgbm9taSBkZWkgbWVzaVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge1wibG9uZ1wiIHwgXCJzaG9ydFwiIHwgXCJuYXJyb3dcIn0gc3R5bGUgU3RpbGUgZGVpIG5vbWkgcmljaGllc3RvXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gTGlzdGEgZGVpIG1lc2kgZXNwcmVzc2kgaW4gYmFzZSBhbCBwYXJhbWV0cm8gKipzdHlsZSoqXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRNb250aE5hbWVzKHN0eWxlOiBcImxvbmdcIiB8IFwic2hvcnRcIiB8IFwibmFycm93XCIpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgcmV0dXJuIHN0eWxlID09ICdsb25nJyA/IHRoaXMuX2xvY2FsZURhdGEubG9uZ01vbnRocyA6IHRoaXMuX2xvY2FsZURhdGEuc2hvcnRNb250aHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGkgbm9taSBkZWkgZ2lvcm5pIGRlbCBtZXNlXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gTGlzdGEgZGVpIGdpb3JuaSBkZWwgbWVzZSAoZGEgJzEnIGEgJzMxJylcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldERhdGVOYW1lcygpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZURhdGEuZGF0ZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGkgbm9taSBkZWkgZ2lvcm5pIGRlbGxhIHNldHRpbWFuYVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge1wibG9uZ1wiIHwgXCJzaG9ydFwiIHwgXCJuYXJyb3dcIn0gc3R5bGUgU3RpbGUgZGVpIG5vbWkgcmljaGllc3RvXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gTGlzdGEgZGVpIGdpb3JuaSBkZWxsYSBzZXR0aW1hbmEgZXNwcmVzc2kgaW4gYmFzZSBhbCBwYXJhbWV0cm8gKipzdHlsZSoqXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXREYXlPZldlZWtOYW1lcyhzdHlsZTogJ2xvbmcnIHwgJ3Nob3J0JyB8ICduYXJyb3cnKTogc3RyaW5nW10ge1xyXG4gICAgICAgIGlmIChzdHlsZSA9PSAnbG9uZycpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGVEYXRhLmxvbmdEYXlzT2ZXZWVrO1xyXG4gICAgICAgIGVsc2UgaWYgKHN0eWxlID09ICdzaG9ydCcpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGVEYXRhLnNob3J0RGF5c09mV2VlaztcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZURhdGEubmFycm93RGF5c09mV2VlaztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgaWwgbm9tZSBkZWxsJ2Fubm9cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtEYXlqc30gZGF0ZSBEYXRhIERheWpzXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IEFubm9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFllYXJOYW1lKGRhdGU6IERheWpzKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRZZWFyKGRhdGUpLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGlsIHByaW1vIGdpb3JubyBkZWxsYSBzZXR0aW1hbmFcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gSW5kaWNlIGRlbCBwcmltbyBnaW9ybm8gZGVsbGEgc2V0dGltYW5hXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRGaXJzdERheU9mV2VlaygpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGVEYXRhLmZpcnN0RGF5T2ZXZWVrO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBpbCBudW1lcm8gZGkgZ2lvcm5pIG5lbCBtZXNlIGNvcnJlbnRlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RGF5anN9IGRhdGUgRGF0YSBEYXlqc1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBOdW1lcm8gZGkgZ2lvcm5pXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXROdW1EYXlzSW5Nb250aChkYXRlOiBEYXlqcyk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGUuZGF5c0luTW9udGgoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgaWwgY2xvbmUgZGkgdW5hIGRhdGEgRGF5anNcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtEYXlqc30gRGF0YSBkYSBjbG9uYXJlXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtEYXlqc30gQ2xvbmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsb25lKGRhdGU6IERheWpzKTogRGF5anMge1xyXG4gICAgICAgIC8vIFZpc3RvIGNoZSBobyBtb2RpZmljYXRvIGwnaXN0YW56YSBvcmlnaW5hbGUgYSBtYW5henphICh2ZWRpIHNldEhvdXIsIHNldE1pbnV0ZSwgc2V0U2Vjb25kKSBsJ29nZ2V0dG8gw6ggZGFubmVnZ2lhdG8gZSBwZXIgcmVzdGl0dWlyZSB1biBjbG9uZSBidW9ub1xyXG4gICAgICAgIC8vIGRldm8gcmljcmVhcmxvIHByZW5kZW5kbyBwZXp6byBwZXIgcGV6em9cclxuICAgICAgICAvLyBJbCBtZXNlIMOoIHVuIGluZGljZSAwLTExIHF1aW5kaSBkZXZvIGRhcmdsaSB1biArMSBxdWFcclxuICAgICAgICByZXR1cm4gZGF5anMoYCR7dGhpcy5nZXRZZWFyKGRhdGUpfS0ke3RoaXMuZ2V0TW9udGgoZGF0ZSkgKyAxfS0ke3RoaXMuZ2V0RGF0ZShkYXRlKX0gJHt0aGlzLmdldEhvdXIoZGF0ZSl9OiR7dGhpcy5nZXRNaW51dGUoZGF0ZSl9OiR7dGhpcy5nZXRTZWNvbmQoZGF0ZSl9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhIHVuYSBkYXRhIHBhcnRlbmRvIGRhIGFubm8sIG1lc2UgZSBnaW9ybm9cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHllYXIgQW5ub1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1vbnRoIE1lc2VcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkYXRlIEdpb3Jub1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7RGF5anN9IE9nZ2V0dG8gZ2VuZXJhdG8gaW4gYmFzZSBhaSBwYXJhbWV0cmkgKip5ZWFyKiosICoqbW9udGgqKiwgZSAqKmRhdGUqKlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlRGF0ZSh5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIGRhdGU6IG51bWJlcik6IERheWpzIHtcclxuICAgICAgICBpZiAobW9udGggPCAwIHx8IG1vbnRoID4gMTEpXHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIG1vbnRoIGluZGV4IFwiJHttb250aH1cIi4gTW9udGggaW5kZXggaGFzIHRvIGJlIGJldHdlZW4gMCBhbmQgMTEuYCk7XHJcblxyXG4gICAgICAgIGlmIChkYXRlIDwgMSlcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgZGF0ZSBcIiR7ZGF0ZX1cIi4gRGF0ZSBoYXMgdG8gYmUgZ3JlYXRlciB0aGFuIDAuYCk7XHJcblxyXG4gICAgICAgIC8vSWwgbWVzZSDDqCB1biBpbmRpY2UgMC0xMSBxdWluZGkgZGV2byBkYXJnbGkgdW4gKzEgcXVhXHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZGF5anMoYCR7eWVhcn0tJHttb250aCArIDF9LSR7ZGF0ZX1gKVxyXG5cclxuICAgICAgICBpZiAoIXJlc3VsdC5pc1ZhbGlkKCkpXHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGRhdGUgXCIke2RhdGV9XCIgZm9yIG1vbnRoIHdpdGggaW5kZXggXCIke21vbnRofVwiLmApO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzdGl0dWlzY2UgbGEgZGF0YSBjaGUgcmFwcHJlc2VudGEgbGEgZ2lvcm5hdGEgZGkgb2dnaVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7RGF5anN9IE9nZ2lcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvZGF5KCk6IERheWpzIHtcclxuICAgICAgICByZXR1cm4gZGF5anMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVmZmV0dHVhIGlsIHBhcnNlIGRpIHVuYSBkYXRhLCBldmVudHVhbG1lbnRlIGluIGJhc2UgYWwgZm9ybWF0byBzcGVjaWZpY2F0b1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgVmFsb3JlIGRhIHBhcnNhcmVcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJzZUZvcm1hdCBGb3JtYXRvIGluIGN1aSBsZWdnZXJlIGlsIHZhbG9yZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7RGF5anN9IERhdGEgZ2VuZXJhdGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBhcnNlKHZhbHVlOiBhbnksIHBhcnNlRm9ybWF0OiBzdHJpbmcpOiBEYXlqcyB7XHJcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBpZiAoKHZhbHVlIGFzIHN0cmluZykubGVuZ3RoID09IHBhcnNlRm9ybWF0Lmxlbmd0aClcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXlqcyh2YWx1ZSwgcGFyc2VGb3JtYXQpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB2YWx1ZSA/IGRheWpzKHZhbHVlKSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3JtYXR0YSB1bmEgZGF0YSBpbiBiYXNlIGFsIGZvcm1hdG8gc3BlY2lmaWNhdG9cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtEYXlqc30gZGF0ZSBEYXRhIGRhIGZvcm1hdHRhcmVcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwbGF5Rm9ybWF0IEZvcm1hdG8gaW4gY3VpIG1vc3RyYXJlIGxhIGRhdGFcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gRGF0YSBmb3JtYXR0YXRhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmb3JtYXQoZGF0ZTogRGF5anMsIGRpc3BsYXlGb3JtYXQ6IGFueSk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoZGF0ZSkpXHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdEYXRlQWRhcHRlcjogQ2Fubm90IGZvcm1hdCBpbnZhbGlkIGRhdGUuJyk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIHJldHVybiBkYXRlLmZvcm1hdChkaXNwbGF5Rm9ybWF0KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdnaXVuZ2UgYWQgdW5hIGRhdGEgaWwgbnVtZXJvIHNwZWNpZmljYXRvIGRpIGFubmlcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtEYXlqc30gZGF0ZSBEYXRhIGEgY3VpIGFnZ2l1bmdlcmUgZ2xpIGFubmlcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5ZWFycyBBbm5pIGRhIGFnZ2l1bmdlcmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge0RheWpzfSBEYXRhIGNvbiBsJ2FnZ2l1bnRhIGRlZ2xpIGFubmkgc3BlY2lmaWNhdGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZENhbGVuZGFyWWVhcnMoZGF0ZTogRGF5anMsIHllYXJzOiBudW1iZXIpOiBEYXlqcyB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGUuYWRkKHllYXJzLCBcInllYXJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ2dpdW5nZSBhZCB1bmEgZGF0YSBpbCBudW1lcm8gc3BlY2lmaWNhdG8gZGkgbWVzaVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0RheWpzfSBkYXRlIERhdGEgYSBjdWkgYWdnaXVuZ2VyZSBpIG1lc2lcclxuICAgICAqIEBwYXJhbSB7bW9udGhzfSBtb250aHMgTWVzaSBkYSBhZ2dpdW5nZXJlXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtEYXlqc30gRGF0YSBjb24gbCdhZ2dpdW50YSBkZWkgbWVzaSBzcGVjaWZpY2F0aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkQ2FsZW5kYXJNb250aHMoZGF0ZTogRGF5anMsIG1vbnRoczogbnVtYmVyKTogRGF5anMge1xyXG4gICAgICAgIHJldHVybiBkYXRlLmFkZChtb250aHMsIFwibW9udGhcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ2dpdW5nZSBhZCB1bmEgZGF0YSBpbCBudW1lcm8gc3BlY2lmaWNhdG8gZGkgZ2lvcm5pXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RGF5anN9IGRhdGUgRGF0YSBhIGN1aSBhZ2dpdW5nZXJlIGkgZ2lvcm5pXHJcbiAgICAgKiBAcGFyYW0ge21vbnRoc30gZGF5cyBHaW9ybmkgZGEgYWdnaXVuZ2VyZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7RGF5anN9IERhdGEgY29uIGwnYWdnaXVudGEgZGVpIGdpb3JuaSBzcGVjaWZpY2F0aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkQ2FsZW5kYXJEYXlzKGRhdGU6IERheWpzLCBkYXlzOiBudW1iZXIpOiBEYXlqcyB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGUuYWRkKGRheXMsIFwiZGF5XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhc2Zvcm1hIGxhIGRhdGEgc3BlY2lmaWNhdGEgaW4gdW5hIHN0cmluZ2EgSVNPODYwMVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0RheWpzfSBkYXRlIERhdGFcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmFwcHJlc2VudGF6aW9uZSBpbiBJU084NjAxXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b0lzbzg2MDEoZGF0ZTogRGF5anMpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250cm9sbGEgc2UgbCdvZ2dldHRvIHBhc3NhdG8gw6ggZWZmZXR0aXZhbWVudGUgdW4gRGF5SnNcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IG9iaiBPZ2dldHRvIGRhIHZlcmlmaWNhcmUgc2Ugw6ggdW5hIGRhdGEgbyBtZW5vXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAqKnRydWUqKiBzZSBsJ29nZ2V0dG8gw6ggdW4gRGF5SnMsICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc0RhdGVJbnN0YW5jZShvYmo6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBkYXlqcy5pc0RheWpzKG9iaik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250cm9sbGEgaWwgRGF5SnMgcGFzc2F0byBlIHZlcmlmaWNhIHNlIMOoIHZhbGlkb1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0RheWpzfSBkYXRlIERhdGEgZGEgdmVyaWZpY2FyZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgaWwgRGF5SnMgw6ggdmFsaWRvLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNWYWxpZChkYXRlOiBEYXlqcyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBkYXRlLmlzVmFsaWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3RpdHVpc2NlIHVuIERheUpzIGludmFsaWRvXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtEYXlKc30gRGF0YSBJbnZhbGlkYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW52YWxpZCgpOiBEYXlqcyB7XHJcbiAgICAgICAgcmV0dXJuIGRheWpzKFwiSW52YWxpZCBEYXRlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYSB1biByYW5nZSBkaSB1bmEgbHVuZ2hlenphIHNwZWNpZmljYSBlIHBlciBvZ25pIGluZGljZSBkZWwgcmFuZ2UgcmljaGlhbWEgdW4gY2FsbGJhY2sgY2hlIHZhbG9yaXp6YSBsJ2VsZW1lbnRvIGRpIHF1ZWxsJ2luZGljZVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIEx1bmdoZXp6YSBkZWwgcmFuZ2VcclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHZhbHVlRnVuY3Rpb24gQ2FsbGJhY2sgY2hlIGRldmUgZ2VuZXJhcmUgaWwgdmFsb3JlIGRlc2lkZXJhdG8gcGVyIG9nbmkgaW5kaWNlXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtUW119IEFycmF5IGRlaSB2YWxvcmkgZ2VuZXJhdGlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByYW5nZTxUPihsZW5ndGg6IG51bWJlciwgdmFsdWVGdW5jdGlvbjogKGluZGV4OiBudW1iZXIpID0+IFQpOiBUW10ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlc0FycmF5ID0gQXJyYXkobGVuZ3RoKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB2YWx1ZXNBcnJheVtpXSA9IHZhbHVlRnVuY3Rpb24oaSk7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlc0FycmF5O1xyXG4gICAgfVxyXG59Il19
|