lib-portal-angular 0.0.68 → 0.0.70
Sign up to get free protection for your applications and to get access to all the features.
- package/esm2022/lib/components/calendar-argenta/calendar-argenta.component.mjs +328 -165
- package/esm2022/lib/components/components.module.mjs +13 -8
- package/esm2022/lib/components/json-viewer/json-viewer.component.mjs +9 -3
- package/esm2022/lib/components/modal/modal.component.mjs +40 -0
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/lib-portal-angular.mjs +391 -183
- package/fesm2022/lib-portal-angular.mjs.map +1 -1
- package/lib/components/calendar-argenta/calendar-argenta.component.d.ts +30 -11
- package/lib/components/components.module.d.ts +6 -5
- package/lib/components/json-viewer/json-viewer.component.d.ts +4 -1
- package/lib/components/modal/modal.component.d.ts +18 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
@@ -1,7 +1,8 @@
|
|
1
1
|
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
2
2
|
import * as i0 from "@angular/core";
|
3
3
|
import * as i1 from "@angular/common";
|
4
|
-
import * as i2 from "
|
4
|
+
import * as i2 from "@angular/forms";
|
5
|
+
import * as i3 from "lucide-angular";
|
5
6
|
export class CalendarArgentaComponent {
|
6
7
|
constructor() {
|
7
8
|
this.id = 'argenta-calendar';
|
@@ -9,54 +10,73 @@ export class CalendarArgentaComponent {
|
|
9
10
|
this.label = 'Select a date';
|
10
11
|
this.minDate = null;
|
11
12
|
this.maxDate = null;
|
12
|
-
this.locale = 'pt';
|
13
|
-
this.useTime = false; //
|
14
|
-
this.initialDate = null; //
|
15
|
-
this.
|
13
|
+
this.locale = 'pt';
|
14
|
+
this.useTime = false; // Incluir ou não a hora
|
15
|
+
this.initialDate = null; // Data inicial no modo de data única
|
16
|
+
this.rangeMode = false; // Ativa o modo de intervalo de datas
|
17
|
+
this.startDate = null; // Data de início do intervalo
|
18
|
+
this.endDate = null; // Data de fim do intervalo
|
19
|
+
this.closeButtonLabel = 'Fechar'; // Texto do botão de fechar
|
20
|
+
this.rangeChange = new EventEmitter(); // Evento que emite data única ou intervalo
|
16
21
|
this.currentYear = new Date().getFullYear();
|
17
22
|
this.currentMonth = new Date().getMonth();
|
18
23
|
this.selectedDate = null;
|
24
|
+
this.selectedStartDate = null;
|
25
|
+
this.selectedEndDate = null;
|
19
26
|
this.isCalendarVisible = false;
|
20
27
|
this.inputDate = '';
|
21
28
|
this.invalidDate = false;
|
29
|
+
this.isSelectingStart = true; // Controla se estamos selecionando a data inicial ou final
|
30
|
+
this.startTime = '';
|
31
|
+
this.endTime = '';
|
32
|
+
this.selectedTime = '';
|
22
33
|
this.locales = {
|
23
34
|
en: {
|
24
35
|
months: [
|
25
|
-
'January', 'February', 'March', 'April', 'May', 'June', 'July',
|
26
|
-
'August', 'September', 'October', 'November', 'December'
|
36
|
+
'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'
|
27
37
|
],
|
28
38
|
daysOfWeek: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
|
29
|
-
invalidDateMessage: 'Invalid date. Please enter a date in the format dd/MM/yyyy'
|
39
|
+
invalidDateMessage: 'Invalid date. Please enter a date in the format dd/MM/yyyy',
|
40
|
+
startTimeLabel: 'Start Time',
|
41
|
+
endTimeLabel: 'End Time',
|
30
42
|
},
|
31
43
|
pt: {
|
32
44
|
months: [
|
33
|
-
'Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho',
|
34
|
-
'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'
|
45
|
+
'Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'
|
35
46
|
],
|
36
47
|
daysOfWeek: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'],
|
37
|
-
invalidDateMessage: 'Data inválida. Por favor, insira uma data no formato dd/MM/yyyy'
|
48
|
+
invalidDateMessage: 'Data inválida. Por favor, insira uma data no formato dd/MM/yyyy',
|
49
|
+
startTimeLabel: 'Hora de Início',
|
50
|
+
endTimeLabel: 'Hora de Fim',
|
38
51
|
},
|
39
52
|
es: {
|
40
53
|
months: [
|
41
|
-
'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio',
|
42
|
-
'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'
|
54
|
+
'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'
|
43
55
|
],
|
44
56
|
daysOfWeek: ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá'],
|
45
|
-
invalidDateMessage: 'Fecha inválida. Por favor, ingrese una fecha en el formato dd/MM/yyyy'
|
57
|
+
invalidDateMessage: 'Fecha inválida. Por favor, ingrese una fecha en el formato dd/MM/yyyy',
|
58
|
+
startTimeLabel: 'Hora de Inicio',
|
59
|
+
endTimeLabel: 'Hora de Fin',
|
46
60
|
}
|
47
61
|
};
|
48
62
|
}
|
49
63
|
ngOnInit() {
|
50
|
-
if (this.
|
51
|
-
|
52
|
-
|
64
|
+
if (this.rangeMode) {
|
65
|
+
if (this.startDate) {
|
66
|
+
this.selectedStartDate = this.parseDate(this.startDate);
|
67
|
+
this.startTime = this.formatTimeForDisplay(this.selectedStartDate);
|
68
|
+
}
|
69
|
+
if (this.endDate) {
|
70
|
+
this.selectedEndDate = this.parseDate(this.endDate);
|
71
|
+
this.endTime = this.formatTimeForDisplay(this.selectedEndDate);
|
72
|
+
}
|
73
|
+
this.updateInputForRange(); // Atualiza o input no modo range com horas
|
53
74
|
}
|
54
75
|
else {
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
this.dateChange.emit(this.inputDate); // Emite a data inicial
|
76
|
+
if (this.initialDate) {
|
77
|
+
this.updateCalendar(this.initialDate); // Atualiza o input único com a data inicial
|
78
|
+
this.selectedTime = this.formatTimeForDisplay(this.selectedDate);
|
79
|
+
}
|
60
80
|
}
|
61
81
|
}
|
62
82
|
ngOnChanges(changes) {
|
@@ -64,123 +84,233 @@ export class CalendarArgentaComponent {
|
|
64
84
|
this.updateCalendar(changes['initialDate'].currentValue);
|
65
85
|
}
|
66
86
|
}
|
67
|
-
//
|
87
|
+
// Atualiza o calendário para exibir a data única e a hora
|
68
88
|
updateCalendar(dateString) {
|
69
89
|
const parsedDate = this.parseDate(dateString);
|
70
|
-
|
71
|
-
if (parsedDate !== null && this.validateDate(dateString)) {
|
90
|
+
if (parsedDate && this.validateDate(dateString)) {
|
72
91
|
this.selectedDate = parsedDate;
|
73
92
|
this.currentYear = parsedDate.getFullYear();
|
74
93
|
this.currentMonth = parsedDate.getMonth();
|
75
|
-
this.inputDate = this.formatDateForDisplay(parsedDate);
|
76
|
-
this.
|
77
|
-
this.invalidDate = false;
|
94
|
+
this.inputDate = this.formatDateForDisplay(parsedDate); // Inclui a hora no input principal
|
95
|
+
this.emitSingleOrRange(); // Emite data única ou intervalo
|
96
|
+
this.invalidDate = false;
|
78
97
|
}
|
79
98
|
else {
|
80
|
-
this.invalidDate = true;
|
81
|
-
this.dateChange.emit('Data ou hora inválida'); // Emite mensagem de erro
|
82
|
-
console.log('Data ou hora inválida passada para o componente');
|
99
|
+
this.invalidDate = true;
|
83
100
|
}
|
84
101
|
}
|
85
102
|
onInputChange(event) {
|
86
103
|
const inputValue = event.target.value;
|
87
104
|
this.inputDate = this.applyDateMask(inputValue);
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
this.
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
const hour = Number(hourStr);
|
103
|
-
const minute = Number(minuteStr);
|
104
|
-
// Corrige somente se a hora/minuto forem inválidos
|
105
|
-
if (hour < 0 || hour > 23 || isNaN(hour)) {
|
106
|
-
this.invalidDate = true;
|
107
|
-
this.dateChange.emit('Hora inválida');
|
108
|
-
return;
|
105
|
+
if (this.rangeMode) {
|
106
|
+
const dateParts = this.inputDate.split(' - ');
|
107
|
+
if (dateParts.length === 2) {
|
108
|
+
const [startDate, endDate] = dateParts;
|
109
|
+
// Valida as duas partes do intervalo
|
110
|
+
if (this.validateDate(startDate) && this.validateDate(endDate)) {
|
111
|
+
this.invalidDate = false;
|
112
|
+
const parsedStartDate = this.parseDate(startDate);
|
113
|
+
const parsedEndDate = this.parseDate(endDate);
|
114
|
+
if (parsedStartDate && parsedEndDate) {
|
115
|
+
this.selectedStartDate = parsedStartDate;
|
116
|
+
this.selectedEndDate = parsedEndDate;
|
117
|
+
this.emitSingleOrRange(); // Emite o intervalo atualizado
|
118
|
+
}
|
109
119
|
}
|
110
|
-
else
|
120
|
+
else {
|
111
121
|
this.invalidDate = true;
|
112
|
-
this.dateChange.emit('Hora inválida');
|
113
|
-
return;
|
114
122
|
}
|
115
|
-
|
123
|
+
}
|
124
|
+
}
|
125
|
+
else {
|
126
|
+
// Valida data única
|
127
|
+
if ((this.useTime && this.inputDate.length === 16) || (!this.useTime && this.inputDate.length === 10)) {
|
128
|
+
if (this.validateDate(this.inputDate)) {
|
116
129
|
this.invalidDate = false;
|
130
|
+
const parsedDate = this.parseDate(this.inputDate);
|
131
|
+
if (parsedDate) {
|
132
|
+
this.selectedDate = parsedDate;
|
133
|
+
this.emitSingleOrRange(); // Emite a data única atualizada
|
134
|
+
}
|
135
|
+
}
|
136
|
+
else {
|
137
|
+
this.invalidDate = true;
|
117
138
|
}
|
118
139
|
}
|
119
140
|
}
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
141
|
+
}
|
142
|
+
// Atualiza o input no modo intervalo
|
143
|
+
updateInputForRange() {
|
144
|
+
if (this.selectedStartDate && this.selectedEndDate) {
|
145
|
+
const formattedStart = this.formatDateForDisplay(this.selectedStartDate);
|
146
|
+
const formattedEnd = this.formatDateForDisplay(this.selectedEndDate);
|
147
|
+
this.inputDate = `${formattedStart} - ${formattedEnd}`;
|
148
|
+
}
|
149
|
+
else if (this.selectedStartDate) {
|
150
|
+
this.inputDate = this.formatDateForDisplay(this.selectedStartDate);
|
151
|
+
}
|
152
|
+
}
|
153
|
+
/// Emite data única ou intervalo, incluindo horas
|
154
|
+
emitSingleOrRange() {
|
155
|
+
if (this.rangeMode) {
|
156
|
+
const formattedStart = this.selectedStartDate ? this.formatDateForDisplay(this.selectedStartDate) : '';
|
157
|
+
const formattedEnd = this.selectedEndDate ? this.formatDateForDisplay(this.selectedEndDate) : '';
|
158
|
+
this.inputDate = `${formattedStart} - ${formattedEnd}`; // Atualiza o input principal com o range e horas
|
159
|
+
this.rangeChange.emit({ start: formattedStart, end: formattedEnd });
|
160
|
+
}
|
161
|
+
else {
|
162
|
+
const formattedDate = this.selectedDate ? this.formatDateForDisplay(this.selectedDate) : '';
|
163
|
+
this.inputDate = formattedDate; // Atualiza o input principal com a data única e hora
|
164
|
+
this.rangeChange.emit({ start: formattedDate, end: '' });
|
165
|
+
}
|
166
|
+
}
|
167
|
+
// Função para tratar mudanças nas horas
|
168
|
+
onTimeChange(type) {
|
169
|
+
if (type === 'start') {
|
170
|
+
if (this.selectedStartDate) {
|
171
|
+
const [hours, minutes] = this.startTime ? this.startTime.split(':') : ['00', '00'];
|
172
|
+
this.selectedStartDate.setHours(+hours, +minutes);
|
173
|
+
}
|
174
|
+
}
|
175
|
+
else if (type === 'end') {
|
176
|
+
if (this.selectedEndDate) {
|
177
|
+
const [hours, minutes] = this.endTime ? this.endTime.split(':') : ['00', '00'];
|
178
|
+
this.selectedEndDate.setHours(+hours, +minutes);
|
179
|
+
}
|
180
|
+
}
|
181
|
+
else if (type === 'single') {
|
182
|
+
if (this.selectedDate) {
|
183
|
+
const [hours, minutes] = this.selectedTime ? this.selectedTime.split(':') : ['00', '00'];
|
184
|
+
this.selectedDate.setHours(+hours, +minutes);
|
185
|
+
}
|
186
|
+
}
|
187
|
+
this.emitSingleOrRange(); // Atualiza o valor no input principal
|
188
|
+
}
|
189
|
+
// Função para formatação da hora no input de hora
|
190
|
+
formatTimeForDisplay(date) {
|
191
|
+
if (!date)
|
192
|
+
return '';
|
193
|
+
const hours = date.getHours().toString().padStart(2, '0');
|
194
|
+
const minutes = date.getMinutes().toString().padStart(2, '0');
|
195
|
+
return `${hours}:${minutes}`;
|
196
|
+
}
|
197
|
+
// Método para selecionar uma data no calendário
|
198
|
+
selectDate(day) {
|
199
|
+
const date = new Date(this.currentYear, this.currentMonth, day);
|
200
|
+
if (this.rangeMode) {
|
201
|
+
// Lógica para rangeMode
|
202
|
+
if (this.isSelectingStart) {
|
203
|
+
this.selectedStartDate = date;
|
204
|
+
if (this.startTime) {
|
205
|
+
const [hours, minutes] = this.startTime.split(':');
|
206
|
+
this.selectedStartDate.setHours(+hours, +minutes);
|
133
207
|
}
|
134
208
|
else {
|
135
|
-
|
136
|
-
this.
|
209
|
+
this.selectedStartDate.setHours(0, 0);
|
210
|
+
this.startTime = '00:00';
|
137
211
|
}
|
212
|
+
this.isSelectingStart = false;
|
138
213
|
}
|
139
214
|
else {
|
140
|
-
this.
|
141
|
-
this.
|
215
|
+
this.selectedEndDate = date;
|
216
|
+
if (this.endTime) {
|
217
|
+
const [hours, minutes] = this.endTime.split(':');
|
218
|
+
this.selectedEndDate.setHours(+hours, +minutes);
|
219
|
+
}
|
220
|
+
else {
|
221
|
+
this.selectedEndDate.setHours(0, 0);
|
222
|
+
this.endTime = '00:00';
|
223
|
+
}
|
224
|
+
this.isSelectingStart = true;
|
225
|
+
this.emitSingleOrRange();
|
142
226
|
}
|
227
|
+
this.updateInputForRange();
|
228
|
+
// O calendário só será fechado ao clicar no botão "Fechar"
|
143
229
|
}
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
230
|
+
else {
|
231
|
+
// Lógica para quando não está em rangeMode
|
232
|
+
this.selectedDate = date;
|
233
|
+
if (this.selectedTime) {
|
234
|
+
const [hours, minutes] = this.selectedTime.split(':');
|
235
|
+
this.selectedDate.setHours(+hours, +minutes);
|
236
|
+
}
|
237
|
+
else {
|
238
|
+
this.selectedDate.setHours(0, 0);
|
239
|
+
this.selectedTime = '00:00';
|
240
|
+
}
|
241
|
+
this.inputDate = this.formatDateForDisplay(date);
|
242
|
+
this.emitSingleOrRange();
|
243
|
+
// **Fechar o calendário apenas se `useTime` for false**
|
244
|
+
if (!this.useTime) {
|
245
|
+
this.isCalendarVisible = false; // Fecha o calendário automaticamente se `useTime` for false
|
246
|
+
}
|
247
|
+
// Se `useTime` for true, o calendário permanece aberto para inserir a hora
|
156
248
|
}
|
157
|
-
return formattedDate;
|
158
249
|
}
|
159
250
|
applyDateMask(inputValue) {
|
251
|
+
// Remove qualquer caractere que não seja numérico
|
160
252
|
let digitsOnly = inputValue.replace(/\D/g, '');
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
253
|
+
if (this.rangeMode) {
|
254
|
+
const maxLength = this.useTime ? 28 : 17; // Ajusta o comprimento máximo para intervalo com ou sem tempo
|
255
|
+
// Certifica-se de que a entrada não excede o comprimento permitido
|
256
|
+
if (digitsOnly.length > maxLength) {
|
257
|
+
digitsOnly = digitsOnly.substring(0, maxLength);
|
258
|
+
}
|
259
|
+
// Primeiro intervalo (start date)
|
260
|
+
let day1 = digitsOnly.substring(0, 2);
|
261
|
+
let month1 = digitsOnly.substring(2, 4);
|
262
|
+
let year1 = digitsOnly.substring(4, 8);
|
263
|
+
let hour1 = digitsOnly.substring(8, 10);
|
264
|
+
let minute1 = digitsOnly.substring(10, 12);
|
265
|
+
// Cria a data formatada para a primeira parte (start date)
|
266
|
+
let maskedDate = `${day1}/${month1}/${year1}`;
|
267
|
+
if (this.useTime && hour1 && minute1) {
|
268
|
+
maskedDate += ` ${hour1}:${minute1}`;
|
269
|
+
}
|
270
|
+
// Adiciona o separador ' - ' se houver dados para o segundo intervalo
|
271
|
+
if (digitsOnly.length > 12) {
|
272
|
+
maskedDate += ' - ';
|
273
|
+
}
|
274
|
+
// Segundo intervalo (end date)
|
275
|
+
let day2 = digitsOnly.substring(12, 14);
|
276
|
+
let month2 = digitsOnly.substring(14, 16);
|
277
|
+
let year2 = digitsOnly.substring(16, 20);
|
278
|
+
let hour2 = digitsOnly.substring(20, 22);
|
279
|
+
let minute2 = digitsOnly.substring(22, 24);
|
280
|
+
let endDatePart = `${day2}/${month2}/${year2}`;
|
281
|
+
if (this.useTime && hour2 && minute2) {
|
282
|
+
endDatePart += ` ${hour2}:${minute2}`;
|
283
|
+
}
|
284
|
+
// Adiciona a segunda parte (end date) ao input, se aplicável
|
285
|
+
if (digitsOnly.length > 12) {
|
286
|
+
maskedDate += endDatePart;
|
287
|
+
}
|
288
|
+
return maskedDate;
|
165
289
|
}
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
290
|
+
else {
|
291
|
+
const maxLength = this.useTime ? 16 : 10;
|
292
|
+
if (digitsOnly.length > maxLength) {
|
293
|
+
digitsOnly = digitsOnly.substring(0, maxLength);
|
294
|
+
}
|
295
|
+
let day = digitsOnly.substring(0, 2);
|
296
|
+
let month = digitsOnly.substring(2, 4);
|
297
|
+
let year = digitsOnly.substring(4, 8);
|
298
|
+
let hour = digitsOnly.substring(8, 10);
|
299
|
+
let minute = digitsOnly.substring(10, 12);
|
300
|
+
let maskedDate = `${day}/${month}/${year}`;
|
301
|
+
if (this.useTime && hour && minute) {
|
302
|
+
maskedDate += ` ${hour}:${minute}`;
|
303
|
+
}
|
304
|
+
return maskedDate;
|
174
305
|
}
|
175
|
-
return maskedDate;
|
176
306
|
}
|
307
|
+
// Validação da data
|
177
308
|
validateDate(inputValue) {
|
178
309
|
const [datePart, timePart] = inputValue.split(' ');
|
179
310
|
const [dayStr, monthStr, yearStr] = datePart.split('/');
|
180
311
|
const day = Number(dayStr);
|
181
312
|
const month = Number(monthStr);
|
182
313
|
const year = Number(yearStr);
|
183
|
-
// Validação de data
|
184
314
|
if (month < 1 || month > 12 || yearStr.length !== 4 || isNaN(year)) {
|
185
315
|
return false;
|
186
316
|
}
|
@@ -188,30 +318,36 @@ export class CalendarArgentaComponent {
|
|
188
318
|
if (day < 1 || day > lastDayOfMonth) {
|
189
319
|
return false;
|
190
320
|
}
|
191
|
-
// Validação de hora
|
192
321
|
if (this.useTime && timePart) {
|
193
322
|
const [hourStr, minuteStr] = timePart.split(':');
|
194
323
|
const hour = Number(hourStr);
|
195
324
|
const minute = Number(minuteStr);
|
196
325
|
if (hour < 0 || hour > 23 || minute < 0 || minute > 59 || isNaN(hour) || isNaN(minute)) {
|
197
|
-
return false;
|
326
|
+
return false;
|
198
327
|
}
|
199
328
|
}
|
200
329
|
return true;
|
201
330
|
}
|
202
|
-
|
203
|
-
const
|
204
|
-
|
205
|
-
if (
|
206
|
-
|
331
|
+
handleKeyPress(event) {
|
332
|
+
const charCode = event.key.charCodeAt(0);
|
333
|
+
// Permitir apenas números e barra "/"
|
334
|
+
if ((charCode < 48 || charCode > 57) && charCode !== 47) {
|
335
|
+
event.preventDefault(); // Bloqueia a inserção de caracteres não permitidos
|
207
336
|
}
|
208
|
-
|
209
|
-
if (this.useTime
|
210
|
-
|
211
|
-
date.setHours(hour || 0, minute || 0);
|
337
|
+
// Limita o tamanho da entrada conforme o tipo de dado (com ou sem hora)
|
338
|
+
if (this.inputDate.replace(/\D/g, '').length >= (this.useTime ? 12 : 8)) {
|
339
|
+
event.preventDefault(); // Limita o número de caracteres permitidos
|
212
340
|
}
|
213
|
-
return date;
|
214
341
|
}
|
342
|
+
// Fecha o calendário
|
343
|
+
closeCalendar() {
|
344
|
+
this.isCalendarVisible = false;
|
345
|
+
}
|
346
|
+
// Alterna a visibilidade do calendário
|
347
|
+
toggleCalendar() {
|
348
|
+
this.isCalendarVisible = !this.isCalendarVisible;
|
349
|
+
}
|
350
|
+
// Formata a data e hora para exibição no input principal
|
215
351
|
formatDateForDisplay(date) {
|
216
352
|
const day = date.getDate().toString().padStart(2, '0');
|
217
353
|
const month = (date.getMonth() + 1).toString().padStart(2, '0');
|
@@ -224,72 +360,56 @@ export class CalendarArgentaComponent {
|
|
224
360
|
}
|
225
361
|
return formattedDate;
|
226
362
|
}
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
const
|
232
|
-
|
233
|
-
this.
|
234
|
-
|
235
|
-
|
363
|
+
// Formata a data para emitir no evento
|
364
|
+
formatDateForEmit(date) {
|
365
|
+
const day = date.getDate().toString().padStart(2, '0');
|
366
|
+
const month = (date.getMonth() + 1).toString().padStart(2, '0');
|
367
|
+
const year = date.getFullYear();
|
368
|
+
let formattedDate = `${day}/${month}/${year}`;
|
369
|
+
if (this.useTime) {
|
370
|
+
const hours = date.getHours().toString().padStart(2, '0');
|
371
|
+
const minutes = date.getMinutes().toString().padStart(2, '0');
|
372
|
+
formattedDate += ` - ${hours}:${minutes}`;
|
373
|
+
}
|
374
|
+
return formattedDate;
|
236
375
|
}
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
376
|
+
// Função para parsing de string para Date
|
377
|
+
parseDate(dateStr) {
|
378
|
+
const [datePart, timePart] = dateStr.split(' ');
|
379
|
+
const [day, month, year] = datePart.split('/').map(Number);
|
380
|
+
if (!day || !month || !year) {
|
381
|
+
return null;
|
241
382
|
}
|
242
|
-
|
243
|
-
|
383
|
+
const date = new Date(year, month - 1, day);
|
384
|
+
if (this.useTime && timePart) {
|
385
|
+
const [hour, minute] = timePart.split(':').map(Number);
|
386
|
+
date.setHours(hour || 0, minute || 0);
|
244
387
|
}
|
388
|
+
return date;
|
245
389
|
}
|
390
|
+
// Gera a lista de dias no mês atual
|
246
391
|
get daysInMonth() {
|
247
|
-
const firstDayOfMonth = new Date(this.currentYear, this.currentMonth, 1).getDay();
|
248
|
-
const totalDaysInMonth = new Date(this.currentYear, this.currentMonth + 1, 0).getDate();
|
249
|
-
const daysArray = Array.from({ length: totalDaysInMonth }, (_, i) => i + 1);
|
392
|
+
const firstDayOfMonth = new Date(this.currentYear, this.currentMonth, 1).getDay();
|
393
|
+
const totalDaysInMonth = new Date(this.currentYear, this.currentMonth + 1, 0).getDate();
|
394
|
+
const daysArray = Array.from({ length: totalDaysInMonth }, (_, i) => i + 1);
|
250
395
|
const leadingEmptyDays = Array(firstDayOfMonth).fill(null); // Dias vazios antes do primeiro dia do mês
|
251
|
-
return [...leadingEmptyDays, ...daysArray];
|
252
|
-
}
|
253
|
-
get months() {
|
254
|
-
return this.locales[this.locale]?.months || this.locales['en'].months;
|
255
|
-
}
|
256
|
-
get daysOfWeek() {
|
257
|
-
return this.locales[this.locale]?.daysOfWeek || this.locales['en'].daysOfWeek;
|
258
|
-
}
|
259
|
-
prevMonth() {
|
260
|
-
if (this.currentMonth === 0) {
|
261
|
-
this.currentMonth = 11;
|
262
|
-
this.currentYear--;
|
263
|
-
}
|
264
|
-
else {
|
265
|
-
this.currentMonth--;
|
266
|
-
}
|
267
|
-
}
|
268
|
-
nextMonth() {
|
269
|
-
if (this.currentMonth === 11) {
|
270
|
-
this.currentMonth = 0;
|
271
|
-
this.currentYear++;
|
272
|
-
}
|
273
|
-
else {
|
274
|
-
this.currentMonth++;
|
275
|
-
}
|
396
|
+
return [...leadingEmptyDays, ...daysArray];
|
276
397
|
}
|
398
|
+
// Verifica se um dia está selecionado
|
277
399
|
isSelected(day) {
|
278
400
|
if (!this.selectedDate)
|
279
401
|
return false;
|
280
402
|
const selectedDay = this.selectedDate.getDate();
|
281
403
|
const selectedMonth = this.selectedDate.getMonth();
|
282
404
|
const selectedYear = this.selectedDate.getFullYear();
|
283
|
-
return
|
284
|
-
selectedMonth === this.currentMonth &&
|
285
|
-
selectedYear === this.currentYear);
|
405
|
+
return selectedDay === day && selectedMonth === this.currentMonth && selectedYear === this.currentYear;
|
286
406
|
}
|
407
|
+
// Verifica se o dia é hoje
|
287
408
|
isToday(day) {
|
288
409
|
const today = new Date();
|
289
|
-
return
|
290
|
-
today.getMonth() === this.currentMonth &&
|
291
|
-
today.getDate() === day);
|
410
|
+
return today.getFullYear() === this.currentYear && today.getMonth() === this.currentMonth && today.getDate() === day;
|
292
411
|
}
|
412
|
+
// Verifica se a data está desabilitada
|
293
413
|
isDateDisabled(day) {
|
294
414
|
const date = new Date(this.currentYear, this.currentMonth, day);
|
295
415
|
if (this.minDate && date < this.minDate)
|
@@ -298,12 +418,47 @@ export class CalendarArgentaComponent {
|
|
298
418
|
return true;
|
299
419
|
return false;
|
300
420
|
}
|
421
|
+
// Verifica se um dia está no intervalo selecionado
|
422
|
+
isInRange(day) {
|
423
|
+
if (!this.selectedStartDate || !this.selectedEndDate)
|
424
|
+
return false;
|
425
|
+
const date = new Date(this.currentYear, this.currentMonth, day);
|
426
|
+
return date >= this.selectedStartDate && date <= this.selectedEndDate;
|
427
|
+
}
|
428
|
+
// Avança para o próximo mês
|
429
|
+
nextMonth() {
|
430
|
+
if (this.currentMonth === 11) {
|
431
|
+
this.currentMonth = 0;
|
432
|
+
this.currentYear++;
|
433
|
+
}
|
434
|
+
else {
|
435
|
+
this.currentMonth++;
|
436
|
+
}
|
437
|
+
}
|
438
|
+
// Retrocede para o mês anterior
|
439
|
+
prevMonth() {
|
440
|
+
if (this.currentMonth === 0) {
|
441
|
+
this.currentMonth = 11;
|
442
|
+
this.currentYear--;
|
443
|
+
}
|
444
|
+
else {
|
445
|
+
this.currentMonth--;
|
446
|
+
}
|
447
|
+
}
|
448
|
+
// Retorna a lista de meses de acordo com o locale
|
449
|
+
get months() {
|
450
|
+
return this.locales[this.locale]?.months || this.locales['en'].months;
|
451
|
+
}
|
452
|
+
// Retorna a lista de dias da semana de acordo com o locale
|
453
|
+
get daysOfWeek() {
|
454
|
+
return this.locales[this.locale]?.daysOfWeek || this.locales['en'].daysOfWeek;
|
455
|
+
}
|
301
456
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CalendarArgentaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
302
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CalendarArgentaComponent, selector: "argenta-calendar", inputs: { id: "id", placeholder: "placeholder", label: "label", minDate: "minDate", maxDate: "maxDate", locale: "locale", useTime: "useTime", initialDate: "initialDate" }, outputs: {
|
457
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CalendarArgentaComponent, selector: "argenta-calendar", inputs: { id: "id", placeholder: "placeholder", label: "label", minDate: "minDate", maxDate: "maxDate", locale: "locale", useTime: "useTime", initialDate: "initialDate", rangeMode: "rangeMode", startDate: "startDate", endDate: "endDate", closeButtonLabel: "closeButtonLabel" }, outputs: { rangeChange: "rangeChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"form-group\">\n <label [for]=\"id\" [ngClass]=\"'label-styles'\">{{ label }}</label>\n <div class=\"input-wrapper\">\n <input\n id=\"{{ id }}\"\n type=\"text\"\n class=\"custom-input\"\n [attr.placeholder]=\"rangeMode && useTime ? 'dd/MM/yyyy HH:mm - dd/MM/yyyy HH:mm' : \n rangeMode && !useTime ? 'dd/MM/yyyy - dd/MM/yyyy' :(!rangeMode && useTime ? 'dd/MM/yyyy HH:mm' : 'dd/MM/yyyy')\"\n [value]=\"inputDate\"\n (input)=\"onInputChange($event)\"\n (keypress)=\"handleKeyPress($event)\"\n (click)=\"toggleCalendar()\"\n />\n <lucide-icon name=\"calendar\" class=\"calendar-icon\"></lucide-icon>\n </div>\n\n <div *ngIf=\"invalidDate\" class=\"error-message\">\n {{ locales[locale].invalidDateMessage }}\n <span *ngIf=\"useTime\"> HH:mm.</span>\n </div>\n\n <div class=\"calendar-wrapper\">\n <div class=\"calendar-container\" [ngClass]=\"{ open: isCalendarVisible }\">\n <div class=\"calendar\">\n <div class=\"calendar-header\">\n <button (click)=\"prevMonth()\">‹</button>\n <span>{{ months[currentMonth] }} {{ currentYear }}</span>\n <button (click)=\"nextMonth()\">›</button>\n </div>\n\n <div class=\"calendar-body\">\n <div class=\"calendar-day-names\">\n <span *ngFor=\"let day of daysOfWeek\">{{ day }}</span>\n </div>\n\n <div class=\"calendar-days\">\n <span\n *ngFor=\"let day of daysInMonth; let i = index\"\n [class.today]=\"isToday(day)\"\n [class.selected]=\"isSelected(day)\"\n [class.in-range]=\"isInRange(day)\"\n [class.disabled]=\"isDateDisabled(day)\"\n (click)=\"day ? selectDate(day) : null\"\n >\n {{ day ? day : \"\" }}\n </span>\n </div>\n </div>\n\n <!-- Inputs para inser\u00E7\u00E3o das horas -->\n <div *ngIf=\"useTime\" class=\"time-inputs\">\n <!-- Campo de hora de in\u00EDcio -->\n <div *ngIf=\"rangeMode\" class=\"time-input\">\n <label>{{ locales[locale]?.startTimeLabel || 'Hora de In\u00EDcio' }}</label> <!-- Usando tradu\u00E7\u00E3o -->\n <input type=\"time\" [(ngModel)]=\"startTime\" (change)=\"onTimeChange('start')\" />\n </div>\n\n <!-- Campo de hora de fim -->\n <div *ngIf=\"rangeMode\" class=\"time-input\">\n <label>{{ locales[locale]?.endTimeLabel || 'Hora de Fim' }}</label> <!-- Usando tradu\u00E7\u00E3o -->\n <input type=\"time\" [(ngModel)]=\"endTime\" (change)=\"onTimeChange('end')\" />\n </div>\n\n <!-- Campo de hora \u00FAnica (se n\u00E3o for range) -->\n <div *ngIf=\"!rangeMode\" class=\"time-input\">\n <label>{{ locales[locale]?.startTimeLabel || 'Hora' }}</label> <!-- Usando o label de in\u00EDcio -->\n <input type=\"time\" [(ngModel)]=\"selectedTime\" (change)=\"onTimeChange('single')\" />\n </div>\n </div>\n\n <!-- Bot\u00E3o de fechar o calend\u00E1rio -->\n <button class=\"close-button\" (click)=\"closeCalendar()\">{{ closeButtonLabel }}</button>\n </div>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap\";body{font-family:Inter,sans-serif}.calendar-container{overflow:hidden;max-height:0;transition:max-height .4s ease;position:absolute;top:100%;left:0;z-index:9999;background-color:#fff;box-shadow:0 4px 12px #0000001a;width:auto;max-width:none}.calendar-wrapper{position:relative}@media (max-width: 300px){.calendar-container{width:100vw;left:0}}.calendar-container.open{max-height:500px}.calendar{display:inline-block;border:1px solid #ccc;border-radius:8px;padding:10px;width:450px;font-family:Inter,Arial,sans-serif;transition:max-height .4s ease;background-color:#f5f5f5}.calendar .calendar-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;font-weight:700}.calendar .calendar-header button{background-color:#00444c;color:#fff;border:none;padding:8px 12px;cursor:pointer;border-radius:8px;font-size:1.2rem;transition:background-color .2s}.calendar .calendar-header button:hover{background-color:#2ca58d}.calendar .calendar-header span{font-size:1.4rem;color:#00444c;text-align:center;flex-grow:1}.calendar .calendar-body{display:grid;grid-template-columns:repeat(7,1fr);gap:7px}.calendar .calendar-body .calendar-day-names{display:contents}.calendar .calendar-body .calendar-day-names span{text-align:center;font-weight:700;margin-bottom:5px;font-size:.9rem}.calendar .calendar-body .calendar-day-names span:nth-child(1){color:#ff8080}.calendar .calendar-body .calendar-day-names span:nth-child(7){color:#555}.calendar .calendar-body .calendar-days{display:contents}.calendar .calendar-body .calendar-days span{display:flex;justify-content:center;align-items:center;margin:1px;padding:10px;height:45px;width:45px;cursor:pointer;border-radius:50%;transition:background-color .2s,color .2s ease}.calendar .calendar-body .calendar-days span.today{background-color:#2ca58d;color:#fff}.calendar .calendar-body .calendar-days span.selected{background-color:#00444c;color:#fff}.calendar .calendar-body .calendar-days span.disabled{background-color:#e9ecef;color:#999;cursor:not-allowed}.calendar .calendar-body .calendar-days span:hover:not(.disabled){background-color:#2ca58d;color:#fff}.custom-input{font-family:Inter,Arial,sans-serif;color:#333;font-size:.9rem;height:46px;padding:.5rem .75rem;border:1px solid #ccc;border-radius:4px;width:100%;box-sizing:border-box}.custom-input::placeholder{font-size:14px;color:#d3d3d3}.label-styles{font-weight:400;font-family:Inter,Arial,sans-serif;font-size:16px;line-height:19.36px;text-align:left;margin-top:1rem;margin-bottom:.5rem}.error-message{position:relative;background-color:#ff8080;color:#fff;padding:10px;border-radius:8px;font-size:.9rem;max-width:250px;margin-top:5px}.error-message:after{content:\"\";position:absolute;top:100%;left:20px;border-width:10px;border-style:solid;border-color:#ff8080 transparent transparent transparent}.input-wrapper{position:relative;display:inline-block;width:100%}.input-wrapper .custom-input{width:100%;padding-right:40px;box-sizing:border-box}.input-wrapper .calendar-icon{position:absolute;top:50%;right:10px;transform:translateY(-50%);pointer-events:none;color:#b8b8b8}.calendar-days{display:contents}.calendar-days span{display:flex;justify-content:center;align-items:center;margin:1px;padding:10px;height:45px;width:45px;cursor:pointer;border-radius:50%;transition:background-color .2s,color .2s ease}.calendar-days span.today{background-color:#2ca58d;color:#fff;text-decoration:underline}.calendar-days span.selected{background-color:#00444c;color:#fff}.calendar-days span.in-range{background-color:#fd9;color:#000}.calendar-days span.disabled{background-color:#e9ecef;color:#999;cursor:not-allowed}.calendar-days span:hover:not(.disabled){background-color:#2ca58d;color:#fff}.calendar-body{position:relative}.close-button{float:right;margin-top:10px;background-color:#fff3cd;color:#383838;border:none;padding:6px 12px;cursor:pointer;border-radius:20px;font-size:12px;font-weight:500;transition:all .2s ease}.close-button:hover{background-color:#e9ebec;box-shadow:0 2px 4px #00000026}.close-button:active{transform:translateY(1px)}.time-inputs{display:flex;justify-content:space-between;margin-top:10px}.time-input{display:flex;flex-direction:column;width:45%}.time-input label{font-size:.9rem;margin-bottom:5px}.time-input input{padding:8px;font-size:.9rem;border:1px solid #ccc;border-radius:4px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }] }); }
|
303
458
|
}
|
304
459
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CalendarArgentaComponent, decorators: [{
|
305
460
|
type: Component,
|
306
|
-
args: [{ selector: 'argenta-calendar', template: "<div class=\"form-group\">\n <label [for]=\"id\" [ngClass]=\"'label-styles'\">{{ label }}</label>\n <div class=\"input-wrapper\">\n <input\n id=\"{{ id }}\"\n type=\"text\"\n class=\"custom-input\"\n [attr.placeholder]=\"useTime ? 'dd/MM/yyyy HH:mm' : 'dd/MM/yyyy'\"\n [value]=\"inputDate\"\n (input)=\"onInputChange($event)\"\n (keypress)=\"handleKeyPress($event)\"\n (click)=\"toggleCalendar()\"\n />\n
|
461
|
+
args: [{ selector: 'argenta-calendar', template: "<div class=\"form-group\">\n <label [for]=\"id\" [ngClass]=\"'label-styles'\">{{ label }}</label>\n <div class=\"input-wrapper\">\n <input\n id=\"{{ id }}\"\n type=\"text\"\n class=\"custom-input\"\n [attr.placeholder]=\"rangeMode && useTime ? 'dd/MM/yyyy HH:mm - dd/MM/yyyy HH:mm' : \n rangeMode && !useTime ? 'dd/MM/yyyy - dd/MM/yyyy' :(!rangeMode && useTime ? 'dd/MM/yyyy HH:mm' : 'dd/MM/yyyy')\"\n [value]=\"inputDate\"\n (input)=\"onInputChange($event)\"\n (keypress)=\"handleKeyPress($event)\"\n (click)=\"toggleCalendar()\"\n />\n <lucide-icon name=\"calendar\" class=\"calendar-icon\"></lucide-icon>\n </div>\n\n <div *ngIf=\"invalidDate\" class=\"error-message\">\n {{ locales[locale].invalidDateMessage }}\n <span *ngIf=\"useTime\"> HH:mm.</span>\n </div>\n\n <div class=\"calendar-wrapper\">\n <div class=\"calendar-container\" [ngClass]=\"{ open: isCalendarVisible }\">\n <div class=\"calendar\">\n <div class=\"calendar-header\">\n <button (click)=\"prevMonth()\">‹</button>\n <span>{{ months[currentMonth] }} {{ currentYear }}</span>\n <button (click)=\"nextMonth()\">›</button>\n </div>\n\n <div class=\"calendar-body\">\n <div class=\"calendar-day-names\">\n <span *ngFor=\"let day of daysOfWeek\">{{ day }}</span>\n </div>\n\n <div class=\"calendar-days\">\n <span\n *ngFor=\"let day of daysInMonth; let i = index\"\n [class.today]=\"isToday(day)\"\n [class.selected]=\"isSelected(day)\"\n [class.in-range]=\"isInRange(day)\"\n [class.disabled]=\"isDateDisabled(day)\"\n (click)=\"day ? selectDate(day) : null\"\n >\n {{ day ? day : \"\" }}\n </span>\n </div>\n </div>\n\n <!-- Inputs para inser\u00E7\u00E3o das horas -->\n <div *ngIf=\"useTime\" class=\"time-inputs\">\n <!-- Campo de hora de in\u00EDcio -->\n <div *ngIf=\"rangeMode\" class=\"time-input\">\n <label>{{ locales[locale]?.startTimeLabel || 'Hora de In\u00EDcio' }}</label> <!-- Usando tradu\u00E7\u00E3o -->\n <input type=\"time\" [(ngModel)]=\"startTime\" (change)=\"onTimeChange('start')\" />\n </div>\n\n <!-- Campo de hora de fim -->\n <div *ngIf=\"rangeMode\" class=\"time-input\">\n <label>{{ locales[locale]?.endTimeLabel || 'Hora de Fim' }}</label> <!-- Usando tradu\u00E7\u00E3o -->\n <input type=\"time\" [(ngModel)]=\"endTime\" (change)=\"onTimeChange('end')\" />\n </div>\n\n <!-- Campo de hora \u00FAnica (se n\u00E3o for range) -->\n <div *ngIf=\"!rangeMode\" class=\"time-input\">\n <label>{{ locales[locale]?.startTimeLabel || 'Hora' }}</label> <!-- Usando o label de in\u00EDcio -->\n <input type=\"time\" [(ngModel)]=\"selectedTime\" (change)=\"onTimeChange('single')\" />\n </div>\n </div>\n\n <!-- Bot\u00E3o de fechar o calend\u00E1rio -->\n <button class=\"close-button\" (click)=\"closeCalendar()\">{{ closeButtonLabel }}</button>\n </div>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap\";body{font-family:Inter,sans-serif}.calendar-container{overflow:hidden;max-height:0;transition:max-height .4s ease;position:absolute;top:100%;left:0;z-index:9999;background-color:#fff;box-shadow:0 4px 12px #0000001a;width:auto;max-width:none}.calendar-wrapper{position:relative}@media (max-width: 300px){.calendar-container{width:100vw;left:0}}.calendar-container.open{max-height:500px}.calendar{display:inline-block;border:1px solid #ccc;border-radius:8px;padding:10px;width:450px;font-family:Inter,Arial,sans-serif;transition:max-height .4s ease;background-color:#f5f5f5}.calendar .calendar-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;font-weight:700}.calendar .calendar-header button{background-color:#00444c;color:#fff;border:none;padding:8px 12px;cursor:pointer;border-radius:8px;font-size:1.2rem;transition:background-color .2s}.calendar .calendar-header button:hover{background-color:#2ca58d}.calendar .calendar-header span{font-size:1.4rem;color:#00444c;text-align:center;flex-grow:1}.calendar .calendar-body{display:grid;grid-template-columns:repeat(7,1fr);gap:7px}.calendar .calendar-body .calendar-day-names{display:contents}.calendar .calendar-body .calendar-day-names span{text-align:center;font-weight:700;margin-bottom:5px;font-size:.9rem}.calendar .calendar-body .calendar-day-names span:nth-child(1){color:#ff8080}.calendar .calendar-body .calendar-day-names span:nth-child(7){color:#555}.calendar .calendar-body .calendar-days{display:contents}.calendar .calendar-body .calendar-days span{display:flex;justify-content:center;align-items:center;margin:1px;padding:10px;height:45px;width:45px;cursor:pointer;border-radius:50%;transition:background-color .2s,color .2s ease}.calendar .calendar-body .calendar-days span.today{background-color:#2ca58d;color:#fff}.calendar .calendar-body .calendar-days span.selected{background-color:#00444c;color:#fff}.calendar .calendar-body .calendar-days span.disabled{background-color:#e9ecef;color:#999;cursor:not-allowed}.calendar .calendar-body .calendar-days span:hover:not(.disabled){background-color:#2ca58d;color:#fff}.custom-input{font-family:Inter,Arial,sans-serif;color:#333;font-size:.9rem;height:46px;padding:.5rem .75rem;border:1px solid #ccc;border-radius:4px;width:100%;box-sizing:border-box}.custom-input::placeholder{font-size:14px;color:#d3d3d3}.label-styles{font-weight:400;font-family:Inter,Arial,sans-serif;font-size:16px;line-height:19.36px;text-align:left;margin-top:1rem;margin-bottom:.5rem}.error-message{position:relative;background-color:#ff8080;color:#fff;padding:10px;border-radius:8px;font-size:.9rem;max-width:250px;margin-top:5px}.error-message:after{content:\"\";position:absolute;top:100%;left:20px;border-width:10px;border-style:solid;border-color:#ff8080 transparent transparent transparent}.input-wrapper{position:relative;display:inline-block;width:100%}.input-wrapper .custom-input{width:100%;padding-right:40px;box-sizing:border-box}.input-wrapper .calendar-icon{position:absolute;top:50%;right:10px;transform:translateY(-50%);pointer-events:none;color:#b8b8b8}.calendar-days{display:contents}.calendar-days span{display:flex;justify-content:center;align-items:center;margin:1px;padding:10px;height:45px;width:45px;cursor:pointer;border-radius:50%;transition:background-color .2s,color .2s ease}.calendar-days span.today{background-color:#2ca58d;color:#fff;text-decoration:underline}.calendar-days span.selected{background-color:#00444c;color:#fff}.calendar-days span.in-range{background-color:#fd9;color:#000}.calendar-days span.disabled{background-color:#e9ecef;color:#999;cursor:not-allowed}.calendar-days span:hover:not(.disabled){background-color:#2ca58d;color:#fff}.calendar-body{position:relative}.close-button{float:right;margin-top:10px;background-color:#fff3cd;color:#383838;border:none;padding:6px 12px;cursor:pointer;border-radius:20px;font-size:12px;font-weight:500;transition:all .2s ease}.close-button:hover{background-color:#e9ebec;box-shadow:0 2px 4px #00000026}.close-button:active{transform:translateY(1px)}.time-inputs{display:flex;justify-content:space-between;margin-top:10px}.time-input{display:flex;flex-direction:column;width:45%}.time-input label{font-size:.9rem;margin-bottom:5px}.time-input input{padding:8px;font-size:.9rem;border:1px solid #ccc;border-radius:4px}\n"] }]
|
307
462
|
}], propDecorators: { id: [{
|
308
463
|
type: Input
|
309
464
|
}], placeholder: [{
|
@@ -320,7 +475,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
320
475
|
type: Input
|
321
476
|
}], initialDate: [{
|
322
477
|
type: Input
|
323
|
-
}],
|
478
|
+
}], rangeMode: [{
|
479
|
+
type: Input
|
480
|
+
}], startDate: [{
|
481
|
+
type: Input
|
482
|
+
}], endDate: [{
|
483
|
+
type: Input
|
484
|
+
}], closeButtonLabel: [{
|
485
|
+
type: Input
|
486
|
+
}], rangeChange: [{
|
324
487
|
type: Output
|
325
488
|
}] } });
|
326
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItYXJnZW50YS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saWItcG9ydGFsLWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL2NhbGVuZGFyLWFyZ2VudGEvY2FsZW5kYXItYXJnZW50YS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saWItcG9ydGFsLWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL2NhbGVuZGFyLWFyZ2VudGEvY2FsZW5kYXItYXJnZW50YS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFvQyxNQUFNLGVBQWUsQ0FBQzs7OztBQU96RyxNQUFNLE9BQU8sd0JBQXdCO0lBTHJDO1FBTWEsT0FBRSxHQUFXLGtCQUFrQixDQUFDO1FBQ2hDLGdCQUFXLEdBQVcsZUFBZSxDQUFDO1FBQ3RDLFVBQUssR0FBVyxlQUFlLENBQUM7UUFDaEMsWUFBTyxHQUFnQixJQUFJLENBQUM7UUFDNUIsWUFBTyxHQUFnQixJQUFJLENBQUM7UUFDNUIsV0FBTSxHQUFXLElBQUksQ0FBQyxDQUFDLGtDQUFrQztRQUN6RCxZQUFPLEdBQVksS0FBSyxDQUFDLENBQUMsMENBQTBDO1FBQ3BFLGdCQUFXLEdBQWtCLElBQUksQ0FBQyxDQUFDLDBDQUEwQztRQUM1RSxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUVsRCxnQkFBVyxHQUFXLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0MsaUJBQVksR0FBVyxJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzdDLGlCQUFZLEdBQWdCLElBQUksQ0FBQztRQUNqQyxzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkMsY0FBUyxHQUFXLEVB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QU8sSUFBSSxDQUFDO1FBQ3JELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7K0dBblZRLHdCQUF3QjttR0FBeEIsd0JBQXdCLGdTQ1ByQyx3aUVBd0RBOzs0RkRqRGEsd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNJLGtCQUFrQjs4QkFLbkIsRUFBRTtzQkFBVixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcmdlbnRhLWNhbGVuZGFyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXItYXJnZW50YS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY2FsZW5kYXItYXJnZW50YS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBDYWxlbmRhckFyZ2VudGFDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gICAgQElucHV0KCkgaWQ6IHN0cmluZyA9ICdhcmdlbnRhLWNhbGVuZGFyJztcbiAgICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlbGVjdCBhIGRhdGUnO1xuICAgIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnU2VsZWN0IGEgZGF0ZSc7XG4gICAgQElucHV0KCkgbWluRGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIEBJbnB1dCgpIG1heERhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICBASW5wdXQoKSBsb2NhbGU6IHN0cmluZyA9ICdwdCc7IC8vIFN1cG9ydGUgcGFyYSBkaWZlcmVudGVzIGlkaW9tYXNcbiAgICBASW5wdXQoKSB1c2VUaW1lOiBib29sZWFuID0gZmFsc2U7IC8vIFByb3ByaWVkYWRlIHBhcmEgZGVmaW5pciBzZSBpbmNsdWkgaG9yYVxuICAgIEBJbnB1dCgpIGluaXRpYWxEYXRlOiBzdHJpbmcgfCBudWxsID0gbnVsbDsgLy8gUHJvcHJpZWRhZGUgcGFyYSByZWNlYmVyIGEgZGF0YSBpbmljaWFsXG4gICAgQE91dHB1dCgpIGRhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAgIGN1cnJlbnRZZWFyOiBudW1iZXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gICAgY3VycmVudE1vbnRoOiBudW1iZXIgPSBuZXcgRGF0ZSgpLmdldE1vbnRoKCk7XG4gICAgc2VsZWN0ZWREYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgaXNDYWxlbmRhclZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBpbnB1dERhdGU6IHN0cmluZyA9ICcnO1xuICAgIGludmFsaWREYXRlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBsb2NhbGVzOiBhbnkgPSB7XG4gICAgICAgIGVuOiB7XG4gICAgICAgICAgICBtb250aHM6IFtcbiAgICAgICAgICAgICAgICAnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JyxcbiAgICAgICAgICAgICAgICAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGRheXNPZldlZWs6IFsnU3UnLCAnTW8nLCAnVHUnLCAnV2UnLCAnVGgnLCAnRnInLCAnU2EnXSxcbiAgICAgICAgICAgIGludmFsaWREYXRlTWVzc2FnZTogJ0ludmFsaWQgZGF0ZS4gUGxlYXNlIGVudGVyIGEgZGF0ZSBpbiB0aGUgZm9ybWF0IGRkL01NL3l5eXknXG4gICAgICAgIH0sXG4gICAgICAgIHB0OiB7XG4gICAgICAgICAgICBtb250aHM6IFtcbiAgICAgICAgICAgICAgICAnSmFuZWlybycsICdGZXZlcmVpcm8nLCAnTWFyw6dvJywgJ0FicmlsJywgJ01haW8nLCAnSnVuaG8nLCAnSnVsaG8nLFxuICAgICAgICAgICAgICAgICdBZ29zdG8nLCAnU2V0ZW1icm8nLCAnT3V0dWJybycsICdOb3ZlbWJybycsICdEZXplbWJybydcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBkYXlzT2ZXZWVrOiBbJ0RvbScsICdTZWcnLCAnVGVyJywgJ1F1YScsICdRdWknLCAnU2V4JywgJ1PDoWInXSxcbiAgICAgICAgICAgIGludmFsaWREYXRlTWVzc2FnZTogJ0RhdGEgaW52w6FsaWRhLiBQb3IgZmF2b3IsIGluc2lyYSB1bWEgZGF0YSBubyBmb3JtYXRvIGRkL01NL3l5eXknXG4gICAgICAgIH0sXG4gICAgICAgIGVzOiB7XG4gICAgICAgICAgICBtb250aHM6IFtcbiAgICAgICAgICAgICAgICAnRW5lcm8nLCAnRmVicmVybycsICdNYXJ6bycsICdBYnJpbCcsICdNYXlvJywgJ0p1bmlvJywgJ0p1bGlvJyxcbiAgICAgICAgICAgICAgICAnQWdvc3RvJywgJ1NlcHRpZW1icmUnLCAnT2N0dWJyZScsICdOb3ZpZW1icmUnLCAnRGljaWVtYnJlJ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGRheXNPZldlZWs6IFsnRG8nLCAnTHUnLCAnTWEnLCAnTWknLCAnSnUnLCAnVmknLCAnU8OhJ10sXG4gICAgICAgICAgICBpbnZhbGlkRGF0ZU1lc3NhZ2U6ICdGZWNoYSBpbnbDoWxpZGEuIFBvciBmYXZvciwgaW5ncmVzZSB1bmEgZmVjaGEgZW4gZWwgZm9ybWF0byBkZC9NTS95eXl5J1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pbml0aWFsRGF0ZSkge1xuICAgICAgICAgICAgLy8gU2UgYSBpbml0aWFsRGF0ZSBmb3IgZm9ybmVjaWRhLCB1c2Ftb3MgZWxhXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFyKHRoaXMuaW5pdGlhbERhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQ2FzbyBjb250csOhcmlvLCB1c2Ftb3MgYSBkYXRhIGF0dWFsXG4gICAgICAgICAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHRvZGF5O1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdERhdGVGb3JEaXNwbGF5KHRvZGF5KTtcbiAgICAgICAgICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KHRoaXMuaW5wdXREYXRlKTsgLy8gRW1pdGUgYSBkYXRhIGluaWNpYWxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxEYXRlJ10gJiYgY2hhbmdlc1snaW5pdGlhbERhdGUnXS5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FsZW5kYXIoY2hhbmdlc1snaW5pdGlhbERhdGUnXS5jdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTcOpdG9kbyBwYXJhIGF0dWFsaXphciBvIGNhbGVuZMOhcmlvIGNvbSBhIGRhdGEgcGFzc2FkYVxuICAgIHVwZGF0ZUNhbGVuZGFyKGRhdGVTdHJpbmc6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJzZWREYXRlID0gdGhpcy5wYXJzZURhdGUoZGF0ZVN0cmluZyk7XG5cbiAgICAgICAgLy8gVmVyaWZpY2Egc2UgYSBkYXRhIMOpIHbDoWxpZGFcbiAgICAgICAgaWYgKHBhcnNlZERhdGUgIT09IG51bGwgJiYgdGhpcy52YWxpZGF0ZURhdGUoZGF0ZVN0cmluZykpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gcGFyc2VkRGF0ZTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFllYXIgPSBwYXJzZWREYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRNb250aCA9IHBhcnNlZERhdGUuZ2V0TW9udGgoKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5mb3JtYXREYXRlRm9yRGlzcGxheShwYXJzZWREYXRlKTtcbiAgICAgICAgICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KHRoaXMuaW5wdXREYXRlKTsgLy8gRW1pdGUgYSBub3ZhIGRhdGFcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZERhdGUgPSBmYWxzZTsgLy8gUmVtb3ZlIG8gc3RhdHVzIGRlIGRhdGEgaW52w6FsaWRhXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmludmFsaWREYXRlID0gdHJ1ZTsgLy8gTWFyY2EgYSBkYXRhIGNvbW8gaW52w6FsaWRhXG4gICAgICAgICAgICB0aGlzLmRhdGVDaGFuZ2UuZW1pdCgnRGF0YSBvdSBob3JhIGludsOhbGlkYScpOyAvLyBFbWl0ZSBtZW5zYWdlbSBkZSBlcnJvXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRGF0YSBvdSBob3JhIGludsOhbGlkYSBwYXNzYWRhIHBhcmEgbyBjb21wb25lbnRlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbklucHV0Q2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXRWYWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmFwcGx5RGF0ZU1hc2soaW5wdXRWYWx1ZSk7XG5cbiAgICAgICAgLy8gVmFsaWRhw6fDo28gcGFyYSBvYnJpZ2FyIGEgaG9yYSBxdWFuZG8gdXNlVGltZSBmb3IgdmVyZGFkZWlyb1xuICAgICAgICBpZiAodGhpcy51c2VUaW1lKSB7XG4gICAgICAgICAgICAvLyBTZSBhIGVudHJhZGEgbsOjbyB0aXZlciBvIGNvbXByaW1lbnRvIGNvcnJldG8gcGFyYSBkYXRhICsgaG9yYVxuICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXREYXRlLmxlbmd0aCA8IDE2KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkRGF0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlQ2hhbmdlLmVtaXQoJ0RhdGEgb3UgaG9yYSBpbnbDoWxpZGEnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb21lbnRlIHZhbGlkYXIgYSBob3JhIHNlIG8gY2FtcG8gdXNlVGltZSBlc3RpdmVyIGF0aXZvIGUgbyBmb3JtYXRvIGVzdGl2ZXIgY29ycmV0b1xuICAgICAgICBpZiAodGhpcy51c2VUaW1lICYmIHRoaXMuaW5wdXREYXRlLmxlbmd0aCA+PSAxNCkge1xuICAgICAgICAgICAgY29uc3QgW2RhdGVQYXJ0LCB0aW1lUGFydF0gPSB0aGlzLmlucHV0RGF0ZS5zcGxpdCgnICcpO1xuICAgICAgICAgICAgaWYgKHRpbWVQYXJ0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2hvdXJTdHIsIG1pbnV0ZVN0cl0gPSB0aW1lUGFydC5zcGxpdCgnOicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvdXIgPSBOdW1iZXIoaG91clN0cik7XG4gICAgICAgICAgICAgICAgY29uc3QgbWludXRlID0gTnVtYmVyKG1pbnV0ZVN0cik7XG5cbiAgICAgICAgICAgICAgICAvLyBDb3JyaWdlIHNvbWVudGUgc2UgYSBob3JhL21pbnV0byBmb3JlbSBpbnbDoWxpZG9zXG4gICAgICAgICAgICAgICAgaWYgKGhvdXIgPCAwIHx8IGhvdXIgPiAyMyB8fCBpc05hTihob3VyKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWREYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlQ2hhbmdlLmVtaXQoJ0hvcmEgaW52w6FsaWRhJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZSA8IDAgfHwgbWludXRlID4gNTkgfHwgaXNOYU4obWludXRlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWREYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlQ2hhbmdlLmVtaXQoJ0hvcmEgaW52w6FsaWRhJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWREYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdGlyIGEgZGF0YSBxdWFuZG8gZm9yIHbDoWxpZGFcbiAgICAgICAgaWYgKCh0aGlzLnVzZVRpbWUgJiYgdGhpcy5pbnB1dERhdGUubGVuZ3RoID09PSAxNikgfHwgKCF0aGlzLnVzZVRpbWUgJiYgdGhpcy5pbnB1dERhdGUubGVuZ3RoID09PSAxMCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXRlRGF0ZSh0aGlzLmlucHV0RGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmludmFsaWREYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkRGF0ZSA9IHRoaXMucGFyc2VEYXRlKHRoaXMuaW5wdXREYXRlKTtcblxuICAgICAgICAgICAgICAgIC8vIFZlcmlmaWNhciBzZSBwYXJzZWREYXRlIG7Do28gw6kgbnVsbyBhbnRlcyBkZSBhY2Vzc2FyIHN1YXMgcHJvcHJpZWRhZGVzXG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZERhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50WWVhciA9IHBhcnNlZERhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TW9udGggPSBwYXJzZWREYXRlLmdldE1vbnRoKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gcGFyc2VkRGF0ZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBGb3JtYXRhciBhIGRhdGEgcGFyYSBkZC9NTS95eXl5IC0gSEg6bW1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IHRoaXMuZm9ybWF0RGF0ZUZvckVtaXQocGFyc2VkRGF0ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlQ2hhbmdlLmVtaXQoZm9ybWF0dGVkRGF0ZSk7IC8vIEVtaXRlIGEgZGF0YSB2w6FsaWRhIGNvbSBvIGjDrWZlblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEYXRhIGludsOhbGlkYSBwYXNzYWRhIHBhcmEgbyBjb21wb25lbnRlLicpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVDaGFuZ2UuZW1pdCgnRGF0YSBpbnbDoWxpZGEnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZERhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KCdEYXRhIGludsOhbGlkYScpOyAvLyBFbWl0ZSBvIGV2ZW50byBjb20gbWVuc2FnZW0gZGUgZXJyb1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0YXIgYSBkYXRhIGUgaG9yYSBjb20gaMOtZmVuXG4gICAgZm9ybWF0RGF0ZUZvckVtaXQoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgICAgY29uc3QgbW9udGggPSAoZGF0ZS5nZXRNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuXG4gICAgICAgIGxldCBmb3JtYXR0ZWREYXRlID0gYCR7ZGF5fS8ke21vbnRofS8ke3llYXJ9YDtcblxuICAgICAgICBpZiAodGhpcy51c2VUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgICAgICBjb25zdCBtaW51dGVzID0gZGF0ZS5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICAgICAgLy8gQWRpY2lvbmEgbyBow61mZW4gZW50cmUgYSBkYXRhIGUgYSBob3JhXG4gICAgICAgICAgICBmb3JtYXR0ZWREYXRlICs9IGAgLSAke2hvdXJzfToke21pbnV0ZXN9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtYXR0ZWREYXRlO1xuICAgIH1cblxuICAgIGFwcGx5RGF0ZU1hc2soaW5wdXRWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGRpZ2l0c09ubHkgPSBpbnB1dFZhbHVlLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG5cbiAgICAgICAgLy8gTGltaXRhIG9zIGTDrWdpdG9zIGNvbSBiYXNlIG5vIHVzbyBkZSBob3JhXG4gICAgICAgIGNvbnN0IG1heExlbmd0aCA9IHRoaXMudXNlVGltZSA/IDEyIDogODtcbiAgICAgICAgaWYgKGRpZ2l0c09ubHkubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICBkaWdpdHNPbmx5ID0gZGlnaXRzT25seS5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkYXkgPSBkaWdpdHNPbmx5LnN1YnN0cmluZygwLCAyKTtcbiAgICAgICAgbGV0IG1vbnRoID0gZGlnaXRzT25seS5zdWJzdHJpbmcoMiwgNCk7XG4gICAgICAgIGxldCB5ZWFyID0gZGlnaXRzT25seS5zdWJzdHJpbmcoNCwgOCk7XG4gICAgICAgIGxldCBob3VyID0gZGlnaXRzT25seS5zdWJzdHJpbmcoOCwgMTApO1xuICAgICAgICBsZXQgbWludXRlID0gZGlnaXRzT25seS5zdWJzdHJpbmcoMTAsIDEyKTtcblxuICAgICAgICBsZXQgbWFza2VkRGF0ZSA9IGAke2RheX0vJHttb250aH0vJHt5ZWFyfWA7XG4gICAgICAgIGlmICh0aGlzLnVzZVRpbWUgJiYgaG91ciAmJiBtaW51dGUpIHtcbiAgICAgICAgICAgIG1hc2tlZERhdGUgKz0gYCAke2hvdXJ9OiR7bWludXRlfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWFza2VkRGF0ZTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZURhdGUoaW5wdXRWYWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IFtkYXRlUGFydCwgdGltZVBhcnRdID0gaW5wdXRWYWx1ZS5zcGxpdCgnICcpO1xuICAgICAgICBjb25zdCBbZGF5U3RyLCBtb250aFN0ciwgeWVhclN0cl0gPSBkYXRlUGFydC5zcGxpdCgnLycpO1xuICAgICAgICBjb25zdCBkYXkgPSBOdW1iZXIoZGF5U3RyKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBOdW1iZXIobW9udGhTdHIpO1xuICAgICAgICBjb25zdCB5ZWFyID0gTnVtYmVyKHllYXJTdHIpO1xuXG4gICAgICAgIC8vIFZhbGlkYcOnw6NvIGRlIGRhdGFcbiAgICAgICAgaWYgKG1vbnRoIDwgMSB8fCBtb250aCA+IDEyIHx8IHllYXJTdHIubGVuZ3RoICE9PSA0IHx8IGlzTmFOKHllYXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYXN0RGF5T2ZNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAwKS5nZXREYXRlKCk7XG4gICAgICAgIGlmIChkYXkgPCAxIHx8IGRheSA+IGxhc3REYXlPZk1vbnRoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGHDp8OjbyBkZSBob3JhXG4gICAgICAgIGlmICh0aGlzLnVzZVRpbWUgJiYgdGltZVBhcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IFtob3VyU3RyLCBtaW51dGVTdHJdID0gdGltZVBhcnQuc3BsaXQoJzonKTtcbiAgICAgICAgICAgIGNvbnN0IGhvdXIgPSBOdW1iZXIoaG91clN0cik7XG4gICAgICAgICAgICBjb25zdCBtaW51dGUgPSBOdW1iZXIobWludXRlU3RyKTtcblxuICAgICAgICAgICAgaWYgKGhvdXIgPCAwIHx8IGhvdXIgPiAyMyB8fCBtaW51dGUgPCAwIHx8IG1pbnV0ZSA+IDU5IHx8IGlzTmFOKGhvdXIpIHx8IGlzTmFOKG1pbnV0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEhvcmEgb3UgbWludXRvIGludsOhbGlkb3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHBhcnNlRGF0ZShkYXRlU3RyOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IFtkYXRlUGFydCwgdGltZVBhcnRdID0gZGF0ZVN0ci5zcGxpdCgnICcpO1xuICAgICAgICBjb25zdCBbZGF5LCBtb250aCwgeWVhcl0gPSBkYXRlUGFydC5zcGxpdCgnLycpLm1hcChOdW1iZXIpO1xuICAgICAgICBpZiAoIWRheSB8fCAhbW9udGggfHwgIXllYXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KTtcbiAgICAgICAgaWYgKHRoaXMudXNlVGltZSAmJiB0aW1lUGFydCkge1xuICAgICAgICAgICAgY29uc3QgW2hvdXIsIG1pbnV0ZV0gPSB0aW1lUGFydC5zcGxpdCgnOicpLm1hcChOdW1iZXIpO1xuICAgICAgICAgICAgZGF0ZS5zZXRIb3Vycyhob3VyIHx8IDAsIG1pbnV0ZSB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICBmb3JtYXREYXRlRm9yRGlzcGxheShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICBjb25zdCBtb250aCA9IChkYXRlLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGxldCBmb3JtYXR0ZWREYXRlID0gYCR7ZGF5fS8ke21vbnRofS8ke3llYXJ9YDtcblxuICAgICAgICBpZiAodGhpcy51c2VUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgICAgICBjb25zdCBtaW51dGVzID0gZGF0ZS5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICAgICAgZm9ybWF0dGVkRGF0ZSArPSBgICR7aG91cnN9OiR7bWludXRlc31gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZERhdGU7XG4gICAgfVxuXG4gICAgdG9nZ2xlQ2FsZW5kYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNDYWxlbmRhclZpc2libGUgPSAhdGhpcy5pc0NhbGVuZGFyVmlzaWJsZTtcbiAgICB9XG5cbiAgICBzZWxlY3REYXRlKGRheTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmN1cnJlbnRZZWFyLCB0aGlzLmN1cnJlbnRNb250aCwgZGF5KTtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdERhdGVGb3JEaXNwbGF5KGRhdGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGRhdGU7IC8vIEFybWF6ZW5hIGEgZGF0YSBzZWxlY2lvbmFkYVxuICAgICAgICB0aGlzLmRhdGVDaGFuZ2UuZW1pdCh0aGlzLmlucHV0RGF0ZSk7IC8vIEVtaXRlIGEgZGF0YSBzZWxlY2lvbmFkYSBhbyBjbGljYXIgbm8gY2FsZW5kw6FyaW9cbiAgICAgICAgdGhpcy5pc0NhbGVuZGFyVmlzaWJsZSA9IGZhbHNlOyAvLyBGZWNoYSBvIGNhbGVuZMOhcmlvIGFww7NzIGEgc2VsZcOnw6NvXG4gICAgfVxuXG4gICAgaGFuZGxlS2V5UHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2hhckNvZGUgPSBldmVudC5rZXkuY2hhckNvZGVBdCgwKTtcblxuICAgICAgICBpZiAoY2hhckNvZGUgPCA0OCB8fCBjaGFyQ29kZSA+IDU3KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5wdXREYXRlLnJlcGxhY2UoL1xcRC9nLCAnJykubGVuZ3RoID49ICh0aGlzLnVzZVRpbWUgPyAxMiA6IDgpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGRheXNJbk1vbnRoKCk6IGFueVtdIHtcbiAgICAgICAgY29uc3QgZmlyc3REYXlPZk1vbnRoID0gbmV3IERhdGUodGhpcy5jdXJyZW50WWVhciwgdGhpcy5jdXJyZW50TW9udGgsIDEpLmdldERheSgpOyAvLyBEaWEgZGEgc2VtYW5hIGRvIHByaW1laXJvIGRpYSBkbyBtw6pzXG4gICAgICAgIGNvbnN0IHRvdGFsRGF5c0luTW9udGggPSBuZXcgRGF0ZSh0aGlzLmN1cnJlbnRZZWFyLCB0aGlzLmN1cnJlbnRNb250aCArIDEsIDApLmdldERhdGUoKTsgLy8gVG90YWwgZGUgZGlhcyBubyBtw6pzXG5cbiAgICAgICAgY29uc3QgZGF5c0FycmF5ID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdG90YWxEYXlzSW5Nb250aCB9LCAoXywgaSkgPT4gaSArIDEpOyAvLyBBcnJheSBjb20gdG9kb3Mgb3MgZGlhcyBkbyBtw6pzXG5cbiAgICAgICAgY29uc3QgbGVhZGluZ0VtcHR5RGF5cyA9IEFycmF5KGZpcnN0RGF5T2ZNb250aCkuZmlsbChudWxsKTsgLy8gRGlhcyB2YXppb3MgYW50ZXMgZG8gcHJpbWVpcm8gZGlhIGRvIG3DqnNcblxuICAgICAgICByZXR1cm4gWy4uLmxlYWRpbmdFbXB0eURheXMsIC4uLmRheXNBcnJheV07IC8vIFJldG9ybmEgb3MgZGlhcyB2YXppb3Mgc2VndWlkb3MgcGVsb3MgZGlhcyBkbyBtw6pzXG4gICAgfVxuXG5cblxuICAgIGdldCBtb250aHMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVzW3RoaXMubG9jYWxlXT8ubW9udGhzIHx8IHRoaXMubG9jYWxlc1snZW4nXS5tb250aHM7XG4gICAgfVxuXG4gICAgZ2V0IGRheXNPZldlZWsoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVzW3RoaXMubG9jYWxlXT8uZGF5c09mV2VlayB8fCB0aGlzLmxvY2FsZXNbJ2VuJ10uZGF5c09mV2VlaztcbiAgICB9XG5cbiAgICBwcmV2TW9udGgoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRNb250aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TW9udGggPSAxMTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFllYXItLTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1vbnRoLS07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZXh0TW9udGgoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRNb250aCA9PT0gMTEpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gMDtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFllYXIrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1vbnRoKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc1NlbGVjdGVkKGRheTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZERhdGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXkgPSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXREYXRlKCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTW9udGggPSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRNb250aCgpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZFllYXIgPSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRGdWxsWWVhcigpO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBzZWxlY3RlZERheSA9PT0gZGF5ICYmXG4gICAgICAgICAgICBzZWxlY3RlZE1vbnRoID09PSB0aGlzLmN1cnJlbnRNb250aCAmJlxuICAgICAgICAgICAgc2VsZWN0ZWRZZWFyID09PSB0aGlzLmN1cnJlbnRZZWFyXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaXNUb2RheShkYXk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0b2RheS5nZXRGdWxsWWVhcigpID09PSB0aGlzLmN1cnJlbnRZZWFyICYmXG4gICAgICAgICAgICB0b2RheS5nZXRNb250aCgpID09PSB0aGlzLmN1cnJlbnRNb250aCAmJlxuICAgICAgICAgICAgdG9kYXkuZ2V0RGF0ZSgpID09PSBkYXlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpc0RhdGVEaXNhYmxlZChkYXk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGhpcy5jdXJyZW50WWVhciwgdGhpcy5jdXJyZW50TW9udGgsIGRheSk7XG4gICAgICAgIGlmICh0aGlzLm1pbkRhdGUgJiYgZGF0ZSA8IHRoaXMubWluRGF0ZSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh0aGlzLm1heERhdGUgJiYgZGF0ZSA+IHRoaXMubWF4RGF0ZSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICA8bGFiZWwgW2Zvcl09XCJpZFwiIFtuZ0NsYXNzXT1cIidsYWJlbC1zdHlsZXMnXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxuICAgIDxpbnB1dFxuICAgICAgaWQ9XCJ7eyBpZCB9fVwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICBjbGFzcz1cImN1c3RvbS1pbnB1dFwiXG4gICAgICBbYXR0ci5wbGFjZWhvbGRlcl09XCJ1c2VUaW1lID8gJ2RkL01NL3l5eXkgSEg6bW0nIDogJ2RkL01NL3l5eXknXCJcbiAgICAgIFt2YWx1ZV09XCJpbnB1dERhdGVcIlxuICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAoa2V5cHJlc3MpPVwiaGFuZGxlS2V5UHJlc3MoJGV2ZW50KVwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlQ2FsZW5kYXIoKVwiXG4gICAgLz5cbiAgICA8IS0tIMONY29uZSBkZSBjYWxlbmTDoXJpbyBkZW50cm8gZG8gaW5wdXQgLS0+XG4gICAgPGx1Y2lkZS1pY29uIG5hbWU9XCJjYWxlbmRhclwiIGNsYXNzPVwiY2FsZW5kYXItaWNvblwiPjwvbHVjaWRlLWljb24+XG4gIDwvZGl2PlxuXG4gIDwhLS0gTWVuc2FnZW0gZGUgZXJybyBlc3RpbG8gYmFsw6NvemluaG8gLS0+XG4gIDxkaXYgKm5nSWY9XCJpbnZhbGlkRGF0ZVwiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlxuICAgIHt7IGxvY2FsZXNbbG9jYWxlXS5pbnZhbGlkRGF0ZU1lc3NhZ2UgfX1cbiAgICA8IS0tIE1vc3RyYSBhIHBhcnRlIGRlICdISDptbScgYXBlbmFzIHNlIHVzZVRpbWUgZm9yIHZlcmRhZGVpcm8gLS0+XG4gICAgPHNwYW4gKm5nSWY9XCJ1c2VUaW1lXCI+IEhIOm1tLjwvc3Bhbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLXdyYXBwZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY29udGFpbmVyXCIgW25nQ2xhc3NdPVwieyBvcGVuOiBpc0NhbGVuZGFyVmlzaWJsZSB9XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWhlYWRlclwiPlxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInByZXZNb250aCgpXCI+JiM4MjQ5OzwvYnV0dG9uPlxuICAgICAgICAgIDxzcGFuPnt7IG1vbnRoc1tjdXJyZW50TW9udGhdIH19IHt7IGN1cnJlbnRZZWFyIH19PC9zcGFuPlxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm5leHRNb250aCgpXCI+JiM4MjUwOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItYm9keVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1kYXktbmFtZXNcIj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBkYXkgb2YgZGF5c09mV2Vla1wiPnt7IGRheSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1kYXlzXCI+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF5IG9mIGRheXNJbk1vbnRoOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgW2NsYXNzLnRvZGF5XT1cImlzVG9kYXkoZGF5KVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJpc1NlbGVjdGVkKGRheSlcIlxuICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiaXNEYXRlRGlzYWJsZWQoZGF5KVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJkYXkgPyBzZWxlY3REYXRlKGRheSkgOiBudWxsXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPCEtLSBTb21lbnRlIHBlcm1pdGUgY2xpcXVlIGVtIGRpYXMgdsOhbGlkb3MgLS0+XG4gICAgICAgICAgICAgIHt7IGRheSA/IGRheSA6IFwiXCIgfX1cbiAgICAgICAgICAgICAgPCEtLSBFeGliZSBvIGRpYSBzZSBmb3IgdsOhbGlkbywgc2Vuw6NvIGV4aWJlIHZhemlvIC0tPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
489
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItYXJnZW50YS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saWItcG9ydGFsLWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL2NhbGVuZGFyLWFyZ2VudGEvY2FsZW5kYXItYXJnZW50YS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saWItcG9ydGFsLWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL2NhbGVuZGFyLWFyZ2VudGEvY2FsZW5kYXItYXJnZW50YS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFvQyxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFPekcsTUFBTSxPQUFPLHdCQUF3QjtJQUxyQztRQU1hLE9BQUUsR0FBVyxrQkFBa0IsQ0FBQztRQUNoQyxnQkFBVyxHQUFXLGVBQWUsQ0FBQztRQUN0QyxVQUFLLEdBQVcsZUFBZSxDQUFDO1FBQ2hDLFlBQU8sR0FBZ0IsSUFBSSxDQUFDO1FBQzVCLFlBQU8sR0FBZ0IsSUFBSSxDQUFDO1FBQzVCLFdBQU0sR0FBVyxJQUFJLENBQUM7UUFDdEIsWUFBTyxHQUFZLEtBQUssQ0FBQyxDQUFDLHdCQUF3QjtRQUNsRCxnQkFBVyxHQUFrQixJQUFJLENBQUMsQ0FBQyxxQ0FBcUM7UUFDeEUsY0FBUyxHQUFZLEtBQUssQ0FBQyxDQUFDLHFDQUFxQztRQUNqRSxjQUFTLEdBQWtCLElBQUksQ0FBQyxDQUFDLDhCQUE4QjtRQUMvRCxZQUFPLEdBQWtCLElBQUksQ0FBQyxDQUFDLDJCQUEyQjtRQUMxRCxxQkFBZ0IsR0FBVyxRQUFRLENBQUMsQ0FBQywyQkFBMkI7UUFDL0QsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBa0MsQ0FBQyxDQUFDLDJDQUEyQztRQUV2SCxnQkFBVyxHQUFXLElB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TSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzFFLENBQUM7SUFFRCwyREFBMkQ7SUFDM0QsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxVQUFVLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDbEYsQ0FBQzsrR0ExZVEsd0JBQXdCO21HQUF4Qix3QkFBd0IsNFlDUHJDLCtzR0E2RUE7OzRGRHRFYSx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0ksa0JBQWtCOzhCQUtuQixFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FyZ2VudGEtY2FsZW5kYXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci1hcmdlbnRhLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci1hcmdlbnRhLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyQXJnZW50YUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICBASW5wdXQoKSBpZDogc3RyaW5nID0gJ2FyZ2VudGEtY2FsZW5kYXInO1xuICAgIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VsZWN0IGEgZGF0ZSc7XG4gICAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9ICdTZWxlY3QgYSBkYXRlJztcbiAgICBASW5wdXQoKSBtaW5EYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgQElucHV0KCkgbWF4RGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIEBJbnB1dCgpIGxvY2FsZTogc3RyaW5nID0gJ3B0JztcbiAgICBASW5wdXQoKSB1c2VUaW1lOiBib29sZWFuID0gZmFsc2U7IC8vIEluY2x1aXIgb3UgbsOjbyBhIGhvcmFcbiAgICBASW5wdXQoKSBpbml0aWFsRGF0ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vIERhdGEgaW5pY2lhbCBubyBtb2RvIGRlIGRhdGEgw7puaWNhXG4gICAgQElucHV0KCkgcmFuZ2VNb2RlOiBib29sZWFuID0gZmFsc2U7IC8vIEF0aXZhIG8gbW9kbyBkZSBpbnRlcnZhbG8gZGUgZGF0YXNcbiAgICBASW5wdXQoKSBzdGFydERhdGU6IHN0cmluZyB8IG51bGwgPSBudWxsOyAvLyBEYXRhIGRlIGluw61jaW8gZG8gaW50ZXJ2YWxvXG4gICAgQElucHV0KCkgZW5kRGF0ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vIERhdGEgZGUgZmltIGRvIGludGVydmFsb1xuICAgIEBJbnB1dCgpIGNsb3NlQnV0dG9uTGFiZWw6IHN0cmluZyA9ICdGZWNoYXInOyAvLyBUZXh0byBkbyBib3TDo28gZGUgZmVjaGFyXG4gICAgQE91dHB1dCgpIHJhbmdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nIH0+KCk7IC8vIEV2ZW50byBxdWUgZW1pdGUgZGF0YSDDum5pY2Egb3UgaW50ZXJ2YWxvXG5cbiAgICBjdXJyZW50WWVhcjogbnVtYmVyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xuICAgIGN1cnJlbnRNb250aDogbnVtYmVyID0gbmV3IERhdGUoKS5nZXRNb250aCgpO1xuICAgIHNlbGVjdGVkRGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIHNlbGVjdGVkU3RhcnREYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgc2VsZWN0ZWRFbmREYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgaXNDYWxlbmRhclZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBpbnB1dERhdGU6IHN0cmluZyA9ICcnO1xuICAgIGludmFsaWREYXRlOiBib29sZWFuID0gZmFsc2U7XG4gICAgaXNTZWxlY3RpbmdTdGFydDogYm9vbGVhbiA9IHRydWU7IC8vIENvbnRyb2xhIHNlIGVzdGFtb3Mgc2VsZWNpb25hbmRvIGEgZGF0YSBpbmljaWFsIG91IGZpbmFsXG4gICAgc3RhcnRUaW1lOiBzdHJpbmcgPSAnJztcbiAgICBlbmRUaW1lOiBzdHJpbmcgPSAnJztcbiAgICBzZWxlY3RlZFRpbWU6IHN0cmluZyA9ICcnO1xuXG4gICAgbG9jYWxlczogYW55ID0ge1xuICAgICAgICBlbjoge1xuICAgICAgICAgICAgbW9udGhzOiBbXG4gICAgICAgICAgICAgICAgJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgZGF5c09mV2VlazogWydTdScsICdNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTYSddLFxuICAgICAgICAgICAgaW52YWxpZERhdGVNZXNzYWdlOiAnSW52YWxpZCBkYXRlLiBQbGVhc2UgZW50ZXIgYSBkYXRlIGluIHRoZSBmb3JtYXQgZGQvTU0veXl5eScsXG4gICAgICAgICAgICBzdGFydFRpbWVMYWJlbDogJ1N0YXJ0IFRpbWUnLCBcbiAgICAgICAgICAgIGVuZFRpbWVMYWJlbDogJ0VuZCBUaW1lJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHQ6IHtcbiAgICAgICAgICAgIG1vbnRoczogW1xuICAgICAgICAgICAgICAgICdKYW5laXJvJywgJ0ZldmVyZWlybycsICdNYXLDp28nLCAnQWJyaWwnLCAnTWFpbycsICdKdW5obycsICdKdWxobycsICdBZ29zdG8nLCAnU2V0ZW1icm8nLCAnT3V0dWJybycsICdOb3ZlbWJybycsICdEZXplbWJybydcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBkYXlzT2ZXZWVrOiBbJ0RvbScsICdTZWcnLCAnVGVyJywgJ1F1YScsICdRdWknLCAnU2V4JywgJ1PDoWInXSxcbiAgICAgICAgICAgIGludmFsaWREYXRlTWVzc2FnZTogJ0RhdGEgaW52w6FsaWRhLiBQb3IgZmF2b3IsIGluc2lyYSB1bWEgZGF0YSBubyBmb3JtYXRvIGRkL01NL3l5eXknLFxuICAgICAgICAgICAgc3RhcnRUaW1lTGFiZWw6ICdIb3JhIGRlIEluw61jaW8nLCBcbiAgICAgICAgICAgIGVuZFRpbWVMYWJlbDogJ0hvcmEgZGUgRmltJyxcbiAgICAgICAgfSxcbiAgICAgICAgZXM6IHtcbiAgICAgICAgICAgIG1vbnRoczogW1xuICAgICAgICAgICAgICAgICdFbmVybycsICdGZWJyZXJvJywgJ01hcnpvJywgJ0FicmlsJywgJ01heW8nLCAnSnVuaW8nLCAnSnVsaW8nLCAnQWdvc3RvJywgJ1NlcHRpZW1icmUnLCAnT2N0dWJyZScsICdOb3ZpZW1icmUnLCAnRGljaWVtYnJlJ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGRheXNPZldlZWs6IFsnRG8nLCAnTHUnLCAnTWEnLCAnTWknLCAnSnUnLCAnVmknLCAnU8OhJ10sXG4gICAgICAgICAgICBpbnZhbGlkRGF0ZU1lc3NhZ2U6ICdGZWNoYSBpbnbDoWxpZGEuIFBvciBmYXZvciwgaW5ncmVzZSB1bmEgZmVjaGEgZW4gZWwgZm9ybWF0byBkZC9NTS95eXl5JyxcbiAgICAgICAgICAgIHN0YXJ0VGltZUxhYmVsOiAnSG9yYSBkZSBJbmljaW8nLCAgXG4gICAgICAgICAgICBlbmRUaW1lTGFiZWw6ICdIb3JhIGRlIEZpbicsIFxuICAgICAgICB9XG4gICAgfTtcblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yYW5nZU1vZGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0RGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdGFydERhdGUgPSB0aGlzLnBhcnNlRGF0ZSh0aGlzLnN0YXJ0RGF0ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFRpbWUgPSB0aGlzLmZvcm1hdFRpbWVGb3JEaXNwbGF5KHRoaXMuc2VsZWN0ZWRTdGFydERhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZW5kRGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbmREYXRlID0gdGhpcy5wYXJzZURhdGUodGhpcy5lbmREYXRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFRpbWUgPSB0aGlzLmZvcm1hdFRpbWVGb3JEaXNwbGF5KHRoaXMuc2VsZWN0ZWRFbmREYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW5wdXRGb3JSYW5nZSgpOyAvLyBBdHVhbGl6YSBvIGlucHV0IG5vIG1vZG8gcmFuZ2UgY29tIGhvcmFzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbml0aWFsRGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FsZW5kYXIodGhpcy5pbml0aWFsRGF0ZSk7IC8vIEF0dWFsaXphIG8gaW5wdXQgw7puaWNvIGNvbSBhIGRhdGEgaW5pY2lhbFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUaW1lID0gdGhpcy5mb3JtYXRUaW1lRm9yRGlzcGxheSh0aGlzLnNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydpbml0aWFsRGF0ZSddICYmIGNoYW5nZXNbJ2luaXRpYWxEYXRlJ10uY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFyKGNoYW5nZXNbJ2luaXRpYWxEYXRlJ10uY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEF0dWFsaXphIG8gY2FsZW5kw6FyaW8gcGFyYSBleGliaXIgYSBkYXRhIMO6bmljYSBlIGEgaG9yYVxuICAgIHVwZGF0ZUNhbGVuZGFyKGRhdGVTdHJpbmc6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJzZWREYXRlID0gdGhpcy5wYXJzZURhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGlmIChwYXJzZWREYXRlICYmIHRoaXMudmFsaWRhdGVEYXRlKGRhdGVTdHJpbmcpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHBhcnNlZERhdGU7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRZZWFyID0gcGFyc2VkRGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TW9udGggPSBwYXJzZWREYXRlLmdldE1vbnRoKCk7XG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0RGF0ZUZvckRpc3BsYXkocGFyc2VkRGF0ZSk7IC8vIEluY2x1aSBhIGhvcmEgbm8gaW5wdXQgcHJpbmNpcGFsXG4gICAgICAgICAgICB0aGlzLmVtaXRTaW5nbGVPclJhbmdlKCk7ICAvLyBFbWl0ZSBkYXRhIMO6bmljYSBvdSBpbnRlcnZhbG9cbiAgICAgICAgICAgIHRoaXMuaW52YWxpZERhdGUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZERhdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25JbnB1dENoYW5nZShldmVudDogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlucHV0VmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5hcHBseURhdGVNYXNrKGlucHV0VmFsdWUpO1xuXG4gICAgICAgIGlmICh0aGlzLnJhbmdlTW9kZSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZVBhcnRzID0gdGhpcy5pbnB1dERhdGUuc3BsaXQoJyAtICcpO1xuICAgICAgICAgICAgaWYgKGRhdGVQYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbc3RhcnREYXRlLCBlbmREYXRlXSA9IGRhdGVQYXJ0cztcblxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYSBhcyBkdWFzIHBhcnRlcyBkbyBpbnRlcnZhbG9cbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZGF0ZURhdGUoc3RhcnREYXRlKSAmJiB0aGlzLnZhbGlkYXRlRGF0ZShlbmREYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWREYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFN0YXJ0RGF0ZSA9IHRoaXMucGFyc2VEYXRlKHN0YXJ0RGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEVuZERhdGUgPSB0aGlzLnBhcnNlRGF0ZShlbmREYXRlKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkU3RhcnREYXRlICYmIHBhcnNlZEVuZERhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdGFydERhdGUgPSBwYXJzZWRTdGFydERhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRW5kRGF0ZSA9IHBhcnNlZEVuZERhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRTaW5nbGVPclJhbmdlKCk7IC8vIEVtaXRlIG8gaW50ZXJ2YWxvIGF0dWFsaXphZG9cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZERhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFZhbGlkYSBkYXRhIMO6bmljYVxuICAgICAgICAgICAgaWYgKCh0aGlzLnVzZVRpbWUgJiYgdGhpcy5pbnB1dERhdGUubGVuZ3RoID09PSAxNikgfHwgKCF0aGlzLnVzZVRpbWUgJiYgdGhpcy5pbnB1dERhdGUubGVuZ3RoID09PSAxMCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZGF0ZURhdGUodGhpcy5pbnB1dERhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZERhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkRGF0ZSA9IHRoaXMucGFyc2VEYXRlKHRoaXMuaW5wdXREYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZERhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gcGFyc2VkRGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFNpbmdsZU9yUmFuZ2UoKTsgLy8gRW1pdGUgYSBkYXRhIMO6bmljYSBhdHVhbGl6YWRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWREYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8vIEF0dWFsaXphIG8gaW5wdXQgbm8gbW9kbyBpbnRlcnZhbG9cbiAgICB1cGRhdGVJbnB1dEZvclJhbmdlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFN0YXJ0RGF0ZSAmJiB0aGlzLnNlbGVjdGVkRW5kRGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkU3RhcnQgPSB0aGlzLmZvcm1hdERhdGVGb3JEaXNwbGF5KHRoaXMuc2VsZWN0ZWRTdGFydERhdGUpO1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRW5kID0gdGhpcy5mb3JtYXREYXRlRm9yRGlzcGxheSh0aGlzLnNlbGVjdGVkRW5kRGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IGAke2Zvcm1hdHRlZFN0YXJ0fSAtICR7Zm9ybWF0dGVkRW5kfWA7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFN0YXJ0RGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdERhdGVGb3JEaXNwbGF5KHRoaXMuc2VsZWN0ZWRTdGFydERhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvLy8gRW1pdGUgZGF0YSDDum5pY2Egb3UgaW50ZXJ2YWxvLCBpbmNsdWluZG8gaG9yYXNcbiAgICBlbWl0U2luZ2xlT3JSYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucmFuZ2VNb2RlKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRTdGFydCA9IHRoaXMuc2VsZWN0ZWRTdGFydERhdGUgPyB0aGlzLmZvcm1hdERhdGVGb3JEaXNwbGF5KHRoaXMuc2VsZWN0ZWRTdGFydERhdGUpIDogJyc7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRFbmQgPSB0aGlzLnNlbGVjdGVkRW5kRGF0ZSA/IHRoaXMuZm9ybWF0RGF0ZUZvckRpc3BsYXkodGhpcy5zZWxlY3RlZEVuZERhdGUpIDogJyc7XG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IGAke2Zvcm1hdHRlZFN0YXJ0fSAtICR7Zm9ybWF0dGVkRW5kfWA7IC8vIEF0dWFsaXphIG8gaW5wdXQgcHJpbmNpcGFsIGNvbSBvIHJhbmdlIGUgaG9yYXNcbiAgICAgICAgICAgIHRoaXMucmFuZ2VDaGFuZ2UuZW1pdCh7IHN0YXJ0OiBmb3JtYXR0ZWRTdGFydCwgZW5kOiBmb3JtYXR0ZWRFbmQgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gdGhpcy5zZWxlY3RlZERhdGUgPyB0aGlzLmZvcm1hdERhdGVGb3JEaXNwbGF5KHRoaXMuc2VsZWN0ZWREYXRlKSA6ICcnO1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSBmb3JtYXR0ZWREYXRlOyAvLyBBdHVhbGl6YSBvIGlucHV0IHByaW5jaXBhbCBjb20gYSBkYXRhIMO6bmljYSBlIGhvcmFcbiAgICAgICAgICAgIHRoaXMucmFuZ2VDaGFuZ2UuZW1pdCh7IHN0YXJ0OiBmb3JtYXR0ZWREYXRlLCBlbmQ6ICcnIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEZ1bsOnw6NvIHBhcmEgdHJhdGFyIG11ZGFuw6dhcyBuYXMgaG9yYXNcbiAgICBvblRpbWVDaGFuZ2UodHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0eXBlID09PSAnc3RhcnQnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFN0YXJ0RGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtob3VycywgbWludXRlc10gPSB0aGlzLnN0YXJ0VGltZSA/IHRoaXMuc3RhcnRUaW1lLnNwbGl0KCc6JykgOiBbJzAwJywgJzAwJ107XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFN0YXJ0RGF0ZS5zZXRIb3VycygraG91cnMsICttaW51dGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnZW5kJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRFbmREYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2hvdXJzLCBtaW51dGVzXSA9IHRoaXMuZW5kVGltZSA/IHRoaXMuZW5kVGltZS5zcGxpdCgnOicpIDogWycwMCcsICcwMCddO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbmREYXRlLnNldEhvdXJzKCtob3VycywgK21pbnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZERhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbaG91cnMsIG1pbnV0ZXNdID0gdGhpcy5zZWxlY3RlZFRpbWUgPyB0aGlzLnNlbGVjdGVkVGltZS5zcGxpdCgnOicpIDogWycwMCcsICcwMCddO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlLnNldEhvdXJzKCtob3VycywgK21pbnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdFNpbmdsZU9yUmFuZ2UoKTsgLy8gQXR1YWxpemEgbyB2YWxvciBubyBpbnB1dCBwcmluY2lwYWxcbiAgICB9XG5cblxuXG4gICAgLy8gRnVuw6fDo28gcGFyYSBmb3JtYXRhw6fDo28gZGEgaG9yYSBubyBpbnB1dCBkZSBob3JhXG4gICAgZm9ybWF0VGltZUZvckRpc3BsYXkoZGF0ZTogRGF0ZSB8IG51bGwpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIWRhdGUpIHJldHVybiAnJztcbiAgICAgICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICBjb25zdCBtaW51dGVzID0gZGF0ZS5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICByZXR1cm4gYCR7aG91cnN9OiR7bWludXRlc31gO1xuICAgIH1cblxuXG4gICAgLy8gTcOpdG9kbyBwYXJhIHNlbGVjaW9uYXIgdW1hIGRhdGEgbm8gY2FsZW5kw6FyaW9cbiAgICBzZWxlY3REYXRlKGRheTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmN1cnJlbnRZZWFyLCB0aGlzLmN1cnJlbnRNb250aCwgZGF5KTtcblxuICAgICAgICBpZiAodGhpcy5yYW5nZU1vZGUpIHtcbiAgICAgICAgICAgIC8vIEzDs2dpY2EgcGFyYSByYW5nZU1vZGVcbiAgICAgICAgICAgIGlmICh0aGlzLmlzU2VsZWN0aW5nU3RhcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkU3RhcnREYXRlID0gZGF0ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGFydFRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2hvdXJzLCBtaW51dGVzXSA9IHRoaXMuc3RhcnRUaW1lLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdGFydERhdGUuc2V0SG91cnMoK2hvdXJzLCArbWludXRlcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFN0YXJ0RGF0ZS5zZXRIb3VycygwLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFRpbWUgPSAnMDA6MDAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmlzU2VsZWN0aW5nU3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEVuZERhdGUgPSBkYXRlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVuZFRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2hvdXJzLCBtaW51dGVzXSA9IHRoaXMuZW5kVGltZS5zcGxpdCgnOicpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRW5kRGF0ZS5zZXRIb3VycygraG91cnMsICttaW51dGVzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRW5kRGF0ZS5zZXRIb3VycygwLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRUaW1lID0gJzAwOjAwJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pc1NlbGVjdGluZ1N0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRTaW5nbGVPclJhbmdlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUlucHV0Rm9yUmFuZ2UoKTtcbiAgICAgICAgICAgIC8vIE8gY2FsZW5kw6FyaW8gc8OzIHNlcsOhIGZlY2hhZG8gYW8gY2xpY2FyIG5vIGJvdMOjbyBcIkZlY2hhclwiXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBMw7NnaWNhIHBhcmEgcXVhbmRvIG7Do28gZXN0w6EgZW0gcmFuZ2VNb2RlXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGRhdGU7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFRpbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbaG91cnMsIG1pbnV0ZXNdID0gdGhpcy5zZWxlY3RlZFRpbWUuc3BsaXQoJzonKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZS5zZXRIb3VycygraG91cnMsICttaW51dGVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUuc2V0SG91cnMoMCwgMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRpbWUgPSAnMDA6MDAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdERhdGVGb3JEaXNwbGF5KGRhdGUpO1xuICAgICAgICAgICAgdGhpcy5lbWl0U2luZ2xlT3JSYW5nZSgpO1xuXG4gICAgICAgICAgICAvLyAqKkZlY2hhciBvIGNhbGVuZMOhcmlvIGFwZW5hcyBzZSBgdXNlVGltZWAgZm9yIGZhbHNlKipcbiAgICAgICAgICAgIGlmICghdGhpcy51c2VUaW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0NhbGVuZGFyVmlzaWJsZSA9IGZhbHNlOyAvLyBGZWNoYSBvIGNhbGVuZMOhcmlvIGF1dG9tYXRpY2FtZW50ZSBzZSBgdXNlVGltZWAgZm9yIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTZSBgdXNlVGltZWAgZm9yIHRydWUsIG8gY2FsZW5kw6FyaW8gcGVybWFuZWNlIGFiZXJ0byBwYXJhIGluc2VyaXIgYSBob3JhXG4gICAgICAgIH1cbiAgICB9XG5cblxuXG4gICAgYXBwbHlEYXRlTWFzayhpbnB1dFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICAvLyBSZW1vdmUgcXVhbHF1ZXIgY2FyYWN0ZXJlIHF1ZSBuw6NvIHNlamEgbnVtw6lyaWNvXG4gICAgICAgIGxldCBkaWdpdHNPbmx5ID0gaW5wdXRWYWx1ZS5yZXBsYWNlKC9cXEQvZywgJycpO1xuXG4gICAgICAgIGlmICh0aGlzLnJhbmdlTW9kZSkge1xuICAgICAgICAgICAgY29uc3QgbWF4TGVuZ3RoID0gdGhpcy51c2VUaW1lID8gMjggOiAxNzsgLy8gQWp1c3RhIG8gY29tcHJpbWVudG8gbcOheGltbyBwYXJhIGludGVydmFsbyBjb20gb3Ugc2VtIHRlbXBvXG5cbiAgICAgICAgICAgIC8vIENlcnRpZmljYS1zZSBkZSBxdWUgYSBlbnRyYWRhIG7Do28gZXhjZWRlIG8gY29tcHJpbWVudG8gcGVybWl0aWRvXG4gICAgICAgICAgICBpZiAoZGlnaXRzT25seS5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBkaWdpdHNPbmx5ID0gZGlnaXRzT25seS5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHJpbWVpcm8gaW50ZXJ2YWxvIChzdGFydCBkYXRlKVxuICAgICAgICAgICAgbGV0IGRheTEgPSBkaWdpdHNPbmx5LnN1YnN0cmluZygwLCAyKTtcbiAgICAgICAgICAgIGxldCBtb250aDEgPSBkaWdpdHNPbmx5LnN1YnN0cmluZygyLCA0KTtcbiAgICAgICAgICAgIGxldCB5ZWFyMSA9IGRpZ2l0c09ubHkuc3Vic3RyaW5nKDQsIDgpO1xuICAgICAgICAgICAgbGV0IGhvdXIxID0gZGlnaXRzT25seS5zdWJzdHJpbmcoOCwgMTApO1xuICAgICAgICAgICAgbGV0IG1pbnV0ZTEgPSBkaWdpdHNPbmx5LnN1YnN0cmluZygxMCwgMTIpO1xuXG4gICAgICAgICAgICAvLyBDcmlhIGEgZGF0YSBmb3JtYXRhZGEgcGFyYSBhIHByaW1laXJhIHBhcnRlIChzdGFydCBkYXRlKVxuICAgICAgICAgICAgbGV0IG1hc2tlZERhdGUgPSBgJHtkYXkxfS8ke21vbnRoMX0vJHt5ZWFyMX1gO1xuICAgICAgICAgICAgaWYgKHRoaXMudXNlVGltZSAmJiBob3VyMSAmJiBtaW51dGUxKSB7XG4gICAgICAgICAgICAgICAgbWFza2VkRGF0ZSArPSBgICR7aG91cjF9OiR7bWludXRlMX1gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGljaW9uYSBvIHNlcGFyYWRvciAnIC0gJyBzZSBob3V2ZXIgZGFkb3MgcGFyYSBvIHNlZ3VuZG8gaW50ZXJ2YWxvXG4gICAgICAgICAgICBpZiAoZGlnaXRzT25seS5sZW5ndGggPiAxMikge1xuICAgICAgICAgICAgICAgIG1hc2tlZERhdGUgKz0gJyAtICc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNlZ3VuZG8gaW50ZXJ2YWxvIChlbmQgZGF0ZSlcbiAgICAgICAgICAgIGxldCBkYXkyID0gZGlnaXRzT25seS5zdWJzdHJpbmcoMTIsIDE0KTtcbiAgICAgICAgICAgIGxldCBtb250aDIgPSBkaWdpdHNPbmx5LnN1YnN0cmluZygxNCwgMTYpO1xuICAgICAgICAgICAgbGV0IHllYXIyID0gZGlnaXRzT25seS5zdWJzdHJpbmcoMTYsIDIwKTtcbiAgICAgICAgICAgIGxldCBob3VyMiA9IGRpZ2l0c09ubHkuc3Vic3RyaW5nKDIwLCAyMik7XG4gICAgICAgICAgICBsZXQgbWludXRlMiA9IGRpZ2l0c09ubHkuc3Vic3RyaW5nKDIyLCAyNCk7XG5cbiAgICAgICAgICAgIGxldCBlbmREYXRlUGFydCA9IGAke2RheTJ9LyR7bW9udGgyfS8ke3llYXIyfWA7XG4gICAgICAgICAgICBpZiAodGhpcy51c2VUaW1lICYmIGhvdXIyICYmIG1pbnV0ZTIpIHtcbiAgICAgICAgICAgICAgICBlbmREYXRlUGFydCArPSBgICR7aG91cjJ9OiR7bWludXRlMn1gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGljaW9uYSBhIHNlZ3VuZGEgcGFydGUgKGVuZCBkYXRlKSBhbyBpbnB1dCwgc2UgYXBsaWPDoXZlbFxuICAgICAgICAgICAgaWYgKGRpZ2l0c09ubHkubGVuZ3RoID4gMTIpIHtcbiAgICAgICAgICAgICAgICBtYXNrZWREYXRlICs9IGVuZERhdGVQYXJ0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbWFza2VkRGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG1heExlbmd0aCA9IHRoaXMudXNlVGltZSA/IDE2IDogMTA7XG4gICAgICAgICAgICBpZiAoZGlnaXRzT25seS5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBkaWdpdHNPbmx5ID0gZGlnaXRzT25seS5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGRheSA9IGRpZ2l0c09ubHkuc3Vic3RyaW5nKDAsIDIpO1xuICAgICAgICAgICAgbGV0IG1vbnRoID0gZGlnaXRzT25seS5zdWJzdHJpbmcoMiwgNCk7XG4gICAgICAgICAgICBsZXQgeWVhciA9IGRpZ2l0c09ubHkuc3Vic3RyaW5nKDQsIDgpO1xuICAgICAgICAgICAgbGV0IGhvdXIgPSBkaWdpdHNPbmx5LnN1YnN0cmluZyg4LCAxMCk7XG4gICAgICAgICAgICBsZXQgbWludXRlID0gZGlnaXRzT25seS5zdWJzdHJpbmcoMTAsIDEyKTtcblxuICAgICAgICAgICAgbGV0IG1hc2tlZERhdGUgPSBgJHtkYXl9LyR7bW9udGh9LyR7eWVhcn1gO1xuICAgICAgICAgICAgaWYgKHRoaXMudXNlVGltZSAmJiBob3VyICYmIG1pbnV0ZSkge1xuICAgICAgICAgICAgICAgIG1hc2tlZERhdGUgKz0gYCAke2hvdXJ9OiR7bWludXRlfWA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBtYXNrZWREYXRlO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxuICAgIC8vIFZhbGlkYcOnw6NvIGRhIGRhdGFcbiAgICB2YWxpZGF0ZURhdGUoaW5wdXRWYWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IFtkYXRlUGFydCwgdGltZVBhcnRdID0gaW5wdXRWYWx1ZS5zcGxpdCgnICcpO1xuICAgICAgICBjb25zdCBbZGF5U3RyLCBtb250aFN0ciwgeWVhclN0cl0gPSBkYXRlUGFydC5zcGxpdCgnLycpO1xuICAgICAgICBjb25zdCBkYXkgPSBOdW1iZXIoZGF5U3RyKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBOdW1iZXIobW9udGhTdHIpO1xuICAgICAgICBjb25zdCB5ZWFyID0gTnVtYmVyKHllYXJTdHIpO1xuXG4gICAgICAgIGlmIChtb250aCA8IDEgfHwgbW9udGggPiAxMiB8fCB5ZWFyU3RyLmxlbmd0aCAhPT0gNCB8fCBpc05hTih5ZWFyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdERheU9mTW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMCkuZ2V0RGF0ZSgpO1xuICAgICAgICBpZiAoZGF5IDwgMSB8fCBkYXkgPiBsYXN0RGF5T2ZNb250aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudXNlVGltZSAmJiB0aW1lUGFydCkge1xuICAgICAgICAgICAgY29uc3QgW2hvdXJTdHIsIG1pbnV0ZVN0cl0gPSB0aW1lUGFydC5zcGxpdCgnOicpO1xuICAgICAgICAgICAgY29uc3QgaG91ciA9IE51bWJlcihob3VyU3RyKTtcbiAgICAgICAgICAgIGNvbnN0IG1pbnV0ZSA9IE51bWJlcihtaW51dGVTdHIpO1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAwIHx8IGhvdXIgPiAyMyB8fCBtaW51dGUgPCAwIHx8IG1pbnV0ZSA+IDU5IHx8IGlzTmFOKGhvdXIpIHx8IGlzTmFOKG1pbnV0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBoYW5kbGVLZXlQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGV2ZW50LmtleS5jaGFyQ29kZUF0KDApO1xuXG4gICAgICAgIC8vIFBlcm1pdGlyIGFwZW5hcyBuw7ptZXJvcyBlIGJhcnJhIFwiL1wiXG4gICAgICAgIGlmICgoY2hhckNvZGUgPCA0OCB8fCBjaGFyQ29kZSA+IDU3KSAmJiBjaGFyQ29kZSAhPT0gNDcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIEJsb3F1ZWlhIGEgaW5zZXLDp8OjbyBkZSBjYXJhY3RlcmVzIG7Do28gcGVybWl0aWRvc1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTGltaXRhIG8gdGFtYW5obyBkYSBlbnRyYWRhIGNvbmZvcm1lIG8gdGlwbyBkZSBkYWRvIChjb20gb3Ugc2VtIGhvcmEpXG4gICAgICAgIGlmICh0aGlzLmlucHV0RGF0ZS5yZXBsYWNlKC9cXEQvZywgJycpLmxlbmd0aCA+PSAodGhpcy51c2VUaW1lID8gMTIgOiA4KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gTGltaXRhIG8gbsO6bWVybyBkZSBjYXJhY3RlcmVzIHBlcm1pdGlkb3NcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLy8gRmVjaGEgbyBjYWxlbmTDoXJpb1xuICAgIGNsb3NlQ2FsZW5kYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNDYWxlbmRhclZpc2libGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBBbHRlcm5hIGEgdmlzaWJpbGlkYWRlIGRvIGNhbGVuZMOhcmlvXG4gICAgdG9nZ2xlQ2FsZW5kYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNDYWxlbmRhclZpc2libGUgPSAhdGhpcy5pc0NhbGVuZGFyVmlzaWJsZTtcbiAgICB9XG5cbiAgICAvLyBGb3JtYXRhIGEgZGF0YSBlIGhvcmEgcGFyYSBleGliacOnw6NvIG5vIGlucHV0IHByaW5jaXBhbFxuICAgIGZvcm1hdERhdGVGb3JEaXNwbGF5KGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBkYXkgPSBkYXRlLmdldERhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gKGRhdGUuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgbGV0IGZvcm1hdHRlZERhdGUgPSBgJHtkYXl9LyR7bW9udGh9LyR7eWVhcn1gO1xuXG4gICAgICAgIGlmICh0aGlzLnVzZVRpbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgICAgICAgIGNvbnN0IG1pbnV0ZXMgPSBkYXRlLmdldE1pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgICAgICBmb3JtYXR0ZWREYXRlICs9IGAgJHtob3Vyc306JHttaW51dGVzfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0dGVkRGF0ZTtcbiAgICB9XG5cblxuICAgIC8vIEZvcm1hdGEgYSBkYXRhIHBhcmEgZW1pdGlyIG5vIGV2ZW50b1xuICAgIGZvcm1hdERhdGVGb3JFbWl0KGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBkYXkgPSBkYXRlLmdldERhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gKGRhdGUuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgbGV0IGZvcm1hdHRlZERhdGUgPSBgJHtkYXl9LyR7bW9udGh9LyR7eWVhcn1gO1xuICAgICAgICBpZiAodGhpcy51c2VUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgICAgICBjb25zdCBtaW51dGVzID0gZGF0ZS5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICAgICAgZm9ybWF0dGVkRGF0ZSArPSBgIC0gJHtob3Vyc306JHttaW51dGVzfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZERhdGU7XG4gICAgfVxuXG4gICAgLy8gRnVuw6fDo28gcGFyYSBwYXJzaW5nIGRlIHN0cmluZyBwYXJhIERhdGVcbiAgICBwYXJzZURhdGUoZGF0ZVN0cjogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgICAgICBjb25zdCBbZGF0ZVBhcnQsIHRpbWVQYXJ0XSA9IGRhdGVTdHIuc3BsaXQoJyAnKTtcbiAgICAgICAgY29uc3QgW2RheSwgbW9udGgsIHllYXJdID0gZGF0ZVBhcnQuc3BsaXQoJy8nKS5tYXAoTnVtYmVyKTtcbiAgICAgICAgaWYgKCFkYXkgfHwgIW1vbnRoIHx8ICF5ZWFyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSk7XG4gICAgICAgIGlmICh0aGlzLnVzZVRpbWUgJiYgdGltZVBhcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IFtob3VyLCBtaW51dGVdID0gdGltZVBhcnQuc3BsaXQoJzonKS5tYXAoTnVtYmVyKTtcbiAgICAgICAgICAgIGRhdGUuc2V0SG91cnMoaG91ciB8fCAwLCBtaW51dGUgfHwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgLy8gR2VyYSBhIGxpc3RhIGRlIGRpYXMgbm8gbcOqcyBhdHVhbFxuICAgIGdldCBkYXlzSW5Nb250aCgpOiBhbnlbXSB7XG4gICAgICAgIGNvbnN0IGZpcnN0RGF5T2ZNb250aCA9IG5ldyBEYXRlKHRoaXMuY3VycmVudFllYXIsIHRoaXMuY3VycmVudE1vbnRoLCAxKS5nZXREYXkoKTtcbiAgICAgICAgY29uc3QgdG90YWxEYXlzSW5Nb250aCA9IG5ldyBEYXRlKHRoaXMuY3VycmVudFllYXIsIHRoaXMuY3VycmVudE1vbnRoICsgMSwgMCkuZ2V0RGF0ZSgpO1xuICAgICAgICBjb25zdCBkYXlzQXJyYXkgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0b3RhbERheXNJbk1vbnRoIH0sIChfLCBpKSA9PiBpICsgMSk7XG4gICAgICAgIGNvbnN0IGxlYWRpbmdFbXB0eURheXMgPSBBcnJheShmaXJzdERheU9mTW9udGgpLmZpbGwobnVsbCk7IC8vIERpYXMgdmF6aW9zIGFudGVzIGRvIHByaW1laXJvIGRpYSBkbyBtw6pzXG4gICAgICAgIHJldHVybiBbLi4ubGVhZGluZ0VtcHR5RGF5cywgLi4uZGF5c0FycmF5XTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZmljYSBzZSB1bSBkaWEgZXN0w6Egc2VsZWNpb25hZG9cbiAgICBpc1NlbGVjdGVkKGRheTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZERhdGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXkgPSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXREYXRlKCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTW9udGggPSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRNb250aCgpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZFllYXIgPSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICByZXR1cm4gc2VsZWN0ZWREYXkgPT09IGRheSAmJiBzZWxlY3RlZE1vbnRoID09PSB0aGlzLmN1cnJlbnRNb250aCAmJiBzZWxlY3RlZFllYXIgPT09IHRoaXMuY3VycmVudFllYXI7XG4gICAgfVxuXG4gICAgLy8gVmVyaWZpY2Egc2UgbyBkaWEgw6kgaG9qZVxuICAgIGlzVG9kYXkoZGF5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICByZXR1cm4gdG9kYXkuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5jdXJyZW50WWVhciAmJiB0b2RheS5nZXRNb250aCgpID09PSB0aGlzLmN1cnJlbnRNb250aCAmJiB0b2RheS5nZXREYXRlKCkgPT09IGRheTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZmljYSBzZSBhIGRhdGEgZXN0w6EgZGVzYWJpbGl0YWRhXG4gICAgaXNEYXRlRGlzYWJsZWQoZGF5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuY3VycmVudFllYXIsIHRoaXMuY3VycmVudE1vbnRoLCBkYXkpO1xuICAgICAgICBpZiAodGhpcy5taW5EYXRlICYmIGRhdGUgPCB0aGlzLm1pbkRhdGUpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodGhpcy5tYXhEYXRlICYmIGRhdGUgPiB0aGlzLm1heERhdGUpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVmVyaWZpY2Egc2UgdW0gZGlhIGVzdMOhIG5vIGludGVydmFsbyBzZWxlY2lvbmFkb1xuICAgIGlzSW5SYW5nZShkYXk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRTdGFydERhdGUgfHwgIXRoaXMuc2VsZWN0ZWRFbmREYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmN1cnJlbnRZZWFyLCB0aGlzLmN1cnJlbnRNb250aCwgZGF5KTtcbiAgICAgICAgcmV0dXJuIGRhdGUgPj0gdGhpcy5zZWxlY3RlZFN0YXJ0RGF0ZSAmJiBkYXRlIDw9IHRoaXMuc2VsZWN0ZWRFbmREYXRlO1xuICAgIH1cblxuICAgIC8vIEF2YW7Dp2EgcGFyYSBvIHByw7N4aW1vIG3DqnNcbiAgICBuZXh0TW9udGgoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRNb250aCA9PT0gMTEpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gMDtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFllYXIrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1vbnRoKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXRyb2NlZGUgcGFyYSBvIG3DqnMgYW50ZXJpb3JcbiAgICBwcmV2TW9udGgoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRNb250aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TW9udGggPSAxMTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFllYXItLTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1vbnRoLS07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXRvcm5hIGEgbGlzdGEgZGUgbWVzZXMgZGUgYWNvcmRvIGNvbSBvIGxvY2FsZVxuICAgIGdldCBtb250aHMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVzW3RoaXMubG9jYWxlXT8ubW9udGhzIHx8IHRoaXMubG9jYWxlc1snZW4nXS5tb250aHM7XG4gICAgfVxuXG4gICAgLy8gUmV0b3JuYSBhIGxpc3RhIGRlIGRpYXMgZGEgc2VtYW5hIGRlIGFjb3JkbyBjb20gbyBsb2NhbGVcbiAgICBnZXQgZGF5c09mV2VlaygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZXNbdGhpcy5sb2NhbGVdPy5kYXlzT2ZXZWVrIHx8IHRoaXMubG9jYWxlc1snZW4nXS5kYXlzT2ZXZWVrO1xuICAgIH1cblxuICAgIFxuXG59XG4iLCI8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICA8bGFiZWwgW2Zvcl09XCJpZFwiIFtuZ0NsYXNzXT1cIidsYWJlbC1zdHlsZXMnXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxuICAgIDxpbnB1dFxuICAgICAgaWQ9XCJ7eyBpZCB9fVwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICBjbGFzcz1cImN1c3RvbS1pbnB1dFwiXG4gICAgICBbYXR0ci5wbGFjZWhvbGRlcl09XCJyYW5nZU1vZGUgJiYgdXNlVGltZSA/ICdkZC9NTS95eXl5IEhIOm1tIC0gZGQvTU0veXl5eSBISDptbScgOiBcbiAgICAgIHJhbmdlTW9kZSAmJiAhdXNlVGltZSA/ICdkZC9NTS95eXl5IC0gZGQvTU0veXl5eScgOighcmFuZ2VNb2RlICYmIHVzZVRpbWUgPyAnZGQvTU0veXl5eSBISDptbScgOiAnZGQvTU0veXl5eScpXCJcbiAgICAgIFt2YWx1ZV09XCJpbnB1dERhdGVcIlxuICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAoa2V5cHJlc3MpPVwiaGFuZGxlS2V5UHJlc3MoJGV2ZW50KVwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlQ2FsZW5kYXIoKVwiXG4gICAgLz5cbiAgICA8bHVjaWRlLWljb24gbmFtZT1cImNhbGVuZGFyXCIgY2xhc3M9XCJjYWxlbmRhci1pY29uXCI+PC9sdWNpZGUtaWNvbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cImludmFsaWREYXRlXCIgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+XG4gICAge3sgbG9jYWxlc1tsb2NhbGVdLmludmFsaWREYXRlTWVzc2FnZSB9fVxuICAgIDxzcGFuICpuZ0lmPVwidXNlVGltZVwiPiBISDptbS48L3NwYW4+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJjYWxlbmRhci13cmFwcGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cInsgb3BlbjogaXNDYWxlbmRhclZpc2libGUgfVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1oZWFkZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJwcmV2TW9udGgoKVwiPiYjODI0OTs8L2J1dHRvbj5cbiAgICAgICAgICA8c3Bhbj57eyBtb250aHNbY3VycmVudE1vbnRoXSB9fSB7eyBjdXJyZW50WWVhciB9fTwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJuZXh0TW9udGgoKVwiPiYjODI1MDs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWJvZHlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItZGF5LW5hbWVzXCI+XG4gICAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgZGF5IG9mIGRheXNPZldlZWtcIj57eyBkYXkgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItZGF5c1wiPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRheSBvZiBkYXlzSW5Nb250aDsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgIFtjbGFzcy50b2RheV09XCJpc1RvZGF5KGRheSlcIlxuICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChkYXkpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmluLXJhbmdlXT1cImlzSW5SYW5nZShkYXkpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImlzRGF0ZURpc2FibGVkKGRheSlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGF5ID8gc2VsZWN0RGF0ZShkYXkpIDogbnVsbFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGRheSA/IGRheSA6IFwiXCIgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBJbnB1dHMgcGFyYSBpbnNlcsOnw6NvIGRhcyBob3JhcyAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cInVzZVRpbWVcIiBjbGFzcz1cInRpbWUtaW5wdXRzXCI+XG4gICAgICAgICAgPCEtLSBDYW1wbyBkZSBob3JhIGRlIGluw61jaW8gLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInJhbmdlTW9kZVwiIGNsYXNzPVwidGltZS1pbnB1dFwiPlxuICAgICAgICAgICAgPGxhYmVsPnt7IGxvY2FsZXNbbG9jYWxlXT8uc3RhcnRUaW1lTGFiZWwgfHwgJ0hvcmEgZGUgSW7DrWNpbycgfX08L2xhYmVsPiA8IS0tIFVzYW5kbyB0cmFkdcOnw6NvIC0tPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0aW1lXCIgWyhuZ01vZGVsKV09XCJzdGFydFRpbWVcIiAoY2hhbmdlKT1cIm9uVGltZUNoYW5nZSgnc3RhcnQnKVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIENhbXBvIGRlIGhvcmEgZGUgZmltIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJyYW5nZU1vZGVcIiBjbGFzcz1cInRpbWUtaW5wdXRcIj5cbiAgICAgICAgICAgIDxsYWJlbD57eyBsb2NhbGVzW2xvY2FsZV0/LmVuZFRpbWVMYWJlbCB8fCAnSG9yYSBkZSBGaW0nIH19PC9sYWJlbD4gPCEtLSBVc2FuZG8gdHJhZHXDp8OjbyAtLT5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGltZVwiIFsobmdNb2RlbCldPVwiZW5kVGltZVwiIChjaGFuZ2UpPVwib25UaW1lQ2hhbmdlKCdlbmQnKVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIENhbXBvIGRlIGhvcmEgw7puaWNhIChzZSBuw6NvIGZvciByYW5nZSkgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFyYW5nZU1vZGVcIiBjbGFzcz1cInRpbWUtaW5wdXRcIj5cbiAgICAgICAgICAgIDxsYWJlbD57eyBsb2NhbGVzW2xvY2FsZV0/LnN0YXJ0VGltZUxhYmVsIHx8ICdIb3JhJyB9fTwvbGFiZWw+IDwhLS0gVXNhbmRvIG8gbGFiZWwgZGUgaW7DrWNpbyAtLT5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGltZVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRUaW1lXCIgKGNoYW5nZSk9XCJvblRpbWVDaGFuZ2UoJ3NpbmdsZScpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBCb3TDo28gZGUgZmVjaGFyIG8gY2FsZW5kw6FyaW8gLS0+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJjbG9zZS1idXR0b25cIiAoY2xpY2spPVwiY2xvc2VDYWxlbmRhcigpXCI+e3sgY2xvc2VCdXR0b25MYWJlbCB9fTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|